From f5479073a793420e97876aa10d4c2e6dded07d82 Mon Sep 17 00:00:00 2001 From: liyanjin <36877356+grab-liyanjin@users.noreply.github.com> Date: Thu, 28 Nov 2024 21:30:25 +0800 Subject: [PATCH 001/339] Fix the issue that the empty polyline cannot be updated (#3046) --- .../android/maps/PolygonContainer.java | 10 +- .../android/maps/PolylineContainer.java | 10 +- .../android/maps/AnnotationManagerTest.kt | 103 ++++++++++-------- 3 files changed, 67 insertions(+), 56 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolygonContainer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolygonContainer.java index dae5f8114a69..7e961f2d73cb 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolygonContainer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolygonContainer.java @@ -27,12 +27,10 @@ class PolygonContainer implements Polygons { @Override public Polygon addBy(@NonNull PolygonOptions polygonOptions, @NonNull MapLibreMap maplibreMap) { Polygon polygon = polygonOptions.getPolygon(); - if (!polygon.getPoints().isEmpty()) { - long id = nativeMap != null ? nativeMap.addPolygon(polygon) : 0; - polygon.setId(id); - polygon.setMapLibreMap(maplibreMap); - annotations.put(id, polygon); - } + long id = nativeMap != null ? nativeMap.addPolygon(polygon) : 0; + polygon.setId(id); + polygon.setMapLibreMap(maplibreMap); + annotations.put(id, polygon); return polygon; } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolylineContainer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolylineContainer.java index f7ce3b885753..a2338120590c 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolylineContainer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/PolylineContainer.java @@ -27,12 +27,10 @@ class PolylineContainer implements Polylines { @Override public Polyline addBy(@NonNull PolylineOptions polylineOptions, @NonNull MapLibreMap maplibreMap) { Polyline polyline = polylineOptions.getPolyline(); - if (!polyline.getPoints().isEmpty()) { - long id = nativeMap != null ? nativeMap.addPolyline(polyline) : 0; - polyline.setMapLibreMap(maplibreMap); - polyline.setId(id); - annotations.put(id, polyline); - } + long id = nativeMap != null ? nativeMap.addPolyline(polyline) : 0; + polyline.setMapLibreMap(maplibreMap); + polyline.setId(id); + annotations.put(id, polyline); return polyline; } diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/AnnotationManagerTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/AnnotationManagerTest.kt index 77cc9bbfaf81..77986855e4a0 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/AnnotationManagerTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/AnnotationManagerTest.kt @@ -8,35 +8,43 @@ import org.maplibre.android.annotations.MarkerOptions import org.maplibre.android.geometry.LatLng import org.junit.Assert import org.junit.Test +import org.maplibre.android.annotations.PolygonOptions +import org.maplibre.android.annotations.PolylineOptions import org.mockito.ArgumentMatchers import org.mockito.Mockito class AnnotationManagerTest { + + private val aNativeMapView: NativeMap = Mockito.mock(NativeMapView::class.java) + private val aMapView = Mockito.mock(MapView::class.java) + private val annotationsArray = LongSparseArray() + private val aIconManager = Mockito.mock( + IconManager::class.java + ) + private val aMapLibreMap = Mockito.mock(MapLibreMap::class.java) + + private val annotations: Annotations = AnnotationContainer(aNativeMapView, annotationsArray) + private val markers: Markers = MarkerContainer(aNativeMapView, annotationsArray, aIconManager) + private val polygons: Polygons = PolygonContainer(aNativeMapView, annotationsArray) + private val polylines: Polylines = PolylineContainer(aNativeMapView, annotationsArray) + private val shapeAnnotations: ShapeAnnotations = + ShapeAnnotationContainer(aNativeMapView, annotationsArray) + + + private val annotationManager = AnnotationManager( + aMapView, + annotationsArray, + aIconManager, + annotations, + markers, + polygons, + polylines, + shapeAnnotations + ) + @Test @Throws(Exception::class) fun checksAddAMarker() { - val aNativeMapView: NativeMap = Mockito.mock(NativeMapView::class.java) - val aMapView = Mockito.mock(MapView::class.java) - val annotationsArray = LongSparseArray() - val aIconManager = Mockito.mock( - IconManager::class.java - ) - val annotations: Annotations = AnnotationContainer(aNativeMapView, annotationsArray) - val markers: Markers = MarkerContainer(aNativeMapView, annotationsArray, aIconManager) - val polygons: Polygons = PolygonContainer(aNativeMapView, annotationsArray) - val polylines: Polylines = PolylineContainer(aNativeMapView, annotationsArray) - val shapeAnnotations: ShapeAnnotations = - ShapeAnnotationContainer(aNativeMapView, annotationsArray) - val annotationManager = AnnotationManager( - aMapView, - annotationsArray, - aIconManager, - annotations, - markers, - polygons, - polylines, - shapeAnnotations - ) val aMarker = Mockito.mock( Marker::class.java ) @@ -55,28 +63,6 @@ class AnnotationManagerTest { @Test @Throws(Exception::class) fun checksAddMarkers() { - val aNativeMapView = Mockito.mock(NativeMapView::class.java) - val aMapView = Mockito.mock(MapView::class.java) - val annotationsArray = LongSparseArray() - val aIconManager = Mockito.mock( - IconManager::class.java - ) - val annotations: Annotations = AnnotationContainer(aNativeMapView, annotationsArray) - val markers: Markers = MarkerContainer(aNativeMapView, annotationsArray, aIconManager) - val polygons: Polygons = PolygonContainer(aNativeMapView, annotationsArray) - val polylines: Polylines = PolylineContainer(aNativeMapView, annotationsArray) - val shapeAnnotations: ShapeAnnotations = - ShapeAnnotationContainer(aNativeMapView, annotationsArray) - val annotationManager = AnnotationManager( - aMapView, - annotationsArray, - aIconManager, - annotations, - markers, - polygons, - polylines, - shapeAnnotations - ) val firstId = 1L val secondId = 2L val markerList: MutableList> = ArrayList() @@ -101,4 +87,33 @@ class AnnotationManagerTest { Assert.assertEquals("first", (annotationManager.getAnnotation(firstId) as Marker).title) Assert.assertEquals("second", (annotationManager.getAnnotation(secondId) as Marker).title) } + + @Test + @Throws(Exception::class) + fun checksAddEmptyPolygon() { + val pId = 5L + val polygonOptions = PolygonOptions() + val polygon = polygonOptions.polygon + Mockito.`when`(aNativeMapView.addPolygon(polygon)).thenReturn(pId) + val resultPolygon = annotationManager.addPolygon(polygonOptions, aMapLibreMap) + Assert.assertEquals(polygon, resultPolygon) + Assert.assertEquals(pId, resultPolygon.id) + Assert.assertEquals(1, annotationManager.annotations.size) + Assert.assertEquals(polygon, annotationManager.annotations[0]) + + } + + @Test + @Throws(Exception::class) + fun checksAddEmptyPolyline() { + val pId = 5L + val polylineOptions = PolylineOptions() + val polyline = polylineOptions.polyline + Mockito.`when`(aNativeMapView.addPolyline(polyline)).thenReturn(pId) + val resultPolyline = annotationManager.addPolyline(polylineOptions, aMapLibreMap) + Assert.assertEquals(polyline, resultPolyline) + Assert.assertEquals(pId, resultPolyline.id) + Assert.assertEquals(1, annotationManager.annotations.size) + Assert.assertEquals(polyline, annotationManager.annotations[0]) + } } From 4878005ffe6ea835f56145b25f0e40e49399e287 Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Thu, 28 Nov 2024 09:37:03 -0500 Subject: [PATCH 002/339] docs: Upgrade to Dokka 2.0.0-Beta (#3054) Co-authored-by: Bart Louwers --- .github/workflows/android-ci.yml | 4 ++-- .github/workflows/gh-pages-android-api.yml | 3 +-- .gitignore | 1 + platform/android/MapLibreAndroid/build.gradle.kts | 15 +++++++++++---- platform/android/gradle.properties | 2 ++ platform/android/gradle/libs.versions.toml | 6 +++--- platform/android/settings.gradle.kts | 4 ++-- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 70729f36b574..a26ad33a3527 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -146,8 +146,8 @@ jobs: run: make android-lib-arm-v8 - name: Build API documentation - run: ./gradlew dokkaHtml - + run: ./gradlew dokkaGenerate + - name: Build Examples documentation run: make mkdocs-build diff --git a/.github/workflows/gh-pages-android-api.yml b/.github/workflows/gh-pages-android-api.yml index 973ff7841762..abe4b3fc6909 100644 --- a/.github/workflows/gh-pages-android-api.yml +++ b/.github/workflows/gh-pages-android-api.yml @@ -23,7 +23,7 @@ jobs: java-version: "17" - name: Generate documentation - run: ./gradlew dokkaHtml + run: ./gradlew dokkaGenerate - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4.6.9 @@ -31,4 +31,3 @@ jobs: branch: gh-pages folder: platform/android/MapLibreAndroid/build/dokka/html target-folder: android/api/ - \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0865374ec536..aa5f392d3294 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /platform/android/armeabi-v7a /platform/android/MapLibreAndroid/.cxx /platform/android/MapLibreAndroid/build +/platform/android/MapLibrePlugin/build /platform/android/MapLibreAndroidTestApp/.cxx /platform/android/MapLibreAndroidTestApp/build /platform/android/buildSrc/build diff --git a/platform/android/MapLibreAndroid/build.gradle.kts b/platform/android/MapLibreAndroid/build.gradle.kts index 7d256d5736d6..d4be1d2fa0ed 100644 --- a/platform/android/MapLibreAndroid/build.gradle.kts +++ b/platform/android/MapLibreAndroid/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.dokka.gradle.DokkaTask - plugins { alias(libs.plugins.kotlinter) alias(libs.plugins.dokka) @@ -38,12 +36,21 @@ dependencies { androidTestImplementation(libs.testRules) } -tasks.withType { +dokka { moduleName.set("MapLibre Native Android") dokkaSourceSets { - named("main") { + main { includes.from("Module.md") + + sourceLink { + remoteUrl("https://github.com/maplibre/maplibre-native/tree/main/platform/android/") + localDirectory.set(rootDir) + } + + // TODO add externalDocumentationLinks when these get dokka or javadocs: + // - https://github.com/maplibre/maplibre-java + // - https://github.com/maplibre/maplibre-gestures-android } } } diff --git a/platform/android/gradle.properties b/platform/android/gradle.properties index a274ee6911db..0eb9ba9bd7ec 100644 --- a/platform/android/gradle.properties +++ b/platform/android/gradle.properties @@ -5,3 +5,5 @@ org.gradle.jvmargs=-Xmx4096M android.nonTransitiveRClass=false android.nonFinalResIds=false android.injected.androidTest.leaveApksInstalledAfterRun=true +org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled +org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true diff --git a/platform/android/gradle/libs.versions.toml b/platform/android/gradle/libs.versions.toml index 15d81d877def..026c6f7bed9b 100644 --- a/platform/android/gradle/libs.versions.toml +++ b/platform/android/gradle/libs.versions.toml @@ -82,14 +82,14 @@ androidxTestExtJUnit = { group = "androidx.test.ext", name = "junit", version = androidxTestCoreKtx = { group = "androidx.test", name = "core-ktx", version = "1.6.1" } kotlinxSerializationJson = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version = "1.7.2" } -androidGradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin"} +androidGradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } [plugins] nexusPublishPlugin = { id = "io.github.gradle-nexus.publish-plugin", version = "2.0.0" } kotlinter = { id = "org.jmailen.kotlinter", version = "4.4.1" } kotlinAndroid = { id = "org.jetbrains.kotlin.android", version = "2.0.20" } -dokka = { id = "org.jetbrains.dokka", version = "1.9.20" } +dokka = { id = "org.jetbrains.dokka", version = "2.0.0-Beta" } kotlinPluginSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version = "2.0.20" } android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } -android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } \ No newline at end of file +android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } diff --git a/platform/android/settings.gradle.kts b/platform/android/settings.gradle.kts index 6292873a9799..4c6c239bc844 100644 --- a/platform/android/settings.gradle.kts +++ b/platform/android/settings.gradle.kts @@ -25,7 +25,7 @@ plugins { include(":MapLibreAndroid", ":MapLibreAndroidTestApp", ":MapLibreAndroidLint") -rootProject.name = "MapLibre Native for Android" +rootProject.name = "MapLibreAndroid" val renderTestProjectDir = file("$rootDir/../../render-test/android") includeBuild(renderTestProjectDir) { @@ -37,4 +37,4 @@ includeBuild(cppTestProjectDir) { name = "cppUnitTestsApp" } -includeBuild("./MapLibrePlugin") \ No newline at end of file +includeBuild("./MapLibrePlugin") From 8b32c9a78309af3df8ffadf5fa4276a135212262 Mon Sep 17 00:00:00 2001 From: Dilshodbek Jumabaev Date: Thu, 28 Nov 2024 22:32:17 +0500 Subject: [PATCH 003/339] Guide to using GeoJsonDataSource (#2977) Co-authored-by: Bart Louwers --- .../feature/QuerySourceFeaturesActivity.kt | 2 + .../style/CollectionUpdateOnStyleChange.kt | 2 + .../activity/style/HeatmapLayerActivity.kt | 5 +- .../testapp/activity/style/NoStyleActivity.kt | 3 +- .../activity/style/RuntimeStyleActivity.kt | 2 + .../style/ZoomFunctionSymbolLayerActivity.kt | 4 + .../turf/MapSnapshotterWithinExpression.kt | 5 +- .../android/testapp/utils/ResourceUtils.kt | 2 + platform/android/docs/geojson-guide.md | 134 ++++++++++++++++++ 9 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 platform/android/docs/geojson-guide.md diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/feature/QuerySourceFeaturesActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/feature/QuerySourceFeaturesActivity.kt index b4113a482bf9..213994f3cbc4 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/feature/QuerySourceFeaturesActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/feature/QuerySourceFeaturesActivity.kt @@ -43,6 +43,7 @@ class QuerySourceFeaturesActivity : AppCompatActivity() { } private fun initStyle(style: Style) { + // # --8<-- [start:JsonObject] val properties = JsonObject() properties.addProperty("key1", "value1") val source = GeoJsonSource( @@ -62,6 +63,7 @@ class QuerySourceFeaturesActivity : AppCompatActivity() { val layer = CircleLayer("test-layer", source.id) .withFilter(visible) style.addLayer(layer) + // # --8<-- [end:JsonObject] // Add a click listener maplibreMap.addOnMapClickListener { point: LatLng? -> diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/CollectionUpdateOnStyleChange.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/CollectionUpdateOnStyleChange.kt index cdabb1ffc10c..589e6e623bfb 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/CollectionUpdateOnStyleChange.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/CollectionUpdateOnStyleChange.kt @@ -56,6 +56,7 @@ class CollectionUpdateOnStyleChange : AppCompatActivity(), OnMapReadyCallback, S } private fun setupLayer(style: Style) { + // # --8<-- [start:setupLayer] val source = GeoJsonSource("source", featureCollection) val lineLayer = LineLayer("layer", "source") .withProperties( @@ -65,6 +66,7 @@ class CollectionUpdateOnStyleChange : AppCompatActivity(), OnMapReadyCallback, S style.addSource(source) style.addLayer(lineLayer) + // # --8<-- [end:setupLayer] } private fun setupStyleChangeView() { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt index dacb8d41cbe4..117346e56940 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt @@ -45,10 +45,11 @@ class HeatmapLayerActivity : AppCompatActivity() { } ) } - + // # --8<-- [start:createEarthquakeSource] private fun createEarthquakeSource(): GeoJsonSource { return GeoJsonSource(EARTHQUAKE_SOURCE_ID, URI(EARTHQUAKE_SOURCE_URL)) } + // # --8<-- [end:createEarthquakeSource] private fun createHeatmapLayer(): HeatmapLayer { val layer = HeatmapLayer(HEATMAP_LAYER_ID, EARTHQUAKE_SOURCE_ID) @@ -188,6 +189,7 @@ class HeatmapLayerActivity : AppCompatActivity() { mapView.onDestroy() } + // # --8<-- [start:constants] companion object { private const val EARTHQUAKE_SOURCE_URL = "https://maplibre.org/maplibre-gl-js-docs/assets/earthquakes.geojson" @@ -196,4 +198,5 @@ class HeatmapLayerActivity : AppCompatActivity() { private const val HEATMAP_LAYER_SOURCE = "earthquakes" private const val CIRCLE_LAYER_ID = "earthquakes-circle" } + // # --8<-- [end:constants] } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/NoStyleActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/NoStyleActivity.kt index 43e16d7ffd6f..3352d2a56e4b 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/NoStyleActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/NoStyleActivity.kt @@ -29,7 +29,7 @@ class NoStyleActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMapSimpleBinding.inflate(layoutInflater) setContentView(binding.root) - + // # --8<-- [start:setup] binding.mapView.getMapAsync { map -> map.moveCamera(CameraUpdateFactory.newLatLngZoom(cameraTarget, cameraZoom)) map.setStyle( @@ -39,6 +39,7 @@ class NoStyleActivity : AppCompatActivity() { .withLayer(SymbolLayer(layerId, sourceId).withProperties(iconImage(imageId))) ) } + // # --8<-- [end:setup] } override fun onStart() { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/RuntimeStyleActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/RuntimeStyleActivity.kt index 6df7788241a2..71341d474050 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/RuntimeStyleActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/RuntimeStyleActivity.kt @@ -329,6 +329,7 @@ class RuntimeStyleActivity : AppCompatActivity() { private fun addParksLayer() { // Add a source + // # --8<-- [start:source] val source: Source = try { GeoJsonSource("amsterdam-spots", ResourceUtils.readRawResource(this, R.raw.amsterdam)) } catch (ioException: IOException) { @@ -347,6 +348,7 @@ class RuntimeStyleActivity : AppCompatActivity() { PropertyFactory.fillOpacity(0.3f), PropertyFactory.fillAntialias(true) ) + // # --8<-- [end:source] // Only show me parks (except westerpark with stroke-width == 3) layer.setFilter( diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt index b7647dcdfc57..b2551676561e 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt @@ -61,6 +61,7 @@ class ZoomFunctionSymbolLayerActivity : AppCompatActivity() { } } + // # --8<-- [start:updateSource] private fun updateSource(style: Style?) { val featureCollection = createFeatureCollection() if (source != null) { @@ -70,6 +71,7 @@ class ZoomFunctionSymbolLayerActivity : AppCompatActivity() { style!!.addSource(source!!) } } + // # --8<-- [end:updateSource] private fun toggleSymbolLayerVisibility() { layer!!.setProperties( @@ -78,6 +80,7 @@ class ZoomFunctionSymbolLayerActivity : AppCompatActivity() { isShowingSymbolLayer = !isShowingSymbolLayer } + // # --8<-- [start:createFeatureCollection] private fun createFeatureCollection(): FeatureCollection { val point = if (isInitialPosition) { Point.fromLngLat(-74.01618140, 40.701745) @@ -89,6 +92,7 @@ class ZoomFunctionSymbolLayerActivity : AppCompatActivity() { val feature = Feature.fromGeometry(point, properties) return FeatureCollection.fromFeatures(arrayOf(feature)) } + // # --8<-- [end:createFeatureCollection] private fun addLayer(style: Style) { layer = SymbolLayer(LAYER_ID, SOURCE_ID) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/turf/MapSnapshotterWithinExpression.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/turf/MapSnapshotterWithinExpression.kt index 7b5e6b4f7072..ae7f447275f1 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/turf/MapSnapshotterWithinExpression.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/turf/MapSnapshotterWithinExpression.kt @@ -187,9 +187,9 @@ class MapSnapshotterWithinExpression : AppCompatActivity() { super.onSaveInstanceState(outState, outPersistentState) binding.mapView.onSaveInstanceState(outState) } - - private fun bufferLineStringGeometry(): Polygon { + private fun bufferLineStringGeometry(): Polygon { // TODO replace static data by Turf#Buffer: mapbox-java/issues/987 + // # --8<-- [start:fromJson] return FeatureCollection.fromJson( """ { @@ -250,6 +250,7 @@ class MapSnapshotterWithinExpression : AppCompatActivity() { } """.trimIndent() ).features()!![0].geometry() as Polygon + // # --8<-- [end:fromJson] } companion object { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ResourceUtils.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ResourceUtils.kt index cabe0ccdcebf..5e9a28efe435 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ResourceUtils.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ResourceUtils.kt @@ -7,6 +7,7 @@ import java.io.* object ResourceUtils { @JvmStatic + // # --8<-- [start:readRawResource] fun readRawResource(context: Context?, @RawRes rawResource: Int): String { var json = "" if (context != null) { @@ -23,6 +24,7 @@ object ResourceUtils { } return json } + // # --8<-- [end:readRawResource] fun convertDpToPx(context: Context, dp: Float): Float { return TypedValue.applyDimension( diff --git a/platform/android/docs/geojson-guide.md b/platform/android/docs/geojson-guide.md new file mode 100644 index 000000000000..db7c0f1a943f --- /dev/null +++ b/platform/android/docs/geojson-guide.md @@ -0,0 +1,134 @@ +# Using a GeoJSON Source + +This guide will teach you how to use [`GeoJsonSource`](https://maplibre.org/maplibre-native/android/api/-map-libre%20-native%20-android/org.maplibre.android.style.sources/-geo-json-source/index.html) by deep diving into [GeoJSON](https://geojson.org/) file format. + +## Goals + +After finishing this documentation you should be able to: + +1. Understand how `Style`, `Layer`, and `Source` interact with each other. +2. Explore building blocks of GeoJSON data. +3. Use GeoJSON files in constructing `GeoJsonSource`s. +4. Update data at runtime. + +## 1. Styles, Layers, and Data source + +- A style defines the visual representation of the map such as colors and appearance. +- Layers control how data should be presented to the user. +- Data sources hold actual data and provides layers with it. + +Styles consist of collections of layers and a data source. Layers reference data sources. Hence, they require a unique source ID when you construct them. +It would be meaningless if we don't have any data to show, so we need know how to supply data through a data source. + +Firstly, we need to understand how to store data and pass it into a data source; therefore, we will discuss GeoJSON in the next session. + +## 2. GeoJSON + +[GeoJSON](https://geojson.org/) is a JSON file for encoding various geographical data structures. +It defines several JSON objects to represent geospatial information. Typicalle the`.geojson` extension is used for GeoJSON files. +We define the most fundamental objects: + +- `Geometry` refers to a single geometric shape that contains one or more coordinates. These shapes are visual objects displayed on a map. A geometry can be one of the following six types: + - Point + - MultiPoint + - LineString + - MultilineString + - Polygon + - MultiPolygon +- `Feautue` is a compound object that combines a single geometry with user-defined attributes, such as name, color. +- `FeatureCollection` is set of features stored in an array. It is a root object that introduces all other features. + +A typical GeoJSON structure might look like: + +```json +{ + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [125.6, 10.1] + }, + "properties": { + "name": "Dinagat Islands" + } +} +``` + +So far we learned describing geospatial data in GeoJSON files. We will start applying this knowledge into our map applications. + +## 3. GeoJsonSource + +As we discussed before, map requires some sort data to be rendered. We use different sources such as Vector, Raster and GeoJSON. +We will focus exclusively on `GeoJsonSource` and will not address other sources. + +`GeoJsonSource` is a type of source that has a unique `String` ID and GeoJSON data. + +There are several ways to construct a `GeoJsonSource`: + +- Locally stored files such as assets and raw folders +- Remote services +- Raw string parsed into FeatureCollections objects +- Geometry, Feature, and FeatureCollection objects that map to GeoJSON Base builders + +A sample `GeoJsonSource`: + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/CollectionUpdateOnStyleChange.kt:setupLayer" +``` + +Note that you can not simply show data on a map. Layers must reference them. Therefore, you create a layer that gives visual appearance to it. + +### Creating GeoJSON sources + +There are various ways you can create a `GeoJSONSource`. Some of the options are shown below. + +```kotlin title="Loading from local files with assets folder file" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/NoStyleActivity.kt:setup" +``` + +```kotlin title="Loading with raw folder file" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/RuntimeStyleActivity.kt:source" +``` + +```kotlin title="Parsing inline JSON" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ResourceUtils.kt:readRawResource" +``` + +```kotlin title="Loading from remote services" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt:createEarthquakeSource" +``` + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt:constants" +``` + +```kotlin title="Parsing string with the fromJson method of FeatureCollection" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/turf/MapSnapshotterWithinExpression.kt:fromJson" +``` + +```kotlin title="Creating Geometry, Feature, and FeatureCollections from scratch" +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/feature/QuerySourceFeaturesActivity.kt:JsonObject" +``` + +Note that the GeoJSON objects we discussed earlier have classes defined in the MapLibre SDK. +Therefore, we can either map JSON objects to regular Java/Kotlin objects or build them directly. + +## 4. Updating data at runtime + +The key feature of `GeoJsonSource`s is that once we add one, we can set another set of data. +We achieve this using `setGeoJson()` method. For instance, we create a source variable and check if we have not assigned it, then we create a new source object and add it to style; otherwise, we set a different data source: + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt:createFeatureCollection" +``` + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/ZoomFunctionSymbolLayerActivity.kt:updateSource" +``` + +See [this guide](styling/animated-symbol-layer.md) for an advanced example that showcases random cars and a passenger on a map updating their positions with smooth animation. + +## Summary + +GeoJsonSources have their pros and cons. They are most effective when you want to add additional data to your style or provide features like animating objects on your map. + +However, working with large datasets can be challenging if you need to manipulate and store data within the app; in such cases, it’s better to use a remote data source. \ No newline at end of file From ee32781b7b9636199a520c081c26d3d36c6557f5 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Sat, 30 Nov 2024 17:38:01 -0300 Subject: [PATCH 004/339] Update vcpkg for compatibility with CMake 3.31 (#3060) --- platform/windows/vendor/vcpkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/windows/vendor/vcpkg b/platform/windows/vendor/vcpkg index f176b58f35a7..db4924694eab 160000 --- a/platform/windows/vendor/vcpkg +++ b/platform/windows/vendor/vcpkg @@ -1 +1 @@ -Subproject commit f176b58f35a75f9f8f54099cd9df97d2e2793a2e +Subproject commit db4924694eabc161a7fb8eb43f083d0ca55396e2 From e932cae2fe24c40d880321a077f65f5424419856 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Sat, 30 Nov 2024 20:21:25 -0300 Subject: [PATCH 005/339] Add Windows to CI tests (#2968) --- .gitattributes | 3 + .github/actions/qt5-build/Dockerfile | 2 +- .github/changed-files.yml | 17 ++ .../scripts/windows-ci_configure_wrapper.ps1 | 23 +++ .github/workflows/windows-ci.yml | 194 ++++++++++++++++++ CMakeLists.txt | 2 +- expression-test/main.cpp | 2 +- metrics/ignores/windows-egl.json | 14 ++ metrics/ignores/windows-opengl.json | 9 + metrics/ignores/windows-vulkan.json | 7 + metrics/windows-egl.json | 15 ++ .../colorSpace-lab/metrics.json | 35 ++++ .../background-color/default/metrics.json | 35 ++++ .../background-color/function/metrics.json | 35 ++++ .../background-color/literal/metrics.json | 35 ++++ .../background-opacity/color/metrics.json | 35 ++++ .../background-opacity/image/metrics.json | 35 ++++ .../background-opacity/overlay/metrics.json | 35 ++++ .../background-pattern/@2x/metrics.json | 35 ++++ .../background-pattern/literal/metrics.json | 35 ++++ .../background-pattern/missing/metrics.json | 35 ++++ .../background-pattern/pitch/metrics.json | 35 ++++ .../background-pattern/rotated/metrics.json | 35 ++++ .../background-pattern/zoomed/metrics.json | 35 ++++ .../background-visibility/none/metrics.json | 35 ++++ .../visible/metrics.json | 35 ++++ .../basic-v9/z0-narrow-y/metrics.json | 35 ++++ .../basic-v9/z0-wide-x/metrics.json | 35 ++++ .../render-tests/basic-v9/z0/metrics.json | 35 ++++ .../render-tests/bright-v9/z0/metrics.json | 35 ++++ .../circle-blur/blending/metrics.json | 35 ++++ .../circle-blur/default/metrics.json | 35 ++++ .../circle-blur/function/metrics.json | 35 ++++ .../circle-blur/literal-stroke/metrics.json | 35 ++++ .../circle-blur/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../circle-color/default/metrics.json | 35 ++++ .../circle-color/function/metrics.json | 35 ++++ .../circle-color/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../circle-geometry/linestring/metrics.json | 35 ++++ .../multilinestring/metrics.json | 35 ++++ .../circle-geometry/multipoint/metrics.json | 35 ++++ .../circle-geometry/multipolygon/metrics.json | 35 ++++ .../circle-geometry/point/metrics.json | 35 ++++ .../circle-geometry/polygon/metrics.json | 35 ++++ .../circle-opacity/blending/metrics.json | 35 ++++ .../circle-opacity/default/metrics.json | 35 ++++ .../circle-opacity/function/metrics.json | 35 ++++ .../circle-opacity/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../map-scale-map/metrics.json | 35 ++++ .../map-scale-viewport/metrics.json | 35 ++++ .../viewport-scale-map/metrics.json | 35 ++++ .../viewport-scale-viewport/metrics.json | 35 ++++ .../circle-pitch-scale/default/metrics.json | 35 ++++ .../circle-pitch-scale/map/metrics.json | 35 ++++ .../circle-pitch-scale/viewport/metrics.json | 35 ++++ .../circle-radius/antimeridian/metrics.json | 35 ++++ .../circle-radius/default/metrics.json | 35 ++++ .../circle-radius/function/metrics.json | 35 ++++ .../circle-radius/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../circle-sort-key/literal/metrics.json | 35 ++++ .../circle-stroke-color/default/metrics.json | 35 ++++ .../circle-stroke-color/function/metrics.json | 35 ++++ .../circle-stroke-color/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../function/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../stroke-only/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../circle-stroke-width/default/metrics.json | 35 ++++ .../circle-stroke-width/function/metrics.json | 35 ++++ .../circle-stroke-width/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../circle-translate-anchor/map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../circle-translate/default/metrics.json | 35 ++++ .../circle-translate/function/metrics.json | 35 ++++ .../circle-translate/literal/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../fill-extrusion--fill-opaque/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../fill-opaque--fill-opaque/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../collision-lines-overscaled/metrics.json | 35 ++++ .../collision-lines-pitched/metrics.json | 35 ++++ .../debug/collision-lines/metrics.json | 35 ++++ .../debug/collision-overscaled/metrics.json | 35 ++++ .../collision-pitched-wrapped/metrics.json | 35 ++++ .../debug/collision-pitched/metrics.json | 35 ++++ .../render-tests/empty/empty/metrics.json | 35 ++++ .../extent/1024-fill/metrics.json | 35 ++++ .../extent/1024-line/metrics.json | 35 ++++ .../composite-expression/metrics.json | 35 ++++ .../data-expression/metrics.json | 35 ++++ .../feature-state/vector-source/metrics.json | 35 ++++ .../fill-antialias/false/metrics.json | 35 ++++ .../fill-color/default/metrics.json | 35 ++++ .../fill-color/function/metrics.json | 35 ++++ .../fill-color/literal/metrics.json | 35 ++++ .../fill-color/multiply/metrics.json | 35 ++++ .../fill-color/opacity/metrics.json | 35 ++++ .../fill-color/property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../fill-extrusion-base/default/metrics.json | 35 ++++ .../fill-extrusion-base/function/metrics.json | 35 ++++ .../fill-extrusion-base/literal/metrics.json | 35 ++++ .../fill-extrusion-base/negative/metrics.json | 35 ++++ .../fill-extrusion-color/default/metrics.json | 35 ++++ .../function/metrics.json | 35 ++++ .../fill-extrusion-color/literal/metrics.json | 35 ++++ .../no-alpha-no-multiply/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../function/metrics.json | 35 ++++ .../negative/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../interleaved-layers/metrics.json | 35 ++++ .../multiple/metrics.json | 35 ++++ .../missing/metrics.json | 35 ++++ .../map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../function/metrics.json | 35 ++++ .../literal-opacity/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../fill-opacity/default/metrics.json | 35 ++++ .../fill-opacity/function/metrics.json | 35 ++++ .../fill-opacity/literal/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../fill-opacity/overlapping/metrics.json | 35 ++++ .../property-function-pattern/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../fill-outline-color/default/metrics.json | 35 ++++ .../fill-outline-color/fill/metrics.json | 35 ++++ .../fill-outline-color/function/metrics.json | 35 ++++ .../fill-outline-color/literal/metrics.json | 35 ++++ .../fill-outline-color/multiply/metrics.json | 35 ++++ .../fill-outline-color/opacity/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../fill-pattern/@2x/metrics.json | 35 ++++ .../case-data-expression/metrics.json | 35 ++++ .../invalid-feature-expression/metrics.json | 35 ++++ .../fill-pattern/literal/metrics.json | 35 ++++ .../fill-pattern/missing/metrics.json | 35 ++++ .../fill-pattern/opacity/metrics.json | 35 ++++ .../fill-pattern/uneven-pattern/metrics.json | 35 ++++ .../wrapping-with-interpolation/metrics.json | 35 ++++ .../fill-pattern/zoomed/metrics.json | 35 ++++ .../fill-sort-key/literal/metrics.json | 35 ++++ .../fill-translate-anchor/map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../fill-translate/default/metrics.json | 35 ++++ .../fill-translate/function/metrics.json | 35 ++++ .../fill-translate/literal/metrics.json | 35 ++++ .../fill-visibility/none/metrics.json | 35 ++++ .../fill-visibility/visible/metrics.json | 35 ++++ .../render-tests/filter/equality/metrics.json | 35 ++++ .../render-tests/filter/in/metrics.json | 35 ++++ .../filter/legacy-equality/metrics.json | 35 ++++ .../render-tests/filter/none/metrics.json | 35 ++++ .../geojson/clustered-properties/metrics.json | 35 ++++ .../geojson/clustered/metrics.json | 35 ++++ .../geojson/external-feature/metrics.json | 35 ++++ .../geojson/external-invalid/metrics.json | 35 ++++ .../geojson/external-linestring/metrics.json | 35 ++++ .../geojson/external-malformed/metrics.json | 35 ++++ .../inconsistent-winding-order/metrics.json | 35 ++++ .../geojson/inline-feature/metrics.json | 35 ++++ .../geojson/inline-invalid/metrics.json | 35 ++++ .../inline-linestring-circle/metrics.json | 35 ++++ .../inline-linestring-line/metrics.json | 35 ++++ .../inline-linestring-symbol/metrics.json | 35 ++++ .../geojson/inline-malformed/metrics.json | 35 ++++ .../geojson/inline-point-circle/metrics.json | 35 ++++ .../geojson/inline-point-fill/metrics.json | 35 ++++ .../geojson/inline-point-line/metrics.json | 35 ++++ .../geojson/inline-point-symbol/metrics.json | 35 ++++ .../inline-polygon-circle/metrics.json | 35 ++++ .../geojson/inline-polygon-fill/metrics.json | 35 ++++ .../geojson/inline-polygon-line/metrics.json | 35 ++++ .../inline-polygon-symbol/metrics.json | 35 ++++ .../render-tests/geojson/missing/metrics.json | 35 ++++ .../geojson/reparse-overscaled/metrics.json | 35 ++++ .../heatmap-color/default/metrics.json | 35 ++++ .../heatmap-color/expression/metrics.json | 35 ++++ .../heatmap-intensity/default/metrics.json | 35 ++++ .../heatmap-intensity/function/metrics.json | 35 ++++ .../heatmap-intensity/literal/metrics.json | 35 ++++ .../heatmap-opacity/default/metrics.json | 35 ++++ .../heatmap-opacity/function/metrics.json | 35 ++++ .../heatmap-opacity/literal/metrics.json | 35 ++++ .../heatmap-radius/antimeridian/metrics.json | 35 ++++ .../data-expression/metrics.json | 35 ++++ .../heatmap-radius/default/metrics.json | 35 ++++ .../heatmap-radius/function/metrics.json | 35 ++++ .../heatmap-radius/literal/metrics.json | 35 ++++ .../heatmap-radius/pitch30/metrics.json | 35 ++++ .../heatmap-weight/default/metrics.json | 35 ++++ .../identity-property-function/metrics.json | 35 ++++ .../heatmap-weight/literal/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../terrarium/metrics.json | 35 ++++ .../zoom-function/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../zoom-function/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../zoom-function/metrics.json | 35 ++++ .../icon-anchor/bottom-left/metrics.json | 35 ++++ .../icon-anchor/bottom-right/metrics.json | 35 ++++ .../icon-anchor/bottom/metrics.json | 35 ++++ .../icon-anchor/center/metrics.json | 35 ++++ .../icon-anchor/default/metrics.json | 35 ++++ .../icon-anchor/left/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-anchor/right/metrics.json | 35 ++++ .../icon-anchor/top-left/metrics.json | 35 ++++ .../icon-anchor/top-right/metrics.json | 35 ++++ .../render-tests/icon-anchor/top/metrics.json | 35 ++++ .../icon-color/default/metrics.json | 35 ++++ .../icon-color/function/metrics.json | 35 ++++ .../icon-color/literal/metrics.json | 35 ++++ .../icon-color/property-function/metrics.json | 35 ++++ .../icon-halo-blur/default/metrics.json | 35 ++++ .../icon-halo-blur/function/metrics.json | 35 ++++ .../icon-halo-blur/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-halo-color/default/metrics.json | 35 ++++ .../icon-halo-color/function/metrics.json | 35 ++++ .../icon-halo-color/literal/metrics.json | 35 ++++ .../icon-halo-color/multiply/metrics.json | 35 ++++ .../icon-halo-color/opacity/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-halo-color/transparent/metrics.json | 35 ++++ .../icon-halo-width/default/metrics.json | 35 ++++ .../icon-halo-width/function/metrics.json | 35 ++++ .../icon-halo-width/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-sdf-non-sdf-one-layer/metrics.json | 35 ++++ .../icon-image/image-expression/metrics.json | 35 ++++ .../icon-image/literal/metrics.json | 35 ++++ .../icon-image/property-function/metrics.json | 35 ++++ .../stretchable-content/metrics.json | 35 ++++ .../icon-image/stretchable/metrics.json | 35 ++++ .../icon-image/token/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../icon-offset/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../icon-opacity/default/metrics.json | 35 ++++ .../icon-opacity/function/metrics.json | 35 ++++ .../icon-opacity/icon-only/metrics.json | 35 ++++ .../icon-opacity/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-opacity/text-and-icon/metrics.json | 35 ++++ .../icon-opacity/text-only/metrics.json | 35 ++++ .../icon-padding/databind/metrics.json | 35 ++++ .../icon-padding/default/metrics.json | 35 ++++ .../auto-rotation-alignment-map/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../rotation-alignment-map/metrics.json | 35 ++++ .../rotation-alignment-viewport/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../icon-rotate/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../icon-rotate/with-offset/metrics.json | 35 ++++ .../auto-symbol-placement-line/metrics.json | 35 ++++ .../auto-symbol-placement-point/metrics.json | 35 ++++ .../map-symbol-placement-line/metrics.json | 35 ++++ .../map-symbol-placement-point/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../camera-function-plain/metrics.json | 35 ++++ .../camera-function-sdf/metrics.json | 35 ++++ .../composite-function-plain/metrics.json | 35 ++++ .../composite-function-sdf/metrics.json | 35 ++++ .../icon-size/default/metrics.json | 35 ++++ .../icon-size/function/metrics.json | 35 ++++ .../icon-size/literal/metrics.json | 35 ++++ .../property-function-plain/metrics.json | 35 ++++ .../property-function-sdf/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../icon-text-fit/both-collision/metrics.json | 35 ++++ .../icon-text-fit/both-padding/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../both-text-anchor-icon-anchor/metrics.json | 35 ++++ .../both-text-anchor-icon-offset/metrics.json | 35 ++++ .../both-text-anchor-padding/metrics.json | 35 ++++ .../both-text-anchor/metrics.json | 35 ++++ .../icon-text-fit/both/metrics.json | 35 ++++ .../enlargen-both-padding/metrics.json | 35 ++++ .../icon-text-fit/enlargen-both/metrics.json | 35 ++++ .../enlargen-height/metrics.json | 35 ++++ .../icon-text-fit/enlargen-width/metrics.json | 35 ++++ .../icon-text-fit/height-padding/metrics.json | 35 ++++ .../height-text-anchor-padding/metrics.json | 35 ++++ .../height-text-anchor/metrics.json | 35 ++++ .../icon-text-fit/height/metrics.json | 35 ++++ .../icon-text-fit/none/metrics.json | 35 ++++ .../icon-text-fit/placement-line/metrics.json | 35 ++++ .../stretch-fifteen-part/metrics.json | 35 ++++ .../stretch-nine-part-@2x/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../stretch-nine-part-content/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../stretch-nine-part-just-width/metrics.json | 35 ++++ .../stretch-nine-part/metrics.json | 35 ++++ .../stretch-three-part/metrics.json | 35 ++++ .../stretch-two-part/metrics.json | 35 ++++ .../stretch-underscale/metrics.json | 35 ++++ .../text-variable-anchor/metrics.json | 35 ++++ .../textFit-anchors-long/metrics.json | 35 ++++ .../textFit-anchors-short/metrics.json | 35 ++++ .../textFit-collision/metrics.json | 35 ++++ .../textFit-grid-long-vertical/metrics.json | 35 ++++ .../textFit-grid-long/metrics.json | 35 ++++ .../textFit-grid-short-vertical/metrics.json | 35 ++++ .../textFit-grid-short/metrics.json | 35 ++++ .../icon-text-fit/width-padding/metrics.json | 35 ++++ .../width-text-anchor-padding/metrics.json | 35 ++++ .../width-text-anchor/metrics.json | 35 ++++ .../icon-text-fit/width/metrics.json | 35 ++++ .../icon-translate-anchor/map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../icon-translate/default/metrics.json | 35 ++++ .../icon-translate/function/metrics.json | 35 ++++ .../icon-translate/literal/metrics.json | 35 ++++ .../icon-visibility/none/metrics.json | 35 ++++ .../icon-visibility/visible/metrics.json | 35 ++++ .../render-tests/image/default/metrics.json | 35 ++++ .../render-tests/image/pitched/metrics.json | 35 ++++ .../image/raster-brightness/metrics.json | 35 ++++ .../image/raster-contrast/metrics.json | 35 ++++ .../image/raster-hue-rotate/metrics.json | 35 ++++ .../image/raster-opacity/metrics.json | 35 ++++ .../image/raster-resampling/metrics.json | 35 ++++ .../image/raster-saturation/metrics.json | 35 ++++ .../image/raster-visibility/metrics.json | 35 ++++ .../is-supported-script/filter/metrics.json | 35 ++++ .../is-supported-script/layout/metrics.json | 35 ++++ .../line-blur/default/metrics.json | 35 ++++ .../line-blur/function/metrics.json | 35 ++++ .../line-blur/literal/metrics.json | 35 ++++ .../line-blur/property-function/metrics.json | 35 ++++ .../render-tests/line-cap/butt/metrics.json | 35 ++++ .../render-tests/line-cap/round/metrics.json | 35 ++++ .../render-tests/line-cap/square/metrics.json | 35 ++++ .../line-color/default/metrics.json | 35 ++++ .../line-color/function/metrics.json | 35 ++++ .../line-color/literal/metrics.json | 35 ++++ .../property-function-identity/metrics.json | 35 ++++ .../line-color/property-function/metrics.json | 35 ++++ .../line-dasharray/default/metrics.json | 35 ++++ .../fractional-zoom/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../function/line-width-constant/metrics.json | 35 ++++ .../line-width-property-function/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../literal/line-width-constant/metrics.json | 35 ++++ .../line-width-property-function/metrics.json | 35 ++++ .../line-width-zoom-function/metrics.json | 35 ++++ .../line-dasharray/long-segment/metrics.json | 35 ++++ .../line-dasharray/overscaled/metrics.json | 35 ++++ .../round/segments/metrics.json | 35 ++++ .../round/zero-gap-width/metrics.json | 35 ++++ .../line-dasharray/slant/metrics.json | 35 ++++ .../zero-length-gap/metrics.json | 35 ++++ .../line-dasharray/zoom-history/metrics.json | 35 ++++ .../line-gap-width/default/metrics.json | 35 ++++ .../line-gap-width/function/metrics.json | 35 ++++ .../line-gap-width/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../gradient-tile-boundaries/metrics.json | 35 ++++ .../line-gradient/gradient/metrics.json | 35 ++++ .../line-gradient/translucent/metrics.json | 35 ++++ .../line-join/bevel-transparent/metrics.json | 35 ++++ .../render-tests/line-join/bevel/metrics.json | 35 ++++ .../line-join/default/metrics.json | 35 ++++ .../line-join/miter-transparent/metrics.json | 35 ++++ .../render-tests/line-join/miter/metrics.json | 35 ++++ .../property-function-dasharray/metrics.json | 35 ++++ .../line-join/property-function/metrics.json | 35 ++++ .../line-join/round-transparent/metrics.json | 35 ++++ .../render-tests/line-join/round/metrics.json | 35 ++++ .../line-offset/default/metrics.json | 35 ++++ .../line-offset/function/metrics.json | 35 ++++ .../line-offset/literal-negative/metrics.json | 35 ++++ .../line-offset/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../line-opacity/default/metrics.json | 35 ++++ .../line-opacity/function/metrics.json | 35 ++++ .../line-opacity/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../line-opacity/step-curve/metrics.json | 35 ++++ .../line-pattern/@2x/metrics.json | 35 ++++ .../line-pattern/literal/metrics.json | 35 ++++ .../line-pattern/opacity/metrics.json | 35 ++++ .../line-pattern/overscaled/metrics.json | 35 ++++ .../line-pattern/pitch/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../line-pattern/step-curve/metrics.json | 35 ++++ .../line-pattern/zoom-expression/metrics.json | 35 ++++ .../line-pitch/default/metrics.json | 35 ++++ .../line-pitch/pitch0/metrics.json | 35 ++++ .../line-pitch/pitch15/metrics.json | 35 ++++ .../line-pitch/pitch30/metrics.json | 35 ++++ .../line-pitch/pitchAndBearing/metrics.json | 35 ++++ .../line-sort-key/literal/metrics.json | 35 ++++ .../line-translate-anchor/map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../line-translate/default/metrics.json | 35 ++++ .../line-translate/function/metrics.json | 35 ++++ .../line-translate/literal/metrics.json | 35 ++++ .../line-triangulation/default/metrics.json | 35 ++++ .../line-triangulation/round/metrics.json | 35 ++++ .../line-visibility/none/metrics.json | 35 ++++ .../line-visibility/visible/metrics.json | 35 ++++ .../line-width/default/metrics.json | 35 ++++ .../line-width/function/metrics.json | 35 ++++ .../line-width/literal/metrics.json | 35 ++++ .../line-width/property-function/metrics.json | 35 ++++ .../line-width/very-overscaled/metrics.json | 35 ++++ .../zero-width-function/metrics.json | 35 ++++ .../line-width/zero-width/metrics.json | 35 ++++ .../literal/metrics.json | 35 ++++ .../render-tests/map-mode/static/metrics.json | 35 ++++ .../map-mode/tile-avoid-edges/metrics.json | 35 ++++ .../render-tests/map-mode/tile/metrics.json | 35 ++++ .../axonometric-multiple/metrics.json | 35 ++++ .../projection/axonometric/metrics.json | 35 ++++ .../render-tests/projection/skew/metrics.json | 35 ++++ .../raster-alpha/default/metrics.json | 35 ++++ .../raster-brightness/default/metrics.json | 35 ++++ .../raster-brightness/function/metrics.json | 35 ++++ .../raster-brightness/literal/metrics.json | 35 ++++ .../raster-contrast/default/metrics.json | 35 ++++ .../raster-contrast/function/metrics.json | 35 ++++ .../raster-contrast/literal/metrics.json | 35 ++++ .../raster-extent/maxzoom/metrics.json | 35 ++++ .../raster-extent/minzoom/metrics.json | 35 ++++ .../raster-hue-rotate/default/metrics.json | 35 ++++ .../raster-hue-rotate/function/metrics.json | 35 ++++ .../raster-hue-rotate/literal/metrics.json | 35 ++++ .../raster-loading/missing/metrics.json | 35 ++++ .../overlapping-vector/metrics.json | 35 ++++ .../raster-masking/overlapping/metrics.json | 35 ++++ .../raster-opacity/default/metrics.json | 35 ++++ .../raster-opacity/function/metrics.json | 35 ++++ .../raster-opacity/literal/metrics.json | 35 ++++ .../raster-resampling/default/metrics.json | 35 ++++ .../raster-resampling/function/metrics.json | 35 ++++ .../raster-resampling/literal/metrics.json | 35 ++++ .../raster-rotation/0/metrics.json | 35 ++++ .../raster-rotation/180/metrics.json | 35 ++++ .../raster-rotation/270/metrics.json | 35 ++++ .../raster-rotation/45/metrics.json | 35 ++++ .../raster-rotation/90/metrics.json | 35 ++++ .../raster-saturation/default/metrics.json | 35 ++++ .../raster-saturation/function/metrics.json | 35 ++++ .../raster-saturation/literal/metrics.json | 35 ++++ .../raster-visibility/none/metrics.json | 35 ++++ .../raster-visibility/visible/metrics.json | 35 ++++ .../real-world/nepal/metrics.json | 35 ++++ .../real-world/norway/metrics.json | 35 ++++ .../real-world/uruguay/metrics.json | 35 ++++ .../mapbox-gl-js#2305/metrics.json | 35 ++++ .../mapbox-gl-js#2523/metrics.json | 35 ++++ .../mapbox-gl-js#2533/metrics.json | 35 ++++ .../mapbox-gl-js#2534/metrics.json | 35 ++++ .../mapbox-gl-js#2787/metrics.json | 35 ++++ .../mapbox-gl-js#2846/metrics.json | 35 ++++ .../mapbox-gl-js#2929/metrics.json | 35 ++++ .../mapbox-gl-js#3010/metrics.json | 35 ++++ .../mapbox-gl-js#3107/metrics.json | 35 ++++ .../mapbox-gl-js#3320/metrics.json | 35 ++++ .../mapbox-gl-js#3365/metrics.json | 35 ++++ .../mapbox-gl-js#3394/metrics.json | 35 ++++ .../mapbox-gl-js#3426/metrics.json | 35 ++++ .../mapbox-gl-js#3548/metrics.json | 35 ++++ .../mapbox-gl-js#3612/metrics.json | 35 ++++ .../mapbox-gl-js#3614/metrics.json | 35 ++++ .../mapbox-gl-js#3623/metrics.json | 35 ++++ .../mapbox-gl-js#3633/metrics.json | 35 ++++ .../mapbox-gl-js#3682/metrics.json | 35 ++++ .../mapbox-gl-js#3702/metrics.json | 35 ++++ .../mapbox-gl-js#3723/metrics.json | 35 ++++ .../mapbox-gl-js#3819/metrics.json | 35 ++++ .../mapbox-gl-js#3903/metrics.json | 35 ++++ .../mapbox-gl-js#3910/metrics.json | 35 ++++ .../mapbox-gl-js#3949/metrics.json | 35 ++++ .../mapbox-gl-js#4124/metrics.json | 35 ++++ .../mapbox-gl-js#4144/metrics.json | 35 ++++ .../mapbox-gl-js#4146/metrics.json | 35 ++++ .../mapbox-gl-js#4150/metrics.json | 35 ++++ .../mapbox-gl-js#4172/metrics.json | 35 ++++ .../mapbox-gl-js#4235/metrics.json | 35 ++++ .../mapbox-gl-js#4550/metrics.json | 35 ++++ .../mapbox-gl-js#4551/metrics.json | 35 ++++ .../mapbox-gl-js#4564/metrics.json | 35 ++++ .../mapbox-gl-js#4573/metrics.json | 35 ++++ .../mapbox-gl-js#4579/metrics.json | 35 ++++ .../mapbox-gl-js#4605/metrics.json | 35 ++++ .../mapbox-gl-js#4617/metrics.json | 35 ++++ .../mapbox-gl-js#4647/metrics.json | 35 ++++ .../mapbox-gl-js#4651/metrics.json | 35 ++++ .../mapbox-gl-js#4860/metrics.json | 35 ++++ .../mapbox-gl-js#4928/metrics.json | 35 ++++ .../mapbox-gl-js#5171/metrics.json | 35 ++++ .../mapbox-gl-js#5370/metrics.json | 35 ++++ .../mapbox-gl-js#5466/metrics.json | 35 ++++ .../mapbox-gl-js#5496/metrics.json | 35 ++++ .../mapbox-gl-js#5544/metrics.json | 35 ++++ .../mapbox-gl-js#5546/metrics.json | 35 ++++ .../mapbox-gl-js#5576/metrics.json | 35 ++++ .../mapbox-gl-js#5599/metrics.json | 35 ++++ .../mapbox-gl-js#5631/metrics.json | 35 ++++ .../mapbox-gl-js#5642/metrics.json | 35 ++++ .../mapbox-gl-js#5776/metrics.json | 35 ++++ .../mapbox-gl-js#5911/metrics.json | 35 ++++ .../mapbox-gl-js#5911a/metrics.json | 35 ++++ .../mapbox-gl-js#5947/metrics.json | 35 ++++ .../mapbox-gl-js#5953/metrics.json | 35 ++++ .../mapbox-gl-js#5978/metrics.json | 35 ++++ .../mapbox-gl-js#6160/metrics.json | 35 ++++ .../mapbox-gl-js#6238/metrics.json | 35 ++++ .../mapbox-gl-js#6548/metrics.json | 35 ++++ .../mapbox-gl-js#6649/metrics.json | 35 ++++ .../mapbox-gl-js#6660/metrics.json | 35 ++++ .../mapbox-gl-js#6919/metrics.json | 35 ++++ .../mapbox-gl-js#7032/metrics.json | 35 ++++ .../mapbox-gl-js#7066/metrics.json | 35 ++++ .../mapbox-gl-js#7172/metrics.json | 35 ++++ .../mapbox-gl-js#8273/metrics.json | 35 ++++ .../mapbox-gl-js#9009/metrics.json | 35 ++++ .../mapbox-gl-native#10849/metrics.json | 35 ++++ .../mapbox-gl-native#11451/metrics.json | 35 ++++ .../mapbox-gl-native#11729/metrics.json | 35 ++++ .../mapbox-gl-native#12812/metrics.json | 35 ++++ .../mapbox-gl-native#14402/metrics.json | 35 ++++ .../mapbox-gl-native#15139/metrics.json | 35 ++++ .../mapbox-gl-native#3292/metrics.json | 35 ++++ .../mapbox-gl-native#5648/metrics.json | 35 ++++ .../mapbox-gl-native#5701/metrics.json | 35 ++++ .../mapbox-gl-native#5754/metrics.json | 35 ++++ .../mapbox-gl-native#6063/metrics.json | 35 ++++ .../mapbox-gl-native#6233/metrics.json | 35 ++++ .../mapbox-gl-native#6820/metrics.json | 35 ++++ .../mapbox-gl-native#6903/metrics.json | 35 ++++ .../mapbox-gl-native#7241/metrics.json | 35 ++++ .../mapbox-gl-native#7572/metrics.json | 35 ++++ .../mapbox-gl-native#7714/metrics.json | 35 ++++ .../mapbox-gl-native#7792/metrics.json | 35 ++++ .../mapbox-gl-native#8078/metrics.json | 35 ++++ .../mapbox-gl-native#8303/metrics.json | 35 ++++ .../mapbox-gl-native#8460/metrics.json | 35 ++++ .../mapbox-gl-native#8505/metrics.json | 35 ++++ .../mapbox-gl-native#8871/metrics.json | 35 ++++ .../mapbox-gl-native#8952/metrics.json | 35 ++++ .../mapbox-gl-native#9406/metrics.json | 35 ++++ .../mapbox-gl-native#9557/metrics.json | 35 ++++ .../mapbox-gl-native#9792/metrics.json | 35 ++++ .../mapbox-gl-native#9900/metrics.json | 35 ++++ .../mapbox-gl-native#9976/metrics.json | 35 ++++ .../mapbox-gl-native#9979/metrics.json | 35 ++++ .../mapbox-gl-shaders#37/metrics.json | 35 ++++ .../composite-expression/metrics.json | 35 ++++ .../data-expression/metrics.json | 35 ++++ .../vector-source/metrics.json | 35 ++++ .../retina-raster/default/metrics.json | 35 ++++ .../filter-default-to-false/metrics.json | 35 ++++ .../filter-default-to-true/metrics.json | 35 ++++ .../filter-false-to-default/metrics.json | 35 ++++ .../filter-false-to-true/metrics.json | 35 ++++ .../filter-true-to-default/metrics.json | 35 ++++ .../filter-true-to-false/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../image-add-1x-image-1x-screen/metrics.json | 35 ++++ .../image-add-1x-image-2x-screen/metrics.json | 35 ++++ .../image-add-2x-image-1x-screen/metrics.json | 35 ++++ .../image-add-2x-image-2x-screen/metrics.json | 35 ++++ .../image-add-alpha/metrics.json | 35 ++++ .../image-add-nonsdf/metrics.json | 35 ++++ .../image-add-pattern/metrics.json | 35 ++++ .../image-add-sdf/metrics.json | 35 ++++ .../runtime-styling/image-remove/metrics.json | 35 ++++ .../image-update-icon/metrics.json | 35 ++++ .../image-update-pattern/metrics.json | 35 ++++ .../layer-add-background/metrics.json | 35 ++++ .../layer-add-circle/metrics.json | 35 ++++ .../layer-add-fill/metrics.json | 35 ++++ .../layer-add-line/metrics.json | 35 ++++ .../layer-add-raster/metrics.json | 35 ++++ .../layer-add-symbol/metrics.json | 35 ++++ .../layer-remove-background/metrics.json | 35 ++++ .../layer-remove-circle/metrics.json | 35 ++++ .../layer-remove-fill/metrics.json | 35 ++++ .../layer-remove-line/metrics.json | 35 ++++ .../layer-remove-raster/metrics.json | 35 ++++ .../layer-remove-symbol/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../set-style-layer-add-circle/metrics.json | 35 ++++ .../set-style-layer-add-fill/metrics.json | 35 ++++ .../set-style-layer-add-line/metrics.json | 35 ++++ .../set-style-layer-add-raster/metrics.json | 35 ++++ .../set-style-layer-add-symbol/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../set-style-layer-remove-fill/metrics.json | 35 ++++ .../set-style-layer-remove-line/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../set-style-layer-reorder/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../set-style-source-update/metrics.json | 35 ++++ .../set-style-sprite/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../source-add-geojson-inline/metrics.json | 35 ++++ .../source-add-geojson-url/metrics.json | 35 ++++ .../source-add-raster-inline/metrics.json | 35 ++++ .../source-add-raster-url/metrics.json | 35 ++++ .../source-add-vector-inline/metrics.json | 35 ++++ .../source-add-vector-url/metrics.json | 35 ++++ .../visibility-default-to-none/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../visibility-none-to-default/metrics.json | 35 ++++ .../visibility-none-to-visible/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../visibility-visible-to-none/metrics.json | 35 ++++ .../render-tests/satellite-v9/z0/metrics.json | 35 ++++ .../sparse-tileset/overdraw/metrics.json | 35 ++++ .../sprites/1x-screen-1x-icon/metrics.json | 35 ++++ .../sprites/1x-screen-1x-pattern/metrics.json | 35 ++++ .../sprites/1x-screen-2x-icon/metrics.json | 35 ++++ .../sprites/1x-screen-2x-pattern/metrics.json | 35 ++++ .../sprites/2x-screen-1x-icon/metrics.json | 35 ++++ .../sprites/2x-screen-1x-pattern/metrics.json | 35 ++++ .../sprites/2x-screen-2x-icon/metrics.json | 35 ++++ .../sprites/2x-screen-2x-pattern/metrics.json | 35 ++++ .../sprites/array-default-only/metrics.json | 35 ++++ .../sprites/array-multiple/metrics.json | 35 ++++ .../symbol-geometry/linestring/metrics.json | 35 ++++ .../multilinestring/metrics.json | 35 ++++ .../symbol-geometry/multipoint/metrics.json | 35 ++++ .../symbol-geometry/multipolygon/metrics.json | 35 ++++ .../symbol-geometry/point/metrics.json | 35 ++++ .../symbol-geometry/polygon/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../line-center-buffer/metrics.json | 35 ++++ .../line-center-tile-map-mode/metrics.json | 35 ++++ .../symbol-placement/line-center/metrics.json | 35 ++++ .../line-overscaled/metrics.json | 35 ++++ .../symbol-placement/line/metrics.json | 35 ++++ .../point-polygon/metrics.json | 35 ++++ .../symbol-placement/point/metrics.json | 35 ++++ .../icon-expression/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-expression/metrics.json | 35 ++++ .../text-ignore-placement/metrics.json | 35 ++++ .../text-placement/metrics.json | 35 ++++ .../symbol-spacing/line-close/metrics.json | 35 ++++ .../symbol-spacing/line-far/metrics.json | 35 ++++ .../line-overscaled/metrics.json | 35 ++++ .../symbol-spacing/point-close/metrics.json | 35 ++++ .../symbol-spacing/point-far/metrics.json | 35 ++++ .../symbol-visibility/none/metrics.json | 35 ++++ .../symbol-visibility/visible/metrics.json | 35 ++++ .../symbol-z-order/default/metrics.json | 35 ++++ .../symbol-z-order/disabled/metrics.json | 35 ++++ .../icon-with-text/metrics.json | 35 ++++ .../symbol-z-order/pitched/metrics.json | 35 ++++ .../symbol-z-order/viewport-y/metrics.json | 35 ++++ .../text-anchor/bottom-left/metrics.json | 35 ++++ .../text-anchor/bottom-right/metrics.json | 35 ++++ .../text-anchor/bottom/metrics.json | 35 ++++ .../text-anchor/center/metrics.json | 35 ++++ .../text-anchor/left/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-anchor/right/metrics.json | 35 ++++ .../text-anchor/top-left/metrics.json | 35 ++++ .../text-anchor/top-right/metrics.json | 35 ++++ .../render-tests/text-anchor/top/metrics.json | 35 ++++ .../text-arabic/letter-spacing/metrics.json | 35 ++++ .../text-arabic/line-break-mixed/metrics.json | 35 ++++ .../text-arabic/line-break/metrics.json | 35 ++++ .../text-arabic/mixed-numeric/metrics.json | 35 ++++ .../text-arabic/multi-paragraph/metrics.json | 35 ++++ .../text-color/default/metrics.json | 35 ++++ .../text-color/function/metrics.json | 35 ++++ .../text-color/literal/metrics.json | 35 ++++ .../text-color/property-function/metrics.json | 35 ++++ .../text-field/formatted-arabic/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../formatted-images-line/metrics.json | 35 ++++ .../formatted-images-multiline/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../formatted-images-vertical/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-field/formatted-images/metrics.json | 35 ++++ .../text-field/formatted-line/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../formatted-text-color/metrics.json | 35 ++++ .../text-field/formatted/metrics.json | 35 ++++ .../text-field/literal/metrics.json | 35 ++++ .../text-field/property-function/metrics.json | 35 ++++ .../text-field/token/metrics.json | 35 ++++ .../text-font/camera-function/metrics.json | 35 ++++ .../text-font/chinese/metrics.json | 35 ++++ .../text-font/data-expression/metrics.json | 35 ++++ .../text-font/literal/metrics.json | 35 ++++ .../text-halo-blur/default/metrics.json | 35 ++++ .../text-halo-blur/function/metrics.json | 35 ++++ .../text-halo-blur/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-halo-color/default/metrics.json | 35 ++++ .../text-halo-color/function/metrics.json | 35 ++++ .../text-halo-color/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-halo-width/default/metrics.json | 35 ++++ .../text-halo-width/function/metrics.json | 35 ++++ .../text-halo-width/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-justify/auto/metrics.json | 35 ++++ .../text-justify/left/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-justify/right/metrics.json | 35 ++++ .../line-placement-false/metrics.json | 35 ++++ .../line-placement-true-offset/metrics.json | 35 ++++ .../line-placement-true-pitched/metrics.json | 35 ++++ .../line-placement-true-rotated/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../line-placement-true/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../function-close/metrics.json | 35 ++++ .../function-far/metrics.json | 35 ++++ .../text-letter-spacing/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../text-line-height/literal/metrics.json | 35 ++++ .../text-max-angle/line-center/metrics.json | 35 ++++ .../text-max-angle/literal/metrics.json | 35 ++++ .../force-double-newline/metrics.json | 35 ++++ .../force-newline-line-center/metrics.json | 35 ++++ .../force-newline-line/metrics.json | 35 ++++ .../text-max-width/force-newline/metrics.json | 35 ++++ .../ideographic-breaking/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-max-width/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../zero-width-line-placement/metrics.json | 35 ++++ .../zoom-and-property-function/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-offset/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-opacity/default/metrics.json | 35 ++++ .../text-opacity/function/metrics.json | 35 ++++ .../text-opacity/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../map-text-depthtest/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../viewport-overzoomed/metrics.json | 35 ++++ .../viewport-text-depthtest/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-pitch-scaling/line-half/metrics.json | 35 ++++ .../text-radial-offset/basic/metrics.json | 35 ++++ .../text-rotate/anchor-bottom/metrics.json | 35 ++++ .../text-rotate/anchor-left/metrics.json | 35 ++++ .../text-rotate/anchor-right/metrics.json | 35 ++++ .../text-rotate/anchor-top/metrics.json | 35 ++++ .../text-rotate/function/metrics.json | 35 ++++ .../text-rotate/literal/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-rotate/with-offset/metrics.json | 35 ++++ .../auto-symbol-placement-line/metrics.json | 35 ++++ .../auto-symbol-placement-point/metrics.json | 35 ++++ .../map-symbol-placement-line/metrics.json | 35 ++++ .../map-symbol-placement-point/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../camera-function-high-base/metrics.json | 35 ++++ .../camera-function-interval/metrics.json | 35 ++++ .../composite-expression/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../text-size/composite-function/metrics.json | 35 ++++ .../text-size/default/metrics.json | 35 ++++ .../text-size/function/metrics.json | 35 ++++ .../text-size/literal/metrics.json | 35 ++++ .../text-size/property-function/metrics.json | 35 ++++ .../render-tests/text-size/zero/metrics.json | 35 ++++ .../default/metrics.json | 35 ++++ .../text-transform/lowercase/metrics.json | 35 ++++ .../property-function/metrics.json | 35 ++++ .../text-transform/uppercase/metrics.json | 35 ++++ .../text-translate-anchor/map/metrics.json | 35 ++++ .../viewport/metrics.json | 35 ++++ .../text-translate/default/metrics.json | 35 ++++ .../text-translate/function/metrics.json | 35 ++++ .../text-translate/literal/metrics.json | 35 ++++ .../all-anchors-icon-text-fit/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../all-anchors/metrics.json | 35 ++++ .../databind-coalesce/metrics.json | 35 ++++ .../databind-interpolate/metrics.json | 35 ++++ .../icon-image-all-anchors/metrics.json | 35 ++++ .../icon-image-offset/metrics.json | 35 ++++ .../icon-image/metrics.json | 35 ++++ .../icon-text-fit-collision-box/metrics.json | 35 ++++ .../no-animate-zoom/metrics.json | 35 ++++ .../pitched-offset/metrics.json | 35 ++++ .../pitched-with-map/metrics.json | 35 ++++ .../pitched/metrics.json | 35 ++++ .../rotated-offset/metrics.json | 35 ++++ .../rotated-with-map/metrics.json | 35 ++++ .../rotated/metrics.json | 35 ++++ .../single-justification/metrics.json | 35 ++++ .../single-line/metrics.json | 35 ++++ .../text-allow-overlap/metrics.json | 35 ++++ .../top-bottom-left-right/metrics.json | 35 ++++ .../all-anchors-icon-text-fit/metrics.json | 35 ++++ .../all-anchors-offset-zero/metrics.json | 35 ++++ .../all-anchors-offset/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../all-anchors-tile-map-mode/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../all-anchors/metrics.json | 35 ++++ .../icon-image-all-anchors/metrics.json | 35 ++++ .../icon-image/metrics.json | 35 ++++ .../icon-text-fit-collision-box/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../no-animate-zoom/metrics.json | 35 ++++ .../pitched-offset/metrics.json | 35 ++++ .../pitched-rotated-debug/metrics.json | 35 ++++ .../pitched-with-map/metrics.json | 35 ++++ .../text-variable-anchor/pitched/metrics.json | 35 ++++ .../rotated-offset/metrics.json | 35 ++++ .../rotated-with-map/metrics.json | 35 ++++ .../text-variable-anchor/rotated/metrics.json | 35 ++++ .../single-justification/metrics.json | 35 ++++ .../single-line/metrics.json | 35 ++++ .../text-allow-overlap/metrics.json | 35 ++++ .../top-bottom-left-right/metrics.json | 35 ++++ .../text-visibility/none/metrics.json | 35 ++++ .../text-visibility/visible/metrics.json | 35 ++++ .../chinese-punctuation/metrics.json | 35 ++++ .../line_label/chinese/metrics.json | 35 ++++ .../line_label/latin/metrics.json | 35 ++++ .../line_label/mixed/metrics.json | 35 ++++ .../cjk-arabic-vertical-mode/metrics.json | 35 ++++ .../cjk-horizontal-vertical-mode/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../cjk-vertical-horizontal-mode/metrics.json | 35 ++++ .../cjk-vertical-mode/metrics.json | 35 ++++ .../latin-vertical-mode/metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../metrics.json | 35 ++++ .../tilejson-bounds/default/metrics.json | 35 ++++ .../render-tests/tms/tms/metrics.json | 35 ++++ .../filter-with-inlined-geojson/metrics.json | 35 ++++ .../within/layout-text/metrics.json | 35 ++++ .../within/paint-circle/metrics.json | 35 ++++ .../within/paint-icon/metrics.json | 35 ++++ .../within/paint-line/metrics.json | 35 ++++ .../within/paint-text/metrics.json | 35 ++++ .../render-tests/zoom-history/in/metrics.json | 35 ++++ .../zoom-history/out/metrics.json | 35 ++++ .../zoom-visibility/above/metrics.json | 35 ++++ .../zoom-visibility/below/metrics.json | 35 ++++ .../zoom-visibility/in-range/metrics.json | 35 ++++ .../zoom-visibility/out-of-range/metrics.json | 35 ++++ .../zoom-visibility/was-above/metrics.json | 35 ++++ .../zoom-visibility/was-below/metrics.json | 35 ++++ .../zoomed-fill/default/metrics.json | 35 ++++ .../zoomed-raster/fractional/metrics.json | 35 ++++ .../zoomed-raster/overzoom/metrics.json | 35 ++++ .../zoomed-raster/underzoom/metrics.json | 35 ++++ metrics/windows-opengl.json | 15 ++ metrics/windows-vulkan.json | 15 ++ platform/android/android.cmake | 8 +- platform/linux/linux.cmake | 8 +- platform/macos/macos.cmake | 2 +- platform/qt/qt.cmake | 2 +- platform/windows/windows.cmake | 8 +- render-test/android/app/build.gradle.kts | 2 +- test/CMakeLists.txt | 6 +- test/api/annotations.test.cpp | 4 + test/map/map.test.cpp | 2 + test/src/mbgl/test/http_server.cpp | 2 +- test/src/mbgl/test/sqlite3_test_fs.cpp | 43 ++-- test/storage/online_file_source.test.cpp | 28 ++- test/util/string_indexer.test.cpp | 4 +- test/util/timer.test.cpp | 4 +- 1184 files changed, 40877 insertions(+), 59 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/scripts/windows-ci_configure_wrapper.ps1 create mode 100644 .github/workflows/windows-ci.yml create mode 100644 metrics/ignores/windows-egl.json create mode 100644 metrics/ignores/windows-opengl.json create mode 100644 metrics/ignores/windows-vulkan.json create mode 100644 metrics/windows-egl.json create mode 100644 metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/empty/empty/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/filter/equality/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/filter/in/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/filter/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-join/round/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/projection/skew/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-field/token/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/tms/tms/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json create mode 100644 metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json create mode 100644 metrics/windows-opengl.json create mode 100644 metrics/windows-vulkan.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000000..0d8ac7cee5d4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Avoid line conversions between Unix (LF) and Windows (CRLF) + +test/fixtures/storage/assets/* binary diff --git a/.github/actions/qt5-build/Dockerfile b/.github/actions/qt5-build/Dockerfile index 60a0c2914930..66b144e83d17 100644 --- a/.github/actions/qt5-build/Dockerfile +++ b/.github/actions/qt5-build/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/maplibre/linux-builder:centos7-gcc11-cmake3.19 +FROM ghcr.io/maplibre/linux-builder:centos7-gcc11 # Copy and set the entry point COPY entrypoint.sh /entrypoint.sh diff --git a/.github/changed-files.yml b/.github/changed-files.yml index e3f2e7c39f35..ff4910a0fbb3 100644 --- a/.github/changed-files.yml +++ b/.github/changed-files.yml @@ -12,6 +12,23 @@ linux: - 'BUILD.bazel' - '.bazelrc' - '.bazelversion' +windows: + - '.github/workflows/windows-ci.yml' + - 'src/**' + - 'include/**' + - 'platform/default/**' + - 'platform/windows/**' + - 'expression-test/**' + - 'render-test/**' + - 'test/**' + - 'metrics/**' + - 'vendor/**' + - '.gitmodules' + - '!**/*.md' + - 'WORKSPACE' + - 'BUILD.bazel' + - '.bazelrc' + - '.bazelversion' ios: - 'platform/ios/**' - 'platform/darwin/**' diff --git a/.github/scripts/windows-ci_configure_wrapper.ps1 b/.github/scripts/windows-ci_configure_wrapper.ps1 new file mode 100644 index 000000000000..1ed2766e71b0 --- /dev/null +++ b/.github/scripts/windows-ci_configure_wrapper.ps1 @@ -0,0 +1,23 @@ +$compile_flags = @( + '-DCMAKE_POLICY_DEFAULT_CMP0141=NEW', + '-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded', + '-DCMAKE_BUILD_TYPE=RelWithDebInfo' +) + +switch ($env:RENDERER) +{ + 'opengl' { $compile_flags += '-DMLN_WITH_OPENGL=ON'; break; } + 'egl' { $compile_flags += '-DMLN_WITH_EGL=ON' ; break; } + 'vulkan' { $compile_flags += @('-DMLN_WITH_VULKAN=ON', '-DMLN_WITH_OPENGL=OFF'); break; } + 'osmesa' { $compile_flags += '-DMLN_WITH_OSMESA=ON'; break; } +} + +switch ($env:RENDERING_MODE) +{ + 'legacy' { $compile_flags += '-DMLN_LEGACY_RENDERER=ON' ; break; } + 'drawable' { $compile_flags += '-DMLN_DRAWABLE_RENDERER=ON'; break; } +} + +Write-Host 'Compile flags: ' $compile_flags + +& cmake -B build -G Ninja $($compile_flags) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml new file mode 100644 index 000000000000..d00231ebeba4 --- /dev/null +++ b/.github/workflows/windows-ci.yml @@ -0,0 +1,194 @@ +name: windows-ci + +on: + workflow_dispatch: + push: + branches: + - main + - windows-*.*.x + tags: + - windows-* + + pull_request: + branches: + - '*' + +env: + SCCACHE_GHA_ENABLED: "true" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + # INFO: We are cancelling the concurrency group if the change is on PR. For workflow dispatch, this will not work. + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +permissions: + actions: read # needed for CodeQL + contents: read # needed for CodeQL + security-events: write # needed for CodeQL + +jobs: + pre-job: + runs-on: windows-2022 + outputs: + should_skip: ${{ github.event_name != 'workflow_dispatch' && steps.changed-files.outputs.windows_any_modified != 'true' }} + steps: + - run: | + git config --system core.longpaths true + + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Get all Windows files that have changed + if: github.event_name != 'workflow_dispatch' + id: changed-files + uses: tj-actions/changed-files@v45 + with: + files_yaml_from_source_file: .github/changed-files.yml + + - name: List changed files + if: steps.changed-files.outputs.windows_any_modified == 'true' + run: | + Write-Host "Changed file(s): ${{ steps.changed-files.outputs.windows_all_changed_files }}" + + windows-build-and-test: + if: needs.pre-job.outputs.should_skip != 'true' + needs: pre-job + strategy: + matrix: + renderer: [opengl, egl, vulkan, osmesa] + rendering_mode: [legacy, drawable] + exclude: + - renderer: egl + rendering_mode: drawable + - renderer: vulkan + rendering_mode: legacy + runs-on: windows-2022 + steps: + - run: | + git config --system core.longpaths true + + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: cpp + + - uses: ilammy/msvc-dev-cmd@v1 + + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - uses: mozilla-actions/sccache-action@v0.0.6 + + - name: Initialize sccache + run: | + & $env:SCCACHE_PATH --start-server + & $env:SCCACHE_PATH --zero-stats + + - name: Configure MapLibre Native Core + env: + CI: 1 + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + VCPKG_KEEP_ENV_VARS: "CMAKE_CXX_COMPILER_LAUNCHER;CMAKE_C_COMPILER_LAUNCHER" + CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" + CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" + RENDERER: "${{ matrix.renderer }}" + RENDERING_MODE: "${{ matrix.rendering_mode }}" + run: | + cmake --version + & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 + + - name: Build MapLibre Native Core + run: | + cmake --build build --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner + + # CodeQL + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:cpp" + + - name: Download Mesa3D + if: matrix.renderer != 'egl' + run: | + Invoke-WebRequest https://github.com/pal1000/mesa-dist-win/releases/download/24.2.5/mesa3d-24.2.5-release-msvc.7z -OutFile mesa3d.7z + + - name: Extract Mesa3D files for OpenGL + if: matrix.renderer != 'egl' && matrix.renderer != 'vulkan' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll x64\libglapi.dll + + - name: Extract Mesa3D files for Vulkan + if: matrix.renderer != 'egl' && matrix.renderer == 'vulkan' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll + + - name: Extract Mesa3D files for OSMesa + if: matrix.renderer == 'osmesa' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\osmesa.dll + + # unit tests + + - name: Configure Mesa3D drivers (OpenGL) + if: matrix.renderer != 'egl' && matrix.renderer != 'vulkan' + run: | + Add-Content -Path $env:GITHUB_ENV -Value 'GALLIUM_DRIVER=llvmpipe' + + - name: Configure Mesa3D drivers (Vulkan) + if: matrix.renderer == 'vulkan' + run: | + reg add 'HKLM\Software\Khronos\Vulkan\Drivers' /f /v '${{ github.workspace }}\build\lvp_icd.x86_64.json' /t REG_DWORD /d 0 + + - name: Download and configure Vulkan + if: matrix.renderer == 'vulkan' + run: | + Invoke-WebRequest https://sdk.lunarg.com/sdk/download/1.3.296.0/windows/VulkanRT-1.3.296.0-Components.zip -OutFile VulkanRT.zip + & 'C:\Program Files\7-Zip\7z.exe' e -obuild -r .\VulkanRT.zip *x64\vulkan-1.dll + + - name: Run C++ tests + continue-on-error: ${{ matrix.renderer == 'vulkan' }} + run: build/mbgl-test-runner.exe + + # render tests + + - name: Run render test + id: render_test + env: + manifest_file: ${{ matrix.renderer == 'osmesa' && 'opengl' || matrix.renderer }} + run: build/mbgl-render-test-runner.exe "--manifestPath=metrics/windows-${env:manifest_file}.json" + + - name: Upload render test result + if: always() && steps.render_test.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + name: render-test-result-${{ matrix.renderer }} + path: | + metrics/windows-${{ matrix.renderer == 'osmesa' && 'opengl' || matrix.renderer }}.html + + # expression tests + + - name: Run expression test + run: build/expression-test/mbgl-expression-test.exe + + windows-ci-result: + name: Windows CI Result + if: needs.pre-job.outputs.should_skip != 'true' && always() + runs-on: windows-2022 + needs: + - pre-job + - windows-build-and-test + steps: + - name: Mark result as failed + if: needs.windows-build-and-test.result != 'success' + run: exit 1 diff --git a/CMakeLists.txt b/CMakeLists.txt index b5a5a2792dd3..52267c770b06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.19 FATAL_ERROR) +cmake_minimum_required(VERSION 3.24 FATAL_ERROR) option(MLN_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF) option(MLN_WITH_CLANG_TIDY "Build with clang-tidy checks enabled" OFF) diff --git a/expression-test/main.cpp b/expression-test/main.cpp index 4c1fd32baca9..fb87dd4cac50 100644 --- a/expression-test/main.cpp +++ b/expression-test/main.cpp @@ -38,7 +38,7 @@ int main(int argc, char** argv) try { bool shouldIgnore = false; std::string ignoreReason; - const std::string ignoreName = "expression-tests/" + id; + const std::filesystem::path ignoreName("expression-tests/" + id); const auto it = std::find_if( ignores.cbegin(), ignores.cend(), [&ignoreName](const auto& ignore) { return ignore.id == ignoreName; }); if (it != ignores.end()) { diff --git a/metrics/ignores/windows-egl.json b/metrics/ignores/windows-egl.json new file mode 100644 index 000000000000..bf7ca8b6e93c --- /dev/null +++ b/metrics/ignores/windows-egl.json @@ -0,0 +1,14 @@ +{ + "render-tests/circle-sort-key/literal": "Needs investigation (Diff: 0.034423828125)", + "render-tests/map-mode/tile-avoid-edges": "Needs investigation (Diff: 0.008159637451171875)", + "render-tests/regressions/mapbox-gl-js#2534": "Needs investigation (Diff: 0.000301361083984375)", + "render-tests/regressions/mapbox-gl-js#7066": "Needs investigation (Diff: 0.0002777777777777778)", + "render-tests/symbol-placement/line-center-buffer-tile-map-mode": "Needs investigation (Diff: 0.0058155059814453125)", + "render-tests/symbol-placement/line-center-tile-map-mode": "Needs investigation (Diff: 0.005688667297363281)", + "render-tests/text-variable-anchor/all-anchors-tile-map-mode": "Needs investigation (Diff: 0.011456489562988281)", + "render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode": "Needs investigation (Diff: 0.012059211730957031)", + "render-tests/within/layout-text": "Needs investigation (Diff: 0.000244140625)", + "render-tests/within/paint-circle": "Needs investigation (Diff: 0.000244140625)", + "render-tests/within/paint-icon": "Needs investigation (Diff: 0.000244140625)", + "render-tests/within/paint-text": "Needs investigation (Diff: 0.000244140625)" +} diff --git a/metrics/ignores/windows-opengl.json b/metrics/ignores/windows-opengl.json new file mode 100644 index 000000000000..b1b88925fb3b --- /dev/null +++ b/metrics/ignores/windows-opengl.json @@ -0,0 +1,9 @@ +{ + "render-tests/line-pattern/overscaled": "Needs investigation (Diff: 0.0089111328125)", + "render-tests/regressions/mapbox-gl-js#5642": "Needs investigation (Diff: 0.013671875)", + "render-tests/regressions/mapbox-gl-js#7066": "Needs investigation (Diff: 0.00024305555555555555)", + "render-tests/regressions/mapbox-gl-native#9976": "Needs investigation (Diff: 0.00769805908203125 in Legacy, 0.00756072998046875 in Drawable)", + "render-tests/runtime-styling/image-add-pattern": "Needs investigation (Diff: 0.001953125)", + "render-tests/runtime-styling/image-update-pattern": "Needs investigation (Diff: 0.001953125)", + "render-tests/sprites/2x-screen-2x-pattern": "Needs investigation (Diff: 0.00042724609375)" +} diff --git a/metrics/ignores/windows-vulkan.json b/metrics/ignores/windows-vulkan.json new file mode 100644 index 000000000000..f9cedc410c51 --- /dev/null +++ b/metrics/ignores/windows-vulkan.json @@ -0,0 +1,7 @@ +{ + "render-tests/fill-extrusion-color/function": "Needs investigation (Diff: 0.0014495849609375)", + "render-tests/icon-text-fit/enlargen-both": "Needs investigation (Diff: 0.0059814453125)", + "render-tests/icon-text-fit/textFit-grid-long": "Needs investigation (Diff: 0.00507716049382716)", + "render-tests/regressions/mapbox-gl-js#5642": "Needs investigation (Diff: 0.01416015625)", + "render-tests/regressions/mapbox-gl-js#7066": "Needs investigation (Diff: 0.0002777777777777778)" +} diff --git a/metrics/windows-egl.json b/metrics/windows-egl.json new file mode 100644 index 000000000000..a759272caac1 --- /dev/null +++ b/metrics/windows-egl.json @@ -0,0 +1,15 @@ +{ + "base_test_path": "integration", + "cache_path": "cache-style.db", + "expectation_paths": [ + ], + "ignore_paths": [ + "ignores/platform-all.json", + "ignores/windows-egl.json" + ], + "metric_path": "windows-msvc-release", + "probes": [ + "probeGFX", + "probeNetwork" + ] +} diff --git a/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json new file mode 100644 index 000000000000..7da079696671 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json new file mode 100644 index 000000000000..d1d3c719b694 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json new file mode 100644 index 000000000000..7e01e8e9305a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 1081408, + 1081408 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json new file mode 100644 index 000000000000..12f80d05a3e2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 437478 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 5, + 1, + [ + 1605632, + 1605632 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json new file mode 100644 index 000000000000..89a3b9090c05 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 77034 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json new file mode 100644 index 000000000000..b17c1d43cf32 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json new file mode 100644 index 000000000000..cdb304a90f82 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json new file mode 100644 index 000000000000..77a63a3f5850 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 5, + 1, + [ + 81920, + 81920 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json new file mode 100644 index 000000000000..b17c1d43cf32 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json new file mode 100644 index 000000000000..b17c1d43cf32 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json new file mode 100644 index 000000000000..d149583eac76 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 233147 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 7, + 20, + 1, + [ + 98304, + 98304 + ], + [ + 245560, + 245560 + ], + [ + 263140, + 263140 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json new file mode 100644 index 000000000000..d149583eac76 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 233147 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 7, + 20, + 1, + [ + 98304, + 98304 + ], + [ + 245560, + 245560 + ], + [ + 263140, + 263140 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json new file mode 100644 index 000000000000..f5baf3924a9d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 122665 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 81868, + 81868 + ], + [ + 87756, + 87756 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json new file mode 100644 index 000000000000..bc753ead9081 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 212512 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 10, + 5, + 14, + 1, + [ + 25296, + 25296 + ], + [ + 149284, + 149284 + ], + [ + 192796, + 192796 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json new file mode 100644 index 000000000000..3e29447ea9ae --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 192, + 192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..cd37b906a565 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json new file mode 100644 index 000000000000..b9307738e098 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json new file mode 100644 index 000000000000..742ac68192da --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 142, + 142 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json new file mode 100644 index 000000000000..b65ae23a7534 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json new file mode 100644 index 000000000000..62ea5c7dea03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json new file mode 100644 index 000000000000..a7ecf0458cbc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 13, + 1, + [ + 65552, + 65552 + ], + [ + 94, + 94 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..cd37b906a565 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json new file mode 100644 index 000000000000..b65ae23a7534 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..869c4378bf3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..5cc4b977fff9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..fe9af55d5614 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 5, + 1, + [ + 1073184, + 1073184 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json new file mode 100644 index 000000000000..43b92c8fd625 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json new file mode 100644 index 000000000000..aeff97a9b285 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 5, + 1, + [ + 540672, + 540672 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..b65ae23a7534 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..869c4378bf3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..5cc4b977fff9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..fe9af55d5614 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 5, + 1, + [ + 1073184, + 1073184 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..43b92c8fd625 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..aeff97a9b285 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 5, + 1, + [ + 540672, + 540672 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..d5ad1d9303de --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..d5ad1d9303de --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..d5ad1d9303de --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..d0a09330c38e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 142, + 142 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..54232a885938 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..54232a885938 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..b342e18183b4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 142, + 142 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..2ecd93ab0dbd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..34e16412442a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 130, + 130 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..8543c93e3fb4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..7f048825740b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 94, + 94 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json new file mode 100644 index 000000000000..158f4a877cf7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json new file mode 100644 index 000000000000..158f4a877cf7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..070982798d74 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..070982798d74 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..d0a09330c38e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 142, + 142 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..070982798d74 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..9dd47aeeeb53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..f460f1be9e65 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..a4c2b929c75b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 142, + 142 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..f9f2c55c0509 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..b9a70d7457b8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 130, + 130 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..ba3da4f660c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..e06f8fc8fc11 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 94, + 94 + ], + [ + 476, + 476 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json new file mode 100644 index 000000000000..d9701f6181e5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json new file mode 100644 index 000000000000..d9701f6181e5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json new file mode 100644 index 000000000000..54232a885938 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..158f4a877cf7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json new file mode 100644 index 000000000000..511b43f4d27c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json new file mode 100644 index 000000000000..511b43f4d27c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..5565a4dd4825 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 10, + 2, + [ + 35840, + 35840 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..130eb528504b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 7, + 8, + 1, + [ + 1089568, + 1089568 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json new file mode 100644 index 000000000000..8ed0fcb075e0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 48979 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 13, + 11, + 19, + 1, + [ + 1298436, + 1298436 + ], + [ + 318, + 318 + ], + [ + 236, + 236 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json new file mode 100644 index 000000000000..aac3c6d30885 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 102, + 102 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json new file mode 100644 index 000000000000..a6e96270b256 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 5, + 8, + 1, + [ + 557056, + 557056 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json new file mode 100644 index 000000000000..c1bede4b522e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 12, + 1, + [ + 22328, + 22328 + ], + [ + 66, + 66 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..d9701f6181e5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..d9701f6181e5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..54232a885938 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..158f4a877cf7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 114, + 114 + ], + [ + 336, + 336 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..511b43f4d27c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..511b43f4d27c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..5565a4dd4825 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 10, + 2, + [ + 35840, + 35840 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..130eb528504b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 7, + 8, + 1, + [ + 1089568, + 1089568 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..aac3c6d30885 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 102, + 102 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..a6e96270b256 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 5, + 8, + 1, + [ + 557056, + 557056 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..c1bede4b522e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 12, + 1, + [ + 22328, + 22328 + ], + [ + 66, + 66 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..046dcc83f872 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..b342e18183b4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 142, + 142 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..a4c2b929c75b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 142, + 142 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..5565a4dd4825 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 10, + 2, + [ + 35840, + 35840 + ], + [ + 114, + 114 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..94161dda76b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 7, + 3, + [ + 38912, + 38912 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..eb8235bd2215 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 9, + 7, + 2, + [ + 1092640, + 1092640 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..e6b45ea3c9ca --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 130, + 130 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..46ae22eb392b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 2, + [ + 560128, + 560128 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..60f01ff9e368 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 11, + 2, + [ + 25400, + 25400 + ], + [ + 94, + 94 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..019fd54df326 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 5, + 1, + [ + 1073184, + 1073184 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..019fd54df326 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 5, + 1, + [ + 1073184, + 1073184 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..2ecd93ab0dbd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..f9f2c55c0509 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..130eb528504b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 7, + 8, + 1, + [ + 1089568, + 1089568 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..130eb528504b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 7, + 8, + 1, + [ + 1089568, + 1089568 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..eb8235bd2215 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 9, + 7, + 2, + [ + 1092640, + 1092640 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..6cdf449a0c79 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1073184, + 1073184 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..1d0c8f8153bc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..40f09a93051e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 345621 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 5, + 1, + [ + 1597472, + 1597472 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..1b23d9d85c99 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 495139 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 8, + 9, + 1, + [ + 1079128, + 1079128 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..2fb82f10860f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..2fb82f10860f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..34e16412442a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 130, + 130 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..b9a70d7457b8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 130, + 130 + ], + [ + 396, + 396 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..aac3c6d30885 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 102, + 102 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..aac3c6d30885 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 102, + 102 + ], + [ + 164, + 164 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..e6b45ea3c9ca --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 9, + 2, + [ + 35840, + 35840 + ], + [ + 130, + 130 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..1d0c8f8153bc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 283480 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 7, + 1, + [ + 1089568, + 1089568 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..2fb82f10860f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..dfb24aaa91b2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..cafdf6fa100a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 82, + 82 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..9297ddb669bc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 5, + 1, + [ + 540672, + 540672 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..9297ddb669bc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 5, + 1, + [ + 540672, + 540672 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..8543c93e3fb4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..ba3da4f660c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..a6e96270b256 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 5, + 8, + 1, + [ + 557056, + 557056 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..a6e96270b256 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 5, + 8, + 1, + [ + 557056, + 557056 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..46ae22eb392b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 7, + 2, + [ + 560128, + 560128 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..40f09a93051e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 345621 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 5, + 1, + [ + 1597472, + 1597472 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..dfb24aaa91b2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 7, + 1, + [ + 557056, + 557056 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..11aca40c0239 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 62141 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 5, + 1, + [ + 540672, + 540672 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..1900b9924907 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 273800 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 9, + 1, + [ + 546616, + 546616 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json new file mode 100644 index 000000000000..7f048825740b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 94, + 94 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json new file mode 100644 index 000000000000..e06f8fc8fc11 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 94, + 94 + ], + [ + 476, + 476 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json new file mode 100644 index 000000000000..c1bede4b522e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 12, + 1, + [ + 22328, + 22328 + ], + [ + 66, + 66 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json new file mode 100644 index 000000000000..c1bede4b522e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 12, + 1, + [ + 22328, + 22328 + ], + [ + 66, + 66 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json new file mode 100644 index 000000000000..60f01ff9e368 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 11, + 2, + [ + 25400, + 25400 + ], + [ + 94, + 94 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json new file mode 100644 index 000000000000..1b23d9d85c99 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 495139 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 8, + 9, + 1, + [ + 1079128, + 1079128 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json new file mode 100644 index 000000000000..cafdf6fa100a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 11, + 1, + [ + 22328, + 22328 + ], + [ + 82, + 82 + ], + [ + 304, + 304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json new file mode 100644 index 000000000000..1900b9924907 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 273800 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 9, + 1, + [ + 546616, + 546616 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json new file mode 100644 index 000000000000..501f64a004eb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json new file mode 100644 index 000000000000..a99484c47cc4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 19, + 1, + [ + 87924, + 87924 + ], + [ + 1578, + 1578 + ], + [ + 15648, + 15648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json new file mode 100644 index 000000000000..17fba0446e86 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 19, + 1, + [ + 87924, + 87924 + ], + [ + 102, + 102 + ], + [ + 896, + 896 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json new file mode 100644 index 000000000000..89d36a35a27d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 19, + 1, + [ + 156120, + 156120 + ], + [ + 790, + 790 + ], + [ + 8256, + 8256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json new file mode 100644 index 000000000000..fdbd1532eb11 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 303571 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 71944, + 71944 + ], + [ + 30814, + 30814 + ], + [ + 327232, + 327232 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json new file mode 100644 index 000000000000..fdbd1532eb11 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 303571 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 71944, + 71944 + ], + [ + 30814, + 30814 + ], + [ + 327232, + 327232 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json new file mode 100644 index 000000000000..a06fb7ad37eb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 686859 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 19, + 1, + [ + 36908, + 36908 + ], + [ + 26342, + 26342 + ], + [ + 306880, + 306880 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json new file mode 100644 index 000000000000..6168495707bc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 344510 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 41, + 61, + 1, + [ + 276800, + 276800 + ], + [ + 51862, + 51862 + ], + [ + 653248, + 653248 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json new file mode 100644 index 000000000000..a4fade43b7e4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 344510 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 60, + 61, + 1, + [ + 413376, + 413376 + ], + [ + 7062, + 7062 + ], + [ + 88768, + 88768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json b/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json b/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json new file mode 100644 index 000000000000..705eaa2c4e50 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 684, + 684 + ], + [ + 372, + 372 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json b/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json new file mode 100644 index 000000000000..b0ad84b7b6a3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 25594, + 25594 + ], + [ + 45664, + 45664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json new file mode 100644 index 000000000000..3653638ee2e6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json new file mode 100644 index 000000000000..f6bec0e0459b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json new file mode 100644 index 000000000000..16026dacebfc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 49570, + 49570 + ], + [ + 198256, + 198256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json b/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json new file mode 100644 index 000000000000..8ae66783ec92 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 364, + 364 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..424e3e22c86b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 604, + 604 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json new file mode 100644 index 000000000000..6e40c94905ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 24, + 29, + 25, + 1, + [ + 458752, + 458752 + ], + [ + 910, + 910 + ], + [ + 3184, + 3184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json new file mode 100644 index 000000000000..6e40c94905ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 24, + 29, + 25, + 1, + [ + 458752, + 458752 + ], + [ + 910, + 910 + ], + [ + 3184, + 3184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json new file mode 100644 index 000000000000..6e40c94905ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 24, + 29, + 25, + 1, + [ + 458752, + 458752 + ], + [ + 910, + 910 + ], + [ + 3184, + 3184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json new file mode 100644 index 000000000000..ccd42b0ddee6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 24, + 29, + 29, + 1, + [ + 458752, + 458752 + ], + [ + 910, + 910 + ], + [ + 4192, + 4192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json new file mode 100644 index 000000000000..ffe069ce4607 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 17, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 5104, + 5104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..e3548b740c87 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 17, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 7120, + 7120 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json new file mode 100644 index 000000000000..47ec0bb2c6fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 13, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json new file mode 100644 index 000000000000..4f179c4d25ea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 17, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 4096, + 4096 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json new file mode 100644 index 000000000000..4f179c4d25ea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 17, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 4096, + 4096 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..ffe069ce4607 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 15, + 17, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 5104, + 5104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json new file mode 100644 index 000000000000..c272c32be15b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 32, + 15, + 53, + 1, + [ + 229376, + 229376 + ], + [ + 1462, + 1462 + ], + [ + 4048, + 4048 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json new file mode 100644 index 000000000000..da78bc6af7b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 15, + 29, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json new file mode 100644 index 000000000000..808337bb3d68 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 25, + 13, + 1, + [ + 270336, + 270336 + ], + [ + 538, + 538 + ], + [ + 2200, + 2200 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..0fa047031865 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 22, + 15, + 25, + 1, + [ + 229376, + 229376 + ], + [ + 390, + 390 + ], + [ + 1152, + 1152 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..0fa047031865 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 22, + 15, + 25, + 1, + [ + 229376, + 229376 + ], + [ + 390, + 390 + ], + [ + 1152, + 1152 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json new file mode 100644 index 000000000000..2c2af11696ad --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 9, + 25, + 1, + [ + 131072, + 131072 + ], + [ + 1126, + 1126 + ], + [ + 3328, + 3328 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json new file mode 100644 index 000000000000..082bdc32eb19 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 9, + 25, + 1, + [ + 131072, + 131072 + ], + [ + 1126, + 1126 + ], + [ + 3328, + 3328 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json new file mode 100644 index 000000000000..2c2af11696ad --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 9, + 25, + 1, + [ + 131072, + 131072 + ], + [ + 1126, + 1126 + ], + [ + 3328, + 3328 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json new file mode 100644 index 000000000000..6b55634a1cbd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 12, + 1, + [ + 39168, + 39168 + ], + [ + 66, + 66 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json new file mode 100644 index 000000000000..f9de3e6600d7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 150, + 150 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json new file mode 100644 index 000000000000..0923fe04bb0c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 118, + 118 + ], + [ + 184, + 184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json new file mode 100644 index 000000000000..19c5ef85077f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 184, + 184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json new file mode 100644 index 000000000000..cc32c1d10777 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 118, + 118 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..08002428420a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json new file mode 100644 index 000000000000..c3e66bb650f9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 244, + 244 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..0bf5f29188df --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 364, + 364 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json new file mode 100644 index 000000000000..51c11b8e4ab7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 77034 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 26256, + 26256 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json new file mode 100644 index 000000000000..5b0f25c103ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 23680, + 23680 + ], + [ + 118, + 118 + ], + [ + 484, + 484 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json new file mode 100644 index 000000000000..714f677bd605 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 36864, + 36864 + ], + [ + 118, + 118 + ], + [ + 484, + 484 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json new file mode 100644 index 000000000000..fab92536d4ce --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 22080, + 22080 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json new file mode 100644 index 000000000000..07184a47f623 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 36864, + 36864 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json new file mode 100644 index 000000000000..fab92536d4ce --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 22080, + 22080 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json new file mode 100644 index 000000000000..0b64b9c6e2f1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 403778 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 13, + 17, + 1, + [ + 111488, + 111488 + ], + [ + 24058, + 24058 + ], + [ + 10024, + 10024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json new file mode 100644 index 000000000000..8107ea657505 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 102998 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 8, + 1, + [ + 25584, + 25584 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json new file mode 100644 index 000000000000..fab92536d4ce --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 22080, + 22080 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json new file mode 100644 index 000000000000..a3bacd4632a5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 25, + 1, + [ + 131072, + 131072 + ], + [ + 406, + 406 + ], + [ + 1264, + 1264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json new file mode 100644 index 000000000000..ec5a8327773d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json new file mode 100644 index 000000000000..9028b81da14b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 102265 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json new file mode 100644 index 000000000000..9028b81da14b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 102265 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json b/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/filter/in/metrics.json b/metrics/windows-msvc-release/render-tests/filter/in/metrics.json new file mode 100644 index 000000000000..f955deb5a34b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/filter/in/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 10, + 1, + [ + 32768, + 32768 + ], + [ + 214, + 214 + ], + [ + 664, + 664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json b/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/filter/none/metrics.json b/metrics/windows-msvc-release/render-tests/filter/none/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/filter/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json new file mode 100644 index 000000000000..921bb225292b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 132851 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 14, + 1, + [ + 40979, + 40979 + ], + [ + 1162, + 1162 + ], + [ + 11152, + 11152 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json new file mode 100644 index 000000000000..e4de306451f0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 132851 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 7, + 21, + 1, + [ + 74016, + 74016 + ], + [ + 2254, + 2254 + ], + [ + 13120, + 13120 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json new file mode 100644 index 000000000000..1f4a35b3797c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 9722 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 706, + 706 + ], + [ + 1040, + 1040 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json new file mode 100644 index 000000000000..c050c4e8ce06 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 3 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json new file mode 100644 index 000000000000..1f4a35b3797c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 9722 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 706, + 706 + ], + [ + 1040, + 1040 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json new file mode 100644 index 000000000000..c35eb5d52648 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 152 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json new file mode 100644 index 000000000000..92d02167a9fe --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 691 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 278, + 278 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json new file mode 100644 index 000000000000..0d433cec13d3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 706, + 706 + ], + [ + 1040, + 1040 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json new file mode 100644 index 000000000000..7da079696671 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json new file mode 100644 index 000000000000..87bafb2c5931 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json new file mode 100644 index 000000000000..b947079d6baa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 94, + 94 + ], + [ + 176, + 176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json new file mode 100644 index 000000000000..7da079696671 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json new file mode 100644 index 000000000000..e204a192de46 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json new file mode 100644 index 000000000000..676dd680b359 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 26, + 26 + ], + [ + 68, + 68 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json new file mode 100644 index 000000000000..fb542cead0b8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json new file mode 100644 index 000000000000..d01fbee1843d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json new file mode 100644 index 000000000000..5b035beb41ad --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json new file mode 100644 index 000000000000..c031604857e0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 70, + 70 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json new file mode 100644 index 000000000000..7da079696671 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json new file mode 100644 index 000000000000..f1bf8426ca61 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 9722 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 9, + 1, + [ + 49152, + 49152 + ], + [ + 382, + 382 + ], + [ + 576, + 576 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json new file mode 100644 index 000000000000..e300a2d0a646 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 41984, + 41984 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json new file mode 100644 index 000000000000..e300a2d0a646 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 41984, + 41984 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json new file mode 100644 index 000000000000..4daf3ff957d1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json new file mode 100644 index 000000000000..4daf3ff957d1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json new file mode 100644 index 000000000000..4daf3ff957d1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 35840, + 35840 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json new file mode 100644 index 000000000000..08b7ca1c86e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 9, + 11, + 2, + [ + 115712, + 115712 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json new file mode 100644 index 000000000000..e12b80046260 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 8, + 2, + [ + 35840, + 35840 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json new file mode 100644 index 000000000000..3c0b3e0c7f78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 8, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 17472, + 17472 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json new file mode 100644 index 000000000000..098f2da894fb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 7, + 2, + [ + 50176, + 50176 + ], + [ + 6550, + 6550 + ], + [ + 8768, + 8768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json new file mode 100644 index 000000000000..0af798152964 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 138244 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 5, + 1, + [ + 544784, + 544784 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json new file mode 100644 index 000000000000..da22284860ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 570207 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 10, + 5, + 1, + [ + 2129984, + 2129984 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json new file mode 100644 index 000000000000..06c60d080b81 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json new file mode 100644 index 000000000000..4c633b423778 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json new file mode 100644 index 000000000000..836b87b16e2b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json new file mode 100644 index 000000000000..77eaf9695807 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json new file mode 100644 index 000000000000..7f17773165cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json new file mode 100644 index 000000000000..836b87b16e2b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json new file mode 100644 index 000000000000..ffd5b98d6b4c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 26600, + 26600 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json new file mode 100644 index 000000000000..c291562544c5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25088, + 25088 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json new file mode 100644 index 000000000000..331402013d07 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 3696 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 27536, + 27536 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json new file mode 100644 index 000000000000..331402013d07 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 3696 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 27536, + 27536 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json new file mode 100644 index 000000000000..c291562544c5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25088, + 25088 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json new file mode 100644 index 000000000000..ef86c597d38c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 8, + 29, + 1, + [ + 42496, + 42496 + ], + [ + 94, + 94 + ], + [ + 1024, + 1024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json new file mode 100644 index 000000000000..9ff18b8ec13d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 86992, + 86992 + ], + [ + 13582, + 13582 + ], + [ + 180864, + 180864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json new file mode 100644 index 000000000000..0760437163ba --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 22784, + 22784 + ], + [ + 46, + 46 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json new file mode 100644 index 000000000000..9ff18b8ec13d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 86992, + 86992 + ], + [ + 13582, + 13582 + ], + [ + 180864, + 180864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json new file mode 100644 index 000000000000..9ff18b8ec13d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 86992, + 86992 + ], + [ + 13582, + 13582 + ], + [ + 180864, + 180864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json b/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json new file mode 100644 index 000000000000..f82f83756c74 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 39640, + 39640 + ], + [ + 162, + 162 + ], + [ + 1344, + 1344 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json new file mode 100644 index 000000000000..a11af85a1f40 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 19, + 1, + [ + 39640, + 39640 + ], + [ + 190, + 190 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json new file mode 100644 index 000000000000..f1cb4ead5fd4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1517795 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 88320, + 88320 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json new file mode 100644 index 000000000000..39cea2f7a817 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 21128, + 21128 + ], + [ + 50, + 50 + ], + [ + 320, + 320 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..fdaf27673e24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json new file mode 100644 index 000000000000..ff10b87fe60f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json new file mode 100644 index 000000000000..e85e6b42dc7a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json new file mode 100644 index 000000000000..e85e6b42dc7a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json new file mode 100644 index 000000000000..e85e6b42dc7a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json new file mode 100644 index 000000000000..6e8125cf625a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json new file mode 100644 index 000000000000..18164e288a0d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json new file mode 100644 index 000000000000..533e640ba857 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 21, + 1, + [ + 21937, + 21937 + ], + [ + 214, + 214 + ], + [ + 2624, + 2624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json new file mode 100644 index 000000000000..27c166e4fad4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 17, + 1, + [ + 21937, + 21937 + ], + [ + 190, + 190 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json new file mode 100644 index 000000000000..f8a34973b45b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 21, + 1, + [ + 21937, + 21937 + ], + [ + 118, + 118 + ], + [ + 1344, + 1344 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json new file mode 100644 index 000000000000..60e56e89fb79 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 90364 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 21970, + 21970 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json new file mode 100644 index 000000000000..60e56e89fb79 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 90364 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 21970, + 21970 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json new file mode 100644 index 000000000000..d6bdd89b2137 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 24148, + 24148 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json new file mode 100644 index 000000000000..d6bdd89b2137 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 24148, + 24148 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json new file mode 100644 index 000000000000..d6bdd89b2137 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 24148, + 24148 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json new file mode 100644 index 000000000000..d6bdd89b2137 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 24148, + 24148 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json new file mode 100644 index 000000000000..f879907a0199 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 817439 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 21, + 1, + [ + 136172, + 136172 + ], + [ + 5782, + 5782 + ], + [ + 76864, + 76864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json new file mode 100644 index 000000000000..4ec1339ad548 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 32193, + 32193 + ], + [ + 2182, + 2182 + ], + [ + 27568, + 27568 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json new file mode 100644 index 000000000000..e440a2fde34b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 46993, + 46993 + ], + [ + 1534, + 1534 + ], + [ + 18928, + 18928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json new file mode 100644 index 000000000000..760868dc9960 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 25825, + 25825 + ], + [ + 1426, + 1426 + ], + [ + 17488, + 17488 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json new file mode 100644 index 000000000000..760868dc9960 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 25825, + 25825 + ], + [ + 1426, + 1426 + ], + [ + 17488, + 17488 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json new file mode 100644 index 000000000000..0c76f5850ae9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 27153, + 27153 + ], + [ + 1966, + 1966 + ], + [ + 24688, + 24688 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json new file mode 100644 index 000000000000..0c76f5850ae9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 27153, + 27153 + ], + [ + 1966, + 1966 + ], + [ + 24688, + 24688 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json new file mode 100644 index 000000000000..5e61113a9d5f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 27153, + 27153 + ], + [ + 1534, + 1534 + ], + [ + 18928, + 18928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json new file mode 100644 index 000000000000..a3ae8aa16e2f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 23073, + 23073 + ], + [ + 1534, + 1534 + ], + [ + 18928, + 18928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json new file mode 100644 index 000000000000..fbb89bc3b6f2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 21633, + 21633 + ], + [ + 1534, + 1534 + ], + [ + 18928, + 18928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json new file mode 100644 index 000000000000..8f94d88ce4dc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19984, + 19984 + ], + [ + 1210, + 1210 + ], + [ + 14608, + 14608 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json new file mode 100644 index 000000000000..3c52c61f5276 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 817439 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 21, + 1, + [ + 136172, + 136172 + ], + [ + 63262, + 63262 + ], + [ + 843264, + 843264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json new file mode 100644 index 000000000000..e102c1af5105 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 26620, + 26620 + ], + [ + 1750, + 1750 + ], + [ + 21808, + 21808 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json new file mode 100644 index 000000000000..43ae8b8ec920 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 88638 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 23882, + 23882 + ], + [ + 1210, + 1210 + ], + [ + 14608, + 14608 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json new file mode 100644 index 000000000000..63b09f892c3b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 86757 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 4, + 23, + 1, + [ + 30808, + 30808 + ], + [ + 550, + 550 + ], + [ + 6528, + 6528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json new file mode 100644 index 000000000000..2a7d1e9a35db --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 390425 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 4, + 77, + 1, + [ + 372616, + 372616 + ], + [ + 2830, + 2830 + ], + [ + 37504, + 37504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json new file mode 100644 index 000000000000..e8f0b6ac455a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 90025 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 4, + 77, + 1, + [ + 372023, + 372023 + ], + [ + 1534, + 1534 + ], + [ + 20224, + 20224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json new file mode 100644 index 000000000000..5718db3ff626 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 199330 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 4, + 77, + 1, + [ + 369652, + 369652 + ], + [ + 2182, + 2182 + ], + [ + 28864, + 28864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json new file mode 100644 index 000000000000..4458b597c761 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 90025 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 4, + 77, + 1, + [ + 369338, + 369338 + ], + [ + 1102, + 1102 + ], + [ + 14464, + 14464 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json new file mode 100644 index 000000000000..fd38a33aafc6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 89590 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 4, + 79, + 1, + [ + 19586, + 19586 + ], + [ + 562, + 562 + ], + [ + 5968, + 5968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json new file mode 100644 index 000000000000..3731e0fcb28c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31249, + 31249 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..40b289ac7382 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 919278 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 45568, + 45568 + ], + [ + 1366, + 1366 + ], + [ + 17984, + 17984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..40b289ac7382 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 919278 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 45568, + 45568 + ], + [ + 1366, + 1366 + ], + [ + 17984, + 17984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json new file mode 100644 index 000000000000..95a181bd8c49 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/default/metrics.json b/metrics/windows-msvc-release/render-tests/image/default/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json new file mode 100644 index 000000000000..2d59478140b0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 14, + 7, + 1, + [ + 2253828, + 2253828 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json new file mode 100644 index 000000000000..3a2571d36aa6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 7, + 1, + [ + 2089988, + 2089988 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json new file mode 100644 index 000000000000..a5e1a3ae1af8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 7, + 7, + 1, + [ + 2139140, + 2139140 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json b/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json new file mode 100644 index 000000000000..a2ea9c5fb7af --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 159421 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 37304, + 37304 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json b/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json new file mode 100644 index 000000000000..f7dd7ee4c04c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 244363 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 45312, + 45312 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json new file mode 100644 index 000000000000..3a79bf070876 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 236656, + 236656 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json new file mode 100644 index 000000000000..b8fd663961a2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 147154, + 147154 + ], + [ + 235232, + 235232 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json new file mode 100644 index 000000000000..870d30daeb3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 166, + 166 + ], + [ + 512, + 512 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json new file mode 100644 index 000000000000..b8b502e177ed --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 315520, + 315520 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json new file mode 100644 index 000000000000..f116462d86f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json new file mode 100644 index 000000000000..fc7077f38f8b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 33024, + 33024 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json new file mode 100644 index 000000000000..089003eccef2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33024, + 33024 + ], + [ + 58, + 58 + ], + [ + 352, + 352 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json new file mode 100644 index 000000000000..a68713253063 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 10, + 13, + 1, + [ + 131584, + 131584 + ], + [ + 70, + 70 + ], + [ + 192, + 192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json new file mode 100644 index 000000000000..2b8782c8187b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33024, + 33024 + ], + [ + 58, + 58 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json new file mode 100644 index 000000000000..089003eccef2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33024, + 33024 + ], + [ + 58, + 58 + ], + [ + 352, + 352 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json new file mode 100644 index 000000000000..45bcb8f0af24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 11, + 1, + [ + 65792, + 65792 + ], + [ + 58, + 58 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json new file mode 100644 index 000000000000..2b8782c8187b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33024, + 33024 + ], + [ + 58, + 58 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json new file mode 100644 index 000000000000..fc7077f38f8b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 33024, + 33024 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json new file mode 100644 index 000000000000..22bd3284bd98 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 10, + 9, + 1, + [ + 131328, + 131328 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json new file mode 100644 index 000000000000..747a2afbe158 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 7, + 1, + [ + 49408, + 49408 + ], + [ + 27214, + 27214 + ], + [ + 47824, + 47824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json new file mode 100644 index 000000000000..d3af311705d4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 36864, + 36864 + ], + [ + 202, + 202 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json new file mode 100644 index 000000000000..d3af311705d4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 36864, + 36864 + ], + [ + 202, + 202 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json new file mode 100644 index 000000000000..5e55b94da8c4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 339472 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 33024, + 33024 + ], + [ + 190054, + 190054 + ], + [ + 268576, + 268576 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json new file mode 100644 index 000000000000..32c56fe8f4f1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 8, + 20, + 1, + [ + 34048, + 34048 + ], + [ + 58, + 58 + ], + [ + 784, + 784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json new file mode 100644 index 000000000000..0b59834ac4db --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 11, + 15, + 1, + [ + 164096, + 164096 + ], + [ + 130, + 130 + ], + [ + 352, + 352 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json new file mode 100644 index 000000000000..3a79bf070876 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 236656, + 236656 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json new file mode 100644 index 000000000000..c5be22f70871 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 9, + 1, + [ + 66560, + 66560 + ], + [ + 94, + 94 + ], + [ + 192, + 192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json new file mode 100644 index 000000000000..2452c64b4ac7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 10, + 13, + 1, + [ + 132096, + 132096 + ], + [ + 1654, + 1654 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json new file mode 100644 index 000000000000..2452c64b4ac7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 10, + 13, + 1, + [ + 132096, + 132096 + ], + [ + 1654, + 1654 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json new file mode 100644 index 000000000000..418bfd0dac8e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 226, + 226 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json new file mode 100644 index 000000000000..418bfd0dac8e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 226, + 226 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json new file mode 100644 index 000000000000..418bfd0dac8e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 226, + 226 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json new file mode 100644 index 000000000000..418bfd0dac8e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 226, + 226 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json new file mode 100644 index 000000000000..418bfd0dac8e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 226, + 226 + ], + [ + 416, + 416 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json new file mode 100644 index 000000000000..c43da977410d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 33024, + 33024 + ], + [ + 394, + 394 + ], + [ + 624, + 624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json new file mode 100644 index 000000000000..58f534192f03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 394, + 394 + ], + [ + 624, + 624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json new file mode 100644 index 000000000000..8bb30bb81b61 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 274, + 274 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json new file mode 100644 index 000000000000..8bb30bb81b61 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 274, + 274 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json new file mode 100644 index 000000000000..3a79bf070876 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 236656, + 236656 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json new file mode 100644 index 000000000000..d3fc35379525 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 240, + 240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json new file mode 100644 index 000000000000..3a79bf070876 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 236656, + 236656 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json new file mode 100644 index 000000000000..49ecdaab9854 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 58, + 58 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json new file mode 100644 index 000000000000..5163e6758e35 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 77034 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 11, + 1, + [ + 46000, + 46000 + ], + [ + 58, + 58 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json new file mode 100644 index 000000000000..d4020db05c5b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 11, + 1, + [ + 33472, + 33472 + ], + [ + 58, + 58 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json new file mode 100644 index 000000000000..d4020db05c5b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 8, + 11, + 1, + [ + 33472, + 33472 + ], + [ + 58, + 58 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json new file mode 100644 index 000000000000..94e778f0b452 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 13, + 1, + [ + 88320, + 88320 + ], + [ + 166, + 166 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json new file mode 100644 index 000000000000..d108f774d191 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 426181 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 7, + 1, + [ + 54848, + 54848 + ], + [ + 27214, + 27214 + ], + [ + 47824, + 47824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json new file mode 100644 index 000000000000..136c14761516 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 25, + 1, + [ + 94720, + 94720 + ], + [ + 166, + 166 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json new file mode 100644 index 000000000000..fbbd2176a96c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 25, + 1, + [ + 101120, + 101120 + ], + [ + 166, + 166 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json new file mode 100644 index 000000000000..94e778f0b452 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 13, + 1, + [ + 88320, + 88320 + ], + [ + 166, + 166 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json new file mode 100644 index 000000000000..12a75988519c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 166, + 166 + ], + [ + 832, + 832 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..5500efb2945c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 707619 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 9, + 1, + [ + 65536, + 65536 + ], + [ + 49138, + 49138 + ], + [ + 86192, + 86192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..5500efb2945c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 707619 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 9, + 1, + [ + 65536, + 65536 + ], + [ + 49138, + 49138 + ], + [ + 86192, + 86192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json new file mode 100644 index 000000000000..8e3ab38a23fc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 1342, + 1342 + ], + [ + 1920, + 1920 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json new file mode 100644 index 000000000000..9d549815609f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 2542, + 2542 + ], + [ + 3728, + 3728 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json new file mode 100644 index 000000000000..50f1262c46f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json new file mode 100644 index 000000000000..5500efb2945c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 707619 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 9, + 1, + [ + 65536, + 65536 + ], + [ + 49138, + 49138 + ], + [ + 86192, + 86192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json new file mode 100644 index 000000000000..37218777d269 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 157792, + 157792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json new file mode 100644 index 000000000000..e66ff128ba59 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 21, + 1, + [ + 131072, + 131072 + ], + [ + 89074, + 89074 + ], + [ + 315520, + 315520 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json new file mode 100644 index 000000000000..b93dcb82323a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 28078, + 28078 + ], + [ + 48976, + 48976 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json new file mode 100644 index 000000000000..c6cefecd177f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 21, + 1, + [ + 131072, + 131072 + ], + [ + 1654, + 1654 + ], + [ + 4544, + 4544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json new file mode 100644 index 000000000000..2712b0b4fe0f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 1654, + 1654 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json new file mode 100644 index 000000000000..bf9483fb78c1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 96320, + 96320 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json new file mode 100644 index 000000000000..290ed6328f69 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 37326, + 37326 + ], + [ + 5494, + 5494 + ], + [ + 73024, + 73024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json new file mode 100644 index 000000000000..12ed06367ea7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 178378 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 23, + 8, + 51, + 1, + [ + 53032, + 53032 + ], + [ + 43734, + 43734 + ], + [ + 151604, + 151604 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json new file mode 100644 index 000000000000..3510a6a2db7c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 37326, + 37326 + ], + [ + 11542, + 11542 + ], + [ + 153664, + 153664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json b/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json new file mode 100644 index 000000000000..da78bc6af7b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 15, + 29, + 1, + [ + 229376, + 229376 + ], + [ + 742, + 742 + ], + [ + 3088, + 3088 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json b/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json new file mode 100644 index 000000000000..b82f4dfc1829 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 982, + 982 + ], + [ + 4096, + 4096 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json b/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json new file mode 100644 index 000000000000..b82f4dfc1829 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 982, + 982 + ], + [ + 4096, + 4096 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json new file mode 100644 index 000000000000..08d8297db801 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 726906 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 9, + 5, + 1, + [ + 1605632, + 1605632 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json b/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json new file mode 100644 index 000000000000..50f1262c46f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json b/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json new file mode 100644 index 000000000000..50f1262c46f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json b/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json new file mode 100644 index 000000000000..4bd248b8fa5c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 48534 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 5, + 1, + [ + 278528, + 278528 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json new file mode 100644 index 000000000000..12c856a69889 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 14, + 188423 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 23, + 1, + [ + 1179648, + 1179648 + ], + [ + 294, + 294 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json new file mode 100644 index 000000000000..c0ad63d409dc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 14, + 188423 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 11, + 1, + [ + 1114112, + 1114112 + ], + [ + 166, + 166 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json new file mode 100644 index 000000000000..72910f7b1056 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 48534 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 5, + 1, + [ + 278528, + 278528 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json new file mode 100644 index 000000000000..72910f7b1056 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 48534 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 5, + 1, + [ + 278528, + 278528 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json new file mode 100644 index 000000000000..72910f7b1056 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 48534 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 5, + 1, + [ + 278528, + 278528 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json new file mode 100644 index 000000000000..0d1ecd183335 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 22, + 284856 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 8, + 7, + 1, + [ + 1343488, + 1343488 + ], + [ + 598, + 598 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json new file mode 100644 index 000000000000..b4c21ad5c914 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 22, + 333591 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 10, + 7, + 1, + [ + 1622016, + 1622016 + ], + [ + 622, + 622 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json new file mode 100644 index 000000000000..0d1ecd183335 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 22, + 284856 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 8, + 7, + 1, + [ + 1343488, + 1343488 + ], + [ + 598, + 598 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json new file mode 100644 index 000000000000..db64850e3875 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json new file mode 100644 index 000000000000..f1142e011c25 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 8, + 416139 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 26, + 12, + 42, + 1, + [ + 152370, + 152370 + ], + [ + 499026, + 499026 + ], + [ + 678436, + 678436 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json new file mode 100644 index 000000000000..45badb494a72 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 147533 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 19, + 9, + 31, + 1, + [ + 131072, + 131072 + ], + [ + 57816, + 57816 + ], + [ + 61348, + 61348 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json new file mode 100644 index 000000000000..8c183cc9f3e0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 9, + 284875 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 36, + 13, + 63, + 1, + [ + 240136, + 240136 + ], + [ + 68598, + 68598 + ], + [ + 79296, + 79296 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json new file mode 100644 index 000000000000..96bd9fd98fe0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 403778 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 9, + 17, + 1, + [ + 147456, + 147456 + ], + [ + 24058, + 24058 + ], + [ + 10024, + 10024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json new file mode 100644 index 000000000000..a48098b4aa6c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1602737 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 21, + 1, + [ + 159696, + 159696 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json new file mode 100644 index 000000000000..c527b4e09d2a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 138188 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 22080, + 22080 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json new file mode 100644 index 000000000000..7d15d2a7ad34 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 138188 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json new file mode 100644 index 000000000000..19c5ef85077f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 118, + 118 + ], + [ + 184, + 184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json new file mode 100644 index 000000000000..2052d5d52ee4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 29, + 1, + [ + 131072, + 131072 + ], + [ + 166, + 166 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json new file mode 100644 index 000000000000..3a2571d36aa6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 7, + 1, + [ + 2089988, + 2089988 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json new file mode 100644 index 000000000000..fab92536d4ce --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 22080, + 22080 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json new file mode 100644 index 000000000000..bcc2a3f74f95 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 86, + 86 + ], + [ + 104, + 104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json new file mode 100644 index 000000000000..09d52d402e4d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 38222, + 38222 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json new file mode 100644 index 000000000000..65f07ee5330d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 33767, + 33767 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json new file mode 100644 index 000000000000..c217fdfc61cc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 33024, + 33024 + ], + [ + 58, + 58 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json new file mode 100644 index 000000000000..6e40c94905ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 24, + 29, + 25, + 1, + [ + 458752, + 458752 + ], + [ + 910, + 910 + ], + [ + 3184, + 3184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json new file mode 100644 index 000000000000..352056314945 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 511123 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 7, + 5, + 15, + 1, + [ + 68596, + 68596 + ], + [ + 8362, + 8362 + ], + [ + 39412, + 39412 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json new file mode 100644 index 000000000000..2e017e0a3939 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json new file mode 100644 index 000000000000..7bca5d23fe02 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 12, + 17, + 1, + [ + 191110, + 191110 + ], + [ + 454, + 454 + ], + [ + 5824, + 5824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json new file mode 100644 index 000000000000..e204a192de46 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json new file mode 100644 index 000000000000..16485ab8b4a3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33024, + 33024 + ], + [ + 34, + 34 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json new file mode 100644 index 000000000000..0500eb4873cd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 15, + 1, + [ + 65536, + 65536 + ], + [ + 118, + 118 + ], + [ + 364, + 364 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json new file mode 100644 index 000000000000..a01add499ee2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 484604 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json new file mode 100644 index 000000000000..50f1262c46f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json new file mode 100644 index 000000000000..f9443ff76e43 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json new file mode 100644 index 000000000000..cfdc9c2e2106 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json new file mode 100644 index 000000000000..d4eae5445586 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json new file mode 100644 index 000000000000..d4eae5445586 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json new file mode 100644 index 000000000000..d4eae5445586 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json new file mode 100644 index 000000000000..485b59ab36f3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 17, + 1, + [ + 81920, + 81920 + ], + [ + 70, + 70 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json new file mode 100644 index 000000000000..3468eac0f2fd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json new file mode 100644 index 000000000000..ba3ca00114da --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 9, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json new file mode 100644 index 000000000000..3a2571d36aa6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 7, + 1, + [ + 2089988, + 2089988 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json new file mode 100644 index 000000000000..48541088a87a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 7, + 1, + [ + 2106372, + 2106372 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json new file mode 100644 index 000000000000..54f55f390df5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 26614, + 26614 + ], + [ + 47024, + 47024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json new file mode 100644 index 000000000000..3a2571d36aa6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 949368 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 7, + 1, + [ + 2089988, + 2089988 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json new file mode 100644 index 000000000000..5068fa89b0a5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json new file mode 100644 index 000000000000..026b6be03102 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 132836, + 132836 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json new file mode 100644 index 000000000000..026b6be03102 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 132836, + 132836 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json new file mode 100644 index 000000000000..e348c71619e7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 35836, + 35836 + ], + [ + 86, + 86 + ], + [ + 800, + 800 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json new file mode 100644 index 000000000000..77e26663adf8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json new file mode 100644 index 000000000000..2a11129cdd7e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 214, + 214 + ], + [ + 2624, + 2624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json new file mode 100644 index 000000000000..e78c74800857 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 2098 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 24576, + 24576 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json new file mode 100644 index 000000000000..f116462d86f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json new file mode 100644 index 000000000000..c2b157771ed6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json new file mode 100644 index 000000000000..5e66f07df062 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 7, + 8, + 1, + [ + 1081344, + 1081344 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json new file mode 100644 index 000000000000..20fa03d32449 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 191095 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 11, + 13, + 25, + 1, + [ + 134432, + 134432 + ], + [ + 958, + 958 + ], + [ + 10240, + 10240 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json new file mode 100644 index 000000000000..6b144b9538d0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 41, + 7971260 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 9, + 10, + 23, + 1, + [ + 244884, + 244884 + ], + [ + 2926, + 2926 + ], + [ + 36736, + 36736 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json new file mode 100644 index 000000000000..63e089963e3a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22328, + 22328 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json new file mode 100644 index 000000000000..4ab1b5696c56 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 17, + 1, + [ + 23146, + 23146 + ], + [ + 118, + 118 + ], + [ + 1344, + 1344 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json new file mode 100644 index 000000000000..7ce4c1324850 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87709 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 30034, + 30034 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json new file mode 100644 index 000000000000..2ce8e21873ac --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 17, + 1, + [ + 42608, + 42608 + ], + [ + 550, + 550 + ], + [ + 7104, + 7104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json new file mode 100644 index 000000000000..2043a63e49b4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 85, + 19, + 1, + [ + 662816, + 662816 + ], + [ + 438, + 438 + ], + [ + 5376, + 5376 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json new file mode 100644 index 000000000000..6603feaf8bfe --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 110, + 12, + 1, + [ + 864479, + 864479 + ], + [ + 898, + 898 + ], + [ + 9312, + 9312 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json new file mode 100644 index 000000000000..9c7a3359c23c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json new file mode 100644 index 000000000000..7b8e778406ec --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 9, + 1, + [ + 27632, + 27632 + ], + [ + 94, + 94 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json new file mode 100644 index 000000000000..f8108ef92fb4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 20013, + 20013 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json new file mode 100644 index 000000000000..64d5fea021d7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 38222, + 38222 + ], + [ + 178, + 178 + ], + [ + 2144, + 2144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json new file mode 100644 index 000000000000..89aa855d365a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 118, + 118 + ], + [ + 320, + 320 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json new file mode 100644 index 000000000000..0206fc826fea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35828, + 35828 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json new file mode 100644 index 000000000000..c8c3dee39462 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 183111 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 11, + 9, + 1, + [ + 92957, + 92957 + ], + [ + 358, + 358 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json new file mode 100644 index 000000000000..693f78704260 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 17, + 1, + [ + 29056, + 29056 + ], + [ + 406, + 406 + ], + [ + 5184, + 5184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json new file mode 100644 index 000000000000..5d2d58d4009b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 77034 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 26256, + 26256 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json new file mode 100644 index 000000000000..2e92924579bd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 22080, + 22080 + ], + [ + 34, + 34 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json new file mode 100644 index 000000000000..a5407ceb766c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 214, + 214 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json new file mode 100644 index 000000000000..a80aa837e476 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json new file mode 100644 index 000000000000..501f64a004eb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22328, + 22328 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json new file mode 100644 index 000000000000..0be45de845df --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 85003 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 40339, + 40339 + ], + [ + 262, + 262 + ], + [ + 3264, + 3264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json new file mode 100644 index 000000000000..89ccfdbed1fa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 171072, + 171072 + ], + [ + 250, + 250 + ], + [ + 3104, + 3104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json new file mode 100644 index 000000000000..98442c7f4927 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json new file mode 100644 index 000000000000..5cb2eb842815 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 42024, + 42024 + ], + [ + 94, + 94 + ], + [ + 176, + 176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json new file mode 100644 index 000000000000..fb4e5552f7f5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 240453 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 5, + 11, + 1, + [ + 65536, + 65536 + ], + [ + 34890, + 34890 + ], + [ + 13872, + 13872 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json new file mode 100644 index 000000000000..3420d4a3fc99 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 29184, + 29184 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json new file mode 100644 index 000000000000..52ca3936645d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 4, + 5, + 1, + [ + 25088, + 25088 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json new file mode 100644 index 000000000000..4bb79fe71796 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 94, + 94 + ], + [ + 176, + 176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json new file mode 100644 index 000000000000..b6bf3b9d0075 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 100273 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 50702, + 50702 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json new file mode 100644 index 000000000000..71ac27d9d326 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 27776, + 27776 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json new file mode 100644 index 000000000000..cbd01b37e008 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json new file mode 100644 index 000000000000..38eab4e78e3d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22080, + 22080 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json new file mode 100644 index 000000000000..2bd3523e2770 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 9, + 1, + [ + 49152, + 49152 + ], + [ + 454, + 454 + ], + [ + 720, + 720 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json new file mode 100644 index 000000000000..16c62d33f566 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 11, + 1, + [ + 65536, + 65536 + ], + [ + 58, + 58 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json new file mode 100644 index 000000000000..d4eae5445586 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json new file mode 100644 index 000000000000..4a3aa63475b0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 114688, + 114688 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json new file mode 100644 index 000000000000..6623f4879ee7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json new file mode 100644 index 000000000000..857fa5f5e3b1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 81920, + 81920 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json new file mode 100644 index 000000000000..4e5b247b0739 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 112, + 112 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json new file mode 100644 index 000000000000..effeefa2aa8a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1478 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 42528, + 42528 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json new file mode 100644 index 000000000000..6de6aa8e28f5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 739 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21264, + 21264 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json new file mode 100644 index 000000000000..6e487ce43fb0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 11, + 17, + 1, + [ + 196608, + 196608 + ], + [ + 118, + 118 + ], + [ + 288, + 288 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json new file mode 100644 index 000000000000..b1cd0c9cdda6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 38021 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 13, + 1, + [ + 186624, + 186624 + ], + [ + 166, + 166 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json new file mode 100644 index 000000000000..1b7a2185cc36 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 65536, + 65536 + ], + [ + 82, + 82 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json new file mode 100644 index 000000000000..eb891b578e42 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 8, + 1, + [ + 33024, + 33024 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json new file mode 100644 index 000000000000..3653638ee2e6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json new file mode 100644 index 000000000000..f6bec0e0459b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 256, + 256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json new file mode 100644 index 000000000000..16026dacebfc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 1481872 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 49570, + 49570 + ], + [ + 198256, + 198256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json b/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json new file mode 100644 index 000000000000..10305579d187 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 192641 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 5, + 1, + [ + 1081344, + 1081344 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json new file mode 100644 index 000000000000..4deb44f270c3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 3377 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 31488, + 31488 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json new file mode 100644 index 000000000000..4deb44f270c3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 3377 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 31488, + 31488 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json new file mode 100644 index 000000000000..6faf862e9356 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 1010 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25584, + 25584 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json new file mode 100644 index 000000000000..6faf862e9356 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 1010 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25584, + 25584 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json new file mode 100644 index 000000000000..e0baa0c9f5ae --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 1995 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 39632, + 39632 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json new file mode 100644 index 000000000000..e0baa0c9f5ae --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 1995 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 39632, + 39632 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json new file mode 100644 index 000000000000..7b309facc7a0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 1307 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22592, + 22592 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json new file mode 100644 index 000000000000..672f6c43ed17 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 816 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 80016, + 80016 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json new file mode 100644 index 000000000000..b6e30d5e3342 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 2098 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 17, + 1, + [ + 98304, + 98304 + ], + [ + 150, + 150 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json new file mode 100644 index 000000000000..672f6c43ed17 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 816 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 80016, + 80016 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json new file mode 100644 index 000000000000..ac4b3251ff9a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 951466 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 24576, + 24576 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json new file mode 100644 index 000000000000..ff91a11d5ff8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 38021 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 46656, + 46656 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json new file mode 100644 index 000000000000..513d31342cea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 38021 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 17, + 1, + [ + 186624, + 186624 + ], + [ + 150, + 150 + ], + [ + 144, + 144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json new file mode 100644 index 000000000000..ca19895c81d9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json new file mode 100644 index 000000000000..bb8ac8538840 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 94, + 94 + ], + [ + 176, + 176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json new file mode 100644 index 000000000000..2e017e0a3939 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json new file mode 100644 index 000000000000..d1d3c719b694 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json new file mode 100644 index 000000000000..c4c12ce6ccff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 37068, + 37068 + ], + [ + 154, + 154 + ], + [ + 2176, + 2176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json new file mode 100644 index 000000000000..ded111d5dbd0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 39368, + 39368 + ], + [ + 154, + 154 + ], + [ + 2176, + 2176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json new file mode 100644 index 000000000000..7c2bcc88a936 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 35153, + 35153 + ], + [ + 70, + 70 + ], + [ + 560, + 560 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json new file mode 100644 index 000000000000..869c4378bf3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json new file mode 100644 index 000000000000..23b829f1681c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 37167, + 37167 + ], + [ + 130, + 130 + ], + [ + 1792, + 1792 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json new file mode 100644 index 000000000000..47108b29bc17 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 36170, + 36170 + ], + [ + 106, + 106 + ], + [ + 1408, + 1408 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json new file mode 100644 index 000000000000..9d89d5f2f3ab --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 42488, + 42488 + ], + [ + 142, + 142 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json new file mode 100644 index 000000000000..cfdc9c2e2106 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json new file mode 100644 index 000000000000..cfdc9c2e2106 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json new file mode 100644 index 000000000000..2b00a4fa0641 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 160, + 160 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json new file mode 100644 index 000000000000..873f47815fe8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 54, + 54 + ], + [ + 84, + 84 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json new file mode 100644 index 000000000000..bb8ac8538840 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 94, + 94 + ], + [ + 176, + 176 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json new file mode 100644 index 000000000000..2e017e0a3939 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json new file mode 100644 index 000000000000..e0426e7b5136 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 70598, + 70598 + ], + [ + 37328, + 37328 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json new file mode 100644 index 000000000000..e204a192de46 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json new file mode 100644 index 000000000000..d1d3c719b694 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json new file mode 100644 index 000000000000..ecd1b9eaf553 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json new file mode 100644 index 000000000000..43f81ae9e8ff --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 21120, + 21120 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json new file mode 100644 index 000000000000..7d39e1829559 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json new file mode 100644 index 000000000000..fea6fe2e598b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22784, + 22784 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json new file mode 100644 index 000000000000..869c4378bf3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 82, + 82 + ], + [ + 316, + 316 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json new file mode 100644 index 000000000000..bf5b94a7258a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json new file mode 100644 index 000000000000..b7fcd0454149 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 46, + 46 + ], + [ + 96, + 96 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json new file mode 100644 index 000000000000..7f4a0466396a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 59 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json new file mode 100644 index 000000000000..2e017e0a3939 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json new file mode 100644 index 000000000000..95c3df52a82f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 293387 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json new file mode 100644 index 000000000000..9028b81da14b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 102265 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json new file mode 100644 index 000000000000..848e2d81c431 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 102336 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json new file mode 100644 index 000000000000..79e781048634 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 91136, + 91136 + ], + [ + 2734, + 2734 + ], + [ + 36224, + 36224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json new file mode 100644 index 000000000000..7f4a0466396a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 59 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json new file mode 100644 index 000000000000..2e017e0a3939 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 293306 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json new file mode 100644 index 000000000000..95c3df52a82f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 293387 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json new file mode 100644 index 000000000000..9028b81da14b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 102265 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json new file mode 100644 index 000000000000..848e2d81c431 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 102336 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 3, + 8, + 1, + [ + 32768, + 32768 + ], + [ + 17456, + 17456 + ], + [ + 6968, + 6968 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json new file mode 100644 index 000000000000..2b08c32c8f53 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 2, + 5, + 1, + [ + 16384, + 16384 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json new file mode 100644 index 000000000000..b3dedd944d23 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 8, + 342268 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 5, + 1, + [ + 1064960, + 1064960 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json new file mode 100644 index 000000000000..04af83427d65 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json new file mode 100644 index 000000000000..20bd7543c105 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 1108 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25584, + 25584 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json new file mode 100644 index 000000000000..450fd3b15f03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 1108 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json new file mode 100644 index 000000000000..e962ac627edf --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 39632, + 39632 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json new file mode 100644 index 000000000000..fb033edaf0c4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 133120, + 133120 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json new file mode 100644 index 000000000000..20bd7543c105 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 1108 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 25584, + 25584 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json new file mode 100644 index 000000000000..450fd3b15f03 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 1108 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json new file mode 100644 index 000000000000..e962ac627edf --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 39632, + 39632 + ], + [ + 34, + 34 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json new file mode 100644 index 000000000000..fb033edaf0c4 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 2094 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 2, + 5, + 1, + [ + 133120, + 133120 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json new file mode 100644 index 000000000000..28c44c7705cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 35923 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 22080, + 22080 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json new file mode 100644 index 000000000000..45342fbc3d74 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 247582 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 13, + 1, + [ + 28480, + 28480 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json new file mode 100644 index 000000000000..10e4e9f2ba12 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 106, + 106 + ], + [ + 1184, + 1184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json new file mode 100644 index 000000000000..9deff6e405cd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 190, + 190 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json new file mode 100644 index 000000000000..9deff6e405cd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 190, + 190 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json new file mode 100644 index 000000000000..9deff6e405cd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 190, + 190 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json new file mode 100644 index 000000000000..10e4e9f2ba12 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 106, + 106 + ], + [ + 1184, + 1184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json new file mode 100644 index 000000000000..10e4e9f2ba12 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 22306, + 22306 + ], + [ + 106, + 106 + ], + [ + 1184, + 1184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json new file mode 100644 index 000000000000..6f795d0ee803 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 268053 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 10, + 22, + 32, + 4, + [ + 321286, + 321286 + ], + [ + 712, + 712 + ], + [ + 4576, + 4576 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json new file mode 100644 index 000000000000..2bdb228c5220 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 183111 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 7, + 13, + 1, + [ + 92941, + 92941 + ], + [ + 502, + 502 + ], + [ + 2464, + 2464 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json new file mode 100644 index 000000000000..48f5e22ba5e0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 8, + 1755006 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 20, + 24, + 60, + 4, + [ + 230615, + 230615 + ], + [ + 102328, + 102328 + ], + [ + 600256, + 600256 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json new file mode 100644 index 000000000000..480f8a18cdc8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 792561 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 15, + 25, + 1, + [ + 98666, + 98666 + ], + [ + 40606, + 40606 + ], + [ + 187232, + 187232 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json new file mode 100644 index 000000000000..daaadcdba249 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 601917 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 5, + 13, + 1, + [ + 41472, + 41472 + ], + [ + 48574, + 48574 + ], + [ + 647424, + 647424 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json new file mode 100644 index 000000000000..178821e1ca4e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 100352, + 100352 + ], + [ + 20710, + 20710 + ], + [ + 275904, + 275904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json new file mode 100644 index 000000000000..95aa395c60af --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 5, + 11, + 1, + [ + 52212, + 52212 + ], + [ + 296326, + 296326 + ], + [ + 1109184, + 1109184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json new file mode 100644 index 000000000000..178821e1ca4e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 100352, + 100352 + ], + [ + 20710, + 20710 + ], + [ + 275904, + 275904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json new file mode 100644 index 000000000000..6c810abb8aeb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 13, + 1, + [ + 53920, + 53920 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json new file mode 100644 index 000000000000..6c810abb8aeb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 13, + 1, + [ + 53920, + 53920 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json new file mode 100644 index 000000000000..7298ff45e056 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 7, + 15, + 1, + [ + 68614, + 68614 + ], + [ + 58, + 58 + ], + [ + 640, + 640 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json new file mode 100644 index 000000000000..c501cdfe8be2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 120865 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 7, + 23, + 1, + [ + 52430, + 52430 + ], + [ + 118, + 118 + ], + [ + 1472, + 1472 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json new file mode 100644 index 000000000000..b6cfd840ae33 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 10, + 1, + [ + 67534, + 67534 + ], + [ + 46, + 46 + ], + [ + 448, + 448 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json new file mode 100644 index 000000000000..bfed6ec29713 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 69, + 1, + [ + 100352, + 100352 + ], + [ + 54526, + 54526 + ], + [ + 726784, + 726784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json new file mode 100644 index 000000000000..bfed6ec29713 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 69, + 1, + [ + 100352, + 100352 + ], + [ + 54526, + 54526 + ], + [ + 726784, + 726784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json new file mode 100644 index 000000000000..23e6cccadb7b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 601917 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 5, + 21, + 1, + [ + 41472, + 41472 + ], + [ + 126910, + 126910 + ], + [ + 1691904, + 1691904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json new file mode 100644 index 000000000000..bfed6ec29713 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 69, + 1, + [ + 100352, + 100352 + ], + [ + 54526, + 54526 + ], + [ + 726784, + 726784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json new file mode 100644 index 000000000000..bfed6ec29713 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 69, + 1, + [ + 100352, + 100352 + ], + [ + 54526, + 54526 + ], + [ + 726784, + 726784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json new file mode 100644 index 000000000000..95a181bd8c49 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json new file mode 100644 index 000000000000..1de5e049d894 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1693531 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 542720, + 542720 + ], + [ + 19414, + 19414 + ], + [ + 258624, + 258624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json new file mode 100644 index 000000000000..b5449900fc3d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 29696, + 29696 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json new file mode 100644 index 000000000000..b5449900fc3d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 29696, + 29696 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json new file mode 100644 index 000000000000..2acbad453c7b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 35100, + 35100 + ], + [ + 346, + 346 + ], + [ + 4384, + 4384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json new file mode 100644 index 000000000000..b5449900fc3d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 29696, + 29696 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json new file mode 100644 index 000000000000..2acbad453c7b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 35100, + 35100 + ], + [ + 346, + 346 + ], + [ + 4384, + 4384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json new file mode 100644 index 000000000000..6d769f564896 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33209, + 33209 + ], + [ + 130, + 130 + ], + [ + 1504, + 1504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json new file mode 100644 index 000000000000..7cdd3a48121c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 85168, + 85168 + ], + [ + 35278, + 35278 + ], + [ + 470144, + 470144 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json new file mode 100644 index 000000000000..932066a29ffa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 254666 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 46848, + 46848 + ], + [ + 454, + 454 + ], + [ + 5824, + 5824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json new file mode 100644 index 000000000000..ed9a13583118 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 332181 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 48392, + 48392 + ], + [ + 466, + 466 + ], + [ + 5984, + 5984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json new file mode 100644 index 000000000000..8ebd514b428b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 254666 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 42293, + 42293 + ], + [ + 274, + 274 + ], + [ + 3424, + 3424 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json new file mode 100644 index 000000000000..a2ea9c5fb7af --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 159421 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 37304, + 37304 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json new file mode 100644 index 000000000000..987740be5e83 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 332181 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 71273, + 71273 + ], + [ + 670, + 670 + ], + [ + 8704, + 8704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json new file mode 100644 index 000000000000..60c3ad345f2e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 35828, + 35828 + ], + [ + 118, + 118 + ], + [ + 1600, + 1600 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json new file mode 100644 index 000000000000..005fb722e852 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 235100 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 38618, + 38618 + ], + [ + 454, + 454 + ], + [ + 5824, + 5824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json new file mode 100644 index 000000000000..62c000b29081 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 161976 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 24580, + 24580 + ], + [ + 190, + 190 + ], + [ + 2304, + 2304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json new file mode 100644 index 000000000000..a02d06724730 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 120865 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 11, + 1, + [ + 28318, + 28318 + ], + [ + 190, + 190 + ], + [ + 1744, + 1744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json new file mode 100644 index 000000000000..137e66bf1483 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 120865 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 13, + 1, + [ + 44921, + 44921 + ], + [ + 310, + 310 + ], + [ + 3904, + 3904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json new file mode 100644 index 000000000000..a56a73a714c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 161976 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 24580, + 24580 + ], + [ + 2290, + 2290 + ], + [ + 30304, + 30304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json new file mode 100644 index 000000000000..197cdb9b5009 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 255564 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35756, + 35756 + ], + [ + 310, + 310 + ], + [ + 3904, + 3904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json new file mode 100644 index 000000000000..4b81074408aa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 161976 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 13, + 13, + 1, + [ + 98636, + 98636 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json new file mode 100644 index 000000000000..52b1978f2930 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 161976 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 17, + 1, + [ + 52510, + 52510 + ], + [ + 166, + 166 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json new file mode 100644 index 000000000000..f30e5bd8162b --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 1641559 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 331871, + 331871 + ], + [ + 16138, + 16138 + ], + [ + 214944, + 214944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json new file mode 100644 index 000000000000..128115bae739 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 15, + 1, + [ + 42326, + 42326 + ], + [ + 286, + 286 + ], + [ + 4288, + 4288 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json new file mode 100644 index 000000000000..0f1b65a6db06 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 39977, + 39977 + ], + [ + 190, + 190 + ], + [ + 2752, + 2752 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json new file mode 100644 index 000000000000..85ffd10f4836 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 159687 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 44624, + 44624 + ], + [ + 298, + 298 + ], + [ + 4480, + 4480 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json new file mode 100644 index 000000000000..550343cbcfcb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 159687 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 43376, + 43376 + ], + [ + 226, + 226 + ], + [ + 2784, + 2784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json new file mode 100644 index 000000000000..0206fc826fea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35828, + 35828 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json new file mode 100644 index 000000000000..f20b89d82f2d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35968, + 35968 + ], + [ + 106, + 106 + ], + [ + 1184, + 1184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json new file mode 100644 index 000000000000..fa46462cc5a8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 36568, + 36568 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json new file mode 100644 index 000000000000..0206fc826fea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35828, + 35828 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json new file mode 100644 index 000000000000..46fdec9d0538 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 83, + 16423893 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 3740996, + 3740996 + ], + [ + 30022, + 30022 + ], + [ + 400064, + 400064 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json new file mode 100644 index 000000000000..a9f17de4cda0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 159687 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33964, + 33964 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json new file mode 100644 index 000000000000..37f4af4128cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 35153, + 35153 + ], + [ + 94, + 94 + ], + [ + 1120, + 1120 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json new file mode 100644 index 000000000000..47cea62594cc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 35153, + 35153 + ], + [ + 94, + 94 + ], + [ + 1216, + 1216 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json new file mode 100644 index 000000000000..860834fedbb2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json new file mode 100644 index 000000000000..37f4af4128cb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 10, + 1, + [ + 35153, + 35153 + ], + [ + 94, + 94 + ], + [ + 1120, + 1120 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json new file mode 100644 index 000000000000..0f7801b2e470 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 153536, + 153536 + ], + [ + 1426, + 1426 + ], + [ + 18784, + 18784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json new file mode 100644 index 000000000000..41ff7515c7df --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json new file mode 100644 index 000000000000..5c1e774f37b8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 39410, + 39410 + ], + [ + 814, + 814 + ], + [ + 10624, + 10624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json new file mode 100644 index 000000000000..41ff7515c7df --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json new file mode 100644 index 000000000000..8a117769b217 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 6982, + 6982 + ], + [ + 92864, + 92864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json new file mode 100644 index 000000000000..1a478f985788 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 11, + 1, + [ + 33392, + 33392 + ], + [ + 262, + 262 + ], + [ + 2272, + 2272 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json new file mode 100644 index 000000000000..8a117769b217 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 6982, + 6982 + ], + [ + 92864, + 92864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json new file mode 100644 index 000000000000..8a117769b217 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 6982, + 6982 + ], + [ + 92864, + 92864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json new file mode 100644 index 000000000000..2412b1cc57ca --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 4, + 23, + 1, + [ + 33392, + 33392 + ], + [ + 154, + 154 + ], + [ + 1408, + 1408 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json new file mode 100644 index 000000000000..8a117769b217 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 6982, + 6982 + ], + [ + 92864, + 92864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json new file mode 100644 index 000000000000..68d8b35e7588 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 142736, + 142736 + ], + [ + 347242, + 347242 + ], + [ + 4629664, + 4629664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json new file mode 100644 index 000000000000..68d8b35e7588 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 142736, + 142736 + ], + [ + 347242, + 347242 + ], + [ + 4629664, + 4629664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json new file mode 100644 index 000000000000..68d8b35e7588 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 142736, + 142736 + ], + [ + 347242, + 347242 + ], + [ + 4629664, + 4629664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json new file mode 100644 index 000000000000..68d8b35e7588 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 142736, + 142736 + ], + [ + 347242, + 347242 + ], + [ + 4629664, + 4629664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json new file mode 100644 index 000000000000..97d7f27021aa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 40237, + 40237 + ], + [ + 550, + 550 + ], + [ + 7104, + 7104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..fd1ea83213db --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 84940, + 84940 + ], + [ + 838, + 838 + ], + [ + 10944, + 10944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json new file mode 100644 index 000000000000..41ff7515c7df --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json new file mode 100644 index 000000000000..9551aabb1476 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 14662, + 14662 + ], + [ + 195264, + 195264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json new file mode 100644 index 000000000000..2ad59dd984ef --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 190318, + 190318 + ], + [ + 7414, + 7414 + ], + [ + 98624, + 98624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json new file mode 100644 index 000000000000..b553d8692d0a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35777, + 35777 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json new file mode 100644 index 000000000000..9ab164292bee --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 13, + 13, + 1, + [ + 143108, + 143108 + ], + [ + 262, + 262 + ], + [ + 3264, + 3264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json new file mode 100644 index 000000000000..b553d8692d0a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35777, + 35777 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json new file mode 100644 index 000000000000..b553d8692d0a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35777, + 35777 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json new file mode 100644 index 000000000000..4c0301c08db3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 10, + 1885732 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 56400, + 56400 + ], + [ + 1354, + 1354 + ], + [ + 17824, + 17824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json new file mode 100644 index 000000000000..e6477234cc3c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 16, + 2789819 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 82013, + 82013 + ], + [ + 1462, + 1462 + ], + [ + 19264, + 19264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json new file mode 100644 index 000000000000..05279818ae78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 46574, + 46574 + ], + [ + 526, + 526 + ], + [ + 6784, + 6784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json new file mode 100644 index 000000000000..8eef9a416619 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 44960, + 44960 + ], + [ + 646, + 646 + ], + [ + 8384, + 8384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json new file mode 100644 index 000000000000..539a5a8da937 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 13, + 13, + 1, + [ + 164840, + 164840 + ], + [ + 574, + 574 + ], + [ + 7424, + 7424 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json new file mode 100644 index 000000000000..539a5a8da937 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 13, + 13, + 1, + [ + 164840, + 164840 + ], + [ + 574, + 574 + ], + [ + 7424, + 7424 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json new file mode 100644 index 000000000000..b95ec5af3cbd --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 13, + 13, + 1, + [ + 156936, + 156936 + ], + [ + 1198, + 1198 + ], + [ + 15744, + 15744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json new file mode 100644 index 000000000000..563004e91258 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 8, + 29, + 1, + [ + 101743, + 101743 + ], + [ + 2470, + 2470 + ], + [ + 32704, + 32704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json new file mode 100644 index 000000000000..6ad395e0b52d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 96248, + 96248 + ], + [ + 37990, + 37990 + ], + [ + 506304, + 506304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json new file mode 100644 index 000000000000..384ce4dadbcb --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 19074, + 19074 + ], + [ + 166, + 166 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json new file mode 100644 index 000000000000..6734d0b04605 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 10, + 1, + [ + 35828, + 35828 + ], + [ + 118, + 118 + ], + [ + 1472, + 1472 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json new file mode 100644 index 000000000000..2292400be69f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 10, + 35, + 1, + [ + 113046, + 113046 + ], + [ + 958, + 958 + ], + [ + 5224, + 5224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json new file mode 100644 index 000000000000..d05556cd14e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 92076 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 9, + 1, + [ + 33362, + 33362 + ], + [ + 2506, + 2506 + ], + [ + 33184, + 33184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json new file mode 100644 index 000000000000..edd93c6655a2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 16, + 17, + 1, + [ + 222590, + 222590 + ], + [ + 8734, + 8734 + ], + [ + 116224, + 116224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json new file mode 100644 index 000000000000..2292400be69f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 18, + 10, + 35, + 1, + [ + 113046, + 113046 + ], + [ + 958, + 958 + ], + [ + 5224, + 5224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json new file mode 100644 index 000000000000..1514cee615b6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 475200 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 7, + 11, + 1, + [ + 97834, + 97834 + ], + [ + 59962, + 59962 + ], + [ + 491664, + 491664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json b/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json new file mode 100644 index 000000000000..789eb531ac27 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 21292, + 21292 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json new file mode 100644 index 000000000000..789eb531ac27 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 21292, + 21292 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json new file mode 100644 index 000000000000..789eb531ac27 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 21292, + 21292 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json new file mode 100644 index 000000000000..789eb531ac27 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 21292, + 21292 + ], + [ + 82, + 82 + ], + [ + 864, + 864 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json new file mode 100644 index 000000000000..0206fc826fea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35828, + 35828 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json new file mode 100644 index 000000000000..0206fc826fea --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35828, + 35828 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json new file mode 100644 index 000000000000..085933191690 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33340, + 33340 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json new file mode 100644 index 000000000000..e348c71619e7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 12, + 1, + [ + 35836, + 35836 + ], + [ + 86, + 86 + ], + [ + 800, + 800 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..70ac3608a98d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 166, + 166 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..905846132df2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..70ac3608a98d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 166, + 166 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..905846132df2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json new file mode 100644 index 000000000000..70ac3608a98d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 166, + 166 + ], + [ + 1984, + 1984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json new file mode 100644 index 000000000000..905846132df2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33408, + 33408 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json new file mode 100644 index 000000000000..84fc4fe605ed --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33392, + 33392 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json new file mode 100644 index 000000000000..be4621cd9356 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 33392, + 33392 + ], + [ + 70, + 70 + ], + [ + 704, + 704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json new file mode 100644 index 000000000000..5c85a420f3cf --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 48536, + 48536 + ], + [ + 334, + 334 + ], + [ + 4224, + 4224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json new file mode 100644 index 000000000000..84fc4fe605ed --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33392, + 33392 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json new file mode 100644 index 000000000000..bf6832d42b78 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 35153, + 35153 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json new file mode 100644 index 000000000000..84fc4fe605ed --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 33392, + 33392 + ], + [ + 46, + 46 + ], + [ + 384, + 384 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json new file mode 100644 index 000000000000..7cc4d80c96b5 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 21, + 9, + 1, + [ + 281224, + 281224 + ], + [ + 58, + 58 + ], + [ + 544, + 544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json new file mode 100644 index 000000000000..05d7f575551a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 636073 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 21292, + 21292 + ], + [ + 10162, + 10162 + ], + [ + 135264, + 135264 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json new file mode 100644 index 000000000000..2bf7d113546d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 138368, + 138368 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json new file mode 100644 index 000000000000..94f6c3ccd623 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 37008, + 37008 + ], + [ + 142, + 142 + ], + [ + 1664, + 1664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json new file mode 100644 index 000000000000..ecb73166999a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 139552, + 139552 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json new file mode 100644 index 000000000000..9162d111f6e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 792561 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 5398, + 5398 + ], + [ + 71744, + 71744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json new file mode 100644 index 000000000000..9162d111f6e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 792561 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 5398, + 5398 + ], + [ + 71744, + 71744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json new file mode 100644 index 000000000000..cd668f351a51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json new file mode 100644 index 000000000000..9953c2ea9e93 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 90448, + 90448 + ], + [ + 100366, + 100366 + ], + [ + 1337984, + 1337984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json new file mode 100644 index 000000000000..dca033517bc9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 686859 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 9, + 1, + [ + 52212, + 52212 + ], + [ + 5494, + 5494 + ], + [ + 73024, + 73024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json new file mode 100644 index 000000000000..d4202bfa2267 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87036 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 38722, + 38722 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json new file mode 100644 index 000000000000..d4202bfa2267 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 87036 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 38722, + 38722 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json new file mode 100644 index 000000000000..031fe71047b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 28467, + 28467 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json new file mode 100644 index 000000000000..7bbece367a24 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 86050 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 6, + 13, + 1, + [ + 42916, + 42916 + ], + [ + 322, + 322 + ], + [ + 4064, + 4064 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json new file mode 100644 index 000000000000..031fe71047b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 28467, + 28467 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json new file mode 100644 index 000000000000..9f7789217246 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 19, + 1, + [ + 32043, + 32043 + ], + [ + 422, + 422 + ], + [ + 4928, + 4928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json new file mode 100644 index 000000000000..2a7b3b9cd610 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 12, + 27, + 1, + [ + 215680, + 215680 + ], + [ + 406, + 406 + ], + [ + 3744, + 3744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json new file mode 100644 index 000000000000..9dca847cbbad --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json new file mode 100644 index 000000000000..a8acd89723c6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json new file mode 100644 index 000000000000..40b67f14452c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 118, + 118 + ], + [ + 768, + 768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json new file mode 100644 index 000000000000..74f5df99b33e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1198157 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 17, + 1, + [ + 171106, + 171106 + ], + [ + 22450, + 22450 + ], + [ + 264688, + 264688 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json new file mode 100644 index 000000000000..9953c2ea9e93 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 13, + 37, + 1, + [ + 90448, + 90448 + ], + [ + 100366, + 100366 + ], + [ + 1337984, + 1337984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json new file mode 100644 index 000000000000..dca033517bc9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 686859 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 5, + 9, + 1, + [ + 52212, + 52212 + ], + [ + 5494, + 5494 + ], + [ + 73024, + 73024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json new file mode 100644 index 000000000000..1ca57cbe487c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 16, + 2668276 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 24, + 36, + 4, + [ + 250852, + 250852 + ], + [ + 194056, + 194056 + ], + [ + 2586496, + 2586496 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json new file mode 100644 index 000000000000..dfa752091632 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 238, + 238 + ], + [ + 1648, + 1648 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json new file mode 100644 index 000000000000..806d886e75c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json new file mode 100644 index 000000000000..031fe71047b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 28467, + 28467 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json new file mode 100644 index 000000000000..031fe71047b9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 28467, + 28467 + ], + [ + 238, + 238 + ], + [ + 2944, + 2944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json new file mode 100644 index 000000000000..9f7789217246 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 296601 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 6, + 19, + 1, + [ + 32043, + 32043 + ], + [ + 422, + 422 + ], + [ + 4928, + 4928 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json new file mode 100644 index 000000000000..813a3d7f1016 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 22, + 3183754 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 24, + 52, + 4, + [ + 685542, + 685542 + ], + [ + 79084, + 79084 + ], + [ + 1053536, + 1053536 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json new file mode 100644 index 000000000000..2a7b3b9cd610 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 12, + 27, + 1, + [ + 215680, + 215680 + ], + [ + 406, + 406 + ], + [ + 3744, + 3744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json new file mode 100644 index 000000000000..102e62664bdc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 8, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 8, + 25, + 33, + 1, + [ + 176120, + 176120 + ], + [ + 101270, + 101270 + ], + [ + 1323520, + 1323520 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json new file mode 100644 index 000000000000..b06ed0feb281 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 11, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 21, + 21, + 1, + [ + 274384, + 274384 + ], + [ + 97654, + 97654 + ], + [ + 1301824, + 1301824 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json new file mode 100644 index 000000000000..33eed36df4c9 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1004220 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 7, + 13, + 1, + [ + 71656, + 71656 + ], + [ + 48406, + 48406 + ], + [ + 645184, + 645184 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json new file mode 100644 index 000000000000..9dca847cbbad --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 32566, + 32566 + ], + [ + 433984, + 433984 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json new file mode 100644 index 000000000000..a8acd89723c6 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1778473 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 10870, + 10870 + ], + [ + 144704, + 144704 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json new file mode 100644 index 000000000000..40b67f14452c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 11, + 1, + [ + 33209, + 33209 + ], + [ + 118, + 118 + ], + [ + 768, + 768 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json new file mode 100644 index 000000000000..74f5df99b33e --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 7, + 1198157 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 17, + 1, + [ + 171106, + 171106 + ], + [ + 22450, + 22450 + ], + [ + 264688, + 264688 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json new file mode 100644 index 000000000000..7da079696671 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 5, + 5, + 1, + [ + 65536, + 65536 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json new file mode 100644 index 000000000000..d7ff42c1270c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 1566814 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 143312, + 143312 + ], + [ + 92614, + 92614 + ], + [ + 1234624, + 1234624 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json new file mode 100644 index 000000000000..4da17ca35c83 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 12, + 1726951 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 4, + 11, + 1, + [ + 51945, + 51945 + ], + [ + 2158, + 2158 + ], + [ + 26752, + 26752 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json new file mode 100644 index 000000000000..4c978ab6c2b1 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 42, + 8167579 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 11, + 13, + 25, + 1, + [ + 305640, + 305640 + ], + [ + 3526, + 3526 + ], + [ + 44480, + 44480 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json new file mode 100644 index 000000000000..8c2cc0dbcb28 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 74745 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 11, + 13, + 25, + 1, + [ + 146720, + 146720 + ], + [ + 1870, + 1870 + ], + [ + 22400, + 22400 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json new file mode 100644 index 000000000000..caf18baec7cf --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 673020 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 11, + 13, + 25, + 1, + [ + 171956, + 171956 + ], + [ + 3334, + 3334 + ], + [ + 41920, + 41920 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json new file mode 100644 index 000000000000..23e8621fe30f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 3, + 295054 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 45608, + 45608 + ], + [ + 1342, + 1342 + ], + [ + 17664, + 17664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json new file mode 100644 index 000000000000..7d4c49afdfb0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 134699 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 526, + 526 + ], + [ + 6784, + 6784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json new file mode 100644 index 000000000000..eabb4022be51 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 219641 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 550, + 550 + ], + [ + 7104, + 7104 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json new file mode 100644 index 000000000000..25fb8b4d1e09 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 12, + 1726951 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 54188, + 54188 + ], + [ + 790, + 790 + ], + [ + 10304, + 10304 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json new file mode 100644 index 000000000000..d8ccbe177baa --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 431300 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 31984, + 31984 + ], + [ + 1030, + 1030 + ], + [ + 13504, + 13504 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json new file mode 100644 index 000000000000..632a29ad1759 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 134699 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 598, + 598 + ], + [ + 7744, + 7744 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json new file mode 100644 index 000000000000..7d4c49afdfb0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 134699 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 526, + 526 + ], + [ + 6784, + 6784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json new file mode 100644 index 000000000000..7d4c49afdfb0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 134699 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 526, + 526 + ], + [ + 6784, + 6784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json new file mode 100644 index 000000000000..7d4c49afdfb0 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 134699 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 41706, + 41706 + ], + [ + 526, + 526 + ], + [ + 6784, + 6784 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json new file mode 100644 index 000000000000..5cf22c6b3e56 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 36386, + 36386 + ], + [ + 94, + 94 + ], + [ + 1024, + 1024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json new file mode 100644 index 000000000000..ad6e567fda4d --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 431300 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 13, + 1, + [ + 37192, + 37192 + ], + [ + 958, + 958 + ], + [ + 12544, + 12544 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json new file mode 100644 index 000000000000..c1486937e1db --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 219641 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 4, + 9, + 1, + [ + 50408, + 50408 + ], + [ + 910, + 910 + ], + [ + 11904, + 11904 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json b/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json new file mode 100644 index 000000000000..9ff0b2697cfc --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 2, + 4, + 7, + 1, + [ + 49152, + 49152 + ], + [ + 25594, + 25594 + ], + [ + 45664, + 45664 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json b/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json new file mode 100644 index 000000000000..f7ca11c2324c --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 367855 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 12, + 9, + 17, + 1, + [ + 131072, + 131072 + ], + [ + 24058, + 24058 + ], + [ + 10024, + 10024 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json new file mode 100644 index 000000000000..12b2edda3bf3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 4, + 10, + 1, + [ + 49152, + 49152 + ], + [ + 66, + 66 + ], + [ + 100, + 100 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json b/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json new file mode 100644 index 000000000000..022aba25a686 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 13, + 17, + 21, + 1, + [ + 207208, + 207208 + ], + [ + 210, + 210 + ], + [ + 944, + 944 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json new file mode 100644 index 000000000000..e76ac664a033 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 16, + 13, + 29, + 1, + [ + 196608, + 196608 + ], + [ + 246, + 246 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json new file mode 100644 index 000000000000..a65edfc8c989 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 2, + 211659 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 13, + 17, + 22, + 1, + [ + 154848, + 154848 + ], + [ + 174, + 174 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json new file mode 100644 index 000000000000..c32db503cbc8 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 5, + 4, + 13, + 1, + [ + 49152, + 49152 + ], + [ + 286, + 286 + ], + [ + 528, + 528 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json new file mode 100644 index 000000000000..b42b2f763470 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 84942 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 13, + 17, + 22, + 1, + [ + 207700, + 207700 + ], + [ + 246, + 246 + ], + [ + 1680, + 1680 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json new file mode 100644 index 000000000000..084056a131e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 9, + 15, + 1, + [ + 164352, + 164352 + ], + [ + 82, + 82 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json new file mode 100644 index 000000000000..084056a131e3 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 9, + 15, + 1, + [ + 164352, + 164352 + ], + [ + 82, + 82 + ], + [ + 224, + 224 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json new file mode 100644 index 000000000000..8fbd5d92e32a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json new file mode 100644 index 000000000000..d11ea20c7174 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json new file mode 100644 index 000000000000..a9262cad3a1a --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 13, + 21, + 1, + [ + 262144, + 262144 + ], + [ + 118, + 118 + ], + [ + 192, + 192 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json new file mode 100644 index 000000000000..a00f95be78e2 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 9, + 13, + 1, + [ + 196608, + 196608 + ], + [ + 70, + 70 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json new file mode 100644 index 000000000000..b51667187e38 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 9, + 13, + 1, + [ + 131072, + 131072 + ], + [ + 70, + 70 + ], + [ + 128, + 128 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json new file mode 100644 index 000000000000..01b432fe214f --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 3, + 7, + 1, + [ + 32768, + 32768 + ], + [ + 34, + 34 + ], + [ + 80, + 80 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json new file mode 100644 index 000000000000..ca6ff8e33383 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 1, + 390258 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 3, + 6, + 8, + 1, + [ + 81920, + 81920 + ], + [ + 70598, + 70598 + ], + [ + 37328, + 37328 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json new file mode 100644 index 000000000000..4859f4afb127 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 6, + 290116 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 6, + 11, + 5, + 1, + [ + 1638400, + 1638400 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json new file mode 100644 index 000000000000..10305579d187 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 192641 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 4, + 7, + 5, + 1, + [ + 1081344, + 1081344 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json new file mode 100644 index 000000000000..50f1262c46f7 --- /dev/null +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 0, + 0 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 0, + 3, + 5, + 1, + [ + 32768, + 32768 + ], + [ + 22, + 22 + ], + [ + 64, + 64 + ] + ] + ] +} \ No newline at end of file diff --git a/metrics/windows-opengl.json b/metrics/windows-opengl.json new file mode 100644 index 000000000000..bf693f931e11 --- /dev/null +++ b/metrics/windows-opengl.json @@ -0,0 +1,15 @@ +{ + "base_test_path": "integration", + "cache_path": "cache-style.db", + "expectation_paths": [ + ], + "ignore_paths": [ + "ignores/platform-all.json", + "ignores/windows-opengl.json" + ], + "metric_path": "windows-msvc-release", + "probes": [ + "probeGFX", + "probeNetwork" + ] +} diff --git a/metrics/windows-vulkan.json b/metrics/windows-vulkan.json new file mode 100644 index 000000000000..bbcbe79edc24 --- /dev/null +++ b/metrics/windows-vulkan.json @@ -0,0 +1,15 @@ +{ + "base_test_path": "integration", + "cache_path": "cache-style.db", + "expectation_paths": [ + ], + "ignore_paths": [ + "ignores/platform-all.json", + "ignores/windows-vulkan.json" + ], + "metric_path": "windows-msvc-release", + "probes": [ + "probeGFX", + "probeNetwork" + ] +} diff --git a/platform/android/android.cmake b/platform/android/android.cmake index 5f141e7f598c..0f14d074f46a 100644 --- a/platform/android/android.cmake +++ b/platform/android/android.cmake @@ -154,9 +154,7 @@ target_link_libraries( Mapbox::Base::jni.hpp mbgl-compiler-options $<$:curl::curl_static> - -Wl,--whole-archive - mbgl-test - -Wl,--no-whole-archive + $ ) @@ -209,9 +207,7 @@ target_link_libraries( PRIVATE Mapbox::Base::jni.hpp mbgl-compiler-options - -Wl,--whole-archive - mbgl-benchmark - -Wl,--no-whole-archive + $ ) add_custom_command( diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 7d1140f60cae..e1374d067a59 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -203,9 +203,7 @@ target_link_libraries( mbgl-test-runner PRIVATE mbgl-compiler-options - -Wl,--whole-archive - mbgl-test - -Wl,--no-whole-archive + $ ) add_executable( @@ -217,9 +215,7 @@ target_link_libraries( mbgl-benchmark-runner PRIVATE mbgl-compiler-options - -Wl,--whole-archive - mbgl-benchmark - -Wl,--no-whole-archive + $ ) add_executable( diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index 7d928d4f47c4..4ca02db212c3 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.19) +cmake_minimum_required(VERSION 3.24) set(CMAKE_OSX_DEPLOYMENT_TARGET "14.3") # Override default CMake NATIVE_ARCH_ACTUAL diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 71957dff5279..0f2bf061b35c 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -203,7 +203,7 @@ if(NOT MLN_QT_LIBRARY_ONLY) else() target_link_libraries( mbgl-test-runner - PRIVATE -Wl,--whole-archive mbgl-test -Wl,--no-whole-archive + PRIVATE $ ) endif() diff --git a/platform/windows/windows.cmake b/platform/windows/windows.cmake index 16736215c3b1..8665a6f0be06 100644 --- a/platform/windows/windows.cmake +++ b/platform/windows/windows.cmake @@ -228,9 +228,8 @@ target_link_libraries( mbgl-test-runner PRIVATE mbgl-compiler-options - -Wl,--whole-archive - mbgl-test - -Wl,--no-whole-archive + $ + $,libuv::uv_a,libuv::uv> ) add_executable( @@ -242,8 +241,7 @@ target_link_libraries( mbgl-benchmark-runner PRIVATE mbgl-compiler-options - mbgl-benchmark - -WHOLEARCHIVE:mbgl-benchmark + $ $,libuv::uv_a,libuv::uv> shlwapi ) diff --git a/render-test/android/app/build.gradle.kts b/render-test/android/app/build.gradle.kts index 4175e74f821d..564a28f67b59 100644 --- a/render-test/android/app/build.gradle.kts +++ b/render-test/android/app/build.gradle.kts @@ -45,7 +45,7 @@ android { externalNativeBuild { cmake { - version = "3.19.0+" + version = "3.24.0+" path = file("../../../CMakeLists.txt") } } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9d15d5ce41e8..816037eea13e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -172,7 +172,7 @@ if(MLN_WITH_METAL) ) endif() -if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Android) +if(CMAKE_SYSTEM_NAME STREQUAL Android) message("Target platform does not support HTTP tests or dependencies not found.") set(MLN_TEST_HAS_TEST_SERVER 0) @@ -186,7 +186,7 @@ else() ${PROJECT_SOURCE_DIR}/test/src/mbgl/test/http_server.cpp PROPERTIES COMPILE_FLAGS - -Wno-shadow + $<$,$>:-Wno-shadow> ) set_source_files_properties( ${PROJECT_SOURCE_DIR}/test/src/mbgl/test/http_server.cpp @@ -263,7 +263,7 @@ if (MLN_WITH_CLANG_TIDY) set_target_properties(mbgl-test PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}") endif() -if (CMAKE_SYSTEM_NAME STREQUAL Linux) +if (WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Linux) target_compile_definitions( mbgl-test PRIVATE USE_CPP_TEST_SERVER diff --git a/test/api/annotations.test.cpp b/test/api/annotations.test.cpp index 79c58d27af3a..1f9ddd6e8e10 100644 --- a/test/api/annotations.test.cpp +++ b/test/api/annotations.test.cpp @@ -35,7 +35,11 @@ class AnnotationTest { MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize())}; void checkRendering(const char* name) { +#if WIN32 + test::checkImage(std::string("test/fixtures/annotations/") + name, frontend.render(map).image, 0.015, 0.1); +#else test::checkImage(std::string("test/fixtures/annotations/") + name, frontend.render(map).image, 0.0002, 0.1); +#endif } }; diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index b72faeeaab4d..82b322599f41 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -385,6 +385,8 @@ TEST(Map, Offline) { #if ANDROID test::checkImage("test/fixtures/map/offline", test.frontend.render(test.map).image, 0.0046, 0.1); +#elif WIN32 + test::checkImage("test/fixtures/map/offline", test.frontend.render(test.map).image, 0.035, 0.1); #else test::checkImage("test/fixtures/map/offline", test.frontend.render(test.map).image, 0.0015, 0.1); #endif diff --git a/test/src/mbgl/test/http_server.cpp b/test/src/mbgl/test/http_server.cpp index abd9e2f5d651..92c651b3751d 100644 --- a/test/src/mbgl/test/http_server.cpp +++ b/test/src/mbgl/test/http_server.cpp @@ -176,7 +176,7 @@ void runServer(std::unique_ptr& server) { }); server->Get("/delayed", [](const Request&, Response& res) { - usleep(200000); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); res.status = 200; res.set_content("Response", "text/plain"); }); diff --git a/test/src/mbgl/test/sqlite3_test_fs.cpp b/test/src/mbgl/test/sqlite3_test_fs.cpp index e4ec9e776e1e..c633ea18ac2e 100644 --- a/test/src/mbgl/test/sqlite3_test_fs.cpp +++ b/test/src/mbgl/test/sqlite3_test_fs.cpp @@ -178,12 +178,12 @@ static int sqlite3_test_fs_open(sqlite3_vfs* vfs, const char* zName, sqlite3_fil } auto* file = (File*)pFile; - auto* unix_fs = (sqlite3_vfs*)vfs->pAppData; + auto* os_fs = (sqlite3_vfs*)vfs->pAppData; file->real = (sqlite3_file*)&file[1]; if (!sqlite3_test_fs_file_create) { int res; - const int result = unix_fs->xAccess(vfs, zName, SQLITE_ACCESS_EXISTS, &res); + const int result = os_fs->xAccess(vfs, zName, SQLITE_ACCESS_EXISTS, &res); if (result != SQLITE_OK) { pFile->pMethods = nullptr; return result; @@ -194,7 +194,7 @@ static int sqlite3_test_fs_open(sqlite3_vfs* vfs, const char* zName, sqlite3_fil } } - const int status = unix_fs->xOpen(unix_fs, zName, file->real, flags, pOutFlags); + const int status = os_fs->xOpen(os_fs, zName, file->real, flags, pOutFlags); if (file->real->pMethods) { auto* methods = (sqlite3_io_methods*)sqlite3_malloc(sizeof(sqlite3_io_methods)); memset(methods, 0, sizeof(sqlite3_io_methods)); @@ -223,8 +223,8 @@ static int sqlite3_test_fs_delete(sqlite3_vfs* vfs, const char* zPath, int dirSy if (!sqlite3_test_fs_io) { return SQLITE_AUTH; } - auto* unix_fs = (sqlite3_vfs*)vfs->pAppData; - return unix_fs->xDelete(unix_fs, zPath, dirSync); + auto* os_fs = (sqlite3_vfs*)vfs->pAppData; + return os_fs->xDelete(os_fs, zPath, dirSync); } static int sqlite3_test_fs_access(sqlite3_vfs* vfs, const char* zPath, int flags, int* pResOut) { @@ -234,16 +234,17 @@ static int sqlite3_test_fs_access(sqlite3_vfs* vfs, const char* zPath, int flags if (!sqlite3_test_fs_io) { return SQLITE_AUTH; } - auto* unix_fs = (sqlite3_vfs*)vfs->pAppData; - return unix_fs->xAccess(unix_fs, zPath, flags, pResOut); + auto* os_fs = (sqlite3_vfs*)vfs->pAppData; + return os_fs->xAccess(os_fs, zPath, flags, pResOut); } namespace mbgl { namespace test { SQLite3TestFS::SQLite3TestFS() { - sqlite3_vfs* unix_fs = sqlite3_vfs_find("unix"); - if (unix_fs == nullptr) { + sqlite3_vfs* os_fs = sqlite3_vfs_find(nullptr); + + if (os_fs == nullptr) { abort(); } @@ -253,22 +254,22 @@ SQLite3TestFS::SQLite3TestFS() { } memset(test_fs, 0, sizeof(sqlite3_vfs)); test_fs->iVersion = 1; - test_fs->szOsFile = unix_fs->szOsFile + sizeof(File); - test_fs->mxPathname = unix_fs->mxPathname; + test_fs->szOsFile = os_fs->szOsFile + sizeof(File); + test_fs->mxPathname = os_fs->mxPathname; test_fs->zName = "test_fs"; - test_fs->pAppData = unix_fs; + test_fs->pAppData = os_fs; test_fs->xOpen = sqlite3_test_fs_open; test_fs->xDelete = sqlite3_test_fs_delete; test_fs->xAccess = sqlite3_test_fs_access; - test_fs->xFullPathname = unix_fs->xFullPathname; - test_fs->xDlOpen = unix_fs->xDlOpen; - test_fs->xDlError = unix_fs->xDlError; - test_fs->xDlSym = unix_fs->xDlSym; - test_fs->xDlClose = unix_fs->xDlClose; - test_fs->xRandomness = unix_fs->xRandomness; - test_fs->xSleep = unix_fs->xSleep; - test_fs->xCurrentTime = unix_fs->xCurrentTime; - test_fs->xGetLastError = unix_fs->xGetLastError; + test_fs->xFullPathname = os_fs->xFullPathname; + test_fs->xDlOpen = os_fs->xDlOpen; + test_fs->xDlError = os_fs->xDlError; + test_fs->xDlSym = os_fs->xDlSym; + test_fs->xDlClose = os_fs->xDlClose; + test_fs->xRandomness = os_fs->xRandomness; + test_fs->xSleep = os_fs->xSleep; + test_fs->xCurrentTime = os_fs->xCurrentTime; + test_fs->xGetLastError = os_fs->xGetLastError; sqlite3_vfs_register(test_fs, 0); } diff --git a/test/storage/online_file_source.test.cpp b/test/storage/online_file_source.test.cpp index 1673b13c1518..c8a0de213cf8 100644 --- a/test/storage/online_file_source.test.cpp +++ b/test/storage/online_file_source.test.cpp @@ -13,6 +13,13 @@ using namespace mbgl; +#ifdef WIN32 +// Windows doesn't fail immediately like other OS +constexpr double connectionTimeout = 2.0; +#else +constexpr double connectionTimeout = 0; +#endif + TEST(OnlineFileSource, Cancel) { util::RunLoop loop; std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); @@ -93,7 +100,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(ConnectionError)) { const auto start = Clock::now(); int counter = 0; - int wait = 0; + double wait = connectionTimeout; std::unique_ptr req = fs->request({Resource::Unknown, "http://127.0.0.1:3001/"}, [&](Response res) { const auto duration = std::chrono::duration(Clock::now() - start).count(); @@ -111,7 +118,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(ConnectionError)) { req.reset(); loop.stop(); } - wait += (1 << counter); + wait += (1 << counter) + connectionTimeout; counter++; }); @@ -318,13 +325,16 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChangePreempt)) { int counter = 0; const Resource resource{Resource::Unknown, "http://127.0.0.1:3001/test"}; + + double wait = connectionTimeout; + std::unique_ptr req = fs->request(resource, [&](Response res) { const auto duration = std::chrono::duration(Clock::now() - start).count(); if (counter == 0) { - EXPECT_GT(0.2, duration) << "Response came in too late"; + EXPECT_GT(wait + 0.2, duration) << "Response came in too late"; } else if (counter == 1) { - EXPECT_LT(0.39, duration) << "Preempted retry triggered too early"; - EXPECT_GT(0.6, duration) << "Preempted retry triggered too late"; + EXPECT_LT(wait + 0.39, duration) << "Preempted retry triggered too early"; + EXPECT_GT(wait + 0.6, duration) << "Preempted retry triggered too late"; } else if (counter > 1) { FAIL() << "Retried too often"; } @@ -336,15 +346,19 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChangePreempt)) { EXPECT_FALSE(bool(res.modified)); EXPECT_FALSE(bool(res.etag)); + wait += connectionTimeout; + if (counter++ == 1) { req.reset(); loop.stop(); } }); - // After 400 milliseconds, we're going to trigger a NetworkStatus change. + // After 400 milliseconds + connectionTimeout, we're going to trigger a NetworkStatus change. util::Timer reachableTimer; - reachableTimer.start(Milliseconds(400), Duration::zero(), []() { mbgl::NetworkStatus::Reachable(); }); + reachableTimer.start(Milliseconds(static_cast(connectionTimeout * 1000) + 400), Duration::zero(), []() { + mbgl::NetworkStatus::Reachable(); + }); fs->resume(); loop.run(); diff --git a/test/util/string_indexer.test.cpp b/test/util/string_indexer.test.cpp index 1fabe5d48ea5..f51142023967 100644 --- a/test/util/string_indexer.test.cpp +++ b/test/util/string_indexer.test.cpp @@ -85,11 +85,11 @@ TEST(StringIndexer, GetOOBIdentity) { std::string str; #ifndef NDEBUG - EXPECT_DEATH_IF_SUPPORTED(str = strIndexer.get(42), "id < identityToString.size()"); + EXPECT_DEATH_IF_SUPPORTED(str = strIndexer.get(42), "id < identityToString.size\\(\\)"); #endif EXPECT_TRUE(str.empty()); #ifndef NDEBUG - EXPECT_DEATH_IF_SUPPORTED(str = strIndexer.get(-1), "id < identityToString.size()"); + EXPECT_DEATH_IF_SUPPORTED(str = strIndexer.get(-1), "id < identityToString.size\\(\\)"); #endif EXPECT_TRUE(str.empty()); } diff --git a/test/util/timer.test.cpp b/test/util/timer.test.cpp index 4b4010405d7d..ae95d9a77224 100644 --- a/test/util/timer.test.cpp +++ b/test/util/timer.test.cpp @@ -63,7 +63,7 @@ TEST(Timer, TEST_REQUIRES_ACCURATE_TIMING(Repeat)) { auto totalTime = std::chrono::duration_cast(mbgl::Clock::now() - first); EXPECT_GE(totalTime, expectedTotalTime * 0.8); - EXPECT_LE(totalTime, expectedTotalTime * 1.2); + EXPECT_LE(totalTime, expectedTotalTime * 1.3); } TEST(Timer, TEST_REQUIRES_ACCURATE_TIMING(Stop)) { @@ -170,7 +170,7 @@ TEST(Timer, TEST_REQUIRES_ACCURATE_TIMING(StoppedDuringExpiration)) { auto totalTime = std::chrono::duration_cast(mbgl::Clock::now() - first); EXPECT_GE(totalTime, expireTimeout * 0.8); - EXPECT_LE(totalTime, expireTimeout * 1.2); + EXPECT_LE(totalTime, expireTimeout * 1.3); } TEST(Timer, TEST_REQUIRES_ACCURATE_TIMING(StoppedAfterExpiration)) { From 23bc2ccb64c153d6f95452049ce2d16fd7a95a8f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 3 Dec 2024 01:31:36 +0100 Subject: [PATCH 006/339] Free up disk space in android-build-cpp-test (#3064) --- .github/workflows/android-ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index a26ad33a3527..c121ca7bc01d 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -212,6 +212,18 @@ jobs: working-directory: test/android steps: + - name: Free Disk Space (Ubuntu) + if: startsWith(runner.name, 'GitHub Actions') + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: false + - uses: actions/checkout@v4 with: submodules: recursive From 5a7e740c55b9f3b19f48d6ec84e219d056df90f1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:47:17 +0100 Subject: [PATCH 007/339] [pre-commit.ci] pre-commit autoupdate (#3063) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 28f89bb74d60..5482b7ab088a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: - id: actionlint additional_dependencies: [shellcheck-py] - repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.55.2" + rev: "0.55.3" hooks: - id: swiftformat args: [--swiftversion, "5.8"] From c548212d42b0565aff127c2a52ba24e42350d3ba Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 3 Dec 2024 23:03:06 +0200 Subject: [PATCH 008/339] Add latency to surface updates (#3056) --- include/mbgl/vulkan/context.hpp | 3 ++- src/mbgl/vulkan/context.cpp | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index e17160d65890..08e439df3f6b 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -146,7 +146,7 @@ class Context final : public gfx::Context { void enqueueDeletion(std::function&& function); void submitOneTimeCommand(const std::function& function) const; - void requestSurfaceUpdate() { surfaceUpdateRequested = true; } + void requestSurfaceUpdate(bool useDelay = true); private: struct FrameResources { @@ -197,6 +197,7 @@ class Context final : public gfx::Context { uint8_t frameResourceIndex = 0; std::vector frameResources; bool surfaceUpdateRequested{false}; + int32_t surfaceUpdateLatency{0}; int32_t currentFrameCount{0}; struct { diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 1acb4d691d49..9f54ebed28bb 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -171,6 +171,19 @@ void Context::submitOneTimeCommand(const std::function Date: Tue, 3 Dec 2024 23:30:08 +0100 Subject: [PATCH 009/339] Use CMake 3.24.0+ for Android (#3065) --- platform/android/android.cmake | 8 ++++++++ platform/android/buildSrc/src/main/kotlin/Versions.kt | 4 ++-- test/android/app/build.gradle.kts | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/platform/android/android.cmake b/platform/android/android.cmake index 0f14d074f46a..dd01b8f11e13 100644 --- a/platform/android/android.cmake +++ b/platform/android/android.cmake @@ -146,6 +146,14 @@ target_include_directories( ${PROJECT_SOURCE_DIR}/src ) +# this is needed because Android is not officially supported +# https://discourse.cmake.org/t/error-when-crosscompiling-with-whole-archive-target-link/9394 +# https://cmake.org/cmake/help/latest/release/3.24.html#generator-expressions +set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE +"-Wl,--whole-archive -Wl,--no-whole-archive" +) +set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED True) + find_package(curl CONFIG) target_link_libraries( diff --git a/platform/android/buildSrc/src/main/kotlin/Versions.kt b/platform/android/buildSrc/src/main/kotlin/Versions.kt index 16fd70fae6ba..ba52910f87ad 100644 --- a/platform/android/buildSrc/src/main/kotlin/Versions.kt +++ b/platform/android/buildSrc/src/main/kotlin/Versions.kt @@ -1,4 +1,4 @@ object Versions { - const val ndkVersion ="27.0.12077973" - const val cmakeVersion = "3.18.1+" + const val ndkVersion = "27.0.12077973" + const val cmakeVersion = "3.24.0+" } \ No newline at end of file diff --git a/test/android/app/build.gradle.kts b/test/android/app/build.gradle.kts index 59f06ff4bc11..8e4b40b45762 100644 --- a/test/android/app/build.gradle.kts +++ b/test/android/app/build.gradle.kts @@ -47,7 +47,7 @@ android { externalNativeBuild { cmake { - version = "3.18.1+" + version = "3.24.0+" path = file("../../../CMakeLists.txt") } } From 61d385bd63fa70054c25fdff5ceefaaa0d6a5452 Mon Sep 17 00:00:00 2001 From: Omar Carrasco Escudero Date: Wed, 4 Dec 2024 21:18:17 +0100 Subject: [PATCH 010/339] fix: Disable accessibility on hidden compass button (#3068) --- platform/ios/src/MLNCompassButton.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/ios/src/MLNCompassButton.mm b/platform/ios/src/MLNCompassButton.mm index 3e0597c3c334..009f37ee05af 100644 --- a/platform/ios/src/MLNCompassButton.mm +++ b/platform/ios/src/MLNCompassButton.mm @@ -124,6 +124,8 @@ - (void)showCompass:(BOOL)animated { - (void)hideCompass:(BOOL)animated { animated ? [self animateToAlpha:0] : [self setAlpha:0]; + self.isAccessibilityElement = NO; + self.accessibilityElementsHidden = YES; } - (void)animateToAlpha:(CGFloat)alpha { From 112edb66adc5cc3f5cfa5ab57b85831ff4f36cd7 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Wed, 4 Dec 2024 12:57:22 -0800 Subject: [PATCH 011/339] Fix crash on unsupported attribute type conversion (#3066) --- src/mbgl/gl/upload_pass.cpp | 4 +++- src/mbgl/gl/vertex_attribute_gl.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mbgl/gl/upload_pass.cpp b/src/mbgl/gl/upload_pass.cpp index 8243675ff74a..324d196098e4 100644 --- a/src/mbgl/gl/upload_pass.cpp +++ b/src/mbgl/gl/upload_pass.cpp @@ -271,7 +271,9 @@ gfx::AttributeBindingArray UploadPass::buildAttributeBindings( return; } - overrideAttr->setDirty(false); + if (overrideAttr) { + overrideAttr->setDirty(false); + } bindings[index] = { /*.attribute = */ {defaultAttr.getDataType(), offset}, diff --git a/src/mbgl/gl/vertex_attribute_gl.cpp b/src/mbgl/gl/vertex_attribute_gl.cpp index abd8740fd2e1..4ffc2aa9c138 100644 --- a/src/mbgl/gl/vertex_attribute_gl.cpp +++ b/src/mbgl/gl/vertex_attribute_gl.cpp @@ -169,7 +169,7 @@ const std::vector& VertexAttributeGL::getRaw(gfx::VertexAttribute& for (std::size_t i = 0; i < count; ++i) { if (!get(attr.get(i), type, outPtr)) { // missing type conversion - assert(false); + std::fill(outPtr, outPtr + stride_, 0); } outPtr += stride_; } From 1b87543af3f766a09115362372b9104f763ae6e5 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Mon, 9 Dec 2024 03:26:41 +0100 Subject: [PATCH 012/339] Fix link to getting started guide (#3071) Co-authored-by: Bart Louwers --- README.md | 2 +- platform/android/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8fa6c7a213af..0daf7868cf43 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ class MainActivity : AppCompatActivity() { ``` -For more information, refer to the [Android API Documentation](https://maplibre.org/maplibre-native/android/api/), [Android Examples Documentation](https://maplibre.org/maplibre-native/docs/book/android/getting-started-guide.html) or the [MapLibre Native Android `README.md`](platform/android/README.md). +For more information, refer to the [Android API Documentation](https://maplibre.org/maplibre-native/android/api/), [Android Examples Documentation](https://maplibre.org/maplibre-native/android/examples/getting-started/) or the [MapLibre Native Android `README.md`](platform/android/README.md). ## iOS diff --git a/platform/android/README.md b/platform/android/README.md index 49e458096477..a68bd7ced969 100644 --- a/platform/android/README.md +++ b/platform/android/README.md @@ -6,7 +6,7 @@ MapLibre Native for Android is a library for embedding interactive map views wit ## Getting Started -Visit [https://maplibre.org/maplibre-native/docs/book/android/getting-started-guide.html](https://maplibre.org/maplibre-native/docs/book/android/getting-started-guide.html) to view the Getting Started Guide for MapLibre Native for Android. +Visit [https://maplibre.org/maplibre-native/android/examples/getting-started/](https://maplibre.org/maplibre-native/android/examples/getting-started/) to view the Getting Started Guide for MapLibre Native for Android. ## Documentation From 2f13366905a6f0d0aae47750257a5fd197004c94 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Dec 2024 17:49:21 +0100 Subject: [PATCH 013/339] Use MapLibre Android as attribution string across languages (#3080) Co-authored-by: Ian Wagner --- .../MapLibreAndroid/src/main/res/values-bg/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-ca/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-cs/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-es/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-fr/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-gl/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-he/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-hu/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-iw/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-ko/strings.xml | 8 ++++---- .../MapLibreAndroid/src/main/res/values-lt/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-nl/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-pl/strings.xml | 2 +- .../src/main/res/values-pt-rPT/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-ru/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-sv/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-uk/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-vi/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 2 +- .../src/main/res/values-zh-rHK/strings.xml | 2 +- .../src/main/res/values-zh-rTW/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values/strings.xml | 2 +- 22 files changed, 25 insertions(+), 25 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/res/values-bg/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-bg/strings.xml index ab1818f4f06b..dfdefd7dd231 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-bg/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-bg/strings.xml @@ -4,7 +4,7 @@ Иконка функции. Активирай, за да покажеш диалог функции. Изглед локация. Това показва местоположението ти на картата. Показва карта създадена с MapLibre. Скролни с два пръста. Мащабирай с два пръста. - MapLibre Android SDK + MapLibre Android Предоставените OfflineRegionDefinition не пасват в границите на света: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-ca/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-ca/strings.xml index e0e4e250a210..34f4c081a4d3 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-ca/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-ca/strings.xml @@ -4,7 +4,7 @@ Icona d’atribució. Activa per mostrar el diàleg de l’atribució. Vista de posició. Mostra la teva posició al mapa. Mostrant un mapa creat amb MapLibre. Desplaça’t arrossegant amb dos dits. Fes zoom pessigant amb dos dits. - MapLibre Android SDK + MapLibre Android La OfflineRegionDefinition proporcionada no encaixa amb els límits del món: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-cs/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-cs/strings.xml index e9b2978f7751..682fc8f85076 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-cs/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-cs/strings.xml @@ -4,7 +4,7 @@ Atributy. Zobrazit nastavení atributů. Zobrazení polohy. Zobrazit umístění na mapě. Zobrazení mapy vytvořené s MapLibre. Posunout tažením dvěma prsty. Změnit velikost roztažením dvou prstů. - MapLibre Maps SDK pro Android + MapLibre Android Na zařízení není nainstalován webový prohlížeč, webovou stránku nelze zobrazit. Pokud OfflineRegionDefinition neodpovídá hranicím: %s \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/res/values-es/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-es/strings.xml index a5f148553a84..c5f211108a10 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-es/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-es/strings.xml @@ -4,7 +4,7 @@ Ícono de atribución. Actívalo para mostrar el diálogo de atribución. Vista de ubicación. Muestra tu ubicación en el mapa. Se está mostrando un mapa creado con MapLibre. Arrastra dos dedos para desplazarte o pellizca para acercar. - MapLibre Maps SDK para Android + MapLibre Android No puede abrir la página Web porque no hay un navegador Web en el dispositivo. El parámetro OfflineRegionDefinition que se ingresó no coincide con los límites mundiales: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-fr/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-fr/strings.xml index 18d0933a3811..d36c445440f1 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-fr/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-fr/strings.xml @@ -4,7 +4,7 @@ Icône d’attribution. Activer pour afficher le dialogue d’attribution. Vue de géolocalisation. Ceci affiche votre localisation sur la carte. Affichage d’une carte créée avec MapLibre. Faites la glisser en traînant deux doigts. Zoomez ou dézoomez en écartant ou rapprochant deux doigts. - SDK MapLibre Maps pour Android + MapLibre Android Aucun navigateur web installé sur l’appareil, impossible d’ouvrir une page web. Le cadre OfflineRegionDefinition pour définir la région de navigation ne tient pas dans les limites du monde : %s \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/res/values-gl/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-gl/strings.xml index 94e9c0e22b93..5229b08e07b1 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-gl/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-gl/strings.xml @@ -4,7 +4,7 @@ Icona de atribución. Actívaa para amosar o diálogo de atribución. Vista de ubicación. Amosa a túa ubicación no mapa. Estase a amosar un mapa feito co MapLibre. Belisca dous dedos para desprazarte ou belisca para achegar. - MapLibre Maps SDK para o Android + MapLibre Android Non podes abrir a páxina web porque non hai un navegador web no dispositivo. O parámetro OfflineRegionDefinition que se ingresou non coincide cos límites mundiais: %s \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/res/values-he/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-he/strings.xml index 1a1017456e3a..cbd763af03b4 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-he/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-he/strings.xml @@ -4,7 +4,7 @@ סמל שיוך. הפעל כדי להציג תיבת דו-שיח של שיוך. סמן מיקום. מציג את המיקום הנוכחי שלך על המפה. מציג מפה שנוצרה עם MapLibre. גלול באמצעות גרירה עם שתי אצבעות, זום באמצעות צביטה עם שתי אצבעות. - MapLibre Maps SDK for Android + MapLibre Android לא מותקן דפדפן אינטרנט במכשיר, לא ניתן לפתוח את דף האינטרנט. בתנאי ש- OfflineRegionDefinition אינו מתאים לגבולות העולם: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-hu/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-hu/strings.xml index 6bfa6eb0de77..d7945d6d1bfb 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-hu/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-hu/strings.xml @@ -2,7 +2,7 @@ Hely nézet. Megmutatja, hol vagy a térképen. Egy MapLibre-szal készült térkép megjelenítése. Húzd két ujjadat a görgetéshez. Csippentsd össze a nagyításhoz. - MapLibre Maps SDK Androidhoz + MapLibre Android Nincs webböngésző telepítve a készüléken, nem lehet megnyitni weboldalt. A megadott OfflineRegionDefinition nem fér bele a világ kereteibe: %s \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/res/values-iw/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-iw/strings.xml index 1a1017456e3a..cbd763af03b4 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-iw/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-iw/strings.xml @@ -4,7 +4,7 @@ סמל שיוך. הפעל כדי להציג תיבת דו-שיח של שיוך. סמן מיקום. מציג את המיקום הנוכחי שלך על המפה. מציג מפה שנוצרה עם MapLibre. גלול באמצעות גרירה עם שתי אצבעות, זום באמצעות צביטה עם שתי אצבעות. - MapLibre Maps SDK for Android + MapLibre Android לא מותקן דפדפן אינטרנט במכשיר, לא ניתן לפתוח את דף האינטרנט. בתנאי ש- OfflineRegionDefinition אינו מתאים לגבולות העולם: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-ko/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-ko/strings.xml index 3e86536813aa..59700a671368 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-ko/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-ko/strings.xml @@ -1,10 +1,10 @@ - 지도 나침반. 지도회전를 북쪽으로 재설정합니다. + 지도 나침반. 지도회전을 북쪽으로 재설정합니다. 속성 정보. 속성 대화를 표시합니다. 로케이션 뷰. 지도에서 현재 위치를 보여줍니다. - 맵박스로 생성된 지도 표시. 두 손가락으로 드래그하여 화면을 위 아래로 움직이세요. 두 손가락을 이용해 화면을 확대 축소 하세요. - 안드로이드를 위한 맵박스 맵 SDK - 웹 브라우저가 설치 되어 있지 않아, 웹 페이지를 열 수 없습니다. + MapLibre로 생성된 지도 표시. 두 손가락으로 드래그하여 화면을 위 아래로 움직이세요. 두 손가락을 이용해 화면을 확대 축소 하세요. + MapLibre Android + 웹 브라우저가 설치 되어 있지 않아서 웹 페이지를 열 수 없습니다. 제공된 오프라인지역정의가 월드바운즈에 적합하지 않습니다: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-lt/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-lt/strings.xml index 042fa1e47945..e9ebad99641f 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-lt/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-lt/strings.xml @@ -4,7 +4,7 @@ Įnašo ikona. Paspausk norėdamas pamatyti dialogą su detalėmis Vartotojo vietos vaizdas. Nurodo tavo poziciją žemėlapyje Rodomas MapLibre kurtas žemėlapis. Naviguok tempdamas du pirštus. Valdyk žemėlapio pritraukimą suimdamas/atitolindamas du pirštus. - MapLibre Android SDK + MapLibre Android Pasirinktas OfflineRegionDefinition netalpa į rėžius: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-nl/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-nl/strings.xml index 4bda0d7fc4ca..8f38c2ffe40b 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-nl/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-nl/strings.xml @@ -4,7 +4,7 @@ Attributie icoon. Activeer voor het tonen van het attributie dialoog. Locatie Element. Dit toont jouw locatie op de map. Toont een map gemaakt met MapLibre. Scroll door het slepen met twee vingers. Zoom door vingers te nijpen. - MapLibre Android SDK + MapLibre Android Aangeleverde OfflineRegionDefinition past niet in de wereld omtrek: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-pl/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-pl/strings.xml index 8596defccbf5..1c6e426f8a49 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-pl/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-pl/strings.xml @@ -4,7 +4,7 @@ Atrybucja. Aktywuj, żeby pokazać więcej informacji. Widok lokalizacji. Pokazuje twoją pozycję na mapie. Pokazuje mapę stworzoną za pomocą biblioteki MapLibre. Przesuń mapę za pomocą przeciągnięcia dwoma palcami. Przybliż za pomocą uszczypnięcia dwoma palcami. - MapLibre Maps SDK dla Androida + MapLibre Android Nie potrafię otworzyć strony, brak przeglądarki internetowej zainstalowanej na urządzeniu. Wymagany region nie mieści się w granicach świata: %s \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/res/values-pt-rPT/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-pt-rPT/strings.xml index 1e4a91445241..294b562f1da3 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-pt-rPT/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-pt-rPT/strings.xml @@ -4,7 +4,7 @@ Ícone de atribuição. Ativar para mostrar a janela de atribuição. Vista de localização. Isto mostra a sua localização no mapa. A mostrar um Mapa criado com MapLibre. Desloque arrastanto com 2 dedos. Zoom afastando ou aproximando os 2 dedos. - Mapas MapLibre SDK para Android + MapLibre Android Não está nenhum navegador de Internet instalado no dispositivo. Não é possível abrir a página web. O OfflineRegionDefinition não cabe nos limites do mundo: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-ru/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-ru/strings.xml index d60dbb14ee7f..38fa2e908d57 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-ru/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-ru/strings.xml @@ -4,7 +4,7 @@ Значок атрибутов. Активируйте, чтобы показать диалог. Местоположение. Отображает вашу позицию на карте. Отображает карту, созданную при помощи MapLibre. Пролистывайте двумя пальцами. Меняйте масштаб сведением пальцев. - MapLibre Maps SDK для Android + MapLibre Android На устройстве нет веб-браузера, нельзя показать веб-страницу. Запрошенный OfflineRegionDefinition не входит в допустимые границы: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-sv/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-sv/strings.xml index 7f25c919b907..85d008f147c6 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-sv/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-sv/strings.xml @@ -4,7 +4,7 @@ Tillskrivningsikon. Aktivera för att visa tillskrivningsdialog. Positionsvy. Denna visar din position på kartan. Visar en karta skapad med MapLibre. Scrolla genom att dra med två fingrar. Zooma genom att nypa med två fingrar. - MapLibre Maps SDK for Android + MapLibre Android Ingen webbläsare installerad på enheten. Kan inte visa sidan. Försedd OfflineRegionDefinition passar inte världens gränser: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-uk/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-uk/strings.xml index e49faa844873..c2e52eee257f 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-uk/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-uk/strings.xml @@ -4,7 +4,7 @@ Значок атрибуції. Натисніть, щоб показати діалог атрибуції. Визначення положення. Показує ваше місцеположення на мапі. Показує мапи створені за допомоги MapLibre. Пересувайте мапу двома пальцями. Змінюйте масштаб стуляючи/розводячи два пальці. - MapLibre Maps SDK для Android + MapLibre Android Веб-оглядач відсутній на цьому пристрої, неможливо відкрити веб-сторінку Межі ділянки для оффлайнового користування даними за межами світу: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-vi/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-vi/strings.xml index 17c29537c7bd..90d76c58a4d2 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-vi/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-vi/strings.xml @@ -4,7 +4,7 @@ Biểu tượng ghi công. Kích hoạt để xem hộp thoại ghi công. Cái chỉ vị trí. Cái này chỉ vị trí của bạn trên bản đồ. Đang xem bản đồ được xây dựng dùng MapLibre. Kéo hai ngón tay để cuộn. Chụm các ngón tay lại để phóng to. Tách các ngón tay ra để thu nhỏ. - MapLibre Maps SDK cho Android + MapLibre Android Không thể mở trang Web vì thiết bị thiếu trình duyệt. OfflineRegionDefinition được cung cấp không vừa thế giới: %s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-zh-rCN/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-zh-rCN/strings.xml index 5a5a53ca3b1b..f07ab5c3098d 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-zh-rCN/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-zh-rCN/strings.xml @@ -4,7 +4,7 @@ Attribution图标,点击以显示attribution对话框。 定位视图,在地图上显示当前位置。 显示由MapLibre创建的地图,通过拖动两个手指来滚动,捏两个手指来放大。 - MapLibre Maps SDK for Android + MapLibre Android 设备中未安装任何浏览器,不能打开该网页 提供的OfflineRegionDefinition不符合标准地理范围:%s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-zh-rHK/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-zh-rHK/strings.xml index d3b9659f7d02..0c4ba3041cc2 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-zh-rHK/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-zh-rHK/strings.xml @@ -4,7 +4,7 @@ Attribution圖標,點擊以顯示attribution對話框。 定位視圖,在地圖上顯示當前位置。 顯示由MapLibre創建的地圖,通過拖動兩個手指來滾動,捏兩個手指來放大。 - MapLibre Maps SDK for Android + MapLibre Android 設備中未安裝任何瀏覽器,不能打開該網頁 提供的OfflineRegionDefinition不符合標準地理範圍:%s diff --git a/platform/android/MapLibreAndroid/src/main/res/values-zh-rTW/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values-zh-rTW/strings.xml index d3b9659f7d02..0c4ba3041cc2 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values-zh-rTW/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values-zh-rTW/strings.xml @@ -4,7 +4,7 @@ Attribution圖標,點擊以顯示attribution對話框。 定位視圖,在地圖上顯示當前位置。 顯示由MapLibre創建的地圖,通過拖動兩個手指來滾動,捏兩個手指來放大。 - MapLibre Maps SDK for Android + MapLibre Android 設備中未安裝任何瀏覽器,不能打開該網頁 提供的OfflineRegionDefinition不符合標準地理範圍:%s diff --git a/platform/android/MapLibreAndroid/src/main/res/values/strings.xml b/platform/android/MapLibreAndroid/src/main/res/values/strings.xml index c46c01795a27..e8154eb68599 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values/strings.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values/strings.xml @@ -4,7 +4,7 @@ Attribution icon. Activate to show attribution dialog. Location View. This shows your location on the map. Showing a Map created with MapLibre. Scroll by dragging two fingers. Zoom by pinching two fingers. - MapLibre Maps SDK for Android + MapLibre Android No web browser installed on device, can\'t open web page. Provided OfflineRegionDefinition doesn\'t fit the world bounds: %s From 780b736aeff94ca70209d9e5598f9adc822063b2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Dec 2024 20:09:04 +0100 Subject: [PATCH 014/339] Prepare Android release workflow for Vulkan release (#3081) --- .github/workflows/android-release.yml | 56 +++++++++---------- platform/android/Makefile | 6 +- .../maplibre.artifact-settings.gradle.kts | 4 +- .../kotlin/maplibre.gradle-publish.gradle.kts | 42 ++++++++++---- 4 files changed, 66 insertions(+), 42 deletions(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 6fa39007aa2f..8bcab6cd79ec 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -2,15 +2,6 @@ name: android-release on: workflow_dispatch: - inputs: - renderer: - description: "Select renderering backend" - required: true - default: "OpenGL" - type: choice - options: - - OpenGL - - Vulkan jobs: build: @@ -28,15 +19,6 @@ jobs: submodules: recursive fetch-depth: 0 - - name: Map renderer input - id: backend_lowercase - run: | - if [ "${{ github.event.inputs.renderer }}" = "OpenGL" ]; then - echo "backend_lowercase=drawable" >> "$GITHUB_ENV" - elif [ "${{ github.event.inputs.renderer }}" = "Vulkan" ]; then - echo "backend_lowercase=vulkan" >> "$GITHUB_ENV" - fi - - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties - uses: actions/setup-java@v4 @@ -74,9 +56,9 @@ jobs: shell: bash - name: Build package - run: make apackage - env: - RENDERER: ${{ env.backend_lowercase }} + run: | + RENDERER=vulkan make apackage + RENDERER=opengl make apackage - name: Build release Test App run: | @@ -123,25 +105,44 @@ jobs: draft: false prerelease: ${{ env.prerelease }} - - name: Upload aar - id: upload-release-asset + - name: Upload aar (OpenGL) uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-${{ env.backend_lowercase }}-release.aar + asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-drawable-release.aar asset_name: MapLibreAndroid-release.aar asset_content_type: application/zip - - name: Upload debug symbols + - name: Upload aar (Vulkan) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-vulkan-release.aar + asset_name: MapLibreAndroid-release-vulkan.aar + asset_content_type: application/zip + + - name: Upload debug symbols (OpenGL) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: platform/android/build/debug-symbols-opengl.tar.gz + asset_name: debug-symbols-maplibre-android-opengl-${{ steps.prepare_release.outputs.version_tag }}.tar.gz + asset_content_type: application/gzip + + - name: Upload debug symbols (Vulkan) uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/build/debug-symbols.tar.gz - asset_name: debug-symbols.tar.gz + asset_path: platform/android/build/debug-symbols-vulkan.tar.gz + asset_name: debug-symbols-maplibre-android-vulkan-${{ steps.prepare_release.outputs.version_tag }}.tar.gz asset_content_type: application/gzip - name: Clean release @@ -164,4 +165,3 @@ jobs: SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} - RENDERER: ${{ env.backend_lowercase }} diff --git a/platform/android/Makefile b/platform/android/Makefile index c1621751f82c..8b1a85738e8c 100644 --- a/platform/android/Makefile +++ b/platform/android/Makefile @@ -223,6 +223,8 @@ run-android-unit-test: run-android-unit-test-%: $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testLegacyDebugUnitTest --info --tests "$*" +DEBUG_TAR_FILE_NAME := $(if $(findstring drawable,$(RENDERER)),debug-symbols-opengl.tar.gz,debug-symbols-$(RENDERER).tar.gz) + # Builds a release package and .tar.gz with debug symbols of the Android SDK .PHONY: apackage apackage: @@ -230,7 +232,7 @@ apackage: make android-lib-arm-v7 && make android-lib-arm-v8 && make android-lib-x86 && make android-lib-x86-64 $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=all assemble$(RENDERER)$(BUILDTYPE) mkdir -p build - tar -czvf build/debug-symbols.tar.gz -C MapLibreAndroid/build/intermediates/library_jni/*/*JniLibsProjectOnly/jni . + tar -czvf build/$(DEBUG_TAR_FILE_NAME) -C MapLibreAndroid/build/intermediates/library_jni/$(RENDERER)Release/*JniLibsProjectOnly/jni . # Build test app instrumentation tests apk and test app apk for all abi's .PHONY: android-ui-test @@ -245,7 +247,7 @@ run-android-test-app-center: # Uploads the compiled Android SDK to Maven Central Staging .PHONY: run-android-publish run-android-publish: - $(MLN_ANDROID_GRADLE_SINGLE_JOB)-Pmaplibre.abis=all :MapLibreAndroid:publishReleasePublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository + $(MLN_ANDROID_GRADLE_SINGLE_JOB)-Pmaplibre.abis=all :MapLibreAndroid:publishAllPublicationsToSonatypeRepository closeAndReleaseSonatypeStagingRepository # Dump system graphics information for the test app .PHONY: android-gfxinfo diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts index 917845263356..20ef7345923d 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts @@ -1,7 +1,7 @@ extra["mapLibreArtifactGroupId"] = "org.maplibre.gl" extra["mapLibreArtifactId"] = "android-sdk" -extra["mapLibreArtifactTitle"] = "MapLibre Maps SDK for Android" -extra["mapLibreArtifactDescription"] = "MapLibre Maps SDK for Android" +extra["mapLibreArtifactTitle"] = "MapLibre Android" +extra["mapLibreArtifactDescription"] = "MapLibre Android" extra["mapLibreDeveloperName"] = "MapLibre" extra["mapLibreDeveloperId"] = "maplibre" extra["mapLibreArtifactUrl"] = "https://github.com/maplibre/maplibre-native" diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts index aff14ef59833..3058a4232f37 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts @@ -1,4 +1,5 @@ import org.gradle.kotlin.dsl.get +import java.util.Locale plugins { `maven-publish` @@ -43,20 +44,24 @@ project.logger.lifecycle(project.extra["versionName"].toString()) version = project.extra["versionName"] as String group = project.extra["mapLibreArtifactGroupId"] as String -afterEvaluate { +fun configureMavenPublication( + renderer: String, + publicationName: String, + artifactIdPostfix: String, + descriptionPostfix: String, +) { publishing { publications { - create("release") { - groupId = this@afterEvaluate.group.toString() - artifactId = project.extra["mapLibreArtifactId"].toString() - version = this@afterEvaluate.version.toString() + create(publicationName) { + groupId = project.group.toString() + artifactId = "${project.extra["mapLibreArtifactId"]}$artifactIdPostfix" + version = project.version.toString() - // Conditional component selection based on environment variable - from(components[if (System.getenv("RENDERER")?.lowercase() == "vulkan") "vulkanRelease" else "drawableRelease"]) + from(components["${renderer}Release"]) pom { - name.set(project.extra["mapLibreArtifactTitle"].toString()) - description.set(project.extra["mapLibreArtifactTitle"].toString()) + name.set("${project.extra["mapLibreArtifactTitle"]}$descriptionPostfix") + description.set("${project.extra["mapLibreArtifactTitle"]}$descriptionPostfix") url.set(project.extra["mapLibreArtifactUrl"].toString()) licenses { license { @@ -68,7 +73,7 @@ afterEvaluate { developer { id.set(project.extra["mapLibreDeveloperId"].toString()) name.set(project.extra["mapLibreDeveloperName"].toString()) - email.set("maplibre@maplibre.org") + email.set("team@maplibre.org") } } scm { @@ -80,7 +85,24 @@ afterEvaluate { } } } +} + +// workaround for https://github.com/gradle/gradle/issues/26091#issuecomment-1836156762 +// https://github.com/gradle-nexus/publish-plugin/issues/208 +tasks { + withType { + dependsOn(withType()) + } +} + +afterEvaluate { + configureMavenPublication("drawable", "opengl", "", "") + configureMavenPublication("vulkan", "vulkan", "-vulkan", "(Vulkan)") + // Right now this is the same as the first, but in the future we might release a major version + // which defaults to Vulkan (or has support for multiple backends). We will keep using only + // OpenGL ES with this artifact ID if that happens. + configureMavenPublication("drawable", "opengl2", "-opengl", " (OpenGL ES)") } From 66e0037cf88388d2ad66764d80edc1a9be13d771 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Dec 2024 22:51:40 +0100 Subject: [PATCH 015/339] Prepare for official MapLibre Android + Vulkan release (#3086) --- platform/android/CHANGELOG.md | 21 ++++++++++++++++++- .../android/MapLibreAndroid/gradle.properties | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 0c26f69f5cf5..2884391bf55d 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,11 +1,30 @@ # Changelog MapLibre Native for Android -## main +## 11.7.0 + +This release marks the official release of MapLibre Android with Vulkan support. [Vulkan](https://www.vulkan.org) is a modern graphics API which brings advantages such as improved performance, improved observability and better stability. Specifically, starting with this version we are releasing multiple versions of MapLibre Android: + +- `org.maplibre.gl:android-sdk` (still OpenGL ES for now, might default to another rendering backend or might choose depending on device support in a future major release). +- `org.maplibre.gl:android-sdk-opengl` (OpenGL ES). +- `org.maplibre.gl:android-sdk-vulkan` (Vulkan). + +Stability has proven to be excellent, but there are a few [known issues with Vulkan](https://github.com/maplibre/maplibre-native/issues?q=is%3Aissue%20state%3Aopen%20label%3AVulkan%20type%3ABug) that will be addressed in a future update. + +Currently it is not possible to choose a backend at runtime. If you care about supporting devices that only support OpenGL ES and you want to use Vulkan, you will need to produce and ship [multiple APKs](https://developer.android.com/google/play/publishing/multiple-apks). Please see [this issue](https://github.com/maplibre/maplibre-native/issues/3079) if you are interested in choosing a rendering backend during initialization. + +Thanks to everyone who helped test the pre-releases! ### ✨ Features and improvements +- Fix the issue that the empty polyline cannot be updated ([#3046](https://github.com/maplibre/maplibre-native/pull/3046)). +- feat: add `getZoom` and `setZoom` function support for Android Auto ([#3037](https://github.com/maplibre/maplibre-native/pull/3037)). +- Use MapLibre Android as attribution string across languages ([#3080](https://github.com/maplibre/maplibre-native/pull/3080)). +- Use CMake 3.24.0+ for Android ([#3065](https://github.com/maplibre/maplibre-native/pull/3065)). + ### 🐞 Bug fixes +- Fix crash on unsupported attribute type conversion ([#3066](https://github.com/maplibre/maplibre-native/pull/3066)). + ## 11.6.1 ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index d993d913a918..081f5a9742c3 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.6.1 +VERSION_NAME=11.7.0 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 From 72d2c70130fcd4e320cf623f9bec811108b6e201 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 12 Dec 2024 00:30:55 +0100 Subject: [PATCH 016/339] Fix issue in android-release.yml (#3087) --- .github/workflows/android-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 8bcab6cd79ec..02fb0f71c7ba 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -58,7 +58,7 @@ jobs: - name: Build package run: | RENDERER=vulkan make apackage - RENDERER=opengl make apackage + RENDERER=drawable make apackage - name: Build release Test App run: | From 12f596ce7dfeabd22e9360707fbf95928e8bedaa Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Fri, 13 Dec 2024 10:21:48 -0800 Subject: [PATCH 017/339] Batch up scheduling of deferred deletions (#3030) --- src/mbgl/renderer/tile_pyramid.cpp | 3 ++ src/mbgl/tile/tile_cache.cpp | 56 ++++++++++++++++++++++++------ src/mbgl/tile/tile_cache.hpp | 16 ++++----- src/mbgl/vulkan/context.cpp | 2 +- src/mbgl/vulkan/descriptor_set.cpp | 12 ++++--- 5 files changed, 62 insertions(+), 27 deletions(-) diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 4533e6f7549b..3e79657b5bf6 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -82,6 +82,7 @@ void TilePyramid::update(const std::vector>& l tiles.clear(); renderedTiles.clear(); + cache.deferPendingReleases(); return; } @@ -279,6 +280,8 @@ void TilePyramid::update(const std::vector>& l tile.usedByRenderedLayers |= tile.layerPropertiesUpdated(layerProperties); } } + + cache.deferPendingReleases(); } void TilePyramid::handleWrapJump(float lng) { diff --git a/src/mbgl/tile/tile_cache.cpp b/src/mbgl/tile/tile_cache.cpp index 2bbde03a82b3..5104c3ea6ef3 100644 --- a/src/mbgl/tile/tile_cache.cpp +++ b/src/mbgl/tile/tile_cache.cpp @@ -1,10 +1,22 @@ #include + #include #include + #include namespace mbgl { +TileCache::~TileCache() { + MLN_TRACE_FUNC(); + + clear(); + pendingReleases.clear(); + + std::unique_lock counterLock{deferredSignalLock}; + deferredSignal.wait(counterLock, [&]() { return deferredDeletionsPending == 0; }); +} + void TileCache::setSize(size_t size_) { MLN_TRACE_FUNC(); @@ -26,16 +38,20 @@ void TileCache::setSize(size_t size_) { } namespace { - /// This exists solely to prevent a problem where temporary lambda captures /// are retained for the duration of the scope instead of being destroyed immediately. -template struct CaptureWrapper { - CaptureWrapper(std::unique_ptr&& item_) - : item(std::move(item_)) {} + CaptureWrapper(std::vector>&& items_) + : items(items_.size()) { + std::ranges::move(items_, items.begin()); + } + CaptureWrapper(CaptureWrapper&&) = default; + + /// This copy constructor is required to build, but doesn't seem to be called. CaptureWrapper(const CaptureWrapper& other) - : item(other.item) {} - std::shared_ptr item; + : items(other.items) {} + + std::vector> items; }; } // namespace @@ -43,6 +59,25 @@ void TileCache::deferredRelease(std::unique_ptr&& tile) { MLN_TRACE_FUNC(); tile->cancel(); + pendingReleases.push_back(std::move(tile)); +} + +void TileCache::deferPendingReleases() { + MLN_TRACE_FUNC(); + + constexpr std::size_t scheduleThreshold = 1; + if (pendingReleases.size() < scheduleThreshold) { + return; + } + + // Block destruction until the cleanup task is complete + { + std::lock_guard counterLock{deferredSignalLock}; + deferredDeletionsPending++; + } + + CaptureWrapper wrap{std::move(pendingReleases)}; + pendingReleases.clear(); // The `std::function` must be created in a separate statement from the `schedule` call. // Creating a `std::function` from a lambda involves a copy, which is why we must use @@ -51,17 +86,16 @@ void TileCache::deferredRelease(std::unique_ptr&& tile) { // If this temporary outlives the `schedule` call, and the function is executed immediately // by a waiting thread and is already complete, that temporary reference ends up being the // last one and the destruction actually occurs here on this thread. - std::function func{[tile_{CaptureWrapper{std::move(tile)}}, this]() mutable { - tile_.item = {}; + std::function func{[tile_{CaptureWrapper{std::move(wrap)}}, this]() mutable { + MLN_TRACE_ZONE(deferPendingReleases lambda); + MLN_ZONE_VALUE(wrap_.releases.size()); + tile_.items.clear(); std::lock_guard counterLock(deferredSignalLock); deferredDeletionsPending--; deferredSignal.notify_all(); }}; - std::unique_lock counterLock(deferredSignalLock); - deferredDeletionsPending++; - threadPool.schedule(std::move(func)); } diff --git a/src/mbgl/tile/tile_cache.hpp b/src/mbgl/tile/tile_cache.hpp index db9f8658c465..fea185a32ba9 100644 --- a/src/mbgl/tile/tile_cache.hpp +++ b/src/mbgl/tile/tile_cache.hpp @@ -18,15 +18,7 @@ class TileCache { TileCache(const TaggedScheduler& threadPool_, size_t size_ = 0) : threadPool(threadPool_), size(size_) {} - - ~TileCache() { - clear(); - - std::unique_lock counterLock(deferredSignalLock); - while (deferredDeletionsPending != 0) { - deferredSignal.wait(counterLock); - } - } + ~TileCache(); /// Change the maximum size of the cache. void setSize(size_t); @@ -43,13 +35,17 @@ class TileCache { bool has(const OverscaledTileID& key); void clear(); - /// Destroy a tile without blocking + /// Set aside a tile to be destroyed later, without blocking void deferredRelease(std::unique_ptr&&); + /// Schedule any accumulated deferred tiles to be destroyed + void deferPendingReleases(); + private: std::map> tiles; std::list orderedKeys; TaggedScheduler threadPool; + std::vector> pendingReleases; size_t deferredDeletionsPending{0}; std::mutex deferredSignalLock; std::condition_variable deferredSignal; diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 9f54ebed28bb..e3055c4054fb 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -596,7 +596,7 @@ void Context::buildUniformDescriptorSetLayout(vk::UniqueDescriptorSetLayout& lay for (size_t i = 0; i < uniformCount; ++i) { bindings.push_back(vk::DescriptorSetLayoutBinding() - .setBinding(i) + .setBinding(static_cast(i)) .setStageFlags(stageFlags) .setDescriptorType(vk::DescriptorType::eUniformBuffer) .setDescriptorCount(1)); diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index d8d6866e5e77..f27f0a23c3eb 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -50,7 +50,7 @@ void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(poolFlags).setPoolSizes(size).setMaxSets(maxSets); growablePool.pools.emplace_back(device->createDescriptorPoolUnique(descriptorPoolInfo), maxSets); - growablePool.currentPoolIndex = growablePool.pools.size() - 1; + growablePool.currentPoolIndex = static_cast(growablePool.pools.size() - 1); }; void DescriptorSet::allocate() { @@ -73,7 +73,8 @@ void DescriptorSet::allocate() { growablePool.pools.begin(), growablePool.pools.end(), [&](const auto& p) { return !p.unusedSets.empty(); }); if (unusedPoolIt != growablePool.pools.end()) { - growablePool.currentPoolIndex = std::distance(growablePool.pools.begin(), unusedPoolIt); + growablePool.currentPoolIndex = static_cast( + std::distance(growablePool.pools.begin(), unusedPoolIt)); } else #endif { @@ -83,7 +84,8 @@ void DescriptorSet::allocate() { [&](const auto& p) { return p.remainingSets >= layouts.size(); }); if (freePoolIt != growablePool.pools.end()) { - growablePool.currentPoolIndex = std::distance(growablePool.pools.begin(), freePoolIt); + growablePool.currentPoolIndex = static_cast( + std::distance(growablePool.pools.begin(), freePoolIt)); } else { createDescriptorPool(growablePool); } @@ -161,7 +163,7 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, .setBufferInfo(descriptorBufferInfo) .setDescriptorCount(1) .setDescriptorType(vk::DescriptorType::eUniformBuffer) - .setDstBinding(index) + .setDstBinding(static_cast(index)) .setDstSet(descriptorSets[frameIndex]); device->updateDescriptorSets(writeDescriptorSet, nullptr); @@ -197,7 +199,7 @@ void ImageDescriptorSet::update(const std::array(id)) .setDstSet(descriptorSets[frameIndex]); device->updateDescriptorSets(writeDescriptorSet, nullptr); From b44b644e4ad219fbe797f1b6218283de84fccd63 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Fri, 13 Dec 2024 12:06:46 -0800 Subject: [PATCH 018/339] Remove `Pass3D` (#3077) --- .../layers/render_fill_extrusion_layer.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index bda207767e48..98f5f2267431 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -63,9 +63,8 @@ void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& para parameters.getCrossfadeParameters(), unevaluated.evaluate(parameters, previousProperties->evaluated)); - passes = (properties->evaluated.get() > 0) - ? (RenderPass::Translucent | RenderPass::Pass3D) - : RenderPass::None; + passes = (properties->evaluated.get() > 0) ? RenderPass::Translucent + : RenderPass::None; properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); @@ -304,15 +303,12 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - // `passes` is set to (RenderPass::Translucent | RenderPass::Pass3D), but `render()` - // only runs on the translucent pass, so although our output is 3D, it does not render - // in the "3D pass". constexpr auto drawPass = RenderPass::Translucent; stats.drawablesRemoved += tileLayerGroup->removeDrawablesIf([&](gfx::Drawable& drawable) { // If the render pass has changed or the tile has dropped out of the cover set, remove it. const auto& tileID = drawable.getTileID(); - if (!(drawable.getRenderPass() & passes) || (tileID && !hasRenderTile(*tileID))) { + if (!(drawable.getRenderPass() & drawPass) || (tileID && !hasRenderTile(*tileID))) { return true; } return false; @@ -337,7 +333,7 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, for (const RenderTile& tile : *renderTiles) { const auto& tileID = tile.getOverscaledTileID(); - const auto* optRenderData = getRenderDataForPass(tile, passes); + const auto* optRenderData = getRenderDataForPass(tile, drawPass); if (!optRenderData || !optRenderData->bucket || !optRenderData->bucket->hasData()) { removeTile(drawPass, tileID); continue; @@ -349,7 +345,7 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, const auto prevBucketID = getRenderTileBucketID(tileID); if (prevBucketID != util::SimpleIdentity::Empty && prevBucketID != bucket.getID()) { // This tile was previously set up from a different bucket, drop and re-create any drawables for it. - removeTile(passes, tileID); + removeTile(drawPass, tileID); } setRenderTileBucketID(tileID, bucket.getID()); From fa277052a9000dd07eb76fdc48d1280e1476bcd9 Mon Sep 17 00:00:00 2001 From: wangyingfang <132874950+wangyingfang@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:56:30 +0800 Subject: [PATCH 019/339] Add bold support for CJK characters (#3069) Co-authored-by: Yingfang Co-authored-by: Bart Louwers --- platform/darwin/src/local_glyph_rasterizer.mm | 31 +++++++- .../ping_fang_with_bold_in_style/expected.png | Bin 0 -> 17912 bytes test/text/local_glyph_rasterizer.test.cpp | 69 ++++++------------ 3 files changed, 48 insertions(+), 52 deletions(-) create mode 100644 test/fixtures/local_glyphs/ping_fang_with_bold_in_style/expected.png diff --git a/platform/darwin/src/local_glyph_rasterizer.mm b/platform/darwin/src/local_glyph_rasterizer.mm index 889b1daaadf9..eef0bc31d4cb 100644 --- a/platform/darwin/src/local_glyph_rasterizer.mm +++ b/platform/darwin/src/local_glyph_rasterizer.mm @@ -1,8 +1,11 @@ #include #include +#include #include #include +#include + #include #import @@ -191,16 +194,28 @@ CFDictionaryRefHandle attributes( @param font The font to apply to the codepoint. @param metrics Upon return, the metrics match the font’s metrics for the glyph representing the codepoint. + @param isBold use kCTFontBoldTrait if it is true. @returns An image containing the glyph. */ -PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, GlyphMetrics& metrics) { +PremultipliedImage drawGlyphBitmap(GlyphID glyphID, CTFontRef font, GlyphMetrics& metrics, BOOL isBold) { CFStringRefHandle string(CFStringCreateWithCharacters(NULL, reinterpret_cast(&glyphID), 1)); if (!string) { throw std::runtime_error("Unable to create string from codepoint"); } + // Create a bold variant of the font + CTFontRefHandle boldFont(CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait)); + if (!boldFont) { + CFStringRefHandle familyNameHandle(CTFontCopyFamilyName(font)); + NSString* familyName = (__bridge NSString *)(*familyNameHandle); + std::string stdFamilyName(familyName.UTF8String); + Log::Error(Event::General, "Unable to create bold font for " + stdFamilyName); + } + + CTFontRef drawFont = isBold && boldFont ? *boldFont : font; + CFStringRef keys[] = { kCTFontAttributeName }; - CFTypeRef values[] = { font }; + CFTypeRef values[] = { drawFont }; CFDictionaryRefHandle attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys, @@ -265,7 +280,7 @@ CGContextHandle context(CGBitmapContextCreate( CGContextSetTextPosition(*context, 0.0, descent); CTLineDraw(*line, *context); - + return rgbaBitmap; } @@ -288,8 +303,16 @@ CGContextHandle context(CGBitmapContextCreate( } manufacturedGlyph.id = glyphID; + BOOL isBold = NO; + // Only check the first font name to detect if the user prefers using bold + if (!fontStack.empty()) { + std::string lowercaseFont = platform::lowercase(fontStack.front()); + if (lowercaseFont.find("bold") != std::string::npos && lowercaseFont.find("semibold") == std::string::npos) { + isBold = YES; + } + } - PremultipliedImage rgbaBitmap = drawGlyphBitmap(glyphID, *font, manufacturedGlyph.metrics); + PremultipliedImage rgbaBitmap = drawGlyphBitmap(glyphID, *font, manufacturedGlyph.metrics, isBold); Size size(manufacturedGlyph.metrics.width, manufacturedGlyph.metrics.height); // Copy alpha values from RGBA bitmap into the AlphaImage output diff --git a/test/fixtures/local_glyphs/ping_fang_with_bold_in_style/expected.png b/test/fixtures/local_glyphs/ping_fang_with_bold_in_style/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..3de939b478752519d15009b0e599214f22765010 GIT binary patch literal 17912 zcmX7wbzD@>*T;94T1u8qNu|4+rBPB!KpIJr?p(SBB)=e~bb}z>DV>6JgLHR1m*4Z^ z4~E@)XXc(cXX4z?n+P=(d29?a3=jx}{YF7X9RvacMKB183jES{DzpHBWZT}zNNRd~ zJ6J?Ze5Eywb}Wmmt1piHyHEy&I4+tR^Q%lCwZ&`Z@LZI4GOy6T21R})?1+X$GD_m& z5+HSe0wIwf@r`>ac17B*GU|-pxr_oo?iVhLPeQIb7M7O9B};e9-cJI}*0L+;^(VdL zQ4;s7IIhdR@Z$q}|EB9ciN|+WpU<(Eeq51S#ag>Aw^y#_gi$j4-LF&4_>%kfZA(1e ztj(ImvOV6;wEgjA@$JfRU(yx5UI_v!QKN%q2R=Pswe{4sUX-n!^ifsZX?sPsJsj9a zEa=xQd3~ztKqV)*J8ZH)nap~usegLBo8)_&-n0F%CD5jOf4BTpey1HuCJAD5SoXal zbYJ#$U#uI~@YxnwX42NP&Ra9*@Ybz5_%%=TsjOD}q?5R{a@HdK^Td;V?X-4J<6ilP z`^&nvvO8_>z^teH?VeG;%b$(*W;?jZV-VnPiKxAbw$^K)8N;ixbFAjH&EyZ|9_Qoo zliN*ULfkAMO4C5*feYI`tPO4UR!XU$xfZQjE=zq$U=?ZNRo4%%pW*fV-!Zaog+ z$i2EsX}ixmoG14}2G@Z1IwGSnpni(%4Idq6O~MHKD4dl}GOwBoJkHXW^(h>?aeLm$ zztq~VoiU66!MZg&uUfBKOaoAe6ex$p@AftJTdtORw$kkl^&NW%U6x&rDHFtCBb&4x7|s(drOIq-_0gIxH4A*yfnQ3 z_h;1m<~73KQ8xqcTh(owPkMXk(`~stI* z^XC4q>yqa-;f#U10d1J7&l-LNh|+T-e$9;PPRDUXXnV?ca6M4v?7Toi%$g+YZebe_ zUG)CAtLJr!zIyYaYX!^Fai~D95?TPy7%+-vE2{pt8YhcKeszcQJLtC8q&yY`qn;zq zUx`-qy#D1)`ZqidvNze@{v==|zC9h}sJKh+>$zLHYBl{+s@pTudRa@*IeUEM(I=vA zfkfJGBYM>^s=TU_%@+vj?Kr4gHoRXWZY#Xwr^lADI6JfP11$YY@oAI8U+6QQT^sh( zzNJKy$3=;e!9L&{(pjh%Dho$mdu8u^fX|e(wgE@*tD001A#B>OR;&V?k(k)f!=&oC z6O*`Z!AWtkPNW73Awiok)$jyw-byCP9JDv>-Fa(@c53(z|f?PmPzBhwLhDurD zEwg@i2a{JgEVk#*u2vNHMlYd|$we1%rUZHFZ<1D2_bX^od^7q#XFazwCa=)+fM`Lw zKMs>n(spJJeEZnEEyhu_L2g%X5*gz@|G93B&E8WnGDCMj`h`%gj{n1jhC;h9rS?4# zUmV&WKG!C;qzXA(IPTE)-%4~luMkP_Hg()p6ZF8=it1K8vW_` z_qxJolVx(t|F@#y*J>e*rYSe%%xG%F3mPnvkQzLQ8ttF~{bS2NW&5`>4j0q!RnZ}g zLFF`8vCv=vhAbZ^X6RZE>#teUo}z+GJ$;7`lsAm`z^q|-b@1YKAV?T_P#X3v5;o}^ zzd2-dmNxV1M2XSi_Fq8(FGGg(>JTSB2y+C}Y?uc(>cEq`yKOyIqIK4;=|KG*>}bXR zaohi^<&TB`*kQu(Psm^wFp<2CL$PFSR?O3(ds|aIFh{5>tTKH!n$YZbbozj`!DSi94ey;?Ya$-NPTrY1rd@F{ji&VL)C1~h#(!=y;X8SnWQq=5Y zu>e{CHG*BzWx_^ydg85&QZ2}ID_RM(X1>8WlzrF+^i_Fn6X;xgYws`v2F7qWBK`9( zUB^yzhTxSMlt2(YqWL%<4{C}LIKT(i2msaJ%;-BSlWBh+5~#DHGhW4#vbgz2EcFfU z4uzzGrhb!Ga%s(35Dt{K-tIDC>x6caBDYu1$#kJ6FZ#08j7b$4<|r8!Kf$;Tq*^3! zXvV~VCZGn+UFB&(#S$0|%1&dFXnFNFOWsGyDUYC9>~ysyhzP}($~=?IpJ=4u_+ zX|1RpVk6Oq_hgk=Rc)I2y{{>UDg`*OS%9j-i@2R`Cloo9%UaWXmL4zb80w6YzD1cE ze2kZkyxB^xNcDfbnanb9I=DsM4HgdpBAd;V?J?SRRO0DA_ws4?ecRjJC$X!A1a-g7 zA-QZ3WUvxsLY2sjlr#FVPp=edU11lgpZNxYEX0BNM-7o(6V4pE{X3|C6cHNV^Z%O@OSka3_lfC#!0+>Y$^yMs4VaS|s z3Z+Mbc-eFgYiJ0&ERtaDAC_B+* zn@p;2Ot5gzc(QJW6qFq)2>^qk%ksUL16eZ?VWRs03%Kf}8&)|9>P}*bc0Ub5U#uY7 zEft|d$e0vXy|s@S)iy3ip7+j3M(K4&WNVV-=V~_6ZkJ3D>dQ7S;s1d`tsUrTk~se@aoakf{pWCY z@sw`EJAjt{0z(pHAa(e6Es;4Pzk2m~zrqkDlW3YV^w)oGGBeq9)D@UK zngoizopT-)%Q~)Ih5r5k4}+&vT5pVbf*P)6Y+`B!LI;BNs@l#IpWgQh zV{wA}k4L#ba>5X!QkvvMsY@El6~ztNRr{@Xht?~7n%@RFqk*{q&(v4T^;2n8@3#sj zbpAr8OwX-18CFoqAvRvMB7Ur4CL5v}?vwzK?W=9bAF;EzneH<8EG?Lxufa{l>gy3O z^c+1tZ1*atWJ|>qm$5~fk0a0VgX02!cKC$$v5eHXw zw)?|7n~Wp0e;BnCmiegdSx7CCuy*A3viC{7J?<-8&1WO&QXryaHQ7oC&tBeaZq07s zk9J$;43}Q>H>!B!nv;%sMce$}?legmH8`!VZofydGaFtMzt3Zq8NK+K^|1d9Nqm7k z5F+!gu7KO-dAxOA_wYFF^;&Pz5}5zGVHMsiRS)_Pwu?w4-D5U?lgleN-@7I^$-OcB z@_P>1*bri-?eU_hTbuMS+n7CP`Q|%u3*%zg+qYgJ2~olC6oz_P?}&n)^sJ0=9948HySu>IAz5#c}`yOR8C;_HV#R>|E4>vm1Q^nrNe zw7?zWU`1qOw^nB1LQ)NE@{-ox^mk;8~O#?jTGqgeRgL*iNu!bB|Cm)Ln>}^S6Mpvz5(x4FB`YnroKvIB z?=Y{zJ(ZGT7%5f;l0Sss#VCPT0aFh&o}DdS_X^}=tLpq5zt?Rw5S%6PQnDdjz}y8p6^!XYZs6K^&_XZ%t35_%2^S z-n`3NIZD+0gnD}9qVr-8T}}gA66A}liXdlc)h1)TB%-Z!Xh$PlVU=taEe5A4Uc@%Qm#IJR1pjewjyHJLp^$X&D{^P znF4k}bQ>Br#mdZE$L|(;%1`GK4;r@8J{jYCFz&Dxc9IGC`D>#gpdOIFU&+WrQ-jeb z>>e&bQ*!;F@B=aY&L49@z*ctB*@BT;%^;Z>nUCjp{ul$KMH&W=%@&SxwfsFmSG+N~ zS=Ug@V=<(l7r<}&x-3ZW1AI4r-j)Ylw)-!JpZA6 z9IymzIm0*!rUJ_%t(+EAma0g5+8R8H&WRPd{&(2pVA3&`wM ztncjNkfd|zap6m|r^gscPDd>c0qls>ThC@U&k5B~Zz+(%`Bz2uH?>a#DT|l}vPcQ{ z{@HavWN@8Q0KVI(>ZN?RJgz-uS5;fgubr}Ep?;Lzc%-AQEzw0!eol(Y|8qowQof-| z-rT6R*C<~GH!d;n)M)MF|JTu7+|4URH9dz+uB|+vc!tfTD9Zjv7Sb<8VTiU%4Z=?% zxH(SLR7%T(pVJ+0nziwGyb@;DV%fqEKx&bN!KsYL)oXM`FhuMTujxvQ>;~0bf#iCaIlB>rAJvav@D`@;NN_ou~c zZcRcfkOIYp7zr}?oRk~F3lj3MsiP&HLttCcX{)yWLxX*#tF51ZEGg4=9Cqw`nPPL0 z$3VDpEn-PpNJtV)48PVWE_Kzzjho6EQ-I3e@43sGQbV(k;+#czgA< z*xXx;ueAk82qw9bvR`^O}lc3P1<>ji>1jjWX8u8Y%M>~Kn(kCt+VHGUzOjAuA z$%ACx;>Vmrum(<@&;C)Xe{Td&D_CLv34@Wa27+t?EhyMI90ET3tp?~lEMP9H7B&u2 zf=)iGvHeny5q@C~Cy--8D|fbWn#4s`qia3OILf_sTch55i4MaQSag|eeX=WVlgiU( zI5{U%_Y!^4aQK*Mfp7JBzWW zZ=3G@2>rM4k$2@`?T8$+xXtO6PCjj@^u78uEkij!d|>R=H$xmONkM*z8KcJ0@B>K? zkogWW!7Xwq5@62IYW*O=#1_2e+$NV^(if(tz;60wqSI+Nd=<`-L!q04gF<;z+5JEb z`fljSjMvXeP5rs|W~b)=J9s;XiztWJfY;SSccEyKAU^oLi1XHvkXeUj3+`rO`!0EQoXAju{L0vnUyc!S zc7Ojjq@Z`-&gu3!7q@}UdCa(>bSO0|dBfc6zOEtS)ex2;^sbxEP}{```Pb!zhSEq)|v2bkjz@M)+w6=&88M_ z=c{IAuI)sueRCdpbB1<`1qp(C5EZ|0T_2~5iyrIR;eP!apOi2^e`O;a=Mp|LBk`!2V=@>nbM-Ug0&LlJHMw>uvdHqX(9yHQ+YQ83d_6NX92%NXXScV zn#M6ho(=C4@_4}88KSPyH7AQ^*gn1UM@v)E%yw=(n)_5CR?r#SZdHxLA-6kv^!1;^ ziQq0pDBiXI^H7{PGzotArtj9lwA~w{%C9{V79bcSFa6?E8T0s-Kya5UkcD#joH2}( z%aq7~j>|Qp_o<8*C3VD@C?_%h=(Pt19|Q;~V`z?rcx;DuRe@0!J?DQn0g?9S_fcmN zU%G|Xvg5k``gB4WdB`MU(d>%QwYcg3x zm|*YOZ%LSp^O`RDn^S{m;v)OtEkJ^Yd*j-u#iu;&=R4bcAT=Y<^LHX_Q!;H`vURy5 zYr*j&^`d;vj8mzE(X?T25RQ1N>6Iu;rA8rJWmVq2CO_USEI`xv;tm@4;t^{qmKs3= zSyf6eSAo+YlvAV3H?}V@c1UDki}gFGpWpVFcf^;p_L6;ig-6q$^dYeJkXfFc%6J0% z)EAe>lSDirl%Y*}JpRXoC&oCgAlJE~e}41JgM z_z*W^XvaHBf9{K07Yse5!HWJq*-vn2nF{KQdx>26X{*8+7`xEh%<}K`1H5^LBjLud zKu{=_p7jMp2U!8plOm-d{^^YDWv`UGhL~j#dABw039ZuV>mhWW@R(+7X@xjQb!w@r zn>{yaz#+|tE}pYitO%O1x9O+1Uehu?UDT&~zzisjYSWl9LMBqJn7Nd1Uh9ftLqxml z>g|@L%*IX}wjC)!u2pJZRWxnsO5fCfZyUv@e}CBiX^p1p)Onciz1McLWKQZ;=iR!N zat%+SK=1q+k4vEV`It1*LMs1X8y=;#Fcf+mJ3-e>sC*R~QAg<4OcCH)jYmV)&&8u3 z%UIdqR$QbT0aTqT4bU*5;||^_e*QlVjPMizoxRt?47sJ;ACe0 zP2kPjy-TAfl!?DsqgPMu@Y>Pc{{9w8%U`mD{3~VkwGKL!Ow#|YaiN|%Rk$BU!uOi6J=$7I5)AKOgjQ$@v!hjQ)(Qur)dZ0G{}zh>p>76> z2&F~L({hLbr*M~HAU)C}yjPmAFzaTy>4`m$OG5rh+`fU=1QlH0nR#xraxXpbX;azrirobNiK)BOQbE*u^#KG%+ z)P7K2Gk@3k8nkS$$E6(Dgx+1u_G^|lUVOBD`G!Z}7ZY9k0p>qp^SMsrxzuel152E= z_chPCqRTyPIL03dwtjK-<`ArXzV!t$#oV%%xl#F72^qwHUCH92RE!;vgf1=PH{!Xn zA~>ZWCngQvY*g|gqz!RvvXn?A^f)c+Uqtec+egVtFovZ$Wl^o8g%fupk#zB*-ukvg z2;)0eY+m7rU$2}mR4)NJRb>VzfyLNAtEHDss^m*eJonOX#~(0olGtJ)wkmr6VJ|Z8 zz1IKb=UKgZ)umptVpbC@zwqSdO!C=zkjEgsm@*N5G19RK zV?4iv#nys~5XapZ!QRG~1JQtU6%EGo8^v$5r{AW+*gIi)ZY1PX` zFZKrX_(l3qW&Sro&9F2kSwE@Y<^S&RTzjY$r5X4 zz1>2I(9|~c+&pj6DJ#NArg)=QA*!`n;>s2*wh<@&RY2>&t+aESxXrsadRb>9My(kq zlX7oVZ~_)rhY#(w6r=Q$cQg&JaVqjnH*=F?2B7nhQY0jhut4}H=qAvS zY(I|1Ig(?FYD9{6)Myox=L}A6dwp|nyIcJI^&G% zNsUeTyQpw~rdo|k{8J5N1{+2N;uhp&C=LbM>OMaO=fEl{UZ#0sB$%li(t>Njh z=5u5Fy3CYQq0UV_`i+ELEA&NnZdGdqR@Lm6zVsR%@l0ToxdlTiR z^Fd7{9MG!cyTRlI|9IP`(cegCzAwnDBt4BXalQ^8imH|LluP?tr^D!Gqhj&wX=)%#{ zI8n`?f#^qcH79@TP*4p)wH1n%v(CKSxbf=i+Xt7ZBB&H2SQR5&{?*UG;D&W%1{6Be zqkT!O)t}z)p<1F5K7{rs*>P3F8R&x26eVk;qn8g-5;irm-xenq^dYVsyKctj^SZX= zWWTF!n`!oxzHv~v;;xFm-<-wD9^E~o3p;5B-4c(_-zIyK=2u_6aYyp{JEf?dwx{`v zf+(yeNf`W3@}Ib!1WPPTho)S`&i(WIK-=!bFld86T!-euYPH%+-}qla@uswtJ}1ud zQTz*O^-{`?5Rtt+jrUuaM>-o6weEVJHf8+pO(xT^{^!53Eep zCT6A4fvdYKBLDJ}mEYhX#8A&;m)>vdu15D;EtbL|X;7z{_M#UNC6}?O|0uL*%a#xv zHzIp)yZITtYX=nz|B6cY$}3HkgY($U_~biUM-Vk+u4W?KE8#;D_0L;ov=2pPengm7 zCx1!&zQjpJCky;d7-$hy>DQ+G>j|$qjZ?aqOc0{@v0Pd7SsY1#>7)^$+s;=6Qw^i`63hjD`zAY7`MA{PP9(6VfJW?@cKry+5}!g z@Y1Xu(>5inK$f(<^Wyzj*Sd)n3?j)>!PFal{jaUR?!JkHVJ{_+!*<0pEtPfSrQ8%Z z4v0JoKLkf-28rXRSp%}}(saHZ3T7;4kGU-U0!zBlE;483?4MrTJG?;;d{fcnG5XU} z%~BKZr(_1M(roC@`vGaNWE$DW^}mQr{F3seK*bNCV~QlNk^3`Jq3+H9Iy2L!4#8*? zagSMH^qCiYqa4yhtcfd|)7V#5zFJve``F@TyWBLsSA?Hqt|F;l(X8NKmtN&$*MHhai4xjx-UgTB0h^+U==w9XX@az6fG;1?&uIVrJ zrF3e!d`ceR(q!yTJiSsPeh%clpW)rCGN#hldp<~ZjF{}X)i<6j3W>z+Qrk#!p2E`( zavoa4z!CdI&N(XGoXEq5)UQpMh7JxrZ}N%R&Y7#UyH?6X>uA6*p>u-cMSnr1KNJce z@d%fak?Z&=lh&<%n}nqm8uNv92N{d-N0(00YJ<+F2k`(;?m}PMF`eS(dMt1_i!*w4 z2;-#;DiQV8XB3&$BV176Ng%6A=|PW|E-Uh{tFO9J)?~=<%8caky2i?FCC@w-+C0)- ztNyWRuhC;BE}p84p@TI|){k>VdB`(gf4rE+t*>j2-wjriO_jMS3{=_tuV@#a2=89B z&&Lfcz4A#49Ew0FyJ$sAH<>PyzF4BQSA;T;5QqK}J}68Py7S9+gOFhAE3xYkhD-7h zl$2BFX<@z+NU>3Dr`-tucmH4GAV#Ilnj}ZO8=N}vlx7#k&QtGh+VSm6jrFd20~>wR zxaDstO73j+I=%gM6I$fBs5l+5bk>4EPvn|p6P@Fm?1|Hk5*eXaOx|l5bSz}yqw1H@ z9$L|;Tw|~G37+sDcBo`NEftO>74|3OBI!hJXSf@_q;gj$v4LdI*0H?SI`71Y=&LuA zA?DyARtfjiWiUiC!3Zi*jpKP=Jand}NX^oL{ZWh!W?flo7lbm5vavgk&FTUn!;KFi zaoK8rxL&*=Ir6DcS6|Fep_c;5R8fR_UMi${51n4^>5f_J*riWy%O7_3xz(cbmsBbQ zq*{LevfT9ZO~cbU*1^<4Xpu*2bO4yGS%wDuIouJ(KK70Tr8Dy`hge6XEA5d2Q(75x zu#$(@GLTFbHApZ<6pRiHa9atn?$~%dqX>pHRLotSK&()kp+qL7%E9{gD(2rsQSBbo0|$MpB$3J(7e@v)vtQZX*hVR*^&4Pbdol);ub?|3uzQJK${kpB>4OuvVaiBgViI4iTT{njT%?<^8P?Z8U zA|_y*jrqog*Z`4jDeZhC{Cm2(e9El6RY#}QASa$h^>ny$Cp@M!F-}GxL$>?-g|jy0 z_~iCJat0n~P+(_79674~vvJ@zulNPz(D3jt=M+q0e~fAkE=Zh?^k)&Q0|l!d%c5jn zfwmo$$s9NkI%SZ)R1Q2e#8lG6FP$fr%Zw=)eA-~9EXh9)SCE7fXfwXf=dGK>4rU@^ z2BYIrQ#|z^{hOK6|1&{*Br^yn$bcaPo4)+@%f$EX;raE(Q*$X`;v;3sBaAY0$&H!TiN3QsBo$EOV_yuh2x%*F##gJzPzJ+DM(seM{oeRv$ZCxB$RHZ))zfbBZP@dIf z9<2Yv&bNbKwDk$i@z5i^2_I6Kb4y4!sid>x_LG7dCxNhUzO;rw$nW0=<#(b?8>Qrl z@Bi!?dP1arwI_^wK&;TJeh`_I7esQ(!kt!vU$vlYa;a!l$~qn)waK`df z-we&;_JD|fZ%+VT#i1@ZMpaDvfG`J^>zE}kU6mCkw3vtM*9mMR-Pozu&>2lvJHMDe z&|_W+XzS3(3K4;!0k^uVg>K?kylU$uVFtA74L-6$#gEY9-Qy5*Q}^H%p6c69!L+yk z({$i%;(a8~Wb9cSEfPEwQ$^HD(-#lwh#s~cZPJ{7aysd9F#g$v^#A} znVda;gB&mdh;yWmA@#)=LDjH4t{xah zu<=_}H+OWGN5d8`300wL$vN~CGhBqNLS2m1qEt-Vh$wj$O3LK>lz@7erFdCdN~ia! z()2s4eWqWE*o;SwOA|_Xq2hmaLFy^wc zFQ8yHo3%Ua8(&HU4Qn-RXp;?_Ty~~LgLdEmhpl?30oz~7P@;{ZNNNNn-TOP-Jl;G; z-m2e8RW_ux|ElwZq=eSglJ$Jwzb=bbWW&Wxqs07~*+`F(E}=y)kc|%o+cz zohr`1I2-CM3a3Vh!x`IUYunlOeRykPIKn;@^pBATSLwmT_c$F@qI`H@`Ib z(PV{o75}`}^Ips%$O2O|Ly*(ROBN<8Rc$kify63IiIY3ElaUFD$ph^sc;=K~!>@gm z4d=8U4w_E3d6M|^Zzw_Xf|tUT=mt)rmCV`(E|AfD;v0WsyNvCjp;aB%DBF+k+X~fu z>ZOhqqH}m*8tpL(h07*8$; zp`{hu9r%*>YXnGd3AJ39B~f2tlri7x;UZ!t2E|d13Kp#e>2EjiV+yZpKySry-Z;j# z{YXE4p=sIJJJ-!0GZ(X)!`K^8(qdK1z8ITWhG$kw{)ZD=%9UPnChhz77=sJF4Ykd* zL`M^g(T!EJ4^5j-41+dprD##{@=heES!tm1I_~WU$`>7hCQb&rn`kmCUw@XlwcpfD z8Dj7$!ol>}F({brqwFPfM89aseOL8-U#^YqB5Oy%yHs6Y)yys&$w40E44V&9Tl51L zY%oqgt}LR943zsOflk$;4cnV)9YgRBRJu;wML|T%Th%+$3bS#Y5NY^FsE_hE0axwf z*t>MOqqfMlT~v*!yshtqV2@tE3drMd@dYl~U^FQY zNpDE|kdn*hmv^MpDV>$4A7AT5-=N&!VKBYh=G*nI4CAdHmkL%69y?KaeMs;UQ0dvf zNdLw^!y2nJLSFn5-0wPXJdH%hxJg+&*k*##O9xWg_uib~DMp6N*vNuz2xydr%(1?L z8YNvZoCIF?AGA*npm|Frf$lSZM^}y%tWtBl+RE&6GV|phr38Ce{z<+EZnYb{JEB9%5Vksef5ft5Xm+%2Im{dmQ$HnB{=8L zZtE#Rl-KT49rDU5H9^Wk#kIXCWTpI0cT?9P0|pvQ!x=vI9)yEh4?}c6c6lJA3tsoH zcc2nlY&dF{8W}3Ex|EQ5W@LMjsTACJq(@Dki-#}}wYv6P5K@xd^{kyyezq;^*t|UC zz84XeDmlghUyGG3v2m%_*kVr2S|+dr?O zCap6%PuuE~3*sY&U&*Xg>!=+-;Y!=v4X5wc*Kt7sy`y+PO{B|HO~}>d4xsH(F!@{I zt0>|h77K%2BT&Ruz(dQqcAs2?WKY;a1r~dO96{E9#v5mM;!yci@>&A9V|cAG|;!|UYq59waTp~qhRdoMY)ty8oeK#`tmO)w-+of%+X9nhLUmO z>b|!mq4IE{LYZX>*zR(ydt&?jIwtvB&k&gFWOeaM0sN-chMLZ2f_R@Uv~&`dV+N@V z|Lo>FZ3jvqtIN~U(2%DGk@uL^NwOAlgEvsNI`*m<9zE3_7b4IQ=%2NfvQ&T5&^GAd zg7&`l$$5fLPaoOvvU`70WLSatf1wTHfl#-94Vc_{3I)ZrsahoxQ@hU3ux9%yPv>y| z>FC+T*qSEe7-vq?Xo#*tCVJ3-f=b#pMQlxaB1>M}DP%?K>Swptq*vH75X zkgMy`QF)j#8z=+hytR|lcO>U`HoKTkuc}^!4}T{b_2O!^<92K_akjWvbhaWC*z%wP z&t8XD+Gw$Qy~-4blDKkaj`Oa@{iit5$o`SO+2KUZmT`%G!gX}z=LC-Jh@04xioeC* z55pL6&>u)lc>Fq7<$bd(kzi2Y?ox0LGjShgiwBd;n_Q{CR2;P|(aBnnl`zUht8fKGPWNOWpj%KfLWZu$B03vK^?atIx%un+hvr5d; zqH|1On7=4Achw!{%6eGE3*v}s$~uxS{de{E6%p@M?FYzlTs%x!GA)1lYBRwl0Huo4 z*EjB=-qyE`WY*p1t?PjU6^L^!`)6OvgKjJoZ~b5LhT}NyWzFqGYC^;oHGT2lQ(?(T3SLhtk4TA&OSgk=T8BU@2KOG{%2RX5l|QC$e^TtC(6b`ti_g-MH-N zg!<6FsQoR^tMxUN!40*vyvDeqdcE+zmZ9(I+xjgYxYL8*Ke=lCq+!=?^zxMOlc1Fs zzZoz=#Dvw0*^f>(_$>Li>gW;A2))NXH69?|V=D^<`S$vFQnB}Tq`Bha;nG$7mK(Zy zEpDkF7g1YI6k;-P^&iKwB85CrWaxcc*1Hy%V=D>w9Sshb7I9ougl3GzL1&K!F2<%a z&tS^M4y71Nx8bAy=Ah-^OpRzlc><;e?jGmIiz8N8RKK}N;?u}riY)bhWxeN6&0vHM7M=+eKO&hSC>!+u9tNvL#XP-?excOh*Z< zEn+O&`g|-qePJ@LPB3}Q@4O^xL?p7uW>;bqVwr@%BNuOxO=!audAn*;aGNBgN) ztOWY8-e>WMnfUEVW&BH|J)UE6PpWB_tn$Q)aw&w*FX1RXY;ZkIgJBbf5&pUdI!V=j zX9GF}Y8rp^IizY~{I0hM=@>6}-FCpHD@L||dN53}M%wK_mjvg}nv5{3?_WZePawlI z0=(FcHA#Z5Q0*3wYr9BQ0OL(*ZBMMI@@}(`Rl=V=r-1KA2nPg6B&9QW{aVeU%GE(HzJ(f|zbpNfS7V3<-2V+!AhF5Xp_j_!I{c(~#) zwbD6AYYD?Xzf|kme>9k6K!mKMaEJ#E5=B%^G@84}f);doIL!>qhU>0QJ#ZFC(qjih zvAS~-NF_GAygc;zJg00#ScoICO@p@ZeY+o!U*0U780sW};E~K%oF84=w1^N^o1Yq% zd{f7M>l{lW@_z2L6ac&p{s6z@x;4r{WRfibc?+Sfag{Seh&uO+O#-8mWr0%s@O`B8 zHhbhTO@}sKONX9;$_8s>B6~3#+g9KWH6&x@#nHN==J_Rz6VPlaf#bGm4rtN*3TJ27<`2awZBXyxRph{oOQQtlwbwxdwe<;^U%Od>&(iSfwIS zelF*a){rF-TD^GgO~Pj{z8MKlKH$u6O!8y;O{|Zx%m2#96TheC+IMJy#yGpOeL9u0 zJ)b)f-Ez2XEfKH^$n}Fva&L7ChEe4JB_Vd`*(ItgM9o<6`DVet`ICPg1IA^5i&l|W zO

_B*6k&!{9j|p2LAy@dIT@mjpJ53vCQtX@uE$9IM~ z$cDMB*co_5D#lj}Uv#*P6`3{Av5c_-kAOTQ|3y>ha=u=yQ^~)6gKYyJA z#sS5v^op%$!RTSz)8oG#?tBOrrJxxm&<))YWe|vh#?e&MARU!c5Mr_te7EF!6MGMKA zw?8`rxy@M@tPR`yIX^R11kc1+RL~1y#)mde1eCSx47Fh4rc>A0LqP9dHf9Foy^U&{?f6`aEfyL;#ec`DzUdO#hc!E_7|t>-E5vLkJl93_sRRnXM`A&@jBUJVJvk{S~l8RR0 zBoH|!kribiNRHxJ=3OMLB=2MonJ#%NpX9B27eak$VC($m?2v<)hCWpRKI)9mtO;Mh@cV#9huLDZUc?+1` zL?1vld!7|IroPB46!3#~Zpa8qGoYf6Hiivw5<#Y2pacQ<+x89zCxwC>37FZ782LD`)`+~)eJVzDr11EZUL(P+7rI*$%NjYkJmWY+wrt&2~`7sQoxBQfawNUPy@G_tW|jW10k#JbTK+%yoy&RqEIkA^ z`Z#kbp4#u@+r0`SeE@oOUG_4DKYJhJIoDxSo&j>d4To(`hv+x#l0{0*HAb-ByYu~ zrEpPjXrS4o&+`WX3IM3uF}2wX7S>R|G|o%Xev2Y? z=bgx~7yI?=UwWd9?$@SRU{*kTWDuLSiREZ=`)00T^g>$wCkvqNoNEAnO;?~9vjsXX zhy}rYV!==+?caQVTJp49?@%mpWrSI217D{4pDR(kc+dyX$q7+VQL8Mm0q;xX?>Bup zIV0dH>>aEQzCSv2S{P}x1kbI>QM`Zx6Vs=JiHe1k+oy(6U-nv*64?EYyhNG`^bhTR zyV@cGmy8z>jAJ8X#u8LF9X;VfIN(JN{|hAQsk;i`cBadMTM=0uF+{vcz;ky4I4N8j zHj@=s1C-mQ)D;N}GTihQ>j(?MKrO+f0bh_3(5dgOkzVlP10QsA^-(17x5A!T+~PYo z2p_O{Fd4(l7Mm??SGWRbRx;GG4otQhweI@>V0}WBM9J1R3XxcQf&+6g4JYzP0BUE` z)-_LZA=#+|{v|=9JrgJLbC3@`dQX=aY5`o0u=N@F?LT zijTC)icok$0lqN-MnXir#otp>vpxi0OrW{c7kGro*D^ zOx|ugoCnw=Q9sY7)~vIDd_9Bp0T8vNtDy3uFcv_OhNXZV%>V7fVflXsvOhjqH;9isP9AJcj zcjlL9oB-7Y%b3|`0o#d!$AR0YCoKCP1KgqfazOw~g2M`XY3^m(7a}&e%T+G9QSOM`LFLHUgzyIaNev3yPB^nv?7;+q5oU?vE=Szb_F(@l9_;B9* zevRi}_UFvM{vYPIx9Mfr58Rypyk@1rpDj~vwIbf zlR%r%iy3)X&w>tj=q|k;Yd%*LTGYP!ck~ai(k^+$X7YRf)BDx$_fFuV5^bYQTW86gatQ&=|w@V z=EFe|HWnsOUYQ>6WdPh|o1p*<%Y7xRV6oTdxj9&X>6zo>e`bE0fbY31Z45xQjcM|a z_lf-b13aTb57=5}2Vy3CUC;&Cd9{{7ZVB@P*tCuw?9B*F95%MRQ?*Q<) zgXzawC8fW8n!ewrt5FKLa76Gpu%-^u+4tkoQD8cW-Sg|}dOwze6N>FiZZ-gSuW5+I zmRvMZ%>dR|TA))QB)BdafQl1P9g=iwOXkr=cDWf^3`SJ0ABcZ*i<(7N{ zFnFDU16KTH1jSVki~f90fecVjqGNXczMU0+J|2I)ulIn!gL=k0n=U?0_4ptOJkf>0 M)78&qol`;+05dZGSO5S3 literal 0 HcmV?d00001 diff --git a/test/text/local_glyph_rasterizer.test.cpp b/test/text/local_glyph_rasterizer.test.cpp index 8e3235791c5b..1922aacd97c8 100644 --- a/test/text/local_glyph_rasterizer.test.cpp +++ b/test/text/local_glyph_rasterizer.test.cpp @@ -10,6 +10,8 @@ #include #include +#include + /* LoadLocalCJKGlyph in glyph_manager.test.cpp exercises the platform-independent part of LocalGlyphRasterizer. This test actually @@ -17,13 +19,8 @@ on. Different platforms have different default fonts, so adding a new platform requires new "expected" fixtures. - At the time of writing, we don't run `mbgl-test` on iOS or Android, so the - only supported test platform is macOS. Supporting Android would require - adding a new test case (probably using the "Droid" font family). iOS should - theoretically work -- the "PingFang" font family used below is expected to be - available on all iOS devices, and we use a relatively high image diff - tolerance (0.05) to account for small changes between the many possible - variants of the PingFang family. + At the time of writing, we don't run this test on Android, that would require + adding a new test case (probably using the "Droid" font family). */ using namespace mbgl; @@ -33,7 +30,14 @@ namespace { class LocalGlyphRasterizerTest { public: LocalGlyphRasterizerTest(const std::optional fontFamily) - : frontend(1, gfx::HeadlessBackend::SwapBehaviour::NoFlush, gfx::ContextMode::Unique, fontFamily) {} + : frontend(1, gfx::HeadlessBackend::SwapBehaviour::NoFlush, gfx::ContextMode::Unique, fontFamily) { + this->fileSource->glyphsResponse = [&](const Resource& resource) { + EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); + Response response; + response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); + return response; + }; + } util::RunLoop loop; std::shared_ptr fileSource = std::make_shared(); @@ -59,12 +63,6 @@ class LocalGlyphRasterizerTest { TEST(LocalGlyphRasterizer, PingFang) { LocalGlyphRasterizerTest test(std::string("PingFang TC")); - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); #if defined(__APPLE__) && !defined(__QT__) test.checkRendering("ping_fang", 0.0161); @@ -73,16 +71,19 @@ TEST(LocalGlyphRasterizer, PingFang) { #endif // defined(__APPLE__) } +TEST(LocalGlyphRasterizer, PingFangWithBoldInStyle) { + LocalGlyphRasterizerTest test(std::string("PingFang TC")); + std::stringstream ss; + ss << std::regex_replace( + util::read_file("test/fixtures/local_glyphs/mixed.json"), std::regex("NotoCJK"), "NotoCJK Bold"); + test.map.getStyle().loadJSON(ss.str()); + test.checkRendering("ping_fang_with_bold_in_style"); +} + #if !defined(__QT__) TEST(LocalGlyphRasterizer, PingFangSemibold) { LocalGlyphRasterizerTest test(std::string("PingFang TC Semibold")); - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); test.checkRendering("ping_fang_semibold", 0.0161); } @@ -94,13 +95,6 @@ TEST(LocalGlyphRasterizer, PingFangSemibold) { TEST(LocalGlyphRasterizer, NotoSansCJK) { LocalGlyphRasterizerTest test(std::string("Noto Sans CJK KR Regular")); - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; - test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); test.checkRendering("noto_sans_cjk_kr_regular_qt"); } @@ -110,13 +104,6 @@ TEST(LocalGlyphRasterizer, NoLocal) { // Expectation: without any local fonts set, and without any CJK glyphs // provided, the output should just contain basic latin characters. LocalGlyphRasterizerTest test({}); - - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); test.checkRendering("no_local", 0.001, 0.1); } @@ -126,13 +113,6 @@ TEST(LocalGlyphRasterizer, NoLocalWithContentInsets) { // center. Rendered text should be on the same offset and keep the same size // as with no offset. LocalGlyphRasterizerTest test({}); - - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; auto viewSize = test.frontend.getSize(); test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); @@ -149,13 +129,6 @@ TEST(LocalGlyphRasterizer, NoLocalWithContentInsetsAndPitch) { // center. Rendered text should be on the same offset and keep the same size // as with no offset. LocalGlyphRasterizerTest test({}); - - test.fileSource->glyphsResponse = [&](const Resource& resource) { - EXPECT_EQ(Resource::Kind::Glyphs, resource.kind); - Response response; - response.data = std::make_shared(util::read_file("test/fixtures/resources/glyphs.pbf")); - return response; - }; auto viewSize = test.frontend.getSize(); test.map.getStyle().loadJSON(util::read_file("test/fixtures/local_glyphs/mixed.json")); From 2771d4ab5233ea85cdde6fdb0d0690563a9aec80 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 16 Dec 2024 16:31:09 +0100 Subject: [PATCH 020/339] Release MapLibre iOS 6.9.0 (#3094) --- platform/ios/CHANGELOG.md | 6 ++++++ platform/ios/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index b49b5c50003a..65ce874aee73 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,12 @@ MapLibre welcomes participation and contributions from everyone. Please read [`C ## main +## 6.9.0 + +- Batch up scheduling of deferred deletions ([#3030](https://github.com/maplibre/maplibre-native/pull/3030)). +- Remove `Pass3D` ([#3077](https://github.com/maplibre/maplibre-native/pull/3077)). +- Add bold support for CJK characters ([#3069](https://github.com/maplibre/maplibre-native/pull/3069)). + ## 6.8.1 - Update Bazel dependencies ([#3000](https://github.com/maplibre/maplibre-native/pull/3000)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 23863d3def7f..6a1fccf93033 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.8.1 \ No newline at end of file +6.9.0 \ No newline at end of file From d60857edc7efd1f8e2ad886ac1acb771023ba614 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:13:37 +0100 Subject: [PATCH 021/339] Bump the github-actions group across 1 directory with 2 updates (#3093) --- .github/workflows/gh-pages-android-api.yml | 2 +- .github/workflows/gh-pages-android-examples.yml | 2 +- .github/workflows/gh-pages-cpp-api.yml | 2 +- .github/workflows/gh-pages-mdbook.yml | 2 +- .github/workflows/ios-ci.yml | 2 +- .github/workflows/windows-ci.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/gh-pages-android-api.yml b/.github/workflows/gh-pages-android-api.yml index abe4b3fc6909..5f327f21091d 100644 --- a/.github/workflows/gh-pages-android-api.yml +++ b/.github/workflows/gh-pages-android-api.yml @@ -26,7 +26,7 @@ jobs: run: ./gradlew dokkaGenerate - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.2 with: branch: gh-pages folder: platform/android/MapLibreAndroid/build/dokka/html diff --git a/.github/workflows/gh-pages-android-examples.yml b/.github/workflows/gh-pages-android-examples.yml index 5ebde8efcd02..090401df1a60 100644 --- a/.github/workflows/gh-pages-android-examples.yml +++ b/.github/workflows/gh-pages-android-examples.yml @@ -23,7 +23,7 @@ jobs: run: make mkdocs-build - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.2 with: branch: gh-pages folder: platform/android/site diff --git a/.github/workflows/gh-pages-cpp-api.yml b/.github/workflows/gh-pages-cpp-api.yml index f2e9efa39a57..1095e1fbad3a 100644 --- a/.github/workflows/gh-pages-cpp-api.yml +++ b/.github/workflows/gh-pages-cpp-api.yml @@ -20,7 +20,7 @@ jobs: run: doxygen - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.2 with: branch: gh-pages folder: docs/doxygen/html diff --git a/.github/workflows/gh-pages-mdbook.yml b/.github/workflows/gh-pages-mdbook.yml index cb76f1664275..1ebce477a662 100644 --- a/.github/workflows/gh-pages-mdbook.yml +++ b/.github/workflows/gh-pages-mdbook.yml @@ -41,7 +41,7 @@ jobs: name: book path: artifacts/book - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.2 with: branch: gh-pages folder: artifacts/book diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 7310a6f3bb83..f838c023f098 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -201,7 +201,7 @@ jobs: - name: Deploy DocC documentation (main) 🚀 if: github.ref == 'refs/heads/main' - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.2 continue-on-error: true with: branch: gh-pages diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index d00231ebeba4..4e3f479aae55 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -87,7 +87,7 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - uses: mozilla-actions/sccache-action@v0.0.6 + - uses: mozilla-actions/sccache-action@v0.0.7 - name: Initialize sccache run: | From a843410bb27b2ec39559b443549a194f6178ecce Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 16 Dec 2024 20:55:49 +0100 Subject: [PATCH 022/339] Specify Vulkan version needed in AndroidManifest.xml (#3095) --- .../MapLibreAndroid/src/drawable/AndroidManifest.xml | 6 ++++++ .../android/MapLibreAndroid/src/main/AndroidManifest.xml | 4 ---- .../android/MapLibreAndroid/src/vulkan/AndroidManifest.xml | 7 +++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 platform/android/MapLibreAndroid/src/drawable/AndroidManifest.xml create mode 100644 platform/android/MapLibreAndroid/src/vulkan/AndroidManifest.xml diff --git a/platform/android/MapLibreAndroid/src/drawable/AndroidManifest.xml b/platform/android/MapLibreAndroid/src/drawable/AndroidManifest.xml new file mode 100644 index 000000000000..6ea1b76300bb --- /dev/null +++ b/platform/android/MapLibreAndroid/src/drawable/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/platform/android/MapLibreAndroid/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroid/src/main/AndroidManifest.xml index d5e48eb75d03..e33d8ddcd702 100644 --- a/platform/android/MapLibreAndroid/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroid/src/main/AndroidManifest.xml @@ -1,8 +1,4 @@ - - diff --git a/platform/android/MapLibreAndroid/src/vulkan/AndroidManifest.xml b/platform/android/MapLibreAndroid/src/vulkan/AndroidManifest.xml new file mode 100644 index 000000000000..eb13ac34e2d7 --- /dev/null +++ b/platform/android/MapLibreAndroid/src/vulkan/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From c94864f1a9a742d09d4619ec6aa786bb46824cb0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 18 Dec 2024 15:18:35 +0100 Subject: [PATCH 023/339] Prepare MapLibre Android 11.7.1 release (#3097) --- .github/workflows/android-release.yml | 26 +++++-------------- platform/android/CHANGELOG.md | 15 +++++++++++ .../android/MapLibreAndroid/gradle.properties | 2 +- scripts/generate-changelog.mjs | 2 +- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 02fb0f71c7ba..35594f091c89 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -5,7 +5,7 @@ on: jobs: build: - runs-on: ubuntu-24.04 + runs-on: MapLibre_Native_Ubuntu_24_04_x84_16_core defaults: run: working-directory: platform/android @@ -19,8 +19,6 @@ jobs: submodules: recursive fetch-depth: 0 - - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties - - uses: actions/setup-java@v4 with: distribution: "temurin" @@ -47,6 +45,7 @@ jobs: - name: Update version name run: | RELEASE_VERSION="$( git describe --tags --match=android-v*.*.* --abbrev=0 | sed 's/^android-v//' )" + echo version="$RELEASE_VERSION" >> "$GITHUB_ENV" echo "Latest version from tag: $RELEASE_VERSION" if [ -n "$RELEASE_VERSION" ]; then sed -i -e "s/^VERSION_NAME=.*/VERSION_NAME=${RELEASE_VERSION}/" MapLibreAndroid/gradle.properties @@ -60,17 +59,6 @@ jobs: RENDERER=vulkan make apackage RENDERER=drawable make apackage - - name: Build release Test App - run: | - MAPLIBRE_DEVELOPER_CONFIG_XML='${{ secrets.MAPLIBRE_DEVELOPER_CONFIG_XML }}' - if [ -n "${MAPLIBRE_DEVELOPER_CONFIG_XML}" ]; then - echo "${MAPLIBRE_DEVELOPER_CONFIG_XML}" > MapLibreAndroidTestApp/src/main/res/values/developer-config.xml - make android - else - echo "No secrets.MAPLIBRE_DEVELOPER_CONFIG_XML variable set, skipping apk build..." - fi - shell: bash - # create github release - name: Prepare release id: prepare_release @@ -81,15 +69,15 @@ jobs: echo version_tag="$( git describe --tags --match=android-v*.*.* --abbrev=0 )" >> "$GITHUB_OUTPUT" shell: bash - - name: Check if version is valid semver + - name: Check if version is pre-release id: check_version run: | - version_tag="${{ steps.prepare_release.outputs.version_tag }}" - if [[ $version_tag =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Valid semver: $version_tag" + version="${{ env.version }}" + if [[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Valid semver: $version" echo "prerelease=false" >> "$GITHUB_ENV" else - echo "Invalid semver: $version_tag" + echo "Invalid semver: $version" echo "prerelease=true" >> "$GITHUB_ENV" fi diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 2884391bf55d..2bedb5be3277 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog MapLibre Native for Android +## 11.7.1 + +> [!NOTE] +> We are now releasing OpenGL ES and Vulkan variants of MapLibre Android. See the [11.7.0 release notes](https://github.com/maplibre/maplibre-native/releases/tag/android-v11.7.0) for details. + +### ✨ Features and improvements + +- Batch up scheduling of deferred deletions ([#3030](https://github.com/maplibre/maplibre-native/pull/3030)). +- Specify Vulkan version needed in AndroidManifest.xml ([#3095](https://github.com/maplibre/maplibre-native/pull/3095)). + +### 🐞 Bug fixes + +- Remove `Pass3D` ([#3077](https://github.com/maplibre/maplibre-native/pull/3077)). + Fixes issue where filters applied to fill extrusion layers are not rendered unless a manual zoom is applied to the map ([#3039](https://github.com/maplibre/maplibre-native/issues/3039)). + ## 11.7.0 This release marks the official release of MapLibre Android with Vulkan support. [Vulkan](https://www.vulkan.org) is a modern graphics API which brings advantages such as improved performance, improved observability and better stability. Specifically, starting with this version we are releasing multiple versions of MapLibre Android: diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 081f5a9742c3..93fed717d85f 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.7.0 +VERSION_NAME=11.7.1 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 diff --git a/scripts/generate-changelog.mjs b/scripts/generate-changelog.mjs index a704b8dcd3fc..c18ed107318b 100755 --- a/scripts/generate-changelog.mjs +++ b/scripts/generate-changelog.mjs @@ -18,7 +18,7 @@ function getTagLastVersion() { const lastVersion = fs .readFileSync(`platform/${platform}/CHANGELOG.md`, "utf-8") .split("\n") - .filter((line) => line.startsWith("## "))[1] + .filter((line) => line.startsWith("## "))[0] .slice(3); return `${platform}-v${lastVersion}`; } From b7bf48683cee22a35363e9a310893eb6b47c1a57 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 21:55:39 +0100 Subject: [PATCH 024/339] chore(deps): update dependency gradle to v8.12 (#3102) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- benchmark/android/gradle/wrapper/gradle-wrapper.properties | 2 +- benchmark/android/gradlew | 3 +-- .../MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties | 2 +- platform/android/MapLibrePlugin/gradlew | 3 +-- platform/android/gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradlew | 3 +-- test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- test/android/gradlew | 3 +-- 9 files changed, 9 insertions(+), 13 deletions(-) diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.properties b/benchmark/android/gradle/wrapper/gradle-wrapper.properties index c1d5e0185987..e0fd02028bca 100644 --- a/benchmark/android/gradle/wrapper/gradle-wrapper.properties +++ b/benchmark/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/benchmark/android/gradlew b/benchmark/android/gradlew index f5feea6d6b11..f3b75f3b0d4f 100755 --- a/benchmark/android/gradlew +++ b/benchmark/android/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties index e2847c820046..cea7a793a84b 100644 --- a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/platform/android/MapLibrePlugin/gradlew b/platform/android/MapLibrePlugin/gradlew index f5feea6d6b11..f3b75f3b0d4f 100755 --- a/platform/android/MapLibrePlugin/gradlew +++ b/platform/android/MapLibrePlugin/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/platform/android/gradle/wrapper/gradle-wrapper.properties b/platform/android/gradle/wrapper/gradle-wrapper.properties index e2847c820046..cea7a793a84b 100644 --- a/platform/android/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradle/wrapper/gradle-wrapper.properties b/render-test/android/gradle/wrapper/gradle-wrapper.properties index c1d5e0185987..e0fd02028bca 100644 --- a/render-test/android/gradle/wrapper/gradle-wrapper.properties +++ b/render-test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradlew b/render-test/android/gradlew index f5feea6d6b11..f3b75f3b0d4f 100755 --- a/render-test/android/gradlew +++ b/render-test/android/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/test/android/gradle/wrapper/gradle-wrapper.properties b/test/android/gradle/wrapper/gradle-wrapper.properties index c1d5e0185987..e0fd02028bca 100644 --- a/test/android/gradle/wrapper/gradle-wrapper.properties +++ b/test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/test/android/gradlew b/test/android/gradlew index f5feea6d6b11..f3b75f3b0d4f 100755 --- a/test/android/gradlew +++ b/test/android/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum From 8023e6dd3b8fe6cd149a1cf41ae51b13fe45bb39 Mon Sep 17 00:00:00 2001 From: Kiril Kirov Date: Sun, 29 Dec 2024 18:04:44 -0700 Subject: [PATCH 025/339] Add optional map mode argument to render (#3109) --- bin/render.cpp | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/bin/render.cpp b/bin/render.cpp index 26e1fa11ba0e..6520f7baff1a 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -38,6 +38,9 @@ int main(int argc, char* argv[]) { args::ValueFlag widthValue(argumentParser, "pixels", "Image width", {'w', "width"}); args::ValueFlag heightValue(argumentParser, "pixels", "Image height", {'h', "height"}); + args::ValueFlag mapModeValue( + argumentParser, "MapMode", "Map mode (e.g. 'static', 'tile', 'continuous')", {'m', "mode"}); + try { argumentParser.ParseCLI(argc, argv); } catch (const args::Help&) { @@ -79,18 +82,26 @@ int main(int argc, char* argv[]) { util::RunLoop loop; + MapMode mapMode = MapMode::Static; + if (mapModeValue) { + const auto modeStr = args::get(mapModeValue); + if (modeStr == "tile") { + mapMode = MapMode::Tile; + } else if (modeStr == "continuous") { + mapMode = MapMode::Continuous; + } + } + HeadlessFrontend frontend({width, height}, static_cast(pixelRatio)); - Map map(frontend, - MapObserver::nullObserver(), - MapOptions() - .withMapMode(MapMode::Static) - .withSize(frontend.getSize()) - .withPixelRatio(static_cast(pixelRatio)), - ResourceOptions() - .withCachePath(cache_file) - .withAssetPath(asset_root) - .withApiKey(apikey) - .withTileServerOptions(mapTilerConfiguration)); + Map map( + frontend, + MapObserver::nullObserver(), + MapOptions().withMapMode(mapMode).withSize(frontend.getSize()).withPixelRatio(static_cast(pixelRatio)), + ResourceOptions() + .withCachePath(cache_file) + .withAssetPath(asset_root) + .withApiKey(apikey) + .withTileServerOptions(mapTilerConfiguration)); if (style.find("://") == std::string::npos) { style = std::string("file://") + style; From 525a313153b212c0b7fb824bc6fc695386947c6e Mon Sep 17 00:00:00 2001 From: wangyingfang <132874950+wangyingfang@users.noreply.github.com> Date: Mon, 30 Dec 2024 20:19:18 +0800 Subject: [PATCH 026/339] Fix icon label isn't centered with the icon for CJK/local glyphy on iOS (#3108) Co-authored-by: Yingfang --- platform/darwin/src/local_glyph_rasterizer.mm | 2 +- .../local_glyphs/ping_fang/expected.png | Bin 18207 -> 17747 bytes .../ping_fang_semibold/expected.png | Bin 18500 -> 18279 bytes .../ping_fang_with_bold_in_style/expected.png | Bin 17912 -> 17875 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/darwin/src/local_glyph_rasterizer.mm b/platform/darwin/src/local_glyph_rasterizer.mm index eef0bc31d4cb..4aa095488045 100644 --- a/platform/darwin/src/local_glyph_rasterizer.mm +++ b/platform/darwin/src/local_glyph_rasterizer.mm @@ -272,7 +272,7 @@ CGContextHandle context(CGBitmapContextCreate( // Mimic glyph PBF metrics. metrics.left = Glyph::borderSize; - metrics.top = 4; + metrics.top = -Glyph::borderSize; // Move the text upward to avoid clipping off descenders. CGFloat descent; diff --git a/test/fixtures/local_glyphs/ping_fang/expected.png b/test/fixtures/local_glyphs/ping_fang/expected.png index 0284836130450d01b88a9bb3d30f8b6a14ddd11e..9bb78c9f756cb0175d9ff7b98c154ff53428ab80 100644 GIT binary patch literal 17747 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 TUG6am(80EcL~gAK=H~tfKYAAZ literal 18500 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 M)78&qol`;+05dZGSO5S3 From ccd80c5adec34602814f3c4cc8830133c707f121 Mon Sep 17 00:00:00 2001 From: Justin Clift Date: Fri, 3 Jan 2025 00:47:13 +1000 Subject: [PATCH 027/339] Fix broken .geojson url (#3111) --- .../android/testapp/activity/style/HeatmapLayerActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt index 117346e56940..cabaaabcd222 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/HeatmapLayerActivity.kt @@ -192,7 +192,7 @@ class HeatmapLayerActivity : AppCompatActivity() { // # --8<-- [start:constants] companion object { private const val EARTHQUAKE_SOURCE_URL = - "https://maplibre.org/maplibre-gl-js-docs/assets/earthquakes.geojson" + "https://maplibre.org/maplibre-gl-js/docs/assets/earthquakes.geojson" private const val EARTHQUAKE_SOURCE_ID = "earthquakes" private const val HEATMAP_LAYER_ID = "earthquakes-heat" private const val HEATMAP_LAYER_SOURCE = "earthquakes" From 0efd06c3f0fa690d375a120985a046e67cd613f5 Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Fri, 3 Jan 2025 05:50:19 -0800 Subject: [PATCH 028/339] Fix readme typo (#3113) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0daf7868cf43..26df2071c1f4 100644 --- a/README.md +++ b/README.md @@ -213,7 +213,7 @@ xed platform/ios/MapLibre.xcodeproj To generate and open the Xcode project. -More information: [`platform/android/CONTRIBUTING.md`](platform/ios/CONTRIBUTING.md). +More information: [`platform/ios/CONTRIBUTING.md`](platform/ios/CONTRIBUTING.md). ## Other Platforms From 660f78c583b40bead56abc0b2c3b9a41538db702 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 4 Jan 2025 20:49:18 +0100 Subject: [PATCH 029/339] Use bazel_dep for libuv (#3114) --- MODULE.bazel | 11 ++--------- vendor/libuv.BUILD | 6 ------ 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 vendor/libuv.BUILD diff --git a/MODULE.bazel b/MODULE.bazel index fc8010bcf7cf..3cdd4ed1335d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -8,6 +8,7 @@ bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rule bazel_dep(name = "rules_xcodeproj", version = "2.8.1") bazel_dep(name = "aspect_rules_js", version = "2.1.0") bazel_dep(name = "rules_nodejs", version = "6.3.2") +bazel_dep(name = "libuv", version = "1.48.0") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) node.toolchain(node_version = "20.14.0") @@ -54,16 +55,8 @@ http_archive( urls = ["https://github.com/glfw/glfw/releases/download/3.4/glfw-3.4.zip"], ) -new_local_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:local.bzl", "new_local_repository") - -new_local_repository( - name = "libuv", - build_file = "@//vendor:libuv.BUILD", - path = "/opt/homebrew/opt/libuv", -) - darwin_config = use_repo_rule("//platform/darwin:bazel/darwin_config_repository_rule.bzl", "darwin_config") darwin_config( name = "darwin_config", -) +) \ No newline at end of file diff --git a/vendor/libuv.BUILD b/vendor/libuv.BUILD deleted file mode 100644 index f37a18d41ae1..000000000000 --- a/vendor/libuv.BUILD +++ /dev/null @@ -1,6 +0,0 @@ -cc_library( - name = "libuv", - hdrs = glob(["include/**/*.h"]), - includes = ["include"], - visibility = ["//visibility:public"], -) From c7e6b0c796ed047e6c0cf8d24e8b9768c5a39eff Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 6 Jan 2025 20:16:49 +0100 Subject: [PATCH 030/339] Consolidate developer documentation in mdBook docs (#3115) --- docs/mdbook/README.md | 6 +- docs/mdbook/book.toml | 4 +- docs/mdbook/src/SUMMARY.md | 24 +++-- .../mdbook/src/android/README.md | 39 +------- .../src/android/android-documentation.md | 49 ++++++++++ docs/mdbook/src/android/android-tests.md | 91 ++++++++++++++++++ docs/mdbook/src/design/README.md | 5 +- docs/mdbook/src/introduction.md | 2 + .../mdbook/src/ios/README.md | 92 +++---------------- docs/mdbook/src/ios/ios-documentation.md | 53 +++++++++++ docs/mdbook/src/ios/ios-tests.md | 18 ++++ docs/mdbook/src/platforms.md | 56 +++++++++++ platform/android/README.md | 10 +- platform/ios/README.md | 2 +- 14 files changed, 320 insertions(+), 131 deletions(-) rename platform/android/DEVELOPING.md => docs/mdbook/src/android/README.md (53%) create mode 100644 docs/mdbook/src/android/android-documentation.md create mode 100644 docs/mdbook/src/android/android-tests.md rename platform/ios/CONTRIBUTING.md => docs/mdbook/src/ios/README.md (55%) create mode 100644 docs/mdbook/src/ios/ios-documentation.md create mode 100644 docs/mdbook/src/ios/ios-tests.md create mode 100644 docs/mdbook/src/platforms.md diff --git a/docs/mdbook/README.md b/docs/mdbook/README.md index 268e1aec7f80..9e4a483131df 100644 --- a/docs/mdbook/README.md +++ b/docs/mdbook/README.md @@ -2,7 +2,11 @@ ## Build Locally -Get the `mdbook` utility, see https://rust-lang.github.io/mdBook/guide/installation.html +Get the `mdbook` utility as well as [`mdbook-alerts`](https://github.com/lambdalisue/rs-mdbook-alerts), see https://rust-lang.github.io/mdBook/guide/installation.html + +``` +cargo install mdbook mdbook-alerts +``` Run diff --git a/docs/mdbook/book.toml b/docs/mdbook/book.toml index 120536f1290a..f68116e87f76 100644 --- a/docs/mdbook/book.toml +++ b/docs/mdbook/book.toml @@ -3,7 +3,9 @@ authors = ["MapLibre Contributors"] language = "en" multilingual = false src = "src" -title = "MapLibre Native Documentation" +title = "MapLibre Native Developer Documentation" [output.html] additional-css = ["diff.css"] + +[preprocessor.alerts] diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index ce37391c1c41..d07b042abd65 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -2,13 +2,23 @@ [Introduction](./introduction.md) +- [Platforms](./platforms.md) + +- [Android](./android/README.md) + - [Tests](./android/android-tests.md) + - [Documentation](./android/android-documentation.md) + +- [iOS](./ios/README.md) + - [Tests](ios/ios-tests.md) + - [Documentation](ios/ios-documentation.md) + - [Design](./design/README.md) - - [Ten Thousand Foot View](design/ten-thousand-foot-view.md) - - [Coordinate System](design/coordinate-system.md) - - [Expressions](design/expressions.md) - - [Architectural Problems and Recommendations](design/archictural-problems-and-recommendations.md) - - [Android Map Rendering Data Flow](design/android-map-rendering-data-flow.md) - - [Geometry Tile Worker](design/geometry-tile-worker.md) + - [Ten Thousand Foot View](design/ten-thousand-foot-view.md) + - [Coordinate System](design/coordinate-system.md) + - [Expressions](design/expressions.md) + - [Architectural Problems and Recommendations](design/archictural-problems-and-recommendations.md) + - [Android Map Rendering Data Flow](design/android-map-rendering-data-flow.md) + - [Geometry Tile Worker](design/geometry-tile-worker.md) - [Profiling applications that use MapLibre Native](./profiling/README.md) - - [Tracy profiling](./profiling/tracy-profiling.md) + - [Tracy profiling](./profiling/tracy-profiling.md) diff --git a/platform/android/DEVELOPING.md b/docs/mdbook/src/android/README.md similarity index 53% rename from platform/android/DEVELOPING.md rename to docs/mdbook/src/android/README.md index e8e19dd3e090..192d2f9ae25e 100644 --- a/platform/android/DEVELOPING.md +++ b/docs/mdbook/src/android/README.md @@ -1,4 +1,4 @@ -# Developing - MapLibre Native for Android +# MapLibre Android Developer Guide These instructions are for developers interested in making code-level contributions to MapLibre Native for Android. @@ -33,34 +33,6 @@ Run the configuration for the `MapLibreAndroidTestApp` module and select a devic Android TestApp menu Android TestApp showing Demotiles

-## Render Tests - -To run the render tests for Android, run the configuration for the `androidRenderTest.app` module. - -More information on working on the render tests can be found [in the wiki](https://github.com/maplibre/maplibre-native/wiki/Working-on-Android-Render-Tests). - -## Instrumentation Tests - -To run the instrumentation tests, choose the "Instrumentation Tests" run configuration. - -Your device needs remain unlocked for the duration of the tests. - -## C++ Unit Tests - -There is a separate Gradle project that contains a test app which runs the C++ Unit Tests. It does not depend on the Android platform implementations. - -You can find the project in `test/android.` You can open this project in Android Studio and run the C++ Tests on an Android device or Simulator. - -To run a particular set of tests you can modify the `--gtest_filter` flag in `platform/android/src/test/test_runner.cpp`. See the [GoogleTest documentation](https://google.github.io/googletest/advanced.html#running-a-subset-of-the-tests) for details how to use this flag. - -### AWS Device Farm - -The instrumentation tests and C++ unit tests are running on AWS Device Farm. To see the results and the logs, go to: - -https://us-west-2.console.aws.amazon.com/devicefarm/home?region=us-east-1#/mobile/projects/20687d72-0e46-403e-8f03-0941850665bc/runs - -You can log in with the `maplibre` alias, with `maplibre` as username and `maplibre` as password (this is a read-only account). - ## Kotlin All new code should be written in [Kotlin](https://kotlinlang.org/). @@ -91,11 +63,4 @@ To run the benchmarks (for Android) include the following line on a PR comment: ## Profiling -[maplibre-native/docs/mdbook](https://maplibre.org/maplibre-native/docs/book/) describes how Tracy can be used for profiling. - - -## Documentation - -We use Dokka for the API documentation. - -The documentation site with examples uses MkDocs along with Material for MkDocs. For more information on how to work on the examples, see [`docs/README.md`](./docs/REAME.md`). \ No newline at end of file +See [Tracy Profiling](/profiling/tracy-profiling.md) to understand how Tracy can be used for profiling. \ No newline at end of file diff --git a/docs/mdbook/src/android/android-documentation.md b/docs/mdbook/src/android/android-documentation.md new file mode 100644 index 000000000000..26c0932b2e1c --- /dev/null +++ b/docs/mdbook/src/android/android-documentation.md @@ -0,0 +1,49 @@ +# Documentation for MapLibre Android + +## API Documentation + +We use Dokka for the MapLibre Android API documentation. The live documentation site can be found [here](https://maplibre.org/maplibre-native/android/api/). + +## Examples Documentation + +The documentation site with examples uses MkDocs along with [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). You can check out the site [here](https://maplibre.org/maplibre-native/android/examples/). + +### Building + +To build the Examples Documentation you need to have Docker installed. + +From `platform/android`, run: + +``` +make mkdocs +``` + +Next, visit [`http://localhost:8000/maplibre-native/android/examples/`](http://localhost:8000/maplibre-native/android/examples/). + +### Snippets + +We use [a Markdown extension for snippets](https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#snippet-sections). This way code can be referenced instead of copy pasted into the documentation. This avoids code examples from becoming out of date or failing to compile. The syntax is as follows: + +````kotlin +// --8<-- [start:fun] +fun double(x: Int): Int { + return 2 * x +} +// --8<-- [end:fun] +```` + +Next, you'll be able to reference that piece of code in Markdown like so: + +``` +--8<-- "example.kt:fun" +``` + +Where `example.kt` is the path to the file. + +### Static Assets + +Static assets are ideally uploaded to the [MapLibre Native S3 Bucket](https://maplibre-native.s3.eu-central-1.amazonaws.com/index.html#android-documentation-resources/). + +Please open an issue with the ARN of your AWS account to get upload privileges. + +You can use the macro `{{ s3_url("filename.example") }}` which will use a CDN instead of linking to the S3 bucket directly. \ No newline at end of file diff --git a/docs/mdbook/src/android/android-tests.md b/docs/mdbook/src/android/android-tests.md new file mode 100644 index 000000000000..6e7e971195a2 --- /dev/null +++ b/docs/mdbook/src/android/android-tests.md @@ -0,0 +1,91 @@ +# MapLibre Android Tests + +## Render Tests + +To run the render tests for Android, run the configuration for the `androidRenderTest.app` module. + +### Filtering Render Tests + +You can filter the tests to run by passing a flag to the file `platform/android/src/test/render_test_runner.cpp`: + +```cpp +std::vector arguments = {..., "-f", "background-color/literal"}; +``` + +### Viewing the Results + +Once the application quits, use the Device Explorer to navigate to `/data/data/org.maplibre.render_test_runner/files`. + +image + +Double click `android-render-test-runner-style.html`. Right click on the opened tab and select _Open In > Browser_. You should see that a single render test passed. + +image + +Alternatively to download (and open) the results from the command line, use: + +``` +adb shell "run-as org.maplibre.render_test_runner cat files/metrics/android-render-test-runner-style.html" > android-render-test-runner-style.html +open android-render-test-runner-style.html +``` + +### Updating the Render Tests + +Now let's edit `metrics/integration/render-tests/background-color/literal/style.json`, change this line: + +``` + "background-color": "red" +``` + +to + +``` + "background-color": "yellow" +``` + +We need to make sure that the new `data.zip` with the data for the render tests is installed on the device. You can use the following commands: + +``` +tar chf render-test/android/app/src/main/assets/data.zip --format=zip --files-from=render-test/android/app/src/main/assets/to_zip.txt +adb push render-test/android/app/src/main/assets/data.zip /data/local/tmp/data.zip +adb shell chmod 777 /data/local/tmp/data.zip +adb shell "run-as org.maplibre.render_test_runner unzip -o /data/local/tmp/data.zip -d files" +``` + +Rerun the render test app and reload the Device Explorer. When you re-open the HTML file with the results you should now see a failing test: + +image + +Now download the `actual.png` in `metrics/integration/render-tests/background-color/literal` with the Device Explorer. Replace the corresponding `expected.png` on your local file system. Upload the new render test data again and run the test app once more. + +image + +Of we don't want to commit this change. But know you can add and debug (Android) render tests. + +## Instrumentation Tests + +To run the instrumentation tests, choose the "Instrumentation Tests" run configuration. + +Your device needs remain unlocked for the duration of the tests. + +## C++ Unit Tests + +There is a separate Gradle project that contains a test app which runs the C++ Unit Tests. It does not depend on the Android platform implementations. + +You can find the project in `test/android.` You can open this project in Android Studio and run the C++ Tests on an Android device or Simulator. + +To run a particular set of tests you can modify the `--gtest_filter` flag in `platform/android/src/test/test_runner.cpp`. See the [GoogleTest documentation](https://google.github.io/googletest/advanced.html#running-a-subset-of-the-tests) for details how to use this flag. + +### AWS Device Farm + +The instrumentation tests and C++ unit tests are running on AWS Device Farm. To see the results and the logs, go to: + +[https://us-west-2.console.aws.amazon.com/devicefarm/home?region=us-east-1#/mobile/projects/20687d72-0e46-403e-8f03-0941850665bc/runs](https://us-west-2.console.aws.amazon.com/devicefarm/home?region=us-east-1#/mobile/projects/20687d72-0e46-403e-8f03-0941850665bc/runs). + +Use the following login details (this is a read-only account): + +| | | +|------------|------------| +| Alias | `maplibre` | +| Username | `maplibre` | +| Password | `maplibre` | diff --git a/docs/mdbook/src/design/README.md b/docs/mdbook/src/design/README.md index f4af5367d000..02dec693c006 100644 --- a/docs/mdbook/src/design/README.md +++ b/docs/mdbook/src/design/README.md @@ -1,3 +1,6 @@ +> [!NOTE] +> These notes are partially outdated since the [renderer modularization](https://github.com/maplibre/maplibre-native/blob/main/design-proposals/2022-10-27-rendering-modularization.md). + # Design -This section is dedicated to documenting current state of MapLibre Native. [Architectural Problems and Recommendations](./archictural-problems-and-recommendations.md) section notes recommendations for future improvements from an architectural perspective. +This section is dedicated to documenting current state of MapLibre Native as of end 2022. [Architectural Problems and Recommendations](./archictural-problems-and-recommendations.md) section notes recommendations for future improvements from an architectural perspective. diff --git a/docs/mdbook/src/introduction.md b/docs/mdbook/src/introduction.md index b7c27c66915b..43db78c31c5b 100644 --- a/docs/mdbook/src/introduction.md +++ b/docs/mdbook/src/introduction.md @@ -3,3 +3,5 @@ *[MapLibre Native](https://github.com/maplibre/maplibre-native)* is a community led fork of *Mapbox GL Native*. It's a C++ library that powers vector maps in native applications on multiple platforms by taking stylesheets that conform to the *[MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/)*, a fork of the Mapbox Style Spec. Since it is derived from Mapbox's original work it also uses *Mapbox Vector Tile Specification* as its choice of vector tile format. + +This documentation is intended for developers of MapLibre Native. If you are interested in *using* MapLibre Native, check out the [main `README.md`](https://github.com/maplibre/maplibre-native?tab=readme-ov-file#maplibre-native) on GitHub. diff --git a/platform/ios/CONTRIBUTING.md b/docs/mdbook/src/ios/README.md similarity index 55% rename from platform/ios/CONTRIBUTING.md rename to docs/mdbook/src/ios/README.md index b17b955329c6..208f34d3de33 100644 --- a/platform/ios/CONTRIBUTING.md +++ b/docs/mdbook/src/ios/README.md @@ -1,13 +1,4 @@ -# Contributing - -## Downloading Source - -Download the source and install all submodules if you have not already, by running the following from the root of the repository. - -``` -git clone --recurse-submodules git@github.com:maplibre/maplibre-native.git -cd maplibre-native -``` +# MapLibre iOS Developer Guide ## Bazel @@ -56,91 +47,32 @@ Try to run the example App in the simulator and on a device to confirm your setu > [!IMPORTANT] > The Bazel configuration files are the source of truth of the build configuration. All changes to the build settings need to be done through Bazel, not in Xcode. -### Troubleshooting Provisioning Profiles +### Troubleshooting + +#### Provisioning Profiles If you get a Python `KeyError` when processing provisioning profiles, you probably have some _really_ old or corrupted profiles. Have a look through `~/Library/MobileDevice/Provisioning\ Profiles` and remove any expired profiles. Removing all profiles here can also resolve some issues. -## Using Bazel from the Command Line +#### Cleaning Bazel environments -It is also possible to build and run the test application in a simulator from the command line without opening Xcode. +You should almost never have to do this, but sometimes problems can be solved with: ``` -bazel run //platform/ios:App --//:renderer=metal +bazel clean --expunge ``` -You can also build targets from the command line. For example, if you want to build your own XCFramework, see the 'Build XCFramework' step in the [iOS CI workflow](../../.github/workflows/ios-ci.yml). - -## Render Tests - -To run the render tests, run the `RenderTest` target from iOS. +## Using Bazel from the Command Line -When running in a simulator, use +It is also possible to build and run the test application in a simulator from the command line without opening Xcode. ``` -# check for 'DataContainer' of the app with `*.maplibre.RenderTestApp` id -xcrun simctl listapps booted +bazel run //platform/ios:App --//:renderer=metal ``` -to get the data directory of the render test app. This allows you to inspect test results. When adding new tests, the generated expectations and `actual.png` file can be copied into the source directory from here. - -## C++ Unit Tests - -Run the tests from the `CppUnitTests` target in Xcode to run the C++ Unit Tests on iOS. +You can also build targets from the command line. For example, if you want to build your own XCFramework, see the 'Build XCFramework' step in the [iOS CI workflow](../../.github/workflows/ios-ci.yml). ## Swift App -There is also an example app built with Swift instead of Objective-C. The target is called `MapLibreApp` and the source code lives in `platform/ios/app-swift`. - -## Documentation - -We use [DocC](https://www.swift.org/documentation/docc) for documentation. You need to have [aws-cli](https://github.com/aws/aws-cli) installed to download the resources from S3 (see below). Run the following command: - -``` -aws s3 sync --no-sign-request "s3://maplibre-native/ios-documentation-resources" "platform/ios/MapLibre.docc/Resources" -``` - -Then, to build the documentation locally, run the following command: - -``` -platform/ios/scripts/docc.sh preview -``` - -### Resources - -Resources like images should not be checked in but should be uploaded to the [S3 Bucket](https://s3.eu-central-1.amazonaws.com/maplibre-native/index.html#ios-documentation-resources/). You can share a `.zip` with all files that should be added in the PR. - -If you want to get direct access you need an AWS account to get permissions to upload files. Create an account and authenticate with aws-cli. Share the account ARN that you can get with - -``` -aws sts get-caller-identity -``` - -### Examples - -The code samples in the documentation should ideally be compiled on CI so they do not go out of date. - -Fence your example code with - -```swift -// #-example-code(LineTapMap) -... -// #-end-example-code -``` - -Prefix your documentation code block with - -````md - - -```swift -... -``` -```` - -Then the code block will be updated when you run: - -```sh -node scripts/update-ios-examples.mjs -``` +There is also an example app built with Swift instead of Objective-C. The target is called `MapLibreApp` and the source code lives in `platform/ios/app-swift`. \ No newline at end of file diff --git a/docs/mdbook/src/ios/ios-documentation.md b/docs/mdbook/src/ios/ios-documentation.md new file mode 100644 index 000000000000..bba85d1aa965 --- /dev/null +++ b/docs/mdbook/src/ios/ios-documentation.md @@ -0,0 +1,53 @@ +# iOS Documentation + +We use [DocC](https://www.swift.org/documentation/docc) for the MapLibre iOS documentation. The live documentation site can be found [here](https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre/). + +## Resources + +You need to have [aws-cli](https://github.com/aws/aws-cli) installed to download the resources from S3 (see below). Run the following command: + +``` +aws s3 sync --no-sign-request "s3://maplibre-native/ios-documentation-resources" "platform/ios/MapLibre.docc/Resources" +``` + +Then, to build the documentation locally, run the following command: + +``` +platform/ios/scripts/docc.sh preview +``` + +Resources like images should not be checked in but should be uploaded to the [S3 Bucket](https://s3.eu-central-1.amazonaws.com/maplibre-native/index.html#ios-documentation-resources/). You can share a `.zip` with all files that should be added in the PR. + +If you want to get direct access you need an AWS account to get permissions to upload files. Create an account and authenticate with aws-cli. Share the account ARN that you can get with + +``` +aws sts get-caller-identity +``` + +## Examples + +The code samples in the documentation should ideally be compiled on CI so they do not go out of date. + +Fence your example code with + +```swift +// #-example-code(LineTapMap) +... +// #-end-example-code +``` + +Prefix your documentation code block with + +````md + + +```swift +... +``` +```` + +Then the code block will be updated when you run: + +```sh +node scripts/update-ios-examples.mjs +``` \ No newline at end of file diff --git a/docs/mdbook/src/ios/ios-tests.md b/docs/mdbook/src/ios/ios-tests.md new file mode 100644 index 000000000000..570f789ce7a2 --- /dev/null +++ b/docs/mdbook/src/ios/ios-tests.md @@ -0,0 +1,18 @@ +# iOS Tests + +## Render Tests + +To run the render tests, run the `RenderTest` target from iOS. + +When running in a simulator, use + +``` +# check for 'DataContainer' of the app with `*.maplibre.RenderTestApp` id +xcrun simctl listapps booted +``` + +to get the data directory of the render test app. This allows you to inspect test results. When adding new tests, the generated expectations and `actual.png` file can be copied into the source directory from here. + +## C++ Unit Tests + +Run the tests from the `CppUnitTests` target in Xcode to run the C++ Unit Tests on iOS. \ No newline at end of file diff --git a/docs/mdbook/src/platforms.md b/docs/mdbook/src/platforms.md new file mode 100644 index 000000000000..01b70ae8f8b0 --- /dev/null +++ b/docs/mdbook/src/platforms.md @@ -0,0 +1,56 @@ + +# Platforms + +This page describes the platforms that MapLibre Native is available on. + +## Overview + +MapLibre Native uses a monorepo. Source code for all platforms lives in [`maplibre/maplibre-native`](https://github.com/maplibre/maplibre-native) on GitHub. + +| Platform | Source | Notes | +|---|---|---| +| Android | [`platform/android`](https://github.com/maplibre/maplibre-native/tree/main/platform/android) | Integrates with the C++ core via JNI. | +| iOS | [`platform/ios`](https://github.com/maplibre/maplibre-native/tree/main/platform/ios), [`platform/darwin`](https://github.com/maplibre/maplibre-native/tree/main/platform/darwin) | Integrates with the C++ core via Objective-C++. | +| Linux | [`platform/linux`](https://github.com/maplibre/maplibre-native/tree/main/platform/linux) | Used for development. Also widely used in production for raster tile generation. | +| Windows | [`platform/windows`](https://github.com/maplibre/maplibre-native/tree/main/platform/windows) | | +| macOS | [`platform/macos`](https://github.com/maplibre/maplibre-native/tree/main/platform/macos), [`platform/darwin`](https://github.com/maplibre/maplibre-native/tree/main/platform/darwin) | Mainly used for development. There is some legacy AppKit code. | +| Node.js | [`platform/node`](https://github.com/maplibre/maplibre-native/tree/main/platform/node) | Uses [NAN](https://github.com/nodejs/nan). Available as [@maplibre/maplibre-gl-native](https://www.npmjs.com/package/@maplibre/maplibre-gl-native) on npm. | +| Qt | [maplibre/maplibre-qt](https://github.com/maplibre/maplibre-native/tree/main/platform/qt), [`platform/qt`](https://github.com/maplibre/maplibre-native) | Only platform that partially split to another repository. | + +Of these, **Android** and **iOS** are considered [core projects](https://github.com/maplibre/maplibre/blob/main/PROJECT_TIERS.md) of the MapLibre Organization. +### GLFW + +You can find an app that uses GLFW in [`platform/glfw`](https://github.com/maplibre/maplibre-native/tree/main/platform/glfw). It works on macOS, Linux and Windows. The app shows an interactive map that can be interacted with. Since GLFW adds relatively little complexity this app is used a lot for development. You can also learn about the C++ API by studying the source code of the GLFW app. + +## Rendering Backends + +Originally the project only supported OpenGL 2.0. In 2023, the [renderer was modularized](https://github.com/maplibre/maplibre-native/blob/main/design-proposals/2022-10-27-rendering-modularization.md) allowing for the implementation of alternate rendering backends. The first alternate rendering backend that was implemented was [Metal](https://maplibre.org/news/2024-01-19-metal-support-for-maplibre-native-ios-is-here/), followed by [Vulkan](https://maplibre.org/news/2024-12-12-maplibre-android-vulkan/). In the future other rendering backends could be implemented such as WebGPU. + +What platfroms support which rendering backend can be found below. + +| Platform | OpenGL ES 3.0 | Vulkan 1.0 | Metal | +|---|---|---|---| +| Android | ✅ | ✅ | ❌ | +| iOS | ❌ | ❌ | ✅ | +| Linux | ✅ | ✅ | ❌ | +| Windows | ✅ | ❌ | ❌ | +| macOS | ❌ | ✅ | ✅[^1] | +| Node.js | ✅ | ❌ | ✅ [^2] | +| Qt | ✅ | ❌ | ❌ | + +[^1]: Requires MoltenVK. Only available when built via CMake. +[^2]: Issue reported, see [#2928](https://github.com/maplibre/maplibre-native/issues/2928). + +## Build Tooling + +In 2023 we co-opted Bazel as a build tool (generator), mostly due to it having better support for iOS compared to CMake. Some platforms can use CMake as well as Bazel. + +| Platform | CMake | Bazel | +|---|---|---| +| Android | ✅ (via Gradle) | ❌ | +| iOS | ❌ | ✅ | +| Linux | ✅ | ✅ | +| Windows | ✅ | ❌ | +| macOS | ✅ | ✅ | +| Node.js | ✅ | ❌ | +| Qt | ✅ | ❌ | diff --git a/platform/android/README.md b/platform/android/README.md index a68bd7ced969..029a598eee0b 100644 --- a/platform/android/README.md +++ b/platform/android/README.md @@ -8,10 +8,14 @@ MapLibre Native for Android is a library for embedding interactive map views wit Visit [https://maplibre.org/maplibre-native/android/examples/getting-started/](https://maplibre.org/maplibre-native/android/examples/getting-started/) to view the Getting Started Guide for MapLibre Native for Android. -## Documentation +### Examples Documentation -Visit [https://maplibre.org/maplibre-native/android/api/](https://maplibre.org/maplibre-native/android/api/) to view the current API reference Javadoc files for MapLibre Native for Android. +Visit [MapLibre Android Example](https://maplibre.org/maplibre-native/android/examples/) to learn how to use MapLibre Android. + +## API Documentation + +Visit [MapLibre Android Dokka Docs](https://maplibre.org/maplibre-native/android/api/) to view the current API reference for MapLibre Android. ## Contributing -See [`DEVELOPING.md`](./DEVELOPING.md) for instructions on how to get started working on the codebase. +See the [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/android) for instructions on how to build the project or how to work on the documentation. diff --git a/platform/ios/README.md b/platform/ios/README.md index 412ae58d2f20..51d906cc2082 100644 --- a/platform/ios/README.md +++ b/platform/ios/README.md @@ -11,4 +11,4 @@ Embed interactive maps with scalable, customizable vector maps into iOS Applicat # Contributing -See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for instructions on how to build the project or how to work on the documentation. +See the [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/ios) for instructions on how to build the project or how to work on the documentation. From cf9f41cf613a57066f301fe3da651e6c7d5ea1b7 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Tue, 7 Jan 2025 10:32:17 -0300 Subject: [PATCH 031/339] Add Initial PMTiles support (#2882) Co-authored-by: Bart Louwers --- .gitmodules | 3 + BUILD.bazel | 1 + CMakeLists.txt | 4 + bazel/core.bzl | 1 + include/mbgl/storage/file_source.hpp | 1 + include/mbgl/storage/resource.hpp | 1 + include/mbgl/util/constants.hpp | 1 + .../src/cpp/http_file_source.cpp | 9 +- .../maplibre/android/http/HttpRequest.java | 3 +- .../android/http/NativeHttpRequest.java | 5 +- .../android/module/http/HttpRequestImpl.java | 8 +- .../testapp/utils/ExampleHttpRequestImpl.kt | 4 +- platform/android/android.cmake | 1 + platform/darwin/src/http_file_source.mm | 9 +- platform/default/BUILD.bazel | 1 + .../mbgl/storage/local_file_request.hpp | 4 +- .../src/mbgl/storage/file_source_manager.cpp | 6 + .../src/mbgl/storage/http_file_source.cpp | 8 +- .../src/mbgl/storage/local_file_request.cpp | 6 +- .../src/mbgl/storage/local_file_source.cpp | 11 +- .../src/mbgl/storage/main_resource_loader.cpp | 26 +- .../src/mbgl/storage/pmtiles_file_source.cpp | 586 ++++++++++++++++++ .../mbgl/storage/pmtiles_file_source_stub.cpp | 38 ++ platform/linux/linux.cmake | 1 + platform/macos/macos.cmake | 1 + platform/qt/qt.cmake | 1 + platform/qt/src/mbgl/http_request.cpp | 9 +- platform/windows/windows.cmake | 1 + src/mbgl/storage/pmtiles_file_source.hpp | 29 + src/mbgl/util/io.cpp | 17 +- src/mbgl/util/io.hpp | 4 +- test/CMakeLists.txt | 1 + .../pmtiles/geography-class-png.pmtiles | Bin 0 -> 88874 bytes test/src/mbgl/test/http_server.cpp | 13 +- test/storage/http_file_source.test.cpp | 21 + test/storage/local_file_source.test.cpp | 22 +- test/storage/pmtiles_file_source.test.cpp | 105 ++++ test/storage/server.js | 8 +- vendor/BUILD.bazel | 9 + vendor/PMTiles | 1 + vendor/pmtiles.cmake | 21 + 41 files changed, 969 insertions(+), 32 deletions(-) create mode 100644 platform/default/src/mbgl/storage/pmtiles_file_source.cpp create mode 100644 platform/default/src/mbgl/storage/pmtiles_file_source_stub.cpp create mode 100644 src/mbgl/storage/pmtiles_file_source.hpp create mode 100644 test/fixtures/storage/pmtiles/geography-class-png.pmtiles create mode 100644 test/storage/pmtiles_file_source.test.cpp create mode 160000 vendor/PMTiles create mode 100644 vendor/pmtiles.cmake diff --git a/.gitmodules b/.gitmodules index 9876bf6711b1..72537dd37ef9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -55,3 +55,6 @@ [submodule "vendor/glslang"] path = vendor/glslang url = https://github.com/KhronosGroup/glslang.git +[submodule "vendor/PMTiles"] + path = vendor/PMTiles + url = https://github.com/protomaps/PMTiles.git diff --git a/BUILD.bazel b/BUILD.bazel index 9e7d53e0373b..80c7ccf3411d 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -129,6 +129,7 @@ cc_library( "//vendor:eternal", "//vendor:mapbox-base", "//vendor:parsedate", + "//vendor:pmtiles", "//vendor:polylabel", "//vendor:protozero", "//vendor:unique_resource", diff --git a/CMakeLists.txt b/CMakeLists.txt index 52267c770b06..fc107b4b8c3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ option(MLN_WITH_OPENGL "Build with OpenGL renderer" ON) option(MLN_WITH_EGL "Build with EGL renderer" OFF) option(MLN_WITH_VULKAN "Build with Vulkan renderer" OFF) option(MLN_WITH_OSMESA "Build with OSMesa (Software) renderer" OFF) +option(MLN_WITH_PMTILES "Build with PMTiles support" ON) option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) option(MLN_LEGACY_RENDERER "Include the legacy rendering pathway" ON) option(MLN_DRAWABLE_RENDERER "Include the drawable rendering pathway" OFF) @@ -1450,6 +1451,7 @@ include(${PROJECT_SOURCE_DIR}/vendor/earcut.hpp.cmake) include(${PROJECT_SOURCE_DIR}/vendor/eternal.cmake) include(${PROJECT_SOURCE_DIR}/vendor/mapbox-base.cmake) include(${PROJECT_SOURCE_DIR}/vendor/parsedate.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/pmtiles.cmake) include(${PROJECT_SOURCE_DIR}/vendor/polylabel.cmake) include(${PROJECT_SOURCE_DIR}/vendor/protozero.cmake) include(${PROJECT_SOURCE_DIR}/vendor/tracy.cmake) @@ -1473,6 +1475,7 @@ target_link_libraries( mbgl-vendor-earcut.hpp mbgl-vendor-eternal mbgl-vendor-parsedate + mbgl-vendor-pmtiles mbgl-vendor-polylabel mbgl-vendor-protozero mbgl-vendor-unique_resource @@ -1512,6 +1515,7 @@ export(TARGETS mbgl-vendor-earcut.hpp mbgl-vendor-eternal mbgl-vendor-parsedate + mbgl-vendor-pmtiles mbgl-vendor-polylabel mbgl-vendor-protozero mbgl-vendor-unique_resource diff --git a/bazel/core.bzl b/bazel/core.bzl index 472fde18105b..85c903f5b378 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -377,6 +377,7 @@ MLN_CORE_SOURCE = [ "src/mbgl/storage/local_file_source.hpp", "src/mbgl/storage/main_resource_loader.hpp", "src/mbgl/storage/network_status.cpp", + "src/mbgl/storage/pmtiles_file_source.hpp", "src/mbgl/storage/resource.cpp", "src/mbgl/storage/resource_options.cpp", "src/mbgl/storage/resource_transform.cpp", diff --git a/include/mbgl/storage/file_source.hpp b/include/mbgl/storage/file_source.hpp index 4c896c4d6fc7..6a70154df417 100644 --- a/include/mbgl/storage/file_source.hpp +++ b/include/mbgl/storage/file_source.hpp @@ -25,6 +25,7 @@ enum FileSourceType : uint8_t { FileSystem, Network, Mbtiles, + Pmtiles, ResourceLoader ///< %Resource loader acts as a proxy and has logic /// for request delegation to Asset, Cache, and other /// file sources. diff --git a/include/mbgl/storage/resource.hpp b/include/mbgl/storage/resource.hpp index 114bd2f76407..26fda2752ba0 100644 --- a/include/mbgl/storage/resource.hpp +++ b/include/mbgl/storage/resource.hpp @@ -95,6 +95,7 @@ class Resource { // Includes auxiliary data if this is a tile request. std::optional tileData; + std::optional> dataRange = std::nullopt; std::optional priorModified = std::nullopt; std::optional priorExpires = std::nullopt; std::optional priorEtag = std::nullopt; diff --git a/include/mbgl/util/constants.hpp b/include/mbgl/util/constants.hpp index 51900f93ed18..847c72a25486 100644 --- a/include/mbgl/util/constants.hpp +++ b/include/mbgl/util/constants.hpp @@ -60,6 +60,7 @@ constexpr int DEFAULT_RATE_LIMIT_TIMEOUT = 5; constexpr const char* ASSET_PROTOCOL = "asset://"; constexpr const char* FILE_PROTOCOL = "file://"; constexpr const char* MBTILES_PROTOCOL = "mbtiles://"; +constexpr const char* PMTILES_PROTOCOL = "pmtiles://"; constexpr uint32_t DEFAULT_MAXIMUM_CONCURRENT_REQUESTS = 20; constexpr uint8_t TERRAIN_RGB_MAXZOOM = 15; diff --git a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp index 92420ca7d8e0..4bd80f1e78fa 100644 --- a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp @@ -91,9 +91,15 @@ void RegisterNativeHTTPRequest(jni::JNIEnv& env) { HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, FileSource::Callback callback_) : resource(resource_), callback(callback_) { + std::string dataRangeStr; std::string etagStr; std::string modifiedStr; + if (resource.dataRange) { + dataRangeStr = std::string("bytes=") + std::to_string(resource.dataRange->first) + std::string("-") + + std::to_string(resource.dataRange->second); + } + if (resource.priorEtag) { etagStr = *resource.priorEtag; } else if (resource.priorModified) { @@ -104,13 +110,14 @@ HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, FileSource static auto& javaClass = jni::Class::Singleton(env); static auto constructor = - javaClass.GetConstructor(env); + javaClass.GetConstructor(env); javaRequest = jni::NewGlobal(env, javaClass.New(env, constructor, reinterpret_cast(this), jni::Make(env, resource.url), + jni::Make(env, dataRangeStr), jni::Make(env, etagStr), jni::Make(env, modifiedStr), (jboolean)(resource_.usage == Resource::Usage::Offline))); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/HttpRequest.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/HttpRequest.java index ffe8e21a8a20..05a889192e1c 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/HttpRequest.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/HttpRequest.java @@ -18,12 +18,13 @@ public interface HttpRequest { * @param httpRequest callback to be invoked when we receive a response * @param nativePtr the pointer associated to the request * @param resourceUrl the resource url to download + * @param dataRange http header, used to indicate the part of a resource that the server should return * @param etag http header, identifier for a specific version of a resource * @param modified http header, used to determine if a resource hasn't been modified since * @param offlineUsage flag to indicate a resource will be used for offline, appends offline=true as a query parameter */ void executeRequest(HttpResponder httpRequest, long nativePtr, String resourceUrl, - String etag, String modified, boolean offlineUsage); + String dataRange, String etag, String modified, boolean offlineUsage); /** * Cancels the request. diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/NativeHttpRequest.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/NativeHttpRequest.java index e41429cd3f55..0c4c43aab680 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/NativeHttpRequest.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/http/NativeHttpRequest.java @@ -19,7 +19,8 @@ public class NativeHttpRequest implements HttpResponder { private long nativePtr; @Keep - private NativeHttpRequest(long nativePtr, String resourceUrl, String etag, String modified, boolean offlineUsage) { + private NativeHttpRequest(long nativePtr, String resourceUrl, String dataRange, String etag, String modified, + boolean offlineUsage) { this.nativePtr = nativePtr; if (resourceUrl.startsWith("local://")) { @@ -27,7 +28,7 @@ private NativeHttpRequest(long nativePtr, String resourceUrl, String etag, Strin executeLocalRequest(resourceUrl); return; } - httpRequest.executeRequest(this, nativePtr, resourceUrl, etag, modified, offlineUsage); + httpRequest.executeRequest(this, nativePtr, resourceUrl, dataRange, etag, modified, offlineUsage); } public void cancel() { diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/module/http/HttpRequestImpl.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/module/http/HttpRequestImpl.java index 275e363cd21f..7b5ca63c76aa 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/module/http/HttpRequestImpl.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/module/http/HttpRequestImpl.java @@ -58,7 +58,8 @@ public class HttpRequestImpl implements HttpRequest { @Override public void executeRequest(HttpResponder httpRequest, long nativePtr, @NonNull String resourceUrl, - @NonNull String etag, @NonNull String modified, boolean offlineUsage) { + @NonNull String dataRange, @NonNull String etag, @NonNull String modified, + boolean offlineUsage) { OkHttpCallback callback = new OkHttpCallback(httpRequest); try { HttpUrl httpUrl = HttpUrl.parse(resourceUrl); @@ -74,6 +75,11 @@ public void executeRequest(HttpResponder httpRequest, long nativePtr, @NonNull S .url(resourceUrl) .tag(resourceUrl.toLowerCase(MapLibreConstants.MAPLIBRE_LOCALE)) .addHeader("User-Agent", userAgentString); + + if (dataRange.length() > 0) { + builder.addHeader("Range", dataRange); + } + if (etag.length() > 0) { builder.addHeader("If-None-Match", etag); } else if (modified.length() > 0) { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ExampleHttpRequestImpl.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ExampleHttpRequestImpl.kt index a9d2840696f1..e49f567f4113 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ExampleHttpRequestImpl.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/ExampleHttpRequestImpl.kt @@ -11,11 +11,11 @@ import org.maplibre.android.module.http.HttpRequestImpl */ class ExampleHttpRequestImpl : HttpRequest { override fun executeRequest(httpRequest: HttpResponder, nativePtr: Long, resourceUrl: String, - etag: String, modified: String, offlineUsage: Boolean) + dataRange: String, etag: String, modified: String, offlineUsage: Boolean) { // Load all json documents and any pbf ending with a 0. if (resourceUrl.endsWith(".json") || resourceUrl.endsWith("0.pbf")) { - impl.executeRequest(httpRequest, nativePtr, resourceUrl, etag, modified, offlineUsage) + impl.executeRequest(httpRequest, nativePtr, resourceUrl, dataRange, etag, modified, offlineUsage) } else { // All other requests get an instant 404! httpRequest.onResponse( diff --git a/platform/android/android.cmake b/platform/android/android.cmake index dd01b8f11e13..fbddbb2a4f0a 100644 --- a/platform/android/android.cmake +++ b/platform/android/android.cmake @@ -61,6 +61,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm index 007a0b902d42..8c2fe83c4c3a 100644 --- a/platform/darwin/src/http_file_source.mm +++ b/platform/darwin/src/http_file_source.mm @@ -264,6 +264,13 @@ BOOL isValidMapboxEndpoint(NSURL *url) { [req addValue:@(util::rfc1123(*resource.priorModified).c_str()) forHTTPHeaderField:@"If-Modified-Since"]; } + + if (resource.dataRange) { + NSString *rangeHeader = [NSString stringWithFormat:@"bytes=%lld-%lld", + static_cast(resource.dataRange->first), + static_cast(resource.dataRange->second)]; + [req setValue:rangeHeader forHTTPHeaderField:@"Range"]; + } [req addValue:impl->userAgent forHTTPHeaderField:@"User-Agent"]; @@ -360,7 +367,7 @@ BOOL isValidMapboxEndpoint(NSURL *url) { response.etag = std::string([etag UTF8String]); } - if (responseCode == 200) { + if (responseCode == 200 || responseCode == 206) { response.data = std::make_shared((const char *)[data bytes], [data length]); } else if (responseCode == 204 || (responseCode == 404 && isTile)) { response.noContent = true; diff --git a/platform/default/BUILD.bazel b/platform/default/BUILD.bazel index bb1dfd3576f2..95f94e32ce6e 100644 --- a/platform/default/BUILD.bazel +++ b/platform/default/BUILD.bazel @@ -57,6 +57,7 @@ cc_library( "src/mbgl/storage/offline_database.cpp", "src/mbgl/storage/offline_download.cpp", "src/mbgl/storage/online_file_source.cpp", + "src/mbgl/storage/pmtiles_file_source.cpp", "src/mbgl/storage/sqlite3.cpp", "src/mbgl/text/bidi.cpp", "src/mbgl/util/compression.cpp", diff --git a/platform/default/include/mbgl/storage/local_file_request.hpp b/platform/default/include/mbgl/storage/local_file_request.hpp index 15354d36a4e0..0d342695422d 100644 --- a/platform/default/include/mbgl/storage/local_file_request.hpp +++ b/platform/default/include/mbgl/storage/local_file_request.hpp @@ -8,6 +8,8 @@ template class ActorRef; class FileSourceRequest; -void requestLocalFile(const std::string&, const ActorRef&); +void requestLocalFile(const std::string& path, + const ActorRef& req, + const std::optional>& dataRange = std::nullopt); } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/file_source_manager.cpp b/platform/default/src/mbgl/storage/file_source_manager.cpp index d30684044079..b78a94e6dc24 100644 --- a/platform/default/src/mbgl/storage/file_source_manager.cpp +++ b/platform/default/src/mbgl/storage/file_source_manager.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include namespace mbgl { @@ -37,6 +38,11 @@ class DefaultFileSourceManagerImpl final : public FileSourceManager { return std::make_unique(resourceOptions, clientOptions); }); + registerFileSourceFactory(FileSourceType::Pmtiles, + [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); + }); + registerFileSourceFactory(FileSourceType::Network, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { return std::make_unique(resourceOptions, clientOptions); diff --git a/platform/default/src/mbgl/storage/http_file_source.cpp b/platform/default/src/mbgl/storage/http_file_source.cpp index 0b0d191c2d50..6bb4ff9220a3 100644 --- a/platform/default/src/mbgl/storage/http_file_source.cpp +++ b/platform/default/src/mbgl/storage/http_file_source.cpp @@ -269,6 +269,12 @@ HTTPRequest::HTTPRequest(HTTPFileSource::Impl *context_, Resource resource_, Fil resource(std::move(resource_)), callback(std::move(callback_)), handle(context->getHandle()) { + if (resource.dataRange) { + const std::string header = std::string("Range: bytes=") + std::to_string(resource.dataRange->first) + + std::string("-") + std::to_string(resource.dataRange->second); + headers = curl_slist_append(headers, header.c_str()); + } + // If there's already a response, set the correct etags/modified headers to // make sure we are getting a 304 response if possible. This avoids // redownloading unchanged data. @@ -417,7 +423,7 @@ void HTTPRequest::handleResult(CURLcode code) { long responseCode = 0; curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &responseCode); - if (responseCode == 200) { + if (responseCode == 200 || responseCode == 206) { if (data) { response->data = std::move(data); } else { diff --git a/platform/default/src/mbgl/storage/local_file_request.cpp b/platform/default/src/mbgl/storage/local_file_request.cpp index 6204f552ae45..8c6cf43d808f 100644 --- a/platform/default/src/mbgl/storage/local_file_request.cpp +++ b/platform/default/src/mbgl/storage/local_file_request.cpp @@ -11,7 +11,9 @@ namespace mbgl { -void requestLocalFile(const std::string& path, const ActorRef& req) { +void requestLocalFile(const std::string& path, + const ActorRef& req, + const std::optional>& dataRange) { Response response; struct stat buf; int result = stat(path.c_str(), &buf); @@ -21,7 +23,7 @@ void requestLocalFile(const std::string& path, const ActorRef } else if (result == -1 && errno == ENOENT) { response.error = std::make_unique(Response::Error::Reason::NotFound); } else { - auto data = util::readFile(path); + auto data = util::readFile(path, dataRange); if (!data) { response.error = std::make_unique(Response::Error::Reason::Other, std::string("Cannot read file ") + path); diff --git a/platform/default/src/mbgl/storage/local_file_source.cpp b/platform/default/src/mbgl/storage/local_file_source.cpp index c42ad520c1ae..3fef8ee78622 100644 --- a/platform/default/src/mbgl/storage/local_file_source.cpp +++ b/platform/default/src/mbgl/storage/local_file_source.cpp @@ -25,8 +25,8 @@ class LocalFileSource::Impl { : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {} - void request(const std::string& url, const ActorRef& req) { - if (!acceptsURL(url)) { + void request(const Resource& resource, const ActorRef& req) { + if (!acceptsURL(resource.url)) { Response response; response.error = std::make_unique(Response::Error::Reason::Other, "Invalid file URL"); req.invoke(&FileSourceRequest::setResponse, response); @@ -34,8 +34,9 @@ class LocalFileSource::Impl { } // Cut off the protocol and prefix with path. - const auto path = mbgl::util::percentDecode(url.substr(std::char_traits::length(util::FILE_PROTOCOL))); - requestLocalFile(path, req); + const auto path = mbgl::util::percentDecode( + resource.url.substr(std::char_traits::length(util::FILE_PROTOCOL))); + requestLocalFile(path, req, resource.dataRange); } void setResourceOptions(ResourceOptions options) { @@ -77,7 +78,7 @@ LocalFileSource::~LocalFileSource() = default; std::unique_ptr LocalFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); - impl->actor().invoke(&Impl::request, resource.url, req->actor()); + impl->actor().invoke(&Impl::request, resource, req->actor()); return req; } diff --git a/platform/default/src/mbgl/storage/main_resource_loader.cpp b/platform/default/src/mbgl/storage/main_resource_loader.cpp index 66699128fe91..2f523f1e8d2e 100644 --- a/platform/default/src/mbgl/storage/main_resource_loader.cpp +++ b/platform/default/src/mbgl/storage/main_resource_loader.cpp @@ -21,12 +21,14 @@ class MainResourceLoaderThread { std::shared_ptr databaseFileSource_, std::shared_ptr localFileSource_, std::shared_ptr onlineFileSource_, - std::shared_ptr mbtilesFileSource_) + std::shared_ptr mbtilesFileSource_, + std::shared_ptr pmtilesFileSource_) : assetFileSource(std::move(assetFileSource_)), databaseFileSource(std::move(databaseFileSource_)), localFileSource(std::move(localFileSource_)), onlineFileSource(std::move(onlineFileSource_)), - mbtilesFileSource(std::move(mbtilesFileSource_)) {} + mbtilesFileSource(std::move(mbtilesFileSource_)), + pmtilesFileSource(std::move(pmtilesFileSource_)) {} void request(AsyncRequest* req, const Resource& resource, const ActorRef& ref) { auto callback = [ref](const Response& res) { @@ -70,6 +72,9 @@ class MainResourceLoaderThread { } else if (mbtilesFileSource && mbtilesFileSource->canRequest(resource)) { // Local file request tasks[req] = mbtilesFileSource->request(resource, callback); + } else if (pmtilesFileSource && pmtilesFileSource->canRequest(resource)) { + // Local file request + tasks[req] = pmtilesFileSource->request(resource, callback); } else if (localFileSource && localFileSource->canRequest(resource)) { // Local file request tasks[req] = localFileSource->request(resource, callback); @@ -131,6 +136,7 @@ class MainResourceLoaderThread { const std::shared_ptr localFileSource; const std::shared_ptr onlineFileSource; const std::shared_ptr mbtilesFileSource; + const std::shared_ptr pmtilesFileSource; std::map> tasks; }; @@ -142,12 +148,14 @@ class MainResourceLoader::Impl { std::shared_ptr databaseFileSource_, std::shared_ptr localFileSource_, std::shared_ptr onlineFileSource_, - std::shared_ptr mbtilesFileSource_) + std::shared_ptr mbtilesFileSource_, + std::shared_ptr pmtilesFileSource_) : assetFileSource(std::move(assetFileSource_)), databaseFileSource(std::move(databaseFileSource_)), localFileSource(std::move(localFileSource_)), onlineFileSource(std::move(onlineFileSource_)), mbtilesFileSource(std::move(mbtilesFileSource_)), + pmtilesFileSource(std::move(pmtilesFileSource_)), supportsCacheOnlyRequests_(bool(databaseFileSource)), thread(std::make_unique>( util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_WORKER), @@ -156,7 +164,8 @@ class MainResourceLoader::Impl { databaseFileSource, localFileSource, onlineFileSource, - mbtilesFileSource)), + mbtilesFileSource, + pmtilesFileSource)), resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {} @@ -175,7 +184,8 @@ class MainResourceLoader::Impl { (localFileSource && localFileSource->canRequest(resource)) || (databaseFileSource && databaseFileSource->canRequest(resource)) || (onlineFileSource && onlineFileSource->canRequest(resource)) || - (mbtilesFileSource && mbtilesFileSource->canRequest(resource)); + (mbtilesFileSource && mbtilesFileSource->canRequest(resource)) || + (pmtilesFileSource && pmtilesFileSource->canRequest(resource)); } bool supportsCacheOnlyRequests() const { return supportsCacheOnlyRequests_; } @@ -192,6 +202,7 @@ class MainResourceLoader::Impl { localFileSource->setResourceOptions(options.clone()); onlineFileSource->setResourceOptions(options.clone()); mbtilesFileSource->setResourceOptions(options.clone()); + pmtilesFileSource->setResourceOptions(options.clone()); } ResourceOptions getResourceOptions() { @@ -207,6 +218,7 @@ class MainResourceLoader::Impl { localFileSource->setClientOptions(options.clone()); onlineFileSource->setClientOptions(options.clone()); mbtilesFileSource->setClientOptions(options.clone()); + pmtilesFileSource->setClientOptions(options.clone()); } ClientOptions getClientOptions() { @@ -220,6 +232,7 @@ class MainResourceLoader::Impl { const std::shared_ptr localFileSource; const std::shared_ptr onlineFileSource; const std::shared_ptr mbtilesFileSource; + const std::shared_ptr pmtilesFileSource; const bool supportsCacheOnlyRequests_; const std::unique_ptr> thread; mutable std::mutex resourceOptionsMutex; @@ -236,7 +249,8 @@ MainResourceLoader::MainResourceLoader(const ResourceOptions& resourceOptions, c FileSourceManager::get()->getFileSource(FileSourceType::Database, resourceOptions, clientOptions), FileSourceManager::get()->getFileSource(FileSourceType::FileSystem, resourceOptions, clientOptions), FileSourceManager::get()->getFileSource(FileSourceType::Network, resourceOptions, clientOptions), - FileSourceManager::get()->getFileSource(FileSourceType::Mbtiles, resourceOptions, clientOptions))) {} + FileSourceManager::get()->getFileSource(FileSourceType::Mbtiles, resourceOptions, clientOptions), + FileSourceManager::get()->getFileSource(FileSourceType::Pmtiles, resourceOptions, clientOptions))) {} MainResourceLoader::~MainResourceLoader() = default; diff --git a/platform/default/src/mbgl/storage/pmtiles_file_source.cpp b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp new file mode 100644 index 000000000000..9089f65ea8f4 --- /dev/null +++ b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp @@ -0,0 +1,586 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#if defined(__QT__) && (defined(_WIN32) || defined(__EMSCRIPTEN__)) +#include +#else +#include +#endif + +namespace { +// https://github.com/protomaps/PMTiles/blob/main/spec/v3/spec.md#3-header +constexpr int pmtilesHeaderOffset = 0; +constexpr int pmtilesHeaderLength = 127; + +// To avoid allocating lots of memory with PMTiles directory caching, +// set a limit so it doesn't grow unlimited +constexpr int MAX_DIRECTORY_CACHE_ENTRIES = 100; + +bool acceptsURL(const std::string& url) { + return url.starts_with(mbgl::util::PMTILES_PROTOCOL); +} + +std::string extract_url(const std::string& url) { + return url.substr(std::char_traits::length(mbgl::util::PMTILES_PROTOCOL)); +} +} // namespace + +namespace mbgl { +using namespace rapidjson; + +using AsyncCallback = std::function)>; +using AsyncTileCallback = std::function, std::unique_ptr)>; + +class PMTilesFileSource::Impl { +public: + explicit Impl(const ActorRef&, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions(resourceOptions_.clone()), + clientOptions(clientOptions_.clone()) {} + + // Generate a tilejson resource from .pmtiles file + void request_tilejson(AsyncRequest* req, const Resource& resource, const ActorRef& ref) { + auto url = extract_url(resource.url); + + getMetadata(url, req, [=, this](std::unique_ptr error) { + Response response; + + if (error) { + response.error = std::move(error); + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + response.data = std::make_shared(metadata_cache.at(url)); + ref.invoke(&FileSourceRequest::setResponse, response); + }); + } + + // Load data for specific tile + void request_tile(AsyncRequest* req, const Resource& resource, ActorRef ref) { + auto url = extract_url(resource.url); + + getHeader(url, req, [=, this](std::unique_ptr error) { + if (error) { + Response response; + response.noContent = true; + response.error = std::move(error); + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + pmtiles::headerv3 header = header_cache.at(url); + + if (resource.tileData->z < header.min_zoom || resource.tileData->z > header.max_zoom) { + Response response; + response.noContent = true; + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + uint64_t tileID; + + try { + tileID = pmtiles::zxy_to_tileid(static_cast(resource.tileData->z), + static_cast(resource.tileData->x), + static_cast(resource.tileData->y)); + } catch (const std::exception& e) { + Response response; + response.noContent = true; + response.error = std::make_unique(Response::Error::Reason::Other, + std::string("Invalid tile: ") + e.what()); + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + getTileAddress( + url, + req, + tileID, + header.root_dir_offset, + header.root_dir_bytes, + 0, + [=, this](std::pair tileAddress, std::unique_ptr tileError) { + if (tileError) { + Response response; + response.noContent = true; + response.error = std::move(tileError); + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + if (tileAddress.first == 0 && tileAddress.second == 0) { + Response response; + response.noContent = true; + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + Resource tileResource(Resource::Kind::Source, url); + tileResource.loadingMethod = Resource::LoadingMethod::Network; + tileResource.dataRange = std::make_pair(tileAddress.first, + tileAddress.first + tileAddress.second - 1); + + tasks[req] = getFileSource()->request(tileResource, [=](const Response& tileResponse) { + Response response; + response.noContent = true; + + if (tileResponse.error) { + response.error = std::make_unique( + tileResponse.error->reason, + std::string("Error fetching PMTiles tile: ") + tileResponse.error->message); + ref.invoke(&FileSourceRequest::setResponse, response); + return; + } + + response.data = tileResponse.data; + response.noContent = false; + response.modified = tileResponse.modified; + response.expires = tileResponse.expires; + response.etag = tileResponse.etag; + + if (header.tile_compression == pmtiles::COMPRESSION_GZIP) { + response.data = std::make_shared(util::decompress(*tileResponse.data)); + } + + ref.invoke(&FileSourceRequest::setResponse, response); + return; + }); + }); + }); + } + + void setResourceOptions(ResourceOptions options) { + std::lock_guard lock(resourceOptionsMutex); + resourceOptions = options; + } + + ResourceOptions getResourceOptions() { + std::lock_guard lock(resourceOptionsMutex); + return resourceOptions.clone(); + } + + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + +private: + mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; + ResourceOptions resourceOptions; + ClientOptions clientOptions; + + std::shared_ptr fileSource; + std::map header_cache; + std::map metadata_cache; + std::map>> directory_cache; + std::map> directory_cache_control; + std::map> tasks; + + std::shared_ptr getFileSource() { + if (!fileSource) { + fileSource = FileSourceManager::get()->getFileSource( + FileSourceType::ResourceLoader, resourceOptions, clientOptions); + } + + return fileSource; + } + + void getHeader(const std::string& url, AsyncRequest* req, AsyncCallback callback) { + if (header_cache.find(url) != header_cache.end()) { + callback(std::unique_ptr()); + } + + Resource resource(Resource::Kind::Source, url); + resource.loadingMethod = Resource::LoadingMethod::Network; + + resource.dataRange = std::make_pair(pmtilesHeaderOffset, + pmtilesHeaderOffset + pmtilesHeaderLength - 1); + + tasks[req] = getFileSource()->request(resource, [=, this](const Response& response) { + if (response.error) { + std::string message = std::string("Error fetching PMTiles header: ") + response.error->message; + + if (response.error->message.empty() && response.error->reason == Response::Error::Reason::NotFound) { + if (url.starts_with(mbgl::util::FILE_PROTOCOL)) { + message += "path not found: " + + url.substr(std::char_traits::length(mbgl::util::FILE_PROTOCOL)); + } else { + message += "url not found: " + url; + } + } + + callback(std::make_unique(response.error->reason, message)); + + return; + } + + try { + pmtiles::headerv3 header = pmtiles::deserialize_header(response.data->substr(0, 127)); + + if ((header.internal_compression != pmtiles::COMPRESSION_NONE && + header.internal_compression != pmtiles::COMPRESSION_GZIP) || + (header.tile_compression != pmtiles::COMPRESSION_NONE && + header.tile_compression != pmtiles::COMPRESSION_GZIP)) { + throw std::runtime_error("Compression method not supported"); + } + + header_cache.emplace(url, header); + + callback(std::unique_ptr()); + } catch (const std::exception& e) { + callback(std::make_unique(Response::Error::Reason::Other, + std::string("Error parsing PMTiles header: ") + e.what())); + } + }); + } + + void getMetadata(std::string& url, AsyncRequest* req, AsyncCallback callback) { + if (metadata_cache.find(url) != metadata_cache.end()) { + callback(std::unique_ptr()); + } + + getHeader(url, req, [=, this](std::unique_ptr error) { + if (error) { + callback(std::move(error)); + return; + } + + pmtiles::headerv3 header = header_cache.at(url); + + auto parse_callback = [=, this](const std::string& data) { + Document doc; + + auto& allocator = doc.GetAllocator(); + + if (!data.empty()) { + doc.Parse(data); + } + + if (!doc.IsObject()) { + doc.SetObject(); + } + + doc.AddMember("tilejson", "3.0.0", allocator); + + if (!doc.HasMember("scheme")) { + doc.AddMember("scheme", rapidjson::Value().SetString("xyz"), allocator); + } + + if (!doc.HasMember("tiles")) { + doc.AddMember("tiles", rapidjson::Value(), allocator); + } + + if (!doc["tiles"].IsArray()) { + doc["tiles"] = rapidjson::Value().SetArray().PushBack( + rapidjson::Value().SetString(std::string(util::PMTILES_PROTOCOL + url), allocator), allocator); + } + + if (!doc.HasMember("bounds")) { + doc.AddMember("bounds", rapidjson::Value(), allocator); + } + + if (!doc["bounds"].IsArray()) { + doc["bounds"] = rapidjson::Value() + .SetArray() + .PushBack(static_cast(header.min_lon_e7) / 1e7, allocator) + .PushBack(static_cast(header.min_lat_e7) / 1e7, allocator) + .PushBack(static_cast(header.max_lon_e7) / 1e7, allocator) + .PushBack(static_cast(header.max_lat_e7) / 1e7, allocator); + } + + if (!doc.HasMember("center")) { + doc.AddMember("center", rapidjson::Value(), allocator); + } + + if (!doc["center"].IsArray()) { + doc["center"] = rapidjson::Value() + .SetArray() + .PushBack(static_cast(header.center_lon_e7) / 1e7, allocator) + .PushBack(static_cast(header.center_lat_e7) / 1e7, allocator) + .PushBack(header.center_zoom, allocator); + } + + if (!doc.HasMember("minzoom")) { + doc.AddMember("minzoom", rapidjson::Value(), allocator); + } + + auto& minzoom = doc["minzoom"]; + + if (minzoom.IsString()) { + minzoom.SetInt(std::atoi(minzoom.GetString())); + } + + if (!minzoom.IsNumber()) { + minzoom = rapidjson::Value().SetUint(header.min_zoom); + } + + doc["minzoom"] = minzoom; + + if (!doc.HasMember("maxzoom")) { + doc.AddMember("maxzoom", rapidjson::Value(), allocator); + } + + auto& maxzoom = doc["maxzoom"]; + + if (maxzoom.IsString()) { + maxzoom.SetInt(std::atoi(maxzoom.GetString())); + } + + if (!maxzoom.IsNumber()) { + maxzoom = rapidjson::Value().SetUint(header.max_zoom); + } + + doc["maxzoom"] = maxzoom; + + std::string metadata = serialize(doc); + metadata_cache.emplace(url, metadata); + + callback(std::unique_ptr()); + }; + + if (header.json_metadata_bytes > 0) { + Resource resource(Resource::Kind::Source, url); + resource.loadingMethod = Resource::LoadingMethod::Network; + resource.dataRange = std::make_pair(header.json_metadata_offset, + header.json_metadata_offset + header.json_metadata_bytes - 1); + + tasks[req] = getFileSource()->request(resource, [=](const Response& responseMetadata) { + if (responseMetadata.error) { + callback(std::make_unique( + responseMetadata.error->reason, + std::string("Error fetching PMTiles metadata: ") + responseMetadata.error->message)); + + return; + } + + std::string data = *responseMetadata.data; + + if (header.internal_compression == pmtiles::COMPRESSION_GZIP) { + data = util::decompress(data); + } + + parse_callback(data); + }); + + return; + } + + parse_callback(std::string()); + }); + } + + void storeDirectory(const std::string& url, + uint64_t directoryOffset, + uint64_t directoryLength, + const std::string& directoryData) { + if (directory_cache.find(url) == directory_cache.end()) { + directory_cache.emplace(url, std::map>()); + directory_cache_control.emplace(url, std::vector()); + } + + std::string directory_cache_key = url + "|" + std::to_string(directoryOffset) + "|" + + std::to_string(directoryLength); + directory_cache.at(url).emplace(directory_cache_key, pmtiles::deserialize_directory(directoryData)); + directory_cache_control.at(url).emplace_back(directory_cache_key); + + if (directory_cache_control.at(url).size() > MAX_DIRECTORY_CACHE_ENTRIES) { + directory_cache.at(url).erase(directory_cache_control.at(url).front()); + directory_cache_control.at(url).erase(directory_cache_control.at(url).begin()); + } + } + + void getDirectory(const std::string& url, + AsyncRequest* req, + uint64_t directoryOffset, + uint32_t directoryLength, + AsyncCallback callback) { + std::string directory_cache_key = url + "|" + std::to_string(directoryOffset) + "|" + + std::to_string(directoryLength); + + if (directory_cache.find(url) != directory_cache.end() && + directory_cache.at(url).find(directory_cache_key) != directory_cache.at(url).end()) { + if (directory_cache_control.at(url).back() != directory_cache_key) { + directory_cache_control.at(url).emplace_back(directory_cache_key); + + for (auto it = directory_cache_control.at(url).begin(); it != directory_cache_control.at(url).end(); + ++it) { + if (*it == directory_cache_key) { + directory_cache_control.at(url).erase(it); + break; + } + } + } + + callback(std::unique_ptr()); + return; + } + + getHeader(url, req, [=, this](std::unique_ptr error) { + if (error) { + callback(std::move(error)); + return; + } + + pmtiles::headerv3 header = header_cache.at(url); + + Resource resource(Resource::Kind::Source, url); + resource.loadingMethod = Resource::LoadingMethod::Network; + resource.dataRange = std::make_pair(directoryOffset, directoryOffset + directoryLength - 1); + + tasks[req] = getFileSource()->request(resource, [=, this](const Response& response) { + if (response.error) { + callback(std::make_unique( + response.error->reason, + std::string("Error fetching PMTiles directory: ") + response.error->message)); + + return; + } + + try { + std::string directoryData = *response.data; + + if (header.internal_compression == pmtiles::COMPRESSION_GZIP) { + directoryData = util::decompress(directoryData); + } + + storeDirectory(url, directoryOffset, directoryLength, directoryData); + + callback(std::unique_ptr()); + } catch (const std::exception& e) { + callback(std::make_unique( + Response::Error::Reason::Other, + std::string(std::string("Error parsing PMTiles directory: ") + e.what()))); + } + }); + }); + } + + void getTileAddress(const std::string& url, + AsyncRequest* req, + uint64_t tileID, + uint64_t directoryOffset, + uint32_t directoryLength, + uint32_t directoryDepth, + AsyncTileCallback callback) { + if (directoryDepth > 3) { + callback(std::make_pair(0, 0), + std::make_unique( + Response::Error::Reason::Other, + std::string("Error fetching PMTiles tile address: Maximum directory depth exceeded"))); + + return; + } + + getDirectory(url, req, directoryOffset, directoryLength, [=, this](std::unique_ptr error) { + if (error) { + callback(std::make_pair(0, 0), std::move(error)); + return; + } + + pmtiles::headerv3 header = header_cache.at(url); + std::vector directory = directory_cache.at(url).at( + url + "|" + std::to_string(directoryOffset) + "|" + std::to_string(directoryLength)); + + pmtiles::entryv3 entry = pmtiles::find_tile(directory, tileID); + + if (entry.length > 0) { + if (entry.run_length > 0) { + callback(std::make_pair(header.tile_data_offset + entry.offset, entry.length), {}); + return; + } + + getTileAddress(url, + req, + tileID, + header.leaf_dirs_offset + entry.offset, + entry.length, + directoryDepth + 1, + std::move(callback)); + return; + } + + callback(std::make_pair(0, 0), {}); + }); + } + + std::string serialize(Document& doc) { + StringBuffer buffer; + Writer writer(buffer); + doc.Accept(writer); + + return std::string(buffer.GetString(), buffer.GetSize()); + } +}; + +PMTilesFileSource::PMTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : thread(std::make_unique>( + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), + "PMTilesFileSource", + resourceOptions.clone(), + clientOptions.clone())) {} + +std::unique_ptr PMTilesFileSource::request(const Resource& resource, FileSource::Callback callback) { + auto req = std::make_unique(std::move(callback)); + + // assume if there is a tile request, that the pmtiles file has been validated + if (resource.kind == Resource::Tile) { + thread->actor().invoke(&Impl::request_tile, req.get(), resource, req->actor()); + return req; + } + + // return TileJSON + thread->actor().invoke(&Impl::request_tilejson, req.get(), resource, req->actor()); + return req; +} + +bool PMTilesFileSource::canRequest(const Resource& resource) const { + return acceptsURL(resource.url); +} + +PMTilesFileSource::~PMTilesFileSource() = default; + +void PMTilesFileSource::setResourceOptions(ResourceOptions options) { + thread->actor().invoke(&Impl::setResourceOptions, options.clone()); +} + +ResourceOptions PMTilesFileSource::getResourceOptions() { + return thread->actor().ask(&Impl::getResourceOptions).get(); +} + +void PMTilesFileSource::setClientOptions(ClientOptions options) { + thread->actor().invoke(&Impl::setClientOptions, options.clone()); +} + +ClientOptions PMTilesFileSource::getClientOptions() { + return thread->actor().ask(&Impl::getClientOptions).get(); +} + +} // namespace mbgl diff --git a/platform/default/src/mbgl/storage/pmtiles_file_source_stub.cpp b/platform/default/src/mbgl/storage/pmtiles_file_source_stub.cpp new file mode 100644 index 000000000000..48ff404756af --- /dev/null +++ b/platform/default/src/mbgl/storage/pmtiles_file_source_stub.cpp @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +namespace mbgl { + +class PMTilesFileSource::Impl { +public: + Impl() = default; + ~Impl() = default; +}; + +PMTilesFileSource::PMTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) {} + +std::unique_ptr PMTilesFileSource::request(const Resource& resource, FileSource::Callback callback) { + return nullptr; +} + +bool PMTilesFileSource::canRequest(const Resource& resource) const { + return false; +} + +PMTilesFileSource::~PMTilesFileSource() = default; + +void PMTilesFileSource::setResourceOptions(ResourceOptions options) {} + +ResourceOptions PMTilesFileSource::getResourceOptions() { + return {}; +} + +void PMTilesFileSource::setClientOptions(ClientOptions options) {} + +ClientOptions PMTilesFileSource::getClientOptions() { + return {}; +} + +} // namespace mbgl diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index e1374d067a59..4289fd57a63c 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -50,6 +50,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/local_glyph_rasterizer.cpp diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index 4ca02db212c3..48953eb5b74f 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -92,6 +92,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 0f2bf061b35c..04920ca8b385 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -84,6 +84,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> ${PROJECT_SOURCE_DIR}/platform/$,default/src/mbgl/storage/sqlite3.cpp,qt/src/mbgl/sqlite3.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp diff --git a/platform/qt/src/mbgl/http_request.cpp b/platform/qt/src/mbgl/http_request.cpp index 0fb1993146ac..973760a419a8 100644 --- a/platform/qt/src/mbgl/http_request.cpp +++ b/platform/qt/src/mbgl/http_request.cpp @@ -49,6 +49,12 @@ QNetworkRequest HTTPRequest::networkRequest() const { req.setRawHeader("User-Agent", agent); #endif + if (m_resource.dataRange) { + std::string range = std::string("bytes=") + std::to_string(m_resource.dataRange->first) + std::string("-") + + std::to_string(m_resource.dataRange->second); + req.setRawHeader("Range", QByteArray(range.data(), static_cast(range.size()))); + } + if (m_resource.priorEtag) { const auto etag = m_resource.priorEtag; req.setRawHeader("If-None-Match", QByteArray(etag->data(), static_cast(etag->size()))); @@ -112,7 +118,8 @@ void HTTPRequest::handleNetworkReply(QNetworkReply* reply, const QByteArray& dat int responseCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); switch (responseCode) { - case 200: { + case 200: + case 206: { if (data.isEmpty()) { response.data = std::make_shared(); } else { diff --git a/platform/windows/windows.cmake b/platform/windows/windows.cmake index 8665a6f0be06..8e5a6493eb40 100644 --- a/platform/windows/windows.cmake +++ b/platform/windows/windows.cmake @@ -51,6 +51,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/local_glyph_rasterizer.cpp diff --git a/src/mbgl/storage/pmtiles_file_source.hpp b/src/mbgl/storage/pmtiles_file_source.hpp new file mode 100644 index 000000000000..47d34139efeb --- /dev/null +++ b/src/mbgl/storage/pmtiles_file_source.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +// File source for supporting .pmtiles maps +class PMTilesFileSource : public FileSource { +public: + PMTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); + ~PMTilesFileSource() override; + + std::unique_ptr request(const Resource&, Callback) override; + bool canRequest(const Resource&) const override; + + void setResourceOptions(ResourceOptions) override; + ResourceOptions getResourceOptions() override; + + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + +private: + class Impl; + std::unique_ptr> thread; // impl +}; + +} // namespace mbgl diff --git a/src/mbgl/util/io.cpp b/src/mbgl/util/io.cpp index e66389e3319d..4603c0209353 100644 --- a/src/mbgl/util/io.cpp +++ b/src/mbgl/util/io.cpp @@ -46,14 +46,23 @@ std::string read_file(const std::string &filename) { } } -std::optional readFile(const std::string &filename) { +std::optional readFile(const std::string &filename, + const std::optional> &dataRange) { MLN_TRACE_FUNC(); std::ifstream file(filename, std::ios::binary); if (file.good()) { - std::stringstream data; - data << file.rdbuf(); - return data.str(); + if (dataRange) { + size_t size = static_cast(dataRange->second - dataRange->first + 1); + std::string data(size, '\0'); + file.seekg(static_cast(dataRange->first)); + file.read(&data[0], static_cast(size)); + return data; + } else { + std::stringstream data; + data << file.rdbuf(); + return data.str(); + } } return {}; } diff --git a/src/mbgl/util/io.hpp b/src/mbgl/util/io.hpp index 7e57b312798b..bc08a7b925ac 100644 --- a/src/mbgl/util/io.hpp +++ b/src/mbgl/util/io.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -15,7 +16,8 @@ struct IOException : std::runtime_error { void write_file(const std::string& filename, const std::string& data); std::string read_file(const std::string& filename); -std::optional readFile(const std::string& filename); +std::optional readFile(const std::string& filename, + const std::optional>& dataRange = std::nullopt); void deleteFile(const std::string& filename); void copyFile(const std::string& destination, const std::string& source); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 816037eea13e..2955aa3a51bf 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -41,6 +41,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/storage/offline_database.test.cpp ${PROJECT_SOURCE_DIR}/test/storage/offline_download.test.cpp ${PROJECT_SOURCE_DIR}/test/storage/online_file_source.test.cpp + ${PROJECT_SOURCE_DIR}/test/storage/pmtiles_file_source.test.cpp ${PROJECT_SOURCE_DIR}/test/storage/resource.test.cpp ${PROJECT_SOURCE_DIR}/test/storage/sqlite.test.cpp ${PROJECT_SOURCE_DIR}/test/style/conversion/conversion_impl.test.cpp diff --git a/test/fixtures/storage/pmtiles/geography-class-png.pmtiles b/test/fixtures/storage/pmtiles/geography-class-png.pmtiles new file mode 100644 index 0000000000000000000000000000000000000000..aec0ca2a62904ae551f33af7e6b89e5437010189 GIT binary patch literal 88874 zcmZ5`Wl&tfw)L4AEOqnyGvkR?)Prh zSM_#P*XlmKf1KT?YFDpymZH3>)fY1-h#&C3!Tw+T{a@VrFGhp@JNZBBM6LhbK>qLZ z|BE2-zkLwERu^k2s4xOd%GxA$S91Mta_1oiWhC1Fn}ZR?W`;rjesaXk@mva{{6zH@ zY;WH}{sk2PAQ0=HoEXUeCI0_(o~TL%W-&}DzwN zEwaG*DFaQc^bP;y)0-dm!nRrJ`!aUP+fq*X{^t8JHeO`+|j?S2)XjSlygif zg@(TM%9Byg&guI4)rRnW&a&u;_K-^49-q0*^hY-k9YH7Gw|`rPLt>RVD77auW?bSV zN9jJeB#7lqaC$ot`qV(V|49Fz8twgt`f2|iR=A>qG!{Au`oD6qWMw3k|8so*8EBAy zU{k883IO0i#ZRhIoaR2PRv|pLVf>DfLaxyt+#@yIJ*B-9)V;%X!@bSCLgf6@)O_Q$ zLL*dyV&wy~l!H@rf@3ry;>^M#)WTC#g0poaV|9X4oua*Tz9nmiWUEEw>Hms1i->oP z2-k_o)A&|s9UrOly~r{?&LtvV|7Wqqw*rrRubUU9J+!DWA*r~p*t)dy>tv-? zL(`Z1hTz^pmxQ{+{C>BsbQ7P#j`}8-hJw(9!hewvRM--qRy&tx^R23+zuqQy(j~7e zuxZe0HqW`g*10ITytW{IKi49pv@5YOH@_jFcF5&hT}?`MV_|;LT%A?NxJ7@jO+$TT z+r-zN-;qoG+B=1ghYfl&_0C1Lxpj33eZ8(Nlde6}HpShEaV>SnB26RnRRO{>1dsdpBf1|m^Dpqne3kr?H`KYns&@-8Oa{# z%IFyyF0adJo4i^!>Hgg_wHVe|KhQs)c)w}>XCZ!|YT$Cksjz2$XFhCjrf6>K*KFOu z@1eEYp{3fFk_gO-uzsoj&d@t*0e&YAtK!>aT4iQf6mgP!UB z+1<;IKivyQgNr+Z^ZP@~dxMKd!;6QbD|>^>Cj%?z6RUfpD<=nkmWS6buO?O|H!fzk zj{a<3O>W&xZ{IBJp3Uyw-7Ib|@1M`^KW^_I&+k7h9R6KAdfGd_SUy1iG+ZmUfCY5D05w39Q7;ST2`+FwfaAh0hxYhd70 zYipo{z8@75EiMcZgl8Ni0`yRD<7It*_lkDx&J3i8iG&T{iol+Iv4KFUSV@E=@M{$l zh`^zu0XUG*&;Sl1$Us}H2*86P-!f&k#DG0Oe5uL;nr48k?U1)qrnfp7pk z{vHWaxf?h@@B+q2L_jPqbWg+CKZ&nj6Aa@+5~4>#`YS^OP$5;Iqn853h!hmyV-g7z zR_o6PFmBiHf@N8$Bq3+wCDI=NR(MoErXmq(m`eX&HWck{C z1j4Toq##^*q&59$4P`y`uoyHLB?t{k8ItL{2y86)XUbDQbw2m9w*_|XPqY>O@p!|>yDR{hC^uRQZifX$LUfMLF6;_i zUV4;_T5EQKi3Wz6Zgbk(=AN$iPfpr980`1{uwpEKL4zSZpcYsI>qM}Aza$Lzsk$6J zi_wgI0l(*6|KFEBK3w=%&=R$$>oPk9zx$c}Kg(&XwybHatRtw_S71P*q7h*W30qmA z4Q&cU_=WhPJm|W#g-N8AF+DWx;S{{jIC-vVZmup1ju)P+_GKfz@j?w%9268L4Ew8r z6^2Q;H=4@tiNb{Q{3OINK0B)+YaaKmMK5i7o`n^GHz%r$P*mwUsCwhUniZ-AK;VbL zK;lDM#DzEH&JMs;8!DA<9(B{A0%iJAz7BlTe6OnG-XNpKQhW`83OV3iX_x{}QvoZUJX6^JAp+K z5r3dbP*9Zd@k-T6Zr}hiC+;w@6NeOoI&K9-L79k>3DvO)6U~K?beUn3Ic$eO@!!kc zG02lwX&KkAf|jzZ#>+sJ0+Hh{heAHd)b_=fcC2P4I7eDP>+gn6PDZe&NDrjS3=_lc zd0_Tj=p9EwG2Yczgn&J(=nNtAM=S`W{~qCkGTnY%sJ6{;_{HYri{SLkj88ItB6_;O z^ps34*J0eCqiGh(tj$ zwPcGl+Gyj<`EzkpSYR(nU^j2SKd(fuy#pFh2ssWsnKvyzQTqM9%%>^!OPD}kYb_d3 zq^-OMf%CJQ7}ajXLUlfO09OEPY#`$Pap z(h|@@zx%d}{LpgXCF(9_a5cfp?mhK1BhAc6hr*|xOq5qG@HvC2-IKln1$fJKm;|yZ z%Du9*${U7VA>0zOksf@}F@XEEtWhk=FKm-s%N6~V&@u?cn(-3z6em9&uln)%KlDT9mbKTxA%5AEWr4ZcQPO<;^b-PZ6#B84aggi z(?^nyS7{dk=9Oe~Ks0clonDay?0v)~aayP5#Y};%pWFd>`K&!2qVs%)>H>qnYr*eH zsrBw||D+)Vd>+;-=-C%XfV1$(2=zgX3yS!*HA7M{Uy4|@n;D%9Z&lO3(;&-(t?w3! z7k}os4WUoKP}1Ofp`BR-t~-e`=wF*{nwNk8B5S#qK*XS@ea_V>;_iVG0T^fxGy$*B zzI`-EykOjVjS9~qHv)wn8VI=@4E@p4z*@8RZcBDvd731Xq($n}&@cE&Y z%3vt2fM9dvr{Q5jU_8=O96FJ0$Gr0RaOjow%r0=3Q}m^)e<<*+l3I8)G8JAz8u&g$ zbNdb-Wa;dpZSSdM#%KvfMS;D*Og*(O?GBtMBtS5H2SMrgSd=>(0ZGF`O4r~_8^WhU z1B5qXk+3??pk0kr0So2=#H1h_zTR9eSZq3fXeoKi;X??3G|cvjntg)4F^y2&HIiJ8 zWC|`_OQkW8ywu>$;|AvNyoC)8u*U;);NZ1!N=5ddcFzYLTmb`BV%y!Tc}D|GQ2R5o z9(6u3%lOAb!OwDnhtN9zFyIrLB`VsQ{AV+hJp(9{oB4RetmD2pV)kn?WJ{e$0 zGK2Dec(09$a#1$3L3VimyO?4YN{M7&li9+W_e>UA-h)w7@hrgu1F)!4H7;y>dhMEr zp0i%OqHF7nh5EETvj9I)rN7H(9tJo2IRLR-^zEvg@3UEcJFBT*s}VDkmYAA5Q6Aww zH(L+TTfMfRY#(l#7lXi#4cjRd!ojrU7!)jjk23szJ+}^%i(0+%YywPTI>VN%S zT5U|pEKPUUx~2gDqC&LreR#Q|0WU^_<~NbHL2Rw4j;s z9vyZ9mB>n$g|z7Vv3rX{6rT?l32o^d!r!KTc%#ZOh`JVoHm7$8{e*O=9c3LpX4Kq=vtEH<_WC(w!H!*o9&`E-N5A;lJ z*H3BOD^8ZOUGW2daO#2dQo)UBlf<7hj!!Oo#Ks0fr)XdhP(VZyX38AhCTa$7*?cxJ zDU!-Bca|06l1Te4onXg-={&8bMjjXEdmfAwZ`FXdhmb!|oLipP^UF~^EI{pD&*W$o z4?Dpkkwt@=L>d@%hsh?_-(MA3tEkGrLoMXat9EwY)3AD+`@>!nPb4@qRmIA zV){dDnx{Sst?bsGPc)g)^87(^=}6k`0egW)t@;6h+WxXIA{$ z3RtrXgFwAJ_)^IL-_wM(+gp-(+{_ViHInY3l;Xpb1&!H1Rboo8qs#Q(0(<-&^d|g||#acCTcF*%<0{v?phlR99nJ>7pNd zd6GNU13n~7Zy!K#i%qke{F%<$Ju)paF>ZoM19bctzb85i?`@3aJ)HQT35R6_z?vMVHru>#2<4t!P zr>(wA%d@YPqB@yynb`G}&?(P=rtyT%m`U54W*5SmrUt9T-=muJT(*1F>_sido_&Z_Pn z#@HCoe~y>rd>{#YyU0lwm(O|mt&;KkTggb&%&87jW6eBOW%slWmMY9EVxEtBdAX|j z%3gOszy|xPYf+bjLmcc@SLQIlo|tMG6CI$!kue89T&NTfd>aP>u*boL*|s+oNj z$UTYNEcA0+t%8yvvE>mM%j9{2Jt9yDaDVZKajl?tIU}BT``Qs`;Q_3bf!>QcYh(y? zVyO<9{bigfJrW$rNEw_`Qu;@;ke`1^khWC>_S zaYnHu)f3fmbO*lBX3$wd1VmYNU;t9S8E9T-VK4v_7MGb%Yv!Q?_2p#*lyG-?vQgHU zud%SCWSIrt>PQ9O+08}ES1F?7LW-R^UIfsfXp@^nvsDi(AI02aYGR=cCvm%Qz1ab8 zQ+ngs0R=11P1RN+5a3;K3>XUf#bjm0d^`RSLv@xgt-<>aBxsk21SindtD<3NCKbTA z(?~DPFdeomnMpRr+N~&K`K&-AX2_#qEeXG~;w0@8%8M?hC{bUu+!s4H${d?^$)D^1 zqnRhD_VFSu7l;(uF{&tEadFDC4k8l)siU5{-!?0e{r5oZR@T3z9=sy77ZyH}kPJf6 zmbi#vbw@3AA$4?h8B^+IbdJ*xM$vu#g`*70$c+rRYOlZkJ?QV{`s=z5*!cT?16u_R zzFTvoHq+w|imo9i-~08`B|e>k1P+H2%jHFba5>{&_xyVYzbC5lMiLy4tml<`uGkmj zHvas8v6YmRd=EGjPQcL8)Tq4yk!FRlBI5CIccH#1L@1lNj3=bi*Q~bk$_`(@!777B zk@gwZ28t~a==}rB&CFHX?jRGQ`bfuO`5))l$b0W$qJ}>vDVxkF<>F>I@VWX^6^*UXl8Xp zv1wl2uVRn_OV7dNV4FXa5JU941Cm4S$TA<%j8j3Akx;Q~UmjuiOzO z`rUl6Befkn7&=>nv#MFy{IvDU!l3c8x5Y@ot40X325~LLeBGsZ`%v;H^_ORhVV=4^ zTUj|fb4+p3H=`M(Y}FYJaSxoD+dP!&4&Gj!7eqI5GJj(A*O0p6;rj&nW9jsHjXyIplQX);5Mo&Tcx=L&hcX%aP{@dutiIeL zfrE#KIIsJG_@9#ekwX5QGR#_RvCk74=NBu`fJC!AuB3TIM!ayE5T=*?{*MP2k0{zw z{CHaUG={8Zgpr%u*8wzphwQ7-#+j$6x>ViHAx5~Ef4C)#9L3gWZk#XNyY|P=OD0-wYlyRvc zt{?mymClD9fd)PFpnbMIRx&^LLd|w)}il--?R*d`UWx3wy zw{9QXt)X$=T@KLOt-sy}0=7NnnOIg&(C&_1o4bq(81Q7p2E3xkkd5bWhq(_)NTA8H z$%wNE=EU|U(cN~TekgxyF&fX;|tRw`p>MEh^5I3$ zgzEeHy)D%M!+-|o-@Q3p_j8HLZzema5>=+v!gHwZjOkw?wa@DY&`79Nom^0HyDHRu!w5gr^-*6#`qYPFk=$`|#DNOyEE!gJ;v{G` zM*_hKTW|H5r`jE6Adi*+YiO~R#*yFPOtj{pU7x zAQn3Z4cZJXtxZ z3wW@z4hLnH8TNk3>SwSu?o}bJT4Ry^5R2sF=0Nk&6e5ue`dhM7a+`PR_jtVTm+`sy zJ$?M*ywUhed0Ni`g|Dw<|8>ueqpI@L>5JlwI-rhy>)Lpu+9(_M%Kvj4Dof_qn=iPK z46VvMDF)k8a$WA=f1D{6ODMCbsZF0OfOZV#C)6vWs{gC?*H@%xt&4iUrIcVo{MNgu z-~O-m0kU_FDz({UcOO2dr4|-XUG_SjMSr=O#Bp`{xq>^3#2`kN366xKS%z}LS%$j5 zrtn&*YpH-i+SfKSuMD2W9U5Qxa(+@=@uES}& zXES*S99Her$@g30v?jtnP_3JCgv%2Ts6bhZ5937L!)6n5ukvZcR;c>u-Efsvpi$pF zRQn--%S!3jYxV`@^ka;Gwi?x=NG_YQFPs2Wa^7R|ru=>U+7W3qA@B2Y90@ck_?`dD zmY1!Y*1`t|Mcp2NF(HBjC|sd71zS|IG?E2A8F{;Tt$&%r!d?Fn92o;?$RA{<&QYZ~ zP$>zc`ZYbJ9&KiV?~FtYbPa=XqOMGPdaZ>*Ox;FAqx(d)FRr_IWN5!;CIMn}aGisp zcm9@kWY)Mf&zTZmI=8(v2Gq$2hCnrY(#q`GOroq83RavsnOP0 z&_J3uE3J;a+LToK^(=kH{7ktVzcGSQ~jX5qRv+UhZmX{>E7+6RpuMN-4zx*)@bb- zyZP@sP1`!@$HGg$k;CynGP_XD`nb)B_?X%Mzo02Pr-7_YkN=6h68CSZ3(`_ft) zpt{o7PCQfAz=VEgRG`s)k}ZF6_DBufg)N7bFEy(K$M+9=n9rlnV`;a#-e6?-wGrla z4orsv$p;0z6bnCDcZvd)sT%EM2?}UYslwPxaW@<2NazQLhi9$;*wi^05H5!I5x_Nc z?I$4%DA}qYEx9$m*u40`arV9O@N4Vyj#i`_;S5j9+5KjrXll(v%KPVeV~=x1okbfJ z6h(t*+S!PG8GJFISmVR>M!>JI?>I1JR+g8q7Tk~h_YO_V_I-db1)9TGdv?>Zg_0O( zS=$bQ_L@_oeq;W5)s>rG+<{`=Cslfnx2Jxuze~0TICflzM&r)iaUO8$3}5>_J2`n8 zSbkj-DKEDh+*o+WSC3hK6poVfK2%T~a<<;^g3w}9HK>)2y$%mmXpAu~(Tfgb$Tqqk z9<#xBU4-jYq?t(xJ~MuYs&3*HMQOmutCoCA330>)SxTq*KSnpgKgfO3|AdjbzNK;8 z;;?yOo~k6jJQ*wf+34|$F{f@qY9$Rb4nsL_$QwqX-}Ty1ay$RvE}l zwKs-Gj`SVPb-}^D8g=&$NQUI#v!tQzs&xBCk*`0dTkba>By>o$5AK0y-PKRh5``9B zl_om(0Cs1rNC-oT)~6CMmlJ*g;dW$d*Ey!T+d~A8>j&*HsBwk1fAY5~;TH#&J(Gnt zQ)(MKWI|L|2;6EG8YH(LVvCkWRY#3ZyGNSMW>`SQVbJ07G5~*M`yk?*@L?QarTjsN zfe8%u!JtDkPt7FQAmEYr%QAX6j~!nSCJZ%`*p4lGdP>fr&06d;O>{?_jH)2r*YK>` z={N>@yqAfQ%#nxoYI!BKFJINbcmO_X0iLkBsY|c$MyDO&v#mBC!I@(L?<0;vm&1Jd zl+u<>1TxtDjlLa)KOyfI!QPlBQj)q8fx5%E7)$s1R(~swl(T$1FypsKMt@@puILWy z5!%ze#xs|oP70P>R1AfSJfGWU^@O<7`yKTJwS3+U^Ms-3u5urBpE(RN(>fJr{dU)$ zwm!pQ9k08ybr;gZ)wxPna`;(v9M0NU5lB;C*!@m3;LGNqTP~J-mfEIS!;6Eg>6idB z)L&s^@eXVhP`+Yfi2;I}vJ*yrEp@J&BJAZkAs(U093%TX$ zNAjGl&FwMpaN2-)e)mo%eWl6haW*Ajc)xgxp-r=;tLe*_c$+Ks6gL_f@ zbrA#-^8Fk95ORT}Dn5g0V6`iTPn!Z3WoEI1Wew(O7Mk5j{g z-{!m(H(fHKSex**;7^%BSLZx`X35?8rFmplTtWLit@8;I&}__RU-e`tr_;LP z0QnHKjZqb58X=Dl-*5&L+OSLf+ysI4cYl_&zmW#2dLv;vVB}H*eD4Y?Zf`!O2Lb6z zf5s;{9!Cj95nX?_QL1}%`Das9LYHN5uoA3jrCH&rlhCxTDZvZ*ZmDHNcZ(TENPA!#t2?A-Ak=%0ZIC!e9{R8$QBWIn`3|CqQHhn zSC1xu{>xY!2|1^9Q5J(byVYx=I9+ZL!2Io5(2$z{9n&P3&%v12b16b4HvOaVbCx0| zaD)M)TbsGT5&c`?Gy70`$${B?+&hacyK8=M(oU*5k)zq4HK2wf5fRtNYsVjZ{AzlC zh5s*K>E09c5_O0YTyA2cGFEG?3Exi04)r_#Oh>5{=N9jKr`-}A@n-Y>4|JVUSb=0?(%WA)ZlvjI|hO1 zmGiuKqvJWHtB6|lN88RVgcIT)cWM@WJ{K6*7kavqDDO^Kmst|bXf++>?aW?0(ad%1 zHtYMA(!Hae=WovoVlHfBku zN1B|cO;uF|{QT#4>s`Uf7ioQ2LKr4Xmxm`_o-Ps((MN1T_iY`MGIl*sw#8g|y=rkn z!yw<6JHkO~F~xpcalxG@lzx7u091m&($fg(h&+hs(@;I+NmM9oxkeKou3_WtTI$_# z)O^F*wIlrc4`P2h%5Kp$kaX26mD>Jp`4y$#U+ahHn%TAK;6yFn1hyuVc~W=2JhT9+ z0-x-;NmLM(4s%7r;O+sXnSY=K=cl4j!G3B$k{VorUm{F;HpFS{Yh;vlvm`(EMLV`J z83zbL3a4DWpHc~fKQ-&SwL0}a+}6!~I^LTX;-&WQ2+)n(mR-A! zdd86qGj&?Mua|Lc_vHbySWhR`mIP%rBo&4(m78=5LA@jBVT4XOXlLM*S^b^ z*XS9ZDuo80fuO#JUq!@UUrn8F#;Y%9tSX>p>XD%fn(l09xwV`RlcrE;<`&eh*~)iM z3!oZa_{ht)oEaWCQD}Wbjs|DCDVx8bdb-v|gEFr+yPc}w2xGkvT4?jG8^CJ&L_%)= zXBtM@r*Y(kx3>xgD$rc1o-(XzTc#%G@3ju9fC43@TuCmkc?gbB1!fTB!#c-j2L-O^ z{bcVP9bVt%oTxf_(ajDiY;}v)_z9uzL!hcYmIy2hANT&!FDMCp(gJjT)Yy5sCUF`X z)cI<)#b4P}RwsQHdLB)OpkkAWBmEQ#2ZT_$I_gtIl9)o)RNHsq0KfFhqA3i z=KN^A>+q1tiK)bNNYvLCvHlJQr&vIOXV{KEyV&EME6O=}hU&6`d(_yQu&!lk_J;+# z`;s^g{a?>rEi67z^1eOkb&t1o9_S$Y~AkopohMk3-Ag)2r6Ypqo%Z_^OX z1*Q#da2L1ASNwF&lbd(MI|a-pI1$NUuz`|2{lUmetk?!f?&yX?MnoHQ@vHBF#q-_M z>`_nP=a1n}U(y}7^sn<4DNYdV5 z0X14nh5>>KWsiH;%={SXBm*0I*mAu@I`<|SKA`b3nJ@(>Q|V&lGx_Rcr-8zkFIMx< zTZo=u8X=kBEj|dWJ8oYOzIhX^J4#`Q!VzNv?4ysCt}WQF>dtJ)2h&@OWt{G&rdNX4 zn@OSxL9mxsH#dW>&trn8rD6x%N*ok0E!WGGBf*j#!+L!;W~wthFtAonmU(RN z!>V(89BGr0TN~|!^dp8Y_SaqPg`zHZpBWPxY)lMEJm2XXax)*LmiwI)8z!QEK1|!Q(A6zq&%E3ibQC?>5kJ=0cs8>! zxgk(}-vg1+UTY80yS25{YPKs=M3hxW?iy>yJhGtMXE~8jswk48!kjKJW3WClNX}io z4?qhZm(!s#G+7}OL8+NboBNxL1qa^0CP}&tZ>%;S>D@7QdZ7dV>^F8=|8fnIvWoEx zKF7wB34xnPqt;zCqRy0RRUiEtoW@!HzLizr*G@5*5;|LM`NjK$zq;`}WElU@pA_zP z+UV5P)cm`An)C&`t8~u+7U_E!(u;xgCmVHkgJ##B-!bJ>{4XdIMx)h=yFVD+lVhVY zypZDmsrdTQ_d^(l-q&(z=AqjPjoRK)YJ!O@hT3jpOMlcs!#}%jTcnk77ir8r)f`{c zK}~Ojs0y89pI}QkJAMpkH^u5F-l#4x<{a5PZ ziubGe?sZtcii z5UX65O2@#5x1GsZT<_k|qLOg58~BfOXbf7cIxJ$5v?EGqQ=mYIsN(%U8y=ODdP}&e zJTuK%|3QJq={zJxL~%$kT^G_9E`s#n*Wk^@141%HJdg{1oyqAiZC7bboNmujJjNN; ztF&8<85$bdNn_q+``z(#eu1<8Z0Eazc%}>NtlEez(Datuzb7b&kY7_Ti9i@WBc!@& z2k~B-e;4MrzEL%Mv-AQW;@sFt!HA&raO`R6@*3Rg1oF~j$vW03#JyS{#` zL#vB2TM(}3g9cAZ+9x|2S$e)0!Y`AdXe`*-POt)QCs6EvP9qRAOHO0gxNwD}No-l{ z%05vq?!O|vEpHq-Zm+3+uK3(K;gnBh*MAC@v+EqKM27-(;DwCFeoJmH2Cmf7G`dh+ znGw_ok@h?6w5(!y_>LgQr#wf9L`GiKAM-IaVFOQYU%%CxX&J;L;x;Pk>uMXx7RYV2 z)svMAhQp5on4UEI7UR`qyMyEwex7l@KQ5gSuq z1t9$SxPKcwjtY(mqh2FcMSb1Jl=D^WamK*Ub|VNdw}(fUaCIzG(hh)3S-3pB)ErbFB<_3P?{A$GQ=;?31=zJB}<*a1mculYW?6kHZq5G!KdueQ% zjkO!=mW8$Da^{dS5cs*o9|@)1-%asjpQMObPHNmMl2%x1_j$Z|bt+UJe?Re18+EMd zg;*J3rqF4=sqCYW0Q6U|MZC{~Fv$T5Z1O)vY0b_OJ9AL)Y=!zZV!FcVu?FBkFW~6~@47?gW$i0QJ8Kr)qM7L=>nEIb_XQz^gJep}Z*yr6S;Y;No95Z$Kd9UQ&2t4lYPr0gLtQqDo&1 z{8q<^rk4KtYVBM{jYxcYu;I3OYl!fc6u0w!A2^4TwNj8bVZdxcb{0EoKVleWjf}Tus@bs`aWPX@Y(ylRX#DzRh~((iR~spUBB?#9n=Xk?b9_j-;l9 zhZJxx>FQ$M$!m9-xK*6PTpik8c8765*QgCY0iP@ST!m0liCixH1xWSVETlqS?T^e- z&b0l(#^sZ^|AZ?)=dp=-vBOt3Gc2pkmn)$N)Ee8UM0W_2 z497QDk)0!n!4w>}F&0R`S+TavV;SA#Aw?!J~(dg17*D z=!apz6%5|}H9F%qYs4-|={K%jY6|18XO`~=M@O|a&o-yNp4XuOTsZ3Y{LT7^#XrT) zOzP~&^*sYDz?%~(-L>Dmyy5hDca?u)aPT+ptb`q(QLXyH{K6U6yY)T}Rc2k$Hdo*E z(5RIOJ{<*9^Ewj!hcl}99FCDbyQYaO%3L{^f?TK~d#RPGNB_?UZZf*Y5q}iyH7LkP z+2a!h?->Sf^iRsa)XSOl3hnu;^s?;zIXog{-t*9~0YfR$>sKjVypo%!|i$)F&6BvlYih{LYMU^uJycK=Mu>mNPG^c@~U6;++$m^xu2 z<#SE$BKfq-bmNF>Mp?_H%-5Nc6lmC8TUk()g$YPZg^%xhGZdT^G0Qi;=AMbhUz5oX z72po<>cz1{U529k+GeeNp04Gugb29v9dKa`&BR@{pp)NB@T7ALvJXm8kxG(O1NQs7M~QVt0E(@Rh#2}Ig5oN4xjOYVsduP^(UB2@gJ;Rh_Qx}$ zX^wgEu>i_d8OEBj;#m&bJF@J8-hjpy7oRTw3i$@hH^VyY(YjYXbMkh@0xbUeE%z;2~tOii=HSp$X`shyve6 z+Mo|jQF#0&QEjT(*&1m5_qPL&Q1-QBsy^e(@JSsvY{5c%6sdFi?^X_qf79gmhv<#D z4_@Gf^D#|`5AejeU^H;zJJ*{vc%U?G(*e*F{hgELaz`6rpIMsJz78rDn!NQfA&Tt- zb~SS{F=j4jiFrwlOmZ-D*9XoYhoKI65JJL@yANng>y!CX?n9*AGTDj0KO?D`h*Q!9+naHcmlQzord!kbQ0fUPhelxXkr zjl;sVGSaF+{zu0mlZ`>t;VEMQbJQ9O@cPA(zWHD8ehP|gJMQd-h_*0w@!x`Vw#-)n z$W&`CMi++;SGxbxFg@B&$TSD#B^6c$og#)0``4Py;j;C zga56rN48S*{213KtK4j4-atwiuA%mus1FrnOxY|y<`3?X|oKR5u1+EK*fua%Uuk^iViZZFfAE6Riz6W{{t8T$M$SYa2F zq=)Hd3C1U$fA3u$qsmsVPMX=OC4*V1yN!32zAZaaC-s6NpmT;E9|9@|sjqioj#W)F zO_P5uY5D;6_-RsyU#xiXGCW4YC&VG4=nrp*#iIENMl=Myzj%G7Tq>YcsA=MmPVoSm zq!aJcBXyIJTOUfzwnVye+ta~zk)1-_`AS4Vh%nP=i{ zp`M>U*?v~To1kP)8>y7q>3X{I;%Re0=;Y@+=0TDe$R(|N$lyHsaIV(d`* zEk&jp?B|b4yd3GeA1Sx2MM20qpvvAt_{V>?8NRm+riAiU$8cP-7>W6x!U1(!*ug}Q zOpW$a&!_JET@VPDKb}S4Z)tq`VsI~|Y{Ml{Im5c9=uUNo08G?i_D>g&iB51Nx*Q&mS^J0XXVSu3 zhH{J~Yfa#vfaP^vl=Hh!%sf{mU8lhsv99Jh_{w-BMrU}4`^6|GKb~j!kH(gg0wo%7 zyy7;+y45S)2DIh=K=>uMy>OUc=ex`I!Qalrz#o=~9)s%KS7hHcFnq8uXbj7c;tdCoeJPnM1TaEZd*z(C;@zQgn-y6lvW06EFY107b&}t> z*ZhQnL>FZoE^!{56yb)?8FRWn$`M|kuG?tb6EmW(jYG*iQTNq|EijaZ+AW@99@nzx z#$4E{@5uJD%LH7H>{&met&uSj&!8eV}b)-3#u_~OY$>IR6i13r|YJM$Zt2*eOknIv^ND&?`A2>jFX z^#0&b@dfOD?T`wZ#A^RWD#mTuJ;tA?5FF(kxD|zkc%P!{Pv4jwG>`m#l)^crWDOZ}&y1SJvpTn6w_bq=`koqZTC||F?E4wG*7b8V)LkpEh|Lcn)j0;hpY2 zflp(;QO4IMzlrz>DcA09TVHs3zl>;oR62TN!uC$8SA17VsxMK#0`?O6%3Z1y=gbjm z?#e$N`Os~{#J00G?3<1EF0r&vX#?BFBFkgaIV5f?&i*=ZU zj>+hXF<+#ohhG0{c11qQ+Tc1Q(=Y9%DoSC++i2WRbG`(Wz#rtORzsE`{A16rqz$u% z@4Zbyc9QJo;7npn_x++vU%M}{6EQ_z;regxf*O@Nz%tAM7n2)Ba#)$ty*GuU1M{oq z@H-L(uc&s}V2P}S+LYx>&`F4W#dx1VbXf0eCAOdofM?=8&mN9_&M(iVXV%XxrVMEE zC{$)v#gm$_kVk^qi6LlOWDy|aqks)FpIs#abZ*Op=k&w+^!OwS#8#koey~PY zh)79X{`bGueSP20n{&>Zwb%1~_WtZz(qBntAQ6pYbM8k@z($PzKw#*^-W*z!!}bf? zLL6$;hz`;GB-<6WdS$WtbnQ*|_51C9>N5Y~x|tKw`1v;ObOvE0*uvVNGrj8;Muj|M zCUrKnx7V#$D4pQHYPFb<<-k0a+9U@HqN84*65g`>z-9!Ze17Xs@vH3L`@IW)Z5i-h z>eoA8K-6Hoy~ynb|MHVkl^-#1gD`(lB@+=X!G2h|4IBjPf2$zl2S)g+bD=;wBGh*b zzmfmxPG;==2aP*S7$xDMl`-&(l?VrH7=in3k)*+@cEnM-1|v8|x2D7}DdO;U#l)y` zTXrLSBg%t;F7_K*?MsCI!Rs$%4z?UkH-|s>ulbQC&REIx7gsY;c&J&8;jxYdW@bW8 zD`r(~!j{x^f6dfAL1RmmmEELBD;R_IA0!p1{=mRNaL$z#J@SVP+91f_pW5?PTv-6d zS!$R~U&yzrH1}xK{=5kEM&oy|wvQoW0-%%UZ+AQ#`fV$p!2o*@9!+0#r#r7M!B z5&&iiaSK$2F*dg}>(U~S$LP4xgGRWjYozgqAk3)R3c>%zp(V_IJ~;mFkBvu%klqVR zFlqDIlKproMY9|nip;}f!a)L|Uf$E$lFGrd4L_3&+-_nJ0u+k$&0DuM#qxnsa=%Tn zl?YBvcXA{2kkgMwU;UP_>Fi$D#OnGTA2lw8$T^EP6yUQNzMRKl1mp-C$>x`WiWc*AMFebUDV47e#kwt1~!Ec3St_e$H4V6zHjA(Tp`avH#aXa|( zfiPtpR9owi$g6Lhy*T`MaV(&FBw=>WP!G}Mc@y$^gIK$|)d;>_2y;NcyLX@q*D~ka z1C!SMNuoi`6KOQJM}`1rRzs=1c&q|_@(sVK{{WZqQ4hgedEqS)>2N%=u#o$pac2ad zVhET41WdZH@0oiIek1WCEpt^4;YTzbFEy6G9>*lu{&;WtG6yHPFYP2yraqc9S%0az zH=Mw!{%iG*qmwH^C7{ZQ-F?@!(houWGAU+usEe!G(r30odQ+Ynh;O|}{}j#<4gCPT zfBnfpT_s9~Oy5KXhUAgL0|t={Qyj>aoZUY9H-8kt$J!W&>P7w%$fYmN6=Qa9+>e(8 zh<&lZ&TJDwr8uxp-}5ff(AWdJYIbh5k4s%myxP_Xn*bqUN( z_*lnyH-~FxPIaR3cH^QIx0}uj@-Eporcv>~qLcGp-EZI`pRYN+w@>Xuif0>muRM05H4JUxd0$x9euvB^%Xcadb?) z*u0^{0F2X7CSf2RlzQo`1QigMscYP7#K(WcHqApx+D+DoOeUQHw(^M6Q9M^Y-OVzb ztWT}uJEM`p{NN4g)A&5M0MzRrq^d9)KG~nD#+B^!q@*$YAe1l;4y>AxV$F?d5Wnm9 z=qYOD?kx;H06J6qicUP2hm9l^P{lHR2TAfjtpw!ys3kM?C;r+`tGs0r)VpfB z!v@6ug0a0O9ia6MDGLK!JLF*(6ff~t_7{MI`Ub)*0maWj{kQ;3(c7%J zA)zg(d}q)_;Iq^C5An)WXj&l5Z`C+(QQg2Rykh$4*`+a^J|A+c?qN%S12^pa@GGVv zUP}y1%Pcp5G7{T#yVSm8&{@kZ?PEtV{Z}VZC%00?{>byCc)A$d3Nqwj8llb46VS>x z1F?Y?8$0dnssk*80;!9a8rqaKQ6X`|6lUqM3b!_^sww9(9Xe%eh)Dj56^u;MjA;GSY+ z@G+MF>4Ss9RKt4X&_@^c5T><+WnN#!*Ju>WGqD3<}DR$V40y7w8a4Nwc>Bw`> zf8TPSV<-bN=nQgsM%lt6PAa z+wN#wCit`aR%9rWe#teZt$5*~D`9G1&5-05v33UNg_?>HPYOaHfaS+9&JQ9vBPzCb0Z{>`{2q`Uca~xjl6-B zgnJ!8hhtdF;#kcOHN}99)73V^lY@bQf$M9Q8s!rH<&|+f?I8*D(%)Q415)Ckd8h!9 z_n$B$OHPXP00|@pLi?;sNjkCGbb$W9z{NO0;1X`9<0wANamb718Eu zb-`9f$8t&+BUy3FvC|hEd4a1y6Y;fs0j3yx21JX6Iz2vkzkDwa)Jt!iygNruO__z) zxUpi+R80pOwwAuCqRPn+K?io&J`%jX5o%I!O@P_CbXk;wKy2G^!h%~{i@QWyMl9qhcHtb()qvxG5cw$Gas^UuPd(om31m0(7);82rdA;N`M4T0YayoTQ(J5j{{+WS9UI zGH};X8GPFxRQ*7R2rKPh`>h?;t#?CP7dksaHi(`bytjPuj=db4@@c#R12V6iBCB+^ z{`tFtw?ZA^Q>z5N8#OSDe%wsKYf4E=+jU2>K2Qcm6trhTVVbNLO(&*SxXzURG(8tx z%#<{HYt)*H3*u~cIk52y0;IF~^C=a8dQ9^4DZE7ZUtfXw1#i`T{QoV@ zf#hODdhN3kuX}A5IY~L&D)brnWAUnl`r9bTSVPXAdz?)#3jqka{OT?rss$-#xRfqV zK0l#;4hVB+2ED_P8c^)ewh~InZqpthj&Z*j6=NqVKU0wd*?f@^(-u>(ZKrK1gKp?) zv;MP!07R7UPQ2{^>(U1WK5osJS7?a(4TU}r&AJG$XARmU!`I|3c9^+h&%j@c=aQBE1EcMFyFsy z-zHH4;5iI&MnAPjyNf_Z)*#hhaBckrN;Q0;pF>QEE`O0rNS<-ARwF#shS#K3td_Z3 zVX{amDb`pk0gD%fhqbIDzi(CioDuE@WK$S5M*sA@4`}j4n$+}wvo9=;n@HAUIGc)J z)#!2XmWV%;n`Bv+O30DH=J{s*2ZutiOEKUiN2YD(U5pDJWw9X5ENu0K{d7v&PnT*y zZ>uhML`%dqa)0HcPa zBrt65yz1B`+P{oWtywQn$4?Z0R~m1_d*Us?SgFz_Z9L!LP4-2xvYA-kB6~UyifTpa z5cg)FJIhE`po^)VPutSD$yPL6Jut^j#1EpuiAc7$eQ*fDtpZ9f;6W1`F9Xmq{~+_* z5e0u^+UC)v)voGq^M}kY&HzkI$o#+nM8!-(9<~Rz1sP>1;k2?-PrLr5OT%c*p{O;| zv32bcedRr8`!QmzKZ}XNq)Vw{V?%@<=!Y%fs#UxY6D({dYBnTC!UpmVn#fjq zUK0SreAow~-3eE4vFMQmABp65x@M*0W@F`LWmf+?q3x#uiZ5AObq2*oF;GzfK7jTC z;bb_9N+gN@iJWL&g?K&FPXNX25lg!*4Hjyid`fHLr$7c3=UW260UsMWEF7dwMUhQJ zbvnH1f^d7NXhSqVPg^78X?4LP#3<6Fgn^1>JX zpd=hl>{OeJfv-A%U&(FQs++nU5KU?{F~UlUi8QIzG&yErBx2$G%OaVBqb2v=$p<%` z6-kvz_?nSEixkPeYojhcElUKIA@L-ZnqUyyZntFOc7M=(>90hQ= zeU@)eG5#P_?qK41iV+W+Qivycyt~B4==emGjn*!xf1q`3bGnq~S8issy%1|80rHxo zR6zomVu`L0Q~LYOK!3QF0@&CE1I8_2S&(D zdBgzOULI%!n8-PDMNHA&*{6cY5r_RPo8V3-o*Zf2-e2HS$Q%gCrh-=-r?K*~N8m{C z5QB_zC+n}r5B#lUbIFmX)D-3%&M8WC5eLuX-Kx$NJPnzF*6~_`^iC$B4?yjK;~{{0 z|GW9Ax?{~d2kT5z^W8+$q5r^l#dm)8MSf2|3balp_NpHY5XoF&x?|V9%Eu_DnkBz< z3kG1tzA~Bz1vM2ve23V801lylp zQ3}1q3yY1sm{veH?#Le=bECT0jqPakwYWP8)GA>GkO+3jLM~R8SQyy};LlD(n&s=< zGZpVc?4>7yXRVbhU&wMwi2L0Ll&vu@e>3BRjIkRrCEGtf%%tSGrdTE)7@`3Z9yQ{g zU99a0Tokil(0H1)GAm}niz#eER}ue^c0* zGAy*W);ly6O|2q;AT^p92bqWzkY)SvR#28BPLdX|CEG_!pQZ#9EK4xp;=aI2+2T{h8zI!WA)wyspc1oD z7B&EiW}#;)hyJ^dXg%t?4>yCCPaqxuD7{pZtCcki{QuD}>;6Z-|xkl{P6U7Exs;2~}@nDr}?5+_PgoWF=;# ze6WwLv`()47+o5c8tGLO8(Hlc5MAP)RFhiq$u6TQv?3z3d)DB`AN=b+E!E>~lqR|A(eF_mV!}C-*X_yd%9et!Vl~ zd0F~E=ezk*hm_nem0!JEMjR`PikF(65=Nh&MONhl;UU!nX>BE?IiE-RZKJ+4XBV~= zb)~h8y0;Z)wzq{Z4;emjm*xG*19NsmgKp>LHXSpcj@r#n+D)E(%jWU0isH_cuGY4a z>V<)s*q2vb~jv>cQpZ z&bF&<_nMK_ANy&wW1CAYW6h(hjgwnT-BW!ND=Yiu7YFgX9TUA%>+Q4qKfcaw9asMB zo<16!cyce#dZzmq4}K2JJ&BjQCr!gk|Lb0!JfW8dXJ2kk%18dMdwD*xII{ZdV0Pt+ zzWg)3{6t?)t)EV8UR=!l4}JOMUQX{^J-L_vi(W1q-2OlA^2xdkxUPRH;p(aXOI*%( z#rSLOuU@O$x6F=Z&5)8bwlXra206|0g-BA_u8z*6NM7WwTF<2{U=JlL}$L;kC!Ysx<9)6;&Om+q=2rhyD@Kt;5A0IJ7;#I$%(=uTR zTCx2<-BRj{{m&ExLa@U1@6kd2bu3YTqVkeEUs4 zesy>?Y>e_P{+)H8E}k^DyK&{(=0o?uwLxJs_7QroNBt{lMdH;d@}yB%B#MvMC{L+WOHfdsBjZ)s=Qang&D**8F$(ou3D4hKWqF1EXM8??Hk}`I3>A?HNKOzKO{Xg2UJw>s5Isp@8D9=k4s%h)UoWuK@WQn*CwrVhHX% z?>+QB`+Kbb@IVj++A!P5M*tc=L9Fm7E9eIlP^;|PXlt^)FQ#6;Fd6A(lRJ|aDH}~X z?0?a5W_c00R*A5Gv*DoDr8@$3y%xpZIjzQqjs1Dc`RE)2ptZ*Gz@*0vdN%gUDVio4 zPuRuahSOm0VDz1R?to5>?=&fY#ZGm}V^`~?8KAHvD{5&KQRxzCDrk}zu`DnJl-8OI z@W!+DjNCWS+#}bE;sP7q>K!&1wX5|h;wMFZIYlI~ft1||xm8}2LM zU#}ZvLt6<*pe#PnWwHM`hTuDu5ugCf_@@Ud+57!>_ zmXH|)C$!eUMF3i=e*3`yYlv%50qVh%DB5dc8DzyD0^X%#p?=h+&I<~N4o<#}M(1XJ z4G6*sl)<*th|tFqTX#b`OWjUO2s*!1-D%===iWKzIULJY=k z9LG1F2#+wsRHYOzU7qUOW1LuYGoa#$L8wznv~A!8aFA|bJB2O4wdxDUsrDW^Tj|_NL6rrHF!2i>0(q`YNrLqg&PM+E=mNG-AOrt3h2o?vPPz;b zkMs6x)4QV)VnEj$)Wb`Prcvmj3!Jk6$_&noz#F`2a-_w^(;t2DHDK$t5hQrQfc+F~ z*&|ThJ3fP*+L`3n!1+pDeO?+Ev*Z~tTp;T3n2irY2U7d;7;*B22GKqm;lTQpu#hv$ zLZ+|uD9|-hDRGdENu$8jv>LJ8i^girZIid+flXA!<$>Y9h*(_SZOj(GjfSEa;`ac; z1lKOh1pS+tPkL;y+JX(T7eRi4Zz~;bzqd4&?KjufUSdSNjMZ)g$i*ZXv(XcYWr&Ma z+1_9y;Jg=)q76ubi%qO`ll2WnQ}u5T*6`d-ycly#+t2EVOAHO#V4yf1Br|%|CiIX8 z#DBvJh(EuX-Dm4FH}w#gxK8W2Rx|am@D8u@%dA0b1$Yxv2ytK&RKTM@2qDWvU~}nc zmrj{+Df5@Dl&vp_{vT^!_x-3wsuMs1)*(mo!{YaJWM6MGDSYxeraEo5!~ay%!p2J# zrB>=+g+KR2H2dm?m6cUqe&aDnQj)2=dr_npi~io_^Ea5YK3 zQbNXST;LK)p$9^J3w+d3;@fjTOf$CxB(>nS)QY>}yQZ^y;1|goK^d}7J^3M6_oEs8vLZ|~sfbS4z>QJ-UN}yGMBE}%* z&tml-%{pykK0MqIInhZqal`gCuk%1Bi~64J8#X?p^s~PoKQ*zwNA%7QSb zPU6BspW^hD|8ivj`3lV8i+|}-gn!>klGk_VIu4f_pHmwTme_FH#K_+-?iFedgDH_b zz4wlluzC(Ryw#zOjt-1}3Z-SHdFi>AC*F^Lx24uGo3QDXLu(;4-W}SrGJHv0DB-CJW1m^w@(fXiLyX676QIJU!iS}c_s?n=J2z4^u*%LOFwc@|L6Z8#qGAD7|{`ex& zq}M_sqS8Yk!kPJlEBr4XIVj$gV*I;Ww8=gF@#%JT7PA+|iS(T5Dl;~D4Gigx%F6|s|X;xdDoZa$4J z^gL5e##t}X!g_$x>SZWOE)8hlqLB;E#V5%T+#8-?Ei<<7ZW8)5vFk?HCSR#`^i4== zG&0jic6R#ozr)khpIYuGXgo|o_xD37c>m=4W{XvEZ+(I!gSsOU?%je_+g_G526MZ4 zb-ikwm5seDJ|uJEu+vD!LFT-s_z%k20_8NtN5uB$2QpKaOtyuKZv7riH5>2PvH)>^ zHTYZPck@cy@q>B~f!*r*e7nLru#BN_>suG3?>pOs8`{q#NitjZcSGjh^MG)bwmma9 z7cFyA^1s6espl^evtMcP!bEmBz-GbPNbKCKQ*9iIT-@iA>+(GshWx)f8m0?1%!3e z7x{NeTk`^Q<&>4^b-aqa*kyB7ix07&6&>Tuyg1$onbrM0jj0|<^)_kTV4A;@=W?Cs zc0U$or7<6WE{SeE_w({1eEs6;A2$*!9qP-Z-Xw$XD@N~5_-4a&-iB%Et!*ou|F>UE z3}bdbhg1+oUYxJF6_^v>eyz&xaet^bhJgJN4)rKR7%r zq~F*5&b3Q28Oa9>EvF>Y70sLC9^8KV?91n-w2T7k-D|< z_F?6^0)gr2^*JNYcVwz0shPQ?mTwB)IB(?{pG4Y`+;o=Ef)CaSjLis-@Kfls>3+Wo zD=R~X_|$V!2TY?x@5M7nfAr>FzRS##&K(5ST8b-n8CwP8<$#5S3kiyRZCZT@a82)O zb`WhnR;XqbMn}l^wH-OJJez@#=?U$P3MvA@OetxsD-Px+~EbQPCuqt1vT?VDx# zXl$^!Ji9vkK?>J+!_o!>vW_H0@BNOhbQ=pwCh9gn8_w5%HeX_IvRb$jy|UueDF;r^ zYy7vrXZv^mL@m6p;*E�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�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 #include +#include +#include using namespace std::literals::string_literals; @@ -19,6 +21,7 @@ void runServer(std::unique_ptr& server) { using namespace httplib; server->Get("/test", [](const Request& req, Response& res) { + std::string content = "Hello World!"; if (req.has_param("modified")) { std::string str = util::rfc1123(util::parseTimestamp(std::stoi(req.get_param_value("modified")))); res.set_header("Last-Modified", str); @@ -33,7 +36,15 @@ void runServer(std::unique_ptr& server) { if (req.has_param("cachecontrol")) { res.set_header("Cache-Control", "max-age=" + req.get_param_value("cachecontrol")); } - res.set_content("Hello World!", "text/plain"); + if (req.has_param("range")) { + std::string str = req.get_param_value("range"); + str = str.substr(std::char_traits::length("bytes=")); + uint64_t start = std::strtoull(str.substr(0, str.find("-")).c_str(), nullptr, 10); + uint64_t end = std::strtoull(str.substr(str.find("-") + 1).c_str(), nullptr, 10); + content = content.substr(start, end - start + 1); + res.status = 206; + } + res.set_content(content, "text/plain"); }); server->Get("/stale", [](const Request&, Response&) { diff --git a/test/storage/http_file_source.test.cpp b/test/storage/http_file_source.test.cpp index 68c5e890bdbf..e17a9489a31e 100644 --- a/test/storage/http_file_source.test.cpp +++ b/test/storage/http_file_source.test.cpp @@ -37,6 +37,27 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP200)) { loop.run(); } +TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP206)) { + util::RunLoop loop; + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); + + Resource resource(Resource::Unknown, "http://127.0.0.1:3000/test"); + resource.dataRange = std::make_pair(3, 8); + + auto req = fs.request(resource, [&](Response res) { + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + EXPECT_EQ("lo Wor", *res.data); + EXPECT_FALSE(bool(res.expires)); + EXPECT_FALSE(res.mustRevalidate); + EXPECT_FALSE(bool(res.modified)); + EXPECT_FALSE(bool(res.etag)); + loop.stop(); + }); + + loop.run(); +} + TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP404)) { util::RunLoop loop; HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); diff --git a/test/storage/local_file_source.test.cpp b/test/storage/local_file_source.test.cpp index c845d5bf8be6..e0e6c211b4b0 100644 --- a/test/storage/local_file_source.test.cpp +++ b/test/storage/local_file_source.test.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #if defined(WIN32) @@ -25,7 +26,7 @@ std::string toAbsoluteURL(const std::string& fileName) { #else char* cwd = getcwd(buff, PATH_MAX + 1); #endif - std::string url = {"file://" + std::string(cwd) + "/test/fixtures/storage/assets/" + fileName}; + std::string url = {mbgl::util::FILE_PROTOCOL + std::string(cwd) + "/test/fixtures/storage/assets/" + fileName}; assert(url.size() <= PATH_MAX); return url; } @@ -76,6 +77,25 @@ TEST(LocalFileSource, NonEmptyFile) { loop.run(); } +TEST(LocalFileSource, PartialFile) { + util::RunLoop loop; + + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); + + Resource resource(Resource::Unknown, toAbsoluteURL("nonempty")); + resource.dataRange = std::make_pair(4, 12); + + std::unique_ptr req = fs.request(resource, [&](Response res) { + req.reset(); + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + EXPECT_EQ("ent is he", *res.data); + loop.stop(); + }); + + loop.run(); +} + TEST(LocalFileSource, NonExistentFile) { util::RunLoop loop; diff --git a/test/storage/pmtiles_file_source.test.cpp b/test/storage/pmtiles_file_source.test.cpp new file mode 100644 index 000000000000..abbe34fb0c27 --- /dev/null +++ b/test/storage/pmtiles_file_source.test.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace { + +std::string toAbsoluteURL(const std::string &fileName) { + auto path = std::filesystem::current_path() / "test/fixtures/storage/pmtiles" / fileName; + return std::string(mbgl::util::PMTILES_PROTOCOL) + std::string(mbgl::util::FILE_PROTOCOL) + path.string(); +} + +} // namespace + +using namespace mbgl; + +TEST(PMTilesFileSource, AcceptsURL) { + PMTilesFileSource pmtiles(ResourceOptions::Default(), ClientOptions()); + EXPECT_TRUE(pmtiles.canRequest(Resource::style("pmtiles:///test"))); + EXPECT_FALSE(pmtiles.canRequest(Resource::style("pmtile://test"))); + EXPECT_FALSE(pmtiles.canRequest(Resource::style("pmtiles:"))); + EXPECT_FALSE(pmtiles.canRequest(Resource::style(""))); +} + +// Nonexistent pmtiles file raises error +TEST(PMTilesFileSource, NonExistentFile) { + util::RunLoop loop; + + PMTilesFileSource pmtiles(ResourceOptions::Default(), ClientOptions()); + + std::unique_ptr req = pmtiles.request( + {Resource::Unknown, toAbsoluteURL("does_not_exist")}, [&](Response res) { + req.reset(); + ASSERT_NE(nullptr, res.error); + EXPECT_EQ(Response::Error::Reason::NotFound, res.error->reason); + EXPECT_NE((res.error->message).find("path not found"), std::string::npos); + ASSERT_FALSE(res.data.get()); + loop.stop(); + }); + + loop.run(); +} + +// Existing pmtiles file default request returns TileJSON +TEST(PMTilesFileSource, TileJSON) { + util::RunLoop loop; + + PMTilesFileSource pmtiles(ResourceOptions::Default(), ClientOptions()); + + std::unique_ptr req = pmtiles.request( + {Resource::Unknown, toAbsoluteURL("geography-class-png.pmtiles")}, [&](Response res) { + req.reset(); + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + // basic test that TileJSON included a tile URL + EXPECT_NE((*res.data).find("geography-class-png.pmtiles"), std::string::npos); + loop.stop(); + }); + + loop.run(); +} + +// Existing tiles return tile data +TEST(PMTilesFileSource, Tile) { + util::RunLoop loop; + + PMTilesFileSource pmtiles(ResourceOptions::Default(), ClientOptions()); + + std::unique_ptr req = pmtiles.request( + Resource::tile(toAbsoluteURL("geography-class-png.pmtiles"), 1.0, 0, 0, 0, Tileset::Scheme::XYZ), + [&](Response res) { + req.reset(); + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + ASSERT_EQ(res.noContent, false); + loop.stop(); + }); + + loop.run(); +} + +// Nonexistent tiles do not raise errors, they simply return no content +TEST(PMTilesFileSource, NonExistentTile) { + util::RunLoop loop; + + PMTilesFileSource pmtiles(ResourceOptions::Default(), ClientOptions()); + + std::unique_ptr req = pmtiles.request( + Resource::tile(toAbsoluteURL("geography-class-png.pmtiles"), 1.0, 0, 0, 4, Tileset::Scheme::XYZ), + [&](Response res) { + req.reset(); + EXPECT_EQ(nullptr, res.error); + ASSERT_FALSE(res.data.get()); + ASSERT_EQ(res.noContent, true); + loop.stop(); + }); + + loop.run(); +} diff --git a/test/storage/server.js b/test/storage/server.js index a7de0944d4a8..04ccc430bfcc 100755 --- a/test/storage/server.js +++ b/test/storage/server.js @@ -15,6 +15,7 @@ var app = express(); app.disable('etag'); app.get('/test', function (req, res) { + var content = 'Hello World!'; if (req.query.modified) { res.setHeader('Last-Modified', (new Date(req.query.modified * 1000)).toUTCString()); } @@ -27,7 +28,12 @@ app.get('/test', function (req, res) { if (req.query.cachecontrol) { res.setHeader('Cache-Control', req.query.cachecontrol); } - res.send('Hello World!'); + if (req.range()) { + const [ range ] = req.range(); + content = content.substring(range.start, range.end + 1); + res.status(206); + } + res.send(content); }); app.get('/stale/*', function() { diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 66815d83b447..78fbf69c6c8a 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -154,6 +154,15 @@ cc_library( visibility = ["//visibility:public"], ) +# vendor/pmtiles-files.json +cc_library( + name = "pmtiles", + hdrs = ["PMTiles/cpp/pmtiles.hpp"], + copts = CPP_FLAGS, + includes = ["PMTiles/cpp"], + visibility = ["//visibility:public"], +) + # vendor/polylabel-files.json cc_library( name = "polylabel", diff --git a/vendor/PMTiles b/vendor/PMTiles new file mode 160000 index 000000000000..60f3331ca9d5 --- /dev/null +++ b/vendor/PMTiles @@ -0,0 +1 @@ +Subproject commit 60f3331ca9d5cfa4fcdf1e076a3d3059aebb17bb diff --git a/vendor/pmtiles.cmake b/vendor/pmtiles.cmake new file mode 100644 index 000000000000..cb31addee701 --- /dev/null +++ b/vendor/pmtiles.cmake @@ -0,0 +1,21 @@ +if(TARGET mbgl-vendor-pmtiles) + return() +endif() + +add_library( + mbgl-vendor-pmtiles INTERFACE +) + +target_include_directories( + mbgl-vendor-pmtiles SYSTEM + INTERFACE ${CMAKE_CURRENT_LIST_DIR}/PMTiles/cpp +) + +set_target_properties( + mbgl-vendor-pmtiles + PROPERTIES + INTERFACE_MAPLIBRE_NAME "pmtiles" + INTERFACE_MAPLIBRE_URL "https://github.com/protomaps/PMTiles" + INTERFACE_MAPLIBRE_AUTHOR "Protomaps LLC" + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/PMTiles/LICENSE +) From f5823271919e7252b08e0a0bbd97d2540e095231 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Wed, 8 Jan 2025 17:41:29 +0200 Subject: [PATCH 032/339] UBO consolidation (#3089) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- CMakeLists.txt | 49 +- bazel/core.bzl | 29 +- include/mbgl/gfx/context.hpp | 5 +- include/mbgl/gfx/drawable.hpp | 4 + include/mbgl/gfx/uniform_block.hpp | 114 --- include/mbgl/gfx/uniform_buffer.hpp | 2 +- include/mbgl/gl/drawable_gl.hpp | 3 - include/mbgl/gl/layer_group_gl.hpp | 6 - include/mbgl/gl/uniform_block_gl.hpp | 49 -- include/mbgl/gl/uniform_buffer_gl.hpp | 5 +- include/mbgl/mtl/context.hpp | 5 +- include/mbgl/mtl/drawable.hpp | 3 - include/mbgl/mtl/layer_group.hpp | 3 - include/mbgl/mtl/render_pass.hpp | 3 +- include/mbgl/mtl/uniform_block.hpp | 59 -- include/mbgl/mtl/uniform_buffer.hpp | 7 +- include/mbgl/shaders/background_layer_ubo.hpp | 43 +- include/mbgl/shaders/circle_layer_ubo.hpp | 62 +- include/mbgl/shaders/collision_layer_ubo.hpp | 19 +- include/mbgl/shaders/common_ubo.hpp | 15 - .../shaders/custom_drawable_layer_ubo.hpp | 29 +- include/mbgl/shaders/debug_layer_ubo.hpp | 13 +- .../mbgl/shaders/fill_extrusion_layer_ubo.hpp | 53 +- include/mbgl/shaders/fill_layer_ubo.hpp | 149 ++-- .../mbgl/shaders/gl/drawable_background.hpp | 6 +- .../gl/drawable_background_pattern.hpp | 12 +- include/mbgl/shaders/gl/drawable_circle.hpp | 26 +- .../shaders/gl/drawable_collision_box.hpp | 19 +- .../shaders/gl/drawable_collision_circle.hpp | 18 +- .../gl/drawable_custom_symbol_icon.hpp | 7 +- include/mbgl/shaders/gl/drawable_debug.hpp | 12 +- include/mbgl/shaders/gl/drawable_fill.hpp | 14 +- .../shaders/gl/drawable_fill_extrusion.hpp | 34 +- .../gl/drawable_fill_extrusion_pattern.hpp | 64 +- .../mbgl/shaders/gl/drawable_fill_outline.hpp | 20 +- .../gl/drawable_fill_outline_pattern.hpp | 41 +- .../gl/drawable_fill_outline_triangulated.hpp | 9 +- .../mbgl/shaders/gl/drawable_fill_pattern.hpp | 41 +- include/mbgl/shaders/gl/drawable_heatmap.hpp | 10 +- .../shaders/gl/drawable_heatmap_texture.hpp | 12 +- .../mbgl/shaders/gl/drawable_hillshade.hpp | 5 +- .../shaders/gl/drawable_hillshade_prepare.hpp | 6 +- include/mbgl/shaders/gl/drawable_line.hpp | 36 +- .../shaders/gl/drawable_line_gradient.hpp | 38 +- .../mbgl/shaders/gl/drawable_line_pattern.hpp | 49 +- include/mbgl/shaders/gl/drawable_line_sdf.hpp | 46 +- .../gl/drawable_location_indicator.hpp | 16 + .../drawable_location_indicator_textured.hpp | 16 + include/mbgl/shaders/gl/drawable_raster.hpp | 8 +- .../mbgl/shaders/gl/drawable_symbol_icon.hpp | 37 +- .../mbgl/shaders/gl/drawable_symbol_sdf.hpp | 58 +- .../shaders/gl/drawable_symbol_sdf_text.hpp | 323 --------- .../gl/drawable_symbol_text_and_icon.hpp | 56 +- include/mbgl/shaders/gl/shader_program_gl.hpp | 12 +- include/mbgl/shaders/heatmap_layer_ubo.hpp | 32 +- .../shaders/heatmap_texture_layer_ubo.hpp | 11 +- include/mbgl/shaders/hillshade_layer_ubo.hpp | 24 +- .../shaders/hillshade_prepare_layer_ubo.hpp | 18 +- include/mbgl/shaders/layer_ubo.hpp | 42 +- include/mbgl/shaders/line_layer_ubo.hpp | 228 +++--- .../mbgl/shaders/location_indicator_ubo.hpp | 16 + include/mbgl/shaders/mtl/background.hpp | 159 ++++- .../mbgl/shaders/mtl/background_pattern.hpp | 97 --- include/mbgl/shaders/mtl/circle.hpp | 125 ++-- include/mbgl/shaders/mtl/clipping_mask.hpp | 45 +- include/mbgl/shaders/mtl/collision.hpp | 202 ++++++ include/mbgl/shaders/mtl/collision_box.hpp | 93 --- include/mbgl/shaders/mtl/collision_circle.hpp | 112 --- include/mbgl/shaders/mtl/common.hpp | 182 +---- .../mbgl/shaders/mtl/custom_symbol_icon.hpp | 72 +- include/mbgl/shaders/mtl/debug.hpp | 38 +- include/mbgl/shaders/mtl/fill.hpp | 334 +++++---- include/mbgl/shaders/mtl/fill_extrusion.hpp | 269 ++++++- .../shaders/mtl/fill_extrusion_pattern.hpp | 192 ----- include/mbgl/shaders/mtl/heatmap.hpp | 77 +- include/mbgl/shaders/mtl/heatmap_texture.hpp | 38 +- include/mbgl/shaders/mtl/hillshade.hpp | 72 +- .../mbgl/shaders/mtl/hillshade_prepare.hpp | 75 +- include/mbgl/shaders/mtl/line.hpp | 401 +++++++---- include/mbgl/shaders/mtl/raster.hpp | 70 +- include/mbgl/shaders/mtl/shader_group.hpp | 5 +- include/mbgl/shaders/mtl/shader_program.hpp | 6 - include/mbgl/shaders/mtl/symbol.hpp | 644 +++++++++++++++++ include/mbgl/shaders/mtl/symbol_icon.hpp | 145 ---- include/mbgl/shaders/mtl/symbol_sdf.hpp | 217 ------ .../mbgl/shaders/mtl/symbol_text_and_icon.hpp | 234 ------ include/mbgl/shaders/mtl/widevector.hpp | 50 +- include/mbgl/shaders/raster_layer_ubo.hpp | 32 +- include/mbgl/shaders/shader_defines.hpp | 141 ++-- include/mbgl/shaders/shader_manifest.hpp | 4 +- include/mbgl/shaders/shader_program_base.hpp | 7 - include/mbgl/shaders/shader_source.hpp | 6 +- include/mbgl/shaders/symbol_layer_ubo.hpp | 46 +- include/mbgl/shaders/vulkan/background.hpp | 84 ++- include/mbgl/shaders/vulkan/circle.hpp | 63 +- include/mbgl/shaders/vulkan/clipping_mask.hpp | 3 +- include/mbgl/shaders/vulkan/collision.hpp | 60 +- include/mbgl/shaders/vulkan/common.hpp | 101 +-- .../shaders/vulkan/custom_symbol_icon.hpp | 107 +++ include/mbgl/shaders/vulkan/debug.hpp | 24 +- include/mbgl/shaders/vulkan/fill.hpp | 671 +++++------------- .../mbgl/shaders/vulkan/fill_extrusion.hpp | 426 +++++++++++ include/mbgl/shaders/vulkan/heatmap.hpp | 102 +-- .../mbgl/shaders/vulkan/heatmap_texture.hpp | 78 ++ include/mbgl/shaders/vulkan/hillshade.hpp | 164 +---- .../mbgl/shaders/vulkan/hillshade_prepare.hpp | 137 ++++ include/mbgl/shaders/vulkan/line.hpp | 275 +++---- .../shaders/vulkan/location_indicator.hpp | 92 +++ include/mbgl/shaders/vulkan/raster.hpp | 36 +- include/mbgl/shaders/vulkan/shader_group.hpp | 3 - .../mbgl/shaders/vulkan/shader_program.hpp | 5 - include/mbgl/shaders/vulkan/symbol.hpp | 411 +++++------ include/mbgl/shaders/vulkan/widevector.hpp | 36 +- include/mbgl/shaders/widevector_ubo.hpp | 47 +- include/mbgl/vulkan/context.hpp | 9 +- include/mbgl/vulkan/descriptor_set.hpp | 19 +- include/mbgl/vulkan/uniform_block.hpp | 59 -- include/mbgl/vulkan/uniform_buffer.hpp | 11 +- shaders/drawable.background.fragment.glsl | 6 +- .../drawable.background_pattern.fragment.glsl | 5 +- .../drawable.background_pattern.vertex.glsl | 7 +- shaders/drawable.circle.vertex.glsl | 26 +- shaders/drawable.collision_box.fragment.glsl | 7 - shaders/drawable.collision_box.vertex.glsl | 10 +- .../drawable.collision_circle.fragment.glsl | 8 +- shaders/drawable.collision_circle.vertex.glsl | 10 +- .../drawable.custom.symbol_icon.vertex.glsl | 7 +- shaders/drawable.debug.fragment.glsl | 6 +- shaders/drawable.debug.vertex.glsl | 6 +- shaders/drawable.fill.fragment.glsl | 5 - shaders/drawable.fill.vertex.glsl | 7 +- shaders/drawable.fill_extrusion.vertex.glsl | 34 +- ...wable.fill_extrusion_pattern.fragment.glsl | 28 +- ...rawable.fill_extrusion_pattern.vertex.glsl | 36 +- shaders/drawable.fill_outline.fragment.glsl | 6 - shaders/drawable.fill_outline.vertex.glsl | 12 +- ...rawable.fill_outline_pattern.fragment.glsl | 18 +- .../drawable.fill_outline_pattern.vertex.glsl | 21 +- ...able.fill_outline_triangulated.vertex.glsl | 9 +- shaders/drawable.fill_pattern.fragment.glsl | 18 +- shaders/drawable.fill_pattern.vertex.glsl | 21 +- shaders/drawable.heatmap.vertex.glsl | 10 +- .../drawable.heatmap_texture.fragment.glsl | 4 +- shaders/drawable.heatmap_texture.vertex.glsl | 8 +- shaders/drawable.hillshade.fragment.glsl | 3 +- shaders/drawable.hillshade.vertex.glsl | 2 - .../drawable.hillshade_prepare.fragment.glsl | 3 +- .../drawable.hillshade_prepare.vertex.glsl | 3 + shaders/drawable.line.fragment.glsl | 20 +- shaders/drawable.line.vertex.glsl | 14 +- shaders/drawable.line_gradient.fragment.glsl | 20 +- shaders/drawable.line_gradient.vertex.glsl | 16 +- shaders/drawable.line_pattern.fragment.glsl | 27 +- shaders/drawable.line_pattern.vertex.glsl | 22 +- shaders/drawable.line_sdf.fragment.glsl | 27 +- shaders/drawable.line_sdf.vertex.glsl | 19 +- shaders/drawable.raster.fragment.glsl | 4 +- shaders/drawable.raster.vertex.glsl | 4 +- shaders/drawable.symbol_icon.fragment.glsl | 12 +- shaders/drawable.symbol_icon.vertex.glsl | 25 +- shaders/drawable.symbol_sdf.fragment.glsl | 25 +- shaders/drawable.symbol_sdf.vertex.glsl | 33 +- ...rawable.symbol_text_and_icon.fragment.glsl | 25 +- .../drawable.symbol_text_and_icon.vertex.glsl | 31 +- shaders/manifest.json | 30 +- src/mbgl/gfx/uniform_block.cpp | 39 - src/mbgl/gl/context.cpp | 24 +- src/mbgl/gl/context.hpp | 5 +- src/mbgl/gl/drawable_gl.cpp | 32 +- src/mbgl/gl/layer_group_gl.cpp | 56 +- src/mbgl/gl/uniform_block_gl.cpp | 31 - src/mbgl/gl/uniform_buffer_gl.cpp | 45 +- src/mbgl/mtl/context.cpp | 18 +- src/mbgl/mtl/drawable.cpp | 33 +- src/mbgl/mtl/layer_group.cpp | 15 +- src/mbgl/mtl/render_pass.cpp | 8 + src/mbgl/mtl/renderer_backend.cpp | 10 +- src/mbgl/mtl/tile_layer_group.cpp | 15 +- src/mbgl/mtl/uniform_block.cpp | 17 - src/mbgl/mtl/uniform_buffer.cpp | 34 +- .../layers/background_layer_tweaker.cpp | 67 +- .../layers/background_layer_tweaker.hpp | 5 + .../renderer/layers/circle_layer_tweaker.cpp | 60 +- .../renderer/layers/circle_layer_tweaker.hpp | 4 + .../layers/collision_layer_tweaker.cpp | 14 +- .../layers/fill_extrusion_layer_tweaker.cpp | 69 +- .../layers/fill_extrusion_layer_tweaker.hpp | 7 +- .../renderer/layers/fill_layer_tweaker.cpp | 184 +++-- .../renderer/layers/fill_layer_tweaker.hpp | 5 + .../renderer/layers/heatmap_layer_tweaker.cpp | 48 +- .../renderer/layers/heatmap_layer_tweaker.hpp | 4 + .../layers/heatmap_texture_layer_tweaker.cpp | 10 +- .../layers/hillshade_layer_tweaker.cpp | 58 +- .../layers/hillshade_layer_tweaker.hpp | 5 + .../hillshade_prepare_layer_tweaker.cpp | 9 +- .../renderer/layers/line_layer_tweaker.cpp | 233 +++--- .../renderer/layers/line_layer_tweaker.hpp | 5 + .../location_indicator_layer_tweaker.cpp | 32 +- .../renderer/layers/raster_layer_tweaker.cpp | 58 +- .../renderer/layers/raster_layer_tweaker.hpp | 4 + .../render_location_indicator_layer.cpp | 6 +- .../renderer/layers/symbol_layer_tweaker.cpp | 152 ++-- .../renderer/layers/symbol_layer_tweaker.hpp | 19 +- src/mbgl/renderer/paint_parameters.cpp | 20 +- src/mbgl/renderer/renderer_impl.cpp | 22 +- .../renderer/sources/render_tile_source.cpp | 227 +++--- src/mbgl/shaders/gl/shader_info.cpp | 413 ++++++----- src/mbgl/shaders/gl/shader_program_gl.cpp | 8 +- src/mbgl/shaders/mtl/background.cpp | 22 +- src/mbgl/shaders/mtl/background_pattern.cpp | 22 - src/mbgl/shaders/mtl/circle.cpp | 12 +- src/mbgl/shaders/mtl/clipping_mask.cpp | 9 +- src/mbgl/shaders/mtl/collision.cpp | 35 + src/mbgl/shaders/mtl/collision_box.cpp | 20 - src/mbgl/shaders/mtl/collision_circle.cpp | 22 - src/mbgl/shaders/mtl/custom_symbol_icon.cpp | 17 +- src/mbgl/shaders/mtl/debug.cpp | 11 +- src/mbgl/shaders/mtl/fill.cpp | 98 ++- src/mbgl/shaders/mtl/fill_extrusion.cpp | 33 +- .../shaders/mtl/fill_extrusion_pattern.cpp | 32 - src/mbgl/shaders/mtl/heatmap.cpp | 11 +- src/mbgl/shaders/mtl/heatmap_texture.cpp | 14 +- src/mbgl/shaders/mtl/hillshade.cpp | 10 +- src/mbgl/shaders/mtl/hillshade_prepare.cpp | 16 +- src/mbgl/shaders/mtl/line.cpp | 64 +- src/mbgl/shaders/mtl/raster.cpp | 10 +- src/mbgl/shaders/mtl/shader_program.cpp | 18 - src/mbgl/shaders/mtl/symbol.cpp | 76 ++ src/mbgl/shaders/mtl/symbol_icon.cpp | 30 - src/mbgl/shaders/mtl/symbol_sdf.cpp | 36 - src/mbgl/shaders/mtl/symbol_text_and_icon.cpp | 36 - src/mbgl/shaders/mtl/widevector.cpp | 23 + src/mbgl/shaders/vulkan/background.cpp | 33 +- src/mbgl/shaders/vulkan/circle.cpp | 11 +- src/mbgl/shaders/vulkan/clipping_mask.cpp | 8 +- src/mbgl/shaders/vulkan/collision.cpp | 33 +- src/mbgl/shaders/vulkan/common.cpp | 28 - .../shaders/vulkan/custom_symbol_icon.cpp | 19 + src/mbgl/shaders/vulkan/debug.cpp | 9 +- src/mbgl/shaders/vulkan/fill.cpp | 126 ++-- src/mbgl/shaders/vulkan/fill_extrusion.cpp | 40 ++ src/mbgl/shaders/vulkan/heatmap.cpp | 25 +- src/mbgl/shaders/vulkan/heatmap_texture.cpp | 19 + src/mbgl/shaders/vulkan/hillshade.cpp | 22 +- src/mbgl/shaders/vulkan/hillshade_prepare.cpp | 18 + src/mbgl/shaders/vulkan/line.cpp | 60 +- .../shaders/vulkan/location_indicator.cpp | 33 + src/mbgl/shaders/vulkan/raster.cpp | 10 +- src/mbgl/shaders/vulkan/shader_program.cpp | 16 - src/mbgl/shaders/vulkan/symbol.cpp | 120 ++-- src/mbgl/shaders/vulkan/widevector.cpp | 24 +- .../style/layers/custom_drawable_layer.cpp | 164 +++-- src/mbgl/vulkan/buffer_resource.cpp | 2 +- src/mbgl/vulkan/context.cpp | 77 +- src/mbgl/vulkan/descriptor_set.cpp | 40 +- src/mbgl/vulkan/drawable.cpp | 7 + src/mbgl/vulkan/drawable_impl.hpp | 4 +- src/mbgl/vulkan/layer_group.cpp | 5 +- src/mbgl/vulkan/renderer_backend.cpp | 10 +- src/mbgl/vulkan/tile_layer_group.cpp | 5 +- src/mbgl/vulkan/uniform_buffer.cpp | 18 +- test/util/hash.test.cpp | 9 +- 262 files changed, 6953 insertions(+), 6913 deletions(-) delete mode 100644 include/mbgl/gfx/uniform_block.hpp delete mode 100644 include/mbgl/gl/uniform_block_gl.hpp delete mode 100644 include/mbgl/mtl/uniform_block.hpp delete mode 100644 include/mbgl/shaders/common_ubo.hpp create mode 100644 include/mbgl/shaders/gl/drawable_location_indicator.hpp create mode 100644 include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_symbol_sdf_text.hpp create mode 100644 include/mbgl/shaders/location_indicator_ubo.hpp delete mode 100644 include/mbgl/shaders/mtl/background_pattern.hpp create mode 100644 include/mbgl/shaders/mtl/collision.hpp delete mode 100644 include/mbgl/shaders/mtl/collision_box.hpp delete mode 100644 include/mbgl/shaders/mtl/collision_circle.hpp delete mode 100644 include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp create mode 100644 include/mbgl/shaders/mtl/symbol.hpp delete mode 100644 include/mbgl/shaders/mtl/symbol_icon.hpp delete mode 100644 include/mbgl/shaders/mtl/symbol_sdf.hpp delete mode 100644 include/mbgl/shaders/mtl/symbol_text_and_icon.hpp create mode 100644 include/mbgl/shaders/vulkan/custom_symbol_icon.hpp create mode 100644 include/mbgl/shaders/vulkan/fill_extrusion.hpp create mode 100644 include/mbgl/shaders/vulkan/heatmap_texture.hpp create mode 100644 include/mbgl/shaders/vulkan/hillshade_prepare.hpp create mode 100644 include/mbgl/shaders/vulkan/location_indicator.hpp delete mode 100644 include/mbgl/vulkan/uniform_block.hpp delete mode 100644 src/mbgl/gfx/uniform_block.cpp delete mode 100644 src/mbgl/gl/uniform_block_gl.cpp delete mode 100644 src/mbgl/mtl/uniform_block.cpp delete mode 100644 src/mbgl/shaders/mtl/background_pattern.cpp create mode 100644 src/mbgl/shaders/mtl/collision.cpp delete mode 100644 src/mbgl/shaders/mtl/collision_box.cpp delete mode 100644 src/mbgl/shaders/mtl/collision_circle.cpp delete mode 100644 src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp create mode 100644 src/mbgl/shaders/mtl/symbol.cpp delete mode 100644 src/mbgl/shaders/mtl/symbol_icon.cpp delete mode 100644 src/mbgl/shaders/mtl/symbol_sdf.cpp delete mode 100644 src/mbgl/shaders/mtl/symbol_text_and_icon.cpp create mode 100644 src/mbgl/shaders/mtl/widevector.cpp delete mode 100644 src/mbgl/shaders/vulkan/common.cpp create mode 100644 src/mbgl/shaders/vulkan/custom_symbol_icon.cpp create mode 100644 src/mbgl/shaders/vulkan/fill_extrusion.cpp create mode 100644 src/mbgl/shaders/vulkan/heatmap_texture.cpp create mode 100644 src/mbgl/shaders/vulkan/hillshade_prepare.cpp create mode 100644 src/mbgl/shaders/vulkan/location_indicator.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fc107b4b8c3a..835aa2b7eecd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,7 +154,6 @@ if(MLN_DRAWABLE_RENDERER) ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_atlases_tweaker.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/gpu_expression.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_block.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/vertex_attribute.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/texture2d.hpp @@ -178,7 +177,6 @@ if(MLN_DRAWABLE_RENDERER) ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/line_drawable_data.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/symbol_drawable_data.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/collision_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform_block.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform_buffer.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_attribute.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/render_target.cpp @@ -1036,6 +1034,7 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_circle.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_box.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_circle.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_debug.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_outline.hpp @@ -1052,10 +1051,13 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_gradient.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_sdf.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_location_indicator.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_raster.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_wide_vector.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/background_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/circle.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/clipping_mask.hpp @@ -1140,9 +1142,7 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/background_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/circle_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/collision_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/common_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_drawable_layer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_drawable_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/custom_drawable_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/debug_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp @@ -1152,17 +1152,18 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/line_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/custom_drawable_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/location_indicator_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/raster_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_defines.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/symbol_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/widevector_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_drawable_layer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_drawable_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/shader_program_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/buffer_allocator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl_builder.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/layer_group_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/uniform_block_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/uniform_buffer_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/vertex_attribute_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/texture2d.hpp @@ -1176,7 +1177,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/layer_group_gl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture2d.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_block_gl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_buffer_gl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_attribute_gl.cpp ) @@ -1207,23 +1207,19 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/renderable_resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/texture2d.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/tile_layer_group.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/uniform_block.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/uniform_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/upload_pass.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/vertex_attribute.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/mtl/vertex_buffer_resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/background.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/background_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/circle.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/clipping_mask.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/common.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision_box.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision_circle.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/debug.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill_extrusion.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/heatmap.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/heatmap_texture.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/hillshade.hpp @@ -1232,9 +1228,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/raster.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/shader_group.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/shader_program.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/symbol_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/symbol_sdf.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/symbol_text_and_icon.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/symbol.hpp ) list(APPEND SRC_FILES @@ -1252,32 +1246,27 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/texture2d.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/render_pass.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/tile_layer_group.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/uniform_block.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/uniform_buffer.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/upload_pass.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/vertex_attribute.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/vertex_buffer_resource.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/shader_program.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/background.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/background_pattern.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/circle.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/collision_box.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/collision_circle.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/collision.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/clipping_mask.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/custom_symbol_icon.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/debug.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/fill.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/fill_extrusion.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/heatmap.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/heatmap_texture.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade_prepare.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/line.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/raster.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_icon.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_sdf.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_text_and_icon.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/widevector.cpp ) find_library(METAL_FRAMEWORK Metal) @@ -1323,11 +1312,15 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/clipping_mask.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/collision.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/common.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/debug.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/fill.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/fill_extrusion.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/heatmap.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/heatmap_texture.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/hillshade.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/hillshade_prepare.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/line.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/location_indicator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/raster.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/symbol.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/widevector.hpp @@ -1359,12 +1352,16 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/circle.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/clipping_mask.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/collision.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/common.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/custom_symbol_icon.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/debug.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/fill.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/fill_extrusion.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/heatmap.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/heatmap_texture.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/hillshade.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/hillshade_prepare.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/line.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/location_indicator.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/raster.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/symbol.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/widevector.cpp diff --git a/bazel/core.bzl b/bazel/core.bzl index 85c903f5b378..6d7dbca391dc 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -84,6 +84,8 @@ MLN_GENERATED_OPENGL_SHADER_HEADERS = [ "include/mbgl/shaders/gl/drawable_line_pattern.hpp", "include/mbgl/shaders/gl/drawable_line_sdf.hpp", "include/mbgl/shaders/gl/drawable_line.hpp", + "include/mbgl/shaders/gl/drawable_location_indicator.hpp", + "include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp", "include/mbgl/shaders/gl/drawable_raster.hpp", "include/mbgl/shaders/gl/drawable_symbol_icon.hpp", "include/mbgl/shaders/gl/drawable_symbol_sdf.hpp", @@ -941,7 +943,6 @@ MLN_DRAWABLES_SOURCE = [ "src/mbgl/gfx/line_drawable_data.hpp", "src/mbgl/gfx/symbol_drawable_data.hpp", "src/mbgl/gfx/collision_drawable_data.hpp", - "src/mbgl/gfx/uniform_block.cpp", "src/mbgl/gfx/uniform_buffer.cpp", "src/mbgl/gfx/vertex_attribute.cpp", "src/mbgl/renderer/change_request.cpp", @@ -993,7 +994,6 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/gfx/drawable_atlases_tweaker.hpp", "include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp", "include/mbgl/gfx/gpu_expression.hpp", - "include/mbgl/gfx/uniform_block.hpp", "include/mbgl/gfx/uniform_buffer.hpp", "include/mbgl/gfx/vertex_attribute.hpp", "include/mbgl/gfx/texture2d.hpp", @@ -1004,7 +1004,6 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/shaders/background_layer_ubo.hpp", "include/mbgl/shaders/circle_layer_ubo.hpp", "include/mbgl/shaders/collision_layer_ubo.hpp", - "include/mbgl/shaders/common_ubo.hpp", "include/mbgl/shaders/custom_drawable_layer_ubo.hpp", "include/mbgl/shaders/debug_layer_ubo.hpp", "include/mbgl/shaders/fill_layer_ubo.hpp", @@ -1015,6 +1014,7 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp", "include/mbgl/shaders/layer_ubo.hpp", "include/mbgl/shaders/line_layer_ubo.hpp", + "include/mbgl/shaders/location_indicator_ubo.hpp", "include/mbgl/shaders/raster_layer_ubo.hpp", "include/mbgl/shaders/shader_defines.hpp", "include/mbgl/shaders/shader_program_base.hpp", @@ -1032,7 +1032,6 @@ MLN_DRAWABLES_GL_SOURCE = [ "src/mbgl/gl/drawable_gl_impl.hpp", "src/mbgl/gl/layer_group_gl.cpp", "src/mbgl/gl/texture2d.cpp", - "src/mbgl/gl/uniform_block_gl.cpp", "src/mbgl/gl/uniform_buffer_gl.cpp", "src/mbgl/gl/vertex_attribute_gl.cpp", "src/mbgl/shaders/gl/shader_info.cpp", @@ -1044,7 +1043,6 @@ MLN_DRAWABLES_GL_HEADERS = [ "include/mbgl/gl/drawable_gl.hpp", "include/mbgl/gl/drawable_gl_builder.hpp", "include/mbgl/gl/layer_group_gl.hpp", - "include/mbgl/gl/uniform_block_gl.hpp", "include/mbgl/gl/uniform_buffer_gl.hpp", "include/mbgl/gl/vertex_attribute_gl.hpp", "include/mbgl/gl/texture2d.hpp", @@ -1068,32 +1066,27 @@ MLN_DRAWABLES_MTL_SOURCE = [ "src/mbgl/mtl/texture2d.cpp", "src/mbgl/mtl/render_pass.cpp", "src/mbgl/mtl/tile_layer_group.cpp", - "src/mbgl/mtl/uniform_block.cpp", "src/mbgl/mtl/uniform_buffer.cpp", "src/mbgl/mtl/upload_pass.cpp", "src/mbgl/mtl/vertex_attribute.cpp", "src/mbgl/mtl/vertex_buffer_resource.cpp", "src/mbgl/shaders/mtl/shader_program.cpp", "src/mbgl/shaders/mtl/background.cpp", - "src/mbgl/shaders/mtl/background_pattern.cpp", "src/mbgl/shaders/mtl/circle.cpp", - "src/mbgl/shaders/mtl/collision_box.cpp", - "src/mbgl/shaders/mtl/collision_circle.cpp", + "src/mbgl/shaders/mtl/collision.cpp", "src/mbgl/shaders/mtl/clipping_mask.cpp", "src/mbgl/shaders/mtl/custom_symbol_icon.cpp", "src/mbgl/shaders/mtl/debug.cpp", "src/mbgl/shaders/mtl/fill.cpp", "src/mbgl/shaders/mtl/fill_extrusion.cpp", - "src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp", "src/mbgl/shaders/mtl/heatmap.cpp", "src/mbgl/shaders/mtl/heatmap_texture.cpp", "src/mbgl/shaders/mtl/hillshade.cpp", "src/mbgl/shaders/mtl/hillshade_prepare.cpp", "src/mbgl/shaders/mtl/line.cpp", "src/mbgl/shaders/mtl/raster.cpp", - "src/mbgl/shaders/mtl/symbol_icon.cpp", - "src/mbgl/shaders/mtl/symbol_sdf.cpp", - "src/mbgl/shaders/mtl/symbol_text_and_icon.cpp", + "src/mbgl/shaders/mtl/symbol.cpp", + "src/mbgl/shaders/mtl/widevector.cpp", "src/mbgl/style/layers/mtl/custom_layer_render_parameters.cpp", ] @@ -1112,23 +1105,19 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/mtl/renderable_resource.hpp", "include/mbgl/mtl/texture2d.hpp", "include/mbgl/mtl/tile_layer_group.hpp", - "include/mbgl/mtl/uniform_block.hpp", "include/mbgl/mtl/uniform_buffer.hpp", "include/mbgl/mtl/upload_pass.hpp", "include/mbgl/mtl/vertex_attribute.hpp", "include/mbgl/mtl/vertex_buffer_resource.hpp", "include/mbgl/shaders/mtl/background.hpp", - "include/mbgl/shaders/mtl/background_pattern.hpp", "include/mbgl/shaders/mtl/circle.hpp", "include/mbgl/shaders/mtl/clipping_mask.hpp", - "include/mbgl/shaders/mtl/collision_box.hpp", - "include/mbgl/shaders/mtl/collision_circle.hpp", + "include/mbgl/shaders/mtl/collision.hpp", "include/mbgl/shaders/mtl/common.hpp", "include/mbgl/shaders/mtl/custom_symbol_icon.hpp", "include/mbgl/shaders/mtl/debug.hpp", "include/mbgl/shaders/mtl/fill.hpp", "include/mbgl/shaders/mtl/fill_extrusion.hpp", - "include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp", "include/mbgl/shaders/mtl/heatmap.hpp", "include/mbgl/shaders/mtl/heatmap_texture.hpp", "include/mbgl/shaders/mtl/hillshade.hpp", @@ -1137,9 +1126,7 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/shaders/mtl/raster.hpp", "include/mbgl/shaders/mtl/shader_group.hpp", "include/mbgl/shaders/mtl/shader_program.hpp", - "include/mbgl/shaders/mtl/symbol_icon.hpp", - "include/mbgl/shaders/mtl/symbol_sdf.hpp", - "include/mbgl/shaders/mtl/symbol_text_and_icon.hpp", + "include/mbgl/shaders/mtl/symbol.hpp", "include/mbgl/style/layers/mtl/custom_layer_render_parameters.hpp", "include/mbgl/shaders/mtl/widevector.hpp", ] diff --git a/include/mbgl/gfx/context.hpp b/include/mbgl/gfx/context.hpp index 8e21265098f3..abfdd383e959 100644 --- a/include/mbgl/gfx/context.hpp +++ b/include/mbgl/gfx/context.hpp @@ -125,7 +125,10 @@ class Context { /// @param data The data to copy, may be `nullptr` /// @param size The size of the buffer /// @param persistent Performance hint, optimize for few or many uses - virtual UniformBufferPtr createUniformBuffer(const void* data, std::size_t size, bool persistent = false) = 0; + virtual UniformBufferPtr createUniformBuffer(const void* data, + std::size_t size, + bool persistent = false, + bool ssbo = false) = 0; /// Get the generic shader with the specified name virtual gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) = 0; diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index 5d4f324fa1a7..d820040dbea3 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -251,6 +251,9 @@ class Drawable { /// Get drawable user-defined type size_t getType() const { return type; } + void setUBOIndex(uint32_t uboIndex_) { uboIndex = uboIndex_; } + uint32_t getUBOIndex() const { return uboIndex; } + /// Associate the drawable with a layer tweaker. This is used to manage the lifetime of the tweaker. void setLayerTweaker(LayerTweakerPtr tweaker) { layerTweaker = std::move(tweaker); } const LayerTweakerPtr& getLayerTweaker() const { return layerTweaker; } @@ -305,6 +308,7 @@ class Drawable { std::size_t type = 0; std::optional> origin; + uint32_t uboIndex = 0; }; using DrawablePtr = std::shared_ptr; diff --git a/include/mbgl/gfx/uniform_block.hpp b/include/mbgl/gfx/uniform_block.hpp deleted file mode 100644 index bbfd1f2fcb45..000000000000 --- a/include/mbgl/gfx/uniform_block.hpp +++ /dev/null @@ -1,114 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace mbgl { -namespace gfx { - -class UniformBuffer; -class UniformBlock; - -using UniqueUniformBlock = std::unique_ptr; - -/// @brief This class represents an uniform block -class UniformBlock { -public: - /// @brief Constructor - /// @param index_ - /// @param size_ - UniformBlock(int index_, std::size_t size_) - : index(index_), - size(size_) {} - UniformBlock(const UniformBlock&) = default; - UniformBlock(UniformBlock&& other) - : index(other.index), - size(other.size) {} - /// @brief Destructor - virtual ~UniformBlock() = default; - - /// @brief Retrieves the index of this uniform block - /// @return int - int getIndex() const { return index; } - - /// @brief Get the size of the uniform block - /// @return std::size_t - std::size_t getSize() const { return size; } - - /// @brief Binds the buffer - /// @param uniformBuffer - virtual void bindBuffer(const UniformBuffer& uniformBuffer) = 0; - - /// @brief Unbinds the uniform buffer - virtual void unbindBuffer() = 0; - -protected: - UniformBlock& operator=(const UniformBlock&) = default; - UniformBlock& operator=(UniformBlock&& other) { - index = other.index; - size = other.size; - return *this; - } - -protected: - int index; - std::size_t size; -}; - -/// Stores a collection of uniform blocks by id -class UniformBlockArray { -public: - /// @brief Constructor - UniformBlockArray() = default; - - /// @brief Move constructor - UniformBlockArray(UniformBlockArray&&); - - /// @brief Copy constructor. Would need to use the virtual assignment operator - UniformBlockArray(const UniformBlockArray&) = delete; - - /// @brief Destructor - virtual ~UniformBlockArray() = default; - - /// @brief Number of maximum allocated elements - std::size_t allocatedSize() const { return uniformBlockVector.size(); } - - /// @brief Get an uniform block element. - /// @return Pointer to the element on success, or null if the uniform block doesn't exists. - const std::unique_ptr& get(const size_t id) const; - - /// @brief Set a new uniform block element. - /// @param id - /// @param index - /// @param size - /// @return Pointer to the new element on success, or null if the uniform block already exists. - const std::unique_ptr& set(const size_t id, const size_t index, std::size_t size); - - /// @brief Move assignment operator - UniformBlockArray& operator=(UniformBlockArray&&); - - /// @brief Copy assignment operator - UniformBlockArray& operator=(const UniformBlockArray&); - - /// Do something with each block - template - void visit(Func f) { - std::for_each(uniformBlockVector.begin(), uniformBlockVector.end(), [&](const auto& block) { - if (block) { - f(*block); - } - }); - } - -protected: - virtual std::unique_ptr create(int index, std::size_t size) = 0; - virtual std::unique_ptr copy(const UniformBlock& uniformBlock) = 0; - -protected: - std::array uniformBlockVector; - static std::unique_ptr nullref; -}; - -} // namespace gfx -} // namespace mbgl diff --git a/include/mbgl/gfx/uniform_buffer.hpp b/include/mbgl/gfx/uniform_buffer.hpp index d1acdc94ae23..390459c57489 100644 --- a/include/mbgl/gfx/uniform_buffer.hpp +++ b/include/mbgl/gfx/uniform_buffer.hpp @@ -29,7 +29,7 @@ class UniformBuffer { public: virtual ~UniformBuffer() = default; - virtual void update(const void* data, std::size_t size_) = 0; + virtual void update(const void* data, std::size_t dataSize) = 0; std::size_t getSize() const { return size; } diff --git a/include/mbgl/gl/drawable_gl.hpp b/include/mbgl/gl/drawable_gl.hpp index f088003dca1c..2aad6c4d8b12 100644 --- a/include/mbgl/gl/drawable_gl.hpp +++ b/include/mbgl/gl/drawable_gl.hpp @@ -68,9 +68,6 @@ class DrawableGL : public gfx::Drawable { void uploadTextures() const; - void bindUniformBuffers() const; - void unbindUniformBuffers() const; - void bindTextures() const; void unbindTextures() const; }; diff --git a/include/mbgl/gl/layer_group_gl.hpp b/include/mbgl/gl/layer_group_gl.hpp index 0250a854580d..5a4553d1d5e4 100644 --- a/include/mbgl/gl/layer_group_gl.hpp +++ b/include/mbgl/gl/layer_group_gl.hpp @@ -24,9 +24,6 @@ class TileLayerGroupGL : public TileLayerGroup { gfx::UniformBufferArray& mutableUniformBuffers() override { return uniformBuffers; }; - void bindUniformBuffers() const; - void unbindUniformBuffers() const; - protected: UniformBufferArrayGL uniformBuffers; }; @@ -46,9 +43,6 @@ class LayerGroupGL : public LayerGroup { gfx::UniformBufferArray& mutableUniformBuffers() override { return uniformBuffers; }; - void bindUniformBuffers() const; - void unbindUniformBuffers() const; - protected: UniformBufferArrayGL uniformBuffers; }; diff --git a/include/mbgl/gl/uniform_block_gl.hpp b/include/mbgl/gl/uniform_block_gl.hpp deleted file mode 100644 index c91cfc55f96c..000000000000 --- a/include/mbgl/gl/uniform_block_gl.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include -#include - -namespace mbgl { -namespace gl { - -class UniformBlockGL final : public gfx::UniformBlock { -public: - UniformBlockGL(int index_, std::size_t size_) - : UniformBlock(index_, size_) {} - UniformBlockGL(const UniformBlockGL& other) - : UniformBlock(other) {} - UniformBlockGL(UniformBlockGL&& other) - : UniformBlock(std::move(other)) {} - ~UniformBlockGL() override = default; - void bindBuffer(const gfx::UniformBuffer& uniformBuffer) override; - void unbindBuffer() override; -}; - -/// Stores a collection of uniform blocks by name -class UniformBlockArrayGL final : public gfx::UniformBlockArray { -public: - UniformBlockArrayGL() = default; - UniformBlockArrayGL(UniformBlockArrayGL&& other) - : UniformBlockArray(std::move(other)) {} - UniformBlockArrayGL(const UniformBlockArrayGL&) = delete; - - UniformBlockArrayGL& operator=(UniformBlockArrayGL&& other) { - UniformBlockArray::operator=(std::move(other)); - return *this; - } - UniformBlockArrayGL& operator=(const UniformBlockArrayGL& other) { - UniformBlockArray::operator=(other); - return *this; - } - -private: - std::unique_ptr create(int index, std::size_t size) override { - return std::make_unique(index, size); - } - std::unique_ptr copy(const gfx::UniformBlock& uniformBlocks) override { - return std::make_unique(static_cast(uniformBlocks)); - } -}; - -} // namespace gl -} // namespace mbgl diff --git a/include/mbgl/gl/uniform_buffer_gl.hpp b/include/mbgl/gl/uniform_buffer_gl.hpp index 870b2d4333d4..b186715e9c53 100644 --- a/include/mbgl/gl/uniform_buffer_gl.hpp +++ b/include/mbgl/gl/uniform_buffer_gl.hpp @@ -24,7 +24,7 @@ class UniformBufferGL final : public gfx::UniformBuffer { UniformBufferGL clone() const { return {*this}; } // gfx::UniformBuffer - void update(const void* data, std::size_t size_) override; + void update(const void* data, std::size_t dataSize) override; private: // unique id used for debugging and profiling purposes @@ -59,6 +59,9 @@ class UniformBufferArrayGL final : public gfx::UniformBufferArray { return *this; } + void bind() const; + void unbind() const; + private: std::unique_ptr copy(const gfx::UniformBuffer& uniformBuffers) override { return std::make_unique(static_cast(uniformBuffers).clone()); diff --git a/include/mbgl/mtl/context.hpp b/include/mbgl/mtl/context.hpp index cf1be121ee5b..41c354b4ddee 100644 --- a/include/mbgl/mtl/context.hpp +++ b/include/mbgl/mtl/context.hpp @@ -83,7 +83,10 @@ class Context final : public gfx::Context { void reduceMemoryUsage() override {} gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; - gfx::UniformBufferPtr createUniformBuffer(const void* data, std::size_t size, bool persistent) override; + gfx::UniformBufferPtr createUniformBuffer(const void* data, + std::size_t size, + bool persistent = false, + bool ssbo = false) override; gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; diff --git a/include/mbgl/mtl/drawable.hpp b/include/mbgl/mtl/drawable.hpp index 7abc899197a3..b40c87b76e19 100644 --- a/include/mbgl/mtl/drawable.hpp +++ b/include/mbgl/mtl/drawable.hpp @@ -73,9 +73,6 @@ class Drawable : public gfx::Drawable { void bindInstanceAttributes(RenderPass&) const noexcept; - void bindUniformBuffers(RenderPass&) const noexcept; - void unbindUniformBuffers(RenderPass&) const noexcept {} - void bindTextures(RenderPass&) const noexcept; void unbindTextures(RenderPass&) const noexcept; diff --git a/include/mbgl/mtl/layer_group.hpp b/include/mbgl/mtl/layer_group.hpp index 90f742942c68..818ebb533228 100644 --- a/include/mbgl/mtl/layer_group.hpp +++ b/include/mbgl/mtl/layer_group.hpp @@ -26,9 +26,6 @@ class LayerGroup : public mbgl::LayerGroup { gfx::UniformBufferArray& mutableUniformBuffers() override { return uniformBuffers; }; - void bindUniformBuffers(RenderPass&) const noexcept; - void unbindUniformBuffers(RenderPass&) const noexcept {} - protected: UniformBufferArray uniformBuffers; }; diff --git a/include/mbgl/mtl/render_pass.hpp b/include/mbgl/mtl/render_pass.hpp index e13d6b5f5763..35ae8ffd2f3e 100644 --- a/include/mbgl/mtl/render_pass.hpp +++ b/include/mbgl/mtl/render_pass.hpp @@ -45,8 +45,9 @@ class RenderPass final : public gfx::RenderPass { void addDebugSignpost(const char* name) override; void bindVertex(const BufferResource&, std::size_t offset, std::size_t index, std::size_t size = 0); - + void unbindVertex(std::size_t index); void bindFragment(const BufferResource&, std::size_t offset, std::size_t index, std::size_t size = 0); + void unbindFragment(std::size_t index); private: void pushDebugGroup(const char* name) override; diff --git a/include/mbgl/mtl/uniform_block.hpp b/include/mbgl/mtl/uniform_block.hpp deleted file mode 100644 index dcfef87f7c0f..000000000000 --- a/include/mbgl/mtl/uniform_block.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include - -namespace mbgl { -namespace mtl { - -class UniformBlock final : public gfx::UniformBlock { -public: - UniformBlock(int index_, std::size_t size_) - : gfx::UniformBlock(index_, size_) {} - UniformBlock(const UniformBlock& other) - : gfx::UniformBlock(other) {} - UniformBlock(UniformBlock&& other) - : gfx::UniformBlock(std::move(other)) {} - ~UniformBlock() override = default; - void bindBuffer(const gfx::UniformBuffer& uniformBuffer) override; - void unbindBuffer() override; - - bool getBindVertex() const { return bindVertex; } - void setBindVertex(bool value) { bindVertex = value; } - - bool getBindFragment() const { return bindFragment; } - void setBindFragment(bool value) { bindFragment = value; } - -protected: - bool bindVertex = false; - bool bindFragment = false; -}; - -/// Stores a collection of uniform blocks by name -class UniformBlockArray final : public gfx::UniformBlockArray { -public: - UniformBlockArray() = default; - UniformBlockArray(UniformBlockArray&& other) - : gfx::UniformBlockArray(std::move(other)) {} - UniformBlockArray(const UniformBlockArray&) = delete; - - UniformBlockArray& operator=(UniformBlockArray&& other) { - gfx::UniformBlockArray::operator=(std::move(other)); - return *this; - } - UniformBlockArray& operator=(const UniformBlockArray& other) { - gfx::UniformBlockArray::operator=(other); - return *this; - } - -private: - std::unique_ptr create(int index, std::size_t size) override { - return std::make_unique(index, size); - } - std::unique_ptr copy(const gfx::UniformBlock& uniformBlocks) override { - return std::make_unique(static_cast(uniformBlocks)); - } -}; - -} // namespace mtl -} // namespace mbgl diff --git a/include/mbgl/mtl/uniform_buffer.hpp b/include/mbgl/mtl/uniform_buffer.hpp index 8e5c9735684a..9dfbdb1a8abe 100644 --- a/include/mbgl/mtl/uniform_buffer.hpp +++ b/include/mbgl/mtl/uniform_buffer.hpp @@ -6,6 +6,8 @@ namespace mbgl { namespace mtl { +class RenderPass; + class UniformBuffer final : public gfx::UniformBuffer { public: UniformBuffer(BufferResource&&); @@ -17,7 +19,7 @@ class UniformBuffer final : public gfx::UniformBuffer { UniformBuffer clone() const { return {buffer.clone()}; } - void update(const void* data, std::size_t size_) override; + void update(const void* data, std::size_t dataSize) override; protected: BufferResource buffer; @@ -40,6 +42,9 @@ class UniformBufferArray final : public gfx::UniformBufferArray { return *this; } + void bind(RenderPass& renderPass) const noexcept; + void unbind(RenderPass& renderPass) const noexcept {}; + private: gfx::UniqueUniformBuffer copy(const gfx::UniformBuffer& buffer) override { return std::make_unique(static_cast(buffer).clone()); diff --git a/include/mbgl/shaders/background_layer_ubo.hpp b/include/mbgl/shaders/background_layer_ubo.hpp index 9f31256e0a90..7c0e19aa27e2 100644 --- a/include/mbgl/shaders/background_layer_ubo.hpp +++ b/include/mbgl/shaders/background_layer_ubo.hpp @@ -11,31 +11,39 @@ namespace shaders { // Background struct alignas(16) BackgroundDrawableUBO { - std::array matrix; + /* 0 */ std::array matrix; + /* 64 */ }; -static_assert(sizeof(BackgroundDrawableUBO) == 64); +static_assert(sizeof(BackgroundDrawableUBO) == 4 * 16); -struct alignas(16) BackgroundLayerUBO { +/// Evaluated properties that do not depend on the tile +struct alignas(16) BackgroundPropsUBO { /* 0 */ Color color; /* 16 */ float opacity; - /* 24 */ float pad1, pad2, pad3; + /* 20 */ float pad1; + /* 24 */ float pad2; + /* 28 */ float pad3; /* 32 */ }; -static_assert(sizeof(BackgroundLayerUBO) == 32); +static_assert(sizeof(BackgroundPropsUBO) == 2 * 16); // // Background pattern struct alignas(16) BackgroundPatternDrawableUBO { - std::array matrix; - std::array pixel_coord_upper; - std::array pixel_coord_lower; - float tile_units_to_pixels; - float pad1, pad2, pad3; + /* 0 */ std::array matrix; + /* 64 */ std::array pixel_coord_upper; + /* 72 */ std::array pixel_coord_lower; + /* 80 */ float tile_units_to_pixels; + /* 84 */ float pad1; + /* 88 */ float pad2; + /* 92 */ float pad3; + /* 96 */ }; -static_assert(sizeof(BackgroundPatternDrawableUBO) == 96); +static_assert(sizeof(BackgroundPatternDrawableUBO) == 6 * 16); -struct alignas(16) BackgroundPatternLayerUBO { +/// Evaluated properties that do not depend on the tile +struct alignas(16) BackgroundPatternPropsUBO { /* 0 */ std::array pattern_tl_a; /* 8 */ std::array pattern_br_a; /* 16 */ std::array pattern_tl_b; @@ -48,7 +56,16 @@ struct alignas(16) BackgroundPatternLayerUBO { /* 60 */ float opacity; /* 64 */ }; -static_assert(sizeof(BackgroundPatternLayerUBO) == 64); +static_assert(sizeof(BackgroundPatternPropsUBO) == 4 * 16); + +#if MLN_UBO_CONSOLIDATION + +union BackgroundDrawableUnionUBO { + BackgroundDrawableUBO backgroundDrawableUBO; + BackgroundPatternDrawableUBO backgroundPatternDrawableUBO; +}; + +#endif } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/circle_layer_ubo.hpp b/include/mbgl/shaders/circle_layer_ubo.hpp index 9c347b807e10..27a7a5d87e61 100644 --- a/include/mbgl/shaders/circle_layer_ubo.hpp +++ b/include/mbgl/shaders/circle_layer_ubo.hpp @@ -6,45 +6,39 @@ namespace mbgl { namespace shaders { struct alignas(16) CircleDrawableUBO { - /* 0 */ std::array matrix; // composite model-view-projection matrix - /* 64 */ std::array extrude_scale; - /* 72 */ float pad; - /* 80 */ -}; -static_assert(sizeof(CircleDrawableUBO) == 5 * 16); + /* 0 */ std::array matrix; + /* 64 */ std::array extrude_scale; -struct alignas(16) CirclePaintParamsUBO { - /* 0 */ float camera_to_center_distance; - /* 4 */ float pad1, pad2, pad3; - /* 16 */ + // Interpolations + /* 72 */ float color_t; + /* 76 */ float radius_t; + /* 80 */ float blur_t; + /* 84 */ float opacity_t; + /* 88 */ float stroke_color_t; + /* 92 */ float stroke_width_t; + /* 96 */ float stroke_opacity_t; + /* 100 */ float pad1; + /* 104 */ float pad2; + /* 108 */ float pad3; + /* 112 */ }; -static_assert(sizeof(CirclePaintParamsUBO) == 1 * 16); +static_assert(sizeof(CircleDrawableUBO) == 7 * 16); +/// Evaluated properties that do not depend on the tile struct alignas(16) CircleEvaluatedPropsUBO { - Color color; - Color stroke_color; - float radius; - float blur; - float opacity; - float stroke_width; - float stroke_opacity; - int scale_with_map; - int pitch_with_map; - float padding; -}; -static_assert(sizeof(CircleEvaluatedPropsUBO) % 16 == 0); - -struct alignas(16) CircleInterpolateUBO { - float color_t; - float radius_t; - float blur_t; - float opacity_t; - float stroke_color_t; - float stroke_width_t; - float stroke_opacity_t; - float padding; + /* 0 */ Color color; + /* 16 */ Color stroke_color; + /* 32 */ float radius; + /* 36 */ float blur; + /* 40 */ float opacity; + /* 44 */ float stroke_width; + /* 48 */ float stroke_opacity; + /* 52 */ int scale_with_map; + /* 56 */ int pitch_with_map; + /* 60 */ float pad1; + /* 64 */ }; -static_assert(sizeof(CircleInterpolateUBO) % 16 == 0); +static_assert(sizeof(CircleEvaluatedPropsUBO) == 4 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/collision_layer_ubo.hpp b/include/mbgl/shaders/collision_layer_ubo.hpp index d185fa0c0319..3bd073c73028 100644 --- a/include/mbgl/shaders/collision_layer_ubo.hpp +++ b/include/mbgl/shaders/collision_layer_ubo.hpp @@ -5,14 +5,19 @@ namespace mbgl { namespace shaders { -struct alignas(16) CollisionUBO { - std::array matrix; - std::array extrude_scale; - float overscale_factor; - float pad; +struct alignas(16) CollisionDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ }; -static_assert(sizeof(CollisionUBO) % 16 == 0); -static_assert(sizeof(CollisionUBO) == 80); +static_assert(sizeof(CollisionDrawableUBO) == 4 * 16); + +struct alignas(16) CollisionTilePropsUBO { + /* 0 */ std::array extrude_scale; + /* 8 */ float overscale_factor; + /* 12 */ float pad1; + /* 16 */ +}; +static_assert(sizeof(CollisionTilePropsUBO) == 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/common_ubo.hpp b/include/mbgl/shaders/common_ubo.hpp deleted file mode 100644 index cb97cbfbdbe8..000000000000 --- a/include/mbgl/shaders/common_ubo.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include - -namespace mbgl { -namespace shaders { - -struct alignas(16) CommonUBO { - std::array matrix; - Color color; -}; -static_assert(sizeof(CommonUBO) % 16 == 0); - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/custom_drawable_layer_ubo.hpp b/include/mbgl/shaders/custom_drawable_layer_ubo.hpp index b022a52b90c2..81cea47a546f 100644 --- a/include/mbgl/shaders/custom_drawable_layer_ubo.hpp +++ b/include/mbgl/shaders/custom_drawable_layer_ubo.hpp @@ -5,26 +5,21 @@ namespace mbgl { namespace shaders { -/// Custom Symbol Icon matrix struct alignas(16) CustomSymbolIconDrawableUBO { /* 0 */ std::array matrix; - /* 64 */ + /* 64 */ std::array extrude_scale; + /* 72 */ std::array anchor; + /* 80 */ float angle_degrees; + /* 84 */ uint32_t scale_with_map; + /* 88 */ uint32_t pitch_with_map; + /* 92 */ float camera_to_center_distance; + /* 96 */ float aspect_ratio; + /* 100 */ float pad1; + /* 104 */ float pad2; + /* 108 */ float pad3; + /* 112 */ }; -static_assert(sizeof(CustomSymbolIconDrawableUBO) == 4 * 16); - -/// Custom Symbol Icon Parameters -struct alignas(16) CustomSymbolIconParametersUBO { - /* 0 */ std::array extrude_scale; - /* 8 */ std::array anchor; - /* 16 */ float angle_degrees; - /* 20 */ uint32_t scale_with_map; - /* 24 */ uint32_t pitch_with_map; - /* 28 */ float camera_to_center_distance; - /* 32 */ float aspect_ratio; - /* 36 */ float pad0, pad1, pad2; - /* 48 */ -}; -static_assert(sizeof(CustomSymbolIconParametersUBO) == 3 * 16); +static_assert(sizeof(CustomSymbolIconDrawableUBO) == 7 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/debug_layer_ubo.hpp b/include/mbgl/shaders/debug_layer_ubo.hpp index d0f6adffa380..577be4c9d5ab 100644 --- a/include/mbgl/shaders/debug_layer_ubo.hpp +++ b/include/mbgl/shaders/debug_layer_ubo.hpp @@ -6,12 +6,15 @@ namespace mbgl { namespace shaders { struct alignas(16) DebugUBO { - std::array matrix; - Color color; - float overlay_scale; - float pad1, pad2, pad3; + /* 0 */ std::array matrix; + /* 64 */ Color color; + /* 80 */ float overlay_scale; + /* 84 */ float pad1; + /* 88 */ float pad2; + /* 92 */ float pad3; + /* 96 */ }; -static_assert(sizeof(DebugUBO) % 16 == 0); +static_assert(sizeof(DebugUBO) == 6 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp b/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp index 2a748fbc3059..a87eddc0ddee 100644 --- a/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp +++ b/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp @@ -8,15 +8,32 @@ namespace mbgl { namespace shaders { struct alignas(16) FillExtrusionDrawableUBO { - /* 0 */ std::array matrix; - /* 64 */ std::array texsize; - /* 72 */ std::array pixel_coord_upper; - /* 80 */ std::array pixel_coord_lower; - /* 88 */ float height_factor; - /* 92 */ float tile_ratio; - /* 96 */ + /* 0 */ std::array matrix; + /* 64 */ std::array pixel_coord_upper; + /* 72 */ std::array pixel_coord_lower; + /* 80 */ float height_factor; + /* 84 */ float tile_ratio; + + // Interpolations + /* 88 */ float base_t; + /* 92 */ float height_t; + /* 96 */ float color_t; + /* 100 */ float pattern_from_t; + /* 104 */ float pattern_to_t; + /* 108 */ float pad1; + /* 112 */ }; -static_assert(sizeof(FillExtrusionDrawableUBO) == 6 * 16); +static_assert(sizeof(FillExtrusionDrawableUBO) == 7 * 16); + +struct alignas(16) FillExtrusionTilePropsUBO { + /* 0 */ std::array pattern_from; + /* 16 */ std::array pattern_to; + /* 32 */ std::array texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ +}; +static_assert(sizeof(FillExtrusionTilePropsUBO) == 3 * 16); /// Evaluated properties that do not depend on the tile struct alignas(16) FillExtrusionPropsUBO { @@ -37,25 +54,5 @@ struct alignas(16) FillExtrusionPropsUBO { }; static_assert(sizeof(FillExtrusionPropsUBO) == 5 * 16); -/// Evaluated properties that depend on the tile -struct alignas(16) FillExtrusionTilePropsUBO { - /* 0 */ std::array pattern_from; - /* 16 */ std::array pattern_to; - /* 32 */ -}; -static_assert(sizeof(FillExtrusionTilePropsUBO) == 2 * 16); - -/// Attribute interpolations -struct alignas(16) FillExtrusionInterpolateUBO { - /* 0 */ float base_t; - /* 4 */ float height_t; - /* 8 */ float color_t; - /* 12 */ float pattern_from_t; - /* 16 */ float pattern_to_t; - /* 20 */ float pad1, pad2, pad3; - /* 32 */ -}; -static_assert(sizeof(FillExtrusionInterpolateUBO) == 2 * 16); - } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/fill_layer_ubo.hpp b/include/mbgl/shaders/fill_layer_ubo.hpp index bcfd34ef9330..959c1aa1067c 100644 --- a/include/mbgl/shaders/fill_layer_ubo.hpp +++ b/include/mbgl/shaders/fill_layer_ubo.hpp @@ -9,112 +9,127 @@ namespace shaders { // Fill struct alignas(16) FillDrawableUBO { - /* 0 */ std::array matrix; // composite model-view-projection matrix - /* 64 */ + /* 0 */ std::array matrix; + + // Interpolations + /* 64 */ float color_t; + /* 68 */ float opacity_t; + /* 72 */ float pad1; + /* 76 */ float pad2; + /* 80 */ }; -static_assert(sizeof(FillDrawableUBO) == 4 * 16); - -struct alignas(16) FillInterpolateUBO { - float color_t; - float opacity_t; - float pad1, pad2; -}; -static_assert(sizeof(FillInterpolateUBO) % 16 == 0); +static_assert(sizeof(FillDrawableUBO) == 5 * 16); // // Fill outline struct alignas(16) FillOutlineDrawableUBO { - /* 0 */ std::array matrix; // composite model-view-projection matrix - /* 64 */ -}; -static_assert(sizeof(FillOutlineDrawableUBO) == 4 * 16); - -struct alignas(16) FillOutlineInterpolateUBO { - float outline_color_t; - float opacity_t; - float pad1, pad2; + /* 0 */ std::array matrix; + + // Interpolations + /* 64 */ float outline_color_t; + /* 68 */ float opacity_t; + /* 72 */ float pad1; + /* 76 */ float pad2; + /* 80 */ }; -static_assert(sizeof(FillOutlineInterpolateUBO) == 1 * 16); +static_assert(sizeof(FillOutlineDrawableUBO) == 5 * 16); // -// Fill Pattern +// Fill pattern struct alignas(16) FillPatternDrawableUBO { - /* 0 */ std::array matrix; // composite model-view-projection matrix + /* 0 */ std::array matrix; /* 64 */ std::array pixel_coord_upper; /* 72 */ std::array pixel_coord_lower; - /* 80 */ std::array texsize; - /* 88 */ float tile_ratio; - /* 92 */ float pad; + /* 80 */ float tile_ratio; + + // Interpolations + /* 84 */ float pattern_from_t; + /* 88 */ float pattern_to_t; + /* 92 */ float opacity_t; /* 96 */ }; static_assert(sizeof(FillPatternDrawableUBO) == 6 * 16); struct alignas(16) FillPatternTilePropsUBO { - std::array pattern_from; - std::array pattern_to; + /* 0 */ std::array pattern_from; + /* 16 */ std::array pattern_to; + /* 32 */ std::array texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ }; -static_assert(sizeof(FillPatternTilePropsUBO) == 2 * 16); - -struct alignas(16) FillPatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; - float pad1; -}; -static_assert(sizeof(FillPatternInterpolateUBO) == 1 * 16); +static_assert(sizeof(FillPatternTilePropsUBO) == 3 * 16); // // Fill pattern outline struct alignas(16) FillOutlinePatternDrawableUBO { - /* 0 */ std::array matrix; // composite model-view-projection matrix - /* 64 */ std::array pixel_coord_upper; - /* 72 */ std::array pixel_coord_lower; - /* 80 */ std::array texsize; - /* 88 */ float tile_ratio; - /* 92 */ float pad; - /* 96 */ + /* 0 */ std::array matrix; + /* 64 */ std::array pixel_coord_upper; + /* 72 */ std::array pixel_coord_lower; + /* 80 */ float tile_ratio; + + // Interpolations + /* 84 */ float pattern_from_t; + /* 88 */ float pattern_to_t; + /* 92 */ float opacity_t; + /* 96 */ }; static_assert(sizeof(FillOutlinePatternDrawableUBO) == 6 * 16); struct alignas(16) FillOutlinePatternTilePropsUBO { - std::array pattern_from; - std::array pattern_to; + /* 0 */ std::array pattern_from; + /* 16 */ std::array pattern_to; + /* 32 */ std::array texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ }; -static_assert(sizeof(FillOutlinePatternTilePropsUBO) == 2 * 16); - -struct alignas(16) FillOutlinePatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; - float pad; -}; -static_assert(sizeof(FillOutlinePatternInterpolateUBO) == 1 * 16); +static_assert(sizeof(FillOutlinePatternTilePropsUBO) == 3 * 16); // // Fill outline triangulated struct alignas(16) FillOutlineTriangulatedDrawableUBO { - std::array matrix; - float ratio; - float pad1, pad2, pad3; + /* 0 */ std::array matrix; + /* 64 */ float ratio; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; + /* 80 */ }; -static_assert(sizeof(FillOutlineTriangulatedDrawableUBO) % 16 == 0); - -// -// Fill evaluated properties +static_assert(sizeof(FillOutlineTriangulatedDrawableUBO) == 5 * 16); +/// Evaluated properties that do not depend on the tile struct alignas(16) FillEvaluatedPropsUBO { - Color color; - Color outline_color; - float opacity; - float fade; - float from_scale; - float to_scale; + /* 0 */ Color color; + /* 16 */ Color outline_color; + /* 32 */ float opacity; + /* 36 */ float fade; + /* 40 */ float from_scale; + /* 44 */ float to_scale; + /* 48 */ }; static_assert(sizeof(FillEvaluatedPropsUBO) == 3 * 16); +#if MLN_UBO_CONSOLIDATION + +union FillDrawableUnionUBO { + FillDrawableUBO fillDrawableUBO; + FillOutlineDrawableUBO fillOutlineDrawableUBO; + FillPatternDrawableUBO fillPatternDrawableUBO; + FillOutlinePatternDrawableUBO fillOutlinePatternDrawableUBO; + FillOutlineTriangulatedDrawableUBO fillOutlineTriangulatedDrawableUBO; +}; + +union FillTilePropsUnionUBO { + FillPatternTilePropsUBO fillPatternTilePropsUBO; + FillOutlinePatternTilePropsUBO fillOutlinePatternTilePropsUBO; +}; + +#endif + } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_background.hpp b/include/mbgl/shaders/gl/drawable_background.hpp index e7abe2b9300d..9e7e233a1df4 100644 --- a/include/mbgl/shaders/gl/drawable_background.hpp +++ b/include/mbgl/shaders/gl/drawable_background.hpp @@ -17,10 +17,12 @@ void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform BackgroundLayerUBO { + static constexpr const char* fragment = R"(layout (std140) uniform BackgroundPropsUBO { highp vec4 u_color; highp float u_opacity; - highp float layer_pad1, layer_pad2, layer_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { diff --git a/include/mbgl/shaders/gl/drawable_background_pattern.hpp b/include/mbgl/shaders/gl/drawable_background_pattern.hpp index d8edc98c143c..94cacec93d8a 100644 --- a/include/mbgl/shaders/gl/drawable_background_pattern.hpp +++ b/include/mbgl/shaders/gl/drawable_background_pattern.hpp @@ -13,9 +13,12 @@ struct ShaderSource { static constexpr const char* name = "FillShader"; static constexpr const char* vertex = R"(layout (std140) uniform FillDrawableUBO { highp mat4 u_matrix; -}; -layout (std140) uniform FillInterpolateUBO { + // Interpolations highp float u_color_t; highp float u_opacity_t; - highp float interp_pad1, interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; @@ -51,12 +52,7 @@ lowp float opacity = u_opacity; gl_Position = u_matrix * vec4(a_pos, 0, 1); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform FillInterpolateUBO { - highp float u_color_t; - highp float u_opacity_t; - highp float interp_pad1, interp_pad2; -}; -layout (std140) uniform FillEvaluatedPropsUBO { + static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; highp float u_opacity; diff --git a/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp b/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp index 76b83e8fc40a..10a7d912fb95 100644 --- a/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp +++ b/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp @@ -14,16 +14,31 @@ out vec4 v_color; layout (std140) uniform FillExtrusionDrawableUBO { highp mat4 u_matrix; - highp vec2 u_texsize; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; highp float u_height_factor; highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -33,20 +48,9 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; + #ifndef HAS_UNIFORM_u_base layout (location = 2) in highp vec2 a_base; #endif diff --git a/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp b/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp index df273b63d75e..11f7e40c42e8 100644 --- a/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp +++ b/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp @@ -23,21 +23,37 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform FillExtrusionDrawableUBO { highp mat4 u_matrix; - highp vec2 u_texsize; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; highp float u_height_factor; highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -47,19 +63,7 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; #ifndef HAS_UNIFORM_u_base @@ -152,18 +156,18 @@ mediump vec4 pattern_to = u_pattern_to; in vec2 v_pos_b; in vec4 v_lighting; -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; highp vec2 u_texsize; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -173,19 +177,7 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/include/mbgl/shaders/gl/drawable_fill_outline.hpp b/include/mbgl/shaders/gl/drawable_fill_outline.hpp index 08082a443a91..ae157ae5f4bf 100644 --- a/include/mbgl/shaders/gl/drawable_fill_outline.hpp +++ b/include/mbgl/shaders/gl/drawable_fill_outline.hpp @@ -16,17 +16,19 @@ struct ShaderSource { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillOutlineDrawableUBO { highp mat4 u_matrix; -}; -layout (std140) uniform FillOutlineInterpolateUBO { + // Interpolations highp float u_outline_color_t; highp float u_opacity_t; - highp float interp_pad1; - highp float interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; @@ -65,13 +67,7 @@ lowp float opacity = u_opacity; v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; } )"; - static constexpr const char* fragment = R"(layout (std140) uniform FillOutlineInterpolateUBO { - highp float u_outline_color_t; - highp float u_opacity_t; - highp float interp_pad1; - highp float interp_pad2; -}; -layout (std140) uniform FillEvaluatedPropsUBO { + static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; highp float u_opacity; diff --git a/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp b/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp index caaac380308c..f197a56318f6 100644 --- a/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp +++ b/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp @@ -16,26 +16,29 @@ struct ShaderSource { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillPatternDrawableUBO { highp mat4 u_matrix; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; highp float u_tile_ratio; - highp float drawable_pad1; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; }; + layout (std140) uniform FillPatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillPatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; @@ -98,24 +101,14 @@ mediump vec4 pattern_to = u_pattern_to; v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform FillPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; - highp float u_tile_ratio; - highp float drawable_pad1; -}; -layout (std140) uniform FillPatternTilePropsUBO { + static constexpr const char* fragment = R"(layout (std140) uniform FillPatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillPatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/include/mbgl/shaders/gl/drawable_heatmap.hpp b/include/mbgl/shaders/gl/drawable_heatmap.hpp index ebec009db5d3..9b93c798e12b 100644 --- a/include/mbgl/shaders/gl/drawable_heatmap.hpp +++ b/include/mbgl/shaders/gl/drawable_heatmap.hpp @@ -14,8 +14,10 @@ out vec2 v_extrude; layout (std140) uniform HeatmapDrawableUBO { highp mat4 u_matrix; highp float u_extrude_scale; + // Interpolations + lowp float u_weight_t; + lowp float u_radius_t; lowp float drawable_pad1; - lowp vec2 drawable_pad2; }; layout (std140) uniform HeatmapEvaluatedPropsUBO { @@ -25,12 +27,6 @@ layout (std140) uniform HeatmapEvaluatedPropsUBO { lowp float props_pad1; }; -layout (std140) uniform HeatmapInterpolateUBO { - lowp float u_weight_t; - lowp float u_radius_t; - lowp vec2 interp_pad1; -}; - #ifndef HAS_UNIFORM_u_weight layout (location = 1) in highp vec2 a_weight; out highp float weight; diff --git a/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp b/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp index c1593d0059fc..19317a2d6c61 100644 --- a/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp +++ b/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp @@ -19,12 +19,16 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform HeatmapTexturePropsUBO { highp mat4 u_matrix; highp float u_opacity; - lowp float props_pad1, props_pad2, props_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { @@ -41,7 +45,9 @@ uniform sampler2D u_color_ramp; layout (std140) uniform HeatmapTexturePropsUBO { highp mat4 u_matrix; highp float u_opacity; - lowp float props_pad1, props_pad2, props_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { diff --git a/include/mbgl/shaders/gl/drawable_hillshade.hpp b/include/mbgl/shaders/gl/drawable_hillshade.hpp index 3d706de1a5f5..8d186538040b 100644 --- a/include/mbgl/shaders/gl/drawable_hillshade.hpp +++ b/include/mbgl/shaders/gl/drawable_hillshade.hpp @@ -13,8 +13,6 @@ layout (location = 1) in vec2 a_texture_pos; layout (std140) uniform HillshadeDrawableUBO { highp mat4 u_matrix; - highp vec2 u_latrange; - highp vec2 u_light; }; out vec2 v_pos; @@ -27,8 +25,7 @@ void main() { static constexpr const char* fragment = R"(in vec2 v_pos; uniform sampler2D u_image; -layout (std140) uniform HillshadeDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform HillshadeTilePropsUBO { highp vec2 u_latrange; highp vec2 u_light; }; diff --git a/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp b/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp index 76335aed3665..2a2bf01b5334 100644 --- a/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp +++ b/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp @@ -13,6 +13,9 @@ layout (location = 1) in vec2 a_texture_pos; layout (std140) uniform HillshadePrepareDrawableUBO { highp mat4 u_matrix; +}; + +layout (std140) uniform HillshadePrepareTilePropsUBO { highp vec4 u_unpack; highp vec2 u_dimension; highp float u_zoom; @@ -36,8 +39,7 @@ precision highp float; in vec2 v_pos; uniform sampler2D u_image; -layout (std140) uniform HillshadePrepareDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform HillshadePrepareTilePropsUBO { highp vec4 u_unpack; highp vec2 u_dimension; highp float u_zoom; diff --git a/include/mbgl/shaders/gl/drawable_line.hpp b/include/mbgl/shaders/gl/drawable_line.hpp index ac8a9cabfb96..1f0935817825 100644 --- a/include/mbgl/shaders/gl/drawable_line.hpp +++ b/include/mbgl/shaders/gl/drawable_line.hpp @@ -27,23 +27,21 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineDrawableUBO { highp mat4 u_matrix; mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineInterpolationUBO { + // Interpolations lowp float u_color_t; lowp float u_blur_t; lowp float u_opacity_t; lowp float u_gapwidth_t; lowp float u_offset_t; lowp float u_width_t; - highp vec2 interp_pad1; + lowp float drawable_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -54,8 +52,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; @@ -167,23 +165,7 @@ mediump float width = u_width; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform LineDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineInterpolationUBO { - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - highp vec2 interp_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { + static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { highp vec4 u_color; lowp float u_blur; lowp float u_opacity; @@ -191,8 +173,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; in vec2 v_width2; diff --git a/include/mbgl/shaders/gl/drawable_line_gradient.hpp b/include/mbgl/shaders/gl/drawable_line_gradient.hpp index 0ddae503a60e..c77e020c44ab 100644 --- a/include/mbgl/shaders/gl/drawable_line_gradient.hpp +++ b/include/mbgl/shaders/gl/drawable_line_gradient.hpp @@ -31,23 +31,21 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineGradientDrawableUBO { highp mat4 u_matrix; mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineGradientInterpolationUBO { + // Interpolations lowp float u_blur_t; lowp float u_opacity_t; lowp float u_gapwidth_t; lowp float u_offset_t; lowp float u_width_t; - highp float interp_pad1; - highp vec2 interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -58,8 +56,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; @@ -162,23 +160,7 @@ mediump float width = u_width; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform LineGradientDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineGradientInterpolationUBO { - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - highp float interp_pad1; - highp vec2 interp_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { + static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { highp vec4 u_color; lowp float u_blur; lowp float u_opacity; @@ -186,8 +168,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/include/mbgl/shaders/gl/drawable_line_pattern.hpp b/include/mbgl/shaders/gl/drawable_line_pattern.hpp index cc03b8ffce41..ea4b8809f806 100644 --- a/include/mbgl/shaders/gl/drawable_line_pattern.hpp +++ b/include/mbgl/shaders/gl/drawable_line_pattern.hpp @@ -31,18 +31,13 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; - layout (std140) uniform LinePatternDrawableUBO { highp mat4 u_matrix; - mediump vec4 u_scale; - highp vec2 u_texsize; mediump float u_ratio; - highp float u_fade; -}; - -layout (std140) uniform LinePatternInterpolationUBO { + // Interpolations lowp float u_blur_t; lowp float u_opacity_t; lowp float u_offset_t; @@ -50,12 +45,15 @@ layout (std140) uniform LinePatternInterpolationUBO { lowp float u_width_t; lowp float u_pattern_from_t; lowp float u_pattern_to_t; - highp float interp_pad1; }; -layout (std140) uniform LinePatternTilePropertiesUBO { +layout (std140) uniform LinePatternTilePropsUBO { lowp vec4 u_pattern_from; lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -66,8 +64,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; @@ -188,28 +186,13 @@ mediump vec4 pattern_to = u_pattern_to; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(layout (std140) uniform LinePatternDrawableUBO { - highp mat4 u_matrix; + static constexpr const char* fragment = R"(layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; mediump vec4 u_scale; highp vec2 u_texsize; - mediump float u_ratio; highp float u_fade; -}; - -layout (std140) uniform LinePatternInterpolationUBO { - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_offset_t; - lowp float u_gapwidth_t; - lowp float u_width_t; - lowp float u_pattern_from_t; - lowp float u_pattern_to_t; - highp float interp_pad1; -}; - -layout (std140) uniform LinePatternTilePropertiesUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; + lowp float tileprops_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -220,8 +203,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/include/mbgl/shaders/gl/drawable_line_sdf.hpp b/include/mbgl/shaders/gl/drawable_line_sdf.hpp index 7fef18b07806..7772658f2c2b 100644 --- a/include/mbgl/shaders/gl/drawable_line_sdf.hpp +++ b/include/mbgl/shaders/gl/drawable_line_sdf.hpp @@ -31,22 +31,18 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineSDFDrawableUBO { highp mat4 u_matrix; highp vec2 u_patternscale_a; highp vec2 u_patternscale_b; - mediump float u_ratio; highp float u_tex_y_a; highp float u_tex_y_b; - highp float u_sdfgamma; - highp float u_mix; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineSDFInterpolationUBO { + mediump float u_ratio; + // Interpolations lowp float u_color_t; lowp float u_blur_t; lowp float u_opacity_t; @@ -54,7 +50,8 @@ layout (std140) uniform LineSDFInterpolationUBO { lowp float u_offset_t; lowp float u_width_t; lowp float u_floorwidth_t; - highp float interp_pad1; + lowp float drawable_pad1; + lowp float drawable_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -65,8 +62,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; @@ -191,28 +188,11 @@ lowp float floorwidth = u_floorwidth; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"( -layout (std140) uniform LineSDFDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_patternscale_a; - highp vec2 u_patternscale_b; - mediump float u_ratio; - highp float u_tex_y_a; - highp float u_tex_y_b; + static constexpr const char* fragment = R"(layout (std140) uniform LineSDFTilePropsUBO { highp float u_sdfgamma; highp float u_mix; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineSDFInterpolationUBO { - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float u_floorwidth_t; - highp float interp_pad1; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -223,8 +203,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/include/mbgl/shaders/gl/drawable_location_indicator.hpp b/include/mbgl/shaders/gl/drawable_location_indicator.hpp new file mode 100644 index 000000000000..af1c0d5c465e --- /dev/null +++ b/include/mbgl/shaders/gl/drawable_location_indicator.hpp @@ -0,0 +1,16 @@ +// Generated code, do not modify this file! +#pragma once +#include + +namespace mbgl { +namespace shaders { + +template <> +struct ShaderSource { + static constexpr const char* name = "LocationIndicatorShader"; + static constexpr const char* vertex = R"()"; + static constexpr const char* fragment = R"()"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp b/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp new file mode 100644 index 000000000000..cc26f8711afd --- /dev/null +++ b/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp @@ -0,0 +1,16 @@ +// Generated code, do not modify this file! +#pragma once +#include + +namespace mbgl { +namespace shaders { + +template <> +struct ShaderSource { + static constexpr const char* name = "LocationIndicatorTexturedShader"; + static constexpr const char* vertex = R"()"; + static constexpr const char* fragment = R"()"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_raster.hpp b/include/mbgl/shaders/gl/drawable_raster.hpp index 36eea70f8d93..ee2865764d19 100644 --- a/include/mbgl/shaders/gl/drawable_raster.hpp +++ b/include/mbgl/shaders/gl/drawable_raster.hpp @@ -22,8 +22,8 @@ layout (std140) uniform RasterEvaluatedPropsUBO { highp float u_brightness_high; highp float u_saturation_factor; highp float u_contrast_factor; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; layout (location = 0) in vec2 a_pos; @@ -54,8 +54,8 @@ void main() { highp float u_brightness_high; highp float u_saturation_factor; highp float u_contrast_factor; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image0; uniform sampler2D u_image1; diff --git a/include/mbgl/shaders/gl/drawable_symbol_icon.hpp b/include/mbgl/shaders/gl/drawable_symbol_icon.hpp index ecc372e8a157..9ac73b34aa43 100644 --- a/include/mbgl/shaders/gl/drawable_symbol_icon.hpp +++ b/include/mbgl/shaders/gl/drawable_symbol_icon.hpp @@ -22,7 +22,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -33,29 +34,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -64,13 +57,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec2 v_tex; @@ -82,7 +75,7 @@ out lowp float opacity; #endif void main() { - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; #ifndef HAS_UNIFORM_u_opacity opacity = unpack_mix_vec2(a_opacity, u_opacity_t); @@ -124,7 +117,7 @@ lowp float opacity = u_opacity; size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { @@ -155,12 +148,8 @@ lowp float opacity = u_opacity; layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -169,13 +158,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; in vec2 v_tex; diff --git a/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp b/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp index 4b75ae408232..12d88136a7cb 100644 --- a/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp +++ b/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp @@ -30,7 +30,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -41,29 +42,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -72,13 +65,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec2 v_data0; @@ -106,11 +99,11 @@ out lowp float halo_blur; #endif void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; #ifndef HAS_UNIFORM_u_fill_color fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); @@ -176,7 +169,7 @@ lowp float halo_blur = u_halo_blur; size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { @@ -209,28 +202,11 @@ lowp float halo_blur = u_halo_blur; )"; static constexpr const char* fragment = R"(#define SDF_PX 8.0 -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -239,13 +215,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; uniform sampler2D u_texture; diff --git a/include/mbgl/shaders/gl/drawable_symbol_sdf_text.hpp b/include/mbgl/shaders/gl/drawable_symbol_sdf_text.hpp deleted file mode 100644 index 7dbcfb10f69a..000000000000 --- a/include/mbgl/shaders/gl/drawable_symbol_sdf_text.hpp +++ /dev/null @@ -1,323 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "SymbolSDFTextShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - highp float u_device_pixel_ratio; - - highp float u_camera_to_center_distance; - highp float u_pitch; - bool u_rotate_symbol; - highp float u_aspect_ratio; - highp vec2 u_pad1; -}; - -layout (std140) uniform SymbolDynamicUBO { - highp float u_fade_change; - highp float u_pad7; - highp vec2 u_pad8; -}; - -layout (std140) uniform SymbolDrawablePaintUBO { - highp vec4 u_fill_color; - highp vec4 u_halo_color; - highp float u_opacity; - highp float u_halo_width; - highp float u_halo_blur; - highp float u_padding; -}; - -layout (std140) uniform SymbolDrawableTilePropsUBO { - bool u_is_text; - bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool u_pad3; -}; - -layout (std140) uniform SymbolDrawableInterpolateUBO { - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; - highp float u_pad4,u_pad5,u_pad6; -}; - -out vec2 v_data0; -out vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -layout (location = 5) in highp vec4 a_fill_color; -out highp vec4 fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -layout (location = 6) in highp vec4 a_halo_color; -out highp vec4 halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 7) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -layout (location = 8) in lowp vec2 a_halo_width; -out lowp float halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -layout (location = 9) in lowp vec2 a_halo_blur; -out lowp float halo_blur; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_fill_color -fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); -#else -highp vec4 fill_color = u_fill_color; -#endif - #ifndef HAS_UNIFORM_u_halo_color -halo_color = unpack_mix_color(a_halo_color, u_halo_color_t); -#else -highp vec4 halo_color = u_halo_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_halo_width -halo_width = unpack_mix_vec2(a_halo_width, u_halo_width_t); -#else -lowp float halo_width = u_halo_width; -#endif - #ifndef HAS_UNIFORM_u_halo_blur -halo_blur = unpack_mix_vec2(a_halo_blur, u_halo_blur_t); -#else -lowp float halo_blur = u_halo_blur; -#endif - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0 = a_tex / u_texsize; - v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity); -} -)"; - static constexpr const char* fragment = R"(#define SDF_PX 8.0 - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - highp float u_device_pixel_ratio; - - highp float u_camera_to_center_distance; - highp float u_pitch; - bool u_rotate_symbol; - highp float u_aspect_ratio; - highp vec2 u_pad1; -}; - -layout (std140) uniform SymbolDynamicUBO { - highp float u_fade_change; - highp float u_pad7; - highp vec2 u_pad8; -}; - -layout (std140) uniform SymbolDrawablePaintUBO { - highp vec4 u_fill_color; - highp vec4 u_halo_color; - highp float u_opacity; - highp float u_halo_width; - highp float u_halo_blur; - highp float u_padding; -}; - -layout (std140) uniform SymbolDrawableTilePropsUBO { - bool u_is_text; - bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool u_pad3; -}; - -layout (std140) uniform SymbolDrawableInterpolateUBO { - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; - highp float u_pad4,u_pad5,u_pad6; -}; - -uniform sampler2D u_texture; - -in vec2 v_data0; -in vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -in highp vec4 fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -in highp vec4 halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -in lowp float halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -in lowp float halo_blur; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_fill_color -highp vec4 fill_color = u_fill_color; -#endif - #ifdef HAS_UNIFORM_u_halo_color -highp vec4 halo_color = u_halo_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_halo_width -lowp float halo_width = u_halo_width; -#endif - #ifdef HAS_UNIFORM_u_halo_blur -lowp float halo_blur = u_halo_blur; -#endif - - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; - - vec2 tex = v_data0.xy; - float gamma_scale = v_data1.x; - float size = v_data1.y; - float fade_opacity = v_data1[2]; - - float fontScale = u_is_text ? size / 24.0 : size; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp b/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp index 8f47d12c0731..4b55116f1297 100644 --- a/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp +++ b/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp @@ -29,7 +29,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -40,29 +41,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -71,13 +64,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec4 v_data0; @@ -105,11 +98,11 @@ out lowp float halo_blur; #endif void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; #ifndef HAS_UNIFORM_u_fill_color fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); @@ -212,28 +205,11 @@ lowp float halo_blur = u_halo_blur; #define SDF 1.0 #define ICON 0.0 -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -242,13 +218,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; uniform sampler2D u_texture; diff --git a/include/mbgl/shaders/gl/shader_program_gl.hpp b/include/mbgl/shaders/gl/shader_program_gl.hpp index 8e625fb7b89d..df370fa17b29 100644 --- a/include/mbgl/shaders/gl/shader_program_gl.hpp +++ b/include/mbgl/shaders/gl/shader_program_gl.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -20,10 +19,7 @@ class ShaderProgramGL final : public gfx::ShaderProgramBase { using SamplerLocationArray = std::array, shaders::maxTextureCountPerShader>; ShaderProgramGL(UniqueProgram&& glProgram_); - ShaderProgramGL(UniqueProgram&&, - UniformBlockArrayGL&& uniformBlocks, - VertexAttributeArrayGL&& attributes, - SamplerLocationArray&& samplerLocations); + ShaderProgramGL(UniqueProgram&&, VertexAttributeArrayGL&& attributes, SamplerLocationArray&& samplerLocations); ShaderProgramGL(ShaderProgramGL&& other); ~ShaderProgramGL() noexcept override = default; @@ -42,21 +38,15 @@ class ShaderProgramGL final : public gfx::ShaderProgramBase { std::optional getSamplerLocation(const size_t id) const override; - const gfx::UniformBlockArray& getUniformBlocks() const override { return uniformBlocks; } - const gfx::VertexAttributeArray& getVertexAttributes() const override { return vertexAttributes; } const gfx::VertexAttributeArray& getInstanceAttributes() const override { return instanceAttributes; } ProgramID getGLProgramID() const { return glProgram; } -protected: - gfx::UniformBlockArray& mutableUniformBlocks() override { return uniformBlocks; } - protected: UniqueProgram glProgram; - UniformBlockArrayGL uniformBlocks; VertexAttributeArrayGL vertexAttributes; VertexAttributeArrayGL instanceAttributes; SamplerLocationArray samplerLocations; diff --git a/include/mbgl/shaders/heatmap_layer_ubo.hpp b/include/mbgl/shaders/heatmap_layer_ubo.hpp index 68ac43ea8c92..16a3704fe162 100644 --- a/include/mbgl/shaders/heatmap_layer_ubo.hpp +++ b/include/mbgl/shaders/heatmap_layer_ubo.hpp @@ -6,26 +6,26 @@ namespace mbgl { namespace shaders { struct alignas(16) HeatmapDrawableUBO { - std::array matrix; - float extrude_scale; - std::array padding; -}; -static_assert(sizeof(HeatmapDrawableUBO) % 16 == 0); + /* 0 */ std::array matrix; + /* 64 */ float extrude_scale; -struct alignas(16) HeatmapEvaluatedPropsUBO { - float weight; - float radius; - float intensity; - float padding; + // Interpolations + /* 68 */ float weight_t; + /* 72 */ float radius_t; + /* 76 */ float pad1; + /* 80 */ }; -static_assert(sizeof(HeatmapEvaluatedPropsUBO) % 16 == 0); +static_assert(sizeof(HeatmapDrawableUBO) == 5 * 16); -struct alignas(16) HeatmapInterpolateUBO { - float weight_t; - float radius_t; - std::array padding; +/// Evaluated properties that do not depend on the tile +struct alignas(16) HeatmapEvaluatedPropsUBO { + /* 0 */ float weight; + /* 4 */ float radius; + /* 8 */ float intensity; + /* 12 */ float padding; + /* 16 */ }; -static_assert(sizeof(HeatmapInterpolateUBO) % 16 == 0); +static_assert(sizeof(HeatmapEvaluatedPropsUBO) == 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp b/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp index a4888dbcf0e1..e94351e06f06 100644 --- a/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp +++ b/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp @@ -6,11 +6,14 @@ namespace mbgl { namespace shaders { struct alignas(16) HeatmapTexturePropsUBO { - std::array matrix; - float opacity; - float pad1, pad2, pad3; + /* 0 */ std::array matrix; + /* 64 */ float opacity; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; + /* 80 */ }; -static_assert(sizeof(HeatmapTexturePropsUBO) % 16 == 0); +static_assert(sizeof(HeatmapTexturePropsUBO) == 5 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/hillshade_layer_ubo.hpp b/include/mbgl/shaders/hillshade_layer_ubo.hpp index 77fd1a993ee4..7edee8f77290 100644 --- a/include/mbgl/shaders/hillshade_layer_ubo.hpp +++ b/include/mbgl/shaders/hillshade_layer_ubo.hpp @@ -6,18 +6,26 @@ namespace mbgl { namespace shaders { struct alignas(16) HillshadeDrawableUBO { - std::array matrix; - std::array latrange; - std::array light; + /* 0 */ std::array matrix; + /* 64 */ }; -static_assert(sizeof(HillshadeDrawableUBO) == 16 * 5); +static_assert(sizeof(HillshadeDrawableUBO) == 4 * 16); +struct alignas(16) HillshadeTilePropsUBO { + /* 0 */ std::array latrange; + /* 8 */ std::array light; + /* 16 */ +}; +static_assert(sizeof(HillshadeTilePropsUBO) == 16); + +/// Evaluated properties that do not depend on the tile struct alignas(16) HillshadeEvaluatedPropsUBO { - Color highlight; - Color shadow; - Color accent; + /* 0 */ Color highlight; + /* 16 */ Color shadow; + /* 32 */ Color accent; + /* 48 */ }; -static_assert(sizeof(HillshadeEvaluatedPropsUBO) % 16 == 0); +static_assert(sizeof(HillshadeEvaluatedPropsUBO) == 3 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp b/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp index 57ac65f3e973..a00cdc6e7c0d 100644 --- a/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp +++ b/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp @@ -6,13 +6,19 @@ namespace mbgl { namespace shaders { struct alignas(16) HillshadePrepareDrawableUBO { - std::array matrix; - std::array unpack; - std::array dimension; - float zoom; - float maxzoom; + /* 0 */ std::array matrix; + /* 64 */ }; -static_assert(sizeof(HillshadePrepareDrawableUBO) % 16 == 0); +static_assert(sizeof(HillshadePrepareDrawableUBO) == 4 * 16); + +struct alignas(16) HillshadePrepareTilePropsUBO { + /* 0 */ std::array unpack; + /* 16 */ std::array dimension; + /* 24 */ float zoom; + /* 28 */ float maxzoom; + /* 32 */ +}; +static_assert(sizeof(HillshadePrepareTilePropsUBO) == 2 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/layer_ubo.hpp b/include/mbgl/shaders/layer_ubo.hpp index d46d16104b63..1f3d97887c02 100644 --- a/include/mbgl/shaders/layer_ubo.hpp +++ b/include/mbgl/shaders/layer_ubo.hpp @@ -37,25 +37,45 @@ static_assert(sizeof(Attribute) == 8); // Global UBOs struct alignas(16) GlobalPaintParamsUBO { - std::array pattern_atlas_texsize; - std::array units_to_pixels; - std::array world_size; - float camera_to_center_distance; - float symbol_fade_change; - float aspect_ratio; - float pixel_ratio; - float zoom; - float pad1; + /* 0 */ std::array pattern_atlas_texsize; + /* 8 */ std::array units_to_pixels; + /* 16 */ std::array world_size; + /* 24 */ float camera_to_center_distance; + /* 28 */ float symbol_fade_change; + /* 32 */ float aspect_ratio; + /* 36 */ float pixel_ratio; + /* 40 */ float map_zoom; + /* 44 */ float pad1; + /* 48 */ }; static_assert(sizeof(GlobalPaintParamsUBO) == 3 * 16); +#if MLN_RENDER_BACKEND_VULKAN +struct alignas(16) GlobalPlatformParamsUBO { + /* 0 */ alignas(16) std::array rotation0; + /* 16 */ alignas(16) std::array rotation1; + /* 32 */ +}; +static_assert(sizeof(GlobalPlatformParamsUBO) == 2 * 16); +#endif + enum { idGlobalPaintParamsUBO, -#if MLN_RENDER_BACKEND_VULKAN - PlatformParamsUBO, +#if MLN_RENDER_BACKEND_METAL + idGlobalUBOIndex, +#elif MLN_RENDER_BACKEND_VULKAN + idGlobalPlatformParamsUBO, #endif globalUBOCount }; +enum { + idDrawableReservedVertexOnlyUBO = globalUBOCount, + idDrawableReservedFragmentOnlyUBO, + drawableReservedUBOCount +}; + +#define MLN_UBO_CONSOLIDATION (MLN_RENDER_BACKEND_METAL || MLN_RENDER_BACKEND_VULKAN) + } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/line_layer_ubo.hpp b/include/mbgl/shaders/line_layer_ubo.hpp index 82b22842ad57..34a713f40abe 100644 --- a/include/mbgl/shaders/line_layer_ubo.hpp +++ b/include/mbgl/shaders/line_layer_ubo.hpp @@ -11,6 +11,109 @@ namespace mbgl { namespace shaders { +// +// Line + +struct alignas(16) LineDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float color_t; + /* 72 */ float blur_t; + /* 76 */ float opacity_t; + /* 80 */ float gapwidth_t; + /* 84 */ float offset_t; + /* 88 */ float width_t; + /* 92 */ float pad1; + /* 96 */ +}; +static_assert(sizeof(LineDrawableUBO) == 6 * 16); + +// +// Line gradient + +struct alignas(16) LineGradientDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float blur_t; + /* 72 */ float opacity_t; + /* 76 */ float gapwidth_t; + /* 80 */ float offset_t; + /* 84 */ float width_t; + /* 88 */ float pad1; + /* 92 */ float pad2; + /* 96 */ +}; +static_assert(sizeof(LineGradientDrawableUBO) == 6 * 16); + +// +// Line pattern + +struct alignas(16) LinePatternDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float blur_t; + /* 72 */ float opacity_t; + /* 76 */ float gapwidth_t; + /* 80 */ float offset_t; + /* 84 */ float width_t; + /* 88 */ float pattern_from_t; + /* 92 */ float pattern_to_t; + /* 96 */ +}; +static_assert(sizeof(LinePatternDrawableUBO) == 6 * 16); + +struct alignas(16) LinePatternTilePropsUBO { + /* 0 */ std::array pattern_from; + /* 16 */ std::array pattern_to; + /* 32 */ std::array scale; + /* 48 */ std::array texsize; + /* 56 */ float fade; + /* 60 */ float pad1; + /* 64 */ +}; +static_assert(sizeof(LinePatternTilePropsUBO) == 4 * 16); + +// +// Line SDF + +struct alignas(16) LineSDFDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ std::array patternscale_a; + /* 72 */ std::array patternscale_b; + /* 80 */ float tex_y_a; + /* 84 */ float tex_y_b; + /* 88 */ float ratio; + + // Interpolations + /* 92 */ float color_t; + /* 96 */ float blur_t; + /* 100 */ float opacity_t; + /* 104 */ float gapwidth_t; + /* 108 */ float offset_t; + /* 112 */ float width_t; + /* 116 */ float floorwidth_t; + /* 120 */ float pad1; + /* 124 */ float pad2; + /* 128 */ +}; +static_assert(sizeof(LineSDFDrawableUBO) == 8 * 16); + +struct alignas(16) LineSDFTilePropsUBO { + /* 0 */ float sdfgamma; + /* 4 */ float mix; + /* 8 */ float pad1; + /* 12 */ float pad2; + /* 16 */ +}; +static_assert(sizeof(LineSDFTilePropsUBO) == 16); + +/// Expression properties that do not depend on the tile enum class LineExpressionMask : uint32_t { None = 0, Color = 1 << 0, @@ -22,27 +125,6 @@ enum class LineExpressionMask : uint32_t { Offset = 1 << 6, }; -// -// Line - -struct alignas(16) LineDrawableUBO { - std::array matrix; - float ratio; - float pad1, pad2, pad3; -}; -static_assert(sizeof(LineDrawableUBO) % 16 == 0); - -struct alignas(16) LineInterpolationUBO { - float color_t; - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float pad1, pad2; -}; -static_assert(sizeof(LineInterpolationUBO) % 16 == 0); - struct alignas(16) LineExpressionUBO { gfx::GPUExpression color; gfx::GPUExpression blur; @@ -54,94 +136,36 @@ struct alignas(16) LineExpressionUBO { }; static_assert(sizeof(LineExpressionUBO) % 16 == 0); -// -// Line gradient - -using LineGradientDrawableUBO = LineDrawableUBO; - -struct alignas(16) LineGradientInterpolationUBO { - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float pad1, pad2, pad3; +/// Evaluated properties that do not depend on the tile +struct alignas(16) LineEvaluatedPropsUBO { + /* 0 */ Color color; + /* 16 */ float blur; + /* 20 */ float opacity; + /* 24 */ float gapwidth; + /* 28 */ float offset; + /* 32 */ float width; + /* 36 */ float floorwidth; + /* 40 */ LineExpressionMask expressionMask; + /* 44 */ float pad1; + /* 48 */ }; -static_assert(sizeof(LineGradientInterpolationUBO) % 16 == 0); - -// -// Line pattern +static_assert(sizeof(LineEvaluatedPropsUBO) == 3 * 16); -struct alignas(16) LinePatternDrawableUBO { - std::array matrix; - std::array scale; - std::array texsize; - float ratio; - float fade; -}; -static_assert(sizeof(LinePatternDrawableUBO) % 16 == 0); - -struct alignas(16) LinePatternInterpolationUBO { - float blur_t; - float opacity_t; - float offset_t; - float gapwidth_t; - float width_t; - float pattern_from_t; - float pattern_to_t; - float pad1; -}; -static_assert(sizeof(LinePatternInterpolationUBO) % 16 == 0); +#if MLN_UBO_CONSOLIDATION -struct alignas(16) LinePatternTilePropertiesUBO { - std::array pattern_from; - std::array pattern_to; +union LineDrawableUnionUBO { + LineDrawableUBO lineDrawableUBO; + LineGradientDrawableUBO lineGradientDrawableUBO; + LinePatternDrawableUBO linePatternDrawableUBO; + LineSDFDrawableUBO lineSDFDrawableUBO; }; -static_assert(sizeof(LinePatternTilePropertiesUBO) % 16 == 0); - -// -// Line SDF -struct alignas(16) LineSDFDrawableUBO { - std::array matrix; - std::array patternscale_a; - std::array patternscale_b; - float ratio; - float tex_y_a; - float tex_y_b; - float sdfgamma; - float mix; - float pad1, pad2, pad3; -}; -static_assert(sizeof(LineSDFDrawableUBO) % 16 == 0); - -struct alignas(16) LineSDFInterpolationUBO { - float color_t; - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float floorwidth_t; - float pad1; +union LineTilePropsUnionUBO { + LinePatternTilePropsUBO linePatternTilePropsUBO; + LineSDFTilePropsUBO lineSDFTilePropsUBO; }; -static_assert(sizeof(LineSDFInterpolationUBO) % 16 == 0); - -// -// Line evaluated properties -struct alignas(16) LineEvaluatedPropsUBO { - Color color; - float blur; - float opacity; - float gapwidth; - float offset; - float width; - float floorwidth; - LineExpressionMask expressionMask; - float pad1; -}; -static_assert(sizeof(LineEvaluatedPropsUBO) % 16 == 0); +#endif } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/location_indicator_ubo.hpp b/include/mbgl/shaders/location_indicator_ubo.hpp new file mode 100644 index 000000000000..797550ee70ee --- /dev/null +++ b/include/mbgl/shaders/location_indicator_ubo.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace mbgl { +namespace shaders { + +struct alignas(16) LocationIndicatorDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ Color color; + /* 80 */ +}; +static_assert(sizeof(LocationIndicatorDrawableUBO) == 5 * 16); + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/background.hpp b/include/mbgl/shaders/mtl/background.hpp index 45211edbdf8d..cb683aefde7d 100644 --- a/include/mbgl/shaders/mtl/background.hpp +++ b/include/mbgl/shaders/mtl/background.hpp @@ -2,58 +2,189 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define BACKGROUND_SHADER_COMMON \ + R"( + +enum { + idBackgroundDrawableUBO = idDrawableReservedVertexOnlyUBO, + idBackgroundPropsUBO = drawableReservedUBOCount, + backgroundUBOCount +}; + +// +// Background + +struct alignas(16) BackgroundDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ +}; +static_assert(sizeof(BackgroundDrawableUBO) == 4 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) BackgroundPropsUBO { + /* 0 */ float4 color; + /* 16 */ float opacity; + /* 20 */ float pad1; + /* 24 */ float pad2; + /* 28 */ float pad3; + /* 32 */ +}; +static_assert(sizeof(BackgroundPropsUBO) == 2 * 16, "wrong size"); + +// +// Background pattern + +struct alignas(16) BackgroundPatternDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 pixel_coord_upper; + /* 72 */ float2 pixel_coord_lower; + /* 80 */ float tile_units_to_pixels; + /* 84 */ float pad1; + /* 88 */ float pad2; + /* 92 */ float pad3; + /* 96 */ +}; +static_assert(sizeof(BackgroundPatternDrawableUBO) == 6 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) BackgroundPatternPropsUBO { + /* 0 */ float2 pattern_tl_a; + /* 8 */ float2 pattern_br_a; + /* 16 */ float2 pattern_tl_b; + /* 24 */ float2 pattern_br_b; + /* 32 */ float2 pattern_size_a; + /* 40 */ float2 pattern_size_b; + /* 48 */ float scale_a; + /* 52 */ float scale_b; + /* 56 */ float mix; + /* 60 */ float opacity; + /* 64 */ +}; +static_assert(sizeof(BackgroundPatternPropsUBO) == 4 * 16, "wrong size"); + +union BackgroundDrawableUnionUBO { + BackgroundDrawableUBO backgroundDrawableUBO; + BackgroundPatternDrawableUBO backgroundPatternDrawableUBO; +}; + +)" + template <> struct ShaderSource { static constexpr auto name = "BackgroundShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = BACKGROUND_SHADER_COMMON R"( #include using namespace metal; struct VertexStage { - short2 position [[attribute(3)]]; + short2 position [[attribute(backgroundUBOCount + 0)]]; }; struct FragmentStage { float4 position [[position, invariant]]; }; -struct alignas(16) BackgroundDrawableUBO { - float4x4 matrix; +FragmentStage vertex vertexMain(VertexStage in [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const BackgroundDrawableUnionUBO* drawableVector [[buffer(idBackgroundDrawableUBO)]]) { + + device const BackgroundDrawableUBO& drawable = drawableVector[uboIndex].backgroundDrawableUBO; + + return { + .position = drawable.matrix * float4(float2(in.position.xy), 0, 1) + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const BackgroundPropsUBO& props [[buffer(idBackgroundPropsUBO)]]) { +#if defined(OVERDRAW_INSPECTOR) + return half4(1.0); +#endif + + return half4(props.color * props.opacity); +} +)"; }; -struct alignas(16) BackgroundLayerUBO { - float4 color; - float opacity; - float pad1, pad2, pad3; + +template <> +struct ShaderSource { + static constexpr auto name = "BackgroundPatternShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = BACKGROUND_SHADER_COMMON R"( +#include +using namespace metal; + +struct VertexStage { + short2 position [[attribute(backgroundUBOCount + 0)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float2 pos_a; + float2 pos_b; }; FragmentStage vertex vertexMain(VertexStage in [[stage_in]], - device const BackgroundDrawableUBO& drawableUBO [[buffer(1)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const BackgroundDrawableUnionUBO* drawableVector [[buffer(idBackgroundDrawableUBO)]], + device const BackgroundPatternPropsUBO& props [[buffer(idBackgroundPropsUBO)]]) { + + device const BackgroundPatternDrawableUBO& drawable = drawableVector[uboIndex].backgroundPatternDrawableUBO; + + const float2 pos = float2(in.position); + const float2 pos_a = get_pattern_pos(drawable.pixel_coord_upper, + drawable.pixel_coord_lower, + props.scale_a * props.pattern_size_a, + drawable.tile_units_to_pixels, + pos); + const float2 pos_b = get_pattern_pos(drawable.pixel_coord_upper, + drawable.pixel_coord_lower, + props.scale_b * props.pattern_size_b, + drawable.tile_units_to_pixels, + pos); return { - .position = drawableUBO.matrix * float4(float2(in.position.xy), 0, 1) + .position = drawable.matrix * float4(float2(in.position.xy), 0, 1), + .pos_a = pos_a, + .pos_b = pos_b, }; } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const BackgroundLayerUBO& layerUBO [[buffer(2)]]) { + device const GlobalPaintParamsUBO& paintParamsUBO [[buffer(idGlobalPaintParamsUBO)]], + device const BackgroundPatternPropsUBO& props [[buffer(idBackgroundPropsUBO)]], + texture2d image [[texture(0)]], + sampler image_sampler [[sampler(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif - return half4(layerUBO.color * layerUBO.opacity); + const float2 texsize = paintParamsUBO.pattern_atlas_texsize; + const float2 imagecoord = glMod(float2(in.pos_a), 1.0); + const float2 pos = mix(props.pattern_tl_a / texsize, props.pattern_br_a / texsize, imagecoord); + const float4 color1 = image.sample(image_sampler, pos); + const float2 imagecoord_b = glMod(float2(in.pos_b), 1.0); + const float2 pos2 = mix(props.pattern_tl_b / texsize, props.pattern_br_b / texsize, imagecoord_b); + const float4 color2 = image.sample(image_sampler, pos2); + + return half4(mix(color1, color2, props.mix) * props.opacity); } )"; }; diff --git a/include/mbgl/shaders/mtl/background_pattern.hpp b/include/mbgl/shaders/mtl/background_pattern.hpp deleted file mode 100644 index 408cbd2fe4e1..000000000000 --- a/include/mbgl/shaders/mtl/background_pattern.hpp +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once - -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "BackgroundPatternShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( -#include -using namespace metal; - -struct VertexStage { - short2 position [[attribute(3)]]; -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - float2 pos_a; - float2 pos_b; -}; - -struct alignas(16) BackgroundPatternDrawableUBO { - float4x4 matrix; - float2 pixel_coord_upper; - float2 pixel_coord_lower; - float tile_units_to_pixels; - float pad1, pad2, pad3; -}; -struct alignas(16) BackgroundPatternLayerUBO { - float2 pattern_tl_a; - float2 pattern_br_a; - float2 pattern_tl_b; - float2 pattern_br_b; - float2 pattern_size_a; - float2 pattern_size_b; - float scale_a; - float scale_b; - float mix; - float opacity; -}; - -FragmentStage vertex vertexMain(VertexStage in [[stage_in]], - device const BackgroundPatternDrawableUBO& drawableUBO [[buffer(1)]], - device const BackgroundPatternLayerUBO& layerUBO [[buffer(2)]]) { - const float2 pos = float2(in.position); - const float2 pos_a = get_pattern_pos(drawableUBO.pixel_coord_upper, - drawableUBO.pixel_coord_lower, - layerUBO.scale_a * layerUBO.pattern_size_a, - drawableUBO.tile_units_to_pixels, - pos); - const float2 pos_b = get_pattern_pos(drawableUBO.pixel_coord_upper, - drawableUBO.pixel_coord_lower, - layerUBO.scale_b * layerUBO.pattern_size_b, - drawableUBO.tile_units_to_pixels, - pos); - return { - .position = drawableUBO.matrix * float4(float2(in.position.xy), 0, 1), - .pos_a = pos_a, - .pos_b = pos_b, - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const GlobalPaintParamsUBO& paintParamsUBO [[buffer(0)]], - device const BackgroundPatternLayerUBO& layerUBO [[buffer(2)]], - texture2d image [[texture(0)]], - sampler image_sampler [[sampler(0)]]) { -#if defined(OVERDRAW_INSPECTOR) - return half4(1.0); -#endif - - const float2 texsize = paintParamsUBO.pattern_atlas_texsize; - const float2 imagecoord = glMod(float2(in.pos_a), 1.0); - const float2 pos = mix(layerUBO.pattern_tl_a / texsize, layerUBO.pattern_br_a / texsize, imagecoord); - const float4 color1 = image.sample(image_sampler, pos); - const float2 imagecoord_b = glMod(float2(in.pos_b), 1.0); - const float2 pos2 = mix(layerUBO.pattern_tl_b / texsize, layerUBO.pattern_br_b / texsize, imagecoord_b); - const float4 color2 = image.sample(image_sampler, pos2); - - return half4(mix(color1, color2, layerUBO.mix) * layerUBO.opacity); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/circle.hpp b/include/mbgl/shaders/mtl/circle.hpp index 94b22fb1523f..2a95a763fe10 100644 --- a/include/mbgl/shaders/mtl/circle.hpp +++ b/include/mbgl/shaders/mtl/circle.hpp @@ -2,47 +2,91 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define CIRCLE_SHADER_PRELUDE \ + R"( + +enum { + idCircleDrawableUBO = idDrawableReservedVertexOnlyUBO, + idCircleEvaluatedPropsUBO = drawableReservedUBOCount, + circleUBOCount +}; + +struct alignas(16) CircleDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 extrude_scale; + + // Interpolations + /* 72 */ float color_t; + /* 76 */ float radius_t; + /* 80 */ float blur_t; + /* 84 */ float opacity_t; + /* 88 */ float stroke_color_t; + /* 92 */ float stroke_width_t; + /* 96 */ float stroke_opacity_t; + /* 100 */ float pad1; + /* 104 */ float pad2; + /* 108 */ float pad3; + /* 112 */ +}; +static_assert(sizeof(CircleDrawableUBO) == 7 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) CircleEvaluatedPropsUBO { + /* 0 */ float4 color; + /* 16 */ float4 stroke_color; + /* 32 */ float radius; + /* 36 */ float blur; + /* 40 */ float opacity; + /* 44 */ float stroke_width; + /* 48 */ float stroke_opacity; + /* 52 */ int scale_with_map; + /* 56 */ int pitch_with_map; + /* 60 */ float pad1; + /* 64 */ +}; +static_assert(sizeof(CircleEvaluatedPropsUBO) == 4 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "CircleShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = CIRCLE_SHADER_PRELUDE R"( struct VertexStage { - short2 position [[attribute(4)]]; + short2 position [[attribute(circleUBOCount + 0)]]; #if !defined(HAS_UNIFORM_u_color) - float4 color [[attribute(5)]]; + float4 color [[attribute(circleUBOCount + 1)]]; #endif #if !defined(HAS_UNIFORM_u_radius) - float2 radius [[attribute(6)]]; + float2 radius [[attribute(circleUBOCount + 2)]]; #endif #if !defined(HAS_UNIFORM_u_blur) - float2 blur [[attribute(7)]]; + float2 blur [[attribute(circleUBOCount + 3)]]; #endif #if !defined(HAS_UNIFORM_u_opacity) - float2 opacity [[attribute(8)]]; + float2 opacity [[attribute(circleUBOCount + 4)]]; #endif #if !defined(HAS_UNIFORM_u_stroke_color) - float4 stroke_color [[attribute(9)]]; + float4 stroke_color [[attribute(circleUBOCount + 5)]]; #endif #if !defined(HAS_UNIFORM_u_stroke_width) - float2 stroke_width [[attribute(10)]]; + float2 stroke_width [[attribute(circleUBOCount + 6)]]; #endif #if !defined(HAS_UNIFORM_u_stroke_opacity) - float2 stroke_opacity [[attribute(11)]]; + float2 stroke_opacity [[attribute(circleUBOCount + 7)]]; #endif }; @@ -74,55 +118,24 @@ struct FragmentStage { #endif }; -struct alignas(16) CircleDrawableUBO { - float4x4 matrix; - float2 extrude_scale; - float2 padding; -}; -struct alignas(16) CirclePaintParamsUBO { - float camera_to_center_distance; - float pad1,pad2,pad3; -}; -struct alignas(16) CircleEvaluatedPropsUBO { - float4 color; - float4 stroke_color; - float radius; - float blur; - float opacity; - float stroke_width; - float stroke_opacity; - int scale_with_map; - int pitch_with_map; - float padding; -}; - -struct alignas(16) CircleInterpolateUBO { - float color_t; - float radius_t; - float blur_t; - float opacity_t; - float stroke_color_t; - float stroke_width_t; - float stroke_opacity_t; - float pad1_; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const CircleDrawableUBO& drawable [[buffer(1)]], - device const CircleInterpolateUBO& interp [[buffer(2)]], - device const CircleEvaluatedPropsUBO& props [[buffer(3)]]) { + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const CircleDrawableUBO* drawableVector [[buffer(idCircleDrawableUBO)]], + device const CircleEvaluatedPropsUBO& props [[buffer(idCircleEvaluatedPropsUBO)]]) { + + device const CircleDrawableUBO& drawable = drawableVector[uboIndex]; #if defined(HAS_UNIFORM_u_radius) const auto radius = props.radius; #else - const auto radius = unpack_mix_float(vertx.radius, interp.radius_t); + const auto radius = unpack_mix_float(vertx.radius, drawable.radius_t); #endif #if defined(HAS_UNIFORM_u_stroke_width) const auto stroke_width = props.stroke_width; #else - const auto stroke_width = unpack_mix_float(vertx.stroke_width, interp.stroke_width_t); + const auto stroke_width = unpack_mix_float(vertx.stroke_width, drawable.stroke_width_t); #endif // unencode the extrusion vector that we snuck into the a_pos vector @@ -165,31 +178,31 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .antialiasblur = antialiasblur, #if !defined(HAS_UNIFORM_u_color) - .color = half4(unpack_mix_color(vertx.color, interp.color_t)), + .color = half4(unpack_mix_color(vertx.color, drawable.color_t)), #endif #if !defined(HAS_UNIFORM_u_radius) .radius = radius, #endif #if !defined(HAS_UNIFORM_u_blur) - .blur = half(unpack_mix_float(vertx.blur, interp.blur_t)), + .blur = half(unpack_mix_float(vertx.blur, drawable.blur_t)), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), #endif #if !defined(HAS_UNIFORM_u_stroke_color) - .stroke_color = half4(unpack_mix_color(vertx.stroke_color, interp.stroke_color_t)), + .stroke_color = half4(unpack_mix_color(vertx.stroke_color, drawable.stroke_color_t)), #endif #if !defined(HAS_UNIFORM_u_stroke_width) .stroke_width = half(stroke_width), #endif #if !defined(HAS_UNIFORM_u_stroke_opacity) - .stroke_opacity = half(unpack_mix_float(vertx.stroke_opacity, interp.stroke_opacity_t)), + .stroke_opacity = half(unpack_mix_float(vertx.stroke_opacity, drawable.stroke_opacity_t)), #endif }; } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const CircleEvaluatedPropsUBO& props [[buffer(3)]]) { + device const CircleEvaluatedPropsUBO& props [[buffer(idCircleEvaluatedPropsUBO)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif diff --git a/include/mbgl/shaders/mtl/clipping_mask.hpp b/include/mbgl/shaders/mtl/clipping_mask.hpp index 6791cd46c8a9..580c1ad9efde 100644 --- a/include/mbgl/shaders/mtl/clipping_mask.hpp +++ b/include/mbgl/shaders/mtl/clipping_mask.hpp @@ -9,36 +9,49 @@ namespace shaders { struct alignas(16) ClipUBO { /* 0 */ std::array matrix; /* 64 */ std::uint32_t stencil_ref; - /* 68 */ std::uint32_t pad1, pad2, pad3; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; /* 80 */ }; static_assert(sizeof(ClipUBO) == 5 * 16); -template <> -struct ShaderSource { - static constexpr auto name = "ClippingMaskProgram"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; +#define CLIPPING_MASK_SHADER_PRELUDE \ + R"( - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( #include using namespace metal; +enum { + idClippingMaskUBO = idDrawableReservedVertexOnlyUBO, + clippingMaskUBOCount = drawableReservedUBOCount +}; + struct alignas(16) ClipUBO { /* 0 */ float4x4 matrix; /* 64 */ uint32_t stencil_ref; - /* 68 */ uint32_t pad1, pad2, pad3; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; /* 80 */ }; -static_assert(sizeof(ClipUBO) == 5 * 16, "unexpected padding"); +static_assert(sizeof(ClipUBO) == 5 * 16, "wrong size"); + +)" + +template <> +struct ShaderSource { + static constexpr auto name = "ClippingMaskProgram"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + static constexpr auto source = CLIPPING_MASK_SHADER_PRELUDE R"( struct VertexStage { - short2 position [[attribute(2)]]; + short2 position [[attribute(clippingMaskUBOCount + 0)]]; }; struct FragmentStage { @@ -51,7 +64,7 @@ struct FragmentResult { }; FragmentStage vertex vertexMain(VertexStage in [[stage_in]], - device const ClipUBO& clipUBO [[buffer(1)]]) { + device const ClipUBO& clipUBO [[buffer(idClippingMaskUBO)]]) { return { clipUBO.matrix * float4(float2(in.position.xy), 0, 1) }; } diff --git a/include/mbgl/shaders/mtl/collision.hpp b/include/mbgl/shaders/mtl/collision.hpp new file mode 100644 index 000000000000..ad62b6638af5 --- /dev/null +++ b/include/mbgl/shaders/mtl/collision.hpp @@ -0,0 +1,202 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace shaders { + +#define COLLISION_SHADER_COMMON \ + R"( + +enum { + idCollisionDrawableUBO = idDrawableReservedVertexOnlyUBO, + idCollisionTilePropsUBO = drawableReservedUBOCount, + collisionUBOCount +}; + +struct alignas(16) CollisionDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ +}; +static_assert(sizeof(CollisionDrawableUBO) == 4 * 16, "wrong size"); + +struct alignas(16) CollisionTilePropsUBO { + /* 0 */ float2 extrude_scale; + /* 8 */ float overscale_factor; + /* 12 */ float pad1; + /* 16 */ +}; +static_assert(sizeof(CollisionTilePropsUBO) == 16, "wrong size"); + +)" + +template <> +struct ShaderSource { + static constexpr auto name = "CollisionBoxShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = COLLISION_SHADER_COMMON R"( + +struct VertexStage { + short2 pos [[attribute(collisionUBOCount + 0)]]; + short2 anchor_pos [[attribute(collisionUBOCount + 1)]]; + short2 extrude [[attribute(collisionUBOCount + 2)]]; + ushort2 placed [[attribute(collisionUBOCount + 3)]]; + float2 shift [[attribute(collisionUBOCount + 4)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float placed; + float notUsed; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const CollisionDrawableUBO& drawable [[buffer(idCollisionDrawableUBO)]], + device const CollisionTilePropsUBO& tileProps [[buffer(idCollisionTilePropsUBO)]]) { + + float4 projectedPoint = drawable.matrix * float4(float2(vertx.anchor_pos), 0, 1); + float camera_to_anchor_distance = projectedPoint.w; + float collision_perspective_ratio = clamp( + 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), + 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles + 4.0); + + float4 position = drawable.matrix * float4(float2(vertx.pos), 0.0, 1.0); + position.xy += (float2(vertx.extrude) + vertx.shift) * tileProps.extrude_scale * position.w * collision_perspective_ratio; + + float placed = float(vertx.placed.x); + float notUsed = float(vertx.placed.y); + + return { + .position = position, + .placed = placed, + .notUsed = notUsed, + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]]) { + + float alpha = 0.5; + + // Red = collision, hide label + float4 color = float4(1.0, 0.0, 0.0, 1.0) * alpha; + + // Blue = no collision, label is showing + if (in.placed > 0.5) { + color = float4(0.0, 0.0, 1.0, 0.5) * alpha; + } + + if (in.notUsed > 0.5) { + // This box not used, fade it out + color *= 0.1; + } + + return half4(color); +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr auto name = "CollisionCircleShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = COLLISION_SHADER_COMMON R"( + +struct VertexStage { + short2 pos [[attribute(collisionUBOCount + 0)]]; + short2 anchor_pos [[attribute(collisionUBOCount + 1)]]; + short2 extrude [[attribute(collisionUBOCount + 2)]]; + ushort2 placed [[attribute(collisionUBOCount + 3)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float placed; + float notUsed; + float radius; + float2 extrude; + float2 extrude_scale; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const CollisionDrawableUBO& drawable [[buffer(idCollisionDrawableUBO)]], + device const CollisionTilePropsUBO& tileProps [[buffer(idCollisionTilePropsUBO)]]) { + + float4 projectedPoint = drawable.matrix * float4(float2(vertx.anchor_pos), 0, 1); + float camera_to_anchor_distance = projectedPoint.w; + float collision_perspective_ratio = clamp( + 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), + 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles + 4.0); + + float4 position = drawable.matrix * float4(float2(vertx.pos), 0.0, 1.0); + + float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur + position.xy += float2(vertx.extrude) * tileProps.extrude_scale * padding_factor * position.w * collision_perspective_ratio; + + float placed = float(vertx.placed.x); + float notUsed = float(vertx.placed.y); + float radius = abs(float(vertx.extrude.y)); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius + + float2 extrude = float2(vertx.extrude) * padding_factor; + float2 extrude_scale = tileProps.extrude_scale * paintParams.camera_to_center_distance * collision_perspective_ratio; + + return { + .position = position, + .placed = placed, + .notUsed = notUsed, + .radius = radius, + .extrude = extrude, + .extrude_scale = extrude_scale, + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const CollisionTilePropsUBO& tileProps [[buffer(idCollisionTilePropsUBO)]]) { + + float alpha = 0.5; + + // Red = collision, hide label + float4 color = float4(1.0, 0.0, 0.0, 1.0) * alpha; + + // Blue = no collision, label is showing + if (in.placed > 0.5) { + color = float4(0.0, 0.0, 1.0, 0.5) * alpha; + } + + if (in.notUsed > 0.5) { + // This box not used, fade it out + color *= 0.2; + } + + float extrude_scale_length = length(in.extrude_scale); + float extrude_length = length(in.extrude) * extrude_scale_length; + float stroke_width = 15.0 * extrude_scale_length / tileProps.overscale_factor; + float radius = in.radius * extrude_scale_length; + + float distance_to_edge = abs(extrude_length - radius); + float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge); + + return half4(opacity_t * color); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/collision_box.hpp b/include/mbgl/shaders/mtl/collision_box.hpp deleted file mode 100644 index 1ae672a0740b..000000000000 --- a/include/mbgl/shaders/mtl/collision_box.hpp +++ /dev/null @@ -1,93 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "CollisionBoxShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( - -struct VertexStage { - short2 pos [[attribute(2)]]; - short2 anchor_pos [[attribute(3)]]; - short2 extrude [[attribute(4)]]; - ushort2 placed [[attribute(5)]]; - float2 shift [[attribute(6)]]; -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - float placed; - float notUsed; -}; - -struct alignas(16) CollisionBoxUBO { - float4x4 matrix; - float2 extrude_scale; - float overscale_factor; - float pad1; -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const CollisionBoxUBO& drawable [[buffer(1)]]) { - - float4 projectedPoint = drawable.matrix * float4(float2(vertx.anchor_pos), 0, 1); - float camera_to_anchor_distance = projectedPoint.w; - float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles - 4.0); - - float4 position = drawable.matrix * float4(float2(vertx.pos), 0.0, 1.0); - position.xy += (float2(vertx.extrude) + vertx.shift) * drawable.extrude_scale * position.w * collision_perspective_ratio; - - float placed = float(vertx.placed.x); - float notUsed = float(vertx.placed.y); - - return { - .position = position, - .placed = placed, - .notUsed = notUsed, - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const CollisionBoxUBO& drawable [[buffer(1)]]) { - - float alpha = 0.5; - - // Red = collision, hide label - float4 color = float4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (in.placed > 0.5) { - color = float4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (in.notUsed > 0.5) { - // This box not used, fade it out - color *= 0.1; - } - - return half4(color); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/collision_circle.hpp b/include/mbgl/shaders/mtl/collision_circle.hpp deleted file mode 100644 index ecd009bc987c..000000000000 --- a/include/mbgl/shaders/mtl/collision_circle.hpp +++ /dev/null @@ -1,112 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "CollisionCircleShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( - -struct VertexStage { - short2 pos [[attribute(2)]]; - short2 anchor_pos [[attribute(3)]]; - short2 extrude [[attribute(4)]]; - ushort2 placed [[attribute(5)]]; -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - float placed; - float notUsed; - float radius; - float2 extrude; - float2 extrude_scale; -}; - -struct alignas(16) CollisionCircleUBO { - float4x4 matrix; - float2 extrude_scale; - float overscale_factor; - float pad1; -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const CollisionCircleUBO& drawable [[buffer(1)]]) { - - float4 projectedPoint = drawable.matrix * float4(float2(vertx.anchor_pos), 0, 1); - float camera_to_anchor_distance = projectedPoint.w; - float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles - 4.0); - - float4 position = drawable.matrix * float4(float2(vertx.pos), 0.0, 1.0); - - float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur - position.xy += float2(vertx.extrude) * drawable.extrude_scale * padding_factor * position.w * collision_perspective_ratio; - - float placed = float(vertx.placed.x); - float notUsed = float(vertx.placed.y); - float radius = abs(float(vertx.extrude.y)); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius - - float2 extrude = float2(vertx.extrude) * padding_factor; - float2 extrude_scale = drawable.extrude_scale * paintParams.camera_to_center_distance * collision_perspective_ratio; - - return { - .position = position, - .placed = placed, - .notUsed = notUsed, - .radius = radius, - .extrude = extrude, - .extrude_scale = extrude_scale, - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const CollisionCircleUBO& drawable [[buffer(1)]]) { - - float alpha = 0.5; - - // Red = collision, hide label - float4 color = float4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (in.placed > 0.5) { - color = float4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (in.notUsed > 0.5) { - // This box not used, fade it out - color *= 0.2; - } - - float extrude_scale_length = length(in.extrude_scale); - float extrude_length = length(in.extrude) * extrude_scale_length; - float stroke_width = 15.0 * extrude_scale_length / drawable.overscale_factor; - float radius = in.radius * extrude_scale_length; - - float distance_to_edge = abs(extrude_length - radius); - float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge); - - return half4(opacity_t * color); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/common.hpp b/include/mbgl/shaders/mtl/common.hpp index fc093b704b70..4e20dc9313c8 100644 --- a/include/mbgl/shaders/mtl/common.hpp +++ b/include/mbgl/shaders/mtl/common.hpp @@ -54,7 +54,12 @@ float4 unpack_mix_color(const float4 packedColors, const float t) { decode_color(float2(packedColors[2], packedColors[3])), t); } - +// Unpack pattern position +inline float2 get_pattern_pos(const float2 pixel_coord_upper, const float2 pixel_coord_lower, + const float2 pattern_size, const float tile_units_to_pixels, const float2 pos) { + const float2 offset = glMod(glMod(glMod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size); + return (tile_units_to_pixels * pos + offset) / pattern_size; +} template ForwardIt upper_bound(ForwardIt first, ForwardIt last, thread const T& value) @@ -196,49 +201,9 @@ struct alignas(16) GPUExpression { float4 getColor(size_t index) device const { return decode_color(stops.colors[index]); } }; -static_assert(sizeof(GPUExpression) == 32 + (4 + 8) * maxExprStops, "wrong alignment"); +static_assert(sizeof(GPUExpression) == 32 + (4 + 8) * maxExprStops, "wrong size"); static_assert(sizeof(GPUExpression) % 16 == 0, "wrong alignment"); - -enum { - idGlobalPaintParamsUBO, - globalUBOCount -}; - -enum { - idLineDrawableUBO = globalUBOCount, - idLineInterpolationUBO, - idLineTilePropertiesUBO, - idLineEvaluatedPropsUBO, - idLineExpressionUBO, - lineUBOCount -}; - - -enum class LineExpressionMask : uint32_t { - None = 0, - Color = 1 << 0, - Opacity = 1 << 1, - Blur = 1 << 2, - Width = 1 << 3, - GapWidth = 1 << 4, - FloorWidth = 1 << 5, - Offset = 1 << 6, -}; -bool operator&(LineExpressionMask a, LineExpressionMask b) { return (uint32_t)a & (uint32_t)b; } - -struct alignas(16) LineExpressionUBO { - GPUExpression color; - GPUExpression blur; - GPUExpression opacity; - GPUExpression gapwidth; - GPUExpression offset; - GPUExpression width; - GPUExpression floorwidth; -}; -static_assert(sizeof(LineExpressionUBO) % 16 == 0, "wrong alignment"); - - struct alignas(16) GlobalPaintParamsUBO { /* 0 */ float2 pattern_atlas_texsize; /* 8 */ float2 units_to_pixels; @@ -247,136 +212,23 @@ struct alignas(16) GlobalPaintParamsUBO { /* 28 */ float symbol_fade_change; /* 32 */ float aspect_ratio; /* 36 */ float pixel_ratio; - /* 40 */ float zoom; + /* 40 */ float map_zoom; /* 44 */ float pad1; /* 48 */ }; -static_assert(sizeof(GlobalPaintParamsUBO) == 3 * 16, "unexpected padding"); - -struct alignas(16) FillEvaluatedPropsUBO { - float4 color; - float4 outline_color; - float opacity; - float fade; - float from_scale; - float to_scale; -}; - -struct alignas(16) FillExtrusionDrawableUBO { - /* 0 */ float4x4 matrix; - /* 64 */ float2 texsize; - /* 72 */ float2 pixel_coord_upper; - /* 80 */ float2 pixel_coord_lower; - /* 88 */ float height_factor; - /* 92 */ float tile_ratio; - /* 96 */ -}; -static_assert(sizeof(FillExtrusionDrawableUBO) == 6 * 16, "unexpected padding"); +static_assert(sizeof(GlobalPaintParamsUBO) == 3 * 16, "wrong size"); -struct alignas(16) FillExtrusionPropsUBO { - /* 0 */ float4 color; - /* 16 */ float4 light_color_pad; - /* 32 */ float4 light_position_base; - /* 48 */ float height; - /* 52 */ float light_intensity; - /* 56 */ float vertical_gradient; - /* 60 */ float opacity; - /* 64 */ float fade; - /* 68 */ float from_scale; - /* 72 */ float to_scale; - /* 76 */ float pad2; - /* 80 */ -}; -static_assert(sizeof(FillExtrusionPropsUBO) == 5 * 16, "unexpected padding"); - -struct alignas(16) FillExtrusionTilePropsUBO { - /* 0 */ float4 pattern_from; - /* 16 */ float4 pattern_to; - /* 32 */ -}; -static_assert(sizeof(FillExtrusionTilePropsUBO) == 2 * 16, "unexpected padding"); - -struct alignas(16) FillExtrusionInterpolateUBO { - /* 0 */ float base_t; - /* 4 */ float height_t; - /* 8 */ float color_t; - /* 12 */ float pattern_from_t; - /* 16 */ float pattern_to_t; - /* 20 */ float pad1, pad2, pad3; - /* 32 */ -}; -static_assert(sizeof(FillExtrusionInterpolateUBO) == 2 * 16, "unexpected padding"); - -struct alignas(16) LineEvaluatedPropsUBO { - float4 color; - float blur; - float opacity; - float gapwidth; - float offset; - float width; - float floorwidth; - LineExpressionMask expressionMask; - float pad1; -}; - -struct alignas(16) SymbolDrawableUBO { - float4x4 matrix; - float4x4 label_plane_matrix; - float4x4 coord_matrix; - - float2 texsize; - float2 texsize_icon; - - float gamma_scale; - /*bool*/ int rotate_symbol; - float2 pad; -}; -static_assert(sizeof(SymbolDrawableUBO) == 14 * 16, "unexpected padding"); - -struct alignas(16) SymbolTilePropsUBO { - /*bool*/ int is_text; - /*bool*/ int is_halo; - /*bool*/ int pitch_with_map; - /*bool*/ int is_size_zoom_constant; - /*bool*/ int is_size_feature_constant; - float size_t; - float size; - float padding; -}; -static_assert(sizeof(SymbolTilePropsUBO) == 2 * 16, "unexpected padding"); - -struct alignas(16) SymbolInterpolateUBO { - float fill_color_t; - float halo_color_t; - float opacity_t; - float halo_width_t; - float halo_blur_t; - float pad1, pad2, pad3; +enum { + idGlobalPaintParamsUBO, + idGlobalUBOIndex, + globalUBOCount, }; -static_assert(sizeof(SymbolInterpolateUBO) == 32, "unexpected padding"); -struct alignas(16) SymbolEvaluatedPropsUBO { - float4 text_fill_color; - float4 text_halo_color; - float text_opacity; - float text_halo_width; - float text_halo_blur; - float pad1; - float4 icon_fill_color; - float4 icon_halo_color; - float icon_opacity; - float icon_halo_width; - float icon_halo_blur; - float pad2; +enum { + idDrawableReservedVertexOnlyUBO = globalUBOCount, + idDrawableReservedFragmentOnlyUBO, + drawableReservedUBOCount }; -static_assert(sizeof(SymbolEvaluatedPropsUBO) == 6 * 16, "unexpected padding"); - -// unpack pattern position -inline float2 get_pattern_pos(const float2 pixel_coord_upper, const float2 pixel_coord_lower, - const float2 pattern_size, const float tile_units_to_pixels, const float2 pos) { - const float2 offset = glMod(glMod(glMod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size); - return (tile_units_to_pixels * pos + offset) / pattern_size; -} )"; diff --git a/include/mbgl/shaders/mtl/custom_symbol_icon.hpp b/include/mbgl/shaders/mtl/custom_symbol_icon.hpp index eec04b8161dd..82581e74d370 100644 --- a/include/mbgl/shaders/mtl/custom_symbol_icon.hpp +++ b/include/mbgl/shaders/mtl/custom_symbol_icon.hpp @@ -1,43 +1,52 @@ #pragma once -#include -#include -#include #include +#include +#include namespace mbgl { namespace shaders { +#define CUSTOM_SYMBOL_ICON_SHADER_PRELUDE \ + R"( + +enum { + idCustomSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, + customSymbolUBOCount = drawableReservedUBOCount +}; + +struct alignas(16) CustomSymbolIconDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 extrude_scale; + /* 72 */ float2 anchor; + /* 80 */ float angle_degrees; + /* 84 */ uint32_t scale_with_map; + /* 88 */ uint32_t pitch_with_map; + /* 92 */ float camera_to_center_distance; + /* 96 */ float aspect_ratio; + /* 100 */ float pad1; + /* 104 */ float pad2; + /* 108 */ float pad3; + /* 112 */ +}; +static_assert(sizeof(CustomSymbolIconDrawableUBO) == 7 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "CustomSymbolIconShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( -struct alignas(16) CustomSymbolIconDrawableUBO { - float4x4 matrix; -}; - -struct alignas(16) CustomSymbolIconParametersUBO { - float2 extrude_scale; - float2 anchor; - float angle_degrees; - int scale_with_map; - int pitch_with_map; - float camera_to_center_distance; - float aspect_ratio; - float pad0, pad1, pad3; -}; - + static constexpr auto source = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( struct VertexStage { - float2 a_pos [[attribute(3)]]; - float2 a_tex [[attribute(4)]]; + float2 a_pos [[attribute(customSymbolUBOCount + 0)]]; + float2 a_tex [[attribute(customSymbolUBOCount + 1)]]; }; struct FragmentStage { @@ -59,29 +68,28 @@ float2 ellipseRotateVec2(float2 v, float angle, float radiusRatio /* A/B */) { } FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const CustomSymbolIconDrawableUBO& drawable [[buffer(1)]], - device const CustomSymbolIconParametersUBO& parameters [[buffer(2)]]) { + device const CustomSymbolIconDrawableUBO& drawable [[buffer(idCustomSymbolDrawableUBO)]]) { const float2 extrude = glMod(float2(vertx.a_pos), 2.0) * 2.0 - 1.0; - const float2 anchor = (parameters.anchor - float2(0.5, 0.5)) * 2.0; + const float2 anchor = (drawable.anchor - float2(0.5, 0.5)) * 2.0; const float2 center = floor(float2(vertx.a_pos) * 0.5); - const float angle = radians(-parameters.angle_degrees); + const float angle = radians(-drawable.angle_degrees); float2 corner = extrude - anchor; float4 position; - if (parameters.pitch_with_map) { - if (parameters.scale_with_map) { - corner *= parameters.extrude_scale; + if (drawable.pitch_with_map) { + if (drawable.scale_with_map) { + corner *= drawable.extrude_scale; } else { float4 projected_center = drawable.matrix * float4(center, 0, 1); - corner *= parameters.extrude_scale * (projected_center.w / parameters.camera_to_center_distance); + corner *= drawable.extrude_scale * (projected_center.w / drawable.camera_to_center_distance); } corner = center + rotateVec2(corner, angle); position = drawable.matrix * float4(corner, 0, 1); } else { position = drawable.matrix * float4(center, 0, 1); - const float factor = parameters.scale_with_map ? parameters.camera_to_center_distance : position.w; - position.xy += ellipseRotateVec2(corner * parameters.extrude_scale * factor, angle, parameters.aspect_ratio); + const float factor = drawable.scale_with_map ? drawable.camera_to_center_distance : position.w; + position.xy += ellipseRotateVec2(corner * drawable.extrude_scale * factor, angle, drawable.aspect_ratio); } return { diff --git a/include/mbgl/shaders/mtl/debug.hpp b/include/mbgl/shaders/mtl/debug.hpp index 162b480037ff..633c6a0a985d 100644 --- a/include/mbgl/shaders/mtl/debug.hpp +++ b/include/mbgl/shaders/mtl/debug.hpp @@ -2,27 +2,46 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define DEBUG_SHADER_PRELUDE \ + R"( + +enum { + idDebugUBO = drawableReservedUBOCount, + debugUBOCount +}; + +struct alignas(16) DebugUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float4 color; + /* 80 */ float overlay_scale; + /* 84 */ float pad1; + /* 88 */ float pad2; + /* 92 */ float pad3; + /* 96 */ +}; +static_assert(sizeof(DebugUBO) == 6 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "DebugShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = DEBUG_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(2)]]; + short2 pos [[attribute(debugUBOCount + 0)]]; }; struct FragmentStage { @@ -30,15 +49,8 @@ struct FragmentStage { float2 uv; }; -struct alignas(16) DebugUBO { - float4x4 matrix; - float4 color; - float overlay_scale; - float pad1, pad2, pad3; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const DebugUBO& debug [[buffer(1)]]) { + device const DebugUBO& debug [[buffer(idDebugUBO)]]) { const float4 position = debug.matrix * float4(float2(vertx.pos) * debug.overlay_scale, 0, 1); @@ -53,7 +65,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const DebugUBO& debug [[buffer(1)]], + device const DebugUBO& debug [[buffer(idDebugUBO)]], texture2d overlay [[texture(0)]], sampler overlay_sampler [[sampler(0)]]) { diff --git a/include/mbgl/shaders/mtl/fill.hpp b/include/mbgl/shaders/mtl/fill.hpp index 5cf49dc87530..b589a8dca4d3 100644 --- a/include/mbgl/shaders/mtl/fill.hpp +++ b/include/mbgl/shaders/mtl/fill.hpp @@ -2,33 +2,165 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define FILL_SHADER_COMMON \ + R"( + +enum { + idFillDrawableUBO = idDrawableReservedVertexOnlyUBO, + idFillTilePropsUBO = drawableReservedUBOCount, + idFillEvaluatedPropsUBO, + fillUBOCount +}; + +// +// Fill + +struct alignas(16) FillDrawableUBO { + /* 0 */ float4x4 matrix; + + // Interpolations + /* 64 */ float color_t; + /* 68 */ float opacity_t; + /* 72 */ float pad1; + /* 76 */ float pad2; + /* 80 */ +}; +static_assert(sizeof(FillDrawableUBO) == 5 * 16, "wrong size"); + +// +// Fill outline + +struct alignas(16) FillOutlineDrawableUBO { + /* 0 */ float4x4 matrix; + + // Interpolations + /* 64 */ float outline_color_t; + /* 68 */ float opacity_t; + /* 72 */ float pad1; + /* 76 */ float pad2; + /* 80 */ +}; +static_assert(sizeof(FillOutlineDrawableUBO) == 5 * 16, "wrong size"); + +// +// Fill pattern + +struct alignas(16) FillPatternDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 pixel_coord_upper; + /* 72 */ float2 pixel_coord_lower; + /* 80 */ float tile_ratio; + + // Interpolations + /* 84 */ float pattern_from_t; + /* 88 */ float pattern_to_t; + /* 92 */ float opacity_t; + /* 96 */ +}; +static_assert(sizeof(FillPatternDrawableUBO) == 6 * 16, "wrong size"); + +struct alignas(16) FillPatternTilePropsUBO { + /* 0 */ float4 pattern_from; + /* 16 */ float4 pattern_to; + /* 32 */ float2 texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ +}; +static_assert(sizeof(FillPatternTilePropsUBO) == 3 * 16, "wrong size"); + +// +// Fill pattern outline + +struct alignas(16) FillOutlinePatternDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 pixel_coord_upper; + /* 72 */ float2 pixel_coord_lower; + /* 80 */ float tile_ratio; + + // Interpolations + /* 84 */ float pattern_from_t; + /* 88 */ float pattern_to_t; + /* 92 */ float opacity_t; + /* 96 */ +}; +static_assert(sizeof(FillOutlinePatternDrawableUBO) == 6 * 16, "wrong size"); + +struct alignas(16) FillOutlinePatternTilePropsUBO { + /* 0 */ float4 pattern_from; + /* 16 */ float4 pattern_to; + /* 32 */ float2 texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ +}; +static_assert(sizeof(FillOutlinePatternTilePropsUBO) == 3 * 16, "wrong size"); + +// +// Fill outline triangulated + +struct alignas(16) FillOutlineTriangulatedDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float ratio; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; + /* 80 */ +}; +static_assert(sizeof(FillOutlineTriangulatedDrawableUBO) == 5 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) FillEvaluatedPropsUBO { + /* 0 */ float4 color; + /* 16 */ float4 outline_color; + /* 32 */ float opacity; + /* 36 */ float fade; + /* 40 */ float from_scale; + /* 44 */ float to_scale; + /* 48 */ +}; +static_assert(sizeof(FillEvaluatedPropsUBO) == 3 * 16, "wrong size"); + +union FillDrawableUnionUBO { + FillDrawableUBO fillDrawableUBO; + FillOutlineDrawableUBO fillOutlineDrawableUBO; + FillPatternDrawableUBO fillPatternDrawableUBO; + FillOutlinePatternDrawableUBO fillOutlinePatternDrawableUBO; + FillOutlineTriangulatedDrawableUBO fillOutlineTriangulatedDrawableUBO; +}; + +union FillTilePropsUnionUBO { + FillPatternTilePropsUBO fillPatternTilePropsUBO; + FillOutlinePatternTilePropsUBO fillOutlinePatternTilePropsUBO; +}; + +)" + template <> struct ShaderSource { static constexpr auto name = "FillShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_SHADER_COMMON R"( struct VertexStage { - short2 position [[attribute(5)]]; + short2 position [[attribute(fillUBOCount + 0)]]; #if !defined(HAS_UNIFORM_u_color) - float4 color [[attribute(6)]]; + float4 color [[attribute(fillUBOCount + 1)]]; #endif #if !defined(HAS_UNIFORM_u_opacity) - float2 opacity [[attribute(7)]]; + float2 opacity [[attribute(fillUBOCount + 2)]]; #endif }; @@ -43,32 +175,25 @@ struct FragmentStage { #endif }; -struct alignas(16) FillDrawableUBO { - float4x4 matrix; -}; +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillDrawableUnionUBO* drawableVector [[buffer(idFillDrawableUBO)]]) { -struct alignas(16) FillInterpolateUBO { - float color_t; - float opacity_t; -}; + device const FillDrawableUBO& drawable = drawableVector[uboIndex].fillDrawableUBO; -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const FillDrawableUBO& drawable [[buffer(1)]], - device const FillInterpolateUBO& interp [[buffer(3)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { return { .position = drawable.matrix * float4(float2(vertx.position), 0.0f, 1.0f), #if !defined(HAS_UNIFORM_u_color) - .color = half4(unpack_mix_color(vertx.color, interp.color_t)), + .color = half4(unpack_mix_color(vertx.color, drawable.color_t)), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), #endif }; } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif @@ -96,16 +221,15 @@ struct ShaderSource { static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_SHADER_COMMON R"( struct VertexStage { - short2 position [[attribute(5)]]; - float4 outline_color [[attribute(6)]]; - float2 opacity [[attribute(7)]]; + short2 position [[attribute(fillUBOCount + 0)]]; + float4 outline_color [[attribute(fillUBOCount + 1)]]; + float2 opacity [[attribute(fillUBOCount + 2)]]; }; struct FragmentStage { @@ -119,35 +243,28 @@ struct FragmentStage { #endif }; -struct alignas(16) FillOutlineDrawableUBO { - float4x4 matrix; -}; +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillDrawableUnionUBO* drawableVector [[buffer(idFillDrawableUBO)]]) { -struct alignas(16) FillOutlineInterpolateUBO { - float outline_color_t; - float opacity_t; -}; + device const FillOutlineDrawableUBO& drawable = drawableVector[uboIndex].fillOutlineDrawableUBO; -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const FillOutlineDrawableUBO& drawable [[buffer(1)]], - device const FillOutlineInterpolateUBO& interp [[buffer(3)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { const float4 position = drawable.matrix * float4(float2(vertx.position), 0.0f, 1.0f); return { .position = position, .pos = (position.xy / position.w + 1.0) / 2.0 * paintParams.world_size, #if !defined(HAS_UNIFORM_u_outline_color) - .outline_color = half4(unpack_mix_color(vertx.outline_color, interp.outline_color_t)), + .outline_color = half4(unpack_mix_color(vertx.outline_color, drawable.outline_color_t)), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), #endif }; } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif @@ -181,23 +298,22 @@ struct ShaderSource { static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_SHADER_COMMON R"( struct VertexStage { - short2 position [[attribute(5)]]; + short2 position [[attribute(fillUBOCount + 0)]]; #if !defined(HAS_UNIFORM_u_pattern_from) - ushort4 pattern_from [[attribute(6)]]; + ushort4 pattern_from [[attribute(fillUBOCount + 1)]]; #endif #if !defined(HAS_UNIFORM_u_pattern_to) - ushort4 pattern_to [[attribute(7)]]; + ushort4 pattern_to [[attribute(fillUBOCount + 2)]]; #endif #if !defined(HAS_UNIFORM_u_opacity) - float2 opacity [[attribute(8)]]; + float2 opacity [[attribute(fillUBOCount + 3)]]; #endif }; @@ -217,32 +333,16 @@ struct FragmentStage { #endif }; -struct alignas(16) FillPatternDrawableUBO { - float4x4 matrix; - float2 pixel_coord_upper; - float2 pixel_coord_lower; - float2 texsize; - float tile_ratio; - float pad; -}; +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillDrawableUnionUBO* drawableVector [[buffer(idFillDrawableUBO)]], + device const FillTilePropsUnionUBO* tilePropsVector [[buffer(idFillTilePropsUBO)]], + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]]) { -struct alignas(16) FillPatternTilePropsUBO { - float4 pattern_from; - float4 pattern_to; -}; + device const FillPatternDrawableUBO& drawable = drawableVector[uboIndex].fillPatternDrawableUBO; + device const FillPatternTilePropsUBO& tileProps = tilePropsVector[uboIndex].fillPatternTilePropsUBO; -struct alignas(16) FillPatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const FillPatternDrawableUBO& drawable [[buffer(1)]], - device const FillPatternTilePropsUBO& tileProps [[buffer(2)]], - device const FillPatternInterpolateUBO& interp [[buffer(3)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { #if defined(HAS_UNIFORM_u_pattern_from) const auto pattern_from = float4(tileProps.pattern_from); #else @@ -280,21 +380,23 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .pattern_to = half4(pattern_to), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), #endif }; } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const FillPatternDrawableUBO& drawable [[buffer(1)]], - device const FillPatternTilePropsUBO& tileProps [[buffer(2)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillTilePropsUnionUBO* tilePropsVector [[buffer(idFillTilePropsUBO)]], + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]], texture2d image0 [[texture(0)]], sampler image0_sampler [[sampler(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif + device const FillPatternTilePropsUBO& tileProps = tilePropsVector[uboIndex].fillPatternTilePropsUBO; + #if defined(HAS_UNIFORM_u_pattern_from) const auto pattern_from = float4(tileProps.pattern_from); #else @@ -319,11 +421,11 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], const float2 pattern_br_b = pattern_to.zw; const float2 imagecoord = glMod(in.v_pos_a, 1.0); - const float2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); + const float2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); const float4 color1 = image0.sample(image0_sampler, pos); const float2 imagecoord_b = glMod(in.v_pos_b, 1.0); - const float2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); + const float2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); const float4 color2 = image0.sample(image0_sampler, pos2); return half4(mix(color1, color2, props.fade) * opacity); @@ -337,24 +439,23 @@ struct ShaderSource uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_SHADER_COMMON R"( struct VertexStage { - short2 position [[attribute(5)]]; + short2 position [[attribute(fillUBOCount + 0)]]; #if !defined(HAS_UNIFORM_u_pattern_from) - ushort4 pattern_from [[attribute(6)]]; + ushort4 pattern_from [[attribute(fillUBOCount + 1)]]; #endif #if !defined(HAS_UNIFORM_u_pattern_to) - ushort4 pattern_to [[attribute(7)]]; + ushort4 pattern_to [[attribute(fillUBOCount + 2)]]; #endif #if !defined(HAS_UNIFORM_u_opacity) - float2 opacity [[attribute(8)]]; + float2 opacity [[attribute(fillUBOCount + 3)]]; #endif }; @@ -375,32 +476,16 @@ struct FragmentStage { #endif }; -struct alignas(16) FillOutlinePatternDrawableUBO { - float4x4 matrix; - float2 pixel_coord_upper; - float2 pixel_coord_lower; - float2 texsize; - float tile_ratio; - float pad; -}; - -struct alignas(16) FillOutlinePatternTilePropsUBO { - float4 pattern_from; - float4 pattern_to; -}; +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillDrawableUnionUBO* drawableVector [[buffer(idFillDrawableUBO)]], + device const FillTilePropsUnionUBO* tilePropsVector [[buffer(idFillTilePropsUBO)]], + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]]) { -struct alignas(16) FillOutlinePatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; -}; + device const FillOutlinePatternDrawableUBO& drawable = drawableVector[uboIndex].fillOutlinePatternDrawableUBO; + device const FillOutlinePatternTilePropsUBO& tileProps = tilePropsVector[uboIndex].fillOutlinePatternTilePropsUBO; -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const FillOutlinePatternDrawableUBO& drawable [[buffer(1)]], - device const FillOutlinePatternTilePropsUBO& tileProps [[buffer(2)]], - device const FillOutlinePatternInterpolateUBO& interp [[buffer(3)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { #if defined(HAS_UNIFORM_u_pattern_from) const auto pattern_from = tileProps.pattern_from; #else @@ -414,7 +499,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], #endif #if !defined(HAS_UNIFORM_u_opacity) - const auto opacity = unpack_mix_float(vertx.opacity, interp.opacity_t); + const auto opacity = unpack_mix_float(vertx.opacity, drawable.opacity_t); #endif const float2 pattern_tl_a = pattern_from.xy; @@ -451,15 +536,17 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const FillOutlinePatternDrawableUBO& drawable [[buffer(1)]], - device const FillOutlinePatternTilePropsUBO& tileProps [[buffer(2)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillTilePropsUnionUBO* tilePropsVector [[buffer(idFillTilePropsUBO)]], + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]], texture2d image0 [[texture(0)]], sampler image0_sampler [[sampler(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif + device const FillOutlinePatternTilePropsUBO& tileProps = tilePropsVector[uboIndex].fillOutlinePatternTilePropsUBO; + #if defined(HAS_UNIFORM_u_pattern_from) const auto pattern_from = float4(tileProps.pattern_from); #else @@ -484,11 +571,11 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], const float2 pattern_br_b = pattern_to.zw; const float2 imagecoord = glMod(in.v_pos_a, 1.0); - const float2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); + const float2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); const float4 color1 = image0.sample(image0_sampler, pos); const float2 imagecoord_b = glMod(in.v_pos_b, 1.0); - const float2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); + const float2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); const float4 color2 = image0.sample(image0_sampler, pos2); // TODO: Should triangate the lines into triangles to support thick line and edge antialiased. @@ -506,15 +593,14 @@ struct ShaderSource uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_SHADER_COMMON R"( struct VertexStage { - short2 pos_normal [[attribute(5)]]; - uchar4 data [[attribute(6)]]; + short2 pos_normal [[attribute(fillUBOCount + 0)]]; + uchar4 data [[attribute(fillUBOCount + 1)]]; }; struct FragmentStage { @@ -524,16 +610,12 @@ struct FragmentStage { half gamma_scale; }; -struct alignas(16) FillOutlineTriangulatedDrawableUBO { - float4x4 matrix; - float ratio; - float pad1, pad2, pad3; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const FillOutlineTriangulatedDrawableUBO& drawable [[buffer(1)]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillDrawableUnionUBO* drawableVector [[buffer(idFillDrawableUBO)]]) { + + device const FillOutlineTriangulatedDrawableUBO& drawable = drawableVector[uboIndex].fillOutlineTriangulatedDrawableUBO; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. @@ -571,7 +653,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const FillEvaluatedPropsUBO& props [[buffer(4)]]) { + device const FillEvaluatedPropsUBO& props [[buffer(idFillEvaluatedPropsUBO)]]) { // Calculate the distance of the pixel from the line in pixels. const float dist = length(in.normal) * in.width2; diff --git a/include/mbgl/shaders/mtl/fill_extrusion.hpp b/include/mbgl/shaders/mtl/fill_extrusion.hpp index 73440ccbc744..4a5e05663f31 100644 --- a/include/mbgl/shaders/mtl/fill_extrusion.hpp +++ b/include/mbgl/shaders/mtl/fill_extrusion.hpp @@ -2,36 +2,91 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define FILL_EXTRUSION_SHADER_COMMON \ + R"( + +enum { + idFillExtrusionDrawableUBO = idDrawableReservedVertexOnlyUBO, + idFillExtrusionTilePropsUBO = drawableReservedUBOCount, + idFillExtrusionPropsUBO, + fillExtrusionUBOCount +}; + +struct alignas(16) FillExtrusionDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 pixel_coord_upper; + /* 72 */ float2 pixel_coord_lower; + /* 80 */ float height_factor; + /* 84 */ float tile_ratio; + + // Interpolations + /* 88 */ float base_t; + /* 92 */ float height_t; + /* 96 */ float color_t; + /* 100 */ float pattern_from_t; + /* 104 */ float pattern_to_t; + /* 108 */ float pad1; + /* 112 */ +}; +static_assert(sizeof(FillExtrusionDrawableUBO) == 7 * 16, "wrong size"); + +struct alignas(16) FillExtrusionTilePropsUBO { + /* 0 */ float4 pattern_from; + /* 16 */ float4 pattern_to; + /* 32 */ float2 texsize; + /* 40 */ float pad1; + /* 44 */ float pad2; + /* 48 */ +}; +static_assert(sizeof(FillExtrusionTilePropsUBO) == 3 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) FillExtrusionPropsUBO { + /* 0 */ float4 color; + /* 16 */ float4 light_color_pad; + /* 32 */ float4 light_position_base; + /* 48 */ float height; + /* 52 */ float light_intensity; + /* 56 */ float vertical_gradient; + /* 60 */ float opacity; + /* 64 */ float fade; + /* 68 */ float from_scale; + /* 72 */ float to_scale; + /* 76 */ float pad2; + /* 80 */ +}; +static_assert(sizeof(FillExtrusionPropsUBO) == 5 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "FillExtrusionShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = FILL_EXTRUSION_SHADER_COMMON R"( struct VertexStage { - short2 pos [[attribute(5)]]; - short4 normal_ed [[attribute(6)]]; + short2 pos [[attribute(fillExtrusionUBOCount + 0)]]; + short4 normal_ed [[attribute(fillExtrusionUBOCount + 1)]]; #if !defined(HAS_UNIFORM_u_color) - float4 color [[attribute(7)]]; + float4 color [[attribute(fillExtrusionUBOCount + 2)]]; #endif #if !defined(HAS_UNIFORM_u_base) - float base [[attribute(8)]]; + float base [[attribute(fillExtrusionUBOCount + 3)]]; #endif #if !defined(HAS_UNIFORM_u_height) - float height [[attribute(9)]]; + float height [[attribute(fillExtrusionUBOCount + 4)]]; #endif }; @@ -46,19 +101,21 @@ struct FragmentOutput { }; FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const FillExtrusionDrawableUBO& drawable [[buffer(1)]], - device const FillExtrusionInterpolateUBO& interp [[buffer(3)]], - device const FillExtrusionPropsUBO& props [[buffer(4)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillExtrusionDrawableUBO* drawableVector [[buffer(idFillExtrusionDrawableUBO)]], + device const FillExtrusionPropsUBO& props [[buffer(idFillExtrusionPropsUBO)]]) { + + device const FillExtrusionDrawableUBO& drawable = drawableVector[uboIndex]; #if defined(HAS_UNIFORM_u_base) const auto base = props.light_position_base.w; #else - const auto base = max(unpack_mix_float(vertx.base, interp.base_t), 0.0); + const auto base = max(unpack_mix_float(vertx.base, drawable.base_t), 0.0); #endif #if defined(HAS_UNIFORM_u_height) const auto height = props.height; #else - const auto height = max(unpack_mix_float(vertx.height, interp.height_t), 0.0); + const auto height = max(unpack_mix_float(vertx.height, drawable.height_t), 0.0); #endif const float3 normal = float3(vertx.normal_ed.xyz); @@ -76,7 +133,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], #if defined(HAS_UNIFORM_u_color) auto color = props.color; #else - auto color = unpack_mix_color(vertx.color, interp.color_t); + auto color = unpack_mix_color(vertx.color, drawable.color_t); #endif // Relative luminance (how dark/bright is the surface color?) @@ -126,5 +183,189 @@ fragment FragmentOutput fragmentMain(FragmentStage in [[stage_in]]) { )"; }; +template <> +struct ShaderSource { + static constexpr auto name = "FillExtrusionPatternShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = FILL_EXTRUSION_SHADER_COMMON R"( +struct VertexStage { + short2 pos [[attribute(fillExtrusionUBOCount + 0)]]; + short4 normal_ed [[attribute(fillExtrusionUBOCount + 1)]]; + +#if !defined(HAS_UNIFORM_u_base) + float base [[attribute(fillExtrusionUBOCount + 2)]]; +#endif +#if !defined(HAS_UNIFORM_u_height) + float height [[attribute(fillExtrusionUBOCount + 3)]]; +#endif +#if !defined(HAS_UNIFORM_u_pattern_from) + ushort4 pattern_from [[attribute(fillExtrusionUBOCount + 4)]]; +#endif +#if !defined(HAS_UNIFORM_u_pattern_to) + ushort4 pattern_to [[attribute(fillExtrusionUBOCount + 5)]]; +#endif +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float4 lighting; + float2 pos_a; + float2 pos_b; + +#if !defined(HAS_UNIFORM_u_pattern_from) + half4 pattern_from; +#endif +#if !defined(HAS_UNIFORM_u_pattern_to) + half4 pattern_to; +#endif +}; + +struct FragmentOutput { + half4 color [[color(0)]]; + //float depth [[depth(less)]]; // Write depth value if it's less than what's already there +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillExtrusionDrawableUBO* drawableVector [[buffer(idFillExtrusionDrawableUBO)]], + device const FillExtrusionTilePropsUBO* tilePropsVector [[buffer(idFillExtrusionTilePropsUBO)]], + device const FillExtrusionPropsUBO& props [[buffer(idFillExtrusionPropsUBO)]]) { + + device const FillExtrusionDrawableUBO& drawable = drawableVector[uboIndex]; + device const FillExtrusionTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + +#if defined(HAS_UNIFORM_u_base) + const auto base = props.light_position_base.w; +#else + const auto base = max(unpack_mix_float(vertx.base, drawable.base_t), 0.0); +#endif +#if defined(HAS_UNIFORM_u_height) + const auto height = props.height; +#else + const auto height = max(unpack_mix_float(vertx.height, drawable.height_t), 0.0); +#endif + + const float3 normal = float3(vertx.normal_ed.xyz); + const float edgedistance = vertx.normal_ed.w; + const float t = glMod(normal.x, 2.0); + const float z = (t != 0.0) ? height : base; // TODO: This would come out wrong on GL for negative values, check it... + const float4 position = drawable.matrix * float4(float2(vertx.pos), z, 1); + +#if defined(OVERDRAW_INSPECTOR) + return { + .position = position, + .lighting = float4(1.0), + .pattern_from = float4(1.0), + .pattern_to = float4(1.0), + .pos_a = float2(1.0), + .pos_b = float2(1.0), + }; +#endif + +#if defined(HAS_UNIFORM_u_pattern_from) + const auto pattern_from = tileProps.pattern_from; +#else + const auto pattern_from = float4(vertx.pattern_from); +#endif +#if defined(HAS_UNIFORM_u_pattern_to) + const auto pattern_to = tileProps.pattern_to; +#else + const auto pattern_to = float4(vertx.pattern_to); +#endif + + const float2 pattern_tl_a = pattern_from.xy; + const float2 pattern_br_a = pattern_from.zw; + const float2 pattern_tl_b = pattern_to.xy; + const float2 pattern_br_b = pattern_to.zw; + + const float pixelRatio = paintParams.pixel_ratio; + const float tileZoomRatio = drawable.tile_ratio; + const float fromScale = props.from_scale; + const float toScale = props.to_scale; + + const float2 display_size_a = float2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); + const float2 display_size_b = float2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); + + const float2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 + ? float2(vertx.pos) // extrusion top + : float2(edgedistance, z * drawable.height_factor); // extrusion side + + float4 lighting = float4(0.0, 0.0, 0.0, 1.0); + float directional = clamp(dot(normal / 16383.0, props.light_position_base.xyz), 0.0, 1.0); + directional = mix((1.0 - props.light_intensity), max((0.5 + props.light_intensity), 1.0), directional); + + if (normal.y != 0.0) { + // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, + // and otherwise calculates the gradient based on base + height + directional *= ( + (1.0 - props.vertical_gradient) + + (props.vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - props.light_intensity), 1.0))); + } + + lighting.rgb += clamp(directional * props.light_color_pad.rgb, mix(float3(0.0), float3(0.3), 1.0 - props.light_color_pad.rgb), float3(1.0)); + lighting *= props.opacity; + + return { + .position = position, + .lighting = lighting, +#if !defined(HAS_UNIFORM_u_pattern_from) + .pattern_from = half4(pattern_from), +#endif +#if !defined(HAS_UNIFORM_u_pattern_from) + .pattern_to = half4(pattern_to), +#endif + .pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, pos), + .pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, toScale * display_size_b, tileZoomRatio, pos), + }; +} + +fragment FragmentOutput fragmentMain(FragmentStage in [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const FillExtrusionTilePropsUBO* tilePropsVector [[buffer(idFillExtrusionTilePropsUBO)]], + device const FillExtrusionPropsUBO& props [[buffer(idFillExtrusionPropsUBO)]], + texture2d image0 [[texture(0)]], + sampler image0_sampler [[sampler(0)]]) { +#if defined(OVERDRAW_INSPECTOR) + return {half4(1.0)/*, in.position.z*/}; +#endif + + device const FillExtrusionTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + +#if defined(HAS_UNIFORM_u_pattern_from) + const auto pattern_from = float4(tileProps.pattern_from); +#else + const auto pattern_from = float4(in.pattern_from); +#endif +#if defined(HAS_UNIFORM_u_pattern_to) + const auto pattern_to = float4(tileProps.pattern_to); +#else + const auto pattern_to = float4(in.pattern_to); +#endif + + const float2 pattern_tl_a = pattern_from.xy; + const float2 pattern_br_a = pattern_from.zw; + const float2 pattern_tl_b = pattern_to.xy; + const float2 pattern_br_b = pattern_to.zw; + + const float2 imagecoord = glMod(in.pos_a, 1.0); + const float2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); + const float4 color1 = image0.sample(image0_sampler, pos); + + const float2 imagecoord_b = glMod(in.pos_b, 1.0); + const float2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); + const float4 color2 = image0.sample(image0_sampler, pos2); + + return {half4(mix(color1, color2, props.fade) * in.lighting)/*, in.position.z*/}; +} +)"; +}; + } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp b/include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp deleted file mode 100644 index 1f3de407bec8..000000000000 --- a/include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp +++ /dev/null @@ -1,192 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "FillExtrusionPatternShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( -struct VertexStage { - short2 pos [[attribute(5)]]; - short4 normal_ed [[attribute(6)]]; - -#if !defined(HAS_UNIFORM_u_base) - float base [[attribute(7)]]; -#endif -#if !defined(HAS_UNIFORM_u_height) - float height [[attribute(8)]]; -#endif -#if !defined(HAS_UNIFORM_u_pattern_from) - ushort4 pattern_from [[attribute(9)]]; -#endif -#if !defined(HAS_UNIFORM_u_pattern_to) - ushort4 pattern_to [[attribute(10)]]; -#endif -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - float4 lighting; - float2 pos_a; - float2 pos_b; - -#if !defined(HAS_UNIFORM_u_pattern_from) - half4 pattern_from; -#endif -#if !defined(HAS_UNIFORM_u_pattern_to) - half4 pattern_to; -#endif -}; - -struct FragmentOutput { - half4 color [[color(0)]]; - //float depth [[depth(less)]]; // Write depth value if it's less than what's already there -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const FillExtrusionDrawableUBO& drawable [[buffer(1)]], - device const FillExtrusionTilePropsUBO& tileProps [[buffer(2)]], - device const FillExtrusionInterpolateUBO& interp [[buffer(3)]], - device const FillExtrusionPropsUBO& props [[buffer(4)]]) { - -#if defined(HAS_UNIFORM_u_base) - const auto base = props.light_position_base.w; -#else - const auto base = max(unpack_mix_float(vertx.base, interp.base_t), 0.0); -#endif -#if defined(HAS_UNIFORM_u_height) - const auto height = props.height; -#else - const auto height = max(unpack_mix_float(vertx.height, interp.height_t), 0.0); -#endif - - const float3 normal = float3(vertx.normal_ed.xyz); - const float edgedistance = vertx.normal_ed.w; - const float t = glMod(normal.x, 2.0); - const float z = (t != 0.0) ? height : base; // TODO: This would come out wrong on GL for negative values, check it... - const float4 position = drawable.matrix * float4(float2(vertx.pos), z, 1); - -#if defined(OVERDRAW_INSPECTOR) - return { - .position = position, - .lighting = float4(1.0), - .pattern_from = float4(1.0), - .pattern_to = float4(1.0), - .pos_a = float2(1.0), - .pos_b = float2(1.0), - }; -#endif - -#if defined(HAS_UNIFORM_u_pattern_from) - const auto pattern_from = tileProps.pattern_from; -#else - const auto pattern_from = float4(vertx.pattern_from); -#endif -#if defined(HAS_UNIFORM_u_pattern_to) - const auto pattern_to = tileProps.pattern_to; -#else - const auto pattern_to = float4(vertx.pattern_to); -#endif - - const float2 pattern_tl_a = pattern_from.xy; - const float2 pattern_br_a = pattern_from.zw; - const float2 pattern_tl_b = pattern_to.xy; - const float2 pattern_br_b = pattern_to.zw; - - const float pixelRatio = paintParams.pixel_ratio; - const float tileZoomRatio = drawable.tile_ratio; - const float fromScale = props.from_scale; - const float toScale = props.to_scale; - - const float2 display_size_a = float2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - const float2 display_size_b = float2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - const float2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 - ? float2(vertx.pos) // extrusion top - : float2(edgedistance, z * drawable.height_factor); // extrusion side - - float4 lighting = float4(0.0, 0.0, 0.0, 1.0); - float directional = clamp(dot(normal / 16383.0, props.light_position_base.xyz), 0.0, 1.0); - directional = mix((1.0 - props.light_intensity), max((0.5 + props.light_intensity), 1.0), directional); - - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - props.vertical_gradient) + - (props.vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - props.light_intensity), 1.0))); - } - - lighting.rgb += clamp(directional * props.light_color_pad.rgb, mix(float3(0.0), float3(0.3), 1.0 - props.light_color_pad.rgb), float3(1.0)); - lighting *= props.opacity; - - return { - .position = position, - .lighting = lighting, -#if !defined(HAS_UNIFORM_u_pattern_from) - .pattern_from = half4(pattern_from), -#endif -#if !defined(HAS_UNIFORM_u_pattern_from) - .pattern_to = half4(pattern_to), -#endif - .pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, pos), - .pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, toScale * display_size_b, tileZoomRatio, pos), - }; -} - -fragment FragmentOutput fragmentMain(FragmentStage in [[stage_in]], - device const FillExtrusionDrawableUBO& drawable [[buffer(1)]], - device const FillExtrusionTilePropsUBO& tileProps [[buffer(2)]], - device const FillExtrusionPropsUBO& props [[buffer(4)]], - texture2d image0 [[texture(0)]], - sampler image0_sampler [[sampler(0)]]) { -#if defined(OVERDRAW_INSPECTOR) - return {half4(1.0)/*, in.position.z*/}; -#endif - -#if defined(HAS_UNIFORM_u_pattern_from) - const auto pattern_from = float4(tileProps.pattern_from); -#else - const auto pattern_from = float4(in.pattern_from); -#endif -#if defined(HAS_UNIFORM_u_pattern_to) - const auto pattern_to = float4(tileProps.pattern_to); -#else - const auto pattern_to = float4(in.pattern_to); -#endif - - const float2 pattern_tl_a = pattern_from.xy; - const float2 pattern_br_a = pattern_from.zw; - const float2 pattern_tl_b = pattern_to.xy; - const float2 pattern_br_b = pattern_to.zw; - - const float2 imagecoord = glMod(in.pos_a, 1.0); - const float2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); - const float4 color1 = image0.sample(image0_sampler, pos); - - const float2 imagecoord_b = glMod(in.pos_b, 1.0); - const float2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); - const float4 color2 = image0.sample(image0_sampler, pos2); - - return {half4(mix(color1, color2, props.fade) * in.lighting)/*, in.position.z*/}; -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/heatmap.hpp b/include/mbgl/shaders/mtl/heatmap.hpp index e04ae35d1265..81e4c25e4ba1 100644 --- a/include/mbgl/shaders/mtl/heatmap.hpp +++ b/include/mbgl/shaders/mtl/heatmap.hpp @@ -2,33 +2,64 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define HEATMAP_SHADER_PRELUDE \ + R"( + +enum { + idHeatmapDrawableUBO = idDrawableReservedVertexOnlyUBO, + idHeatmapEvaluatedPropsUBO = drawableReservedUBOCount, + heatmapUBOCount +}; + +struct alignas(16) HeatmapDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float extrude_scale; + + // Interpolations + /* 68 */ float weight_t; + /* 72 */ float radius_t; + /* 76 */ float pad1; + /* 80 */ +}; +static_assert(sizeof(HeatmapDrawableUBO) == 5 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) HeatmapEvaluatedPropsUBO { + /* 0 */ float weight; + /* 4 */ float radius; + /* 8 */ float intensity; + /* 12 */ float padding; + /* 16 */ +}; +static_assert(sizeof(HeatmapEvaluatedPropsUBO) == 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "HeatmapShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = HEATMAP_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(4)]]; + short2 pos [[attribute(heatmapUBOCount + 0)]]; #if !defined(HAS_UNIFORM_u_weight) - float2 weight [[attribute(5)]]; + float2 weight [[attribute(heatmapUBOCount + 1)]]; #endif #if !defined(HAS_UNIFORM_u_radius) - float2 radius [[attribute(6)]]; + float2 radius [[attribute(heatmapUBOCount + 2)]]; #endif }; @@ -38,26 +69,6 @@ struct FragmentStage { float2 extrude; }; -struct alignas(16) HeatmapDrawableUBO { - float4x4 matrix; - float extrude_scale; - float pad1; - float2 pad2; -}; - -struct alignas(16) HeatmapEvaluatedPropsUBO { - float weight; - float radius; - float intensity; - float pad1; -}; - -struct alignas(16) HeatmapInterpolateUBO { - float weight_t; - float radius_t; - float2 pad1; -}; - // Effective "0" in the kernel density texture to adjust the kernel size to; // this empirically chosen number minimizes artifacts on overlapping kernels // for typical heatmap cases (assuming clustered source) @@ -67,19 +78,21 @@ constant const float ZERO = 1.0 / 255.0 / 16.0; #define GAUSS_COEF 0.3989422804014327 FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const HeatmapDrawableUBO& drawable [[buffer(1)]], - device const HeatmapInterpolateUBO& interp [[buffer(2)]], - device const HeatmapEvaluatedPropsUBO& props [[buffer(3)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const HeatmapDrawableUBO* drawableVector [[buffer(idHeatmapDrawableUBO)]], + device const HeatmapEvaluatedPropsUBO& props [[buffer(idHeatmapEvaluatedPropsUBO)]]) { + + device const HeatmapDrawableUBO& drawable = drawableVector[uboIndex]; #if defined(HAS_UNIFORM_u_weight) const auto weight = props.weight; #else - const auto weight = unpack_mix_float(vertx.weight, interp.weight_t); + const auto weight = unpack_mix_float(vertx.weight, drawable.weight_t); #endif #if defined(HAS_UNIFORM_u_radius) const auto radius = props.radius; #else - const auto radius = unpack_mix_float(vertx.radius, interp.radius_t); + const auto radius = unpack_mix_float(vertx.radius, drawable.radius_t); #endif // unencode the extrusion vector that we snuck into the a_pos vector @@ -117,7 +130,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const HeatmapEvaluatedPropsUBO& props [[buffer(3)]]) { + device const HeatmapEvaluatedPropsUBO& props [[buffer(idHeatmapEvaluatedPropsUBO)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif diff --git a/include/mbgl/shaders/mtl/heatmap_texture.hpp b/include/mbgl/shaders/mtl/heatmap_texture.hpp index 0406676c552a..e32b2fdb53db 100644 --- a/include/mbgl/shaders/mtl/heatmap_texture.hpp +++ b/include/mbgl/shaders/mtl/heatmap_texture.hpp @@ -2,27 +2,45 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define HEATMAP_TEXTURE_SHADER_PRELUDE \ + R"( + +enum { + idHeatmapTexturePropsUBO = drawableReservedUBOCount, + heatmapTextureUBOCount +}; + +struct alignas(16) HeatmapTexturePropsUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float opacity; + /* 68 */ float pad1; + /* 72 */ float pad2; + /* 76 */ float pad3; + /* 80 */ +}; +static_assert(sizeof(HeatmapTexturePropsUBO) == 5 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "HeatmapTextureShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = HEATMAP_TEXTURE_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(2)]]; + short2 pos [[attribute(heatmapTextureUBOCount + 0)]]; }; struct FragmentStage { @@ -30,15 +48,9 @@ struct FragmentStage { float2 pos; }; -struct alignas(16) HeatmapTexturePropsUBO { - float4x4 matrix; - float opacity; - float pad1, pad2, pad3; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const HeatmapTexturePropsUBO& props [[buffer(1)]]) { + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const HeatmapTexturePropsUBO& props [[buffer(idHeatmapTexturePropsUBO)]]) { const float2 pos = float2(vertx.pos); const float4 position = props.matrix * float4(pos * paintParams.world_size, 0, 1); @@ -50,7 +62,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const HeatmapTexturePropsUBO& props [[buffer(1)]], + device const HeatmapTexturePropsUBO& props [[buffer(idHeatmapTexturePropsUBO)]], texture2d image [[texture(0)]], texture2d color_ramp [[texture(1)]], sampler image_sampler [[sampler(0)]], diff --git a/include/mbgl/shaders/mtl/hillshade.hpp b/include/mbgl/shaders/mtl/hillshade.hpp index 612954d94122..39e5c74135e9 100644 --- a/include/mbgl/shaders/mtl/hillshade.hpp +++ b/include/mbgl/shaders/mtl/hillshade.hpp @@ -2,28 +2,60 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define HILLSHADE_SHADER_PRELUDE \ + R"( + +enum { + idHillshadeDrawableUBO = idDrawableReservedVertexOnlyUBO, + idHillshadeTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + idHillshadeEvaluatedPropsUBO = drawableReservedUBOCount, + hillshadeUBOCount +}; + +struct alignas(16) HillshadeDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ +}; +static_assert(sizeof(HillshadeDrawableUBO) == 4 * 16, "wrong size"); + +struct alignas(16) HillshadeTilePropsUBO { + /* 0 */ float2 latrange; + /* 8 */ float2 light; + /* 16 */ +}; +static_assert(sizeof(HillshadeTilePropsUBO) == 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) HillshadeEvaluatedPropsUBO { + /* 0 */ float4 highlight; + /* 16 */ float4 shadow; + /* 32 */ float4 accent; + /* 48 */ +}; +static_assert(sizeof(HillshadeEvaluatedPropsUBO) == 3 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "HillshadeShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = HILLSHADE_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(3)]]; - short2 texture_pos [[attribute(4)]]; + short2 pos [[attribute(hillshadeUBOCount + 0)]]; + short2 texture_pos [[attribute(hillshadeUBOCount + 1)]]; }; struct FragmentStage { @@ -31,21 +63,12 @@ struct FragmentStage { float2 pos; }; -struct alignas(16) HillshadeDrawableUBO { - float4x4 matrix; - float2 latrange; - float2 light; -}; - -struct alignas(16) HillshadeEvaluatedPropsUBO { - float4 highlight; - float4 shadow; - float4 accent; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const HillshadeDrawableUBO& drawable [[buffer(1)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const HillshadeDrawableUBO* drawableVector [[buffer(idHillshadeDrawableUBO)]]) { + device const HillshadeDrawableUBO& drawable = drawableVector[uboIndex]; + const float4 position = drawable.matrix * float4(float2(vertx.pos), 0, 1); float2 pos = float2(vertx.texture_pos) / 8192.0; pos.y = 1.0 - pos.y; @@ -57,30 +80,33 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const HillshadeDrawableUBO& drawable [[buffer(1)]], - device const HillshadeEvaluatedPropsUBO& props [[buffer(2)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const HillshadeTilePropsUBO* tilePropsVector [[buffer(idHillshadeTilePropsUBO)]], + device const HillshadeEvaluatedPropsUBO& props [[buffer(idHillshadeEvaluatedPropsUBO)]], texture2d image [[texture(0)]], sampler image_sampler [[sampler(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif + device const HillshadeTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + float4 pixel = image.sample(image_sampler, in.pos); float2 deriv = ((pixel.rg * 2.0) - 1.0); // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude // to account for mercator projection distortion. see #4807 for details - float scaleFactor = cos(radians((drawable.latrange[0] - drawable.latrange[1]) * in.pos.y + drawable.latrange[1])); + float scaleFactor = cos(radians((tileProps.latrange[0] - tileProps.latrange[1]) * in.pos.y + tileProps.latrange[1])); // We also multiply the slope by an arbitrary z-factor of 1.25 float slope = atan(1.25 * length(deriv) / scaleFactor); float aspect = deriv.x != 0.0 ? atan2(deriv.y, -deriv.x) : M_PI_F / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0); - float intensity = drawable.light.x; + float intensity = tileProps.light.x; // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal // position property to account for 0deg corresponding to north/the top of the viewport in the style spec // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal. - float azimuth = drawable.light.y + M_PI_F; + float azimuth = tileProps.light.y + M_PI_F; // We scale the slope exponentially based on intensity, using a calculation similar to // the exponential interpolation function in the style spec: diff --git a/include/mbgl/shaders/mtl/hillshade_prepare.hpp b/include/mbgl/shaders/mtl/hillshade_prepare.hpp index 6a74245ffd48..8b3770b4d611 100644 --- a/include/mbgl/shaders/mtl/hillshade_prepare.hpp +++ b/include/mbgl/shaders/mtl/hillshade_prepare.hpp @@ -2,27 +2,51 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define HILLSHADE_PREPARE_SHADER_PRELUDE \ + R"( + +enum { + idHillshadePrepareDrawableUBO = idDrawableReservedVertexOnlyUBO, + idHillshadePrepareTilePropsUBO = drawableReservedUBOCount, + hillshadePrepareUBOCount +}; + +struct alignas(16) HillshadePrepareDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ +}; +static_assert(sizeof(HillshadePrepareDrawableUBO) == 4 * 16, "wrong size"); + +struct alignas(16) HillshadePrepareTilePropsUBO { + /* 0 */ float4 unpack; + /* 16 */ float2 dimension; + /* 24 */ float zoom; + /* 28 */ float maxzoom; + /* 32 */ +}; +static_assert(sizeof(HillshadePrepareTilePropsUBO) == 2 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "HillshadePrepareShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = HILLSHADE_PREPARE_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(2)]]; - short2 texture_pos [[attribute(3)]]; + short2 pos [[attribute(hillshadePrepareUBOCount + 0)]]; + short2 texture_pos [[attribute(hillshadePrepareUBOCount + 1)]]; }; struct FragmentStage { @@ -30,21 +54,14 @@ struct FragmentStage { float2 pos; }; -struct alignas(16) HillshadePrepareDrawableUBO { - float4x4 matrix; - float4 unpack; - float2 dimension; - float zoom; - float maxzoom; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const HillshadePrepareDrawableUBO& drawable [[buffer(1)]]) { + device const HillshadePrepareDrawableUBO& drawable [[buffer(idHillshadePrepareDrawableUBO)]], + device const HillshadePrepareTilePropsUBO& tileProps [[buffer(idHillshadePrepareTilePropsUBO)]]) { const float4 position = drawable.matrix * float4(float2(vertx.pos), 0, 1); - float2 epsilon = 1.0 / drawable.dimension; - float scale = (drawable.dimension.x - 2.0) / drawable.dimension.x; + float2 epsilon = 1.0 / tileProps.dimension; + float scale = (tileProps.dimension.x - 2.0) / tileProps.dimension.x; const float2 pos = (float2(vertx.texture_pos) / 8192.0) * scale + epsilon; return { @@ -61,14 +78,14 @@ float getElevation(float2 coord, float bias, texture2d im } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const HillshadePrepareDrawableUBO& drawable [[buffer(1)]], + device const HillshadePrepareTilePropsUBO& tileProps [[buffer(idHillshadePrepareTilePropsUBO)]], texture2d image [[texture(0)]], sampler image_sampler [[sampler(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif - float2 epsilon = 1.0 / drawable.dimension; + float2 epsilon = 1.0 / tileProps.dimension; // queried pixels: // +-----------+ @@ -85,15 +102,15 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], // | | | | // +-----------+ - float a = getElevation(in.pos + float2(-epsilon.x, -epsilon.y), 0.0, image, image_sampler, drawable.unpack); - float b = getElevation(in.pos + float2(0, -epsilon.y), 0.0, image, image_sampler, drawable.unpack); - float c = getElevation(in.pos + float2(epsilon.x, -epsilon.y), 0.0, image, image_sampler, drawable.unpack); - float d = getElevation(in.pos + float2(-epsilon.x, 0), 0.0, image, image_sampler, drawable.unpack); - //float e = getElevation(in.pos, 0.0, image, image_sampler, drawable.unpack); - float f = getElevation(in.pos + float2(epsilon.x, 0), 0.0, image, image_sampler, drawable.unpack); - float g = getElevation(in.pos + float2(-epsilon.x, epsilon.y), 0.0, image, image_sampler, drawable.unpack); - float h = getElevation(in.pos + float2(0, epsilon.y), 0.0, image, image_sampler, drawable.unpack); - float i = getElevation(in.pos + float2(epsilon.x, epsilon.y), 0.0, image, image_sampler, drawable.unpack); + float a = getElevation(in.pos + float2(-epsilon.x, -epsilon.y), 0.0, image, image_sampler, tileProps.unpack); + float b = getElevation(in.pos + float2(0, -epsilon.y), 0.0, image, image_sampler, tileProps.unpack); + float c = getElevation(in.pos + float2(epsilon.x, -epsilon.y), 0.0, image, image_sampler, tileProps.unpack); + float d = getElevation(in.pos + float2(-epsilon.x, 0), 0.0, image, image_sampler, tileProps.unpack); + //float e = getElevation(in.pos, 0.0, image, image_sampler, tileProps.unpack); + float f = getElevation(in.pos + float2(epsilon.x, 0), 0.0, image, image_sampler, tileProps.unpack); + float g = getElevation(in.pos + float2(-epsilon.x, epsilon.y), 0.0, image, image_sampler, tileProps.unpack); + float h = getElevation(in.pos + float2(0, epsilon.y), 0.0, image, image_sampler, tileProps.unpack); + float i = getElevation(in.pos + float2(epsilon.x, epsilon.y), 0.0, image, image_sampler, tileProps.unpack); // here we divide the x and y slopes by 8 * pixel size // where pixel size (aka meters/pixel) is: @@ -106,12 +123,12 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], // Here we use a=0.3 which works out to the expression below. see // nickidlugash's awesome breakdown for more info // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556 - float exaggeration = drawable.zoom < 2.0 ? 0.4 : drawable.zoom < 4.5 ? 0.35 : 0.3; + float exaggeration = tileProps.zoom < 2.0 ? 0.4 : tileProps.zoom < 4.5 ? 0.35 : 0.3; float2 deriv = float2( (c + f + f + i) - (a + d + d + g), (g + h + h + i) - (a + b + b + c) - ) / pow(2.0, (drawable.zoom - drawable.maxzoom) * exaggeration + 19.2562 - drawable.zoom); + ) / pow(2.0, (tileProps.zoom - tileProps.maxzoom) * exaggeration + 19.2562 - tileProps.zoom); float4 color = clamp(float4( deriv.x / 2.0 + 0.5, diff --git a/include/mbgl/shaders/mtl/line.hpp b/include/mbgl/shaders/mtl/line.hpp index fd377413c5a2..b95c3d0c666f 100644 --- a/include/mbgl/shaders/mtl/line.hpp +++ b/include/mbgl/shaders/mtl/line.hpp @@ -2,24 +2,188 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define LINE_SHADER_COMMON \ + R"( + +enum { + idLineDrawableUBO = idDrawableReservedVertexOnlyUBO, + idLineTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + idLineEvaluatedPropsUBO = drawableReservedUBOCount, + idLineExpressionUBO, + lineUBOCount +}; + +// +// Line + +struct alignas(16) LineDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float color_t; + /* 72 */ float blur_t; + /* 76 */ float opacity_t; + /* 80 */ float gapwidth_t; + /* 84 */ float offset_t; + /* 88 */ float width_t; + /* 92 */ float pad1; + /* 96 */ +}; +static_assert(sizeof(LineDrawableUBO) == 6 * 16, "wrong size"); + +// +// Line gradient + +struct alignas(16) LineGradientDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float blur_t; + /* 72 */ float opacity_t; + /* 76 */ float gapwidth_t; + /* 80 */ float offset_t; + /* 84 */ float width_t; + /* 88 */ float pad1; + /* 92 */ float pad2; + /* 96 */ +}; +static_assert(sizeof(LineGradientDrawableUBO) == 6 * 16, "wrong size"); + +// +// Line pattern + +struct alignas(16) LinePatternDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float ratio; + + // Interpolations + /* 68 */ float blur_t; + /* 72 */ float opacity_t; + /* 76 */ float gapwidth_t; + /* 80 */ float offset_t; + /* 84 */ float width_t; + /* 88 */ float pattern_from_t; + /* 92 */ float pattern_to_t; + /* 96 */ +}; +static_assert(sizeof(LinePatternDrawableUBO) == 6 * 16, "wrong size"); + +struct alignas(16) LinePatternTilePropsUBO { + /* 0 */ float4 pattern_from; + /* 16 */ float4 pattern_to; + /* 32 */ float4 scale; + /* 48 */ float2 texsize; + /* 56 */ float fade; + /* 60 */ float pad2; + /* 64 */ +}; +static_assert(sizeof(LinePatternTilePropsUBO) == 4 * 16, "wrong size"); + +// +// Line SDF + +struct alignas(16) LineSDFDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float2 patternscale_a; + /* 72 */ float2 patternscale_b; + /* 80 */ float tex_y_a; + /* 84 */ float tex_y_b; + /* 88 */ float ratio; + + // Interpolations + /* 92 */ float color_t; + /* 96 */ float blur_t; + /* 100 */ float opacity_t; + /* 104 */ float gapwidth_t; + /* 108 */ float offset_t; + /* 112 */ float width_t; + /* 116 */ float floorwidth_t; + /* 120 */ float pad1; + /* 124 */ float pad2; + /* 128 */ +}; +static_assert(sizeof(LineSDFDrawableUBO) == 8 * 16, "wrong size"); + +struct alignas(16) LineSDFTilePropsUBO { + /* 0 */ float sdfgamma; + /* 4 */ float mix; + /* 8 */ float pad1; + /* 12 */ float pad2; + /* 16 */ +}; +static_assert(sizeof(LineSDFTilePropsUBO) == 16, "wrong size"); + +/// Expression properties that do not depend on the tile +enum class LineExpressionMask : uint32_t { + None = 0, + Color = 1 << 0, + Opacity = 1 << 1, + Blur = 1 << 2, + Width = 1 << 3, + GapWidth = 1 << 4, + FloorWidth = 1 << 5, + Offset = 1 << 6, +}; +bool operator&(LineExpressionMask a, LineExpressionMask b) { return (uint32_t)a & (uint32_t)b; } + +struct alignas(16) LineExpressionUBO { + GPUExpression color; + GPUExpression blur; + GPUExpression opacity; + GPUExpression gapwidth; + GPUExpression offset; + GPUExpression width; + GPUExpression floorwidth; +}; +static_assert(sizeof(LineExpressionUBO) % 16 == 0, "wrong alignment"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) LineEvaluatedPropsUBO { + /* 0 */ float4 color; + /* 16 */ float blur; + /* 20 */ float opacity; + /* 24 */ float gapwidth; + /* 28 */ float offset; + /* 32 */ float width; + /* 36 */ float floorwidth; + /* 40 */ LineExpressionMask expressionMask; + /* 44 */ float pad1; + /* 48 */ +}; +static_assert(sizeof(LineEvaluatedPropsUBO) == 3 * 16, "wrong size"); + +union LineDrawableUnionUBO { + LineDrawableUBO lineDrawableUBO; + LineGradientDrawableUBO lineGradientDrawableUBO; + LinePatternDrawableUBO linePatternDrawableUBO; + LineSDFDrawableUBO lineSDFDrawableUBO; +}; + +union LineTilePropsUnionUBO { + LinePatternTilePropsUBO linePatternTilePropsUBO; + LineSDFTilePropsUBO lineSDFTilePropsUBO; +}; + +)" + template <> struct ShaderSource { static constexpr auto name = "LineShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = LINE_SHADER_COMMON R"( struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -61,48 +225,34 @@ struct FragmentStage { #endif }; -struct alignas(16) LineDrawableUBO { - float4x4 matrix; - float ratio; - float pad1, pad2, pad3; -}; - -struct alignas(16) LineInterpolationUBO { - float color_t; - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float pad1, pad2; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LineDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], - device const LineInterpolationUBO& interp [[buffer(idLineInterpolationUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineDrawableUnionUBO* drawableVector [[buffer(idLineDrawableUBO)]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]]) { + device const LineDrawableUBO& drawable = drawableVector[uboIndex].lineDrawableUBO; + #if defined(HAS_UNIFORM_u_gapwidth) const auto exprGapWidth = (props.expressionMask & LineExpressionMask::GapWidth); - const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.zoom) : props.gapwidth) / 2; + const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.map_zoom) : props.gapwidth) / 2; #else - const auto gapwidth = unpack_mix_float(vertx.gapwidth, interp.gapwidth_t) / 2; + const auto gapwidth = unpack_mix_float(vertx.gapwidth, drawable.gapwidth_t) / 2; #endif #if defined(HAS_UNIFORM_u_offset) const auto exprOffset = (props.expressionMask & LineExpressionMask::Offset); - const auto offset = (exprOffset ? expr.offset.eval(paintParams.zoom) : props.offset) * -1; + const auto offset = (exprOffset ? expr.offset.eval(paintParams.map_zoom) : props.offset) * -1; #else - const auto offset = unpack_mix_float(vertx.offset, interp.offset_t) * -1; + const auto offset = unpack_mix_float(vertx.offset, drawable.offset_t) * -1; #endif #if defined(HAS_UNIFORM_u_width) const auto exprWidth = (props.expressionMask & LineExpressionMask::Width); - const auto width = exprWidth ? expr.width.eval(paintParams.zoom) : props.width; + const auto width = exprWidth ? expr.width.eval(paintParams.map_zoom) : props.width; #else - const auto width = unpack_mix_float(vertx.width, interp.width_t); + const auto width = unpack_mix_float(vertx.width, drawable.width_t); #endif // the distance over which the line edge fades out. @@ -148,13 +298,13 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .gamma_scale = half(extrude_length_without_perspective / extrude_length_with_perspective), #if !defined(HAS_UNIFORM_u_color) - .color = unpack_mix_color(vertx.color, interp.color_t), + .color = unpack_mix_color(vertx.color, drawable.color_t), #endif #if !defined(HAS_UNIFORM_u_blur) - .blur = unpack_mix_float(vertx.blur, interp.blur_t), + .blur = unpack_mix_float(vertx.blur, drawable.blur_t), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = unpack_mix_float(vertx.opacity, interp.opacity_t), + .opacity = unpack_mix_float(vertx.opacity, drawable.opacity_t), #endif }; } @@ -169,21 +319,21 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], #if defined(HAS_UNIFORM_u_color) const auto exprColor = (props.expressionMask & LineExpressionMask::Color); - const auto color = exprColor ? expr.color.evalColor(paintParams.zoom) : props.color; + const auto color = exprColor ? expr.color.evalColor(paintParams.map_zoom) : props.color; #else const float4 color = in.color; #endif #if defined(HAS_UNIFORM_u_blur) const auto exprBlur = (props.expressionMask & LineExpressionMask::Blur); - const float blur = exprBlur ? expr.blur.eval(paintParams.zoom) : props.blur; + const float blur = exprBlur ? expr.blur.eval(paintParams.map_zoom) : props.blur; #else const float blur = in.blur; #endif #if defined(HAS_UNIFORM_u_opacity) const auto exprOpacity = (props.expressionMask & LineExpressionMask::Opacity); - const float opacity = exprOpacity ? expr.opacity.eval(paintParams.zoom) : props.opacity; + const float opacity = exprOpacity ? expr.opacity.eval(paintParams.map_zoom) : props.opacity; #else const float opacity = in.opacity; #endif @@ -207,12 +357,11 @@ struct ShaderSource { static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = LINE_SHADER_COMMON R"( struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -248,48 +397,34 @@ struct FragmentStage { #endif }; -struct alignas(16) LineGradientDrawableUBO { - float4x4 matrix; - float ratio; - float pad1, pad2, pad3; -}; - -struct alignas(16) LineGradientInterpolationUBO { - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float pad1, pad2, pad3; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LineGradientDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], - device const LineGradientInterpolationUBO& interp [[buffer(idLineInterpolationUBO)]], - device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], - device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineDrawableUnionUBO* drawableVector [[buffer(idLineDrawableUBO)]], + device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]]) { + + device const LineGradientDrawableUBO& drawable = drawableVector[uboIndex].lineGradientDrawableUBO; #if !defined(HAS_UNIFORM_u_blur) - const auto blur = unpack_mix_float(vertx.blur, interp.blur_t); + const auto blur = unpack_mix_float(vertx.blur, drawable.blur_t); #endif #if !defined(HAS_UNIFORM_u_opacity) - const auto opacity = unpack_mix_float(vertx.opacity, interp.opacity_t); + const auto opacity = unpack_mix_float(vertx.opacity, drawable.opacity_t); #endif #if defined(HAS_UNIFORM_u_gapwidth) const auto gapwidth = props.gapwidth / 2; #else - const auto gapwidth = unpack_mix_float(vertx.gapwidth, interp.gapwidth_t) / 2; + const auto gapwidth = unpack_mix_float(vertx.gapwidth, drawable.gapwidth_t) / 2; #endif #if defined(HAS_UNIFORM_u_offset) const auto offset = props.offset * -1; #else - const auto offset = unpack_mix_float(vertx.offset, interp.offset_t) * -1; + const auto offset = unpack_mix_float(vertx.offset, drawable.offset_t) * -1; #endif #if defined(HAS_UNIFORM_u_width) const auto width = props.width; #else - const auto width = unpack_mix_float(vertx.width, interp.width_t); + const auto width = unpack_mix_float(vertx.width, drawable.width_t); #endif // the distance over which the line edge fades out. @@ -347,7 +482,6 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], half4 fragment fragmentMain(FragmentStage in [[stage_in]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], - device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]], texture2d gradientTexture [[texture(0)]]) { #if defined(OVERDRAW_INSPECTOR) return half4(1.0); @@ -388,12 +522,11 @@ struct ShaderSource { static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = LINE_SHADER_COMMON R"( struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -442,57 +575,34 @@ struct FragmentStage { #endif }; -struct alignas(16) LinePatternDrawableUBO { - float4x4 matrix; - float4 scale; - float2 texsize; - float ratio; - float fade; -}; - -struct alignas(16) LinePatternInterpolationUBO { - float blur_t; - float opacity_t; - float offset_t; - float gapwidth_t; - float width_t; - float pattern_from_t; - float pattern_to_t; - float pad1; -}; - -struct alignas(16) LinePatternTilePropertiesUBO { - float4 pattern_from; - float4 pattern_to; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LinePatternDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], - device const LinePatternInterpolationUBO& interp [[buffer(idLineInterpolationUBO)]], - device const LinePatternTilePropertiesUBO& tileProps [[buffer(idLineTilePropertiesUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineDrawableUnionUBO* drawableVector [[buffer(idLineDrawableUBO)]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]]) { + device const LinePatternDrawableUBO& drawable = drawableVector[uboIndex].linePatternDrawableUBO; + #if defined(HAS_UNIFORM_u_gapwidth) const auto exprGapWidth = (props.expressionMask & LineExpressionMask::GapWidth); - const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.zoom) : props.gapwidth) / 2; + const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.map_zoom) : props.gapwidth) / 2; #else - const auto gapwidth = unpack_mix_float(vertx.gapwidth, interp.gapwidth_t) / 2; + const auto gapwidth = unpack_mix_float(vertx.gapwidth, drawable.gapwidth_t) / 2; #endif #if defined(HAS_UNIFORM_u_offset) const auto exprOffset = (props.expressionMask & LineExpressionMask::Offset); - const auto offset = (exprOffset ? expr.offset.eval(paintParams.zoom) : props.offset) * -1; + const auto offset = (exprOffset ? expr.offset.eval(paintParams.map_zoom) : props.offset) * -1; #else - const auto offset = unpack_mix_float(vertx.offset, interp.offset_t) * -1; + const auto offset = unpack_mix_float(vertx.offset, drawable.offset_t) * -1; #endif #if defined(HAS_UNIFORM_u_width) const auto exprWidth = (props.expressionMask & LineExpressionMask::Width); - const auto width = exprWidth ? expr.width.eval(paintParams.zoom) : props.width; + const auto width = exprWidth ? expr.width.eval(paintParams.map_zoom) : props.width; #else - const auto width = unpack_mix_float(vertx.width, interp.width_t); + const auto width = unpack_mix_float(vertx.width, drawable.width_t); #endif // the distance over which the line edge fades out. @@ -541,10 +651,10 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .linesofar = linesofar, #if !defined(HAS_UNIFORM_u_blur) - .blur = half(unpack_mix_float(vertx.blur, interp.blur_t)), + .blur = half(unpack_mix_float(vertx.blur, drawable.blur_t)), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), #endif #if !defined(HAS_UNIFORM_u_pattern_from) .pattern_from = half4(vertx.pattern_from), @@ -557,26 +667,29 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], half4 fragment fragmentMain(FragmentStage in [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LinePatternDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], - device const LinePatternTilePropertiesUBO& tileProps [[buffer(idLineTilePropertiesUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineTilePropsUnionUBO* tilePropsVector [[buffer(idLineTilePropsUBO)]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]], texture2d image0 [[texture(0)]], sampler image0_sampler [[sampler(0)]]) { + #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif + device const LinePatternTilePropsUBO& tileProps = tilePropsVector[uboIndex].linePatternTilePropsUBO; + #if defined(HAS_UNIFORM_u_blur) const auto exprBlur = (props.expressionMask & LineExpressionMask::Blur); - const float blur = exprBlur ? expr.blur.eval(paintParams.zoom) : props.blur; + const float blur = exprBlur ? expr.blur.eval(paintParams.map_zoom) : props.blur; #else const float blur = in.blur; #endif #if defined(HAS_UNIFORM_u_opacity) const auto exprOpacity = (props.expressionMask & LineExpressionMask::Opacity); - const float opacity = exprOpacity ? expr.opacity.eval(paintParams.zoom) : props.opacity; + const float opacity = exprOpacity ? expr.opacity.eval(paintParams.map_zoom) : props.opacity; #else const float opacity = in.opacity; #endif @@ -598,10 +711,10 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], const float2 pattern_tl_b = pattern_to.xy; const float2 pattern_br_b = pattern_to.zw; - const float pixelRatio = drawable.scale.x; - const float tileZoomRatio = drawable.scale.y; - const float fromScale = drawable.scale.z; - const float toScale = drawable.scale.w; + const float pixelRatio = tileProps.scale.x; + const float tileZoomRatio = tileProps.scale.y; + const float fromScale = tileProps.scale.z; + const float toScale = tileProps.scale.w; const float2 display_size_a = float2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); const float2 display_size_b = float2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); @@ -628,10 +741,10 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], // the texture coordinate const float y_a = 0.5 + (in.normal.y * clamp(in.width2.x, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y); const float y_b = 0.5 + (in.normal.y * clamp(in.width2.x, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y); - const float2 pos_a = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, float2(x_a, y_a)); - const float2 pos_b = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, float2(x_b, y_b)); + const float2 pos_a = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, float2(x_a, y_a)); + const float2 pos_b = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, float2(x_b, y_b)); - const float4 color = mix(image0.sample(image0_sampler, pos_a), image0.sample(image0_sampler, pos_b), drawable.fade); + const float4 color = mix(image0.sample(image0_sampler, pos_a), image0.sample(image0_sampler, pos_b), tileProps.fade); return half4(color * alpha * opacity); } @@ -644,12 +757,11 @@ struct ShaderSource { static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = LINE_SHADER_COMMON R"( struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -699,62 +811,41 @@ struct FragmentStage { #endif }; -struct alignas(16) LineSDFDrawableUBO { - float4x4 matrix; - float2 patternscale_a; - float2 patternscale_b; - float ratio; - float tex_y_a; - float tex_y_b; - float sdfgamma; - float mix; - float pad1, pad2, pad3; -}; - -struct alignas(16) LineSDFInterpolationUBO { - float color_t; - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float floorwidth_t; - float pad1; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LineSDFDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], - device const LineSDFInterpolationUBO& interp [[buffer(idLineInterpolationUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineDrawableUnionUBO* drawableVector [[buffer(idLineDrawableUBO)]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]]) { + device const LineSDFDrawableUBO& drawable = drawableVector[uboIndex].lineSDFDrawableUBO; + #if defined(HAS_UNIFORM_u_gapwidth) const auto exprGapWidth = (props.expressionMask & LineExpressionMask::GapWidth); - const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.zoom) : props.gapwidth) / 2.0; + const auto gapwidth = (exprGapWidth ? expr.gapwidth.eval(paintParams.map_zoom) : props.gapwidth) / 2.0; #else - const auto gapwidth = unpack_mix_float(vertx.gapwidth, interp.gapwidth_t) / 2.0; + const auto gapwidth = unpack_mix_float(vertx.gapwidth, drawable.gapwidth_t) / 2.0; #endif #if defined(HAS_UNIFORM_u_offset) const auto exprOffset = (props.expressionMask & LineExpressionMask::Offset); - const auto offset = (exprOffset ? expr.offset.eval(paintParams.zoom) : props.offset) * -1.0; + const auto offset = (exprOffset ? expr.offset.eval(paintParams.map_zoom) : props.offset) * -1.0; #else - const auto offset = unpack_mix_float(vertx.offset, interp.offset_t) * -1.0; + const auto offset = unpack_mix_float(vertx.offset, drawable.offset_t) * -1.0; #endif #if defined(HAS_UNIFORM_u_width) const auto exprWidth = (props.expressionMask & LineExpressionMask::Width); - const auto width = exprWidth ? expr.width.eval(paintParams.zoom) : props.width; + const auto width = exprWidth ? expr.width.eval(paintParams.map_zoom) : props.width; #else - const auto width = unpack_mix_float(vertx.width, interp.width_t); + const auto width = unpack_mix_float(vertx.width, drawable.width_t); #endif #if defined(HAS_UNIFORM_u_floorwidth) const auto exprFloorWidth = (props.expressionMask & LineExpressionMask::FloorWidth); - const auto floorwidth = exprFloorWidth ? expr.floorwidth.eval(paintParams.zoom) : props.floorwidth; + const auto floorwidth = exprFloorWidth ? expr.floorwidth.eval(paintParams.map_zoom) : props.floorwidth; #else - const auto floorwidth = unpack_mix_float(vertx.floorwidth, interp.floorwidth_t); + const auto floorwidth = unpack_mix_float(vertx.floorwidth, drawable.floorwidth_t); #endif // the distance over which the line edge fades out. @@ -804,13 +895,13 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .tex_b = float2(linesofar * drawable.patternscale_b.x / floorwidth, v_normal.y * drawable.patternscale_b.y + drawable.tex_y_b), #if !defined(HAS_UNIFORM_u_color) - .color = unpack_mix_color(vertx.color, interp.color_t), + .color = unpack_mix_color(vertx.color, drawable.color_t), #endif #if !defined(HAS_UNIFORM_u_blur) - .blur = unpack_mix_float(vertx.blur, interp.blur_t), + .blur = unpack_mix_float(vertx.blur, drawable.blur_t), #endif #if !defined(HAS_UNIFORM_u_opacity) - .opacity = unpack_mix_float(vertx.opacity, interp.opacity_t), + .opacity = unpack_mix_float(vertx.opacity, drawable.opacity_t), #endif #if !defined(HAS_UNIFORM_u_floorwidth) .floorwidth = floorwidth, @@ -820,39 +911,43 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], half4 fragment fragmentMain(FragmentStage in [[stage_in]], device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], - device const LineSDFDrawableUBO& drawable [[buffer(idLineDrawableUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const LineTilePropsUnionUBO* tilePropsVector [[buffer(idLineTilePropsUBO)]], device const LineEvaluatedPropsUBO& props [[buffer(idLineEvaluatedPropsUBO)]], device const LineExpressionUBO& expr [[buffer(idLineExpressionUBO)]], texture2d image0 [[texture(0)]], sampler image0_sampler [[sampler(0)]]) { + #if defined(OVERDRAW_INSPECTOR) return half4(1.0); #endif + device const LineSDFTilePropsUBO& tileProps = tilePropsVector[uboIndex].lineSDFTilePropsUBO; + #if defined(HAS_UNIFORM_u_color) const auto exprColor = (props.expressionMask & LineExpressionMask::Color); - const auto color = exprColor ? expr.color.evalColor(paintParams.zoom) : props.color; + const auto color = exprColor ? expr.color.evalColor(paintParams.map_zoom) : props.color; #else const float4 color = in.color; #endif #if defined(HAS_UNIFORM_u_blur) const auto exprBlur = (props.expressionMask & LineExpressionMask::Blur); - const float blur = exprBlur ? expr.blur.eval(paintParams.zoom) : props.blur; + const float blur = exprBlur ? expr.blur.eval(paintParams.map_zoom) : props.blur; #else const float blur = in.blur; #endif #if defined(HAS_UNIFORM_u_opacity) const auto exprOpacity = (props.expressionMask & LineExpressionMask::Opacity); - const float opacity = exprOpacity ? expr.opacity.eval(paintParams.zoom) : props.opacity; + const float opacity = exprOpacity ? expr.opacity.eval(paintParams.map_zoom) : props.opacity; #else const float opacity = in.opacity; #endif #if defined(HAS_UNIFORM_u_floorwidth) const auto exprFloorWidth = (props.expressionMask & LineExpressionMask::FloorWidth); - const auto floorwidth = exprFloorWidth ? expr.floorwidth.eval(paintParams.zoom) : props.floorwidth; + const auto floorwidth = exprFloorWidth ? expr.floorwidth.eval(paintParams.map_zoom) : props.floorwidth; #else const auto floorwidth = in.floorwidth; #endif @@ -866,9 +961,9 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], const float sdfdist_a = image0.sample(image0_sampler, in.tex_a).a; const float sdfdist_b = image0.sample(image0_sampler, in.tex_b).a; - const float sdfdist = mix(sdfdist_a, sdfdist_b, drawable.mix); + const float sdfdist = mix(sdfdist_a, sdfdist_b, tileProps.mix); const float alpha = clamp(min(dist - (in.width2.y - blur2), in.width2.x - dist) / blur2, 0.0, 1.0) * - smoothstep(0.5 - drawable.sdfgamma / floorwidth, 0.5 + drawable.sdfgamma / floorwidth, sdfdist); + smoothstep(0.5 - tileProps.sdfgamma / floorwidth, 0.5 + tileProps.sdfgamma / floorwidth, sdfdist); return half4(color * (alpha * opacity)); } diff --git a/include/mbgl/shaders/mtl/raster.hpp b/include/mbgl/shaders/mtl/raster.hpp index a6a489f4690e..22b1e995512c 100644 --- a/include/mbgl/shaders/mtl/raster.hpp +++ b/include/mbgl/shaders/mtl/raster.hpp @@ -2,28 +2,61 @@ #include #include -#include #include namespace mbgl { namespace shaders { +#define RASTER_SHADER_PRELUDE \ + R"( + +enum { + idRasterDrawableUBO = idDrawableReservedVertexOnlyUBO, + idRasterEvaluatedPropsUBO = drawableReservedUBOCount, + rasterUBOCount +}; + +struct alignas(16) RasterDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ +}; +static_assert(sizeof(RasterDrawableUBO) == 4 * 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) RasterEvaluatedPropsUBO { + /* 0 */ float4 spin_weights; + /* 16 */ float2 tl_parent; + /* 24 */ float scale_parent; + /* 28 */ float buffer_scale; + /* 32 */ float fade_t; + /* 36 */ float opacity; + /* 40 */ float brightness_low; + /* 44 */ float brightness_high; + /* 48 */ float saturation_factor; + /* 52 */ float contrast_factor; + /* 56 */ float pad1; + /* 60 */ float pad2; + /* 64 */ +}; +static_assert(sizeof(RasterEvaluatedPropsUBO) == 4 * 16, "wrong size"); + +)" + template <> struct ShaderSource { static constexpr auto name = "RasterShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = R"( + static constexpr auto source = RASTER_SHADER_PRELUDE R"( struct VertexStage { - short2 pos [[attribute(3)]]; - short2 texture_pos [[attribute(4)]]; + short2 pos [[attribute(rasterUBOCount + 0)]]; + short2 texture_pos [[attribute(rasterUBOCount + 1)]]; }; struct FragmentStage { @@ -32,27 +65,12 @@ struct FragmentStage { float2 pos1; }; -struct alignas(16) RasterDrawableUBO { - float4x4 matrix; -}; - -struct alignas(16) RasterEvaluatedPropsUBO { - float4 spin_weights; - float2 tl_parent; - float scale_parent; - float buffer_scale; - float fade_t; - float opacity; - float brightness_low; - float brightness_high; - float saturation_factor; - float contrast_factor; - float pad1, pad2; -}; - FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const RasterDrawableUBO& drawable [[buffer(1)]], - device const RasterEvaluatedPropsUBO& props [[buffer(2)]]) { + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const RasterDrawableUBO* drawableVector [[buffer(idRasterDrawableUBO)]], + device const RasterEvaluatedPropsUBO& props [[buffer(idRasterEvaluatedPropsUBO)]]) { + + device const RasterDrawableUBO& drawable = drawableVector[uboIndex]; const float4 position = drawable.matrix * float4(float2(vertx.pos), 0, 1); @@ -72,7 +90,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], } half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const RasterEvaluatedPropsUBO& props [[buffer(2)]], + device const RasterEvaluatedPropsUBO& props [[buffer(idRasterEvaluatedPropsUBO)]], texture2d image0 [[texture(0)]], texture2d image1 [[texture(1)]], sampler image0_sampler [[sampler(0)]], diff --git a/include/mbgl/shaders/mtl/shader_group.hpp b/include/mbgl/shaders/mtl/shader_group.hpp index d4f5b5dbe827..111332a0ca3c 100644 --- a/include/mbgl/shaders/mtl/shader_group.hpp +++ b/include/mbgl/shaders/mtl/shader_group.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -81,9 +81,6 @@ class ShaderGroup final : public ShaderGroupBase { for (const auto& attrib : ShaderClass::instanceAttributes) { shader->initInstanceAttribute(attrib); } - for (const auto& uniform : ShaderClass::uniforms) { - shader->initUniformBlock(uniform); - } for (const auto& texture : ShaderClass::textures) { shader->initTexture(texture); } diff --git a/include/mbgl/shaders/mtl/shader_program.hpp b/include/mbgl/shaders/mtl/shader_program.hpp index d67d8262cc9a..95d92b1f4842 100644 --- a/include/mbgl/shaders/mtl/shader_program.hpp +++ b/include/mbgl/shaders/mtl/shader_program.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -71,12 +70,8 @@ class ShaderProgram final : public gfx::ShaderProgramBase { const gfx::VertexAttributeArray& getInstanceAttributes() const override { return instanceAttributes; } - const gfx::UniformBlockArray& getUniformBlocks() const override { return uniformBlocks; } - gfx::UniformBlockArray& mutableUniformBlocks() override { return uniformBlocks; } - void initAttribute(const shaders::AttributeInfo&); void initInstanceAttribute(const shaders::AttributeInfo&); - void initUniformBlock(const shaders::UniformBlockInfo&); void initTexture(const shaders::TextureInfo&); protected: @@ -84,7 +79,6 @@ class ShaderProgram final : public gfx::ShaderProgramBase { RendererBackend& backend; MTLFunctionPtr vertexFunction; MTLFunctionPtr fragmentFunction; - UniformBlockArray uniformBlocks; VertexAttributeArray vertexAttributes; VertexAttributeArray instanceAttributes; std::array, shaders::maxTextureCountPerShader> textureBindings; diff --git a/include/mbgl/shaders/mtl/symbol.hpp b/include/mbgl/shaders/mtl/symbol.hpp new file mode 100644 index 000000000000..e3e9bcf91589 --- /dev/null +++ b/include/mbgl/shaders/mtl/symbol.hpp @@ -0,0 +1,644 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace shaders { + +#define SYMBOL_SHADER_COMMON \ + R"( + +enum { + idSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, + idSymbolTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + idSymbolEvaluatedPropsUBO = drawableReservedUBOCount, + symbolUBOCount +}; + +struct alignas(16) SymbolDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float4x4 label_plane_matrix; + /* 128 */ float4x4 coord_matrix; + + /* 192 */ float2 texsize; + /* 200 */ float2 texsize_icon; + + /* 208 */ /*bool*/ int is_text_prop; + /* 212 */ /*bool*/ int rotate_symbol; + /* 216 */ /*bool*/ int pitch_with_map; + /* 220 */ /*bool*/ int is_size_zoom_constant; + /* 224 */ /*bool*/ int is_size_feature_constant; + + /* 228 */ float size_t; + /* 232 */ float size; + + // Interpolations + /* 236 */ float fill_color_t; + /* 240 */ float halo_color_t; + /* 244 */ float opacity_t; + /* 248 */ float halo_width_t; + /* 252 */ float halo_blur_t; + /* 256 */ +}; +static_assert(sizeof(SymbolDrawableUBO) == 16 * 16, "wrong size"); + +struct alignas(16) SymbolTilePropsUBO { + /* 0 */ /*bool*/ int is_text; + /* 4 */ /*bool*/ int is_halo; + /* 8 */ float gamma_scale; + /* 12 */ float pad1; + /* 16 */ +}; +static_assert(sizeof(SymbolTilePropsUBO) == 16, "wrong size"); + +/// Evaluated properties that do not depend on the tile +struct alignas(16) SymbolEvaluatedPropsUBO { + /* 0 */ float4 text_fill_color; + /* 16 */ float4 text_halo_color; + /* 32 */ float text_opacity; + /* 36 */ float text_halo_width; + /* 40 */ float text_halo_blur; + /* 44 */ float pad1; + /* 48 */ float4 icon_fill_color; + /* 64 */ float4 icon_halo_color; + /* 80 */ float icon_opacity; + /* 84 */ float icon_halo_width; + /* 88 */ float icon_halo_blur; + /* 92 */ float pad2; + /* 96 */ +}; +static_assert(sizeof(SymbolEvaluatedPropsUBO) == 6 * 16, "wrong size"); + +)" + +template <> +struct ShaderSource { + static constexpr auto name = "SymbolIconShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = SYMBOL_SHADER_COMMON R"( +struct VertexStage { + float4 pos_offset [[attribute(symbolUBOCount + 0)]]; + float4 data [[attribute(symbolUBOCount + 1)]]; + float4 pixeloffset [[attribute(symbolUBOCount + 2)]]; + float3 projected_pos [[attribute(symbolUBOCount + 3)]]; + float fade_opacity [[attribute(symbolUBOCount + 4)]]; + +#if !defined(HAS_UNIFORM_u_opacity) + float opacity [[attribute(symbolUBOCount + 5)]]; +#endif +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + half2 tex; + +#if defined(HAS_UNIFORM_u_opacity) + // We only need to pass `fade_opacity` separately if opacity is a + // uniform, otherwise it's multiplied into fragment opacity, below. + half fade_opacity; +#else + half opacity; +#endif +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolDrawableUBO* drawableVector [[buffer(idSymbolDrawableUBO)]]) { + + device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + + const float2 a_pos = vertx.pos_offset.xy; + const float2 a_offset = vertx.pos_offset.zw; + + const float2 a_tex = vertx.data.xy; + const float2 a_size = vertx.data.zw; + + const float a_size_min = floor(a_size[0] * 0.5); + const float2 a_pxoffset = vertx.pixeloffset.xy; + const float2 a_minFontScale = vertx.pixeloffset.zw / 256.0; + + const float segment_angle = -vertx.projected_pos[2]; + + float size; + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = a_size_min / 128.0; + } else { + size = drawable.size; + } + + const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); + const float camera_to_anchor_distance = projectedPoint.w; + // See comments in symbol_sdf.vertex + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; + const float perspective_ratio = clamp( + 0.5 + 0.5 * distance_ratio, + 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles + 4.0); + + size *= perspective_ratio; + + const float fontScale = drawable.is_text_prop ? size / 24.0 : size; + + float symbol_rotation = 0.0; + if (drawable.rotate_symbol) { + // See comments in symbol_sdf.vertex + const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); + + const float2 a = projectedPoint.xy / projectedPoint.w; + const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; + symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); + } + + const float angle_sin = sin(segment_angle + symbol_rotation); + const float angle_cos = cos(segment_angle + symbol_rotation); + const float2x2 rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); + + const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); + const float2 pos0 = projected_pos.xy / projected_pos.w; + const float2 posOffset = a_offset * max(a_minFontScale, fontScale) / 32.0 + a_pxoffset / 16.0; + const float4 position = drawable.coord_matrix * float4(pos0 + rotation_matrix * posOffset, 0.0, 1.0); + + const float2 raw_fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + const float fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); + + return { + .position = position, + .tex = half2(a_tex / drawable.texsize), +#if defined(HAS_UNIFORM_u_opacity) + .fade_opacity = half(fade_opacity), +#else + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t) * fade_opacity), +#endif + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolTilePropsUBO* tilePropsVector [[buffer(idSymbolTilePropsUBO)]], + device const SymbolEvaluatedPropsUBO& props [[buffer(idSymbolEvaluatedPropsUBO)]], + texture2d image [[texture(0)]], + sampler image_sampler [[sampler(0)]]) { +#if defined(OVERDRAW_INSPECTOR) + return half4(1.0); +#endif + + device const SymbolTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + +#if defined(HAS_UNIFORM_u_opacity) + const float opacity = (tileProps.is_text ? props.text_opacity : props.icon_opacity) * in.fade_opacity; +#else + const float opacity = in.opacity; // fade_opacity is baked in for this case +#endif + + return half4(image.sample(image_sampler, float2(in.tex)) * opacity); +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr auto name = "SymbolSDFIconShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = SYMBOL_SHADER_COMMON R"( +struct VertexStage { + float4 pos_offset [[attribute(symbolUBOCount + 0)]]; + float4 data [[attribute(symbolUBOCount + 1)]]; + float4 pixeloffset [[attribute(symbolUBOCount + 2)]]; + float3 projected_pos [[attribute(symbolUBOCount + 3)]]; + float fade_opacity [[attribute(symbolUBOCount + 4)]]; + +#if !defined(HAS_UNIFORM_u_fill_color) + float4 fill_color [[attribute(symbolUBOCount + 5)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + float4 halo_color [[attribute(symbolUBOCount + 6)]]; +#endif +#if !defined(HAS_UNIFORM_u_opacity) + float opacity [[attribute(symbolUBOCount + 7)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + float halo_width [[attribute(symbolUBOCount + 8)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + float halo_blur [[attribute(symbolUBOCount + 9)]]; +#endif +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + +#if !defined(HAS_UNIFORM_u_fill_color) + half4 fill_color; +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + half4 halo_color; +#endif + + half2 tex; + half gamma_scale; + half fontScale; + half fade_opacity; + +#if !defined(HAS_UNIFORM_u_opacity) + half opacity; +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + half halo_width; +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + half halo_blur; +#endif +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolDrawableUBO* drawableVector [[buffer(idSymbolDrawableUBO)]]) { + + device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + + const float2 a_pos = vertx.pos_offset.xy; + const float2 a_offset = vertx.pos_offset.zw; + + const float2 a_tex = vertx.data.xy; + const float2 a_size = vertx.data.zw; + + const float a_size_min = floor(a_size[0] * 0.5); + const float2 a_pxoffset = vertx.pixeloffset.xy; + + const float segment_angle = -vertx.projected_pos[2]; + + float size; + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = a_size_min / 128.0; + } else { + size = drawable.size; + } + + const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); + const float camera_to_anchor_distance = projectedPoint.w; + // If the label is pitched with the map, layout is done in pitched space, + // which makes labels in the distance smaller relative to viewport space. + // We counteract part of that effect by multiplying by the perspective ratio. + // If the label isn't pitched with the map, we do layout in viewport space, + // which makes labels in the distance larger relative to the features around + // them. We counteract part of that effect by dividing by the perspective ratio. + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; + const float perspective_ratio = clamp( + 0.5 + 0.5 * distance_ratio, + 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles + 4.0); + + size *= perspective_ratio; + + const float fontScale = drawable.is_text_prop ? size / 24.0 : size; + + float symbol_rotation = 0.0; + if (drawable.rotate_symbol) { + // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units + // To figure out that angle in projected space, we draw a short horizontal line in tile + // space, project it, and measure its angle in projected space. + const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); + + const float2 a = projectedPoint.xy / projectedPoint.w; + const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; + + symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); + } + + const float angle_sin = sin(segment_angle + symbol_rotation); + const float angle_cos = cos(segment_angle + symbol_rotation); + const auto rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); + const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); + const float2 pos_rot = a_offset / 32.0 * fontScale + a_pxoffset; + const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; + const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); + const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + + return { + .position = position, +#if !defined(HAS_UNIFORM_u_fill_color) + .fill_color = half4(unpack_mix_color(vertx.fill_color, drawable.fill_color_t)), +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + .halo_color = half4(unpack_mix_color(vertx.halo_color, drawable.halo_color_t)), +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + .halo_width = half(unpack_mix_float(vertx.halo_width, drawable.halo_width_t)), +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + .halo_blur = half(unpack_mix_float(vertx.halo_blur, drawable.halo_blur_t)), +#endif +#if !defined(HAS_UNIFORM_u_opacity) + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)), +#endif + .tex = half2(a_tex / drawable.texsize), + .gamma_scale = half(position.w), + .fontScale = half(fontScale), + .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolTilePropsUBO* tilePropsVector [[buffer(idSymbolTilePropsUBO)]], + device const SymbolEvaluatedPropsUBO& props [[buffer(idSymbolEvaluatedPropsUBO)]], + texture2d image [[texture(0)]], + sampler image_sampler [[sampler(0)]]) { +#if defined(OVERDRAW_INSPECTOR) + return half4(1.0); +#endif + + device const SymbolTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + +#if defined(HAS_UNIFORM_u_fill_color) + const half4 fill_color = half4(tileProps.is_text ? props.text_fill_color : props.icon_fill_color); +#else + const half4 fill_color = in.fill_color; +#endif +#if defined(HAS_UNIFORM_u_halo_color) + const half4 halo_color = half4(tileProps.is_text ? props.text_halo_color : props.icon_halo_color); +#else + const half4 halo_color = in.halo_color; +#endif +#if defined(HAS_UNIFORM_u_opacity) + const float opacity = tileProps.is_text ? props.text_opacity : props.icon_opacity; +#else + const float opacity = in.opacity; +#endif +#if defined(HAS_UNIFORM_u_halo_width) + const float halo_width = tileProps.is_text ? props.text_halo_width : props.icon_halo_width; +#else + const float halo_width = in.halo_width; +#endif +#if defined(HAS_UNIFORM_u_halo_blur) + const float halo_blur = tileProps.is_text ? props.text_halo_blur : props.icon_halo_blur; +#else + const float halo_blur = in.halo_blur; +#endif + + const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; + const float fontGamma = in.fontScale * tileProps.gamma_scale; + const half4 color = tileProps.is_halo ? halo_color : fill_color; + const float gamma = ((tileProps.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; + const float buff = tileProps.is_halo ? (6.0 - halo_width / in.fontScale) / SDF_PX : (256.0 - 64.0) / 256.0; + const float dist = image.sample(image_sampler, float2(in.tex)).a; + const float gamma_scaled = gamma * in.gamma_scale; + const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); + + return half4(color * (alpha * opacity * in.fade_opacity)); +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr auto name = "SymbolTextAndIconShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto source = SYMBOL_SHADER_COMMON R"( +#define SDF 1.0 +#define ICON 0.0 + +struct VertexStage { + float4 pos_offset [[attribute(symbolUBOCount + 0)]]; + float4 data [[attribute(symbolUBOCount + 1)]]; + float3 projected_pos [[attribute(symbolUBOCount + 2)]]; + float fade_opacity [[attribute(symbolUBOCount + 3)]]; + +#if !defined(HAS_UNIFORM_u_fill_color) + float4 fill_color [[attribute(symbolUBOCount + 4)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + float4 halo_color [[attribute(symbolUBOCount + 5)]]; +#endif +#if !defined(HAS_UNIFORM_u_opacity) + float opacity [[attribute(symbolUBOCount + 6)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + float halo_width [[attribute(symbolUBOCount + 7)]]; +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + float halo_blur [[attribute(symbolUBOCount + 8)]]; +#endif +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + +#if !defined(HAS_UNIFORM_u_fill_color) + half4 fill_color; +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + half4 halo_color; +#endif + + half2 tex; + +#if !defined(HAS_UNIFORM_u_opacity) + half opacity; +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + half halo_width; +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + half halo_blur; +#endif + + half gamma_scale; + half fontScale; + half fade_opacity; + bool is_icon; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const GlobalPaintParamsUBO& paintParams [[buffer(idGlobalPaintParamsUBO)]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolDrawableUBO* drawableVector [[buffer(idSymbolDrawableUBO)]]) { + + device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + + const float2 a_pos = vertx.pos_offset.xy; + const float2 a_offset = vertx.pos_offset.zw; + + const float2 a_tex = vertx.data.xy; + const float2 a_size = vertx.data.zw; + + const float a_size_min = floor(a_size[0] * 0.5); + const float is_sdf = a_size[0] - 2.0 * a_size_min; + + const float segment_angle = -vertx.projected_pos[2]; + + float size; + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = a_size_min / 128.0; + } else { + size = drawable.size; + } + + const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); + const float camera_to_anchor_distance = projectedPoint.w; + // If the label is pitched with the map, layout is done in pitched space, + // which makes labels in the distance smaller relative to viewport space. + // We counteract part of that effect by multiplying by the perspective ratio. + // If the label isn't pitched with the map, we do layout in viewport space, + // which makes labels in the distance larger relative to the features around + // them. We counteract part of that effect by dividing by the perspective ratio. + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; + const float perspective_ratio = clamp( + 0.5 + 0.5 * distance_ratio, + 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles + 4.0); + + size *= perspective_ratio; + + const float fontScale = size / 24.0; + + float symbol_rotation = 0.0; + if (drawable.rotate_symbol) { + // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units + // To figure out that angle in projected space, we draw a short horizontal line in tile + // space, project it, and measure its angle in projected space. + const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); + + const float2 a = projectedPoint.xy / projectedPoint.w; + const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; + + symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); + } + + const float angle_sin = sin(segment_angle + symbol_rotation); + const float angle_cos = cos(segment_angle + symbol_rotation); + const float2x2 rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); + + const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); + const float2 pos_rot = a_offset / 32.0 * fontScale; + const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; + const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); + const float gamma_scale = position.w; + + const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + const bool is_icon = (is_sdf == ICON); + + return { + .position = position, + .tex = half2(a_tex / (is_icon ? drawable.texsize_icon : drawable.texsize)), + .gamma_scale = half(gamma_scale), + .fontScale = half(fontScale), + .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), + .is_icon = is_icon, + +#if !defined(HAS_UNIFORM_u_fill_color) + .fill_color = half(unpack_mix_color(vertx.fill_color, drawable.fill_color_t)); +#endif +#if !defined(HAS_UNIFORM_u_halo_color) + .halo_color = half(unpack_mix_color(vertx.halo_color, drawable.halo_color_t)); +#endif +#if !defined(HAS_UNIFORM_u_opacity) + .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t)); +#endif +#if !defined(HAS_UNIFORM_u_halo_width) + .halo_width = half(unpack_mix_float(vertx.halo_width, drawable.halo_width_t)); +#endif +#if !defined(HAS_UNIFORM_u_halo_blur) + .halo_blur = half(unpack_mix_float(vertx.halo_blur, drawable.halo_blur_t)); +#endif + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const uint32_t& uboIndex [[buffer(idGlobalUBOIndex)]], + device const SymbolTilePropsUBO* tilePropsVector [[buffer(idSymbolTilePropsUBO)]], + device const SymbolEvaluatedPropsUBO& props [[buffer(idSymbolEvaluatedPropsUBO)]], + texture2d glyph_image [[texture(0)]], + texture2d icon_image [[texture(1)]], + sampler glyph_sampler [[sampler(0)]], + sampler icon_sampler [[sampler(1)]]) { +#if defined(OVERDRAW_INSPECTOR) + return half4(1.0); +#endif + + device const SymbolTilePropsUBO& tileProps = tilePropsVector[uboIndex]; + +#if defined(HAS_UNIFORM_u_fill_color) + const half4 fill_color = half4(tileProps.is_text ? props.text_fill_color : props.icon_fill_color); +#else + const half4 fill_color = in.fill_color; +#endif +#if defined(HAS_UNIFORM_u_halo_color) + const half4 halo_color = half4(tileProps.is_text ? props.text_halo_color : props.icon_halo_color); +#else + const half4 halo_color = in.halo_color; +#endif +#if defined(HAS_UNIFORM_u_opacity) + const half opacity = half(tileProps.is_text ? props.text_opacity : props.icon_opacity); +#else + const half opacity = in.opacity; +#endif +#if defined(HAS_UNIFORM_u_halo_width) + const half halo_width = half(tileProps.is_text ? props.text_halo_width : props.icon_halo_width); +#else + const half halo_width = in.halo_width; +#endif +#if defined(HAS_UNIFORM_u_halo_blur) + const half halo_blur = half(tileProps.is_text ? props.text_halo_blur : props.icon_halo_blur); +#else + const half halo_blur = in.halo_blur; +#endif + + if (in.is_icon) { + const float alpha = opacity * in.fade_opacity; + return half4(icon_image.sample(icon_sampler, float2(in.tex)) * alpha); + } + + const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; + const half4 color = tileProps.is_halo ? halo_color : fill_color; + const float fontGamma = in.fontScale * tileProps.gamma_scale; + const float gamma = ((tileProps.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; + const float buff = tileProps.is_halo ? (6.0 - halo_width / in.fontScale) / SDF_PX : (256.0 - 64.0) / 256.0; + const float dist = glyph_image.sample(glyph_sampler, float2(in.tex)).a; + const float gamma_scaled = gamma * in.gamma_scale; + const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); + + return half4(color * (alpha * opacity * in.fade_opacity)); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/symbol_icon.hpp b/include/mbgl/shaders/mtl/symbol_icon.hpp deleted file mode 100644 index 31ebaf5ff931..000000000000 --- a/include/mbgl/shaders/mtl/symbol_icon.hpp +++ /dev/null @@ -1,145 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "SymbolIconShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( -struct VertexStage { - float4 pos_offset [[attribute(5)]]; - float4 data [[attribute(6)]]; - float4 pixeloffset [[attribute(7)]]; - float3 projected_pos [[attribute(8)]]; - float fade_opacity [[attribute(9)]]; - -#if !defined(HAS_UNIFORM_u_opacity) - float opacity [[attribute(10)]]; -#endif -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - half2 tex; - -#if defined(HAS_UNIFORM_u_opacity) - // We only need to pass `fade_opacity` separately if opacity is a - // uniform, otherwise it's multiplied into fragment opacity, below. - half fade_opacity; -#else - half opacity; -#endif -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const SymbolDrawableUBO& drawable [[buffer(1)]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolInterpolateUBO& interp [[buffer(3)]]) { - - const float2 a_pos = vertx.pos_offset.xy; - const float2 a_offset = vertx.pos_offset.zw; - - const float2 a_tex = vertx.data.xy; - const float2 a_size = vertx.data.zw; - - const float a_size_min = floor(a_size[0] * 0.5); - const float2 a_pxoffset = vertx.pixeloffset.xy; - const float2 a_minFontScale = vertx.pixeloffset.zw / 256.0; - - const float segment_angle = -vertx.projected_pos[2]; - - float size; - if (!tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tileprops.size_t) / 128.0; - } else if (tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = tileprops.size; - } - - const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); - const float camera_to_anchor_distance = projectedPoint.w; - // See comments in symbol_sdf.vertex - const float distance_ratio = tileprops.pitch_with_map ? - camera_to_anchor_distance / paintParams.camera_to_center_distance : - paintParams.camera_to_center_distance / camera_to_anchor_distance; - const float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - const float fontScale = tileprops.is_text ? size / 24.0 : size; - - float symbol_rotation = 0.0; - if (drawable.rotate_symbol) { - // See comments in symbol_sdf.vertex - const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); - - const float2 a = projectedPoint.xy / projectedPoint.w; - const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); - } - - const float angle_sin = sin(segment_angle + symbol_rotation); - const float angle_cos = cos(segment_angle + symbol_rotation); - const float2x2 rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); - const float2 pos0 = projected_pos.xy / projected_pos.w; - const float2 posOffset = a_offset * max(a_minFontScale, fontScale) / 32.0 + a_pxoffset / 16.0; - const float4 position = drawable.coord_matrix * float4(pos0 + rotation_matrix * posOffset, 0.0, 1.0); - - const float2 raw_fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; - const float fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); - - return { - .position = position, - .tex = half2(a_tex / drawable.texsize), -#if defined(HAS_UNIFORM_u_opacity) - .fade_opacity = half(fade_opacity), -#else - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t) * fade_opacity), -#endif - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolEvaluatedPropsUBO& props [[buffer(4)]], - texture2d image [[texture(0)]], - sampler image_sampler [[sampler(0)]]) { -#if defined(OVERDRAW_INSPECTOR) - return half4(1.0); -#endif - -#if defined(HAS_UNIFORM_u_opacity) - const float opacity = (tileprops.is_text ? props.text_opacity : props.icon_opacity) * in.fade_opacity; -#else - const float opacity = in.opacity; // fade_opacity is baked in for this case -#endif - - return half4(image.sample(image_sampler, float2(in.tex)) * opacity); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/symbol_sdf.hpp b/include/mbgl/shaders/mtl/symbol_sdf.hpp deleted file mode 100644 index c4c784d059ea..000000000000 --- a/include/mbgl/shaders/mtl/symbol_sdf.hpp +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "SymbolSDFIconShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( -struct VertexStage { - float4 pos_offset [[attribute(5)]]; - float4 data [[attribute(6)]]; - float4 pixeloffset [[attribute(7)]]; - float3 projected_pos [[attribute(8)]]; - float fade_opacity [[attribute(9)]]; - -#if !defined(HAS_UNIFORM_u_fill_color) - float4 fill_color [[attribute(10)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - float4 halo_color [[attribute(11)]]; -#endif -#if !defined(HAS_UNIFORM_u_opacity) - float opacity [[attribute(12)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - float halo_width [[attribute(13)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - float halo_blur [[attribute(14)]]; -#endif -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - -#if !defined(HAS_UNIFORM_u_fill_color) - half4 fill_color; -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - half4 halo_color; -#endif - - half2 tex; - half gamma_scale; - half fontScale; - half fade_opacity; - -#if !defined(HAS_UNIFORM_u_opacity) - half opacity; -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - half halo_width; -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - half halo_blur; -#endif -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const SymbolDrawableUBO& drawable [[buffer(1)]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolInterpolateUBO& interp [[buffer(3)]]) { - - const float2 a_pos = vertx.pos_offset.xy; - const float2 a_offset = vertx.pos_offset.zw; - - const float2 a_tex = vertx.data.xy; - const float2 a_size = vertx.data.zw; - - const float a_size_min = floor(a_size[0] * 0.5); - const float2 a_pxoffset = vertx.pixeloffset.xy; - - const float segment_angle = -vertx.projected_pos[2]; - - float size; - if (!tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tileprops.size_t) / 128.0; - } else if (tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = tileprops.size; - } - - const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); - const float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - const float distance_ratio = tileprops.pitch_with_map ? - camera_to_anchor_distance / paintParams.camera_to_center_distance : - paintParams.camera_to_center_distance / camera_to_anchor_distance; - const float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - const float fontScale = tileprops.is_text ? size / 24.0 : size; - - float symbol_rotation = 0.0; - if (drawable.rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); - - const float2 a = projectedPoint.xy / projectedPoint.w; - const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); - } - - const float angle_sin = sin(segment_angle + symbol_rotation); - const float angle_cos = cos(segment_angle + symbol_rotation); - const auto rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); - const float2 pos_rot = a_offset / 32.0 * fontScale + a_pxoffset; - const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; - const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); - const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; - - return { - .position = position, -#if !defined(HAS_UNIFORM_u_fill_color) - .fill_color = half4(unpack_mix_color(vertx.fill_color, interp.fill_color_t)), -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - .halo_color = half4(unpack_mix_color(vertx.halo_color, interp.halo_color_t)), -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - .halo_width = half(unpack_mix_float(vertx.halo_width, interp.halo_width_t)), -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - .halo_blur = half(unpack_mix_float(vertx.halo_blur, interp.halo_blur_t)), -#endif -#if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)), -#endif - .tex = half2(a_tex / drawable.texsize), - .gamma_scale = half(position.w), - .fontScale = half(fontScale), - .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const SymbolDrawableUBO& drawable [[buffer(1)]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolEvaluatedPropsUBO& props [[buffer(4)]], - texture2d image [[texture(0)]], - sampler image_sampler [[sampler(0)]]) { -#if defined(OVERDRAW_INSPECTOR) - return half4(1.0); -#endif - -#if defined(HAS_UNIFORM_u_fill_color) - const half4 fill_color = half4(tileprops.is_text ? props.text_fill_color : props.icon_fill_color); -#else - const half4 fill_color = in.fill_color; -#endif -#if defined(HAS_UNIFORM_u_halo_color) - const half4 halo_color = half4(tileprops.is_text ? props.text_halo_color : props.icon_halo_color); -#else - const half4 halo_color = in.halo_color; -#endif -#if defined(HAS_UNIFORM_u_opacity) - const float opacity = tileprops.is_text ? props.text_opacity : props.icon_opacity; -#else - const float opacity = in.opacity; -#endif -#if defined(HAS_UNIFORM_u_halo_width) - const float halo_width = tileprops.is_text ? props.text_halo_width : props.icon_halo_width; -#else - const float halo_width = in.halo_width; -#endif -#if defined(HAS_UNIFORM_u_halo_blur) - const float halo_blur = tileprops.is_text ? props.text_halo_blur : props.icon_halo_blur; -#else - const float halo_blur = in.halo_blur; -#endif - - const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - const float fontGamma = in.fontScale * drawable.gamma_scale; - const half4 color = tileprops.is_halo ? halo_color : fill_color; - const float gamma = ((tileprops.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; - const float buff = tileprops.is_halo ? (6.0 - halo_width / in.fontScale) / SDF_PX : (256.0 - 64.0) / 256.0; - const float dist = image.sample(image_sampler, float2(in.tex)).a; - const float gamma_scaled = gamma * in.gamma_scale; - const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - return half4(color * (alpha * opacity * in.fade_opacity)); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/symbol_text_and_icon.hpp b/include/mbgl/shaders/mtl/symbol_text_and_icon.hpp deleted file mode 100644 index 195150c16c37..000000000000 --- a/include/mbgl/shaders/mtl/symbol_text_and_icon.hpp +++ /dev/null @@ -1,234 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr auto name = "SymbolTextAndIconShader"; - static constexpr auto vertexMainFunction = "vertexMain"; - static constexpr auto fragmentMainFunction = "fragmentMain"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto source = R"( -#define SDF 1.0 -#define ICON 0.0 - -struct VertexStage { - float4 pos_offset [[attribute(5)]]; - float4 data [[attribute(6)]]; - float3 projected_pos [[attribute(7)]]; - float fade_opacity [[attribute(8)]]; - -#if !defined(HAS_UNIFORM_u_fill_color) - float4 fill_color [[attribute(9)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - float4 halo_color [[attribute(10)]]; -#endif -#if !defined(HAS_UNIFORM_u_opacity) - float opacity [[attribute(11)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - float halo_width [[attribute(12)]]; -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - float halo_blur [[attribute(13)]]; -#endif -}; - -struct FragmentStage { - float4 position [[position, invariant]]; - -#if !defined(HAS_UNIFORM_u_fill_color) - half4 fill_color; -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - half4 halo_color; -#endif - - half2 tex; - -#if !defined(HAS_UNIFORM_u_opacity) - half opacity; -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - half halo_width; -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - half halo_blur; -#endif - - half gamma_scale; - half fontScale; - half fade_opacity; - bool is_icon; -}; - -FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], - device const GlobalPaintParamsUBO& paintParams [[buffer(0)]], - device const SymbolDrawableUBO& drawable [[buffer(1)]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolInterpolateUBO& interp [[buffer(3)]]) { - - const float2 a_pos = vertx.pos_offset.xy; - const float2 a_offset = vertx.pos_offset.zw; - - const float2 a_tex = vertx.data.xy; - const float2 a_size = vertx.data.zw; - - const float a_size_min = floor(a_size[0] * 0.5); - const float is_sdf = a_size[0] - 2.0 * a_size_min; - - const float segment_angle = -vertx.projected_pos[2]; - - float size; - if (!tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tileprops.size_t) / 128.0; - } else if (tileprops.is_size_zoom_constant && !tileprops.is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = tileprops.size; - } - - const float4 projectedPoint = drawable.matrix * float4(a_pos, 0, 1); - const float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - const float distance_ratio = tileprops.pitch_with_map ? - camera_to_anchor_distance / paintParams.camera_to_center_distance : - paintParams.camera_to_center_distance / camera_to_anchor_distance; - const float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - const float fontScale = size / 24.0; - - float symbol_rotation = 0.0; - if (drawable.rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - const float4 offsetProjectedPoint = drawable.matrix * float4(a_pos + float2(1, 0), 0, 1); - - const float2 a = projectedPoint.xy / projectedPoint.w; - const float2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan2((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); - } - - const float angle_sin = sin(segment_angle + symbol_rotation); - const float angle_cos = cos(segment_angle + symbol_rotation); - const float2x2 rotation_matrix = float2x2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - const float4 projected_pos = drawable.label_plane_matrix * float4(vertx.projected_pos.xy, 0.0, 1.0); - const float2 pos_rot = a_offset / 32.0 * fontScale; - const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; - const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); - const float gamma_scale = position.w; - - const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; - const bool is_icon = (is_sdf == ICON); - - return { - .position = position, - .tex = half2(a_tex / (is_icon ? drawable.texsize_icon : drawable.texsize)), - .gamma_scale = half(gamma_scale), - .fontScale = half(fontScale), - .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), - .is_icon = is_icon, - -#if !defined(HAS_UNIFORM_u_fill_color) - .fill_color = half(unpack_mix_color(vertx.fill_color, interp.fill_color_t)); -#endif -#if !defined(HAS_UNIFORM_u_halo_color) - .halo_color = half(unpack_mix_color(vertx.halo_color, interp.halo_color_t)); -#endif -#if !defined(HAS_UNIFORM_u_opacity) - .opacity = half(unpack_mix_float(vertx.opacity, interp.opacity_t)); -#endif -#if !defined(HAS_UNIFORM_u_halo_width) - .halo_width = half(unpack_mix_float(vertx.halo_width, interp.halo_width_t)); -#endif -#if !defined(HAS_UNIFORM_u_halo_blur) - .halo_blur = half(unpack_mix_float(vertx.halo_blur, interp.halo_blur_t)); -#endif - }; -} - -half4 fragment fragmentMain(FragmentStage in [[stage_in]], - device const SymbolDrawableUBO& drawable [[buffer(1)]], - device const SymbolTilePropsUBO& tileprops [[buffer(2)]], - device const SymbolEvaluatedPropsUBO& props [[buffer(4)]], - texture2d glyph_image [[texture(0)]], - texture2d icon_image [[texture(1)]], - sampler glyph_sampler [[sampler(0)]], - sampler icon_sampler [[sampler(1)]]) { -#if defined(OVERDRAW_INSPECTOR) - return half4(1.0); -#endif - -#if defined(HAS_UNIFORM_u_fill_color) - const half4 fill_color = half4(tileprops.is_text ? props.text_fill_color : props.icon_fill_color); -#else - const half4 fill_color = in.fill_color; -#endif -#if defined(HAS_UNIFORM_u_halo_color) - const half4 halo_color = half4(tileprops.is_text ? props.text_halo_color : props.icon_halo_color); -#else - const half4 halo_color = in.halo_color; -#endif -#if defined(HAS_UNIFORM_u_opacity) - const half opacity = half(tileprops.is_text ? props.text_opacity : props.icon_opacity); -#else - const half opacity = in.opacity; -#endif -#if defined(HAS_UNIFORM_u_halo_width) - const half halo_width = half(tileprops.is_text ? props.text_halo_width : props.icon_halo_width); -#else - const half halo_width = in.halo_width; -#endif -#if defined(HAS_UNIFORM_u_halo_blur) - const half halo_blur = half(tileprops.is_text ? props.text_halo_blur : props.icon_halo_blur); -#else - const half halo_blur = in.halo_blur; -#endif - - if (in.is_icon) { - const float alpha = opacity * in.fade_opacity; - return half4(icon_image.sample(icon_sampler, float2(in.tex)) * alpha); - } - - const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - const half4 color = tileprops.is_halo ? halo_color : fill_color; - const float fontGamma = in.fontScale * drawable.gamma_scale; - const float gamma = ((tileprops.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; - const float buff = tileprops.is_halo ? (6.0 - halo_width / in.fontScale) / SDF_PX : (256.0 - 64.0) / 256.0; - const float dist = glyph_image.sample(glyph_sampler, float2(in.tex)).a; - const float gamma_scaled = gamma * in.gamma_scale; - const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - return half4(color * (alpha * opacity * in.fade_opacity)); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/widevector.hpp b/include/mbgl/shaders/mtl/widevector.hpp index 59fa51f2afe6..ba18276c5c63 100644 --- a/include/mbgl/shaders/mtl/widevector.hpp +++ b/include/mbgl/shaders/mtl/widevector.hpp @@ -1,36 +1,34 @@ #pragma once +#include #include -#include #include -#include -#include namespace mbgl { namespace shaders { +#define WIDEVECTOR_SHADER_PRELUDE \ + R"( + +enum { + idWideVectorUniformsUBO = idDrawableReservedVertexOnlyUBO, + idWideVectorUniformWideVecUBO = drawableReservedUBOCount, + wideVectorUBOCount +}; + +)" + template <> struct ShaderSource { static constexpr auto name = "WideVectorShader"; static constexpr auto vertexMainFunction = "vertexTri_wideVecPerf"; static constexpr auto fragmentMainFunction = "fragmentTri_wideVecPerf"; - static constexpr std::array uniforms{ - UniformBlockInfo{true, false, sizeof(WideVectorUniformsUBO), idWideVectorUniformsUBO}, - UniformBlockInfo{true, false, sizeof(WideVectorUniformWideVecUBO), idWideVectorUniformWideVecUBO}, - }; - static constexpr std::array attributes{ - AttributeInfo{wideVectorDrawableUBOCount + 0, gfx::AttributeDataType::Float3, idWideVectorScreenPos}, - AttributeInfo{wideVectorDrawableUBOCount + 1, gfx::AttributeDataType::Float4, idWideVectorColor}, - AttributeInfo{wideVectorDrawableUBOCount + 2, gfx::AttributeDataType::Int, idWideVectorIndex}}; - static constexpr std::array instanceAttributes{ - AttributeInfo{wideVectorDrawableUBOCount + 3, gfx::AttributeDataType::Float3, idWideVectorInstanceCenter}, - AttributeInfo{wideVectorDrawableUBOCount + 3, gfx::AttributeDataType::Float4, idWideVectorInstanceColor}, - AttributeInfo{wideVectorDrawableUBOCount + 3, gfx::AttributeDataType::Int, idWideVectorInstancePrevious}, - AttributeInfo{wideVectorDrawableUBOCount + 3, gfx::AttributeDataType::Int, idWideVectorInstanceNext}}; - static constexpr std::array textures{}; - - static constexpr auto source = R"( + static const std::array attributes; + static const std::array instanceAttributes; + static const std::array textures; + + static constexpr auto source = WIDEVECTOR_SHADER_PRELUDE R"( #include namespace WhirlyKitShader @@ -113,9 +111,9 @@ typedef struct struct VertexTriWideVecB { // x, y offset around the center - float3 screenPos [[attribute(3)]]; - float4 color [[attribute(4)]]; - int index [[attribute(5)]]; + float3 screenPos [[attribute(wideVectorUBOCount + 0)]]; + float4 color [[attribute(wideVectorUBOCount + 1)]]; + int index [[attribute(wideVectorUBOCount + 2)]]; }; // Wide vector vertex passed to fragment shader (new version) @@ -222,10 +220,10 @@ constant constexpr float4 discardPt(0,0,-1e6,NAN); // Performance version of wide vector shader vertex ProjVertexTriWideVecPerf vertexTri_wideVecPerf( thread const VertexTriWideVecB vert [[ stage_in ]], - constant Uniforms &uniforms [[ buffer(1) ]], - constant UniformWideVec &wideVec [[ buffer(2) ]], + constant Uniforms &uniforms [[ buffer(idWideVectorUniformsUBO) ]], + constant UniformWideVec &wideVec [[ buffer(idWideVectorUniformWideVecUBO) ]], uint instanceID [[ instance_id ]], - constant VertexTriWideVecInstance *wideVecInsts [[ buffer(6) ]]) + constant VertexTriWideVecInstance *wideVecInsts [[ buffer(wideVectorUBOCount + 3) ]]) { ProjVertexTriWideVecPerf outVert = { .position = discardPt, @@ -564,7 +562,7 @@ vertex ProjVertexTriWideVecPerf vertexTri_wideVecPerf( // Fragment shader that takes the back of the globe into account fragment float4 fragmentTri_wideVecPerf( ProjVertexTriWideVecPerf vert [[stage_in]], - constant Uniforms &uniforms [[ buffer(1) ]]) + constant Uniforms &uniforms [[ buffer(idWideVectorUniformsUBO) ]]) { float patternAlpha = 1.0; diff --git a/include/mbgl/shaders/raster_layer_ubo.hpp b/include/mbgl/shaders/raster_layer_ubo.hpp index 4e3c9a523c15..0e96d9c47137 100644 --- a/include/mbgl/shaders/raster_layer_ubo.hpp +++ b/include/mbgl/shaders/raster_layer_ubo.hpp @@ -6,24 +6,28 @@ namespace mbgl { namespace shaders { struct alignas(16) RasterDrawableUBO { - std::array matrix; + /* 0 */ std::array matrix; + /* 64 */ }; -static_assert(sizeof(RasterDrawableUBO) == 64); +static_assert(sizeof(RasterDrawableUBO) == 4 * 16); +/// Evaluated properties that do not depend on the tile struct alignas(16) RasterEvaluatedPropsUBO { - std::array spin_weights; - std::array tl_parent; - float scale_parent; - float buffer_scale; - float fade_t; - float opacity; - float brightness_low; - float brightness_high; - float saturation_factor; - float contrast_factor; - float pad1, pad2; + /* 0 */ std::array spin_weights; + /* 16 */ std::array tl_parent; + /* 24 */ float scale_parent; + /* 28 */ float buffer_scale; + /* 32 */ float fade_t; + /* 36 */ float opacity; + /* 40 */ float brightness_low; + /* 44 */ float brightness_high; + /* 48 */ float saturation_factor; + /* 52 */ float contrast_factor; + /* 56 */ float pad1; + /* 60 */ float pad2; + /* 64 */ }; -static_assert(sizeof(RasterEvaluatedPropsUBO) == 64); +static_assert(sizeof(RasterEvaluatedPropsUBO) == 4 * 16); } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/shader_defines.hpp b/include/mbgl/shaders/shader_defines.hpp index 997a41bc9bde..557921146e25 100644 --- a/include/mbgl/shaders/shader_defines.hpp +++ b/include/mbgl/shaders/shader_defines.hpp @@ -10,109 +10,112 @@ namespace shaders { // drawable UBOs enum { - idClippingMaskUBO = globalUBOCount, - clippingMaskUBOCount + idBackgroundDrawableUBO = idDrawableReservedVertexOnlyUBO, + backgroundDrawableUBOCount = drawableReservedUBOCount }; enum { - idCommonUBO = globalUBOCount, - commonDrawableUBOCount + idCircleDrawableUBO = idDrawableReservedVertexOnlyUBO, + circleDrawableUBOCount = drawableReservedUBOCount }; enum { - idCircleDrawableUBO = globalUBOCount, - idCircleInterpolateUBO, - circleDrawableUBOCount + idClippingMaskUBO = idDrawableReservedVertexOnlyUBO, + clippingMaskDrawableUBOCount = drawableReservedUBOCount }; enum { - idBackgroundDrawableUBO = globalUBOCount, - backgroundDrawableUBOCount -}; - -enum { - idCustomSymbolDrawableUBO = globalUBOCount, - idCustomSymbolParametersUBO, - customSymbolDrawableUBOCount + idCollisionDrawableUBO = idDrawableReservedVertexOnlyUBO, + idCollisionTilePropsUBO = drawableReservedUBOCount, + collisionDrawableUBOCount }; enum { - idCollisionUBO = globalUBOCount, - collisionDrawableUBOCount + idCustomSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, + customSymbolDrawableUBOCount = drawableReservedUBOCount }; enum { - idDebugUBO = globalUBOCount, + idDebugUBO = drawableReservedUBOCount, debugDrawableUBOCount }; enum { - idFillDrawableUBO = globalUBOCount, - idFillTilePropsUBO, - idFillInterpolateUBO, + idFillDrawableUBO = idDrawableReservedVertexOnlyUBO, + idFillTilePropsUBO = drawableReservedUBOCount, fillDrawableUBOCount }; enum { - idFillExtrusionDrawableUBO = globalUBOCount, - idFillExtrusionTilePropsUBO, - idFillExtrusionInterpolateUBO, + idFillExtrusionDrawableUBO = idDrawableReservedVertexOnlyUBO, + idFillExtrusionTilePropsUBO = drawableReservedUBOCount, fillExtrusionDrawableUBOCount }; enum { - idHeatmapDrawableUBO = globalUBOCount, - idHeatmapInterpolateUBO, - heatmapDrawableUBOCount + idHeatmapDrawableUBO = idDrawableReservedVertexOnlyUBO, + heatmapDrawableUBOCount = drawableReservedUBOCount }; enum { - idHillshadeDrawableUBO = globalUBOCount, - hillshadeDrawableUBOCount + heatmapTextureDrawableUBOCount = drawableReservedUBOCount }; enum { - idHillshadePrepareDrawableUBO = globalUBOCount, + idHillshadeDrawableUBO = idDrawableReservedVertexOnlyUBO, + idHillshadeTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + hillshadeDrawableUBOCount = drawableReservedUBOCount +}; + +enum { + idHillshadePrepareDrawableUBO = idDrawableReservedVertexOnlyUBO, + idHillshadePrepareTilePropsUBO = drawableReservedUBOCount, hillshadePrepareDrawableUBOCount }; enum { - idLineDrawableUBO = globalUBOCount, - idLineInterpolationUBO, - idLineTilePropertiesUBO, - lineDrawableUBOCount + idLineDrawableUBO = idDrawableReservedVertexOnlyUBO, + idLineTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + lineDrawableUBOCount = drawableReservedUBOCount +}; + +enum { + idLocationIndicatorDrawableUBO = drawableReservedUBOCount, + locationIndicatorDrawableUBOCount }; enum { - idRasterDrawableUBO = globalUBOCount, - rasterDrawableUBOCount + idRasterDrawableUBO = idDrawableReservedVertexOnlyUBO, + rasterDrawableUBOCount = drawableReservedUBOCount }; enum { - idSymbolDrawableUBO = globalUBOCount, - idSymbolTilePropsUBO, - idSymbolInterpolateUBO, - symbolDrawableUBOCount + idSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, + idSymbolTilePropsUBO = idDrawableReservedFragmentOnlyUBO, + symbolDrawableUBOCount = drawableReservedUBOCount }; enum { - idWideVectorUniformsUBO = globalUBOCount, - idWideVectorUniformWideVecUBO, + idWideVectorUniformsUBO = idDrawableReservedVertexOnlyUBO, + idWideVectorUniformWideVecUBO = drawableReservedUBOCount, wideVectorDrawableUBOCount }; -static constexpr auto layerUBOStartId = std::max({static_cast(circleDrawableUBOCount), - static_cast(backgroundDrawableUBOCount), - static_cast(customSymbolDrawableUBOCount), +static constexpr auto layerSSBOStartId = globalUBOCount; +static constexpr auto layerUBOStartId = std::max({static_cast(backgroundDrawableUBOCount), + static_cast(circleDrawableUBOCount), + static_cast(clippingMaskDrawableUBOCount), static_cast(collisionDrawableUBOCount), - static_cast(commonDrawableUBOCount), + static_cast(customSymbolDrawableUBOCount), static_cast(debugDrawableUBOCount), static_cast(fillDrawableUBOCount), static_cast(fillExtrusionDrawableUBOCount), static_cast(heatmapDrawableUBOCount), + static_cast(heatmapTextureDrawableUBOCount), static_cast(hillshadeDrawableUBOCount), static_cast(hillshadePrepareDrawableUBOCount), static_cast(lineDrawableUBOCount), + static_cast(locationIndicatorDrawableUBOCount), static_cast(rasterDrawableUBOCount), static_cast(symbolDrawableUBOCount), static_cast(wideVectorDrawableUBOCount)}); @@ -127,14 +130,30 @@ static constexpr auto maxUBOCountPerDrawable = layerUBOStartId - globalUBOCount; #define getLayerStartValue(packedValue) packedValue #endif +enum { + idBackgroundPropsUBO = getLayerStartValue(backgroundDrawableUBOCount), + backgroundUBOCount +}; + enum { idCircleEvaluatedPropsUBO = getLayerStartValue(circleDrawableUBOCount), circleUBOCount }; enum { - idBackgroundLayerUBO = getLayerStartValue(backgroundDrawableUBOCount), - backgroundUBOCount + clippingMaskUBOCount = getLayerStartValue(clippingMaskDrawableUBOCount) +}; + +enum { + collisionUBOCount = getLayerStartValue(collisionDrawableUBOCount) +}; + +enum { + customSymbolUBOCount = getLayerStartValue(customSymbolDrawableUBOCount) +}; + +enum { + debugUBOCount = getLayerStartValue(debugDrawableUBOCount) }; enum { @@ -153,7 +172,7 @@ enum { }; enum { - idHeatmapTexturePropsUBO = getLayerStartValue(globalUBOCount), + idHeatmapTexturePropsUBO = getLayerStartValue(heatmapTextureDrawableUBOCount), heatmapTextureUBOCount }; @@ -162,12 +181,20 @@ enum { hillshadeUBOCount }; +enum { + hillshadePrepareUBOCount = getLayerStartValue(hillshadePrepareDrawableUBOCount) +}; + enum { idLineEvaluatedPropsUBO = getLayerStartValue(lineDrawableUBOCount), idLineExpressionUBO, lineUBOCount }; +enum { + locationIndicatorUBOCount = getLayerStartValue(locationIndicatorDrawableUBOCount) +}; + enum { idRasterEvaluatedPropsUBO = getLayerStartValue(rasterDrawableUBOCount), rasterUBOCount @@ -178,19 +205,31 @@ enum { symbolUBOCount }; +enum { + wideVectorUBOCount = getLayerStartValue(wideVectorDrawableUBOCount) +}; + #undef getLayerStartValue -static constexpr auto maxUBOCountPerShader = std::max({static_cast(circleUBOCount), +static constexpr auto maxUBOCountPerShader = std::max({static_cast(backgroundUBOCount), + static_cast(circleUBOCount), static_cast(clippingMaskUBOCount), + static_cast(collisionUBOCount), + static_cast(customSymbolUBOCount), + static_cast(debugUBOCount), static_cast(fillUBOCount), static_cast(fillExtrusionUBOCount), static_cast(heatmapUBOCount), static_cast(heatmapTextureUBOCount), static_cast(hillshadeUBOCount), + static_cast(hillshadePrepareUBOCount), static_cast(lineUBOCount), + static_cast(locationIndicatorUBOCount), static_cast(rasterUBOCount), - static_cast(symbolUBOCount)}); + static_cast(symbolUBOCount), + static_cast(wideVectorUBOCount)}); +static constexpr auto maxSSBOCountPerLayer = maxUBOCountPerDrawable; static constexpr auto maxUBOCountPerLayer = maxUBOCountPerShader - layerUBOStartId; // Texture defines diff --git a/include/mbgl/shaders/shader_manifest.hpp b/include/mbgl/shaders/shader_manifest.hpp index 451eeecc935c..79b6e38ea5c8 100644 --- a/include/mbgl/shaders/shader_manifest.hpp +++ b/include/mbgl/shaders/shader_manifest.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -23,12 +24,13 @@ #include #include #include +#include +#include #include #include #include #include #include -#include #include #include #include diff --git a/include/mbgl/shaders/shader_program_base.hpp b/include/mbgl/shaders/shader_program_base.hpp index 7c4e4b678d79..b27160586351 100644 --- a/include/mbgl/shaders/shader_program_base.hpp +++ b/include/mbgl/shaders/shader_program_base.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include @@ -34,18 +33,12 @@ class ShaderProgramBase : public gfx::Shader { /// @param name uniform name virtual std::optional getSamplerLocation(const size_t) const = 0; - /// Get the available uniform blocks attached to this shader - virtual const gfx::UniformBlockArray& getUniformBlocks() const = 0; - /// Get the available vertex attributes and their default values virtual const gfx::VertexAttributeArray& getVertexAttributes() const = 0; /// Get the available instance attributes and their default values virtual const gfx::VertexAttributeArray& getInstanceAttributes() const = 0; -protected: - virtual gfx::UniformBlockArray& mutableUniformBlocks() = 0; - protected: util::SimpleIdentity shaderProgramID; }; diff --git a/include/mbgl/shaders/shader_source.hpp b/include/mbgl/shaders/shader_source.hpp index debb932ea862..167b95647f94 100644 --- a/include/mbgl/shaders/shader_source.hpp +++ b/include/mbgl/shaders/shader_source.hpp @@ -14,8 +14,7 @@ enum class BuiltIn { CircleShader, CollisionBoxShader, CollisionCircleShader, - CommonShader, - CommonTexturedShader, + CustomSymbolIconShader, DebugShader, FillShader, FillOutlineShader, @@ -31,12 +30,13 @@ enum class BuiltIn { LineShader, LineGradientShader, LinePatternShader, + LocationIndicatorShader, + LocationIndicatorTexturedShader, LineSDFShader, RasterShader, SymbolIconShader, SymbolSDFIconShader, SymbolTextAndIconShader, - CustomSymbolIconShader, WideVectorShader, Prelude, BackgroundProgram, diff --git a/include/mbgl/shaders/symbol_layer_ubo.hpp b/include/mbgl/shaders/symbol_layer_ubo.hpp index ca1f6917397e..84f176d0dc63 100644 --- a/include/mbgl/shaders/symbol_layer_ubo.hpp +++ b/include/mbgl/shaders/symbol_layer_ubo.hpp @@ -13,39 +13,33 @@ struct alignas(16) SymbolDrawableUBO { /* 192 */ std::array texsize; /* 200 */ std::array texsize_icon; - /* 208 */ float gamma_scale; + /* 208 */ /*bool*/ int is_text_prop; /* 212 */ /*bool*/ int rotate_symbol; - - /* 216 */ std::array pad; - /* 224 */ + /* 216 */ /*bool*/ int pitch_with_map; + /* 220 */ /*bool*/ int is_size_zoom_constant; + /* 224 */ /*bool*/ int is_size_feature_constant; + + /* 228 */ float size_t; + /* 232 */ float size; + + // Interpolations + /* 236 */ float fill_color_t; + /* 240 */ float halo_color_t; + /* 244 */ float opacity_t; + /* 248 */ float halo_width_t; + /* 252 */ float halo_blur_t; + /* 256 */ }; -static_assert(sizeof(SymbolDrawableUBO) == 14 * 16); +static_assert(sizeof(SymbolDrawableUBO) == 16 * 16); -/// Evaluated properties that depend on the tile struct alignas(16) SymbolTilePropsUBO { /* 0 */ /*bool*/ int is_text; /* 4 */ /*bool*/ int is_halo; - /* 8 */ /*bool*/ int pitch_with_map; - /* 12 */ /*bool*/ int is_size_zoom_constant; - /* 16 */ /*bool*/ int is_size_feature_constant; - /* 20 */ float size_t; - /* 24 */ float size; - /* 28 */ float padding; - /* 32 */ -}; -static_assert(sizeof(SymbolTilePropsUBO) == 2 * 16); - -/// Attribute interpolations -struct alignas(16) SymbolInterpolateUBO { - /* 0 */ float fill_color_t; - /* 4 */ float halo_color_t; - /* 8 */ float opacity_t; - /* 12 */ float halo_width_t; - /* 16 */ float halo_blur_t; - /* 20 */ float pad1, pad2, pad3; - /* 32 */ + /* 8 */ float gamma_scale; + /* 12 */ float pad1; + /* 16 */ }; -static_assert(sizeof(SymbolInterpolateUBO) == 32); +static_assert(sizeof(SymbolTilePropsUBO) == 16); /// Evaluated properties that do not depend on the tile struct alignas(16) SymbolEvaluatedPropsUBO { diff --git a/include/mbgl/shaders/vulkan/background.hpp b/include/mbgl/shaders/vulkan/background.hpp index 63a760df8b52..2fa7df3478d4 100644 --- a/include/mbgl/shaders/vulkan/background.hpp +++ b/include/mbgl/shaders/vulkan/background.hpp @@ -6,37 +6,58 @@ namespace mbgl { namespace shaders { +#define BACKGROUND_SHADER_COMMON \ + R"( + +#define idBackgroundDrawableUBO idDrawableReservedVertexOnlyUBO +#define idBackgroundPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "BackgroundShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = BACKGROUND_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform BackgroundDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct BackgroundDrawableUBO { mat4 matrix; -} drawable; + vec4 pad1; + vec4 pad2; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idBackgroundDrawableUBO) readonly buffer BackgroundDrawableUBOVector { + BackgroundDrawableUBO drawable_ubo[]; +} drawableVector; void main() { + const BackgroundDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); applySurfaceTransform(); } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = BACKGROUND_SHADER_COMMON R"( layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform BackgroundLayerUBO { +layout(set = LAYER_SET_INDEX, binding = idBackgroundPropsUBO) uniform BackgroundPropsUBO { vec4 color; float opacity; - float pad1, pad2, pad3; -} layer; + float pad1; + float pad2; + float pad3; +} props; void main() { @@ -45,7 +66,7 @@ void main() { return; #endif - out_color = layer.color * layer.opacity; + out_color = props.color * props.opacity; } )"; }; @@ -54,24 +75,32 @@ template <> struct ShaderSource { static constexpr const char* name = "BackgroundPatternShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( - + static constexpr auto vertex = BACKGROUND_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform BackgroundPatternDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct BackgroundPatternDrawableUBO { mat4 matrix; vec2 pixel_coord_upper; vec2 pixel_coord_lower; float tile_units_to_pixels; - float pad1, pad2, pad3; -} drawable; + float pad1; + float pad2; + float pad3; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idBackgroundDrawableUBO) readonly buffer BackgroundPatternDrawableUBOVector { + BackgroundPatternDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform BackgroundPatternLayerUBO { +layout(set = LAYER_SET_INDEX, binding = idBackgroundPropsUBO) uniform BackgroundPatternPropsUBO { vec2 pattern_tl_a; vec2 pattern_br_a; vec2 pattern_tl_b; @@ -82,21 +111,22 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform BackgroundPatternLayerUBO { float scale_b; float mix; float opacity; -} layer; +} props; layout(location = 0) out vec2 frag_pos_a; layout(location = 1) out vec2 frag_pos_b; void main() { + const BackgroundPatternDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; frag_pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, - layer.scale_a * layer.pattern_size_a, + props.scale_a * props.pattern_size_a, drawable.tile_units_to_pixels, in_position); frag_pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, - layer.scale_b * layer.pattern_size_b, + props.scale_b * props.pattern_size_b, drawable.tile_units_to_pixels, in_position); @@ -105,13 +135,13 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = BACKGROUND_SHADER_COMMON R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform BackgroundPatternLayerUBO { +layout(set = LAYER_SET_INDEX, binding = idBackgroundPropsUBO) uniform BackgroundPatternLayerUBO { vec2 pattern_tl_a; vec2 pattern_br_a; vec2 pattern_tl_b; @@ -122,7 +152,7 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform BackgroundPatternLayerUBO { float scale_b; float mix; float opacity; -} layer; +} props; layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; @@ -133,17 +163,17 @@ void main() { return; #endif - const vec2 texsize = global.pattern_atlas_texsize; + const vec2 texsize = paintParams.pattern_atlas_texsize; const vec2 imagecoord = mod(frag_pos_a, 1.0); - const vec2 pos = mix(layer.pattern_tl_a / texsize, layer.pattern_br_a / texsize, imagecoord); + const vec2 pos = mix(props.pattern_tl_a / texsize, props.pattern_br_a / texsize, imagecoord); const vec4 color1 = texture(image_sampler, pos); const vec2 imagecoord_b = mod(frag_pos_b, 1.0); - const vec2 pos2 = mix(layer.pattern_tl_b / texsize, layer.pattern_br_b / texsize, imagecoord_b); + const vec2 pos2 = mix(props.pattern_tl_b / texsize, props.pattern_br_b / texsize, imagecoord_b); const vec4 color2 = texture(image_sampler, pos2); - out_color = mix(color1, color2, layer.mix) * layer.opacity; + out_color = mix(color1, color2, props.mix) * props.opacity; } )"; }; diff --git a/include/mbgl/shaders/vulkan/circle.hpp b/include/mbgl/shaders/vulkan/circle.hpp index 0adafd5d97d1..9b5e900330e2 100644 --- a/include/mbgl/shaders/vulkan/circle.hpp +++ b/include/mbgl/shaders/vulkan/circle.hpp @@ -6,16 +6,23 @@ namespace mbgl { namespace shaders { +#define CIRCLE_SHADER_PRELUDE \ + R"( + +#define idCircleDrawableUBO idDrawableReservedVertexOnlyUBO +#define idCircleEvaluatedPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "CircleShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = CIRCLE_SHADER_PRELUDE R"( layout(location = 0) in ivec2 in_position; @@ -47,13 +54,14 @@ layout(location = 6) in vec2 in_stroke_width; layout(location = 7) in vec2 in_stroke_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CircleDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct CircleDrawableUBO { mat4 matrix; vec2 extrude_scale; - vec2 padding; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform CircleInterpolateUBO { + // Interpolations float color_t; float radius_t; float blur_t; @@ -61,10 +69,16 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform CircleInterpolateUBO { float stroke_color_t; float stroke_width_t; float stroke_opacity_t; - float pad1_; -} interp; + float pad1; + float pad2; + float pad3; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idCircleDrawableUBO) readonly buffer CircleDrawableUBOVector { + CircleDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform CircleEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idCircleEvaluatedPropsUBO) uniform CircleEvaluatedPropsUBO { vec4 color; vec4 stroke_color; float radius; @@ -74,7 +88,7 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform CircleEvaluatedPropsUBO { float stroke_opacity; bool scale_with_map; bool pitch_with_map; - float padding; + float pad1; } props; layout(location = 0) out vec2 frag_extrude; @@ -109,17 +123,18 @@ layout(location = 8) out lowp float frag_stroke_opacity; #endif void main() { + const CircleDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #if defined(HAS_UNIFORM_u_radius) const float radius = props.radius; #else - const float radius = unpack_mix_float(in_radius, interp.radius_t); + const float radius = unpack_mix_float(in_radius, drawable.radius_t); #endif #if defined(HAS_UNIFORM_u_stroke_width) const float stroke_width = props.stroke_width; #else - const float stroke_width = unpack_mix_float(in_stroke_width, interp.stroke_width_t); + const float stroke_width = unpack_mix_float(in_stroke_width, drawable.stroke_width_t); #endif // unencode the extrusion vector that we snuck into the a_pos vector @@ -139,14 +154,14 @@ void main() { // whole circle based on the pitch scaling effect at its central point const vec4 projected_center = drawable.matrix * vec4(circle_center, 0, 1); corner_position += scaled_extrude * (radius + stroke_width) * - (projected_center.w / global.camera_to_center_distance); + (projected_center.w / paintParams.camera_to_center_distance); } gl_Position = drawable.matrix * vec4(corner_position, 0, 1); } else { gl_Position = drawable.matrix * vec4(circle_center, 0, 1); - const float factor = props.scale_with_map ? global.camera_to_center_distance : gl_Position.w; + const float factor = props.scale_with_map ? paintParams.camera_to_center_distance : gl_Position.w; gl_Position.xy += scaled_extrude * (radius + stroke_width) * factor; } @@ -160,7 +175,7 @@ void main() { frag_extrude = extrude; #if !defined(HAS_UNIFORM_u_color) - frag_color = unpack_mix_color(in_color, interp.color_t); + frag_color = unpack_mix_color(in_color, drawable.color_t); #endif #if !defined(HAS_UNIFORM_u_radius) @@ -168,15 +183,15 @@ void main() { #endif #if !defined(HAS_UNIFORM_u_blur) - frag_blur = unpack_mix_float(in_blur, interp.blur_t); + frag_blur = unpack_mix_float(in_blur, drawable.blur_t); #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif #if !defined(HAS_UNIFORM_u_stroke_color) - frag_stroke_color = unpack_mix_color(in_stroke_color, interp.stroke_color_t); + frag_stroke_color = unpack_mix_color(in_stroke_color, drawable.stroke_color_t); #endif #if !defined(HAS_UNIFORM_u_stroke_width) @@ -184,12 +199,12 @@ void main() { #endif #if !defined(HAS_UNIFORM_u_stroke_opacity) - frag_stroke_opacity = unpack_mix_float(in_stroke_opacity, interp.stroke_opacity_t); + frag_stroke_opacity = unpack_mix_float(in_stroke_opacity, drawable.stroke_opacity_t); #endif } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = CIRCLE_SHADER_PRELUDE R"( layout(location = 0) in vec2 frag_extrude; layout(location = 1) in float frag_antialiasblur; @@ -224,7 +239,7 @@ layout(location = 8) in lowp float frag_stroke_opacity; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform CircleEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idCircleEvaluatedPropsUBO) uniform CircleEvaluatedPropsUBO { vec4 color; vec4 stroke_color; float radius; @@ -234,7 +249,7 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform CircleEvaluatedPropsUBO { float stroke_opacity; bool scale_with_map; bool pitch_with_map; - float padding; + float pad1; } props; void main() { diff --git a/include/mbgl/shaders/vulkan/clipping_mask.hpp b/include/mbgl/shaders/vulkan/clipping_mask.hpp index 7a803fe087fc..3b3dd7e4408b 100644 --- a/include/mbgl/shaders/vulkan/clipping_mask.hpp +++ b/include/mbgl/shaders/vulkan/clipping_mask.hpp @@ -16,10 +16,9 @@ template <> struct ShaderSource { static constexpr const char* name = "ClippingMaskProgram"; - static constexpr std::array uniforms{}; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; static constexpr auto vertex = R"( layout(location = 0) in ivec2 position; diff --git a/include/mbgl/shaders/vulkan/collision.hpp b/include/mbgl/shaders/vulkan/collision.hpp index d511ead2dd01..b5bdda8387c5 100644 --- a/include/mbgl/shaders/vulkan/collision.hpp +++ b/include/mbgl/shaders/vulkan/collision.hpp @@ -6,16 +6,23 @@ namespace mbgl { namespace shaders { +#define COLLISION_SHADER_COMMON \ + R"( + +#define idCollisionDrawableUBO idDrawableReservedVertexOnlyUBO +#define idCollisionTilePropsUBO drawableReservedUBOCount + +)" + template <> struct ShaderSource { static constexpr const char* name = "CollisionBoxShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = COLLISION_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_anchor_position; @@ -23,12 +30,15 @@ layout(location = 2) in ivec2 in_extrude; layout(location = 3) in uvec2 in_placed; layout(location = 4) in vec2 in_shift; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CollisionBoxUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCollisionDrawableUBO) uniform CollisionDrawableUBO { mat4 matrix; +} drawable; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCollisionTilePropsUBO) uniform CollisionTilePropsUBO { vec2 extrude_scale; float overscale_factor; float pad1; -} drawable; +} tileProps; layout(location = 0) out float frag_placed; layout(location = 1) out float frag_notUsed; @@ -38,12 +48,12 @@ void main() { vec4 projectedPoint = drawable.matrix * vec4(in_anchor_position, 0.0, 1.0); float camera_to_anchor_distance = projectedPoint.w; float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (global.camera_to_center_distance / camera_to_anchor_distance), + 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles 4.0); gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); - gl_Position.xy += (in_extrude + in_shift) * drawable.extrude_scale * gl_Position.w * collision_perspective_ratio; + gl_Position.xy += (in_extrude + in_shift) * tileProps.extrude_scale * gl_Position.w * collision_perspective_ratio; applySurfaceTransform(); frag_placed = in_placed.x; @@ -51,20 +61,13 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = COLLISION_SHADER_COMMON R"( layout(location = 0) in float frag_placed; layout(location = 1) in float frag_notUsed; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CollisionBoxUBO { - mat4 matrix; - vec2 extrude_scale; - float overscale_factor; - float pad1; -} drawable; - void main() { float alpha = 0.5; @@ -91,24 +94,26 @@ template <> struct ShaderSource { static constexpr const char* name = "CollisionCircleShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = COLLISION_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_anchor_position; layout(location = 2) in ivec2 in_extrude; layout(location = 3) in uvec2 in_placed; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CollisionCircleUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCollisionDrawableUBO) uniform CollisionDrawableUBO { mat4 matrix; +} drawable; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCollisionTilePropsUBO) uniform CollisionTilePropsUBO { vec2 extrude_scale; float overscale_factor; float pad1; -} drawable; +} tileProps; layout(location = 0) out float frag_placed; layout(location = 1) out float frag_notUsed; @@ -121,24 +126,24 @@ void main() { vec4 projectedPoint = drawable.matrix * vec4(in_anchor_position, 0, 1); float camera_to_anchor_distance = projectedPoint.w; float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (global.camera_to_center_distance / camera_to_anchor_distance), + 0.5 + 0.5 * (paintParams.camera_to_center_distance / camera_to_anchor_distance), 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles 4.0); float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); - gl_Position.xy += in_extrude * drawable.extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio; + gl_Position.xy += in_extrude * tileProps.extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio; applySurfaceTransform(); frag_placed = in_placed.x; frag_notUsed = in_placed.y; frag_radius = abs(float(in_extrude.y)); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius frag_extrude = in_extrude * padding_factor; - frag_extrude_scale = drawable.extrude_scale * global.camera_to_center_distance * collision_perspective_ratio; + frag_extrude_scale = tileProps.extrude_scale * paintParams.camera_to_center_distance * collision_perspective_ratio; } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = COLLISION_SHADER_COMMON R"( layout(location = 0) in float frag_placed; layout(location = 1) in float frag_notUsed; @@ -148,12 +153,11 @@ layout(location = 4) in vec2 frag_extrude_scale; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CollisionCircleUBO { - mat4 matrix; +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCollisionTilePropsUBO) uniform CollisionTilePropsUBO { vec2 extrude_scale; float overscale_factor; float pad1; -} drawable; +} tileProps; void main() { @@ -174,7 +178,7 @@ void main() { float extrude_scale_length = length(frag_extrude_scale); float extrude_length = length(frag_extrude) * extrude_scale_length; - float stroke_width = 15.0 * extrude_scale_length / drawable.overscale_factor; + float stroke_width = 15.0 * extrude_scale_length / tileProps.overscale_factor; float radius = frag_radius * extrude_scale_length; float distance_to_edge = abs(extrude_length - radius); diff --git a/include/mbgl/shaders/vulkan/common.hpp b/include/mbgl/shaders/vulkan/common.hpp index cb0f13a804e4..8d3af26b90b9 100644 --- a/include/mbgl/shaders/vulkan/common.hpp +++ b/include/mbgl/shaders/vulkan/common.hpp @@ -72,6 +72,11 @@ vec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower, #define DRAWABLE_UBO_SET_INDEX 2 #define DRAWABLE_IMAGE_SET_INDEX 3 +#define idDrawableReservedVertexOnlyUBO 0 +#define idDrawableReservedFragmentOnlyUBO 1 +#define drawableReservedUBOCount 2 +#define layerUBOStartId 3 + layout(set = GLOBAL_SET_INDEX, binding = 0) uniform GlobalPaintParamsUBO { vec2 pattern_atlas_texsize; vec2 units_to_pixels; @@ -80,19 +85,19 @@ layout(set = GLOBAL_SET_INDEX, binding = 0) uniform GlobalPaintParamsUBO { float symbol_fade_change; float aspect_ratio; float pixel_ratio; - float zoom; + float map_zoom; float pad1; -} global; +} paintParams; #ifdef USE_SURFACE_TRANSFORM -layout(set = GLOBAL_SET_INDEX, binding = 1) uniform PlatformParamsUBO { +layout(set = GLOBAL_SET_INDEX, binding = 1) uniform GlobalPlatformParamsUBO { mat2 rotation; -} platform; +} platformParams; #endif void applySurfaceTransform() { #ifdef USE_SURFACE_TRANSFORM - gl_Position.xy = platform.rotation * gl_Position.xy; + gl_Position.xy = platformParams.rotation * gl_Position.xy; #endif gl_Position.y *= -1.0; @@ -110,6 +115,11 @@ void applySurfaceTransform() { #define DRAWABLE_UBO_SET_INDEX 2 #define DRAWABLE_IMAGE_SET_INDEX 3 +#define idDrawableReservedVertexOnlyUBO 0 +#define idDrawableReservedFragmentOnlyUBO 1 +#define drawableReservedUBOCount 2 +#define layerUBOStartId 3 + layout(set = GLOBAL_SET_INDEX, binding = 0) uniform GlobalPaintParamsUBO { vec2 pattern_atlas_texsize; vec2 units_to_pixels; @@ -118,87 +128,10 @@ layout(set = GLOBAL_SET_INDEX, binding = 0) uniform GlobalPaintParamsUBO { float symbol_fade_change; float aspect_ratio; float pixel_ratio; - float zoom; + float map_zoom; float pad1; -} global; - -)"; -}; - -template <> -struct ShaderSource { - static constexpr const char* name = "CommonShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; - - static constexpr auto vertex = R"( -layout(location = 0) in vec2 in_position; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CommonUBO { - mat4 matrix; - vec4 color; -} ubo; - -void main() { - gl_Position = ubo.matrix * vec4(in_position, 0, 1); - applySurfaceTransform(); -} -)"; - - static constexpr auto fragment = R"( -layout(location = 0) out vec4 out_color; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CommonUBO { - mat4 matrix; - vec4 color; -} ubo; - -void main() { - out_color = ubo.color; -} -)"; -}; - -template <> -struct ShaderSource { - static constexpr const char* name = "CommonTexturedShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto vertex = R"( -layout(location = 0) in vec2 in_position; -layout(location = 1) in vec2 in_texcoord; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CommonUBO { - mat4 matrix; - vec4 color; -} ubo; +} paintParams; -layout(location = 0) out vec2 frag_uv; - -void main() { - gl_Position = ubo.matrix * vec4(in_position, 0, 1); - applySurfaceTransform(); - - frag_uv = in_texcoord; -} -)"; - - static constexpr auto fragment = R"( -layout(location = 0) in vec2 frag_uv; -layout(location = 0) out vec4 out_color; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; - -void main() { - out_color = texture(image_sampler, frag_uv); -} )"; }; diff --git a/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp b/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp new file mode 100644 index 000000000000..f294035d436a --- /dev/null +++ b/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +#define CUSTOM_SYMBOL_ICON_SHADER_PRELUDE \ + R"( + +#define idCustomSymbolDrawableUBO idDrawableReservedVertexOnlyUBO + +)" + +template <> +struct ShaderSource { + static constexpr const char* name = "CustomSymbolIconShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( + +layout(location = 0) in vec2 in_position; +layout(location = 1) in vec2 in_tex; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCustomSymbolDrawableUBO) uniform CustomSymbolIconDrawableUBO { + mat4 matrix; + vec2 extrude_scale; + vec2 anchor; + float angle_degrees; + bool scale_with_map; + bool pitch_with_map; + float camera_to_center_distance; + float aspect_ratio; + float pad1; + float pad2; + float pad3; +} drawable; + +layout(location = 0) out vec2 frag_tex; + +vec2 rotateVec2(vec2 v, float angle) { + float cosA = cos(angle); + float sinA = sin(angle); + return vec2(v.x * cosA - v.y * sinA, v.x * sinA + v.y * cosA); +} + +vec2 ellipseRotateVec2(vec2 v, float angle, float radiusRatio /* A/B */) { + float cosA = cos(angle); + float sinA = sin(angle); + float invRatio = 1.0 / radiusRatio; + return vec2(v.x * cosA - radiusRatio * v.y * sinA, invRatio * v.x * sinA + v.y * cosA); +} + +void main() { + const vec2 extrude = mod(in_position, 2.0) * 2.0 - 1.0; + const vec2 anchor = (drawable.anchor - vec2(0.5, 0.5)) * 2.0; + const vec2 center = floor(in_position * 0.5); + const float angle = radians(-drawable.angle_degrees); + vec2 corner = extrude - anchor; + + vec4 position; + if (drawable.pitch_with_map) { + if (drawable.scale_with_map) { + corner *= drawable.extrude_scale; + } else { + vec4 projected_center = drawable.matrix * vec4(center, 0, 1); + corner *= drawable.extrude_scale * (projected_center.w / drawable.camera_to_center_distance); + } + corner = center + rotateVec2(corner, angle); + position = drawable.matrix * vec4(corner, 0, 1); + } else { + position = drawable.matrix * vec4(center, 0, 1); + const float factor = drawable.scale_with_map ? drawable.camera_to_center_distance : position.w; + position.xy += ellipseRotateVec2(corner * drawable.extrude_scale * factor, angle, drawable.aspect_ratio); + } + + gl_Position = position; + applySurfaceTransform(); + + frag_tex = in_tex; +} +)"; + + static constexpr auto fragment = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( +layout(location = 0) in vec2 frag_tex; +layout(location = 0) out vec4 out_color; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; + +void main() { + +#if defined(OVERDRAW_INSPECTOR) + out_color = vec4(1.0); + return; +#endif + + out_color = texture(image_sampler, frag_tex); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/debug.hpp b/include/mbgl/shaders/vulkan/debug.hpp index bbd3e9e76523..9c36febd7778 100644 --- a/include/mbgl/shaders/vulkan/debug.hpp +++ b/include/mbgl/shaders/vulkan/debug.hpp @@ -6,24 +6,32 @@ namespace mbgl { namespace shaders { +#define DEBUG_SHADER_PRELUDE \ + R"( + +#define idDebugUBO drawableReservedUBOCount + +)" + template <> struct ShaderSource { static constexpr const char* name = "DebugShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = DEBUG_SHADER_PRELUDE R"( layout(location = 0) in ivec2 in_position; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform DebugUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idDebugUBO) uniform DebugUBO { mat4 matrix; vec4 color; float overlay_scale; - float pad1, pad2, pad3; + float pad1; + float pad2; + float pad3; } debug; layout(location = 0) out vec2 frag_uv; @@ -39,15 +47,17 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = DEBUG_SHADER_PRELUDE R"( layout(location = 0) in vec2 frag_uv; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform DebugUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idDebugUBO) uniform DebugUBO { mat4 matrix; vec4 color; float overlay_scale; - float pad1, pad2, pad3; + float pad1; + float pad2; + float pad3; } debug; layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; diff --git a/include/mbgl/shaders/vulkan/fill.hpp b/include/mbgl/shaders/vulkan/fill.hpp index 63fc4f2b9510..80124ecd2b6e 100644 --- a/include/mbgl/shaders/vulkan/fill.hpp +++ b/include/mbgl/shaders/vulkan/fill.hpp @@ -6,16 +6,24 @@ namespace mbgl { namespace shaders { +#define FILL_SHADER_COMMON \ + R"( + +#define idFillDrawableUBO idDrawableReservedVertexOnlyUBO +#define idFillTilePropsUBO drawableReservedUBOCount +#define idFillEvaluatedPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "FillShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = FILL_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; @@ -27,14 +35,23 @@ layout(location = 1) in vec4 in_color; layout(location = 2) in vec2 in_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillDrawableUBO { - mat4 matrix; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillInterpolateUBO { +struct FillDrawableUBO { + mat4 matrix; + // Interpolations float color_t; float opacity_t; -} interp; + float pad1; + float pad2; + vec4 pad3; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillDrawableUBO) readonly buffer FillDrawableUBOVector { + FillDrawableUBO drawable_ubo[]; +} drawableVector; #if !defined(HAS_UNIFORM_u_color) layout(location = 0) out vec4 frag_color; @@ -45,13 +62,14 @@ layout(location = 1) out lowp float frag_opacity; #endif void main() { + const FillDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #if !defined(HAS_UNIFORM_u_color) - frag_color = vec4(unpack_mix_color(in_color, interp.color_t)); + frag_color = vec4(unpack_mix_color(in_color, drawable.color_t)); #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); @@ -59,7 +77,7 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = FILL_SHADER_COMMON R"( #if !defined(HAS_UNIFORM_u_color) layout(location = 0) in vec4 frag_color; @@ -71,7 +89,7 @@ layout(location = 1) in lowp float frag_opacity; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -103,12 +121,11 @@ template <> struct ShaderSource { static constexpr const char* name = "FillOutlineShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = FILL_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; @@ -120,14 +137,23 @@ layout(location = 1) in vec4 in_color; layout(location = 2) in vec2 in_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillDrawableUBO { - mat4 matrix; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillInterpolateUBO { - float color_t; +struct FillOutlineDrawableUBO { + mat4 matrix; + // Interpolations + float outline_color_t; float opacity_t; -} interp; + float pad1; + float pad2; + vec4 pad3; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillDrawableUBO) readonly buffer FillOutlineDrawableUBOVector { + FillOutlineDrawableUBO drawable_ubo[]; +} drawableVector; #if !defined(HAS_UNIFORM_u_outline_color) layout(location = 0) out vec4 frag_color; @@ -140,23 +166,24 @@ layout(location = 1) out lowp float frag_opacity; layout(location = 2) out vec2 frag_position; void main() { - + const FillOutlineDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + #if !defined(HAS_UNIFORM_u_outline_color) - frag_color = vec4(unpack_mix_color(in_color, interp.color_t)); + frag_color = vec4(unpack_mix_color(in_color, drawable.outline_color_t)); #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); applySurfaceTransform(); - frag_position = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * global.world_size; + frag_position = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * paintParams.world_size; } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = FILL_SHADER_COMMON R"( #if !defined(HAS_UNIFORM_u_outline_color) layout(location = 0) in vec4 frag_color; @@ -170,7 +197,7 @@ layout(location = 2) in vec2 frag_position; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -209,12 +236,11 @@ template <> struct ShaderSource { static constexpr const char* name = "FillPatternShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = FILL_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; @@ -230,27 +256,38 @@ layout(location = 2) in mediump uvec4 in_pattern_to; layout(location = 3) in vec2 in_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillPatternDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillPatternDrawableUBO { mat4 matrix; vec2 pixel_coord_upper; vec2 pixel_coord_lower; - vec2 texsize; float tile_ratio; - float pad; -} drawable; + // Interpolations + float pattern_from_t; + float pattern_to_t; + float opacity_t; +}; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillPatternTilePropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idFillDrawableUBO) readonly buffer FillPatternDrawableUBOVector { + FillPatternDrawableUBO drawable_ubo[]; +} drawableVector; + +struct FillPatternTilePropsUBO { vec4 pattern_from; vec4 pattern_to; -} tile; + vec2 texsize; + float pad1; + float pad2; +}; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform FillPatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; -} interp; +layout(std140, set = LAYER_SET_INDEX, binding = idFillTilePropsUBO) readonly buffer FillPatternTilePropsUBOVector { + FillPatternTilePropsUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -275,21 +312,23 @@ layout(location = 4) out lowp float frag_opacity; #endif void main() { + const FillPatternDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + const FillPatternTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; #if defined(HAS_UNIFORM_u_pattern_from) - const vec4 frag_pattern_from = tile.pattern_from; + const vec4 frag_pattern_from = tileProps.pattern_from; #else frag_pattern_from = in_pattern_from; #endif #if defined(HAS_UNIFORM_u_pattern_to) - const vec4 frag_pattern_to = tile.pattern_to; + const vec4 frag_pattern_to = tileProps.pattern_to; #else frag_pattern_to = in_pattern_to; #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif const vec2 pattern_tl_a = frag_pattern_from.xy; @@ -297,7 +336,7 @@ void main() { const vec2 pattern_tl_b = frag_pattern_to.xy; const vec2 pattern_br_b = frag_pattern_to.zw; - const float pixelRatio = global.pixel_ratio; + const float pixelRatio = paintParams.pixel_ratio; const float tileZoomRatio = drawable.tile_ratio; const float fromScale = props.from_scale; const float toScale = props.to_scale; @@ -313,7 +352,7 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = FILL_SHADER_COMMON R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; @@ -332,21 +371,23 @@ layout(location = 4) in lowp float frag_opacity; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillPatternDrawableUBO { - mat4 matrix; - vec2 pixel_coord_upper; - vec2 pixel_coord_lower; - vec2 texsize; - float tile_ratio; - float pad; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillPatternTilePropsUBO { +struct FillPatternTilePropsUBO { vec4 pattern_from; vec4 pattern_to; -} tile; + vec2 texsize; + float pad1; + float pad2; +}; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idFillTilePropsUBO) readonly buffer FillPatternTilePropsUBOVector { + FillPatternTilePropsUBO tile_props_ubo[]; +} tilePropsVector; + +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -364,14 +405,16 @@ void main() { return; #endif + const FillPatternTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #if defined(HAS_UNIFORM_u_pattern_from) - const vec4 pattern_from = tile.pattern_from; + const vec4 pattern_from = tileProps.pattern_from; #else const vec4 pattern_from = frag_pattern_from; #endif #if defined(HAS_UNIFORM_u_pattern_to) - const vec4 pattern_to = tile.pattern_to; + const vec4 pattern_to = tileProps.pattern_to; #else const vec4 pattern_to = frag_pattern_to; #endif @@ -388,11 +431,11 @@ void main() { const vec2 pattern_br_b = pattern_to.zw; const vec2 imagecoord = mod(frag_pos_a, 1.0); - const vec2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); + const vec2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); const vec4 color1 = texture(image0_sampler, pos); const vec2 imagecoord_b = mod(frag_pos_b, 1.0); - const vec2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); + const vec2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); const vec4 color2 = texture(image0_sampler, pos2); out_color = mix(color1, color2, props.fade) * opacity; @@ -404,12 +447,11 @@ template <> struct ShaderSource { static constexpr const char* name = "FillOutlinePatternShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = FILL_SHADER_COMMON R"( layout(location = 0) in ivec2 in_position; @@ -425,27 +467,38 @@ layout(location = 2) in mediump uvec4 in_pattern_to; layout(location = 3) in vec2 in_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillOutlinePatternDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillOutlinePatternDrawableUBO { mat4 matrix; vec2 pixel_coord_upper; vec2 pixel_coord_lower; - vec2 texsize; float tile_ratio; - float pad; -} drawable; + // Interpolations + float pattern_from_t; + float pattern_to_t; + float opacity_t; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillDrawableUBO) readonly buffer FillOutlinePatternDrawableUBOVector { + FillOutlinePatternDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillOutlinePatternTilePropsUBO { +struct FillOutlinePatternTilePropsUBO { vec4 pattern_from; vec4 pattern_to; -} tile; + vec2 texsize; + float pad1; + float pad2; +}; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform FillOutlinePatternInterpolateUBO { - float pattern_from_t; - float pattern_to_t; - float opacity_t; -} interp; +layout(std140, set = LAYER_SET_INDEX, binding = idFillTilePropsUBO) readonly buffer FillOutlinePatternTilePropsUBOVector { + FillOutlinePatternTilePropsUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -471,21 +524,23 @@ layout(location = 5) out lowp float frag_opacity; #endif void main() { + const FillOutlinePatternDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + const FillOutlinePatternTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; #if defined(HAS_UNIFORM_u_pattern_from) - const vec4 frag_pattern_from = tile.pattern_from; + const vec4 frag_pattern_from = tileProps.pattern_from; #else frag_pattern_from = in_pattern_from; #endif #if defined(HAS_UNIFORM_u_pattern_to) - const vec4 frag_pattern_to = tile.pattern_to; + const vec4 frag_pattern_to = tileProps.pattern_to; #else frag_pattern_to = in_pattern_to; #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif const vec2 pattern_tl_a = frag_pattern_from.xy; @@ -493,7 +548,7 @@ void main() { const vec2 pattern_tl_b = frag_pattern_to.xy; const vec2 pattern_br_b = frag_pattern_to.zw; - const float pixelRatio = global.pixel_ratio; + const float pixelRatio = paintParams.pixel_ratio; const float tileZoomRatio = drawable.tile_ratio; const float fromScale = props.from_scale; const float toScale = props.to_scale; @@ -507,11 +562,11 @@ void main() { frag_pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, position2), frag_pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, toScale * display_size_b, tileZoomRatio, position2), - frag_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * global.world_size; + frag_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * paintParams.world_size; } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = FILL_SHADER_COMMON R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; @@ -531,21 +586,23 @@ layout(location = 5) in lowp float frag_opacity; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillOutlinePatternDrawableUBO { - mat4 matrix; - vec2 pixel_coord_upper; - vec2 pixel_coord_lower; - vec2 texsize; - float tile_ratio; - float pad; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillOutlinePatternTilePropsUBO { +struct FillOutlinePatternTilePropsUBO { vec4 pattern_from; vec4 pattern_to; -} tile; + vec2 texsize; + float pad1; + float pad2; +}; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idFillTilePropsUBO) readonly buffer FillOutlinePatternTilePropsUBOVector { + FillOutlinePatternTilePropsUBO tile_props_ubo[]; +} tilePropsVector; + +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -563,14 +620,16 @@ void main() { return; #endif + const FillOutlinePatternTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #if defined(HAS_UNIFORM_u_pattern_from) - const vec4 pattern_from = tile.pattern_from; + const vec4 pattern_from = tileProps.pattern_from; #else const vec4 pattern_from = frag_pattern_from; #endif #if defined(HAS_UNIFORM_u_pattern_to) - const vec4 pattern_to = tile.pattern_to; + const vec4 pattern_to = tileProps.pattern_to; #else const vec4 pattern_to = frag_pattern_to; #endif @@ -587,11 +646,11 @@ void main() { const vec2 pattern_br_b = pattern_to.zw; const vec2 imagecoord = mod(frag_pos_a, 1.0); - const vec2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); + const vec2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); const vec4 color1 = texture(image0_sampler, pos); const vec2 imagecoord_b = mod(frag_pos_b, 1.0); - const vec2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); + const vec2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); const vec4 color2 = texture(image0_sampler, pos2); const float dist = length(frag_pos - gl_FragCoord.xy); @@ -606,27 +665,39 @@ template <> struct ShaderSource { static constexpr const char* name = "FillOutlineTriangulatedShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = FILL_SHADER_COMMON R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillOutlineTriangulatedDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillOutlineTriangulatedDrawableUBO { mat4 matrix; float ratio; - float pad1, pad2, pad3; -} drawable; + float pad1, + float pad2 + float pad3; + vec4 pad1; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillDrawableUBO) readonly buffer FillOutlineTriangulatedDrawableUBOVector { + FillOutlineTriangulatedDrawableUBO drawable_ubo[]; +} drawableVector; layout(location = 0) out float frag_width2; layout(location = 1) out vec2 frag_normal; layout(location = 2) out float frag_gamma_scale; void main() { + const FillOutlineTriangulatedDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; @@ -657,14 +728,14 @@ void main() { // calculate how much the perspective view squishes or stretches the extrude float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * global.units_to_pixels); + float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * paintParams.units_to_pixels); frag_width2 = outset; frag_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = FILL_SHADER_COMMON R"( layout(location = 0) in float frag_width2; layout(location = 1) in vec2 frag_normal; @@ -672,7 +743,7 @@ layout(location = 2) in float frag_gamma_scale; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idFillEvaluatedPropsUBO) uniform FillEvaluatedPropsUBO { vec4 color; vec4 outline_color; float opacity; @@ -701,395 +772,5 @@ void main() { )"; }; -template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; - - static constexpr auto vertex = R"( - -layout(location = 0) in ivec2 in_position; -layout(location = 1) in ivec4 in_normal_ed; - -#if !defined(HAS_UNIFORM_u_color) -layout(location = 2) in vec4 in_color; -#endif - -#if !defined(HAS_UNIFORM_u_base) -layout(location = 3) in vec2 in_base; -#endif - -#if !defined(HAS_UNIFORM_u_height) -layout(location = 4) in vec2 in_height; -#endif - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillExtrusionDrawableUBO { - mat4 matrix; - vec2 texsize; - vec2 pixel_coord_upper; - vec2 pixel_coord_lower; - float height_factor; - float tile_ratio; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform FillExtrusionInterpolateUBO { - float base_t; - float height_t; - float color_t; - float pattern_from_t; - float pattern_to_t; - float pad1, pad2, pad3; -} interp; - -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillExtrusionPropsUBO { - vec4 color; - vec4 light_color_pad; - vec4 light_position_base; - float height; - float light_intensity; - float vertical_gradient; - float opacity; - float fade; - float from_scale; - float to_scale; - float pad2; -} props; - -layout(location = 0) out mediump vec4 frag_color; - -void main() { - -#if defined(HAS_UNIFORM_u_base) - const float base = props.light_position_base.w; -#else - const float base = max(unpack_mix_float(in_base, interp.base_t), 0.0); -#endif - -#if defined(HAS_UNIFORM_u_height) - const float height = props.height; -#else - const float height = max(unpack_mix_float(in_height, interp.height_t), 0.0); -#endif - -#if defined(HAS_UNIFORM_u_color) - vec4 color = props.color; -#else - vec4 color = unpack_mix_color(in_color, interp.color_t); -#endif - - const vec3 normal = in_normal_ed.xyz; - const float t = mod(normal.x, 2.0); - const float z = t != 0.0 ? height : base; - - gl_Position = drawable.matrix * vec4(in_position, z, 1.0); - applySurfaceTransform(); - -#if defined(OVERDRAW_INSPECTOR) - frag_color = vec4(1.0); - return; -#endif - - // Relative luminance (how dark/bright is the surface color?) - const float luminance = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; - - vec4 vcolor = vec4(0.0, 0.0, 0.0, 1.0); - - // Add slight ambient lighting so no extrusions are totally black - color += vec4(0.03, 0.03, 0.03, 1.0); - - // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray - const float directionalFraction = clamp(dot(normal / 16384.0, props.light_position_base.xyz), 0.0, 1.0); - - // Adjust directional so that the range of values for highlight/shading is - // narrower with lower light intensity and with lighter/brighter surface colors - const float minDirectional = 1.0 - props.light_intensity; - const float maxDirectional = max(1.0 - luminance + props.light_intensity, 1.0); - float directional = mix(minDirectional, maxDirectional, directionalFraction); - - // Add gradient along z axis of side surfaces - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no - // vertical gradient, and otherwise calculates the gradient based on base + height - // TODO: If we're optimizing to the level of avoiding branches, we should pre-compute - // the square root when height is a uniform. - const float fMin = mix(0.7, 0.98, 1.0 - props.light_intensity); - const float factor = clamp((t + base) * pow(height / 150.0, 0.5), fMin, 1.0); - directional *= (1.0 - props.vertical_gradient) + (props.vertical_gradient * factor); - } - - // Assign final color based on surface + ambient light color, diffuse light directional, - // and light color with lower bounds adjusted to hue of light so that shading is tinted - // with the complementary (opposite) color to the light color - const vec3 light_color = props.light_color_pad.rgb; - const vec3 minLight = mix(vec3(0.0), vec3(0.3), 1.0 - light_color.rgb); - vcolor += vec4(clamp(color.rgb * directional * light_color.rgb, minLight, vec3(1.0)), 0.0); - - frag_color = vcolor * props.opacity; -} -)"; - - static constexpr auto fragment = R"( - -layout(location = 0) in vec4 frag_color; -layout(location = 0) out vec4 out_color; - -void main() { - out_color = frag_color; -} -)"; -}; - -template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionPatternShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto vertex = R"( - -layout(location = 0) in ivec2 in_position; -layout(location = 1) in ivec4 in_normal_ed; - -#if !defined(HAS_UNIFORM_u_base) -layout(location = 2) in vec2 in_base; -#endif - -#if !defined(HAS_UNIFORM_u_height) -layout(location = 3) in vec2 in_height; -#endif - -#if !defined(HAS_UNIFORM_u_pattern_from) -layout(location = 4) in uvec4 in_pattern_from; -#endif - -#if !defined(HAS_UNIFORM_u_pattern_to) -layout(location = 5) in uvec4 in_pattern_to; -#endif - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillExtrusionDrawableUBO { - mat4 matrix; - vec2 texsize; - vec2 pixel_coord_upper; - vec2 pixel_coord_lower; - float height_factor; - float tile_ratio; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillExtrusionTilePropsUBO { - vec4 pattern_from; - vec4 pattern_to; -} tile; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform FillExtrusionInterpolateUBO { - float base_t; - float height_t; - float color_t; - float pattern_from_t; - float pattern_to_t; - float pad1, pad2, pad3; -} interp; - -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillExtrusionPropsUBO { - vec4 color; - vec4 light_color_pad; - vec4 light_position_base; - float height; - float light_intensity; - float vertical_gradient; - float opacity; - float fade; - float from_scale; - float to_scale; - float pad2; -} props; - -layout(location = 0) out mediump vec4 frag_lighting; -layout(location = 1) out mediump vec2 frag_pos_a; -layout(location = 2) out mediump vec2 frag_pos_b; - -#if !defined(HAS_UNIFORM_u_pattern_from) -layout(location = 3) out mediump vec4 frag_pattern_from; -#endif - -#if !defined(HAS_UNIFORM_u_pattern_to) -layout(location = 4) out mediump vec4 frag_pattern_to; -#endif - -void main() { - -#if defined(HAS_UNIFORM_u_base) - const float base = props.light_position_base.w; -#else - const float base = max(unpack_mix_float(in_base, interp.base_t), 0.0); -#endif - -#if defined(HAS_UNIFORM_u_height) - const float height = props.height; -#else - const float height = max(unpack_mix_float(in_height, interp.height_t), 0.0); -#endif - - const vec3 normal = in_normal_ed.xyz; - const float edgedistance = in_normal_ed.w; - const float t = mod(normal.x, 2.0); - const float z = t != 0.0 ? height : base; - - gl_Position = drawable.matrix * vec4(in_position, z, 1.0); - applySurfaceTransform(); - -#if defined(OVERDRAW_INSPECTOR) - frag_color = vec4(1.0); - return; -#endif - -#if defined(HAS_UNIFORM_u_pattern_from) - const mediump vec4 pattern_from = tile.pattern_from; -#else - const mediump vec4 pattern_from = in_pattern_from; - frag_pattern_from = in_pattern_from; -#endif - -#if defined(HAS_UNIFORM_u_pattern_to) - const mediump vec4 pattern_to = tile.pattern_to; -#else - const mediump vec4 pattern_to = in_pattern_to; - frag_pattern_to = in_pattern_to; -#endif - - const vec2 pattern_tl_a = pattern_from.xy; - const vec2 pattern_br_a = pattern_from.zw; - const vec2 pattern_tl_b = pattern_to.xy; - const vec2 pattern_br_b = pattern_to.zw; - - const float pixelRatio = global.pixel_ratio; - const float tileZoomRatio = drawable.tile_ratio; - const float fromScale = props.from_scale; - const float toScale = props.to_scale; - - const vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - const vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - const vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 - ? vec2(in_position) // extrusion top - : vec2(edgedistance, z * drawable.height_factor); // extrusion side - - vec4 lighting = vec4(0.0, 0.0, 0.0, 1.0); - float directional = clamp(dot(normal / 16383.0, props.light_position_base.xyz), 0.0, 1.0); - directional = mix((1.0 - props.light_intensity), max((0.5 + props.light_intensity), 1.0), directional); - - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - props.vertical_gradient) + - (props.vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - props.light_intensity), 1.0))); - } - - lighting.rgb += clamp(directional * props.light_color_pad.rgb, mix(vec3(0.0), vec3(0.3), 1.0 - props.light_color_pad.rgb), vec3(1.0)); - lighting *= props.opacity; - - frag_lighting = lighting; - frag_pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, pos); - frag_pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, toScale * display_size_b, tileZoomRatio, pos); - -#if !defined(HAS_UNIFORM_u_pattern_from) - frag_pattern_from = in_pattern_from; -#endif - -#if !defined(HAS_UNIFORM_u_pattern_to) - frag_pattern_to = in_pattern_to; -#endif -} -)"; - - static constexpr auto fragment = R"( - -layout(location = 0) in mediump vec4 frag_lighting; -layout(location = 1) in mediump vec2 frag_pos_a; -layout(location = 2) in mediump vec2 frag_pos_b; - -#if !defined(HAS_UNIFORM_u_pattern_from) -layout(location = 3) in mediump vec4 frag_pattern_from; -#endif - -#if !defined(HAS_UNIFORM_u_pattern_to) -layout(location = 4) in mediump vec4 frag_pattern_to; -#endif - -layout(location = 0) out vec4 out_color; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform FillExtrusionDrawableUBO { - mat4 matrix; - vec2 texsize; - vec2 pixel_coord_upper; - vec2 pixel_coord_lower; - float height_factor; - float tile_ratio; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform FillExtrusionTilePropsUBO { - vec4 pattern_from; - vec4 pattern_to; -} tile; - -layout(set = LAYER_SET_INDEX, binding = 0) uniform FillExtrusionPropsUBO { - vec4 color; - vec4 light_color_pad; - vec4 light_position_base; - float height; - float light_intensity; - float vertical_gradient; - float opacity; - float fade; - float from_scale; - float to_scale; - float pad2; -} props; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image0_sampler; - -void main() { - -#if defined(OVERDRAW_INSPECTOR) - out_color = vec4(1.0); - return; -#endif - -#if defined(HAS_UNIFORM_u_pattern_from) - const vec4 pattern_from = tile.pattern_from; -#else - const vec4 pattern_from = frag_pattern_from; -#endif -#if defined(HAS_UNIFORM_u_pattern_to) - const vec4 pattern_to = tile.pattern_to; -#else - const vec4 pattern_to = frag_pattern_to; -#endif - - const vec2 pattern_tl_a = pattern_from.xy; - const vec2 pattern_br_a = pattern_from.zw; - const vec2 pattern_tl_b = pattern_to.xy; - const vec2 pattern_br_b = pattern_to.zw; - - const vec2 imagecoord = mod(frag_pos_a, 1.0); - const vec2 pos = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, imagecoord); - const vec4 color1 = texture(image0_sampler, pos); - - const vec2 imagecoord_b = mod(frag_pos_b, 1.0); - const vec2 pos2 = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, imagecoord_b); - const vec4 color2 = texture(image0_sampler, pos2); - - out_color = mix(color1, color2, props.fade) * frag_lighting; -} -)"; -}; - } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/fill_extrusion.hpp b/include/mbgl/shaders/vulkan/fill_extrusion.hpp new file mode 100644 index 000000000000..89be8424f64c --- /dev/null +++ b/include/mbgl/shaders/vulkan/fill_extrusion.hpp @@ -0,0 +1,426 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +#define FILL_EXTRUSION_SHADER_COMMON \ + R"( + +#define idFillExtrusionDrawableUBO idDrawableReservedVertexOnlyUBO +#define idFillExtrusionTilePropsUBO drawableReservedUBOCount +#define idFillExtrusionPropsUBO layerUBOStartId + +)" + +template <> +struct ShaderSource { + static constexpr const char* name = "FillExtrusionShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = FILL_EXTRUSION_SHADER_COMMON R"( + +layout(location = 0) in ivec2 in_position; +layout(location = 1) in ivec4 in_normal_ed; + +#if !defined(HAS_UNIFORM_u_color) +layout(location = 2) in vec4 in_color; +#endif + +#if !defined(HAS_UNIFORM_u_base) +layout(location = 3) in vec2 in_base; +#endif + +#if !defined(HAS_UNIFORM_u_height) +layout(location = 4) in vec2 in_height; +#endif + +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillExtrusionDrawableUBO { + mat4 matrix; + vec2 pixel_coord_upper; + vec2 pixel_coord_lower; + float height_factor; + float tile_ratio; + // Interpolations + float base_t; + float height_t; + float color_t; + float pattern_from_t; + float pattern_to_t; + float pad1; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillExtrusionDrawableUBO) readonly buffer FillExtrusionDrawableUBOVector { + FillExtrusionDrawableUBO drawable_ubo[]; +} drawableVector; + +layout(set = LAYER_SET_INDEX, binding = idFillExtrusionPropsUBO) uniform FillExtrusionPropsUBO { + vec4 color; + vec4 light_color_pad; + vec4 light_position_base; + float height; + float light_intensity; + float vertical_gradient; + float opacity; + float fade; + float from_scale; + float to_scale; + float pad2; +} props; + +layout(location = 0) out mediump vec4 frag_color; + +void main() { + const FillExtrusionDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + +#if defined(HAS_UNIFORM_u_base) + const float base = props.light_position_base.w; +#else + const float base = max(unpack_mix_float(in_base, drawable.base_t), 0.0); +#endif + +#if defined(HAS_UNIFORM_u_height) + const float height = props.height; +#else + const float height = max(unpack_mix_float(in_height, drawable.height_t), 0.0); +#endif + +#if defined(HAS_UNIFORM_u_color) + vec4 color = props.color; +#else + vec4 color = unpack_mix_color(in_color, drawable.color_t); +#endif + + const vec3 normal = in_normal_ed.xyz; + const float t = mod(normal.x, 2.0); + const float z = t != 0.0 ? height : base; + + gl_Position = drawable.matrix * vec4(in_position, z, 1.0); + applySurfaceTransform(); + +#if defined(OVERDRAW_INSPECTOR) + frag_color = vec4(1.0); + return; +#endif + + // Relative luminance (how dark/bright is the surface color?) + const float luminance = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; + + vec4 vcolor = vec4(0.0, 0.0, 0.0, 1.0); + + // Add slight ambient lighting so no extrusions are totally black + color += vec4(0.03, 0.03, 0.03, 1.0); + + // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray + const float directionalFraction = clamp(dot(normal / 16384.0, props.light_position_base.xyz), 0.0, 1.0); + + // Adjust directional so that the range of values for highlight/shading is + // narrower with lower light intensity and with lighter/brighter surface colors + const float minDirectional = 1.0 - props.light_intensity; + const float maxDirectional = max(1.0 - luminance + props.light_intensity, 1.0); + float directional = mix(minDirectional, maxDirectional, directionalFraction); + + // Add gradient along z axis of side surfaces + if (normal.y != 0.0) { + // This avoids another branching statement, but multiplies by a constant of 0.84 if no + // vertical gradient, and otherwise calculates the gradient based on base + height + // TODO: If we're optimizing to the level of avoiding branches, we should pre-compute + // the square root when height is a uniform. + const float fMin = mix(0.7, 0.98, 1.0 - props.light_intensity); + const float factor = clamp((t + base) * pow(height / 150.0, 0.5), fMin, 1.0); + directional *= (1.0 - props.vertical_gradient) + (props.vertical_gradient * factor); + } + + // Assign final color based on surface + ambient light color, diffuse light directional, + // and light color with lower bounds adjusted to hue of light so that shading is tinted + // with the complementary (opposite) color to the light color + const vec3 light_color = props.light_color_pad.rgb; + const vec3 minLight = mix(vec3(0.0), vec3(0.3), 1.0 - light_color.rgb); + vcolor += vec4(clamp(color.rgb * directional * light_color.rgb, minLight, vec3(1.0)), 0.0); + + frag_color = vcolor * props.opacity; +} +)"; + + static constexpr auto fragment = FILL_EXTRUSION_SHADER_COMMON R"( + +layout(location = 0) in vec4 frag_color; +layout(location = 0) out vec4 out_color; + +void main() { + out_color = frag_color; +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr const char* name = "FillExtrusionPatternShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = FILL_EXTRUSION_SHADER_COMMON R"( + +layout(location = 0) in ivec2 in_position; +layout(location = 1) in ivec4 in_normal_ed; + +#if !defined(HAS_UNIFORM_u_base) +layout(location = 2) in vec2 in_base; +#endif + +#if !defined(HAS_UNIFORM_u_height) +layout(location = 3) in vec2 in_height; +#endif + +#if !defined(HAS_UNIFORM_u_pattern_from) +layout(location = 4) in uvec4 in_pattern_from; +#endif + +#if !defined(HAS_UNIFORM_u_pattern_to) +layout(location = 5) in uvec4 in_pattern_to; +#endif + +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillExtrusionDrawableUBO { + mat4 matrix; + vec2 pixel_coord_upper; + vec2 pixel_coord_lower; + float height_factor; + float tile_ratio; + // Interpolations + float base_t; + float height_t; + float color_t; + float pattern_from_t; + float pattern_to_t; + float pad1; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillExtrusionDrawableUBO) readonly buffer FillExtrusionDrawableUBOVector { + FillExtrusionDrawableUBO drawable_ubo[]; +} drawableVector; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idFillExtrusionTilePropsUBO) uniform FillExtrusionTilePropsUBO { + vec4 pattern_from; + vec4 pattern_to; + vec2 texsize; + float pad1; + float pad2; +} tileProps; + +layout(set = LAYER_SET_INDEX, binding = idFillExtrusionPropsUBO) uniform FillExtrusionPropsUBO { + vec4 color; + vec4 light_color_pad; + vec4 light_position_base; + float height; + float light_intensity; + float vertical_gradient; + float opacity; + float fade; + float from_scale; + float to_scale; + float pad2; +} props; + +layout(location = 0) out mediump vec4 frag_lighting; +layout(location = 1) out mediump vec2 frag_pos_a; +layout(location = 2) out mediump vec2 frag_pos_b; + +#if !defined(HAS_UNIFORM_u_pattern_from) +layout(location = 3) out mediump vec4 frag_pattern_from; +#endif + +#if !defined(HAS_UNIFORM_u_pattern_to) +layout(location = 4) out mediump vec4 frag_pattern_to; +#endif + +void main() { + const FillExtrusionDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; + +#if defined(HAS_UNIFORM_u_base) + const float base = props.light_position_base.w; +#else + const float base = max(unpack_mix_float(in_base, drawable.base_t), 0.0); +#endif + +#if defined(HAS_UNIFORM_u_height) + const float height = props.height; +#else + const float height = max(unpack_mix_float(in_height, drawable.height_t), 0.0); +#endif + + const vec3 normal = in_normal_ed.xyz; + const float edgedistance = in_normal_ed.w; + const float t = mod(normal.x, 2.0); + const float z = t != 0.0 ? height : base; + + gl_Position = drawable.matrix * vec4(in_position, z, 1.0); + applySurfaceTransform(); + +#if defined(OVERDRAW_INSPECTOR) + frag_color = vec4(1.0); + return; +#endif + +#if defined(HAS_UNIFORM_u_pattern_from) + const mediump vec4 pattern_from = tileProps.pattern_from; +#else + const mediump vec4 pattern_from = in_pattern_from; + frag_pattern_from = in_pattern_from; +#endif + +#if defined(HAS_UNIFORM_u_pattern_to) + const mediump vec4 pattern_to = tileProps.pattern_to; +#else + const mediump vec4 pattern_to = in_pattern_to; + frag_pattern_to = in_pattern_to; +#endif + + const vec2 pattern_tl_a = pattern_from.xy; + const vec2 pattern_br_a = pattern_from.zw; + const vec2 pattern_tl_b = pattern_to.xy; + const vec2 pattern_br_b = pattern_to.zw; + + const float pixelRatio = paintParams.pixel_ratio; + const float tileZoomRatio = drawable.tile_ratio; + const float fromScale = props.from_scale; + const float toScale = props.to_scale; + + const vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); + const vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); + + const vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 + ? vec2(in_position) // extrusion top + : vec2(edgedistance, z * drawable.height_factor); // extrusion side + + vec4 lighting = vec4(0.0, 0.0, 0.0, 1.0); + float directional = clamp(dot(normal / 16383.0, props.light_position_base.xyz), 0.0, 1.0); + directional = mix((1.0 - props.light_intensity), max((0.5 + props.light_intensity), 1.0), directional); + + if (normal.y != 0.0) { + // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, + // and otherwise calculates the gradient based on base + height + directional *= ( + (1.0 - props.vertical_gradient) + + (props.vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - props.light_intensity), 1.0))); + } + + lighting.rgb += clamp(directional * props.light_color_pad.rgb, mix(vec3(0.0), vec3(0.3), 1.0 - props.light_color_pad.rgb), vec3(1.0)); + lighting *= props.opacity; + + frag_lighting = lighting; + frag_pos_a = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, pos); + frag_pos_b = get_pattern_pos(drawable.pixel_coord_upper, drawable.pixel_coord_lower, toScale * display_size_b, tileZoomRatio, pos); + +#if !defined(HAS_UNIFORM_u_pattern_from) + frag_pattern_from = in_pattern_from; +#endif + +#if !defined(HAS_UNIFORM_u_pattern_to) + frag_pattern_to = in_pattern_to; +#endif +} +)"; + + static constexpr auto fragment = FILL_EXTRUSION_SHADER_COMMON R"( + +layout(location = 0) in mediump vec4 frag_lighting; +layout(location = 1) in mediump vec2 frag_pos_a; +layout(location = 2) in mediump vec2 frag_pos_b; + +#if !defined(HAS_UNIFORM_u_pattern_from) +layout(location = 3) in mediump vec4 frag_pattern_from; +#endif + +#if !defined(HAS_UNIFORM_u_pattern_to) +layout(location = 4) in mediump vec4 frag_pattern_to; +#endif + +layout(location = 0) out vec4 out_color; + +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct FillExtrusionTilePropsUBO { + vec4 pattern_from; + vec4 pattern_to; + vec2 texsize; + float pad1; + float pad2; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idFillExtrusionTilePropsUBO) readonly buffer FillExtrusionTilePropsUBOVector { + FillExtrusionTilePropsUBO tile_props_ubo[]; +} tilePropsVector; + +layout(set = LAYER_SET_INDEX, binding = idFillExtrusionPropsUBO) uniform FillExtrusionPropsUBO { + vec4 color; + vec4 light_color_pad; + vec4 light_position_base; + float height; + float light_intensity; + float vertical_gradient; + float opacity; + float fade; + float from_scale; + float to_scale; + float pad2; +} props; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image0_sampler; + +void main() { + +#if defined(OVERDRAW_INSPECTOR) + out_color = vec4(1.0); + return; +#endif + + const FillExtrusionTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + +#if defined(HAS_UNIFORM_u_pattern_from) + const vec4 pattern_from = tileProps.pattern_from; +#else + const vec4 pattern_from = frag_pattern_from; +#endif +#if defined(HAS_UNIFORM_u_pattern_to) + const vec4 pattern_to = tileProps.pattern_to; +#else + const vec4 pattern_to = frag_pattern_to; +#endif + + const vec2 pattern_tl_a = pattern_from.xy; + const vec2 pattern_br_a = pattern_from.zw; + const vec2 pattern_tl_b = pattern_to.xy; + const vec2 pattern_br_b = pattern_to.zw; + + const vec2 imagecoord = mod(frag_pos_a, 1.0); + const vec2 pos = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, imagecoord); + const vec4 color1 = texture(image0_sampler, pos); + + const vec2 imagecoord_b = mod(frag_pos_b, 1.0); + const vec2 pos2 = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, imagecoord_b); + const vec4 color2 = texture(image0_sampler, pos2); + + out_color = mix(color1, color2, props.fade) * frag_lighting; +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/heatmap.hpp b/include/mbgl/shaders/vulkan/heatmap.hpp index 8d45f7e7241f..19418a03b0a0 100644 --- a/include/mbgl/shaders/vulkan/heatmap.hpp +++ b/include/mbgl/shaders/vulkan/heatmap.hpp @@ -6,16 +6,23 @@ namespace mbgl { namespace shaders { +#define HEATMAP_SHADER_PRELUDE \ + R"( + +#define idHeatmapDrawableUBO idDrawableReservedVertexOnlyUBO +#define idHeatmapEvaluatedPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "HeatmapShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = HEATMAP_SHADER_PRELUDE R"( // Effective "0" in the kernel density texture to adjust the kernel size to; // this empirically chosen number minimizes artifacts on overlapping kernels @@ -35,20 +42,24 @@ layout(location = 1) in vec2 in_weight; layout(location = 2) in vec2 in_radius; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform HeatmapDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct HeatmapDrawableUBO { mat4 matrix; float extrude_scale; - float pad1; - vec2 pad2; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform HeatmapInterpolateUBO { + // Interpolations float weight_t; float radius_t; - vec2 pad1; -} interp; + float pad1; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idHeatmapDrawableUBO) readonly buffer HeatmapDrawableUBOVector { + HeatmapDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform HeatmapEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idHeatmapEvaluatedPropsUBO) uniform HeatmapEvaluatedPropsUBO { float weight; float radius; float intensity; @@ -59,17 +70,18 @@ layout(location = 0) out float frag_weight; layout(location = 1) out lowp vec2 frag_extrude; void main() { + const HeatmapDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #if defined(HAS_UNIFORM_u_weight) const float weight = props.weight; #else - const float weight = unpack_mix_float(in_weight, interp.weight_t); + const float weight = unpack_mix_float(in_weight, drawable.weight_t); #endif #if defined(HAS_UNIFORM_u_radius) const float radius = props.radius; #else - const float radius = unpack_mix_float(in_radius, interp.radius_t); + const float radius = unpack_mix_float(in_radius, drawable.radius_t); #endif // unencode the extrusion vector that we snuck into the a_pos vector @@ -105,7 +117,7 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = HEATMAP_SHADER_PRELUDE R"( // Gaussian kernel coefficient: 1 / sqrt(2 * PI) #define GAUSS_COEF 0.3989422804014327 @@ -115,7 +127,7 @@ layout(location = 1) in lowp vec2 frag_extrude; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform HeatmapEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idHeatmapEvaluatedPropsUBO) uniform HeatmapEvaluatedPropsUBO { float weight; float radius; float intensity; @@ -138,63 +150,5 @@ void main() { )"; }; -template <> -struct ShaderSource { - static constexpr const char* name = "HeatmapTextureShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto vertex = R"( - -layout(location = 0) in ivec2 in_position; - -layout(set = LAYER_SET_INDEX, binding = 0) uniform HeatmapTexturePropsUBO { - mat4 matrix; - float opacity; - float pad1, pad2, pad3; -} props; - -layout(location = 0) out vec2 frag_position; - -void main() { - - gl_Position = props.matrix * vec4(in_position * global.world_size, 0, 1); - applySurfaceTransform(); - - frag_position = in_position; -} -)"; - - static constexpr auto fragment = R"( - -layout(location = 0) in vec2 frag_position; -layout(location = 0) out vec4 out_color; - -layout(set = LAYER_SET_INDEX, binding = 0) uniform HeatmapTexturePropsUBO { - mat4 matrix; - float opacity; - float pad1, pad2, pad3; -} props; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 1) uniform sampler2D color_ramp_sampler; - -void main() { - -#if defined(OVERDRAW_INSPECTOR) - out_color = vec4(1.0); - return; -#endif - - const float t = texture(image_sampler, frag_position).r; - const vec4 color = texture(color_ramp_sampler, vec2(t, 0.5)); - out_color = color * props.opacity; -} -)"; -}; - } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/heatmap_texture.hpp b/include/mbgl/shaders/vulkan/heatmap_texture.hpp new file mode 100644 index 000000000000..60c1439e1d62 --- /dev/null +++ b/include/mbgl/shaders/vulkan/heatmap_texture.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +#define HEATMAP_TEXTURE_SHADER_PRELUDE \ + R"( + +#define idHeatmapTexturePropsUBO layerUBOStartId + +)" + +template <> +struct ShaderSource { + static constexpr const char* name = "HeatmapTextureShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = HEATMAP_TEXTURE_SHADER_PRELUDE R"( + +layout(location = 0) in ivec2 in_position; + +layout(set = LAYER_SET_INDEX, binding = idHeatmapTexturePropsUBO) uniform HeatmapTexturePropsUBO { + mat4 matrix; + float opacity; + float pad1; + float pad2; + float pad3; +} props; + +layout(location = 0) out vec2 frag_position; + +void main() { + + gl_Position = props.matrix * vec4(in_position * paintParams.world_size, 0, 1); + applySurfaceTransform(); + + frag_position = in_position; +} +)"; + + static constexpr auto fragment = HEATMAP_TEXTURE_SHADER_PRELUDE R"( + +layout(location = 0) in vec2 frag_position; +layout(location = 0) out vec4 out_color; + +layout(set = LAYER_SET_INDEX, binding = idHeatmapTexturePropsUBO) uniform HeatmapTexturePropsUBO { + mat4 matrix; + float opacity; + float pad1; + float pad2; + float pad3; +} props; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 1) uniform sampler2D color_ramp_sampler; + +void main() { + +#if defined(OVERDRAW_INSPECTOR) + out_color = vec4(1.0); + return; +#endif + + const float t = texture(image_sampler, frag_position).r; + const vec4 color = texture(color_ramp_sampler, vec2(t, 0.5)); + out_color = color * props.opacity; +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/hillshade.hpp b/include/mbgl/shaders/vulkan/hillshade.hpp index f034a07e5fe4..9a7709a933a4 100644 --- a/include/mbgl/shaders/vulkan/hillshade.hpp +++ b/include/mbgl/shaders/vulkan/hillshade.hpp @@ -6,147 +6,44 @@ namespace mbgl { namespace shaders { -template <> -struct ShaderSource { - static constexpr const char* name = "HillshadePrepareShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto vertex = R"( - -layout(location = 0) in ivec2 in_position; -layout(location = 1) in ivec2 in_texture_position; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform HillshadePrepareDrawableUBO { - mat4 matrix; - vec4 unpack; - vec2 dimension; - float zoom; - float maxzoom; -} drawable; - -layout(location = 0) out vec2 frag_position; - -void main() { - - gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); - applySurfaceTransform(); - - const vec2 epsilon = vec2(1.0) / drawable.dimension; - const float scale = (drawable.dimension.x - 2.0) / drawable.dimension.x; - frag_position = in_texture_position / 8192.0 * scale + epsilon; -} -)"; - - static constexpr auto fragment = R"( - -layout(location = 0) in vec2 frag_position; -layout(location = 0) out vec4 out_color; +#define HILLSHADE_SHADER_PRELUDE \ + R"( -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform HillshadePrepareDrawableUBO { - mat4 matrix; - vec4 unpack; - vec2 dimension; - float zoom; - float maxzoom; -} drawable; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; +#define idHillshadeDrawableUBO idDrawableReservedVertexOnlyUBO +#define idHillshadeTilePropsUBO idDrawableReservedFragmentOnlyUBO +#define idHillshadeEvaluatedPropsUBO layerUBOStartId -float getElevation(vec2 coord, float bias, sampler2D image_sampler, vec4 unpack) { - // Convert encoded elevation value to meters - vec4 data = texture(image_sampler, coord) * 255.0; - data.a = -1.0; - return dot(data, unpack) / 4.0; -} - -void main() { - -#if defined(OVERDRAW_INSPECTOR) - out_color = vec4(1.0); - return; -#endif - - const vec2 epsilon = 1.0 / drawable.dimension; - - // queried pixels: - // +-----------+ - // | | | | - // | a | b | c | - // | | | | - // +-----------+ - // | | | | - // | d | e | f | - // | | | | - // +-----------+ - // | | | | - // | g | h | i | - // | | | | - // +-----------+ - - float a = getElevation(frag_position + vec2(-epsilon.x, -epsilon.y), 0.0, image_sampler, drawable.unpack); - float b = getElevation(frag_position + vec2(0, -epsilon.y), 0.0, image_sampler, drawable.unpack); - float c = getElevation(frag_position + vec2(epsilon.x, -epsilon.y), 0.0, image_sampler, drawable.unpack); - float d = getElevation(frag_position + vec2(-epsilon.x, 0), 0.0, image_sampler, drawable.unpack); - //float e = getElevation(frag_position, 0.0, image_sampler, drawable.unpack); - float f = getElevation(frag_position + vec2(epsilon.x, 0), 0.0, image_sampler, drawable.unpack); - float g = getElevation(frag_position + vec2(-epsilon.x, epsilon.y), 0.0, image_sampler, drawable.unpack); - float h = getElevation(frag_position + vec2(0, epsilon.y), 0.0, image_sampler, drawable.unpack); - float i = getElevation(frag_position + vec2(epsilon.x, epsilon.y), 0.0, image_sampler, drawable.unpack); - - // here we divide the x and y slopes by 8 * pixel size - // where pixel size (aka meters/pixel) is: - // circumference of the world / (pixels per tile * number of tiles) - // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom)) - // which can be reduced to: pow(2, 19.25619978527 - u_zoom) - // we want to vertically exaggerate the hillshading though, because otherwise - // it is barely noticeable at low zooms. to do this, we multiply this by some - // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value - // Here we use a=0.3 which works out to the expression below. see - // nickidlugash's awesome breakdown for more info - // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556 - float exaggeration = drawable.zoom < 2.0 ? 0.4 : drawable.zoom < 4.5 ? 0.35 : 0.3; - - vec2 deriv = vec2( - (c + f + f + i) - (a + d + d + g), - (g + h + h + i) - (a + b + b + c) - ) / pow(2.0, (drawable.zoom - drawable.maxzoom) * exaggeration + 19.2562 - drawable.zoom); - - out_color = clamp(vec4( - deriv.x / 2.0 + 0.5, - deriv.y / 2.0 + 0.5, - 1.0, - 1.0), 0.0, 1.0); -} -)"; -}; +)" template <> struct ShaderSource { static constexpr const char* name = "HillshadeShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = HILLSHADE_SHADER_PRELUDE R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_texture_position; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform HillshadeDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct HillshadeDrawableUBO { mat4 matrix; - vec2 latrange; - vec2 light; -} drawable; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idHillshadeDrawableUBO) readonly buffer HillshadeDrawableUBOVector { + HillshadeDrawableUBO drawable_ubo[]; +} drawableVector; layout(location = 0) out vec2 frag_position; void main() { + const HillshadeDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); applySurfaceTransform(); @@ -156,18 +53,25 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = HILLSHADE_SHADER_PRELUDE R"( layout(location = 0) in vec2 frag_position; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform HillshadeDrawableUBO { - mat4 matrix; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct HillshadeTilePropsUBO { vec2 latrange; vec2 light; -} drawable; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idHillshadeTilePropsUBO) readonly buffer HillshadeTilePropsUBOVector { + HillshadeTilePropsUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform HillshadeEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idHillshadeEvaluatedPropsUBO) uniform HillshadeEvaluatedPropsUBO { vec4 highlight; vec4 shadow; vec4 accent; @@ -182,22 +86,24 @@ void main() { return; #endif + const HillshadeTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + vec4 pixel = texture(image_sampler, frag_position); vec2 deriv = pixel.rg * 2.0 - 1.0; // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude // to account for mercator projection distortion. see #4807 for details - float scaleFactor = cos(radians((drawable.latrange[0] - drawable.latrange[1]) * frag_position.y + drawable.latrange[1])); + float scaleFactor = cos(radians((tileProps.latrange[0] - tileProps.latrange[1]) * frag_position.y + tileProps.latrange[1])); // We also multiply the slope by an arbitrary z-factor of 1.25 float slope = atan(1.25 * length(deriv) / scaleFactor); float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : M_PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0); - float intensity = drawable.light.x; + float intensity = tileProps.light.x; // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal // position property to account for 0deg corresponding to north/the top of the viewport in the style spec // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal. - float azimuth = drawable.light.y + M_PI; + float azimuth = tileProps.light.y + M_PI; // We scale the slope exponentially based on intensity, using a calculation similar to // the exponential interpolation function in the style spec: diff --git a/include/mbgl/shaders/vulkan/hillshade_prepare.hpp b/include/mbgl/shaders/vulkan/hillshade_prepare.hpp new file mode 100644 index 000000000000..4b079a075967 --- /dev/null +++ b/include/mbgl/shaders/vulkan/hillshade_prepare.hpp @@ -0,0 +1,137 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +#define HILLSHADE_PREPARE_SHADER_PRELUDE \ + R"( + +#define idHillshadePrepareDrawableUBO idDrawableReservedVertexOnlyUBO +#define idHillshadePrepareTilePropsUBO drawableReservedUBOCount + +)" + +template <> +struct ShaderSource { + static constexpr const char* name = "HillshadePrepareShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = HILLSHADE_PREPARE_SHADER_PRELUDE R"( + +layout(location = 0) in ivec2 in_position; +layout(location = 1) in ivec2 in_texture_position; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idHillshadePrepareDrawableUBO) uniform HillshadePrepareDrawableUBO { + mat4 matrix; +} drawable; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idHillshadePrepareTilePropsUBO) uniform HillshadePrepareTilePropsUBO { + vec4 unpack; + vec2 dimension; + float zoom; + float maxzoom; +} tileProps; + +layout(location = 0) out vec2 frag_position; + +void main() { + + gl_Position = drawable.matrix * vec4(in_position, 0.0, 1.0); + applySurfaceTransform(); + + const vec2 epsilon = vec2(1.0) / tileProps.dimension; + const float scale = (tileProps.dimension.x - 2.0) / tileProps.dimension.x; + frag_position = in_texture_position / 8192.0 * scale + epsilon; +} +)"; + + static constexpr auto fragment = HILLSHADE_PREPARE_SHADER_PRELUDE R"( + +layout(location = 0) in vec2 frag_position; +layout(location = 0) out vec4 out_color; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idHillshadePrepareTilePropsUBO) uniform HillshadePrepareTilePropsUBO { + vec4 unpack; + vec2 dimension; + float zoom; + float maxzoom; +} tileProps; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; + +float getElevation(vec2 coord, float bias, sampler2D image_sampler, vec4 unpack) { + // Convert encoded elevation value to meters + vec4 data = texture(image_sampler, coord) * 255.0; + data.a = -1.0; + return dot(data, unpack) / 4.0; +} + +void main() { + +#if defined(OVERDRAW_INSPECTOR) + out_color = vec4(1.0); + return; +#endif + + const vec2 epsilon = 1.0 / tileProps.dimension; + + // queried pixels: + // +-----------+ + // | | | | + // | a | b | c | + // | | | | + // +-----------+ + // | | | | + // | d | e | f | + // | | | | + // +-----------+ + // | | | | + // | g | h | i | + // | | | | + // +-----------+ + + float a = getElevation(frag_position + vec2(-epsilon.x, -epsilon.y), 0.0, image_sampler, tileProps.unpack); + float b = getElevation(frag_position + vec2(0, -epsilon.y), 0.0, image_sampler, tileProps.unpack); + float c = getElevation(frag_position + vec2(epsilon.x, -epsilon.y), 0.0, image_sampler, tileProps.unpack); + float d = getElevation(frag_position + vec2(-epsilon.x, 0), 0.0, image_sampler, tileProps.unpack); + //float e = getElevation(frag_position, 0.0, image_sampler, tileProps.unpack); + float f = getElevation(frag_position + vec2(epsilon.x, 0), 0.0, image_sampler, tileProps.unpack); + float g = getElevation(frag_position + vec2(-epsilon.x, epsilon.y), 0.0, image_sampler, tileProps.unpack); + float h = getElevation(frag_position + vec2(0, epsilon.y), 0.0, image_sampler, tileProps.unpack); + float i = getElevation(frag_position + vec2(epsilon.x, epsilon.y), 0.0, image_sampler, tileProps.unpack); + + // here we divide the x and y slopes by 8 * pixel size + // where pixel size (aka meters/pixel) is: + // circumference of the world / (pixels per tile * number of tiles) + // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom)) + // which can be reduced to: pow(2, 19.25619978527 - u_zoom) + // we want to vertically exaggerate the hillshading though, because otherwise + // it is barely noticeable at low zooms. to do this, we multiply this by some + // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value + // Here we use a=0.3 which works out to the expression below. see + // nickidlugash's awesome breakdown for more info + // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556 + float exaggeration = tileProps.zoom < 2.0 ? 0.4 : tileProps.zoom < 4.5 ? 0.35 : 0.3; + + vec2 deriv = vec2( + (c + f + f + i) - (a + d + d + g), + (g + h + h + i) - (a + b + b + c) + ) / pow(2.0, (tileProps.zoom - tileProps.maxzoom) * exaggeration + 19.2562 - tileProps.zoom); + + out_color = clamp(vec4( + deriv.x / 2.0 + 0.5, + deriv.y / 2.0 + 0.5, + 1.0, + 1.0), 0.0, 1.0); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/line.hpp b/include/mbgl/shaders/vulkan/line.hpp index 08716d654c08..7873f9fe8cbc 100644 --- a/include/mbgl/shaders/vulkan/line.hpp +++ b/include/mbgl/shaders/vulkan/line.hpp @@ -6,16 +6,24 @@ namespace mbgl { namespace shaders { +#define LINE_SHADER_COMMON \ + R"( + +#define idLineDrawableUBO idDrawableReservedVertexOnlyUBO +#define idLineTilePropsUBO idDrawableReservedFragmentOnlyUBO +#define idLineEvaluatedPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "LineShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = LINE_SHADER_COMMON R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -44,23 +52,30 @@ layout(location = 6) in vec2 in_offset; layout(location = 7) in vec2 in_width; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LineDrawableUBO { mat4 matrix; mediump float ratio; - float pad1, pad2, pad3; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineInterpolationUBO { + // Interpolations float color_t; float blur_t; float opacity_t; float gapwidth_t; float offset_t; float width_t; - float pad1, pad2; -} interp; + float pad1; + vec4 pad2; + vec4 pad3; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idLineDrawableUBO) readonly buffer LineDrawableUBOVector { + LineDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -89,33 +104,34 @@ layout(location = 5) out lowp float frag_opacity; #endif void main() { + const LineDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #ifndef HAS_UNIFORM_u_color - frag_color = unpack_mix_color(in_color, interp.color_t); + frag_color = unpack_mix_color(in_color, drawable.color_t); #endif #ifndef HAS_UNIFORM_u_blur - frag_blur = unpack_mix_float(in_blur, interp.blur_t); + frag_blur = unpack_mix_float(in_blur, drawable.blur_t); #endif #ifndef HAS_UNIFORM_u_opacity - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif #ifndef HAS_UNIFORM_u_gapwidth - const mediump float gapwidth = unpack_mix_float(in_gapwidth, interp.gapwidth_t) / 2.0; + const mediump float gapwidth = unpack_mix_float(in_gapwidth, drawable.gapwidth_t) / 2.0; #else const mediump float gapwidth = props.gapwidth / 2.0; #endif #ifndef HAS_UNIFORM_u_offset - const lowp float offset = unpack_mix_float(in_offset, interp.offset_t) * -1.0; + const lowp float offset = unpack_mix_float(in_offset, drawable.offset_t) * -1.0; #else const lowp float offset = props.offset * -1.0; #endif #ifndef HAS_UNIFORM_u_width - mediump float width = unpack_mix_float(in_width, interp.width_t); + mediump float width = unpack_mix_float(in_width, drawable.width_t); #else mediump float width = props.width; #endif @@ -159,14 +175,14 @@ void main() { // calculate how much the perspective view squishes or stretches the extrude float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * global.units_to_pixels); + float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * paintParams.units_to_pixels); frag_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; frag_width2 = vec2(outset, inset); } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = LINE_SHADER_COMMON R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -186,7 +202,7 @@ layout(location = 5) in lowp float frag_opacity; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -241,12 +257,11 @@ template <> struct ShaderSource { static constexpr const char* name = "LineGradientShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = LINE_SHADER_COMMON R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -271,23 +286,30 @@ layout(location = 5) in vec2 in_offset; layout(location = 6) in vec2 in_width; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LineGradientDrawableUBO { mat4 matrix; mediump float ratio; - float pad1, pad2, pad3; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineInterpolationUBO { - float color_t; + // Interpolations float blur_t; float opacity_t; float gapwidth_t; float offset_t; float width_t; - float pad1, pad2; -} interp; + float pad1; + float pad2; + vec4 pad3; + vec4 pad4; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idLineDrawableUBO) readonly buffer LineGradientDrawableUBOVector { + LineGradientDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -313,29 +335,30 @@ layout(location = 5) out lowp float frag_opacity; #endif void main() { + const LineGradientDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #ifndef HAS_UNIFORM_u_blur - frag_blur = unpack_mix_float(in_blur, interp.blur_t); + frag_blur = unpack_mix_float(in_blur, drawable.blur_t); #endif #ifndef HAS_UNIFORM_u_opacity - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif #ifndef HAS_UNIFORM_u_gapwidth - mediump float gapwidth = unpack_mix_float(in_gapwidth, interp.gapwidth_t) / 2.0; + mediump float gapwidth = unpack_mix_float(in_gapwidth, drawable.gapwidth_t) / 2.0; #else mediump float gapwidth = props.gapwidth / 2.0; #endif #ifndef HAS_UNIFORM_u_offset - const lowp float offset = unpack_mix_float(in_offset, interp.offset_t) * -1.0; + const lowp float offset = unpack_mix_float(in_offset, drawable.offset_t) * -1.0; #else const lowp float offset = props.offset * -1.0; #endif #ifndef HAS_UNIFORM_u_width - mediump float width = unpack_mix_float(in_width, interp.width_t); + mediump float width = unpack_mix_float(in_width, drawable.width_t); #else mediump float width = props.width; #endif @@ -380,14 +403,14 @@ void main() { // calculate how much the perspective view squishes or stretches the extrude float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * global.units_to_pixels); + float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * paintParams.units_to_pixels); frag_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; frag_width2 = vec2(outset, inset); } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = LINE_SHADER_COMMON R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -406,7 +429,7 @@ layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image0_sam layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -459,12 +482,11 @@ template <> struct ShaderSource { static constexpr const char* name = "LinePatternShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = LINE_SHADER_COMMON R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -497,15 +519,14 @@ layout(location = 7) in uvec4 in_pattern_from; layout(location = 8) in uvec4 in_pattern_to; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LinePatternDrawableUBO { mat4 matrix; - vec4 scale; - vec2 texsize; float ratio; - float fade; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineInterpolationUBO { + // Interpolations float blur_t; float opacity_t; float offset_t; @@ -513,15 +534,15 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineInterpolationUBO { float width_t; float pattern_from_t; float pattern_to_t; - float pad1; -} interp; + vec4 pad1; + vec4 pad2; +}; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform LinePatternTilePropertiesUBO { - vec4 pattern_from; - vec4 pattern_to; -} tile; +layout(std140, set = LAYER_SET_INDEX, binding = idLineDrawableUBO) readonly buffer LinePatternDrawableUBOVector { + LinePatternDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -555,29 +576,30 @@ layout(location = 7) out mediump vec4 frag_pattern_to; #endif void main() { + const LinePatternDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #ifndef HAS_UNIFORM_u_blur - frag_blur = unpack_mix_float(in_blur, interp.blur_t); + frag_blur = unpack_mix_float(in_blur, drawable.blur_t); #endif #ifndef HAS_UNIFORM_u_opacity - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif #ifndef HAS_UNIFORM_u_gapwidth - const mediump float gapwidth = unpack_mix_float(in_gapwidth, interp.gapwidth_t) / 2.0; + const mediump float gapwidth = unpack_mix_float(in_gapwidth, drawable.gapwidth_t) / 2.0; #else const mediump float gapwidth = props.gapwidth / 2.0; #endif #ifndef HAS_UNIFORM_u_offset - const lowp float offset = unpack_mix_float(in_offset, interp.offset_t) * -1.0; + const lowp float offset = unpack_mix_float(in_offset, drawable.offset_t) * -1.0; #else const lowp float offset = props.offset * -1.0; #endif #ifndef HAS_UNIFORM_u_width - mediump float width = unpack_mix_float(in_width, interp.width_t); + mediump float width = unpack_mix_float(in_width, drawable.width_t); #else mediump float width = props.width; #endif @@ -630,7 +652,7 @@ void main() { // calculate how much the perspective view squishes or stretches the extrude float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * global.units_to_pixels); + float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * paintParams.units_to_pixels); frag_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; frag_width2 = vec2(outset, inset); @@ -638,7 +660,7 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = LINE_SHADER_COMMON R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -663,20 +685,24 @@ layout(location = 7) in mediump vec4 frag_pattern_to; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineDrawableUBO { - mat4 matrix; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LinePatternTilePropertiesUBO { + vec4 pattern_from; + vec4 pattern_to; vec4 scale; vec2 texsize; - float ratio; float fade; -} drawable; + float pad1; +}; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform LinePatternTilePropertiesUBO { - vec4 pattern_from; - vec4 pattern_to; -} tile; +layout(std140, set = LAYER_SET_INDEX, binding = idLineTilePropsUBO) readonly buffer LinePatternTilePropertiesUBOVector { + LinePatternTilePropertiesUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -697,6 +723,8 @@ void main() { return; #endif + const LinePatternTilePropertiesUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #ifdef HAS_UNIFORM_u_blur const lowp float blur = props.blur; #else @@ -710,13 +738,13 @@ void main() { #endif #ifdef HAS_UNIFORM_u_pattern_from - const lowp vec4 pattern_from = tile.pattern_from; + const lowp vec4 pattern_from = tileProps.pattern_from; #else const lowp vec4 pattern_from = frag_pattern_from; #endif #ifdef HAS_UNIFORM_u_pattern_to - const lowp vec4 pattern_to = tile.pattern_to; + const lowp vec4 pattern_to = tileProps.pattern_to; #else const lowp vec4 pattern_to = frag_pattern_to; #endif @@ -726,10 +754,10 @@ void main() { const vec2 pattern_tl_b = pattern_to.xy; const vec2 pattern_br_b = pattern_to.zw; - const float pixelRatio = drawable.scale.x; - const float tileZoomRatio = drawable.scale.y; - const float fromScale = drawable.scale.z; - const float toScale = drawable.scale.w; + const float pixelRatio = tileProps.scale.x; + const float tileZoomRatio = tileProps.scale.y; + const float fromScale = tileProps.scale.z; + const float toScale = tileProps.scale.w; const vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); const vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); @@ -756,10 +784,10 @@ void main() { // the texture coordinate const float y_a = 0.5 + (frag_normal.y * clamp(frag_width2.x, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y); const float y_b = 0.5 + (frag_normal.y * clamp(frag_width2.x, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y); - const vec2 pos_a = mix(pattern_tl_a / drawable.texsize, pattern_br_a / drawable.texsize, vec2(x_a, y_a)); - const vec2 pos_b = mix(pattern_tl_b / drawable.texsize, pattern_br_b / drawable.texsize, vec2(x_b, y_b)); + const vec2 pos_a = mix(pattern_tl_a / tileProps.texsize, pattern_br_a / tileProps.texsize, vec2(x_a, y_a)); + const vec2 pos_b = mix(pattern_tl_b / tileProps.texsize, pattern_br_b / tileProps.texsize, vec2(x_b, y_b)); - const vec4 color = mix(texture(image0_sampler, pos_a), texture(image0_sampler, pos_b), drawable.fade); + const vec4 color = mix(texture(image0_sampler, pos_a), texture(image0_sampler, pos_b), tileProps.fade); out_color = color * (alpha * opacity); } @@ -770,12 +798,11 @@ template <> struct ShaderSource { static constexpr const char* name = "LineSDFShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = LINE_SHADER_COMMON R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -808,19 +835,18 @@ layout(location = 7) in vec2 in_width; layout(location = 8) in vec2 in_floorwidth; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineSDFDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LineSDFDrawableUBO { mat4 matrix; vec2 patternscale_a; vec2 patternscale_b; - float ratio; float tex_y_a; float tex_y_b; - float sdfgamma; - float mix; - float pad1, pad2, pad3; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineSDFInterpolationUBO { + float ratio; + // Interpolations float color_t; float blur_t; float opacity_t; @@ -829,9 +855,14 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineSDFInterpolationUB float width_t; float floorwidth_t; float pad1; -} interp; + float pad2; +}; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idLineDrawableUBO) readonly buffer LineSDFDrawableUBOVector { + LineSDFDrawableUBO drawable_ubo[]; +} drawableVector; + +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -866,40 +897,41 @@ layout(location = 8) out mediump float frag_floorwidth; #endif void main() { + const LineSDFDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; #ifndef HAS_UNIFORM_u_color - frag_color = unpack_mix_color(in_color, interp.color_t); + frag_color = unpack_mix_color(in_color, drawable.color_t); #endif #ifndef HAS_UNIFORM_u_blur - frag_blur = unpack_mix_float(in_blur, interp.blur_t); + frag_blur = unpack_mix_float(in_blur, drawable.blur_t); #endif #ifndef HAS_UNIFORM_u_opacity - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif #ifndef HAS_UNIFORM_u_floorwidth - const float floorwidth = unpack_mix_float(in_floorwidth, interp.floorwidth_t); + const float floorwidth = unpack_mix_float(in_floorwidth, drawable.floorwidth_t); frag_floorwidth = floorwidth; #else const float floorwidth = props.floorwidth; #endif #ifndef HAS_UNIFORM_u_offset - const mediump float offset = unpack_mix_float(in_offset, interp.offset_t) * -1.0; + const mediump float offset = unpack_mix_float(in_offset, drawable.offset_t) * -1.0; #else const mediump float offset = props.offset * -1.0; #endif #ifndef HAS_UNIFORM_u_width - const mediump float width = unpack_mix_float(in_width, interp.width_t); + const mediump float width = unpack_mix_float(in_width, drawable.width_t); #else const mediump float width = props.width; #endif #ifndef HAS_UNIFORM_u_gapwidth - const mediump float gapwidth = unpack_mix_float(in_gapwidth, interp.gapwidth_t) / 2.0; + const mediump float gapwidth = unpack_mix_float(in_gapwidth, drawable.gapwidth_t) / 2.0; #else const mediump float gapwidth = props.gapwidth / 2.0; #endif @@ -945,7 +977,7 @@ void main() { // calculate how much the perspective view squishes or stretches the extrude float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * global.units_to_pixels); + float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * paintParams.units_to_pixels); frag_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; frag_width2 = vec2(outset, inset); @@ -955,7 +987,7 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = LINE_SHADER_COMMON R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -981,30 +1013,25 @@ layout(location = 8) in mediump float frag_floorwidth; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform LineSDFDrawableUBO { - mat4 matrix; - vec2 patternscale_a; - vec2 patternscale_b; - float ratio; - float tex_y_a; - float tex_y_b; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct LineSDFTilePropsUBO { float sdfgamma; float mix; - float pad1, pad2, pad3; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform LineSDFInterpolationUBO { - float color_t; - float blur_t; - float opacity_t; - float gapwidth_t; - float offset_t; - float width_t; - float floorwidth_t; float pad1; -} interp; + float pad2; + vec4 pad3; + vec4 pad4; + vec4 pad5; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idLineTilePropsUBO) readonly buffer LineSDFTilePropsUBOVector { + LineSDFTilePropsUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform LineEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idLineEvaluatedPropsUBO) uniform LineEvaluatedPropsUBO { vec4 color; float blur; float opacity; @@ -1025,6 +1052,8 @@ void main() { return; #endif + const LineSDFTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #ifdef HAS_UNIFORM_u_color const lowp vec4 color = props.color; #else @@ -1058,9 +1087,9 @@ void main() { const float sdfdist_a = texture(image0_sampler, frag_tex_a).a; const float sdfdist_b = texture(image0_sampler, frag_tex_b).a; - const float sdfdist = mix(sdfdist_a, sdfdist_b, drawable.mix); + const float sdfdist = mix(sdfdist_a, sdfdist_b, tileProps.mix); const float alpha = clamp(min(dist - (frag_width2.y - blur2), frag_width2.x - dist) / blur2, 0.0, 1.0) * - smoothstep(0.5 - drawable.sdfgamma / floorwidth, 0.5 + drawable.sdfgamma / floorwidth, sdfdist); + smoothstep(0.5 - tileProps.sdfgamma / floorwidth, 0.5 + tileProps.sdfgamma / floorwidth, sdfdist); out_color = color * (alpha * opacity); } diff --git a/include/mbgl/shaders/vulkan/location_indicator.hpp b/include/mbgl/shaders/vulkan/location_indicator.hpp new file mode 100644 index 000000000000..a1181fdc9b2f --- /dev/null +++ b/include/mbgl/shaders/vulkan/location_indicator.hpp @@ -0,0 +1,92 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +#define LOCATION_INDICATOR_SHADER_PRELUDE \ + R"( + +#define idLocationIndicatorDrawableUBO drawableReservedUBOCount + +)" + +template <> +struct ShaderSource { + static constexpr const char* name = "LocationIndicatorShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = LOCATION_INDICATOR_SHADER_PRELUDE R"( +layout(location = 0) in vec2 in_position; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idLocationIndicatorDrawableUBO) uniform LocationIndicatorDrawableUBO { + mat4 matrix; + vec4 color; +} drawable; + +void main() { + gl_Position = drawable.matrix * vec4(in_position, 0, 1); + applySurfaceTransform(); +} +)"; + + static constexpr auto fragment = LOCATION_INDICATOR_SHADER_PRELUDE R"( +layout(location = 0) out vec4 out_color; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idLocationIndicatorDrawableUBO) uniform LocationIndicatorDrawableUBO { + mat4 matrix; + vec4 color; +} drawable; + +void main() { + out_color = drawable.color; +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr const char* name = "LocationIndicatorTexturedShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto vertex = LOCATION_INDICATOR_SHADER_PRELUDE R"( +layout(location = 0) in vec2 in_position; +layout(location = 1) in vec2 in_texcoord; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idLocationIndicatorDrawableUBO) uniform LocationIndicatorDrawableUBO { + mat4 matrix; + vec4 color; +} drawable; + +layout(location = 0) out vec2 frag_uv; + +void main() { + gl_Position = drawable.matrix * vec4(in_position, 0, 1); + applySurfaceTransform(); + + frag_uv = in_texcoord; +} +)"; + + static constexpr auto fragment = R"( +layout(location = 0) in vec2 frag_uv; +layout(location = 0) out vec4 out_color; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; + +void main() { + out_color = texture(image_sampler, frag_uv); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/raster.hpp b/include/mbgl/shaders/vulkan/raster.hpp index c8677d6d4880..6727ec0dc31d 100644 --- a/include/mbgl/shaders/vulkan/raster.hpp +++ b/include/mbgl/shaders/vulkan/raster.hpp @@ -3,6 +3,14 @@ #include #include +#define RASTER_SHADER_PRELUDE \ + R"( + +#define idRasterDrawableUBO idDrawableReservedVertexOnlyUBO +#define idRasterEvaluatedPropsUBO layerUBOStartId + +)" + namespace mbgl { namespace shaders { @@ -10,21 +18,28 @@ template <> struct ShaderSource { static constexpr const char* name = "RasterShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = RASTER_SHADER_PRELUDE R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_texture_position; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform RasterDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct RasterDrawableUBO { mat4 matrix; -} drawable; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idRasterDrawableUBO) readonly buffer RasterDrawableUBOVector { + RasterDrawableUBO drawable_ubo[]; +} drawableVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform RasterEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idRasterEvaluatedPropsUBO) uniform RasterEvaluatedPropsUBO { vec4 spin_weights; vec2 tl_parent; float scale_parent; @@ -35,13 +50,15 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform RasterEvaluatedPropsUBO { float brightness_high; float saturation_factor; float contrast_factor; - float pad1, pad2; + float pad1; + float pad2; } props; layout(location = 0) out vec2 frag_position0; layout(location = 1) out vec2 frag_position1; void main() { + const RasterDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; gl_Position = drawable.matrix * vec4(in_position, 0, 1); applySurfaceTransform(); @@ -56,14 +73,14 @@ void main() { } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = RASTER_SHADER_PRELUDE R"( layout(location = 0) in vec2 frag_position0; layout(location = 1) in vec2 frag_position1; layout(location = 0) out vec4 out_color; -layout(set = LAYER_SET_INDEX, binding = 0) uniform RasterEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idRasterEvaluatedPropsUBO) uniform RasterEvaluatedPropsUBO { vec4 spin_weights; vec2 tl_parent; float scale_parent; @@ -74,7 +91,8 @@ layout(set = LAYER_SET_INDEX, binding = 0) uniform RasterEvaluatedPropsUBO { float brightness_high; float saturation_factor; float contrast_factor; - float pad1, pad2; + float pad1; + float pad2; } props; layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image0_sampler; diff --git a/include/mbgl/shaders/vulkan/shader_group.hpp b/include/mbgl/shaders/vulkan/shader_group.hpp index 1363ab35e4cc..67d56d9bc3a5 100644 --- a/include/mbgl/shaders/vulkan/shader_group.hpp +++ b/include/mbgl/shaders/vulkan/shader_group.hpp @@ -77,9 +77,6 @@ class ShaderGroup final : public ShaderGroupBase { for (const auto& attrib : ShaderClass::instanceAttributes) { shader->initInstanceAttribute(attrib); } - for (const auto& uniform : ShaderClass::uniforms) { - shader->initUniformBlock(uniform); - } for (const auto& texture : ShaderClass::textures) { shader->initTexture(texture); } diff --git a/include/mbgl/shaders/vulkan/shader_program.hpp b/include/mbgl/shaders/vulkan/shader_program.hpp index 4cd59471d1aa..e4afb9f30838 100644 --- a/include/mbgl/shaders/vulkan/shader_program.hpp +++ b/include/mbgl/shaders/vulkan/shader_program.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -70,13 +69,10 @@ class ShaderProgram final : public gfx::ShaderProgramBase { const gfx::VertexAttributeArray& getVertexAttributes() const override { return vertexAttributes; } const gfx::VertexAttributeArray& getInstanceAttributes() const override { return instanceAttributes; } - const gfx::UniformBlockArray& getUniformBlocks() const override { return uniformBlocks; } - gfx::UniformBlockArray& mutableUniformBlocks() override { return uniformBlocks; } bool hasTextures() const; void initAttribute(const shaders::AttributeInfo&); void initInstanceAttribute(const shaders::AttributeInfo&); - void initUniformBlock(const shaders::UniformBlockInfo&); void initTexture(const shaders::TextureInfo&); protected: @@ -87,7 +83,6 @@ class ShaderProgram final : public gfx::ShaderProgramBase { vk::UniqueShaderModule fragmentShader; std::unordered_map pipelines; - UniformBlockArray uniformBlocks; VertexAttributeArray vertexAttributes; VertexAttributeArray instanceAttributes; std::array, shaders::maxTextureCountPerShader> textureBindings; diff --git a/include/mbgl/shaders/vulkan/symbol.hpp b/include/mbgl/shaders/vulkan/symbol.hpp index 67511b5a2f45..c41550bcf34a 100644 --- a/include/mbgl/shaders/vulkan/symbol.hpp +++ b/include/mbgl/shaders/vulkan/symbol.hpp @@ -6,16 +6,24 @@ namespace mbgl { namespace shaders { +#define SYMBOL_SHADER_COMMON \ + R"( + +#define idSymbolDrawableUBO idDrawableReservedVertexOnlyUBO +#define idSymbolTilePropsUBO idDrawableReservedFragmentOnlyUBO +#define idSymbolEvaluatedPropsUBO layerUBOStartId + +)" + template <> struct ShaderSource { static constexpr const char* name = "SymbolIconShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( layout(location = 0) in ivec4 in_pos_offset; layout(location = 1) in uvec4 in_data; @@ -27,41 +35,44 @@ layout(location = 4) in float in_fade_opacity; layout(location = 5) in vec2 in_opacity; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform SymbolDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct SymbolDrawableUBO { mat4 matrix; mat4 label_plane_matrix; mat4 coord_matrix; + vec2 texsize; vec2 texsize_icon; - float gamma_scale; - bool rotate_symbol; - vec2 pad; -} drawable; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { - bool is_text; - bool is_halo; + bool is_text_prop; + bool rotate_symbol; bool pitch_with_map; bool is_size_zoom_constant; bool is_size_feature_constant; + float size_t; float size; - float padding; -} tile; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform SymbolInterpolateUBO { + // Interpolations float fill_color_t; float halo_color_t; float opacity_t; float halo_width_t; float halo_blur_t; - float pad1, pad2, pad3; -} interp; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolDrawableUBO) readonly buffer SymbolDrawableUBOVector { + SymbolDrawableUBO drawable_ubo[]; +} drawableVector; layout(location = 0) out mediump vec2 frag_tex; layout(location = 1) out mediump float frag_opacity; void main() { + const SymbolDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; const vec2 a_pos = in_pos_offset.xy; const vec2 a_offset = in_pos_offset.zw; @@ -76,20 +87,20 @@ void main() { const float segment_angle = -in_projected_pos[2]; float size; - if (!tile.is_size_zoom_constant && !tile.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tile.size_t) / 128.0; - } else if (tile.is_size_zoom_constant && !tile.is_size_feature_constant) { + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { size = a_size_min / 128.0; } else { - size = tile.size; + size = drawable.size; } const vec4 projectedPoint = drawable.matrix * vec4(a_pos, 0, 1); const float camera_to_anchor_distance = projectedPoint.w; // See comments in symbol_sdf.vertex - const float distance_ratio = tile.pitch_with_map ? - camera_to_anchor_distance / global.camera_to_center_distance : - global.camera_to_center_distance / camera_to_anchor_distance; + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; const float perspective_ratio = clamp( 0.5 + 0.5 * distance_ratio, 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles @@ -97,7 +108,7 @@ void main() { size *= perspective_ratio; - const float fontScale = tile.is_text ? size / 24.0 : size; + const float fontScale = drawable.is_text_prop ? size / 24.0 : size; float symbol_rotation = 0.0; if (drawable.rotate_symbol) { @@ -106,7 +117,7 @@ void main() { const vec2 a = projectedPoint.xy / projectedPoint.w; const vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - symbol_rotation = atan((b.y - a.y) / global.aspect_ratio, b.x - a.x); + symbol_rotation = atan((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); } const float angle_sin = sin(segment_angle + symbol_rotation); @@ -120,7 +131,7 @@ void main() { applySurfaceTransform(); const vec2 raw_fade_opacity = unpack_opacity(in_fade_opacity); - const float fade_change = raw_fade_opacity[1] > 0.5 ? global.symbol_fade_change : -global.symbol_fade_change; + const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; const float fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); frag_tex = a_tex / drawable.texsize; @@ -128,30 +139,34 @@ void main() { #if defined(HAS_UNIFORM_u_opacity) frag_opacity = fade_opacity; #else - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t) * fade_opacity; + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t) * fade_opacity; #endif } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_opacity; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct SymbolTilePropsUBO { bool is_text; bool is_halo; - bool pitch_with_map; - bool is_size_zoom_constant; - bool is_size_feature_constant; - float size_t; - float size; - float padding; -} tile; + float gamma_scale; + float pad1; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolTilePropsUBO) readonly buffer SymbolTilePropsUBOVector { + SymbolTilePropsUBO tile_props_ubo[]; +} tilePropsVector; -layout(set = LAYER_SET_INDEX, binding = 0) uniform SymbolEvaluatedPropsUBO { +layout(set = LAYER_SET_INDEX, binding = idSymbolEvaluatedPropsUBO) uniform SymbolEvaluatedPropsUBO { vec4 text_fill_color; vec4 text_halo_color; float text_opacity; @@ -174,8 +189,10 @@ void main() { return; #endif + const SymbolTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #if defined(HAS_UNIFORM_u_opacity) - const float opacity = (tile.is_text ? props.text_opacity : props.icon_opacity) * frag_opacity; + const float opacity = (tileProps.is_text ? props.text_opacity : props.icon_opacity) * frag_opacity; #else const float opacity = frag_opacity; // fade_opacity is baked in for this case #endif @@ -189,12 +206,11 @@ template <> struct ShaderSource { static constexpr const char* name = "SymbolSDFIconShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( layout(location = 0) in ivec4 in_pos_offset; layout(location = 1) in uvec4 in_data; @@ -222,36 +238,38 @@ layout(location = 8) in vec2 in_halo_width; layout(location = 9) in vec2 in_halo_blur; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform SymbolDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct SymbolDrawableUBO { mat4 matrix; mat4 label_plane_matrix; mat4 coord_matrix; + vec2 texsize; vec2 texsize_icon; - float gamma_scale; - bool rotate_symbol; - vec2 pad; -} drawable; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { - bool is_text; - bool is_halo; + bool is_text_prop; + bool rotate_symbol; bool pitch_with_map; bool is_size_zoom_constant; bool is_size_feature_constant; + float size_t; float size; - float padding; -} tile; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform SymbolInterpolateUBO { + // Interpolations float fill_color_t; float halo_color_t; float opacity_t; float halo_width_t; float halo_blur_t; - float pad1, pad2, pad3; -} interp; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolDrawableUBO) readonly buffer SymbolDrawableUBOVector { + SymbolDrawableUBO drawable_ubo[]; +} drawableVector; layout(location = 0) out mediump vec2 frag_tex; layout(location = 1) out mediump float frag_fade_opacity; @@ -279,6 +297,7 @@ layout(location = 8) out mediump float frag_halo_blur; #endif void main() { + const SymbolDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; const vec2 a_pos = in_pos_offset.xy; const vec2 a_offset = in_pos_offset.zw; @@ -291,12 +310,12 @@ void main() { const float segment_angle = -in_projected_pos[2]; float size; - if (!tile.is_size_zoom_constant && !tile.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tile.size_t) / 128.0; - } else if (tile.is_size_zoom_constant && !tile.is_size_feature_constant) { + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { size = a_size_min / 128.0; } else { - size = tile.size; + size = drawable.size; } const vec4 projectedPoint = drawable.matrix * vec4(a_pos, 0, 1); @@ -307,9 +326,9 @@ void main() { // If the label isn't pitched with the map, we do layout in viewport space, // which makes labels in the distance larger relative to the features around // them. We counteract part of that effect by dividing by the perspective ratio. - const float distance_ratio = tile.pitch_with_map ? - camera_to_anchor_distance / global.camera_to_center_distance : - global.camera_to_center_distance / camera_to_anchor_distance; + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; const float perspective_ratio = clamp( 0.5 + 0.5 * distance_ratio, 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles @@ -317,7 +336,7 @@ void main() { size *= perspective_ratio; - const float fontScale = tile.is_text ? size / 24.0 : size; + const float fontScale = drawable.is_text_prop ? size / 24.0 : size; float symbol_rotation = 0.0; if (drawable.rotate_symbol) { @@ -328,7 +347,7 @@ void main() { const vec2 a = projectedPoint.xy / projectedPoint.w; const vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - symbol_rotation = atan((b.y - a.y) / global.aspect_ratio, b.x - a.x); + symbol_rotation = atan((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); } const float angle_sin = sin(segment_angle + symbol_rotation); @@ -342,7 +361,7 @@ void main() { applySurfaceTransform(); const vec2 raw_fade_opacity = unpack_opacity(in_fade_opacity); - const float fade_change = raw_fade_opacity[1] > 0.5 ? global.symbol_fade_change : -global.symbol_fade_change; + const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; frag_tex = a_tex / drawable.texsize; frag_fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); @@ -350,24 +369,24 @@ void main() { frag_gamma_scale = gl_Position.w; #if !defined(HAS_UNIFORM_u_fill_color) - frag_fill_color = unpack_mix_color(in_fill_color, interp.fill_color_t); + frag_fill_color = unpack_mix_color(in_fill_color, drawable.fill_color_t); #endif #if !defined(HAS_UNIFORM_u_halo_color) - frag_halo_color = unpack_mix_color(in_halo_color, interp.halo_color_t); + frag_halo_color = unpack_mix_color(in_halo_color, drawable.halo_color_t); #endif #if !defined(HAS_UNIFORM_u_halo_width) - frag_halo_width = unpack_mix_float(in_halo_width, interp.halo_width_t); + frag_halo_width = unpack_mix_float(in_halo_width, drawable.halo_width_t); #endif #if !defined(HAS_UNIFORM_u_halo_blur) - frag_halo_blur = unpack_mix_float(in_halo_blur, interp.halo_blur_t); + frag_halo_blur = unpack_mix_float(in_halo_blur, drawable.halo_blur_t); #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_fade_opacity; @@ -396,29 +415,22 @@ layout(location = 8) in mediump float frag_halo_blur; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform SymbolDrawableUBO { - mat4 matrix; - mat4 label_plane_matrix; - mat4 coord_matrix; - vec2 texsize; - vec2 texsize_icon; - float gamma_scale; - bool rotate_symbol; - vec2 pad; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { +struct SymbolTilePropsUBO { bool is_text; bool is_halo; - bool pitch_with_map; - bool is_size_zoom_constant; - bool is_size_feature_constant; - float size_t; - float size; - float padding; -} tile; + float gamma_scale; + float pad1; +}; -layout(set = LAYER_SET_INDEX, binding = 0) uniform SymbolEvaluatedPropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolTilePropsUBO) readonly buffer SymbolTilePropsUBOVector { + SymbolTilePropsUBO tile_props_ubo[]; +} tilePropsVector; + +layout(set = LAYER_SET_INDEX, binding = idSymbolEvaluatedPropsUBO) uniform SymbolEvaluatedPropsUBO { vec4 text_fill_color; vec4 text_halo_color; float text_opacity; @@ -442,37 +454,39 @@ void main() { return; #endif + const SymbolTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #if defined(HAS_UNIFORM_u_fill_color) - const vec4 fill_color = tile.is_text ? props.text_fill_color : props.icon_fill_color; + const vec4 fill_color = tileProps.is_text ? props.text_fill_color : props.icon_fill_color; #else const vec4 fill_color = frag_fill_color; #endif #if defined(HAS_UNIFORM_u_halo_color) - const vec4 halo_color = tile.is_text ? props.text_halo_color : props.icon_halo_color; + const vec4 halo_color = tileProps.is_text ? props.text_halo_color : props.icon_halo_color; #else const vec4 halo_color = frag_halo_color; #endif #if defined(HAS_UNIFORM_u_opacity) - const float opacity = tile.is_text ? props.text_opacity : props.icon_opacity; + const float opacity = tileProps.is_text ? props.text_opacity : props.icon_opacity; #else const float opacity = frag_opacity; #endif #if defined(HAS_UNIFORM_u_halo_width) - const float halo_width = tile.is_text ? props.text_halo_width : props.icon_halo_width; + const float halo_width = tileProps.is_text ? props.text_halo_width : props.icon_halo_width; #else const float halo_width = frag_halo_width; #endif #if defined(HAS_UNIFORM_u_halo_blur) - const float halo_blur = tile.is_text ? props.text_halo_blur : props.icon_halo_blur; + const float halo_blur = tileProps.is_text ? props.text_halo_blur : props.icon_halo_blur; #else const float halo_blur = frag_halo_blur; #endif const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - const float fontGamma = frag_font_scale * drawable.gamma_scale; - const vec4 color = tile.is_halo ? halo_color : fill_color; - const float gamma = ((tile.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; - const float buff = tile.is_halo ? (6.0 - halo_width / frag_font_scale) / SDF_PX : (256.0 - 64.0) / 256.0; + const float fontGamma = frag_font_scale * tileProps.gamma_scale; + const vec4 color = tileProps.is_halo ? halo_color : fill_color; + const float gamma = ((tileProps.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; + const float buff = tileProps.is_halo ? (6.0 - halo_width / frag_font_scale) / SDF_PX : (256.0 - 64.0) / 256.0; const float dist = texture(image0_sampler, frag_tex).a; const float gamma_scaled = gamma * frag_gamma_scale; const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); @@ -486,12 +500,11 @@ template <> struct ShaderSource { static constexpr const char* name = "SymbolTextAndIconShader"; - static const std::array uniforms; static const std::array attributes; static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( #define SDF 1.0 #define ICON 0.0 @@ -521,36 +534,38 @@ layout(location = 7) in vec2 in_halo_width; layout(location = 8) in vec2 in_halo_blur; #endif -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform SymbolDrawableUBO { +layout(push_constant) uniform Constants { + int ubo_index; +} constant; + +struct SymbolDrawableUBO { mat4 matrix; mat4 label_plane_matrix; mat4 coord_matrix; + vec2 texsize; vec2 texsize_icon; - float gamma_scale; - bool rotate_symbol; - vec2 pad; -} drawable; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { - bool is_text; - bool is_halo; + bool is_text_prop; + bool rotate_symbol; bool pitch_with_map; bool is_size_zoom_constant; bool is_size_feature_constant; + float size_t; float size; - float padding; -} tile; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 2) uniform SymbolInterpolateUBO { + // Interpolations float fill_color_t; float halo_color_t; float opacity_t; float halo_width_t; float halo_blur_t; - float pad1, pad2, pad3; -} interp; +}; + +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolDrawableUBO) readonly buffer SymbolDrawableUBOVector { + SymbolDrawableUBO drawable_ubo[]; +} drawableVector; layout(location = 0) out mediump vec2 frag_tex; layout(location = 1) out mediump float frag_fade_opacity; @@ -580,6 +595,7 @@ layout(location = 8) out mediump float frag_halo_blur; layout(location = 9) out int frag_is_icon; void main() { + const SymbolDrawableUBO drawable = drawableVector.drawable_ubo[constant.ubo_index]; const vec2 a_pos = in_pos_offset.xy; const vec2 a_offset = in_pos_offset.zw; @@ -592,12 +608,12 @@ void main() { const float segment_angle = -in_projected_pos[2]; float size; - if (!tile.is_size_zoom_constant && !tile.is_size_feature_constant) { - size = mix(a_size_min, a_size[1], tile.size_t) / 128.0; - } else if (tile.is_size_zoom_constant && !tile.is_size_feature_constant) { + if (!drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { + size = mix(a_size_min, a_size[1], drawable.size_t) / 128.0; + } else if (drawable.is_size_zoom_constant && !drawable.is_size_feature_constant) { size = a_size_min / 128.0; } else { - size = tile.size; + size = drawable.size; } const vec4 projectedPoint = drawable.matrix * vec4(a_pos, 0, 1); @@ -608,9 +624,9 @@ void main() { // If the label isn't pitched with the map, we do layout in viewport space, // which makes labels in the distance larger relative to the features around // them. We counteract part of that effect by dividing by the perspective ratio. - const float distance_ratio = tile.pitch_with_map ? - camera_to_anchor_distance / global.camera_to_center_distance : - global.camera_to_center_distance / camera_to_anchor_distance; + const float distance_ratio = drawable.pitch_with_map ? + camera_to_anchor_distance / paintParams.camera_to_center_distance : + paintParams.camera_to_center_distance / camera_to_anchor_distance; const float perspective_ratio = clamp( 0.5 + 0.5 * distance_ratio, 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles @@ -629,7 +645,7 @@ void main() { const vec2 a = projectedPoint.xy / projectedPoint.w; const vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - symbol_rotation = atan((b.y - a.y) / global.aspect_ratio, b.x - a.x); + symbol_rotation = atan((b.y - a.y) / paintParams.aspect_ratio, b.x - a.x); } const float angle_sin = sin(segment_angle + symbol_rotation); @@ -643,7 +659,7 @@ void main() { applySurfaceTransform(); const vec2 raw_fade_opacity = unpack_opacity(in_fade_opacity); - const float fade_change = raw_fade_opacity[1] > 0.5 ? global.symbol_fade_change : -global.symbol_fade_change; + const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; const bool is_icon = (is_sdf == ICON); frag_is_icon = int(is_icon); @@ -654,24 +670,24 @@ void main() { frag_gamma_scale = gl_Position.w; #if !defined(HAS_UNIFORM_u_fill_color) - frag_fill_color = unpack_mix_color(in_fill_color, interp.fill_color_t); + frag_fill_color = unpack_mix_color(in_fill_color, drawable.fill_color_t); #endif #if !defined(HAS_UNIFORM_u_halo_color) - frag_halo_color = unpack_mix_color(in_halo_color, interp.halo_color_t); + frag_halo_color = unpack_mix_color(in_halo_color, drawable.halo_color_t); #endif #if !defined(HAS_UNIFORM_u_halo_width) - frag_halo_width = unpack_mix_float(in_halo_width, interp.halo_width_t); + frag_halo_width = unpack_mix_float(in_halo_width, drawable.halo_width_t); #endif #if !defined(HAS_UNIFORM_u_halo_blur) - frag_halo_blur = unpack_mix_float(in_halo_blur, interp.halo_blur_t); + frag_halo_blur = unpack_mix_float(in_halo_blur, drawable.halo_blur_t); #endif #if !defined(HAS_UNIFORM_u_opacity) - frag_opacity = unpack_mix_float(in_opacity, interp.opacity_t); + frag_opacity = unpack_mix_float(in_opacity, drawable.opacity_t); #endif } )"; - static constexpr auto fragment = R"( + static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_fade_opacity; @@ -702,29 +718,22 @@ layout(location = 9) flat in int frag_is_icon; layout(location = 0) out vec4 out_color; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform SymbolDrawableUBO { - mat4 matrix; - mat4 label_plane_matrix; - mat4 coord_matrix; - vec2 texsize; - vec2 texsize_icon; - float gamma_scale; - bool rotate_symbol; - vec2 pad; -} drawable; +layout(push_constant) uniform Constants { + int ubo_index; +} constant; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform SymbolTilePropsUBO { +struct SymbolTilePropsUBO { bool is_text; bool is_halo; - bool pitch_with_map; - bool is_size_zoom_constant; - bool is_size_feature_constant; - float size_t; - float size; - float padding; -} tile; + float gamma_scale; + float pad1; +}; -layout(set = LAYER_SET_INDEX, binding = 0) uniform SymbolEvaluatedPropsUBO { +layout(std140, set = LAYER_SET_INDEX, binding = idSymbolTilePropsUBO) readonly buffer SymbolTilePropsUBOVector { + SymbolTilePropsUBO tile_props_ubo[]; +} tilePropsVector; + +layout(set = LAYER_SET_INDEX, binding = idSymbolEvaluatedPropsUBO) uniform SymbolEvaluatedPropsUBO { vec4 text_fill_color; vec4 text_halo_color; float text_opacity; @@ -748,28 +757,30 @@ void main() { return; #endif + const SymbolTilePropsUBO tileProps = tilePropsVector.tile_props_ubo[constant.ubo_index]; + #if defined(HAS_UNIFORM_u_fill_color) - const vec4 fill_color = tile.is_text ? props.text_fill_color : props.icon_fill_color; + const vec4 fill_color = tileProps.is_text ? props.text_fill_color : props.icon_fill_color; #else const vec4 fill_color = frag_fill_color; #endif #if defined(HAS_UNIFORM_u_halo_color) - const vec4 halo_color = tile.is_text ? props.text_halo_color : props.icon_halo_color; + const vec4 halo_color = tileProps.is_text ? props.text_halo_color : props.icon_halo_color; #else const vec4 halo_color = frag_halo_color; #endif #if defined(HAS_UNIFORM_u_opacity) - const float opacity = tile.is_text ? props.text_opacity : props.icon_opacity; + const float opacity = tileProps.is_text ? props.text_opacity : props.icon_opacity; #else const float opacity = frag_opacity; #endif #if defined(HAS_UNIFORM_u_halo_width) - const float halo_width = tile.is_text ? props.text_halo_width : props.icon_halo_width; + const float halo_width = tileProps.is_text ? props.text_halo_width : props.icon_halo_width; #else const float halo_width = frag_halo_width; #endif #if defined(HAS_UNIFORM_u_halo_blur) - const float halo_blur = tile.is_text ? props.text_halo_blur : props.icon_halo_blur; + const float halo_blur = tileProps.is_text ? props.text_halo_blur : props.icon_halo_blur; #else const float halo_blur = frag_halo_blur; #endif @@ -781,10 +792,10 @@ void main() { } const float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - const float fontGamma = frag_font_scale * drawable.gamma_scale; - const vec4 color = tile.is_halo ? halo_color : fill_color; - const float gamma = ((tile.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; - const float buff = tile.is_halo ? (6.0 - halo_width / frag_font_scale) / SDF_PX : (256.0 - 64.0) / 256.0; + const float fontGamma = frag_font_scale * tileProps.gamma_scale; + const vec4 color = tileProps.is_halo ? halo_color : fill_color; + const float gamma = ((tileProps.is_halo ? (halo_blur * 1.19 / SDF_PX) : 0) + EDGE_GAMMA) / fontGamma; + const float buff = tileProps.is_halo ? (6.0 - halo_width / frag_font_scale) / SDF_PX : (256.0 - 64.0) / 256.0; const float dist = texture(glyph_image, frag_tex).a; const float gamma_scaled = gamma * frag_gamma_scale; const float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); @@ -794,97 +805,5 @@ void main() { )"; }; -template <> -struct ShaderSource { - static constexpr const char* name = "CustomSymbolIconShader"; - - static const std::array uniforms; - static const std::array attributes; - static constexpr std::array instanceAttributes{}; - static const std::array textures; - - static constexpr auto vertex = R"( - -layout(location = 0) in vec2 in_position; -layout(location = 1) in vec2 in_tex; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform CustomSymbolIconDrawableUBO { - mat4 matrix; -} drawable; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform CustomSymbolIconParametersUBO { - vec2 extrude_scale; - vec2 anchor; - float angle_degrees; - bool scale_with_map; - bool pitch_with_map; - float camera_to_center_distance; - float aspect_ratio; - float pad0, pad1, pad3; -} parameters; - -layout(location = 0) out vec2 frag_tex; - -vec2 rotateVec2(vec2 v, float angle) { - float cosA = cos(angle); - float sinA = sin(angle); - return vec2(v.x * cosA - v.y * sinA, v.x * sinA + v.y * cosA); -} - -vec2 ellipseRotateVec2(vec2 v, float angle, float radiusRatio /* A/B */) { - float cosA = cos(angle); - float sinA = sin(angle); - float invRatio = 1.0 / radiusRatio; - return vec2(v.x * cosA - radiusRatio * v.y * sinA, invRatio * v.x * sinA + v.y * cosA); -} - -void main() { - const vec2 extrude = mod(in_position, 2.0) * 2.0 - 1.0; - const vec2 anchor = (parameters.anchor - vec2(0.5, 0.5)) * 2.0; - const vec2 center = floor(in_position * 0.5); - const float angle = radians(-parameters.angle_degrees); - vec2 corner = extrude - anchor; - - vec4 position; - if (parameters.pitch_with_map) { - if (parameters.scale_with_map) { - corner *= parameters.extrude_scale; - } else { - vec4 projected_center = drawable.matrix * vec4(center, 0, 1); - corner *= parameters.extrude_scale * (projected_center.w / parameters.camera_to_center_distance); - } - corner = center + rotateVec2(corner, angle); - position = drawable.matrix * vec4(corner, 0, 1); - } else { - position = drawable.matrix * vec4(center, 0, 1); - const float factor = parameters.scale_with_map ? parameters.camera_to_center_distance : position.w; - position.xy += ellipseRotateVec2(corner * parameters.extrude_scale * factor, angle, parameters.aspect_ratio); - } - - gl_Position = position; - applySurfaceTransform(); - - frag_tex = in_tex; -} -)"; - - static constexpr auto fragment = R"( -layout(location = 0) in vec2 frag_tex; -layout(location = 0) out vec4 out_color; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; - -void main() { - -#if defined(OVERDRAW_INSPECTOR) - out_color = vec4(1.0); - return; -#endif - - out_color = texture(image_sampler, frag_tex); -} -)"; -}; - } // namespace shaders } // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/widevector.hpp b/include/mbgl/shaders/vulkan/widevector.hpp index 5db551478fae..14139f56a3f9 100644 --- a/include/mbgl/shaders/vulkan/widevector.hpp +++ b/include/mbgl/shaders/vulkan/widevector.hpp @@ -6,16 +6,23 @@ namespace mbgl { namespace shaders { +#define WIDEVECTOR_SHADER_PRELUDE \ + R"( + +#define idWideVectorUniformsUBO idDrawableReservedVertexOnlyUBO +#define idWideVectorUniformWideVecUBO drawableReservedUBOCount + +)" + template <> struct ShaderSource { static constexpr const char* name = "WideVectorShader"; - static const std::array uniforms; static const std::array attributes; static const std::array instanceAttributes; - static constexpr std::array textures{}; + static const std::array textures; - static constexpr auto vertex = R"( + static constexpr auto vertex = WIDEVECTOR_SHADER_PRELUDE R"( /** Expressions are used to change values like width and opacity over zoom levels. **/ #define WKSExpStops 8 @@ -35,7 +42,7 @@ struct ShaderSource { #define WKSVertexLineCapButt 1 #define WKSVertexLineCapSquare 2 -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform WideVectorUniformsUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idWideVectorUniformsUBO) uniform WideVectorUniformsUBO { mat4 mvpMatrix; mat4 mvpMatrixDiff; mat4 mvMatrix; @@ -45,7 +52,7 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform WideVectorUniformsUBO vec2 frameSize; } uniforms; -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 1) uniform WideVectorUniformWideVecUBO { +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idWideVectorUniformWideVecUBO) uniform WideVectorUniformWideVecUBO { vec4 color; float w2; float offset; @@ -149,23 +156,8 @@ void main() { } )"; - static constexpr auto fragment = R"( -layout(location = 0) in vec2 frag_uv; -layout(location = 0) out vec4 out_color; - -layout(set = DRAWABLE_UBO_SET_INDEX, binding = 0) uniform DebugUBO { - mat4 matrix; - vec4 color; - float overlay_scale; - float pad1, pad2, pad3; -} debug; - -layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; - -void main() { - vec4 overlay_color = texture(image_sampler, frag_uv); - out_color = mix(debug.color, overlay_color, overlay_color.a); -} + static constexpr auto fragment = WIDEVECTOR_SHADER_PRELUDE R"( + // TODO )"; }; diff --git a/include/mbgl/shaders/widevector_ubo.hpp b/include/mbgl/shaders/widevector_ubo.hpp index 5842a42f23e9..8720dccf728b 100644 --- a/include/mbgl/shaders/widevector_ubo.hpp +++ b/include/mbgl/shaders/widevector_ubo.hpp @@ -6,30 +6,35 @@ namespace mbgl { namespace shaders { struct alignas(16) WideVectorUniformsUBO { - std::array mvpMatrix; - std::array mvpMatrixDiff; - std::array mvMatrix; - std::array mvMatrixDiff; - std::array pMatrix; - std::array pMatrixDiff; - std::array frameSize; + /* 0 */ std::array mvpMatrix; + /* 64 */ std::array mvpMatrixDiff; + /* 128 */ std::array mvMatrix; + /* 192 */ std::array mvMatrixDiff; + /* 256 */ std::array pMatrix; + /* 320 */ std::array pMatrixDiff; + /* 384 */ std::array frameSize; + /* 392 */ float pad1; + /* 396 */ float pad2; + /* 400 */ }; -static_assert(sizeof(WideVectorUniformsUBO) % 16 == 0); +static_assert(sizeof(WideVectorUniformsUBO) == 25 * 16); struct alignas(16) WideVectorUniformWideVecUBO { - std::array color; - float w2; - float offset; - float edge; - float texRepeat; - std::array texOffset; - float miterLimit; - int32_t join; - int32_t cap; - int32_t hasExp; - float interClipLimit; + /* 0 */ std::array color; + /* 16 */ float w2; + /* 20 */ float offset; + /* 24 */ float edge; + /* 28 */ float texRepeat; + /* 32 */ std::array texOffset; + /* 40 */ float miterLimit; + /* 44 */ int32_t join; + /* 48 */ int32_t cap; + /* 52 */ int32_t hasExp; + /* 56 */ float interClipLimit; + /* 60 */ float pad1; + /* 64 */ }; -static_assert(sizeof(WideVectorUniformWideVecUBO) % 16 == 0); +static_assert(sizeof(WideVectorUniformWideVecUBO) == 4 * 16); struct VertexTriWideVecB { // x, y offset around the center @@ -44,7 +49,7 @@ struct VertexTriWideVecInstance { std::array color; int32_t prev; int32_t next; - int64_t pad_; + int64_t pad1; }; static_assert(sizeof(VertexTriWideVecInstance) == 48); diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index 08e439df3f6b..abbc9e3985a1 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -74,7 +74,10 @@ class Context final : public gfx::Context { void reduceMemoryUsage() override {} gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; - gfx::UniformBufferPtr createUniformBuffer(const void* data, std::size_t size, bool persistent) override; + gfx::UniformBufferPtr createUniformBuffer(const void* data, + std::size_t size, + bool persistent, + bool ssbo = false) override; gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; @@ -135,6 +138,7 @@ class Context final : public gfx::Context { const std::unique_ptr& getDummyVertexBuffer(); const std::unique_ptr& getDummyUniformBuffer(); + const std::unique_ptr& getDummyStorageBuffer(); const std::unique_ptr& getDummyTexture(); const vk::DescriptorSetLayout& getDescriptorSetLayout(DescriptorSetType type); @@ -175,6 +179,8 @@ class Context final : public gfx::Context { void buildImageDescriptorSetLayout(); void buildUniformDescriptorSetLayout(vk::UniqueDescriptorSetLayout& layout, + size_t startId, + size_t storageCount, size_t uniformCount, const std::string& name); @@ -186,6 +192,7 @@ class Context final : public gfx::Context { std::unique_ptr dummyVertexBuffer; std::unique_ptr dummyUniformBuffer; + std::unique_ptr dummyStorageBuffer; std::unique_ptr dummyTexture2D; vk::UniqueDescriptorSetLayout globalUniformDescriptorSetLayout; vk::UniqueDescriptorSetLayout layerUniformDescriptorSetLayout; diff --git a/include/mbgl/vulkan/descriptor_set.hpp b/include/mbgl/vulkan/descriptor_set.hpp index fff737a7d917..b1c4619c5427 100644 --- a/include/mbgl/vulkan/descriptor_set.hpp +++ b/include/mbgl/vulkan/descriptor_set.hpp @@ -30,7 +30,9 @@ struct DescriptorPoolGrowable { }; const uint32_t maxSets{0}; - const uint32_t descriptorsPerSet{0}; + const uint32_t descriptorStoragePerSet{0}; + const uint32_t descriptorUniformsPerSet{0}; + const uint32_t descriptorTexturesPerSet{0}; const float growFactor{1.5f}; std::vector pools; @@ -39,9 +41,15 @@ struct DescriptorPoolGrowable { PoolInfo& current() { return pools[currentPoolIndex]; } DescriptorPoolGrowable() = default; - DescriptorPoolGrowable(uint32_t maxSets_, uint32_t descriptorsPerSet_, float growFactor_ = 1.5f) + DescriptorPoolGrowable(uint32_t maxSets_, + uint32_t descriptorStoragePerSet_, + uint32_t descriptorUniformsPerSet_, + uint32_t descriptorTexturesPerSet_, + float growFactor_ = 1.5f) : maxSets(maxSets_), - descriptorsPerSet(descriptorsPerSet_), + descriptorStoragePerSet(descriptorStoragePerSet_), + descriptorUniformsPerSet(descriptorUniformsPerSet_), + descriptorTexturesPerSet(descriptorTexturesPerSet_), growFactor(growFactor_) {} }; @@ -72,7 +80,10 @@ class UniformDescriptorSet : public DescriptorSet { UniformDescriptorSet(Context& context_, DescriptorSetType type_); virtual ~UniformDescriptorSet() = default; - void update(const gfx::UniformBufferArray& uniforms, uint32_t uniformStartIndex, uint32_t descriptorBindingCount); + void update(const gfx::UniformBufferArray& uniforms, + uint32_t descriptorStartIndex, + uint32_t descriptorStorageCount, + uint32_t descriptorUniformCount); }; class ImageDescriptorSet : public DescriptorSet { diff --git a/include/mbgl/vulkan/uniform_block.hpp b/include/mbgl/vulkan/uniform_block.hpp deleted file mode 100644 index e32c9ad60014..000000000000 --- a/include/mbgl/vulkan/uniform_block.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include - -namespace mbgl { -namespace vulkan { - -class UniformBlock final : public gfx::UniformBlock { -public: - UniformBlock(int index_, std::size_t size_) - : gfx::UniformBlock(index_, size_) {} - UniformBlock(const UniformBlock& other) - : gfx::UniformBlock(other) {} - UniformBlock(UniformBlock&& other) - : gfx::UniformBlock(std::move(other)) {} - ~UniformBlock() override = default; - - void bindBuffer(const gfx::UniformBuffer&) override {} - void unbindBuffer() override {} - - bool getBindVertex() const { return bindVertex; } - void setBindVertex(bool value) { bindVertex = value; } - - bool getBindFragment() const { return bindFragment; } - void setBindFragment(bool value) { bindFragment = value; } - -protected: - bool bindVertex = false; - bool bindFragment = false; -}; - -/// Stores a collection of uniform blocks by name -class UniformBlockArray final : public gfx::UniformBlockArray { -public: - UniformBlockArray() = default; - UniformBlockArray(UniformBlockArray&& other) - : gfx::UniformBlockArray(std::move(other)) {} - UniformBlockArray(const UniformBlockArray&) = delete; - - UniformBlockArray& operator=(UniformBlockArray&& other) { - gfx::UniformBlockArray::operator=(std::move(other)); - return *this; - } - UniformBlockArray& operator=(const UniformBlockArray& other) { - gfx::UniformBlockArray::operator=(other); - return *this; - } - -private: - std::unique_ptr create(int index, std::size_t size) override { - return std::make_unique(index, size); - } - std::unique_ptr copy(const gfx::UniformBlock& uniformBlocks) override { - return std::make_unique(static_cast(uniformBlocks)); - } -}; - -} // namespace vulkan -} // namespace mbgl diff --git a/include/mbgl/vulkan/uniform_buffer.hpp b/include/mbgl/vulkan/uniform_buffer.hpp index 83854bee3a28..23d1cac2d0b9 100644 --- a/include/mbgl/vulkan/uniform_buffer.hpp +++ b/include/mbgl/vulkan/uniform_buffer.hpp @@ -18,7 +18,7 @@ class UniformBuffer final : public gfx::UniformBuffer { UniformBuffer clone() const { return {buffer.clone()}; } - void update(const void* data, std::size_t size_) override; + void update(const void* data, std::size_t dataSize) override; protected: BufferResource buffer; @@ -30,10 +30,12 @@ class UniformBufferArray final : public gfx::UniformBufferArray { UniformBufferArray() = delete; UniformBufferArray(DescriptorSetType descriptorSetType_, uint32_t descriptorStartIndex_, - uint32_t descriptorBindingCount_) + uint32_t descriptorStorageCount_, + uint32_t descriptorUniformCount_) : descriptorSetType(descriptorSetType_), descriptorStartIndex(descriptorStartIndex_), - descriptorBindingCount(descriptorBindingCount_) {} + descriptorStorageCount(descriptorStorageCount_), + descriptorUniformCount(descriptorUniformCount_) {} UniformBufferArray(UniformBufferArray&& other) : gfx::UniformBufferArray(std::move(other)) {} @@ -66,7 +68,8 @@ class UniformBufferArray final : public gfx::UniformBufferArray { const DescriptorSetType descriptorSetType{DescriptorSetType::DrawableUniform}; const uint32_t descriptorStartIndex{0}; - const uint32_t descriptorBindingCount{0}; + const uint32_t descriptorStorageCount{0}; + const uint32_t descriptorUniformCount{0}; std::unique_ptr descriptorSet; }; diff --git a/shaders/drawable.background.fragment.glsl b/shaders/drawable.background.fragment.glsl index 383012d37efa..2b55c4991b8b 100644 --- a/shaders/drawable.background.fragment.glsl +++ b/shaders/drawable.background.fragment.glsl @@ -1,7 +1,9 @@ -layout (std140) uniform BackgroundLayerUBO { +layout (std140) uniform BackgroundPropsUBO { highp vec4 u_color; highp float u_opacity; - highp float layer_pad1, layer_pad2, layer_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { diff --git a/shaders/drawable.background_pattern.fragment.glsl b/shaders/drawable.background_pattern.fragment.glsl index f8ef5e7a5676..8729d5d62542 100644 --- a/shaders/drawable.background_pattern.fragment.glsl +++ b/shaders/drawable.background_pattern.fragment.glsl @@ -6,10 +6,11 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; -layout (std140) uniform BackgroundPatternLayerUBO { +layout (std140) uniform BackgroundPatternPropsUBO { highp vec2 u_pattern_tl_a; highp vec2 u_pattern_br_a; highp vec2 u_pattern_tl_b; diff --git a/shaders/drawable.background_pattern.vertex.glsl b/shaders/drawable.background_pattern.vertex.glsl index 5147bcbba619..1341c0651ae0 100644 --- a/shaders/drawable.background_pattern.vertex.glsl +++ b/shaders/drawable.background_pattern.vertex.glsl @@ -3,9 +3,12 @@ layout (std140) uniform BackgroundPatternDrawableUBO { highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; highp float u_tile_units_to_pixels; - highp float drawable_pad1, drawable_pad2, drawable_pad3; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; }; -layout (std140) uniform BackgroundPatternLayerUBO { + +layout (std140) uniform BackgroundPatternPropsUBO { highp vec2 u_pattern_tl_a; highp vec2 u_pattern_br_a; highp vec2 u_pattern_tl_b; diff --git a/shaders/drawable.circle.vertex.glsl b/shaders/drawable.circle.vertex.glsl index b3bcd07a1337..a6c16eea5ac9 100644 --- a/shaders/drawable.circle.vertex.glsl +++ b/shaders/drawable.circle.vertex.glsl @@ -9,13 +9,24 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform CircleDrawableUBO { highp mat4 u_matrix; highp vec2 u_extrude_scale; - lowp vec2 drawable_pad1; + // Interpolations + lowp float u_color_t; + lowp float u_radius_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_stroke_color_t; + lowp float u_stroke_width_t; + lowp float u_stroke_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; }; layout (std140) uniform CircleEvaluatedPropsUBO { @@ -31,17 +42,6 @@ layout (std140) uniform CircleEvaluatedPropsUBO { lowp float props_pad1; }; -layout (std140) uniform CircleInterpolateUBO { - lowp float u_color_t; - lowp float u_radius_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_stroke_color_t; - lowp float u_stroke_width_t; - lowp float u_stroke_opacity_t; - lowp float interp_pad1; -}; - #pragma mapbox: define highp vec4 color #pragma mapbox: define mediump float radius #pragma mapbox: define lowp float blur diff --git a/shaders/drawable.collision_box.fragment.glsl b/shaders/drawable.collision_box.fragment.glsl index 81be488d0f0b..582a27981949 100644 --- a/shaders/drawable.collision_box.fragment.glsl +++ b/shaders/drawable.collision_box.fragment.glsl @@ -1,10 +1,3 @@ -layout (std140) uniform CollisionUBO { - highp mat4 u_matrix; - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - highp float pad1; -}; - in float v_placed; in float v_notUsed; diff --git a/shaders/drawable.collision_box.vertex.glsl b/shaders/drawable.collision_box.vertex.glsl index da1ddd39394f..eca7f956862c 100644 --- a/shaders/drawable.collision_box.vertex.glsl +++ b/shaders/drawable.collision_box.vertex.glsl @@ -12,14 +12,18 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; -layout (std140) uniform CollisionUBO { +layout (std140) uniform CollisionDrawableUBO { highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { highp vec2 u_extrude_scale; highp float u_overscale_factor; - highp float pad1; + lowp float drawable_pad1; }; out float v_placed; diff --git a/shaders/drawable.collision_circle.fragment.glsl b/shaders/drawable.collision_circle.fragment.glsl index 338070a2b4d2..611cf6b9cacc 100644 --- a/shaders/drawable.collision_circle.fragment.glsl +++ b/shaders/drawable.collision_circle.fragment.glsl @@ -6,14 +6,14 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; -layout (std140) uniform CollisionUBO { - highp mat4 u_matrix; +layout (std140) uniform CollisionTilePropsUBO { highp vec2 u_extrude_scale; highp float u_overscale_factor; - highp float pad1; + lowp float drawable_pad1; }; in float v_placed; diff --git a/shaders/drawable.collision_circle.vertex.glsl b/shaders/drawable.collision_circle.vertex.glsl index 92f325c8fe30..2cc20f008b1d 100644 --- a/shaders/drawable.collision_circle.vertex.glsl +++ b/shaders/drawable.collision_circle.vertex.glsl @@ -11,14 +11,18 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; -layout (std140) uniform CollisionUBO { +layout (std140) uniform CollisionDrawableUBO { highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { highp vec2 u_extrude_scale; highp float u_overscale_factor; - highp float pad1; + lowp float drawable_pad1; }; out float v_placed; diff --git a/shaders/drawable.custom.symbol_icon.vertex.glsl b/shaders/drawable.custom.symbol_icon.vertex.glsl index 3343923b6fda..8f514e2ed154 100644 --- a/shaders/drawable.custom.symbol_icon.vertex.glsl +++ b/shaders/drawable.custom.symbol_icon.vertex.glsl @@ -3,9 +3,6 @@ layout(location = 1) in vec2 a_tex; layout(std140) uniform CustomSymbolIconDrawableUBO { highp mat4 u_matrix; -}; - -layout(std140) uniform CustomSymbolIconParametersUBO { highp vec2 u_extrude_scale; highp vec2 u_anchor; highp float u_angle_degrees; @@ -13,7 +10,9 @@ layout(std140) uniform CustomSymbolIconParametersUBO { bool u_pitch_with_map; highp float u_camera_to_center_distance; highp float u_aspect_ratio; - highp float params_pad1, params_pad2, params_pad3; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; }; out vec2 v_tex; diff --git a/shaders/drawable.debug.fragment.glsl b/shaders/drawable.debug.fragment.glsl index 4b197f541f9e..2376634a8818 100644 --- a/shaders/drawable.debug.fragment.glsl +++ b/shaders/drawable.debug.fragment.glsl @@ -2,9 +2,9 @@ layout (std140) uniform DebugUBO { highp mat4 u_matrix; highp vec4 u_color; highp float u_overlay_scale; - highp float pad1; - highp float pad2; - highp float pad3; + lowp float pad1; + lowp float pad2; + lowp float pad3; }; uniform sampler2D u_overlay; diff --git a/shaders/drawable.debug.vertex.glsl b/shaders/drawable.debug.vertex.glsl index 20b10f2dbd36..10236b141f21 100644 --- a/shaders/drawable.debug.vertex.glsl +++ b/shaders/drawable.debug.vertex.glsl @@ -5,9 +5,9 @@ layout (std140) uniform DebugUBO { highp mat4 u_matrix; highp vec4 u_color; highp float u_overlay_scale; - highp float pad1; - highp float pad2; - highp float pad3; + lowp float pad1; + lowp float pad2; + lowp float pad3; }; void main() { diff --git a/shaders/drawable.fill.fragment.glsl b/shaders/drawable.fill.fragment.glsl index 0e0aed6c7d86..cd2d2aa4a80a 100644 --- a/shaders/drawable.fill.fragment.glsl +++ b/shaders/drawable.fill.fragment.glsl @@ -1,8 +1,3 @@ -layout (std140) uniform FillInterpolateUBO { - highp float u_color_t; - highp float u_opacity_t; - highp float interp_pad1, interp_pad2; -}; layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill.vertex.glsl b/shaders/drawable.fill.vertex.glsl index caffecd545ed..f77883221c9a 100644 --- a/shaders/drawable.fill.vertex.glsl +++ b/shaders/drawable.fill.vertex.glsl @@ -1,11 +1,12 @@ layout (std140) uniform FillDrawableUBO { highp mat4 u_matrix; -}; -layout (std140) uniform FillInterpolateUBO { + // Interpolations highp float u_color_t; highp float u_opacity_t; - highp float interp_pad1, interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_extrusion.vertex.glsl b/shaders/drawable.fill_extrusion.vertex.glsl index 79c7429bdacf..ae4dc60fd264 100644 --- a/shaders/drawable.fill_extrusion.vertex.glsl +++ b/shaders/drawable.fill_extrusion.vertex.glsl @@ -4,16 +4,31 @@ out vec4 v_color; layout (std140) uniform FillExtrusionDrawableUBO { highp mat4 u_matrix; - highp vec2 u_texsize; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; highp float u_height_factor; highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -23,20 +38,9 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; + #pragma mapbox: define highp float base #pragma mapbox: define highp float height #pragma mapbox: define highp vec4 color diff --git a/shaders/drawable.fill_extrusion_pattern.fragment.glsl b/shaders/drawable.fill_extrusion_pattern.fragment.glsl index 0f6d4b717b0b..a4ce886e3d9a 100644 --- a/shaders/drawable.fill_extrusion_pattern.fragment.glsl +++ b/shaders/drawable.fill_extrusion_pattern.fragment.glsl @@ -2,18 +2,18 @@ in vec2 v_pos_a; in vec2 v_pos_b; in vec4 v_lighting; -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; highp vec2 u_texsize; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -23,19 +23,7 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/shaders/drawable.fill_extrusion_pattern.vertex.glsl b/shaders/drawable.fill_extrusion_pattern.vertex.glsl index bc0d9b09bf0e..71645f7f3df9 100644 --- a/shaders/drawable.fill_extrusion_pattern.vertex.glsl +++ b/shaders/drawable.fill_extrusion_pattern.vertex.glsl @@ -13,21 +13,37 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform FillExtrusionDrawableUBO { highp mat4 u_matrix; - highp vec2 u_texsize; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; highp float u_height_factor; highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; + layout (std140) uniform FillExtrusionPropsUBO { highp vec4 u_color; highp vec3 u_lightcolor; - highp float props_pad1; + lowp float props_pad1; highp vec3 u_lightpos; highp float u_base; highp float u_height; @@ -37,19 +53,7 @@ layout (std140) uniform FillExtrusionPropsUBO { highp float u_fade; highp float u_from_scale; highp float u_to_scale; - highp float props_pad2; -}; -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; -}; -layout (std140) uniform FillExtrusionInterpolateUBO { - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float interp_pad1, interp_pad2, interp_pad3; + lowp float props_pad2; }; #pragma mapbox: define lowp float base diff --git a/shaders/drawable.fill_outline.fragment.glsl b/shaders/drawable.fill_outline.fragment.glsl index 2b795274a655..eacab7664996 100644 --- a/shaders/drawable.fill_outline.fragment.glsl +++ b/shaders/drawable.fill_outline.fragment.glsl @@ -1,9 +1,3 @@ -layout (std140) uniform FillOutlineInterpolateUBO { - highp float u_outline_color_t; - highp float u_opacity_t; - highp float interp_pad1; - highp float interp_pad2; -}; layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_outline.vertex.glsl b/shaders/drawable.fill_outline.vertex.glsl index 9e255d162fbe..50dadb4c3ddb 100644 --- a/shaders/drawable.fill_outline.vertex.glsl +++ b/shaders/drawable.fill_outline.vertex.glsl @@ -6,17 +6,19 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillOutlineDrawableUBO { highp mat4 u_matrix; -}; -layout (std140) uniform FillOutlineInterpolateUBO { + // Interpolations highp float u_outline_color_t; highp float u_opacity_t; - highp float interp_pad1; - highp float interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_outline_pattern.fragment.glsl b/shaders/drawable.fill_outline_pattern.fragment.glsl index 21c8a683adb0..7e6175401681 100644 --- a/shaders/drawable.fill_outline_pattern.fragment.glsl +++ b/shaders/drawable.fill_outline_pattern.fragment.glsl @@ -1,21 +1,11 @@ -layout (std140) uniform FillOutlinePatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; - highp float u_tile_ratio; - highp float drawable_pad1; -}; layout (std140) uniform FillOutlinePatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillOutlinePatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_outline_pattern.vertex.glsl b/shaders/drawable.fill_outline_pattern.vertex.glsl index d7be97bf87ac..ebedb8cd0fce 100644 --- a/shaders/drawable.fill_outline_pattern.vertex.glsl +++ b/shaders/drawable.fill_outline_pattern.vertex.glsl @@ -6,26 +6,29 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillOutlinePatternDrawableUBO { highp mat4 u_matrix; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; highp float u_tile_ratio; - highp float drawable_pad1; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; }; + layout (std140) uniform FillOutlinePatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillOutlinePatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_outline_triangulated.vertex.glsl b/shaders/drawable.fill_outline_triangulated.vertex.glsl index 4ce24cda23e2..a2ca7e574151 100644 --- a/shaders/drawable.fill_outline_triangulated.vertex.glsl +++ b/shaders/drawable.fill_outline_triangulated.vertex.glsl @@ -17,13 +17,18 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillOutlineTriangulatedDrawableUBO { highp mat4 u_matrix; mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; }; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_pattern.fragment.glsl b/shaders/drawable.fill_pattern.fragment.glsl index 54b657cce66a..37f2d0caaf64 100644 --- a/shaders/drawable.fill_pattern.fragment.glsl +++ b/shaders/drawable.fill_pattern.fragment.glsl @@ -1,21 +1,11 @@ -layout (std140) uniform FillPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; - highp float u_tile_ratio; - highp float drawable_pad1; -}; layout (std140) uniform FillPatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillPatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.fill_pattern.vertex.glsl b/shaders/drawable.fill_pattern.vertex.glsl index ba738168eef9..574ac994e248 100644 --- a/shaders/drawable.fill_pattern.vertex.glsl +++ b/shaders/drawable.fill_pattern.vertex.glsl @@ -6,26 +6,29 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform FillPatternDrawableUBO { highp mat4 u_matrix; highp vec2 u_pixel_coord_upper; highp vec2 u_pixel_coord_lower; - highp vec2 u_texsize; highp float u_tile_ratio; - highp float drawable_pad1; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; }; + layout (std140) uniform FillPatternTilePropsUBO { highp vec4 u_pattern_from; highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; -layout (std140) uniform FillPatternInterpolateUBO { - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; - highp float interp_pad1; -}; + layout (std140) uniform FillEvaluatedPropsUBO { highp vec4 u_color; highp vec4 u_outline_color; diff --git a/shaders/drawable.heatmap.vertex.glsl b/shaders/drawable.heatmap.vertex.glsl index d769d5ef4dcd..430b428b1601 100644 --- a/shaders/drawable.heatmap.vertex.glsl +++ b/shaders/drawable.heatmap.vertex.glsl @@ -4,8 +4,10 @@ out vec2 v_extrude; layout (std140) uniform HeatmapDrawableUBO { highp mat4 u_matrix; highp float u_extrude_scale; + // Interpolations + lowp float u_weight_t; + lowp float u_radius_t; lowp float drawable_pad1; - lowp vec2 drawable_pad2; }; layout (std140) uniform HeatmapEvaluatedPropsUBO { @@ -15,12 +17,6 @@ layout (std140) uniform HeatmapEvaluatedPropsUBO { lowp float props_pad1; }; -layout (std140) uniform HeatmapInterpolateUBO { - lowp float u_weight_t; - lowp float u_radius_t; - lowp vec2 interp_pad1; -}; - #pragma mapbox: define highp float weight #pragma mapbox: define mediump float radius diff --git a/shaders/drawable.heatmap_texture.fragment.glsl b/shaders/drawable.heatmap_texture.fragment.glsl index 0d08fa736ff1..b718394c18b0 100644 --- a/shaders/drawable.heatmap_texture.fragment.glsl +++ b/shaders/drawable.heatmap_texture.fragment.glsl @@ -5,7 +5,9 @@ uniform sampler2D u_color_ramp; layout (std140) uniform HeatmapTexturePropsUBO { highp mat4 u_matrix; highp float u_opacity; - lowp float props_pad1, props_pad2, props_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { diff --git a/shaders/drawable.heatmap_texture.vertex.glsl b/shaders/drawable.heatmap_texture.vertex.glsl index 272f3692453c..714540473b08 100644 --- a/shaders/drawable.heatmap_texture.vertex.glsl +++ b/shaders/drawable.heatmap_texture.vertex.glsl @@ -9,12 +9,16 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; + layout (std140) uniform HeatmapTexturePropsUBO { highp mat4 u_matrix; highp float u_opacity; - lowp float props_pad1, props_pad2, props_pad3; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; }; void main() { diff --git a/shaders/drawable.hillshade.fragment.glsl b/shaders/drawable.hillshade.fragment.glsl index ca3df92554f2..499aa3c67d0f 100644 --- a/shaders/drawable.hillshade.fragment.glsl +++ b/shaders/drawable.hillshade.fragment.glsl @@ -1,8 +1,7 @@ in vec2 v_pos; uniform sampler2D u_image; -layout (std140) uniform HillshadeDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform HillshadeTilePropsUBO { highp vec2 u_latrange; highp vec2 u_light; }; diff --git a/shaders/drawable.hillshade.vertex.glsl b/shaders/drawable.hillshade.vertex.glsl index 20fadb2f04a0..acbc038036d7 100644 --- a/shaders/drawable.hillshade.vertex.glsl +++ b/shaders/drawable.hillshade.vertex.glsl @@ -3,8 +3,6 @@ layout (location = 1) in vec2 a_texture_pos; layout (std140) uniform HillshadeDrawableUBO { highp mat4 u_matrix; - highp vec2 u_latrange; - highp vec2 u_light; }; out vec2 v_pos; diff --git a/shaders/drawable.hillshade_prepare.fragment.glsl b/shaders/drawable.hillshade_prepare.fragment.glsl index 8cd8009055e9..9f7988750092 100644 --- a/shaders/drawable.hillshade_prepare.fragment.glsl +++ b/shaders/drawable.hillshade_prepare.fragment.glsl @@ -5,8 +5,7 @@ precision highp float; in vec2 v_pos; uniform sampler2D u_image; -layout (std140) uniform HillshadePrepareDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform HillshadePrepareTilePropsUBO { highp vec4 u_unpack; highp vec2 u_dimension; highp float u_zoom; diff --git a/shaders/drawable.hillshade_prepare.vertex.glsl b/shaders/drawable.hillshade_prepare.vertex.glsl index a3aaad8d0651..b917e86fdb23 100644 --- a/shaders/drawable.hillshade_prepare.vertex.glsl +++ b/shaders/drawable.hillshade_prepare.vertex.glsl @@ -3,6 +3,9 @@ layout (location = 1) in vec2 a_texture_pos; layout (std140) uniform HillshadePrepareDrawableUBO { highp mat4 u_matrix; +}; + +layout (std140) uniform HillshadePrepareTilePropsUBO { highp vec4 u_unpack; highp vec2 u_dimension; highp float u_zoom; diff --git a/shaders/drawable.line.fragment.glsl b/shaders/drawable.line.fragment.glsl index 9d80d25f7cdb..0d201bd28bee 100644 --- a/shaders/drawable.line.fragment.glsl +++ b/shaders/drawable.line.fragment.glsl @@ -1,19 +1,3 @@ -layout (std140) uniform LineDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineInterpolationUBO { - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - highp vec2 interp_pad1; -}; - layout (std140) uniform LineEvaluatedPropsUBO { highp vec4 u_color; lowp float u_blur; @@ -22,8 +6,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; in vec2 v_width2; diff --git a/shaders/drawable.line.vertex.glsl b/shaders/drawable.line.vertex.glsl index da69b172c93b..5dc5f87269a9 100644 --- a/shaders/drawable.line.vertex.glsl +++ b/shaders/drawable.line.vertex.glsl @@ -17,23 +17,21 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineDrawableUBO { highp mat4 u_matrix; mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineInterpolationUBO { + // Interpolations lowp float u_color_t; lowp float u_blur_t; lowp float u_opacity_t; lowp float u_gapwidth_t; lowp float u_offset_t; lowp float u_width_t; - highp vec2 interp_pad1; + lowp float drawable_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -44,8 +42,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; diff --git a/shaders/drawable.line_gradient.fragment.glsl b/shaders/drawable.line_gradient.fragment.glsl index f8bec3110112..a970705ab5b2 100644 --- a/shaders/drawable.line_gradient.fragment.glsl +++ b/shaders/drawable.line_gradient.fragment.glsl @@ -1,19 +1,3 @@ -layout (std140) uniform LineGradientDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineGradientInterpolationUBO { - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - highp float interp_pad1; - highp vec2 interp_pad2; -}; - layout (std140) uniform LineEvaluatedPropsUBO { highp vec4 u_color; lowp float u_blur; @@ -22,8 +6,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/shaders/drawable.line_gradient.vertex.glsl b/shaders/drawable.line_gradient.vertex.glsl index 41bff822811c..f521a227095a 100644 --- a/shaders/drawable.line_gradient.vertex.glsl +++ b/shaders/drawable.line_gradient.vertex.glsl @@ -21,23 +21,21 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineGradientDrawableUBO { highp mat4 u_matrix; mediump float u_ratio; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineGradientInterpolationUBO { + // Interpolations lowp float u_blur_t; lowp float u_opacity_t; lowp float u_gapwidth_t; lowp float u_offset_t; lowp float u_width_t; - highp float interp_pad1; - highp vec2 interp_pad2; + lowp float drawable_pad1; + lowp float drawable_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -48,8 +46,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; diff --git a/shaders/drawable.line_pattern.fragment.glsl b/shaders/drawable.line_pattern.fragment.glsl index cbe9b11f7b42..4fbcf49ecef2 100644 --- a/shaders/drawable.line_pattern.fragment.glsl +++ b/shaders/drawable.line_pattern.fragment.glsl @@ -1,25 +1,10 @@ -layout (std140) uniform LinePatternDrawableUBO { - highp mat4 u_matrix; +layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; mediump vec4 u_scale; highp vec2 u_texsize; - mediump float u_ratio; highp float u_fade; -}; - -layout (std140) uniform LinePatternInterpolationUBO { - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_offset_t; - lowp float u_gapwidth_t; - lowp float u_width_t; - lowp float u_pattern_from_t; - lowp float u_pattern_to_t; - highp float interp_pad1; -}; - -layout (std140) uniform LinePatternTilePropertiesUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; + lowp float tileprops_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -30,8 +15,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/shaders/drawable.line_pattern.vertex.glsl b/shaders/drawable.line_pattern.vertex.glsl index e573d9a36f2e..c42ab953d436 100644 --- a/shaders/drawable.line_pattern.vertex.glsl +++ b/shaders/drawable.line_pattern.vertex.glsl @@ -21,18 +21,13 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; - layout (std140) uniform LinePatternDrawableUBO { highp mat4 u_matrix; - mediump vec4 u_scale; - highp vec2 u_texsize; mediump float u_ratio; - highp float u_fade; -}; - -layout (std140) uniform LinePatternInterpolationUBO { + // Interpolations lowp float u_blur_t; lowp float u_opacity_t; lowp float u_offset_t; @@ -40,12 +35,15 @@ layout (std140) uniform LinePatternInterpolationUBO { lowp float u_width_t; lowp float u_pattern_from_t; lowp float u_pattern_to_t; - highp float interp_pad1; }; -layout (std140) uniform LinePatternTilePropertiesUBO { +layout (std140) uniform LinePatternTilePropsUBO { lowp vec4 u_pattern_from; lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -56,8 +54,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; diff --git a/shaders/drawable.line_sdf.fragment.glsl b/shaders/drawable.line_sdf.fragment.glsl index 23405efd6c0d..852f5f6d59a6 100644 --- a/shaders/drawable.line_sdf.fragment.glsl +++ b/shaders/drawable.line_sdf.fragment.glsl @@ -1,25 +1,8 @@ - -layout (std140) uniform LineSDFDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_patternscale_a; - highp vec2 u_patternscale_b; - mediump float u_ratio; - highp float u_tex_y_a; - highp float u_tex_y_b; +layout (std140) uniform LineSDFTilePropsUBO { highp float u_sdfgamma; highp float u_mix; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineSDFInterpolationUBO { - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float u_floorwidth_t; - highp float interp_pad1; + lowp float tileprops_pad1; + lowp float tileprops_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -30,8 +13,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image; diff --git a/shaders/drawable.line_sdf.vertex.glsl b/shaders/drawable.line_sdf.vertex.glsl index 98ce3b981b63..434498972d66 100644 --- a/shaders/drawable.line_sdf.vertex.glsl +++ b/shaders/drawable.line_sdf.vertex.glsl @@ -21,22 +21,18 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform LineSDFDrawableUBO { highp mat4 u_matrix; highp vec2 u_patternscale_a; highp vec2 u_patternscale_b; - mediump float u_ratio; highp float u_tex_y_a; highp float u_tex_y_b; - highp float u_sdfgamma; - highp float u_mix; - lowp float drawable_pad1, drawable_pad2, drawable_pad3; -}; - -layout (std140) uniform LineSDFInterpolationUBO { + mediump float u_ratio; + // Interpolations lowp float u_color_t; lowp float u_blur_t; lowp float u_opacity_t; @@ -44,7 +40,8 @@ layout (std140) uniform LineSDFInterpolationUBO { lowp float u_offset_t; lowp float u_width_t; lowp float u_floorwidth_t; - highp float interp_pad1; + lowp float drawable_pad1; + lowp float drawable_pad2; }; layout (std140) uniform LineEvaluatedPropsUBO { @@ -55,8 +52,8 @@ layout (std140) uniform LineEvaluatedPropsUBO { lowp float u_offset; mediump float u_width; lowp float u_floorwidth; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; out vec2 v_normal; diff --git a/shaders/drawable.raster.fragment.glsl b/shaders/drawable.raster.fragment.glsl index 4264906f1184..352cf5a00606 100644 --- a/shaders/drawable.raster.fragment.glsl +++ b/shaders/drawable.raster.fragment.glsl @@ -9,8 +9,8 @@ layout (std140) uniform RasterEvaluatedPropsUBO { highp float u_brightness_high; highp float u_saturation_factor; highp float u_contrast_factor; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; uniform sampler2D u_image0; uniform sampler2D u_image1; diff --git a/shaders/drawable.raster.vertex.glsl b/shaders/drawable.raster.vertex.glsl index d227fb05f2d7..331f376fed89 100644 --- a/shaders/drawable.raster.vertex.glsl +++ b/shaders/drawable.raster.vertex.glsl @@ -12,8 +12,8 @@ layout (std140) uniform RasterEvaluatedPropsUBO { highp float u_brightness_high; highp float u_saturation_factor; highp float u_contrast_factor; - highp float props_pad1; - highp float props_pad2; + lowp float props_pad1; + lowp float props_pad2; }; layout (location = 0) in vec2 a_pos; diff --git a/shaders/drawable.symbol_icon.fragment.glsl b/shaders/drawable.symbol_icon.fragment.glsl index 2350acdcf133..ce3a301d52d7 100644 --- a/shaders/drawable.symbol_icon.fragment.glsl +++ b/shaders/drawable.symbol_icon.fragment.glsl @@ -3,12 +3,8 @@ uniform sampler2D u_texture; layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -17,13 +13,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; in vec2 v_tex; diff --git a/shaders/drawable.symbol_icon.vertex.glsl b/shaders/drawable.symbol_icon.vertex.glsl index 6bbd66d1e54c..678f3323b74f 100644 --- a/shaders/drawable.symbol_icon.vertex.glsl +++ b/shaders/drawable.symbol_icon.vertex.glsl @@ -12,7 +12,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -23,29 +24,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -54,13 +47,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec2 v_tex; @@ -69,7 +62,7 @@ out float v_fade_opacity; #pragma mapbox: define lowp float opacity void main() { - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; #pragma mapbox: initialize lowp float opacity @@ -107,7 +100,7 @@ void main() { size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { diff --git a/shaders/drawable.symbol_sdf.fragment.glsl b/shaders/drawable.symbol_sdf.fragment.glsl index 06385d61137d..6bc97ac3e171 100644 --- a/shaders/drawable.symbol_sdf.fragment.glsl +++ b/shaders/drawable.symbol_sdf.fragment.glsl @@ -1,27 +1,10 @@ #define SDF_PX 8.0 -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -30,13 +13,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; uniform sampler2D u_texture; diff --git a/shaders/drawable.symbol_sdf.vertex.glsl b/shaders/drawable.symbol_sdf.vertex.glsl index 64ea45be7ee6..6c94980d7afe 100644 --- a/shaders/drawable.symbol_sdf.vertex.glsl +++ b/shaders/drawable.symbol_sdf.vertex.glsl @@ -20,7 +20,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -31,29 +32,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -62,13 +55,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec2 v_data0; @@ -81,11 +74,11 @@ out vec3 v_data1; #pragma mapbox: define lowp float halo_blur void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color @@ -131,7 +124,7 @@ void main() { size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { diff --git a/shaders/drawable.symbol_text_and_icon.fragment.glsl b/shaders/drawable.symbol_text_and_icon.fragment.glsl index 15a0cdbddab2..8c307d0f0d44 100644 --- a/shaders/drawable.symbol_text_and_icon.fragment.glsl +++ b/shaders/drawable.symbol_text_and_icon.fragment.glsl @@ -3,28 +3,11 @@ #define SDF 1.0 #define ICON 0.0 -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - highp float u_gamma_scale; - bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - layout (std140) uniform SymbolTilePropsUBO { bool u_is_text; bool u_is_halo; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; + highp float u_gamma_scale; + lowp float tileprops_pad1; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -33,13 +16,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; uniform sampler2D u_texture; diff --git a/shaders/drawable.symbol_text_and_icon.vertex.glsl b/shaders/drawable.symbol_text_and_icon.vertex.glsl index d183ba432348..6035d4512770 100644 --- a/shaders/drawable.symbol_text_and_icon.vertex.glsl +++ b/shaders/drawable.symbol_text_and_icon.vertex.glsl @@ -19,7 +19,8 @@ layout (std140) uniform GlobalPaintParamsUBO { highp float u_symbol_fade_change; highp float u_aspect_ratio; highp float u_pixel_ratio; - highp float global_pad1, global_pad2; + highp float u_map_zoom; + lowp float global_pad1; }; layout (std140) uniform SymbolDrawableUBO { @@ -30,29 +31,21 @@ layout (std140) uniform SymbolDrawableUBO { highp vec2 u_texsize; highp vec2 u_texsize_icon; - highp float u_gamma_scale; + bool u_is_text_prop; bool u_rotate_symbol; - highp vec2 drawable_pad1; -}; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; bool u_pitch_with_map; bool u_is_size_zoom_constant; bool u_is_size_feature_constant; + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function highp float u_size; // used when size is both zoom and feature constant - bool tileprops_pad1; -}; -layout (std140) uniform SymbolInterpolateUBO { + // Interpolations highp float u_fill_color_t; highp float u_halo_color_t; highp float u_opacity_t; highp float u_halo_width_t; highp float u_halo_blur_t; - highp float interp_pad1, interp_pad2, interp_pad3; }; layout (std140) uniform SymbolEvaluatedPropsUBO { @@ -61,13 +54,13 @@ layout (std140) uniform SymbolEvaluatedPropsUBO { highp float u_text_opacity; highp float u_text_halo_width; highp float u_text_halo_blur; - highp float props_pad1; + lowp float props_pad1; highp vec4 u_icon_fill_color; highp vec4 u_icon_halo_color; highp float u_icon_opacity; highp float u_icon_halo_width; highp float u_icon_halo_blur; - highp float props_pad2; + lowp float props_pad2; }; out vec4 v_data0; @@ -80,11 +73,11 @@ out vec4 v_data1; #pragma mapbox: define lowp float halo_blur void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color diff --git a/shaders/manifest.json b/shaders/manifest.json index 1c2f640ae69b..049a3e4f31f3 100644 --- a/shaders/manifest.json +++ b/shaders/manifest.json @@ -34,6 +34,13 @@ "glsl_frag": "drawable.collision_circle.fragment.glsl", "uses_ubos": true }, + { + "name": "CustomSymbolIconShader", + "header": "drawable_custom_symbol_icon", + "glsl_vert": "drawable.custom.symbol_icon.vertex.glsl", + "glsl_frag": "drawable.custom.symbol_icon.fragment.glsl", + "uses_ubos": true + }, { "name": "DebugShader", "header": "drawable_debug", @@ -139,6 +146,20 @@ "glsl_frag": "drawable.line_pattern.fragment.glsl", "uses_ubos": true }, + { + "name": "LocationIndicatorShader", + "header": "drawable_location_indicator", + "glsl_vert": "_empty.glsl", + "glsl_frag": "_empty.glsl", + "uses_ubos": true + }, + { + "name": "LocationIndicatorTexturedShader", + "header": "drawable_location_indicator_textured", + "glsl_vert": "_empty.glsl", + "glsl_frag": "_empty.glsl", + "uses_ubos": true + }, { "name": "LineSDFShader", "header": "drawable_line_sdf", @@ -174,19 +195,12 @@ "glsl_frag": "drawable.symbol_text_and_icon.fragment.glsl", "uses_ubos": true }, - { - "name": "CustomSymbolIconShader", - "header": "drawable_custom_symbol_icon", - "glsl_vert": "drawable.custom.symbol_icon.vertex.glsl", - "glsl_frag": "drawable.custom.symbol_icon.fragment.glsl", - "uses_ubos": true - }, { "name": "WideVectorShader", "header": "drawable_wide_vector", "glsl_vert": "_empty.glsl", "glsl_frag": "_empty.glsl", - "uses_ubos": false + "uses_ubos": true }, { diff --git a/src/mbgl/gfx/uniform_block.cpp b/src/mbgl/gfx/uniform_block.cpp deleted file mode 100644 index 77a892193f6e..000000000000 --- a/src/mbgl/gfx/uniform_block.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include - -#include - -namespace mbgl { -namespace gfx { - -std::unique_ptr UniformBlockArray::nullref = nullptr; - -UniformBlockArray::UniformBlockArray(UniformBlockArray&& other) - : uniformBlockVector(std::move(other.uniformBlockVector)) {} - -UniformBlockArray& UniformBlockArray::operator=(UniformBlockArray&& other) { - uniformBlockVector = std::move(other.uniformBlockVector); - return *this; -} - -UniformBlockArray& UniformBlockArray::operator=(const UniformBlockArray& other) { - for (size_t id = 0; id < other.uniformBlockVector.size(); id++) { - uniformBlockVector[id] = copy(*other.uniformBlockVector[id]); - } - return *this; -} - -const std::unique_ptr& UniformBlockArray::get(const size_t id) const { - return (id < uniformBlockVector.size()) ? uniformBlockVector[id] : nullref; -} - -const std::unique_ptr& UniformBlockArray::set(const size_t id, const size_t index, std::size_t size) { - assert(id < uniformBlockVector.size()); - if (id >= uniformBlockVector.size()) { - return nullref; - } - uniformBlockVector[id] = create(static_cast(index), size); - return uniformBlockVector[id]; -} - -} // namespace gfx -} // namespace mbgl diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 03216eaa3d29..d8a8dcac2b72 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -555,28 +555,13 @@ bool Context::emplaceOrUpdateUniformBuffer(gfx::UniformBufferPtr& buffer, void Context::bindGlobalUniformBuffers(gfx::RenderPass&) const noexcept { MLN_TRACE_FUNC(); - for (size_t id = 0; id < globalUniformBuffers.allocatedSize(); id++) { - const auto& globalUniformBuffer = globalUniformBuffers.get(id); - if (!globalUniformBuffer) continue; - GLint binding = static_cast(id); - const auto& uniformBufferGL = static_cast(*globalUniformBuffer); - MBGL_CHECK_ERROR(glBindBufferRange(GL_UNIFORM_BUFFER, - binding, - uniformBufferGL.getID(), - uniformBufferGL.getManagedBuffer().getBindingOffset(), - uniformBufferGL.getSize())); - } + globalUniformBuffers.bind(); } void Context::unbindGlobalUniformBuffers(gfx::RenderPass&) const noexcept { MLN_TRACE_FUNC(); - for (size_t id = 0; id < globalUniformBuffers.allocatedSize(); id++) { - const auto& globalUniformBuffer = globalUniformBuffers.get(id); - if (!globalUniformBuffer) continue; - GLint binding = static_cast(id); - MBGL_CHECK_ERROR(glBindBufferBase(GL_UNIFORM_BUFFER, binding, 0)); - } + globalUniformBuffers.unbind(); } #endif @@ -626,7 +611,10 @@ gfx::UniqueDrawableBuilder Context::createDrawableBuilder(std::string name) { return std::make_unique(std::move(name)); } -gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t size, bool /*persistent*/) { +gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, + std::size_t size, + bool /*persistent*/, + bool /*ssbo*/) { MLN_TRACE_FUNC(); return std::make_shared(data, size, *uboAllocator); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index ae3b50cf84b5..0c34475a9a92 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -120,7 +120,10 @@ class Context final : public gfx::Context { #if MLN_DRAWABLE_RENDERER gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; - gfx::UniformBufferPtr createUniformBuffer(const void* data, std::size_t size, bool persistent) override; + gfx::UniformBufferPtr createUniformBuffer(const void* data, + std::size_t size, + bool persistent = false, + bool ssbo = false) override; gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; diff --git a/src/mbgl/gl/drawable_gl.cpp b/src/mbgl/gl/drawable_gl.cpp index 543196fcdf93..3a65cf4fb25c 100644 --- a/src/mbgl/gl/drawable_gl.cpp +++ b/src/mbgl/gl/drawable_gl.cpp @@ -60,7 +60,7 @@ void DrawableGL::draw(PaintParameters& parameters) const { context.setColorMode(getColorMode()); context.setCullFaceMode(getCullFaceMode()); - bindUniformBuffers(); + impl->uniformBuffers.bind(); bindTextures(); for (const auto& seg : impl->segments) { @@ -76,7 +76,7 @@ void DrawableGL::draw(PaintParameters& parameters) const { #ifndef NDEBUG unbindTextures(); - unbindUniformBuffers(); + impl->uniformBuffers.unbind(); #endif } @@ -133,34 +133,6 @@ void DrawableGL::setVertexAttrId(const size_t id) { impl->vertexAttrId = id; } -void DrawableGL::bindUniformBuffers() const { - if (shader) { - const auto& uniformBlocks = shader->getUniformBlocks(); - for (size_t id = 0; id < uniformBlocks.allocatedSize(); id++) { - const auto& block = uniformBlocks.get(id); - if (!block) continue; - const auto& uniformBuffer = getUniformBuffers().get(id); - if (uniformBuffer) { - block->bindBuffer(*uniformBuffer); - } - } - } -} - -void DrawableGL::unbindUniformBuffers() const { - if (shader) { - const auto& uniformBlocks = shader->getUniformBlocks(); - for (size_t id = 0; id < uniformBlocks.allocatedSize(); id++) { - const auto& block = uniformBlocks.get(id); - if (!block) continue; - const auto& uniformBuffer = getUniformBuffers().get(id); - if (uniformBuffer) { - block->unbindBuffer(); - } - } - } -} - struct IndexBufferGL : public gfx::IndexBufferBase { IndexBufferGL(std::unique_ptr&& buffer_) : buffer(std::move(buffer_)) {} diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index 9e4ada2ec66e..7f931d8a1c36 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -128,7 +127,7 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) } if (!bindUBOs) { - bindUniformBuffers(); + uniformBuffers.bind(); bindUBOs = true; } @@ -136,31 +135,7 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) }); if (bindUBOs) { - unbindUniformBuffers(); - } -} - -void TileLayerGroupGL::bindUniformBuffers() const { - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - GLint binding = static_cast(id); - const auto& uniformBufferGL = static_cast(*uniformBuffer); - MBGL_CHECK_ERROR(glBindBufferRange(GL_UNIFORM_BUFFER, - binding, - uniformBufferGL.getID(), - uniformBufferGL.getManagedBuffer().getBindingOffset(), - uniformBufferGL.getSize())); - } -} - -void TileLayerGroupGL::unbindUniformBuffers() const { - MLN_TRACE_FUNC(); - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - GLint binding = static_cast(id); - MBGL_CHECK_ERROR(glBindBufferBase(GL_UNIFORM_BUFFER, binding, 0)); + uniformBuffers.unbind(); } } @@ -207,7 +182,7 @@ void LayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) { } if (!bindUBOs) { - bindUniformBuffers(); + uniformBuffers.bind(); bindUBOs = true; } @@ -215,30 +190,7 @@ void LayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) { }); if (bindUBOs) { - unbindUniformBuffers(); - } -} - -void LayerGroupGL::bindUniformBuffers() const { - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - GLint binding = static_cast(id); - const auto& uniformBufferGL = static_cast(*uniformBuffer); - MBGL_CHECK_ERROR(glBindBufferRange(GL_UNIFORM_BUFFER, - binding, - uniformBufferGL.getID(), - uniformBufferGL.getManagedBuffer().getBindingOffset(), - uniformBufferGL.getSize())); - } -} - -void LayerGroupGL::unbindUniformBuffers() const { - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - GLint binding = static_cast(id); - MBGL_CHECK_ERROR(glBindBufferBase(GL_UNIFORM_BUFFER, binding, 0)); + uniformBuffers.unbind(); } } diff --git a/src/mbgl/gl/uniform_block_gl.cpp b/src/mbgl/gl/uniform_block_gl.cpp deleted file mode 100644 index c53a9cd86739..000000000000 --- a/src/mbgl/gl/uniform_block_gl.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -namespace mbgl { -namespace gl { - -using namespace platform; - -void UniformBlockGL::bindBuffer(const gfx::UniformBuffer& uniformBuffer) { - assert(size == uniformBuffer.getSize()); - GLint binding = index; - const auto& uniformBufferGL = static_cast(uniformBuffer); - MBGL_CHECK_ERROR(glBindBufferRange(GL_UNIFORM_BUFFER, - binding, - uniformBufferGL.getID(), - uniformBufferGL.getManagedBuffer().getBindingOffset(), - uniformBufferGL.getSize())); -} - -void UniformBlockGL::unbindBuffer() { - GLint binding = index; - MBGL_CHECK_ERROR(glBindBufferBase(GL_UNIFORM_BUFFER, binding, 0)); -} - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/uniform_buffer_gl.cpp b/src/mbgl/gl/uniform_buffer_gl.cpp index e678976d3baa..7bc7d470d713 100644 --- a/src/mbgl/gl/uniform_buffer_gl.cpp +++ b/src/mbgl/gl/uniform_buffer_gl.cpp @@ -102,28 +102,55 @@ BufferID UniformBufferGL::getID() const { } } -void UniformBufferGL::update(const void* data_, std::size_t size_) { - assert(isManagedAllocation ? managedBuffer.getContents().size() == size_ : size == size_); +void UniformBufferGL::update(const void* data, std::size_t dataSize) { + assert(isManagedAllocation ? dataSize <= managedBuffer.getContents().size() : dataSize <= size); - if (size != size_ || (isManagedAllocation && managedBuffer.getContents().size() != size_)) { - Log::Error( - Event::General, - "Mismatched size given to UBO update, expected " + std::to_string(size) + ", got " + std::to_string(size_)); + if (dataSize > size || (isManagedAllocation && dataSize > managedBuffer.getContents().size())) { + Log::Error(Event::General, + "Mismatched size given to UBO update, expected max " + std::to_string(size) + ", got " + + std::to_string(dataSize)); return; } - if (std::memcmp(data_, managedBuffer.getContents().data(), managedBuffer.getContents().size()) == 0) { + if (std::memcmp(data, managedBuffer.getContents().data(), dataSize) == 0) { return; } if (isManagedAllocation) { - managedBuffer.allocate(data_, size); + managedBuffer.allocate(data, dataSize); } else { MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, localID)); - MBGL_CHECK_ERROR(glBufferSubData(GL_UNIFORM_BUFFER, 0, size_, data_)); + MBGL_CHECK_ERROR(glBufferSubData(GL_UNIFORM_BUFFER, 0, dataSize, data)); MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, 0)); } } +void UniformBufferArrayGL::bind() const { + MLN_TRACE_FUNC(); + + for (size_t id = 0; id < allocatedSize(); id++) { + const auto& uniformBuffer = get(id); + if (!uniformBuffer) continue; + GLint binding = static_cast(id); + const auto& uniformBufferGL = static_cast(*uniformBuffer); + MBGL_CHECK_ERROR(glBindBufferRange(GL_UNIFORM_BUFFER, + binding, + uniformBufferGL.getID(), + uniformBufferGL.getManagedBuffer().getBindingOffset(), + uniformBufferGL.getSize())); + } +} + +void UniformBufferArrayGL::unbind() const { + MLN_TRACE_FUNC(); + + for (size_t id = 0; id < allocatedSize(); id++) { + const auto& uniformBuffer = get(id); + if (!uniformBuffer) continue; + GLint binding = static_cast(id); + MBGL_CHECK_ERROR(glBindBufferBase(GL_UNIFORM_BUFFER, binding, 0)); + } +} + } // namespace gl } // namespace mbgl diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index 60a0351624c7..afa1756b0ada 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -199,7 +199,7 @@ gfx::UniqueDrawableBuilder Context::createDrawableBuilder(std::string name) { return std::make_unique(std::move(name)); } -gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t size, bool persistent) { +gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t size, bool persistent, bool /*ssbo*/) { return std::make_shared( createBuffer(data, size, gfx::BufferUsageType::StaticDraw, /*isIndexBuffer=*/false, persistent)); } @@ -415,7 +415,7 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, // Adding a `[[depth(...)]]` output to the shader prevents this error, but the stencil value is // still not written to the stencil attachment on those same devices. #if STENCIL_INSTANCING - encoder->setVertexBuffer(uboBuffer.getMetalBuffer().get(), /*offset=*/0, ShaderClass::uniforms[0].index); + encoder->setVertexBuffer(uboBuffer.getMetalBuffer().get(), /*offset=*/0, shaders::idClippingMaskUBO); encoder->drawIndexedPrimitives(MTL::PrimitiveType::PrimitiveTypeTriangle, indexCount, MTL::IndexType::IndexTypeUInt16, @@ -423,10 +423,9 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, /*indexOffset=*/0, /*instanceCount=*/static_cast(tileUBOs.size())); #else - const auto uboIndex = ShaderClass::uniforms[0].index; for (std::size_t ii = 0; ii < tileUBOs.size(); ++ii) { encoder->setStencilReferenceValue(tileUBOs[ii].stencil_ref); - mtlRenderPass.bindVertex(*uboBuffer, /*offset=*/ii * uboSize, uboIndex, /*size=*/uboSize); + mtlRenderPass.bindVertex(*uboBuffer, /*offset=*/ii * uboSize, shaders::idClippingMaskUBO, /*size=*/uboSize); encoder->drawIndexedPrimitives(MTL::PrimitiveType::PrimitiveTypeTriangle, indexCount, MTL::IndexType::IndexTypeUInt16, @@ -626,15 +625,8 @@ MTLDepthStencilStatePtr Context::makeDepthStencilState(const gfx::DepthMode& dep } void Context::bindGlobalUniformBuffers(gfx::RenderPass& renderPass) const noexcept { - for (size_t id = 0; id < globalUniformBuffers.allocatedSize(); id++) { - const auto& globalUniformBuffer = globalUniformBuffers.get(id); - if (!globalUniformBuffer) continue; - const auto& buffer = static_cast(*globalUniformBuffer.get()); - const auto& resource = buffer.getBufferResource(); - auto& mtlRenderPass = static_cast(renderPass); - mtlRenderPass.bindVertex(resource, 0, id); - mtlRenderPass.bindFragment(resource, 0, id); - } + auto& mtlRenderPass = static_cast(renderPass); + globalUniformBuffers.bind(mtlRenderPass); } } // namespace mtl diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index ce8a7d800cdc..27ca784a525a 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -186,10 +186,15 @@ void Drawable::draw(PaintParameters& parameters) const { const auto debugGroup = parameters.encoder->createDebugGroup(debugLabel(*this)); #endif + renderPass.unbindVertex(shaders::idGlobalUBOIndex); + renderPass.unbindFragment(shaders::idGlobalUBOIndex); + encoder->setVertexBytes(&uboIndex, sizeof(uboIndex), shaders::idGlobalUBOIndex); + encoder->setFragmentBytes(&uboIndex, sizeof(uboIndex), shaders::idGlobalUBOIndex); + bindAttributes(renderPass); bindInstanceAttributes(renderPass); - bindUniformBuffers(renderPass); bindTextures(renderPass); + impl->uniformBuffers.bind(renderPass); if (!impl->indexes->getBuffer() || impl->indexes->getDirty()) { assert(!"Index buffer not uploaded"); @@ -310,8 +315,8 @@ void Drawable::draw(PaintParameters& parameters) const { } } + impl->uniformBuffers.unbind(renderPass); unbindTextures(renderPass); - unbindUniformBuffers(renderPass); unbindAttributes(renderPass); } @@ -411,29 +416,6 @@ void Drawable::bindInstanceAttributes(RenderPass& renderPass) const noexcept { } } -void Drawable::bindUniformBuffers(RenderPass& renderPass) const noexcept { - if (shader) { - const auto& uniformBlocks = shader->getUniformBlocks(); - for (size_t id = 0; id < uniformBlocks.allocatedSize(); id++) { - const auto& block = uniformBlocks.get(id); - if (!block) continue; - const auto& uniformBuffer = getUniformBuffers().get(id); - if (uniformBuffer) { - const auto& buffer = static_cast(*uniformBuffer.get()); - const auto& resource = buffer.getBufferResource(); - const auto& mtlBlock = static_cast(*block); - - if (mtlBlock.getBindVertex()) { - renderPass.bindVertex(resource, /*offset=*/0, block->getIndex()); - } - if (mtlBlock.getBindFragment()) { - renderPass.bindFragment(resource, /*offset=*/0, block->getIndex()); - } - } - } - } -} - void Drawable::bindTextures(RenderPass& renderPass) const noexcept { for (size_t id = 0; id < textures.size(); id++) { if (const auto& texture = textures[id]) { @@ -539,7 +521,6 @@ void Drawable::upload(gfx::UploadPass& uploadPass_) { return; } const auto& shaderMTL = static_cast(*shader); - const auto& shaderUniforms = shaderMTL.getUniformBlocks(); auto& uploadPass = static_cast(uploadPass_); auto& contextBase = uploadPass.getContext(); diff --git a/src/mbgl/mtl/layer_group.cpp b/src/mbgl/mtl/layer_group.cpp index c653334bd287..406624e685e0 100644 --- a/src/mbgl/mtl/layer_group.cpp +++ b/src/mbgl/mtl/layer_group.cpp @@ -57,7 +57,7 @@ void LayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { } if (!bindUBOs) { - bindUniformBuffers(renderPass); + uniformBuffers.bind(renderPass); bindUBOs = true; } @@ -65,18 +65,7 @@ void LayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { }); if (bindUBOs) { - unbindUniformBuffers(renderPass); - } -} - -void LayerGroup::bindUniformBuffers(RenderPass& renderPass) const noexcept { - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - const auto& buffer = static_cast(*uniformBuffer.get()); - const auto& resource = buffer.getBufferResource(); - renderPass.bindVertex(resource, 0, id); - renderPass.bindFragment(resource, 0, id); + uniformBuffers.unbind(renderPass); } } diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index 2ffee68c4d63..c5ade2802e51 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -122,6 +122,10 @@ void RenderPass::bindVertex(const BufferResource& buf, std::size_t offset, std:: buf.bindVertex(encoder, offset, index, actualSize); } +void RenderPass::unbindVertex(std::size_t index) { + vertexBinds[index] = std::nullopt; +} + void RenderPass::bindFragment(const BufferResource& buf, std::size_t offset, std::size_t index, std::size_t size) { const auto actualSize = size ? size : buf.getSizeInBytes() - offset; assert(actualSize <= buf.getSizeInBytes()); @@ -144,6 +148,10 @@ void RenderPass::bindFragment(const BufferResource& buf, std::size_t offset, std buf.bindFragment(encoder, offset, index, actualSize); } +void RenderPass::unbindFragment(std::size_t index) { + fragmentBinds[index] = std::nullopt; +} + void RenderPass::setDepthStencilState(const MTLDepthStencilStatePtr& state) { if (state != currentDepthStencilState) { currentDepthStencilState = state; diff --git a/src/mbgl/mtl/renderer_backend.cpp b/src/mbgl/mtl/renderer_backend.cpp index dbeba967412a..6e8748e912a5 100644 --- a/src/mbgl/mtl/renderer_backend.cpp +++ b/src/mbgl/mtl/renderer_backend.cpp @@ -12,26 +12,20 @@ // ... shader_manifest.hpp #include -#include #include #include -#include -#include +#include #include #include #include #include -#include #include #include #include #include #include -#include #include -#include -#include -#include +#include #include #include diff --git a/src/mbgl/mtl/tile_layer_group.cpp b/src/mbgl/mtl/tile_layer_group.cpp index 0a8202415b24..2993a919ba23 100644 --- a/src/mbgl/mtl/tile_layer_group.cpp +++ b/src/mbgl/mtl/tile_layer_group.cpp @@ -139,7 +139,7 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { } if (!bindUBOs) { - bindUniformBuffers(renderPass); + uniformBuffers.bind(renderPass); bindUBOs = true; } @@ -147,18 +147,7 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { }); if (bindUBOs) { - unbindUniformBuffers(renderPass); - } -} - -void TileLayerGroup::bindUniformBuffers(RenderPass& renderPass) const noexcept { - for (size_t id = 0; id < uniformBuffers.allocatedSize(); id++) { - const auto& uniformBuffer = uniformBuffers.get(id); - if (!uniformBuffer) continue; - const auto& buffer = static_cast(*uniformBuffer.get()); - const auto& resource = buffer.getBufferResource(); - renderPass.bindVertex(resource, 0, id); - renderPass.bindFragment(resource, 0, id); + uniformBuffers.unbind(renderPass); } } diff --git a/src/mbgl/mtl/uniform_block.cpp b/src/mbgl/mtl/uniform_block.cpp deleted file mode 100644 index e2b436a5c8c9..000000000000 --- a/src/mbgl/mtl/uniform_block.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#include - -#include - -namespace mbgl { -namespace mtl { - -void UniformBlock::bindBuffer(const gfx::UniformBuffer& uniformBuffer) { - assert(size == uniformBuffer.getSize()); -} - -void UniformBlock::unbindBuffer() {} - -} // namespace mtl -} // namespace mbgl diff --git a/src/mbgl/mtl/uniform_buffer.cpp b/src/mbgl/mtl/uniform_buffer.cpp index 57107870f848..f800323225a4 100644 --- a/src/mbgl/mtl/uniform_buffer.cpp +++ b/src/mbgl/mtl/uniform_buffer.cpp @@ -1,6 +1,7 @@ #include - +#include #include +#include #include #include @@ -24,18 +25,33 @@ UniformBuffer::~UniformBuffer() { buffer.getContext().renderingStats().memUniformBuffers -= size; } -void UniformBuffer::update(const void* data, std::size_t size_) { - assert(size == size_); - if (size != size_ || size != buffer.getSizeInBytes()) { - Log::Error( - Event::General, - "Mismatched size given to UBO update, expected " + std::to_string(size) + ", got " + std::to_string(size_)); +void UniformBuffer::update(const void* data, std::size_t dataSize) { + assert(dataSize <= size); + if (dataSize > size || dataSize > buffer.getSizeInBytes()) { + Log::Error(Event::General, + "Mismatched size given to UBO update, expected max " + std::to_string(size) + ", got " + + std::to_string(dataSize)); return; } buffer.getContext().renderingStats().numUniformUpdates++; - buffer.getContext().renderingStats().uniformUpdateBytes += size_; - buffer.update(data, size, /*offset=*/0); + buffer.getContext().renderingStats().uniformUpdateBytes += dataSize; + buffer.update(data, dataSize, /*offset=*/0); +} + +void UniformBufferArray::bind(RenderPass& renderPass) const noexcept { + for (size_t id = 0; id < allocatedSize(); id++) { + const auto& uniformBuffer = get(id); + if (!uniformBuffer) continue; + const auto& buffer = static_cast(*uniformBuffer.get()); + const auto& resource = buffer.getBufferResource(); + if (id != shaders::idDrawableReservedFragmentOnlyUBO) { + renderPass.bindVertex(resource, 0, id); + } + if (id != shaders::idDrawableReservedVertexOnlyUBO) { + renderPass.bindFragment(resource, 0, id); + } + } } } // namespace mtl diff --git a/src/mbgl/renderer/layers/background_layer_tweaker.cpp b/src/mbgl/renderer/layers/background_layer_tweaker.cpp index 029ebec25e16..b657f2f0b831 100644 --- a/src/mbgl/renderer/layers/background_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/background_layer_tweaker.cpp @@ -20,13 +20,13 @@ constexpr auto BackgroundPatternShaderName = "BackgroundPatternShader"; #endif void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - const auto& state = parameters.state; - auto& context = parameters.context; - if (layerGroup.empty()) { return; } + const auto& state = parameters.state; + auto& context = parameters.context; + #if defined(DEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -53,7 +53,7 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara auto& layerUniforms = layerGroup.mutableUniformBuffers(); if (hasPattern) { - const BackgroundPatternLayerUBO layerUBO = {/* .pattern_tl_a = */ util::cast(imagePosA->tl()), + const BackgroundPatternPropsUBO propsUBO = {/* .pattern_tl_a = */ util::cast(imagePosA->tl()), /* .pattern_br_a = */ util::cast(imagePosA->br()), /* .pattern_tl_b = */ util::cast(imagePosB->tl()), /* .pattern_br_b = */ util::cast(imagePosB->br()), @@ -63,16 +63,21 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara /* .scale_b = */ crossfade.toScale, /* .mix = */ crossfade.t, /* .opacity = */ evaluated.get()}; - layerUniforms.createOrUpdate(idBackgroundLayerUBO, &layerUBO, context); + layerUniforms.createOrUpdate(idBackgroundPropsUBO, &propsUBO, context); } else { - const BackgroundLayerUBO layerUBO = {/* .color = */ evaluated.get(), + const BackgroundPropsUBO propsUBO = {/* .color = */ evaluated.get(), /* .opacity = */ evaluated.get(), - /* .pad1/2/3 = */ 0, - 0, - 0}; - layerUniforms.createOrUpdate(idBackgroundLayerUBO, &layerUBO, context); + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; + layerUniforms.createOrUpdate(idBackgroundPropsUBO, &propsUBO, context); } +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { assert(drawable.getTileID()); if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { @@ -87,7 +92,9 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara const auto matrix = getTileMatrix( tileID, parameters, {0.f, 0.f}, TranslateAnchorType::Viewport, false, false, drawable); +#if !MLN_UBO_CONSOLIDATION auto& drawableUniforms = drawable.mutableUniformBuffers(); +#endif if (hasPattern) { if (const auto& tex = parameters.patternAtlas.texture()) { @@ -103,20 +110,52 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara const int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; const auto pixToTile = tileID.pixelsToTileUnits(1.0f, state.getIntegerZoom()); +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].backgroundPatternDrawableUBO = { +#else const BackgroundPatternDrawableUBO drawableUBO = { +#endif /* .matrix = */ util::cast(matrix), /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, /* .pixel_coord_lower = */ {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, /* .tile_units_to_pixels = */ (pixToTile != 0) ? 1.0f / pixToTile : 0.0f, - /* .pad1/2/3 = */ 0, - 0, - 0}; + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0 + }; +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idBackgroundDrawableUBO, &drawableUBO, context); +#endif } else { - const BackgroundDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix)}; + +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].backgroundDrawableUBO = { +#else + const BackgroundDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix) + }; +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idBackgroundDrawableUBO, &drawableUBO, context); +#endif } + +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(BackgroundDrawableUnionUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + layerUniforms.set(idBackgroundDrawableUBO, drawableUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/background_layer_tweaker.hpp b/src/mbgl/renderer/layers/background_layer_tweaker.hpp index b696e3cd579d..243c7a43d893 100644 --- a/src/mbgl/renderer/layers/background_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/background_layer_tweaker.hpp @@ -26,6 +26,11 @@ class BackgroundLayerTweaker : public LayerTweaker { ~BackgroundLayerTweaker() override = default; void execute(LayerGroupBase&, const PaintParameters&) override; + +protected: +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp index 21348ae16197..e8c674392aaa 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp @@ -23,13 +23,13 @@ using namespace style; using namespace shaders; void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - auto& context = parameters.context; - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (layerGroup.empty()) { return; } + auto& context = parameters.context; + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -51,13 +51,18 @@ void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete /* .stroke_opacity = */ constOrDefault(evaluated), /* .scale_with_map = */ scaleWithMap, /* .pitch_with_map = */ pitchWithMap, - /* .padding = */ 0}; + /* .pad1 = */ 0}; context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &evaluatedPropsUBO); propertiesUpdated = false; } auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.set(idCircleEvaluatedPropsUBO, evaluatedPropsUniformBuffer); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { assert(drawable.getTileID() || !"Circles only render with tiles"); if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { @@ -82,28 +87,45 @@ void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete const auto extrudeScale = pitchWithMap ? std::array{pixelsToTileUnits, pixelsToTileUnits} : parameters.pixelsToGLUnits; - // Updated for each drawable on each frame - const CircleDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix), - /* .extrude_scale = */ extrudeScale, - /* .padding = */ 0}; +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else + const CircleDrawableUBO drawableUBO = { +#endif - auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idCircleDrawableUBO, &drawableUBO, context); + /* .matrix = */ util::cast(matrix), + /* .extrude_scale = */ extrudeScale, - const CircleInterpolateUBO interpolateUBO = { /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .radius_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_color_t = */ - std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_width_t = */ - std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_opacity_t = */ - std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .padding = */ 0}; - drawableUniforms.createOrUpdate(idCircleInterpolateUBO, &interpolateUBO, context); + /* .stroke_color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .stroke_width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .stroke_opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0 + }; +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idCircleDrawableUBO, &drawableUBO, context); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(CircleDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + layerUniforms.set(idCircleDrawableUBO, drawableUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.hpp b/src/mbgl/renderer/layers/circle_layer_tweaker.hpp index 30a3e7ee1259..944bb716b4f7 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.hpp @@ -20,6 +20,10 @@ class CircleLayerTweaker : public LayerTweaker { protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/collision_layer_tweaker.cpp b/src/mbgl/renderer/layers/collision_layer_tweaker.cpp index 0f3eb8086c44..76f653d1e703 100644 --- a/src/mbgl/renderer/layers/collision_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/collision_layer_tweaker.cpp @@ -58,14 +58,16 @@ void CollisionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam const std::array extrudeScale = {{parameters.pixelsToGLUnits[0] / (pixelRatio * scale), parameters.pixelsToGLUnits[1] / (pixelRatio * scale)}}; - const CollisionUBO drawableUBO = { - /*.matrix=*/util::cast(matrix), - /*.extrude_scale*/ extrudeScale, - /*.overscale_factor*/ static_cast(drawable.getTileID()->overscaleFactor()), - /*.pad*/ 0}; + const CollisionDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix)}; + + const CollisionTilePropsUBO tilePropsUBO = { + /* .extrude_scale = */ extrudeScale, + /* .overscale_factor = */ static_cast(drawable.getTileID()->overscaleFactor()), + /* .pad1 = */ 0}; auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idCollisionUBO, &drawableUBO, context); + drawableUniforms.createOrUpdate(idCollisionDrawableUBO, &drawableUBO, context); + drawableUniforms.createOrUpdate(idCollisionTilePropsUBO, &tilePropsUBO, context); }); } diff --git a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp index 24057479af82..becf5863dcf5 100644 --- a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp @@ -16,7 +16,6 @@ #if MLN_RENDER_BACKEND_METAL #include -#include #endif namespace mbgl { @@ -25,16 +24,16 @@ using namespace shaders; using namespace style; void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { + if (layerGroup.empty()) { + return; + } + auto& context = parameters.context; const auto& props = static_cast(*evaluatedProperties); const auto& evaluated = props.evaluated; const auto& crossfade = props.crossfade; const auto& state = parameters.state; - if (layerGroup.empty()) { - return; - } - #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -45,7 +44,7 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP const FillExtrusionPropsUBO propsUBO = { /* .color = */ constOrDefault(evaluated), /* .light_color = */ FillExtrusionProgram::lightColor(parameters.evaluatedLight), - /* .pad = */ 0, + /* .pad1 = */ 0, /* .light_position = */ FillExtrusionProgram::lightPosition(parameters.evaluatedLight, state), /* .base = */ constOrDefault(evaluated), /* .height = */ constOrDefault(evaluated), @@ -55,7 +54,7 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP /* .fade = */ crossfade.t, /* .from_scale = */ crossfade.fromScale, /* .to_scale = */ crossfade.toScale, - /* .pad = */ 0}; + /* .pad2 = */ 0}; auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.createOrUpdate(idFillExtrusionPropsUBO, &propsUBO, context); @@ -65,6 +64,12 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP const auto defPattern = mbgl::Faded{"", ""}; const auto fillPatternValue = evaluated.get().constantOr(defPattern); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); + std::vector tilePropsUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { return; @@ -107,34 +112,66 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP binders->setPatternParameters(patternPosA, patternPosB, crossfade); } +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else const FillExtrusionDrawableUBO drawableUBO = { +#endif /* .matrix = */ util::cast(matrix), - /* .texsize = */ {static_cast(textureSize.width), static_cast(textureSize.height)}, /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, /* .pixel_coord_lower = */ {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, /* .height_factor = */ heightFactor, - /* .tile_ratio = */ tileRatio}; + /* .tile_ratio = */ tileRatio, - const FillExtrusionInterpolateUBO interpUBO = { /* .base_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .height_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad = */ 0, - 0, - 0}; + /* .pad1 = */ 0 + }; +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i] = { +#else const FillExtrusionTilePropsUBO tilePropsUBO = { - /* pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, - /* pattern_to = */ patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, +#endif + /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, + /* .pattern_to = */ patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + /* .texsize = */ {static_cast(textureSize.width), static_cast(textureSize.height)}, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idFillExtrusionDrawableUBO, &drawableUBO, context); drawableUniforms.createOrUpdate(idFillExtrusionTilePropsUBO, &tilePropsUBO, context); - drawableUniforms.createOrUpdate(idFillExtrusionInterpolateUBO, &interpUBO, context); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(FillExtrusionDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + const size_t tilePropsUBOVectorSize = sizeof(FillExtrusionTilePropsUBO) * tilePropsUBOVector.size(); + if (!tilePropsUniformBuffer || tilePropsUniformBuffer->getSize() < tilePropsUBOVectorSize) { + tilePropsUniformBuffer = context.createUniformBuffer( + tilePropsUBOVector.data(), tilePropsUBOVectorSize, false, true); + } else { + tilePropsUniformBuffer->update(tilePropsUBOVector.data(), tilePropsUBOVectorSize); + } + + layerUniforms.set(idFillExtrusionDrawableUBO, drawableUniformBuffer); + layerUniforms.set(idFillExtrusionTilePropsUBO, tilePropsUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp index 7bc7a2d1bf4d..bfac229c8c2c 100644 --- a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp @@ -19,8 +19,13 @@ class FillExtrusionLayerTweaker : public LayerTweaker { void execute(LayerGroupBase&, const PaintParameters&) override; -private: +protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; + gfx::UniformBufferPtr tilePropsUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp index 352f32cb8798..398c9dc87acb 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp @@ -23,15 +23,15 @@ using namespace style; using namespace shaders; void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { + if (layerGroup.empty()) { + return; + } + auto& context = parameters.context; const auto& props = static_cast(*evaluatedProperties); const auto& evaluated = props.evaluated; const auto& crossfade = props.crossfade; - if (layerGroup.empty()) { - return; - } - #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -57,6 +57,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const auto zoom = static_cast(parameters.state.getZoom()); const auto intZoom = parameters.state.getIntegerZoom(); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); + std::vector tilePropsUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { return; @@ -95,94 +101,140 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters textureSize = tex->getSize(); } +#if !MLN_UBO_CONSOLIDATION auto& drawableUniforms = drawable.mutableUniformBuffers(); - +#endif switch (static_cast(drawable.getType())) { case RenderFillLayer::FillVariant::Fill: { - const FillDrawableUBO drawableUBO = {/*.matrix=*/util::cast(matrix)}; - drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].fillDrawableUBO = { +#else + const FillDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), - const auto fillInterpolateUBO = FillInterpolateUBO{ /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, - 0, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; - drawableUniforms.createOrUpdate(idFillInterpolateUBO, &fillInterpolateUBO, context); + +#if !MLN_UBO_CONSOLIDATION + drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#endif break; } case RenderFillLayer::FillVariant::FillOutline: { - const FillOutlineDrawableUBO drawableUBO = {/*.matrix=*/util::cast(matrix)}; - drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].fillOutlineDrawableUBO = { +#else + const FillOutlineDrawableUBO drawableUBO = { +#endif + /* .matrix=*/util::cast(matrix), - const auto fillOutlineInterpolateUBO = FillOutlineInterpolateUBO{ - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .outline_color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, - 0, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; - drawableUniforms.createOrUpdate(idFillInterpolateUBO, &fillOutlineInterpolateUBO, context); + +#if !MLN_UBO_CONSOLIDATION + drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#endif break; } case RenderFillLayer::FillVariant::FillPattern: { +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].fillPatternDrawableUBO = { +#else const FillPatternDrawableUBO drawableUBO = { - /*.matrix=*/util::cast(matrix), - /*.pixel_coord_upper=*/{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /*.pixel_coord_lower=*/{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /*.texsize=*/{static_cast(textureSize.width), static_cast(textureSize.height)}, - /*.tile_ratio = */ tileRatio, - 0, - }; - drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#endif + /* .matrix = */ util::cast(matrix), + /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + /* .pixel_coord_lower = */ + {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + /* .tile_ratio = */ tileRatio, - const auto fillPatternInterpolateUBO = FillPatternInterpolateUBO{ /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)) }; - drawableUniforms.createOrUpdate(idFillInterpolateUBO, &fillPatternInterpolateUBO, context); - const auto fillPatternTilePropsUBO = FillPatternTilePropsUBO{ - /* pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, - /* pattern_to = */ patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i].fillPatternTilePropsUBO = FillPatternTilePropsUBO { +#else + const FillPatternTilePropsUBO tilePropsUBO = { +#endif + /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) + : std::array{0}, + /* .pattern_to = */ + patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + /* .texsize = */ + {static_cast(textureSize.width), static_cast(textureSize.height)}, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; - drawableUniforms.createOrUpdate(idFillTilePropsUBO, &fillPatternTilePropsUBO, context); + +#if !MLN_UBO_CONSOLIDATION + drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); + drawableUniforms.createOrUpdate(idFillTilePropsUBO, &tilePropsUBO, context); +#endif break; } case RenderFillLayer::FillVariant::FillOutlinePattern: { +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].fillOutlinePatternDrawableUBO = { +#else const FillOutlinePatternDrawableUBO drawableUBO = { - /*.matrix=*/util::cast(matrix), - /*.pixel_coord_upper=*/{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /*.pixel_coord_lower=*/{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /*.texsize=*/{static_cast(textureSize.width), static_cast(textureSize.height)}, - /*.tile_ratio = */ tileRatio, - 0}; - drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#endif + /* .matrix = */ util::cast(matrix), + /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + /* .pixel_coord_lower = */ + {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + /* .tile_ratio = */ tileRatio, - const auto fillOutlinePatternInterpolateUBO = FillPatternInterpolateUBO{ /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)) }; - drawableUniforms.createOrUpdate(idFillInterpolateUBO, &fillOutlinePatternInterpolateUBO, context); - const auto fillOutlinePatternTilePropsUBO = FillOutlinePatternTilePropsUBO{ - /* pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, - /* pattern_to = */ patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i].fillOutlinePatternTilePropsUBO = FillOutlinePatternTilePropsUBO { +#else + const FillOutlinePatternTilePropsUBO tilePropsUBO = { +#endif + /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) + : std::array{0}, + /* .pattern_to = */ + patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + /* .texsize = */ + {static_cast(textureSize.width), static_cast(textureSize.height)}, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; - drawableUniforms.createOrUpdate(idFillTilePropsUBO, &fillOutlinePatternTilePropsUBO, context); + +#if !MLN_UBO_CONSOLIDATION + drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); + drawableUniforms.createOrUpdate(idFillTilePropsUBO, &tilePropsUBO, context); +#endif break; } case RenderFillLayer::FillVariant::FillOutlineTriangulated: { +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].fillOutlineTriangulatedDrawableUBO = { +#else const FillOutlineTriangulatedDrawableUBO drawableUBO = { - /*.matrix=*/util::cast(matrix), - /*.ratio=*/1.0f / tileID.pixelsToTileUnits(1.0f, parameters.state.getZoom()), - 0, - 0, - 0}; +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, parameters.state.getZoom()), + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0 + }; + +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, context); +#endif break; } default: { @@ -192,7 +244,31 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters break; } } +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(FillDrawableUnionUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + const size_t tilePropsUBOVectorSize = sizeof(FillTilePropsUnionUBO) * tilePropsUBOVector.size(); + if (!tilePropsUniformBuffer || tilePropsUniformBuffer->getSize() < tilePropsUBOVectorSize) { + tilePropsUniformBuffer = context.createUniformBuffer( + tilePropsUBOVector.data(), tilePropsUBOVectorSize, false, true); + } else { + tilePropsUniformBuffer->update(tilePropsUBOVector.data(), tilePropsUBOVectorSize); + } + + layerUniforms.set(idFillDrawableUBO, drawableUniformBuffer); + layerUniforms.set(idFillTilePropsUBO, tilePropsUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.hpp b/src/mbgl/renderer/layers/fill_layer_tweaker.hpp index dc67bc4dd40d..8dda28b574bc 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.hpp @@ -21,6 +21,11 @@ class FillLayerTweaker : public LayerTweaker { private: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; + gfx::UniformBufferPtr tilePropsUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp index 348a998c90a3..9172150e8059 100644 --- a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp @@ -21,14 +21,14 @@ using namespace style; using namespace shaders; void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - auto& context = parameters.context; - const auto zoom = static_cast(parameters.state.getZoom()); - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (layerGroup.empty()) { return; } + auto& context = parameters.context; + const auto zoom = static_cast(parameters.state.getZoom()); + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -46,6 +46,11 @@ void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamet auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.set(idHeatmapEvaluatedPropsUBO, evaluatedPropsUniformBuffer); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { return; @@ -64,19 +69,38 @@ void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamet constexpr bool inViewportPixelUnits = false; const auto matrix = getTileMatrix( tileID, parameters, {0.f, 0.f}, TranslateAnchorType::Viewport, nearClipped, inViewportPixelUnits, drawable); - const HeatmapDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix), - /* .extrude_scale = */ tileID.pixelsToTileUnits(1.0f, zoom), - /* .padding = */ {0}}; - auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idHeatmapDrawableUBO, &drawableUBO, context); +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else + const HeatmapDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), + /* .extrude_scale = */ tileID.pixelsToTileUnits(1.0f, zoom), - const HeatmapInterpolateUBO interpolateUBO = { /* .weight_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), /* .radius_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .padding = */ {0}}; - drawableUniforms.createOrUpdate(idHeatmapInterpolateUBO, &interpolateUBO, context); + /* .pad1 = */ 0 + }; +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idHeatmapDrawableUBO, &drawableUBO, context); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(HeatmapDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + layerUniforms.set(idHeatmapDrawableUBO, drawableUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp b/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp index 3cd17b31e821..ccafc8ed4bf6 100644 --- a/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp @@ -19,6 +19,10 @@ class HeatmapLayerTweaker : public LayerTweaker { protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp b/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp index 635103c178aa..889ecfabed3a 100644 --- a/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp @@ -16,12 +16,12 @@ using namespace style; using namespace shaders; void HeatmapTextureLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (layerGroup.empty()) { return; } + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -35,9 +35,9 @@ void HeatmapTextureLayerTweaker::execute(LayerGroupBase& layerGroup, const Paint const HeatmapTexturePropsUBO propsUBO = {/* .matrix = */ util::cast(matrix), /* .opacity = */ evaluated.get(), - /* .pad1,2,3 = */ 0, - 0, - 0}; + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.createOrUpdate(idHeatmapTexturePropsUBO, &propsUBO, parameters.context); } diff --git a/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp b/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp index 01d913b5e859..d7c6d2b2334e 100644 --- a/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp @@ -32,12 +32,12 @@ std::array getLight(const PaintParameters& parameters, } // namespace void HillshadeLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (layerGroup.empty()) { return; } + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -54,6 +54,12 @@ void HillshadeLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.set(idHillshadeEvaluatedPropsUBO, evaluatedPropsUniformBuffer); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); + std::vector tilePropsUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !checkTweakDrawable(drawable)) { return; @@ -63,12 +69,54 @@ void HillshadeLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam const auto matrix = getTileMatrix( tileID, parameters, {0.f, 0.f}, TranslateAnchorType::Viewport, false, false, drawable, true); - HillshadeDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix), - /* .latrange = */ getLatRange(tileID), - /* .light = */ getLight(parameters, evaluated)}; + +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else + const HillshadeDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix) + }; + +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i] = { +#else + const HillshadeTilePropsUBO tilePropsUBO = { +#endif + /* .latrange = */ getLatRange(tileID), + /* .light = */ getLight(parameters, evaluated) + }; + +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idHillshadeDrawableUBO, &drawableUBO, parameters.context); + drawableUniforms.createOrUpdate(idHillshadeTilePropsUBO, &tilePropsUBO, parameters.context); +#endif }); + +#if MLN_UBO_CONSOLIDATION + auto& context = parameters.context; + const size_t drawableUBOVectorSize = sizeof(HillshadeDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + const size_t tilePropsUBOVectorSize = sizeof(HillshadeTilePropsUBO) * tilePropsUBOVector.size(); + if (!tilePropsUniformBuffer || tilePropsUniformBuffer->getSize() < tilePropsUBOVectorSize) { + tilePropsUniformBuffer = context.createUniformBuffer( + tilePropsUBOVector.data(), tilePropsUBOVectorSize, false, true); + } else { + tilePropsUniformBuffer->update(tilePropsUBOVector.data(), tilePropsUBOVectorSize); + } + + layerUniforms.set(idHillshadeDrawableUBO, drawableUniformBuffer); + layerUniforms.set(idHillshadeTilePropsUBO, tilePropsUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp b/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp index 3c7d1016663b..c027ea99c42f 100644 --- a/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp @@ -19,6 +19,11 @@ class HillshadeLayerTweaker : public LayerTweaker { protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; + gfx::UniformBufferPtr tilePropsUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp b/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp index 2b4ddf8dd1ad..3a9e337d140b 100644 --- a/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp @@ -50,15 +50,16 @@ void HillshadePrepareLayerTweaker::execute(LayerGroupBase& layerGroup, const Pai matrix::ortho(matrix, 0, util::EXTENT, -util::EXTENT, 0, -1, 1); matrix::translate(matrix, matrix, 0, -util::EXTENT, 0); - const HillshadePrepareDrawableUBO drawableUBO = { - /* .matrix = */ util::cast(matrix), + const HillshadePrepareDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix)}; + const HillshadePrepareTilePropsUBO tilePropsUBO = { /* .unpack = */ getUnpackVector(drawableData.encoding), /* .dimension = */ {static_cast(drawableData.stride), static_cast(drawableData.stride)}, /* .zoom = */ static_cast(tileID.canonical.z), /* .maxzoom = */ static_cast(drawableData.maxzoom)}; - drawable.mutableUniformBuffers().createOrUpdate( - idHillshadePrepareDrawableUBO, &drawableUBO, parameters.context); + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idHillshadePrepareDrawableUBO, &drawableUBO, parameters.context); + drawableUniforms.createOrUpdate(idHillshadePrepareTilePropsUBO, &tilePropsUBO, parameters.context); }); } diff --git a/src/mbgl/renderer/layers/line_layer_tweaker.cpp b/src/mbgl/renderer/layers/line_layer_tweaker.cpp index a90b4c6af1dd..93591f92d4ac 100644 --- a/src/mbgl/renderer/layers/line_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/line_layer_tweaker.cpp @@ -66,6 +66,10 @@ auto LineLayerTweaker::evaluate([[maybe_unused]] const PaintParameters& paramete } void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { + if (layerGroup.empty()) { + return; + } + auto& context = parameters.context; const auto& evaluated = static_cast(*evaluatedProperties).evaluated; const auto& crossfade = static_cast(*evaluatedProperties).crossfade; @@ -148,7 +152,6 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters propertiesUpdated = false; } auto& layerUniforms = layerGroup.mutableUniformBuffers(); - layerUniforms.set(idLineEvaluatedPropsUBO, evaluatedPropsUniformBuffer); #if MLN_RENDER_BACKEND_METAL @@ -156,6 +159,12 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters layerUniforms.set(idLineExpressionUBO, getExpressionBuffer()); #endif // MLN_RENDER_BACKEND_METAL +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); + std::vector tilePropsUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { const auto shader = drawable.getShader(); if (!drawable.getTileID() || !shader || !checkTweakDrawable(drawable)) { @@ -182,48 +191,55 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const auto matrix = getTileMatrix( tileID, parameters, translation, anchor, nearClipped, inViewportPixelUnits, drawable); +#if !MLN_UBO_CONSOLIDATION auto& drawableUniforms = drawable.mutableUniformBuffers(); +#endif switch (static_cast(drawable.getType())) { case LineType::Simple: { +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].lineDrawableUBO = { +#else const LineDrawableUBO drawableUBO = { - /*matrix = */ util::cast(matrix), - /*ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - 0, - 0, - 0}; +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pad1 = */ 0 + }; + +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); +#endif - const auto lineInterpolationUBO = LineInterpolationUBO{ - /*color_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*blur_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*opacity_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*gapwidth_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*offset_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*width_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, - 0}; - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &lineInterpolationUBO, context); } break; case LineType::Gradient: { +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].lineGradientDrawableUBO = { +#else const LineGradientDrawableUBO drawableUBO = { - /*matrix = */ util::cast(matrix), - /*ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - 0, - 0, - 0}; +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pad1 = */ 0, + /* .pad2 = */ 0 + }; + +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); - - const auto lineGradientInterpolationUBO = LineGradientInterpolationUBO{ - /*blur_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*opacity_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*gapwidth_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*offset_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*width_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - 0, - 0, - 0}; - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &lineGradientInterpolationUBO, context); +#endif } break; case LineType::Pattern: { @@ -231,33 +247,47 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters if (const auto& texture = drawable.getTexture(idLineImageTexture)) { textureSize = texture->getSize(); } +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].linePatternDrawableUBO = { +#else const LinePatternDrawableUBO drawableUBO = { - /*matrix =*/util::cast(matrix), - /*scale =*/ - {parameters.pixelRatio, - 1 / tileID.pixelsToTileUnits(1, intZoom), - crossfade.fromScale, - crossfade.toScale}, - /*texsize =*/{static_cast(textureSize.width), static_cast(textureSize.height)}, - /*ratio =*/1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - /*fade =*/crossfade.t}; +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pattern_to_t = */ std::get<1>(binders->get()->interpolationFactor(zoom)) + }; + +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i].linePatternTilePropsUBO = LinePatternTilePropsUBO { +#else + const LinePatternTilePropsUBO tilePropsUBO = { +#endif + /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) + : std::array{0}, + /* .pattern_to = */ + patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + /* .scale = */ + {parameters.pixelRatio, + 1 / tileID.pixelsToTileUnits(1, intZoom), + crossfade.fromScale, + crossfade.toScale}, + /* .texsize = */ + {static_cast(textureSize.width), static_cast(textureSize.height)}, + /* .fade = */ crossfade.t, + /* .pad1 = */ 0 + }; + +#if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); - - const auto linePatternInterpolationUBO = LinePatternInterpolationUBO{ - /*blur_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*opacity_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*offset_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*gapwidth_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*width_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*pattern_from_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*pattern_to_t =*/std::get<1>(binders->get()->interpolationFactor(zoom)), - 0}; - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &linePatternInterpolationUBO, context); - - const auto linePatternTilePropertiesUBO = LinePatternTilePropertiesUBO{ - /*pattern_from =*/patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, - /*pattern_to =*/patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}}; - drawableUniforms.createOrUpdate(idLineTilePropertiesUBO, &linePatternTilePropertiesUBO, context); + drawableUniforms.createOrUpdate(idLineTilePropsUBO, &tilePropsUBO, context); +#endif } break; case LineType::SDF: { @@ -281,34 +311,46 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const LinePatternPos& posB = dashPatternTexture.getTo(); const float widthA = posA.width * crossfade.fromScale; const float widthB = posB.width * crossfade.toScale; - const LineSDFDrawableUBO drawableUBO{ - /* matrix = */ util::cast(matrix), - /* patternscale_a = */ - {1.0f / tileID.pixelsToTileUnits(widthA, intZoom), -posA.height / 2.0f}, - /* patternscale_b = */ - {1.0f / tileID.pixelsToTileUnits(widthB, intZoom), -posB.height / 2.0f}, - /* ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), - /* tex_y_a = */ posA.y, - /* tex_y_b = */ posB.y, - /* sdfgamma = */ static_cast(dashPatternTexture.getSize().width) / + +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].lineSDFDrawableUBO = { +#else + const LineSDFDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), + /* .patternscale_a = */ {1.0f / tileID.pixelsToTileUnits(widthA, intZoom), -posA.height / 2.0f}, + /* .patternscale_b = */ {1.0f / tileID.pixelsToTileUnits(widthB, intZoom), -posB.height / 2.0f}, + /* .tex_y_a = */ posA.y, + /* .tex_y_b = */ posB.y, + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), + + /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .floorwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), + /* .pad1 = */ 0, + /* .pad2 = */ 0 + }; + +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i].lineSDFTilePropsUBO = LineSDFTilePropsUBO { +#else + const LineSDFTilePropsUBO tilePropsUBO = { +#endif + /* .sdfgamma = */ static_cast(dashPatternTexture.getSize().width) / (std::min(widthA, widthB) * 256.0f * parameters.pixelRatio) / 2.0f, - /* mix = */ crossfade.t, - 0, - 0, - 0}; - drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); + /* .mix = */ crossfade.t, + /* .pad1 = */ 0, + /* .pad2 = */ 0 + }; - const auto lineSDFInterpolationUBO = LineSDFInterpolationUBO{ - /*color_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*blur_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*opacity_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*gapwidth_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*offset_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*width_t =*/std::get<0>(binders->get()->interpolationFactor(zoom)), - /*floorwidth_t =*/ - std::get<0>(binders->get()->interpolationFactor(zoom)), - 0}; - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &lineSDFInterpolationUBO, context); +#if !MLN_UBO_CONSOLIDATION + drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); + drawableUniforms.createOrUpdate(idLineTilePropsUBO, &tilePropsUBO, context); +#endif } } break; @@ -317,7 +359,32 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters "LineLayerTweaker: unknown line type: " + std::to_string(drawable.getType())); } break; } + +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#endif }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(LineDrawableUnionUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + const size_t tilePropsUBOVectorSize = sizeof(LineTilePropsUnionUBO) * tilePropsUBOVector.size(); + if (!tilePropsUniformBuffer || tilePropsUniformBuffer->getSize() < tilePropsUBOVectorSize) { + tilePropsUniformBuffer = context.createUniformBuffer( + tilePropsUBOVector.data(), tilePropsUBOVectorSize, false, true); + } else { + tilePropsUniformBuffer->update(tilePropsUBOVector.data(), tilePropsUBOVectorSize); + } + + layerUniforms.set(idLineDrawableUBO, drawableUniformBuffer); + layerUniforms.set(idLineTilePropsUBO, tilePropsUniformBuffer); +#endif } #if MLN_RENDER_BACKEND_METAL diff --git a/src/mbgl/renderer/layers/line_layer_tweaker.hpp b/src/mbgl/renderer/layers/line_layer_tweaker.hpp index 3295816fe2a9..511f18ac7c8a 100644 --- a/src/mbgl/renderer/layers/line_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/line_layer_tweaker.hpp @@ -60,6 +60,11 @@ class LineLayerTweaker : public LayerTweaker { protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; + gfx::UniformBufferPtr tilePropsUniformBuffer; +#endif + #if MLN_RENDER_BACKEND_METAL gfx::UniformBufferPtr expressionUniformBuffer; Unevaluated::GPUExpressions gpuExpressions; diff --git a/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp b/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp index 28a6154acc6e..8d60a3a45174 100644 --- a/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp @@ -4,19 +4,19 @@ #include #include #include -#include +#include namespace mbgl { +using namespace style; +using namespace shaders; + void LocationIndicatorLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& params) { if (layerGroup.empty()) { return; } - const auto& props = static_cast(*evaluatedProperties); - - const shaders::CommonUBO quadUBO = {/* .matrix */ util::cast(projectionPuck), - /* .color */ Color::black()}; + const auto& props = static_cast(*evaluatedProperties); visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { auto& drawableUniforms = drawable.mutableUniformBuffers(); @@ -27,18 +27,17 @@ void LocationIndicatorLayerTweaker::execute(LayerGroupBase& layerGroup, const Pa switch (static_cast(drawable.getType())) { case RenderLocationIndicatorLayer::LocationIndicatorComponentType::Circle: { - shaders::CommonUBO circleUBO = {/* .matrix */ util::cast(projectionCircle), - /* .color */ props.evaluated.get()}; - - drawableUniforms.createOrUpdate(shaders::idCommonUBO, &circleUBO, params.context); + LocationIndicatorDrawableUBO drawableUBO = {/* .matrix = */ util::cast(projectionCircle), + /* .color = */ props.evaluated.get()}; + drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; } case RenderLocationIndicatorLayer::LocationIndicatorComponentType::CircleOutline: { - shaders::CommonUBO circleUBO = {/* .matrix */ util::cast(projectionCircle), - /* .color */ props.evaluated.get()}; - - drawableUniforms.createOrUpdate(shaders::idCommonUBO, &circleUBO, params.context); + LocationIndicatorDrawableUBO drawableUBO = { + /* .matrix = */ util::cast(projectionCircle), + /* .color = */ props.evaluated.get()}; + drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; } @@ -46,9 +45,12 @@ void LocationIndicatorLayerTweaker::execute(LayerGroupBase& layerGroup, const Pa [[fallthrough]]; case RenderLocationIndicatorLayer::LocationIndicatorComponentType::Puck: [[fallthrough]]; - case RenderLocationIndicatorLayer::LocationIndicatorComponentType::PuckHat: - drawableUniforms.createOrUpdate(shaders::idCommonUBO, &quadUBO, params.context); + case RenderLocationIndicatorLayer::LocationIndicatorComponentType::PuckHat: { + const LocationIndicatorDrawableUBO drawableUBO = {/* .matrix = */ util::cast(projectionPuck), + /* .color = */ Color::black()}; + drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; + } default: assert(false); diff --git a/src/mbgl/renderer/layers/raster_layer_tweaker.cpp b/src/mbgl/renderer/layers/raster_layer_tweaker.cpp index 42db54bd6b35..7a89414e1dba 100644 --- a/src/mbgl/renderer/layers/raster_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/raster_layer_tweaker.cpp @@ -18,6 +18,10 @@ using namespace shaders; void RasterLayerTweaker::execute([[maybe_unused]] LayerGroupBase& layerGroup, [[maybe_unused]] const PaintParameters& parameters) { + if (layerGroup.empty()) { + return; + } + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; const auto spinWeights = [](float spin) -> std::array { @@ -47,24 +51,29 @@ void RasterLayerTweaker::execute([[maybe_unused]] LayerGroupBase& layerGroup, if (!evaluatedPropsUniformBuffer || propertiesUpdated) { const RasterEvaluatedPropsUBO propsUBO = { - /*.spin_weigths = */ spinWeights(evaluated.get()), - /*.tl_parent = */ {{0.0f, 0.0f}}, - /*.scale_parent = */ 1.0f, - /*.buffer_scale = */ 1.0f, - /*.fade_t = */ 1.0f, - /*.opacity = */ evaluated.get(), - /*.brightness_low = */ evaluated.get(), - /*.brightness_high = */ evaluated.get(), - /*.saturation_factor = */ saturationFactor(evaluated.get()), - /*.contrast_factor = */ contrastFactor(evaluated.get()), - 0, - 0}; + /* .spin_weigths = */ spinWeights(evaluated.get()), + /* .tl_parent = */ {{0.0f, 0.0f}}, + /* .scale_parent = */ 1.0f, + /* .buffer_scale = */ 1.0f, + /* .fade_t = */ 1.0f, + /* .opacity = */ evaluated.get(), + /* .brightness_low = */ evaluated.get(), + /* .brightness_high = */ evaluated.get(), + /* .saturation_factor = */ saturationFactor(evaluated.get()), + /* .contrast_factor = */ contrastFactor(evaluated.get()), + /* .pad1 = */ 0, + /* .pad2 = */ 0}; parameters.context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &propsUBO); propertiesUpdated = false; } auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.set(idRasterEvaluatedPropsUBO, evaluatedPropsUniformBuffer); +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!checkTweakDrawable(drawable)) { return; @@ -95,10 +104,33 @@ void RasterLayerTweaker::execute([[maybe_unused]] LayerGroupBase& layerGroup, !parameters.state.isChanging()); } - const RasterDrawableUBO drawableUBO{/*.matrix = */ util::cast(matrix)}; +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else + const RasterDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix) + }; +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idRasterDrawableUBO, &drawableUBO, parameters.context); +#endif }); + +#if MLN_UBO_CONSOLIDATION + auto& context = parameters.context; + const size_t drawableUBOVectorSize = sizeof(RasterDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + + layerUniforms.set(idRasterDrawableUBO, drawableUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/raster_layer_tweaker.hpp b/src/mbgl/renderer/layers/raster_layer_tweaker.hpp index e56be3c5beea..12c549767061 100644 --- a/src/mbgl/renderer/layers/raster_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/raster_layer_tweaker.hpp @@ -24,6 +24,10 @@ class RasterLayerTweaker : public LayerTweaker { protected: gfx::UniformBufferPtr evaluatedPropsUniformBuffer = nullptr; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index e23070d6d0aa..bc8e551883cc 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include #include #include #include @@ -1052,7 +1052,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, } if (!quadShader) { - quadShader = context.getGenericShader(shaders, "CommonTexturedShader"); + quadShader = context.getGenericShader(shaders, "LocationIndicatorTexturedShader"); } if (!quadShader) { @@ -1061,7 +1061,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, } if (!circleShader) { - circleShader = context.getGenericShader(shaders, "CommonShader"); + circleShader = context.getGenericShader(shaders, "LocationIndicatorShader"); } if (!circleShader) { diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp index 26a2a56f9d25..9f737ded608f 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp @@ -19,8 +19,7 @@ #include #if MLN_RENDER_BACKEND_METAL -#include -#include +#include #endif // MLN_RENDER_BACKEND_METAL namespace mbgl { @@ -51,28 +50,17 @@ auto getInterpFactor(const SymbolBucket::PaintProperties& paintProps, bool isTex return std::get(getProperty(paintProps, isText)->interpolationFactor(currentZoom)); } -SymbolInterpolateUBO buildInterpUBO(const SymbolBucket::PaintProperties& paint, const bool t, const float z) { - return {/* .fill_color_t = */ getInterpFactor(paint, t, z), - /* .halo_color_t = */ getInterpFactor(paint, t, z), - /* .opacity_t = */ getInterpFactor(paint, t, z), - /* .halo_width_t = */ getInterpFactor(paint, t, z), - /* .halo_blur_t = */ getInterpFactor(paint, t, z), - /* .padding = */ 0, - 0, - 0}; -} - } // namespace void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) { - auto& context = parameters.context; - const auto& state = parameters.state; - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (layerGroup.empty()) { return; } + auto& context = parameters.context; + const auto& state = parameters.state; + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str()); @@ -81,40 +69,30 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete const auto zoom = static_cast(state.getZoom()); if (!evaluatedPropsUniformBuffer || propertiesUpdated) { - const SymbolEvaluatedPropsUBO propsUBO = {/*.text_fill_color=*/constOrDefault(evaluated), - /*.text_halo_color=*/constOrDefault(evaluated), - /*.text_opacity=*/constOrDefault(evaluated), - /*.text_halo_width=*/constOrDefault(evaluated), - /*.text_halo_blur=*/constOrDefault(evaluated), - /* pad */ 0, - /*.icon_fill_color=*/constOrDefault(evaluated), - /*.icon_halo_color=*/constOrDefault(evaluated), - /*.icon_opacity=*/constOrDefault(evaluated), - /*.icon_halo_width=*/constOrDefault(evaluated), - /*.icon_halo_blur=*/constOrDefault(evaluated), - /* pad */ 0}; + const SymbolEvaluatedPropsUBO propsUBO = {/* .text_fill_color = */ constOrDefault(evaluated), + /* .text_halo_color = */ constOrDefault(evaluated), + /* .text_opacity = */ constOrDefault(evaluated), + /* .text_halo_width = */ constOrDefault(evaluated), + /* .text_halo_blur = */ constOrDefault(evaluated), + /* .pad1 */ 0, + + /* .icon_fill_color = */ constOrDefault(evaluated), + /* .icon_halo_color = */ constOrDefault(evaluated), + /* .icon_opacity = */ constOrDefault(evaluated), + /* .icon_halo_width = */ constOrDefault(evaluated), + /* .icon_halo_blur = */ constOrDefault(evaluated), + /* .pad2 */ 0}; context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &propsUBO); propertiesUpdated = false; } auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.set(idSymbolEvaluatedPropsUBO, evaluatedPropsUniformBuffer); - const auto getInterpUBO = - [&](const UnwrappedTileID& tileID, bool isText, const SymbolBucket::PaintProperties& paintProps) { - auto result = interpUBOs.insert( - std::make_pair(InterpUBOKey{tileID, isText}, InterpUBOValue{{}, parameters.frameCount})); - if (result.second) { - // new item inserted - const auto interpolateBuf = buildInterpUBO(paintProps, isText, zoom); - result.first->second.ubo = context.createUniformBuffer(&interpolateBuf, sizeof(interpolateBuf)); - } else if (result.first->second.updatedFrame < parameters.frameCount) { - // existing item found, but hasn't been updated this frame - const auto interpolateBuf = buildInterpUBO(paintProps, isText, zoom); - result.first->second.ubo->update(&interpolateBuf, sizeof(interpolateBuf)); - result.first->second.updatedFrame = parameters.frameCount; - } - return result.first->second.ubo; - }; +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); + std::vector tilePropsUBOVector(layerGroup.getDrawableCount()); +#endif const auto camDist = state.getCameraToCenterDistance(); visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { @@ -171,49 +149,77 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete // Unpitched point labels need to have their rotation applied after projection const bool rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; - const SymbolDrawableUBO drawableUBO = { - /*.matrix=*/util::cast(matrix), - /*.label_plane_matrix=*/util::cast(labelPlaneMatrix), - /*.coord_matrix=*/util::cast(glCoordMatrix), + const auto& sizeBinder = isText ? bucket->textSizeBinder : bucket->iconSizeBinder; + const auto size = sizeBinder->evaluateForZoom(currentZoom); - /*.texsize=*/toArray(getTexSize(drawable, idSymbolImageTexture)), - /*.texsize_icon=*/toArray(getTexSize(drawable, idSymbolImageIconTexture)), +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i] = { +#else + const SymbolDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), + /* .label_plane_matrix = */ util::cast(labelPlaneMatrix), + /* .coord_matrix = */ util::cast(glCoordMatrix), - /*.gamma_scale=*/gammaScale, - /*.rotate_symbol=*/rotateInShader, - /*.pad=*/{0}, - }; + /* .texsize = */ toArray(getTexSize(drawable, idSymbolImageTexture)), + /* .texsize_icon = */ toArray(getTexSize(drawable, idSymbolImageIconTexture)), - const auto& sizeBinder = isText ? bucket->textSizeBinder : bucket->iconSizeBinder; - const auto size = sizeBinder->evaluateForZoom(currentZoom); - const auto tileUBO = SymbolTilePropsUBO{ - /* .is_text = */ isText, - /* .is_halo = */ symbolData.isHalo, + /* .is_text_prop = */ isText, + /* .rotate_symbol = */ rotateInShader, /* .pitch_with_map = */ (symbolData.pitchAlignment == style::AlignmentType::Map), /* .is_size_zoom_constant = */ size.isZoomConstant, /* .is_size_feature_constant = */ size.isFeatureConstant, + /* .size_t = */ size.sizeT, /* .size = */ size.size, - /* .padding = */ 0, + + /* .fill_color_t = */ getInterpFactor(paintProperties, isText, zoom), + /* .halo_color_t = */ getInterpFactor(paintProperties, isText, zoom), + /* .opacity_t = */ getInterpFactor(paintProperties, isText, zoom), + /* .halo_width_t = */ getInterpFactor(paintProperties, isText, zoom), + /* .halo_blur_t = */ getInterpFactor(paintProperties, isText, zoom), }; +#if MLN_UBO_CONSOLIDATION + tilePropsUBOVector[i] = { +#else + const SymbolTilePropsUBO tilePropsUBO = { +#endif + /* .is_text = */ isText, + /* .is_halo = */ symbolData.isHalo, + /* .gamma_scale= */ gammaScale, + /* .pad1 = */ 0, + }; + +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idSymbolDrawableUBO, &drawableUBO, context); - drawableUniforms.createOrUpdate(idSymbolTilePropsUBO, &tileUBO, context); - drawableUniforms.set(idSymbolInterpolateUBO, getInterpUBO(tileID, isText, paintProperties)); + drawableUniforms.createOrUpdate(idSymbolTilePropsUBO, &tilePropsUBO, context); +#endif }); - // Regularly remove UBOs which are not being updated - constexpr int pruneFrameInterval = 10; - if ((parameters.frameCount % pruneFrameInterval) == 0) { - for (auto i = interpUBOs.begin(); i != interpUBOs.end();) { - if (i->second.updatedFrame < parameters.frameCount) { - i = interpUBOs.erase(i); - } else { - i++; - } - } +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(SymbolDrawableUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); } + + const size_t tilePropsUBOVectorSize = sizeof(SymbolTilePropsUBO) * tilePropsUBOVector.size(); + if (!tilePropsUniformBuffer || tilePropsUniformBuffer->getSize() < tilePropsUBOVectorSize) { + tilePropsUniformBuffer = context.createUniformBuffer( + tilePropsUBOVector.data(), tilePropsUBOVectorSize, false, true); + } else { + tilePropsUniformBuffer->update(tilePropsUBOVector.data(), tilePropsUBOVectorSize); + } + + layerUniforms.set(idSymbolDrawableUBO, drawableUniformBuffer); + layerUniforms.set(idSymbolTilePropsUBO, tilePropsUniformBuffer); +#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp index 1ac4fb46baa8..1d0f6a50753d 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp @@ -23,21 +23,10 @@ class SymbolLayerTweaker : public LayerTweaker { private: gfx::UniformBufferPtr evaluatedPropsUniformBuffer; - // Interpolation UBOs are shared by drawables of the same type (text/icon) in each tile - struct InterpUBOKey { - UnwrappedTileID tileID; - bool isText; - - bool operator==(const InterpUBOKey& other) const { return isText == other.isText && tileID == other.tileID; } - }; - struct InterpUBOValue { - gfx::UniformBufferPtr ubo; - uint64_t updatedFrame = 0; - }; - struct InterpUBOHash { - size_t operator()(const InterpUBOKey& k) const { return util::hash(k.tileID, k.isText); } - }; - mbgl::unordered_map interpUBOs; +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; + gfx::UniformBufferPtr tilePropsUniformBuffer; +#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 1e088cee9703..460e5d2278bc 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -139,11 +139,11 @@ void PaintParameters::clearStencil() { #endif const std::vector tileUBO = { - shaders::ClipUBO{/*.matrix=*/util::cast(matrixForTile({0, 0, 0})), - /*.stencil_ref=*/0, - /*.pad=*/0, - 0, - 0}}; + shaders::ClipUBO{/* .matrix = */ util::cast(matrixForTile({0, 0, 0})), + /* .stencil_ref = */ 0, + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}}; mtlContext.renderTileClippingMasks(*renderPass, staticData, tileUBO); context.renderingStats().stencilClears++; #elif MLN_RENDER_BACKEND_VULKAN @@ -191,11 +191,11 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) { tileUBOs.reserve(count); } - tileUBOs.emplace_back(shaders::ClipUBO{/*.matrix=*/util::cast(matrixForTile(tileID)), - /*.stencil_ref=*/static_cast(stencilID), - /*.pad=*/0, - 0, - 0}); + tileUBOs.emplace_back(shaders::ClipUBO{/* .matrix = */ util::cast(matrixForTile(tileID)), + /* .stencil_ref = */ static_cast(stencilID), + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}); } if (!tileUBOs.empty()) { diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 5ccac52261b3..f28165ca2c85 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -251,17 +251,20 @@ void Renderer::Impl::render(const RenderTree& renderTree, const auto debugGroup = uploadPass->createDebugGroup("layerGroup-upload"); #endif + // Update the debug layer groups + orchestrator.updateDebugLayerGroups(renderTree, parameters); + // Tweakers are run in the upload pass so they can set up uniforms. parameters.currentLayer = 0; orchestrator.visitLayerGroups([&](LayerGroupBase& layerGroup) { layerGroup.runTweakers(renderTree, parameters); parameters.currentLayer++; }); - orchestrator.visitDebugLayerGroups( - [&](LayerGroupBase& layerGroup) { layerGroup.runTweakers(renderTree, parameters); }); - - // Update the debug layer groups - orchestrator.updateDebugLayerGroups(renderTree, parameters); + parameters.currentLayer = 0; + orchestrator.visitDebugLayerGroups([&](LayerGroupBase& layerGroup) { + layerGroup.runTweakers(renderTree, parameters); + parameters.currentLayer++; + }); // Give the layers a chance to upload orchestrator.visitLayerGroups([&](LayerGroupBase& layerGroup) { layerGroup.upload(*uploadPass); }); @@ -283,7 +286,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, /* .symbol_fade_change = */ parameters.symbolFadeChange, /* .aspect_ratio = */ parameters.state.getSize().aspectRatio(), /* .pixel_ratio = */ parameters.pixelRatio, - /* .zoom = */ static_cast(parameters.state.getZoom()), + /* .map_zoom = */ static_cast(parameters.state.getZoom()), /* .pad1 = */ 0, }; auto& globalUniforms = context.mutableGlobalUniformBuffers(); @@ -458,8 +461,11 @@ void Renderer::Impl::render(const RenderTree& renderTree, // Renders debug overlays. { const auto debugGroup(parameters.renderPass->createDebugGroup("debug")); - orchestrator.visitDebugLayerGroups( - [&](LayerGroupBase& layerGroup) { layerGroup.render(orchestrator, parameters); }); + parameters.currentLayer = 0; + orchestrator.visitDebugLayerGroups([&](LayerGroupBase& layerGroup) { + layerGroup.render(orchestrator, parameters); + parameters.currentLayer++; + }); } }; #endif // MLN_DRAWABLE_RENDERER diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp index 52d2bc770df1..848645c2b8d5 100644 --- a/src/mbgl/renderer/sources/render_tile_source.cpp +++ b/src/mbgl/renderer/sources/render_tile_source.cpp @@ -56,7 +56,7 @@ void TileSourceRenderItem::render(PaintParameters& parameters) const { #if MLN_DRAWABLE_RENDERER -#if MLN_RENDER_BACKEND_VULKAN +#if MLN_ENABLE_POLYLINE_DRAWABLES class PolylineLayerImpl : public Layer::Impl { public: PolylineLayerImpl() @@ -88,29 +88,91 @@ class PolylineLayerTweaker : public LayerTweaker { public: PolylineLayerTweaker(const shaders::LineEvaluatedPropsUBO& properties) : LayerTweaker("debug-polyline", makeMutable()), - linePropertiesUBO(properties) {} + propsUBO(properties) {} void execute(LayerGroupBase& layerGroup, const PaintParameters& parameters) override { + if (layerGroup.empty()) { + return; + } + + auto& context = parameters.context; auto& layerUniforms = layerGroup.mutableUniformBuffers(); - layerUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &linePropertiesUBO, parameters.context); + layerUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &propsUBO, context); // We would need to set up `idLineExpressionUBO` if the expression mask isn't empty - assert(linePropertiesUBO.expressionMask == LineExpressionMask::None); + assert(propsUBO.expressionMask == LineExpressionMask::None); const LineExpressionUBO exprUBO = { - /* color = */ nullptr, - /* blur = */ nullptr, - /* opacity = */ nullptr, - /* gapwidth = */ nullptr, - /* offset = */ nullptr, - /* width = */ nullptr, - /* floorWidth = */ nullptr, + /* .color = */ nullptr, + /* .blur = */ nullptr, + /* .opacity = */ nullptr, + /* .gapwidth = */ nullptr, + /* .offset = */ nullptr, + /* .width = */ nullptr, + /* .floorWidth = */ nullptr, }; - layerUniforms.createOrUpdate(idLineExpressionUBO, &exprUBO, parameters.context); + layerUniforms.createOrUpdate(idLineExpressionUBO, &exprUBO, context); + +#if MLN_UBO_CONSOLIDATION + int i = 0; + std::vector drawableUBOVector(layerGroup.getDrawableCount()); +#endif + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { + if (!drawable.getTileID().has_value()) { + return; + } + + const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); + const auto zoom = parameters.state.getZoom(); + mat4 tileMatrix; + parameters.state.matrixFor(/*out*/ tileMatrix, tileID); + + const auto matrix = LayerTweaker::getTileMatrix( + tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); + +#if MLN_UBO_CONSOLIDATION + drawableUBOVector[i].lineDrawableUBO = { +#else + const shaders::LineDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), + + /* .color_t = */ 0.f, + /* .blur_t = */ 0.f, + /* .opacity_t = */ 0.f, + /* .gapwidth_t = */ 0.f, + /* .offset_t = */ 0.f, + /* .width_t = */ 0.f, + /* .pad1 = */ 0 + }; + +#if MLN_UBO_CONSOLIDATION + drawable.setUBOIndex(i++); +#else + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, context); +#endif + }); + +#if MLN_UBO_CONSOLIDATION + const size_t drawableUBOVectorSize = sizeof(LineDrawableUnionUBO) * drawableUBOVector.size(); + if (!drawableUniformBuffer || drawableUniformBuffer->getSize() < drawableUBOVectorSize) { + drawableUniformBuffer = context.createUniformBuffer( + drawableUBOVector.data(), drawableUBOVectorSize, false, true); + } else { + drawableUniformBuffer->update(drawableUBOVector.data(), drawableUBOVectorSize); + } + layerUniforms.set(idLineDrawableUBO, drawableUniformBuffer); +#endif } private: - shaders::LineEvaluatedPropsUBO linePropertiesUBO; + shaders::LineEvaluatedPropsUBO propsUBO; + +#if MLN_UBO_CONSOLIDATION + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; #endif @@ -252,79 +314,18 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr }; #if MLN_ENABLE_POLYLINE_DRAWABLES - const shaders::LineEvaluatedPropsUBO linePropertiesUBO = {/*color*/ Color::red(), - /*blur*/ 0.f, - /*opacity*/ 1.f, - /*gapwidth*/ 0.f, - /*offset*/ 0.f, - /*width*/ 4.f, - /*floorwidth*/ 0, - LineExpressionMask::None, - 0}; + const shaders::LineEvaluatedPropsUBO linePropertiesUBO = {/* .color = */ Color::red(), + /* .blur = */ 0.f, + /* .opacity = */ 1.f, + /* .gapwidth = */ 0.f, + /* .offset = */ 0.f, + /* .width = */ 4.f, + /* .floorwidth = */ 0, + /* .expressionMask = */ LineExpressionMask::None, + /* .pad1 = */ 0}; // function to add polylines drawable const auto addPolylineDrawable = [&](TileLayerGroup* tileLayerGroup, const RenderTile& tile) { - class PolylineDrawableTweaker : public gfx::DrawableTweaker { - public: - PolylineDrawableTweaker(const shaders::LineEvaluatedPropsUBO& properties) - : linePropertiesUBO(properties) {} - ~PolylineDrawableTweaker() override = default; - - void init(gfx::Drawable&) override {} - - void execute(gfx::Drawable& drawable, const PaintParameters& parameters) override { - if (!drawable.getTileID().has_value()) { - return; - } - - const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - const auto zoom = parameters.state.getZoom(); - mat4 tileMatrix; - parameters.state.matrixFor(/*out*/ tileMatrix, tileID); - - const auto matrix = LayerTweaker::getTileMatrix( - tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); - - const shaders::LineDrawableUBO drawableUBO = {/*matrix = */ util::cast(matrix), - /*ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), - 0, - 0, - 0}; - const shaders::LineInterpolationUBO lineInterpolationUBO = {/*color_t =*/0.f, - /*blur_t =*/0.f, - /*opacity_t =*/0.f, - /*gapwidth_t =*/0.f, - /*offset_t =*/0.f, - /*width_t =*/0.f, - 0, - 0}; - auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, parameters.context); - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &lineInterpolationUBO, parameters.context); - -#if !MLN_RENDER_BACKEND_VULKAN - drawableUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &linePropertiesUBO, parameters.context); - - // We would need to set up `idLineExpressionUBO` if the expression mask isn't empty - assert(linePropertiesUBO.expressionMask == LineExpressionMask::None); - - const LineExpressionUBO exprUBO = { - /* color = */ nullptr, - /* blur = */ nullptr, - /* opacity = */ nullptr, - /* gapwidth = */ nullptr, - /* offset = */ nullptr, - /* width = */ nullptr, - /* floorWidth = */ nullptr, - }; - drawableUniforms.createOrUpdate(idLineExpressionUBO, &exprUBO, parameters.context); -#endif - }; - - private: - shaders::LineEvaluatedPropsUBO linePropertiesUBO; - }; - GeometryCoordinates coords{{0, 0}, {util::EXTENT, 0}, {util::EXTENT, util::EXTENT}, {0, util::EXTENT}, {0, 0}}; gfx::PolylineGeneratorOptions options; options.type = FeatureType::Polygon; @@ -335,24 +336,17 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr } polylineBuilder->addPolyline(coords, options); -#if MLN_RENDER_BACKEND_VULKAN - if (!layerTweaker) { - layerTweaker = std::make_shared(linePropertiesUBO); - layerTweaker->execute(*tileLayerGroup, parameters); - tileLayerGroup->addLayerTweaker(layerTweaker); - } -#endif - - // create line tweaker; - auto tweaker = std::make_shared(linePropertiesUBO); - // finish polylineBuilder->flush(context); for (auto& drawable : polylineBuilder->clearDrawables()) { drawable->setTileID(tile.getOverscaledTileID()); - drawable->addTweaker(tweaker); tileLayerGroup->addDrawable(renderPass, tile.getOverscaledTileID(), std::move(drawable)); } + + if (!layerTweaker) { + layerTweaker = std::make_shared(linePropertiesUBO); + tileLayerGroup->addLayerTweaker(layerTweaker); + } }; #endif @@ -377,12 +371,12 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr const auto& debugBucket = tile.debugBucket; if (!debugBucket) continue; - const DebugUBO outlineUBO{/*matrix = */ util::cast(tile.matrix), - /*color = */ Color::white(), - /*overlay_scale = */ 1.0f, - 0, - 0, - 0}; + const DebugUBO outlineUBO = {/* .matrix = */ util::cast(tile.matrix), + /* .color = */ Color::white(), + /* .overlay_scale = */ 1.0f, + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; if (0 == updateDrawables(outlineLayerGroup, tileID, outlineUBO)) { addDrawable(outlineLayerGroup, tileID, @@ -393,12 +387,12 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr debugBucket->segments); } - const DebugUBO textUBO{/*matrix = */ util::cast(tile.matrix), - /*color = */ Color::black(), - /*overlay_scale = */ 1.0f, - 0, - 0, - 0}; + const DebugUBO textUBO = {/* .matrix = */ util::cast(tile.matrix), + /* .color = */ Color::black(), + /* .overlay_scale = */ 1.0f, + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; if (0 == updateDrawables(textLayerGroup, tileID, textUBO) && tile.getNeedsRendering()) { addDrawable(textLayerGroup, tileID, @@ -435,16 +429,19 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr const auto& debugBucket = tile.debugBucket; if (!debugBucket) continue; - const DebugUBO debugUBO{/*matrix = */ util::cast(tile.matrix), - /*color = */ Color::red(), - /*overlay_scale = */ 1.0f, - 0, - 0, - 0}; - if (0 == updateDrawables(tileLayerGroup, tileID, debugUBO) && tile.getNeedsRendering()) { #if MLN_ENABLE_POLYLINE_DRAWABLES + if (0 == tileLayerGroup->getDrawableCount(renderPass, tileID) && tile.getNeedsRendering()) { addPolylineDrawable(tileLayerGroup, tile); + } #else + const DebugUBO debugUBO = {/* .matrix = */ util::cast(tile.matrix), + /* .color = */ Color::red(), + /* .overlay_scale = */ 1.0f, + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; + + if (0 == updateDrawables(tileLayerGroup, tileID, debugUBO) && tile.getNeedsRendering()) { addDrawable(tileLayerGroup, tileID, debugUBO, @@ -452,8 +449,8 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr vertices, indexes, segments); -#endif } +#endif } } else { // if tile borders are not required, erase layer group diff --git a/src/mbgl/shaders/gl/shader_info.cpp b/src/mbgl/shaders/gl/shader_info.cpp index b4bafceb79bc..c51b8da8b0e6 100644 --- a/src/mbgl/shaders/gl/shader_info.cpp +++ b/src/mbgl/shaders/gl/shader_info.cpp @@ -1,5 +1,4 @@ #include - #include namespace mbgl { @@ -19,38 +18,41 @@ TextureInfo::TextureInfo(std::string_view name_, std::size_t id_) id(id_) {} // Background -const std::vector ShaderInfo::uniformBlocks = { +using BackgroundShaderInfo = ShaderInfo; + +const std::vector BackgroundShaderInfo::uniformBlocks = { UniformBlockInfo{"BackgroundDrawableUBO", idBackgroundDrawableUBO}, - UniformBlockInfo{"BackgroundLayerUBO", idBackgroundLayerUBO}, + UniformBlockInfo{"BackgroundPropsUBO", idBackgroundPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector BackgroundShaderInfo::attributes = { AttributeInfo{"a_pos", idBackgroundPosVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector BackgroundShaderInfo::textures = {}; // Background Pattern -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"BackgroundPatternDrawableUBO", idBackgroundDrawableUBO}, - UniformBlockInfo{"BackgroundPatternLayerUBO", idBackgroundLayerUBO}, +using BackgroundPatternShaderInfo = ShaderInfo; + +const std::vector BackgroundPatternShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"BackgroundPatternDrawableUBO", idBackgroundDrawableUBO}, + UniformBlockInfo{"BackgroundPatternPropsUBO", idBackgroundPropsUBO}, }; -const std::vector ShaderInfo::attributes = - { - AttributeInfo{"a_pos", idBackgroundPosVertexAttribute}, +const std::vector BackgroundPatternShaderInfo::attributes = { + AttributeInfo{"a_pos", idBackgroundPosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector BackgroundPatternShaderInfo::textures = { TextureInfo{"u_image", idBackgroundImageTexture}, }; // Circle -const std::vector ShaderInfo::uniformBlocks = { +using CircleShaderInfo = ShaderInfo; + +const std::vector CircleShaderInfo::uniformBlocks = { UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, UniformBlockInfo{"CircleDrawableUBO", idCircleDrawableUBO}, - UniformBlockInfo{"CircleInterpolateUBO", idCircleInterpolateUBO}, UniformBlockInfo{"CircleEvaluatedPropsUBO", idCircleEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector CircleShaderInfo::attributes = { AttributeInfo{"a_pos", idCirclePosVertexAttribute}, AttributeInfo{"a_color", idCircleColorVertexAttribute}, AttributeInfo{"a_radius", idCircleRadiusVertexAttribute}, @@ -60,242 +62,255 @@ const std::vector ShaderInfo ShaderInfo::textures = {}; +const std::vector CircleShaderInfo::textures = {}; // Collision Box -const std::vector ShaderInfo::uniformBlocks = - { - UniformBlockInfo{"CollisionUBO", idCollisionUBO}, +using CollisionBoxShaderInfo = ShaderInfo; + +const std::vector CollisionBoxShaderInfo::uniformBlocks = { + UniformBlockInfo{"CollisionDrawableUBO", idCollisionDrawableUBO}, + UniformBlockInfo{"CollisionTilePropsUBO", idCollisionTilePropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector CollisionBoxShaderInfo::attributes = { AttributeInfo{"a_pos", idCollisionPosVertexAttribute}, AttributeInfo{"a_anchor_pos", idCollisionAnchorPosVertexAttribute}, AttributeInfo{"a_extrude", idCollisionExtrudeVertexAttribute}, AttributeInfo{"a_placed", idCollisionPlacedVertexAttribute}, AttributeInfo{"a_shift", idCollisionShiftVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector CollisionBoxShaderInfo::textures = {}; // Collision Circle -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"CollisionUBO", idCollisionUBO}, +using CollisionCircleShaderInfo = ShaderInfo; + +const std::vector CollisionCircleShaderInfo::uniformBlocks = { + UniformBlockInfo{"CollisionDrawableUBO", idCollisionDrawableUBO}, + UniformBlockInfo{"CollisionTilePropsUBO", idCollisionTilePropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector CollisionCircleShaderInfo::attributes = { AttributeInfo{"a_pos", idCollisionPosVertexAttribute}, AttributeInfo{"a_anchor_pos", idCollisionAnchorPosVertexAttribute}, AttributeInfo{"a_extrude", idCollisionExtrudeVertexAttribute}, AttributeInfo{"a_placed", idCollisionPlacedVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector CollisionCircleShaderInfo::textures = {}; // Custom Symbol Icon -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"CustomSymbolIconDrawableUBO", idCustomSymbolDrawableUBO}, - UniformBlockInfo{"CustomSymbolIconParametersUBO", idCustomSymbolParametersUBO}, +using CustomSymbolIconShaderInfo = ShaderInfo; + +const std::vector CustomSymbolIconShaderInfo::uniformBlocks = { + UniformBlockInfo{"CustomSymbolIconDrawableUBO", idCustomSymbolDrawableUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector CustomSymbolIconShaderInfo::attributes = { AttributeInfo{"a_pos", idCustomSymbolPosVertexAttribute}, AttributeInfo{"a_tex", idCustomSymbolTexVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector CustomSymbolIconShaderInfo::textures = { TextureInfo{"u_texture", idCustomSymbolImageTexture}, }; // Debug -const std::vector ShaderInfo::uniformBlocks = { +using DebugShaderInfo = ShaderInfo; + +const std::vector DebugShaderInfo::uniformBlocks = { UniformBlockInfo{"DebugUBO", idDebugUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector DebugShaderInfo::attributes = { AttributeInfo{"a_pos", idDebugPosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector DebugShaderInfo::textures = { TextureInfo{"u_overlay", idDebugOverlayTexture}, }; // Fill -const std::vector ShaderInfo::uniformBlocks = { +using FillShaderInfo = ShaderInfo; + +const std::vector FillShaderInfo::uniformBlocks = { UniformBlockInfo{"FillDrawableUBO", idFillDrawableUBO}, - UniformBlockInfo{"FillInterpolateUBO", idFillInterpolateUBO}, UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector FillShaderInfo::attributes = { AttributeInfo{"a_pos", idFillPosVertexAttribute}, AttributeInfo{"a_color", idFillColorVertexAttribute}, AttributeInfo{"a_opacity", idFillOpacityVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector FillShaderInfo::textures = {}; // Fill Outline -const std::vector ShaderInfo::uniformBlocks = - { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"FillOutlineDrawableUBO", idFillDrawableUBO}, - UniformBlockInfo{"FillOutlineInterpolateUBO", idFillInterpolateUBO}, - UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using FillOutlineShaderInfo = ShaderInfo; + +const std::vector FillOutlineShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"FillOutlineDrawableUBO", idFillDrawableUBO}, + UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, +}; +const std::vector FillOutlineShaderInfo::attributes = { AttributeInfo{"a_pos", idFillPosVertexAttribute}, AttributeInfo{"a_outline_color", idFillOutlineColorVertexAttribute}, AttributeInfo{"a_opacity", idFillOpacityVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector FillOutlineShaderInfo::textures = {}; // Fill Pattern -const std::vector ShaderInfo::uniformBlocks = - { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"FillPatternDrawableUBO", idFillDrawableUBO}, - UniformBlockInfo{"FillPatternTilePropsUBO", idFillTilePropsUBO}, - UniformBlockInfo{"FillPatternInterpolateUBO", idFillInterpolateUBO}, - UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using FillPatternShaderInfo = ShaderInfo; + +const std::vector FillPatternShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"FillPatternDrawableUBO", idFillDrawableUBO}, + UniformBlockInfo{"FillPatternTilePropsUBO", idFillTilePropsUBO}, + UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, +}; +const std::vector FillPatternShaderInfo::attributes = { AttributeInfo{"a_pos", idFillPosVertexAttribute}, AttributeInfo{"a_opacity", idFillOpacityVertexAttribute}, AttributeInfo{"a_pattern_from", idFillPatternFromVertexAttribute}, AttributeInfo{"a_pattern_to", idFillPatternToVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector FillPatternShaderInfo::textures = { TextureInfo{"u_image", idFillImageTexture}, }; // Fill Outline Pattern -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"FillOutlinePatternDrawableUBO", idFillDrawableUBO}, - UniformBlockInfo{"FillOutlinePatternTilePropsUBO", idFillTilePropsUBO}, - UniformBlockInfo{"FillOutlinePatternInterpolateUBO", idFillInterpolateUBO}, - UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = - { - AttributeInfo{"a_pos", idFillPosVertexAttribute}, - AttributeInfo{"a_opacity", idFillOpacityVertexAttribute}, - AttributeInfo{"a_pattern_from", idFillPatternFromVertexAttribute}, - AttributeInfo{"a_pattern_to", idFillPatternToVertexAttribute}, -}; -const std::vector ShaderInfo::textures = { +using FillOutlinePatternShaderInfo = ShaderInfo; + +const std::vector FillOutlinePatternShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"FillOutlinePatternDrawableUBO", idFillDrawableUBO}, + UniformBlockInfo{"FillOutlinePatternTilePropsUBO", idFillTilePropsUBO}, + UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, +}; +const std::vector FillOutlinePatternShaderInfo::attributes = { + AttributeInfo{"a_pos", idFillPosVertexAttribute}, + AttributeInfo{"a_opacity", idFillOpacityVertexAttribute}, + AttributeInfo{"a_pattern_from", idFillPatternFromVertexAttribute}, + AttributeInfo{"a_pattern_to", idFillPatternToVertexAttribute}, +}; +const std::vector FillOutlinePatternShaderInfo::textures = { TextureInfo{"u_image", idFillImageTexture}, }; // Fill Outline Triangulated -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"FillOutlineTriangulatedDrawableUBO", idFillDrawableUBO}, - UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, +using FillOutlineTriangulatedShaderInfo = + ShaderInfo; + +const std::vector FillOutlineTriangulatedShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"FillOutlineTriangulatedDrawableUBO", idFillDrawableUBO}, + UniformBlockInfo{"FillEvaluatedPropsUBO", idFillEvaluatedPropsUBO}, }; -const std::vector - ShaderInfo::attributes = { - AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, - AttributeInfo{"a_data", idLineDataVertexAttribute}, +const std::vector FillOutlineTriangulatedShaderInfo::attributes = { + AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, + AttributeInfo{"a_data", idLineDataVertexAttribute}, }; -const std::vector - ShaderInfo::textures = {}; +const std::vector FillOutlineTriangulatedShaderInfo::textures = {}; // Fill Extrusion -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"FillExtrusionDrawableUBO", idFillExtrusionDrawableUBO}, - UniformBlockInfo{"FillExtrusionTilePropsUBO", idFillExtrusionTilePropsUBO}, - UniformBlockInfo{"FillExtrusionInterpolateUBO", idFillExtrusionInterpolateUBO}, - UniformBlockInfo{"FillExtrusionPropsUBO", idFillExtrusionPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using FillExtrusionShaderInfo = ShaderInfo; + +const std::vector FillExtrusionShaderInfo::uniformBlocks = { + UniformBlockInfo{"FillExtrusionDrawableUBO", idFillExtrusionDrawableUBO}, + UniformBlockInfo{"FillExtrusionTilePropsUBO", idFillExtrusionTilePropsUBO}, + UniformBlockInfo{"FillExtrusionPropsUBO", idFillExtrusionPropsUBO}, +}; +const std::vector FillExtrusionShaderInfo::attributes = { AttributeInfo{"a_pos", idFillExtrusionPosVertexAttribute}, AttributeInfo{"a_normal_ed", idFillExtrusionNormalEdVertexAttribute}, AttributeInfo{"a_base", idFillExtrusionBaseVertexAttribute}, AttributeInfo{"a_height", idFillExtrusionHeightVertexAttribute}, AttributeInfo{"a_color", idFillExtrusionColorVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector FillExtrusionShaderInfo::textures = {}; // Fill Extrusion Pattern -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"FillExtrusionDrawableUBO", idFillExtrusionDrawableUBO}, - UniformBlockInfo{"FillExtrusionTilePropsUBO", idFillExtrusionTilePropsUBO}, - UniformBlockInfo{"FillExtrusionInterpolateUBO", idFillExtrusionInterpolateUBO}, - UniformBlockInfo{"FillExtrusionPropsUBO", idFillExtrusionPropsUBO}, -}; -const std::vector - ShaderInfo::attributes = { - AttributeInfo{"a_pos", idFillExtrusionPosVertexAttribute}, - AttributeInfo{"a_normal_ed", idFillExtrusionNormalEdVertexAttribute}, - AttributeInfo{"a_base", idFillExtrusionBaseVertexAttribute}, - AttributeInfo{"a_height", idFillExtrusionHeightVertexAttribute}, - AttributeInfo{"a_pattern_from", idFillExtrusionPatternFromVertexAttribute}, - AttributeInfo{"a_pattern_to", idFillExtrusionPatternToVertexAttribute}, -}; -const std::vector ShaderInfo::textures = { +using FillExtrusionPatternShaderInfo = ShaderInfo; + +const std::vector FillExtrusionPatternShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"FillExtrusionDrawableUBO", idFillExtrusionDrawableUBO}, + UniformBlockInfo{"FillExtrusionTilePropsUBO", idFillExtrusionTilePropsUBO}, + UniformBlockInfo{"FillExtrusionPropsUBO", idFillExtrusionPropsUBO}, +}; +const std::vector FillExtrusionPatternShaderInfo::attributes = { + AttributeInfo{"a_pos", idFillExtrusionPosVertexAttribute}, + AttributeInfo{"a_normal_ed", idFillExtrusionNormalEdVertexAttribute}, + AttributeInfo{"a_base", idFillExtrusionBaseVertexAttribute}, + AttributeInfo{"a_height", idFillExtrusionHeightVertexAttribute}, + AttributeInfo{"a_pattern_from", idFillExtrusionPatternFromVertexAttribute}, + AttributeInfo{"a_pattern_to", idFillExtrusionPatternToVertexAttribute}, +}; +const std::vector FillExtrusionPatternShaderInfo::textures = { TextureInfo{"u_image", idFillExtrusionImageTexture}, }; // Heatmap -const std::vector ShaderInfo::uniformBlocks = { +using HeatmapShaderInfo = ShaderInfo; + +const std::vector HeatmapShaderInfo::uniformBlocks = { UniformBlockInfo{"HeatmapDrawableUBO", idHeatmapDrawableUBO}, - UniformBlockInfo{"HeatmapInterpolateUBO", idHeatmapInterpolateUBO}, UniformBlockInfo{"HeatmapEvaluatedPropsUBO", idHeatmapEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector HeatmapShaderInfo::attributes = { AttributeInfo{"a_pos", idHeatmapPosVertexAttribute}, AttributeInfo{"a_weight", idHeatmapWeightVertexAttribute}, AttributeInfo{"a_radius", idHeatmapRadiusVertexAttribute}, }; -const std::vector ShaderInfo::textures = {}; +const std::vector HeatmapShaderInfo::textures = {}; // Heatmap Texture -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"HeatmapTexturePropsUBO", idHeatmapTexturePropsUBO}, +using HeatmapTextureShaderInfo = ShaderInfo; + +const std::vector HeatmapTextureShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"HeatmapTexturePropsUBO", idHeatmapTexturePropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector HeatmapTextureShaderInfo::attributes = { AttributeInfo{"a_pos", idHeatmapPosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector HeatmapTextureShaderInfo::textures = { TextureInfo{"u_image", idHeatmapImageTexture}, TextureInfo{"u_color_ramp", idHeatmapColorRampTexture}, }; // Hillshade Prepare -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"HillshadePrepareDrawableUBO", idHillshadePrepareDrawableUBO}, +using HillshadePrepareShaderInfo = ShaderInfo; + +const std::vector HillshadePrepareShaderInfo::uniformBlocks = { + UniformBlockInfo{"HillshadePrepareDrawableUBO", idHillshadePrepareDrawableUBO}, + UniformBlockInfo{"HillshadePrepareTilePropsUBO", idHillshadePrepareTilePropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector HillshadePrepareShaderInfo::attributes = { AttributeInfo{"a_pos", idHillshadePosVertexAttribute}, AttributeInfo{"a_texture_pos", idHillshadeTexturePosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector HillshadePrepareShaderInfo::textures = { TextureInfo{"u_image", idHillshadeImageTexture}, }; // Hillshade -const std::vector ShaderInfo::uniformBlocks = { +using HillshadeShaderInfo = ShaderInfo; + +const std::vector HillshadeShaderInfo::uniformBlocks = { UniformBlockInfo{"HillshadeDrawableUBO", idHillshadeDrawableUBO}, + UniformBlockInfo{"HillshadeTilePropsUBO", idHillshadeTilePropsUBO}, UniformBlockInfo{"HillshadeEvaluatedPropsUBO", idHillshadeEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector HillshadeShaderInfo::attributes = { AttributeInfo{"a_pos", idHillshadePosVertexAttribute}, AttributeInfo{"a_texture_pos", idHillshadeTexturePosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector HillshadeShaderInfo::textures = { TextureInfo{"u_image", idHillshadeImageTexture}, }; // Line -const std::vector ShaderInfo::uniformBlocks = { +using LineShaderInfo = ShaderInfo; + +const std::vector LineShaderInfo::uniformBlocks = { UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, UniformBlockInfo{"LineDrawableUBO", idLineDrawableUBO}, - UniformBlockInfo{"LineInterpolationUBO", idLineInterpolationUBO}, UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector LineShaderInfo::attributes = { AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, AttributeInfo{"a_data", idLineDataVertexAttribute}, AttributeInfo{"a_color", idLineColorVertexAttribute}, @@ -305,17 +320,17 @@ const std::vector ShaderInfo ShaderInfo::textures = {}; +const std::vector LineShaderInfo::textures = {}; // Line Gradient -const std::vector ShaderInfo::uniformBlocks = - { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"LineGradientDrawableUBO", idLineDrawableUBO}, - UniformBlockInfo{"LineGradientInterpolationUBO", idLineInterpolationUBO}, - UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using LineGradientShaderInfo = ShaderInfo; + +const std::vector LineGradientShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"LineGradientDrawableUBO", idLineDrawableUBO}, + UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, +}; +const std::vector LineGradientShaderInfo::attributes = { AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, AttributeInfo{"a_data", idLineDataVertexAttribute}, AttributeInfo{"a_blur", idLineBlurVertexAttribute}, @@ -324,20 +339,20 @@ const std::vector ShaderInfo ShaderInfo::textures = { +const std::vector LineGradientShaderInfo::textures = { TextureInfo{"u_image", idLineImageTexture}, }; // Line Pattern -const std::vector ShaderInfo::uniformBlocks = - { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"LinePatternDrawableUBO", idLineDrawableUBO}, - UniformBlockInfo{"LinePatternInterpolationUBO", idLineInterpolationUBO}, - UniformBlockInfo{"LinePatternTilePropertiesUBO", idLineTilePropertiesUBO}, - UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using LinePatternShaderInfo = ShaderInfo; + +const std::vector LinePatternShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"LinePatternDrawableUBO", idLineDrawableUBO}, + UniformBlockInfo{"LinePatternTilePropsUBO", idLineTilePropsUBO}, + UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, +}; +const std::vector LinePatternShaderInfo::attributes = { AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, AttributeInfo{"a_data", idLineDataVertexAttribute}, AttributeInfo{"a_blur", idLineBlurVertexAttribute}, @@ -348,18 +363,20 @@ const std::vector ShaderInfo ShaderInfo::textures = { +const std::vector LinePatternShaderInfo::textures = { TextureInfo{"u_image", idLineImageTexture}, }; // Line SDF -const std::vector ShaderInfo::uniformBlocks = { +using LineSDFShaderInfo = ShaderInfo; + +const std::vector LineSDFShaderInfo::uniformBlocks = { UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, UniformBlockInfo{"LineSDFDrawableUBO", idLineDrawableUBO}, - UniformBlockInfo{"LineSDFInterpolationUBO", idLineInterpolationUBO}, + UniformBlockInfo{"LineSDFTilePropsUBO", idLineTilePropsUBO}, UniformBlockInfo{"LineEvaluatedPropsUBO", idLineEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector LineSDFShaderInfo::attributes = { AttributeInfo{"a_pos_normal", idLinePosNormalVertexAttribute}, AttributeInfo{"a_data", idLineDataVertexAttribute}, AttributeInfo{"a_color", idLineColorVertexAttribute}, @@ -370,33 +387,36 @@ const std::vector ShaderInfo ShaderInfo::textures = { +const std::vector LineSDFShaderInfo::textures = { TextureInfo{"u_image", idLineImageTexture}, }; // Raster -const std::vector ShaderInfo::uniformBlocks = { +using RasterShaderInfo = ShaderInfo; + +const std::vector RasterShaderInfo::uniformBlocks = { UniformBlockInfo{"RasterDrawableUBO", idRasterDrawableUBO}, UniformBlockInfo{"RasterEvaluatedPropsUBO", idRasterEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector RasterShaderInfo::attributes = { AttributeInfo{"a_pos", idRasterPosVertexAttribute}, AttributeInfo{"a_texture_pos", idRasterTexturePosVertexAttribute}, }; -const std::vector ShaderInfo::textures = { +const std::vector RasterShaderInfo::textures = { TextureInfo{"u_image0", idRasterImage0Texture}, TextureInfo{"u_image1", idRasterImage0Texture}, }; // Symbol Icon -const std::vector ShaderInfo::uniformBlocks = { +using SymbolIconShaderInfo = ShaderInfo; + +const std::vector SymbolIconShaderInfo::uniformBlocks = { UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, - UniformBlockInfo{"SymbolInterpolateUBO", idSymbolInterpolateUBO}, UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, }; -const std::vector ShaderInfo::attributes = { +const std::vector SymbolIconShaderInfo::attributes = { AttributeInfo{"a_pos_offset", idSymbolPosOffsetVertexAttribute}, AttributeInfo{"a_data", idSymbolDataVertexAttribute}, AttributeInfo{"a_pixeloffset", idSymbolPixelOffsetVertexAttribute}, @@ -404,20 +424,20 @@ const std::vector ShaderInfo ShaderInfo::textures = { +const std::vector SymbolIconShaderInfo::textures = { TextureInfo{"u_texture", idSymbolImageTexture}, }; // Symbol SDF -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, - UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, - UniformBlockInfo{"SymbolInterpolateUBO", idSymbolInterpolateUBO}, - UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = { +using SymbolSDFIconShaderInfo = ShaderInfo; + +const std::vector SymbolSDFIconShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, + UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, + UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, +}; +const std::vector SymbolSDFIconShaderInfo::attributes = { AttributeInfo{"a_pos_offset", idSymbolPosOffsetVertexAttribute}, AttributeInfo{"a_data", idSymbolDataVertexAttribute}, AttributeInfo{"a_pixeloffset", idSymbolPixelOffsetVertexAttribute}, @@ -429,32 +449,31 @@ const std::vector ShaderInfo ShaderInfo::textures = { +const std::vector SymbolSDFIconShaderInfo::textures = { TextureInfo{"u_texture", idSymbolImageTexture}, }; // Symbol Text & Icon -const std::vector - ShaderInfo::uniformBlocks = { - UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, - UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, - UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, - UniformBlockInfo{"SymbolInterpolateUBO", idSymbolInterpolateUBO}, - UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, -}; -const std::vector ShaderInfo::attributes = - { - AttributeInfo{"a_pos_offset", idSymbolPosOffsetVertexAttribute}, - AttributeInfo{"a_data", idSymbolDataVertexAttribute}, - AttributeInfo{"a_projected_pos", idSymbolProjectedPosVertexAttribute}, - AttributeInfo{"a_fade_opacity", idSymbolFadeOpacityVertexAttribute}, - AttributeInfo{"a_fill_color", idSymbolColorVertexAttribute}, - AttributeInfo{"a_halo_color", idSymbolHaloColorVertexAttribute}, - AttributeInfo{"a_opacity", idSymbolOpacityVertexAttribute}, - AttributeInfo{"a_halo_width", idSymbolHaloWidthVertexAttribute}, - AttributeInfo{"a_halo_blur", idSymbolHaloBlurVertexAttribute}, -}; -const std::vector ShaderInfo::textures = { +using SymbolTextAndIconShaderInfo = ShaderInfo; + +const std::vector SymbolTextAndIconShaderInfo::uniformBlocks = { + UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, + UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, + UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, + UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, +}; +const std::vector SymbolTextAndIconShaderInfo::attributes = { + AttributeInfo{"a_pos_offset", idSymbolPosOffsetVertexAttribute}, + AttributeInfo{"a_data", idSymbolDataVertexAttribute}, + AttributeInfo{"a_projected_pos", idSymbolProjectedPosVertexAttribute}, + AttributeInfo{"a_fade_opacity", idSymbolFadeOpacityVertexAttribute}, + AttributeInfo{"a_fill_color", idSymbolColorVertexAttribute}, + AttributeInfo{"a_halo_color", idSymbolHaloColorVertexAttribute}, + AttributeInfo{"a_opacity", idSymbolOpacityVertexAttribute}, + AttributeInfo{"a_halo_width", idSymbolHaloWidthVertexAttribute}, + AttributeInfo{"a_halo_blur", idSymbolHaloBlurVertexAttribute}, +}; +const std::vector SymbolTextAndIconShaderInfo::textures = { TextureInfo{"u_texture", idSymbolImageTexture}, TextureInfo{"u_texture_icon", idSymbolImageIconTexture}, }; diff --git a/src/mbgl/shaders/gl/shader_program_gl.cpp b/src/mbgl/shaders/gl/shader_program_gl.cpp index f56920b091bc..a5b3a668c4bb 100644 --- a/src/mbgl/shaders/gl/shader_program_gl.cpp +++ b/src/mbgl/shaders/gl/shader_program_gl.cpp @@ -88,19 +88,16 @@ ShaderProgramGL::ShaderProgramGL(UniqueProgram&& glProgram_) glProgram(std::move(glProgram_)) {} ShaderProgramGL::ShaderProgramGL(UniqueProgram&& program, - UniformBlockArrayGL&& uniformBlocks_, VertexAttributeArrayGL&& attributes_, SamplerLocationArray&& samplerLocations_) : ShaderProgramBase(), glProgram(std::move(program)), - uniformBlocks(std::move(uniformBlocks_)), vertexAttributes(std::move(attributes_)), samplerLocations(std::move(samplerLocations_)) {} ShaderProgramGL::ShaderProgramGL(ShaderProgramGL&& other) : ShaderProgramBase(std::forward(other)), glProgram(std::move(other.glProgram)), - uniformBlocks(std::move(other.uniformBlocks)), vertexAttributes(std::move(other.vertexAttributes)), samplerLocations(std::move(other.samplerLocations)) {} @@ -143,7 +140,6 @@ std::shared_ptr ShaderProgramGL::create( context.getObserver().onPostCompileShader( programParameters.getProgramType(), gfx::Backend::Type::OpenGL, additionalDefines); - UniformBlockArrayGL uniformBlocks; for (const auto& blockInfo : uniformBlocksInfo) { GLint index = MBGL_CHECK_ERROR(glGetUniformBlockIndex(program, blockInfo.name.data())); GLint size = 0; @@ -151,7 +147,6 @@ std::shared_ptr ShaderProgramGL::create( assert(size > 0); GLint binding = static_cast(blockInfo.binding); MBGL_CHECK_ERROR(glUniformBlockBinding(program, index, binding)); - uniformBlocks.set(blockInfo.id, binding, size); } SamplerLocationArray samplerLocations; @@ -182,8 +177,7 @@ std::shared_ptr ShaderProgramGL::create( addAttr(attrs, attributesInfo[location].id, location, length, size, glType); } - return std::make_shared( - std::move(program), std::move(uniformBlocks), std::move(attrs), std::move(samplerLocations)); + return std::make_shared(std::move(program), std::move(attrs), std::move(samplerLocations)); } catch (const std::exception& e) { context.getObserver().onShaderCompileFailed( programParameters.getProgramType(), gfx::Backend::Type::OpenGL, additionalDefines); diff --git a/src/mbgl/shaders/mtl/background.cpp b/src/mbgl/shaders/mtl/background.cpp index e2556339c4fc..2b9e8ab91cbe 100644 --- a/src/mbgl/shaders/mtl/background.cpp +++ b/src/mbgl/shaders/mtl/background.cpp @@ -1,18 +1,28 @@ #include #include -#include namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(BackgroundDrawableUBO), idBackgroundDrawableUBO}, - UniformBlockInfo{false, true, sizeof(BackgroundLayerUBO), idBackgroundLayerUBO}, +// +// Background + +using BackgroundShaderSource = ShaderSource; + +const std::array BackgroundShaderSource::attributes = { + AttributeInfo{backgroundUBOCount + 0, gfx::AttributeDataType::Float3, idBackgroundPosVertexAttribute}, }; -const std::array ShaderSource::attributes = { +const std::array BackgroundShaderSource::textures = {}; + +// +// Background pattern + +using BackgroundPatternShaderSource = ShaderSource; + +const std::array BackgroundPatternShaderSource::attributes = { AttributeInfo{backgroundUBOCount + 0, gfx::AttributeDataType::Float3, idBackgroundPosVertexAttribute}, }; -const std::array ShaderSource::textures = {}; +const std::array BackgroundPatternShaderSource::textures = {TextureInfo{0, idBackgroundImageTexture}}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/background_pattern.cpp b/src/mbgl/shaders/mtl/background_pattern.cpp deleted file mode 100644 index 3eb91e51300b..000000000000 --- a/src/mbgl/shaders/mtl/background_pattern.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{false, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(BackgroundPatternDrawableUBO), idBackgroundDrawableUBO}, - UniformBlockInfo{true, true, sizeof(BackgroundPatternLayerUBO), idBackgroundLayerUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{backgroundUBOCount + 0, gfx::AttributeDataType::Float3, idBackgroundPosVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idBackgroundImageTexture}}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/circle.cpp b/src/mbgl/shaders/mtl/circle.cpp index 7afbfa9ac67c..121d4a6baf22 100644 --- a/src/mbgl/shaders/mtl/circle.cpp +++ b/src/mbgl/shaders/mtl/circle.cpp @@ -4,13 +4,9 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(CircleDrawableUBO), idCircleDrawableUBO}, - UniformBlockInfo{true, false, sizeof(CircleInterpolateUBO), idCircleInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(CircleEvaluatedPropsUBO), idCircleEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using CircleShaderSource = ShaderSource; + +const std::array CircleShaderSource::attributes = { AttributeInfo{circleUBOCount + 0, gfx::AttributeDataType::Short2, idCirclePosVertexAttribute}, AttributeInfo{circleUBOCount + 1, gfx::AttributeDataType::Float4, idCircleColorVertexAttribute}, AttributeInfo{circleUBOCount + 2, gfx::AttributeDataType::Float2, idCircleRadiusVertexAttribute}, @@ -20,7 +16,7 @@ const std::array ShaderSource ShaderSource::textures = {}; +const std::array CircleShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/clipping_mask.cpp b/src/mbgl/shaders/mtl/clipping_mask.cpp index 5b97d69a9826..be572874a927 100644 --- a/src/mbgl/shaders/mtl/clipping_mask.cpp +++ b/src/mbgl/shaders/mtl/clipping_mask.cpp @@ -3,15 +3,12 @@ namespace mbgl { namespace shaders { -using ShaderType = ShaderSource; +using ClippingMaskShaderSource = ShaderSource; -const std::array ShaderType::uniforms = { - UniformBlockInfo{true, false, sizeof(ClipUBO), idClippingMaskUBO}, -}; -const std::array ShaderType::attributes = { +const std::array ClippingMaskShaderSource::attributes = { AttributeInfo{clippingMaskUBOCount + 0, gfx::AttributeDataType::Float3, idClippingMaskPosVertexAttribute}, }; -const std::array ShaderType::textures = {}; +const std::array ClippingMaskShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/collision.cpp b/src/mbgl/shaders/mtl/collision.cpp new file mode 100644 index 000000000000..35e4792e6a3a --- /dev/null +++ b/src/mbgl/shaders/mtl/collision.cpp @@ -0,0 +1,35 @@ +#include +#include + +namespace mbgl { +namespace shaders { + +// +// Collision box + +using CollisionBoxShaderSource = ShaderSource; + +const std::array CollisionBoxShaderSource::attributes = { + AttributeInfo{collisionUBOCount + 0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, + AttributeInfo{collisionUBOCount + 1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, + AttributeInfo{collisionUBOCount + 2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, + AttributeInfo{collisionUBOCount + 3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, + AttributeInfo{collisionUBOCount + 4, gfx::AttributeDataType::Float2, idCollisionShiftVertexAttribute}, +}; +const std::array CollisionBoxShaderSource::textures = {}; + +// +// Collision circle + +using CollisionCircleShaderSource = ShaderSource; + +const std::array CollisionCircleShaderSource::attributes = { + AttributeInfo{collisionUBOCount + 0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, + AttributeInfo{collisionUBOCount + 1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, + AttributeInfo{collisionUBOCount + 2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, + AttributeInfo{collisionUBOCount + 3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, +}; +const std::array CollisionCircleShaderSource::textures = {}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/collision_box.cpp b/src/mbgl/shaders/mtl/collision_box.cpp deleted file mode 100644 index 2eadf5bf09a5..000000000000 --- a/src/mbgl/shaders/mtl/collision_box.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(CollisionUBO), idCollisionUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{collisionDrawableUBOCount + 0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 4, gfx::AttributeDataType::Float2, idCollisionShiftVertexAttribute}, -}; -const std::array ShaderSource::textures = {}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/collision_circle.cpp b/src/mbgl/shaders/mtl/collision_circle.cpp deleted file mode 100644 index bc407e1d235b..000000000000 --- a/src/mbgl/shaders/mtl/collision_circle.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(CollisionUBO), idCollisionUBO}, -}; -const std::array ShaderSource::attributes = - { - AttributeInfo{collisionDrawableUBOCount + 0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, - AttributeInfo{ - collisionDrawableUBOCount + 1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, - AttributeInfo{collisionDrawableUBOCount + 3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, -}; -const std::array ShaderSource::textures = {}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/custom_symbol_icon.cpp b/src/mbgl/shaders/mtl/custom_symbol_icon.cpp index 8b104bd44970..849d868440c1 100644 --- a/src/mbgl/shaders/mtl/custom_symbol_icon.cpp +++ b/src/mbgl/shaders/mtl/custom_symbol_icon.cpp @@ -4,18 +4,13 @@ namespace mbgl { namespace shaders { -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(CustomSymbolIconDrawableUBO), idCustomSymbolDrawableUBO}, - UniformBlockInfo{true, false, sizeof(CustomSymbolIconParametersUBO), idCustomSymbolParametersUBO}, -}; -const std::array ShaderSource::attributes = { - // always attributes - AttributeInfo{customSymbolDrawableUBOCount + 0, gfx::AttributeDataType::Float2, idCustomSymbolPosVertexAttribute}, - AttributeInfo{customSymbolDrawableUBOCount + 1, gfx::AttributeDataType::Float2, idCustomSymbolTexVertexAttribute}, +using CustomSymbolIconShaderSource = ShaderSource; + +const std::array CustomSymbolIconShaderSource::attributes = { + AttributeInfo{customSymbolUBOCount + 0, gfx::AttributeDataType::Float2, idCustomSymbolPosVertexAttribute}, + AttributeInfo{customSymbolUBOCount + 1, gfx::AttributeDataType::Float2, idCustomSymbolTexVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array CustomSymbolIconShaderSource::textures = { TextureInfo{0, idCustomSymbolImageTexture}, }; diff --git a/src/mbgl/shaders/mtl/debug.cpp b/src/mbgl/shaders/mtl/debug.cpp index d1be225ad9a2..ffebb0d206fb 100644 --- a/src/mbgl/shaders/mtl/debug.cpp +++ b/src/mbgl/shaders/mtl/debug.cpp @@ -4,13 +4,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(DebugUBO), idDebugUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{debugDrawableUBOCount + 0, gfx::AttributeDataType::Short2, idDebugPosVertexAttribute}, +using DebugShaderSource = ShaderSource; + +const std::array DebugShaderSource::attributes = { + AttributeInfo{debugUBOCount + 0, gfx::AttributeDataType::Short2, idDebugPosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array DebugShaderSource::textures = { TextureInfo{0, idDebugOverlayTexture}, }; diff --git a/src/mbgl/shaders/mtl/fill.cpp b/src/mbgl/shaders/mtl/fill.cpp index 80f124f7127b..20fce1316a33 100644 --- a/src/mbgl/shaders/mtl/fill.cpp +++ b/src/mbgl/shaders/mtl/fill.cpp @@ -4,81 +4,71 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(FillDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill + +using FillShaderSource = ShaderSource; + +const std::array FillShaderSource::attributes = { AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::Float4, idFillColorVertexAttribute}, AttributeInfo{fillUBOCount + 2, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = {}; +const std::array FillShaderSource::textures = {}; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill outline + +using FillOutlineShaderSource = ShaderSource; + +const std::array FillOutlineShaderSource::attributes = { AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::Float4, idFillOutlineColorVertexAttribute}, AttributeInfo{fillUBOCount + 2, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = {}; - -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillPatternDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillPatternTilePropsUBO), idFillTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillPatternInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +const std::array FillOutlineShaderSource::textures = {}; + +// +// Fill pattern + +using FillPatternShaderSource = ShaderSource; + +const std::array FillPatternShaderSource::attributes = { AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, AttributeInfo{fillUBOCount + 2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, AttributeInfo{fillUBOCount + 3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array FillPatternShaderSource::textures = { TextureInfo{0, idFillImageTexture}, }; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillOutlinePatternDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillOutlinePatternTilePropsUBO), idFillTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlinePatternInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, - AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, - AttributeInfo{fillUBOCount + 2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, - AttributeInfo{fillUBOCount + 3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, +// +// Fill pattern outline + +using FillOutlinePatternShaderSource = ShaderSource; + +const std::array FillOutlinePatternShaderSource::attributes = { + AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, + AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, + AttributeInfo{fillUBOCount + 2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, + AttributeInfo{fillUBOCount + 3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = - { - TextureInfo{0, idFillImageTexture}, +const std::array FillOutlinePatternShaderSource::textures = { + TextureInfo{0, idFillImageTexture}, }; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineTriangulatedDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, - AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, +// +// Fill outline triangulated + +using FillOutlineTriangulatedShaderSource = + ShaderSource; + +const std::array FillOutlineTriangulatedShaderSource::attributes = { + AttributeInfo{fillUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, + AttributeInfo{fillUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, }; -const std::array - ShaderSource::textures = {}; +const std::array FillOutlineTriangulatedShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/fill_extrusion.cpp b/src/mbgl/shaders/mtl/fill_extrusion.cpp index 4a329a7cd5e4..c39a9620aa8c 100644 --- a/src/mbgl/shaders/mtl/fill_extrusion.cpp +++ b/src/mbgl/shaders/mtl/fill_extrusion.cpp @@ -4,20 +4,37 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, false, sizeof(FillExtrusionDrawableUBO), idFillExtrusionDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionInterpolateUBO), idFillExtrusionInterpolateUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionPropsUBO), idFillExtrusionPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill extrusion + +using FillExtrusionShaderSource = ShaderSource; + +const std::array FillExtrusionShaderSource::attributes = { AttributeInfo{fillExtrusionUBOCount + 0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, AttributeInfo{fillExtrusionUBOCount + 1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, AttributeInfo{fillExtrusionUBOCount + 2, gfx::AttributeDataType::Float4, idFillExtrusionColorVertexAttribute}, AttributeInfo{fillExtrusionUBOCount + 3, gfx::AttributeDataType::Float, idFillExtrusionBaseVertexAttribute}, AttributeInfo{fillExtrusionUBOCount + 4, gfx::AttributeDataType::Float, idFillExtrusionHeightVertexAttribute}, }; -const std::array ShaderSource::textures = {}; +const std::array FillExtrusionShaderSource::textures = {}; + +// +// Fill extrusion pattern + +using FillExtrusionPatternShaderSource = ShaderSource; + +const std::array FillExtrusionPatternShaderSource::attributes = { + AttributeInfo{fillExtrusionUBOCount + 0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, + AttributeInfo{fillExtrusionUBOCount + 1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, + AttributeInfo{fillExtrusionUBOCount + 2, gfx::AttributeDataType::Float, idFillExtrusionBaseVertexAttribute}, + AttributeInfo{fillExtrusionUBOCount + 3, gfx::AttributeDataType::Float, idFillExtrusionHeightVertexAttribute}, + AttributeInfo{ + fillExtrusionUBOCount + 4, gfx::AttributeDataType::UShort4, idFillExtrusionPatternFromVertexAttribute}, + AttributeInfo{fillExtrusionUBOCount + 5, gfx::AttributeDataType::UShort4, idFillExtrusionPatternToVertexAttribute}, +}; +const std::array FillExtrusionPatternShaderSource::textures = { + TextureInfo{0, idFillExtrusionImageTexture}, +}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp b/src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp deleted file mode 100644 index 5180d8da447f..000000000000 --- a/src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionDrawableUBO), idFillExtrusionDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionTilePropsUBO), idFillExtrusionTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionInterpolateUBO), idFillExtrusionInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionPropsUBO), idFillExtrusionPropsUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{fillExtrusionUBOCount + 0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, - AttributeInfo{fillExtrusionUBOCount + 1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, - AttributeInfo{fillExtrusionUBOCount + 2, gfx::AttributeDataType::Float, idFillExtrusionBaseVertexAttribute}, - AttributeInfo{fillExtrusionUBOCount + 3, gfx::AttributeDataType::Float, idFillExtrusionHeightVertexAttribute}, - AttributeInfo{ - fillExtrusionUBOCount + 4, gfx::AttributeDataType::UShort4, idFillExtrusionPatternFromVertexAttribute}, - AttributeInfo{fillExtrusionUBOCount + 5, gfx::AttributeDataType::UShort4, idFillExtrusionPatternToVertexAttribute}, -}; -const std::array - ShaderSource::textures = { - TextureInfo{0, idFillExtrusionImageTexture}, -}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/heatmap.cpp b/src/mbgl/shaders/mtl/heatmap.cpp index c63e3acd7456..45351bb324e0 100644 --- a/src/mbgl/shaders/mtl/heatmap.cpp +++ b/src/mbgl/shaders/mtl/heatmap.cpp @@ -4,17 +4,14 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(HeatmapDrawableUBO), idHeatmapDrawableUBO}, - UniformBlockInfo{true, false, sizeof(HeatmapInterpolateUBO), idHeatmapInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(HeatmapEvaluatedPropsUBO), idHeatmapEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using HeatmapShaderSource = ShaderSource; + +const std::array HeatmapShaderSource::attributes = { AttributeInfo{heatmapUBOCount + 0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, AttributeInfo{heatmapUBOCount + 1, gfx::AttributeDataType::Float2, idHeatmapWeightVertexAttribute}, AttributeInfo{heatmapUBOCount + 2, gfx::AttributeDataType::Float2, idHeatmapRadiusVertexAttribute}, }; -const std::array ShaderSource::textures = {}; +const std::array HeatmapShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/mtl/heatmap_texture.cpp b/src/mbgl/shaders/mtl/heatmap_texture.cpp index b536695beae3..28fb4e54a6ff 100644 --- a/src/mbgl/shaders/mtl/heatmap_texture.cpp +++ b/src/mbgl/shaders/mtl/heatmap_texture.cpp @@ -4,16 +4,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(HeatmapTexturePropsUBO), idHeatmapTexturePropsUBO}, -}; -const std::array ShaderSource::attributes = - { - AttributeInfo{heatmapTextureUBOCount + 0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, +using HeatmapTextureShaderSource = ShaderSource; + +const std::array HeatmapTextureShaderSource::attributes = { + AttributeInfo{heatmapTextureUBOCount + 0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array HeatmapTextureShaderSource::textures = { TextureInfo{0, idHeatmapImageTexture}, TextureInfo{1, idHeatmapColorRampTexture}, }; diff --git a/src/mbgl/shaders/mtl/hillshade.cpp b/src/mbgl/shaders/mtl/hillshade.cpp index fbd93012a8c3..d06950228958 100644 --- a/src/mbgl/shaders/mtl/hillshade.cpp +++ b/src/mbgl/shaders/mtl/hillshade.cpp @@ -4,15 +4,13 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(HillshadeDrawableUBO), idHillshadeDrawableUBO}, - UniformBlockInfo{false, true, sizeof(HillshadeEvaluatedPropsUBO), idHillshadeEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using HillshadeShaderSource = ShaderSource; + +const std::array HillshadeShaderSource::attributes = { AttributeInfo{hillshadeUBOCount + 0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, AttributeInfo{hillshadeUBOCount + 1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array HillshadeShaderSource::textures = { TextureInfo{0, idHillshadeImageTexture}, }; diff --git a/src/mbgl/shaders/mtl/hillshade_prepare.cpp b/src/mbgl/shaders/mtl/hillshade_prepare.cpp index f5eea79ea21f..3cd1571deca9 100644 --- a/src/mbgl/shaders/mtl/hillshade_prepare.cpp +++ b/src/mbgl/shaders/mtl/hillshade_prepare.cpp @@ -4,17 +4,13 @@ namespace mbgl { namespace shaders { -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(HillshadePrepareDrawableUBO), idHillshadePrepareDrawableUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{hillshadePrepareDrawableUBOCount + 0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, - AttributeInfo{ - hillshadePrepareDrawableUBOCount + 1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, +using HillshadePrepareShaderSource = ShaderSource; + +const std::array HillshadePrepareShaderSource::attributes = { + AttributeInfo{hillshadePrepareUBOCount + 0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, + AttributeInfo{hillshadePrepareUBOCount + 1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array HillshadePrepareShaderSource::textures = { TextureInfo{0, idHillshadeImageTexture}, }; diff --git a/src/mbgl/shaders/mtl/line.cpp b/src/mbgl/shaders/mtl/line.cpp index d91ba21a8dbd..028085a5f4c7 100644 --- a/src/mbgl/shaders/mtl/line.cpp +++ b/src/mbgl/shaders/mtl/line.cpp @@ -4,14 +4,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(idLineDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, - UniformBlockInfo{true, true, sizeof(LineExpressionUBO), idLineExpressionUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line + +using LineShaderSource = ShaderSource; + +const std::array LineShaderSource::attributes = { AttributeInfo{lineUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{lineUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{lineUBOCount + 2, gfx::AttributeDataType::Float4, idLineColorVertexAttribute}, @@ -21,15 +19,14 @@ const std::array ShaderSource ShaderSource::textures = {}; +const std::array LineShaderSource::textures = {}; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(LineGradientDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineGradientInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line gradient + +using LineGradientShaderSource = ShaderSource; + +const std::array LineGradientShaderSource::attributes = { AttributeInfo{lineUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{lineUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{lineUBOCount + 2, gfx::AttributeDataType::Float2, idLineBlurVertexAttribute}, @@ -38,19 +35,16 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LineGradientShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(LinePatternDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LinePatternInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LinePatternTilePropertiesUBO), idLineTilePropertiesUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, - UniformBlockInfo{true, true, sizeof(LineExpressionUBO), idLineExpressionUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line pattern + +using LinePatternShaderSource = ShaderSource; + +const std::array LinePatternShaderSource::attributes = { AttributeInfo{lineUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{lineUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{lineUBOCount + 2, gfx::AttributeDataType::Float2, idLineBlurVertexAttribute}, @@ -61,18 +55,16 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LinePatternShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(LineSDFDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineSDFInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, - UniformBlockInfo{true, true, sizeof(LineExpressionUBO), idLineExpressionUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line SDF + +using LineSDFShaderSource = ShaderSource; + +const std::array LineSDFShaderSource::attributes = { AttributeInfo{lineUBOCount + 0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{lineUBOCount + 1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{lineUBOCount + 2, gfx::AttributeDataType::Float4, idLineColorVertexAttribute}, @@ -83,7 +75,7 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LineSDFShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; diff --git a/src/mbgl/shaders/mtl/raster.cpp b/src/mbgl/shaders/mtl/raster.cpp index cc13205d4327..a3b5e1cb10d2 100644 --- a/src/mbgl/shaders/mtl/raster.cpp +++ b/src/mbgl/shaders/mtl/raster.cpp @@ -4,15 +4,13 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(RasterDrawableUBO), idRasterDrawableUBO}, - UniformBlockInfo{true, true, sizeof(RasterEvaluatedPropsUBO), idRasterEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using RasterShaderSource = ShaderSource; + +const std::array RasterShaderSource::attributes = { AttributeInfo{rasterUBOCount + 0, gfx::AttributeDataType::Short2, idRasterPosVertexAttribute}, AttributeInfo{rasterUBOCount + 1, gfx::AttributeDataType::Short2, idRasterTexturePosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array RasterShaderSource::textures = { TextureInfo{0, idRasterImage0Texture}, TextureInfo{1, idRasterImage1Texture}, }; diff --git a/src/mbgl/shaders/mtl/shader_program.cpp b/src/mbgl/shaders/mtl/shader_program.cpp index 1528fc8623e6..1f525d8921c3 100644 --- a/src/mbgl/shaders/mtl/shader_program.cpp +++ b/src/mbgl/shaders/mtl/shader_program.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -190,7 +189,6 @@ void ShaderProgram::initAttribute(const shaders::AttributeInfo& info) { // Indexes must be unique, if there's a conflict check the `attributes` array in the shader vertexAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); instanceAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); #endif vertexAttributes.set(info.id, index, info.dataType, 1); } @@ -202,26 +200,10 @@ void ShaderProgram::initInstanceAttribute(const shaders::AttributeInfo& info) { // Indexes must not be reused by regular attributes or uniform blocks // More than one instance attribute can have the same index, if they share the block vertexAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); #endif instanceAttributes.set(info.id, index, info.dataType, 1); } -void ShaderProgram::initUniformBlock(const shaders::UniformBlockInfo& info) { - const auto index = static_cast(info.index); -#if !defined(NDEBUG) - // Indexes must be unique, if there's a conflict check the `attributes` array in the shader - vertexAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - instanceAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); -#endif - if (const auto& block_ = uniformBlocks.set(info.id, index, info.size)) { - auto& block = static_cast(*block_); - block.setBindVertex(info.vertex); - block.setBindFragment(info.fragment); - } -} - void ShaderProgram::initTexture(const shaders::TextureInfo& info) { assert(info.id < textureBindings.size()); if (info.id >= textureBindings.size()) { diff --git a/src/mbgl/shaders/mtl/symbol.cpp b/src/mbgl/shaders/mtl/symbol.cpp new file mode 100644 index 000000000000..2d1d51e6aca2 --- /dev/null +++ b/src/mbgl/shaders/mtl/symbol.cpp @@ -0,0 +1,76 @@ +#include +#include + +namespace mbgl { +namespace shaders { + +// +// Symbol icon + +using SymbolIconShaderSource = ShaderSource; + +const std::array SymbolIconShaderSource::attributes = { + // always attributes + AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, + AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, + AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, + AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, + AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, + + // sometimes uniforms + AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, +}; +const std::array SymbolIconShaderSource::textures = { + TextureInfo{0, idSymbolImageTexture}, +}; + +// +// Symbol sdf + +using SymbolSDFIconShaderSource = ShaderSource; + +const std::array SymbolSDFIconShaderSource::attributes = { + // always attributes + AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, + AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, + AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, + AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, + AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, + + // sometimes uniforms + AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, + AttributeInfo{symbolUBOCount + 6, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, + AttributeInfo{symbolUBOCount + 7, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, + AttributeInfo{symbolUBOCount + 8, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, + AttributeInfo{symbolUBOCount + 9, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, +}; +const std::array SymbolSDFIconShaderSource::textures = { + TextureInfo{0, idSymbolImageTexture}, +}; + +// +// Symbol icon and text + +using SymbolTextAndIconShaderSource = ShaderSource; + +const std::array SymbolTextAndIconShaderSource::attributes = { + // always attributes + AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, + AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, + AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, + AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, + + // sometimes uniforms + AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, + AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, + AttributeInfo{symbolUBOCount + 6, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, + AttributeInfo{symbolUBOCount + 7, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, + AttributeInfo{symbolUBOCount + 8, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, +}; +const std::array SymbolTextAndIconShaderSource::textures = { + TextureInfo{0, idSymbolImageTexture}, + TextureInfo{1, idSymbolImageIconTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/symbol_icon.cpp b/src/mbgl/shaders/mtl/symbol_icon.cpp deleted file mode 100644 index d25af5b666b2..000000000000 --- a/src/mbgl/shaders/mtl/symbol_icon.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { - // always attributes - AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, - AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, - AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, - AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, - AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, - - // sometimes uniforms - AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idSymbolImageTexture}, -}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/symbol_sdf.cpp b/src/mbgl/shaders/mtl/symbol_sdf.cpp deleted file mode 100644 index e288aab5c14a..000000000000 --- a/src/mbgl/shaders/mtl/symbol_sdf.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = - { - // always attributes - AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, - AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, - AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, - AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, - AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, - - // sometimes uniforms - AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, - AttributeInfo{symbolUBOCount + 6, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, - AttributeInfo{symbolUBOCount + 7, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, - AttributeInfo{symbolUBOCount + 8, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, - AttributeInfo{symbolUBOCount + 9, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idSymbolImageTexture}, -}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/symbol_text_and_icon.cpp b/src/mbgl/shaders/mtl/symbol_text_and_icon.cpp deleted file mode 100644 index 226a051cf916..000000000000 --- a/src/mbgl/shaders/mtl/symbol_text_and_icon.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - // always attributes - AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, - AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, - AttributeInfo{symbolUBOCount + 2, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, - AttributeInfo{symbolUBOCount + 3, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, - - // sometimes uniforms - AttributeInfo{symbolUBOCount + 4, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, - AttributeInfo{symbolUBOCount + 5, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, - AttributeInfo{symbolUBOCount + 6, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, - AttributeInfo{symbolUBOCount + 7, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, - AttributeInfo{symbolUBOCount + 8, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idSymbolImageTexture}, - TextureInfo{1, idSymbolImageIconTexture}, -}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/widevector.cpp b/src/mbgl/shaders/mtl/widevector.cpp new file mode 100644 index 000000000000..fec44118d292 --- /dev/null +++ b/src/mbgl/shaders/mtl/widevector.cpp @@ -0,0 +1,23 @@ +#include +#include + +namespace mbgl { +namespace shaders { + +using WideVectorShaderSource = ShaderSource; + +const std::array WideVectorShaderSource::attributes = { + AttributeInfo{wideVectorUBOCount + 0, gfx::AttributeDataType::Float3, idWideVectorScreenPos}, + AttributeInfo{wideVectorUBOCount + 1, gfx::AttributeDataType::Float4, idWideVectorColor}, + AttributeInfo{wideVectorUBOCount + 2, gfx::AttributeDataType::Int, idWideVectorIndex}, +}; +const std::array WideVectorShaderSource::instanceAttributes = { + AttributeInfo{wideVectorUBOCount + 3, gfx::AttributeDataType::Float3, idWideVectorInstanceCenter}, + AttributeInfo{wideVectorUBOCount + 3, gfx::AttributeDataType::Float4, idWideVectorInstanceColor}, + AttributeInfo{wideVectorUBOCount + 3, gfx::AttributeDataType::Int, idWideVectorInstancePrevious}, + AttributeInfo{wideVectorUBOCount + 3, gfx::AttributeDataType::Int, idWideVectorInstanceNext}, +}; +const std::array WideVectorShaderSource::textures = {}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/background.cpp b/src/mbgl/shaders/vulkan/background.cpp index 66d8de494f25..c3aec95e76d4 100644 --- a/src/mbgl/shaders/vulkan/background.cpp +++ b/src/mbgl/shaders/vulkan/background.cpp @@ -5,26 +5,25 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(BackgroundDrawableUBO), idBackgroundDrawableUBO}, - UniformBlockInfo{false, true, sizeof(BackgroundLayerUBO), idBackgroundLayerUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idBackgroundPosVertexAttribute}, -}; +// +// Background + +using BackgroundShaderSource = ShaderSource; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{false, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(BackgroundPatternDrawableUBO), idBackgroundDrawableUBO}, - UniformBlockInfo{true, true, sizeof(BackgroundPatternLayerUBO), idBackgroundLayerUBO}, +const std::array BackgroundShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float3, idBackgroundPosVertexAttribute}, }; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idBackgroundPosVertexAttribute}, +const std::array BackgroundShaderSource::textures = {}; + +// +// Background pattern + +using BackgroundPatternShaderSource = ShaderSource; + +const std::array BackgroundPatternShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float3, idBackgroundPosVertexAttribute}, }; -const std::array ShaderSource::textures = - {TextureInfo{0, idBackgroundImageTexture}}; +const std::array BackgroundPatternShaderSource::textures = {TextureInfo{0, idBackgroundImageTexture}}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/circle.cpp b/src/mbgl/shaders/vulkan/circle.cpp index d10442520a83..61213640484e 100644 --- a/src/mbgl/shaders/vulkan/circle.cpp +++ b/src/mbgl/shaders/vulkan/circle.cpp @@ -5,13 +5,9 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(CircleDrawableUBO), idCircleDrawableUBO}, - UniformBlockInfo{true, false, sizeof(CircleInterpolateUBO), idCircleInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(CircleEvaluatedPropsUBO), idCircleEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using CircleShaderSource = ShaderSource; + +const std::array CircleShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idCirclePosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Float4, idCircleColorVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idCircleRadiusVertexAttribute}, @@ -21,6 +17,7 @@ const std::array ShaderSource CircleShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/clipping_mask.cpp b/src/mbgl/shaders/vulkan/clipping_mask.cpp index 6a96a21b35bc..df96133cf490 100644 --- a/src/mbgl/shaders/vulkan/clipping_mask.cpp +++ b/src/mbgl/shaders/vulkan/clipping_mask.cpp @@ -3,8 +3,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::attributes = - {AttributeInfo{0, gfx::AttributeDataType::Short2, idClippingMaskPosVertexAttribute}}; +using ClippingMaskShaderSource = ShaderSource; + +const std::array ClippingMaskShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idClippingMaskPosVertexAttribute}, +}; +const std::array ClippingMaskShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/collision.cpp b/src/mbgl/shaders/vulkan/collision.cpp index 733c8303147e..343045dd5a6d 100644 --- a/src/mbgl/shaders/vulkan/collision.cpp +++ b/src/mbgl/shaders/vulkan/collision.cpp @@ -5,29 +5,32 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, true, sizeof(CollisionUBO), idCollisionUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Collision box + +using CollisionBoxShaderSource = ShaderSource; + +const std::array CollisionBoxShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, AttributeInfo{3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, AttributeInfo{4, gfx::AttributeDataType::Float2, idCollisionShiftVertexAttribute}, }; +const std::array CollisionBoxShaderSource::textures = {}; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(CollisionUBO), idCollisionUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, +// +// Collision circle + +using CollisionCircleShaderSource = ShaderSource; + +const std::array CollisionCircleShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idCollisionPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Short2, idCollisionAnchorPosVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::Short2, idCollisionExtrudeVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::UShort2, idCollisionPlacedVertexAttribute}, }; +const std::array CollisionCircleShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/common.cpp b/src/mbgl/shaders/vulkan/common.cpp deleted file mode 100644 index 52531b3479a9..000000000000 --- a/src/mbgl/shaders/vulkan/common.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -namespace mbgl { -namespace shaders { - -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(CommonUBO), idCommonUBO}, -}; -const std::array ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, -}; - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(CommonUBO), idCommonUBO}, -}; -const std::array ShaderSource::attributes = - { - AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Float2, idCommonTexVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idCommonTexture}, -}; - -} // namespace shaders -} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/custom_symbol_icon.cpp b/src/mbgl/shaders/vulkan/custom_symbol_icon.cpp new file mode 100644 index 000000000000..fb90ae95dcfa --- /dev/null +++ b/src/mbgl/shaders/vulkan/custom_symbol_icon.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +using CustomSymbolIconShaderSource = ShaderSource; + +const std::array CustomSymbolIconShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float2, idCustomSymbolPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Float2, idCustomSymbolTexVertexAttribute}, +}; +const std::array CustomSymbolIconShaderSource::textures = { + TextureInfo{0, idCustomSymbolImageTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/debug.cpp b/src/mbgl/shaders/vulkan/debug.cpp index a48c2d004626..c5df1087c30e 100644 --- a/src/mbgl/shaders/vulkan/debug.cpp +++ b/src/mbgl/shaders/vulkan/debug.cpp @@ -5,13 +5,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(DebugUBO), idDebugUBO}, -}; -const std::array ShaderSource::attributes = { +using DebugShaderSource = ShaderSource; + +const std::array DebugShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idDebugPosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array DebugShaderSource::textures = { TextureInfo{0, idDebugOverlayTexture}, }; diff --git a/src/mbgl/shaders/vulkan/fill.cpp b/src/mbgl/shaders/vulkan/fill.cpp index dabd506de14a..a870abf2c46d 100644 --- a/src/mbgl/shaders/vulkan/fill.cpp +++ b/src/mbgl/shaders/vulkan/fill.cpp @@ -1,119 +1,75 @@ #include #include #include -#include namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(FillDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill + +using FillShaderSource = ShaderSource; + +const std::array FillShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Float4, idFillColorVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; +const std::array FillShaderSource::textures = {}; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill outline + +using FillOutlineShaderSource = ShaderSource; + +const std::array FillOutlineShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Float4, idFillOutlineColorVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; +const std::array FillOutlineShaderSource::textures = {}; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillPatternDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillPatternTilePropsUBO), idFillTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillPatternInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Fill pattern + +using FillPatternShaderSource = ShaderSource; + +const std::array FillPatternShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, AttributeInfo{3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array FillPatternShaderSource::textures = { TextureInfo{0, idFillImageTexture}, }; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillOutlinePatternDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillOutlinePatternTilePropsUBO), idFillTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlinePatternInterpolateUBO), idFillInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, -}; -const std::array ShaderSource::textures = - { - TextureInfo{0, idFillImageTexture}, -}; +// +// Fill pattern outline -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(FillOutlineTriangulatedDrawableUBO), idFillDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillEvaluatedPropsUBO), idFillEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, -}; +using FillOutlinePatternShaderSource = ShaderSource; -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, false, sizeof(FillExtrusionDrawableUBO), idFillExtrusionDrawableUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionInterpolateUBO), idFillExtrusionInterpolateUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionPropsUBO), idFillExtrusionPropsUBO}, +const std::array FillOutlinePatternShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idFillPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::UShort4, idFillPatternFromVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::UShort4, idFillPatternToVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::Float2, idFillOpacityVertexAttribute}, }; -const std::array ShaderSource::attributes = - { - AttributeInfo{0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::Float4, idFillExtrusionColorVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::Float2, idFillExtrusionBaseVertexAttribute}, - AttributeInfo{4, gfx::AttributeDataType::Float2, idFillExtrusionHeightVertexAttribute}, +const std::array FillOutlinePatternShaderSource::textures = { + TextureInfo{0, idFillImageTexture}, }; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionDrawableUBO), idFillExtrusionDrawableUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionTilePropsUBO), idFillExtrusionTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(FillExtrusionInterpolateUBO), idFillExtrusionInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(FillExtrusionPropsUBO), idFillExtrusionPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::Float2, idFillExtrusionBaseVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::Float2, idFillExtrusionHeightVertexAttribute}, - AttributeInfo{4, gfx::AttributeDataType::UShort4, idFillExtrusionPatternFromVertexAttribute}, - AttributeInfo{5, gfx::AttributeDataType::UShort4, idFillExtrusionPatternToVertexAttribute}, -}; -const std::array - ShaderSource::textures = { - TextureInfo{0, idFillExtrusionImageTexture}, +// +// Fill outline triangulated + +using FillOutlineTriangulatedShaderSource = + ShaderSource; + +const std::array FillOutlineTriangulatedShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, }; +const std::array FillOutlineTriangulatedShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/fill_extrusion.cpp b/src/mbgl/shaders/vulkan/fill_extrusion.cpp new file mode 100644 index 000000000000..e7f600e2b4f0 --- /dev/null +++ b/src/mbgl/shaders/vulkan/fill_extrusion.cpp @@ -0,0 +1,40 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +// +// Fill extrusion + +using FillExtrusionShaderSource = ShaderSource; + +const std::array FillExtrusionShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::Float4, idFillExtrusionColorVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::Float, idFillExtrusionBaseVertexAttribute}, + AttributeInfo{4, gfx::AttributeDataType::Float, idFillExtrusionHeightVertexAttribute}, +}; +const std::array FillExtrusionShaderSource::textures = {}; + +// +// Fill extrusion pattern + +using FillExtrusionPatternShaderSource = ShaderSource; + +const std::array FillExtrusionPatternShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idFillExtrusionPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Short4, idFillExtrusionNormalEdVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::Float, idFillExtrusionBaseVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::Float, idFillExtrusionHeightVertexAttribute}, + AttributeInfo{4, gfx::AttributeDataType::UShort4, idFillExtrusionPatternFromVertexAttribute}, + AttributeInfo{5, gfx::AttributeDataType::UShort4, idFillExtrusionPatternToVertexAttribute}, +}; +const std::array FillExtrusionPatternShaderSource::textures = { + TextureInfo{0, idFillExtrusionImageTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/heatmap.cpp b/src/mbgl/shaders/vulkan/heatmap.cpp index 12c6a41c684f..203af787ea57 100644 --- a/src/mbgl/shaders/vulkan/heatmap.cpp +++ b/src/mbgl/shaders/vulkan/heatmap.cpp @@ -1,35 +1,18 @@ #include #include #include -#include namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(HeatmapDrawableUBO), idHeatmapDrawableUBO}, - UniformBlockInfo{true, false, sizeof(HeatmapInterpolateUBO), idHeatmapInterpolateUBO}, - UniformBlockInfo{true, true, sizeof(HeatmapEvaluatedPropsUBO), idHeatmapEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using HeatmapShaderSource = ShaderSource; + +const std::array HeatmapShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Float2, idHeatmapWeightVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idHeatmapRadiusVertexAttribute}, }; - -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(HeatmapTexturePropsUBO), idHeatmapTexturePropsUBO}, -}; -const std::array ShaderSource::attributes = - { - AttributeInfo{0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idHeatmapImageTexture}, - TextureInfo{1, idHeatmapColorRampTexture}, -}; +const std::array HeatmapShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/heatmap_texture.cpp b/src/mbgl/shaders/vulkan/heatmap_texture.cpp new file mode 100644 index 000000000000..be27a0fa07c8 --- /dev/null +++ b/src/mbgl/shaders/vulkan/heatmap_texture.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +using HeatmapTextureShaderSource = ShaderSource; + +const std::array HeatmapTextureShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idHeatmapPosVertexAttribute}, +}; +const std::array HeatmapTextureShaderSource::textures = { + TextureInfo{0, idHeatmapImageTexture}, + TextureInfo{1, idHeatmapColorRampTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/hillshade.cpp b/src/mbgl/shaders/vulkan/hillshade.cpp index 50dd92d0de29..ed78938d67a7 100644 --- a/src/mbgl/shaders/vulkan/hillshade.cpp +++ b/src/mbgl/shaders/vulkan/hillshade.cpp @@ -1,33 +1,17 @@ #include #include #include -#include namespace mbgl { namespace shaders { -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(HillshadePrepareDrawableUBO), idHillshadePrepareDrawableUBO}, -}; -const std::array - ShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, -}; -const std::array ShaderSource::textures = { - TextureInfo{0, idHillshadeImageTexture}, -}; +using HillshadeShaderSource = ShaderSource; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(HillshadeDrawableUBO), idHillshadeDrawableUBO}, - UniformBlockInfo{false, true, sizeof(HillshadeEvaluatedPropsUBO), idHillshadeEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +const std::array HillshadeShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array HillshadeShaderSource::textures = { TextureInfo{0, idHillshadeImageTexture}, }; diff --git a/src/mbgl/shaders/vulkan/hillshade_prepare.cpp b/src/mbgl/shaders/vulkan/hillshade_prepare.cpp new file mode 100644 index 000000000000..1999e2f73fcd --- /dev/null +++ b/src/mbgl/shaders/vulkan/hillshade_prepare.cpp @@ -0,0 +1,18 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +using HillshadePrepareShaderSource = ShaderSource; + +const std::array HillshadePrepareShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, idHillshadePosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Short2, idHillshadeTexturePosVertexAttribute}, +}; +const std::array HillshadePrepareShaderSource::textures = { + TextureInfo{0, idHillshadeImageTexture}, +}; +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/line.cpp b/src/mbgl/shaders/vulkan/line.cpp index a40c38de3b1d..8ddfcb8b5895 100644 --- a/src/mbgl/shaders/vulkan/line.cpp +++ b/src/mbgl/shaders/vulkan/line.cpp @@ -5,14 +5,12 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(LineDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, -}; +// +// Line + +using LineShaderSource = ShaderSource; -const std::array ShaderSource::attributes = { +const std::array LineShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float4, idLineColorVertexAttribute}, @@ -22,16 +20,14 @@ const std::array ShaderSource LineShaderSource::textures = {}; -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(LineDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, -}; +// +// Line gradient -const std::array ShaderSource::attributes = { +using LineGradientShaderSource = ShaderSource; + +const std::array LineGradientShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idLineBlurVertexAttribute}, @@ -40,19 +36,16 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LineGradientShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(LinePatternDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LinePatternInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LinePatternTilePropertiesUBO), idLineTilePropertiesUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line pattern + +using LinePatternShaderSource = ShaderSource; + +const std::array LinePatternShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float2, idLineBlurVertexAttribute}, @@ -63,17 +56,16 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LinePatternShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, true, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(LineSDFDrawableUBO), idLineDrawableUBO}, - UniformBlockInfo{true, false, sizeof(LineSDFInterpolationUBO), idLineInterpolationUBO}, - UniformBlockInfo{true, true, sizeof(LineEvaluatedPropsUBO), idLineEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Line SDF + +using LineSDFShaderSource = ShaderSource; + +const std::array LineSDFShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idLinePosNormalVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UByte4, idLineDataVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Float4, idLineColorVertexAttribute}, @@ -84,7 +76,7 @@ const std::array ShaderSource ShaderSource::textures = { +const std::array LineSDFShaderSource::textures = { TextureInfo{0, idLineImageTexture}, }; diff --git a/src/mbgl/shaders/vulkan/location_indicator.cpp b/src/mbgl/shaders/vulkan/location_indicator.cpp new file mode 100644 index 000000000000..2eb9f8e87b4e --- /dev/null +++ b/src/mbgl/shaders/vulkan/location_indicator.cpp @@ -0,0 +1,33 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +// +// Location indicator + +using LocationIndicatorShaderSource = ShaderSource; + +const std::array LocationIndicatorShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, +}; +const std::array LocationIndicatorShaderSource::textures = {}; + +// +// Location indicator textured + +using LocationIndicatorShaderTexturedSource = + ShaderSource; + +const std::array LocationIndicatorShaderTexturedSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Float2, idCommonTexVertexAttribute}, +}; +const std::array LocationIndicatorShaderTexturedSource::textures = { + TextureInfo{0, idCommonTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/raster.cpp b/src/mbgl/shaders/vulkan/raster.cpp index cab5e36b0219..132fc61356a6 100644 --- a/src/mbgl/shaders/vulkan/raster.cpp +++ b/src/mbgl/shaders/vulkan/raster.cpp @@ -5,15 +5,13 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(RasterDrawableUBO), idRasterDrawableUBO}, - UniformBlockInfo{true, true, sizeof(RasterEvaluatedPropsUBO), idRasterEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +using RasterShaderSource = ShaderSource; + +const std::array RasterShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Short2, idRasterPosVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::Short2, idRasterTexturePosVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array RasterShaderSource::textures = { TextureInfo{0, idRasterImage0Texture}, TextureInfo{1, idRasterImage1Texture}, }; diff --git a/src/mbgl/shaders/vulkan/shader_program.cpp b/src/mbgl/shaders/vulkan/shader_program.cpp index 14052e1b9951..a0b29b5ebaf3 100644 --- a/src/mbgl/shaders/vulkan/shader_program.cpp +++ b/src/mbgl/shaders/vulkan/shader_program.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -240,7 +239,6 @@ void ShaderProgram::initAttribute(const shaders::AttributeInfo& info) { // Indexes must be unique, if there's a conflict check the `attributes` array in the shader vertexAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); instanceAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); #endif vertexAttributes.set(info.id, index, info.dataType, 1); } @@ -252,24 +250,10 @@ void ShaderProgram::initInstanceAttribute(const shaders::AttributeInfo& info) { // Indexes must not be reused by regular attributes or uniform blocks // More than one instance attribute can have the same index, if they share the block vertexAttributes.visitAttributes([&](const gfx::VertexAttribute& attrib) { assert(attrib.getIndex() != index); }); - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); #endif instanceAttributes.set(info.id, index, info.dataType, 1); } -void ShaderProgram::initUniformBlock(const shaders::UniformBlockInfo& info) { - const auto index = static_cast(info.index); -#if !defined(NDEBUG) - // Indexes must be unique, if there's a conflict check the `attributes` array in the shader - uniformBlocks.visit([&](const gfx::UniformBlock& block) { assert(block.getIndex() != index); }); -#endif - if (const auto& block_ = uniformBlocks.set(info.id, index, info.size)) { - auto& block = static_cast(*block_); - block.setBindVertex(info.vertex); - block.setBindFragment(info.fragment); - } -} - void ShaderProgram::initTexture(const shaders::TextureInfo& info) { assert(info.id < textureBindings.size()); if (info.id >= textureBindings.size()) { diff --git a/src/mbgl/shaders/vulkan/symbol.cpp b/src/mbgl/shaders/vulkan/symbol.cpp index 3172f86aaa8e..b2a398071099 100644 --- a/src/mbgl/shaders/vulkan/symbol.cpp +++ b/src/mbgl/shaders/vulkan/symbol.cpp @@ -1,100 +1,76 @@ #include #include #include -#include namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = { +// +// Symbol icon + +using SymbolIconShaderSource = ShaderSource; + +const std::array SymbolIconShaderSource::attributes = { + // always attributes AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, AttributeInfo{2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, AttributeInfo{3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, AttributeInfo{4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, + + // sometimes uniforms AttributeInfo{5, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array SymbolIconShaderSource::textures = { TextureInfo{0, idSymbolImageTexture}, }; -const std::array ShaderSource::uniforms = - { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array ShaderSource::attributes = - { - // always attributes - AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, - AttributeInfo{4, gfx::AttributeDataType::Float2, idSymbolFadeOpacityVertexAttribute}, +// +// Symbol sdf + +using SymbolSDFIconShaderSource = ShaderSource; + +const std::array SymbolSDFIconShaderSource::attributes = { + // always attributes + AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::Short4, idSymbolPixelOffsetVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, + AttributeInfo{4, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, - // sometimes uniforms - AttributeInfo{5, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, - AttributeInfo{6, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, - AttributeInfo{7, gfx::AttributeDataType::Float2, idSymbolOpacityVertexAttribute}, - AttributeInfo{8, gfx::AttributeDataType::Float2, idSymbolHaloWidthVertexAttribute}, - AttributeInfo{9, gfx::AttributeDataType::Float2, idSymbolHaloBlurVertexAttribute}, + // sometimes uniforms + AttributeInfo{5, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, + AttributeInfo{6, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, + AttributeInfo{7, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, + AttributeInfo{8, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, + AttributeInfo{9, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, }; -const std::array ShaderSource::textures = { +const std::array SymbolSDFIconShaderSource::textures = { TextureInfo{0, idSymbolImageTexture}, }; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(GlobalPaintParamsUBO), idGlobalPaintParamsUBO}, - UniformBlockInfo{true, true, sizeof(SymbolDrawableUBO), idSymbolDrawableUBO}, - UniformBlockInfo{true, true, sizeof(SymbolTilePropsUBO), idSymbolTilePropsUBO}, - UniformBlockInfo{true, false, sizeof(SymbolInterpolateUBO), idSymbolInterpolateUBO}, - UniformBlockInfo{false, true, sizeof(SymbolEvaluatedPropsUBO), idSymbolEvaluatedPropsUBO}, -}; -const std::array - ShaderSource::attributes = { - // always attributes - AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, - AttributeInfo{2, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, - AttributeInfo{3, gfx::AttributeDataType::Float2, idSymbolFadeOpacityVertexAttribute}, +// +// Symbol icon and text - // sometimes uniforms - AttributeInfo{4, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, - AttributeInfo{5, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, - AttributeInfo{6, gfx::AttributeDataType::Float2, idSymbolOpacityVertexAttribute}, - AttributeInfo{7, gfx::AttributeDataType::Float2, idSymbolHaloWidthVertexAttribute}, - AttributeInfo{8, gfx::AttributeDataType::Float2, idSymbolHaloBlurVertexAttribute}, -}; -const std::array ShaderSource::textures = - { - TextureInfo{0, idSymbolImageTexture}, - TextureInfo{1, idSymbolImageIconTexture}, -}; +using SymbolTextAndIconShaderSource = ShaderSource; -const std::array - ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(CustomSymbolIconDrawableUBO), idCustomSymbolDrawableUBO}, - UniformBlockInfo{true, false, sizeof(CustomSymbolIconParametersUBO), idCustomSymbolParametersUBO}, -}; -const std::array - ShaderSource::attributes = { - // always attributes - AttributeInfo{0, gfx::AttributeDataType::Float2, idCustomSymbolPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Float2, idCustomSymbolTexVertexAttribute}, +const std::array SymbolTextAndIconShaderSource::attributes = { + // always attributes + AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, + AttributeInfo{2, gfx::AttributeDataType::Float3, idSymbolProjectedPosVertexAttribute}, + AttributeInfo{3, gfx::AttributeDataType::Float, idSymbolFadeOpacityVertexAttribute}, + + // sometimes uniforms + AttributeInfo{4, gfx::AttributeDataType::Float4, idSymbolColorVertexAttribute}, + AttributeInfo{5, gfx::AttributeDataType::Float4, idSymbolHaloColorVertexAttribute}, + AttributeInfo{6, gfx::AttributeDataType::Float, idSymbolOpacityVertexAttribute}, + AttributeInfo{7, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, + AttributeInfo{8, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, }; -const std::array ShaderSource::textures = { - TextureInfo{0, idCustomSymbolImageTexture}, +const std::array SymbolTextAndIconShaderSource::textures = { + TextureInfo{0, idSymbolImageTexture}, + TextureInfo{1, idSymbolImageIconTexture}, }; } // namespace shaders diff --git a/src/mbgl/shaders/vulkan/widevector.cpp b/src/mbgl/shaders/vulkan/widevector.cpp index a140b1858812..9fb09e8b604f 100644 --- a/src/mbgl/shaders/vulkan/widevector.cpp +++ b/src/mbgl/shaders/vulkan/widevector.cpp @@ -5,20 +5,20 @@ namespace mbgl { namespace shaders { -const std::array ShaderSource::uniforms = { - UniformBlockInfo{true, false, sizeof(WideVectorUniformsUBO), idWideVectorUniformsUBO}, - UniformBlockInfo{true, false, sizeof(WideVectorUniformWideVecUBO), idWideVectorUniformWideVecUBO}, -}; -const std::array ShaderSource::attributes = { +using WideVectorShaderSource = ShaderSource; + +const std::array WideVectorShaderSource::attributes = { AttributeInfo{0, gfx::AttributeDataType::Float3, idWideVectorScreenPos}, AttributeInfo{1, gfx::AttributeDataType::Float4, idWideVectorColor}, - AttributeInfo{2, gfx::AttributeDataType::Int, idWideVectorIndex}}; -const std::array - ShaderSource::instanceAttributes = { - AttributeInfo{3, gfx::AttributeDataType::Float3, idWideVectorInstanceCenter}, - AttributeInfo{4, gfx::AttributeDataType::Float4, idWideVectorInstanceColor}, - AttributeInfo{5, gfx::AttributeDataType::Int, idWideVectorInstancePrevious}, - AttributeInfo{6, gfx::AttributeDataType::Int, idWideVectorInstanceNext}}; + AttributeInfo{2, gfx::AttributeDataType::Int, idWideVectorIndex}, +}; +const std::array WideVectorShaderSource::instanceAttributes = { + AttributeInfo{3, gfx::AttributeDataType::Float3, idWideVectorInstanceCenter}, + AttributeInfo{4, gfx::AttributeDataType::Float4, idWideVectorInstanceColor}, + AttributeInfo{5, gfx::AttributeDataType::Int, idWideVectorInstancePrevious}, + AttributeInfo{6, gfx::AttributeDataType::Int, idWideVectorInstanceNext}, +}; +const std::array WideVectorShaderSource::textures = {}; } // namespace shaders } // namespace mbgl diff --git a/src/mbgl/style/layers/custom_drawable_layer.cpp b/src/mbgl/style/layers/custom_drawable_layer.cpp index 8a1e66b4581c..6ffd5a4bc41c 100644 --- a/src/mbgl/style/layers/custom_drawable_layer.cpp +++ b/src/mbgl/style/layers/custom_drawable_layer.cpp @@ -90,7 +90,7 @@ const LayerTypeInfo* CustomDrawableLayer::Impl::staticTypeInfo() noexcept { class LineDrawableTweaker : public gfx::DrawableTweaker { public: LineDrawableTweaker(const shaders::LineEvaluatedPropsUBO& properties) - : linePropertiesUBO(properties) {} + : propsUBO(properties) {} ~LineDrawableTweaker() override = default; void init(gfx::Drawable&) override {} @@ -108,30 +108,44 @@ class LineDrawableTweaker : public gfx::DrawableTweaker { const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); - const shaders::LineDrawableUBO drawableUBO = {/*matrix = */ util::cast(matrix), - /*ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), - 0, - 0, - 0}; - const shaders::LineInterpolationUBO lineInterpolationUBO{/*color_t =*/0.f, - /*blur_t =*/0.f, - /*opacity_t =*/0.f, - /*gapwidth_t =*/0.f, - /*offset_t =*/0.f, - /*width_t =*/0.f, - 0, - 0}; +#if MLN_UBO_CONSOLIDATION + shaders::LineDrawableUnionUBO drawableUBO; + drawableUBO.lineDrawableUBO = { +#else + const shaders::LineDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), + /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), + + /* .color_t = */ 0.f, + /* .blur_t = */ 0.f, + /* .opacity_t = */ 0.f, + /* .gapwidth_t = */ 0.f, + /* .offset_t = */ 0.f, + /* .width_t = */ 0.f, + /* .pad1 = */ 0 + }; auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, parameters.context); - drawableUniforms.createOrUpdate(idLineInterpolationUBO, &lineInterpolationUBO, parameters.context); - drawableUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &linePropertiesUBO, parameters.context); + drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, parameters.context, true); + drawableUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &propsUBO, parameters.context); // We would need to set up `idLineExpressionUBO` if the expression mask isn't empty - assert(linePropertiesUBO.expressionMask == LineExpressionMask::None); + assert(propsUBO.expressionMask == LineExpressionMask::None); + + const LineExpressionUBO exprUBO = { + /* .color = */ nullptr, + /* .blur = */ nullptr, + /* .opacity = */ nullptr, + /* .gapwidth = */ nullptr, + /* .offset = */ nullptr, + /* .width = */ nullptr, + /* .floorWidth = */ nullptr, + }; + drawableUniforms.createOrUpdate(idLineExpressionUBO, &exprUBO, parameters.context); }; private: - shaders::LineEvaluatedPropsUBO linePropertiesUBO; + shaders::LineEvaluatedPropsUBO propsUBO; }; class WideVectorDrawableTweaker : public gfx::DrawableTweaker { @@ -164,29 +178,31 @@ class WideVectorDrawableTweaker : public gfx::DrawableTweaker { matrix::diffsplit(pMatrix, pMatrixDiff, projMatrix); const auto renderableSize = parameters.backend.getDefaultRenderable().getSize(); - shaders::WideVectorUniformsUBO uniform{ - /*mvpMatrix */ mvpMatrix, - /*mvpMatrixDiff */ mvpMatrixDiff, - /*mvMatrix */ mvMatrix, - /*mvMatrixDiff */ mvMatrixDiff, - /*pMatrix */ pMatrix, - /*pMatrixDiff */ pMatrixDiff, - /*frameSize */ {(float)renderableSize.width, (float)renderableSize.height}}; - - shaders::WideVectorUniformWideVecUBO wideVec{ - /*color */ options.color, - /*w2 */ options.width, - /*offset */ options.offset, - /*edge */ 0.0f, // TODO: MLN does not provide a value. Analyze impact. - /*texRepeat */ 0.0f, // N/A - /*texOffset */ {}, // N/A - /*miterLimit */ options.geometry.miterLimit, - /*join */ static_cast(options.geometry.joinType), - /*cap */ static_cast(options.geometry.beginCap), // TODO: MLN option for endCap to be - // implemented in the shader! - /*hasExp */ false, // N/A - /*interClipLimit*/ 0.0f // N/A - }; + shaders::WideVectorUniformsUBO uniform = { + /* .mvpMatrix = */ mvpMatrix, + /* .mvpMatrixDiff = */ mvpMatrixDiff, + /* .mvMatrix = */ mvMatrix, + /* .mvMatrixDiff = */ mvMatrixDiff, + /* .pMatrix = */ pMatrix, + /* .pMatrixDiff = */ pMatrixDiff, + /* .frameSize = */ {(float)renderableSize.width, (float)renderableSize.height}, + /* .pad1 = */ 0, + /* .pad2 = */ 0}; + + shaders::WideVectorUniformWideVecUBO wideVec = { + /* .color = */ options.color, + /* .w2 = */ options.width, + /* .offset = */ options.offset, + /* .edge = */ 0.0f, // TODO: MLN does not provide a value. Analyze impact. + /* .texRepeat = */ 0.0f, // N/A + /* .texOffset = */ {}, // N/A + /* .miterLimit = */ options.geometry.miterLimit, + /* .join = */ static_cast(options.geometry.joinType), + /* .cap = */ static_cast(options.geometry.beginCap), // TODO: MLN option for endCap to be + // implemented in the shader! + /* .hasExp = */ false, // N/A + /* .interClipLimit = */ 0.0f, // N/A + /* .pad1 = */ 0}; auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idWideVectorUniformsUBO, &uniform, parameters.context); @@ -218,26 +234,29 @@ class FillDrawableTweaker : public gfx::DrawableTweaker { const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); - const shaders::FillDrawableUBO fillDrawableUBO{/*matrix = */ util::cast(matrix)}; +#if MLN_UBO_CONSOLIDATION + shaders::FillDrawableUnionUBO drawableUBO; + drawableUBO.fillDrawableUBO = { +#else + const shaders::FillDrawableUBO drawableUBO = { +#endif + /* .matrix = */ util::cast(matrix), - const shaders::FillInterpolateUBO fillInterpolateUBO{ /* .color_t = */ 0.f, /* .opacity_t = */ 0.f, - 0, - 0, - }; - const shaders::FillEvaluatedPropsUBO fillPropertiesUBO{ - /* .color = */ color, - /* .outline_color = */ Color::white(), - /* .opacity = */ opacity, - /* .fade = */ 0.f, - /* .from_scale = */ 0.f, - /* .to_scale = */ 0.f, + /* .pad1 = */ 0, + /* .pad2 = */ 0 }; + + const shaders::FillEvaluatedPropsUBO propsUBO = {/* .color = */ color, + /* .outline_color = */ Color::white(), + /* .opacity = */ opacity, + /* .fade = */ 0.f, + /* .from_scale = */ 0.f, + /* .to_scale = */ 0.f}; auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idFillDrawableUBO, &fillDrawableUBO, parameters.context); - drawableUniforms.createOrUpdate(idFillInterpolateUBO, &fillInterpolateUBO, parameters.context); - drawableUniforms.createOrUpdate(idFillEvaluatedPropsUBO, &fillPropertiesUBO, parameters.context); + drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, parameters.context); + drawableUniforms.createOrUpdate(idFillEvaluatedPropsUBO, &propsUBO, parameters.context); }; private: @@ -265,8 +284,6 @@ class SymbolDrawableTweaker : public gfx::DrawableTweaker { const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); - const shaders::CustomSymbolIconDrawableUBO drawableUBO{/*matrix = */ util::cast(matrix)}; - const auto pixelsToTileUnits = tileID.pixelsToTileUnits( 1.0f, options.scaleWithMap ? tileID.canonical.z : parameters.state.getZoom()); const float factor = options.scaleWithMap @@ -276,22 +293,21 @@ class SymbolDrawableTweaker : public gfx::DrawableTweaker { : std::array{parameters.pixelsToGLUnits[0] * factor, parameters.pixelsToGLUnits[1] * factor}; - const shaders::CustomSymbolIconParametersUBO parametersUBO{ - /*extrude_scale*/ {extrudeScale[0] * options.size.width, extrudeScale[1] * options.size.height}, - /*anchor*/ options.anchor, - /*angle_degrees*/ options.angleDegrees, - /*scale_with_map*/ options.scaleWithMap, - /*pitch_with_map*/ options.pitchWithMap, - /*camera_to_center_distance*/ parameters.state.getCameraToCenterDistance(), - /*aspect_ratio*/ parameters.pixelsToGLUnits[0] / parameters.pixelsToGLUnits[1], - 0, - 0, - 0}; - - // set UBOs + const shaders::CustomSymbolIconDrawableUBO drawableUBO = { + /* .matrix = */ util::cast(matrix), + /* .extrude_scale = */ {extrudeScale[0] * options.size.width, extrudeScale[1] * options.size.height}, + /* .anchor = */ options.anchor, + /* .angle_degrees = */ options.angleDegrees, + /* .scale_with_map = */ options.scaleWithMap, + /* .pitch_with_map = */ options.pitchWithMap, + /* .camera_to_center_distance = */ parameters.state.getCameraToCenterDistance(), + /* .aspect_ratio = */ parameters.pixelsToGLUnits[0] / parameters.pixelsToGLUnits[1], + /* .pad1 = */ 0, + /* .pad2 = */ 0, + /* .pad3 = */ 0}; + auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idCustomSymbolDrawableUBO, &drawableUBO, parameters.context); - drawableUniforms.createOrUpdate(idCustomSymbolParametersUBO, ¶metersUBO, parameters.context); }; private: @@ -500,7 +516,7 @@ bool CustomDrawableLayerHost::Interface::addSymbol(const GeometryCoordinate& poi builder->setTexture(symbolOptions.texture, idCustomSymbolImageTexture); } - // create fill tweaker + // create symbol tweaker auto tweaker = std::make_shared(symbolOptions); builder->addTweaker(tweaker); diff --git a/src/mbgl/vulkan/buffer_resource.cpp b/src/mbgl/vulkan/buffer_resource.cpp index 2f9ccb4a45b5..d2a3ee32ad4d 100644 --- a/src/mbgl/vulkan/buffer_resource.cpp +++ b/src/mbgl/vulkan/buffer_resource.cpp @@ -56,7 +56,7 @@ BufferResource::BufferResource( std::size_t totalSize = size; // TODO -> check avg minUniformBufferOffsetAlignment vs individual buffers - if (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) { + if (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT || usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { const auto& backend = context.getBackend(); const auto& deviceProps = backend.getDeviceProperties(); const auto& align = deviceProps.limits.minUniformBufferOffsetAlignment; diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index e3055c4054fb..c7c11e5396cd 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -51,7 +51,7 @@ class RenderbufferResource : public gfx::RenderbufferResource { Context::Context(RendererBackend& backend_) : gfx::Context(vulkan::maximumVertexBindingCount), backend(backend_), - globalUniformBuffers(DescriptorSetType::Global, 0, shaders::globalUBOCount) { + globalUniformBuffers(DescriptorSetType::Global, 0, 0, shaders::globalUBOCount) { if (glslangRefCount++ == 0) { glslang::InitializeProcess(); } @@ -74,18 +74,20 @@ void Context::initFrameResources() { const auto frameCount = backend.getMaxFrames(); descriptorPoolMap.emplace(DescriptorSetType::Global, - DescriptorPoolGrowable(globalDescriptorPoolSize, shaders::globalUBOCount)); + DescriptorPoolGrowable(globalDescriptorPoolSize, 0, shaders::globalUBOCount, 0)); - descriptorPoolMap.emplace(DescriptorSetType::Layer, - DescriptorPoolGrowable(layerDescriptorPoolSize, shaders::maxUBOCountPerLayer)); + descriptorPoolMap.emplace( + DescriptorSetType::Layer, + DescriptorPoolGrowable( + layerDescriptorPoolSize, shaders::maxSSBOCountPerLayer, shaders::maxUBOCountPerLayer, 0)); descriptorPoolMap.emplace( DescriptorSetType::DrawableUniform, - DescriptorPoolGrowable(drawableUniformDescriptorPoolSize, shaders::maxUBOCountPerDrawable)); + DescriptorPoolGrowable(drawableUniformDescriptorPoolSize, 0, shaders::maxUBOCountPerDrawable, 0)); descriptorPoolMap.emplace( DescriptorSetType::DrawableImage, - DescriptorPoolGrowable(drawableImageDescriptorPoolSize, shaders::maxTextureCountPerShader)); + DescriptorPoolGrowable(drawableImageDescriptorPoolSize, 0, 0, shaders::maxTextureCountPerShader)); // command buffers const vk::CommandBufferAllocateInfo allocateInfo( @@ -113,11 +115,17 @@ void Context::initFrameResources() { (void)getDummyTexture(); buildUniformDescriptorSetLayout( - globalUniformDescriptorSetLayout, shaders::globalUBOCount, "GlobalUniformDescriptorSetLayout"); - buildUniformDescriptorSetLayout( - layerUniformDescriptorSetLayout, shaders::maxUBOCountPerLayer, "LayerUniformDescriptorSetLayout"); - buildUniformDescriptorSetLayout( - drawableUniformDescriptorSetLayout, shaders::maxUBOCountPerDrawable, "DrawableUniformDescriptorSetLayout"); + globalUniformDescriptorSetLayout, 0, 0, shaders::globalUBOCount, "GlobalUniformDescriptorSetLayout"); + buildUniformDescriptorSetLayout(layerUniformDescriptorSetLayout, + shaders::globalUBOCount, + shaders::maxSSBOCountPerLayer, + shaders::maxUBOCountPerLayer, + "LayerUniformDescriptorSetLayout"); + buildUniformDescriptorSetLayout(drawableUniformDescriptorSetLayout, + shaders::globalUBOCount, + 0, + shaders::maxUBOCountPerDrawable, + "DrawableUniformDescriptorSetLayout"); buildImageDescriptorSetLayout(); } @@ -353,8 +361,9 @@ gfx::UniqueDrawableBuilder Context::createDrawableBuilder(std::string name) { return std::make_unique(std::move(name)); } -gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t size, bool persistent) { - return std::make_shared(createBuffer(data, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, persistent)); +gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t size, bool persistent, bool ssbo) { + return std::make_shared(createBuffer( + data, size, ssbo ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, persistent)); } gfx::ShaderProgramBasePtr Context::getGenericShader(gfx::ShaderRegistry& shaders, const std::string& name) { @@ -442,13 +451,11 @@ void Context::bindGlobalUniformBuffers(gfx::RenderPass& renderPass) const noexce if (renderableResource.hasSurfaceTransformSupport()) { float surfaceRotation = renderableResource.getRotation(); - struct alignas(16) { - alignas(16) std::array rotation0; - alignas(16) std::array rotation1; - } data; - - data = {{cosf(surfaceRotation), -sinf(surfaceRotation)}, {sinf(surfaceRotation), cosf(surfaceRotation)}}; - context.globalUniformBuffers.createOrUpdate(shaders::PlatformParamsUBO, &data, sizeof(data), context); + const shaders::GlobalPlatformParamsUBO platformUBO = { + /* .rotation0 = */ {cosf(surfaceRotation), -sinf(surfaceRotation)}, + /* .rotation1 = */ {sinf(surfaceRotation), cosf(surfaceRotation)}}; + context.globalUniformBuffers.createOrUpdate( + shaders::idGlobalPlatformParamsUBO, &platformUBO, sizeof(platformUBO), context); } context.globalUniformBuffers.bindDescriptorSets(renderPassImpl.getEncoder()); @@ -570,6 +577,13 @@ const std::unique_ptr& Context::getDummyUniformBuffer() { return dummyUniformBuffer; } +const std::unique_ptr& Context::getDummyStorageBuffer() { + if (!dummyStorageBuffer) + dummyStorageBuffer = std::make_unique( + *this, nullptr, 16, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, false); + return dummyStorageBuffer; +} + const std::unique_ptr& Context::getDummyTexture() { if (!dummyTexture2D) { const Size size(2, 2); @@ -588,17 +602,27 @@ const std::unique_ptr& Context::getDummyTexture() { } void Context::buildUniformDescriptorSetLayout(vk::UniqueDescriptorSetLayout& layout, + size_t startId, + size_t storageCount, size_t uniformCount, const std::string& name) { std::vector bindings; - const auto stageFlags = vk::ShaderStageFlags() | vk::ShaderStageFlagBits::eVertex | - vk::ShaderStageFlagBits::eFragment; + for (size_t i = 0; i < storageCount + uniformCount; ++i) { + auto stageFlags = vk::ShaderStageFlags(); + if (startId + i != shaders::idDrawableReservedFragmentOnlyUBO) { + stageFlags |= vk::ShaderStageFlagBits::eVertex; + } + if (startId + i != shaders::idDrawableReservedVertexOnlyUBO) { + stageFlags |= vk::ShaderStageFlagBits::eFragment; + } + + const auto descriptorType = i < storageCount ? vk::DescriptorType::eStorageBuffer + : vk::DescriptorType::eUniformBuffer; - for (size_t i = 0; i < uniformCount; ++i) { bindings.push_back(vk::DescriptorSetLayoutBinding() .setBinding(static_cast(i)) .setStageFlags(stageFlags) - .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setDescriptorType(descriptorType) .setDescriptorCount(1)); } @@ -653,6 +677,9 @@ DescriptorPoolGrowable& Context::getDescriptorPool(DescriptorSetType type) { const vk::UniquePipelineLayout& Context::getGeneralPipelineLayout() { if (generalPipelineLayout) return generalPipelineLayout; + const auto stages = vk::ShaderStageFlags() | vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment; + const auto pushConstant = vk::PushConstantRange().setSize(sizeof(uint32_t)).setStageFlags(stages); + const std::vector layouts = { globalUniformDescriptorSetLayout.get(), layerUniformDescriptorSetLayout.get(), @@ -661,7 +688,7 @@ const vk::UniquePipelineLayout& Context::getGeneralPipelineLayout() { }; generalPipelineLayout = backend.getDevice()->createPipelineLayoutUnique( - vk::PipelineLayoutCreateInfo().setSetLayouts(layouts)); + vk::PipelineLayoutCreateInfo().setPushConstantRanges(pushConstant).setSetLayouts(layouts)); backend.setDebugName(generalPipelineLayout.get(), "PipelineLayout_general"); diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index f27f0a23c3eb..ed688f92d05d 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -36,10 +36,6 @@ void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { const uint32_t maxSets = static_cast(growablePool.maxSets * std::pow(growablePool.growFactor, growablePool.pools.size())); - const vk::DescriptorPoolSize size = {type != DescriptorSetType::DrawableImage - ? vk::DescriptorType::eUniformBuffer - : vk::DescriptorType::eCombinedImageSampler, - maxSets * growablePool.descriptorsPerSet}; #ifdef USE_DESCRIPTOR_POOL_RESET const auto poolFlags = vk::DescriptorPoolCreateFlags(); @@ -47,7 +43,21 @@ void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { const auto poolFlags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet; #endif - const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(poolFlags).setPoolSizes(size).setMaxSets(maxSets); + std::vector sizes; + if (growablePool.descriptorStoragePerSet > 0) { + sizes.emplace_back( + vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, maxSets * growablePool.descriptorStoragePerSet)); + } + if (growablePool.descriptorUniformsPerSet > 0) { + sizes.emplace_back(vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, + maxSets * growablePool.descriptorUniformsPerSet)); + } + if (growablePool.descriptorTexturesPerSet > 0) { + sizes.emplace_back(vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler, + maxSets * growablePool.descriptorTexturesPerSet)); + } + + const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(poolFlags).setPoolSizes(sizes).setMaxSets(maxSets); growablePool.pools.emplace_back(device->createDescriptorPoolUnique(descriptorPoolInfo), maxSets); growablePool.currentPoolIndex = static_cast(growablePool.pools.size() - 1); @@ -131,8 +141,9 @@ UniformDescriptorSet::UniformDescriptorSet(Context& context_, DescriptorSetType : DescriptorSet(context_, type_) {} void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, - uint32_t uniformStartIndex, - uint32_t descriptorBindingCount) { + uint32_t descriptorStartIndex, + uint32_t descriptorStorageCount, + uint32_t descriptorUniformCount) { MLN_TRACE_FUNC(); allocate(); @@ -144,25 +155,28 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, const auto& device = context.getBackend().getDevice(); - for (size_t index = 0; index < descriptorBindingCount; ++index) { + for (size_t index = 0; index < descriptorStorageCount + descriptorUniformCount; ++index) { vk::DescriptorBufferInfo descriptorBufferInfo; - if (const auto& uniformBuffer = uniforms.get(uniformStartIndex + index)) { + if (const auto& uniformBuffer = uniforms.get(descriptorStartIndex + index)) { const auto& uniformBufferImpl = static_cast(*uniformBuffer); const auto& bufferResource = uniformBufferImpl.getBufferResource(); descriptorBufferInfo.setBuffer(bufferResource.getVulkanBuffer()) .setOffset(bufferResource.getVulkanBufferOffset()) .setRange(bufferResource.getSizeInBytes()); } else { - descriptorBufferInfo.setBuffer(context.getDummyUniformBuffer()->getVulkanBuffer()) - .setOffset(0) - .setRange(VK_WHOLE_SIZE); + const auto& dummyBuffer = index < descriptorStorageCount ? context.getDummyStorageBuffer() + : context.getDummyUniformBuffer(); + descriptorBufferInfo.setBuffer(dummyBuffer->getVulkanBuffer()).setOffset(0).setRange(VK_WHOLE_SIZE); } + const auto descriptorType = index < descriptorStorageCount ? vk::DescriptorType::eStorageBuffer + : vk::DescriptorType::eUniformBuffer; + const auto writeDescriptorSet = vk::WriteDescriptorSet() .setBufferInfo(descriptorBufferInfo) .setDescriptorCount(1) - .setDescriptorType(vk::DescriptorType::eUniformBuffer) + .setDescriptorType(descriptorType) .setDstBinding(static_cast(index)) .setDstSet(descriptorSets[frameIndex]); diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index 64dcf681ac0e..e3b0cf45fc73 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -253,6 +253,13 @@ void Drawable::draw(PaintParameters& parameters) const { if (!bindAttributes(encoder)) return; if (!bindDescriptors(encoder)) return; + commandBuffer->pushConstants( + context.getGeneralPipelineLayout().get(), + vk::ShaderStageFlags() | vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + 0, + sizeof(uboIndex), + &uboIndex); + if (is3D) { impl->pipelineInfo.setDepthMode(impl->depthFor3D); impl->pipelineInfo.setStencilMode(impl->stencilFor3D); diff --git a/src/mbgl/vulkan/drawable_impl.hpp b/src/mbgl/vulkan/drawable_impl.hpp index b484ef533c15..a159fa6adc06 100644 --- a/src/mbgl/vulkan/drawable_impl.hpp +++ b/src/mbgl/vulkan/drawable_impl.hpp @@ -24,8 +24,8 @@ using namespace platform; class Drawable::Impl final { public: Impl() - : uniformBuffers(DescriptorSetType::DrawableUniform, shaders::globalUBOCount, shaders::maxUBOCountPerDrawable) { - } + : uniformBuffers( + DescriptorSetType::DrawableUniform, shaders::globalUBOCount, 0, shaders::maxUBOCountPerDrawable) {} ~Impl() = default; diff --git a/src/mbgl/vulkan/layer_group.cpp b/src/mbgl/vulkan/layer_group.cpp index f86d556e0378..9d9d57fba071 100644 --- a/src/mbgl/vulkan/layer_group.cpp +++ b/src/mbgl/vulkan/layer_group.cpp @@ -16,7 +16,10 @@ namespace vulkan { LayerGroup::LayerGroup(int32_t layerIndex_, std::size_t initialCapacity, std::string name_) : mbgl::LayerGroup(layerIndex_, initialCapacity, std::move(name_)), - uniformBuffers(DescriptorSetType::Layer, shaders::layerUBOStartId, shaders::maxUBOCountPerLayer) {} + uniformBuffers(DescriptorSetType::Layer, + shaders::globalUBOCount, + shaders::maxSSBOCountPerLayer, + shaders::maxUBOCountPerLayer) {} void LayerGroup::upload(gfx::UploadPass& uploadPass) { if (!enabled) { diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index e2b44708133b..b3b67fe4e96a 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -12,12 +12,16 @@ #include #include #include -#include +#include #include #include +#include #include +#include #include +#include #include +#include #include #include #include @@ -632,8 +636,6 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::ClippingMaskProgram, shaders::BuiltIn::CollisionBoxShader, shaders::BuiltIn::CollisionCircleShader, - shaders::BuiltIn::CommonShader, - shaders::BuiltIn::CommonTexturedShader, shaders::BuiltIn::CustomSymbolIconShader, shaders::BuiltIn::DebugShader, shaders::BuiltIn::FillShader, @@ -651,6 +653,8 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LineGradientShader, shaders::BuiltIn::LineSDFShader, shaders::BuiltIn::LinePatternShader, + shaders::BuiltIn::LocationIndicatorShader, + shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, shaders::BuiltIn::SymbolSDFIconShader, diff --git a/src/mbgl/vulkan/tile_layer_group.cpp b/src/mbgl/vulkan/tile_layer_group.cpp index ac56147305e7..f1326b13b6f3 100644 --- a/src/mbgl/vulkan/tile_layer_group.cpp +++ b/src/mbgl/vulkan/tile_layer_group.cpp @@ -17,7 +17,10 @@ namespace vulkan { TileLayerGroup::TileLayerGroup(int32_t layerIndex_, std::size_t initialCapacity, std::string name_) : mbgl::TileLayerGroup(layerIndex_, initialCapacity, std::move(name_)), - uniformBuffers(DescriptorSetType::Layer, shaders::layerUBOStartId, shaders::maxUBOCountPerLayer) {} + uniformBuffers(DescriptorSetType::Layer, + shaders::globalUBOCount, + shaders::maxSSBOCountPerLayer, + shaders::maxUBOCountPerLayer) {} void TileLayerGroup::upload(gfx::UploadPass& uploadPass) { if (!enabled || !getDrawableCount()) { diff --git a/src/mbgl/vulkan/uniform_buffer.cpp b/src/mbgl/vulkan/uniform_buffer.cpp index b01e0facc90c..ba9aef60e58c 100644 --- a/src/mbgl/vulkan/uniform_buffer.cpp +++ b/src/mbgl/vulkan/uniform_buffer.cpp @@ -25,18 +25,18 @@ UniformBuffer::~UniformBuffer() { buffer.getContext().renderingStats().memUniformBuffers -= size; } -void UniformBuffer::update(const void* data, std::size_t size_) { - assert(size == size_); - if (size != size_ || size != buffer.getSizeInBytes()) { - Log::Error( - Event::General, - "Mismatched size given to UBO update, expected " + std::to_string(size) + ", got " + std::to_string(size_)); +void UniformBuffer::update(const void* data, std::size_t dataSize) { + assert(dataSize <= size); + if (dataSize > size || dataSize > buffer.getSizeInBytes()) { + Log::Error(Event::General, + "Mismatched size given to UBO update, expected max " + std::to_string(size) + ", got " + + std::to_string(dataSize)); return; } buffer.getContext().renderingStats().numUniformUpdates++; - buffer.getContext().renderingStats().uniformUpdateBytes += size_; - buffer.update(data, size, /*offset=*/0); + buffer.getContext().renderingStats().uniformUpdateBytes += dataSize; + buffer.update(data, dataSize, /*offset=*/0); } const std::shared_ptr& UniformBufferArray::set(const size_t id, @@ -73,7 +73,7 @@ void UniformBufferArray::bindDescriptorSets(CommandEncoder& encoder) { descriptorSet = std::make_unique(encoder.getContext(), descriptorSetType); } - descriptorSet->update(*this, descriptorStartIndex, descriptorBindingCount); + descriptorSet->update(*this, descriptorStartIndex, descriptorStorageCount, descriptorUniformCount); descriptorSet->bind(encoder); } diff --git a/test/util/hash.test.cpp b/test/util/hash.test.cpp index ce5c314b3670..d2563a7f7434 100644 --- a/test/util/hash.test.cpp +++ b/test/util/hash.test.cpp @@ -11,15 +11,12 @@ #if MLN_RENDER_BACKEND_METAL #include -#include #include #include -#include -#include +#include #include #include #include -#include #include #include #include @@ -27,9 +24,7 @@ #include #include #include -#include -#include -#include +#include #endif using namespace mbgl; From 62b92e2038358d8caddedf393b3f837c2204796a Mon Sep 17 00:00:00 2001 From: Christian Hansen Date: Thu, 9 Jan 2025 13:38:35 +0100 Subject: [PATCH 033/339] Allow constraining camera to maximum bounds (#2475) --- include/mbgl/map/bound_options.hpp | 2 + include/mbgl/map/mode.hpp | 5 +- .../Sources/MapLibreNavigationView.swift | 3 + .../Sources/MaximumScreenBoundsExample.swift | 28 ++++ platform/ios/src/MLNMapView.h | 7 + platform/ios/src/MLNMapView.mm | 15 ++ src/mbgl/map/transform.cpp | 38 ++++- src/mbgl/map/transform_state.cpp | 146 +++++++++++++++++- src/mbgl/map/transform_state.hpp | 3 + test/map/transform.test.cpp | 74 +++++++++ 10 files changed, 314 insertions(+), 7 deletions(-) create mode 100644 platform/ios/app-swift/Sources/MaximumScreenBoundsExample.swift diff --git a/include/mbgl/map/bound_options.hpp b/include/mbgl/map/bound_options.hpp index 5901a252cfa9..00383af56494 100644 --- a/include/mbgl/map/bound_options.hpp +++ b/include/mbgl/map/bound_options.hpp @@ -12,6 +12,7 @@ namespace mbgl { */ struct BoundOptions { /// Sets the latitude and longitude bounds to which the camera center are constrained + /// If ConstrainMode is set to Screen these bounds describe what can be shown on screen. BoundOptions& withLatLngBounds(LatLngBounds b) { bounds = b; return *this; @@ -38,6 +39,7 @@ struct BoundOptions { } /// Constrain the center of the camera to be within these bounds. + /// If ConstrainMode is set to Screen these bounds describe what can be shown on screen. std::optional bounds; /// Maximum zoom level allowed. diff --git a/include/mbgl/map/mode.hpp b/include/mbgl/map/mode.hpp index 5835cf8df229..9c5219fb74d3 100644 --- a/include/mbgl/map/mode.hpp +++ b/include/mbgl/map/mode.hpp @@ -19,12 +19,13 @@ enum class MapMode : EnumType { Tile ///< a once-off still image of a single tile }; -/// We can choose to constrain the map both horizontally or vertically, or only -/// vertically e.g. while panning. +/// We can choose to constrain the map both horizontally or vertically, only +/// vertically e.g. while panning, or screen to the specified bounds. enum class ConstrainMode : EnumType { None, HeightOnly, WidthAndHeight, + Screen, }; /// Satisfies embedding platforms that requires the viewport coordinate systems diff --git a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift index 2cfe10120f23..db2c95a3208a 100644 --- a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift +++ b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift @@ -17,6 +17,9 @@ struct MapLibreNavigationView: View { NavigationLink("BlockingGesturesExample") { BlockingGesturesExample() } + NavigationLink("MaximumScreenBoundsExample") { + MaximumScreenBoundsExample() + } NavigationLink("LineStyleLayerExample") { LineStyleLayerExampleUIViewControllerRepresentable() } diff --git a/platform/ios/app-swift/Sources/MaximumScreenBoundsExample.swift b/platform/ios/app-swift/Sources/MaximumScreenBoundsExample.swift new file mode 100644 index 000000000000..0b7ccc9d782d --- /dev/null +++ b/platform/ios/app-swift/Sources/MaximumScreenBoundsExample.swift @@ -0,0 +1,28 @@ +import MapLibre +import SwiftUI +import UIKit + +// Denver, Colorado +private let center = CLLocationCoordinate2D(latitude: 39.748947, longitude: -104.995882) + +// Colorado’s bounds +private let colorado = MLNCoordinateBounds( + sw: CLLocationCoordinate2D(latitude: 36.986207, longitude: -109.049896), + ne: CLLocationCoordinate2D(latitude: 40.989329, longitude: -102.062592) +) + +struct MaximumScreenBoundsExample: UIViewRepresentable { + func makeUIView(context _: Context) -> MLNMapView { + let mapView = MLNMapView(frame: .zero, styleURL: VERSATILES_COLORFUL_STYLE) + mapView.setCenter(center, zoomLevel: 10, direction: 0, animated: false) + mapView.maximumScreenBounds = MLNCoordinateBounds(sw: colorado.sw, ne: colorado.ne) + + return mapView + } + + func updateUIView(_: MLNMapView, context _: Context) {} + + func makeCoordinator() -> Coordinator { + Coordinator() + } +} diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 1166bf9423a3..3965a261d10e 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -915,6 +915,13 @@ vertically on the map. */ @property (nonatomic) double maximumZoomLevel; +/** + * The maximum bounds of the map that can be shown on screen. + * + * @param MLNCoordinateBounds the bounds to constrain the screen to. + */ +@property (nonatomic) MLNCoordinateBounds maximumScreenBounds; + /** The heading of the map, measured in degrees clockwise from true north. diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index fa16cef7654a..fe9c58a6df0f 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -3867,6 +3867,21 @@ - (double)maximumZoomLevel return *self.mbglMap.getBounds().maxZoom; } +- (void)setMaximumScreenBounds:(MLNCoordinateBounds)maximumScreenBounds +{ + mbgl::LatLng sw = {maximumScreenBounds.sw.latitude, maximumScreenBounds.sw.longitude}; + mbgl::LatLng ne = {maximumScreenBounds.ne.latitude, maximumScreenBounds.ne.longitude}; + mbgl::BoundOptions newBounds = mbgl::BoundOptions().withLatLngBounds(mbgl::LatLngBounds::hull(sw, ne)); + + self.mbglMap.setBounds(newBounds); + self.mbglMap.setConstrainMode(mbgl::ConstrainMode::Screen); +} + +- (MLNCoordinateBounds)maximumScreenBounds +{ + return MLNCoordinateBoundsFromLatLngBounds(*self.mbglMap.getBounds().bounds);; +} + - (CGFloat)minimumPitch { return *self.mbglMap.getBounds().minPitch; diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 5f7fcfcf8765..dbf23ae98827 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -60,6 +60,23 @@ void Transform::resize(const Size size) { double scale{state.getScale()}; double x{state.getX()}; double y{state.getY()}; + + double lat; + double lon; + if (state.constrainScreen(scale, lat, lon)) { + // Turns out that if you resize during a transition any changes made to the state will be ignored :( + // So if we have to constrain because of a resize and a transition is in progress - cancel the transition! + if (inTransition()) { + cancelTransitions(); + } + + // It also turns out that state.setProperties isn't enough if you change the center, you need to set Cc and Bc + // too, which setLatLngZoom does. + state.setLatLngZoom(mbgl::LatLng{lat, lon}, state.scaleZoom(scale)); + observer.onCameraDidChange(MapObserver::CameraChangeMode::Immediate); + + return; + } state.constrain(scale, x, y); state.setProperties(TransformStateProperties().withScale(scale).withX(x).withY(y)); @@ -86,17 +103,23 @@ void Transform::jumpTo(const CameraOptions& camera) { * smooth animation between old and new values. The map will retain the current * values for any options not included in `options`. */ -void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& animation) { +void Transform::easeTo(const CameraOptions& inputCamera, const AnimationOptions& animation) { + CameraOptions camera = inputCamera; + Duration duration = animation.duration.value_or(Duration::zero()); if (state.getLatLngBounds() == LatLngBounds() && !isGestureInProgress() && duration != Duration::zero()) { // reuse flyTo, without exaggerated animation, to achieve constant ground speed. return flyTo(camera, animation, true); } + + double zoom = camera.zoom.value_or(getZoom()); + state.constrainCameraAndZoomToBounds(camera, zoom); + const EdgeInsets& padding = camera.padding.value_or(state.getEdgeInsets()); LatLng startLatLng = getLatLng(LatLng::Unwrapped); const LatLng& unwrappedLatLng = camera.center.value_or(startLatLng); const LatLng& latLng = state.getLatLngBounds() != LatLngBounds() ? unwrappedLatLng : unwrappedLatLng.wrapped(); - double zoom = camera.zoom.value_or(getZoom()); + double bearing = camera.bearing ? util::deg2rad(-*camera.bearing) : getBearing(); double pitch = camera.pitch ? util::deg2rad(*camera.pitch) : getPitch(); @@ -176,10 +199,17 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim Where applicable, local variable documentation begins with the associated variable or function in van Wijk (2003). */ -void Transform::flyTo(const CameraOptions& camera, const AnimationOptions& animation, bool linearZoomInterpolation) { +void Transform::flyTo(const CameraOptions& inputCamera, + const AnimationOptions& animation, + bool linearZoomInterpolation) { + CameraOptions camera = inputCamera; + + double zoom = camera.zoom.value_or(getZoom()); + state.constrainCameraAndZoomToBounds(camera, zoom); + const EdgeInsets& padding = camera.padding.value_or(state.getEdgeInsets()); const LatLng& latLng = camera.center.value_or(getLatLng(LatLng::Unwrapped)).wrapped(); - double zoom = camera.zoom.value_or(getZoom()); + double bearing = camera.bearing ? util::deg2rad(-*camera.bearing) : getBearing(); double pitch = camera.pitch ? util::deg2rad(*camera.pitch) : getPitch(); diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index d00ef81fec61..773b7d843f6a 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -748,8 +748,27 @@ bool TransformState::rotatedNorth() const { return (orientation == NO::Leftwards || orientation == NO::Rightwards); } +bool TransformState::constrainScreen(double& scale_, double& lat, double& lon) const { + if (constrainMode == ConstrainMode::Screen) { + double zoom = scaleZoom(scale_); + CameraOptions options = CameraOptions(); + constrainCameraAndZoomToBounds(options, zoom); + + scale_ = zoomScale(zoom); + + if (options.center) { + LatLng center = options.center.value(); + lat = center.latitude(); + lon = center.longitude(); + + return true; + } + } + return false; +} + void TransformState::constrain(double& scale_, double& x_, double& y_) const { - if (constrainMode == ConstrainMode::None) { + if (constrainMode == ConstrainMode::None || constrainMode == ConstrainMode::Screen) { return; } @@ -768,6 +787,131 @@ void TransformState::constrain(double& scale_, double& x_, double& y_) const { } } +void TransformState::constrainCameraAndZoomToBounds(CameraOptions& requestedCamera, double& requestedZoom) const { + if (constrainMode != ConstrainMode::Screen || getLatLngBounds() == LatLngBounds()) { + return; + } + + LatLng centerLatLng = getLatLng(); + + if (requestedCamera.center) { + centerLatLng = requestedCamera.center.value(); + } + + Point anchorOffset{0, 0}; + double requestedScale = zoomScale(requestedZoom); + + // Since the transition calculations will include any specified anchor in the result + // we need to do the same when testing if the requested center and zoom is outside the bounds or not. + if (requestedCamera.anchor) { + ScreenCoordinate anchor = requestedCamera.anchor.value(); + anchor.y = getSize().height - anchor.y; + LatLng anchorLatLng = screenCoordinateToLatLng(anchor); + + // The screenCoordinateToLatLng function requires the matrices inside the state to reflect + // the requested scale. So we create a copy and set the requested zoom before the conversion. + // This will give us the same result as the transition calculations. + TransformState state{*this}; + state.setLatLngZoom(getLatLng(), scaleZoom(requestedScale)); + LatLng screenLatLng = state.screenCoordinateToLatLng(anchor); + + auto latLngCoord = Projection::project(anchorLatLng, requestedScale); + auto anchorCoord = Projection::project(screenLatLng, requestedScale); + anchorOffset = latLngCoord - anchorCoord; + } + + mbgl::LatLngBounds currentBounds = getLatLngBounds(); + mbgl::ScreenCoordinate neBounds = Projection::project(currentBounds.northeast(), requestedScale); + mbgl::ScreenCoordinate swBounds = Projection::project(currentBounds.southwest(), requestedScale); + mbgl::ScreenCoordinate center = Projection::project(centerLatLng, requestedScale); + mbgl::ScreenCoordinate currentCenter = Projection::project(getLatLng(), requestedScale); + + double minY = neBounds.y; + double maxY = swBounds.y; + double minX = swBounds.x; + double maxX = neBounds.x; + + double startX = center.x; + double startY = center.y; + + double resultX = startX; + double resultY = startY; + + uint32_t screenWidth = getSize().width; + uint32_t screenHeight = getSize().height; + + double h2 = screenHeight / 2.0; + if (startY - h2 + anchorOffset.y < minY) { + resultY = minY + h2; + } + if (startY + anchorOffset.y + h2 > maxY) { + resultY = maxY - h2; + } + + double w2 = screenWidth / 2.0; + if (startX + anchorOffset.x - w2 < minX) { + resultX = minX + w2; + } + if (startX + anchorOffset.x + w2 > maxX) { + resultX = maxX - w2; + } + + double scaleY = 0; + if (maxY - minY < screenHeight) { + scaleY = screenHeight / (maxY - minY); + resultY = (maxY + minY) / 2.0; + } + + double scaleX = 0; + if (maxX - minX < screenWidth) { + scaleX = screenWidth / (maxX - minX); + resultX = (maxX + minX) / 2.0; + } + + double maxScale = scaleX > scaleY ? scaleX : scaleY; + + // Max scale will be 1 when the screen is exactly the same size as the max bounds in either the X or Y direction. + // To avoid numerical instabilities we add small amount to the check to make sure we don't try to scale when we + // don't actually need it. + if (maxScale > 1.000001) { + requestedZoom += scaleZoom(maxScale); + + if (scaleY > scaleX) { + // If we scaled the y direction we want the resulting x position to be the same as the current x position. + resultX = currentCenter.x; + } else { + // If we scaled the x direction we want the resulting y position to be the same as the current y position. + resultY = currentCenter.y; + } + + // Since we changed the scale, we might display something outside the bounds. + // When checking we need to take into consideration that we just changed the scale, + // since the resultX and minX were calculated with the requested scale, and not the scale we + // just calculated to make sure we stay inside the bounds. + if (resultX * maxScale - w2 <= minX * maxScale) { + resultX = minX * maxScale + w2; + resultX /= maxScale; + } else if (resultX * maxScale + w2 >= maxX * maxScale) { + resultX = maxX * maxScale - w2; + resultX /= maxScale; + } + + if (resultY * maxScale - h2 <= minY * maxScale) { + resultY = minY * maxScale + h2; + resultY /= maxScale; + } else if (resultY * maxScale + h2 >= maxY * maxScale) { + resultY = maxY * maxScale - h2; + resultY /= maxScale; + } + } + + if (resultX != startX || resultY != startY) { + // If we made changes just drop any anchor point + requestedCamera.anchor.reset(); + requestedCamera.center = std::optional(Projection::unproject({resultX, resultY}, requestedScale)); + } +} + ScreenCoordinate TransformState::getCenterOffset() const { return {0.5 * (edgeInsets.left() - edgeInsets.right()), 0.5 * (edgeInsets.top() - edgeInsets.bottom())}; } diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index 28384eb0ba50..ae4ce86efd5b 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -216,6 +216,9 @@ class TransformState { void setLatLngZoom(const LatLng& latLng, double zoom); void constrain(double& scale, double& x, double& y) const; + bool constrainScreen(double& scale_, double& x_, double& y_) const; + void constrainCameraAndZoomToBounds(CameraOptions& camera, double& zoom) const; + const mat4& getProjectionMatrix() const; const mat4& getInvProjectionMatrix() const; diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp index 54edc8df27bc..c2efcf9d70b2 100644 --- a/test/map/transform.test.cpp +++ b/test/map/transform.test.cpp @@ -611,6 +611,26 @@ TEST(Transform, DefaultTransform) { point = state.latLngToScreenCoordinate(nullIsland); ASSERT_DOUBLE_EQ(point.x, center.x); ASSERT_DOUBLE_EQ(point.y, center.y); + + // Constrain to screen while resizing + transform.resize({1000, 500}); + transform.setLatLngBounds(LatLngBounds::hull({40.0, -10.0}, {70.0, 40.0})); + transform.setConstrainMode(ConstrainMode::Screen); + + // Request impossible zoom + AnimationOptions easeOptions(Seconds(1)); + transform.easeTo(CameraOptions().withCenter(LatLng{56, 11}).withZoom(1), easeOptions); + ASSERT_TRUE(transform.inTransition()); + transform.updateTransitions(transform.getTransitionStart() + Milliseconds(250)); + + // Rotate the screen during a transition (resize it) + transform.resize({500, 1000}); + + // The resize while constraining to screen should have stopped the transition and updated the state + ASSERT_FALSE(transform.inTransition()); + ASSERT_NEAR(transform.getLatLng().longitude(), 8.22103, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 46.6905, 1e-4); + ASSERT_NEAR(transform.getState().getScale(), 38.1529, 1e-4); } TEST(Transform, LatLngBounds) { @@ -803,6 +823,60 @@ TEST(Transform, LatLngBounds) { ASSERT_DOUBLE_EQ(transform.getLatLng().longitude(), 120.0); } +TEST(Transform, ConstrainScreenToBounds) { + Transform transform; + + transform.resize({500, 500}); + transform.setLatLngBounds(LatLngBounds::hull({40.0, -10.0}, {70.0, 40.0})); + transform.setConstrainMode(ConstrainMode::Screen); + + // Request impossible zoom + transform.easeTo(CameraOptions().withCenter(LatLng{56, 11}).withZoom(1)); + ASSERT_NEAR(transform.getZoom(), 2.81378, 1e-4); + + // Request impossible center left + transform.easeTo(CameraOptions().withCenter(LatLng{56, -65}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 0.98632, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); + + // Request impossible center top + transform.easeTo(CameraOptions().withCenter(LatLng{80, 11}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 11.0, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 65.88603, 1e-4); + + // Request impossible center right + transform.easeTo(CameraOptions().withCenter(LatLng{56, 50}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 29.01367, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); + + // Request impossible center bottom + transform.easeTo(CameraOptions().withCenter(LatLng{30, 11}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 11.0, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 47.89217, 1e-4); + + // Request impossible center with anchor + transform.easeTo(CameraOptions().withAnchor(ScreenCoordinate{250, 250}).withCenter(LatLng{56, -65}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 0.98632, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); + + // Request impossible center (anchor) + transform.easeTo(CameraOptions().withAnchor(ScreenCoordinate{250, 250}).withZoom(4)); + ASSERT_NEAR(transform.getLatLng().longitude(), 0.98632, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); + + // Fly to impossible center + transform.flyTo(CameraOptions().withCenter(LatLng{56, -65}).withZoom(4)); + ASSERT_NEAR(transform.getZoom(), 4.0, 1e-4); + ASSERT_NEAR(transform.getLatLng().longitude(), 0.98632, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); + + // Fly to impossible center and zoom + transform.flyTo(CameraOptions().withCenter(LatLng{56, -65}).withZoom(2)); + ASSERT_NEAR(transform.getZoom(), 4.0, 1e-4); + ASSERT_NEAR(transform.getLatLng().longitude(), 0.98632, 1e-4); + ASSERT_NEAR(transform.getLatLng().latitude(), 56.0, 1e-4); +} + TEST(Transform, InvalidPitch) { Transform transform; transform.resize({1, 1}); From aa844c1a2f06d69fb90bf29fa1edb4cc9b01fdb5 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 9 Jan 2025 16:30:30 +0100 Subject: [PATCH 034/339] Release MapLibre iOS 6.10.0 (#3127) --- MODULE.bazel | 4 ++-- platform/darwin/src/MLNComputedShapeSource.h | 3 ++- platform/darwin/src/MLNMapSnapshotter.h | 3 ++- platform/ios/CHANGELOG.md | 9 +++++++-- platform/ios/MapLibre.docc/MapLibre.md | 2 +- platform/ios/MapLibre.docc/PMTiles.md | 15 +++++++++++++++ platform/ios/src/MLNMapView.h | 5 ++--- platform/ios/src/MLNMapViewDelegate.h | 7 ++++--- 8 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 platform/ios/MapLibre.docc/PMTiles.md diff --git a/MODULE.bazel b/MODULE.bazel index 3cdd4ed1335d..9684c906ac82 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -3,9 +3,9 @@ module(name = "maplibre") bazel_dep(name = "apple_support", version = "1.17.0", repo_name = "build_bazel_apple_support") bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.10") -bazel_dep(name = "rules_apple", version = "3.11.2", repo_name = "build_bazel_rules_apple") +bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rules_apple") bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rules_swift") -bazel_dep(name = "rules_xcodeproj", version = "2.8.1") +bazel_dep(name = "rules_xcodeproj", version = "2.10.0") bazel_dep(name = "aspect_rules_js", version = "2.1.0") bazel_dep(name = "rules_nodejs", version = "6.3.2") bazel_dep(name = "libuv", version = "1.48.0") diff --git a/platform/darwin/src/MLNComputedShapeSource.h b/platform/darwin/src/MLNComputedShapeSource.h index 42f5dd65ee46..619a902b7cc6 100644 --- a/platform/darwin/src/MLNComputedShapeSource.h +++ b/platform/darwin/src/MLNComputedShapeSource.h @@ -125,12 +125,13 @@ MLN_EXPORT source cannot be clustered. @param identifier A string that uniquely identifies the source. + @param dataSource An object conforming to MLNComputedShapeSourceDataSource protocol that will + provide the shape data. @param options An `NSDictionary` of options for this source. */ - (instancetype)initWithIdentifier:(NSString *)identifier dataSource:(id)dataSource options:(nullable NSDictionary *)options; - /** Invalidates all the features and properties intersecting with or contained in the specified bounds. New fetch requests will immediately be invoked on the diff --git a/platform/darwin/src/MLNMapSnapshotter.h b/platform/darwin/src/MLNMapSnapshotter.h index e0c6c6461a22..ef8352ede94f 100644 --- a/platform/darwin/src/MLNMapSnapshotter.h +++ b/platform/darwin/src/MLNMapSnapshotter.h @@ -68,7 +68,8 @@ MLN_EXPORT @param styleURL URL of the map style to snapshot. The URL may be a full HTTP, HTTPS URL, canonical URL or a path to a local file relative to - the application’s resource path. Specify `nil` for the default style. + the application's resource path. Specify `nil` for the default style. + @param camera The camera representing the viewport visible in the snapshot. @param size The image size. */ - (instancetype)initWithStyleURL:(nullable NSURL *)styleURL diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 65ce874aee73..4586f7092b4b 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -1,8 +1,13 @@ # Changelog for MapLibre Native for iOS -MapLibre welcomes participation and contributions from everyone. Please read [`Contributing Guide`](https://github.com/maplibre/maplibre-native/blob/master/CONTRIBUTING.md) to get started. +MapLibre welcomes participation and contributions from everyone. Please read [`MapLibre iOS Developer Guide`](https://maplibre.org/maplibre-native/docs/book/ios/index.html) to get started. -## main +## 6.10.0 + +- Fix icon label isn't centered with the icon for CJK/local glyphy on iOS ([#3108](https://github.com/maplibre/maplibre-native/pull/3108)). +- Add support for [PMTiles](https://docs.protomaps.com/pmtiles/) with `pmtiles://` URL scheme ([#2882](https://github.com/maplibre/maplibre-native/pull/2882)). +- Consolidate UBOs ([#3089](https://github.com/maplibre/maplibre-native/pull/3089)). +- Allow constraining camera to maximum bounds ([#2475](https://github.com/maplibre/maplibre-native/pull/2475)). ## 6.9.0 diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index ea0ec68f276e..17a8230989a8 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -30,6 +30,7 @@ Powerful, free and open-source mapping toolkit with full control over data sourc - - - +- ### Map Interaction @@ -52,7 +53,6 @@ Powerful, free and open-source mapping toolkit with full control over data sourc - - -- - - - diff --git a/platform/ios/MapLibre.docc/PMTiles.md b/platform/ios/MapLibre.docc/PMTiles.md new file mode 100644 index 000000000000..edf1c55c8613 --- /dev/null +++ b/platform/ios/MapLibre.docc/PMTiles.md @@ -0,0 +1,15 @@ +# PMTiles + +Working with PMTiles + +Starting MapLibre iOS 6.10.0, using [PMTiles](https://docs.protomaps.com/pmtiles/) as a data source is supported. You can prefix your vector tile source with `pmtiles://` to load a PMTiles file. The rest of the URL continue with be `https://` to load a remote PMTiles file, `asset://` to load an asset or `file://` to load a local PMTiles file. + +Oliver Wipfli has made a style available that combines a [Protomaps]() basemap togehter with Foursquare's POI dataset. It is available in the [wipfli/foursquare-os-places-pmtiles](https://github.com/wipfli/foursquare-os-places-pmtiles) repository on GitHub. The style to use is + +``` +https://raw.githubusercontent.com/wipfli/foursquare-os-places-pmtiles/refs/heads/main/style.json +``` + +The neat thing about this style is that it only uses PMTiles vector sources. PMTiles can be hosted with a relatively simple file server (or file hosting service) instead of a more complex specialized tile server. + +![](pmtiles-demo.png) diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 3965a261d10e..a3a1ce7f7f04 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -1310,19 +1310,18 @@ vertically on the map. the user find his or her bearings even after traversing a great distance. @param camera The new viewpoint. + @param insets The minimum padding (in screen points) that would be visible + around the returned camera object if it were set as the receiver's camera. @param duration The amount of time, measured in seconds, that the transition animation should take. Specify `0` to jump to the new viewpoint instantaneously. Specify a negative value to use the default duration, which is based on the length of the flight path. - @param edgePadding The minimum padding (in screen points) that would be visible - around the returned camera object if it were set as the receiver’s camera. @param completion The block to execute after the animation finishes. */ - (void)flyToCamera:(MLNMapCamera *)camera edgePadding:(UIEdgeInsets)insets withDuration:(NSTimeInterval)duration completionHandler:(nullable void (^)(void))completion; - /** Returns the camera that best fits the given coordinate bounds. diff --git a/platform/ios/src/MLNMapViewDelegate.h b/platform/ios/src/MLNMapViewDelegate.h index 4ade8612b504..346dbc5fd936 100644 --- a/platform/ios/src/MLNMapViewDelegate.h +++ b/platform/ios/src/MLNMapViewDelegate.h @@ -245,9 +245,9 @@ NS_ASSUME_NONNULL_BEGIN affecting performance. @param mapView The map view that has just redrawn. + @param fullyRendered A Boolean value indicating whether the map is fully rendered or not. */ - (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView fullyRendered:(BOOL)fullyRendered; - /** Tells the delegate that the map view has just redrawn. @@ -258,13 +258,14 @@ NS_ASSUME_NONNULL_BEGIN affecting performance. @param mapView The map view that has just redrawn. - @param frameTimeNanos The time taken to render the frame, in nanoseconds + @param fullyRendered A Boolean value indicating whether the map is fully rendered or not. + @param frameEncodingTime The time taken to encode the frame, in milliseconds. + @param frameRenderingTime The time taken to render the frame, in milliseconds. */ - (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView fullyRendered:(BOOL)fullyRendered frameEncodingTime:(double)frameEncodingTime frameRenderingTime:(double)frameRenderingTime; - /** Tells the delegate that the map view is entering an idle state, and no more drawing will be necessary until new data is loaded or there is some interaction From f700a412fed52b8d0e11ab2bdd982468862179cc Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 9 Jan 2025 20:01:32 +0100 Subject: [PATCH 035/339] Release MapLibre iOS 6.10.0 (#3130) --- platform/ios/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 6a1fccf93033..11946a9fd794 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.9.0 \ No newline at end of file +6.10.0 \ No newline at end of file From c1f76cff984a7e42588dd7e7e1156869ecbdf373 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 9 Jan 2025 23:04:41 +0200 Subject: [PATCH 036/339] Fix in-flight frame update Vulkan (#3122) --- include/mbgl/vulkan/buffer_resource.hpp | 14 ++-- include/mbgl/vulkan/context.hpp | 8 +-- include/mbgl/vulkan/renderer_backend.hpp | 2 + include/mbgl/vulkan/uniform_buffer.hpp | 14 +++- src/mbgl/vulkan/buffer_resource.cpp | 85 +++++++++++++++++++----- src/mbgl/vulkan/context.cpp | 25 ++----- src/mbgl/vulkan/descriptor_set.cpp | 3 +- src/mbgl/vulkan/renderable_resource.cpp | 84 +++++++++++------------ src/mbgl/vulkan/renderer_backend.cpp | 47 +++++++++++-- src/mbgl/vulkan/uniform_buffer.cpp | 16 +++++ src/mbgl/vulkan/upload_pass.cpp | 14 ++-- 11 files changed, 210 insertions(+), 102 deletions(-) diff --git a/include/mbgl/vulkan/buffer_resource.hpp b/include/mbgl/vulkan/buffer_resource.hpp index 2d59abff4fa0..890d4b61d709 100644 --- a/include/mbgl/vulkan/buffer_resource.hpp +++ b/include/mbgl/vulkan/buffer_resource.hpp @@ -51,14 +51,18 @@ class BufferResource { void update(const void* data, std::size_t size, std::size_t offset) noexcept; std::size_t getSizeInBytes() const noexcept { return size; } - const void* contents() const noexcept { return (raw.empty() ? nullptr : raw.data()); } + const void* contents() const noexcept; + const void* contents(uint8_t resourceIndex) const noexcept; Context& getContext() const noexcept { return context; } const vk::Buffer& getVulkanBuffer() const noexcept { return bufferAllocation->buffer; } std::size_t getVulkanBufferOffset() const noexcept; - std::size_t getVulkanBufferSize() const noexcept; + std::size_t getVulkanBufferOffset(uint8_t resourceIndex) const noexcept; + // update the current sub-buffer with the latest data + void updateVulkanBuffer(); + void updateVulkanBuffer(const int8_t destination, const uint8_t source); - bool isValid() const noexcept { return !raw.empty(); } + bool isValid() const noexcept { return !!bufferAllocation; } operator bool() const noexcept { return isValid(); } bool operator!() const noexcept { return !isValid(); } @@ -69,14 +73,14 @@ class BufferResource { protected: Context& context; - std::vector raw; std::size_t size; std::uint32_t usage; - std::uint16_t version = 0; + VersionType version = 0; bool persistent; SharedBufferAllocation bufferAllocation; size_t bufferWindowSize = 0; + std::vector bufferWindowVersions; }; } // namespace vulkan diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index abbc9e3985a1..da4a6cd94a12 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -136,9 +136,7 @@ class Context final : public gfx::Context { RenderStaticData& staticData, const std::vector& tileUBOs); - const std::unique_ptr& getDummyVertexBuffer(); - const std::unique_ptr& getDummyUniformBuffer(); - const std::unique_ptr& getDummyStorageBuffer(); + const std::unique_ptr& getDummyBuffer(); const std::unique_ptr& getDummyTexture(); const vk::DescriptorSetLayout& getDescriptorSetLayout(DescriptorSetType type); @@ -190,9 +188,7 @@ class Context final : public gfx::Context { vulkan::UniformBufferArray globalUniformBuffers; std::unordered_map descriptorPoolMap; - std::unique_ptr dummyVertexBuffer; - std::unique_ptr dummyUniformBuffer; - std::unique_ptr dummyStorageBuffer; + std::unique_ptr dummyBuffer; std::unique_ptr dummyTexture2D; vk::UniqueDescriptorSetLayout globalUniformDescriptorSetLayout; vk::UniqueDescriptorSetLayout layerUniformDescriptorSetLayout; diff --git a/include/mbgl/vulkan/renderer_backend.hpp b/include/mbgl/vulkan/renderer_backend.hpp index 7cf05a272cc4..ab6aca0ced1b 100644 --- a/include/mbgl/vulkan/renderer_backend.hpp +++ b/include/mbgl/vulkan/renderer_backend.hpp @@ -70,6 +70,8 @@ class RendererBackend : public gfx::RendererBackend { void startFrameCapture(); void endFrameCapture(); + void setFrameCaptureLoop(bool value); + void triggerFrameCapture(uint32_t frameCount = 1, uint32_t frameDelay = 0); protected: std::unique_ptr createContext() override; diff --git a/include/mbgl/vulkan/uniform_buffer.hpp b/include/mbgl/vulkan/uniform_buffer.hpp index 23d1cac2d0b9..d2a1be8d94c7 100644 --- a/include/mbgl/vulkan/uniform_buffer.hpp +++ b/include/mbgl/vulkan/uniform_buffer.hpp @@ -15,6 +15,7 @@ class UniformBuffer final : public gfx::UniformBuffer { ~UniformBuffer() override; const BufferResource& getBufferResource() const { return buffer; } + BufferResource& mutableBufferResource() { return buffer; } UniformBuffer clone() const { return {buffer.clone()}; } @@ -37,14 +38,21 @@ class UniformBufferArray final : public gfx::UniformBufferArray { descriptorStorageCount(descriptorStorageCount_), descriptorUniformCount(descriptorUniformCount_) {} - UniformBufferArray(UniformBufferArray&& other) - : gfx::UniformBufferArray(std::move(other)) {} + UniformBufferArray(UniformBufferArray&& other) noexcept + : gfx::UniformBufferArray(std::move(other)), + descriptorSetType(other.descriptorSetType), + descriptorStartIndex(other.descriptorStartIndex), + descriptorStorageCount(other.descriptorStorageCount), + descriptorUniformCount(other.descriptorUniformCount), + descriptorSet(std::move(other.descriptorSet)) {} + UniformBufferArray(const UniformBufferArray&) = delete; - UniformBufferArray& operator=(UniformBufferArray&& other) { + UniformBufferArray& operator=(UniformBufferArray&& other) noexcept { gfx::UniformBufferArray::operator=(std::move(other)); return *this; } + UniformBufferArray& operator=(const UniformBufferArray& other) { gfx::UniformBufferArray::operator=(other); return *this; diff --git a/src/mbgl/vulkan/buffer_resource.cpp b/src/mbgl/vulkan/buffer_resource.cpp index d2a3ee32ad4d..b920627a55f4 100644 --- a/src/mbgl/vulkan/buffer_resource.cpp +++ b/src/mbgl/vulkan/buffer_resource.cpp @@ -6,6 +6,7 @@ #include #include +#include namespace mbgl { namespace vulkan { @@ -59,12 +60,25 @@ BufferResource::BufferResource( if (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT || usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { const auto& backend = context.getBackend(); const auto& deviceProps = backend.getDeviceProperties(); - const auto& align = deviceProps.limits.minUniformBufferOffsetAlignment; + + vk::DeviceSize align = 0; + if (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) { + align = deviceProps.limits.minUniformBufferOffsetAlignment; + } + + if (usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { + align = align ? std::lcm(align, deviceProps.limits.minStorageBufferOffsetAlignment) + : deviceProps.limits.minStorageBufferOffsetAlignment; + } + bufferWindowSize = (size + align - 1) & ~(align - 1); assert(bufferWindowSize != 0); - totalSize = bufferWindowSize * backend.getMaxFrames(); + const auto frameCount = backend.getMaxFrames(); + totalSize = bufferWindowSize * frameCount; + + bufferWindowVersions = std::vector(frameCount, 0); } const auto bufferInfo = vk::BufferCreateInfo() @@ -87,9 +101,7 @@ BufferResource::BufferResource( vmaMapMemory(allocator, bufferAllocation->allocation, &bufferAllocation->mappedBuffer); if (data) { - raw.resize(size); - std::memcpy(raw.data(), data, size); - std::memcpy(static_cast(bufferAllocation->mappedBuffer) + getVulkanBufferOffset(), data, size); + update(data, size, 0); } if (isValid()) { @@ -104,12 +116,13 @@ BufferResource::BufferResource( BufferResource::BufferResource(BufferResource&& other) noexcept : context(other.context), - raw(std::move(other.raw)), size(other.size), usage(other.usage), + version(other.version), persistent(other.persistent), bufferAllocation(std::move(other.bufferAllocation)), - bufferWindowSize(other.bufferWindowSize) { + bufferWindowSize(other.bufferWindowSize), + bufferWindowVersions(std::move(other.bufferWindowVersions)) { other.bufferAllocation = nullptr; } @@ -134,7 +147,7 @@ BufferResource& BufferResource::operator=(BufferResource&& other) noexcept { context.renderingStats().numBuffers--; context.renderingStats().memBuffers -= size; }; - raw = std::move(other.raw); + size = other.size; usage = other.usage; persistent = other.persistent; @@ -152,21 +165,63 @@ void BufferResource::update(const void* newData, std::size_t updateSize, std::si return; } - auto& stats = context.renderingStats(); + uint8_t* data = static_cast(bufferAllocation->mappedBuffer) + getVulkanBufferOffset() + offset; + std::memcpy(data, newData, updateSize); - std::memcpy(raw.data() + offset, newData, updateSize); - std::memcpy( - static_cast(bufferAllocation->mappedBuffer) + getVulkanBufferOffset() + offset, newData, updateSize); + auto& stats = context.renderingStats(); stats.bufferUpdateBytes += updateSize; - stats.bufferUpdates++; version++; + + if (bufferWindowSize) { + const auto frameIndex = context.getCurrentFrameResourceIndex(); + bufferWindowVersions[frameIndex] = version; + } +} + +const void* BufferResource::contents() const noexcept { + return contents(context.getCurrentFrameResourceIndex()); +} + +const void* BufferResource::contents(uint8_t resourceIndex) const noexcept { + if (!isValid()) { + return nullptr; + } + + return static_cast(bufferAllocation->mappedBuffer) + getVulkanBufferOffset(resourceIndex); } std::size_t BufferResource::getVulkanBufferOffset() const noexcept { - if (bufferWindowSize > 0) return 0; + return getVulkanBufferOffset(context.getCurrentFrameResourceIndex()); +} + +std::size_t BufferResource::getVulkanBufferOffset(std::uint8_t resourceIndex) const noexcept { + assert(context.getBackend().getMaxFrames() >= resourceIndex); + return bufferWindowSize ? resourceIndex * bufferWindowSize : 0; +} + +void BufferResource::updateVulkanBuffer() { + const auto frameCount = context.getBackend().getMaxFrames(); + + const int8_t currentIndex = context.getCurrentFrameResourceIndex(); + const int8_t prevIndex = currentIndex == 0 ? frameCount - 1 : currentIndex - 1; + + updateVulkanBuffer(currentIndex, prevIndex); +} + +void BufferResource::updateVulkanBuffer(const int8_t destination, const uint8_t source) { + if (!bufferWindowSize) { + return; + } - return context.getCurrentFrameResourceIndex() * bufferWindowSize; + if (bufferWindowVersions[destination] < bufferWindowVersions[source]) { + uint8_t* dstData = static_cast(bufferAllocation->mappedBuffer) + bufferWindowSize * destination; + uint8_t* srcData = static_cast(bufferAllocation->mappedBuffer) + bufferWindowSize * source; + + std::memcpy(dstData, srcData, size); + + bufferWindowVersions[destination] = bufferWindowVersions[source]; + } } } // namespace vulkan diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index c7c11e5396cd..678ca378da44 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -563,25 +563,14 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, return true; } -const std::unique_ptr& Context::getDummyVertexBuffer() { - if (!dummyVertexBuffer) - dummyVertexBuffer = std::make_unique( - *this, nullptr, 16, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, false); - return dummyVertexBuffer; -} - -const std::unique_ptr& Context::getDummyUniformBuffer() { - if (!dummyUniformBuffer) - dummyUniformBuffer = std::make_unique( - *this, nullptr, 16, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, false); - return dummyUniformBuffer; -} +const std::unique_ptr& Context::getDummyBuffer() { + if (!dummyBuffer) { + const uint32_t usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + dummyBuffer = std::make_unique(*this, nullptr, 16, usage, false); + } -const std::unique_ptr& Context::getDummyStorageBuffer() { - if (!dummyStorageBuffer) - dummyStorageBuffer = std::make_unique( - *this, nullptr, 16, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, false); - return dummyStorageBuffer; + return dummyBuffer; } const std::unique_ptr& Context::getDummyTexture() { diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index ed688f92d05d..488e940728ae 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -165,8 +165,7 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, .setOffset(bufferResource.getVulkanBufferOffset()) .setRange(bufferResource.getSizeInBytes()); } else { - const auto& dummyBuffer = index < descriptorStorageCount ? context.getDummyStorageBuffer() - : context.getDummyUniformBuffer(); + const auto& dummyBuffer = context.getDummyBuffer(); descriptorBufferInfo.setBuffer(dummyBuffer->getVulkanBuffer()).setOffset(0).setRange(VK_WHOLE_SIZE); } diff --git a/src/mbgl/vulkan/renderable_resource.cpp b/src/mbgl/vulkan/renderable_resource.cpp index 052010f14e94..f129a6176848 100644 --- a/src/mbgl/vulkan/renderable_resource.cpp +++ b/src/mbgl/vulkan/renderable_resource.cpp @@ -219,7 +219,8 @@ void SurfaceRenderableResource::initDepthStencil() { .setViewType(vk::ImageViewType::e2D) .setFormat(depthFormat) .setComponents(vk::ComponentMapping()) // defaults to vk::ComponentSwizzle::eIdentity - .setSubresourceRange(vk::ImageSubresourceRange(vk::ImageAspectFlagBits::eDepth, 0, 1, 0, 1)); + .setSubresourceRange(vk::ImageSubresourceRange( + vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, 0, 1, 0, 1)); depthAllocation->imageView = device->createImageViewUnique(imageViewCreateInfo); @@ -307,28 +308,29 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { // create render pass const auto colorLayout = surface ? vk::ImageLayout::ePresentSrcKHR : vk::ImageLayout::eTransferSrcOptimal; - const auto colorAttachment = vk::AttachmentDescription(vk::AttachmentDescriptionFlags()) - .setFormat(colorFormat) - .setSamples(vk::SampleCountFlagBits::e1) - .setLoadOp(vk::AttachmentLoadOp::eClear) - .setStoreOp(vk::AttachmentStoreOp::eStore) - .setStencilLoadOp(vk::AttachmentLoadOp::eDontCare) - .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) - .setInitialLayout(vk::ImageLayout::eUndefined) - .setFinalLayout(colorLayout); - - const vk::AttachmentReference colorAttachmentRef(0, vk::ImageLayout::eColorAttachmentOptimal); - const auto depthAttachment = vk::AttachmentDescription() - .setFormat(depthFormat) - .setSamples(vk::SampleCountFlagBits::e1) - .setLoadOp(vk::AttachmentLoadOp::eClear) - .setStoreOp(vk::AttachmentStoreOp::eDontCare) - .setStencilLoadOp(vk::AttachmentLoadOp::eClear) - .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) - .setInitialLayout(vk::ImageLayout::eUndefined) - .setFinalLayout(vk::ImageLayout::eDepthStencilAttachmentOptimal); + const std::array attachments = { + vk::AttachmentDescription() + .setFormat(colorFormat) + .setSamples(vk::SampleCountFlagBits::e1) + .setLoadOp(vk::AttachmentLoadOp::eClear) + .setStoreOp(vk::AttachmentStoreOp::eStore) + .setStencilLoadOp(vk::AttachmentLoadOp::eDontCare) + .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setFinalLayout(colorLayout), + + vk::AttachmentDescription() + .setFormat(depthFormat) + .setSamples(vk::SampleCountFlagBits::e1) + .setLoadOp(vk::AttachmentLoadOp::eClear) + .setStoreOp(vk::AttachmentStoreOp::eDontCare) + .setStencilLoadOp(vk::AttachmentLoadOp::eClear) + .setStencilStoreOp(vk::AttachmentStoreOp::eDontCare) + .setInitialLayout(vk::ImageLayout::eUndefined) + .setFinalLayout(vk::ImageLayout::eDepthStencilAttachmentOptimal)}; + const vk::AttachmentReference colorAttachmentRef(0, vk::ImageLayout::eColorAttachmentOptimal); const vk::AttachmentReference depthAttachmentRef(1, vk::ImageLayout::eDepthStencilAttachmentOptimal); const auto subpass = vk::SubpassDescription() @@ -337,28 +339,28 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { .setColorAttachments(colorAttachmentRef) .setPDepthStencilAttachment(&depthAttachmentRef); - const auto subpassSrcStageMask = vk::PipelineStageFlags() | vk::PipelineStageFlagBits::eColorAttachmentOutput | - vk::PipelineStageFlagBits::eLateFragmentTests; - - const auto subpassDstStageMask = vk::PipelineStageFlags() | vk::PipelineStageFlagBits::eColorAttachmentOutput | - vk::PipelineStageFlagBits::eEarlyFragmentTests; - - const auto subpassSrcAccessMask = vk::AccessFlags() | vk::AccessFlagBits::eDepthStencilAttachmentWrite; - - const auto subpassDstAccessMask = vk::AccessFlags() | vk::AccessFlagBits::eColorAttachmentWrite | - vk::AccessFlagBits::eDepthStencilAttachmentWrite; - - const auto subpassDependency = vk::SubpassDependency() - .setSrcSubpass(VK_SUBPASS_EXTERNAL) - .setDstSubpass(0) - .setSrcStageMask(subpassSrcStageMask) - .setDstStageMask(subpassDstStageMask) - .setSrcAccessMask(subpassSrcAccessMask) - .setDstAccessMask(subpassDstAccessMask); + const std::array dependencies = { + vk::SubpassDependency() + .setSrcSubpass(VK_SUBPASS_EXTERNAL) + .setDstSubpass(0) + .setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setSrcAccessMask({}) + .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentWrite), + + vk::SubpassDependency() + .setSrcSubpass(VK_SUBPASS_EXTERNAL) + .setDstSubpass(0) + .setSrcStageMask(vk::PipelineStageFlagBits::eEarlyFragmentTests | + vk::PipelineStageFlagBits::eLateFragmentTests) + .setDstStageMask(vk::PipelineStageFlagBits::eEarlyFragmentTests | + vk::PipelineStageFlagBits::eLateFragmentTests) + .setSrcAccessMask({}) + .setDstAccessMask(vk::AccessFlagBits::eDepthStencilAttachmentWrite), + }; - const std::array attachments = {colorAttachment, depthAttachment}; const auto renderPassCreateInfo = - vk::RenderPassCreateInfo().setAttachments(attachments).setSubpasses(subpass).setDependencies(subpassDependency); + vk::RenderPassCreateInfo().setAttachments(attachments).setSubpasses(subpass).setDependencies(dependencies); renderPass = device->createRenderPassUnique(renderPassCreateInfo); diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index b3b67fe4e96a..277d332ebbcb 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -60,7 +60,13 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #endif #include "renderdoc_app.h" -static RENDERDOC_API_1_1_2* g_rdoc_api = nullptr; + +static struct { + RENDERDOC_API_1_1_2* api = nullptr; + bool loop = false; + int32_t frameDelay = 0; + uint32_t frameCaptureCount = 0; +} g_rdoc; #endif @@ -187,13 +193,13 @@ void RendererBackend::initFrameCapture() { #ifdef _WIN32 if (HMODULE mod = GetModuleHandleA("renderdoc.dll")) { pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)GetProcAddress(mod, "RENDERDOC_GetAPI"); - int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&g_rdoc_api); + int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&g_rdoc.api); assert(ret == 1); } #elif __unix__ if (void* mod = dlopen("librenderdoc.so", RTLD_NOW | RTLD_NOLOAD)) { pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)dlsym(mod, "RENDERDOC_GetAPI"); - int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&g_rdoc_api); + int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&g_rdoc.api); assert(ret == 1); } #endif @@ -203,19 +209,46 @@ void RendererBackend::initFrameCapture() { void RendererBackend::startFrameCapture() { #ifdef ENABLE_RENDERDOC_FRAME_CAPTURE - if (g_rdoc_api) { + if (!g_rdoc.api) { + return; + } + + if (g_rdoc.loop) { RENDERDOC_DevicePointer devicePtr = RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(instance->operator VkInstance_T*()); - g_rdoc_api->StartFrameCapture(devicePtr, nullptr); + g_rdoc.api->StartFrameCapture(devicePtr, nullptr); + } else { + if (g_rdoc.frameCaptureCount > 0 && g_rdoc.frameDelay == 0) { + g_rdoc.api->TriggerMultiFrameCapture(g_rdoc.frameCaptureCount); + } + + --g_rdoc.frameDelay; } #endif } void RendererBackend::endFrameCapture() { #ifdef ENABLE_RENDERDOC_FRAME_CAPTURE - if (g_rdoc_api) { + if (g_rdoc.api && g_rdoc.loop) { RENDERDOC_DevicePointer devicePtr = RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(instance->operator VkInstance_T*()); - g_rdoc_api->EndFrameCapture(devicePtr, nullptr); + g_rdoc.api->EndFrameCapture(devicePtr, nullptr); + } +#endif +} + +void RendererBackend::setFrameCaptureLoop([[maybe_unused]] bool value) { +#ifdef ENABLE_RENDERDOC_FRAME_CAPTURE + g_rdoc.loop = value; +#endif +} + +void RendererBackend::triggerFrameCapture([[maybe_unused]] uint32_t frameCount, [[maybe_unused]] uint32_t frameDelay) { +#ifdef ENABLE_RENDERDOC_FRAME_CAPTURE + if (!g_rdoc.api) { + return; } + + g_rdoc.frameCaptureCount = frameCount; + g_rdoc.frameDelay = frameDelay; #endif } diff --git a/src/mbgl/vulkan/uniform_buffer.cpp b/src/mbgl/vulkan/uniform_buffer.cpp index ba9aef60e58c..839622a0dc36 100644 --- a/src/mbgl/vulkan/uniform_buffer.cpp +++ b/src/mbgl/vulkan/uniform_buffer.cpp @@ -74,6 +74,22 @@ void UniformBufferArray::bindDescriptorSets(CommandEncoder& encoder) { } descriptorSet->update(*this, descriptorStartIndex, descriptorStorageCount, descriptorUniformCount); + + const auto frameCount = encoder.getContext().getBackend().getMaxFrames(); + const int32_t currentIndex = encoder.getContext().getCurrentFrameResourceIndex(); + const int32_t prevIndex = currentIndex == 0 ? frameCount - 1 : currentIndex - 1; + + for (uint32_t i = 0; i < descriptorStorageCount + descriptorUniformCount; ++i) { + const uint32_t index = descriptorStartIndex + i; + + if (!uniformBufferVector[index]) { + continue; + } + + auto& buff = static_cast(uniformBufferVector[index].get())->mutableBufferResource(); + buff.updateVulkanBuffer(currentIndex, prevIndex); + } + descriptorSet->bind(encoder); } diff --git a/src/mbgl/vulkan/upload_pass.cpp b/src/mbgl/vulkan/upload_pass.cpp index 57b05eb64a08..d2f6a3564919 100644 --- a/src/mbgl/vulkan/upload_pass.cpp +++ b/src/mbgl/vulkan/upload_pass.cpp @@ -85,7 +85,7 @@ static const std::unique_ptr noBuffer; const gfx::UniqueVertexBufferResource& UploadPass::getBuffer(const gfx::VertexVectorBasePtr& vec, const gfx::BufferUsageType usage, - bool forceUpdate) { + [[maybe_unused]] bool forceUpdate) { if (vec) { const auto* rawBufPtr = vec->getRawData(); const auto rawBufSize = vec->getRawCount() * vec->getRawSize(); @@ -96,11 +96,11 @@ const gfx::UniqueVertexBufferResource& UploadPass::getBuffer(const gfx::VertexVe // If it's changed, update it if (rawBufSize <= resource.getSizeInBytes()) { - if (forceUpdate || vec->isModifiedAfter(resource.getLastUpdated())) { - updateVertexBufferResource(resource, rawBufPtr, rawBufSize); - resource.setLastUpdated(vec->getLastModified()); + if (vec->isModifiedAfter(resource.getLastUpdated())) { + // updateVertexBufferResource(resource, rawBufPtr, rawBufSize); + } else { + return rawData->resource; } - return rawData->resource; } } // Otherwise, create a new one @@ -108,6 +108,10 @@ const gfx::UniqueVertexBufferResource& UploadPass::getBuffer(const gfx::VertexVe auto buffer = std::make_unique(); buffer->resource = createVertexBufferResource(rawBufPtr, rawBufSize, usage, /*persistent=*/false); vec->setBuffer(std::move(buffer)); + + auto* rawData = static_cast(vec->getBuffer()); + auto& resource = static_cast(*rawData->resource); + resource.setLastUpdated(vec->getLastModified()); return static_cast(vec->getBuffer())->resource; } } From a27fbbabb03b695633c5c4b144d115a604adcf07 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 9 Jan 2025 22:42:58 +0100 Subject: [PATCH 037/339] Prepare MapLibre Android 11.8.0 release (#3129) --- platform/android/CHANGELOG.md | 12 ++++++++++++ .../android/MapLibreAndroid/gradle.properties | 2 +- .../MapLibreAndroid/src/cpp/http_file_source.cpp | 2 +- platform/android/docs/data/PMTiles.md | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 platform/android/docs/data/PMTiles.md diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 2bedb5be3277..c099845a3472 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog MapLibre Native for Android +## 11.8.0 + +> [!NOTE] +> We are now releasing OpenGL ES and Vulkan variants of MapLibre Android. See the [11.7.0 release notes](https://github.com/maplibre/maplibre-native/releases/tag/android-v11.7.0) for details. + +### ✨ Features and improvements + +- Add PMTiles support ([#2882](https://github.com/maplibre/maplibre-native/pull/2882)). +- Consolidate UBOs ([#3089](https://github.com/maplibre/maplibre-native/pull/3089)). + +We have a new feature in the C++ Core to constrain the screen (instead of the center of the camera) to some bounds ([#2475](https://github.com/maplibre/maplibre-native/pull/2475)). This functionality still has to be exposed to Android. If you are interested in implementing this, see [this issue](https://github.com/maplibre/maplibre-native/issues/3128). + ## 11.7.1 > [!NOTE] diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 93fed717d85f..e012fd4356e3 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.7.1 +VERSION_NAME=11.8.0 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 diff --git a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp index 4bd80f1e78fa..13bc72a8b86c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp @@ -161,7 +161,7 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, response.expires = util::parseTimestamp(jni::Make(env, expires).c_str()); } - if (code == 200) { + if (code == 200 || code == 206) { if (body) { auto data = std::make_shared(body.Length(env), char()); jni::GetArrayRegion(env, *body, 0, data->size(), reinterpret_cast(&(*data)[0])); diff --git a/platform/android/docs/data/PMTiles.md b/platform/android/docs/data/PMTiles.md new file mode 100644 index 000000000000..8fddcec5c53a --- /dev/null +++ b/platform/android/docs/data/PMTiles.md @@ -0,0 +1,15 @@ +# PMTiles + +Starting MapLibre Android 11.7.0, using [PMTiles](https://docs.protomaps.com/pmtiles/) as a data source is supported. You can prefix your vector tile source with `pmtiles://` to load a PMTiles file. The rest of the URL continue with be `https://` to load a remote PMTiles file, `asset://` to load an asset or `file://` to load a local PMTiles file. + +Oliver Wipfli has made a style available that combines a [Protomaps]() basemap togehter with Foursquare's POI dataset. It is available in the [wipfli/foursquare-os-places-pmtiles](https://github.com/wipfli/foursquare-os-places-pmtiles) repository on GitHub. The style to use is + +``` +https://raw.githubusercontent.com/wipfli/foursquare-os-places-pmtiles/refs/heads/main/style.json +``` + +The neat thing about this style is that it only uses PMTiles vector sources. PMTiles can be hosted with a relatively simple file server (or file hosting service) instead of a more complex specialized tile server. + +
+ ![Screenshot of PMTiles based style using Protomaps basemap with Foursquare POIs]({{ s3_url("pmtiles-demo.png") }}){ width="300" } +
\ No newline at end of file From 57f42d92302963e21c37601bc6f0e5bf4a4d48df Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 10 Jan 2025 00:44:12 +0100 Subject: [PATCH 038/339] Update Android changelog (#3134) --- platform/android/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index c099845a3472..2ed61e4a85bb 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -10,6 +10,10 @@ - Add PMTiles support ([#2882](https://github.com/maplibre/maplibre-native/pull/2882)). - Consolidate UBOs ([#3089](https://github.com/maplibre/maplibre-native/pull/3089)). +### 🐞 Bug fixes + +- (Vulkan) Fix in-flight frame update Vulkan ([#3122](https://github.com/maplibre/maplibre-native/pull/3122)). Fixes jittery labels and some similar issues. + We have a new feature in the C++ Core to constrain the screen (instead of the center of the camera) to some bounds ([#2475](https://github.com/maplibre/maplibre-native/pull/2475)). This functionality still has to be exposed to Android. If you are interested in implementing this, see [this issue](https://github.com/maplibre/maplibre-native/issues/3128). ## 11.7.1 From 9f02e29f5fe2efeaa22694a991e9fabc7d6aff30 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Fri, 10 Jan 2025 16:41:58 +0200 Subject: [PATCH 039/339] Replace macro with run-time string concatenation (#3124) --- include/mbgl/shaders/mtl/background.hpp | 15 +++++------- include/mbgl/shaders/mtl/circle.hpp | 9 ++++---- include/mbgl/shaders/mtl/clipping_mask.hpp | 12 ++++------ include/mbgl/shaders/mtl/collision.hpp | 11 +++++---- .../mbgl/shaders/mtl/custom_symbol_icon.hpp | 9 ++++---- include/mbgl/shaders/mtl/debug.hpp | 8 +++---- include/mbgl/shaders/mtl/fill.hpp | 23 ++++++++++++------- include/mbgl/shaders/mtl/fill_extrusion.hpp | 13 +++++++---- include/mbgl/shaders/mtl/heatmap.hpp | 8 +++---- include/mbgl/shaders/mtl/heatmap_texture.hpp | 8 +++---- include/mbgl/shaders/mtl/hillshade.hpp | 8 +++---- .../mbgl/shaders/mtl/hillshade_prepare.hpp | 9 ++++---- include/mbgl/shaders/mtl/line.hpp | 21 +++++++++++------ include/mbgl/shaders/mtl/raster.hpp | 8 +++---- include/mbgl/shaders/mtl/shader_group.hpp | 3 ++- include/mbgl/shaders/mtl/symbol.hpp | 17 +++++++++----- include/mbgl/shaders/mtl/widevector.hpp | 9 ++++---- 17 files changed, 106 insertions(+), 85 deletions(-) diff --git a/include/mbgl/shaders/mtl/background.hpp b/include/mbgl/shaders/mtl/background.hpp index cb683aefde7d..ad414accc28f 100644 --- a/include/mbgl/shaders/mtl/background.hpp +++ b/include/mbgl/shaders/mtl/background.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define BACKGROUND_SHADER_COMMON \ - R"( +constexpr auto backgroundShaderPrelude = R"( enum { idBackgroundDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -72,7 +71,7 @@ union BackgroundDrawableUnionUBO { BackgroundPatternDrawableUBO backgroundPatternDrawableUBO; }; -)" +)"; template <> struct ShaderSource { @@ -84,9 +83,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = BACKGROUND_SHADER_COMMON R"( -#include -using namespace metal; + static constexpr auto prelude = backgroundShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 position [[attribute(backgroundUBOCount + 0)]]; @@ -128,9 +126,8 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = BACKGROUND_SHADER_COMMON R"( -#include -using namespace metal; + static constexpr auto prelude = backgroundShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 position [[attribute(backgroundUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/circle.hpp b/include/mbgl/shaders/mtl/circle.hpp index 2a95a763fe10..7575f39bd834 100644 --- a/include/mbgl/shaders/mtl/circle.hpp +++ b/include/mbgl/shaders/mtl/circle.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define CIRCLE_SHADER_PRELUDE \ - R"( +constexpr auto circleShaderPrelude = R"( enum { idCircleDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -51,7 +50,7 @@ struct alignas(16) CircleEvaluatedPropsUBO { }; static_assert(sizeof(CircleEvaluatedPropsUBO) == 4 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -63,7 +62,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = CIRCLE_SHADER_PRELUDE R"( + static constexpr auto prelude = circleShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 position [[attribute(circleUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/clipping_mask.hpp b/include/mbgl/shaders/mtl/clipping_mask.hpp index 580c1ad9efde..e0f5d8b6173b 100644 --- a/include/mbgl/shaders/mtl/clipping_mask.hpp +++ b/include/mbgl/shaders/mtl/clipping_mask.hpp @@ -16,11 +16,7 @@ struct alignas(16) ClipUBO { }; static_assert(sizeof(ClipUBO) == 5 * 16); -#define CLIPPING_MASK_SHADER_PRELUDE \ - R"( - -#include -using namespace metal; +constexpr auto clippingMaskShaderPrelude = R"( enum { idClippingMaskUBO = idDrawableReservedVertexOnlyUBO, @@ -37,7 +33,7 @@ struct alignas(16) ClipUBO { }; static_assert(sizeof(ClipUBO) == 5 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -49,7 +45,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = CLIPPING_MASK_SHADER_PRELUDE R"( + static constexpr auto prelude = clippingMaskShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 position [[attribute(clippingMaskUBOCount + 0)]]; }; diff --git a/include/mbgl/shaders/mtl/collision.hpp b/include/mbgl/shaders/mtl/collision.hpp index ad62b6638af5..79a21da87db6 100644 --- a/include/mbgl/shaders/mtl/collision.hpp +++ b/include/mbgl/shaders/mtl/collision.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define COLLISION_SHADER_COMMON \ - R"( +constexpr auto collisionShaderPrelude = R"( enum { idCollisionDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -30,7 +29,7 @@ struct alignas(16) CollisionTilePropsUBO { }; static_assert(sizeof(CollisionTilePropsUBO) == 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -42,7 +41,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = COLLISION_SHADER_COMMON R"( + static constexpr auto prelude = collisionShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(collisionUBOCount + 0)]]; @@ -115,7 +115,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = COLLISION_SHADER_COMMON R"( + static constexpr auto prelude = collisionShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(collisionUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/custom_symbol_icon.hpp b/include/mbgl/shaders/mtl/custom_symbol_icon.hpp index 82581e74d370..a497f9fdaa23 100644 --- a/include/mbgl/shaders/mtl/custom_symbol_icon.hpp +++ b/include/mbgl/shaders/mtl/custom_symbol_icon.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define CUSTOM_SYMBOL_ICON_SHADER_PRELUDE \ - R"( +constexpr auto customSymbolIconShaderPrelude = R"( enum { idCustomSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -31,7 +30,7 @@ struct alignas(16) CustomSymbolIconDrawableUBO { }; static_assert(sizeof(CustomSymbolIconDrawableUBO) == 7 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -43,7 +42,9 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( + static constexpr auto prelude = customSymbolIconShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { float2 a_pos [[attribute(customSymbolUBOCount + 0)]]; float2 a_tex [[attribute(customSymbolUBOCount + 1)]]; diff --git a/include/mbgl/shaders/mtl/debug.hpp b/include/mbgl/shaders/mtl/debug.hpp index 633c6a0a985d..e252f38636a4 100644 --- a/include/mbgl/shaders/mtl/debug.hpp +++ b/include/mbgl/shaders/mtl/debug.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define DEBUG_SHADER_PRELUDE \ - R"( +constexpr auto debugShaderPrelude = R"( enum { idDebugUBO = drawableReservedUBOCount, @@ -26,7 +25,7 @@ struct alignas(16) DebugUBO { }; static_assert(sizeof(DebugUBO) == 6 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -38,7 +37,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = DEBUG_SHADER_PRELUDE R"( + static constexpr auto prelude = debugShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(debugUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/fill.hpp b/include/mbgl/shaders/mtl/fill.hpp index b589a8dca4d3..cc908d3d8bdc 100644 --- a/include/mbgl/shaders/mtl/fill.hpp +++ b/include/mbgl/shaders/mtl/fill.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define FILL_SHADER_COMMON \ - R"( +constexpr auto fillShaderPrelude = R"( enum { idFillDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -139,7 +138,7 @@ union FillTilePropsUnionUBO { FillOutlinePatternTilePropsUBO fillOutlinePatternTilePropsUBO; }; -)" +)"; template <> struct ShaderSource { @@ -151,7 +150,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 position [[attribute(fillUBOCount + 0)]]; @@ -225,7 +225,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 position [[attribute(fillUBOCount + 0)]]; float4 outline_color [[attribute(fillUBOCount + 1)]]; @@ -302,7 +304,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 position [[attribute(fillUBOCount + 0)]]; @@ -443,7 +447,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 position [[attribute(fillUBOCount + 0)]]; @@ -597,7 +602,9 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos_normal [[attribute(fillUBOCount + 0)]]; uchar4 data [[attribute(fillUBOCount + 1)]]; diff --git a/include/mbgl/shaders/mtl/fill_extrusion.hpp b/include/mbgl/shaders/mtl/fill_extrusion.hpp index 4a5e05663f31..0ac9350ebd49 100644 --- a/include/mbgl/shaders/mtl/fill_extrusion.hpp +++ b/include/mbgl/shaders/mtl/fill_extrusion.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define FILL_EXTRUSION_SHADER_COMMON \ - R"( +constexpr auto fillExtrusionShaderPrelude = R"( enum { idFillExtrusionDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -62,7 +61,7 @@ struct alignas(16) FillExtrusionPropsUBO { }; static_assert(sizeof(FillExtrusionPropsUBO) == 5 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -74,7 +73,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto prelude = fillExtrusionShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos [[attribute(fillExtrusionUBOCount + 0)]]; short4 normal_ed [[attribute(fillExtrusionUBOCount + 1)]]; @@ -193,7 +194,9 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto source = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto prelude = fillExtrusionShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos [[attribute(fillExtrusionUBOCount + 0)]]; short4 normal_ed [[attribute(fillExtrusionUBOCount + 1)]]; diff --git a/include/mbgl/shaders/mtl/heatmap.hpp b/include/mbgl/shaders/mtl/heatmap.hpp index 81e4c25e4ba1..ead80d8ab33b 100644 --- a/include/mbgl/shaders/mtl/heatmap.hpp +++ b/include/mbgl/shaders/mtl/heatmap.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define HEATMAP_SHADER_PRELUDE \ - R"( +constexpr auto heatmapShaderPrelude = R"( enum { idHeatmapDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -38,7 +37,7 @@ struct alignas(16) HeatmapEvaluatedPropsUBO { }; static_assert(sizeof(HeatmapEvaluatedPropsUBO) == 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -50,7 +49,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = HEATMAP_SHADER_PRELUDE R"( + static constexpr auto prelude = heatmapShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(heatmapUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/heatmap_texture.hpp b/include/mbgl/shaders/mtl/heatmap_texture.hpp index e32b2fdb53db..767b77847edb 100644 --- a/include/mbgl/shaders/mtl/heatmap_texture.hpp +++ b/include/mbgl/shaders/mtl/heatmap_texture.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define HEATMAP_TEXTURE_SHADER_PRELUDE \ - R"( +constexpr auto heatmapTextureShaderPrelude = R"( enum { idHeatmapTexturePropsUBO = drawableReservedUBOCount, @@ -25,7 +24,7 @@ struct alignas(16) HeatmapTexturePropsUBO { }; static_assert(sizeof(HeatmapTexturePropsUBO) == 5 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -37,7 +36,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = HEATMAP_TEXTURE_SHADER_PRELUDE R"( + static constexpr auto prelude = heatmapTextureShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(heatmapTextureUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/hillshade.hpp b/include/mbgl/shaders/mtl/hillshade.hpp index 39e5c74135e9..f51f4b7a7ada 100644 --- a/include/mbgl/shaders/mtl/hillshade.hpp +++ b/include/mbgl/shaders/mtl/hillshade.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define HILLSHADE_SHADER_PRELUDE \ - R"( +constexpr auto hillshadeShaderPrelude = R"( enum { idHillshadeDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -39,7 +38,7 @@ struct alignas(16) HillshadeEvaluatedPropsUBO { }; static_assert(sizeof(HillshadeEvaluatedPropsUBO) == 3 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -51,7 +50,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = HILLSHADE_SHADER_PRELUDE R"( + static constexpr auto prelude = hillshadeShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(hillshadeUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/hillshade_prepare.hpp b/include/mbgl/shaders/mtl/hillshade_prepare.hpp index 8b3770b4d611..6d7ddcf01a7e 100644 --- a/include/mbgl/shaders/mtl/hillshade_prepare.hpp +++ b/include/mbgl/shaders/mtl/hillshade_prepare.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define HILLSHADE_PREPARE_SHADER_PRELUDE \ - R"( +constexpr auto hillshadePrepareShaderPrelude = R"( enum { idHillshadePrepareDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -31,7 +30,7 @@ struct alignas(16) HillshadePrepareTilePropsUBO { }; static_assert(sizeof(HillshadePrepareTilePropsUBO) == 2 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -43,7 +42,9 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = HILLSHADE_PREPARE_SHADER_PRELUDE R"( + static constexpr auto prelude = hillshadePrepareShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos [[attribute(hillshadePrepareUBOCount + 0)]]; short2 texture_pos [[attribute(hillshadePrepareUBOCount + 1)]]; diff --git a/include/mbgl/shaders/mtl/line.hpp b/include/mbgl/shaders/mtl/line.hpp index b95c3d0c666f..5ca7dcb78dce 100644 --- a/include/mbgl/shaders/mtl/line.hpp +++ b/include/mbgl/shaders/mtl/line.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define LINE_SHADER_COMMON \ - R"( +constexpr auto lineShadePrelude = R"( enum { idLineDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -171,7 +170,7 @@ union LineTilePropsUnionUBO { LineSDFTilePropsUBO lineSDFTilePropsUBO; }; -)" +)"; template <> struct ShaderSource { @@ -183,7 +182,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -361,7 +362,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -526,7 +529,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; @@ -761,7 +766,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto source = R"( + struct VertexStage { short2 pos_normal [[attribute(lineUBOCount + 0)]]; uchar4 data [[attribute(lineUBOCount + 1)]]; diff --git a/include/mbgl/shaders/mtl/raster.hpp b/include/mbgl/shaders/mtl/raster.hpp index 22b1e995512c..399d0ca0b46b 100644 --- a/include/mbgl/shaders/mtl/raster.hpp +++ b/include/mbgl/shaders/mtl/raster.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define RASTER_SHADER_PRELUDE \ - R"( +constexpr auto rasterShaderPrelude = R"( enum { idRasterDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -40,7 +39,7 @@ struct alignas(16) RasterEvaluatedPropsUBO { }; static_assert(sizeof(RasterEvaluatedPropsUBO) == 4 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -52,7 +51,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = RASTER_SHADER_PRELUDE R"( + static constexpr auto prelude = rasterShaderPrelude; + static constexpr auto source = R"( struct VertexStage { short2 pos [[attribute(rasterUBOCount + 0)]]; diff --git a/include/mbgl/shaders/mtl/shader_group.hpp b/include/mbgl/shaders/mtl/shader_group.hpp index 111332a0ca3c..8a5d507270b8 100644 --- a/include/mbgl/shaders/mtl/shader_group.hpp +++ b/include/mbgl/shaders/mtl/shader_group.hpp @@ -48,6 +48,7 @@ class ShaderGroup final : public ShaderGroupBase { std::string_view /*firstAttribName*/) override { using ShaderSource = shaders::ShaderSource; constexpr auto& name = ShaderSource::name; + constexpr auto& prelude = ShaderSource::prelude; constexpr auto& source = ShaderSource::source; constexpr auto& vertMain = ShaderSource::vertexMainFunction; constexpr auto& fragMain = ShaderSource::fragmentMainFunction; @@ -63,7 +64,7 @@ class ShaderGroup final : public ShaderGroupBase { addAdditionalDefines(propertiesAsUniforms, additionalDefines); auto& context = static_cast(gfxContext); - const auto shaderSource = std::string(shaders::prelude) + source; + const auto shaderSource = std::string(shaders::prelude) + prelude + source; shader = context.createProgram( ShaderID, shaderName, shaderSource, vertMain, fragMain, programParameters, additionalDefines); assert(shader); diff --git a/include/mbgl/shaders/mtl/symbol.hpp b/include/mbgl/shaders/mtl/symbol.hpp index e3e9bcf91589..df3e754dc65a 100644 --- a/include/mbgl/shaders/mtl/symbol.hpp +++ b/include/mbgl/shaders/mtl/symbol.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define SYMBOL_SHADER_COMMON \ - R"( +constexpr auto symbolShaderPrelude = R"( enum { idSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, @@ -71,7 +70,7 @@ struct alignas(16) SymbolEvaluatedPropsUBO { }; static_assert(sizeof(SymbolEvaluatedPropsUBO) == 6 * 16, "wrong size"); -)" +)"; template <> struct ShaderSource { @@ -83,7 +82,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { float4 pos_offset [[attribute(symbolUBOCount + 0)]]; float4 data [[attribute(symbolUBOCount + 1)]]; @@ -219,7 +220,9 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto source = R"( + struct VertexStage { float4 pos_offset [[attribute(symbolUBOCount + 0)]]; float4 data [[attribute(symbolUBOCount + 1)]]; @@ -426,7 +429,9 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto source = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto source = R"( + #define SDF 1.0 #define ICON 0.0 diff --git a/include/mbgl/shaders/mtl/widevector.hpp b/include/mbgl/shaders/mtl/widevector.hpp index ba18276c5c63..f312d2dc6029 100644 --- a/include/mbgl/shaders/mtl/widevector.hpp +++ b/include/mbgl/shaders/mtl/widevector.hpp @@ -7,8 +7,7 @@ namespace mbgl { namespace shaders { -#define WIDEVECTOR_SHADER_PRELUDE \ - R"( +constexpr auto wideVectorShaderPrelude = R"( enum { idWideVectorUniformsUBO = idDrawableReservedVertexOnlyUBO, @@ -16,7 +15,7 @@ enum { wideVectorUBOCount }; -)" +)"; template <> struct ShaderSource { @@ -28,8 +27,8 @@ struct ShaderSource { static const std::array instanceAttributes; static const std::array textures; - static constexpr auto source = WIDEVECTOR_SHADER_PRELUDE R"( -#include + static constexpr auto prelude = wideVectorShaderPrelude; + static constexpr auto source = R"( namespace WhirlyKitShader { From 20f1a03c9135f33a5b040902aee10ae347ef7045 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 13 Jan 2025 18:27:36 +0100 Subject: [PATCH 040/339] Add benchmark and test for color parser (#3139) --- benchmark/CMakeLists.txt | 1 + benchmark/util/color.benchmark.cpp | 31 +++++++++++++ benchmark/util/tilecover.benchmark.cpp | 10 ++-- test/CMakeLists.txt | 1 + test/util/color.test.cpp | 63 ++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 benchmark/util/color.benchmark.cpp create mode 100644 test/util/color.test.cpp diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index ed085650a91d..818ab90e00c1 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -11,6 +11,7 @@ add_library( ${PROJECT_SOURCE_DIR}/benchmark/src/mbgl/benchmark/benchmark.cpp ${PROJECT_SOURCE_DIR}/benchmark/storage/offline_database.benchmark.cpp ${PROJECT_SOURCE_DIR}/benchmark/util/tilecover.benchmark.cpp + ${PROJECT_SOURCE_DIR}/benchmark/util/color.benchmark.cpp ) target_include_directories( diff --git a/benchmark/util/color.benchmark.cpp b/benchmark/util/color.benchmark.cpp new file mode 100644 index 000000000000..a6b90d0ebf62 --- /dev/null +++ b/benchmark/util/color.benchmark.cpp @@ -0,0 +1,31 @@ +#include + +#include +#include +#include + +static const std::vector testStrings = {"#000000", + "#FFFFFF", + "#FF00FFAA", + "rgba(255, 0, 0, 1.0)", + "rgb(0, 255, 0)", + "blue", + "red", + "invalid-color", + "rgba(255, 255, 255, 0.5)", + "#123"}; + +namespace { + +void ColorParse(benchmark::State& state) { + for (auto _ : state) { + for (const auto& str : testStrings) { + auto result = mbgl::Color::parse(str); + benchmark::DoNotOptimize(result); + } + } +} + +}; // namespace + +BENCHMARK(ColorParse); diff --git a/benchmark/util/tilecover.benchmark.cpp b/benchmark/util/tilecover.benchmark.cpp index b3c63c61e811..dde9f3e9e2b5 100644 --- a/benchmark/util/tilecover.benchmark.cpp +++ b/benchmark/util/tilecover.benchmark.cpp @@ -15,7 +15,7 @@ static void TileCountBounds(benchmark::State& state) { auto count = util::tileCount(sanFrancisco, 10); length += count; } - (void)length; + benchmark::DoNotOptimize(length); } static void TileCoverPitchedViewport(benchmark::State& state) { @@ -29,7 +29,7 @@ static void TileCoverPitchedViewport(benchmark::State& state) { auto tiles = util::tileCover(transform.getState(), 8); length += tiles.size(); } - (void)length; + benchmark::DoNotOptimize(length); } static void TileCoverBounds(benchmark::State& state) { @@ -38,7 +38,7 @@ static void TileCoverBounds(benchmark::State& state) { auto tiles = util::tileCover(sanFrancisco, 8); length += tiles.size(); } - (void)length; + benchmark::DoNotOptimize(length); } static const auto geomPolygon = Polygon{ @@ -62,7 +62,7 @@ static void TileCoverPolygon(benchmark::State& state) { auto tiles = util::tileCover(geomPolygon, 8); length += tiles.size(); } - (void)length; + benchmark::DoNotOptimize(length); } static void TileCountPolygon(benchmark::State& state) { @@ -72,7 +72,7 @@ static void TileCountPolygon(benchmark::State& state) { auto tiles = util::tileCount(geomPolygon, 16); length += tiles; } - (void)length; + benchmark::DoNotOptimize(length); } BENCHMARK(TileCountBounds); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2955aa3a51bf..3469349c0482 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -89,6 +89,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/util/async_task.test.cpp ${PROJECT_SOURCE_DIR}/test/util/bounding_volumes.test.cpp ${PROJECT_SOURCE_DIR}/test/util/camera.test.cpp + ${PROJECT_SOURCE_DIR}/test/util/color.test.cpp ${PROJECT_SOURCE_DIR}/test/util/geo.test.cpp ${PROJECT_SOURCE_DIR}/test/util/grid_index.test.cpp ${PROJECT_SOURCE_DIR}/test/util/hash.test.cpp diff --git a/test/util/color.test.cpp b/test/util/color.test.cpp new file mode 100644 index 000000000000..dd3f67df8bab --- /dev/null +++ b/test/util/color.test.cpp @@ -0,0 +1,63 @@ +#include +#include +#include + +#include + +using namespace mbgl; + +void logUnexpectedValidResult(const std::string& input, const Color& color) { + std::cerr << "Unexpected valid result for input: " << input << "\n"; + std::cerr << "Parsed Color: r = " << color.r << ", g = " << color.g << ", b = " << color.b << ", a = " << color.a + << "\n"; +} + +const std::map> testCases = { + // Valid inputs + {"#000000", Color(0.0f, 0.0f, 0.0f, 1.0f)}, + {"#FFFFFF", Color(1.0f, 1.0f, 1.0f, 1.0f)}, + {"#FF0000", Color(1.0f, 0.0f, 0.0f, 1.0f)}, + {"rgba(255, 0, 0, 1.0)", Color(1.0f, 0.0f, 0.0f, 1.0f)}, + {"rgb(0, 255, 0)", Color(0.0f, 1.0f, 0.0f, 1.0f)}, + {"blue", Color::blue()}, + {"red", Color::red()}, + {"rgba(0, 0, 0, 0)", Color(0.0f, 0.0f, 0.0f, 0.0f)}, + {"#123", Color(0.067f, 0.133f, 0.2f, 1.0f)}, // Short hex format + {"rgb(-10, 0, 0)", Color(0.0f, 0.0f, 0.0f, 1.0f)}, // Clamped to 0 + {"rgba(300, 0, 0, 1.0)", Color(1.0f, 0.0f, 0.0f, 1.0f)}, // Clamped to 1 + // {"#GGGGGG", Color(0.0f, 0.0f, 0.0f, 1.0f)}, // Treated as fallback black + // not supported right now + // {"#0F0F", Color(0.0f, 1.0f, 0.0f, 1.0f)}, + // {"#123F", Color( + // static_cast(0x1) / (0xF + 1), + // static_cast(0x2) / (0xF + 1), + // static_cast(0x3) / (0xF + 1), + // static_cast(0x4) / (0xF + 1) + // )}, + + // Invalid inputs + {"not-a-color", std::nullopt}, + {"", std::nullopt}, +}; + +TEST(ColorParse, AllCases) { + constexpr float absError = 0.02f; + for (const auto& [input, expectedResult] : testCases) { + auto result = Color::parse(input); + + if (expectedResult.has_value()) { + // Valid case: Check the values + ASSERT_TRUE(result.has_value()); + EXPECT_NEAR(result->r, expectedResult->r, absError); + EXPECT_NEAR(result->g, expectedResult->g, absError); + EXPECT_NEAR(result->b, expectedResult->b, absError); + EXPECT_NEAR(result->a, expectedResult->a, absError); + } else { + // Invalid case: Ensure no value is returned + if (result.has_value()) { + logUnexpectedValidResult(input, *result); + } + EXPECT_FALSE(result.has_value()); + } + } +} From 79d625b03c9637b3e0f6b4639ab50eb0615b8d91 Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Tue, 14 Jan 2025 06:45:33 +0100 Subject: [PATCH 041/339] [qt] Drop support for Qt5 and update to Qt 6.8.1 (#3138) --- .github/actions/qt5-build/Dockerfile | 5 -- .github/actions/qt5-build/action.yml | 6 -- .github/actions/qt5-build/entrypoint.sh | 19 ----- .github/workflows/qt-ci.yml | 70 +++++-------------- platform/qt/qt.cmake | 2 +- platform/qt/src/mbgl/http_file_source.cpp | 11 --- platform/qt/src/mbgl/image.cpp | 5 -- .../qt/src/mbgl/local_glyph_rasterizer.cpp | 9 --- platform/qt/src/mbgl/sqlite3.cpp | 8 --- platform/qt/src/mbgl/timer.cpp | 8 --- 10 files changed, 17 insertions(+), 126 deletions(-) delete mode 100644 .github/actions/qt5-build/Dockerfile delete mode 100644 .github/actions/qt5-build/action.yml delete mode 100755 .github/actions/qt5-build/entrypoint.sh diff --git a/.github/actions/qt5-build/Dockerfile b/.github/actions/qt5-build/Dockerfile deleted file mode 100644 index 66b144e83d17..000000000000 --- a/.github/actions/qt5-build/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ghcr.io/maplibre/linux-builder:centos7-gcc11 - -# Copy and set the entry point -COPY entrypoint.sh /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] diff --git a/.github/actions/qt5-build/action.yml b/.github/actions/qt5-build/action.yml deleted file mode 100644 index c0dcb66689a4..000000000000 --- a/.github/actions/qt5-build/action.yml +++ /dev/null @@ -1,6 +0,0 @@ -# action.yml -name: 'Qt5 Linux Builder' -description: 'Helper action to build in a specific Docker container' -runs: - using: 'docker' - image: 'Dockerfile' diff --git a/.github/actions/qt5-build/entrypoint.sh b/.github/actions/qt5-build/entrypoint.sh deleted file mode 100755 index e651013cda78..000000000000 --- a/.github/actions/qt5-build/entrypoint.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -l - -source scl_source enable devtoolset-11 rh-git218 - -set -e -set -x - -export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache" -export PATH="$QT_ROOT_DIR/bin:$PATH" - -mkdir build && cd build -cmake ../source/ \ - -G Ninja \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DMLN_WITH_QT=ON \ - -DMLN_QT_IGNORE_ICU=OFF -ninja diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index 521f0217963e..e889c5cd685a 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -60,64 +60,40 @@ jobs: matrix: include: - name: Linux - os: ubuntu-22.04 - build_type: RelWithDebInfo - qt_version: 5.15.2 - qt_target: desktop - compiler: "" - - name: Linux - os: ubuntu-22.04 + os: ubuntu-24.04 build_type: RelWithDebInfo - qt_version: 6.7.0 + qt_version: 6.8.1 qt_target: desktop compiler: "" - name: Linux_GCC13 os: ubuntu-24.04 build_type: RelWithDebInfo - qt_version: 6.7.0 + qt_version: 6.8.1 qt_target: desktop compiler: "gcc-13" - - name: macOS - os: macos-13 - build_type: RelWithDebInfo - qt_version: 5.15.2 - qt_target: desktop - deployment_target: 10.15 - deployment_arch: "x86_64" - compiler: "" - name: macOS os: macos-14 build_type: RelWithDebInfo - qt_version: 6.7.0 + qt_version: 6.8.1 qt_target: desktop - deployment_target: 11.0 + deployment_target: 12.0 deployment_arch: "x86_64;arm64" compiler: "" - - name: macOS_LLVM18 + - name: macOS_LLVM os: macos-14 build_type: RelWithDebInfo - qt_version: 6.7.0 + qt_version: 6.8.1 qt_target: desktop - deployment_target: 11.0 + deployment_target: 12.0 deployment_arch: "arm64" compiler: "llvm" - - name: win64_msvc2019 - os: windows-2022 - build_type: "RelWithDebInfo" - compiler_type: x64 - compiler_version: 14.29 - qt_version: 5.15.2 - qt_target: desktop - qt_arch: win64_msvc2019_64 - qt_tools: "" - - name: win64_msvc2019 + - name: win64_msvc2022 os: windows-2022 build_type: "RelWithDebInfo" compiler_type: x64 - compiler_version: 14.29 - qt_version: 6.7.0 + qt_version: 6.8.1 qt_target: desktop - qt_arch: win64_msvc2019_64 + qt_arch: win64_msvc2022_64 qt_tools: "" runs-on: ${{ matrix.os }} env: @@ -200,11 +176,10 @@ jobs: xcode-version: latest-stable - name: Setup MSVC - if: matrix.qt_arch == 'win64_msvc2019_64' + if: matrix.qt_arch == 'win64_msvc2022_64' uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{ matrix.compiler_type }} - toolset: ${{ matrix.compiler_version }} - name: Setup ninja uses: seanmiddleditch/gha-setup-ninja@v5 @@ -220,15 +195,6 @@ jobs: tools: ${{ matrix.qt_tools }} extra: --base https://mirrors.ocf.berkeley.edu/qt/ - - name: Update ccache - if: runner.os == 'Windows' - shell: bash - run: | - # version is pinned due to issues with caching MSVC in 4.8 - choco.exe install ccache --version=4.7.5 --no-progress - ccache.exe --version - echo "CCACHE_CONFIGPATH=C:/Users/runneradmin/AppData/Roaming/ccache/ccache.conf" >> "$GITHUB_ENV" - - name: Set up ccache uses: hendrikmuhs/ccache-action@v1 with: @@ -249,16 +215,12 @@ jobs: -DMLN_WITH_QT=ON ninja - - name: Build maplibre-native (Linux, Qt5) - if: runner.os == 'Linux' && matrix.qt_version == '5.15.2' - uses: ./source/.github/actions/qt5-build - - name: Build maplibre-native (Linux, Qt6) - if: runner.os == 'Linux' && matrix.qt_version != '5.15.2' && matrix.compiler == '' + if: runner.os == 'Linux' && matrix.compiler == '' uses: ./source/.github/actions/qt6-build - name: Build maplibre-native (Linux, Qt6, custom compiler) - if: runner.os == 'Linux' && matrix.qt_version != '5.15.2' && matrix.compiler != '' + if: runner.os == 'Linux' && matrix.compiler != '' run: | mkdir build && cd build qt-cmake ../source/ \ @@ -270,7 +232,7 @@ jobs: ninja - name: Build maplibre-native (Linux, Qt6, custom compiler, internal libraries) - if: runner.os == 'Linux' && matrix.qt_version != '5.15.2' && matrix.compiler != '' + if: runner.os == 'Linux' && matrix.compiler != '' run: | mkdir build-internal && cd build-internal qt-cmake ../source/ \ @@ -284,7 +246,7 @@ jobs: ninja - name: Run tests (Linux) - if: runner.os == 'Linux' && matrix.qt_version != '5.15.2' && matrix.compiler != '' + if: runner.os == 'Linux' && matrix.compiler != '' uses: coactions/setup-xvfb@v1 with: run: ctest --output-on-failure diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 04920ca8b385..c6ae2394b986 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -32,7 +32,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") endif() if("${QT_VERSION_MAJOR}" STREQUAL "") - find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) + find_package(QT NAMES Qt6 COMPONENTS Core REQUIRED) else() find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) endif() diff --git a/platform/qt/src/mbgl/http_file_source.cpp b/platform/qt/src/mbgl/http_file_source.cpp index d8039fac65dd..b5885940c153 100644 --- a/platform/qt/src/mbgl/http_file_source.cpp +++ b/platform/qt/src/mbgl/http_file_source.cpp @@ -30,21 +30,10 @@ void HTTPFileSource::Impl::request(HTTPRequest* req) { } QNetworkRequest networkRequest = req->networkRequest(); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) - networkRequest.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); -#elif QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) - networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); -#endif -#endif data.first = m_manager->get(networkRequest); connect(data.first, &QNetworkReply::finished, this, &HTTPFileSource::Impl::onReplyFinished); -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) connect(data.first, &QNetworkReply::errorOccurred, this, &HTTPFileSource::Impl::onReplyFinished); -#else - connect(data.first, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyFinished())); -#endif } void HTTPFileSource::Impl::cancel(HTTPRequest* req) { diff --git a/platform/qt/src/mbgl/image.cpp b/platform/qt/src/mbgl/image.cpp index a4a69a494f81..e666550b3f2c 100644 --- a/platform/qt/src/mbgl/image.cpp +++ b/platform/qt/src/mbgl/image.cpp @@ -43,13 +43,8 @@ PremultipliedImage decodeImage(const std::string& string) { throw std::runtime_error("Unsupported image type"); } -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) auto img = std::make_unique(image.sizeInBytes()); memcpy(img.get(), image.constBits(), image.sizeInBytes()); -#else - auto img = std::make_unique(image.byteCount()); - memcpy(img.get(), image.constBits(), image.byteCount()); -#endif return {{static_cast(image.width()), static_cast(image.height())}, std::move(img)}; } diff --git a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp index 3a3e7c278c05..a123d2238d82 100644 --- a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp +++ b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp @@ -53,11 +53,7 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { return glyph; } -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID); -#else - glyph.metrics.width = impl->metrics->width(glyphID); -#endif glyph.metrics.height = impl->metrics->height(); glyph.metrics.left = 3; glyph.metrics.top = -8; @@ -73,13 +69,8 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { // Render at constant baseline, to align with glyphs that are rendered by node-fontnik. painter.drawText(QPointF(0, 20), QString(QChar(glyphID))); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) auto img = std::make_unique(image.sizeInBytes()); memcpy(img.get(), image.constBits(), image.sizeInBytes()); -#else - auto img = std::make_unique(image.byteCount()); - memcpy(img.get(), image.constBits(), image.byteCount()); -#endif glyph.bitmap = AlphaImage{size, std::move(img)}; diff --git a/platform/qt/src/mbgl/sqlite3.cpp b/platform/qt/src/mbgl/sqlite3.cpp index 7300241a3ee2..5446e4a5c753 100644 --- a/platform/qt/src/mbgl/sqlite3.cpp +++ b/platform/qt/src/mbgl/sqlite3.cpp @@ -169,11 +169,7 @@ void Database::exec(const std::string& sql) { } void DatabaseImpl::exec(const std::string& sql) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) QStringList statements = QString::fromStdString(sql).split(';', Qt::SkipEmptyParts); -#else - QStringList statements = QString::fromStdString(sql).split(';', QString::SkipEmptyParts); -#endif statements.removeAll("\n"); for (QString statement : statements) { if (!statement.endsWith(';')) { @@ -233,11 +229,7 @@ template <> void Query::bind(int offset, std::nullptr_t) { assert(stmt.impl); // Field numbering starts at 0. -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) stmt.impl->query.bindValue(offset - 1, QVariant(), QSql::In); -#else - stmt.impl->query.bindValue(offset - 1, QVariant(QVariant::Invalid), QSql::In); -#endif checkQueryError(stmt.impl->query); } diff --git a/platform/qt/src/mbgl/timer.cpp b/platform/qt/src/mbgl/timer.cpp index 2980c9de9ec1..34a815e2b8ae 100644 --- a/platform/qt/src/mbgl/timer.cpp +++ b/platform/qt/src/mbgl/timer.cpp @@ -18,11 +18,7 @@ void Timer::Impl::start(uint64_t timeout, uint64_t repeat_, std::function= QT_VERSION_CHECK(5, 8, 0) timer.start(static_cast(timeout)); -#else - timer.start(static_cast(timeout)); -#endif } void Timer::Impl::stop() { @@ -32,11 +28,7 @@ void Timer::Impl::stop() { void Timer::Impl::timerFired() { if (repeat) { timer.setSingleShot(false); -#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) timer.start(static_cast(repeat)); -#else - timer.start(static_cast(repeat)); -#endif } callback(); From 527e70b6fa7f2ff1d3c7546f1773c5404b8a3733 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 16 Jan 2025 16:01:11 +0100 Subject: [PATCH 042/339] Allow compiling with Rust code (#3137) Co-authored-by: Yuri Astrakhan Co-authored-by: Ian Wagner --- .bazelversion | 2 +- .github/workflows/linux-ci.yml | 15 ++- .pre-commit-config.yaml | 7 ++ BUILD.bazel | 23 ++++- CMakeLists.txt | 23 +++-- MODULE.bazel | 35 ++++++- bazel/core.bzl | 10 +- docker/Dockerfile | 21 ++++- docker/startup.sh | 42 ++++++++- docs/mdbook/src/SUMMARY.md | 2 + docs/mdbook/src/rust.md | 67 ++++++++++++++ rustutils/.gitignore | 1 + rustutils/BUILD.bazel | 46 ++++++++++ rustutils/Cargo.lock | 162 +++++++++++++++++++++++++++++++++ rustutils/Cargo.toml | 19 ++++ rustutils/generate.sh | 35 +++++++ rustutils/rustutils.cmake | 63 +++++++++++++ rustutils/src/color.rs | 35 +++++++ rustutils/src/lib.rs | 1 + scripts/license.cmake | 2 +- src/mbgl/util/color.cpp | 2 +- src/mbgl/util/color.rs.cpp | 58 ++++++++++++ test/util/color.test.cpp | 1 + 23 files changed, 648 insertions(+), 24 deletions(-) create mode 100644 docs/mdbook/src/rust.md create mode 100644 rustutils/.gitignore create mode 100644 rustutils/BUILD.bazel create mode 100644 rustutils/Cargo.lock create mode 100644 rustutils/Cargo.toml create mode 100755 rustutils/generate.sh create mode 100644 rustutils/rustutils.cmake create mode 100644 rustutils/src/color.rs create mode 100644 rustutils/src/lib.rs create mode 100644 src/mbgl/util/color.rs.cpp diff --git a/.bazelversion b/.bazelversion index 643916c03f1f..ae9a76b9249a 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.3.1 +8.0.0 diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 97b90961f824..9293f241065d 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -37,6 +37,7 @@ jobs: - name: Get all Linux files that have changed if: github.event_name != 'workflow_dispatch' id: changed-files + uses: tj-actions/changed-files@v45 with: files_yaml_from_source_file: .github/changed-files.yml @@ -52,7 +53,7 @@ jobs: strategy: fail-fast: true matrix: - renderer: [legacy, drawable, vulkan] + renderer: [legacy, drawable, vulkan, drawable-rust] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -91,6 +92,11 @@ jobs: - if: matrix.renderer == 'drawable' run: echo renderer_flag_cmake=-DMLN_DRAWABLE_RENDERER=ON >> "$GITHUB_ENV" + - if: matrix.renderer == 'drawable-rust' + run: | + echo "renderer_flag_cmake=-DMLN_DRAWABLE_RENDERER=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" + cargo install cxxbridge-cmd + - if: matrix.renderer == 'legacy' run: echo renderer_flag_cmake=-DMLN_LEGACY_RENDERER=ON >> "$GITHUB_ENV" @@ -158,7 +164,12 @@ jobs: - name: Run render test id: render_test - run: xvfb-run -a build/mbgl-render-test-runner --manifestPath=metrics/linux-${{ matrix.renderer }}.json + run: | + renderer="${{ matrix.renderer }}" + if [[ "$renderer" == *-rust ]]; then + renderer=${renderer%-rust} + fi + xvfb-run -a build/mbgl-render-test-runner --manifestPath=metrics/linux-"$renderer".json - name: Upload render test result if: always() && steps.render_test.outcome == 'failure' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5482b7ab088a..25392ab37d5d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,6 +24,13 @@ repos: hooks: - id: swiftformat args: [--swiftversion, "5.8"] +- repo: local + hooks: + - id: rustfmt + name: rustfmt + entry: bash -c 'cd rustutils && cargo fmt' -- + language: rust + types: [rust] ci: # sometimes fails https://github.com/keith/pre-commit-buildifier/issues/13 skip: [buildifier] diff --git a/BUILD.bazel b/BUILD.bazel index 80c7ccf3411d..9b387f5a613b 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,5 +1,5 @@ load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_library", "js_run_binary") -load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag") load("@npm//:defs.bzl", "npm_link_all_packages") load( "//bazel:core.bzl", @@ -124,7 +124,6 @@ cc_library( ":mbgl-core-generated-private-artifacts", ":mbgl-core-generated-public-artifacts", "//vendor:boost", - "//vendor:csscolorparser", "//vendor:earcut.hpp", "//vendor:eternal", "//vendor:mapbox-base", @@ -149,6 +148,13 @@ cc_library( "//vendor:metal-cpp", ], "//conditions:default": [], + }) + select({ + ":rust": [ + "//rustutils:rustutilslib", + ], + "//conditions:default": [ + "//vendor:csscolorparser", + ], }), ) @@ -195,6 +201,19 @@ config_setting( }, ) +bool_flag( + name = "use_rust", + build_setting_default = False, + visibility = ["//visibility:public"], +) + +config_setting( + name = "rust", + flag_values = { + "//:use_rust": "true", + }, +) + exports_files( [ "LICENSE.md", diff --git a/CMakeLists.txt b/CMakeLists.txt index 835aa2b7eecd..3c6b1da70dea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ option(MLN_LEGACY_RENDERER "Include the legacy rendering pathway" ON) option(MLN_DRAWABLE_RENDERER "Include the drawable rendering pathway" OFF) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) +option(MLN_USE_RUST "Use components in Rust" OFF) if (MLN_WITH_CLANG_TIDY) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) @@ -940,7 +941,7 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/chrono.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/client_options.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/util/color.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/util/color$,.rs.cpp,.cpp> ${PROJECT_SOURCE_DIR}/src/mbgl/util/constants.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/convert.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/event.cpp @@ -1458,6 +1459,10 @@ include(${PROJECT_SOURCE_DIR}/vendor/vector-tile.cmake) include(${PROJECT_SOURCE_DIR}/vendor/wagyu.cmake) include(${PROJECT_SOURCE_DIR}/vendor/metal-cpp.cmake) +if(MLN_USE_RUST) +include(${PROJECT_SOURCE_DIR}/rustutils/rustutils.cmake) +endif() + target_link_libraries( mbgl-core PRIVATE @@ -1468,7 +1473,6 @@ target_link_libraries( Mapbox::Base::cheap-ruler-cpp mbgl-compiler-options mbgl-vendor-boost - mbgl-vendor-csscolorparser mbgl-vendor-earcut.hpp mbgl-vendor-eternal mbgl-vendor-parsedate @@ -1479,6 +1483,7 @@ target_link_libraries( mbgl-vendor-vector-tile mbgl-vendor-wagyu $<$:mbgl-vendor-metal-cpp> + $,mbgl-rustutils,mbgl-vendor-csscolorparser> PUBLIC Mapbox::Base Mapbox::Base::Extras::expected-lite @@ -1490,9 +1495,8 @@ target_link_libraries( unordered_dense ) -export(TARGETS +set(EXPORT_TARGETS mbgl-core - mapbox-base mapbox-base-cheap-ruler-cpp mapbox-base-extras-expected-lite @@ -1508,7 +1512,6 @@ export(TARGETS mapbox-base-variant mbgl-compiler-options mbgl-vendor-boost - mbgl-vendor-csscolorparser mbgl-vendor-earcut.hpp mbgl-vendor-eternal mbgl-vendor-parsedate @@ -1520,10 +1523,16 @@ export(TARGETS mbgl-vendor-wagyu mbgl-vendor-metal-cpp unordered_dense - - FILE MapboxCoreTargets.cmake ) +if(MLN_USE_RUST) + list(APPEND EXPORT_TARGETS mbgl-rustutils rustutils) +else() + list(APPEND EXPORT_TARGETS mbgl-vendor-csscolorparser) +endif() + +export(TARGETS ${EXPORT_TARGETS} FILE MapboxCoreTargets.cmake) + if(MLN_WITH_VULKAN) include(${PROJECT_SOURCE_DIR}/vendor/vulkan.cmake) diff --git a/MODULE.bazel b/MODULE.bazel index 9684c906ac82..e71dc40ae567 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,6 +1,6 @@ module(name = "maplibre") -bazel_dep(name = "apple_support", version = "1.17.0", repo_name = "build_bazel_apple_support") +bazel_dep(name = "apple_support", version = "1.17.1", repo_name = "build_bazel_apple_support") bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.10") bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rules_apple") @@ -59,4 +59,35 @@ darwin_config = use_repo_rule("//platform/darwin:bazel/darwin_config_repository_ darwin_config( name = "darwin_config", -) \ No newline at end of file +) + +bazel_dep(name = "rules_rust", version = "0.56.0") +bazel_dep(name = "cxx.rs", version = "1.0.136") +git_override( + module_name = "cxx.rs", + commit = "d54e44698c3fa5833a861cb3ae502533b92f2f57", + remote = "https://github.com/dtolnay/cxx.git", +) + +rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") +rust.toolchain( + edition = "2021", + extra_target_triples = [ + "aarch64-apple-ios-sim", + "x86_64-apple-ios", + "aarch64-apple-ios", + "aarch64-apple-darwin", + "x86_64-apple-darwin", + ], +) +use_repo(rust, "rust_toolchains") + +register_toolchains("@rust_toolchains//:all") + +crate = use_extension("@rules_rust//crate_universe:extensions.bzl", "crate") +crate.from_cargo( + name = "crates", + cargo_lockfile = "//rustutils:Cargo.lock", + manifests = ["//rustutils:Cargo.toml"], +) +use_repo(crate, "crates") diff --git a/bazel/core.bzl b/bazel/core.bzl index 6d7dbca391dc..75a30b5b1526 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -584,7 +584,6 @@ MLN_CORE_SOURCE = [ "src/mbgl/util/bounding_volumes.cpp", "src/mbgl/util/chrono.cpp", "src/mbgl/util/client_options.cpp", - "src/mbgl/util/color.cpp", "src/mbgl/util/constants.cpp", "src/mbgl/util/convert.cpp", "src/mbgl/util/event.cpp", @@ -652,7 +651,14 @@ MLN_CORE_SOURCE = [ "src/mbgl/util/version.cpp", "src/mbgl/util/version.hpp", "src/mbgl/util/work_request.cpp", -] +] + select({ + "//:rust": [ + "src/mbgl/util/color.rs.cpp", + ], + "//conditions:default": [ + "src/mbgl/util/color.cpp", + ], +}) MLN_CORE_HEADERS = [ "include/mbgl/gfx/context.hpp", diff --git a/docker/Dockerfile b/docker/Dockerfile index 0e55ad4718c2..58a4e6ab55be 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,12 +23,16 @@ RUN apt-get update \ ccache \ ninja-build \ pkg-config \ + python3 \ + python3-pip \ + python-is-python3 \ clang-tidy \ && : # end of the RUN cmd - easier to keep a colon at the end of the list, than to keep the backslashes in check # This could also be `.../releases/latest/download/bazelisk-linux-amd64` for the latest version, but for predictability better hardcode it # Detect if current CPU is x64 or ARM64 and download the appropriate binary -RUN if [ "$(uname -m)" = "aarch64" ]; then \ +RUN echo "Download and install Bazel" \ + && if [ "$(uname -m)" = "aarch64" ]; then \ curl -fsSL https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-arm64 -o /usr/local/bin/bazel ;\ else \ curl -fsSL https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-amd64 -o /usr/local/bin/bazel ;\ @@ -36,7 +40,6 @@ RUN if [ "$(uname -m)" = "aarch64" ]; then \ && chmod +x /usr/local/bin/bazel \ && : -WORKDIR /app ARG USERNAME=user ARG USER_UID=1000 @@ -50,11 +53,21 @@ RUN groupadd --force --gid $USER_GID $USERNAME \ && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ && chmod 0440 /etc/sudoers.d/$USERNAME +# This allows users to `docker run` without specifying -u and -g +USER $USERNAME + +RUN pip install pre-commit + +ENV RUSTUP_HOME=/home/$USERNAME/.cache/.rustup \ + CARGO_HOME=/home/$USERNAME/.cache/.cargo \ + PATH=/home/$USERNAME/.cache/.cargo/bin:$PATH + +# As the very last step, copy the startup script +USER root COPY startup.sh /usr/local/bin/startup.sh RUN chmod +x /usr/local/bin/startup.sh - -# This allows users to `docker run` without specifying -u and -g USER $USERNAME +WORKDIR /app ENTRYPOINT ["/usr/local/bin/startup.sh"] CMD ["bash"] diff --git a/docker/startup.sh b/docker/startup.sh index 6bb1f9a17e6b..3a60b8e63e0e 100644 --- a/docker/startup.sh +++ b/docker/startup.sh @@ -1,13 +1,51 @@ #!/bin/sh -if [ ! -d /app/.github ] || [ ! -d /home/user/.cache ]; then +if [ ! -d /app/.github ] || [ ! -d ~/.cache ]; then echo " " echo "ERROR: Docker container was not started properly." echo " From the root of this repo, run the following command." echo " You may add any command to perform in the container at the end of this command." echo " " - echo ' docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/user/.cache" maplibre-native-image' + echo ' docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/'"$USERNAME"'/.cache" maplibre-native-image' exit 1 fi +export PATH="$PATH:~/.local/bin/" + + +# Work in progress: install and configure Swift and pre-commit +# Detect if current CPU is x64 or ARM64 and download the appropriate binary +#RUN echo "Download and install SWIFT" \ +# && if [ "$(uname -m)" = "aarch64" ]; then \ +# curl -fsSL https://download.swift.org/swift-5.10.1-release/ubuntu2204-aarch64/swift-5.10.1-RELEASE/swift-5.10.1-RELEASE-ubuntu22.04-aarch64.tar.gz \ +# -o /tmp/swift.tar.gz ;\ +# else \ +# curl -fsSL https://download.swift.org/swift-5.10.1-release/ubuntu2204/swift-5.10.1-RELEASE/swift-5.10.1-RELEASE-ubuntu22.04.tar.gz \ +# -o /tmp/swift.tar.gz ;\ +# fi \ +# && tar -xzf /tmp/swift.tar.gz -C / --strip-components=1 \ +# && rm /tmp/swift.tar.gz \ +# && : +#if [ ! -f "/app/.git/hooks/pre-commit" ]; then +# echo "Configuring pre-commit git hooks by creating a .git/hooks/pre-commit file..." +# ~/.local/bin/pre-commit install +#fi + + + +if [ ! -f "$CARGO_HOME/env" ]; then + echo "Downloading and installing Rust..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal +fi +. "$CARGO_HOME/env" + + + +if ! command -v cxxbridge > /dev/null; then + echo "Installing cxxbridge..." + cargo install cxxbridge-cmd +fi + + + exec "$@" diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index d07b042abd65..951078c58f44 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -22,3 +22,5 @@ - [Profiling applications that use MapLibre Native](./profiling/README.md) - [Tracy profiling](./profiling/tracy-profiling.md) + +- [Rust](./rust.md) diff --git a/docs/mdbook/src/rust.md b/docs/mdbook/src/rust.md new file mode 100644 index 000000000000..ff2a05321dbc --- /dev/null +++ b/docs/mdbook/src/rust.md @@ -0,0 +1,67 @@ +# Rust + +We have added experimental support for intergrating Rust code into the source tree. + +## Rust Bridge + +The Rust bridge lives in the root `rustutils` directory. + +We use [CXX](https://cxx.rs/) to allow interop between Rust and C++. + +## Building + +### CMake + +When building with CMake, need to have the correct Rust toolchain(s) installed. See [Install Rust](https://www.rust-lang.org/tools/install) to install Rust. + +You can use `rustup` to manage toolchains. Which toolchain you needs depends on your host platform and for what platform you are trying to build. If your host and target platform are the same, you probably have the correct toolchain installed after installing Rust. For example when building for **Android** and building on a **x84 Linux** host you would use the following command: + +``` +rustup target add --toolchain stable-x86_64-unknown-linux-gnu aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android +``` + +See [Platform Support](https://doc.rust-lang.org/nightly/rustc/platform-support.html) in the Rust documentation for more details. You will get a descriptive error message when the correct toolchain is not available, so we don't list all possible combinations here. + +You also need to have cxxbridge installed: + +``` +cargo install cxxbridge-cmd +``` + +Set `-DMLN_USE_RUST=ON` when generating a configuration with CMake. + +### Bazel + +Pass the `--//:use_rust` flag to Bazel commands. + +Note that when [generating an Xcode project](./ios/README.md) you should not pass this option to Bazel directly, but as follows: + +``` +bazel run //platform/ios:xcodeproj --@rules_xcodeproj//xcodeproj:extra_common_flags="--//:renderer=metal --//:use_rust" +``` + +## Creating a new Module + +To create a new module: + +1. Add a new source file to `rustutils/src/example.rs`. +2. Implement it, see the [CXX documentation](https://cxx.rs/index.html) or see `rustutils/src/color.rs` for an example. +3. Create a C++ source file that will use the generated C++ header. See `src/mbgl/util/color.rs.cpp` for an example. Import the generated header with + ``` + #include + ``` +4. Conditionally include either the `*.rs.cpp` file or the `*.cpp` file it replaces in CMake and Bazel. Here is what it looks like for CMake: + ``` + ${PROJECT_SOURCE_DIR}/src/mbgl/util/color$,.rs.cpp,.cpp> + ``` + And here for Bazel: + ``` + select({ + "//:rust": [ + "src/mbgl/util/color.rs.cpp", + ], + "//conditions:default": [ + "src/mbgl/util/color.cpp", + ], + }) + ``` \ No newline at end of file diff --git a/rustutils/.gitignore b/rustutils/.gitignore new file mode 100644 index 000000000000..ea8c4bf7f35f --- /dev/null +++ b/rustutils/.gitignore @@ -0,0 +1 @@ +/target diff --git a/rustutils/BUILD.bazel b/rustutils/BUILD.bazel new file mode 100644 index 000000000000..9c8480dcdd55 --- /dev/null +++ b/rustutils/BUILD.bazel @@ -0,0 +1,46 @@ +load("@rules_rust//rust:defs.bzl", "rust_static_library") + +genrule( + name = "cpp_bindings", + srcs = [ + "src/color.rs", + ], + outs = [ + "cpp/include/rustutils/color.hpp", + "cpp/src/color.rs.cpp", + ], + cmd = "CXXBRIDGE_CMD=$(location @cxx.rs//:codegen) ./$(location :generate.sh) $(@D) $(SRCS)", + # Using the cxxbridge binary built by Bazel + tools = [ + ":generate.sh", + "@cxx.rs//:codegen", + ], +) + +rust_static_library( + name = "rustutils", + srcs = [ + "src/color.rs", + "src/lib.rs", + ], + crate_name = "rustutils", + visibility = ["//visibility:public"], + deps = [ + "@crates//:csscolorparser", + "@crates//:cxx", + ], +) + +cc_library( + name = "rustutilslib", + srcs = [ + ":cpp_bindings", + ], + includes = [ + "cpp/include", + ], + visibility = ["//visibility:public"], + deps = [ + ":rustutils", + ], +) diff --git a/rustutils/Cargo.lock b/rustutils/Cargo.lock new file mode 100644 index 000000000000..16003c0398fc --- /dev/null +++ b/rustutils/Cargo.lock @@ -0,0 +1,162 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cc" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" + +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "phf", +] + +[[package]] +name = "cxx" +version = "1.0.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "273dcfd3acd4e1e276af13ed2a43eea7001318823e7a726a6b3ed39b4acc0b82" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839fcd5e43464614ffaa989eaf1c139ef1f0c51672a1ed08023307fa1b909ccd" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2c1c1776b986979be68bb2285da855f8d8a35851a769fca8740df7c3d07877" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +dependencies = [ + "cc", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rustutils" +version = "0.1.0" +dependencies = [ + "csscolorparser", + "cxx", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "syn" +version = "2.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/rustutils/Cargo.toml b/rustutils/Cargo.toml new file mode 100644 index 000000000000..8d98a0d03c45 --- /dev/null +++ b/rustutils/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "rustutils" +version = "0.1.0" +authors = ["MapLibre contributors"] +description = "Core Rust utilities for MapLibre Native" +edition = "2021" +license = "BSD-2-Clause" +repository = "https://github.com/maplibre/maplibre-native" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +csscolorparser = "0.6.2" +cxx = "1" + +[profile.release] +lto = true +codegen-units = 1 diff --git a/rustutils/generate.sh b/rustutils/generate.sh new file mode 100755 index 000000000000..7b0b3c29e0ac --- /dev/null +++ b/rustutils/generate.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Run this script from the repository root +# Install cxxbridge with: +# $ cargo install cxxbridge-cmd + +set -e + +if [ "$#" -lt 2 ]; then + echo "Error: output_dir and at least one input file are required." >&2 + echo "Usage: $0 [input_file2 ...]" >&2 + exit 1 +fi + +# Use CXXBRIDGE_CMD environment variable if set, otherwise fallback to "cxxbridge" +CXXBRIDGE_CMD="${CXXBRIDGE_CMD:-cxxbridge}" + +output_dir="$1" +shift + +for input_file in "$@"; do + if [[ "$input_file" != *.rs ]]; then + echo "Error: All input files must have a .rs extension. Invalid file: $input_file" >&2 + exit 1 + fi +done + +mkdir -p "$output_dir/cpp/include/rustutils" +mkdir -p "$output_dir/cpp/src" + +for input_file in "$@"; do + base_name=$(basename "$input_file" .rs) + "$CXXBRIDGE_CMD" "$input_file" --header > "$output_dir/cpp/include/rustutils/${base_name}.hpp" + "$CXXBRIDGE_CMD" "$input_file" > "$output_dir/cpp/src/${base_name}.rs.cpp" +done \ No newline at end of file diff --git a/rustutils/rustutils.cmake b/rustutils/rustutils.cmake new file mode 100644 index 000000000000..94decf5cd030 --- /dev/null +++ b/rustutils/rustutils.cmake @@ -0,0 +1,63 @@ +# Include guard +if(TARGET rustutils) + return() +endif() + +include(FetchContent) + +FetchContent_Declare( + Corrosion + GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git + GIT_TAG v0.5 # Optionally specify a commit hash, version tag or branch here +) +FetchContent_MakeAvailable(Corrosion) + +corrosion_import_crate(MANIFEST_PATH ${CMAKE_CURRENT_LIST_DIR}/Cargo.toml) + +# Define output directories for generated bindings +set(RUSTUTILS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rustutils_bindings") +set(RUSTUTILS_INCLUDE_DIR "${RUSTUTILS_OUTPUT_DIR}/cpp/include") +set(RUSTUTILS_SRC_DIR "${RUSTUTILS_OUTPUT_DIR}/cpp/src") + +# Ensure the output directories exist +file(MAKE_DIRECTORY ${RUSTUTILS_INCLUDE_DIR}) +file(MAKE_DIRECTORY ${RUSTUTILS_SRC_DIR}) + +set(RUSTUTILS_RS_FILES + ${CMAKE_CURRENT_LIST_DIR}/src/color.rs +) + +# Initialize variables for generated files +set(RUSTUTILS_GENERATED_SOURCES) +set(RUSTUTILS_GENERATED_HEADERS) + +# Transform .rs to .rs.cpp and .hpp +foreach(rs_file ${RUSTUTILS_RS_FILES}) + get_filename_component(base_name ${rs_file} NAME_WE) + list(APPEND RUSTUTILS_GENERATED_SOURCES "${RUSTUTILS_SRC_DIR}/${base_name}.rs.cpp") + list(APPEND RUSTUTILS_GENERATED_HEADERS "${RUSTUTILS_INCLUDE_DIR}/rustutils/${base_name}.hpp") +endforeach() + +add_custom_command( + OUTPUT ${RUSTUTILS_GENERATED_SOURCES} ${RUSTUTILS_GENERATED_HEADERS} + COMMAND ${CMAKE_COMMAND} -E env + ${CMAKE_CURRENT_LIST_DIR}/generate.sh ${RUSTUTILS_OUTPUT_DIR} ${RUSTUTILS_RS_FILES} + DEPENDS ${CMAKE_CURRENT_LIST_DIR}/generate.sh ${RUSTUTILS_RS_FILES} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMENT "Generating C++ bindings for Rust sources" + VERBATIM +) + +add_custom_target(rustutils_bindings DEPENDS ${RUSTUTILS_GENERATED_SOURCES} ${RUSTUTILS_GENERATED_HEADERS}) + +add_library(mbgl-rustutils STATIC + ${RUSTUTILS_GENERATED_SOURCES} +) + +add_dependencies(mbgl-rustutils rustutils_bindings) + +target_include_directories(mbgl-rustutils PUBLIC + ${RUSTUTILS_INCLUDE_DIR} +) + +target_link_libraries(mbgl-rustutils PUBLIC rustutils) diff --git a/rustutils/src/color.rs b/rustutils/src/color.rs new file mode 100644 index 000000000000..090bb76a8786 --- /dev/null +++ b/rustutils/src/color.rs @@ -0,0 +1,35 @@ +use csscolorparser::Color; + +#[cxx::bridge(namespace = "rustutils")] +mod ffi { + struct ParsedColor { + pub success: bool, + pub r: f32, + pub g: f32, + pub b: f32, + pub a: f32, + } + + extern "Rust" { + fn parse_css_color(css_str: &str) -> ParsedColor; + } +} + +pub fn parse_css_color(css_str: &str) -> ffi::ParsedColor { + css_str + .parse::() + .map(|color| ffi::ParsedColor { + success: true, + r: color.r as f32, + g: color.g as f32, + b: color.b as f32, + a: color.a as f32, + }) + .unwrap_or_else(|_| ffi::ParsedColor { + success: false, + r: 0.0, + g: 0.0, + b: 0.0, + a: 0.0, + }) +} diff --git a/rustutils/src/lib.rs b/rustutils/src/lib.rs new file mode 100644 index 000000000000..459f9e1c9975 --- /dev/null +++ b/rustutils/src/lib.rs @@ -0,0 +1 @@ +mod color; diff --git a/scripts/license.cmake b/scripts/license.cmake index 7c0b0bd10af6..86141540a31d 100644 --- a/scripts/license.cmake +++ b/scripts/license.cmake @@ -2,7 +2,7 @@ function(mbgl_generate_license param) # Fake targets or non relevant. - set(BLACKLIST "mbgl-compiler-options") + set(BLACKLIST "mbgl-compiler-options" "mbgl-rustutils") get_target_property(LIBRARIES ${param} LINK_LIBRARIES) list(INSERT LIBRARIES 0 ${param}) diff --git a/src/mbgl/util/color.cpp b/src/mbgl/util/color.cpp index 44fb65f732ac..cd4258aa44ad 100644 --- a/src/mbgl/util/color.cpp +++ b/src/mbgl/util/color.cpp @@ -6,7 +6,7 @@ namespace mbgl { std::optional Color::parse(const std::string& s) { - auto css_color = CSSColorParser::parse(s); + const auto css_color = CSSColorParser::parse(s); // Premultiply the color. if (css_color) { diff --git a/src/mbgl/util/color.rs.cpp b/src/mbgl/util/color.rs.cpp new file mode 100644 index 000000000000..4dd537015b78 --- /dev/null +++ b/src/mbgl/util/color.rs.cpp @@ -0,0 +1,58 @@ +// This is an interface-compatible file analogous to color.cpp +// which is conditionally compiled when the optional Rust build flag is enabled. +#include + +#include +#include + +#include + +namespace mbgl { + +std::optional Color::parse(const std::string& s) { + const auto css_color = rustutils::parse_css_color(s); + if (css_color.success) { + return {{css_color.r * css_color.a, css_color.g * css_color.a, css_color.b * css_color.a, css_color.a}}; + } else { + return {}; + } +} + +std::string Color::stringify() const { + std::array array = toArray(); + return "rgba(" + util::toString(array[0]) + "," + util::toString(array[1]) + "," + util::toString(array[2]) + "," + + util::toString(array[3]) + ")"; +} + +std::array Color::toArray() const { + if (a == 0) { + return {{0, 0, 0, 0}}; + } else { + return {{ + r * 255 / a, + g * 255 / a, + b * 255 / a, + floor(a * 100 + .5) / 100 // round to 2 decimal places + }}; + } +} + +mbgl::Value Color::toObject() const { + return mapbox::base::ValueObject{{"r", static_cast(r)}, + {"g", static_cast(g)}, + {"b", static_cast(b)}, + {"a", static_cast(a)}}; +} + +mbgl::Value Color::serialize() const { + std::array array = toArray(); + return std::vector{ + std::string("rgba"), + array[0], + array[1], + array[2], + array[3], + }; +} + +} // namespace mbgl diff --git a/test/util/color.test.cpp b/test/util/color.test.cpp index dd3f67df8bab..ef217ec3389b 100644 --- a/test/util/color.test.cpp +++ b/test/util/color.test.cpp @@ -25,6 +25,7 @@ const std::map> testCases = { {"#123", Color(0.067f, 0.133f, 0.2f, 1.0f)}, // Short hex format {"rgb(-10, 0, 0)", Color(0.0f, 0.0f, 0.0f, 1.0f)}, // Clamped to 0 {"rgba(300, 0, 0, 1.0)", Color(1.0f, 0.0f, 0.0f, 1.0f)}, // Clamped to 1 + {"rgba(100,100,100,0.2)", Color(20.0f / 255, 20.0f / 255, 20.0f / 255, 0.2f)}, // {"#GGGGGG", Color(0.0f, 0.0f, 0.0f, 1.0f)}, // Treated as fallback black // not supported right now // {"#0F0F", Color(0.0f, 1.0f, 0.0f, 1.0f)}, From 42490d5a8baf53eb81d4a50acd58c4f300e685db Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 16 Jan 2025 23:11:50 +0100 Subject: [PATCH 043/339] Add timeout-minutes to windows-ci workflow (#3149) --- .github/workflows/windows-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 4e3f479aae55..c566db45a63b 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -103,6 +103,7 @@ jobs: CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" RENDERER: "${{ matrix.renderer }}" RENDERING_MODE: "${{ matrix.rendering_mode }}" + timeout-minutes: 5 run: | cmake --version & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 From 0dea8bad2ff68a95772a6e3b3a788946c0596f15 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Fri, 17 Jan 2025 10:21:22 -0500 Subject: [PATCH 044/339] Bump Ubuntu docker base 22.04 -> 24.04 (#3150) --- docker/Dockerfile | 13 +++++++------ docker/README.md | 4 ++-- docker/startup.sh | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 58a4e6ab55be..89fbe5a90b72 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 # Install build tools and dependencies RUN apt-get update \ @@ -40,23 +40,24 @@ RUN echo "Download and install Bazel" \ && chmod +x /usr/local/bin/bazel \ && : - -ARG USERNAME=user +# This username is hardcoded in several places, and should simply match whatever base image uses +ARG USERNAME=ubuntu ARG USER_UID=1000 ARG USER_GID=$USER_UID # Create docker user wuth sudo rights as passed in by the build command # This was modeled on https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user # On a Mac, USER_GID might already exist, so ignore it if it fails (--force) -RUN groupadd --force --gid $USER_GID $USERNAME \ - && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ +RUN groupmod --gid $USER_GID $USERNAME \ + && usermod --uid $USER_UID --gid $USER_GID $USERNAME \ + && chown -R $USER_UID:$USER_GID /home/$USERNAME \ && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ && chmod 0440 /etc/sudoers.d/$USERNAME # This allows users to `docker run` without specifying -u and -g USER $USERNAME -RUN pip install pre-commit +#RUN pip install pre-commit ENV RUSTUP_HOME=/home/$USERNAME/.cache/.rustup \ CARGO_HOME=/home/$USERNAME/.cache/.cargo \ diff --git a/docker/README.md b/docker/README.md index 5a090f86db65..62b9896716a8 100644 --- a/docker/README.md +++ b/docker/README.md @@ -33,11 +33,11 @@ docker build \ ```bash # Run all build commands using the docker container. # You can also execute build commands from inside the docker container by starting it without the build command. -docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/user/.cache" maplibre-native-image +docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/ubuntu/.cache" maplibre-native-image ``` You can also use the container to run just one specific commands, e.g. `cmake` or `bazel`. Any downloaded dependencies will be cached in the `docker/.cache` directory. ```bash -docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/user/.cache" maplibre-native-image cmake ... +docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/ubuntu/.cache" maplibre-native-image cmake ... ``` diff --git a/docker/startup.sh b/docker/startup.sh index 3a60b8e63e0e..9534d378dc62 100644 --- a/docker/startup.sh +++ b/docker/startup.sh @@ -6,7 +6,8 @@ if [ ! -d /app/.github ] || [ ! -d ~/.cache ]; then echo " From the root of this repo, run the following command." echo " You may add any command to perform in the container at the end of this command." echo " " - echo ' docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:/home/'"$USERNAME"'/.cache" maplibre-native-image' + # shellcheck disable=SC2016 + echo ' docker run --rm -it -v "$PWD:/app/" -v "$PWD/docker/.cache:'"$HOME"'/.cache" maplibre-native-image' exit 1 fi From 140586b98bf8fd85e5f51dbb4a2d07480ab396c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladan=20Kudl=C3=A1=C4=8D?= Date: Tue, 21 Jan 2025 16:18:32 +0100 Subject: [PATCH 045/339] Fix broken links in node readme (#3147) --- platform/node/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/node/README.md b/platform/node/README.md index 15b7d3f437e5..48a96d74eb3e 100644 --- a/platform/node/README.md +++ b/platform/node/README.md @@ -229,7 +229,7 @@ Stylesheets are free to use any protocols, but your implementation of `request` ## Listening for log events -The module imported with `require('maplibre-gl-native')` inherits from [`EventEmitter`](https://nodejs.org/api/events.html), and the `NodeLogObserver` will push log events to this. Log messages can have [`class`](https://github.com/maplibre/maplibre-native/blob/node-v2.1.0/include/mbgl/platform/event.hpp#L43-L60), [`severity`](https://github.com/maplibre/maplibre-native/blob/node-v2.1.0/include/mbgl/platform/event.hpp#L17-L23), `code` ([HTTP status codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)), and `text` parameters. +The module imported with `require('maplibre-gl-native')` inherits from [`EventEmitter`](https://nodejs.org/api/events.html), and the `NodeLogObserver` will push log events to this. Log messages can have [`class`](https://github.com/maplibre/maplibre-native/blob/0dea8bad2ff68a95772a6e3b3a788946c0596f15/src/mbgl/util/event.cpp#L15-L35), [`severity`](https://github.com/maplibre/maplibre-native/blob/0dea8bad2ff68a95772a6e3b3a788946c0596f15/src/mbgl/util/event.cpp#L6-L13), `code` ([HTTP status codes](https://www.rfc-editor.org/rfc/rfc9110#name-status-codes)), and `text` parameters. ```js var mbgl = require('@maplibre/maplibre-gl-native'); From 0a88a0f68c60ce39d03e2d0047cde19c756afa35 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Tue, 21 Jan 2025 13:11:48 -0300 Subject: [PATCH 046/339] Put git configuration core.longpaths=true in Windows documentation (#3157) --- platform/windows/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/windows/README.md b/platform/windows/README.md index 917787f1268d..52b5298755c8 100644 --- a/platform/windows/README.md +++ b/platform/windows/README.md @@ -15,10 +15,13 @@ To install the required Visual Studio components, open Visual Studio Installer a Open `x64 Native Tools Command Prompt for VS 2022` and then clone the repository: ```cmd -git clone --recurse-submodules -j8 https://github.com/maplibre/maplibre-native.git +git clone --config core.longpaths=true --recurse-submodules -j8 https://github.com/maplibre/maplibre-native.git cd maplibre-native ``` +> [!NOTE] +> The `core.longpaths=true` config is necessary, because without it a lot of `Filename too long` messages will come. If you have this configuration set globally (`git config --system core.longpaths=true`), you can omit the `--config core.longpaths=true` portion of the clone command. + ## Configuring Configure the build with the following command: From 5b45d706367f7b34f7c55165259c1fa574a5f408 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Tue, 21 Jan 2025 13:14:31 -0300 Subject: [PATCH 047/339] Update vcpkg to 2025.01.13 (#3158) --- .github/workflows/windows-ci.yml | 37 +++++++++++++++++++++++-- platform/windows/Get-VendorPackages.ps1 | 1 + platform/windows/vendor/vcpkg | 2 +- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index c566db45a63b..5e0bb5a36400 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -51,9 +51,40 @@ jobs: run: | Write-Host "Changed file(s): ${{ steps.changed-files.outputs.windows_all_changed_files }}" - windows-build-and-test: + windows-get-or-build-dependencies: if: needs.pre-job.outputs.should_skip != 'true' needs: pre-job + runs-on: windows-2022 + steps: + - run: | + git config --system core.longpaths true + + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ilammy/msvc-dev-cmd@v1 + + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Acquire/Build Maplibre Native Core Dependencies + env: + CI: 1 + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + timeout-minutes: 60 + run: | + & ${{ github.workspace }}\platform\windows\Get-VendorPackages.ps1 -Triplet ${{ env.VSCMD_ARG_TGT_ARCH }}-windows -Renderer All + + + windows-build-and-test: +# if: needs.pre-job.outputs.should_skip != 'true' + needs: windows-get-or-build-dependencies strategy: matrix: renderer: [opengl, egl, vulkan, osmesa] @@ -98,12 +129,12 @@ jobs: env: CI: 1 VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - VCPKG_KEEP_ENV_VARS: "CMAKE_CXX_COMPILER_LAUNCHER;CMAKE_C_COMPILER_LAUNCHER" +# VCPKG_KEEP_ENV_VARS: "CMAKE_CXX_COMPILER_LAUNCHER;CMAKE_C_COMPILER_LAUNCHER" CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" RENDERER: "${{ matrix.renderer }}" RENDERING_MODE: "${{ matrix.rendering_mode }}" - timeout-minutes: 5 + timeout-minutes: 60 run: | cmake --version & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 diff --git a/platform/windows/Get-VendorPackages.ps1 b/platform/windows/Get-VendorPackages.ps1 index f0760a8bbf43..8c7d2966023c 100644 --- a/platform/windows/Get-VendorPackages.ps1 +++ b/platform/windows/Get-VendorPackages.ps1 @@ -25,6 +25,7 @@ switch($Renderer) 'OSMesa' { $renderer_packages = @(); break } 'OpenGL' { $renderer_packages = @('opengl-registry'); break } 'Vulkan' { $renderer_packages = @(); break } + 'All' { $renderer_packages = @('egl', 'opengl-registry'); break } } if(-not (Test-Path ('{0}\vcpkg.exe' -f $vcpkg_temp_dir))) diff --git a/platform/windows/vendor/vcpkg b/platform/windows/vendor/vcpkg index db4924694eab..6f29f12e82a8 160000 --- a/platform/windows/vendor/vcpkg +++ b/platform/windows/vendor/vcpkg @@ -1 +1 @@ -Subproject commit db4924694eabc161a7fb8eb43f083d0ca55396e2 +Subproject commit 6f29f12e82a8293156836ad81cc9bf5af41fe836 From 6c88f72b6da3b9dc48c4ca5a0e3e49df8fa8138c Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 21 Jan 2025 19:55:57 +0200 Subject: [PATCH 048/339] Fix TextureMode crash (#3144) --- .../VulkanTextureViewRenderThread.java | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java index be04ae5c6c49..3b8a0715ba03 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java @@ -23,7 +23,9 @@ public void run() { while (true) { Runnable event = null; - boolean initialize = false; + boolean createSurface = false; + boolean destroySurface = false; + boolean sizeChanged = false; int w = -1; int h = -1; @@ -41,20 +43,28 @@ public void run() { break; } - if (destroySurface) { - destroySurface = false; - mapRenderer.onSurfaceDestroyed(); + if (this.destroySurface) { surface = null; + destroySurface = true; + this.destroySurface = false; break; } - if (surfaceTexture != null && !paused && requestRender && surface == null) { + if (surfaceTexture != null && !paused && requestRender + && (surface == null || this.sizeChanged)) { w = width; h = height; - surface = new Surface(surfaceTexture); - initialize = true; + if (surface == null) { + surface = new Surface(surfaceTexture); + createSurface = true; + } + + if (this.sizeChanged) { + sizeChanged = true; + this.sizeChanged = false; + } // Reset the request render flag now, so we can catch new requests // while rendering @@ -81,14 +91,19 @@ public void run() { continue; } - if (initialize) { + if (createSurface) { mapRenderer.onSurfaceCreated(surface); - mapRenderer.onSurfaceChanged( w, h); - - initialize = false; + mapRenderer.onSurfaceChanged(w, h); + createSurface = false; continue; } + if (destroySurface) { + mapRenderer.onSurfaceDestroyed(); + destroySurface = false; + break; + } + // If the surface size has changed inform the map renderer. if (sizeChanged) { mapRenderer.onSurfaceChanged(w, h); From 922d8976aa6cbcea749c972fb83c7284d15c0ae2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 21 Jan 2025 19:03:38 +0100 Subject: [PATCH 049/339] Add some documentation on Android benchmark (#3133) --- docs/mdbook/src/SUMMARY.md | 1 + docs/mdbook/src/android/README.md | 8 --- docs/mdbook/src/android/benchmark.md | 102 +++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 docs/mdbook/src/android/benchmark.md diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index 951078c58f44..ce9cf262dc0c 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -7,6 +7,7 @@ - [Android](./android/README.md) - [Tests](./android/android-tests.md) - [Documentation](./android/android-documentation.md) + - [Benchmark](./android/benchmark.md) - [iOS](./ios/README.md) - [Tests](ios/ios-tests.md) diff --git a/docs/mdbook/src/android/README.md b/docs/mdbook/src/android/README.md index 192d2f9ae25e..5f0e6d1358aa 100644 --- a/docs/mdbook/src/android/README.md +++ b/docs/mdbook/src/android/README.md @@ -53,14 +53,6 @@ To format all Kotlin source files, use: $ ./gradlew formatKotlin ``` -## Benchmarks in Pull Request - -To run the benchmarks (for Android) include the following line on a PR comment: - -``` -!benchmark android -``` - ## Profiling See [Tracy Profiling](/profiling/tracy-profiling.md) to understand how Tracy can be used for profiling. \ No newline at end of file diff --git a/docs/mdbook/src/android/benchmark.md b/docs/mdbook/src/android/benchmark.md new file mode 100644 index 000000000000..da52ff1b059c --- /dev/null +++ b/docs/mdbook/src/android/benchmark.md @@ -0,0 +1,102 @@ +# Benchmark + +We have created a rendering performance benchmark for Android. The logic for this benchmark is encapsulated in `BenchMarkActivity.kt`. + +## Styles + +We have hardcoded various styles, which you can override with a `developer-config.xml` by adding some XML with the following structure: + +``` + + Americana + + + https://americanamap.org/style.json + +``` + +## Retrieving Results + +Results are logged to the console as they come in. After the benchmark is done running a `benchmark_results.json` file is generated. You can pull it off the device with for example adb: + +``` +adb shell "run-as org.maplibre.android.testapp cat files/benchmark_results.json" \ + > benchmark_results.json +``` + +## Results + +The `benchmark_results.json` containing the benchmark results will have the following structure. + +```json +{ + "results": [ + { + "styleName": "AWS Open Data Standard Light", + "syncRendering": true, + "thermalState": 0, + "fps": 34.70237085812839, + "avgEncodingTime": 19.818289053808947, + "avgRenderingTime": 7.7432454899654255, + "low1pEncodingTime": 91.72538138784371, + "low1pRenderingTime": 26.573758581509203 + }, + ], + "deviceManufacturer": "samsung", + "model": "SM-G973F", + "renderer": "drawable", + "debugBuild": true, + "gitRevision": "fc95b79880223e34c2ce80339f698d095e3d63cd", + "timestamp": 1736454325393 +} +``` + +The meaning of the keys is as follows. + +| Key | Description | +|---|---| +| styleName | Name of the style being benchmarked | +| syncRendering | Whether synchronous rendering was used | +| thermalState | Thermal state of the device during benchmark | +| fps | Average frames per second achieved during the benchmark | +| avgEncodingTime | Average time taken for encoding in milliseconds | +| avgRenderingTime | Average time taken for rendering in milliseconds | +| low1pEncodingTime | 1st percentile (worst case) encoding time in milliseconds | +| low1pRenderingTime | 1st percentile (worst case) rendering time in milliseconds | +| deviceManufacturer | Manufacturer of the test device | +| model | Model number/name of the test device | +| renderer | Type of renderer used (`drawable` for Open GL ES, `vulkan` for Vulkan, `legacy` for the legacy Open GL ES rendering backend) | +| debugBuild | Whether the build was a debug build | +| gitRevision | Git commit hash of the code version | +| timestamp | Unix timestamp of when the benchmark was run | + +## Large Scale Benchmarks on AWS Device Farm + +Sometimes we do a large scale benchmark across a variety of devices on AWS Device Farm. We ran one such test in [November 2024](https://github.com/maplibre/maplibre-native/issues/2787#issuecomment-2466948888) to compare the performance of the then new Vulkan rendering backend against the OpenGL ES backend. There are some scripts in the repo to kick off the tests and to collect and plot the results: + +``` +scripts/aws-device-farm/aws-device-farm-run.sh +scripts/aws-device-farm/collect-benchmark-outputs.mjs +scripts/aws-device-farm/update-benchmark-db.mjs +scripts/aws-device-farm/plot-android-benchmark-results.py +``` + +## Continuous Benchmarking + +We are running the Android benchmark on every merge with `main`. + +You can find the results per commit [here](https://maplibre-native.s3.eu-central-1.amazonaws.com/index.html#android-benchmark-render/) or pull them from our public S3 bucket: + +``` +aws s3 sync s3://maplibre-native/android-benchmark-render/ . +``` + +## Benchmarks in Pull Request + +To run the benchmarks (for Android) include the following line on a PR comment: + +``` +!benchmark android +``` + +A file with the benchmark results will be added to the workflow summary, which you can compare with the previous results in the bucket. \ No newline at end of file From d960b1181665a77c646bc856f6235561f5434872 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Tue, 21 Jan 2025 10:11:34 -0800 Subject: [PATCH 050/339] Fix scheduler test failure (#3145) --- src/mbgl/actor/scheduler.cpp | 25 +++++++++---------------- test/util/async_task.test.cpp | 25 +++++++++++++++++-------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp index 707de734ddc2..68a55cbef9c6 100644 --- a/src/mbgl/actor/scheduler.cpp +++ b/src/mbgl/actor/scheduler.cpp @@ -48,29 +48,22 @@ std::shared_ptr Scheduler::GetBackground() { // static std::shared_ptr Scheduler::GetSequenced() { - const std::size_t kSchedulersCount = 10; + constexpr std::size_t kSchedulersCount = 10; static std::vector> weaks(kSchedulersCount); static std::mutex mtx; static std::size_t lastUsedIndex = 0u; - std::lock_guard lock(mtx); + std::lock_guard lock(mtx); - if (++lastUsedIndex == kSchedulersCount) lastUsedIndex = 0u; + lastUsedIndex = (lastUsedIndex + 1) % kSchedulersCount; - std::shared_ptr result; - for (std::size_t i = 0; i < kSchedulersCount; ++i) { - auto& weak = weaks[i]; - if (auto scheduler = weak.lock()) { - if (lastUsedIndex == i) result = scheduler; - continue; - } - result = std::make_shared(); - weak = result; - lastUsedIndex = i; - break; + if (auto scheduler = weaks[lastUsedIndex].lock()) { + return scheduler; + } else { + auto result = std::make_shared(); + weaks[lastUsedIndex] = result; + return result; } - - return result; } } // namespace mbgl diff --git a/test/util/async_task.test.cpp b/test/util/async_task.test.cpp index fd58cfd5a3d5..1fc7acf53bd0 100644 --- a/test/util/async_task.test.cpp +++ b/test/util/async_task.test.cpp @@ -206,13 +206,22 @@ TEST(AsyncTask, SequencedScheduler) { } TEST(AsyncTask, MultipleSequencedSchedulers) { - std::vector> shedulers; - - for (int i = 0; i < 10; ++i) { - std::shared_ptr scheduler = Scheduler::GetSequenced(); - EXPECT_TRUE(std::none_of( - shedulers.begin(), shedulers.end(), [&scheduler](const auto &item) { return item == scheduler; })); - shedulers.emplace_back(std::move(scheduler)); + constexpr std::size_t kSchedulersCount = 10; // must match the value in the scheduler + + std::vector> schedulers; + + // Regression check, the scheduler assignment was previously sensitive to the state of the weak references. + // If expired weak references followed a still-valid one, both after the last-used index, the index would + // be incremented multiple times. + auto temp = Scheduler::GetSequenced(); + temp = Scheduler::GetSequenced(); + + // Check that exactly N unique schedulers are produced. + // Note that this relies on no other threads requesting schedulers. + for (std::size_t i = 0; i < kSchedulersCount; ++i) { + auto scheduler = Scheduler::GetSequenced(); + EXPECT_TRUE(std::ranges::find(schedulers, scheduler) == schedulers.end()); + schedulers.emplace_back(std::move(scheduler)); } - EXPECT_EQ(shedulers.front(), std::shared_ptr(Scheduler::GetSequenced())); + EXPECT_EQ(schedulers.front(), Scheduler::GetSequenced()); } From 4ae61fb9dc306a01f2f75a9696b3c9dc7ae05e68 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 21 Jan 2025 21:26:07 +0200 Subject: [PATCH 051/339] Use timestamps for image descriptor updates (#3152) --- include/mbgl/vulkan/descriptor_set.hpp | 8 +++++++- include/mbgl/vulkan/texture2d.hpp | 2 ++ src/mbgl/vulkan/descriptor_set.cpp | 14 +++++++++++--- src/mbgl/vulkan/drawable.cpp | 4 ++-- src/mbgl/vulkan/texture2d.cpp | 3 +++ 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/include/mbgl/vulkan/descriptor_set.hpp b/include/mbgl/vulkan/descriptor_set.hpp index b1c4619c5427..1e3eb3f94ee9 100644 --- a/include/mbgl/vulkan/descriptor_set.hpp +++ b/include/mbgl/vulkan/descriptor_set.hpp @@ -60,7 +60,7 @@ class DescriptorSet { void allocate(); - void markDirty(bool value = true); + virtual void markDirty(); void bind(CommandEncoder& encoder); protected: @@ -91,7 +91,13 @@ class ImageDescriptorSet : public DescriptorSet { ImageDescriptorSet(Context& context_); virtual ~ImageDescriptorSet() = default; + void markDirty() override; + const std::chrono::duration& getLastModified() const { return lastModified; } + void update(const std::array& textures); + +protected: + std::chrono::duration lastModified; }; } // namespace vulkan diff --git a/include/mbgl/vulkan/texture2d.hpp b/include/mbgl/vulkan/texture2d.hpp index b0aaef237f9d..a67b40112e61 100644 --- a/include/mbgl/vulkan/texture2d.hpp +++ b/include/mbgl/vulkan/texture2d.hpp @@ -60,6 +60,7 @@ class Texture2D : public gfx::Texture2D { size_t numChannels() const noexcept override; bool isDirty() const { return samplerStateDirty || textureDirty; } + bool isModifiedAfter(const std::chrono::duration& t) const { return t < lastModified; } void create() noexcept override; @@ -112,6 +113,7 @@ class Texture2D : public gfx::Texture2D { std::shared_ptr imageData{nullptr}; bool textureDirty{true}; bool samplerStateDirty{true}; + std::chrono::duration lastModified{0}; SharedImageAllocation imageAllocation; vk::ImageLayout imageLayout{vk::ImageLayout::eUndefined}; diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index 488e940728ae..ae30ba05ee03 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -120,8 +121,8 @@ void DescriptorSet::allocate() { dirty = std::vector(descriptorSets.size(), true); } -void DescriptorSet::markDirty(bool value) { - std::fill(dirty.begin(), dirty.end(), value); +void DescriptorSet::markDirty() { + std::fill(dirty.begin(), dirty.end(), true); } void DescriptorSet::bind(CommandEncoder& encoder) { @@ -186,7 +187,14 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, } ImageDescriptorSet::ImageDescriptorSet(Context& context_) - : DescriptorSet(context_, DescriptorSetType::DrawableImage) {} + : DescriptorSet(context_, DescriptorSetType::DrawableImage), + lastModified(0.0) {} + +void ImageDescriptorSet::markDirty() { + DescriptorSet::markDirty(); + + lastModified = util::MonotonicTimer::now(); +} void ImageDescriptorSet::update(const std::array& textures) { MLN_TRACE_FUNC(); diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index e3b0cf45fc73..06f52581e52f 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -436,8 +436,8 @@ bool Drawable::bindDescriptors(CommandEncoder& encoder) const noexcept { for (const auto& texture : textures) { if (!texture) continue; const auto textureImpl = static_cast(texture.get()); - if (textureImpl->isDirty()) { - impl->imageDescriptorSet->markDirty(true); + if (textureImpl->isModifiedAfter(impl->imageDescriptorSet->getLastModified())) { + impl->imageDescriptorSet->markDirty(); break; } } diff --git a/src/mbgl/vulkan/texture2d.cpp b/src/mbgl/vulkan/texture2d.cpp index 7c31f5330d82..8f2da1495bee 100644 --- a/src/mbgl/vulkan/texture2d.cpp +++ b/src/mbgl/vulkan/texture2d.cpp @@ -362,7 +362,9 @@ void Texture2D::createTexture() { context.renderingStats().numCreatedTextures++; context.renderingStats().numActiveTextures++; context.renderingStats().memTextures += getDataSize(); + textureDirty = false; + lastModified = util::MonotonicTimer::now(); } void Texture2D::createSampler() { @@ -392,6 +394,7 @@ void Texture2D::createSampler() { sampler = context.getBackend().getDevice()->createSampler(samplerCreateInfo); samplerStateDirty = false; + lastModified = util::MonotonicTimer::now(); } void Texture2D::destroyTexture() { From b9b511efdde2c03bd20fa40ed81ab540804ac9ad Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 21 Jan 2025 20:40:12 +0100 Subject: [PATCH 052/339] Add NSString initializer MLNVectorTileSource (#3163) --- platform/darwin/src/MLNVectorTileSource.h | 24 ++++++++++++ platform/darwin/src/MLNVectorTileSource.mm | 11 ++++++ platform/ios/app/MBXViewController.mm | 44 ++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/platform/darwin/src/MLNVectorTileSource.h b/platform/darwin/src/MLNVectorTileSource.h index 9d7e2e216f2d..a3c807b4942c 100644 --- a/platform/darwin/src/MLNVectorTileSource.h +++ b/platform/darwin/src/MLNVectorTileSource.h @@ -84,6 +84,30 @@ MLN_EXPORT - (instancetype)initWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL NS_DESIGNATED_INITIALIZER; +/** + Returns a vector tile source initialized with an identifier and a + string-based configuration URL. + + After initializing and configuring the source, add it to a map view’s style + using the ``MLNStyle/addSource:`` method. + + The string may be a full HTTP or HTTPS URL or a canonical URL. The string should + point to a JSON file that conforms to the +
TileJSON specification. + + This constructor can be used for URLs that cause problems with `NSURL`’s URL + parsing behavior. For example, URLs starting with `pmtiles://https://` were + not parsed correctly on iOS 17. + + @param identifier A string that uniquely identifies the source in the style to + which it is added. + @param configurationURLString A string to a TileJSON configuration file + describing the source’s contents and other metadata. + @return An initialized vector tile source. + */ +- (instancetype)initWithIdentifier:(NSString *)identifier + configurationURLString:(NSString *)configurationURLString NS_DESIGNATED_INITIALIZER; + /** Returns a vector tile source initialized an identifier, tile URL templates, and options. diff --git a/platform/darwin/src/MLNVectorTileSource.mm b/platform/darwin/src/MLNVectorTileSource.mm index dacb5ae5e2ee..08ad59705e5b 100644 --- a/platform/darwin/src/MLNVectorTileSource.mm +++ b/platform/darwin/src/MLNVectorTileSource.mm @@ -28,6 +28,17 @@ - (instancetype)initWithIdentifier:(NSString *)identifier configurationURL:(NSUR return self = [super initWithPendingSource:std::move(source)]; } +- (instancetype)initWithIdentifier:(NSString *)identifier + configurationURLString:(NSString *)configurationURLString +{ + auto source = std::make_unique( + identifier.UTF8String, + configurationURLString.UTF8String + ); + + return self = [super initWithPendingSource:std::move(source)]; +} + - (instancetype)initWithIdentifier:(NSString *)identifier tileURLTemplates:(NSArray *)tileURLTemplates options:(nullable NSDictionary *)options { mbgl::Tileset tileSet = MLNTileSetFromTileURLTemplates(tileURLTemplates, options); auto source = std::make_unique(identifier.UTF8String, tileSet); diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index fd8a80b8bfb6..4cfd8ce39da0 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -108,6 +108,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsRuntimeStylingRows) { #if MLN_DRAWABLE_RENDERER MBXSettingsRuntimeStylingCustomDrawableLayer, #endif + MBXSettingsRuntimeStylingAddFoursquarePOIsPMTiles }; typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) { @@ -460,6 +461,7 @@ - (void)dismissSettings:(__unused id)sender #if MLN_DRAWABLE_RENDERER @"Add Custom Drawable Layer", #endif + @"Add FourSquare POIs PMTiles Layer" ]]; break; case MBXSettingsMiscellaneous: @@ -687,6 +689,9 @@ - (void)performActionForSettingAtIndexPath:(NSIndexPath *)indexPath [self addCustomDrawableLayer]; break; #endif + case MBXSettingsRuntimeStylingAddFoursquarePOIsPMTiles: + [self addFoursquarePOIsPMTilesLayer]; + break; default: NSAssert(NO, @"All runtime styling setting rows should be implemented"); break; @@ -1048,6 +1053,45 @@ - (void)addAnnotationWithCustomCallout [self.mapView showAnnotations:annotations animated:YES]; } +// MARK: - Foursquare PMTiles Implementation +/* + Add the new method that creates the PMTiles vector source and circle layer. +*/ +- (void)addFoursquarePOIsPMTilesLayer { + MLNVectorTileSource *foursquareSource = [[MLNVectorTileSource alloc] initWithIdentifier:@"foursquare-10M" configurationURLString:@"pmtiles://https://oliverwipfli.ch/data/foursquare-os-places-10M-2024-11-20.pmtiles"]; + + // Also works + // MLNVectorTileSource *foursquareSource = + // [[MLNVectorTileSource alloc] initWithIdentifier:@"foursquare-10M" + // tileURLTemplates:@[@"pmtiles://https://oliverwipfli.ch/data/foursquare-os-places-10M-2024-11-20.pmtiles"] + // options:nil]; + + [self.mapView.style addSource:foursquareSource]; + + MLNCircleStyleLayer *circleLayer = [[MLNCircleStyleLayer alloc] initWithIdentifier:@"foursquare-10M" source:foursquareSource]; + circleLayer.sourceLayerIdentifier = @"place"; + circleLayer.maximumZoomLevel = 11; + circleLayer.circleColor = [NSExpression expressionForConstantValue:[UIColor colorWithRed:0.8 green:0.2 blue:0.2 alpha:1.0]]; + circleLayer.circleOpacity = [NSExpression expressionWithMLNJSONObject:@[ + @"interpolate", + @[@"linear"], + @[@"zoom"], + @6, @0.5, + @11, @0.5, + @14, @1.0 + ]]; + circleLayer.circleRadius = [NSExpression expressionWithMLNJSONObject:@[ + @"interpolate", + @[@"linear"], + @[@"zoom"], + @6, @1, + @11, @3, + @16, @4, + @18, @8 + ]]; + [self.mapView.style addLayer:circleLayer]; +} + - (void)styleBuildingExtrusions { MLNSource* source = [self.mapView.style sourceWithIdentifier:@"composite"]; From 10f5c906aa16c564acd931ed02a668e029178366 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 22 Jan 2025 01:12:34 +0100 Subject: [PATCH 053/339] Fix DocC GitHub Pages Deployment (#3164) --- .github/workflows/ios-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index f838c023f098..f848c49ea389 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -29,6 +29,7 @@ on: permissions: id-token: write # needed for AWS contents: write # allow making a release + pages: write jobs: pre_job: @@ -134,7 +135,7 @@ jobs: - name: Build CppUnitTests .ipa and .xctest for AWS Device Farm run: | set -e - bazel run --//:renderer=metal //platform/ios:xcodeproj + bazel run //platform/ios:xcodeproj --@rules_xcodeproj//xcodeproj:extra_common_flags="--//:renderer=metal" build_dir="$(mktemp -d)" xcodebuild build-for-testing -scheme CppUnitTests -project MapLibre.xcodeproj -derivedDataPath "$build_dir" ios_cpp_test_app_dir="$(dirname "$(find "$build_dir" -name CppUnitTestsApp.app)")" From a69c5dccdcc5ac3c2c67280a71a2a0b143d41e27 Mon Sep 17 00:00:00 2001 From: Christian Hansen Date: Wed, 22 Jan 2025 01:32:30 +0100 Subject: [PATCH 054/339] Support defining a custom style layer from iOS Swift (#3154) --- platform/darwin/app/CustomStyleLayerExample.m | 4 +- platform/darwin/bazel/files.bzl | 1 + platform/darwin/src/MLNBackendResource.h | 28 ++- platform/darwin/src/MLNBackendResource.mm | 36 ++++ .../Sources/CustomStyleLayerExample.swift | 186 ++++++++++++++++++ .../Sources/MapLibreNavigationView.swift | 5 + platform/ios/src/MLNMapView+Impl.h | 2 +- platform/ios/src/MLNMapView+Metal.h | 2 +- platform/ios/src/MLNMapView+Metal.mm | 13 +- platform/ios/src/MLNMapView+OpenGL.h | 2 +- platform/ios/src/MLNMapView+OpenGL.mm | 4 +- platform/ios/src/MLNMapView.h | 2 +- platform/ios/src/MLNMapView.mm | 2 +- 13 files changed, 263 insertions(+), 24 deletions(-) create mode 100644 platform/darwin/src/MLNBackendResource.mm create mode 100644 platform/ios/app-swift/Sources/CustomStyleLayerExample.swift diff --git a/platform/darwin/app/CustomStyleLayerExample.m b/platform/darwin/app/CustomStyleLayerExample.m index c2f69589d92e..c2f4b6a5cac1 100644 --- a/platform/darwin/app/CustomStyleLayerExample.m +++ b/platform/darwin/app/CustomStyleLayerExample.m @@ -72,7 +72,7 @@ @implementation CustomStyleLayerExample { } - (void)didMoveToMapView:(MLNMapView *)mapView { - MLNBackendResource resource = [mapView backendResource]; + MLNBackendResource* resource = [mapView backendResource]; NSString *shaderSource = @ " #include \n" @@ -140,7 +140,7 @@ - (void)drawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingCon id renderEncoder = self.renderEncoder; if(renderEncoder != nil) { - MLNBackendResource resource = [mapView backendResource]; + MLNBackendResource* resource = [mapView backendResource]; vector_uint2 _viewportSize; _viewportSize.x = resource.mtkView.drawableSize.width; diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index fd344cb28af5..fb76746c4977 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -161,6 +161,7 @@ MLN_DARWIN_PRIVATE_HEADERS = [ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ "src/MLNAttributionInfo.mm", + "src/MLNBackendResource.mm", "src/MLNComputedShapeSource.mm", "src/MLNCustomStyleLayer.mm", "src/MLNDefaultStyle.mm", diff --git a/platform/darwin/src/MLNBackendResource.h b/platform/darwin/src/MLNBackendResource.h index e8af9ae63383..4830ca05b4d2 100644 --- a/platform/darwin/src/MLNBackendResource.h +++ b/platform/darwin/src/MLNBackendResource.h @@ -2,16 +2,28 @@ #import -typedef struct { - MTKView *mtkView; - id device; - MTLRenderPassDescriptor *renderPassDescriptor; - id commandBuffer; -} MLNBackendResource; +@interface MLNBackendResource : NSObject + +@property (nonatomic, strong) MTKView *mtkView; +@property (nonatomic, strong) id device; +@property (nonatomic, strong) MTLRenderPassDescriptor *renderPassDescriptor; +@property (nonatomic, strong) id commandBuffer; + +- (instancetype)initWithMTKView:(MTKView *)mtkView + device:(id)device + renderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor + commandBuffer:(id)commandBuffer; + +@end #else -typedef struct { -} MLNBackendResource; +#import +#import "MLNFoundation.h" + +MLN_EXPORT +@interface MLNBackendResource : NSObject + +@end #endif diff --git a/platform/darwin/src/MLNBackendResource.mm b/platform/darwin/src/MLNBackendResource.mm new file mode 100644 index 000000000000..7e3e84564a40 --- /dev/null +++ b/platform/darwin/src/MLNBackendResource.mm @@ -0,0 +1,36 @@ +#if MLN_RENDER_BACKEND_METAL + +#import "MLNBackendResource.h" + +@implementation MLNBackendResource + +- (instancetype)initWithMTKView:(MTKView *)mtkView + device:(id)device + renderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor + commandBuffer:(id)commandBuffer { + self = [super init]; + if (self) { + _mtkView = mtkView; + _device = device; + _renderPassDescriptor = renderPassDescriptor; + _commandBuffer = commandBuffer; + } + return self; +} + +@end + +#else + +#import "MLNBackendResource.h" + +@implementation MLNBackendResource + +- (instancetype)init { + self = [super init]; + return self; +} + +@end + +#endif \ No newline at end of file diff --git a/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift b/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift new file mode 100644 index 000000000000..0d3c3237ace3 --- /dev/null +++ b/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift @@ -0,0 +1,186 @@ +import Foundation +import MapLibre +import MetalKit +import SwiftUI +import UIKit + +// #-example-code(CustomStyleLayerExample) +struct CustomStyleLayerExample: UIViewRepresentable { + func makeCoordinator() -> CustomStyleLayerExample.Coordinator { + Coordinator(self) + } + + final class Coordinator: NSObject, MLNMapViewDelegate { + var control: CustomStyleLayerExample + + init(_ control: CustomStyleLayerExample) { + self.control = control + } + + func mapViewDidFinishLoadingMap(_ mapView: MLNMapView) { + let mapOverlay = CustomStyleLayer(identifier: "test-overlay") + let style = mapView.style! + style.layers.append(mapOverlay) + } + } + + func makeUIView(context: Context) -> MLNMapView { + let mapView = MLNMapView() + mapView.delegate = context.coordinator + return mapView + } + + func updateUIView(_: MLNMapView, context _: Context) {} +} + +class CustomStyleLayer: MLNCustomStyleLayer { + private var pipelineState: MTLRenderPipelineState? + private var depthStencilStateWithoutStencil: MTLDepthStencilState? + + override func didMove(to mapView: MLNMapView) { + #if MLN_RENDER_BACKEND_METAL + let resource = mapView.backendResource() + + let shaderSource = """ + #include + using namespace metal; + + typedef struct + { + vector_float2 position; + vector_float4 color; + } Vertex; + + struct RasterizerData + { + float4 position [[position]]; + float4 color; + }; + + struct Uniforms + { + float4x4 matrix; + }; + + vertex RasterizerData + vertexShader(uint vertexID [[vertex_id]], + constant Vertex *vertices [[buffer(0)]], + constant Uniforms &uniforms [[buffer(1)]]) + { + RasterizerData out; + + const float4 position = uniforms.matrix * float4(float2(vertices[vertexID].position.xy), 1, 1); + + out.position = position; + out.color = vertices[vertexID].color; + + return out; + } + + fragment float4 fragmentShader(RasterizerData in [[stage_in]]) + { + return in.color; + } + """ + + var error: NSError? + let device = resource.device + let library = try? device?.makeLibrary(source: shaderSource, options: nil) + assert(library != nil, "Error compiling shaders: \(String(describing: error))") + let vertexFunction = library?.makeFunction(name: "vertexShader") + let fragmentFunction = library?.makeFunction(name: "fragmentShader") + + // Configure a pipeline descriptor that is used to create a pipeline state. + let pipelineStateDescriptor = MTLRenderPipelineDescriptor() + pipelineStateDescriptor.label = "Simple Pipeline" + pipelineStateDescriptor.vertexFunction = vertexFunction + pipelineStateDescriptor.fragmentFunction = fragmentFunction + pipelineStateDescriptor.colorAttachments[0].pixelFormat = resource.mtkView.colorPixelFormat + pipelineStateDescriptor.depthAttachmentPixelFormat = .depth32Float_stencil8 + pipelineStateDescriptor.stencilAttachmentPixelFormat = .depth32Float_stencil8 + + do { + pipelineState = try device?.makeRenderPipelineState(descriptor: pipelineStateDescriptor) + } catch { + assertionFailure("Failed to create pipeline state: \(error)") + } + + // Notice that we don't configure the stencilTest property, leaving stencil testing disabled + let depthStencilDescriptor = MTLDepthStencilDescriptor() + depthStencilDescriptor.depthCompareFunction = .always // Or another value as needed + depthStencilDescriptor.isDepthWriteEnabled = false + + depthStencilStateWithoutStencil = device!.makeDepthStencilState(descriptor: depthStencilDescriptor) + #endif + } + + override func willMove(from _: MLNMapView) {} + + override func draw(in _: MLNMapView, with context: MLNStyleLayerDrawingContext) { + #if MLN_RENDER_BACKEND_METAL + // Use the supplied render command encoder to encode commands + guard let renderEncoder else { + return + } + + let p1 = project(CLLocationCoordinate2D(latitude: 25.0, longitude: 12.5)) + let p2 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) + let p3 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 25.0)) + + struct Vertex { + var position: vector_float2 + var color: vector_float4 + } + + let triangleVertices: [Vertex] = [ + Vertex(position: vector_float2(Float(p1.x), Float(p1.y)), color: vector_float4(1, 0, 0, 1)), + Vertex(position: vector_float2(Float(p2.x), Float(p2.y)), color: vector_float4(0, 1, 0, 1)), + Vertex(position: vector_float2(Float(p3.x), Float(p3.y)), color: vector_float4(0, 0, 1, 1)), + ] + + // Convert the projection matrix to float from double, and scale it to match our projection + var projectionMatrix = convertMatrix(context.projectionMatrix) + let worldSize = 512.0 * pow(2.0, context.zoomLevel) + projectionMatrix.m00 = projectionMatrix.m00 * Float(worldSize) + projectionMatrix.m11 = projectionMatrix.m11 * Float(worldSize) + + renderEncoder.setRenderPipelineState(pipelineState!) + renderEncoder.setDepthStencilState(depthStencilStateWithoutStencil) + + // Pass in the parameter data. + renderEncoder.setVertexBytes(triangleVertices, length: MemoryLayout.size * triangleVertices.count, index: 0) + renderEncoder.setVertexBytes(&projectionMatrix, length: MemoryLayout.size, index: 1) + + // Draw the triangle. + renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3) + #endif + } + + func project(_ coordinate: CLLocationCoordinate2D) -> CGPoint { + // We project the coordinates into the space 0 to 1 and then scale these when drawing based on the current zoom level + let worldSize = 1.0 + let x = (180.0 + coordinate.longitude) / 360.0 * worldSize + let yi = log(tan((45.0 + coordinate.latitude / 2.0) * Double.pi / 180.0)) + let y = (180.0 - yi * (180.0 / Double.pi)) / 360.0 * worldSize + + return CGPoint(x: x, y: y) + } + + struct MLNMatrix4f { + var m00, m01, m02, m03: Float + var m10, m11, m12, m13: Float + var m20, m21, m22, m23: Float + var m30, m31, m32, m33: Float + } + + func convertMatrix(_ mat: MLNMatrix4) -> MLNMatrix4f { + MLNMatrix4f( + m00: Float(mat.m00), m01: Float(mat.m01), m02: Float(mat.m02), m03: Float(mat.m03), + m10: Float(mat.m10), m11: Float(mat.m11), m12: Float(mat.m12), m13: Float(mat.m13), + m20: Float(mat.m20), m21: Float(mat.m21), m22: Float(mat.m22), m23: Float(mat.m23), + m30: Float(mat.m30), m31: Float(mat.m31), m32: Float(mat.m32), m33: Float(mat.m33) + ) + } +} + +// #-end-example-code diff --git a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift index db2c95a3208a..e08aa876e201 100644 --- a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift +++ b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift @@ -8,6 +8,11 @@ struct MapLibreNavigationView: View { NavigationLink("SimpleMap") { SimpleMap().edgesIgnoringSafeArea(.all) } + #if MLN_RENDER_BACKEND_METAL + NavigationLink("CustomStyleLayer (Metal)") { + CustomStyleLayerExample().edgesIgnoringSafeArea(.all) + } + #endif NavigationLink("LineTapMap") { LineTapMap().edgesIgnoringSafeArea(.all) } diff --git a/platform/ios/src/MLNMapView+Impl.h b/platform/ios/src/MLNMapView+Impl.h index c78fd4531347..ff413367e2a1 100644 --- a/platform/ios/src/MLNMapView+Impl.h +++ b/platform/ios/src/MLNMapView+Impl.h @@ -54,7 +54,7 @@ class MLNMapViewImpl : public mbgl::MapObserver { // Called by the view delegate when it's time to render. void render(); - virtual MLNBackendResource getObject() = 0; + virtual MLNBackendResource* getObject() = 0; // mbgl::MapObserver implementation void onCameraWillChange(mbgl::MapObserver::CameraChangeMode) override; diff --git a/platform/ios/src/MLNMapView+Metal.h b/platform/ios/src/MLNMapView+Metal.h index cd7e80a1583b..39cdc98a20f9 100644 --- a/platform/ios/src/MLNMapView+Metal.h +++ b/platform/ios/src/MLNMapView+Metal.h @@ -43,6 +43,6 @@ class MLNMapViewMetalImpl final : public MLNMapViewImpl, void deleteView() override; UIImage* snapshot() override; void layoutChanged() override; - MLNBackendResource getObject() override; + MLNBackendResource* getObject() override; // End implementation of MLNMapViewImpl }; diff --git a/platform/ios/src/MLNMapView+Metal.mm b/platform/ios/src/MLNMapView+Metal.mm index 54c530c83838..976b5471703f 100644 --- a/platform/ios/src/MLNMapView+Metal.mm +++ b/platform/ios/src/MLNMapView+Metal.mm @@ -227,13 +227,12 @@ void swap() override { static_cast(mapView.bounds.size.height * scaleFactor) }; } -MLNBackendResource MLNMapViewMetalImpl::getObject() { +MLNBackendResource* MLNMapViewMetalImpl::getObject() { auto& resource = getResource(); auto renderPassDescriptor = resource.getRenderPassDescriptor().get(); - return { - resource.mtlView, - resource.mtlView.device, - [MTLRenderPassDescriptor renderPassDescriptor], - resource.commandBuffer - }; + + return [[MLNBackendResource alloc] initWithMTKView:resource.mtlView + device:resource.mtlView.device + renderPassDescriptor:[MTLRenderPassDescriptor renderPassDescriptor] + commandBuffer:resource.commandBuffer]; } diff --git a/platform/ios/src/MLNMapView+OpenGL.h b/platform/ios/src/MLNMapView+OpenGL.h index bd7d60f0e898..263ab3461473 100644 --- a/platform/ios/src/MLNMapView+OpenGL.h +++ b/platform/ios/src/MLNMapView+OpenGL.h @@ -52,6 +52,6 @@ class MLNMapViewOpenGLImpl final : public MLNMapViewImpl, void deleteView() override; UIImage* snapshot() override; void layoutChanged() override; - MLNBackendResource getObject() override; + MLNBackendResource* getObject() override; // End implementation of MLNMapViewImpl }; diff --git a/platform/ios/src/MLNMapView+OpenGL.mm b/platform/ios/src/MLNMapView+OpenGL.mm index 3e3cc000628c..ab3c6625a764 100644 --- a/platform/ios/src/MLNMapView+OpenGL.mm +++ b/platform/ios/src/MLNMapView+OpenGL.mm @@ -253,6 +253,6 @@ void bind() override { return resource.context; } -MLNBackendResource MLNMapViewOpenGLImpl::getObject() { - return MLNBackendResource(); +MLNBackendResource* MLNMapViewOpenGLImpl::getObject() { + return [[MLNBackendResource alloc] init]; } diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index a3a1ce7f7f04..7e8423c683fe 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -2120,7 +2120,7 @@ vertically on the map. */ @property (nonatomic) MLNMapDebugMaskOptions debugMask; -- (MLNBackendResource)backendResource; +- (MLNBackendResource *)backendResource; @end NS_ASSUME_NONNULL_END diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index fe9c58a6df0f..24dd6128b0a6 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -7361,7 +7361,7 @@ - (void)prepareForInterfaceBuilder return _annotationViewReuseQueueByIdentifier[identifier]; } -- (MLNBackendResource)backendResource { +- (MLNBackendResource*)backendResource { return _mbglView->getObject(); } From ec4d6e67c1f400d33716d031e46414bc95785ec5 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 22 Jan 2025 11:50:44 +0100 Subject: [PATCH 055/339] Add documentation custom style layers (#3165) --- platform/darwin/src/MLNCustomStyleLayer.h | 91 +++++++++ platform/darwin/src/MLNCustomStyleLayer.mm | 108 +--------- .../ios/MapLibre.docc/BuildingLightExample.md | 2 +- .../MapLibre.docc/CustomStyleLayerExample.md | 192 ++++++++++++++++++ .../ManageOfflineRegionsExample.md | 2 +- platform/ios/MapLibre.docc/MapLibre.md | 4 + .../Sources/CustomStyleLayerExample.swift | 39 ++-- 7 files changed, 320 insertions(+), 118 deletions(-) create mode 100644 platform/ios/MapLibre.docc/CustomStyleLayerExample.md diff --git a/platform/darwin/src/MLNCustomStyleLayer.h b/platform/darwin/src/MLNCustomStyleLayer.h index 666013d1438e..d0c57a714d02 100644 --- a/platform/darwin/src/MLNCustomStyleLayer.h +++ b/platform/darwin/src/MLNCustomStyleLayer.h @@ -16,42 +16,133 @@ NS_ASSUME_NONNULL_BEGIN @class MLNMapView; @class MLNStyle; +/// A structure containing context needed to draw a frame in an ``MLNCustomStyleLayer``. typedef struct MLNStyleLayerDrawingContext { + /// The size of the drawable area, in points. CGSize size; + /// The center coordinate of the map view. CLLocationCoordinate2D centerCoordinate; + /// The current zoom level of the map view. double zoomLevel; + /// The heading (direction) in degrees clockwise from true north. CLLocationDirection direction; + /// The current pitch of the map view in degrees, measured from the map plane. CGFloat pitch; + /// The vertical field of view, in degrees, for the map’s perspective. CGFloat fieldOfView; + /// A 4×4 matrix representing the map view’s current projection state. MLNMatrix4 projectionMatrix; } MLNStyleLayerDrawingContext; +/// A style layer that is rendered by Metal code that you provide. +/// +/// By default, this class does nothing. You can subclass it to provide custom +/// Metal drawing code that is run on each frame of the map. +/// +/// You can access an existing ``MLNCustomStyleLayer`` using the +/// ``MLNStyle/layerWithIdentifier:`` method if you know its identifier; +/// otherwise, find it using the ``MLNStyle/layers`` property. You can also +/// create a new ``MLNCustomStyleLayer`` and add it to the style using a method such as +/// ``MLNStyle/addLayer:``. +/// +/// - Warning: This API experimental. It may change +/// at any time without notice. MLN_EXPORT @interface MLNCustomStyleLayer : MLNStyleLayer +/// The style that currently contains the layer. +/// +/// If the layer is not currently part of any style, this property is `nil`. @property (nonatomic, weak, readonly) MLNStyle *style; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" + #if TARGET_OS_IPHONE +/// The OpenGL ES rendering context used for drawing this layer. +/// +/// This property is only valid when using the OpenGL-based rendering backend. +/// If the Metal backend is in use, this property will be unavailable +/// (or `nil`). This property is deprecated and will be removed in a future release. +/// +/// - Warning: Deprecated and will be removed in a future release. @property (nonatomic, readonly) EAGLContext *context; #else +/// The macOS CGL rendering context used for drawing this layer. +/// +/// This property is only valid when using the OpenGL-based rendering backend. +/// If the Metal backend is in use, this property will be `NULL`. +/// This property is deprecated and may be removed in a future release. +/// +/// - Warning: Deprecated and may be removed in a future release. @property (nonatomic, readonly) CGLContextObj context; #endif + #pragma clang diagnostic pop #if MLN_RENDER_BACKEND_METAL +/// The Metal render command encoder used for issuing Metal draw commands. +/// +/// This property is only valid when using the Metal-based rendering backend. +/// If the OpenGL backend is in use, this property will be `nil`. @property (nonatomic, weak) id renderEncoder; #endif +/// Returns an ``MLNCustomStyleLayer`` style layer object initialized with the given identifier. +/// +/// After initializing and configuring the style layer, add it to a map view’s style +/// using the ``MLNStyle/addLayer:`` or +/// ``MLNStyle/insertLayer:belowLayer:`` method. +/// +/// - Parameter identifier: A string that uniquely identifies the layer in the style +/// to which it is added. +/// - Returns: An initialized custom style layer. - (instancetype)initWithIdentifier:(NSString *)identifier; +/// Called immediately after a layer is added to a map view’s style. +/// +/// Override this method in a subclass to perform any setup work before the layer +/// is used to draw a frame. For example, you might compile an OpenGL shader here. +/// The default implementation of this method does nothing. +/// +/// Any resource acquired in this method must be released in +/// ``willMoveFromMapView:``. +/// +/// - Parameter mapView: The map view to whose style the layer has been added. - (void)didMoveToMapView:(MLNMapView *)mapView; +/// Called immediately before a layer is removed from a map view’s style. +/// +/// Override this method in a subclass to perform any teardown work once the +/// layer has drawn its last frame and is about to be removed from the style. +/// The default implementation of this method does nothing. +/// +/// This method may be called even if ``didMoveToMapView:`` has not been called. +/// +/// - Parameter mapView: The map view from whose style the layer is about to be removed. - (void)willMoveFromMapView:(MLNMapView *)mapView; +/// Called each time the layer needs to draw a new frame in a map view. +/// +/// Override this method in a subclass to draw the layer’s content. The default +/// implementation of this method does nothing. +/// +/// Your implementation should not make any assumptions about the OpenGL or Metal +/// state, other than that the current context/encoder is active. You may make +/// changes to the state as needed. You are not required to reset values such as +/// the depth or stencil configuration to their original values. +/// +/// Be sure to draw your fragments with a *z* value of 1 to take advantage of +/// opaque fragment culling, in case the style contains any opaque layers above +/// this layer. +/// +/// - Parameters: +/// - mapView: The map view to which the layer draws. +/// - context: A context structure with information defining the frame to draw. - (void)drawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context; +/// Forces the map view associated with this style to redraw the receiving layer, +/// causing the ``drawInMapView:withContext:`` method to be called again. - (void)setNeedsDisplay; @end diff --git a/platform/darwin/src/MLNCustomStyleLayer.mm b/platform/darwin/src/MLNCustomStyleLayer.mm index d88ddb020195..5e3107bb4c34 100644 --- a/platform/darwin/src/MLNCustomStyleLayer.mm +++ b/platform/darwin/src/MLNCustomStyleLayer.mm @@ -19,56 +19,19 @@ class MLNCustomLayerHost; -/** - An ``MLNCustomStyleLayer`` is a style layer that is rendered by OpenGL / Metal code that - you provide. - - By default, this class does nothing. You can subclass this class to provide - custom OpenGL or Metal drawing code that is run on each frame of the map. Your subclass - should override the `-didMoveToMapView:`, `-willMoveFromMapView:`, and - `-drawInMapView:withContext:` methods. - - You can access an existing MLNCustomStyleLayer using the - ``MLNStyle/layerWithIdentifier:`` method if you know its identifier; - otherwise, find it using the ``MLNStyle/layers`` property. You can also create a - new MLNCustomStyleLayer and add it to the style using a method such as - ``MLNStyle/addLayer:``. - - @warning This API is undocumented and therefore unsupported. It may change at - any time without notice. - */ @interface MLNCustomStyleLayer () - @property (nonatomic, readonly) mbgl::style::CustomLayer *rawLayer; - @property (nonatomic, readonly, nullable) MLNMapView *mapView; - -/** - The style currently containing the layer. - - If the layer is not currently part of any style, this property is - set to `nil`. - */ @property (nonatomic, weak, readwrite) MLNStyle *style; - @end @implementation MLNCustomStyleLayer -/** - Returns an MLNCustomStyleLayer style layer object initialized with the given identifier. - - After initializing and configuring the style layer, add it to a map view’s - style using the ``MLNStyle/addLayer:`` or - ``MLNStyle/insertLayer:belowLayer:`` method. - - @param identifier A string that uniquely identifies the layer in the style to - which it is added. - @return An initialized OpenGL style layer. - */ - (instancetype)initWithIdentifier:(NSString *)identifier { - auto layer = std::make_unique(identifier.UTF8String, - std::make_unique(self)); + auto layer = std::make_unique( + identifier.UTF8String, + std::make_unique(self) + ); return self = [super initWithPendingLayer:std::move(layer)]; } @@ -93,7 +56,6 @@ - (CGLContextObj)context { } #endif -// MARK: - Adding to and removing from a map view - (void)addToStyle:(MLNStyle *)style belowLayer:(MLNStyleLayer *)otherLayer { self.style = style; self.style.customLayers[self.identifier] = self; @@ -106,66 +68,15 @@ - (void)removeFromStyle:(MLNStyle *)style { self.style = nil; } -/** - Called immediately after a layer is added to a map view’s style. - - This method is intended to be overridden in a subclass. You can use this method - to perform any setup work before the layer is used to draw a frame. For - example, you might use this method to compile an OpenGL shader. The default - implementation of this method does nothing. - - Any resource acquired in this method must be released in - `-willMoveFromMapView:`. - - @param mapView The map view to whose style the layer has been added. - */ - (void)didMoveToMapView:(MLNMapView *)mapView { - } -/** - Called immediately before a layer is removed from a map view’s style. - - This method is intended to be overridden in a subclass. You can use this method - to perform any teardown work once the layer has drawn its last frame and is - about to be removed from the style. The default implementation of this method - does nothing. - - This method may be called even if `-didMoveToMapView:` has not been called. - - @param mapView The map view from whose style the layer is about to be removed. - */ - (void)willMoveFromMapView:(MLNMapView *)mapView { - } -/** - Called each time the layer needs to draw a new frame in a map view. - - This method is intended to be overridden in a subclass. You can use this method - to draw the layer’s content. The default implementation of this method does - nothing. - - Your implementation should not make any assumptions about the OpenGL state, - other than that the current OpenGL context is active. It may make changes to - the OpenGL state. It is not required to reset values such as the depth mask, - stencil mask, or corresponding test flags to their original values. - - Be sure to draw your fragments with a z value of 1 to take advantage - of the opaque fragment culling, in case the style contains any opaque layers - above this layer. - - @param mapView The map view to which the layer draws. - @param context A context structure with information defining the frame to draw. - */ - (void)drawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context { - } -/** - Forces the map view associated with this style to redraw the receiving layer, - causing the `-drawInMapView:withContext:` method to be called. - */ - (void)setNeedsDisplay { [self.mapView setNeedsRerender]; } @@ -189,10 +100,11 @@ void initialize() { } void render(const mbgl::style::CustomLayerRenderParameters& parameters) { - if(!layer) return; + if (!layer) return; #if MLN_RENDER_BACKEND_METAL - MTL::RenderCommandEncoder* ptr = static_cast(parameters).encoder.get(); + MTL::RenderCommandEncoder* ptr = + static_cast(parameters).encoder.get(); id encoder = (__bridge id)ptr; layer.renderEncoder = encoder; #endif @@ -206,12 +118,14 @@ void render(const mbgl::style::CustomLayerRenderParameters& parameters) { .fieldOfView = static_cast(parameters.fieldOfView), .projectionMatrix = MLNMatrix4Make(parameters.projectionMatrix) }; + if (layer.mapView) { [layer drawInMapView:layer.mapView withContext:drawingContext]; } } - void contextLost() {} + void contextLost() { + } void deinitialize() { if (layer == nil) return; @@ -222,6 +136,7 @@ void deinitialize() { layerRef = layer; layer = nil; } + private: __weak MLNCustomStyleLayer * layerRef; MLNCustomStyleLayer * layer = nil; @@ -234,4 +149,3 @@ void deinitialize() { } } // namespace mbgl - diff --git a/platform/ios/MapLibre.docc/BuildingLightExample.md b/platform/ios/MapLibre.docc/BuildingLightExample.md index d5741191d3f4..672bfee1884a 100644 --- a/platform/ios/MapLibre.docc/BuildingLightExample.md +++ b/platform/ios/MapLibre.docc/BuildingLightExample.md @@ -77,7 +77,7 @@ class BuildingLightExample: UIViewController, MLNMapViewDelegate { } func addFillExtrusionLayer(style: MLNStyle) { - // Access the OpenMapTiles source and use it to create a `MLNFillExtrusionStyleLayer`. The source identifier is `openmaptiles`. Use the `sources` property on a style to verify source identifiers. + // Access the OpenMapTiles source and use it to create a ``MLNFillExtrusionStyleLayer``. The source identifier is `openmaptiles`. Use the `sources` property on a style to verify source identifiers. guard let source = style.source(withIdentifier: "openmaptiles") else { print("Could not find source openmaptiles") return diff --git a/platform/ios/MapLibre.docc/CustomStyleLayerExample.md b/platform/ios/MapLibre.docc/CustomStyleLayerExample.md new file mode 100644 index 000000000000..48c7e94eb700 --- /dev/null +++ b/platform/ios/MapLibre.docc/CustomStyleLayerExample.md @@ -0,0 +1,192 @@ +# Custom Style Layers (Metal API) + +Creating a Custom Style Layer with Metal + +Custom style layers allow you to draw directly with Metal, enabling you to render specialized shapes, custom geometry, or apply advanced visual effects that go beyond what is possible with standard style layers. + +Below you can find an example of how to create a custom style layer with ``MLNCustomStyleLayer``. In this implementation, a SwiftUI view wraps an ``MLNMapView`` and appends a subclassed custom style layer once the map loads. The layer’s ``MLNCustomStyleLayer/didMoveToMapView:`` method handles initialization, including compiling Metal shaders and creating a [`MTLRenderPipelineState`](https://developer.apple.com/documentation/metal/mtlrenderpipelinestate?language=objc) for subsequent draw operations. The ``MLNCustomStyleLayer/willMoveFromMapView:`` method provides a place to release or invalidate resources when the layer is removed from the map, while the ``MLNCustomStyleLayer/drawInMapView:withContext:`` method encodes the drawing commands using a [`MTLRenderCommandEncoder`](https://developer.apple.com/documentation/metal/mtlrendercommandencoder) and the map’s projection matrix. By projecting latitude/longitude coordinates into a normalized 0–1 space and then transforming them into tile coordinates, the layer ensures that rendered geometry aligns correctly with the base map. + +![](CustomStyleLayerExample.png) + + + +```swift +struct CustomStyleLayerExample: UIViewRepresentable { + func makeCoordinator() -> CustomStyleLayerExample.Coordinator { + Coordinator(self) + } + + final class Coordinator: NSObject, MLNMapViewDelegate { + var control: CustomStyleLayerExample + + init(_ control: CustomStyleLayerExample) { + self.control = control + } + + func mapViewDidFinishLoadingMap(_ mapView: MLNMapView) { + let mapOverlay = CustomStyleLayer(identifier: "test-overlay") + let style = mapView.style! + style.layers.append(mapOverlay) + } + } + + func makeUIView(context: Context) -> MLNMapView { + let mapView = MLNMapView() + mapView.delegate = context.coordinator + return mapView + } + + func updateUIView(_: MLNMapView, context _: Context) {} +} + +class CustomStyleLayer: MLNCustomStyleLayer { + private var pipelineState: MTLRenderPipelineState? + private var depthStencilStateWithoutStencil: MTLDepthStencilState? + + override func didMove(to mapView: MLNMapView) { + #if MLN_RENDER_BACKEND_METAL + let resource = mapView.backendResource() + + let shaderSource = """ + #include + using namespace metal; + + typedef struct + { + vector_float2 position; + vector_float4 color; + } Vertex; + + struct RasterizerData + { + float4 position [[position]]; + float4 color; + }; + + struct Uniforms + { + float4x4 matrix; + }; + + vertex RasterizerData + vertexShader(uint vertexID [[vertex_id]], + constant Vertex *vertices [[buffer(0)]], + constant Uniforms &uniforms [[buffer(1)]]) + { + RasterizerData out; + + const float4 position = uniforms.matrix * float4(float2(vertices[vertexID].position.xy), 1, 1); + + out.position = position; + out.color = vertices[vertexID].color; + + return out; + } + + fragment float4 fragmentShader(RasterizerData in [[stage_in]]) + { + return in.color; + } + """ + + var error: NSError? + let device = resource.device + let library = try? device?.makeLibrary(source: shaderSource, options: nil) + assert(library != nil, "Error compiling shaders: \(String(describing: error))") + let vertexFunction = library?.makeFunction(name: "vertexShader") + let fragmentFunction = library?.makeFunction(name: "fragmentShader") + + // Configure a pipeline descriptor that is used to create a pipeline state. + let pipelineStateDescriptor = MTLRenderPipelineDescriptor() + pipelineStateDescriptor.label = "Simple Pipeline" + pipelineStateDescriptor.vertexFunction = vertexFunction + pipelineStateDescriptor.fragmentFunction = fragmentFunction + pipelineStateDescriptor.colorAttachments[0].pixelFormat = resource.mtkView.colorPixelFormat + pipelineStateDescriptor.depthAttachmentPixelFormat = .depth32Float_stencil8 + pipelineStateDescriptor.stencilAttachmentPixelFormat = .depth32Float_stencil8 + + do { + pipelineState = try device?.makeRenderPipelineState(descriptor: pipelineStateDescriptor) + } catch { + assertionFailure("Failed to create pipeline state: \(error)") + } + + // Notice that we don't configure the stencilTest property, leaving stencil testing disabled + let depthStencilDescriptor = MTLDepthStencilDescriptor() + depthStencilDescriptor.depthCompareFunction = .always // Or another value as needed + depthStencilDescriptor.isDepthWriteEnabled = false + + depthStencilStateWithoutStencil = device!.makeDepthStencilState(descriptor: depthStencilDescriptor) + #endif + } + + override func willMove(from _: MLNMapView) {} + + override func draw(in _: MLNMapView, with context: MLNStyleLayerDrawingContext) { + #if MLN_RENDER_BACKEND_METAL + guard let renderEncoder else { return } + + // Project to 0..1. + let p1 = project(CLLocationCoordinate2D(latitude: 25.0, longitude: 12.5)) + let p2 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) + let p3 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 25.0)) + + // Multiply by the world size so it becomes the tile coordinate system. + let worldSize = 512.0 * pow(2.0, context.zoomLevel) + + let p1Tile = CGPoint(x: p1.x * worldSize, y: p1.y * worldSize) + let p2Tile = CGPoint(x: p2.x * worldSize, y: p2.y * worldSize) + let p3Tile = CGPoint(x: p3.x * worldSize, y: p3.y * worldSize) + + // Then build a triangle from tile coordinates + struct Vertex { var position: vector_float2; var color: vector_float4 } + let triangleVertices: [Vertex] = [ + Vertex(position: vector_float2(Float(p1Tile.x), Float(p1Tile.y)), + color: vector_float4(1, 0, 0, 1)), + Vertex(position: vector_float2(Float(p2Tile.x), Float(p2Tile.y)), + color: vector_float4(0, 1, 0, 1)), + Vertex(position: vector_float2(Float(p3Tile.x), Float(p3Tile.y)), + color: vector_float4(0, 0, 1, 1)), + ] + + // Use the camera's full projection matrix *unchanged*. + var matrix = convertMatrix(context.projectionMatrix) + + // Encode + renderEncoder.setRenderPipelineState(pipelineState!) + renderEncoder.setDepthStencilState(depthStencilStateWithoutStencil) + renderEncoder.setVertexBytes(triangleVertices, length: MemoryLayout.size * triangleVertices.count, index: 0) + renderEncoder.setVertexBytes(&matrix, length: MemoryLayout.size, index: 1) + + // Draw the triangle. + renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3) + #endif + } + + func project(_ coordinate: CLLocationCoordinate2D) -> CGPoint { + // We project the coordinates into the space 0 to 1 and then scale these when drawing based on the current zoom level + let worldSize = 1.0 + let x = (180.0 + coordinate.longitude) / 360.0 * worldSize + let yi = log(tan((45.0 + coordinate.latitude / 2.0) * Double.pi / 180.0)) + let y = (180.0 - yi * (180.0 / Double.pi)) / 360.0 * worldSize + + return CGPoint(x: x, y: y) + } + + struct MLNMatrix4f { + var m00, m01, m02, m03: Float + var m10, m11, m12, m13: Float + var m20, m21, m22, m23: Float + var m30, m31, m32, m33: Float + } + + func convertMatrix(_ mat: MLNMatrix4) -> MLNMatrix4f { + MLNMatrix4f( + m00: Float(mat.m00), m01: Float(mat.m01), m02: Float(mat.m02), m03: Float(mat.m03), + m10: Float(mat.m10), m11: Float(mat.m11), m12: Float(mat.m12), m13: Float(mat.m13), + m20: Float(mat.m20), m21: Float(mat.m21), m22: Float(mat.m22), m23: Float(mat.m23), + m30: Float(mat.m30), m31: Float(mat.m31), m32: Float(mat.m32), m33: Float(mat.m33) + ) + } +} +``` diff --git a/platform/ios/MapLibre.docc/ManageOfflineRegionsExample.md b/platform/ios/MapLibre.docc/ManageOfflineRegionsExample.md index 86e4d786561b..1cd20b2ac9d5 100644 --- a/platform/ios/MapLibre.docc/ManageOfflineRegionsExample.md +++ b/platform/ios/MapLibre.docc/ManageOfflineRegionsExample.md @@ -174,7 +174,7 @@ private extension MLNOfflinePackProgress { return 0 } - let percentage = Float((countOfResourcesCompleted / countOfResourcesExpected) * 100) + let percentage = Float(countOfResourcesCompleted) / Float(countOfResourcesExpected) * 100 return percentage } diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index 17a8230989a8..72a119db1caf 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -49,6 +49,10 @@ Powerful, free and open-source mapping toolkit with full control over data sourc - - +### Advanced + +- + ### Other Articles - diff --git a/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift b/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift index 0d3c3237ace3..bcf4aaac145f 100644 --- a/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift +++ b/platform/ios/app-swift/Sources/CustomStyleLayerExample.swift @@ -118,38 +118,39 @@ class CustomStyleLayer: MLNCustomStyleLayer { override func draw(in _: MLNMapView, with context: MLNStyleLayerDrawingContext) { #if MLN_RENDER_BACKEND_METAL - // Use the supplied render command encoder to encode commands - guard let renderEncoder else { - return - } + guard let renderEncoder else { return } + // Project to 0..1. let p1 = project(CLLocationCoordinate2D(latitude: 25.0, longitude: 12.5)) let p2 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) let p3 = project(CLLocationCoordinate2D(latitude: 0.0, longitude: 25.0)) - struct Vertex { - var position: vector_float2 - var color: vector_float4 - } + // Multiply by the world size so it becomes the tile coordinate system. + let worldSize = 512.0 * pow(2.0, context.zoomLevel) + let p1Tile = CGPoint(x: p1.x * worldSize, y: p1.y * worldSize) + let p2Tile = CGPoint(x: p2.x * worldSize, y: p2.y * worldSize) + let p3Tile = CGPoint(x: p3.x * worldSize, y: p3.y * worldSize) + + // Then build a triangle from tile coordinates + struct Vertex { var position: vector_float2; var color: vector_float4 } let triangleVertices: [Vertex] = [ - Vertex(position: vector_float2(Float(p1.x), Float(p1.y)), color: vector_float4(1, 0, 0, 1)), - Vertex(position: vector_float2(Float(p2.x), Float(p2.y)), color: vector_float4(0, 1, 0, 1)), - Vertex(position: vector_float2(Float(p3.x), Float(p3.y)), color: vector_float4(0, 0, 1, 1)), + Vertex(position: vector_float2(Float(p1Tile.x), Float(p1Tile.y)), + color: vector_float4(1, 0, 0, 1)), + Vertex(position: vector_float2(Float(p2Tile.x), Float(p2Tile.y)), + color: vector_float4(0, 1, 0, 1)), + Vertex(position: vector_float2(Float(p3Tile.x), Float(p3Tile.y)), + color: vector_float4(0, 0, 1, 1)), ] - // Convert the projection matrix to float from double, and scale it to match our projection - var projectionMatrix = convertMatrix(context.projectionMatrix) - let worldSize = 512.0 * pow(2.0, context.zoomLevel) - projectionMatrix.m00 = projectionMatrix.m00 * Float(worldSize) - projectionMatrix.m11 = projectionMatrix.m11 * Float(worldSize) + // Use the camera's full projection matrix *unchanged*. + var matrix = convertMatrix(context.projectionMatrix) + // Encode renderEncoder.setRenderPipelineState(pipelineState!) renderEncoder.setDepthStencilState(depthStencilStateWithoutStencil) - - // Pass in the parameter data. renderEncoder.setVertexBytes(triangleVertices, length: MemoryLayout.size * triangleVertices.count, index: 0) - renderEncoder.setVertexBytes(&projectionMatrix, length: MemoryLayout.size, index: 1) + renderEncoder.setVertexBytes(&matrix, length: MemoryLayout.size, index: 1) // Draw the triangle. renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3) From 6f5b72ffdba9b0cfc612c24fdcf2e48b1e661bf3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 22 Jan 2025 18:03:37 +0100 Subject: [PATCH 056/339] Deploy DocC docs from Ubuntu workflow (#3170) --- .github/workflows/gh-pages-docc.yml | 74 +++++++++++++++++++++++++++++ .github/workflows/ios-ci.yml | 10 ---- platform/windows/vendor/vcpkg | 2 +- 3 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/gh-pages-docc.yml diff --git a/.github/workflows/gh-pages-docc.yml b/.github/workflows/gh-pages-docc.yml new file mode 100644 index 000000000000..d02221794f3f --- /dev/null +++ b/.github/workflows/gh-pages-docc.yml @@ -0,0 +1,74 @@ +name: gh-pages-docc + +permissions: + id-token: write + pages: write + contents: write + +on: + workflow_dispatch: + workflow_run: + workflows: + - ios-ci + types: + - completed + +jobs: + gh-pages-docc-build: + if: ${{ github.ref_name == 'main' }} + name: Build DocC Docs + runs-on: macos-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: us-west-2 + role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} + role-session-name: ${{ github.run_id }} + + - name: Build DocC documentation + working-directory: . + run: | + HOSTING_BASE_PATH="maplibre-native/ios/latest" platform/ios/scripts/docc.sh + + # workaround since colons in filenames are not allowed in artifacts + # https://github.com/actions/upload-artifact/issues/333 + - name: Create ZIP archive + run: | + cd build + zip -r docs.zip docs/ + + - uses: actions/upload-artifact@v4 + with: + name: docc-docs + path: build/docs.zip + + gh-pages-docc-deploy: + needs: gh-pages-docc-build + name: Deploy DocC Docs + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + + - name: Download DocC docs artifacts + uses: actions/download-artifact@v4 + with: + name: docc-docs + path: build + + - name: Unzip documentation + run: | + cd build + unzip docs.zip + rm docs.zip + + - name: Deploy DocC documentation (main) 🚀 + uses: JamesIves/github-pages-deploy-action@v4.7.2 + with: + branch: gh-pages + folder: build/docs + target-folder: ios/latest/ diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index f848c49ea389..afd21f42ffdd 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -29,7 +29,6 @@ on: permissions: id-token: write # needed for AWS contents: write # allow making a release - pages: write jobs: pre_job: @@ -200,15 +199,6 @@ jobs: run: | HOSTING_BASE_PATH="maplibre-native/ios/latest" platform/ios/scripts/docc.sh - - name: Deploy DocC documentation (main) 🚀 - if: github.ref == 'refs/heads/main' - uses: JamesIves/github-pages-deploy-action@v4.7.2 - continue-on-error: true - with: - branch: gh-pages - folder: build/docs - target-folder: ios/latest/ - ios-release: runs-on: macos-14 needs: ios-build diff --git a/platform/windows/vendor/vcpkg b/platform/windows/vendor/vcpkg index 6f29f12e82a8..db4924694eab 160000 --- a/platform/windows/vendor/vcpkg +++ b/platform/windows/vendor/vcpkg @@ -1 +1 @@ -Subproject commit 6f29f12e82a8293156836ad81cc9bf5af41fe836 +Subproject commit db4924694eabc161a7fb8eb43f083d0ca55396e2 From c7b63cd9a7eaef6ce1f577a1acd298d545fd82a5 Mon Sep 17 00:00:00 2001 From: SomeoneElseOSM Date: Fri, 24 Jan 2025 01:47:02 +0000 Subject: [PATCH 057/339] Add more detail documentation Android test app, one minor typo. (#3173) --- docs/mdbook/src/platforms.md | 2 +- platform/android/docs/getting-started.md | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/mdbook/src/platforms.md b/docs/mdbook/src/platforms.md index 01b70ae8f8b0..20a83499e4c8 100644 --- a/docs/mdbook/src/platforms.md +++ b/docs/mdbook/src/platforms.md @@ -26,7 +26,7 @@ You can find an app that uses GLFW in [`platform/glfw`](https://github.com/mapli Originally the project only supported OpenGL 2.0. In 2023, the [renderer was modularized](https://github.com/maplibre/maplibre-native/blob/main/design-proposals/2022-10-27-rendering-modularization.md) allowing for the implementation of alternate rendering backends. The first alternate rendering backend that was implemented was [Metal](https://maplibre.org/news/2024-01-19-metal-support-for-maplibre-native-ios-is-here/), followed by [Vulkan](https://maplibre.org/news/2024-12-12-maplibre-android-vulkan/). In the future other rendering backends could be implemented such as WebGPU. -What platfroms support which rendering backend can be found below. +What platforms support which rendering backend can be found below. | Platform | OpenGL ES 3.0 | Vulkan 1.0 | Metal | |---|---|---|---| diff --git a/platform/android/docs/getting-started.md b/platform/android/docs/getting-started.md index 9e05c22334b6..bcd2c845d9f7 100644 --- a/platform/android/docs/getting-started.md +++ b/platform/android/docs/getting-started.md @@ -1,6 +1,8 @@ # Quickstart -1. Add bintray Maven repositories to your project-level Gradle file (usually `//build.gradle`). +To follow this example from scratch, in Android Studio create a new "Empty Views Activity" and then select "Kotlin" as the language. Select "Groovy DSL" as the build configuration language. + +1. If you have an older project, you'll need to add bintray Maven repositories to your project-level Gradle file (usually `//build.gradle`). Add `mavenCentral()` to where repositories are already defined in that file, something like this: ```gradle allprojects { @@ -11,13 +13,15 @@ } ``` -2. Add the library as a dependency into your module Gradle file (usually `//build.gradle`). Replace `` with the [latest MapLibre Android version](https://github.com/maplibre/maplibre-native/releases?q=android-v11&expanded=true) (e.g.: `org.maplibre.gl:android-sdk:11.5.2`): + A newly-created app will likely already have `mavenCentral()` in a top-level `settings.gradle` file, and you won't need to add it. + +2. Add the library as a dependency into your module Gradle file (usually `//build.gradle`). Replace `` with the [latest MapLibre Android version](https://github.com/maplibre/maplibre-native/releases?q=android-v11&expanded=true) (e.g.: `org.maplibre.gl:android-sdk:11.8.0`): ```gradle dependencies { ... implementation 'org.maplibre.gl:android-sdk:' - ... + } ``` @@ -35,17 +39,16 @@ ... ``` -5. Initialize the `MapView` in your `MainActivity` file by following the example below: +5. Initialize the `MapView` in your `MainActivity` file by following the example below. If modifying a newly-created "Empty Views Activity" example, it replaces all the Kotlin code after the "package" line. ```kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.LayoutInflater - import org.maplibre.android.Maplibre + import org.maplibre.android.MapLibre import org.maplibre.android.camera.CameraPosition import org.maplibre.android.geometry.LatLng import org.maplibre.android.maps.MapView - import org.maplibre.android.testapp.R class MainActivity : AppCompatActivity() { From c79b6dcf52152a9e98aefae305ce821dfd2178a8 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 24 Jan 2025 20:43:50 +0100 Subject: [PATCH 058/339] Add end-of-file-fixer pre-commit hook (#3176) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .bazelignore | 2 +- .bazelrc | 2 +- .github/ISSUE_TEMPLATE/config.yml | 1 - .../actions/android-build-and-upload-render-test/action.yml | 2 +- .github/actions/get-pr-number/action.yml | 2 +- .github/actions/save-pr-number/action.yml | 2 +- .github/changed-files.yml | 2 +- .github/renovate.json | 2 +- .nvmrc | 2 +- .pre-commit-config.yaml | 5 +++-- LICENSES.core.md | 1 - benchmark/android/.gitignore | 2 +- benchmark/android/settings.gradle | 1 - benchmark/fixtures/api/style.json | 2 +- benchmark/fixtures/api/style_formatted_labels.json | 2 +- benchmark/ios/Info.plist | 2 +- bin/CMakeLists.txt | 2 +- design-proposals/2022-09-02-kotlin.md | 2 +- design-proposals/2023-06-17-android-annotations.md | 2 +- .../2023-11-08-complex-animatable-interactive-annotations.md | 1 - docs/.gitignore | 2 +- docs/mdbook/diff.css | 2 +- docs/mdbook/src/android/README.md | 2 +- docs/mdbook/src/android/android-documentation.md | 2 +- docs/mdbook/src/android/benchmark.md | 2 +- docs/mdbook/src/ios/README.md | 2 +- docs/mdbook/src/ios/ios-documentation.md | 2 +- docs/mdbook/src/ios/ios-tests.md | 2 +- docs/mdbook/src/profiling/README.md | 2 +- docs/mdbook/src/rust.md | 2 +- expression-test/expression_test_parser.hpp | 2 +- include/mbgl/util/bitmask_operations.hpp | 2 +- include/mbgl/util/monotonic_timer.hpp | 2 +- .../location_indicator/dateline/metrics.json | 2 +- .../location_indicator/default/metrics.json | 2 +- .../location_indicator/no_radius_border/metrics.json | 2 +- .../location_indicator/no_radius_fill/metrics.json | 2 +- .../location_indicator/no_textures/metrics.json | 2 +- .../location_indicator/one_texture/metrics.json | 2 +- .../location_indicator/rotated/metrics.json | 2 +- .../location_indicator/tilted/metrics.json | 2 +- .../location_indicator/tilted_texture_shift/metrics.json | 2 +- .../tilted_texture_shift_bottom_left/metrics.json | 2 +- .../tilted_texture_shift_bottom_right/metrics.json | 2 +- .../tilted_texture_shift_top_left/metrics.json | 2 +- .../tilted_texture_shift_top_right/metrics.json | 2 +- .../location_indicator/two_textures/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--image-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-opaque/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-opaque/metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../render-tests/extent/1024-symbol/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../fill-extrusion-base/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/default/metrics.json | 2 +- .../fill-extrusion-opacity/function/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/default/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/default/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/false/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/stretchable-content/metrics.json | 2 +- .../render-tests/icon-image/stretchable/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/stretch-fifteen-part/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-@2x/metrics.json | 2 +- .../stretch-nine-part-content-collision/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-content/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-height/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-width/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part/metrics.json | 2 +- .../icon-text-fit/stretch-three-part/metrics.json | 2 +- .../render-tests/icon-text-fit/stretch-two-part/metrics.json | 2 +- .../icon-text-fit/stretch-underscale/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/perspective/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../runtime-styling/set-style-glyphs/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/array-default-only/metrics.json | 2 +- .../render-tests/sprites/array-multiple/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-visibility/visible/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-images/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/chinese/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../render-tests/text-size/zero/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tile-mode/streets-v11/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../tilejson-bounds/overwrite-bounds/metrics.json | 2 +- .../render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- metrics/binary-size/android-arm64-v8a/metrics.json | 2 +- metrics/binary-size/android-armeabi-v7a/metrics.json | 2 +- metrics/binary-size/android-x86/metrics.json | 2 +- metrics/binary-size/android-x86_64/metrics.json | 2 +- metrics/binary-size/linux-clang8/metrics.json | 2 +- metrics/binary-size/linux-gcc8/metrics.json | 2 +- metrics/binary-size/macos-xcode11/metrics.json | 2 +- metrics/ignores/linux-drawable.json | 2 +- metrics/ignores/linux-vulkan.json | 2 +- metrics/ignores/platform-android-vulkan.json | 2 +- metrics/integration/data/chinese.geojson | 2 +- metrics/integration/data/places.geojson | 2 +- .../expression-tests/index-of/assert-array/test.json | 2 +- .../expression-tests/index-of/assert-string/test.json | 2 +- .../expression-tests/index-of/basic-string/test.json | 2 +- .../expression-tests/index-of/invalid-haystack/test.json | 2 +- .../expression-tests/index-of/invalid-needle/test.json | 2 +- .../expression-tests/index-of/with-from-index/test.json | 2 +- .../expression-tests/slice/array-one-index/test.json | 2 +- .../expression-tests/slice/array-two-indexes/test.json | 2 +- .../expression-tests/slice/invalid-inputs/test.json | 2 +- .../expression-tests/slice/string-one-index/test.json | 2 +- .../expression-tests/slice/string-two-indexes/test.json | 2 +- metrics/integration/geojson/anchors.json | 2 +- .../circle-pitch-scale/map-inside-align-map/expected.json | 2 +- .../map-inside-align-viewport/expected.json | 2 +- .../circle-pitch-scale/map-outside-align-map/expected.json | 2 +- .../map-outside-align-viewport/expected.json | 2 +- .../viewport-inside-align-map/expected.json | 2 +- .../viewport-inside-align-viewport/expected.json | 2 +- .../viewport-outside-align-map/expected.json | 2 +- .../viewport-outside-align-viewport/expected.json | 2 +- .../circle-radius-features-in/inside/expected.json | 2 +- .../query-tests/circle-radius-features-in/inside/style.json | 2 +- .../circle-radius-features-in/outside/expected.json | 2 +- .../query-tests/circle-radius-features-in/outside/style.json | 2 +- .../query-tests/circle-radius/feature-state/expected.json | 2 +- .../query-tests/circle-radius/feature-state/style.json | 2 +- .../query-tests/circle-radius/inside/expected.json | 2 +- .../integration/query-tests/circle-radius/inside/style.json | 2 +- .../query-tests/circle-radius/outside/expected.json | 2 +- .../integration/query-tests/circle-radius/outside/style.json | 2 +- .../circle-radius/property-function/expected.json | 2 +- .../query-tests/circle-radius/tile-boundary/expected.json | 2 +- .../circle-radius/zoom-and-property-function/expected.json | 2 +- .../circle-stroke-width/feature-state/expected.json | 2 +- .../query-tests/circle-stroke-width/feature-state/style.json | 2 +- .../query-tests/circle-stroke-width/inside/expected.json | 2 +- .../query-tests/circle-stroke-width/outside/expected.json | 2 +- .../query-tests/circle-translate-anchor/map/expected.json | 2 +- .../query-tests/circle-translate-anchor/map/style.json | 2 +- .../circle-translate-anchor/viewport/expected.json | 2 +- .../query-tests/circle-translate-anchor/viewport/style.json | 2 +- .../query-tests/circle-translate/box/expected.json | 2 +- .../integration/query-tests/circle-translate/box/style.json | 2 +- .../query-tests/circle-translate/inside/expected.json | 2 +- .../query-tests/circle-translate/inside/style.json | 2 +- .../query-tests/circle-translate/outside/expected.json | 2 +- .../query-tests/circle-translate/outside/style.json | 2 +- .../edge-cases/box-cutting-antimeridian-z0/expected.json | 2 +- .../edge-cases/box-cutting-antimeridian-z1/expected.json | 2 +- .../edge-cases/box-cutting-antimeridian-z1/style.json | 2 +- .../query-tests/edge-cases/null-island/expected.json | 2 +- .../query-tests/edge-cases/null-island/style.json | 2 +- .../query-tests/edge-cases/unsorted-keys/expected.json | 2 +- .../query-tests/feature-state/default/expected.json | 2 +- .../integration/query-tests/feature-state/default/style.json | 2 +- .../query-tests/fill-extrusion/base-in/expected.json | 2 +- .../query-tests/fill-extrusion/base-out/expected.json | 2 +- .../query-tests/fill-extrusion/box-in/expected.json | 2 +- .../query-tests/fill-extrusion/box-out/expected.json | 2 +- .../query-tests/fill-extrusion/side-in/expected.json | 2 +- .../query-tests/fill-extrusion/side-out/expected.json | 2 +- .../fill-extrusion/sort-concave-inner/expected.json | 2 +- .../fill-extrusion/sort-concave-outer/expected.json | 2 +- .../query-tests/fill-extrusion/sort-rotated/expected.json | 2 +- .../query-tests/fill-extrusion/sort/expected.json | 2 +- .../query-tests/fill-extrusion/top-in/expected.json | 2 +- .../query-tests/fill-extrusion/top-out/expected.json | 2 +- .../query-tests/fill-features-in/default/expected.json | 2 +- .../query-tests/fill-features-in/default/style.json | 2 +- .../query-tests/fill-features-in/rotated/expected.json | 2 +- .../query-tests/fill-features-in/rotated/style.json | 2 +- .../query-tests/fill-features-in/tilted/expected.json | 2 +- .../query-tests/fill-features-in/tilted/style.json | 2 +- .../query-tests/fill-translate-anchor/map/expected.json | 2 +- .../query-tests/fill-translate-anchor/map/style.json | 2 +- .../query-tests/fill-translate-anchor/viewport/expected.json | 2 +- .../query-tests/fill-translate-anchor/viewport/style.json | 2 +- .../query-tests/fill-translate/literal/expected.json | 2 +- .../query-tests/fill-translate/literal/style.json | 2 +- metrics/integration/query-tests/fill/default/expected.json | 2 +- metrics/integration/query-tests/fill/default/style.json | 2 +- .../integration/query-tests/fill/fill-pattern/expected.json | 2 +- .../integration/query-tests/fill/overscaled/expected.json | 2 +- metrics/integration/query-tests/fill/overscaled/style.json | 2 +- .../query-tests/geometry/linestring/expected.json | 2 +- .../integration/query-tests/geometry/linestring/style.json | 2 +- .../query-tests/geometry/multilinestring/expected.json | 2 +- .../query-tests/geometry/multilinestring/style.json | 2 +- .../query-tests/geometry/multipoint/expected.json | 2 +- .../integration/query-tests/geometry/multipoint/style.json | 2 +- .../query-tests/geometry/multipolygon/expected.json | 2 +- .../integration/query-tests/geometry/multipolygon/style.json | 2 +- metrics/integration/query-tests/geometry/point/expected.json | 2 +- metrics/integration/query-tests/geometry/point/style.json | 2 +- .../integration/query-tests/geometry/polygon/expected.json | 2 +- metrics/integration/query-tests/geometry/polygon/style.json | 2 +- .../invisible-features/visibility-none/expected.json | 2 +- .../invisible-features/zero-opacity/expected.json | 2 +- .../query-tests/line-gap-width/feature-state/expected.json | 2 +- .../query-tests/line-gap-width/feature-state/style.json | 2 +- .../line-gap-width/inside-fractional/expected.json | 2 +- .../query-tests/line-gap-width/inside-fractional/style.json | 2 +- .../query-tests/line-gap-width/inside/expected.json | 2 +- .../integration/query-tests/line-gap-width/inside/style.json | 2 +- .../line-gap-width/outside-fractional/expected.json | 2 +- .../query-tests/line-gap-width/outside-fractional/style.json | 2 +- .../query-tests/line-gap-width/outside/expected.json | 2 +- .../query-tests/line-gap-width/outside/style.json | 2 +- .../line-gap-width/property-function/expected.json | 2 +- .../query-tests/line-offset/feature-state/expected.json | 2 +- .../query-tests/line-offset/feature-state/style.json | 2 +- .../query-tests/line-offset/inside-fractional/expected.json | 2 +- .../query-tests/line-offset/inside-fractional/style.json | 2 +- .../integration/query-tests/line-offset/inside/expected.json | 2 +- .../integration/query-tests/line-offset/inside/style.json | 2 +- .../query-tests/line-offset/outside-fractional/expected.json | 2 +- .../query-tests/line-offset/outside-fractional/style.json | 2 +- .../query-tests/line-offset/outside/expected.json | 2 +- .../integration/query-tests/line-offset/outside/style.json | 2 +- .../line-offset/pattern-feature-state/expected.json | 2 +- .../query-tests/line-offset/property-function/expected.json | 2 +- .../query-tests/line-translate-anchor/map/expected.json | 2 +- .../query-tests/line-translate-anchor/map/style.json | 2 +- .../query-tests/line-translate-anchor/viewport/expected.json | 2 +- .../query-tests/line-translate-anchor/viewport/style.json | 2 +- .../query-tests/line-translate/inside/expected.json | 2 +- .../integration/query-tests/line-translate/inside/style.json | 2 +- .../query-tests/line-translate/outside/expected.json | 2 +- .../query-tests/line-translate/outside/style.json | 2 +- .../query-tests/line-width-features-in/inside/expected.json | 2 +- .../query-tests/line-width-features-in/inside/style.json | 2 +- .../query-tests/line-width-features-in/outside/expected.json | 2 +- .../query-tests/line-width-features-in/outside/style.json | 2 +- .../line-width-features-in/tilt-inside/expected.json | 2 +- .../line-width-features-in/tilt-inside/style.json | 2 +- .../line-width-features-in/tilt-outside/expected.json | 2 +- .../line-width-features-in/tilt-outside/style.json | 2 +- .../query-tests/line-width/feature-state/expected.json | 2 +- .../query-tests/line-width/feature-state/style.json | 2 +- .../query-tests/line-width/inside-fractional/expected.json | 2 +- .../query-tests/line-width/inside-fractional/style.json | 2 +- .../integration/query-tests/line-width/inside/expected.json | 2 +- metrics/integration/query-tests/line-width/inside/style.json | 2 +- .../query-tests/line-width/outside-fractional/expected.json | 2 +- .../query-tests/line-width/outside-fractional/style.json | 2 +- .../integration/query-tests/line-width/outside/expected.json | 2 +- .../integration/query-tests/line-width/outside/style.json | 2 +- .../query-tests/options/filter-false/expected.json | 2 +- .../query-tests/options/filter-true/expected.json | 2 +- .../query-tests/options/layers-multiple/expected.json | 2 +- .../integration/query-tests/options/layers-one/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#3534/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#3534/style.json | 2 +- .../query-tests/regressions/mapbox-gl-js#4417/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#4417/style.json | 2 +- .../query-tests/regressions/mapbox-gl-js#4494/style.json | 2 +- .../query-tests/regressions/mapbox-gl-js#5172/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#5473/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#5554/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#6075/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#7883/expected.json | 2 +- .../query-tests/regressions/mapbox-gl-js#8999/expected.json | 2 +- .../query-tests/remove-feature-state/default/expected.json | 2 +- .../query-tests/remove-feature-state/default/style.json | 2 +- .../symbol-features-in/fractional-outside/expected.json | 2 +- .../symbol-features-in/fractional-outside/style.json | 2 +- .../query-tests/symbol-features-in/hidden/expected.json | 2 +- .../query-tests/symbol-features-in/hidden/style.json | 2 +- .../query-tests/symbol-features-in/inside/expected.json | 2 +- .../query-tests/symbol-features-in/inside/style.json | 2 +- .../query-tests/symbol-features-in/outside/expected.json | 2 +- .../query-tests/symbol-features-in/outside/style.json | 2 +- .../symbol-features-in/pitched-screen/expected.json | 2 +- .../query-tests/symbol-features-in/pitched-screen/style.json | 2 +- .../symbol-features-in/tilted-inside/expected.json | 2 +- .../query-tests/symbol-features-in/tilted-inside/style.json | 2 +- .../symbol-features-in/tilted-outside/expected.json | 2 +- .../query-tests/symbol-features-in/tilted-outside/style.json | 2 +- .../query-tests/symbol-ignore-placement/inside/expected.json | 2 +- .../query-tests/symbol-ignore-placement/inside/style.json | 2 +- .../symbol/filtered-rotated-after-insert/expected.json | 2 +- .../integration/query-tests/symbol/filtered/expected.json | 2 +- .../query-tests/symbol/fractional-outside/expected.json | 2 +- .../query-tests/symbol/fractional-outside/style.json | 2 +- metrics/integration/query-tests/symbol/hidden/expected.json | 2 +- metrics/integration/query-tests/symbol/hidden/style.json | 2 +- metrics/integration/query-tests/symbol/inside/expected.json | 2 +- metrics/integration/query-tests/symbol/inside/style.json | 2 +- metrics/integration/query-tests/symbol/outside/expected.json | 2 +- metrics/integration/query-tests/symbol/outside/style.json | 2 +- .../query-tests/symbol/panned-after-insert/expected.json | 2 +- .../query-tests/symbol/panned-after-insert/style.json | 2 +- .../query-tests/symbol/rotated-after-insert/expected.json | 2 +- .../query-tests/symbol/rotated-after-insert/style.json | 2 +- .../query-tests/symbol/rotated-inside/expected.json | 2 +- .../query-tests/symbol/rotated-outside/expected.json | 2 +- .../query-tests/symbol/rotated-outside/style.json | 2 +- .../query-tests/symbol/rotated-sort/expected.json | 2 +- .../query-tests/symbol/tile-boundary/expected.json | 2 +- .../integration/query-tests/world-wrapping/box/expected.json | 2 +- .../integration/query-tests/world-wrapping/box/style.json | 2 +- .../query-tests/world-wrapping/point/expected.json | 2 +- .../integration/query-tests/world-wrapping/point/style.json | 2 +- .../render-tests/background-color/default/style.json | 2 +- .../render-tests/background-color/function/style.json | 2 +- .../render-tests/background-color/literal/style.json | 2 +- .../render-tests/background-opacity/color/style.json | 2 +- .../render-tests/background-opacity/image/style.json | 2 +- .../render-tests/background-pattern/@2x/style.json | 2 +- .../render-tests/background-pattern/literal/style.json | 2 +- .../render-tests/background-pattern/pitch/style.json | 2 +- .../render-tests/background-pattern/rotated/style.json | 2 +- .../render-tests/background-pattern/zoomed/style.json | 2 +- .../render-tests/background-visibility/none/style.json | 2 +- .../render-tests/background-visibility/visible/style.json | 2 +- .../combinations/fill-opaque--image-translucent/style.json | 2 +- .../debug/collision-icon-text-line-translate/style.json | 2 +- .../debug/collision-icon-text-point-translate/style.json | 2 +- .../render-tests/debug/collision-overscaled/style.json | 2 +- metrics/integration/render-tests/debug/collision/style.json | 2 +- .../render-tests/debug/tile-overscaled/style.json | 2 +- metrics/integration/render-tests/empty/empty/style.json | 2 +- .../integration/render-tests/extent/1024-circle/style.json | 2 +- metrics/integration/render-tests/extent/1024-fill/style.json | 2 +- metrics/integration/render-tests/extent/1024-line/style.json | 2 +- .../integration/render-tests/extent/1024-symbol/style.json | 2 +- .../integration/render-tests/fill-antialias/false/style.json | 2 +- .../integration/render-tests/fill-color/default/style.json | 2 +- .../integration/render-tests/fill-color/function/style.json | 2 +- .../integration/render-tests/fill-color/literal/style.json | 2 +- .../integration/render-tests/fill-color/multiply/style.json | 2 +- .../integration/render-tests/fill-color/opacity/style.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/style.json | 2 +- .../integration/render-tests/fill-opacity/default/style.json | 2 +- .../render-tests/fill-opacity/function/style.json | 2 +- .../integration/render-tests/fill-opacity/literal/style.json | 2 +- .../render-tests/fill-outline-color/default/style.json | 2 +- .../render-tests/fill-outline-color/fill/style.json | 2 +- .../render-tests/fill-outline-color/function/style.json | 2 +- .../render-tests/fill-outline-color/literal/style.json | 2 +- .../render-tests/fill-outline-color/multiply/style.json | 2 +- .../render-tests/fill-outline-color/opacity/style.json | 2 +- .../fill-outline-color/zoom-and-property-function/style.json | 2 +- metrics/integration/render-tests/fill-pattern/@2x/style.json | 2 +- .../fill-pattern/case-data-expression/style.json | 2 -- .../fill-pattern/invalid-feature-expression/style.json | 2 -- .../integration/render-tests/fill-pattern/literal/style.json | 2 +- .../integration/render-tests/fill-pattern/opacity/style.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/style.json | 2 +- .../fill-pattern/wrapping-with-interpolation/style.json | 2 +- .../integration/render-tests/fill-pattern/zoomed/style.json | 2 +- .../render-tests/fill-translate-anchor/map/style.json | 2 +- .../render-tests/fill-translate-anchor/viewport/style.json | 2 +- .../render-tests/fill-translate/default/style.json | 2 +- .../render-tests/fill-translate/function/style.json | 2 +- .../render-tests/fill-translate/literal/style.json | 2 +- .../integration/render-tests/fill-visibility/none/style.json | 2 +- .../render-tests/fill-visibility/visible/style.json | 2 +- .../render-tests/geojson/external-feature/style.json | 2 +- .../render-tests/geojson/external-invalid/style.json | 2 +- .../render-tests/geojson/external-linestring/style.json | 2 +- .../render-tests/geojson/external-malformed/style.json | 2 +- .../geojson/inconsistent-winding-order/style.json | 2 +- .../render-tests/geojson/inline-feature/style.json | 2 +- .../render-tests/geojson/inline-invalid/style.json | 2 +- .../render-tests/geojson/inline-linestring-fill/style.json | 2 +- .../render-tests/geojson/inline-malformed/style.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/style.json | 2 +- metrics/integration/render-tests/geojson/missing/style.json | 2 +- .../render-tests/geojson/reparse-overscaled/style.json | 2 +- .../integration/render-tests/icon-color/default/style.json | 2 +- .../integration/render-tests/icon-color/function/style.json | 2 +- .../integration/render-tests/icon-color/literal/style.json | 2 +- .../render-tests/icon-halo-blur/default/style.json | 2 +- .../render-tests/icon-halo-blur/function/style.json | 2 +- .../render-tests/icon-halo-blur/literal/style.json | 2 +- .../render-tests/icon-halo-color/default/style.json | 2 +- .../render-tests/icon-halo-color/function/style.json | 2 +- .../render-tests/icon-halo-color/literal/style.json | 2 +- .../render-tests/icon-halo-color/multiply/style.json | 2 +- .../render-tests/icon-halo-color/opacity/style.json | 2 +- .../render-tests/icon-halo-color/transparent/style.json | 2 +- .../render-tests/icon-halo-width/default/style.json | 2 +- .../render-tests/icon-halo-width/function/style.json | 2 +- .../render-tests/icon-halo-width/literal/style.json | 2 +- .../integration/render-tests/icon-offset/literal/style.json | 2 +- .../integration/render-tests/icon-opacity/default/style.json | 2 +- .../render-tests/icon-opacity/function/style.json | 2 +- .../render-tests/icon-opacity/icon-only/style.json | 2 +- .../integration/render-tests/icon-opacity/literal/style.json | 2 +- .../render-tests/icon-opacity/text-and-icon/style.json | 2 +- .../render-tests/icon-opacity/text-only/style.json | 2 +- .../auto-symbol-placement-line/style.json | 2 +- .../auto-symbol-placement-point/style.json | 2 +- .../map-symbol-placement-line/style.json | 2 +- .../map-symbol-placement-point/style.json | 2 +- .../viewport-symbol-placement-line/style.json | 2 +- .../viewport-symbol-placement-point/style.json | 2 +- .../both-collision-variable-anchor-text-fit/style.json | 2 +- .../icon-text-fit/both-collision-variable-anchor/style.json | 2 +- .../render-tests/icon-text-fit/both-collision/style.json | 2 +- .../render-tests/icon-text-fit/both-padding/style.json | 2 +- .../both-text-anchor-1x-image-2x-screen/style.json | 2 +- .../both-text-anchor-2x-image-1x-screen/style.json | 2 +- .../both-text-anchor-2x-image-2x-screen/style.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/style.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/style.json | 2 +- .../icon-text-fit/both-text-anchor-padding/style.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/style.json | 2 +- .../integration/render-tests/icon-text-fit/both/style.json | 2 +- .../icon-text-fit/enlargen-both-padding/style.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/style.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/style.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/style.json | 2 +- .../render-tests/icon-text-fit/height-padding/style.json | 2 +- .../icon-text-fit/height-text-anchor-padding/style.json | 2 +- .../render-tests/icon-text-fit/height-text-anchor/style.json | 2 +- .../integration/render-tests/icon-text-fit/height/style.json | 2 +- .../integration/render-tests/icon-text-fit/none/style.json | 2 +- .../icon-text-fit/textFit-anchors-long/style.json | 2 +- .../icon-text-fit/textFit-anchors-short/style.json | 2 +- .../icon-text-fit/textFit-grid-long-vertical/style.json | 2 +- .../render-tests/icon-text-fit/textFit-grid-long/style.json | 2 +- .../icon-text-fit/textFit-grid-short-vertical/style.json | 2 +- .../render-tests/icon-text-fit/textFit-grid-short/style.json | 2 +- .../render-tests/icon-text-fit/width-padding/style.json | 2 +- .../icon-text-fit/width-text-anchor-padding/style.json | 2 +- .../render-tests/icon-text-fit/width-text-anchor/style.json | 2 +- .../integration/render-tests/icon-text-fit/width/style.json | 2 +- .../render-tests/icon-translate-anchor/map/style.json | 2 +- .../render-tests/icon-translate-anchor/viewport/style.json | 2 +- .../render-tests/icon-translate/default/style.json | 2 +- .../render-tests/icon-translate/function/style.json | 2 +- .../render-tests/icon-translate/literal/style.json | 2 +- .../integration/render-tests/icon-visibility/none/style.json | 2 +- .../render-tests/icon-visibility/visible/style.json | 2 +- metrics/integration/render-tests/image/default/style.json | 2 +- metrics/integration/render-tests/image/pitched/style.json | 2 +- .../render-tests/image/raster-brightness/style.json | 2 +- .../render-tests/image/raster-contrast/style.json | 2 +- .../render-tests/image/raster-hue-rotate/style.json | 2 +- .../integration/render-tests/image/raster-opacity/style.json | 2 +- .../render-tests/image/raster-saturation/style.json | 2 +- .../render-tests/image/raster-visibility/style.json | 2 +- .../integration/render-tests/line-blur/default/style.json | 2 +- .../integration/render-tests/line-blur/function/style.json | 2 +- .../integration/render-tests/line-blur/literal/style.json | 2 +- metrics/integration/render-tests/line-cap/butt/style.json | 2 +- metrics/integration/render-tests/line-cap/round/style.json | 2 +- metrics/integration/render-tests/line-cap/square/style.json | 2 +- .../integration/render-tests/line-color/default/style.json | 2 +- .../integration/render-tests/line-color/function/style.json | 2 +- .../integration/render-tests/line-color/literal/style.json | 2 +- .../render-tests/line-dasharray/long-segment/style.json | 2 +- .../render-tests/line-dasharray/overscaled/style.json | 2 +- .../integration/render-tests/line-dasharray/slant/style.json | 2 +- .../render-tests/line-gap-width/default/style.json | 2 +- .../render-tests/line-gap-width/function/style.json | 2 +- .../render-tests/line-gap-width/literal/style.json | 2 +- .../integration/render-tests/line-offset/default/style.json | 2 +- .../integration/render-tests/line-offset/function/style.json | 2 +- .../render-tests/line-offset/literal-negative/style.json | 2 +- .../integration/render-tests/line-offset/literal/style.json | 2 +- .../integration/render-tests/line-opacity/default/style.json | 2 +- .../render-tests/line-opacity/function/style.json | 2 +- .../integration/render-tests/line-opacity/literal/style.json | 2 +- .../integration/render-tests/line-pitch/default/style.json | 2 +- .../integration/render-tests/line-pitch/pitch0/style.json | 2 +- .../integration/render-tests/line-pitch/pitch15/style.json | 2 +- .../integration/render-tests/line-pitch/pitch30/style.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/style.json | 2 +- .../render-tests/line-translate-anchor/map/style.json | 2 +- .../render-tests/line-translate-anchor/viewport/style.json | 2 +- .../render-tests/line-translate/default/style.json | 2 +- .../render-tests/line-translate/function/style.json | 2 +- .../render-tests/line-translate/literal/style.json | 2 +- .../render-tests/line-triangulation/default/style.json | 2 +- .../render-tests/line-triangulation/round/style.json | 2 +- .../integration/render-tests/line-visibility/none/style.json | 2 +- .../render-tests/line-visibility/visible/style.json | 2 +- .../integration/render-tests/line-width/default/style.json | 2 +- .../integration/render-tests/line-width/function/style.json | 2 +- .../integration/render-tests/line-width/literal/style.json | 2 +- .../render-tests/line-width/property-function/style.json | 2 +- .../linear-filter-opacity-edge/literal/style.json | 2 +- .../integration/render-tests/raster-alpha/default/style.json | 2 +- .../render-tests/raster-brightness/default/style.json | 2 +- .../render-tests/raster-brightness/function/style.json | 2 +- .../render-tests/raster-brightness/literal/style.json | 2 +- .../render-tests/raster-contrast/default/style.json | 2 +- .../render-tests/raster-contrast/function/style.json | 2 +- .../render-tests/raster-contrast/literal/style.json | 2 +- .../render-tests/raster-hue-rotate/default/style.json | 2 +- .../render-tests/raster-hue-rotate/function/style.json | 2 +- .../render-tests/raster-hue-rotate/literal/style.json | 2 +- .../render-tests/raster-loading/missing/style.json | 2 +- .../render-tests/raster-opacity/default/style.json | 2 +- .../render-tests/raster-opacity/function/style.json | 2 +- .../render-tests/raster-opacity/literal/style.json | 2 +- .../integration/render-tests/raster-rotation/0/style.json | 2 +- .../integration/render-tests/raster-rotation/180/style.json | 2 +- .../integration/render-tests/raster-rotation/270/style.json | 2 +- .../integration/render-tests/raster-rotation/45/style.json | 2 +- .../integration/render-tests/raster-rotation/90/style.json | 2 +- .../render-tests/raster-saturation/default/style.json | 2 +- .../render-tests/raster-saturation/function/style.json | 2 +- .../render-tests/raster-saturation/literal/style.json | 2 +- .../render-tests/raster-visibility/none/style.json | 2 +- .../render-tests/raster-visibility/visible/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/style.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8026/style.json | 2 +- .../regressions/mapbox-gl-native#3292/style.json | 2 +- .../regressions/mapbox-gl-native#5754/style.json | 2 +- .../regressions/mapbox-gl-native#6820/style.json | 2 +- .../regressions/mapbox-gl-native#6903/style.json | 1 - .../regressions/mapbox-gl-native#7357/style.json | 2 +- .../remove-feature-state/composite-expression/style.json | 2 +- .../remove-feature-state/data-expression/style.json | 2 +- .../remove-feature-state/vector-source/style.json | 2 +- .../render-tests/retina-raster/default/style.json | 2 +- .../render-tests/runtime-styling/image-add-nonsdf/style.json | 1 - .../render-tests/runtime-styling/image-add-sdf/style.json | 1 - .../runtime-styling/image-update-icon/style.json | 2 +- .../runtime-styling/image-update-pattern/style.json | 2 +- .../style.json | 2 +- .../layout-property-default-to-zoom-expression/style.json | 2 +- .../style.json | 2 +- .../layout-property-literal-to-zoom-expression/style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../layout-property-text-variable-anchor/style.json | 2 +- .../layout-property-zoom-expression-to-default/style.json | 2 +- .../layout-property-zoom-expression-to-literal/style.json | 2 +- .../paint-property-default-to-property-expression/style.json | 2 +- .../paint-property-default-to-zoom-expression/style.json | 2 +- .../paint-property-fill-flat-to-extrude/style.json | 2 +- .../paint-property-literal-to-expression/style.json | 2 +- .../paint-property-literal-to-property-expression/style.json | 2 +- .../paint-property-property-expression-to-default/style.json | 2 +- .../paint-property-property-expression-to-literal/style.json | 2 +- .../paint-property-zoom-expression-to-default/style.json | 2 +- .../paint-property-zoom-expression-to-literal/style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../set-style-paint-property-fill-flat-to-extrude/style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../runtime-styling/source-add-geojson-inline/style.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/style.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/style.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/style.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/style.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/style.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/style.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/style.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/style.json | 2 +- .../render-tests/sprites/array-default-only/style.json | 2 +- .../render-tests/sprites/array-multiple/style.json | 2 +- .../render-tests/symbol-placement/line-overscaled/style.json | 2 +- .../render-tests/symbol-placement/line/style.json | 2 +- .../render-tests/symbol-placement/point/style.json | 2 +- .../render-tests/symbol-spacing/line-far/style.json | 2 +- .../render-tests/symbol-spacing/point-close/style.json | 2 +- .../render-tests/symbol-spacing/point-far/style.json | 2 +- .../integration/render-tests/text-anchor/bottom/style.json | 2 +- .../integration/render-tests/text-anchor/center/style.json | 2 +- metrics/integration/render-tests/text-anchor/top/style.json | 2 +- .../integration/render-tests/text-color/default/style.json | 2 +- .../integration/render-tests/text-color/function/style.json | 2 +- .../integration/render-tests/text-color/literal/style.json | 2 +- .../integration/render-tests/text-font/literal/style.json | 2 +- .../render-tests/text-halo-blur/default/style.json | 2 +- .../render-tests/text-halo-blur/function/style.json | 2 +- .../render-tests/text-halo-blur/literal/style.json | 2 +- .../render-tests/text-halo-color/default/style.json | 2 +- .../render-tests/text-halo-color/function/style.json | 2 +- .../render-tests/text-halo-color/literal/style.json | 2 +- .../render-tests/text-halo-width/default/style.json | 2 +- .../render-tests/text-halo-width/function/style.json | 2 +- .../render-tests/text-halo-width/literal/style.json | 2 +- .../text-keep-upright/line-placement-true-offset/style.json | 2 +- .../point-placement-align-map-false/style.json | 2 +- .../point-placement-align-map-true/style.json | 2 +- .../point-placement-align-viewport-false/style.json | 2 +- .../point-placement-align-viewport-true/style.json | 2 +- .../text-letter-spacing/function-close/style.json | 2 +- .../render-tests/text-letter-spacing/function-far/style.json | 2 +- .../render-tests/text-letter-spacing/literal/style.json | 2 +- .../render-tests/text-line-height/literal/style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../style.json | 2 +- .../integration/render-tests/text-offset/literal/style.json | 2 +- .../integration/render-tests/text-opacity/default/style.json | 2 +- .../render-tests/text-opacity/function/style.json | 2 +- .../integration/render-tests/text-opacity/literal/style.json | 2 +- .../auto-symbol-placement-point/style.json | 2 +- .../map-symbol-placement-line/style.json | 2 +- .../map-symbol-placement-point/style.json | 2 +- .../viewport-symbol-placement-line/style.json | 2 +- .../viewport-symbol-placement-point/style.json | 2 +- .../render-tests/text-tile-edge-clipping/default/style.json | 2 +- .../render-tests/text-transform/lowercase/style.json | 2 +- .../render-tests/text-transform/uppercase/style.json | 2 +- .../render-tests/text-translate-anchor/map/style.json | 2 +- .../render-tests/text-translate-anchor/viewport/style.json | 2 +- .../render-tests/text-translate/default/style.json | 2 +- .../render-tests/text-translate/function/style.json | 2 +- .../render-tests/text-translate/literal/style.json | 2 +- .../text-variable-anchor-offset/databind-coalesce/style.json | 2 +- .../databind-interpolate/style.json | 2 +- .../render-tests/tilejson-bounds/default/style.json | 2 +- .../render-tests/tilejson-bounds/overwrite-bounds/style.json | 2 +- metrics/integration/render-tests/tms/tms/style.json | 2 +- metrics/integration/render-tests/video/default/style.json | 2 +- .../integration/render-tests/within/layout-text/style.json | 2 +- .../integration/render-tests/within/paint-line/style.json | 2 +- .../integration/render-tests/zoomed-fill/default/style.json | 2 +- .../render-tests/zoomed-raster/fractional/style.json | 2 +- .../render-tests/zoomed-raster/overzoom/style.json | 2 +- .../render-tests/zoomed-raster/underzoom/style.json | 2 +- metrics/integration/sprites/1x.json | 2 +- metrics/integration/sprites/1x@2x.json | 2 +- metrics/integration/sprites/2x.json | 2 +- metrics/integration/sprites/2x@2x.json | 2 +- metrics/integration/sprites/emerald.json | 2 +- metrics/integration/sprites/emerald@2x.json | 2 +- metrics/integration/sprites/icon-offset.json | 2 +- metrics/integration/sprites/mapbox/basic-v9.json | 2 +- metrics/integration/sprites/mapbox/bright-v9.json | 2 +- metrics/integration/sprites/mapbox/satellite-v9.json | 2 +- metrics/integration/sprites/solid-black.json | 2 +- metrics/integration/sprites/sprite.json | 2 +- metrics/integration/testem_page.html | 2 +- metrics/ios-metal-render-test-runner-metrics.json | 2 +- metrics/ios-render-test-runner-metrics.json | 2 +- .../probes/gfx/pass-double-probe/metrics.json | 2 +- .../probes/gfx/pass-probe-reset/metrics.json | 2 +- metrics/ios-render-test-runner/probes/gfx/pass/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-opaque/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-opaque/metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../render-tests/extent/1024-symbol/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../fill-extrusion-base/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/default/metrics.json | 2 +- .../fill-extrusion-opacity/function/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/default/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/default/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/false/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../zoom-and-property-function-pattern/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/literal/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/opacity/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-pattern/zoomed/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../icon-image/icon-sdf-non-sdf-one-layer/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/stretchable-content/metrics.json | 2 +- .../render-tests/icon-image/stretchable/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-1x-image-2x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-1x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/stretch-fifteen-part/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-@2x/metrics.json | 2 +- .../stretch-nine-part-content-collision/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-content/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-height/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-width/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part/metrics.json | 2 +- .../icon-text-fit/stretch-three-part/metrics.json | 2 +- .../render-tests/icon-text-fit/stretch-two-part/metrics.json | 2 +- .../icon-text-fit/stretch-underscale/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/opacity/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-translate/literal/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/perspective/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../render-tests/text-size/zero/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tile-mode/streets-v11/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../ios-render-test-runner/render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- .../location_indicator/dateline/metrics.json | 2 +- .../location_indicator/default/metrics.json | 2 +- .../location_indicator/no_radius_border/metrics.json | 2 +- .../location_indicator/no_radius_fill/metrics.json | 2 +- .../location_indicator/no_textures/metrics.json | 2 +- .../location_indicator/one_texture/metrics.json | 2 +- .../location_indicator/rotated/metrics.json | 2 +- .../location_indicator/tilted/metrics.json | 2 +- .../location_indicator/tilted_texture_shift/metrics.json | 2 +- .../tilted_texture_shift_bottom_left/metrics.json | 2 +- .../tilted_texture_shift_bottom_right/metrics.json | 2 +- .../tilted_texture_shift_top_left/metrics.json | 2 +- .../tilted_texture_shift_top_right/metrics.json | 2 +- .../location_indicator/two_textures/metrics.json | 2 +- .../probes/gfx/pass-double-probe/metrics.json | 2 +- .../probes/gfx/pass-probe-reset/metrics.json | 2 +- metrics/linux-clang8-release/probes/gfx/pass/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-opaque/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-opaque/metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../render-tests/extent/1024-symbol/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../fill-extrusion-base/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/default/metrics.json | 2 +- .../fill-extrusion-opacity/function/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/default/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/default/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/false/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../linux-clang8-release/render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../icon-image/icon-sdf-non-sdf-one-layer/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/stretchable-content/metrics.json | 2 +- .../render-tests/icon-image/stretchable/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-1x-image-2x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-1x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/stretch-fifteen-part/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-@2x/metrics.json | 2 +- .../stretch-nine-part-content-collision/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-content/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-height/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-width/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part/metrics.json | 2 +- .../icon-text-fit/stretch-three-part/metrics.json | 2 +- .../render-tests/icon-text-fit/stretch-two-part/metrics.json | 2 +- .../icon-text-fit/stretch-underscale/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/overscaled/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/perspective/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911a/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9976/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../runtime-styling/image-add-pattern/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/image-update-pattern/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../runtime-styling/set-style-glyphs/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-visibility/visible/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-images/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/chinese/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../render-tests/text-size/zero/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../left-top-right-buttom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tile-mode/streets-v11/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../tilejson-bounds/overwrite-bounds/metrics.json | 2 +- .../linux-clang8-release/render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- .../location_indicator/dateline/metrics.json | 2 +- .../location_indicator/default/metrics.json | 2 +- .../location_indicator/image_pixel_ratio/metrics.json | 2 +- .../location_indicator/no_radius_border/metrics.json | 2 +- .../location_indicator/no_radius_fill/metrics.json | 2 +- .../location_indicator/no_textures/metrics.json | 2 +- .../location_indicator/one_texture/metrics.json | 2 +- .../location_indicator/rotated/metrics.json | 2 +- .../location_indicator/tilted/metrics.json | 2 +- .../location_indicator/tilted_texture_shift/metrics.json | 2 +- .../tilted_texture_shift_bottom_left/metrics.json | 2 +- .../tilted_texture_shift_bottom_right/metrics.json | 2 +- .../tilted_texture_shift_top_left/metrics.json | 2 +- .../tilted_texture_shift_top_right/metrics.json | 2 +- .../location_indicator/two_textures/metrics.json | 2 +- .../probes/gfx/pass-double-probe/metrics.json | 2 +- .../probes/gfx/pass-probe-reset/metrics.json | 2 +- metrics/linux-gcc8-release/probes/gfx/pass/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../linux-gcc8-release/render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--image-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-opaque/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-opaque/metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../linux-gcc8-release/render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../render-tests/extent/1024-symbol/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../fill-extrusion-base/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/default/metrics.json | 2 +- .../fill-extrusion-opacity/function/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/default/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/default/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/false/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../linux-gcc8-release/render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../linux-gcc8-release/render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../icon-image/icon-sdf-non-sdf-one-layer/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../render-tests/icon-padding/databind/metrics.json | 2 +- .../render-tests/icon-padding/default/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-1x-image-2x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-1x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../icon-text-fit/textFit-anchors-long/metrics.json | 2 +- .../icon-text-fit/textFit-anchors-short/metrics.json | 2 +- .../icon-text-fit/textFit-collision/metrics.json | 2 +- .../icon-text-fit/textFit-grid-long-vertical/metrics.json | 2 +- .../icon-text-fit/textFit-grid-long/metrics.json | 2 +- .../icon-text-fit/textFit-grid-short-vertical/metrics.json | 2 +- .../icon-text-fit/textFit-grid-short/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/overscaled/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/perspective/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911a/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9976/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../runtime-styling/image-add-pattern/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/image-update-pattern/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../runtime-styling/set-style-glyphs/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/array-default-only/metrics.json | 2 +- .../render-tests/sprites/array-multiple/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-visibility/visible/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-images/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/chinese/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../text-max-width/force-newline-line-center/metrics.json | 2 +- .../text-max-width/force-newline-line/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../zero-width-line-center-placement/metrics.json | 2 +- .../text-max-width/zero-width-line-placement/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../render-tests/text-size/zero/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tile-mode/streets-v11/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../tilejson-bounds/overwrite-bounds/metrics.json | 2 +- metrics/linux-gcc8-release/render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- .../probes/gfx/pass-double-probe/metrics.json | 2 +- .../probes/gfx/pass-probe-reset/metrics.json | 2 +- metrics/macos-xcode11-release/probes/gfx/pass/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-opaque/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-opaque/metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../render-tests/extent/1024-symbol/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../fill-extrusion-base/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/default/metrics.json | 2 +- .../fill-extrusion-opacity/function/metrics.json | 2 +- .../render-tests/fill-extrusion-opacity/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/default/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/default/metrics.json | 2 +- .../fill-extrusion-vertical-gradient/false/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../zoom-and-property-function-pattern/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/literal/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/opacity/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-pattern/zoomed/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../icon-image/icon-sdf-non-sdf-one-layer/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/stretchable-content/metrics.json | 2 +- .../render-tests/icon-image/stretchable/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-1x-image-2x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-1x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/stretch-fifteen-part/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-@2x/metrics.json | 2 +- .../stretch-nine-part-content-collision/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-content/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-height/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-width/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part/metrics.json | 2 +- .../icon-text-fit/stretch-three-part/metrics.json | 2 +- .../render-tests/icon-text-fit/stretch-two-part/metrics.json | 2 +- .../icon-text-fit/stretch-underscale/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/opacity/metrics.json | 2 +- .../render-tests/line-pattern/overscaled/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-translate/literal/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/perspective/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911a/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9976/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../runtime-styling/image-add-pattern/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/image-update-pattern/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../runtime-styling/set-style-glyphs/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-visibility/visible/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-images/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/chinese/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../tilejson-bounds/overwrite-bounds/metrics.json | 2 +- .../macos-xcode11-release/render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- metrics/tests/location_indicator/query_test/expected.json | 2 +- .../tests/location_indicator/query_test_miss/expected.json | 2 +- .../location_indicator/query_test_no_image/expected.json | 2 +- metrics/tests/probes/gfx/fail-ib-mem-mismatch/style.json | 2 +- .../probes/gfx/fail-negative-framebuffer-count/style.json | 2 +- .../tests/probes/gfx/fail-texture-mem-mismatch/style.json | 2 +- metrics/tests/probes/gfx/fail-too-few-buffers/style.json | 2 +- metrics/tests/probes/gfx/fail-too-few-textures/style.json | 2 +- metrics/tests/probes/gfx/fail-too-many-drawcalls/style.json | 2 +- metrics/tests/probes/gfx/fail-vb-mem-mismatch/style.json | 2 +- metrics/tests/probes/gfx/pass-double-probe/style.json | 2 +- metrics/tests/probes/gfx/pass-probe-reset/style.json | 2 +- metrics/tests/probes/gfx/pass/style.json | 2 +- .../probes/network/fail-requests-transferred/metrics.json | 2 +- metrics/tests/probes/network/fail-requests/metrics.json | 2 +- metrics/tests/probes/network/fail-transferred/metrics.json | 2 +- metrics/tests/probes/network/pass/metrics.json | 2 +- .../background-color/colorSpace-lab/metrics.json | 2 +- .../render-tests/background-color/default/metrics.json | 2 +- .../render-tests/background-color/function/metrics.json | 2 +- .../render-tests/background-color/literal/metrics.json | 2 +- .../render-tests/background-opacity/color/metrics.json | 2 +- .../render-tests/background-opacity/image/metrics.json | 2 +- .../render-tests/background-opacity/overlay/metrics.json | 2 +- .../render-tests/background-pattern/@2x/metrics.json | 2 +- .../render-tests/background-pattern/literal/metrics.json | 2 +- .../render-tests/background-pattern/missing/metrics.json | 2 +- .../render-tests/background-pattern/pitch/metrics.json | 2 +- .../render-tests/background-pattern/rotated/metrics.json | 2 +- .../render-tests/background-pattern/zoomed/metrics.json | 2 +- .../render-tests/background-visibility/none/metrics.json | 2 +- .../render-tests/background-visibility/visible/metrics.json | 2 +- .../render-tests/basic-v9/z0-narrow-y/metrics.json | 2 +- .../render-tests/basic-v9/z0-wide-x/metrics.json | 2 +- .../render-tests/basic-v9/z0/metrics.json | 2 +- .../render-tests/bright-v9/z0/metrics.json | 2 +- .../render-tests/circle-blur/blending/metrics.json | 2 +- .../render-tests/circle-blur/default/metrics.json | 2 +- .../render-tests/circle-blur/function/metrics.json | 2 +- .../render-tests/circle-blur/literal-stroke/metrics.json | 2 +- .../render-tests/circle-blur/literal/metrics.json | 2 +- .../render-tests/circle-blur/property-function/metrics.json | 2 +- .../circle-blur/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-color/default/metrics.json | 2 +- .../render-tests/circle-color/function/metrics.json | 2 +- .../render-tests/circle-color/literal/metrics.json | 2 +- .../render-tests/circle-color/property-function/metrics.json | 2 +- .../circle-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-geometry/linestring/metrics.json | 2 +- .../circle-geometry/multilinestring/metrics.json | 2 +- .../render-tests/circle-geometry/multipoint/metrics.json | 2 +- .../render-tests/circle-geometry/multipolygon/metrics.json | 2 +- .../render-tests/circle-geometry/point/metrics.json | 2 +- .../render-tests/circle-geometry/polygon/metrics.json | 2 +- .../render-tests/circle-opacity/blending/metrics.json | 2 +- .../render-tests/circle-opacity/default/metrics.json | 2 +- .../render-tests/circle-opacity/function/metrics.json | 2 +- .../render-tests/circle-opacity/literal/metrics.json | 2 +- .../circle-opacity/property-function/metrics.json | 2 +- .../circle-opacity/zoom-and-property-function/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-map/metrics.json | 2 +- .../circle-pitch-alignment/map-scale-viewport/metrics.json | 2 +- .../circle-pitch-alignment/viewport-scale-map/metrics.json | 2 +- .../viewport-scale-viewport/metrics.json | 2 +- .../render-tests/circle-pitch-scale/default/metrics.json | 2 +- .../render-tests/circle-pitch-scale/map/metrics.json | 2 +- .../render-tests/circle-pitch-scale/viewport/metrics.json | 2 +- .../render-tests/circle-radius/antimeridian/metrics.json | 2 +- .../render-tests/circle-radius/default/metrics.json | 2 +- .../render-tests/circle-radius/function/metrics.json | 2 +- .../render-tests/circle-radius/literal/metrics.json | 2 +- .../circle-radius/property-function/metrics.json | 2 +- .../circle-radius/zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-sort-key/literal/metrics.json | 2 +- .../render-tests/circle-stroke-color/default/metrics.json | 2 +- .../render-tests/circle-stroke-color/function/metrics.json | 2 +- .../render-tests/circle-stroke-color/literal/metrics.json | 2 +- .../circle-stroke-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/default/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/function/metrics.json | 2 +- .../render-tests/circle-stroke-opacity/literal/metrics.json | 2 +- .../circle-stroke-opacity/property-function/metrics.json | 2 +- .../circle-stroke-opacity/stroke-only/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-stroke-width/default/metrics.json | 2 +- .../render-tests/circle-stroke-width/function/metrics.json | 2 +- .../render-tests/circle-stroke-width/literal/metrics.json | 2 +- .../circle-stroke-width/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/circle-translate-anchor/map/metrics.json | 2 +- .../circle-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/circle-translate/default/metrics.json | 2 +- .../render-tests/circle-translate/function/metrics.json | 2 +- .../render-tests/circle-translate/literal/metrics.json | 2 +- .../background-opaque--background-opaque/metrics.json | 2 +- .../background-opaque--background-translucent/metrics.json | 2 +- .../background-opaque--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/background-opaque--fill-opaque/metrics.json | 2 +- .../background-opaque--fill-translucent/metrics.json | 2 +- .../background-opaque--heatmap-translucent/metrics.json | 2 +- .../background-opaque--hillshade-translucent/metrics.json | 2 +- .../background-opaque--line-translucent/metrics.json | 2 +- .../background-opaque--raster-translucent/metrics.json | 2 +- .../background-opaque--symbol-translucent/metrics.json | 2 +- .../background-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--fill-opaque/metrics.json | 2 +- .../background-translucent--fill-translucent/metrics.json | 2 +- .../background-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../background-translucent--line-translucent/metrics.json | 2 +- .../background-translucent--raster-translucent/metrics.json | 2 +- .../background-translucent--symbol-translucent/metrics.json | 2 +- .../circle-translucent--background-opaque/metrics.json | 2 +- .../circle-translucent--background-translucent/metrics.json | 2 +- .../circle-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../circle-translucent--fill-opaque/metrics.json | 2 +- .../circle-translucent--fill-translucent/metrics.json | 2 +- .../circle-translucent--heatmap-translucent/metrics.json | 2 +- .../circle-translucent--hillshade-translucent/metrics.json | 2 +- .../circle-translucent--line-translucent/metrics.json | 2 +- .../circle-translucent--raster-translucent/metrics.json | 2 +- .../circle-translucent--symbol-translucent/metrics.json | 2 +- .../combinations/fill-extrusion--fill-opaque/metrics.json | 2 +- .../fill-extrusion--fill-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../fill-extrusion-translucent--fill-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-opaque--background-opaque/metrics.json | 2 +- .../fill-opaque--background-translucent/metrics.json | 2 +- .../fill-opaque--circle-translucent/metrics.json | 2 +- .../fill-opaque--fill-extrusion-translucent/metrics.json | 2 +- .../combinations/fill-opaque--fill-opaque/metrics.json | 2 +- .../combinations/fill-opaque--fill-translucent/metrics.json | 2 +- .../fill-opaque--heatmap-translucent/metrics.json | 2 +- .../fill-opaque--hillshade-translucent/metrics.json | 2 +- .../combinations/fill-opaque--image-translucent/metrics.json | 2 +- .../combinations/fill-opaque--line-translucent/metrics.json | 2 +- .../fill-opaque--raster-translucent/metrics.json | 2 +- .../fill-opaque--symbol-translucent/metrics.json | 2 +- .../fill-translucent--background-opaque/metrics.json | 2 +- .../fill-translucent--background-translucent/metrics.json | 2 +- .../fill-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/fill-translucent--fill-opaque/metrics.json | 2 +- .../fill-translucent--fill-translucent/metrics.json | 2 +- .../fill-translucent--heatmap-translucent/metrics.json | 2 +- .../fill-translucent--hillshade-translucent/metrics.json | 2 +- .../fill-translucent--line-translucent/metrics.json | 2 +- .../fill-translucent--raster-translucent/metrics.json | 2 +- .../fill-translucent--symbol-translucent/metrics.json | 2 +- .../heatmap-translucent--background-translucent/metrics.json | 2 +- .../heatmap-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../heatmap-translucent--fill-translucent/metrics.json | 2 +- .../heatmap-translucent--heatmap-translucent/metrics.json | 2 +- .../heatmap-translucent--hillshade-translucent/metrics.json | 2 +- .../heatmap-translucent--line-translucent/metrics.json | 2 +- .../heatmap-translucent--raster-translucent/metrics.json | 2 +- .../heatmap-translucent--symbol-translucent/metrics.json | 2 +- .../hillshade-translucent--background-opaque/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--fill-opaque/metrics.json | 2 +- .../hillshade-translucent--fill-translucent/metrics.json | 2 +- .../hillshade-translucent--heatmap-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../hillshade-translucent--line-translucent/metrics.json | 2 +- .../hillshade-translucent--raster-translucent/metrics.json | 2 +- .../hillshade-translucent--symbol-translucent/metrics.json | 2 +- .../line-translucent--background-opaque/metrics.json | 2 +- .../line-translucent--background-translucent/metrics.json | 2 +- .../line-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../combinations/line-translucent--fill-opaque/metrics.json | 2 +- .../line-translucent--fill-translucent/metrics.json | 2 +- .../line-translucent--heatmap-translucent/metrics.json | 2 +- .../line-translucent--hillshade-translucent/metrics.json | 2 +- .../line-translucent--line-translucent/metrics.json | 2 +- .../line-translucent--raster-translucent/metrics.json | 2 +- .../line-translucent--symbol-translucent/metrics.json | 2 +- .../raster-translucent--background-opaque/metrics.json | 2 +- .../raster-translucent--background-translucent/metrics.json | 2 +- .../raster-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../raster-translucent--fill-opaque/metrics.json | 2 +- .../raster-translucent--fill-translucent/metrics.json | 2 +- .../raster-translucent--heatmap-translucent/metrics.json | 2 +- .../raster-translucent--hillshade-translucent/metrics.json | 2 +- .../raster-translucent--line-translucent/metrics.json | 2 +- .../raster-translucent--raster-translucent/metrics.json | 2 +- .../raster-translucent--symbol-translucent/metrics.json | 2 +- .../symbol-translucent--background-opaque/metrics.json | 2 +- .../symbol-translucent--background-translucent/metrics.json | 2 +- .../symbol-translucent--circle-translucent/metrics.json | 2 +- .../metrics.json | 2 +- .../symbol-translucent--fill-opaque/metrics.json | 2 +- .../symbol-translucent--fill-translucent/metrics.json | 2 +- .../symbol-translucent--heatmap-translucent/metrics.json | 2 +- .../symbol-translucent--hillshade-translucent/metrics.json | 2 +- .../symbol-translucent--line-translucent/metrics.json | 2 +- .../symbol-translucent--raster-translucent/metrics.json | 2 +- .../symbol-translucent--symbol-translucent/metrics.json | 2 +- .../debug/collision-icon-text-line-translate/metrics.json | 2 +- .../debug/collision-icon-text-point-translate/metrics.json | 2 +- .../debug/collision-lines-overscaled/metrics.json | 2 +- .../render-tests/debug/collision-lines-pitched/metrics.json | 2 +- .../render-tests/debug/collision-lines/metrics.json | 2 +- .../render-tests/debug/collision-overscaled/metrics.json | 2 +- .../debug/collision-pitched-wrapped/metrics.json | 2 +- .../render-tests/debug/collision-pitched/metrics.json | 2 +- .../render-tests/empty/empty/metrics.json | 2 +- .../render-tests/extent/1024-fill/metrics.json | 2 +- .../render-tests/extent/1024-line/metrics.json | 2 +- .../feature-state/composite-expression/metrics.json | 2 +- .../render-tests/feature-state/data-expression/metrics.json | 2 +- .../render-tests/feature-state/vector-source/metrics.json | 2 +- .../render-tests/fill-antialias/false/metrics.json | 2 +- .../render-tests/fill-color/default/metrics.json | 2 +- .../render-tests/fill-color/function/metrics.json | 2 +- .../render-tests/fill-color/literal/metrics.json | 2 +- .../render-tests/fill-color/multiply/metrics.json | 2 +- .../render-tests/fill-color/opacity/metrics.json | 2 +- .../render-tests/fill-color/property-function/metrics.json | 2 +- .../fill-color/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/default/metrics.json | 2 +- .../render-tests/fill-extrusion-base/function/metrics.json | 2 +- .../render-tests/fill-extrusion-base/literal/metrics.json | 2 +- .../render-tests/fill-extrusion-base/negative/metrics.json | 2 +- .../render-tests/fill-extrusion-color/default/metrics.json | 2 +- .../render-tests/fill-extrusion-color/function/metrics.json | 2 +- .../render-tests/fill-extrusion-color/literal/metrics.json | 2 +- .../fill-extrusion-color/no-alpha-no-multiply/metrics.json | 2 +- .../fill-extrusion-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/default/metrics.json | 2 +- .../render-tests/fill-extrusion-height/function/metrics.json | 2 +- .../render-tests/fill-extrusion-height/negative/metrics.json | 2 +- .../fill-extrusion-height/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../fill-extrusion-multiple/interleaved-layers/metrics.json | 2 +- .../fill-extrusion-multiple/multiple/metrics.json | 2 +- .../render-tests/fill-extrusion-pattern/missing/metrics.json | 2 +- .../fill-extrusion-translate-anchor/map/metrics.json | 2 +- .../fill-extrusion-translate-anchor/viewport/metrics.json | 2 +- .../fill-extrusion-translate/function/metrics.json | 2 +- .../fill-extrusion-translate/literal-opacity/metrics.json | 2 +- .../fill-extrusion-translate/literal/metrics.json | 2 +- .../render-tests/fill-opacity/default/metrics.json | 2 +- .../render-tests/fill-opacity/function/metrics.json | 2 +- .../render-tests/fill-opacity/literal/metrics.json | 2 +- .../fill-opacity/opaque-fill-over-symbol-layer/metrics.json | 2 +- .../render-tests/fill-opacity/overlapping/metrics.json | 2 +- .../fill-opacity/property-function-pattern/metrics.json | 2 +- .../render-tests/fill-opacity/property-function/metrics.json | 2 +- .../zoom-and-property-function-pattern/metrics.json | 2 +- .../fill-opacity/zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-outline-color/default/metrics.json | 2 +- .../render-tests/fill-outline-color/fill/metrics.json | 2 +- .../render-tests/fill-outline-color/function/metrics.json | 2 +- .../render-tests/fill-outline-color/literal/metrics.json | 2 +- .../render-tests/fill-outline-color/multiply/metrics.json | 2 +- .../render-tests/fill-outline-color/opacity/metrics.json | 2 +- .../fill-outline-color/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/fill-pattern/@2x/metrics.json | 2 +- .../fill-pattern/case-data-expression/metrics.json | 2 +- .../fill-pattern/invalid-feature-expression/metrics.json | 2 +- .../render-tests/fill-pattern/literal/metrics.json | 2 +- .../render-tests/fill-pattern/missing/metrics.json | 2 +- .../render-tests/fill-pattern/opacity/metrics.json | 2 +- .../render-tests/fill-pattern/uneven-pattern/metrics.json | 2 +- .../fill-pattern/wrapping-with-interpolation/metrics.json | 2 +- .../render-tests/fill-pattern/zoomed/metrics.json | 2 +- .../render-tests/fill-sort-key/literal/metrics.json | 2 +- .../render-tests/fill-translate-anchor/map/metrics.json | 2 +- .../render-tests/fill-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/fill-translate/default/metrics.json | 2 +- .../render-tests/fill-translate/function/metrics.json | 2 +- .../render-tests/fill-translate/literal/metrics.json | 2 +- .../render-tests/fill-visibility/none/metrics.json | 2 +- .../render-tests/fill-visibility/visible/metrics.json | 2 +- .../render-tests/filter/equality/metrics.json | 2 +- .../windows-msvc-release/render-tests/filter/in/metrics.json | 2 +- .../render-tests/filter/legacy-equality/metrics.json | 2 +- .../render-tests/filter/none/metrics.json | 2 +- .../render-tests/geojson/clustered-properties/metrics.json | 2 +- .../render-tests/geojson/clustered/metrics.json | 2 +- .../render-tests/geojson/external-feature/metrics.json | 2 +- .../render-tests/geojson/external-invalid/metrics.json | 2 +- .../render-tests/geojson/external-linestring/metrics.json | 2 +- .../render-tests/geojson/external-malformed/metrics.json | 2 +- .../geojson/inconsistent-winding-order/metrics.json | 2 +- .../render-tests/geojson/inline-feature/metrics.json | 2 +- .../render-tests/geojson/inline-invalid/metrics.json | 2 +- .../geojson/inline-linestring-circle/metrics.json | 2 +- .../render-tests/geojson/inline-linestring-line/metrics.json | 2 +- .../geojson/inline-linestring-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-malformed/metrics.json | 2 +- .../render-tests/geojson/inline-point-circle/metrics.json | 2 +- .../render-tests/geojson/inline-point-fill/metrics.json | 2 +- .../render-tests/geojson/inline-point-line/metrics.json | 2 +- .../render-tests/geojson/inline-point-symbol/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-circle/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-fill/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-line/metrics.json | 2 +- .../render-tests/geojson/inline-polygon-symbol/metrics.json | 2 +- .../render-tests/geojson/missing/metrics.json | 2 +- .../render-tests/geojson/reparse-overscaled/metrics.json | 2 +- .../render-tests/heatmap-color/default/metrics.json | 2 +- .../render-tests/heatmap-color/expression/metrics.json | 2 +- .../render-tests/heatmap-intensity/default/metrics.json | 2 +- .../render-tests/heatmap-intensity/function/metrics.json | 2 +- .../render-tests/heatmap-intensity/literal/metrics.json | 2 +- .../render-tests/heatmap-opacity/default/metrics.json | 2 +- .../render-tests/heatmap-opacity/function/metrics.json | 2 +- .../render-tests/heatmap-opacity/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/antimeridian/metrics.json | 2 +- .../render-tests/heatmap-radius/data-expression/metrics.json | 2 +- .../render-tests/heatmap-radius/default/metrics.json | 2 +- .../render-tests/heatmap-radius/function/metrics.json | 2 +- .../render-tests/heatmap-radius/literal/metrics.json | 2 +- .../render-tests/heatmap-radius/pitch30/metrics.json | 2 +- .../render-tests/heatmap-weight/default/metrics.json | 2 +- .../heatmap-weight/identity-property-function/metrics.json | 2 +- .../render-tests/heatmap-weight/literal/metrics.json | 2 +- .../render-tests/hillshade-accent-color/default/metrics.json | 2 +- .../render-tests/hillshade-accent-color/literal/metrics.json | 2 +- .../hillshade-accent-color/terrarium/metrics.json | 2 +- .../hillshade-accent-color/zoom-function/metrics.json | 2 +- .../hillshade-highlight-color/default/metrics.json | 2 +- .../hillshade-highlight-color/literal/metrics.json | 2 +- .../hillshade-highlight-color/zoom-function/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/default/metrics.json | 2 +- .../render-tests/hillshade-shadow-color/literal/metrics.json | 2 +- .../hillshade-shadow-color/zoom-function/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-left/metrics.json | 2 +- .../render-tests/icon-anchor/bottom-right/metrics.json | 2 +- .../render-tests/icon-anchor/bottom/metrics.json | 2 +- .../render-tests/icon-anchor/center/metrics.json | 2 +- .../render-tests/icon-anchor/default/metrics.json | 2 +- .../render-tests/icon-anchor/left/metrics.json | 2 +- .../render-tests/icon-anchor/property-function/metrics.json | 2 +- .../render-tests/icon-anchor/right/metrics.json | 2 +- .../render-tests/icon-anchor/top-left/metrics.json | 2 +- .../render-tests/icon-anchor/top-right/metrics.json | 2 +- .../render-tests/icon-anchor/top/metrics.json | 2 +- .../render-tests/icon-color/default/metrics.json | 2 +- .../render-tests/icon-color/function/metrics.json | 2 +- .../render-tests/icon-color/literal/metrics.json | 2 +- .../render-tests/icon-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-blur/default/metrics.json | 2 +- .../render-tests/icon-halo-blur/function/metrics.json | 2 +- .../render-tests/icon-halo-blur/literal/metrics.json | 2 +- .../icon-halo-blur/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/default/metrics.json | 2 +- .../render-tests/icon-halo-color/function/metrics.json | 2 +- .../render-tests/icon-halo-color/literal/metrics.json | 2 +- .../render-tests/icon-halo-color/multiply/metrics.json | 2 +- .../render-tests/icon-halo-color/opacity/metrics.json | 2 +- .../icon-halo-color/property-function/metrics.json | 2 +- .../render-tests/icon-halo-color/transparent/metrics.json | 2 +- .../render-tests/icon-halo-width/default/metrics.json | 2 +- .../render-tests/icon-halo-width/function/metrics.json | 2 +- .../render-tests/icon-halo-width/literal/metrics.json | 2 +- .../icon-halo-width/property-function/metrics.json | 2 +- .../icon-image/icon-sdf-non-sdf-one-layer/metrics.json | 2 +- .../render-tests/icon-image/image-expression/metrics.json | 2 +- .../render-tests/icon-image/literal/metrics.json | 2 +- .../render-tests/icon-image/property-function/metrics.json | 2 +- .../render-tests/icon-image/stretchable-content/metrics.json | 2 +- .../render-tests/icon-image/stretchable/metrics.json | 2 +- .../render-tests/icon-image/token/metrics.json | 2 +- .../icon-no-cross-source-collision/default/metrics.json | 2 +- .../render-tests/icon-offset/literal/metrics.json | 2 +- .../render-tests/icon-offset/property-function/metrics.json | 2 +- .../icon-offset/zoom-and-property-function/metrics.json | 2 +- .../render-tests/icon-opacity/default/metrics.json | 2 +- .../render-tests/icon-opacity/function/metrics.json | 2 +- .../render-tests/icon-opacity/icon-only/metrics.json | 2 +- .../render-tests/icon-opacity/literal/metrics.json | 2 +- .../render-tests/icon-opacity/property-function/metrics.json | 2 +- .../render-tests/icon-opacity/text-and-icon/metrics.json | 2 +- .../render-tests/icon-opacity/text-only/metrics.json | 2 +- .../render-tests/icon-padding/databind/metrics.json | 2 +- .../render-tests/icon-padding/default/metrics.json | 2 +- .../auto-rotation-alignment-map/metrics.json | 2 +- .../auto-rotation-alignment-viewport/metrics.json | 2 +- .../map-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-rotation-alignment-map/metrics.json | 2 +- .../icon-pitch-scaling/rotation-alignment-map/metrics.json | 2 +- .../rotation-alignment-viewport/metrics.json | 2 +- .../icon-pixelratio-mismatch/default/metrics.json | 2 +- .../render-tests/icon-rotate/literal/metrics.json | 2 +- .../render-tests/icon-rotate/property-function/metrics.json | 2 +- .../render-tests/icon-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../icon-size/camera-function-high-base-plain/metrics.json | 2 +- .../icon-size/camera-function-high-base-sdf/metrics.json | 2 +- .../icon-size/camera-function-plain/metrics.json | 2 +- .../render-tests/icon-size/camera-function-sdf/metrics.json | 2 +- .../icon-size/composite-function-plain/metrics.json | 2 +- .../icon-size/composite-function-sdf/metrics.json | 2 +- .../render-tests/icon-size/default/metrics.json | 2 +- .../render-tests/icon-size/function/metrics.json | 2 +- .../render-tests/icon-size/literal/metrics.json | 2 +- .../icon-size/property-function-plain/metrics.json | 2 +- .../icon-size/property-function-sdf/metrics.json | 2 +- .../both-collision-variable-anchor-text-fit/metrics.json | 2 +- .../both-collision-variable-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both-collision/metrics.json | 2 +- .../render-tests/icon-text-fit/both-padding/metrics.json | 2 +- .../both-text-anchor-1x-image-2x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-1x-screen/metrics.json | 2 +- .../both-text-anchor-2x-image-2x-screen/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-anchor/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-icon-offset/metrics.json | 2 +- .../icon-text-fit/both-text-anchor-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/both-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/both/metrics.json | 2 +- .../icon-text-fit/enlargen-both-padding/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-both/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-height/metrics.json | 2 +- .../render-tests/icon-text-fit/enlargen-width/metrics.json | 2 +- .../render-tests/icon-text-fit/height-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/height-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/height/metrics.json | 2 +- .../render-tests/icon-text-fit/none/metrics.json | 2 +- .../render-tests/icon-text-fit/placement-line/metrics.json | 2 +- .../icon-text-fit/stretch-fifteen-part/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-@2x/metrics.json | 2 +- .../stretch-nine-part-content-collision/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-content/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-height/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part-just-width/metrics.json | 2 +- .../icon-text-fit/stretch-nine-part/metrics.json | 2 +- .../icon-text-fit/stretch-three-part/metrics.json | 2 +- .../render-tests/icon-text-fit/stretch-two-part/metrics.json | 2 +- .../icon-text-fit/stretch-underscale/metrics.json | 2 +- .../icon-text-fit/text-variable-anchor/metrics.json | 2 +- .../icon-text-fit/textFit-anchors-long/metrics.json | 2 +- .../icon-text-fit/textFit-anchors-short/metrics.json | 2 +- .../icon-text-fit/textFit-collision/metrics.json | 2 +- .../icon-text-fit/textFit-grid-long-vertical/metrics.json | 2 +- .../icon-text-fit/textFit-grid-long/metrics.json | 2 +- .../icon-text-fit/textFit-grid-short-vertical/metrics.json | 2 +- .../icon-text-fit/textFit-grid-short/metrics.json | 2 +- .../render-tests/icon-text-fit/width-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor-padding/metrics.json | 2 +- .../icon-text-fit/width-text-anchor/metrics.json | 2 +- .../render-tests/icon-text-fit/width/metrics.json | 2 +- .../render-tests/icon-translate-anchor/map/metrics.json | 2 +- .../render-tests/icon-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/icon-translate/default/metrics.json | 2 +- .../render-tests/icon-translate/function/metrics.json | 2 +- .../render-tests/icon-translate/literal/metrics.json | 2 +- .../render-tests/icon-visibility/none/metrics.json | 2 +- .../render-tests/icon-visibility/visible/metrics.json | 2 +- .../render-tests/image/default/metrics.json | 2 +- .../render-tests/image/pitched/metrics.json | 2 +- .../render-tests/image/raster-brightness/metrics.json | 2 +- .../render-tests/image/raster-contrast/metrics.json | 2 +- .../render-tests/image/raster-hue-rotate/metrics.json | 2 +- .../render-tests/image/raster-opacity/metrics.json | 2 +- .../render-tests/image/raster-resampling/metrics.json | 2 +- .../render-tests/image/raster-saturation/metrics.json | 2 +- .../render-tests/image/raster-visibility/metrics.json | 2 +- .../render-tests/is-supported-script/filter/metrics.json | 2 +- .../render-tests/is-supported-script/layout/metrics.json | 2 +- .../render-tests/line-blur/default/metrics.json | 2 +- .../render-tests/line-blur/function/metrics.json | 2 +- .../render-tests/line-blur/literal/metrics.json | 2 +- .../render-tests/line-blur/property-function/metrics.json | 2 +- .../render-tests/line-cap/butt/metrics.json | 2 +- .../render-tests/line-cap/round/metrics.json | 2 +- .../render-tests/line-cap/square/metrics.json | 2 +- .../render-tests/line-color/default/metrics.json | 2 +- .../render-tests/line-color/function/metrics.json | 2 +- .../render-tests/line-color/literal/metrics.json | 2 +- .../line-color/property-function-identity/metrics.json | 2 +- .../render-tests/line-color/property-function/metrics.json | 2 +- .../render-tests/line-dasharray/default/metrics.json | 2 +- .../render-tests/line-dasharray/fractional-zoom/metrics.json | 2 +- .../function/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/function/line-width-constant/metrics.json | 2 +- .../function/line-width-property-function/metrics.json | 2 +- .../literal/line-width-composite-function/metrics.json | 2 +- .../line-dasharray/literal/line-width-constant/metrics.json | 2 +- .../literal/line-width-property-function/metrics.json | 2 +- .../literal/line-width-zoom-function/metrics.json | 2 +- .../render-tests/line-dasharray/long-segment/metrics.json | 2 +- .../render-tests/line-dasharray/overscaled/metrics.json | 2 +- .../render-tests/line-dasharray/round/segments/metrics.json | 2 +- .../line-dasharray/round/zero-gap-width/metrics.json | 2 +- .../render-tests/line-dasharray/slant/metrics.json | 2 +- .../render-tests/line-dasharray/zero-length-gap/metrics.json | 2 +- .../render-tests/line-dasharray/zoom-history/metrics.json | 2 +- .../render-tests/line-gap-width/default/metrics.json | 2 +- .../render-tests/line-gap-width/function/metrics.json | 2 +- .../render-tests/line-gap-width/literal/metrics.json | 2 +- .../line-gap-width/property-function/metrics.json | 2 +- .../line-gradient/gradient-tile-boundaries/metrics.json | 2 +- .../render-tests/line-gradient/gradient/metrics.json | 2 +- .../render-tests/line-gradient/translucent/metrics.json | 2 +- .../render-tests/line-join/bevel-transparent/metrics.json | 2 +- .../render-tests/line-join/bevel/metrics.json | 2 +- .../render-tests/line-join/default/metrics.json | 2 +- .../render-tests/line-join/miter-transparent/metrics.json | 2 +- .../render-tests/line-join/miter/metrics.json | 2 +- .../line-join/property-function-dasharray/metrics.json | 2 +- .../render-tests/line-join/property-function/metrics.json | 2 +- .../render-tests/line-join/round-transparent/metrics.json | 2 +- .../render-tests/line-join/round/metrics.json | 2 +- .../render-tests/line-offset/default/metrics.json | 2 +- .../render-tests/line-offset/function/metrics.json | 2 +- .../render-tests/line-offset/literal-negative/metrics.json | 2 +- .../render-tests/line-offset/literal/metrics.json | 2 +- .../render-tests/line-offset/property-function/metrics.json | 2 +- .../render-tests/line-opacity/default/metrics.json | 2 +- .../render-tests/line-opacity/function/metrics.json | 2 +- .../render-tests/line-opacity/literal/metrics.json | 2 +- .../render-tests/line-opacity/property-function/metrics.json | 2 +- .../render-tests/line-opacity/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/@2x/metrics.json | 2 +- .../render-tests/line-pattern/literal/metrics.json | 2 +- .../render-tests/line-pattern/opacity/metrics.json | 2 +- .../render-tests/line-pattern/overscaled/metrics.json | 2 +- .../render-tests/line-pattern/pitch/metrics.json | 2 +- .../render-tests/line-pattern/property-function/metrics.json | 2 +- .../render-tests/line-pattern/step-curve/metrics.json | 2 +- .../render-tests/line-pattern/zoom-expression/metrics.json | 2 +- .../render-tests/line-pitch/default/metrics.json | 2 +- .../render-tests/line-pitch/pitch0/metrics.json | 2 +- .../render-tests/line-pitch/pitch15/metrics.json | 2 +- .../render-tests/line-pitch/pitch30/metrics.json | 2 +- .../render-tests/line-pitch/pitchAndBearing/metrics.json | 2 +- .../render-tests/line-sort-key/literal/metrics.json | 2 +- .../render-tests/line-translate-anchor/map/metrics.json | 2 +- .../render-tests/line-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/line-translate/default/metrics.json | 2 +- .../render-tests/line-translate/function/metrics.json | 2 +- .../render-tests/line-translate/literal/metrics.json | 2 +- .../render-tests/line-triangulation/default/metrics.json | 2 +- .../render-tests/line-triangulation/round/metrics.json | 2 +- .../render-tests/line-visibility/none/metrics.json | 2 +- .../render-tests/line-visibility/visible/metrics.json | 2 +- .../render-tests/line-width/default/metrics.json | 2 +- .../render-tests/line-width/function/metrics.json | 2 +- .../render-tests/line-width/literal/metrics.json | 2 +- .../render-tests/line-width/property-function/metrics.json | 2 +- .../render-tests/line-width/very-overscaled/metrics.json | 2 +- .../render-tests/line-width/zero-width-function/metrics.json | 2 +- .../render-tests/line-width/zero-width/metrics.json | 2 +- .../linear-filter-opacity-edge/literal/metrics.json | 2 +- .../render-tests/map-mode/static/metrics.json | 2 +- .../render-tests/map-mode/tile-avoid-edges/metrics.json | 2 +- .../render-tests/map-mode/tile/metrics.json | 2 +- .../projection/axonometric-multiple/metrics.json | 2 +- .../render-tests/projection/axonometric/metrics.json | 2 +- .../render-tests/projection/skew/metrics.json | 2 +- .../render-tests/raster-alpha/default/metrics.json | 2 +- .../render-tests/raster-brightness/default/metrics.json | 2 +- .../render-tests/raster-brightness/function/metrics.json | 2 +- .../render-tests/raster-brightness/literal/metrics.json | 2 +- .../render-tests/raster-contrast/default/metrics.json | 2 +- .../render-tests/raster-contrast/function/metrics.json | 2 +- .../render-tests/raster-contrast/literal/metrics.json | 2 +- .../render-tests/raster-extent/maxzoom/metrics.json | 2 +- .../render-tests/raster-extent/minzoom/metrics.json | 2 +- .../render-tests/raster-hue-rotate/default/metrics.json | 2 +- .../render-tests/raster-hue-rotate/function/metrics.json | 2 +- .../render-tests/raster-hue-rotate/literal/metrics.json | 2 +- .../render-tests/raster-loading/missing/metrics.json | 2 +- .../raster-masking/overlapping-vector/metrics.json | 2 +- .../render-tests/raster-masking/overlapping/metrics.json | 2 +- .../render-tests/raster-opacity/default/metrics.json | 2 +- .../render-tests/raster-opacity/function/metrics.json | 2 +- .../render-tests/raster-opacity/literal/metrics.json | 2 +- .../render-tests/raster-resampling/default/metrics.json | 2 +- .../render-tests/raster-resampling/function/metrics.json | 2 +- .../render-tests/raster-resampling/literal/metrics.json | 2 +- .../render-tests/raster-rotation/0/metrics.json | 2 +- .../render-tests/raster-rotation/180/metrics.json | 2 +- .../render-tests/raster-rotation/270/metrics.json | 2 +- .../render-tests/raster-rotation/45/metrics.json | 2 +- .../render-tests/raster-rotation/90/metrics.json | 2 +- .../render-tests/raster-saturation/default/metrics.json | 2 +- .../render-tests/raster-saturation/function/metrics.json | 2 +- .../render-tests/raster-saturation/literal/metrics.json | 2 +- .../render-tests/raster-visibility/none/metrics.json | 2 +- .../render-tests/raster-visibility/visible/metrics.json | 2 +- .../render-tests/real-world/nepal/metrics.json | 2 +- .../render-tests/real-world/norway/metrics.json | 2 +- .../render-tests/real-world/uruguay/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2305/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2523/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2533/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2534/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2787/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2846/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#2929/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3010/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3107/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3320/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3365/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3394/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3426/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3612/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3614/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3623/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3633/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3682/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3702/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3723/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3819/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3903/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3910/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#3949/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4124/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4144/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4146/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4150/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4235/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4550/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4551/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4564/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4573/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4579/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4605/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4617/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4647/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4651/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4860/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#4928/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5171/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5370/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5466/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5496/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5544/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5546/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5576/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5599/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5631/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5642/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5776/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5911a/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5947/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5953/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#5978/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6160/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6238/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6548/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6649/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6660/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#6919/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7032/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7066/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#7172/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#8273/metrics.json | 2 +- .../render-tests/regressions/mapbox-gl-js#9009/metrics.json | 2 +- .../regressions/mapbox-gl-native#10849/metrics.json | 2 +- .../regressions/mapbox-gl-native#11451/metrics.json | 2 +- .../regressions/mapbox-gl-native#11729/metrics.json | 2 +- .../regressions/mapbox-gl-native#12812/metrics.json | 2 +- .../regressions/mapbox-gl-native#14402/metrics.json | 2 +- .../regressions/mapbox-gl-native#15139/metrics.json | 2 +- .../regressions/mapbox-gl-native#3292/metrics.json | 2 +- .../regressions/mapbox-gl-native#5648/metrics.json | 2 +- .../regressions/mapbox-gl-native#5701/metrics.json | 2 +- .../regressions/mapbox-gl-native#5754/metrics.json | 2 +- .../regressions/mapbox-gl-native#6063/metrics.json | 2 +- .../regressions/mapbox-gl-native#6233/metrics.json | 2 +- .../regressions/mapbox-gl-native#6820/metrics.json | 2 +- .../regressions/mapbox-gl-native#6903/metrics.json | 2 +- .../regressions/mapbox-gl-native#7241/metrics.json | 2 +- .../regressions/mapbox-gl-native#7572/metrics.json | 2 +- .../regressions/mapbox-gl-native#7714/metrics.json | 2 +- .../regressions/mapbox-gl-native#7792/metrics.json | 2 +- .../regressions/mapbox-gl-native#8078/metrics.json | 2 +- .../regressions/mapbox-gl-native#8303/metrics.json | 2 +- .../regressions/mapbox-gl-native#8460/metrics.json | 2 +- .../regressions/mapbox-gl-native#8505/metrics.json | 2 +- .../regressions/mapbox-gl-native#8871/metrics.json | 2 +- .../regressions/mapbox-gl-native#8952/metrics.json | 2 +- .../regressions/mapbox-gl-native#9406/metrics.json | 2 +- .../regressions/mapbox-gl-native#9557/metrics.json | 2 +- .../regressions/mapbox-gl-native#9792/metrics.json | 2 +- .../regressions/mapbox-gl-native#9900/metrics.json | 2 +- .../regressions/mapbox-gl-native#9976/metrics.json | 2 +- .../regressions/mapbox-gl-native#9979/metrics.json | 2 +- .../regressions/mapbox-gl-shaders#37/metrics.json | 2 +- .../remove-feature-state/composite-expression/metrics.json | 2 +- .../remove-feature-state/data-expression/metrics.json | 2 +- .../remove-feature-state/vector-source/metrics.json | 2 +- .../render-tests/retina-raster/default/metrics.json | 2 +- .../runtime-styling/filter-default-to-false/metrics.json | 2 +- .../runtime-styling/filter-default-to-true/metrics.json | 2 +- .../runtime-styling/filter-false-to-default/metrics.json | 2 +- .../runtime-styling/filter-false-to-true/metrics.json | 2 +- .../runtime-styling/filter-true-to-default/metrics.json | 2 +- .../runtime-styling/filter-true-to-false/metrics.json | 2 +- .../image-add-1.5x-image-1x-screen/metrics.json | 2 +- .../image-add-1.5x-image-2x-screen/metrics.json | 2 +- .../image-add-1x-image-1x-screen/metrics.json | 2 +- .../image-add-1x-image-2x-screen/metrics.json | 2 +- .../image-add-2x-image-1x-screen/metrics.json | 2 +- .../image-add-2x-image-2x-screen/metrics.json | 2 +- .../runtime-styling/image-add-alpha/metrics.json | 2 +- .../runtime-styling/image-add-nonsdf/metrics.json | 2 +- .../runtime-styling/image-add-pattern/metrics.json | 2 +- .../render-tests/runtime-styling/image-add-sdf/metrics.json | 2 +- .../render-tests/runtime-styling/image-remove/metrics.json | 2 +- .../runtime-styling/image-update-icon/metrics.json | 2 +- .../runtime-styling/image-update-pattern/metrics.json | 2 +- .../runtime-styling/layer-add-background/metrics.json | 2 +- .../runtime-styling/layer-add-circle/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-fill/metrics.json | 2 +- .../render-tests/runtime-styling/layer-add-line/metrics.json | 2 +- .../runtime-styling/layer-add-raster/metrics.json | 2 +- .../runtime-styling/layer-add-symbol/metrics.json | 2 +- .../runtime-styling/layer-remove-background/metrics.json | 2 +- .../runtime-styling/layer-remove-circle/metrics.json | 2 +- .../runtime-styling/layer-remove-fill/metrics.json | 2 +- .../runtime-styling/layer-remove-line/metrics.json | 2 +- .../runtime-styling/layer-remove-raster/metrics.json | 2 +- .../runtime-styling/layer-remove-symbol/metrics.json | 2 +- .../layout-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-default-to-zoom-expression/metrics.json | 2 +- .../layout-property-default-to-zoom-function/metrics.json | 2 +- .../layout-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-literal-to-zoom-expression/metrics.json | 2 +- .../layout-property-literal-to-zoom-function/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-text-variable-anchor/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-expression-to-default/metrics.json | 2 +- .../layout-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../layout-property-zoom-function-to-default/metrics.json | 2 +- .../layout-property-zoom-function-to-literal/metrics.json | 2 +- .../paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-default-to-property-function/metrics.json | 2 +- .../paint-property-default-to-zoom-expression/metrics.json | 2 +- .../paint-property-default-to-zoom-function/metrics.json | 2 +- .../paint-property-fill-flat-to-extrude/metrics.json | 2 +- .../paint-property-literal-to-default/metrics.json | 2 +- .../paint-property-literal-to-expression/metrics.json | 2 +- .../paint-property-literal-to-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-literal-to-property-function/metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-overriden-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-property-function-to-default/metrics.json | 2 +- .../paint-property-property-function-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-expression-to-default/metrics.json | 2 +- .../paint-property-zoom-expression-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../paint-property-zoom-function-to-default/metrics.json | 2 +- .../paint-property-zoom-function-to-literal/metrics.json | 2 +- .../set-style-filter-default-to-false/metrics.json | 2 +- .../set-style-filter-default-to-true/metrics.json | 2 +- .../set-style-filter-false-to-default/metrics.json | 2 +- .../set-style-filter-false-to-true/metrics.json | 2 +- .../set-style-filter-true-to-default/metrics.json | 2 +- .../set-style-filter-true-to-false/metrics.json | 2 +- .../set-style-layer-add-background/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-line/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-raster/metrics.json | 2 +- .../runtime-styling/set-style-layer-add-symbol/metrics.json | 2 +- .../set-style-layer-change-source-layer/metrics.json | 2 +- .../set-style-layer-change-source-type/metrics.json | 2 +- .../set-style-layer-change-source/metrics.json | 2 +- .../set-style-layer-remove-background/metrics.json | 2 +- .../set-style-layer-remove-circle/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-fill/metrics.json | 2 +- .../runtime-styling/set-style-layer-remove-line/metrics.json | 2 +- .../set-style-layer-remove-raster/metrics.json | 2 +- .../set-style-layer-remove-symbol/metrics.json | 2 +- .../runtime-styling/set-style-layer-reorder/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-default-to-literal/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-paint-property-literal-to-default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../set-style-source-add-geojson-inline/metrics.json | 2 +- .../set-style-source-add-geojson-url/metrics.json | 2 +- .../set-style-source-add-raster-inline/metrics.json | 2 +- .../set-style-source-add-raster-url/metrics.json | 2 +- .../set-style-source-add-vector-inline/metrics.json | 2 +- .../set-style-source-add-vector-url/metrics.json | 2 +- .../runtime-styling/set-style-source-update/metrics.json | 2 +- .../runtime-styling/set-style-sprite/metrics.json | 2 +- .../set-style-visibility-default-to-none/metrics.json | 2 +- .../set-style-visibility-default-to-visible/metrics.json | 2 +- .../set-style-visibility-none-to-default/metrics.json | 2 +- .../set-style-visibility-none-to-visible/metrics.json | 2 +- .../set-style-visibility-visible-to-default/metrics.json | 2 +- .../set-style-visibility-visible-to-none/metrics.json | 2 +- .../runtime-styling/source-add-geojson-inline/metrics.json | 2 +- .../runtime-styling/source-add-geojson-url/metrics.json | 2 +- .../runtime-styling/source-add-raster-inline/metrics.json | 2 +- .../runtime-styling/source-add-raster-url/metrics.json | 2 +- .../runtime-styling/source-add-vector-inline/metrics.json | 2 +- .../runtime-styling/source-add-vector-url/metrics.json | 2 +- .../runtime-styling/visibility-default-to-none/metrics.json | 2 +- .../visibility-default-to-visible/metrics.json | 2 +- .../runtime-styling/visibility-none-to-default/metrics.json | 2 +- .../runtime-styling/visibility-none-to-visible/metrics.json | 2 +- .../visibility-visible-to-default/metrics.json | 2 +- .../runtime-styling/visibility-visible-to-none/metrics.json | 2 +- .../render-tests/satellite-v9/z0/metrics.json | 2 +- .../render-tests/sparse-tileset/overdraw/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/1x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-1x-pattern/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-icon/metrics.json | 2 +- .../render-tests/sprites/2x-screen-2x-pattern/metrics.json | 2 +- .../render-tests/sprites/array-default-only/metrics.json | 2 +- .../render-tests/sprites/array-multiple/metrics.json | 2 +- .../render-tests/symbol-geometry/linestring/metrics.json | 2 +- .../symbol-geometry/multilinestring/metrics.json | 2 +- .../render-tests/symbol-geometry/multipoint/metrics.json | 2 +- .../render-tests/symbol-geometry/multipolygon/metrics.json | 2 +- .../render-tests/symbol-geometry/point/metrics.json | 2 +- .../render-tests/symbol-geometry/polygon/metrics.json | 2 +- .../line-center-buffer-tile-map-mode/metrics.json | 2 +- .../symbol-placement/line-center-buffer/metrics.json | 2 +- .../symbol-placement/line-center-tile-map-mode/metrics.json | 2 +- .../render-tests/symbol-placement/line-center/metrics.json | 2 +- .../symbol-placement/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-placement/line/metrics.json | 2 +- .../render-tests/symbol-placement/point-polygon/metrics.json | 2 +- .../render-tests/symbol-placement/point/metrics.json | 2 +- .../symbol-sort-key/icon-expression/metrics.json | 2 +- .../placement-tile-boundary-left-then-right/metrics.json | 2 +- .../symbol-sort-key/text-expression/metrics.json | 2 +- .../symbol-sort-key/text-ignore-placement/metrics.json | 2 +- .../render-tests/symbol-sort-key/text-placement/metrics.json | 2 +- .../render-tests/symbol-spacing/line-close/metrics.json | 2 +- .../render-tests/symbol-spacing/line-far/metrics.json | 2 +- .../render-tests/symbol-spacing/line-overscaled/metrics.json | 2 +- .../render-tests/symbol-spacing/point-close/metrics.json | 2 +- .../render-tests/symbol-spacing/point-far/metrics.json | 2 +- .../render-tests/symbol-visibility/none/metrics.json | 2 +- .../render-tests/symbol-visibility/visible/metrics.json | 2 +- .../render-tests/symbol-z-order/default/metrics.json | 2 +- .../render-tests/symbol-z-order/disabled/metrics.json | 2 +- .../render-tests/symbol-z-order/icon-with-text/metrics.json | 2 +- .../render-tests/symbol-z-order/pitched/metrics.json | 2 +- .../render-tests/symbol-z-order/viewport-y/metrics.json | 2 +- .../render-tests/text-anchor/bottom-left/metrics.json | 2 +- .../render-tests/text-anchor/bottom-right/metrics.json | 2 +- .../render-tests/text-anchor/bottom/metrics.json | 2 +- .../render-tests/text-anchor/center/metrics.json | 2 +- .../render-tests/text-anchor/left/metrics.json | 2 +- .../render-tests/text-anchor/property-function/metrics.json | 2 +- .../render-tests/text-anchor/right/metrics.json | 2 +- .../render-tests/text-anchor/top-left/metrics.json | 2 +- .../render-tests/text-anchor/top-right/metrics.json | 2 +- .../render-tests/text-anchor/top/metrics.json | 2 +- .../render-tests/text-arabic/letter-spacing/metrics.json | 2 +- .../render-tests/text-arabic/line-break-mixed/metrics.json | 2 +- .../render-tests/text-arabic/line-break/metrics.json | 2 +- .../render-tests/text-arabic/mixed-numeric/metrics.json | 2 +- .../render-tests/text-arabic/multi-paragraph/metrics.json | 2 +- .../render-tests/text-color/default/metrics.json | 2 +- .../render-tests/text-color/function/metrics.json | 2 +- .../render-tests/text-color/literal/metrics.json | 2 +- .../render-tests/text-color/property-function/metrics.json | 2 +- .../render-tests/text-field/formatted-arabic/metrics.json | 2 +- .../text-field/formatted-images-constant-size/metrics.json | 2 +- .../text-field/formatted-images-line/metrics.json | 2 +- .../text-field/formatted-images-multiline/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-images-vertical/metrics.json | 2 +- .../formatted-images-zoom-dependent-size/metrics.json | 2 +- .../render-tests/text-field/formatted-images/metrics.json | 2 +- .../render-tests/text-field/formatted-line/metrics.json | 2 +- .../metrics.json | 2 +- .../text-field/formatted-text-color-overrides/metrics.json | 2 +- .../text-field/formatted-text-color/metrics.json | 2 +- .../render-tests/text-field/formatted/metrics.json | 2 +- .../render-tests/text-field/literal/metrics.json | 2 +- .../render-tests/text-field/property-function/metrics.json | 2 +- .../render-tests/text-field/token/metrics.json | 2 +- .../render-tests/text-font/camera-function/metrics.json | 2 +- .../render-tests/text-font/chinese/metrics.json | 2 +- .../render-tests/text-font/data-expression/metrics.json | 2 +- .../render-tests/text-font/literal/metrics.json | 2 +- .../render-tests/text-halo-blur/default/metrics.json | 2 +- .../render-tests/text-halo-blur/function/metrics.json | 2 +- .../render-tests/text-halo-blur/literal/metrics.json | 2 +- .../text-halo-blur/property-function/metrics.json | 2 +- .../render-tests/text-halo-color/default/metrics.json | 2 +- .../render-tests/text-halo-color/function/metrics.json | 2 +- .../render-tests/text-halo-color/literal/metrics.json | 2 +- .../text-halo-color/property-function/metrics.json | 2 +- .../render-tests/text-halo-width/default/metrics.json | 2 +- .../render-tests/text-halo-width/function/metrics.json | 2 +- .../render-tests/text-halo-width/literal/metrics.json | 2 +- .../text-halo-width/property-function/metrics.json | 2 +- .../render-tests/text-justify/auto/metrics.json | 2 +- .../render-tests/text-justify/left/metrics.json | 2 +- .../render-tests/text-justify/property-function/metrics.json | 2 +- .../render-tests/text-justify/right/metrics.json | 2 +- .../text-keep-upright/line-placement-false/metrics.json | 2 +- .../line-placement-true-offset/metrics.json | 2 +- .../line-placement-true-pitched/metrics.json | 2 +- .../line-placement-true-rotated/metrics.json | 2 +- .../line-placement-true-text-anchor/metrics.json | 2 +- .../text-keep-upright/line-placement-true/metrics.json | 2 +- .../point-placement-align-map-false/metrics.json | 2 +- .../point-placement-align-map-true/metrics.json | 2 +- .../point-placement-align-viewport-false/metrics.json | 2 +- .../point-placement-align-viewport-true/metrics.json | 2 +- .../text-letter-spacing/function-close/metrics.json | 2 +- .../text-letter-spacing/function-far/metrics.json | 2 +- .../render-tests/text-letter-spacing/literal/metrics.json | 2 +- .../text-letter-spacing/property-function/metrics.json | 2 +- .../zoom-and-property-function/metrics.json | 2 +- .../render-tests/text-line-height/literal/metrics.json | 2 +- .../render-tests/text-max-angle/line-center/metrics.json | 2 +- .../render-tests/text-max-angle/literal/metrics.json | 2 +- .../text-max-width/force-double-newline/metrics.json | 2 +- .../text-max-width/force-newline-line-center/metrics.json | 2 +- .../text-max-width/force-newline-line/metrics.json | 2 +- .../render-tests/text-max-width/force-newline/metrics.json | 2 +- .../text-max-width/ideographic-breaking/metrics.json | 2 +- .../ideographic-punctuation-breaking/metrics.json | 2 +- .../render-tests/text-max-width/literal/metrics.json | 2 +- .../text-max-width/property-function/metrics.json | 2 +- .../zero-width-line-center-placement/metrics.json | 2 +- .../text-max-width/zero-width-line-placement/metrics.json | 2 +- .../text-max-width/zoom-and-property-function/metrics.json | 2 +- .../text-no-cross-source-collision/default/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../render-tests/text-offset/literal/metrics.json | 2 +- .../render-tests/text-offset/property-function/metrics.json | 2 +- .../render-tests/text-opacity/default/metrics.json | 2 +- .../render-tests/text-opacity/function/metrics.json | 2 +- .../render-tests/text-opacity/literal/metrics.json | 2 +- .../render-tests/text-opacity/property-function/metrics.json | 2 +- .../auto-text-rotation-alignment-map/metrics.json | 2 +- .../auto-text-rotation-alignment-viewport/metrics.json | 2 +- .../text-pitch-alignment/map-text-depthtest/metrics.json | 2 +- .../map-text-rotation-alignment-map/metrics.json | 2 +- .../map-text-rotation-alignment-viewport/metrics.json | 2 +- .../viewport-overzoomed-single-glyph/metrics.json | 2 +- .../text-pitch-alignment/viewport-overzoomed/metrics.json | 2 +- .../viewport-text-depthtest/metrics.json | 2 +- .../viewport-text-rotation-alignment-map/metrics.json | 2 +- .../viewport-text-rotation-alignment-viewport/metrics.json | 2 +- .../render-tests/text-pitch-scaling/line-half/metrics.json | 2 +- .../render-tests/text-radial-offset/basic/metrics.json | 2 +- .../render-tests/text-rotate/anchor-bottom/metrics.json | 2 +- .../render-tests/text-rotate/anchor-left/metrics.json | 2 +- .../render-tests/text-rotate/anchor-right/metrics.json | 2 +- .../render-tests/text-rotate/anchor-top/metrics.json | 2 +- .../render-tests/text-rotate/function/metrics.json | 2 +- .../render-tests/text-rotate/literal/metrics.json | 2 +- .../render-tests/text-rotate/property-function/metrics.json | 2 +- .../render-tests/text-rotate/with-offset/metrics.json | 2 +- .../auto-symbol-placement-line/metrics.json | 2 +- .../auto-symbol-placement-point/metrics.json | 2 +- .../map-symbol-placement-line/metrics.json | 2 +- .../map-symbol-placement-point/metrics.json | 2 +- .../viewport-symbol-placement-line/metrics.json | 2 +- .../viewport-symbol-placement-point/metrics.json | 2 +- .../text-size/camera-function-high-base/metrics.json | 2 +- .../text-size/camera-function-interval/metrics.json | 2 +- .../render-tests/text-size/composite-expression/metrics.json | 2 +- .../text-size/composite-function-line-placement/metrics.json | 2 +- .../render-tests/text-size/composite-function/metrics.json | 2 +- .../render-tests/text-size/default/metrics.json | 2 +- .../render-tests/text-size/function/metrics.json | 2 +- .../render-tests/text-size/literal/metrics.json | 2 +- .../render-tests/text-size/property-function/metrics.json | 2 +- .../render-tests/text-size/zero/metrics.json | 2 +- .../text-tile-edge-clipping/default/metrics.json | 2 +- .../render-tests/text-transform/lowercase/metrics.json | 2 +- .../text-transform/property-function/metrics.json | 2 +- .../render-tests/text-transform/uppercase/metrics.json | 2 +- .../render-tests/text-translate-anchor/map/metrics.json | 2 +- .../render-tests/text-translate-anchor/viewport/metrics.json | 2 +- .../render-tests/text-translate/default/metrics.json | 2 +- .../render-tests/text-translate/function/metrics.json | 2 +- .../render-tests/text-translate/literal/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor-offset/all-anchors/metrics.json | 2 +- .../databind-coalesce/metrics.json | 2 +- .../databind-interpolate/metrics.json | 2 +- .../icon-image-all-anchors/metrics.json | 2 +- .../icon-image-offset/metrics.json | 2 +- .../text-variable-anchor-offset/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../text-variable-anchor-offset/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor-offset/pitched-offset/metrics.json | 2 +- .../pitched-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/pitched/metrics.json | 2 +- .../text-variable-anchor-offset/rotated-offset/metrics.json | 2 +- .../rotated-with-map/metrics.json | 2 +- .../text-variable-anchor-offset/rotated/metrics.json | 2 +- .../single-justification/metrics.json | 2 +- .../text-variable-anchor-offset/single-line/metrics.json | 2 +- .../text-allow-overlap/metrics.json | 2 +- .../top-bottom-left-right/metrics.json | 2 +- .../all-anchors-icon-text-fit/metrics.json | 2 +- .../all-anchors-offset-zero/metrics.json | 2 +- .../text-variable-anchor/all-anchors-offset/metrics.json | 2 +- .../all-anchors-radial-offset-zero/metrics.json | 2 +- .../all-anchors-text-allow-overlap/metrics.json | 2 +- .../all-anchors-tile-map-mode/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-negative/metrics.json | 2 +- .../all-anchors-two-dimentional-offset-zero/metrics.json | 2 +- .../all-anchors-two-dimentional-offset/metrics.json | 2 +- .../text-variable-anchor/all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image-all-anchors/metrics.json | 2 +- .../text-variable-anchor/icon-image/metrics.json | 2 +- .../icon-text-fit-collision-box/metrics.json | 2 +- .../left-top-right-bottom-offset-tile-map-mode/metrics.json | 2 +- .../text-variable-anchor/no-animate-zoom/metrics.json | 2 +- .../text-variable-anchor/pitched-offset/metrics.json | 2 +- .../text-variable-anchor/pitched-rotated-debug/metrics.json | 2 +- .../text-variable-anchor/pitched-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/pitched/metrics.json | 2 +- .../text-variable-anchor/rotated-offset/metrics.json | 2 +- .../text-variable-anchor/rotated-with-map/metrics.json | 2 +- .../render-tests/text-variable-anchor/rotated/metrics.json | 2 +- .../text-variable-anchor/single-justification/metrics.json | 2 +- .../text-variable-anchor/single-line/metrics.json | 2 +- .../text-variable-anchor/text-allow-overlap/metrics.json | 2 +- .../text-variable-anchor/top-bottom-left-right/metrics.json | 2 +- .../render-tests/text-visibility/none/metrics.json | 2 +- .../render-tests/text-visibility/visible/metrics.json | 2 +- .../line_label/chinese-punctuation/metrics.json | 2 +- .../text-writing-mode/line_label/chinese/metrics.json | 2 +- .../text-writing-mode/line_label/latin/metrics.json | 2 +- .../text-writing-mode/line_label/mixed/metrics.json | 2 +- .../point_label/cjk-arabic-vertical-mode/metrics.json | 2 +- .../point_label/cjk-horizontal-vertical-mode/metrics.json | 2 +- .../cjk-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-punctuation-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../metrics.json | 2 +- .../cjk-variable-anchors-vertical-mode/metrics.json | 2 +- .../point_label/cjk-vertical-horizontal-mode/metrics.json | 2 +- .../point_label/cjk-vertical-mode/metrics.json | 2 +- .../point_label/latin-vertical-mode/metrics.json | 2 +- .../metrics.json | 2 +- .../mixed-multiline-vertical-horizontal-mode/metrics.json | 2 +- .../render-tests/tilejson-bounds/default/metrics.json | 2 +- .../windows-msvc-release/render-tests/tms/tms/metrics.json | 2 +- .../within/filter-with-inlined-geojson/metrics.json | 2 +- .../render-tests/within/layout-text/metrics.json | 2 +- .../render-tests/within/paint-circle/metrics.json | 2 +- .../render-tests/within/paint-icon/metrics.json | 2 +- .../render-tests/within/paint-line/metrics.json | 2 +- .../render-tests/within/paint-text/metrics.json | 2 +- .../render-tests/zoom-history/in/metrics.json | 2 +- .../render-tests/zoom-history/out/metrics.json | 2 +- .../render-tests/zoom-visibility/above/metrics.json | 2 +- .../render-tests/zoom-visibility/below/metrics.json | 2 +- .../render-tests/zoom-visibility/in-range/metrics.json | 2 +- .../render-tests/zoom-visibility/out-of-range/metrics.json | 2 +- .../render-tests/zoom-visibility/was-above/metrics.json | 2 +- .../render-tests/zoom-visibility/was-below/metrics.json | 2 +- .../render-tests/zoomed-fill/default/metrics.json | 2 +- .../render-tests/zoomed-raster/fractional/metrics.json | 2 +- .../render-tests/zoomed-raster/overzoom/metrics.json | 2 +- .../render-tests/zoomed-raster/underzoom/metrics.json | 2 +- misc/mb-icon-blue-circle.svg | 2 +- platform/README.md | 2 +- platform/android/.idea/runConfigurations/Benchmark.xml | 2 +- .../.idea/runConfigurations/Instrumentation_Tests.xml | 2 +- platform/android/LICENSE.md | 1 - platform/android/Makefile | 2 +- platform/android/MapLibreAndroid/.gitignore | 1 - platform/android/MapLibreAndroid/proguard-rules.pro | 2 +- .../MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp | 2 +- .../src/cpp/android_vulkan_renderer_backend.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/marker.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/marker.hpp | 2 +- .../MapLibreAndroid/src/cpp/annotation/multi_point.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/polygon.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/polygon.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/polyline.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/annotation/polyline.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/geojson/feature.hpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/feature_collection.cpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/feature_collection.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/geojson/geometry.hpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/geometry_collection.cpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/geometry_collection.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/geojson/line_string.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/geojson/line_string.hpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/multi_line_string.cpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/multi_line_string.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/geojson/multi_point.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/geojson/multi_point.hpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/multi_polygon.cpp | 2 +- .../MapLibreAndroid/src/cpp/geojson/multi_polygon.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/geojson/point.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/geojson/polygon.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/geojson/polygon.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/geometry/lat_lng.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/geometry/lat_lng.hpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/lat_lng_bounds.cpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/lat_lng_bounds.hpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/lat_lng_quad.cpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/lat_lng_quad.hpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/projected_meters.cpp | 2 +- .../MapLibreAndroid/src/cpp/geometry/projected_meters.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/graphics/pointf.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/graphics/pointf.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/graphics/rectf.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/graphics/rectf.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/gson/json_array.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/gson/json_array.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_element.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_element.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_object.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_object.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_primitive.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/gson/json_primitive.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/java/util.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/java/util.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/logger.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/logger.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/logging_android.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/map/camera_position.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/map/image.hpp | 2 +- .../MapLibreAndroid/src/cpp/snapshotter/map_snapshot.hpp | 2 +- .../MapLibreAndroid/src/cpp/style/conversion/filter.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/style/formatted.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/style/formatted.hpp | 2 +- .../MapLibreAndroid/src/cpp/style/formatted_section.cpp | 2 +- .../MapLibreAndroid/src/cpp/style/formatted_section.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/style/light.hpp | 2 +- platform/android/MapLibreAndroid/src/cpp/style/position.cpp | 2 +- platform/android/MapLibreAndroid/src/cpp/style/position.hpp | 2 +- .../MapLibreAndroid/src/cpp/style/transition_options.cpp | 2 +- .../MapLibreAndroid/src/cpp/style/transition_options.hpp | 2 +- .../android/MapLibreAndroid/src/cpp/util/default_style.cpp | 2 +- .../android/MapLibreAndroid/src/cpp/util/default_style.hpp | 2 +- .../android/MapLibreAndroid/src/drawable/AndroidManifest.xml | 2 +- .../src/main/java/org/maplibre/android/LibraryLoader.java | 1 - .../main/java/org/maplibre/android/annotations/Bubble.java | 2 +- .../java/org/maplibre/android/location/CompassListener.java | 1 - .../maplibre/android/location/LocationCameraController.java | 2 +- .../android/location/LocationComponentActivationOptions.java | 2 +- .../android/location/LocationComponentCompassEngine.java | 2 +- .../maplibre/android/location/LocationLayerController.java | 2 +- .../maplibre/android/location/MapLibreAnimatorListener.kt | 2 +- .../org/maplibre/android/location/MapLibrePaddingAnimator.kt | 2 +- .../java/org/maplibre/android/location/PaddingEvaluator.kt | 2 +- .../org/maplibre/android/location/engine/LocationEngine.java | 2 +- .../android/location/engine/LocationEngineCallback.java | 2 +- .../android/location/engine/LocationEngineProxy.java | 2 +- .../android/location/engine/LocationEngineRequest.java | 1 - .../org/maplibre/android/location/modes/package-info.java | 2 +- .../java/org/maplibre/android/location/package-info.java | 2 +- .../src/main/java/org/maplibre/android/log/Logger.java | 2 +- .../main/java/org/maplibre/android/log/LoggerDefinition.java | 2 +- .../src/main/java/org/maplibre/android/log/package-info.java | 2 +- .../java/org/maplibre/android/maps/AnnotationContainer.java | 2 +- .../java/org/maplibre/android/maps/MapChangeReceiver.java | 2 +- .../main/java/org/maplibre/android/maps/MarkerContainer.java | 2 +- .../src/main/java/org/maplibre/android/maps/NativeMap.java | 2 +- .../maps/renderer/surfaceview/SurfaceViewMapRenderer.java | 2 +- .../org/maplibre/android/module/http/HttpRequestImpl.java | 2 +- .../org/maplibre/android/module/http/HttpRequestUtil.java | 2 +- .../main/java/org/maplibre/android/style/layers/Layer.java | 2 +- .../main/java/org/maplibre/android/style/light/Light.java | 2 +- .../java/org/maplibre/android/style/light/light.java.ejs | 2 +- .../src/main/java/org/maplibre/android/utils/FontUtils.java | 2 +- .../main/res/drawable/maplibre_popup_window_transparent.xml | 2 +- .../src/main/res/drawable/maplibre_rounded_corner.xml | 2 +- .../src/main/res/drawable/maplibre_user_icon_shadow.xml | 2 +- .../src/main/res/layout/maplibre_infowindow_content.xml | 1 - .../MapLibreAndroid/src/main/res/values-cs/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-fr/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-gl/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-hu/strings.xml | 2 +- .../MapLibreAndroid/src/main/res/values-pl/strings.xml | 2 +- .../android/MapLibreAndroid/src/main/res/values/styles.xml | 2 +- .../maplibre/android/maps/renderer/egl/EGLLogWrapper.java | 1 - .../maps/renderer/surfaceview/GLSurfaceViewMapRenderer.java | 2 +- .../src/test/java/org/maplibre/android/MapLibreInjector.kt | 2 +- .../src/test/java/org/maplibre/android/MapLibreTest.kt | 2 +- .../maplibre/android/location/engine/LocationEngineTest.kt | 2 +- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../android/MapLibreAndroid/src/vulkan/AndroidManifest.xml | 2 +- .../renderer/surfaceview/VulkanSurfaceViewMapRenderer.java | 2 +- platform/android/MapLibreAndroidLint/.gitignore | 1 - platform/android/MapLibreAndroidTestApp/.gitignore | 1 - .../src/androidTest/AndroidManifest.xml | 2 +- .../src/androidTest/assets/streets.json | 2 +- .../java/org/maplibre/android/benchmark/Benchmark.kt | 2 +- .../java/org/maplibre/android/maps/MapLibreMapTest.kt | 2 +- .../java/org/maplibre/android/maps/MapLibreTest.kt | 2 +- .../maplibre/android/testapp/action/MapLibreMapAction.java | 2 -- .../java/org/maplibre/android/testapp/action/WaitAction.java | 1 - .../java/org/maplibre/android/testapp/activity/BaseTest.java | 2 +- .../maplibre/android/testapp/camera/CameraAnimateTest.java | 2 +- .../org/maplibre/android/testapp/camera/CameraEaseTest.java | 2 +- .../org/maplibre/android/testapp/camera/CameraMoveTest.java | 2 +- .../android/testapp/geometry/GeoJsonConversionTest.java | 2 +- .../maplibre/android/testapp/geometry/LatLngBoundsTest.java | 2 +- .../android/testapp/maps/widgets/AttributionTest.java | 2 +- .../android/testapp/maps/widgets/CompassViewTest.java | 1 - .../java/org/maplibre/android/testapp/render/RenderTest.java | 2 +- .../java/org/maplibre/android/testapp/style/LightTest.java | 2 +- .../java/org/maplibre/android/testapp/style/light.junit.ejs | 2 +- .../MapLibreAndroidTestApp/src/main/AndroidManifest.xml | 2 +- .../src/main/assets/fill_color_style.json | 2 +- .../src/main/assets/fill_filter_style.json | 2 +- .../MapLibreAndroidTestApp/src/main/assets/heavy_style.json | 2 +- .../src/main/assets/line_filter_style.json | 2 +- .../src/main/assets/numeric_filter_style.json | 2 +- .../MapLibreAndroidTestApp/src/main/assets/outdoor.json | 2 +- .../MapLibreAndroidTestApp/src/main/assets/pastel.json | 2 +- .../MapLibreAndroidTestApp/src/main/assets/points-sf.geojson | 2 +- .../src/main/assets/satellite-hybrid.json | 2 +- .../src/main/assets/small_line.geojson | 2 +- .../src/main/assets/small_poly.geojson | 2 +- .../MapLibreAndroidTestApp/src/main/assets/streets.json | 2 +- .../src/main/assets/stretchable_image.geojson | 2 +- .../testapp/activity/options/MapOptionsRuntimeActivity.kt | 2 +- .../testapp/activity/options/MapOptionsXmlActivity.kt | 2 +- .../testapp/activity/snapshot/MapSnapshotterActivity.kt | 2 +- .../java/org/maplibre/android/testapp/styles/TestStyles.kt | 2 +- .../src/main/res/drawable/ic_ab_back.xml | 2 +- .../main/res/drawable/mapbox_user_icon_shadow_0px_test.xml | 2 +- .../src/main/res/layout/activity_backstack_fragment.xml | 2 +- .../src/main/res/layout/activity_benchmark.xml | 2 +- .../src/main/res/layout/activity_bottom_sheet.xml | 2 +- .../src/main/res/layout/activity_cache_management.xml | 2 +- .../src/main/res/layout/activity_camera_animator.xml | 2 +- .../layout/activity_collection_update_on_style_change.xml | 2 +- .../src/main/res/layout/activity_custom_layer.xml | 1 - .../src/main/res/layout/activity_debug_mode.xml | 2 +- .../src/main/res/layout/activity_draggable_marker.xml | 2 +- .../src/main/res/layout/activity_hillshade_layer.xml | 2 +- .../src/main/res/layout/activity_latlngbounds.xml | 2 +- .../layout/activity_location_layer_activation_builder.xml | 2 +- .../layout/activity_location_layer_basic_pulsing_circle.xml | 2 +- .../activity_location_layer_customized_pulsing_circle.xml | 2 +- .../src/main/res/layout/activity_location_layer_fragment.xml | 2 +- .../main/res/layout/activity_location_layer_map_change.xml | 2 +- .../src/main/res/layout/activity_location_layer_mode.xml | 2 +- .../src/main/res/layout/activity_location_manual_update.xml | 2 +- .../src/main/res/layout/activity_map_fragment.xml | 2 -- .../src/main/res/layout/activity_map_options_runtime.xml | 2 +- .../src/main/res/layout/activity_map_options_xml.xml | 2 +- .../res/layout/activity_mapsnapshotter_within_expression.xml | 2 +- .../src/main/res/layout/activity_maxmin_zoom.xml | 2 +- .../src/main/res/layout/activity_overlay.xml | 2 +- .../src/main/res/layout/activity_physical_circle.xml | 2 +- .../src/main/res/layout/activity_recyclerview.xml | 2 +- .../src/main/res/layout/activity_region_download.xml | 2 +- .../src/main/res/layout/activity_scroll_by.xml | 2 -- .../src/main/res/layout/activity_symbollayer.xml | 1 - .../src/main/res/layout/activity_textureview_animate.xml | 1 - .../src/main/res/layout/activity_textureview_debug_mode.xml | 2 +- .../src/main/res/layout/activity_textureview_resize.xml | 1 - .../src/main/res/layout/activity_textureview_transparent.xml | 1 - .../src/main/res/layout/activity_within_expression.xml | 2 +- .../src/main/res/layout/item_gesture_alert.xml | 2 +- .../src/main/res/layout/item_viewpager.xml | 1 - .../src/main/res/menu/menu_gestures.xml | 2 +- .../src/main/res/menu/menu_location_mode.xml | 2 +- .../src/main/res/menu/menu_pulsing_location_mode.xml | 2 +- .../src/main/res/raw/amsterdam.geojson | 2 +- .../MapLibreAndroidTestApp/src/main/res/raw/demotiles.json | 2 +- .../MapLibreAndroidTestApp/src/main/res/raw/local_style.json | 2 +- .../MapLibreAndroidTestApp/src/main/res/raw/no_bg_style.json | 2 +- .../src/main/res/raw/test_feature_collection.geojson | 2 +- .../src/main/res/raw/test_line_gradient_feature.geojson | 2 +- .../src/main/res/raw/test_line_string_feature.geojson | 2 +- .../src/main/res/raw/test_multi_line_string_feature.geojson | 2 +- .../src/main/res/raw/test_multi_point_feature.geojson | 2 +- .../src/main/res/raw/test_points_utrecht.geojson | 2 +- .../src/main/res/raw/tiny_countries.geojson | 2 +- .../MapLibreAndroidTestApp/src/main/res/values/actions.xml | 2 +- .../MapLibreAndroidTestApp/src/main/res/values/arrays.xml | 2 +- .../src/main/res/values/categories.xml | 2 +- .../MapLibreAndroidTestApp/src/main/res/values/titles.xml | 2 +- .../android/MapLibreAndroidTestApp/test-proguard-rules.pro | 2 +- platform/android/MapLibrePlugin/build.gradle.kts | 2 +- platform/android/MapLibrePlugin/settings.gradle.kts | 2 +- .../src/main/kotlin/org/maplibre/CcachePlugin.kt | 1 - platform/android/buildSrc/settings.gradle.kts | 2 +- .../src/main/kotlin/DownloadVulkanValidationPlugin.kt | 2 +- .../android/buildSrc/src/main/kotlin/NativeBuildPlugin.kt | 2 +- platform/android/buildSrc/src/main/kotlin/Versions.kt | 2 +- .../kotlin/maplibre.download-vulkan-validation.gradle.kts | 2 +- .../kotlin/maplibre.gradle-dependencies-graph.gradle.kts | 2 -- .../src/main/kotlin/maplibre.publish-root.gradle.kts | 2 +- platform/android/docs/README.md | 2 +- platform/android/docs/annotations/add-markers.md | 2 +- platform/android/docs/assets/extra.css | 2 +- platform/android/docs/camera/animator-animation.md | 2 +- platform/android/docs/camera/cameraposition.md | 2 +- platform/android/docs/camera/gesture-detector.md | 2 +- platform/android/docs/camera/lat-lng-bounds.md | 2 +- platform/android/docs/camera/max-min-zoom.md | 1 - platform/android/docs/camera/move-map-pixels.md | 2 +- platform/android/docs/camera/zoom-methods.md | 1 - platform/android/docs/data/PMTiles.md | 2 +- platform/android/docs/geojson-guide.md | 2 +- platform/android/docs/index.md | 2 +- platform/android/docs/main.py | 2 +- platform/android/docs/snapshotter.md | 2 +- platform/android/docs/styling/animated-image-source.md | 2 +- platform/android/docs/styling/animated-symbol-layer.md | 2 +- platform/android/docs/styling/building-layer.md | 2 +- platform/android/docs/styling/circle-layer.md | 2 +- platform/android/docs/styling/custom-sprite.md | 2 +- platform/android/docs/styling/distance-expression.md | 2 +- platform/android/docs/styling/draggable-marker.md | 2 +- platform/android/scripts/check-alignment.sh | 2 +- platform/android/scripts/create-signing-key.sh | 2 +- platform/android/scripts/ensure-code-revision.sh | 2 +- platform/android/scripts/release-notes-github.md.ejs | 2 -- platform/android/scripts/run-benchmark.sh | 2 +- .../scripts/trigger-maps-documentation-deploy-steps.sh | 2 +- platform/android/scripts/upload-to-github-release.py | 2 +- platform/android/scripts/validate-license.py | 2 +- platform/android/src/gl_functions.cpp | 2 +- platform/android/version-script | 2 +- platform/darwin/.gitignore | 1 - platform/darwin/bazel/.gitignore | 2 +- platform/darwin/resources/Base.lproj/Foundation.strings | 1 - platform/darwin/resources/ca.lproj/Foundation.strings | 1 - platform/darwin/resources/cs.lproj/Foundation.strings | 1 - platform/darwin/resources/da.lproj/Foundation.strings | 1 - platform/darwin/resources/de.lproj/Foundation.strings | 1 - platform/darwin/resources/es.lproj/Foundation.strings | 1 - platform/darwin/resources/fr.lproj/Foundation.strings | 1 - platform/darwin/resources/gl.lproj/Foundation.strings | 1 - platform/darwin/resources/he.lproj/Foundation.strings | 1 - platform/darwin/resources/ja.lproj/Foundation.strings | 1 - platform/darwin/resources/ko.lproj/Foundation.strings | 1 - platform/darwin/resources/lt.lproj/Foundation.strings | 1 - platform/darwin/resources/pt-BR.lproj/Foundation.strings | 1 - platform/darwin/resources/ru.lproj/Foundation.strings | 1 - platform/darwin/resources/sv.lproj/Foundation.strings | 1 - platform/darwin/resources/uk.lproj/Foundation.strings | 1 - platform/darwin/resources/vi.lproj/Foundation.strings | 1 - platform/darwin/resources/zh-Hans.lproj/Foundation.strings | 1 - platform/darwin/resources/zh-Hant.lproj/Foundation.strings | 1 - platform/darwin/scripts/style-spec-cocoa-conventions-v8.json | 2 +- platform/darwin/src/MLNBackendResource.mm | 2 +- platform/darwin/src/MLNGeometry.mm | 1 - platform/darwin/src/MLNPointAnnotation.mm | 1 - platform/darwin/test/MLNTestAssertionHandler.m | 1 - platform/darwin/test/Media.xcassets/Contents.json | 2 +- platform/darwin/test/Media.xcassets/Fixtures/Contents.json | 2 +- .../Fixtures/MLNMapSnapshotterTests/Contents.json | 2 +- .../MLNMapSnapshotterTests/background.imageset/Contents.json | 2 +- .../test/Media.xcassets/RadarImage.imageset/Contents.json | 2 +- .../TrackingLocationMask.imageset/Contents.json | 2 +- platform/default/include/mbgl/storage/merge_sideloaded.js | 1 - platform/default/include/mbgl/storage/merge_sideloaded.sql | 2 +- platform/default/include/mbgl/storage/offline_schema.js | 1 - platform/default/src/mbgl/render-test/main.cpp | 2 +- platform/ios/.gitignore | 2 +- platform/ios/.npmignore | 2 +- .../Assets.xcassets/AppIcon.appiconset/Contents.json | 2 +- .../Camera Tests/MLNCameraTransitionFinishTests.mm | 1 - platform/ios/Integration_Tests/MBGLIntegrationTests.mm | 1 - .../MLNNetworkConfigurationIntegrationTests.mm | 4 ---- platform/ios/LICENSE.md | 2 +- platform/ios/MapLibre.docc/AddMarkerSymbolExample.md | 2 +- platform/ios/MapLibre.docc/AnimatedLineExample.md | 2 +- platform/ios/MapLibre.docc/AnnotationViewExample.md | 2 +- platform/ios/MapLibre.docc/BuildingLightExample.md | 2 +- platform/ios/MapLibre.docc/DDSCircleLayerExample.md | 2 +- platform/ios/MapLibre.docc/ExampleStyles.md | 2 +- platform/ios/MapLibre.docc/LineOnUserTap.md | 2 +- platform/ios/MapLibre.docc/LineStyleLayerExample.md | 2 +- platform/ios/MapLibre.docc/LocationPrivacyExample.md | 2 +- platform/ios/MapLibre.docc/ManageOfflineRegionsExample.md | 2 +- platform/ios/MapLibre.docc/MultipleImagesExample.md | 2 +- platform/ios/MapLibre.docc/OfflinePackExample.md | 2 +- platform/ios/MapLibre.docc/POIAlongRouteExample.md | 2 +- platform/ios/MapLibre.docc/Resources/.gitignore | 2 +- platform/ios/MapLibre.docc/StaticSnapshotExample.md | 2 +- platform/ios/MapLibre.docc/WebAPIDataExample.md | 2 +- platform/ios/RELEASE.md | 2 +- platform/ios/VERSION | 2 +- platform/ios/app-swift/Data/example.geojson | 2 +- .../TrackingHeadingMask.imageset/Contents.json | 2 +- .../TrackingLocationMask.imageset/Contents.json | 2 +- .../TrackingLocationOffMask.imageset/Contents.json | 2 +- .../ios/app/Assets.xcassets/settings.imageset/Contents.json | 2 +- platform/ios/app/fill_filter_style.json | 2 +- platform/ios/app/line_filter_style.json | 2 +- platform/ios/app/numeric_filter_style.json | 2 +- platform/ios/app/simple_route.json | 2 +- platform/ios/app/threestates.geojson | 2 +- platform/ios/benchmark/assets/download.sh | 1 - platform/ios/benchmark/assets/glyphs/.gitignore | 1 - platform/ios/benchmark/assets/readme.txt | 1 - platform/ios/benchmark/assets/sprites/sprite.json | 2 +- platform/ios/benchmark/assets/sprites/sprite@2x.json | 2 +- platform/ios/benchmark/assets/styles/streets.json | 2 +- platform/ios/benchmark/assets/tiles/.gitignore | 1 - platform/ios/benchmark/assets/tiles/openmaptiles.json | 2 +- platform/ios/resources/Base.lproj/Localizable.strings | 1 - .../resources/Images.xcassets/Compass.imageset/Contents.json | 2 +- .../Images.xcassets/default_marker.imageset/Contents.json | 2 +- .../resources/Images.xcassets/mapbox.imageset/Contents.json | 2 +- .../Images.xcassets/mapbox_helmet.imageset/Contents.json | 2 +- platform/ios/resources/README | 2 +- platform/ios/resources/bg.lproj/Localizable.strings | 1 - platform/ios/resources/ca.lproj/Localizable.strings | 1 - platform/ios/resources/cs.lproj/Localizable.strings | 1 - platform/ios/resources/da.lproj/Localizable.strings | 1 - platform/ios/resources/de.lproj/Localizable.strings | 1 - platform/ios/resources/es.lproj/Localizable.strings | 1 - platform/ios/resources/fr.lproj/Localizable.strings | 1 - platform/ios/resources/gl.lproj/Localizable.strings | 1 - platform/ios/resources/he.lproj/Localizable.strings | 1 - platform/ios/resources/hu.lproj/Localizable.strings | 1 - platform/ios/resources/ja.lproj/Localizable.strings | 1 - platform/ios/resources/ko.lproj/Localizable.strings | 1 - platform/ios/resources/lt.lproj/Localizable.strings | 1 - platform/ios/resources/metal-cpp-ignores.txt | 1 - platform/ios/resources/pt-BR.lproj/Localizable.strings | 1 - platform/ios/resources/pt-PT.lproj/Localizable.strings | 1 - platform/ios/resources/ru.lproj/Localizable.strings | 1 - platform/ios/resources/sv.lproj/Localizable.strings | 1 - platform/ios/resources/uk.lproj/Localizable.strings | 1 - platform/ios/resources/vi.lproj/Localizable.strings | 1 - platform/ios/resources/zh-Hans.lproj/Localizable.strings | 1 - platform/ios/resources/zh-Hant.lproj/Localizable.strings | 1 - platform/ios/scripts/deploy-swift-package.sh | 2 +- platform/ios/test/common/AppDelegate.h | 2 +- platform/linux/xorg/README.md | 2 +- platform/linux/xorg/startxwrapper | 2 +- platform/linux/xorg/xorg.conf | 2 +- platform/macos/.gitignore | 2 +- .../app/Assets.xcassets/AppIcon.appiconset/Contents.json | 2 +- platform/macos/app/Assets.xcassets/Layers/Contents.json | 2 +- .../Assets.xcassets/Layers/background.imageset/Contents.json | 2 +- .../app/Assets.xcassets/Layers/circle.imageset/Contents.json | 2 +- .../Layers/fill-extrusion.imageset/Contents.json | 2 +- .../app/Assets.xcassets/Layers/fill.imageset/Contents.json | 2 +- .../Assets.xcassets/Layers/heatmap.imageset/Contents.json | 2 +- .../Assets.xcassets/Layers/hillshade.imageset/Contents.json | 2 +- .../app/Assets.xcassets/Layers/symbol.imageset/Contents.json | 2 +- platform/macos/app/Assets.xcassets/Radar/Contents.json | 2 +- .../Assets.xcassets/Radar/southeast_0.imageset/Contents.json | 2 +- .../Assets.xcassets/Radar/southeast_1.imageset/Contents.json | 2 +- .../Assets.xcassets/Radar/southeast_2.imageset/Contents.json | 2 +- .../Assets.xcassets/Radar/southeast_3.imageset/Contents.json | 2 +- .../macos/app/Assets.xcassets/ohio.imageset/Contents.json | 2 +- platform/macos/app/Credits.rtf | 2 +- platform/macos/app/heatmap.json | 2 +- platform/macos/macos.cmake | 2 +- platform/macos/sdk/Base.lproj/Localizable.strings | 1 - platform/macos/sdk/ar.lproj/Localizable.strings | 1 - platform/macos/sdk/bg.lproj/Localizable.strings | 1 - platform/macos/sdk/ca.lproj/Localizable.strings | 1 - platform/macos/sdk/cs.lproj/Localizable.strings | 1 - platform/macos/sdk/da.lproj/Localizable.strings | 1 - platform/macos/sdk/de.lproj/Localizable.strings | 1 - platform/macos/sdk/es.lproj/Localizable.strings | 1 - platform/macos/sdk/fi.lproj/Localizable.strings | 1 - platform/macos/sdk/fr.lproj/Localizable.strings | 1 - platform/macos/sdk/gl.lproj/Localizable.strings | 1 - platform/macos/sdk/he.lproj/Localizable.strings | 1 - platform/macos/sdk/hu.lproj/Localizable.strings | 1 - platform/macos/sdk/ja.lproj/Localizable.strings | 1 - platform/macos/sdk/lt.lproj/Localizable.strings | 1 - platform/macos/sdk/nl.lproj/Localizable.strings | 1 - platform/macos/sdk/pl.lproj/Localizable.strings | 1 - platform/macos/sdk/pt-BR.lproj/Localizable.strings | 1 - platform/macos/sdk/pt-PT.lproj/Localizable.strings | 1 - platform/macos/sdk/ru.lproj/Localizable.strings | 1 - platform/macos/sdk/sv.lproj/Localizable.strings | 1 - platform/macos/sdk/uk.lproj/Localizable.strings | 1 - platform/macos/sdk/vi.lproj/Localizable.strings | 1 - platform/macos/sdk/zh-Hans.lproj/Localizable.strings | 1 - platform/macos/sdk/zh-Hant.lproj/Localizable.strings | 1 - platform/node/.nvmrc | 2 +- platform/node/CHANGELOG.md | 2 +- platform/qt/src/mbgl/gl_functions.cpp | 2 +- render-test/android/.gitignore | 2 +- render-test/android/README.md | 2 +- .../src/androidTest/java/android/app/NativeActivityTest.java | 2 +- .../app/src/androidTest/java/android/app/TestState.java | 2 +- render-test/android/build.gradle.kts | 2 +- render-test/android/gradle/libs.versions.toml | 2 +- render-test/android/settings.gradle.kts | 2 +- render-test/ios/Empty.plist | 2 +- render-test/ios/Info.plist | 2 +- rustutils/generate.sh | 2 +- scripts/aws-device-farm/aws-device-farm-run.sh | 2 +- scripts/aws-device-farm/collect-benchmark-outputs.mjs | 2 +- scripts/aws-device-farm/plot-android-benchmark-results.py | 2 +- scripts/aws-device-farm/s3-client.mjs | 2 +- scripts/global.d.ts | 2 +- scripts/jsconfig.json | 2 +- scripts/ubsan.blacklist | 2 +- scripts/update-ios-examples.mjs | 2 +- scripts/vendor/sqlite.sh | 2 +- shaders/collision_box.fragment.glsl | 2 +- shaders/drawable.collision_box.fragment.glsl | 2 +- src/mbgl/actor/mailbox.cpp | 2 +- src/mbgl/gl/index_buffer_resource.cpp | 2 +- src/mbgl/gl/texture_resource.cpp | 2 +- src/mbgl/gl/vertex_buffer_resource.cpp | 2 +- src/mbgl/style/layers/custom_layer_render_parameters.cpp | 2 +- test/android/.gitignore | 2 +- test/android/app/build.gradle.kts | 2 +- test/android/settings.gradle.kts | 2 +- test/fixtures/annotations/emerald.json | 2 +- test/fixtures/annotations/emerald@2x.json | 2 +- test/fixtures/expression_equality/acos.a.json | 2 +- test/fixtures/expression_equality/acos.b.json | 2 +- test/fixtures/expression_equality/all.a.json | 2 +- test/fixtures/expression_equality/all.b.json | 2 +- test/fixtures/expression_equality/any.a.json | 2 +- test/fixtures/expression_equality/any.b.json | 2 +- test/fixtures/expression_equality/array.a.json | 2 +- test/fixtures/expression_equality/array.b.json | 2 +- test/fixtures/expression_equality/asin.a.json | 2 +- test/fixtures/expression_equality/asin.b.json | 2 +- test/fixtures/expression_equality/at.a.json | 2 +- test/fixtures/expression_equality/at.b.json | 2 +- test/fixtures/expression_equality/atan.a.json | 2 +- test/fixtures/expression_equality/atan.b.json | 2 +- test/fixtures/expression_equality/boolean.a.json | 2 +- test/fixtures/expression_equality/boolean.b.json | 2 +- test/fixtures/expression_equality/case.a.json | 2 +- test/fixtures/expression_equality/case.b.json | 2 +- test/fixtures/expression_equality/coalesce.a.json | 2 +- test/fixtures/expression_equality/coalesce.b.json | 2 +- test/fixtures/expression_equality/concat.a.json | 2 +- test/fixtures/expression_equality/concat.b.json | 2 +- test/fixtures/expression_equality/cos.a.json | 2 +- test/fixtures/expression_equality/cos.b.json | 2 +- test/fixtures/expression_equality/distance.a.json | 2 +- test/fixtures/expression_equality/distance.b.json | 2 +- test/fixtures/expression_equality/divide.a.json | 2 +- test/fixtures/expression_equality/divide.b.json | 2 +- test/fixtures/expression_equality/downcase.a.json | 2 +- test/fixtures/expression_equality/downcase.b.json | 2 +- test/fixtures/expression_equality/get.a.json | 2 +- test/fixtures/expression_equality/get.b.json | 2 +- test/fixtures/expression_equality/has.a.json | 2 +- test/fixtures/expression_equality/has.b.json | 2 +- test/fixtures/expression_equality/image.a.json | 2 +- test/fixtures/expression_equality/image.b.json | 2 +- test/fixtures/expression_equality/in.a.json | 2 +- test/fixtures/expression_equality/in.b.json | 2 +- test/fixtures/expression_equality/let.a.json | 2 +- test/fixtures/expression_equality/ln.b.json | 2 +- test/fixtures/expression_equality/log10.a.json | 2 +- test/fixtures/expression_equality/log10.b.json | 2 +- test/fixtures/expression_equality/log2.a.json | 2 +- test/fixtures/expression_equality/log2.b.json | 2 +- test/fixtures/expression_equality/match.a.json | 2 +- test/fixtures/expression_equality/match.b.json | 2 +- test/fixtures/expression_equality/max.a.json | 2 +- test/fixtures/expression_equality/max.b.json | 2 +- test/fixtures/expression_equality/minus.a.json | 2 +- test/fixtures/expression_equality/minus.b.json | 2 +- test/fixtures/expression_equality/mod.a.json | 2 +- test/fixtures/expression_equality/mod.b.json | 2 +- test/fixtures/expression_equality/not.a.json | 2 +- test/fixtures/expression_equality/not.b.json | 2 +- .../expression_equality/number-format-currency.a.json | 1 - .../expression_equality/number-format-currency.b.json | 1 - .../expression_equality/number-format-default.a.json | 1 - .../expression_equality/number-format-default.b.json | 1 - .../expression_equality/number-format-precision.a.json | 1 - .../expression_equality/number-format-precision.b.json | 1 - test/fixtures/expression_equality/number.a.json | 2 +- test/fixtures/expression_equality/number.b.json | 2 +- test/fixtures/expression_equality/object.a.json | 2 +- test/fixtures/expression_equality/object.b.json | 2 +- test/fixtures/expression_equality/plus.a.json | 2 +- test/fixtures/expression_equality/plus.b.json | 2 +- test/fixtures/expression_equality/pow.a.json | 2 +- test/fixtures/expression_equality/pow.b.json | 2 +- test/fixtures/expression_equality/rgb.a.json | 2 +- test/fixtures/expression_equality/rgba.a.json | 2 +- test/fixtures/expression_equality/sin.a.json | 2 +- test/fixtures/expression_equality/sin.b.json | 2 +- test/fixtures/expression_equality/sqrt.a.json | 2 +- test/fixtures/expression_equality/sqrt.b.json | 2 +- test/fixtures/expression_equality/step.a.json | 2 +- test/fixtures/expression_equality/step.b.json | 2 +- test/fixtures/expression_equality/string.a.json | 2 +- test/fixtures/expression_equality/string.b.json | 2 +- test/fixtures/expression_equality/tan.a.json | 2 +- test/fixtures/expression_equality/tan.b.json | 2 +- test/fixtures/expression_equality/times.a.json | 2 +- test/fixtures/expression_equality/times.b.json | 2 +- test/fixtures/expression_equality/to-boolean.a.json | 2 +- test/fixtures/expression_equality/to-boolean.b.json | 2 +- test/fixtures/expression_equality/to-color.a.json | 2 +- test/fixtures/expression_equality/to-color.b.json | 2 +- test/fixtures/expression_equality/to-number.a.json | 2 +- test/fixtures/expression_equality/to-number.b.json | 2 +- test/fixtures/expression_equality/to-string.a.json | 2 +- test/fixtures/expression_equality/to-string.b.json | 2 +- test/fixtures/expression_equality/typeof.a.json | 2 +- test/fixtures/expression_equality/typeof.b.json | 2 +- test/fixtures/expression_equality/upcase.a.json | 2 +- test/fixtures/expression_equality/upcase.b.json | 2 +- test/fixtures/expression_equality/within.a.json | 2 +- test/fixtures/expression_equality/within.b.json | 2 +- test/fixtures/expression_equality/zoom.a.json | 2 +- test/fixtures/expression_equality/zoom.b.json | 2 +- test/fixtures/geometry_data/line_string_1.geojson | 2 +- test/fixtures/geometry_data/line_string_2.geojson | 2 +- test/fixtures/geometry_data/multi_line_string_1.geojson | 2 +- test/fixtures/geometry_data/multi_line_string_2.geojson | 2 +- test/fixtures/geometry_data/multi_point_1.geojson | 2 +- test/fixtures/geometry_data/multi_point_2.geojson | 2 +- test/fixtures/geometry_data/multi_point_3.geojson | 2 +- test/fixtures/geometry_data/multi_polygon_1.geojson | 2 +- test/fixtures/geometry_data/multi_polygon_2.geojson | 2 +- test/fixtures/resources/source_raster.json | 2 +- test/fixtures/resources/source_vector.json | 2 +- test/fixtures/resources/sprite.json | 2 +- test/fixtures/resources/style_raster.json | 2 +- test/fixtures/resources/style_vector.json | 2 +- test/fixtures/resources/versatiles-sprite/sprite.json | 2 +- test/fixtures/resources/versatiles-sprite/sprite@2x.json | 2 +- test/fixtures/style_parser/center-not-latlong.info.json | 2 +- test/fixtures/style_parser/center-not-latlong.style.json | 2 +- test/fixtures/style_parser/image-coordinates.info.json | 2 +- test/fixtures/style_parser/image-coordinates.style.json | 2 +- test/fixtures/style_parser/image-url.info.json | 2 +- test/fixtures/style_parser/image-url.style.json | 2 +- test/fixtures/style_parser/non-object.style.json | 2 +- test/fixtures/style_parser/version-not-number.info.json | 2 +- test/fixtures/style_parser/version-not-number.style.json | 2 +- test/sprite/sprite_parser.test.cpp | 2 +- test/storage/database_file_source.test.cpp | 2 +- test/style/conversion/layer.test.cpp | 2 +- test/style/conversion/padding.test.cpp | 2 +- test/style/conversion/stringify.test.cpp | 2 +- test/text/tagged_string.test.cpp | 2 +- test/util/padding.test.cpp | 2 +- vendor/icu/src/uassert.h | 2 -- vendor/icu/src/uinvchar.cpp | 1 - vendor/icu/src/umath.cpp | 1 - vendor/icu/src/uset_imp.h | 1 - vendor/metal-cpp/Foundation/NSDate.hpp | 2 +- vendor/metal-cpp/Foundation/NSLock.hpp | 2 +- vendor/metal-cpp/Foundation/NSNotification.hpp | 1 - vendor/metal-cpp/README.md | 2 +- vendor/nunicode/src/libnu/gen/_ducet.c | 1 - vendor/nunicode/src/libnu/gen/_tolower.c | 1 - vendor/nunicode/src/libnu/gen/_tounaccent.c | 1 - vendor/nunicode/src/libnu/gen/_toupper.c | 1 - vendor/tracy.cmake | 1 - vendor/tracy/LICENSE | 2 +- vendor/unordered_dense.cmake | 2 +- vendor/vulkan.cmake | 2 +- 8187 files changed, 8059 insertions(+), 8199 deletions(-) diff --git a/.bazelignore b/.bazelignore index 7b4ec7aef3d2..4c373e4d17f6 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,4 +1,4 @@ bazel-bin bazel-out bazel-testlogs -node_modules \ No newline at end of file +node_modules diff --git a/.bazelrc b/.bazelrc index 1f834b3a07ce..402ac2662c78 100644 --- a/.bazelrc +++ b/.bazelrc @@ -7,4 +7,4 @@ common --incompatible_disallow_empty_glob coverage --experimental_ui_max_stdouterr_bytes=10485760 -common:macos --linkopt=-L/opt/homebrew/lib \ No newline at end of file +common:macos --linkopt=-L/opt/homebrew/lib diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index cd7d8561a41b..9106980e3bf7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -6,4 +6,3 @@ contact_links: - name: "💬 Chat with us on Slack" url: https://slack.openstreetmap.us/ about: "Join #maplibre-native on the Open Street Map Slack" - diff --git a/.github/actions/android-build-and-upload-render-test/action.yml b/.github/actions/android-build-and-upload-render-test/action.yml index 1c2bcb4c3b0e..47af2811b997 100644 --- a/.github/actions/android-build-and-upload-render-test/action.yml +++ b/.github/actions/android-build-and-upload-render-test/action.yml @@ -22,4 +22,4 @@ runs: if-no-files-found: error path: | ./render-test/android/RenderTestsApp-${{ inputs.flavor }}.apk - ./render-test/android/RenderTests-${{ inputs.flavor }}.apk \ No newline at end of file + ./render-test/android/RenderTests-${{ inputs.flavor }}.apk diff --git a/.github/actions/get-pr-number/action.yml b/.github/actions/get-pr-number/action.yml index 23da26d09c30..d75aba3a125c 100644 --- a/.github/actions/get-pr-number/action.yml +++ b/.github/actions/get-pr-number/action.yml @@ -16,4 +16,4 @@ runs: - id: cat run: echo pr-number="$(cat ./pr_number)" >> $GITHUB_OUTPUT - shell: bash \ No newline at end of file + shell: bash diff --git a/.github/actions/save-pr-number/action.yml b/.github/actions/save-pr-number/action.yml index 5f5225614d7d..0bf36e008daa 100644 --- a/.github/actions/save-pr-number/action.yml +++ b/.github/actions/save-pr-number/action.yml @@ -13,4 +13,4 @@ runs: uses: actions/upload-artifact@v3 with: name: pr-number - path: ./pr_number \ No newline at end of file + path: ./pr_number diff --git a/.github/changed-files.yml b/.github/changed-files.yml index ff4910a0fbb3..152273e60132 100644 --- a/.github/changed-files.yml +++ b/.github/changed-files.yml @@ -65,4 +65,4 @@ android: - 'test/**' - 'vendor/**' - '.gitmodules' - - '!**/*.md' \ No newline at end of file + - '!**/*.md' diff --git a/.github/renovate.json b/.github/renovate.json index 2d485150fc6e..51d5f307f209 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,3 +1,3 @@ { "enabledManagers": ["gradle-wrapper", "bazel"] -} \ No newline at end of file +} diff --git a/.nvmrc b/.nvmrc index b39356075901..409940768f2a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -23 \ No newline at end of file +23 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 25392ab37d5d..3d1a7f8a7be4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,8 +2,9 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: check-yaml - args: [--allow-multiple-documents, --unsafe] + - id: check-yaml + args: [--allow-multiple-documents, --unsafe] + - id: end-of-file-fixer - repo: https://github.com/pre-commit/mirrors-clang-format rev: v19.1.4 hooks: diff --git a/LICENSES.core.md b/LICENSES.core.md index 558d0e489452..25d402398c88 100644 --- a/LICENSES.core.md +++ b/LICENSES.core.md @@ -633,4 +633,3 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` --- - diff --git a/benchmark/android/.gitignore b/benchmark/android/.gitignore index ac96206f3196..3bb19ffd7868 100644 --- a/benchmark/android/.gitignore +++ b/benchmark/android/.gitignore @@ -1 +1 @@ -.gradle/ \ No newline at end of file +.gradle/ diff --git a/benchmark/android/settings.gradle b/benchmark/android/settings.gradle index 573abcb323ce..e7b4def49cb5 100644 --- a/benchmark/android/settings.gradle +++ b/benchmark/android/settings.gradle @@ -1,2 +1 @@ include ':app' - diff --git a/benchmark/fixtures/api/style.json b/benchmark/fixtures/api/style.json index 5270b6cecee4..728e037e9054 100644 --- a/benchmark/fixtures/api/style.json +++ b/benchmark/fixtures/api/style.json @@ -6511,4 +6511,4 @@ "maptiler:copyright": "This style was generated on MapTiler Cloud. Usage outside of MapTiler Cloud requires valid OpenMapTiles Production Package: https://openmaptiles.com/production-package/ -- please contact us.", "openmaptiles:version": "3.x" } -} \ No newline at end of file +} diff --git a/benchmark/fixtures/api/style_formatted_labels.json b/benchmark/fixtures/api/style_formatted_labels.json index fbb17af00432..383b34043697 100644 --- a/benchmark/fixtures/api/style_formatted_labels.json +++ b/benchmark/fixtures/api/style_formatted_labels.json @@ -6511,4 +6511,4 @@ "maptiler:copyright": "This style was generated on MapTiler Cloud. Usage outside of MapTiler Cloud requires valid OpenMapTiles Production Package: https://openmaptiles.com/production-package/ -- please contact us.", "openmaptiles:version": "3.x" } -} \ No newline at end of file +} diff --git a/benchmark/ios/Info.plist b/benchmark/ios/Info.plist index 0c6fd6144135..32dacb529de0 100644 --- a/benchmark/ios/Info.plist +++ b/benchmark/ios/Info.plist @@ -59,4 +59,4 @@ - \ No newline at end of file + diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 72690e61a904..0ff7593fbea9 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -59,4 +59,4 @@ install(TARGETS mbgl-offline mbgl-render RUNTIME DESTINATION bin) if(MLN_WITH_OPENGL) target_compile_definitions(mbgl-render PRIVATE "MLN_RENDER_BACKEND_OPENGL=1") -endif() \ No newline at end of file +endif() diff --git a/design-proposals/2022-09-02-kotlin.md b/design-proposals/2022-09-02-kotlin.md index d0850a19e2fd..de1adfb54df8 100644 --- a/design-proposals/2022-09-02-kotlin.md +++ b/design-proposals/2022-09-02-kotlin.md @@ -24,4 +24,4 @@ Full backward compatibility ## Rejected Alternatives -The alternative is that we go forward with java, meaning that we effectively should port our existing kotlin code to java, which I can't find evidence of any project ever attempting. \ No newline at end of file +The alternative is that we go forward with java, meaning that we effectively should port our existing kotlin code to java, which I can't find evidence of any project ever attempting. diff --git a/design-proposals/2023-06-17-android-annotations.md b/design-proposals/2023-06-17-android-annotations.md index bdcf5c401aff..6506b20609ea 100644 --- a/design-proposals/2023-06-17-android-annotations.md +++ b/design-proposals/2023-06-17-android-annotations.md @@ -278,4 +278,4 @@ One remaining task is to consider supporting an `InfoWindow`-like feature with o ## Rejected Alternatives -* Moving the existing code to `maplibre-native` without further considerations leads to chaos, because it would leave users with the choice between two rather mediocre APIs – one being mediocre by design, the other because it is deprecated. Additionally, it would leave the codebase with two confusingly similar codebases. With this proposal, we can offer one new and clean API, and redirect calls to the old API to the new one. \ No newline at end of file +* Moving the existing code to `maplibre-native` without further considerations leads to chaos, because it would leave users with the choice between two rather mediocre APIs – one being mediocre by design, the other because it is deprecated. Additionally, it would leave the codebase with two confusingly similar codebases. With this proposal, we can offer one new and clean API, and redirect calls to the old API to the new one. diff --git a/design-proposals/2023-11-08-complex-animatable-interactive-annotations.md b/design-proposals/2023-11-08-complex-animatable-interactive-annotations.md index 096650041733..0fb81b98652f 100644 --- a/design-proposals/2023-11-08-complex-animatable-interactive-annotations.md +++ b/design-proposals/2023-11-08-complex-animatable-interactive-annotations.md @@ -59,4 +59,3 @@ No migration plan needed unless we introduce a Phase 3 to cleanup existing platf Historically the gap has been somewhat filled by the different platform layers. On the iOS platform there is a MapKit style “AnnotationDelegate”, which in some cases draws directly to the mglMap core and in others will add views as subviews to the MGLMapView. On Android there is a whole proposal for updating the Annotations API (design-proposals/2023-06-17-android-annotations.md). Note: This proposal is for purely additive code and we do not plan to change any of these existing systems at this time. Those who have attempted to make complex map applications using these workarounds quickly run into performance issues and other problems like incompatibility with clustering or label collisions. If one were to attempt to create such a system using SymbolLayers, they will quickly find that they need to build out a whole system to handle touch events (usually involving querying a screen rect for map features). They will find that if they want to draw many different high resolution images they now need to deal with manually adding images to the stylesheet and the performance implications of doing so. They will also find that any attempts at animating the content can cause full layout recalculations of the map and will rarely animate as expected. - diff --git a/docs/.gitignore b/docs/.gitignore index 712ac0122c0f..78dcd7b93ed6 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,2 +1,2 @@ book -*.bkp \ No newline at end of file +*.bkp diff --git a/docs/mdbook/diff.css b/docs/mdbook/diff.css index 623e2edb68d8..a8f4609bd261 100644 --- a/docs/mdbook/diff.css +++ b/docs/mdbook/diff.css @@ -369,4 +369,4 @@ .d2h-moved-tag { border: 1px solid #3572b0 -} \ No newline at end of file +} diff --git a/docs/mdbook/src/android/README.md b/docs/mdbook/src/android/README.md index 5f0e6d1358aa..ba1fa0805dbb 100644 --- a/docs/mdbook/src/android/README.md +++ b/docs/mdbook/src/android/README.md @@ -55,4 +55,4 @@ $ ./gradlew formatKotlin ## Profiling -See [Tracy Profiling](/profiling/tracy-profiling.md) to understand how Tracy can be used for profiling. \ No newline at end of file +See [Tracy Profiling](/profiling/tracy-profiling.md) to understand how Tracy can be used for profiling. diff --git a/docs/mdbook/src/android/android-documentation.md b/docs/mdbook/src/android/android-documentation.md index 26c0932b2e1c..988180b77513 100644 --- a/docs/mdbook/src/android/android-documentation.md +++ b/docs/mdbook/src/android/android-documentation.md @@ -46,4 +46,4 @@ Static assets are ideally uploaded to the [MapLibre Native S3 Bucket](https://ma Please open an issue with the ARN of your AWS account to get upload privileges. -You can use the macro `{{ s3_url("filename.example") }}` which will use a CDN instead of linking to the S3 bucket directly. \ No newline at end of file +You can use the macro `{{ s3_url("filename.example") }}` which will use a CDN instead of linking to the S3 bucket directly. diff --git a/docs/mdbook/src/android/benchmark.md b/docs/mdbook/src/android/benchmark.md index da52ff1b059c..3f0248f061d9 100644 --- a/docs/mdbook/src/android/benchmark.md +++ b/docs/mdbook/src/android/benchmark.md @@ -99,4 +99,4 @@ To run the benchmarks (for Android) include the following line on a PR comment: !benchmark android ``` -A file with the benchmark results will be added to the workflow summary, which you can compare with the previous results in the bucket. \ No newline at end of file +A file with the benchmark results will be added to the workflow summary, which you can compare with the previous results in the bucket. diff --git a/docs/mdbook/src/ios/README.md b/docs/mdbook/src/ios/README.md index 208f34d3de33..4a6306bc28ad 100644 --- a/docs/mdbook/src/ios/README.md +++ b/docs/mdbook/src/ios/README.md @@ -75,4 +75,4 @@ You can also build targets from the command line. For example, if you want to bu ## Swift App -There is also an example app built with Swift instead of Objective-C. The target is called `MapLibreApp` and the source code lives in `platform/ios/app-swift`. \ No newline at end of file +There is also an example app built with Swift instead of Objective-C. The target is called `MapLibreApp` and the source code lives in `platform/ios/app-swift`. diff --git a/docs/mdbook/src/ios/ios-documentation.md b/docs/mdbook/src/ios/ios-documentation.md index bba85d1aa965..5e4371c5c3dd 100644 --- a/docs/mdbook/src/ios/ios-documentation.md +++ b/docs/mdbook/src/ios/ios-documentation.md @@ -50,4 +50,4 @@ Then the code block will be updated when you run: ```sh node scripts/update-ios-examples.mjs -``` \ No newline at end of file +``` diff --git a/docs/mdbook/src/ios/ios-tests.md b/docs/mdbook/src/ios/ios-tests.md index 570f789ce7a2..05c929c0ac0e 100644 --- a/docs/mdbook/src/ios/ios-tests.md +++ b/docs/mdbook/src/ios/ios-tests.md @@ -15,4 +15,4 @@ to get the data directory of the render test app. This allows you to inspect tes ## C++ Unit Tests -Run the tests from the `CppUnitTests` target in Xcode to run the C++ Unit Tests on iOS. \ No newline at end of file +Run the tests from the `CppUnitTests` target in Xcode to run the C++ Unit Tests on iOS. diff --git a/docs/mdbook/src/profiling/README.md b/docs/mdbook/src/profiling/README.md index 969978eed452..18a7b196f682 100644 --- a/docs/mdbook/src/profiling/README.md +++ b/docs/mdbook/src/profiling/README.md @@ -1,3 +1,3 @@ # MapLibre Native profiling -MabLibre Native integrates [Tracy profiler](https://github.com/wolfpld/tracy) which offers an easy way to understand and optimize your application's CPU and GPU performance \ No newline at end of file +MabLibre Native integrates [Tracy profiler](https://github.com/wolfpld/tracy) which offers an easy way to understand and optimize your application's CPU and GPU performance diff --git a/docs/mdbook/src/rust.md b/docs/mdbook/src/rust.md index ff2a05321dbc..30980cd57ce1 100644 --- a/docs/mdbook/src/rust.md +++ b/docs/mdbook/src/rust.md @@ -64,4 +64,4 @@ To create a new module: "src/mbgl/util/color.cpp", ], }) - ``` \ No newline at end of file + ``` diff --git a/expression-test/expression_test_parser.hpp b/expression-test/expression_test_parser.hpp index 3cfe24896223..a2abe9f85a31 100644 --- a/expression-test/expression_test_parser.hpp +++ b/expression-test/expression_test_parser.hpp @@ -95,4 +95,4 @@ std::unique_ptr parseExpression(const JSValue&, TestResult&); std::unique_ptr parseExpression(const std::optional&, std::optional&, - TestResult&); \ No newline at end of file + TestResult&); diff --git a/include/mbgl/util/bitmask_operations.hpp b/include/mbgl/util/bitmask_operations.hpp index 322b2851dc8c..019331edb43b 100644 --- a/include/mbgl/util/bitmask_operations.hpp +++ b/include/mbgl/util/bitmask_operations.hpp @@ -29,4 +29,4 @@ constexpr Enum operator~(Enum value) { return Enum(~mbgl::underlying_type(value)); } -} // namespace mbgl \ No newline at end of file +} // namespace mbgl diff --git a/include/mbgl/util/monotonic_timer.hpp b/include/mbgl/util/monotonic_timer.hpp index 4a5061cfa811..771a35658beb 100644 --- a/include/mbgl/util/monotonic_timer.hpp +++ b/include/mbgl/util/monotonic_timer.hpp @@ -19,4 +19,4 @@ class MonotonicTimer { }; } // namespace util -} // namespace mbgl \ No newline at end of file +} // namespace mbgl diff --git a/metrics/android-render-test-runner/location_indicator/dateline/metrics.json b/metrics/android-render-test-runner/location_indicator/dateline/metrics.json index 638feda04f37..6170d6963164 100644 --- a/metrics/android-render-test-runner/location_indicator/dateline/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/dateline/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/default/metrics.json b/metrics/android-render-test-runner/location_indicator/default/metrics.json index cf7fc4a91024..9ee4538f0b72 100644 --- a/metrics/android-render-test-runner/location_indicator/default/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/default/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/no_radius_border/metrics.json b/metrics/android-render-test-runner/location_indicator/no_radius_border/metrics.json index 6edd04d72fee..0811048757d4 100644 --- a/metrics/android-render-test-runner/location_indicator/no_radius_border/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/no_radius_border/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/no_radius_fill/metrics.json b/metrics/android-render-test-runner/location_indicator/no_radius_fill/metrics.json index 023dee2e7247..7d3ac1c10ac8 100644 --- a/metrics/android-render-test-runner/location_indicator/no_radius_fill/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/no_radius_fill/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/no_textures/metrics.json b/metrics/android-render-test-runner/location_indicator/no_textures/metrics.json index 5317f9280b75..1da5de4214ab 100644 --- a/metrics/android-render-test-runner/location_indicator/no_textures/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/no_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/one_texture/metrics.json b/metrics/android-render-test-runner/location_indicator/one_texture/metrics.json index 654ef2897ae4..a53b96a019f6 100644 --- a/metrics/android-render-test-runner/location_indicator/one_texture/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/one_texture/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/rotated/metrics.json b/metrics/android-render-test-runner/location_indicator/rotated/metrics.json index f069a304a55c..cc903fd91043 100644 --- a/metrics/android-render-test-runner/location_indicator/rotated/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/rotated/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted/metrics.json index 336c8c7ac1a8..567d03098b6b 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift/metrics.json index e2e13f534a20..227ec05830ad 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_left/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_left/metrics.json index 625cd4fed6e0..a51fcbe26f72 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_left/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_right/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_right/metrics.json index ebdf63da8bd5..d9e6dac5edf3 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_right/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_bottom_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_left/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_left/metrics.json index 258e5bf15f65..e18743a944c1 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_left/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_right/metrics.json b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_right/metrics.json index c5ebe906691f..331061baefb9 100644 --- a/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_right/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/tilted_texture_shift_top_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/location_indicator/two_textures/metrics.json b/metrics/android-render-test-runner/location_indicator/two_textures/metrics.json index 63dacc23a853..cf17fd4dc46a 100644 --- a/metrics/android-render-test-runner/location_indicator/two_textures/metrics.json +++ b/metrics/android-render-test-runner/location_indicator/two_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/android-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/background-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/background-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/background-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-opacity/color/metrics.json b/metrics/android-render-test-runner/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/android-render-test-runner/render-tests/background-opacity/color/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-opacity/image/metrics.json b/metrics/android-render-test-runner/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/android-render-test-runner/render-tests/background-opacity/image/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-opacity/overlay/metrics.json b/metrics/android-render-test-runner/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/android-render-test-runner/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/@2x/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/literal/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/missing/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/missing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/pitch/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/rotated/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-pattern/zoomed/metrics.json b/metrics/android-render-test-runner/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/android-render-test-runner/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/background-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/background-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/background-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/android-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/android-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/android-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/android-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/android-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/android-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/basic-v9/z0/metrics.json b/metrics/android-render-test-runner/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/android-render-test-runner/render-tests/basic-v9/z0/metrics.json +++ b/metrics/android-render-test-runner/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/bright-v9/z0/metrics.json b/metrics/android-render-test-runner/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/android-render-test-runner/render-tests/bright-v9/z0/metrics.json +++ b/metrics/android-render-test-runner/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/blending/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/blending/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/android-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/linestring/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/point/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-geometry/polygon/metrics.json b/metrics/android-render-test-runner/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/blending/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-sort-key/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/android-render-test-runner/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-width/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-width/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/circle-translate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/circle-translate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--image-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--image-translucent/metrics.json index 8ed0fcb075e0..daeb965b4e10 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--image-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--image-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-lines/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-lines/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/debug/collision-pitched/metrics.json b/metrics/android-render-test-runner/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/android-render-test-runner/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/empty/empty/metrics.json b/metrics/android-render-test-runner/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/empty/empty/metrics.json +++ b/metrics/android-render-test-runner/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/extent/1024-fill/metrics.json b/metrics/android-render-test-runner/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/android-render-test-runner/render-tests/extent/1024-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/extent/1024-line/metrics.json b/metrics/android-render-test-runner/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/android-render-test-runner/render-tests/extent/1024-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/extent/1024-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/extent/1024-symbol/metrics.json index b5f9604d8e96..db8d7dd52842 100644 --- a/metrics/android-render-test-runner/render-tests/extent/1024-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/extent/1024-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/feature-state/composite-expression/metrics.json b/metrics/android-render-test-runner/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/android-render-test-runner/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/feature-state/data-expression/metrics.json b/metrics/android-render-test-runner/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/android-render-test-runner/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/feature-state/vector-source/metrics.json b/metrics/android-render-test-runner/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/android-render-test-runner/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/android-render-test-runner/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-antialias/false/metrics.json b/metrics/android-render-test-runner/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-antialias/false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/multiply/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/multiply/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/opacity/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/opacity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/android-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json index 5c12ec1c1ea2..76b87e9c9135 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json index e7b07b6e2550..70de23c6ba2c 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json b/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/android-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/fill/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/android-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/@2x/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/missing/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/android-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/android-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-sort-key/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/android-render-test-runner/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-translate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/android-render-test-runner/render-tests/fill-translate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/android-render-test-runner/render-tests/fill-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/fill-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/android-render-test-runner/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/filter/equality/metrics.json b/metrics/android-render-test-runner/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/filter/equality/metrics.json +++ b/metrics/android-render-test-runner/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/filter/in/metrics.json b/metrics/android-render-test-runner/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/android-render-test-runner/render-tests/filter/in/metrics.json +++ b/metrics/android-render-test-runner/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/filter/legacy-equality/metrics.json b/metrics/android-render-test-runner/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/android-render-test-runner/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/filter/none/metrics.json b/metrics/android-render-test-runner/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/filter/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/clustered-properties/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/clustered/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/clustered/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/external-feature/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/external-feature/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/external-invalid/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/external-linestring/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/external-malformed/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-feature/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-invalid/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-malformed/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-point-line/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/missing/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/missing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/android-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-color/expression/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-intensity/default/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-intensity/function/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/default/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/function/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/literal/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-weight/default/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/heatmap-weight/literal/metrics.json b/metrics/android-render-test-runner/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/android-render-test-runner/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/center/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/center/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/left/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/right/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/top-left/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/top-right/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-anchor/top/metrics.json b/metrics/android-render-test-runner/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-anchor/top/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/android-render-test-runner/render-tests/icon-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-blur/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-blur/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-width/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-width/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/android-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/image-expression/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/stretchable/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/stretchable/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/stretchable/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/stretchable/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-image/token/metrics.json b/metrics/android-render-test-runner/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/android-render-test-runner/render-tests/icon-image/token/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/android-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-offset/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-offset/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-offset/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-opacity/text-only/metrics.json b/metrics/android-render-test-runner/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/android-render-test-runner/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/android-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotate/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/android-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/android-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/both/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/height/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/none/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json index 37cfb3b5fd32..5020340b5dd0 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json index 52972bf07eec..b0dc3e866648 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json index 5bec05e5841c..3e8b0447fdfc 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json index 0cd910a99ac8..2a65586061c5 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json index 3e848e85338f..8935bee6fccc 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json index 6048fc7e0b6a..3a57c7e24ca9 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-text-fit/width/metrics.json b/metrics/android-render-test-runner/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/android-render-test-runner/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/android-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/android-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-translate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-translate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/android-render-test-runner/render-tests/icon-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/icon-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/default/metrics.json b/metrics/android-render-test-runner/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/pitched/metrics.json b/metrics/android-render-test-runner/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/android-render-test-runner/render-tests/image/pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-brightness/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-brightness/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-contrast/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-contrast/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-opacity/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-opacity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-resampling/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-resampling/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-saturation/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-saturation/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/image/raster-visibility/metrics.json b/metrics/android-render-test-runner/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/android-render-test-runner/render-tests/image/raster-visibility/metrics.json +++ b/metrics/android-render-test-runner/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/is-supported-script/filter/metrics.json b/metrics/android-render-test-runner/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/android-render-test-runner/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/android-render-test-runner/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/is-supported-script/layout/metrics.json b/metrics/android-render-test-runner/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/android-render-test-runner/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/android-render-test-runner/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-blur/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-blur/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-blur/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-blur/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-blur/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-blur/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-blur/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/android-render-test-runner/render-tests/line-blur/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-cap/butt/metrics.json b/metrics/android-render-test-runner/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-cap/butt/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-cap/round/metrics.json b/metrics/android-render-test-runner/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/android-render-test-runner/render-tests/line-cap/round/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-cap/square/metrics.json b/metrics/android-render-test-runner/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-cap/square/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-color/property-function-identity/metrics.json b/metrics/android-render-test-runner/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/android-render-test-runner/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/android-render-test-runner/render-tests/line-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/slant/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/android-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json index b4f03708c458..18b105187aad 100644 --- a/metrics/android-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gap-width/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-gap-width/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gap-width/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-gap-width/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gap-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gap-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/android-render-test-runner/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/android-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/android-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gradient/gradient/metrics.json b/metrics/android-render-test-runner/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/android-render-test-runner/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-gradient/translucent/metrics.json b/metrics/android-render-test-runner/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/android-render-test-runner/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/bevel/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/bevel/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/miter-transparent/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/miter/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/miter/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/round-transparent/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-join/round/metrics.json b/metrics/android-render-test-runner/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/android-render-test-runner/render-tests/line-join/round/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-offset/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-offset/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-offset/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-offset/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-offset/literal-negative/metrics.json b/metrics/android-render-test-runner/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-offset/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-offset/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-offset/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/android-render-test-runner/render-tests/line-offset/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/android-render-test-runner/render-tests/line-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/android-render-test-runner/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-opacity/step-curve/metrics.json b/metrics/android-render-test-runner/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/android-render-test-runner/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/@2x/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/pitch/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/step-curve/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/android-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pitch/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-pitch/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pitch/pitch0/metrics.json b/metrics/android-render-test-runner/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pitch/pitch15/metrics.json b/metrics/android-render-test-runner/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pitch/pitch30/metrics.json b/metrics/android-render-test-runner/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/android-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-sort-key/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/android-render-test-runner/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/android-render-test-runner/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/android-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-triangulation/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/android-render-test-runner/render-tests/line-triangulation/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-triangulation/round/metrics.json b/metrics/android-render-test-runner/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/android-render-test-runner/render-tests/line-triangulation/round/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/line-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/android-render-test-runner/render-tests/line-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/default/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/function/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/very-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/zero-width-function/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/line-width/zero-width/metrics.json b/metrics/android-render-test-runner/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/android-render-test-runner/render-tests/line-width/zero-width/metrics.json +++ b/metrics/android-render-test-runner/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/android-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/android-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/map-mode/static/metrics.json b/metrics/android-render-test-runner/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/android-render-test-runner/render-tests/map-mode/static/metrics.json +++ b/metrics/android-render-test-runner/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/android-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json index c158d2da3de1..032f3000b083 100644 --- a/metrics/android-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/android-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/map-mode/tile/metrics.json b/metrics/android-render-test-runner/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/android-render-test-runner/render-tests/map-mode/tile/metrics.json +++ b/metrics/android-render-test-runner/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json b/metrics/android-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/android-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/android-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/projection/axonometric/metrics.json b/metrics/android-render-test-runner/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/android-render-test-runner/render-tests/projection/axonometric/metrics.json +++ b/metrics/android-render-test-runner/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/projection/perspective/metrics.json b/metrics/android-render-test-runner/render-tests/projection/perspective/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/android-render-test-runner/render-tests/projection/perspective/metrics.json +++ b/metrics/android-render-test-runner/render-tests/projection/perspective/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/projection/skew/metrics.json b/metrics/android-render-test-runner/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/android-render-test-runner/render-tests/projection/skew/metrics.json +++ b/metrics/android-render-test-runner/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-alpha/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/android-render-test-runner/render-tests/raster-alpha/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-brightness/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-brightness/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-brightness/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-brightness/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-brightness/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-contrast/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-contrast/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-contrast/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-contrast/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-contrast/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json b/metrics/android-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-extent/minzoom/metrics.json b/metrics/android-render-test-runner/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-loading/missing/metrics.json b/metrics/android-render-test-runner/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/android-render-test-runner/render-tests/raster-loading/missing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/android-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/android-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-masking/overlapping/metrics.json b/metrics/android-render-test-runner/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/android-render-test-runner/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-resampling/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/android-render-test-runner/render-tests/raster-resampling/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-resampling/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/android-render-test-runner/render-tests/raster-resampling/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-resampling/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/android-render-test-runner/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-rotation/0/metrics.json b/metrics/android-render-test-runner/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-rotation/0/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-rotation/180/metrics.json b/metrics/android-render-test-runner/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-rotation/180/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-rotation/270/metrics.json b/metrics/android-render-test-runner/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/android-render-test-runner/render-tests/raster-rotation/270/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-rotation/45/metrics.json b/metrics/android-render-test-runner/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/android-render-test-runner/render-tests/raster-rotation/45/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-rotation/90/metrics.json b/metrics/android-render-test-runner/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/android-render-test-runner/render-tests/raster-rotation/90/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-saturation/default/metrics.json b/metrics/android-render-test-runner/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-saturation/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-saturation/function/metrics.json b/metrics/android-render-test-runner/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-saturation/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-saturation/literal/metrics.json b/metrics/android-render-test-runner/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/android-render-test-runner/render-tests/raster-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/raster-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/real-world/nepal/metrics.json b/metrics/android-render-test-runner/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/android-render-test-runner/render-tests/real-world/nepal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/real-world/norway/metrics.json b/metrics/android-render-test-runner/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/android-render-test-runner/render-tests/real-world/norway/metrics.json +++ b/metrics/android-render-test-runner/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/real-world/uruguay/metrics.json b/metrics/android-render-test-runner/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/android-render-test-runner/render-tests/real-world/uruguay/metrics.json +++ b/metrics/android-render-test-runner/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2305/metrics.json index 96bd9fd98fe0..e56676099d3f 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2305/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json index bc237525bb2f..b508cf45785f 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json index ad0cf8a26751..96b40f548e9e 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json index daa3b24ba11e..76c12734be8a 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json index 7f54e7480358..b9a7b5fe6480 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 662a5ca35c53..44aa3db9ce14 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/android-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/android-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/android-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/android-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/android-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/android-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/android-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/android-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/retina-raster/default/metrics.json b/metrics/android-render-test-runner/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/android-render-test-runner/render-tests/retina-raster/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json index 9b2e396f8e84..08221c27b57a 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-glyphs/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-glyphs/metrics.json index dea2cb3857dc..ea696c62b6b9 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-glyphs/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-glyphs/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/satellite-v9/z0/metrics.json b/metrics/android-render-test-runner/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/android-render-test-runner/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/android-render-test-runner/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/android-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/android-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/array-default-only/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/array-default-only/metrics.json index 28c44c7705cb..3f7e1d890f14 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/array-default-only/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/array-default-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/sprites/array-multiple/metrics.json b/metrics/android-render-test-runner/render-tests/sprites/array-multiple/metrics.json index 45342fbc3d74..625ad67cbb75 100644 --- a/metrics/android-render-test-runner/render-tests/sprites/array-multiple/metrics.json +++ b/metrics/android-render-test-runner/render-tests/sprites/array-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/point/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 228731dd4e22..32fd5783b7de 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index e6f162de074b..af208f4742dc 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/line/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-placement/point/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-placement/point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-visibility/visible/metrics.json index 1de5e049d894..9de5637253b5 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-z-order/default/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/android-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/android-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/android-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/bottom/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/center/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/center/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/left/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/right/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/top-left/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/top-right/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-anchor/top/metrics.json b/metrics/android-render-test-runner/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/android-render-test-runner/render-tests/text-anchor/top/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/android-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/android-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/android-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/android-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-arabic/line-break/metrics.json b/metrics/android-render-test-runner/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/android-render-test-runner/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/android-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/android-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/android-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/android-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/android-render-test-runner/render-tests/text-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json index 526f4071d82d..222affd61acb 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-images/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-images/metrics.json index 52b1978f2930..9bc5091e3add 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-images/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-images/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-line/metrics.json index 089da63a881b..57cdbdbfbf11 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json index 1640b2b40ba6..0f9f3642b628 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/formatted/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/formatted/metrics.json index 883429ed733b..e985f09179ba 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/formatted/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-field/token/metrics.json b/metrics/android-render-test-runner/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/android-render-test-runner/render-tests/text-field/token/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/camera-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/android-render-test-runner/render-tests/text-font/camera-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/chinese/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/chinese/metrics.json index 46fdec9d0538..147bf1ce6489 100644 --- a/metrics/android-render-test-runner/render-tests/text-font/chinese/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-font/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/data-expression/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/data-expression/metrics.json index aac1bbcfbce4..e33d12c1328d 100644 --- a/metrics/android-render-test-runner/render-tests/text-font/data-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-font/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-blur/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-blur/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-blur/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-color/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-color/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-color/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-color/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-color/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-color/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-width/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-width/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-width/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-width/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-halo-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/android-render-test-runner/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-justify/auto/metrics.json b/metrics/android-render-test-runner/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/android-render-test-runner/render-tests/text-justify/auto/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-justify/left/metrics.json b/metrics/android-render-test-runner/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/android-render-test-runner/render-tests/text-justify/left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-justify/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/android-render-test-runner/render-tests/text-justify/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-justify/right/metrics.json b/metrics/android-render-test-runner/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/android-render-test-runner/render-tests/text-justify/right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/android-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/android-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-line-height/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/android-render-test-runner/render-tests/text-line-height/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-angle/line-center/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-angle/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/force-newline/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/android-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/android-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-offset/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/android-render-test-runner/render-tests/text-offset/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-opacity/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-opacity/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-opacity/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-opacity/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-opacity/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-opacity/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-opacity/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/android-render-test-runner/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/android-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/android-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-radial-offset/basic/metrics.json b/metrics/android-render-test-runner/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotate/with-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/composite-expression/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/composite-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/composite-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-size/zero/metrics.json b/metrics/android-render-test-runner/render-tests/text-size/zero/metrics.json index 6acd7b5289c9..ef15ba387e2f 100644 --- a/metrics/android-render-test-runner/render-tests/text-size/zero/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-size/zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/android-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-transform/lowercase/metrics.json b/metrics/android-render-test-runner/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/android-render-test-runner/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-transform/property-function/metrics.json b/metrics/android-render-test-runner/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/android-render-test-runner/render-tests/text-transform/property-function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-transform/uppercase/metrics.json b/metrics/android-render-test-runner/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/android-render-test-runner/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-translate-anchor/map/metrics.json b/metrics/android-render-test-runner/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/android-render-test-runner/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/android-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/android-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-translate/default/metrics.json b/metrics/android-render-test-runner/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-translate/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-translate/function/metrics.json b/metrics/android-render-test-runner/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-translate/function/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-translate/literal/metrics.json b/metrics/android-render-test-runner/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/android-render-test-runner/render-tests/text-translate/literal/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1a348fa3efe5..17a3110abc79 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 22295b952a86..e94f38d898df 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index c4efa5911f08..6db6f402c62f 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/android-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/android-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-visibility/none/metrics.json b/metrics/android-render-test-runner/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/android-render-test-runner/render-tests/text-visibility/none/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-visibility/visible/metrics.json b/metrics/android-render-test-runner/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/android-render-test-runner/render-tests/text-visibility/visible/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/android-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json b/metrics/android-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json index ec0fb1dab9e1..8159de630c8e 100644 --- a/metrics/android-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json +++ b/metrics/android-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/tilejson-bounds/default/metrics.json b/metrics/android-render-test-runner/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/android-render-test-runner/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/tilejson-bounds/overwrite-bounds/metrics.json b/metrics/android-render-test-runner/render-tests/tilejson-bounds/overwrite-bounds/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/android-render-test-runner/render-tests/tilejson-bounds/overwrite-bounds/metrics.json +++ b/metrics/android-render-test-runner/render-tests/tilejson-bounds/overwrite-bounds/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/tms/tms/metrics.json b/metrics/android-render-test-runner/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/android-render-test-runner/render-tests/tms/tms/metrics.json +++ b/metrics/android-render-test-runner/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/android-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/android-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/layout-text/metrics.json b/metrics/android-render-test-runner/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/android-render-test-runner/render-tests/within/layout-text/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/paint-circle/metrics.json b/metrics/android-render-test-runner/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/android-render-test-runner/render-tests/within/paint-circle/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/paint-icon/metrics.json b/metrics/android-render-test-runner/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/android-render-test-runner/render-tests/within/paint-icon/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/paint-line/metrics.json b/metrics/android-render-test-runner/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/android-render-test-runner/render-tests/within/paint-line/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/within/paint-text/metrics.json b/metrics/android-render-test-runner/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/android-render-test-runner/render-tests/within/paint-text/metrics.json +++ b/metrics/android-render-test-runner/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-history/in/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-history/in/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-history/in/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-history/out/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-history/out/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-history/out/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/above/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/below/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json index ed4871473576..2fd2e941a313 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json b/metrics/android-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/android-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoomed-fill/default/metrics.json b/metrics/android-render-test-runner/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/android-render-test-runner/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json b/metrics/android-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/android-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/android-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/android-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/android-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/android-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/android-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/android-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/android-arm64-v8a/metrics.json b/metrics/binary-size/android-arm64-v8a/metrics.json index 61b7bd537d3f..15000d16ce0c 100644 --- a/metrics/binary-size/android-arm64-v8a/metrics.json +++ b/metrics/binary-size/android-arm64-v8a/metrics.json @@ -6,4 +6,4 @@ 1878341 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/android-armeabi-v7a/metrics.json b/metrics/binary-size/android-armeabi-v7a/metrics.json index 01fcd3be41bf..d9e71155f785 100644 --- a/metrics/binary-size/android-armeabi-v7a/metrics.json +++ b/metrics/binary-size/android-armeabi-v7a/metrics.json @@ -6,4 +6,4 @@ 1575622 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/android-x86/metrics.json b/metrics/binary-size/android-x86/metrics.json index 7870fa3679bc..ad9e1099d897 100644 --- a/metrics/binary-size/android-x86/metrics.json +++ b/metrics/binary-size/android-x86/metrics.json @@ -6,4 +6,4 @@ 1918282 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/android-x86_64/metrics.json b/metrics/binary-size/android-x86_64/metrics.json index 28506c0c2197..65e05bcfc59a 100644 --- a/metrics/binary-size/android-x86_64/metrics.json +++ b/metrics/binary-size/android-x86_64/metrics.json @@ -6,4 +6,4 @@ 1914027 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/linux-clang8/metrics.json b/metrics/binary-size/linux-clang8/metrics.json index 3decd0b9e424..17043f90336c 100644 --- a/metrics/binary-size/linux-clang8/metrics.json +++ b/metrics/binary-size/linux-clang8/metrics.json @@ -16,4 +16,4 @@ 6679512 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/linux-gcc8/metrics.json b/metrics/binary-size/linux-gcc8/metrics.json index 8dba5175b029..cf04d54d42db 100644 --- a/metrics/binary-size/linux-gcc8/metrics.json +++ b/metrics/binary-size/linux-gcc8/metrics.json @@ -16,4 +16,4 @@ 7787024 ] ] -} \ No newline at end of file +} diff --git a/metrics/binary-size/macos-xcode11/metrics.json b/metrics/binary-size/macos-xcode11/metrics.json index 226f2c65696e..2c8f202a5e36 100644 --- a/metrics/binary-size/macos-xcode11/metrics.json +++ b/metrics/binary-size/macos-xcode11/metrics.json @@ -16,4 +16,4 @@ 5089824 ] ] -} \ No newline at end of file +} diff --git a/metrics/ignores/linux-drawable.json b/metrics/ignores/linux-drawable.json index 0634f7d272a7..d5afd0d8e9c0 100644 --- a/metrics/ignores/linux-drawable.json +++ b/metrics/ignores/linux-drawable.json @@ -1,3 +1,3 @@ { "render-tests/regressions/mapbox-gl-js#3426": "https://github.com/maplibre/maplibre-native/issues/1734" -} \ No newline at end of file +} diff --git a/metrics/ignores/linux-vulkan.json b/metrics/ignores/linux-vulkan.json index a0d601b4203f..89192bd904ba 100644 --- a/metrics/ignores/linux-vulkan.json +++ b/metrics/ignores/linux-vulkan.json @@ -2,4 +2,4 @@ "render-tests/fill-extrusion-color/function": "Layer Z Fighting: https://github.com/maplibre/maplibre-native/issues/1847", "render-tests/tilejson-bounds/default": "flaky on CI", "render-tests/icon-text-fit/textFit-grid-long": "Needs to be investigated" -} \ No newline at end of file +} diff --git a/metrics/ignores/platform-android-vulkan.json b/metrics/ignores/platform-android-vulkan.json index 419d6fb1b1c6..c230c1b91ebc 100644 --- a/metrics/ignores/platform-android-vulkan.json +++ b/metrics/ignores/platform-android-vulkan.json @@ -1,4 +1,4 @@ { "render-tests/fill-extrusion-color/function": "Layer Z Fighting: https://github.com/maplibre/maplibre-native/issues/1847", "render-tests/combinations/fill-opaque--image-translucent": "investigate" -} \ No newline at end of file +} diff --git a/metrics/integration/data/chinese.geojson b/metrics/integration/data/chinese.geojson index f1dd53bb31f0..21736d18a3c0 100644 --- a/metrics/integration/data/chinese.geojson +++ b/metrics/integration/data/chinese.geojson @@ -1 +1 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73270889049581,43.41627085800398]},"properties":{"name":"的一是不了"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76298169713937,43.44261374841698]},"properties":{"name":"在人有我他"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73750788686539,43.42129081598136]},"properties":{"name":"这个们中来"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68983653183295,43.36893537983959]},"properties":{"name":"上大为和国"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78480371728801,43.385713038402734]},"properties":{"name":"地到以说时"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82444442057749,43.3981364143174]},"properties":{"name":"要就出会可"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73178458119855,43.42150465372435]},"properties":{"name":"也你对生能"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81785610131647,43.36772142802819]},"properties":{"name":"而子那得于"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71407211903534,43.396000025590936]},"properties":{"name":"着下自之年"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79407351218833,43.41860722639433]},"properties":{"name":"过发后作里"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67633907003255,43.4171921149322]},"properties":{"name":"用道行所然"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77300637827193,43.39388127052078]},"properties":{"name":"家种事成方"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81926263607329,43.339585481875]},"properties":{"name":"多经么去法"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76701252093699,43.35773661014847]},"properties":{"name":"学如都同现"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7737515090821,43.44366259492489]},"properties":{"name":"当没动面起"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73829309937992,43.34378736524005]},"properties":{"name":"看定天分还"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71836466571312,43.33057012451926]},"properties":{"name":"进好小部其"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8115615374345,43.43176089412675]},"properties":{"name":"些主样理心"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72375031275442,43.427220939712534]},"properties":{"name":"她本前开但"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70314387005055,43.389688637563765]},"properties":{"name":"因只从想实"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76039207819576,43.36975807892726]},"properties":{"name":"日军者意无"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78682420394216,43.365202354108135]},"properties":{"name":"力它与长把"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78460575433382,43.430490774626286]},"properties":{"name":"机十民第公"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7823602114513,43.35546405309943]},"properties":{"name":"此已工使情"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69186049292512,43.422688902696564]},"properties":{"name":"明性知全三"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80768244315095,43.43381601437478]},"properties":{"name":"又关点正业"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72756567031774,43.400333914786785]},"properties":{"name":"外将两高间"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69534099799966,43.422190395818994]},"properties":{"name":"由问很最重"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83581194006001,43.41564978584469]},"properties":{"name":"并物手应战"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74950948614969,43.43062747741384]},"properties":{"name":"向头文体政"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72733267952117,43.39116317525604]},"properties":{"name":"美相见被利"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72085520401288,43.43205067390052]},"properties":{"name":"什二等产或"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74851416375623,43.44382863716304]},"properties":{"name":"新己制身果"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8394813306677,43.37578833067203]},"properties":{"name":"加西斯月话"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77187743426293,43.359984149537226]},"properties":{"name":"合回特代内"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69004478877105,43.32857475596884]},"properties":{"name":"信表化老给"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7543304983983,43.45029457922705]},"properties":{"name":"世位次度门"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74270392666222,43.436224623306195]},"properties":{"name":"任常先海通"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70207094875059,43.39809173301537]},"properties":{"name":"教儿原东声"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75571436014798,43.3468089398027]},"properties":{"name":"提立及比员"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8233978214821,43.42514681243842]},"properties":{"name":"解水名筱论"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68193517172404,43.43279789478497]},"properties":{"name":"处走义各入"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80028992255848,43.33690838162077]},"properties":{"name":"几口认条平"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71507317067244,43.401143748258455]},"properties":{"name":"系气题活尔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78889469900332,43.45182031313233]},"properties":{"name":"更别打女变"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6791223720029,43.38861188362641]},"properties":{"name":"四神总何电"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72988047792478,43.33359777731984]},"properties":{"name":"数安少报才"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76988704019641,43.365757148416336]},"properties":{"name":"结反受目太"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75657912670522,43.39062671107417]},"properties":{"name":"量再感建务"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71694934526477,43.376825304235226]},"properties":{"name":"做接必场件"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67458813089615,43.36108038884236]},"properties":{"name":"计管期市直"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73092396663014,43.451194179973356]},"properties":{"name":"德资命山金"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71805769966886,43.441661018342145]},"properties":{"name":"指克许统区"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81861278781616,43.426572973941695]},"properties":{"name":"保至队形社"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78874389125303,43.383000090716834]},"properties":{"name":"便空决治展"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77038527017976,43.357431603981965]},"properties":{"name":"马科司五基"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76028190008401,43.396620706760984]},"properties":{"name":"眼书非则听"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72120167890262,43.33581886107876]},"properties":{"name":"白却界达光"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83215351153285,43.42486709690492]},"properties":{"name":"放强即像难"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74438919600198,43.33050804734877]},"properties":{"name":"且权思王象"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78421479421195,43.40712629232671]},"properties":{"name":"完设式色路"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7497489802472,43.33114312974759]},"properties":{"name":"记南品住告"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66478914990057,43.38347958366816]},"properties":{"name":"类求据程北"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79279423940079,43.444583002746775]},"properties":{"name":"边死张该交"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76906741636776,43.419984311312625]},"properties":{"name":"规万取拉格"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75612128325247,43.37612751347973]},"properties":{"name":"望觉术领共"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77176654843697,43.43095760221496]},"properties":{"name":"确传师观清"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77393503776875,43.373380874335005]},"properties":{"name":"今切院让识"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71310318142423,43.43803340638478]},"properties":{"name":"候带导争运"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81563594692398,43.346211434247635]},"properties":{"name":"笑飞风步改"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69670553324158,43.4029553787535]},"properties":{"name":"收根干造言"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68140692646466,43.45196741095145]},"properties":{"name":"联持组每济"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71393977312255,43.352840358239604]},"properties":{"name":"车亲极林服"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77520183044271,43.370446718107615]},"properties":{"name":"快办议往元"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7705171135467,43.42031530315453]},"properties":{"name":"英士证近失"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79700244767992,43.370796588876516]},"properties":{"name":"转夫令准布"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68495501730467,43.44587605391778]},"properties":{"name":"始怎呢存未"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66875438862098,43.428265013064504]},"properties":{"name":"远叫台单影"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78255633374283,43.344190485138526]},"properties":{"name":"具罗字爱击"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73950662616426,43.39914435521945]},"properties":{"name":"流备兵连调"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66711705844682,43.42765258781692]},"properties":{"name":"深商算质团"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67424805301926,43.367364311972324]},"properties":{"name":"集百需价花"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73542075892419,43.405725847481825]},"properties":{"name":"党华城石级"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83006410836333,43.35664000828751]},"properties":{"name":"整府离况亚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72345388556187,43.34752030391647]},"properties":{"name":"请技际约示"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74116502544712,43.39729245583676]},"properties":{"name":"复病息究线"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73088213630854,43.349605386889884]},"properties":{"name":"似官火断精"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67745194820873,43.41123711240646]},"properties":{"name":"满支视消越"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6817792850643,43.42344437828406]},"properties":{"name":"器容照须九"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67395214801763,43.39977158479005]},"properties":{"name":"增研写称企"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72161818475706,43.382293003810005]},"properties":{"name":"八功吗包片"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72855664275721,43.41261360254286]},"properties":{"name":"史委乎查轻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83086291556356,43.36050725709127]},"properties":{"name":"易早曾除农"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75354201321716,43.4442740937665]},"properties":{"name":"找装广显吧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7131699827778,43.345394151190725]},"properties":{"name":"阿李标谈吃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7649695364853,43.44088050766551]},"properties":{"name":"图念六引历"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71225333661914,43.35591317841684]},"properties":{"name":"首医局突专"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79971900833698,43.392362357661604]},"properties":{"name":"费号尽另周"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70626144043672,43.42036951093048]},"properties":{"name":"较注语仅考"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7040667445608,43.433803705173396]},"properties":{"name":"落青随选列"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.813440070051,43.385923123380685]},"properties":{"name":"武红响虽推"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7070736167725,43.37259236901997]},"properties":{"name":"势参希古众"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76888123702702,43.39800691496971]},"properties":{"name":"构房半节土"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74421053508104,43.34325732766496]},"properties":{"name":"投某案黑维"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69038090599406,43.366814529767844]},"properties":{"name":"革划敌致陈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66650853289048,43.34867037886478]},"properties":{"name":"律足态护七"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66952516027868,43.40685068681997]},"properties":{"name":"兴派孩验责"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68151887308431,43.3821590323556]},"properties":{"name":"营星够章音"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71453679914157,43.41655508237566]},"properties":{"name":"跟志底站严"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7286383345945,43.389659720807465]},"properties":{"name":"巴例防族供"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78968425737912,43.42832250510841]},"properties":{"name":"效续施留讲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77126855272127,43.432091911546834]},"properties":{"name":"型料终答紧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80150644673267,43.384293717872744]},"properties":{"name":"黄绝奇察母"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70325368034901,43.342142138944126]},"properties":{"name":"京段依批群"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74350685450099,43.33815688393118]},"properties":{"name":"项故按河米"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68640694219539,43.32988121926636]},"properties":{"name":"围江织害斗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82314765576484,43.36757657335591]},"properties":{"name":"双境客纪采"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77855847885985,43.44537272495857]},"properties":{"name":"举杀攻父苏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69097776744456,43.38523317400271]},"properties":{"name":"密低朝友诉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7421211758674,43.3800236955169]},"properties":{"name":"止细愿千值"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7755043980751,43.36667122483581]},"properties":{"name":"仍男钱破网"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75295729292066,43.44281164137731]},"properties":{"name":"热助倒育属"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77224286592354,43.3253127146371]},"properties":{"name":"坐帝限船脸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8242325149331,43.347561311210455]},"properties":{"name":"职速刻乐否"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80801165451248,43.43367913152873]},"properties":{"name":"刚威毛状率"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77302849618263,43.372749462523885]},"properties":{"name":"甚独球般普"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73703546176603,43.328032643768076]},"properties":{"name":"怕弹校苦创"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67624744048317,43.344889116256184]},"properties":{"name":"伟久错承印"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79964252293848,43.38656670136357]},"properties":{"name":"晚兰试股拿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74049655553154,43.344659220383505]},"properties":{"name":"脑预谁益阳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72304384605104,43.35607154684429]},"properties":{"name":"若哪微尼继"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7526981722367,43.39981729891517]},"properties":{"name":"送急血惊伤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68568625772969,43.34763712888965]},"properties":{"name":"素药适波夜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81743986333095,43.429533375195334]},"properties":{"name":"省初喜卫源"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80579718643094,43.35988688107485]},"properties":{"name":"食险待述陆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83223099273255,43.43425284429113]},"properties":{"name":"习置居劳财"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80006585484625,43.35132639892201]},"properties":{"name":"环排福纳欢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70924590877894,43.383011511165705]},"properties":{"name":"雷警获模充"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68249560431013,43.35743306628053]},"properties":{"name":"负云停木游"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68774304395902,43.33419609182944]},"properties":{"name":"龙树疑层冷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67733078337824,43.327826458540464]},"properties":{"name":"洲冲射略范"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68834955622151,43.431281245921824]},"properties":{"name":"竟句室异激"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8091257333308,43.43459785012007]},"properties":{"name":"汉村哈策演"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67144809840102,43.397513621281995]},"properties":{"name":"简卡罪判担"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82363606504714,43.37710068801484]},"properties":{"name":"州静退既衣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74061761816665,43.4212255093278]},"properties":{"name":"您宗积余痛"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7045488688891,43.36750358756782]},"properties":{"name":"检差富灵协"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82580595102172,43.42392475722188]},"properties":{"name":"角占配征修"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77008645152546,43.34480018782685]},"properties":{"name":"皮挥胜降阶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71651166319498,43.34427801604752]},"properties":{"name":"审沉坚善妈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83028376706352,43.39600333853026]},"properties":{"name":"刘读啊超免"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72932534685151,43.32911672353392]},"properties":{"name":"压银买皇养"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68036932940231,43.36393499520703]},"properties":{"name":"伊怀执副乱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77298183161474,43.44003908109747]},"properties":{"name":"抗犯追帮宣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81552785528402,43.34735681961522]},"properties":{"name":"佛岁航优怪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78578499835658,43.41906317070564]},"properties":{"name":"香著田铁控"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78354709597988,43.368113417254776]},"properties":{"name":"税左右份穿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82797590542668,43.35143064769927]},"properties":{"name":"艺背阵草脚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79055192707074,43.43537476712199]},"properties":{"name":"概恶块顿敢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70654512079273,43.41147087462913]},"properties":{"name":"守酒岛托央"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68733618863007,43.41836228588271]},"properties":{"name":"户烈洋哥索"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7154416231333,43.33529886942282]},"properties":{"name":"胡款靠评版"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73493527274877,43.370844496181796]},"properties":{"name":"宝座释景顾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73770378945937,43.39088303970504]},"properties":{"name":"弟登货互付"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83211159305392,43.32846502905939]},"properties":{"name":"伯慢欧换闻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68908894596007,43.44014380512324]},"properties":{"name":"危忙核暗姐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6902922126892,43.403538514368456]},"properties":{"name":"介坏讨丽良"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76141611184084,43.36152240176037]},"properties":{"name":"序升监临亮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67547588081197,43.34877423379756]},"properties":{"name":"露永呼味野"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74561868818364,43.40177322844116]},"properties":{"name":"架域沙掉括"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82147468187486,43.345501872146336]},"properties":{"name":"舰鱼杂误湾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72331018618115,43.41869149001808]},"properties":{"name":"吉减编楚肯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81418024432423,43.39045046575978]},"properties":{"name":"测败屋跑梦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69068592136318,43.3685438560169]},"properties":{"name":"散温困剑渐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83747349864097,43.32783583160479]},"properties":{"name":"封救贵枪缺"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66638697581311,43.38651479270904]},"properties":{"name":"楼县尚毫移"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73073327718703,43.39856744262681]},"properties":{"name":"娘朋画班智"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74104845728016,43.38961856762863]},"properties":{"name":"亦耳恩短掌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7539775992791,43.37962584070818]},"properties":{"name":"恐遗固席松"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67308167308965,43.440433177549636]},"properties":{"name":"秘谢鲁遇康"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68724650885542,43.3438023389739]},"properties":{"name":"虑幸均销钟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6690021588247,43.3604969931925]},"properties":{"name":"诗藏赶剧票"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77503168804014,43.415001819151854]},"properties":{"name":"损忽巨炮旧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79229079700326,43.41771721089227]},"properties":{"name":"端探湖录叶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75545867980964,43.404726107598385]},"properties":{"name":"春乡附吸予"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68343503303822,43.32628692794371]},"properties":{"name":"礼港雨呀板"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7017168198081,43.408124296254805]},"properties":{"name":"庭妇归睛饭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75177113079917,43.40327950333013]},"properties":{"name":"额含顺输摇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70633448491662,43.33353916165031]},"properties":{"name":"招婚脱补谓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80796698838185,43.38855809467828]},"properties":{"name":"督毒油疗旅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71316371386729,43.40035203701606]},"properties":{"name":"泽材灭逐莫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73512074699465,43.39091219011503]},"properties":{"name":"笔亡鲜词圣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8091237096005,43.33089437793854]},"properties":{"name":"择寻厂睡博"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71888919977027,43.37203728663009]},"properties":{"name":"勒烟授诺伦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6680803788322,43.4500067687054]},"properties":{"name":"岸奥唐卖俄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66925720953805,43.372341602453425]},"properties":{"name":"炸载洛健堂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66882286164855,43.423630694619916]},"properties":{"name":"旁宫喝借君"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77390029854541,43.445009580661186]},"properties":{"name":"禁阴园谋宋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71985438791216,43.398099248509034]},"properties":{"name":"避抓荣姑孙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74294883903804,43.4173240632121]},"properties":{"name":"逃牙束跳顶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66689798156858,43.34124127734229]},"properties":{"name":"玉镇雪午练"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75171381658947,43.39159204675984]},"properties":{"name":"迫爷篇肉嘴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81096888891352,43.42308178495851]},"properties":{"name":"馆遍凡础洞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73965294263871,43.40406594519991]},"properties":{"name":"卷坦牛宁纸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72554678621145,43.37774074563721]},"properties":{"name":"诸训私庄祖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67178856070768,43.389572230853304]},"properties":{"name":"丝翻暴森塔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66509793278783,43.41061135866706]},"properties":{"name":"默握戏隐熟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73326538252331,43.44230808801419]},"properties":{"name":"骨访弱蒙歌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.763294657595,43.42569076002226]},"properties":{"name":"店鬼软典欲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70805275051043,43.33022223454242]},"properties":{"name":"萨伙遭盘爸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80356155228401,43.35448684283324]},"properties":{"name":"扩盖弄雄稳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71671550436804,43.358590543375485]},"properties":{"name":"忘亿刺拥徒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79930692168546,43.44009080139547]},"properties":{"name":"姆杨齐赛趣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79587187411107,43.353732548898144]},"properties":{"name":"曲刀床迎冰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79719578990535,43.37696041213408]},"properties":{"name":"虚玩析窗醒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69965497394605,43.36639187084689]},"properties":{"name":"妻透购替塞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7921343910175,43.39881694771324]},"properties":{"name":"努休虎扬途"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72017632396182,43.38361317683319]},"properties":{"name":"侵刑绿兄迅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68359785932444,43.34831766076865]},"properties":{"name":"套贸毕唯谷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81414767105343,43.40958963502256]},"properties":{"name":"轮库迹尤竞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80253128177446,43.36605742276838]},"properties":{"name":"街促延震弃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70089574338908,43.44275792279891]},"properties":{"name":"甲伟麻川申"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83317739247832,43.442243183384164]},"properties":{"name":"缓潜闪售灯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67721696102126,43.42843016937564]},"properties":{"name":"针哲络抵朱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71723432403815,43.36649527257002]},"properties":{"name":"埃抱鼓植纯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69481568423726,43.40301142667125]},"properties":{"name":"夏忍页杰筑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68468959578695,43.35720648266311]},"properties":{"name":"折郑贝尊吴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72149391956373,43.361699359813706]},"properties":{"name":"秀混臣雅振"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70660354920619,43.38448871648363]},"properties":{"name":"染盛怒舞圆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76299651747377,43.35074913433199]},"properties":{"name":"搞狂措姓残"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77539316698676,43.39435306815789]},"properties":{"name":"秋培迷诚宽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71830531729574,43.35119394975593]},"properties":{"name":"宇猛摆梅毁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81118685367528,43.37563814779732]},"properties":{"name":"伸摩盟末乃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79642660311492,43.377657505705734]},"properties":{"name":"悲拍丁赵硬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7888253988358,43.337163828964385]},"properties":{"name":"麦蒋操耶阻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70485407817159,43.42571907384735]},"properties":{"name":"订彩抽赞魔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66969568481909,43.35045513475347]},"properties":{"name":"纷沿喊违妹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66930716449406,43.44367042306718]},"properties":{"name":"浪汇币丰蓝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69189873670894,43.43076512052666]},"properties":{"name":"殊献桌啦瓦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79353235204508,43.37368059280777]},"properties":{"name":"莱援译夺汽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70219104390617,43.33231431216638]},"properties":{"name":"烧距裁偏符"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76689379197433,43.36916089976166]},"properties":{"name":"勇触课敬哭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82121823517355,43.3890494143254]},"properties":{"name":"懂墙袭召罚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83471876958811,43.40298009860645]},"properties":{"name":"侠厅拜巧侧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79381721196569,43.43790173544968]},"properties":{"name":"韩冒债曼融"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78649372015207,43.36341720491033]},"properties":{"name":"惯享戴童犹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78560735030351,43.44361961433385]},"properties":{"name":"乘挂奖绍厚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75079314695358,43.33861416363164]},"properties":{"name":"纵障讯涉彻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74953762736641,43.40607632034917]},"properties":{"name":"刊丈爆乌役"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74238703575702,43.35555088566464]},"properties":{"name":"描洗玛患妙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83816796506198,43.41942390467601]},"properties":{"name":"镜唱烦签仙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81616133746593,43.350962266236195]},"properties":{"name":"彼弗症仿倾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79219311701308,43.387858965559424]},"properties":{"name":"牌陷鸟轰咱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66780267369268,43.36965922024568]},"properties":{"name":"菜闭奋庆撤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76678459362029,43.41517258008821]},"properties":{"name":"泪茶疾缘播"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80142993141635,43.341730907669636]},"properties":{"name":"朗杜奶季丹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77921260855874,43.421873232284376]},"properties":{"name":"狗尾仪偷奔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83144706066832,43.36621272347986]},"properties":{"name":"珠虫驻孔宜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70722008394114,43.35038684779588]},"properties":{"name":"艾桥淡翼恨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79020734973255,43.33479279298051]},"properties":{"name":"繁寒伴叹旦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67291568124347,43.43540548255966]},"properties":{"name":"愈潮粮缩罢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82768299138934,43.36836454991645]},"properties":{"name":"聚径恰挑袋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75399246803045,43.418397519140655]},"properties":{"name":"灰捕徐珍幕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74220063622761,43.35676855353936]},"properties":{"name":"映裂泰隔启"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67156749173591,43.32753321179319]},"properties":{"name":"尖忠累炎暂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7337656762229,43.362393286271406]},"properties":{"name":"估泛荒偿横"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72030044521398,43.382476256772236]},"properties":{"name":"拒瑞忆孤鼻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7526464325656,43.436104808005915]},"properties":{"name":"闹羊呆厉衡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71485882023808,43.429619924972954]},"properties":{"name":"胞零穷舍码"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75909970307748,43.330400132266675]},"properties":{"name":"赫婆魂灾洪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81135682893091,43.42006743640997]},"properties":{"name":"腿胆津俗辩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67022303291196,43.35877085029656]},"properties":{"name":"胸晓劲贫仁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73190488058117,43.36210649884719]},"properties":{"name":"偶辑邦恢赖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79749258159609,43.43829648566227]},"properties":{"name":"圈摸仰润堆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81412739294592,43.42486673759098]},"properties":{"name":"碰艇稍迟辆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73942862821696,43.41857560346666]},"properties":{"name":"废净凶署壁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73194496367705,43.36236970705654]},"properties":{"name":"御奉旋冬矿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77277965716348,43.42795996100599]},"properties":{"name":"抬蛋晨伏吹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79677774850097,43.386918730187254]},"properties":{"name":"鸡倍糊秦盾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7755677565865,43.41930911043181]},"properties":{"name":"杯租骑乏隆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83969235862696,43.40300089042435]},"properties":{"name":"诊奴摄丧污"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79056823232804,43.36644340374012]},"properties":{"name":"渡旗甘耐凭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79024794978068,43.450759361929514]},"properties":{"name":"扎抢绪粗肩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7960531583467,43.42912547125532]},"properties":{"name":"梁幻菲皆碎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71188677769896,43.40578991754939]},"properties":{"name":"宙叔岩荡综"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80973210979664,43.405074830026]},"properties":{"name":"爬荷悉蒂返"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83094842280389,43.383506992650275]},"properties":{"name":"井壮薄悄扫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68880786616319,43.4408736919135]},"properties":{"name":"敏碍殖详迪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83637982623713,43.37932687230065]},"properties":{"name":"矛霍允幅撒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7120551129583,43.38478419358865]},"properties":{"name":"剩凯颗骂赏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79655496709165,43.353914671185876]},"properties":{"name":"液番箱贴漫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82183396335495,43.34951148058995]},"properties":{"name":"酸郎腰舒眉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7386077853289,43.42153859100138]},"properties":{"name":"忧浮辛恋餐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70073597694773,43.3950412068982]},"properties":{"name":"吓挺励辞艘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67738562238901,43.37299568230138]},"properties":{"name":"键伍峰尺昨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76967766127837,43.43523403455177]},"properties":{"name":"黎辈贯侦滑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66711217868942,43.34498516856536]},"properties":{"name":"券崇扰宪绕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71263407544393,43.44878125927471]},"properties":{"name":"趋慈乔阅汗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81736193811139,43.3268554930083]},"properties":{"name":"枝拖墨胁插"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72823672941468,43.39913772571227]},"properties":{"name":"箭腊粉泥氏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80909585278732,43.42911070681641]},"properties":{"name":"彭拔骗凤慧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75079532407926,43.42721943663759]},"properties":{"name":"媒佩愤扑龄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71058457033814,43.367755763373076]},"properties":{"name":"驱惜豪掩兼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69298119807172,43.42626514840551]},"properties":{"name":"跃尸肃帕驶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83650346598006,43.41933636859189]},"properties":{"name":"堡届欣惠册"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7067569578021,43.4410164115811]},"properties":{"name":"储飘桑闲惨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8266463758855,43.429931233602844]},"properties":{"name":"洁踪勃宾频"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78659303223958,43.338321981323276]},"properties":{"name":"仇磨递邪撞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80639026067729,43.36026255177993]},"properties":{"name":"拟滚奏巡颜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68785430058597,43.391834351083176]},"properties":{"name":"剂绩贡疯坡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77329479710443,43.331029684633386]},"properties":{"name":"瞧截燃焦殿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83944140776111,43.36094548943541]},"properties":{"name":"伪柳锁逼颇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77328811212737,43.39281904629793]},"properties":{"name":"昏劝呈搜勤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80847732751408,43.37011711911654]},"properties":{"name":"戒驾漂饮曹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69083308544123,43.34616816533698]},"properties":{"name":"朵仔柔俩孟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71997028929218,43.39262356330771]},"properties":{"name":"腐幼践籍牧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70795456797441,43.43662706130826]},"properties":{"name":"凉牲佳娜浓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74983541518577,43.36433290673387]},"properties":{"name":"芳稿竹腹跌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72199664814889,43.399196067397874]},"properties":{"name":"逻垂遵脉貌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76282152809654,43.33979211362029]},"properties":{"name":"柏狱猜怜惑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72295717357065,43.32965718674516]},"properties":{"name":"陶兽帐饰贷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76962927584191,43.417191219398504]},"properties":{"name":"昌叙躺钢沟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79867291448863,43.44693460246704]},"properties":{"name":"寄扶铺邓寿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80762496150783,43.447198828628444]},"properties":{"name":"惧询汤盗肥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73700170958546,43.42215816219742]},"properties":{"name":"尝匆辉奈扣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79048870955376,43.368949995240996]},"properties":{"name":"廷澳嘛董迁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8255365161358,43.39707569876099]},"properties":{"name":"凝慰厌脏腾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67286163429799,43.38896639656718]},"properties":{"name":"幽怨鞋丢埋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76401826500387,43.37508033645364]},"properties":{"name":"泉涌辖躲晋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77611649584469,43.400255751529066]},"properties":{"name":"紫艰魏吾慌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70951490545667,43.33112009433672]},"properties":{"name":"祝邮吐狠鉴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7066983545883,43.42345908175173]},"properties":{"name":"曰械咬邻赤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82127073113952,43.339820786610595]},"properties":{"name":"挤弯椅陪割"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71675786236483,43.43096503945724]},"properties":{"name":"揭韦悟聪雾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78950346431157,43.40237228555073]},"properties":{"name":"锋梯猫祥阔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75258281784954,43.390836247816566]},"properties":{"name":"誉筹丛牵鸣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76638218213247,43.32741343188597]},"properties":{"name":"沈阁穆屈旨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72154484965267,43.45222086361347]},"properties":{"name":"袖猎臂蛇贺"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76627772335996,43.437491216616706]},"properties":{"name":"柱抛鼠瑟戈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73925198284087,43.44218709248913]},"properties":{"name":"牢逊迈欺吨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77499563521542,43.418523278482645]},"properties":{"name":"琴衰瓶恼燕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8169860967655,43.384473967748534]},"properties":{"name":"仲诱狼池疼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78032431371867,43.446660440194194]},"properties":{"name":"卢仗冠粒遥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71753936465939,43.45285380044917]},"properties":{"name":"吕玄尘冯抚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69263196333395,43.419665985695886]},"properties":{"name":"浅敦纠钻晶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70765474537438,43.42017682128563]},"properties":{"name":"岂峡苍喷耗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69765841770732,43.33820610443803]},"properties":{"name":"凌敲菌赔涂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82267605236211,43.42357169093535]},"properties":{"name":"粹扁亏寂煤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73336307802492,43.42297002833131]},"properties":{"name":"熊恭湿循暖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83811908518328,43.33925460912034]},"properties":{"name":"糖赋抑秩帽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73171881207145,43.354563903522724]},"properties":{"name":"哀宿踏烂袁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6961362492757,43.35411874665983]},"properties":{"name":"侯抖夹昆肝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68661836305637,43.36823198552959]},"properties":{"name":"擦猪炼恒慎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83961700277996,43.3510427803368]},"properties":{"name":"搬纽纹玻渔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74947187088583,43.39389891860199]},"properties":{"name":"磁铜齿跨押"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72910695071641,43.36486528376062]},"properties":{"name":"怖漠疲叛遣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69754557797296,43.39387045930845]},"properties":{"name":"兹祭醉拳弥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73710033565021,43.384584096889725]},"properties":{"name":"斜档稀捷肤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68689162255396,43.36871487059363]},"properties":{"name":"疫肿豆削岗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7994804315831,43.33013942649552]},"properties":{"name":"晃吞宏癌肚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7988314518434,43.39336940273254]},"properties":{"name":"隶履涨耀扭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71307712205453,43.41174462631271]},"properties":{"name":"坛拨沃绘伐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72580987651236,43.38478891558823]},"properties":{"name":"堪仆郭牺歼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7036186715095,43.41690955477799]},"properties":{"name":"墓雇廉契拼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76149458704094,43.367965367570484]},"properties":{"name":"惩捉覆刷劫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8058814547212,43.403167911414506]},"properties":{"name":"嫌瓜歇雕闷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71361559233537,43.376334729032095]},"properties":{"name":"乳串娃缴唤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73154162252649,43.38490610787597]},"properties":{"name":"赢莲霸桃妥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79186204272446,43.376665125080876]},"properties":{"name":"瘦搭赴岳嘉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6661296359971,43.452468442692734]},"properties":{"name":"舱俊址庞耕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7616259928136,43.44408598398389]},"properties":{"name":"锐缝悔邀玲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78766358344183,43.37143374956189]},"properties":{"name":"惟斥宅添挖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68890499690951,43.44979275747692]},"properties":{"name":"呵讼氧浩羽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67281208362147,43.3973497257669]},"properties":{"name":"斤酷掠妖祸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71588028401948,43.442055130438646]},"properties":{"name":"侍乙妨贪挣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71721666322901,43.32562249083662]},"properties":{"name":"汪尿莉悬唇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67841066689653,43.34185192725603]},"properties":{"name":"翰仓轨枚盐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73531620540507,43.36415708253743]},"properties":{"name":"览傅帅庙芬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72425220806053,43.351560221312894]},"properties":{"name":"屏寺胖璃愚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68594161715737,43.409583613235085]},"properties":{"name":"滴疏萧姿颤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73655883818446,43.33441638119229]},"properties":{"name":"丑劣柯寸扔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6752721298426,43.32966752267923]},"properties":{"name":"盯辱匹俱辨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6904923700813,43.327341256271836]},"properties":{"name":"饿蜂哦腔郁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78054278610125,43.394614279098086]},"properties":{"name":"溃谨糟葛苗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74335729998438,43.40451717893259]},"properties":{"name":"肠忌溜鸿爵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7569937171229,43.44689633183004]},"properties":{"name":"鹏鹰笼丘桂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8360965058364,43.40171500153021]},"properties":{"name":"滋聊挡纲肌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71513986618811,43.43457019529001]},"properties":{"name":"茨壳痕碗穴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7952919780746,43.44165282752506]},"properties":{"name":"膀卓贤卧膜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68173948092863,43.44800154193802]},"properties":{"name":"毅锦欠哩函"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81701665551464,43.389228319829925]},"properties":{"name":"茫昂薛皱夸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77895341666135,43.394861202037575]},"properties":{"name":"豫胃舌剥傲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75351540071551,43.4219368264491]},"properties":{"name":"拾窝睁携陵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81052088748493,43.424322611524985]},"properties":{"name":"哼棉晴铃填"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69578376327627,43.37844309252077]},"properties":{"name":"饲渴吻扮逆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78368098309056,43.388133327996385]},"properties":{"name":"脆喘罩卜炉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70213684589817,43.400458123228596]},"properties":{"name":"柴愉绳胎蓄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75735508441994,43.33521557571769]},"properties":{"name":"眠竭喂傻慕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7165813035499,43.449836563440115]},"properties":{"name":"浑奸扇柜悦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67118947948529,43.32648454903178]},"properties":{"name":"拦诞饱乾泡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73583864324974,43.40494189377406]},"properties":{"name":"贼亭夕爹酬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7592708719767,43.37376037403405]},"properties":{"name":"儒姻卵氛泄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81937170824858,43.42605432516992]},"properties":{"name":"杆挨僧蜜吟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82074352007112,43.36580652869758]},"properties":{"name":"猩遂狭肖甜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7436711727496,43.372504265635634]},"properties":{"name":"霞驳裕顽於"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67000504535372,43.38201541721379]},"properties":{"name":"摘矮秒卿畜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77440106794256,43.37650136295896]},"properties":{"name":"咽披辅勾盆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68061636193306,43.33728440664312]},"properties":{"name":"疆赌塑畏吵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66503257911336,43.38062935022041]},"properties":{"name":"囊嗯泊肺骤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70403178494416,43.36877483548238]},"properties":{"name":"缠冈羞瞪吊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75963805364609,43.40329643349728]},"properties":{"name":"贾漏斑涛悠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67318084901217,43.42404258860719]},"properties":{"name":"鹿俘锡卑葬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7664044443527,43.43862549454096]},"properties":{"name":"铭滩嫁催璇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76699292336798,43.37550577167776]},"properties":{"name":"翅盒蛮矣潘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73291945020628,43.3674976351091]},"properties":{"name":"歧赐鲍锅廊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80291150700305,43.3459863032626]},"properties":{"name":"拆灌勉盲宰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67799156621277,43.336989953022176]},"properties":{"name":"佐啥胀扯禧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75967314468016,43.44864855947221]},"properties":{"name":"辽抹筒棋裤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77895542262922,43.37606635807544]},"properties":{"name":"唉朴咐孕誓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74354294751629,43.401586326632675]},"properties":{"name":"喉妄拘链驰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71739241962405,43.32949392714524]},"properties":{"name":"栏逝窃艳臭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78738846011674,43.347806614069704]},"properties":{"name":"纤玑棵趁匠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68105058004221,43.384474385118985]},"properties":{"name":"盈翁愁瞬婴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74292700712704,43.43924277428903]},"properties":{"name":"孝颈倘浙谅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72330992960815,43.44448236676838]},"properties":{"name":"蔽畅赠妮莎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80374649087389,43.423236258780996]},"properties":{"name":"尉冻跪闯葡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7843960910941,43.37735348316894]},"properties":{"name":"後厨鸭颠遮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77111562727168,43.377397868656345]},"properties":{"name":"谊圳吁仑辟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75822663806775,43.403893701294244]},"properties":{"name":"瘤嫂陀框谭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76760909818859,43.365752206325446]},"properties":{"name":"亨钦庸歉芝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67688920728415,43.35171094097246]},"properties":{"name":"吼甫衫摊宴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81636243364756,43.37912531315445]},"properties":{"name":"嘱衷娇陕矩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76577508596074,43.34670065336113]},"properties":{"name":"浦讶耸裸碧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6734781883506,43.339763982233066]},"properties":{"name":"摧薪淋耻胶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67229678701096,43.37951866037416]},"properties":{"name":"屠鹅饥盼脖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67370422785643,43.33477495020771]},"properties":{"name":"虹翠崩账萍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72454219260635,43.38020083184419]},"properties":{"name":"逢赚撑翔倡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8127777939444,43.33011026808491]},"properties":{"name":"绵猴枯巫昭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82476845378096,43.345917052691725]},"properties":{"name":"怔渊凑溪蠢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79458199273176,43.37007854115475]},"properties":{"name":"禅阐旺寓藤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77530815590762,43.3745956095525]},"properties":{"name":"匪伞碑挪琼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81943466645043,43.38442804867082]},"properties":{"name":"脂谎慨菩萄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7111729135977,43.41659485703934]},"properties":{"name":"狮掘抄岭晕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81519536270207,43.35551688679179]},"properties":{"name":"逮砍掏狄晰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80141816757077,43.373296346452975]},"properties":{"name":"罕挽脾舟痴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73913970139529,43.36766474919193]},"properties":{"name":"蔡剪脊弓懒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68861229532558,43.447177904904464]},"properties":{"name":"叉拐喃僚捐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70887924537146,43.36989440125427]},"properties":{"name":"姊骚拓歪粘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72727783404389,43.43862238253905]},"properties":{"name":"柄坑陌窄湘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80459063938179,43.337120260313164]},"properties":{"name":"兆崖骄刹鞭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76679035695634,43.335932458145194]},"properties":{"name":"芒筋聘钩棍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6765199485153,43.33916485424814]},"properties":{"name":"嚷腺弦焰耍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80245708208167,43.40137212585799]},"properties":{"name":"俯厘愣厦恳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77978667389289,43.32653195985271]},"properties":{"name":"饶钉寡憾摔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83554141642708,43.36208645578587]},"properties":{"name":"叠惹喻谱愧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78226428764992,43.45214674512842]},"properties":{"name":"煌徽溶坠煞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68707804799033,43.389474442588785]},"properties":{"name":"巾滥洒堵瓷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80216082023526,43.35618116364861]},"properties":{"name":"咒姨棒郡浴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70300949696957,43.338949270378016]},"properties":{"name":"媚稣淮哎屁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68015060855032,43.40296808063941]},"properties":{"name":"漆淫巢吩撰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68989328476619,43.39232508258088]},"properties":{"name":"啸滞玫硕钓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71598403078042,43.38262581866229]},"properties":{"name":"蝶膝姚茂躯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71912615539532,43.452016174114505]},"properties":{"name":"吏猿寨恕渠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74577920821866,43.36541829164119]},"properties":{"name":"戚辰舶颁惶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72712613526619,43.39671896203547]},"properties":{"name":"狐讽笨袍嘲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70664604422745,43.34278992771991]},"properties":{"name":"啡泼衔倦涵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68493815003421,43.39354964761166]},"properties":{"name":"雀旬僵撕肢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75455462754235,43.36155500394566]},"properties":{"name":"垄夷逸茅侨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77873016450667,43.366122899933224]},"properties":{"name":"舆窑涅蒲谦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80791232048796,43.33394744370124]},"properties":{"name":"杭噢弊勋刮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6997965679875,43.40806371864969]},"properties":{"name":"郊凄捧浸砖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66838019631632,43.35606605074788]},"properties":{"name":"鼎篮蒸饼亩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7069571753982,43.34266177851345]},"properties":{"name":"肾陡爪兔殷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71273809195645,43.35495186858789]},"properties":{"name":"贞荐哑炭坟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73519729235159,43.4163297000404]},"properties":{"name":"眨搏咳拢舅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71910739744908,43.45181104214278]},"properties":{"name":"昧擅爽咖搁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72594206510075,43.33440744203501]},"properties":{"name":"禄雌哨巩绢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69001132062567,43.36003830098169]},"properties":{"name":"螺裹昔轩谬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76804370175068,43.37362703079163]},"properties":{"name":"谍龟媳姜瞎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77043742133355,43.325828830544545]},"properties":{"name":"冤鸦蓬巷琳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66452596219278,43.377082454312294]},"properties":{"name":"栽沾诈斋瞒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78052164197288,43.39882235229331]},"properties":{"name":"彪厄咨纺罐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74768201610368,43.34347333416988]},"properties":{"name":"桶壤糕颂膨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77257029502562,43.353659062164375]},"properties":{"name":"谐垒咕隙辣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82229997433387,43.36602478810474]},"properties":{"name":"绑宠嘿兑霉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77697418935259,43.39302377957722]},"properties":{"name":"挫稽辐乞纱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82932283412902,43.344460090153106]},"properties":{"name":"裙嘻哇绣杖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75834764860247,43.43886099129135]},"properties":{"name":"塘衍轴攀膊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71397262576284,43.43847474002368]},"properties":{"name":"譬斌祈踢肆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78490097957456,43.41708495277058]},"properties":{"name":"坎轿棚泣屡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82596603943784,43.37280499147228]},"properties":{"name":"躁邱凰溢椎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80376452461223,43.41299359444341]},"properties":{"name":"砸趟帘帆栖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73771479115749,43.38964563062126]},"properties":{"name":"窜丸斩堤塌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77914081236031,43.36200438697811]},"properties":{"name":"贩厢掀喀乖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6885010122187,43.3536150480067]},"properties":{"name":"谜捏阎滨虏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6809883295955,43.4279302964151]},"properties":{"name":"匙芦苹卸沼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66638088219406,43.356600228775875]},"properties":{"name":"钥株祷剖熙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81508020435649,43.44503598067335]},"properties":{"name":"哗劈怯棠胳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80562566482058,43.441746093418764]},"properties":{"name":"桩瑰娱娶沫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69680728921867,43.37119072206014]},"properties":{"name":"嗓蹲焚淘嫩"}}]} \ No newline at end of file +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73270889049581,43.41627085800398]},"properties":{"name":"的一是不了"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76298169713937,43.44261374841698]},"properties":{"name":"在人有我他"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73750788686539,43.42129081598136]},"properties":{"name":"这个们中来"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68983653183295,43.36893537983959]},"properties":{"name":"上大为和国"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78480371728801,43.385713038402734]},"properties":{"name":"地到以说时"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82444442057749,43.3981364143174]},"properties":{"name":"要就出会可"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73178458119855,43.42150465372435]},"properties":{"name":"也你对生能"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81785610131647,43.36772142802819]},"properties":{"name":"而子那得于"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71407211903534,43.396000025590936]},"properties":{"name":"着下自之年"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79407351218833,43.41860722639433]},"properties":{"name":"过发后作里"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67633907003255,43.4171921149322]},"properties":{"name":"用道行所然"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77300637827193,43.39388127052078]},"properties":{"name":"家种事成方"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81926263607329,43.339585481875]},"properties":{"name":"多经么去法"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76701252093699,43.35773661014847]},"properties":{"name":"学如都同现"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7737515090821,43.44366259492489]},"properties":{"name":"当没动面起"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73829309937992,43.34378736524005]},"properties":{"name":"看定天分还"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71836466571312,43.33057012451926]},"properties":{"name":"进好小部其"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8115615374345,43.43176089412675]},"properties":{"name":"些主样理心"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72375031275442,43.427220939712534]},"properties":{"name":"她本前开但"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70314387005055,43.389688637563765]},"properties":{"name":"因只从想实"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76039207819576,43.36975807892726]},"properties":{"name":"日军者意无"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78682420394216,43.365202354108135]},"properties":{"name":"力它与长把"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78460575433382,43.430490774626286]},"properties":{"name":"机十民第公"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7823602114513,43.35546405309943]},"properties":{"name":"此已工使情"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69186049292512,43.422688902696564]},"properties":{"name":"明性知全三"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80768244315095,43.43381601437478]},"properties":{"name":"又关点正业"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72756567031774,43.400333914786785]},"properties":{"name":"外将两高间"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69534099799966,43.422190395818994]},"properties":{"name":"由问很最重"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83581194006001,43.41564978584469]},"properties":{"name":"并物手应战"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74950948614969,43.43062747741384]},"properties":{"name":"向头文体政"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72733267952117,43.39116317525604]},"properties":{"name":"美相见被利"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72085520401288,43.43205067390052]},"properties":{"name":"什二等产或"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74851416375623,43.44382863716304]},"properties":{"name":"新己制身果"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8394813306677,43.37578833067203]},"properties":{"name":"加西斯月话"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77187743426293,43.359984149537226]},"properties":{"name":"合回特代内"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69004478877105,43.32857475596884]},"properties":{"name":"信表化老给"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7543304983983,43.45029457922705]},"properties":{"name":"世位次度门"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74270392666222,43.436224623306195]},"properties":{"name":"任常先海通"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70207094875059,43.39809173301537]},"properties":{"name":"教儿原东声"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75571436014798,43.3468089398027]},"properties":{"name":"提立及比员"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8233978214821,43.42514681243842]},"properties":{"name":"解水名筱论"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68193517172404,43.43279789478497]},"properties":{"name":"处走义各入"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80028992255848,43.33690838162077]},"properties":{"name":"几口认条平"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71507317067244,43.401143748258455]},"properties":{"name":"系气题活尔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78889469900332,43.45182031313233]},"properties":{"name":"更别打女变"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6791223720029,43.38861188362641]},"properties":{"name":"四神总何电"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72988047792478,43.33359777731984]},"properties":{"name":"数安少报才"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76988704019641,43.365757148416336]},"properties":{"name":"结反受目太"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75657912670522,43.39062671107417]},"properties":{"name":"量再感建务"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71694934526477,43.376825304235226]},"properties":{"name":"做接必场件"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67458813089615,43.36108038884236]},"properties":{"name":"计管期市直"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73092396663014,43.451194179973356]},"properties":{"name":"德资命山金"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71805769966886,43.441661018342145]},"properties":{"name":"指克许统区"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81861278781616,43.426572973941695]},"properties":{"name":"保至队形社"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78874389125303,43.383000090716834]},"properties":{"name":"便空决治展"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77038527017976,43.357431603981965]},"properties":{"name":"马科司五基"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76028190008401,43.396620706760984]},"properties":{"name":"眼书非则听"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72120167890262,43.33581886107876]},"properties":{"name":"白却界达光"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83215351153285,43.42486709690492]},"properties":{"name":"放强即像难"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74438919600198,43.33050804734877]},"properties":{"name":"且权思王象"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78421479421195,43.40712629232671]},"properties":{"name":"完设式色路"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7497489802472,43.33114312974759]},"properties":{"name":"记南品住告"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66478914990057,43.38347958366816]},"properties":{"name":"类求据程北"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79279423940079,43.444583002746775]},"properties":{"name":"边死张该交"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76906741636776,43.419984311312625]},"properties":{"name":"规万取拉格"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75612128325247,43.37612751347973]},"properties":{"name":"望觉术领共"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77176654843697,43.43095760221496]},"properties":{"name":"确传师观清"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77393503776875,43.373380874335005]},"properties":{"name":"今切院让识"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71310318142423,43.43803340638478]},"properties":{"name":"候带导争运"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81563594692398,43.346211434247635]},"properties":{"name":"笑飞风步改"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69670553324158,43.4029553787535]},"properties":{"name":"收根干造言"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68140692646466,43.45196741095145]},"properties":{"name":"联持组每济"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71393977312255,43.352840358239604]},"properties":{"name":"车亲极林服"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77520183044271,43.370446718107615]},"properties":{"name":"快办议往元"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7705171135467,43.42031530315453]},"properties":{"name":"英士证近失"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79700244767992,43.370796588876516]},"properties":{"name":"转夫令准布"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68495501730467,43.44587605391778]},"properties":{"name":"始怎呢存未"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66875438862098,43.428265013064504]},"properties":{"name":"远叫台单影"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78255633374283,43.344190485138526]},"properties":{"name":"具罗字爱击"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73950662616426,43.39914435521945]},"properties":{"name":"流备兵连调"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66711705844682,43.42765258781692]},"properties":{"name":"深商算质团"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67424805301926,43.367364311972324]},"properties":{"name":"集百需价花"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73542075892419,43.405725847481825]},"properties":{"name":"党华城石级"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83006410836333,43.35664000828751]},"properties":{"name":"整府离况亚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72345388556187,43.34752030391647]},"properties":{"name":"请技际约示"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74116502544712,43.39729245583676]},"properties":{"name":"复病息究线"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73088213630854,43.349605386889884]},"properties":{"name":"似官火断精"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67745194820873,43.41123711240646]},"properties":{"name":"满支视消越"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6817792850643,43.42344437828406]},"properties":{"name":"器容照须九"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67395214801763,43.39977158479005]},"properties":{"name":"增研写称企"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72161818475706,43.382293003810005]},"properties":{"name":"八功吗包片"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72855664275721,43.41261360254286]},"properties":{"name":"史委乎查轻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83086291556356,43.36050725709127]},"properties":{"name":"易早曾除农"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75354201321716,43.4442740937665]},"properties":{"name":"找装广显吧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7131699827778,43.345394151190725]},"properties":{"name":"阿李标谈吃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7649695364853,43.44088050766551]},"properties":{"name":"图念六引历"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71225333661914,43.35591317841684]},"properties":{"name":"首医局突专"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79971900833698,43.392362357661604]},"properties":{"name":"费号尽另周"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70626144043672,43.42036951093048]},"properties":{"name":"较注语仅考"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7040667445608,43.433803705173396]},"properties":{"name":"落青随选列"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.813440070051,43.385923123380685]},"properties":{"name":"武红响虽推"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7070736167725,43.37259236901997]},"properties":{"name":"势参希古众"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76888123702702,43.39800691496971]},"properties":{"name":"构房半节土"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74421053508104,43.34325732766496]},"properties":{"name":"投某案黑维"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69038090599406,43.366814529767844]},"properties":{"name":"革划敌致陈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66650853289048,43.34867037886478]},"properties":{"name":"律足态护七"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66952516027868,43.40685068681997]},"properties":{"name":"兴派孩验责"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68151887308431,43.3821590323556]},"properties":{"name":"营星够章音"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71453679914157,43.41655508237566]},"properties":{"name":"跟志底站严"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7286383345945,43.389659720807465]},"properties":{"name":"巴例防族供"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78968425737912,43.42832250510841]},"properties":{"name":"效续施留讲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77126855272127,43.432091911546834]},"properties":{"name":"型料终答紧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80150644673267,43.384293717872744]},"properties":{"name":"黄绝奇察母"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70325368034901,43.342142138944126]},"properties":{"name":"京段依批群"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74350685450099,43.33815688393118]},"properties":{"name":"项故按河米"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68640694219539,43.32988121926636]},"properties":{"name":"围江织害斗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82314765576484,43.36757657335591]},"properties":{"name":"双境客纪采"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77855847885985,43.44537272495857]},"properties":{"name":"举杀攻父苏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69097776744456,43.38523317400271]},"properties":{"name":"密低朝友诉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7421211758674,43.3800236955169]},"properties":{"name":"止细愿千值"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7755043980751,43.36667122483581]},"properties":{"name":"仍男钱破网"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75295729292066,43.44281164137731]},"properties":{"name":"热助倒育属"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77224286592354,43.3253127146371]},"properties":{"name":"坐帝限船脸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8242325149331,43.347561311210455]},"properties":{"name":"职速刻乐否"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80801165451248,43.43367913152873]},"properties":{"name":"刚威毛状率"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77302849618263,43.372749462523885]},"properties":{"name":"甚独球般普"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73703546176603,43.328032643768076]},"properties":{"name":"怕弹校苦创"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67624744048317,43.344889116256184]},"properties":{"name":"伟久错承印"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79964252293848,43.38656670136357]},"properties":{"name":"晚兰试股拿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74049655553154,43.344659220383505]},"properties":{"name":"脑预谁益阳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72304384605104,43.35607154684429]},"properties":{"name":"若哪微尼继"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7526981722367,43.39981729891517]},"properties":{"name":"送急血惊伤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68568625772969,43.34763712888965]},"properties":{"name":"素药适波夜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81743986333095,43.429533375195334]},"properties":{"name":"省初喜卫源"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80579718643094,43.35988688107485]},"properties":{"name":"食险待述陆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83223099273255,43.43425284429113]},"properties":{"name":"习置居劳财"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80006585484625,43.35132639892201]},"properties":{"name":"环排福纳欢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70924590877894,43.383011511165705]},"properties":{"name":"雷警获模充"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68249560431013,43.35743306628053]},"properties":{"name":"负云停木游"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68774304395902,43.33419609182944]},"properties":{"name":"龙树疑层冷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67733078337824,43.327826458540464]},"properties":{"name":"洲冲射略范"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68834955622151,43.431281245921824]},"properties":{"name":"竟句室异激"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8091257333308,43.43459785012007]},"properties":{"name":"汉村哈策演"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67144809840102,43.397513621281995]},"properties":{"name":"简卡罪判担"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82363606504714,43.37710068801484]},"properties":{"name":"州静退既衣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74061761816665,43.4212255093278]},"properties":{"name":"您宗积余痛"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7045488688891,43.36750358756782]},"properties":{"name":"检差富灵协"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82580595102172,43.42392475722188]},"properties":{"name":"角占配征修"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77008645152546,43.34480018782685]},"properties":{"name":"皮挥胜降阶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71651166319498,43.34427801604752]},"properties":{"name":"审沉坚善妈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83028376706352,43.39600333853026]},"properties":{"name":"刘读啊超免"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72932534685151,43.32911672353392]},"properties":{"name":"压银买皇养"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68036932940231,43.36393499520703]},"properties":{"name":"伊怀执副乱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77298183161474,43.44003908109747]},"properties":{"name":"抗犯追帮宣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81552785528402,43.34735681961522]},"properties":{"name":"佛岁航优怪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78578499835658,43.41906317070564]},"properties":{"name":"香著田铁控"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78354709597988,43.368113417254776]},"properties":{"name":"税左右份穿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82797590542668,43.35143064769927]},"properties":{"name":"艺背阵草脚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79055192707074,43.43537476712199]},"properties":{"name":"概恶块顿敢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70654512079273,43.41147087462913]},"properties":{"name":"守酒岛托央"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68733618863007,43.41836228588271]},"properties":{"name":"户烈洋哥索"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7154416231333,43.33529886942282]},"properties":{"name":"胡款靠评版"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73493527274877,43.370844496181796]},"properties":{"name":"宝座释景顾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73770378945937,43.39088303970504]},"properties":{"name":"弟登货互付"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83211159305392,43.32846502905939]},"properties":{"name":"伯慢欧换闻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68908894596007,43.44014380512324]},"properties":{"name":"危忙核暗姐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6902922126892,43.403538514368456]},"properties":{"name":"介坏讨丽良"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76141611184084,43.36152240176037]},"properties":{"name":"序升监临亮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67547588081197,43.34877423379756]},"properties":{"name":"露永呼味野"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74561868818364,43.40177322844116]},"properties":{"name":"架域沙掉括"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82147468187486,43.345501872146336]},"properties":{"name":"舰鱼杂误湾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72331018618115,43.41869149001808]},"properties":{"name":"吉减编楚肯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81418024432423,43.39045046575978]},"properties":{"name":"测败屋跑梦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69068592136318,43.3685438560169]},"properties":{"name":"散温困剑渐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83747349864097,43.32783583160479]},"properties":{"name":"封救贵枪缺"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66638697581311,43.38651479270904]},"properties":{"name":"楼县尚毫移"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73073327718703,43.39856744262681]},"properties":{"name":"娘朋画班智"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74104845728016,43.38961856762863]},"properties":{"name":"亦耳恩短掌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7539775992791,43.37962584070818]},"properties":{"name":"恐遗固席松"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67308167308965,43.440433177549636]},"properties":{"name":"秘谢鲁遇康"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68724650885542,43.3438023389739]},"properties":{"name":"虑幸均销钟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6690021588247,43.3604969931925]},"properties":{"name":"诗藏赶剧票"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77503168804014,43.415001819151854]},"properties":{"name":"损忽巨炮旧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79229079700326,43.41771721089227]},"properties":{"name":"端探湖录叶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75545867980964,43.404726107598385]},"properties":{"name":"春乡附吸予"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68343503303822,43.32628692794371]},"properties":{"name":"礼港雨呀板"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7017168198081,43.408124296254805]},"properties":{"name":"庭妇归睛饭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75177113079917,43.40327950333013]},"properties":{"name":"额含顺输摇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70633448491662,43.33353916165031]},"properties":{"name":"招婚脱补谓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80796698838185,43.38855809467828]},"properties":{"name":"督毒油疗旅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71316371386729,43.40035203701606]},"properties":{"name":"泽材灭逐莫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73512074699465,43.39091219011503]},"properties":{"name":"笔亡鲜词圣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8091237096005,43.33089437793854]},"properties":{"name":"择寻厂睡博"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71888919977027,43.37203728663009]},"properties":{"name":"勒烟授诺伦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6680803788322,43.4500067687054]},"properties":{"name":"岸奥唐卖俄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66925720953805,43.372341602453425]},"properties":{"name":"炸载洛健堂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66882286164855,43.423630694619916]},"properties":{"name":"旁宫喝借君"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77390029854541,43.445009580661186]},"properties":{"name":"禁阴园谋宋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71985438791216,43.398099248509034]},"properties":{"name":"避抓荣姑孙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74294883903804,43.4173240632121]},"properties":{"name":"逃牙束跳顶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66689798156858,43.34124127734229]},"properties":{"name":"玉镇雪午练"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75171381658947,43.39159204675984]},"properties":{"name":"迫爷篇肉嘴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81096888891352,43.42308178495851]},"properties":{"name":"馆遍凡础洞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73965294263871,43.40406594519991]},"properties":{"name":"卷坦牛宁纸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72554678621145,43.37774074563721]},"properties":{"name":"诸训私庄祖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67178856070768,43.389572230853304]},"properties":{"name":"丝翻暴森塔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66509793278783,43.41061135866706]},"properties":{"name":"默握戏隐熟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73326538252331,43.44230808801419]},"properties":{"name":"骨访弱蒙歌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.763294657595,43.42569076002226]},"properties":{"name":"店鬼软典欲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70805275051043,43.33022223454242]},"properties":{"name":"萨伙遭盘爸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80356155228401,43.35448684283324]},"properties":{"name":"扩盖弄雄稳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71671550436804,43.358590543375485]},"properties":{"name":"忘亿刺拥徒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79930692168546,43.44009080139547]},"properties":{"name":"姆杨齐赛趣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79587187411107,43.353732548898144]},"properties":{"name":"曲刀床迎冰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79719578990535,43.37696041213408]},"properties":{"name":"虚玩析窗醒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69965497394605,43.36639187084689]},"properties":{"name":"妻透购替塞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7921343910175,43.39881694771324]},"properties":{"name":"努休虎扬途"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72017632396182,43.38361317683319]},"properties":{"name":"侵刑绿兄迅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68359785932444,43.34831766076865]},"properties":{"name":"套贸毕唯谷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81414767105343,43.40958963502256]},"properties":{"name":"轮库迹尤竞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80253128177446,43.36605742276838]},"properties":{"name":"街促延震弃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70089574338908,43.44275792279891]},"properties":{"name":"甲伟麻川申"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83317739247832,43.442243183384164]},"properties":{"name":"缓潜闪售灯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67721696102126,43.42843016937564]},"properties":{"name":"针哲络抵朱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71723432403815,43.36649527257002]},"properties":{"name":"埃抱鼓植纯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69481568423726,43.40301142667125]},"properties":{"name":"夏忍页杰筑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68468959578695,43.35720648266311]},"properties":{"name":"折郑贝尊吴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72149391956373,43.361699359813706]},"properties":{"name":"秀混臣雅振"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70660354920619,43.38448871648363]},"properties":{"name":"染盛怒舞圆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76299651747377,43.35074913433199]},"properties":{"name":"搞狂措姓残"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77539316698676,43.39435306815789]},"properties":{"name":"秋培迷诚宽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71830531729574,43.35119394975593]},"properties":{"name":"宇猛摆梅毁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81118685367528,43.37563814779732]},"properties":{"name":"伸摩盟末乃"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79642660311492,43.377657505705734]},"properties":{"name":"悲拍丁赵硬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7888253988358,43.337163828964385]},"properties":{"name":"麦蒋操耶阻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70485407817159,43.42571907384735]},"properties":{"name":"订彩抽赞魔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66969568481909,43.35045513475347]},"properties":{"name":"纷沿喊违妹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66930716449406,43.44367042306718]},"properties":{"name":"浪汇币丰蓝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69189873670894,43.43076512052666]},"properties":{"name":"殊献桌啦瓦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79353235204508,43.37368059280777]},"properties":{"name":"莱援译夺汽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70219104390617,43.33231431216638]},"properties":{"name":"烧距裁偏符"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76689379197433,43.36916089976166]},"properties":{"name":"勇触课敬哭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82121823517355,43.3890494143254]},"properties":{"name":"懂墙袭召罚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83471876958811,43.40298009860645]},"properties":{"name":"侠厅拜巧侧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79381721196569,43.43790173544968]},"properties":{"name":"韩冒债曼融"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78649372015207,43.36341720491033]},"properties":{"name":"惯享戴童犹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78560735030351,43.44361961433385]},"properties":{"name":"乘挂奖绍厚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75079314695358,43.33861416363164]},"properties":{"name":"纵障讯涉彻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74953762736641,43.40607632034917]},"properties":{"name":"刊丈爆乌役"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74238703575702,43.35555088566464]},"properties":{"name":"描洗玛患妙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83816796506198,43.41942390467601]},"properties":{"name":"镜唱烦签仙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81616133746593,43.350962266236195]},"properties":{"name":"彼弗症仿倾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79219311701308,43.387858965559424]},"properties":{"name":"牌陷鸟轰咱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66780267369268,43.36965922024568]},"properties":{"name":"菜闭奋庆撤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76678459362029,43.41517258008821]},"properties":{"name":"泪茶疾缘播"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80142993141635,43.341730907669636]},"properties":{"name":"朗杜奶季丹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77921260855874,43.421873232284376]},"properties":{"name":"狗尾仪偷奔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83144706066832,43.36621272347986]},"properties":{"name":"珠虫驻孔宜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70722008394114,43.35038684779588]},"properties":{"name":"艾桥淡翼恨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79020734973255,43.33479279298051]},"properties":{"name":"繁寒伴叹旦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67291568124347,43.43540548255966]},"properties":{"name":"愈潮粮缩罢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82768299138934,43.36836454991645]},"properties":{"name":"聚径恰挑袋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75399246803045,43.418397519140655]},"properties":{"name":"灰捕徐珍幕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74220063622761,43.35676855353936]},"properties":{"name":"映裂泰隔启"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67156749173591,43.32753321179319]},"properties":{"name":"尖忠累炎暂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7337656762229,43.362393286271406]},"properties":{"name":"估泛荒偿横"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72030044521398,43.382476256772236]},"properties":{"name":"拒瑞忆孤鼻"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7526464325656,43.436104808005915]},"properties":{"name":"闹羊呆厉衡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71485882023808,43.429619924972954]},"properties":{"name":"胞零穷舍码"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75909970307748,43.330400132266675]},"properties":{"name":"赫婆魂灾洪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81135682893091,43.42006743640997]},"properties":{"name":"腿胆津俗辩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67022303291196,43.35877085029656]},"properties":{"name":"胸晓劲贫仁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73190488058117,43.36210649884719]},"properties":{"name":"偶辑邦恢赖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79749258159609,43.43829648566227]},"properties":{"name":"圈摸仰润堆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81412739294592,43.42486673759098]},"properties":{"name":"碰艇稍迟辆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73942862821696,43.41857560346666]},"properties":{"name":"废净凶署壁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73194496367705,43.36236970705654]},"properties":{"name":"御奉旋冬矿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77277965716348,43.42795996100599]},"properties":{"name":"抬蛋晨伏吹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79677774850097,43.386918730187254]},"properties":{"name":"鸡倍糊秦盾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7755677565865,43.41930911043181]},"properties":{"name":"杯租骑乏隆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83969235862696,43.40300089042435]},"properties":{"name":"诊奴摄丧污"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79056823232804,43.36644340374012]},"properties":{"name":"渡旗甘耐凭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79024794978068,43.450759361929514]},"properties":{"name":"扎抢绪粗肩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7960531583467,43.42912547125532]},"properties":{"name":"梁幻菲皆碎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71188677769896,43.40578991754939]},"properties":{"name":"宙叔岩荡综"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80973210979664,43.405074830026]},"properties":{"name":"爬荷悉蒂返"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83094842280389,43.383506992650275]},"properties":{"name":"井壮薄悄扫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68880786616319,43.4408736919135]},"properties":{"name":"敏碍殖详迪"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83637982623713,43.37932687230065]},"properties":{"name":"矛霍允幅撒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7120551129583,43.38478419358865]},"properties":{"name":"剩凯颗骂赏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79655496709165,43.353914671185876]},"properties":{"name":"液番箱贴漫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82183396335495,43.34951148058995]},"properties":{"name":"酸郎腰舒眉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7386077853289,43.42153859100138]},"properties":{"name":"忧浮辛恋餐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70073597694773,43.3950412068982]},"properties":{"name":"吓挺励辞艘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67738562238901,43.37299568230138]},"properties":{"name":"键伍峰尺昨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76967766127837,43.43523403455177]},"properties":{"name":"黎辈贯侦滑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66711217868942,43.34498516856536]},"properties":{"name":"券崇扰宪绕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71263407544393,43.44878125927471]},"properties":{"name":"趋慈乔阅汗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81736193811139,43.3268554930083]},"properties":{"name":"枝拖墨胁插"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72823672941468,43.39913772571227]},"properties":{"name":"箭腊粉泥氏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80909585278732,43.42911070681641]},"properties":{"name":"彭拔骗凤慧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75079532407926,43.42721943663759]},"properties":{"name":"媒佩愤扑龄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71058457033814,43.367755763373076]},"properties":{"name":"驱惜豪掩兼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69298119807172,43.42626514840551]},"properties":{"name":"跃尸肃帕驶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83650346598006,43.41933636859189]},"properties":{"name":"堡届欣惠册"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7067569578021,43.4410164115811]},"properties":{"name":"储飘桑闲惨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8266463758855,43.429931233602844]},"properties":{"name":"洁踪勃宾频"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78659303223958,43.338321981323276]},"properties":{"name":"仇磨递邪撞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80639026067729,43.36026255177993]},"properties":{"name":"拟滚奏巡颜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68785430058597,43.391834351083176]},"properties":{"name":"剂绩贡疯坡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77329479710443,43.331029684633386]},"properties":{"name":"瞧截燃焦殿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83944140776111,43.36094548943541]},"properties":{"name":"伪柳锁逼颇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77328811212737,43.39281904629793]},"properties":{"name":"昏劝呈搜勤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80847732751408,43.37011711911654]},"properties":{"name":"戒驾漂饮曹"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69083308544123,43.34616816533698]},"properties":{"name":"朵仔柔俩孟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71997028929218,43.39262356330771]},"properties":{"name":"腐幼践籍牧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70795456797441,43.43662706130826]},"properties":{"name":"凉牲佳娜浓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74983541518577,43.36433290673387]},"properties":{"name":"芳稿竹腹跌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72199664814889,43.399196067397874]},"properties":{"name":"逻垂遵脉貌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76282152809654,43.33979211362029]},"properties":{"name":"柏狱猜怜惑"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72295717357065,43.32965718674516]},"properties":{"name":"陶兽帐饰贷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76962927584191,43.417191219398504]},"properties":{"name":"昌叙躺钢沟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79867291448863,43.44693460246704]},"properties":{"name":"寄扶铺邓寿"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80762496150783,43.447198828628444]},"properties":{"name":"惧询汤盗肥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73700170958546,43.42215816219742]},"properties":{"name":"尝匆辉奈扣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79048870955376,43.368949995240996]},"properties":{"name":"廷澳嘛董迁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8255365161358,43.39707569876099]},"properties":{"name":"凝慰厌脏腾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67286163429799,43.38896639656718]},"properties":{"name":"幽怨鞋丢埋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76401826500387,43.37508033645364]},"properties":{"name":"泉涌辖躲晋"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77611649584469,43.400255751529066]},"properties":{"name":"紫艰魏吾慌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70951490545667,43.33112009433672]},"properties":{"name":"祝邮吐狠鉴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7066983545883,43.42345908175173]},"properties":{"name":"曰械咬邻赤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82127073113952,43.339820786610595]},"properties":{"name":"挤弯椅陪割"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71675786236483,43.43096503945724]},"properties":{"name":"揭韦悟聪雾"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78950346431157,43.40237228555073]},"properties":{"name":"锋梯猫祥阔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75258281784954,43.390836247816566]},"properties":{"name":"誉筹丛牵鸣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76638218213247,43.32741343188597]},"properties":{"name":"沈阁穆屈旨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72154484965267,43.45222086361347]},"properties":{"name":"袖猎臂蛇贺"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76627772335996,43.437491216616706]},"properties":{"name":"柱抛鼠瑟戈"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73925198284087,43.44218709248913]},"properties":{"name":"牢逊迈欺吨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77499563521542,43.418523278482645]},"properties":{"name":"琴衰瓶恼燕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8169860967655,43.384473967748534]},"properties":{"name":"仲诱狼池疼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78032431371867,43.446660440194194]},"properties":{"name":"卢仗冠粒遥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71753936465939,43.45285380044917]},"properties":{"name":"吕玄尘冯抚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69263196333395,43.419665985695886]},"properties":{"name":"浅敦纠钻晶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70765474537438,43.42017682128563]},"properties":{"name":"岂峡苍喷耗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69765841770732,43.33820610443803]},"properties":{"name":"凌敲菌赔涂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82267605236211,43.42357169093535]},"properties":{"name":"粹扁亏寂煤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73336307802492,43.42297002833131]},"properties":{"name":"熊恭湿循暖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83811908518328,43.33925460912034]},"properties":{"name":"糖赋抑秩帽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73171881207145,43.354563903522724]},"properties":{"name":"哀宿踏烂袁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6961362492757,43.35411874665983]},"properties":{"name":"侯抖夹昆肝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68661836305637,43.36823198552959]},"properties":{"name":"擦猪炼恒慎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83961700277996,43.3510427803368]},"properties":{"name":"搬纽纹玻渔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74947187088583,43.39389891860199]},"properties":{"name":"磁铜齿跨押"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72910695071641,43.36486528376062]},"properties":{"name":"怖漠疲叛遣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69754557797296,43.39387045930845]},"properties":{"name":"兹祭醉拳弥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73710033565021,43.384584096889725]},"properties":{"name":"斜档稀捷肤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68689162255396,43.36871487059363]},"properties":{"name":"疫肿豆削岗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7994804315831,43.33013942649552]},"properties":{"name":"晃吞宏癌肚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7988314518434,43.39336940273254]},"properties":{"name":"隶履涨耀扭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71307712205453,43.41174462631271]},"properties":{"name":"坛拨沃绘伐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72580987651236,43.38478891558823]},"properties":{"name":"堪仆郭牺歼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7036186715095,43.41690955477799]},"properties":{"name":"墓雇廉契拼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76149458704094,43.367965367570484]},"properties":{"name":"惩捉覆刷劫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8058814547212,43.403167911414506]},"properties":{"name":"嫌瓜歇雕闷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71361559233537,43.376334729032095]},"properties":{"name":"乳串娃缴唤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73154162252649,43.38490610787597]},"properties":{"name":"赢莲霸桃妥"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79186204272446,43.376665125080876]},"properties":{"name":"瘦搭赴岳嘉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6661296359971,43.452468442692734]},"properties":{"name":"舱俊址庞耕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7616259928136,43.44408598398389]},"properties":{"name":"锐缝悔邀玲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78766358344183,43.37143374956189]},"properties":{"name":"惟斥宅添挖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68890499690951,43.44979275747692]},"properties":{"name":"呵讼氧浩羽"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67281208362147,43.3973497257669]},"properties":{"name":"斤酷掠妖祸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71588028401948,43.442055130438646]},"properties":{"name":"侍乙妨贪挣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71721666322901,43.32562249083662]},"properties":{"name":"汪尿莉悬唇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67841066689653,43.34185192725603]},"properties":{"name":"翰仓轨枚盐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73531620540507,43.36415708253743]},"properties":{"name":"览傅帅庙芬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72425220806053,43.351560221312894]},"properties":{"name":"屏寺胖璃愚"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68594161715737,43.409583613235085]},"properties":{"name":"滴疏萧姿颤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73655883818446,43.33441638119229]},"properties":{"name":"丑劣柯寸扔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6752721298426,43.32966752267923]},"properties":{"name":"盯辱匹俱辨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6904923700813,43.327341256271836]},"properties":{"name":"饿蜂哦腔郁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78054278610125,43.394614279098086]},"properties":{"name":"溃谨糟葛苗"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74335729998438,43.40451717893259]},"properties":{"name":"肠忌溜鸿爵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7569937171229,43.44689633183004]},"properties":{"name":"鹏鹰笼丘桂"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8360965058364,43.40171500153021]},"properties":{"name":"滋聊挡纲肌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71513986618811,43.43457019529001]},"properties":{"name":"茨壳痕碗穴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7952919780746,43.44165282752506]},"properties":{"name":"膀卓贤卧膜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68173948092863,43.44800154193802]},"properties":{"name":"毅锦欠哩函"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81701665551464,43.389228319829925]},"properties":{"name":"茫昂薛皱夸"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77895341666135,43.394861202037575]},"properties":{"name":"豫胃舌剥傲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75351540071551,43.4219368264491]},"properties":{"name":"拾窝睁携陵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81052088748493,43.424322611524985]},"properties":{"name":"哼棉晴铃填"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69578376327627,43.37844309252077]},"properties":{"name":"饲渴吻扮逆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78368098309056,43.388133327996385]},"properties":{"name":"脆喘罩卜炉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70213684589817,43.400458123228596]},"properties":{"name":"柴愉绳胎蓄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75735508441994,43.33521557571769]},"properties":{"name":"眠竭喂傻慕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7165813035499,43.449836563440115]},"properties":{"name":"浑奸扇柜悦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67118947948529,43.32648454903178]},"properties":{"name":"拦诞饱乾泡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73583864324974,43.40494189377406]},"properties":{"name":"贼亭夕爹酬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7592708719767,43.37376037403405]},"properties":{"name":"儒姻卵氛泄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81937170824858,43.42605432516992]},"properties":{"name":"杆挨僧蜜吟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82074352007112,43.36580652869758]},"properties":{"name":"猩遂狭肖甜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7436711727496,43.372504265635634]},"properties":{"name":"霞驳裕顽於"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67000504535372,43.38201541721379]},"properties":{"name":"摘矮秒卿畜"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77440106794256,43.37650136295896]},"properties":{"name":"咽披辅勾盆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68061636193306,43.33728440664312]},"properties":{"name":"疆赌塑畏吵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66503257911336,43.38062935022041]},"properties":{"name":"囊嗯泊肺骤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70403178494416,43.36877483548238]},"properties":{"name":"缠冈羞瞪吊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75963805364609,43.40329643349728]},"properties":{"name":"贾漏斑涛悠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67318084901217,43.42404258860719]},"properties":{"name":"鹿俘锡卑葬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7664044443527,43.43862549454096]},"properties":{"name":"铭滩嫁催璇"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76699292336798,43.37550577167776]},"properties":{"name":"翅盒蛮矣潘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73291945020628,43.3674976351091]},"properties":{"name":"歧赐鲍锅廊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80291150700305,43.3459863032626]},"properties":{"name":"拆灌勉盲宰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67799156621277,43.336989953022176]},"properties":{"name":"佐啥胀扯禧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75967314468016,43.44864855947221]},"properties":{"name":"辽抹筒棋裤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77895542262922,43.37606635807544]},"properties":{"name":"唉朴咐孕誓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74354294751629,43.401586326632675]},"properties":{"name":"喉妄拘链驰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71739241962405,43.32949392714524]},"properties":{"name":"栏逝窃艳臭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78738846011674,43.347806614069704]},"properties":{"name":"纤玑棵趁匠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68105058004221,43.384474385118985]},"properties":{"name":"盈翁愁瞬婴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74292700712704,43.43924277428903]},"properties":{"name":"孝颈倘浙谅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72330992960815,43.44448236676838]},"properties":{"name":"蔽畅赠妮莎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80374649087389,43.423236258780996]},"properties":{"name":"尉冻跪闯葡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7843960910941,43.37735348316894]},"properties":{"name":"後厨鸭颠遮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77111562727168,43.377397868656345]},"properties":{"name":"谊圳吁仑辟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75822663806775,43.403893701294244]},"properties":{"name":"瘤嫂陀框谭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76760909818859,43.365752206325446]},"properties":{"name":"亨钦庸歉芝"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67688920728415,43.35171094097246]},"properties":{"name":"吼甫衫摊宴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81636243364756,43.37912531315445]},"properties":{"name":"嘱衷娇陕矩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76577508596074,43.34670065336113]},"properties":{"name":"浦讶耸裸碧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6734781883506,43.339763982233066]},"properties":{"name":"摧薪淋耻胶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67229678701096,43.37951866037416]},"properties":{"name":"屠鹅饥盼脖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.67370422785643,43.33477495020771]},"properties":{"name":"虹翠崩账萍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72454219260635,43.38020083184419]},"properties":{"name":"逢赚撑翔倡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.8127777939444,43.33011026808491]},"properties":{"name":"绵猴枯巫昭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82476845378096,43.345917052691725]},"properties":{"name":"怔渊凑溪蠢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.79458199273176,43.37007854115475]},"properties":{"name":"禅阐旺寓藤"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77530815590762,43.3745956095525]},"properties":{"name":"匪伞碑挪琼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81943466645043,43.38442804867082]},"properties":{"name":"脂谎慨菩萄"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7111729135977,43.41659485703934]},"properties":{"name":"狮掘抄岭晕"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81519536270207,43.35551688679179]},"properties":{"name":"逮砍掏狄晰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80141816757077,43.373296346452975]},"properties":{"name":"罕挽脾舟痴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73913970139529,43.36766474919193]},"properties":{"name":"蔡剪脊弓懒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68861229532558,43.447177904904464]},"properties":{"name":"叉拐喃僚捐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70887924537146,43.36989440125427]},"properties":{"name":"姊骚拓歪粘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72727783404389,43.43862238253905]},"properties":{"name":"柄坑陌窄湘"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80459063938179,43.337120260313164]},"properties":{"name":"兆崖骄刹鞭"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76679035695634,43.335932458145194]},"properties":{"name":"芒筋聘钩棍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6765199485153,43.33916485424814]},"properties":{"name":"嚷腺弦焰耍"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80245708208167,43.40137212585799]},"properties":{"name":"俯厘愣厦恳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77978667389289,43.32653195985271]},"properties":{"name":"饶钉寡憾摔"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.83554141642708,43.36208645578587]},"properties":{"name":"叠惹喻谱愧"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78226428764992,43.45214674512842]},"properties":{"name":"煌徽溶坠煞"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68707804799033,43.389474442588785]},"properties":{"name":"巾滥洒堵瓷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80216082023526,43.35618116364861]},"properties":{"name":"咒姨棒郡浴"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70300949696957,43.338949270378016]},"properties":{"name":"媚稣淮哎屁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68015060855032,43.40296808063941]},"properties":{"name":"漆淫巢吩撰"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68989328476619,43.39232508258088]},"properties":{"name":"啸滞玫硕钓"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71598403078042,43.38262581866229]},"properties":{"name":"蝶膝姚茂躯"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71912615539532,43.452016174114505]},"properties":{"name":"吏猿寨恕渠"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74577920821866,43.36541829164119]},"properties":{"name":"戚辰舶颁惶"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72712613526619,43.39671896203547]},"properties":{"name":"狐讽笨袍嘲"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.70664604422745,43.34278992771991]},"properties":{"name":"啡泼衔倦涵"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.68493815003421,43.39354964761166]},"properties":{"name":"雀旬僵撕肢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75455462754235,43.36155500394566]},"properties":{"name":"垄夷逸茅侨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77873016450667,43.366122899933224]},"properties":{"name":"舆窑涅蒲谦"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80791232048796,43.33394744370124]},"properties":{"name":"杭噢弊勋刮"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6997965679875,43.40806371864969]},"properties":{"name":"郊凄捧浸砖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66838019631632,43.35606605074788]},"properties":{"name":"鼎篮蒸饼亩"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.7069571753982,43.34266177851345]},"properties":{"name":"肾陡爪兔殷"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71273809195645,43.35495186858789]},"properties":{"name":"贞荐哑炭坟"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73519729235159,43.4163297000404]},"properties":{"name":"眨搏咳拢舅"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71910739744908,43.45181104214278]},"properties":{"name":"昧擅爽咖搁"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.72594206510075,43.33440744203501]},"properties":{"name":"禄雌哨巩绢"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69001132062567,43.36003830098169]},"properties":{"name":"螺裹昔轩谬"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.76804370175068,43.37362703079163]},"properties":{"name":"谍龟媳姜瞎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77043742133355,43.325828830544545]},"properties":{"name":"冤鸦蓬巷琳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66452596219278,43.377082454312294]},"properties":{"name":"栽沾诈斋瞒"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78052164197288,43.39882235229331]},"properties":{"name":"彪厄咨纺罐"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.74768201610368,43.34347333416988]},"properties":{"name":"桶壤糕颂膨"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77257029502562,43.353659062164375]},"properties":{"name":"谐垒咕隙辣"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82229997433387,43.36602478810474]},"properties":{"name":"绑宠嘿兑霉"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77697418935259,43.39302377957722]},"properties":{"name":"挫稽辐乞纱"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82932283412902,43.344460090153106]},"properties":{"name":"裙嘻哇绣杖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.75834764860247,43.43886099129135]},"properties":{"name":"塘衍轴攀膊"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.71397262576284,43.43847474002368]},"properties":{"name":"譬斌祈踢肆"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.78490097957456,43.41708495277058]},"properties":{"name":"坎轿棚泣屡"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.82596603943784,43.37280499147228]},"properties":{"name":"躁邱凰溢椎"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80376452461223,43.41299359444341]},"properties":{"name":"砸趟帘帆栖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.73771479115749,43.38964563062126]},"properties":{"name":"窜丸斩堤塌"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.77914081236031,43.36200438697811]},"properties":{"name":"贩厢掀喀乖"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6885010122187,43.3536150480067]},"properties":{"name":"谜捏阎滨虏"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.6809883295955,43.4279302964151]},"properties":{"name":"匙芦苹卸沼"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.66638088219406,43.356600228775875]},"properties":{"name":"钥株祷剖熙"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.81508020435649,43.44503598067335]},"properties":{"name":"哗劈怯棠胳"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.80562566482058,43.441746093418764]},"properties":{"name":"桩瑰娱娶沫"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-70.69680728921867,43.37119072206014]},"properties":{"name":"嗓蹲焚淘嫩"}}]} diff --git a/metrics/integration/data/places.geojson b/metrics/integration/data/places.geojson index b9ffbd329da1..6fa6cf2b8ea2 100644 --- a/metrics/integration/data/places.geojson +++ b/metrics/integration/data/places.geojson @@ -1 +1 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"scalerank":2,"name":"Niagara Falls","comment":null,"name_alt":null,"lat_y":43.087653,"long_x":-79.044073,"region":"North America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-79.04411780507252,43.08771393436908]},"id":163},{"type":"Feature","properties":{"scalerank":2,"name":"Salto Angel","comment":null,"name_alt":"Angel Falls","lat_y":5.686836,"long_x":-62.061848,"region":"South America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-62.06181800038502,5.686896063275327]},"id":164},{"type":"Feature","properties":{"scalerank":2,"name":"Iguazu Falls","comment":null,"name_alt":null,"lat_y":-25.568265,"long_x":-54.582842,"region":"South America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-54.58299719960377,-25.568291925005923]},"id":165},{"type":"Feature","properties":{"scalerank":3,"name":"Gees Gwardafuy","comment":null,"name_alt":null,"lat_y":11.812855,"long_x":51.235173,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[51.258313644180184,11.822028799226407]},"id":166},{"type":"Feature","properties":{"scalerank":3,"name":"Victoria Falls","comment":null,"name_alt":null,"lat_y":-17.77079,"long_x":25.460133,"region":"Africa","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[25.852793816021233,-17.928033135943423]},"id":167},{"type":"Feature","properties":{"scalerank":3,"name":"Wright I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-116.89262854726002,-74.06670501094342]},"id":168},{"type":"Feature","properties":{"scalerank":3,"name":"Grant I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-131.48540198476002,-74.48272063594342]},"id":169},{"type":"Feature","properties":{"scalerank":3,"name":"Newman I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-145.68681800038502,-75.59185149531842]},"id":170},{"type":"Feature","properties":{"scalerank":3,"name":"Dean I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-127.63438880116627,-74.50066497188092]},"id":171},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Canaveral","comment":null,"name_alt":null,"lat_y":28.483713,"long_x":-80.534941,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-80.53625603636821,28.473056814472134]},"id":172},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Mendocino","comment":null,"name_alt":null,"lat_y":40.350222,"long_x":-124.323474,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-124.39201745043425,40.44222065537283]},"id":173},{"type":"Feature","properties":{"scalerank":3,"name":"Cabo San Lucas","comment":null,"name_alt":null,"lat_y":22.887711,"long_x":-109.969843,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-109.96983801991627,22.887762762494077]},"id":174},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Churchill","comment":null,"name_alt":null,"lat_y":58.752014,"long_x":-93.182023,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-93.18211829335377,58.75208161015033]},"id":175},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Cod","comment":null,"name_alt":null,"lat_y":41.734867,"long_x":-69.964865,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-70.03687833567446,41.9914589934385]},"id":176},{"type":"Feature","properties":{"scalerank":3,"name":"Cape May","comment":null,"name_alt":null,"lat_y":37.2017,"long_x":-75.926791,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-74.95121933164988,38.92969645987068]},"id":177},{"type":"Feature","properties":{"scalerank":3,"name":"Cabo de Hornos","comment":null,"name_alt":"Cape Horn","lat_y":-55.862824,"long_x":-67.169425,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-67.16942298085377,-55.86284758906842]},"id":178},{"type":"Feature","properties":{"scalerank":3,"name":"Cape of Good Hope","comment":null,"name_alt":null,"lat_y":-34.307311,"long_x":18.441206,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[18.441294792583733,-34.30718352656842]},"id":179},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Palmas","comment":null,"name_alt":null,"lat_y":4.373924,"long_x":-7.457356,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-7.457386848041267,4.373968817181577]},"id":180},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Verde","comment":null,"name_alt":null,"lat_y":14.732312,"long_x":-17.471776,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-17.471730109760017,14.732489324994077]},"id":181},{"type":"Feature","properties":{"scalerank":3,"name":"Cap Bon","comment":null,"name_alt":null,"lat_y":37.073954,"long_x":11.024061,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[11.024180534771233,37.07398102421283]},"id":182},{"type":"Feature","properties":{"scalerank":3,"name":"Oceanic pole of inaccessibility","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Seven seas (open ocean)","subregion":"South Pacific Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[-123.40202796132252,-48.86504485469342]},"id":183},{"type":"Feature","properties":{"scalerank":3,"name":"South Magnetic Pole 2005 (est)","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Antarctica","subregion":"Southern Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[137.85425865977123,-64.51824309688092]},"id":184},{"type":"Feature","properties":{"scalerank":3,"name":"North Magnetic Pole 2005 (est)","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Seven seas (open ocean)","subregion":"Arctic Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[-114.40569007069752,82.71008942265033]},"id":185},{"type":"Feature","properties":{"scalerank":4,"name":"Lands End","comment":null,"name_alt":null,"lat_y":50.069677,"long_x":-5.668629,"region":"Europe","subregion":"British Isles","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-5.668629523822517,50.06970856327533]},"id":186},{"type":"Feature","properties":{"scalerank":4,"name":"Cape York","comment":null,"name_alt":null,"lat_y":76.218919,"long_x":-68.218612,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-68.21861731679127,76.21887848515033]},"id":187},{"type":"Feature","properties":{"scalerank":4,"name":"Nunap Isua","comment":null,"name_alt":"Cape Farewell","lat_y":59.862583,"long_x":-43.90088,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-43.90080725819752,59.86267731327533]},"id":188},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Vohimena","comment":null,"name_alt":null,"lat_y":-25.546355,"long_x":45.158683,"region":"Africa","subregion":"Indian Ocean","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[45.15870201914623,-25.546319268755923]},"id":189},{"type":"Feature","properties":{"scalerank":4,"name":"Vavau","comment":null,"name_alt":null,"lat_y":-18.590062,"long_x":-173.976769,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-173.97673499257252,-18.590020440630923]},"id":190},{"type":"Feature","properties":{"scalerank":4,"name":"I. de Pascua","comment":null,"name_alt":"Easter I.","lat_y":-27.102117,"long_x":-109.367953,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-109.36790930897877,-27.102227471880923]},"id":191},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Agulhas","comment":null,"name_alt":null,"lat_y":-34.801182,"long_x":19.993472,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[19.993418816021233,-34.80108001094342]},"id":192},{"type":"Feature","properties":{"scalerank":4,"name":"Plain of Jars","comment":null,"name_alt":null,"lat_y":20.550709,"long_x":101.890532,"region":"Asia","subregion":null,"featureclass":"plain"},"geometry":{"type":"Point","coordinates":[101.89063561289623,20.550909735150327]},"id":193},{"type":"Feature","properties":{"scalerank":4,"name":"Cabo Corrientes","comment":null,"name_alt":null,"lat_y":20.409471,"long_x":-105.683581,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-105.67795873874799,20.420365114940253]},"id":194},{"type":"Feature","properties":{"scalerank":4,"name":"Pt. Eugenia","comment":null,"name_alt":null,"lat_y":27.861925,"long_x":-115.07629,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-115.04623945046137,27.842887092585283]},"id":195},{"type":"Feature","properties":{"scalerank":4,"name":"Point Conception","comment":null,"name_alt":null,"lat_y":34.582313,"long_x":-120.659016,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-120.46360036202867,34.46027592467621]},"id":196},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Hatteras","comment":null,"name_alt":null,"lat_y":35.437762,"long_x":-75.450543,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-75.54032952413311,35.24475263812895]},"id":197},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Sable","comment":null,"name_alt":null,"lat_y":25.124896,"long_x":-81.090442,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-81.09044348866627,25.124762274212827]},"id":198},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Hope","comment":null,"name_alt":null,"lat_y":68.35638,"long_x":-166.815582,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-166.81321268769543,68.35380207543972]},"id":199},{"type":"Feature","properties":{"scalerank":4,"name":"Point Barrow","comment":null,"name_alt":null,"lat_y":71.372637,"long_x":-156.615894,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-156.4719492091668,71.40589128763096]},"id":200},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Negra","comment":null,"name_alt":null,"lat_y":-5.948875,"long_x":-81.108252,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-81.10832678944752,-5.948663018755923]},"id":201},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Lavapié","comment":null,"name_alt":null,"lat_y":-37.262867,"long_x":-73.606377,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-73.60304396243782,-37.17120002933805]},"id":202},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Galera","comment":null,"name_alt":null,"lat_y":0.731221,"long_x":-80.062205,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-80.06212317616627,0.731207586712827]},"id":203},{"type":"Feature","properties":{"scalerank":4,"name":"Cap Lopez","comment":null,"name_alt":null,"lat_y":-0.604761,"long_x":8.726423,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[8.727299789450319,-0.615086490513119]},"id":204},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Bobaomby","comment":null,"name_alt":null,"lat_y":-11.966598,"long_x":49.262904,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[49.26282799570873,-11.966485284380923]},"id":205},{"type":"Feature","properties":{"scalerank":4,"name":"Cap Blanc","comment":null,"name_alt":null,"lat_y":20.822108,"long_x":-17.052856,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-17.052906867572517,20.822088934369077]},"id":206},{"type":"Feature","properties":{"scalerank":5,"name":"South West Cape","comment":null,"name_alt":null,"lat_y":-43.510984,"long_x":146.054227,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[146.03379804609568,-43.5404025683706]},"id":207},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Howe","comment":null,"name_alt":null,"lat_y":-37.488775,"long_x":149.95853,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[149.95838463633373,-37.48894622188092]},"id":208},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Otway","comment":null,"name_alt":null,"lat_y":-38.857622,"long_x":143.565403,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[143.537005108191,-38.85472383068997]},"id":209},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Jaffa","comment":null,"name_alt":null,"lat_y":-36.944244,"long_x":139.690866,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[139.68061977964746,-36.95624316107086]},"id":210},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Carnot","comment":null,"name_alt":null,"lat_y":-34.920233,"long_x":135.656027,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[135.65378326897053,-34.93870859313661]},"id":211},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Byron","comment":null,"name_alt":null,"lat_y":-28.658282,"long_x":153.632849,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[153.62799176015545,-28.66197417050363]},"id":212},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Manifold","comment":null,"name_alt":null,"lat_y":-22.702081,"long_x":150.811228,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[150.81116783945873,-22.702080987505923]},"id":213},{"type":"Feature","properties":{"scalerank":5,"name":"Cape York","comment":null,"name_alt":null,"lat_y":-10.710859,"long_x":142.522018,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[142.52173912852123,-10.710747979693423]},"id":214},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Melville","comment":null,"name_alt":null,"lat_y":-14.163629,"long_x":144.506417,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[144.50660240977123,-14.163506768755923]},"id":215},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Arnhem","comment":null,"name_alt":null,"lat_y":-12.337984,"long_x":136.952429,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[136.91481885262823,-12.295662864626316]},"id":216},{"type":"Feature","properties":{"scalerank":5,"name":"West Cape Howe","comment":null,"name_alt":null,"lat_y":-35.104301,"long_x":117.597011,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[117.59693444102123,-35.10430266719342]},"id":217},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Leeuwin","comment":null,"name_alt":null,"lat_y":-34.297841,"long_x":115.10633,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[115.1280088910596,-34.328007092559645]},"id":218},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Pasley","comment":null,"name_alt":null,"lat_y":-33.929054,"long_x":123.517283,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[123.51722252695873,-33.92888762813092]},"id":219},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Londonderry","comment":null,"name_alt":null,"lat_y":-13.713856,"long_x":126.964514,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[126.94130045687105,-13.74290642667802]},"id":220},{"type":"Feature","properties":{"scalerank":5,"name":"Steep Point","comment":null,"name_alt":null,"lat_y":-26.16822,"long_x":113.169959,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[113.14519563289093,-26.157463616878637]},"id":221},{"type":"Feature","properties":{"scalerank":5,"name":"North West Cape","comment":null,"name_alt":null,"lat_y":-21.809776,"long_x":114.117534,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[114.16010761213809,-21.801474697071743]},"id":222},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Gracias a Dios","comment":null,"name_alt":null,"lat_y":14.994242,"long_x":-83.15866,"region":"North America","subregion":"Central America","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-83.15874182851002,14.994208074994077]},"id":223},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Brewster","comment":null,"name_alt":null,"lat_y":70.150754,"long_x":-22.122616,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-22.122731086322517,70.15088532108783]},"id":224},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Morris Jesup","comment":null,"name_alt":null,"lat_y":83.626331,"long_x":-32.491541,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-32.49150550038502,83.62628815311908]},"id":225},{"type":"Feature","properties":{"scalerank":5,"name":"Grmsey","comment":null,"name_alt":null,"lat_y":66.669359,"long_x":-18.251096,"region":"Europe","subregion":"Iceland","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-18.251088019916267,66.66937897343158]},"id":226},{"type":"Feature","properties":{"scalerank":5,"name":"Surtsey","comment":null,"name_alt":null,"lat_y":63.217764,"long_x":-20.434929,"region":"Europe","subregion":"Iceland","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-20.434803840228767,63.21771881718158]},"id":227},{"type":"Feature","properties":{"scalerank":5,"name":"Cap Est","comment":null,"name_alt":null,"lat_y":-15.274849,"long_x":50.499889,"region":"Africa","subregion":"Indian Ocean","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[50.49976647227123,-15.274956964068423]},"id":228},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Cretin","comment":null,"name_alt":null,"lat_y":-6.637492,"long_x":147.852392,"region":"Oceania","subregion":"Melanesia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[147.85242760508373,-6.637261651568423]},"id":229},{"type":"Feature","properties":{"scalerank":5,"name":"Îles Chesterfield","comment":null,"name_alt":null,"lat_y":-19.20447,"long_x":159.95171,"region":"Oceania","subregion":"Melanesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[159.95167076914623,-19.204644464068423]},"id":230},{"type":"Feature","properties":{"scalerank":5,"name":"Pagan","comment":null,"name_alt":null,"lat_y":18.119631,"long_x":145.785087,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[145.78492272227123,18.119635321087827]},"id":231},{"type":"Feature","properties":{"scalerank":5,"name":"Wake I.","comment":null,"name_alt":null,"lat_y":19.303497,"long_x":166.63626,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.63624108164623,19.303595282025327]},"id":232},{"type":"Feature","properties":{"scalerank":5,"name":"Tabiteuea","comment":null,"name_alt":null,"lat_y":-1.201405,"long_x":174.755207,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[174.75513756602123,-1.201348565630923]},"id":233},{"type":"Feature","properties":{"scalerank":5,"name":"Aranuka","comment":null,"name_alt":null,"lat_y":0.226766,"long_x":173.626286,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[173.62623131602123,0.226752020306577]},"id":234},{"type":"Feature","properties":{"scalerank":5,"name":"Nauru","comment":null,"name_alt":null,"lat_y":-0.505856,"long_x":166.930778,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.93067467539623,-0.505791925005923]},"id":235},{"type":"Feature","properties":{"scalerank":5,"name":"Ebon","comment":null,"name_alt":null,"lat_y":4.59977,"long_x":168.736432,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[168.73633873789623,4.599798895306577]},"id":236},{"type":"Feature","properties":{"scalerank":5,"name":"Jaluit","comment":null,"name_alt":null,"lat_y":5.964455,"long_x":169.682894,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[169.68299401133373,5.964483953900327]},"id":237},{"type":"Feature","properties":{"scalerank":5,"name":"Mili","comment":null,"name_alt":null,"lat_y":6.107334,"long_x":171.725875,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[171.72584069102123,6.107489324994077]},"id":238},{"type":"Feature","properties":{"scalerank":5,"name":"Majuro","comment":null,"name_alt":null,"lat_y":7.118009,"long_x":171.159743,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[171.15980065195873,7.117987371869077]},"id":239},{"type":"Feature","properties":{"scalerank":5,"name":"Ailinglapalap","comment":null,"name_alt":null,"lat_y":7.276392,"long_x":168.596926,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[168.59693444102123,7.276495672650327]},"id":240},{"type":"Feature","properties":{"scalerank":5,"name":"Kwajalein","comment":null,"name_alt":null,"lat_y":8.746619,"long_x":167.735072,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[167.73511803477123,8.746710516400327]},"id":241},{"type":"Feature","properties":{"scalerank":5,"name":"Rongelap","comment":null,"name_alt":null,"lat_y":11.164329,"long_x":166.869876,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.86988365977123,11.164496160931577]},"id":242},{"type":"Feature","properties":{"scalerank":5,"name":"Bikini","comment":null,"name_alt":null,"lat_y":11.639231,"long_x":165.550698,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[165.55042565195873,11.639288641400327]},"id":243},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Reinga","comment":null,"name_alt":null,"lat_y":-34.432767,"long_x":172.7285,"region":"Oceania","subregion":"New Zealand","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[172.70558117137455,-34.42039113947056]},"id":244},{"type":"Feature","properties":{"scalerank":5,"name":"Kanton","comment":null,"name_alt":null,"lat_y":-2.757106,"long_x":-171.71703,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-171.71703040272877,-2.757134698443423]},"id":245},{"type":"Feature","properties":{"scalerank":5,"name":"Tabuaeran","comment":null,"name_alt":"Fanning I.","lat_y":3.866545,"long_x":-159.326781,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-159.32683264882252,3.866705633587827]},"id":246},{"type":"Feature","properties":{"scalerank":5,"name":"Malden","comment":null,"name_alt":null,"lat_y":-4.042491,"long_x":-154.983478,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-154.98350989491627,-4.042657159380923]},"id":247},{"type":"Feature","properties":{"scalerank":5,"name":"Rarotonga","comment":null,"name_alt":null,"lat_y":-21.201867,"long_x":-159.797637,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-159.79771887929127,-21.201836846880923]},"id":248},{"type":"Feature","properties":{"scalerank":5,"name":"Rangiroa","comment":null,"name_alt":null,"lat_y":-15.2046,"long_x":-147.773967,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-147.77403723866627,-15.204766534380923]},"id":249},{"type":"Feature","properties":{"scalerank":5,"name":"Funafuti","comment":null,"name_alt":null,"lat_y":-8.491577,"long_x":179.19841,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[179.19837487070873,-8.491631768755923]},"id":250},{"type":"Feature","properties":{"scalerank":5,"name":"St. Croix","comment":null,"name_alt":null,"lat_y":17.762944,"long_x":-64.763088,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.76317298085377,17.763006903119077]},"id":251},{"type":"Feature","properties":{"scalerank":5,"name":"Grand Cayman","comment":null,"name_alt":null,"lat_y":19.315829,"long_x":-81.271416,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-81.27159583241627,19.315802313275327]},"id":252},{"type":"Feature","properties":{"scalerank":5,"name":"San Salvador","comment":null,"name_alt":null,"lat_y":24.052793,"long_x":-74.492848,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-74.49290930897877,24.052801824994077]},"id":253},{"type":"Feature","properties":{"scalerank":5,"name":"Grenada","comment":null,"name_alt":null,"lat_y":12.105978,"long_x":-61.723079,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.72319495351002,12.105963446087827]},"id":254},{"type":"Feature","properties":{"scalerank":5,"name":"Barbuda","comment":null,"name_alt":null,"lat_y":17.622525,"long_x":-61.789243,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.78929602772877,17.622626043744077]},"id":255},{"type":"Feature","properties":{"scalerank":5,"name":"Antigua","comment":null,"name_alt":null,"lat_y":17.040441,"long_x":-61.775982,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.77592932851002,17.040594793744077]},"id":256},{"type":"Feature","properties":{"scalerank":5,"name":"Guadeloupe","comment":null,"name_alt":null,"lat_y":16.180583,"long_x":-61.656947,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.65703284413502,16.180670477337827]},"id":257},{"type":"Feature","properties":{"scalerank":5,"name":"Dominica","comment":null,"name_alt":null,"lat_y":15.452943,"long_x":-61.352652,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.35271155507252,15.452887274212827]},"id":258},{"type":"Feature","properties":{"scalerank":5,"name":"Martinique","comment":null,"name_alt":null,"lat_y":14.672462,"long_x":-61.008715,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.00883948476002,14.672491766400327]},"id":259},{"type":"Feature","properties":{"scalerank":5,"name":"Saint Lucia","comment":null,"name_alt":null,"lat_y":13.918332,"long_x":-60.982225,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-60.98222815663502,13.918280340619077]},"id":260},{"type":"Feature","properties":{"scalerank":5,"name":"Saint Vincent","comment":null,"name_alt":null,"lat_y":13.270131,"long_x":-61.207143,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.20720374257252,13.270209051556577]},"id":261},{"type":"Feature","properties":{"scalerank":5,"name":"Barbados","comment":null,"name_alt":null,"lat_y":13.164326,"long_x":-59.566742,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-59.56682288319752,13.164252020306577]},"id":262},{"type":"Feature","properties":{"scalerank":5,"name":"Tobago","comment":null,"name_alt":null,"lat_y":11.259334,"long_x":-60.677992,"region":"South America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-60.67808997304127,11.259283758587827]},"id":263},{"type":"Feature","properties":{"scalerank":5,"name":"Margarita","comment":null,"name_alt":null,"lat_y":10.981467,"long_x":-64.051401,"region":"South America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.05144202382252,10.981512762494077]},"id":264},{"type":"Feature","properties":{"scalerank":5,"name":"Curaao","comment":null,"name_alt":null,"lat_y":12.185355,"long_x":-68.999109,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-68.99919593007252,12.185309149212827]},"id":265},{"type":"Feature","properties":{"scalerank":5,"name":"Aruba","comment":null,"name_alt":null,"lat_y":12.502849,"long_x":-69.96488,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-69.96501624257252,12.502752996869077]},"id":266},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Banäs","comment":null,"name_alt":null,"lat_y":23.950592,"long_x":35.778059,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.77808678477123,23.950628973431577]},"id":267},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta das Salinas","comment":null,"name_alt":null,"lat_y":-12.832908,"long_x":12.928991,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[12.968705086077254,-12.855718342716505]},"id":268},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta das Palmeirinhas","comment":null,"name_alt":null,"lat_y":-9.071387,"long_x":12.999549,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[13.033811372274608,-9.099938228394153]},"id":269},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Bojador","comment":null,"name_alt":null,"lat_y":26.157836,"long_x":-14.473111,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-14.473194953510017,26.157965399212827]},"id":270},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Comorin","comment":null,"name_alt":null,"lat_y":8.143554,"long_x":77.471497,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[77.51210506924555,8.085338515340696]},"id":271},{"type":"Feature","properties":{"scalerank":5,"name":"Dondra Head","comment":null,"name_alt":null,"lat_y":5.947528,"long_x":80.616321,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[80.59180925571331,5.929580617022318]},"id":272},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Yelizavety","comment":null,"name_alt":null,"lat_y":54.416083,"long_x":142.720445,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[142.72059166758373,54.41620514530658]},"id":273},{"type":"Feature","properties":{"scalerank":5,"name":"Pt. Yuzhnyy","comment":null,"name_alt":null,"lat_y":57.733572,"long_x":156.796426,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[156.79664147227123,57.73346588749408]},"id":274},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Sata","comment":null,"name_alt":null,"lat_y":31.026941,"long_x":130.695089,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[130.69520104258373,31.026922918744077]},"id":275},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Aniva","comment":null,"name_alt":null,"lat_y":46.081706,"long_x":143.43487,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[143.43482506602123,46.08179352421283]},"id":276},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Terpeniya","comment":null,"name_alt":null,"lat_y":48.66928,"long_x":144.712582,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[144.71253502695873,48.66937897343158]},"id":277},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Lopatka","comment":null,"name_alt":null,"lat_y":50.914155,"long_x":156.651536,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[156.65162194102123,50.91412994999408]},"id":278},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Ozernoy","comment":null,"name_alt":null,"lat_y":57.7708,"long_x":163.246685,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[163.24683678477123,57.77088043827533]},"id":279},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Olyutorskiy","comment":null,"name_alt":null,"lat_y":59.960807,"long_x":170.31265,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[170.31287682383373,59.96082184452533]},"id":280},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Navarin","comment":null,"name_alt":null,"lat_y":62.327239,"long_x":179.074225,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[179.07422936289623,62.32727692265033]},"id":281},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Lopatka","comment":null,"name_alt":null,"lat_y":71.907853,"long_x":150.066042,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[150.06592858164623,71.90778229374408]},"id":282},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Ince","comment":null,"name_alt":null,"lat_y":42.084312,"long_x":34.983358,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[34.98328698008373,42.08417389530658]},"id":283},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Fartak","comment":null,"name_alt":null,"lat_y":15.677412,"long_x":52.229105,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[52.2389696999939,15.65795249845498]},"id":284},{"type":"Feature","properties":{"scalerank":5,"name":"Ras Sharbatat","comment":null,"name_alt":null,"lat_y":18.164534,"long_x":56.56827,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[56.558165806017215,18.166986171245085]},"id":285},{"type":"Feature","properties":{"scalerank":5,"name":"Ra's al Had","comment":null,"name_alt":null,"lat_y":22.530158,"long_x":59.849134,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[59.7995168175437,22.518675327148298]},"id":286},{"type":"Feature","properties":{"scalerank":5,"name":"Hachijjima","comment":null,"name_alt":null,"lat_y":33.109796,"long_x":139.804903,"region":"Asia","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[139.80482018320873,33.10980866093158]},"id":287},{"type":"Feature","properties":{"scalerank":5,"name":"Nordkapp","comment":null,"name_alt":null,"lat_y":71.18337,"long_x":25.662398,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[25.66067519711473,71.15450206702127]},"id":288},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Vicentete","comment":null,"name_alt":null,"lat_y":37.038304,"long_x":-8.969391,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-8.969410773822517,37.03827545780658]},"id":289},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Fisterra","comment":null,"name_alt":null,"lat_y":42.952418,"long_x":-9.267837,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-9.26996282865152,42.92873605781255]},"id":290},{"type":"Feature","properties":{"scalerank":5,"name":"Cape San Blas","comment":null,"name_alt":null,"lat_y":29.713967,"long_x":-85.270961,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-85.27092444569752,29.713995672650327]},"id":291},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Sable","comment":null,"name_alt":null,"lat_y":43.469097,"long_x":-65.610769,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.61082923085377,43.46900055546283]},"id":292},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Bauld","comment":null,"name_alt":null,"lat_y":51.568576,"long_x":-55.430306,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-55.43028723866627,51.56848786015033]},"id":293},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Fear","comment":null,"name_alt":null,"lat_y":33.867949,"long_x":-77.990568,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-77.99058997304127,33.86798737186908]},"id":294},{"type":"Feature","properties":{"scalerank":5,"name":"I. Guadalupe","comment":null,"name_alt":null,"lat_y":29.052552,"long_x":-118.317465,"region":"Seven seas (open ocean)","subregion":"North Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-118.31749426991627,29.052496649212827]},"id":295},{"type":"Feature","properties":{"scalerank":5,"name":"Miquelon","comment":null,"name_alt":null,"lat_y":46.929526,"long_x":-56.329884,"region":"North America","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-56.32988440663502,46.92938873905658]},"id":296},{"type":"Feature","properties":{"scalerank":5,"name":"I. Robinson Crusoe","comment":null,"name_alt":null,"lat_y":-33.589852,"long_x":-78.872522,"region":"Seven seas (open ocean)","subregion":"South Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-78.87254798085377,-33.58965422969342]},"id":297},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Orange","comment":null,"name_alt":null,"lat_y":4.125735,"long_x":-51.242144,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-51.26287766987179,4.135614177285231]},"id":298},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de Santa Marta Grande","comment":null,"name_alt":null,"lat_y":-28.558078,"long_x":-48.735526,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-48.80338037734664,-28.57198267323537]},"id":299},{"type":"Feature","properties":{"scalerank":5,"name":"Punta del Este","comment":null,"name_alt":null,"lat_y":-34.975503,"long_x":-54.933154,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-54.94628769070382,-34.96658679840526]},"id":300},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo San Antonio","comment":null,"name_alt":null,"lat_y":-36.381052,"long_x":-56.655377,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-56.716792100626165,-36.40959917438929]},"id":301},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Corrientes","comment":null,"name_alt":null,"lat_y":-38.135985,"long_x":-57.546212,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-57.56252349612641,-38.066376942128464]},"id":302},{"type":"Feature","properties":{"scalerank":5,"name":"Punta Rasa","comment":null,"name_alt":null,"lat_y":-40.834718,"long_x":-62.282201,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-62.25911745789756,-40.72626411656719]},"id":303},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Dos Bahías","comment":null,"name_alt":null,"lat_y":-44.9887,"long_x":-65.615952,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.5438334451688,-44.89439847091873]},"id":304},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Delgado","comment":null,"name_alt":null,"lat_y":-10.670103,"long_x":40.624309,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[40.62440026133373,-10.670098565630923]},"id":305},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta da Barra","comment":null,"name_alt":null,"lat_y":-23.829888,"long_x":35.515696,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.51563561289623,-23.830010675005923]},"id":306},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta São Sebastio","comment":null,"name_alt":null,"lat_y":-22.118899,"long_x":35.480417,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.48023522227123,-22.118829034380923]},"id":307},{"type":"Feature","properties":{"scalerank":5,"name":"Ras Cantin","comment":null,"name_alt":null,"lat_y":32.581636,"long_x":-9.273918,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-9.273915168353767,32.58161041874408]},"id":308},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Kasr","comment":null,"name_alt":null,"lat_y":18.076817,"long_x":38.573746,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[38.58027735871919,18.075167704493374]},"id":309},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta de Jericoacoara","comment":null,"name_alt":null,"lat_y":-2.85044,"long_x":-40.067208,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-39.991649927946355,-2.851822991583529]},"id":310},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Roque","comment":null,"name_alt":null,"lat_y":-5.193476,"long_x":-35.447654,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-35.50994900651512,-5.156866121305913]},"id":311},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta da Baleia","comment":null,"name_alt":null,"lat_y":-17.710136,"long_x":-39.157619,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-39.14557867836578,-17.678753845220847]},"id":312},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Tomé","comment":null,"name_alt":null,"lat_y":-21.996382,"long_x":-41.009692,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-40.98763990313761,-21.971754611783773]},"id":313},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Frio","comment":null,"name_alt":null,"lat_y":-22.869501,"long_x":-41.962188,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-41.89015627474056,-22.759730815669258]},"id":314},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo San Diego","comment":null,"name_alt":null,"lat_y":-54.6406,"long_x":-65.21365,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.21361243397877,-54.64067962031842]},"id":315},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Tres Puntas","comment":null,"name_alt":null,"lat_y":-47.237629,"long_x":-65.774707,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.74439816328368,-47.328778975372465]},"id":316},{"type":"Feature","properties":{"scalerank":5,"name":"Cap Saint André","comment":null,"name_alt":null,"lat_y":-16.174457,"long_x":44.467405,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[44.46729576914623,-16.174493096880923]},"id":317},{"type":"Feature","properties":{"scalerank":5,"name":"Cape St. Lucia","comment":null,"name_alt":null,"lat_y":-28.552694,"long_x":32.367221,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[32.36732018320873,-28.552666925005923]},"id":318},{"type":"Feature","properties":{"scalerank":5,"name":"Cape St. Francis","comment":null,"name_alt":null,"lat_y":-34.171766,"long_x":24.817688,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[24.84143613032799,-34.18861022316314]},"id":319},{"type":"Feature","properties":{"scalerank":5,"name":"Minamitori-shima","comment":null,"name_alt":"Marcus I.","lat_y":24.319813,"long_x":153.958899,"region":"Seven seas (open ocean)","subregion":"North Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[153.95887291758373,24.319769598431577]},"id":320},{"type":"Feature","properties":{"scalerank":5,"name":"Is. Martin Vaz","comment":null,"name_alt":null,"lat_y":-20.559422,"long_x":-29.338439,"region":"Seven seas (open ocean)","subregion":"Southern Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-29.338429328510017,-20.559502862505923]},"id":321},{"type":"Feature","properties":{"scalerank":5,"name":"Rockall","comment":null,"name_alt":null,"lat_y":58.163524,"long_x":-12.408715,"region":"Seven seas (open ocean)","subregion":"North Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-12.408741828510017,58.16339752811908]},"id":322},{"type":"Feature","properties":{"scalerank":5,"name":"I. de Cozumel","comment":null,"name_alt":null,"lat_y":20.444687,"long_x":-86.880555,"region":"North America","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-86.88060462147877,20.444708563275327]},"id":323},{"type":"Feature","properties":{"scalerank":5,"name":"Bermuda Islands","comment":null,"name_alt":null,"lat_y":32.317339,"long_x":-64.742895,"region":"Seven seas (open ocean)","subregion":"North Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.74290930897877,32.31726715702533]},"id":324}]} \ No newline at end of file +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"scalerank":2,"name":"Niagara Falls","comment":null,"name_alt":null,"lat_y":43.087653,"long_x":-79.044073,"region":"North America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-79.04411780507252,43.08771393436908]},"id":163},{"type":"Feature","properties":{"scalerank":2,"name":"Salto Angel","comment":null,"name_alt":"Angel Falls","lat_y":5.686836,"long_x":-62.061848,"region":"South America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-62.06181800038502,5.686896063275327]},"id":164},{"type":"Feature","properties":{"scalerank":2,"name":"Iguazu Falls","comment":null,"name_alt":null,"lat_y":-25.568265,"long_x":-54.582842,"region":"South America","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[-54.58299719960377,-25.568291925005923]},"id":165},{"type":"Feature","properties":{"scalerank":3,"name":"Gees Gwardafuy","comment":null,"name_alt":null,"lat_y":11.812855,"long_x":51.235173,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[51.258313644180184,11.822028799226407]},"id":166},{"type":"Feature","properties":{"scalerank":3,"name":"Victoria Falls","comment":null,"name_alt":null,"lat_y":-17.77079,"long_x":25.460133,"region":"Africa","subregion":null,"featureclass":"waterfall"},"geometry":{"type":"Point","coordinates":[25.852793816021233,-17.928033135943423]},"id":167},{"type":"Feature","properties":{"scalerank":3,"name":"Wright I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-116.89262854726002,-74.06670501094342]},"id":168},{"type":"Feature","properties":{"scalerank":3,"name":"Grant I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-131.48540198476002,-74.48272063594342]},"id":169},{"type":"Feature","properties":{"scalerank":3,"name":"Newman I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-145.68681800038502,-75.59185149531842]},"id":170},{"type":"Feature","properties":{"scalerank":3,"name":"Dean I.","comment":null,"name_alt":null,"lat_y":-50.959168,"long_x":-72.995002,"region":"Antarctica","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-127.63438880116627,-74.50066497188092]},"id":171},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Canaveral","comment":null,"name_alt":null,"lat_y":28.483713,"long_x":-80.534941,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-80.53625603636821,28.473056814472134]},"id":172},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Mendocino","comment":null,"name_alt":null,"lat_y":40.350222,"long_x":-124.323474,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-124.39201745043425,40.44222065537283]},"id":173},{"type":"Feature","properties":{"scalerank":3,"name":"Cabo San Lucas","comment":null,"name_alt":null,"lat_y":22.887711,"long_x":-109.969843,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-109.96983801991627,22.887762762494077]},"id":174},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Churchill","comment":null,"name_alt":null,"lat_y":58.752014,"long_x":-93.182023,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-93.18211829335377,58.75208161015033]},"id":175},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Cod","comment":null,"name_alt":null,"lat_y":41.734867,"long_x":-69.964865,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-70.03687833567446,41.9914589934385]},"id":176},{"type":"Feature","properties":{"scalerank":3,"name":"Cape May","comment":null,"name_alt":null,"lat_y":37.2017,"long_x":-75.926791,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-74.95121933164988,38.92969645987068]},"id":177},{"type":"Feature","properties":{"scalerank":3,"name":"Cabo de Hornos","comment":null,"name_alt":"Cape Horn","lat_y":-55.862824,"long_x":-67.169425,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-67.16942298085377,-55.86284758906842]},"id":178},{"type":"Feature","properties":{"scalerank":3,"name":"Cape of Good Hope","comment":null,"name_alt":null,"lat_y":-34.307311,"long_x":18.441206,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[18.441294792583733,-34.30718352656842]},"id":179},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Palmas","comment":null,"name_alt":null,"lat_y":4.373924,"long_x":-7.457356,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-7.457386848041267,4.373968817181577]},"id":180},{"type":"Feature","properties":{"scalerank":3,"name":"Cape Verde","comment":null,"name_alt":null,"lat_y":14.732312,"long_x":-17.471776,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-17.471730109760017,14.732489324994077]},"id":181},{"type":"Feature","properties":{"scalerank":3,"name":"Cap Bon","comment":null,"name_alt":null,"lat_y":37.073954,"long_x":11.024061,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[11.024180534771233,37.07398102421283]},"id":182},{"type":"Feature","properties":{"scalerank":3,"name":"Oceanic pole of inaccessibility","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Seven seas (open ocean)","subregion":"South Pacific Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[-123.40202796132252,-48.86504485469342]},"id":183},{"type":"Feature","properties":{"scalerank":3,"name":"South Magnetic Pole 2005 (est)","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Antarctica","subregion":"Southern Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[137.85425865977123,-64.51824309688092]},"id":184},{"type":"Feature","properties":{"scalerank":3,"name":"North Magnetic Pole 2005 (est)","comment":null,"name_alt":null,"lat_y":-48.865032,"long_x":-123.401986,"region":"Seven seas (open ocean)","subregion":"Arctic Ocean","featureclass":"pole"},"geometry":{"type":"Point","coordinates":[-114.40569007069752,82.71008942265033]},"id":185},{"type":"Feature","properties":{"scalerank":4,"name":"Lands End","comment":null,"name_alt":null,"lat_y":50.069677,"long_x":-5.668629,"region":"Europe","subregion":"British Isles","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-5.668629523822517,50.06970856327533]},"id":186},{"type":"Feature","properties":{"scalerank":4,"name":"Cape York","comment":null,"name_alt":null,"lat_y":76.218919,"long_x":-68.218612,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-68.21861731679127,76.21887848515033]},"id":187},{"type":"Feature","properties":{"scalerank":4,"name":"Nunap Isua","comment":null,"name_alt":"Cape Farewell","lat_y":59.862583,"long_x":-43.90088,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-43.90080725819752,59.86267731327533]},"id":188},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Vohimena","comment":null,"name_alt":null,"lat_y":-25.546355,"long_x":45.158683,"region":"Africa","subregion":"Indian Ocean","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[45.15870201914623,-25.546319268755923]},"id":189},{"type":"Feature","properties":{"scalerank":4,"name":"Vavau","comment":null,"name_alt":null,"lat_y":-18.590062,"long_x":-173.976769,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-173.97673499257252,-18.590020440630923]},"id":190},{"type":"Feature","properties":{"scalerank":4,"name":"I. de Pascua","comment":null,"name_alt":"Easter I.","lat_y":-27.102117,"long_x":-109.367953,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-109.36790930897877,-27.102227471880923]},"id":191},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Agulhas","comment":null,"name_alt":null,"lat_y":-34.801182,"long_x":19.993472,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[19.993418816021233,-34.80108001094342]},"id":192},{"type":"Feature","properties":{"scalerank":4,"name":"Plain of Jars","comment":null,"name_alt":null,"lat_y":20.550709,"long_x":101.890532,"region":"Asia","subregion":null,"featureclass":"plain"},"geometry":{"type":"Point","coordinates":[101.89063561289623,20.550909735150327]},"id":193},{"type":"Feature","properties":{"scalerank":4,"name":"Cabo Corrientes","comment":null,"name_alt":null,"lat_y":20.409471,"long_x":-105.683581,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-105.67795873874799,20.420365114940253]},"id":194},{"type":"Feature","properties":{"scalerank":4,"name":"Pt. Eugenia","comment":null,"name_alt":null,"lat_y":27.861925,"long_x":-115.07629,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-115.04623945046137,27.842887092585283]},"id":195},{"type":"Feature","properties":{"scalerank":4,"name":"Point Conception","comment":null,"name_alt":null,"lat_y":34.582313,"long_x":-120.659016,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-120.46360036202867,34.46027592467621]},"id":196},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Hatteras","comment":null,"name_alt":null,"lat_y":35.437762,"long_x":-75.450543,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-75.54032952413311,35.24475263812895]},"id":197},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Sable","comment":null,"name_alt":null,"lat_y":25.124896,"long_x":-81.090442,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-81.09044348866627,25.124762274212827]},"id":198},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Hope","comment":null,"name_alt":null,"lat_y":68.35638,"long_x":-166.815582,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-166.81321268769543,68.35380207543972]},"id":199},{"type":"Feature","properties":{"scalerank":4,"name":"Point Barrow","comment":null,"name_alt":null,"lat_y":71.372637,"long_x":-156.615894,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-156.4719492091668,71.40589128763096]},"id":200},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Negra","comment":null,"name_alt":null,"lat_y":-5.948875,"long_x":-81.108252,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-81.10832678944752,-5.948663018755923]},"id":201},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Lavapié","comment":null,"name_alt":null,"lat_y":-37.262867,"long_x":-73.606377,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-73.60304396243782,-37.17120002933805]},"id":202},{"type":"Feature","properties":{"scalerank":4,"name":"Punta Galera","comment":null,"name_alt":null,"lat_y":0.731221,"long_x":-80.062205,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-80.06212317616627,0.731207586712827]},"id":203},{"type":"Feature","properties":{"scalerank":4,"name":"Cap Lopez","comment":null,"name_alt":null,"lat_y":-0.604761,"long_x":8.726423,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[8.727299789450319,-0.615086490513119]},"id":204},{"type":"Feature","properties":{"scalerank":4,"name":"Cape Bobaomby","comment":null,"name_alt":null,"lat_y":-11.966598,"long_x":49.262904,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[49.26282799570873,-11.966485284380923]},"id":205},{"type":"Feature","properties":{"scalerank":4,"name":"Cap Blanc","comment":null,"name_alt":null,"lat_y":20.822108,"long_x":-17.052856,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-17.052906867572517,20.822088934369077]},"id":206},{"type":"Feature","properties":{"scalerank":5,"name":"South West Cape","comment":null,"name_alt":null,"lat_y":-43.510984,"long_x":146.054227,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[146.03379804609568,-43.5404025683706]},"id":207},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Howe","comment":null,"name_alt":null,"lat_y":-37.488775,"long_x":149.95853,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[149.95838463633373,-37.48894622188092]},"id":208},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Otway","comment":null,"name_alt":null,"lat_y":-38.857622,"long_x":143.565403,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[143.537005108191,-38.85472383068997]},"id":209},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Jaffa","comment":null,"name_alt":null,"lat_y":-36.944244,"long_x":139.690866,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[139.68061977964746,-36.95624316107086]},"id":210},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Carnot","comment":null,"name_alt":null,"lat_y":-34.920233,"long_x":135.656027,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[135.65378326897053,-34.93870859313661]},"id":211},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Byron","comment":null,"name_alt":null,"lat_y":-28.658282,"long_x":153.632849,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[153.62799176015545,-28.66197417050363]},"id":212},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Manifold","comment":null,"name_alt":null,"lat_y":-22.702081,"long_x":150.811228,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[150.81116783945873,-22.702080987505923]},"id":213},{"type":"Feature","properties":{"scalerank":5,"name":"Cape York","comment":null,"name_alt":null,"lat_y":-10.710859,"long_x":142.522018,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[142.52173912852123,-10.710747979693423]},"id":214},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Melville","comment":null,"name_alt":null,"lat_y":-14.163629,"long_x":144.506417,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[144.50660240977123,-14.163506768755923]},"id":215},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Arnhem","comment":null,"name_alt":null,"lat_y":-12.337984,"long_x":136.952429,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[136.91481885262823,-12.295662864626316]},"id":216},{"type":"Feature","properties":{"scalerank":5,"name":"West Cape Howe","comment":null,"name_alt":null,"lat_y":-35.104301,"long_x":117.597011,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[117.59693444102123,-35.10430266719342]},"id":217},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Leeuwin","comment":null,"name_alt":null,"lat_y":-34.297841,"long_x":115.10633,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[115.1280088910596,-34.328007092559645]},"id":218},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Pasley","comment":null,"name_alt":null,"lat_y":-33.929054,"long_x":123.517283,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[123.51722252695873,-33.92888762813092]},"id":219},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Londonderry","comment":null,"name_alt":null,"lat_y":-13.713856,"long_x":126.964514,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[126.94130045687105,-13.74290642667802]},"id":220},{"type":"Feature","properties":{"scalerank":5,"name":"Steep Point","comment":null,"name_alt":null,"lat_y":-26.16822,"long_x":113.169959,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[113.14519563289093,-26.157463616878637]},"id":221},{"type":"Feature","properties":{"scalerank":5,"name":"North West Cape","comment":null,"name_alt":null,"lat_y":-21.809776,"long_x":114.117534,"region":"Oceania","subregion":"Australia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[114.16010761213809,-21.801474697071743]},"id":222},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Gracias a Dios","comment":null,"name_alt":null,"lat_y":14.994242,"long_x":-83.15866,"region":"North America","subregion":"Central America","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-83.15874182851002,14.994208074994077]},"id":223},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Brewster","comment":null,"name_alt":null,"lat_y":70.150754,"long_x":-22.122616,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-22.122731086322517,70.15088532108783]},"id":224},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Morris Jesup","comment":null,"name_alt":null,"lat_y":83.626331,"long_x":-32.491541,"region":"North America","subregion":"Greenland","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-32.49150550038502,83.62628815311908]},"id":225},{"type":"Feature","properties":{"scalerank":5,"name":"Grmsey","comment":null,"name_alt":null,"lat_y":66.669359,"long_x":-18.251096,"region":"Europe","subregion":"Iceland","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-18.251088019916267,66.66937897343158]},"id":226},{"type":"Feature","properties":{"scalerank":5,"name":"Surtsey","comment":null,"name_alt":null,"lat_y":63.217764,"long_x":-20.434929,"region":"Europe","subregion":"Iceland","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-20.434803840228767,63.21771881718158]},"id":227},{"type":"Feature","properties":{"scalerank":5,"name":"Cap Est","comment":null,"name_alt":null,"lat_y":-15.274849,"long_x":50.499889,"region":"Africa","subregion":"Indian Ocean","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[50.49976647227123,-15.274956964068423]},"id":228},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Cretin","comment":null,"name_alt":null,"lat_y":-6.637492,"long_x":147.852392,"region":"Oceania","subregion":"Melanesia","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[147.85242760508373,-6.637261651568423]},"id":229},{"type":"Feature","properties":{"scalerank":5,"name":"Îles Chesterfield","comment":null,"name_alt":null,"lat_y":-19.20447,"long_x":159.95171,"region":"Oceania","subregion":"Melanesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[159.95167076914623,-19.204644464068423]},"id":230},{"type":"Feature","properties":{"scalerank":5,"name":"Pagan","comment":null,"name_alt":null,"lat_y":18.119631,"long_x":145.785087,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[145.78492272227123,18.119635321087827]},"id":231},{"type":"Feature","properties":{"scalerank":5,"name":"Wake I.","comment":null,"name_alt":null,"lat_y":19.303497,"long_x":166.63626,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.63624108164623,19.303595282025327]},"id":232},{"type":"Feature","properties":{"scalerank":5,"name":"Tabiteuea","comment":null,"name_alt":null,"lat_y":-1.201405,"long_x":174.755207,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[174.75513756602123,-1.201348565630923]},"id":233},{"type":"Feature","properties":{"scalerank":5,"name":"Aranuka","comment":null,"name_alt":null,"lat_y":0.226766,"long_x":173.626286,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[173.62623131602123,0.226752020306577]},"id":234},{"type":"Feature","properties":{"scalerank":5,"name":"Nauru","comment":null,"name_alt":null,"lat_y":-0.505856,"long_x":166.930778,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.93067467539623,-0.505791925005923]},"id":235},{"type":"Feature","properties":{"scalerank":5,"name":"Ebon","comment":null,"name_alt":null,"lat_y":4.59977,"long_x":168.736432,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[168.73633873789623,4.599798895306577]},"id":236},{"type":"Feature","properties":{"scalerank":5,"name":"Jaluit","comment":null,"name_alt":null,"lat_y":5.964455,"long_x":169.682894,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[169.68299401133373,5.964483953900327]},"id":237},{"type":"Feature","properties":{"scalerank":5,"name":"Mili","comment":null,"name_alt":null,"lat_y":6.107334,"long_x":171.725875,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[171.72584069102123,6.107489324994077]},"id":238},{"type":"Feature","properties":{"scalerank":5,"name":"Majuro","comment":null,"name_alt":null,"lat_y":7.118009,"long_x":171.159743,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[171.15980065195873,7.117987371869077]},"id":239},{"type":"Feature","properties":{"scalerank":5,"name":"Ailinglapalap","comment":null,"name_alt":null,"lat_y":7.276392,"long_x":168.596926,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[168.59693444102123,7.276495672650327]},"id":240},{"type":"Feature","properties":{"scalerank":5,"name":"Kwajalein","comment":null,"name_alt":null,"lat_y":8.746619,"long_x":167.735072,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[167.73511803477123,8.746710516400327]},"id":241},{"type":"Feature","properties":{"scalerank":5,"name":"Rongelap","comment":null,"name_alt":null,"lat_y":11.164329,"long_x":166.869876,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[166.86988365977123,11.164496160931577]},"id":242},{"type":"Feature","properties":{"scalerank":5,"name":"Bikini","comment":null,"name_alt":null,"lat_y":11.639231,"long_x":165.550698,"region":"Oceania","subregion":"Micronesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[165.55042565195873,11.639288641400327]},"id":243},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Reinga","comment":null,"name_alt":null,"lat_y":-34.432767,"long_x":172.7285,"region":"Oceania","subregion":"New Zealand","featureclass":"cape"},"geometry":{"type":"Point","coordinates":[172.70558117137455,-34.42039113947056]},"id":244},{"type":"Feature","properties":{"scalerank":5,"name":"Kanton","comment":null,"name_alt":null,"lat_y":-2.757106,"long_x":-171.71703,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-171.71703040272877,-2.757134698443423]},"id":245},{"type":"Feature","properties":{"scalerank":5,"name":"Tabuaeran","comment":null,"name_alt":"Fanning I.","lat_y":3.866545,"long_x":-159.326781,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-159.32683264882252,3.866705633587827]},"id":246},{"type":"Feature","properties":{"scalerank":5,"name":"Malden","comment":null,"name_alt":null,"lat_y":-4.042491,"long_x":-154.983478,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-154.98350989491627,-4.042657159380923]},"id":247},{"type":"Feature","properties":{"scalerank":5,"name":"Rarotonga","comment":null,"name_alt":null,"lat_y":-21.201867,"long_x":-159.797637,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-159.79771887929127,-21.201836846880923]},"id":248},{"type":"Feature","properties":{"scalerank":5,"name":"Rangiroa","comment":null,"name_alt":null,"lat_y":-15.2046,"long_x":-147.773967,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-147.77403723866627,-15.204766534380923]},"id":249},{"type":"Feature","properties":{"scalerank":5,"name":"Funafuti","comment":null,"name_alt":null,"lat_y":-8.491577,"long_x":179.19841,"region":"Oceania","subregion":"Polynesia","featureclass":"island"},"geometry":{"type":"Point","coordinates":[179.19837487070873,-8.491631768755923]},"id":250},{"type":"Feature","properties":{"scalerank":5,"name":"St. Croix","comment":null,"name_alt":null,"lat_y":17.762944,"long_x":-64.763088,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.76317298085377,17.763006903119077]},"id":251},{"type":"Feature","properties":{"scalerank":5,"name":"Grand Cayman","comment":null,"name_alt":null,"lat_y":19.315829,"long_x":-81.271416,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-81.27159583241627,19.315802313275327]},"id":252},{"type":"Feature","properties":{"scalerank":5,"name":"San Salvador","comment":null,"name_alt":null,"lat_y":24.052793,"long_x":-74.492848,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-74.49290930897877,24.052801824994077]},"id":253},{"type":"Feature","properties":{"scalerank":5,"name":"Grenada","comment":null,"name_alt":null,"lat_y":12.105978,"long_x":-61.723079,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.72319495351002,12.105963446087827]},"id":254},{"type":"Feature","properties":{"scalerank":5,"name":"Barbuda","comment":null,"name_alt":null,"lat_y":17.622525,"long_x":-61.789243,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.78929602772877,17.622626043744077]},"id":255},{"type":"Feature","properties":{"scalerank":5,"name":"Antigua","comment":null,"name_alt":null,"lat_y":17.040441,"long_x":-61.775982,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.77592932851002,17.040594793744077]},"id":256},{"type":"Feature","properties":{"scalerank":5,"name":"Guadeloupe","comment":null,"name_alt":null,"lat_y":16.180583,"long_x":-61.656947,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.65703284413502,16.180670477337827]},"id":257},{"type":"Feature","properties":{"scalerank":5,"name":"Dominica","comment":null,"name_alt":null,"lat_y":15.452943,"long_x":-61.352652,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.35271155507252,15.452887274212827]},"id":258},{"type":"Feature","properties":{"scalerank":5,"name":"Martinique","comment":null,"name_alt":null,"lat_y":14.672462,"long_x":-61.008715,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.00883948476002,14.672491766400327]},"id":259},{"type":"Feature","properties":{"scalerank":5,"name":"Saint Lucia","comment":null,"name_alt":null,"lat_y":13.918332,"long_x":-60.982225,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-60.98222815663502,13.918280340619077]},"id":260},{"type":"Feature","properties":{"scalerank":5,"name":"Saint Vincent","comment":null,"name_alt":null,"lat_y":13.270131,"long_x":-61.207143,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-61.20720374257252,13.270209051556577]},"id":261},{"type":"Feature","properties":{"scalerank":5,"name":"Barbados","comment":null,"name_alt":null,"lat_y":13.164326,"long_x":-59.566742,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-59.56682288319752,13.164252020306577]},"id":262},{"type":"Feature","properties":{"scalerank":5,"name":"Tobago","comment":null,"name_alt":null,"lat_y":11.259334,"long_x":-60.677992,"region":"South America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-60.67808997304127,11.259283758587827]},"id":263},{"type":"Feature","properties":{"scalerank":5,"name":"Margarita","comment":null,"name_alt":null,"lat_y":10.981467,"long_x":-64.051401,"region":"South America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.05144202382252,10.981512762494077]},"id":264},{"type":"Feature","properties":{"scalerank":5,"name":"Curaao","comment":null,"name_alt":null,"lat_y":12.185355,"long_x":-68.999109,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-68.99919593007252,12.185309149212827]},"id":265},{"type":"Feature","properties":{"scalerank":5,"name":"Aruba","comment":null,"name_alt":null,"lat_y":12.502849,"long_x":-69.96488,"region":"North America","subregion":"West Indies","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-69.96501624257252,12.502752996869077]},"id":266},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Banäs","comment":null,"name_alt":null,"lat_y":23.950592,"long_x":35.778059,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.77808678477123,23.950628973431577]},"id":267},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta das Salinas","comment":null,"name_alt":null,"lat_y":-12.832908,"long_x":12.928991,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[12.968705086077254,-12.855718342716505]},"id":268},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta das Palmeirinhas","comment":null,"name_alt":null,"lat_y":-9.071387,"long_x":12.999549,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[13.033811372274608,-9.099938228394153]},"id":269},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Bojador","comment":null,"name_alt":null,"lat_y":26.157836,"long_x":-14.473111,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-14.473194953510017,26.157965399212827]},"id":270},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Comorin","comment":null,"name_alt":null,"lat_y":8.143554,"long_x":77.471497,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[77.51210506924555,8.085338515340696]},"id":271},{"type":"Feature","properties":{"scalerank":5,"name":"Dondra Head","comment":null,"name_alt":null,"lat_y":5.947528,"long_x":80.616321,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[80.59180925571331,5.929580617022318]},"id":272},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Yelizavety","comment":null,"name_alt":null,"lat_y":54.416083,"long_x":142.720445,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[142.72059166758373,54.41620514530658]},"id":273},{"type":"Feature","properties":{"scalerank":5,"name":"Pt. Yuzhnyy","comment":null,"name_alt":null,"lat_y":57.733572,"long_x":156.796426,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[156.79664147227123,57.73346588749408]},"id":274},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Sata","comment":null,"name_alt":null,"lat_y":31.026941,"long_x":130.695089,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[130.69520104258373,31.026922918744077]},"id":275},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Aniva","comment":null,"name_alt":null,"lat_y":46.081706,"long_x":143.43487,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[143.43482506602123,46.08179352421283]},"id":276},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Terpeniya","comment":null,"name_alt":null,"lat_y":48.66928,"long_x":144.712582,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[144.71253502695873,48.66937897343158]},"id":277},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Lopatka","comment":null,"name_alt":null,"lat_y":50.914155,"long_x":156.651536,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[156.65162194102123,50.91412994999408]},"id":278},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Ozernoy","comment":null,"name_alt":null,"lat_y":57.7708,"long_x":163.246685,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[163.24683678477123,57.77088043827533]},"id":279},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Olyutorskiy","comment":null,"name_alt":null,"lat_y":59.960807,"long_x":170.31265,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[170.31287682383373,59.96082184452533]},"id":280},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Navarin","comment":null,"name_alt":null,"lat_y":62.327239,"long_x":179.074225,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[179.07422936289623,62.32727692265033]},"id":281},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Lopatka","comment":null,"name_alt":null,"lat_y":71.907853,"long_x":150.066042,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[150.06592858164623,71.90778229374408]},"id":282},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Ince","comment":null,"name_alt":null,"lat_y":42.084312,"long_x":34.983358,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[34.98328698008373,42.08417389530658]},"id":283},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Fartak","comment":null,"name_alt":null,"lat_y":15.677412,"long_x":52.229105,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[52.2389696999939,15.65795249845498]},"id":284},{"type":"Feature","properties":{"scalerank":5,"name":"Ras Sharbatat","comment":null,"name_alt":null,"lat_y":18.164534,"long_x":56.56827,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[56.558165806017215,18.166986171245085]},"id":285},{"type":"Feature","properties":{"scalerank":5,"name":"Ra's al Had","comment":null,"name_alt":null,"lat_y":22.530158,"long_x":59.849134,"region":"Asia","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[59.7995168175437,22.518675327148298]},"id":286},{"type":"Feature","properties":{"scalerank":5,"name":"Hachijjima","comment":null,"name_alt":null,"lat_y":33.109796,"long_x":139.804903,"region":"Asia","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[139.80482018320873,33.10980866093158]},"id":287},{"type":"Feature","properties":{"scalerank":5,"name":"Nordkapp","comment":null,"name_alt":null,"lat_y":71.18337,"long_x":25.662398,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[25.66067519711473,71.15450206702127]},"id":288},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Vicentete","comment":null,"name_alt":null,"lat_y":37.038304,"long_x":-8.969391,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-8.969410773822517,37.03827545780658]},"id":289},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Fisterra","comment":null,"name_alt":null,"lat_y":42.952418,"long_x":-9.267837,"region":"Europe","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-9.26996282865152,42.92873605781255]},"id":290},{"type":"Feature","properties":{"scalerank":5,"name":"Cape San Blas","comment":null,"name_alt":null,"lat_y":29.713967,"long_x":-85.270961,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-85.27092444569752,29.713995672650327]},"id":291},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Sable","comment":null,"name_alt":null,"lat_y":43.469097,"long_x":-65.610769,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.61082923085377,43.46900055546283]},"id":292},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Bauld","comment":null,"name_alt":null,"lat_y":51.568576,"long_x":-55.430306,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-55.43028723866627,51.56848786015033]},"id":293},{"type":"Feature","properties":{"scalerank":5,"name":"Cape Fear","comment":null,"name_alt":null,"lat_y":33.867949,"long_x":-77.990568,"region":"North America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-77.99058997304127,33.86798737186908]},"id":294},{"type":"Feature","properties":{"scalerank":5,"name":"I. Guadalupe","comment":null,"name_alt":null,"lat_y":29.052552,"long_x":-118.317465,"region":"Seven seas (open ocean)","subregion":"North Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-118.31749426991627,29.052496649212827]},"id":295},{"type":"Feature","properties":{"scalerank":5,"name":"Miquelon","comment":null,"name_alt":null,"lat_y":46.929526,"long_x":-56.329884,"region":"North America","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-56.32988440663502,46.92938873905658]},"id":296},{"type":"Feature","properties":{"scalerank":5,"name":"I. Robinson Crusoe","comment":null,"name_alt":null,"lat_y":-33.589852,"long_x":-78.872522,"region":"Seven seas (open ocean)","subregion":"South Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-78.87254798085377,-33.58965422969342]},"id":297},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Orange","comment":null,"name_alt":null,"lat_y":4.125735,"long_x":-51.242144,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-51.26287766987179,4.135614177285231]},"id":298},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de Santa Marta Grande","comment":null,"name_alt":null,"lat_y":-28.558078,"long_x":-48.735526,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-48.80338037734664,-28.57198267323537]},"id":299},{"type":"Feature","properties":{"scalerank":5,"name":"Punta del Este","comment":null,"name_alt":null,"lat_y":-34.975503,"long_x":-54.933154,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-54.94628769070382,-34.96658679840526]},"id":300},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo San Antonio","comment":null,"name_alt":null,"lat_y":-36.381052,"long_x":-56.655377,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-56.716792100626165,-36.40959917438929]},"id":301},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Corrientes","comment":null,"name_alt":null,"lat_y":-38.135985,"long_x":-57.546212,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-57.56252349612641,-38.066376942128464]},"id":302},{"type":"Feature","properties":{"scalerank":5,"name":"Punta Rasa","comment":null,"name_alt":null,"lat_y":-40.834718,"long_x":-62.282201,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-62.25911745789756,-40.72626411656719]},"id":303},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Dos Bahías","comment":null,"name_alt":null,"lat_y":-44.9887,"long_x":-65.615952,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.5438334451688,-44.89439847091873]},"id":304},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Delgado","comment":null,"name_alt":null,"lat_y":-10.670103,"long_x":40.624309,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[40.62440026133373,-10.670098565630923]},"id":305},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta da Barra","comment":null,"name_alt":null,"lat_y":-23.829888,"long_x":35.515696,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.51563561289623,-23.830010675005923]},"id":306},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta São Sebastio","comment":null,"name_alt":null,"lat_y":-22.118899,"long_x":35.480417,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[35.48023522227123,-22.118829034380923]},"id":307},{"type":"Feature","properties":{"scalerank":5,"name":"Ras Cantin","comment":null,"name_alt":null,"lat_y":32.581636,"long_x":-9.273918,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-9.273915168353767,32.58161041874408]},"id":308},{"type":"Feature","properties":{"scalerank":5,"name":"Ra’s Kasr","comment":null,"name_alt":null,"lat_y":18.076817,"long_x":38.573746,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[38.58027735871919,18.075167704493374]},"id":309},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta de Jericoacoara","comment":null,"name_alt":null,"lat_y":-2.85044,"long_x":-40.067208,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-39.991649927946355,-2.851822991583529]},"id":310},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Roque","comment":null,"name_alt":null,"lat_y":-5.193476,"long_x":-35.447654,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-35.50994900651512,-5.156866121305913]},"id":311},{"type":"Feature","properties":{"scalerank":5,"name":"Ponta da Baleia","comment":null,"name_alt":null,"lat_y":-17.710136,"long_x":-39.157619,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-39.14557867836578,-17.678753845220847]},"id":312},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo de São Tomé","comment":null,"name_alt":null,"lat_y":-21.996382,"long_x":-41.009692,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-40.98763990313761,-21.971754611783773]},"id":313},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Frio","comment":null,"name_alt":null,"lat_y":-22.869501,"long_x":-41.962188,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-41.89015627474056,-22.759730815669258]},"id":314},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo San Diego","comment":null,"name_alt":null,"lat_y":-54.6406,"long_x":-65.21365,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.21361243397877,-54.64067962031842]},"id":315},{"type":"Feature","properties":{"scalerank":5,"name":"Cabo Tres Puntas","comment":null,"name_alt":null,"lat_y":-47.237629,"long_x":-65.774707,"region":"South America","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[-65.74439816328368,-47.328778975372465]},"id":316},{"type":"Feature","properties":{"scalerank":5,"name":"Cap Saint André","comment":null,"name_alt":null,"lat_y":-16.174457,"long_x":44.467405,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[44.46729576914623,-16.174493096880923]},"id":317},{"type":"Feature","properties":{"scalerank":5,"name":"Cape St. Lucia","comment":null,"name_alt":null,"lat_y":-28.552694,"long_x":32.367221,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[32.36732018320873,-28.552666925005923]},"id":318},{"type":"Feature","properties":{"scalerank":5,"name":"Cape St. Francis","comment":null,"name_alt":null,"lat_y":-34.171766,"long_x":24.817688,"region":"Africa","subregion":null,"featureclass":"cape"},"geometry":{"type":"Point","coordinates":[24.84143613032799,-34.18861022316314]},"id":319},{"type":"Feature","properties":{"scalerank":5,"name":"Minamitori-shima","comment":null,"name_alt":"Marcus I.","lat_y":24.319813,"long_x":153.958899,"region":"Seven seas (open ocean)","subregion":"North Pacific Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[153.95887291758373,24.319769598431577]},"id":320},{"type":"Feature","properties":{"scalerank":5,"name":"Is. Martin Vaz","comment":null,"name_alt":null,"lat_y":-20.559422,"long_x":-29.338439,"region":"Seven seas (open ocean)","subregion":"Southern Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-29.338429328510017,-20.559502862505923]},"id":321},{"type":"Feature","properties":{"scalerank":5,"name":"Rockall","comment":null,"name_alt":null,"lat_y":58.163524,"long_x":-12.408715,"region":"Seven seas (open ocean)","subregion":"North Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-12.408741828510017,58.16339752811908]},"id":322},{"type":"Feature","properties":{"scalerank":5,"name":"I. de Cozumel","comment":null,"name_alt":null,"lat_y":20.444687,"long_x":-86.880555,"region":"North America","subregion":null,"featureclass":"island"},"geometry":{"type":"Point","coordinates":[-86.88060462147877,20.444708563275327]},"id":323},{"type":"Feature","properties":{"scalerank":5,"name":"Bermuda Islands","comment":null,"name_alt":null,"lat_y":32.317339,"long_x":-64.742895,"region":"Seven seas (open ocean)","subregion":"North Atlantic Ocean","featureclass":"island"},"geometry":{"type":"Point","coordinates":[-64.74290930897877,32.31726715702533]},"id":324}]} diff --git a/metrics/integration/expression-tests/index-of/assert-array/test.json b/metrics/integration/expression-tests/index-of/assert-array/test.json index b492401698e1..698743ccbc6c 100644 --- a/metrics/integration/expression-tests/index-of/assert-array/test.json +++ b/metrics/integration/expression-tests/index-of/assert-array/test.json @@ -23,4 +23,4 @@ {"error": "Expected value to be of type array, but found null instead."} ] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/index-of/assert-string/test.json b/metrics/integration/expression-tests/index-of/assert-string/test.json index 60d64417df9a..0add8e9b5530 100644 --- a/metrics/integration/expression-tests/index-of/assert-string/test.json +++ b/metrics/integration/expression-tests/index-of/assert-string/test.json @@ -21,4 +21,4 @@ {"error": "Expected value to be of type string, but found null instead."} ] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/index-of/basic-string/test.json b/metrics/integration/expression-tests/index-of/basic-string/test.json index 7cb787ea4856..2f0e1eef9c2f 100644 --- a/metrics/integration/expression-tests/index-of/basic-string/test.json +++ b/metrics/integration/expression-tests/index-of/basic-string/test.json @@ -29,4 +29,4 @@ } ] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/index-of/invalid-haystack/test.json b/metrics/integration/expression-tests/index-of/invalid-haystack/test.json index 5b8e56398fd5..a20ab807748b 100644 --- a/metrics/integration/expression-tests/index-of/invalid-haystack/test.json +++ b/metrics/integration/expression-tests/index-of/invalid-haystack/test.json @@ -25,4 +25,4 @@ } ] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/index-of/invalid-needle/test.json b/metrics/integration/expression-tests/index-of/invalid-needle/test.json index 1385a7092af9..4fb3b8416ea8 100644 --- a/metrics/integration/expression-tests/index-of/invalid-needle/test.json +++ b/metrics/integration/expression-tests/index-of/invalid-needle/test.json @@ -22,4 +22,4 @@ ] } } - \ No newline at end of file + diff --git a/metrics/integration/expression-tests/index-of/with-from-index/test.json b/metrics/integration/expression-tests/index-of/with-from-index/test.json index 6351cb238be2..b9f2c05087c0 100644 --- a/metrics/integration/expression-tests/index-of/with-from-index/test.json +++ b/metrics/integration/expression-tests/index-of/with-from-index/test.json @@ -48,4 +48,4 @@ ] } } - \ No newline at end of file + diff --git a/metrics/integration/expression-tests/slice/array-one-index/test.json b/metrics/integration/expression-tests/slice/array-one-index/test.json index bb71d7130d3e..138d7ee9ec57 100644 --- a/metrics/integration/expression-tests/slice/array-one-index/test.json +++ b/metrics/integration/expression-tests/slice/array-one-index/test.json @@ -16,4 +16,4 @@ }, "outputs": [[3, 4, 5], [1, 2, 3, 4, 5], [], [4, 5]] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/slice/array-two-indexes/test.json b/metrics/integration/expression-tests/slice/array-two-indexes/test.json index cbf65d324f3e..5b6173005ce5 100644 --- a/metrics/integration/expression-tests/slice/array-two-indexes/test.json +++ b/metrics/integration/expression-tests/slice/array-two-indexes/test.json @@ -28,4 +28,4 @@ }, "outputs": [[3, 4], [2, 3, 4, 5], [2, 3, 4, 5], [2, 3], [1, 2, 3, 4], []] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/slice/invalid-inputs/test.json b/metrics/integration/expression-tests/slice/invalid-inputs/test.json index 020c765714a2..3f428ecec300 100644 --- a/metrics/integration/expression-tests/slice/invalid-inputs/test.json +++ b/metrics/integration/expression-tests/slice/invalid-inputs/test.json @@ -37,4 +37,4 @@ } ] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/slice/string-one-index/test.json b/metrics/integration/expression-tests/slice/string-one-index/test.json index cb14b972c9b8..2d64fa71ccf1 100644 --- a/metrics/integration/expression-tests/slice/string-one-index/test.json +++ b/metrics/integration/expression-tests/slice/string-one-index/test.json @@ -16,4 +16,4 @@ }, "outputs": ["0123456789", "456789", "", "89"] } - } \ No newline at end of file + } diff --git a/metrics/integration/expression-tests/slice/string-two-indexes/test.json b/metrics/integration/expression-tests/slice/string-two-indexes/test.json index 0af5bd258d8d..3df97fcdf182 100644 --- a/metrics/integration/expression-tests/slice/string-two-indexes/test.json +++ b/metrics/integration/expression-tests/slice/string-two-indexes/test.json @@ -17,4 +17,4 @@ }, "outputs": ["1234567", "4567", "78", "012345678", "0123456789"] } - } \ No newline at end of file + } diff --git a/metrics/integration/geojson/anchors.json b/metrics/integration/geojson/anchors.json index 8a8840cb78fa..71f8b7562aa6 100644 --- a/metrics/integration/geojson/anchors.json +++ b/metrics/integration/geojson/anchors.json @@ -82,4 +82,4 @@ "coordinates": [ -20, 15 ] } }] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-map/expected.json b/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-map/expected.json index 7ea210cebb91..2365587406f4 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-map/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-map/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-viewport/expected.json b/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-viewport/expected.json index 7ea210cebb91..2365587406f4 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-viewport/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/map-inside-align-viewport/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-map/expected.json b/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-map/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-map/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-map/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-viewport/expected.json b/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-viewport/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-viewport/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/map-outside-align-viewport/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-map/expected.json b/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-map/expected.json index 7ea210cebb91..2365587406f4 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-map/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-map/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-viewport/expected.json b/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-viewport/expected.json index 7ea210cebb91..2365587406f4 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-viewport/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/viewport-inside-align-viewport/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-map/expected.json b/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-map/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-map/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-map/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-viewport/expected.json b/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-viewport/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-viewport/expected.json +++ b/metrics/integration/query-tests/circle-pitch-scale/viewport-outside-align-viewport/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-radius-features-in/inside/expected.json b/metrics/integration/query-tests/circle-radius-features-in/inside/expected.json index 9539d0b183a9..8f4f2a5cfd9b 100644 --- a/metrics/integration/query-tests/circle-radius-features-in/inside/expected.json +++ b/metrics/integration/query-tests/circle-radius-features-in/inside/expected.json @@ -87,4 +87,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-radius-features-in/inside/style.json b/metrics/integration/query-tests/circle-radius-features-in/inside/style.json index 97282ea18a5d..ebdc5c85107b 100644 --- a/metrics/integration/query-tests/circle-radius-features-in/inside/style.json +++ b/metrics/integration/query-tests/circle-radius-features-in/inside/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-radius-features-in/outside/expected.json b/metrics/integration/query-tests/circle-radius-features-in/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-radius-features-in/outside/expected.json +++ b/metrics/integration/query-tests/circle-radius-features-in/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-radius-features-in/outside/style.json b/metrics/integration/query-tests/circle-radius-features-in/outside/style.json index d66b712f7699..26c0bd93e876 100644 --- a/metrics/integration/query-tests/circle-radius-features-in/outside/style.json +++ b/metrics/integration/query-tests/circle-radius-features-in/outside/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-radius/feature-state/expected.json b/metrics/integration/query-tests/circle-radius/feature-state/expected.json index b35900c5e725..743db2624504 100644 --- a/metrics/integration/query-tests/circle-radius/feature-state/expected.json +++ b/metrics/integration/query-tests/circle-radius/feature-state/expected.json @@ -10,4 +10,4 @@ "source": "mapbox", "state": { "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-radius/feature-state/style.json b/metrics/integration/query-tests/circle-radius/feature-state/style.json index 45881d1bf2b1..a0530da3246f 100644 --- a/metrics/integration/query-tests/circle-radius/feature-state/style.json +++ b/metrics/integration/query-tests/circle-radius/feature-state/style.json @@ -69,4 +69,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-radius/inside/expected.json b/metrics/integration/query-tests/circle-radius/inside/expected.json index 9539d0b183a9..8f4f2a5cfd9b 100644 --- a/metrics/integration/query-tests/circle-radius/inside/expected.json +++ b/metrics/integration/query-tests/circle-radius/inside/expected.json @@ -87,4 +87,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-radius/inside/style.json b/metrics/integration/query-tests/circle-radius/inside/style.json index 2c73321b56e3..b39ae77b5ad5 100644 --- a/metrics/integration/query-tests/circle-radius/inside/style.json +++ b/metrics/integration/query-tests/circle-radius/inside/style.json @@ -35,4 +35,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-radius/outside/expected.json b/metrics/integration/query-tests/circle-radius/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-radius/outside/expected.json +++ b/metrics/integration/query-tests/circle-radius/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-radius/outside/style.json b/metrics/integration/query-tests/circle-radius/outside/style.json index e640eb83f311..e8da8279b9bb 100644 --- a/metrics/integration/query-tests/circle-radius/outside/style.json +++ b/metrics/integration/query-tests/circle-radius/outside/style.json @@ -35,4 +35,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-radius/property-function/expected.json b/metrics/integration/query-tests/circle-radius/property-function/expected.json index 78cdaddf9e1c..7a64c72ec06a 100644 --- a/metrics/integration/query-tests/circle-radius/property-function/expected.json +++ b/metrics/integration/query-tests/circle-radius/property-function/expected.json @@ -14,4 +14,4 @@ "source": "mapbox", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-radius/tile-boundary/expected.json b/metrics/integration/query-tests/circle-radius/tile-boundary/expected.json index 7ea210cebb91..2365587406f4 100644 --- a/metrics/integration/query-tests/circle-radius/tile-boundary/expected.json +++ b/metrics/integration/query-tests/circle-radius/tile-boundary/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-radius/zoom-and-property-function/expected.json b/metrics/integration/query-tests/circle-radius/zoom-and-property-function/expected.json index 78cdaddf9e1c..7a64c72ec06a 100644 --- a/metrics/integration/query-tests/circle-radius/zoom-and-property-function/expected.json +++ b/metrics/integration/query-tests/circle-radius/zoom-and-property-function/expected.json @@ -14,4 +14,4 @@ "source": "mapbox", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-stroke-width/feature-state/expected.json b/metrics/integration/query-tests/circle-stroke-width/feature-state/expected.json index b35900c5e725..743db2624504 100644 --- a/metrics/integration/query-tests/circle-stroke-width/feature-state/expected.json +++ b/metrics/integration/query-tests/circle-stroke-width/feature-state/expected.json @@ -10,4 +10,4 @@ "source": "mapbox", "state": { "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-stroke-width/feature-state/style.json b/metrics/integration/query-tests/circle-stroke-width/feature-state/style.json index a9bebb96ea4e..8d17da17c081 100644 --- a/metrics/integration/query-tests/circle-stroke-width/feature-state/style.json +++ b/metrics/integration/query-tests/circle-stroke-width/feature-state/style.json @@ -70,4 +70,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-stroke-width/inside/expected.json b/metrics/integration/query-tests/circle-stroke-width/inside/expected.json index 5387f9c03178..0ecc3430b969 100644 --- a/metrics/integration/query-tests/circle-stroke-width/inside/expected.json +++ b/metrics/integration/query-tests/circle-stroke-width/inside/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-stroke-width/outside/expected.json b/metrics/integration/query-tests/circle-stroke-width/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-stroke-width/outside/expected.json +++ b/metrics/integration/query-tests/circle-stroke-width/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-translate-anchor/map/expected.json b/metrics/integration/query-tests/circle-translate-anchor/map/expected.json index 5ae714dbf93e..dbee9b88af26 100644 --- a/metrics/integration/query-tests/circle-translate-anchor/map/expected.json +++ b/metrics/integration/query-tests/circle-translate-anchor/map/expected.json @@ -67,4 +67,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-translate-anchor/map/style.json b/metrics/integration/query-tests/circle-translate-anchor/map/style.json index 2a0dc187f863..db327411875d 100644 --- a/metrics/integration/query-tests/circle-translate-anchor/map/style.json +++ b/metrics/integration/query-tests/circle-translate-anchor/map/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-translate-anchor/viewport/expected.json b/metrics/integration/query-tests/circle-translate-anchor/viewport/expected.json index 5ae714dbf93e..dbee9b88af26 100644 --- a/metrics/integration/query-tests/circle-translate-anchor/viewport/expected.json +++ b/metrics/integration/query-tests/circle-translate-anchor/viewport/expected.json @@ -67,4 +67,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-translate-anchor/viewport/style.json b/metrics/integration/query-tests/circle-translate-anchor/viewport/style.json index b7bdf9c06c52..03e421af7227 100644 --- a/metrics/integration/query-tests/circle-translate-anchor/viewport/style.json +++ b/metrics/integration/query-tests/circle-translate-anchor/viewport/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-translate/box/expected.json b/metrics/integration/query-tests/circle-translate/box/expected.json index 9539d0b183a9..8f4f2a5cfd9b 100644 --- a/metrics/integration/query-tests/circle-translate/box/expected.json +++ b/metrics/integration/query-tests/circle-translate/box/expected.json @@ -87,4 +87,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-translate/box/style.json b/metrics/integration/query-tests/circle-translate/box/style.json index ef76b5184dbb..c634eb130376 100644 --- a/metrics/integration/query-tests/circle-translate/box/style.json +++ b/metrics/integration/query-tests/circle-translate/box/style.json @@ -44,4 +44,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-translate/inside/expected.json b/metrics/integration/query-tests/circle-translate/inside/expected.json index 9539d0b183a9..8f4f2a5cfd9b 100644 --- a/metrics/integration/query-tests/circle-translate/inside/expected.json +++ b/metrics/integration/query-tests/circle-translate/inside/expected.json @@ -87,4 +87,4 @@ "sourceLayer": "road", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/circle-translate/inside/style.json b/metrics/integration/query-tests/circle-translate/inside/style.json index 185b589207ca..2587385afcff 100644 --- a/metrics/integration/query-tests/circle-translate/inside/style.json +++ b/metrics/integration/query-tests/circle-translate/inside/style.json @@ -39,4 +39,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/circle-translate/outside/expected.json b/metrics/integration/query-tests/circle-translate/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/circle-translate/outside/expected.json +++ b/metrics/integration/query-tests/circle-translate/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/circle-translate/outside/style.json b/metrics/integration/query-tests/circle-translate/outside/style.json index b5042984f6e2..21d5d49c3958 100644 --- a/metrics/integration/query-tests/circle-translate/outside/style.json +++ b/metrics/integration/query-tests/circle-translate/outside/style.json @@ -39,4 +39,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z0/expected.json b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z0/expected.json index efc26533257b..d2a7654e5931 100644 --- a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z0/expected.json +++ b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z0/expected.json @@ -29,4 +29,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/expected.json b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/expected.json index 2ea43d9a36c6..9bc82c40e9e5 100644 --- a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/expected.json +++ b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/expected.json @@ -29,4 +29,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/style.json b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/style.json index d06f54a87869..58048ff07632 100644 --- a/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/style.json +++ b/metrics/integration/query-tests/edge-cases/box-cutting-antimeridian-z1/style.json @@ -94,4 +94,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/edge-cases/null-island/expected.json b/metrics/integration/query-tests/edge-cases/null-island/expected.json index 5387f9c03178..0ecc3430b969 100644 --- a/metrics/integration/query-tests/edge-cases/null-island/expected.json +++ b/metrics/integration/query-tests/edge-cases/null-island/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/edge-cases/null-island/style.json b/metrics/integration/query-tests/edge-cases/null-island/style.json index 2f3828a9c98b..f0b6ae7be012 100644 --- a/metrics/integration/query-tests/edge-cases/null-island/style.json +++ b/metrics/integration/query-tests/edge-cases/null-island/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/edge-cases/unsorted-keys/expected.json b/metrics/integration/query-tests/edge-cases/unsorted-keys/expected.json index 936dc899de7c..1e2dc9ba096f 100644 --- a/metrics/integration/query-tests/edge-cases/unsorted-keys/expected.json +++ b/metrics/integration/query-tests/edge-cases/unsorted-keys/expected.json @@ -25,4 +25,4 @@ "sourceLayer": "place_label", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/feature-state/default/expected.json b/metrics/integration/query-tests/feature-state/default/expected.json index 60e978ac5bc0..b1b28298c9ae 100644 --- a/metrics/integration/query-tests/feature-state/default/expected.json +++ b/metrics/integration/query-tests/feature-state/default/expected.json @@ -97,4 +97,4 @@ } } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/feature-state/default/style.json b/metrics/integration/query-tests/feature-state/default/style.json index 31af9fbfdac0..1caa0df6c752 100644 --- a/metrics/integration/query-tests/feature-state/default/style.json +++ b/metrics/integration/query-tests/feature-state/default/style.json @@ -68,4 +68,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-extrusion/base-in/expected.json b/metrics/integration/query-tests/fill-extrusion/base-in/expected.json index 30655dcba5bf..8b20fab0b301 100644 --- a/metrics/integration/query-tests/fill-extrusion/base-in/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/base-in/expected.json @@ -32,4 +32,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/base-out/expected.json b/metrics/integration/query-tests/fill-extrusion/base-out/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/fill-extrusion/base-out/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/base-out/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/fill-extrusion/box-in/expected.json b/metrics/integration/query-tests/fill-extrusion/box-in/expected.json index 27e2e01d6650..cdf25fc433dc 100644 --- a/metrics/integration/query-tests/fill-extrusion/box-in/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/box-in/expected.json @@ -69,4 +69,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/box-out/expected.json b/metrics/integration/query-tests/fill-extrusion/box-out/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/fill-extrusion/box-out/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/box-out/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/fill-extrusion/side-in/expected.json b/metrics/integration/query-tests/fill-extrusion/side-in/expected.json index 30655dcba5bf..8b20fab0b301 100644 --- a/metrics/integration/query-tests/fill-extrusion/side-in/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/side-in/expected.json @@ -32,4 +32,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/side-out/expected.json b/metrics/integration/query-tests/fill-extrusion/side-out/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/fill-extrusion/side-out/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/side-out/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/fill-extrusion/sort-concave-inner/expected.json b/metrics/integration/query-tests/fill-extrusion/sort-concave-inner/expected.json index 158c2a254620..f407f9ce09e1 100644 --- a/metrics/integration/query-tests/fill-extrusion/sort-concave-inner/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/sort-concave-inner/expected.json @@ -83,4 +83,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/sort-concave-outer/expected.json b/metrics/integration/query-tests/fill-extrusion/sort-concave-outer/expected.json index d9195fc86c8c..30beeb2945b6 100644 --- a/metrics/integration/query-tests/fill-extrusion/sort-concave-outer/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/sort-concave-outer/expected.json @@ -83,4 +83,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/sort-rotated/expected.json b/metrics/integration/query-tests/fill-extrusion/sort-rotated/expected.json index ce524bff6625..be68722373f5 100644 --- a/metrics/integration/query-tests/fill-extrusion/sort-rotated/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/sort-rotated/expected.json @@ -104,4 +104,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/sort/expected.json b/metrics/integration/query-tests/fill-extrusion/sort/expected.json index 81de095678f8..a9a67b867e46 100644 --- a/metrics/integration/query-tests/fill-extrusion/sort/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/sort/expected.json @@ -104,4 +104,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/top-in/expected.json b/metrics/integration/query-tests/fill-extrusion/top-in/expected.json index 30655dcba5bf..8b20fab0b301 100644 --- a/metrics/integration/query-tests/fill-extrusion/top-in/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/top-in/expected.json @@ -32,4 +32,4 @@ "source": "zones", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-extrusion/top-out/expected.json b/metrics/integration/query-tests/fill-extrusion/top-out/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/fill-extrusion/top-out/expected.json +++ b/metrics/integration/query-tests/fill-extrusion/top-out/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/fill-features-in/default/expected.json b/metrics/integration/query-tests/fill-features-in/default/expected.json index 190b9af15eb3..c8f8e8e70a47 100644 --- a/metrics/integration/query-tests/fill-features-in/default/expected.json +++ b/metrics/integration/query-tests/fill-features-in/default/expected.json @@ -838,4 +838,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-features-in/default/style.json b/metrics/integration/query-tests/fill-features-in/default/style.json index ae11851631ae..6f05097e9ecc 100644 --- a/metrics/integration/query-tests/fill-features-in/default/style.json +++ b/metrics/integration/query-tests/fill-features-in/default/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-features-in/rotated/expected.json b/metrics/integration/query-tests/fill-features-in/rotated/expected.json index 6483a92cde33..7159ef31d116 100644 --- a/metrics/integration/query-tests/fill-features-in/rotated/expected.json +++ b/metrics/integration/query-tests/fill-features-in/rotated/expected.json @@ -740,4 +740,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-features-in/rotated/style.json b/metrics/integration/query-tests/fill-features-in/rotated/style.json index c4c0f8f539fe..5f5537f002a9 100644 --- a/metrics/integration/query-tests/fill-features-in/rotated/style.json +++ b/metrics/integration/query-tests/fill-features-in/rotated/style.json @@ -44,4 +44,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-features-in/tilted/expected.json b/metrics/integration/query-tests/fill-features-in/tilted/expected.json index 6b3e32ce6cba..99b30b972040 100644 --- a/metrics/integration/query-tests/fill-features-in/tilted/expected.json +++ b/metrics/integration/query-tests/fill-features-in/tilted/expected.json @@ -664,4 +664,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-features-in/tilted/style.json b/metrics/integration/query-tests/fill-features-in/tilted/style.json index 9f9a937b2a8e..71d3609960d8 100644 --- a/metrics/integration/query-tests/fill-features-in/tilted/style.json +++ b/metrics/integration/query-tests/fill-features-in/tilted/style.json @@ -44,4 +44,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-translate-anchor/map/expected.json b/metrics/integration/query-tests/fill-translate-anchor/map/expected.json index d374d6befed6..269b3f77f7ff 100644 --- a/metrics/integration/query-tests/fill-translate-anchor/map/expected.json +++ b/metrics/integration/query-tests/fill-translate-anchor/map/expected.json @@ -190,4 +190,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-translate-anchor/map/style.json b/metrics/integration/query-tests/fill-translate-anchor/map/style.json index f69535271b04..8bc7ab4c3f4f 100644 --- a/metrics/integration/query-tests/fill-translate-anchor/map/style.json +++ b/metrics/integration/query-tests/fill-translate-anchor/map/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-translate-anchor/viewport/expected.json b/metrics/integration/query-tests/fill-translate-anchor/viewport/expected.json index adc00db9aaff..e116e5dc7f06 100644 --- a/metrics/integration/query-tests/fill-translate-anchor/viewport/expected.json +++ b/metrics/integration/query-tests/fill-translate-anchor/viewport/expected.json @@ -258,4 +258,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-translate-anchor/viewport/style.json b/metrics/integration/query-tests/fill-translate-anchor/viewport/style.json index 587ab47db390..8c81faaae0b4 100644 --- a/metrics/integration/query-tests/fill-translate-anchor/viewport/style.json +++ b/metrics/integration/query-tests/fill-translate-anchor/viewport/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill-translate/literal/expected.json b/metrics/integration/query-tests/fill-translate/literal/expected.json index 79f087735efa..0fc359ed602c 100644 --- a/metrics/integration/query-tests/fill-translate/literal/expected.json +++ b/metrics/integration/query-tests/fill-translate/literal/expected.json @@ -202,4 +202,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill-translate/literal/style.json b/metrics/integration/query-tests/fill-translate/literal/style.json index b773d4069321..40de94957615 100644 --- a/metrics/integration/query-tests/fill-translate/literal/style.json +++ b/metrics/integration/query-tests/fill-translate/literal/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill/default/expected.json b/metrics/integration/query-tests/fill/default/expected.json index 71bdfd35d699..de38edc75e95 100644 --- a/metrics/integration/query-tests/fill/default/expected.json +++ b/metrics/integration/query-tests/fill/default/expected.json @@ -162,4 +162,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill/default/style.json b/metrics/integration/query-tests/fill/default/style.json index 2b7411099aff..6a5d3146362f 100644 --- a/metrics/integration/query-tests/fill/default/style.json +++ b/metrics/integration/query-tests/fill/default/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/fill/fill-pattern/expected.json b/metrics/integration/query-tests/fill/fill-pattern/expected.json index ff50d6760c2d..cf7972437b27 100644 --- a/metrics/integration/query-tests/fill/fill-pattern/expected.json +++ b/metrics/integration/query-tests/fill/fill-pattern/expected.json @@ -162,4 +162,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill/overscaled/expected.json b/metrics/integration/query-tests/fill/overscaled/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/fill/overscaled/expected.json +++ b/metrics/integration/query-tests/fill/overscaled/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/fill/overscaled/style.json b/metrics/integration/query-tests/fill/overscaled/style.json index b7baf51069a5..aee0da4769a1 100644 --- a/metrics/integration/query-tests/fill/overscaled/style.json +++ b/metrics/integration/query-tests/fill/overscaled/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/linestring/expected.json b/metrics/integration/query-tests/geometry/linestring/expected.json index efe6e550d10f..d56db82b13a6 100644 --- a/metrics/integration/query-tests/geometry/linestring/expected.json +++ b/metrics/integration/query-tests/geometry/linestring/expected.json @@ -18,4 +18,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/linestring/style.json b/metrics/integration/query-tests/geometry/linestring/style.json index 9d4baa8a97ff..b79710cc8261 100644 --- a/metrics/integration/query-tests/geometry/linestring/style.json +++ b/metrics/integration/query-tests/geometry/linestring/style.json @@ -46,4 +46,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/multilinestring/expected.json b/metrics/integration/query-tests/geometry/multilinestring/expected.json index 589e09a4c3fc..8cd795da421a 100644 --- a/metrics/integration/query-tests/geometry/multilinestring/expected.json +++ b/metrics/integration/query-tests/geometry/multilinestring/expected.json @@ -30,4 +30,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/multilinestring/style.json b/metrics/integration/query-tests/geometry/multilinestring/style.json index e88f7a112e3e..6a7a6ccebcdb 100644 --- a/metrics/integration/query-tests/geometry/multilinestring/style.json +++ b/metrics/integration/query-tests/geometry/multilinestring/style.json @@ -59,4 +59,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/multipoint/expected.json b/metrics/integration/query-tests/geometry/multipoint/expected.json index 65c1e48dc7ab..440e0e886248 100644 --- a/metrics/integration/query-tests/geometry/multipoint/expected.json +++ b/metrics/integration/query-tests/geometry/multipoint/expected.json @@ -18,4 +18,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/multipoint/style.json b/metrics/integration/query-tests/geometry/multipoint/style.json index c89bce6d7fd4..e14169ecfd70 100644 --- a/metrics/integration/query-tests/geometry/multipoint/style.json +++ b/metrics/integration/query-tests/geometry/multipoint/style.json @@ -47,4 +47,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/multipolygon/expected.json b/metrics/integration/query-tests/geometry/multipolygon/expected.json index 5e9ba38e6f60..d2c0a231c9b2 100644 --- a/metrics/integration/query-tests/geometry/multipolygon/expected.json +++ b/metrics/integration/query-tests/geometry/multipolygon/expected.json @@ -58,4 +58,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/multipolygon/style.json b/metrics/integration/query-tests/geometry/multipolygon/style.json index f01cb99aeb08..7e5311093a32 100644 --- a/metrics/integration/query-tests/geometry/multipolygon/style.json +++ b/metrics/integration/query-tests/geometry/multipolygon/style.json @@ -87,4 +87,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/point/expected.json b/metrics/integration/query-tests/geometry/point/expected.json index 5387f9c03178..0ecc3430b969 100644 --- a/metrics/integration/query-tests/geometry/point/expected.json +++ b/metrics/integration/query-tests/geometry/point/expected.json @@ -12,4 +12,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/point/style.json b/metrics/integration/query-tests/geometry/point/style.json index d6daba698080..4962572a41ae 100644 --- a/metrics/integration/query-tests/geometry/point/style.json +++ b/metrics/integration/query-tests/geometry/point/style.json @@ -41,4 +41,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/geometry/polygon/expected.json b/metrics/integration/query-tests/geometry/polygon/expected.json index 3f6f6af9493a..5371fa6f8e99 100644 --- a/metrics/integration/query-tests/geometry/polygon/expected.json +++ b/metrics/integration/query-tests/geometry/polygon/expected.json @@ -54,4 +54,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/geometry/polygon/style.json b/metrics/integration/query-tests/geometry/polygon/style.json index 85e88ee54813..beb1db2a33aa 100644 --- a/metrics/integration/query-tests/geometry/polygon/style.json +++ b/metrics/integration/query-tests/geometry/polygon/style.json @@ -83,4 +83,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/invisible-features/visibility-none/expected.json b/metrics/integration/query-tests/invisible-features/visibility-none/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/invisible-features/visibility-none/expected.json +++ b/metrics/integration/query-tests/invisible-features/visibility-none/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/invisible-features/zero-opacity/expected.json b/metrics/integration/query-tests/invisible-features/zero-opacity/expected.json index 5c19c19f9075..a1533d2e1a74 100644 --- a/metrics/integration/query-tests/invisible-features/zero-opacity/expected.json +++ b/metrics/integration/query-tests/invisible-features/zero-opacity/expected.json @@ -32,4 +32,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-gap-width/feature-state/expected.json b/metrics/integration/query-tests/line-gap-width/feature-state/expected.json index 41d8c6908f8c..7ecfa8e982ab 100644 --- a/metrics/integration/query-tests/line-gap-width/feature-state/expected.json +++ b/metrics/integration/query-tests/line-gap-width/feature-state/expected.json @@ -10,4 +10,4 @@ "source": "mapbox", "state": { "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-gap-width/feature-state/style.json b/metrics/integration/query-tests/line-gap-width/feature-state/style.json index 97ed56097bb4..66ba4f07d6f1 100644 --- a/metrics/integration/query-tests/line-gap-width/feature-state/style.json +++ b/metrics/integration/query-tests/line-gap-width/feature-state/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-gap-width/inside-fractional/expected.json b/metrics/integration/query-tests/line-gap-width/inside-fractional/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-gap-width/inside-fractional/expected.json +++ b/metrics/integration/query-tests/line-gap-width/inside-fractional/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-gap-width/inside-fractional/style.json b/metrics/integration/query-tests/line-gap-width/inside-fractional/style.json index b985748c4208..95367ac80cf0 100644 --- a/metrics/integration/query-tests/line-gap-width/inside-fractional/style.json +++ b/metrics/integration/query-tests/line-gap-width/inside-fractional/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-gap-width/inside/expected.json b/metrics/integration/query-tests/line-gap-width/inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-gap-width/inside/expected.json +++ b/metrics/integration/query-tests/line-gap-width/inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-gap-width/inside/style.json b/metrics/integration/query-tests/line-gap-width/inside/style.json index bbf63def9096..22f4066aa38d 100644 --- a/metrics/integration/query-tests/line-gap-width/inside/style.json +++ b/metrics/integration/query-tests/line-gap-width/inside/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-gap-width/outside-fractional/expected.json b/metrics/integration/query-tests/line-gap-width/outside-fractional/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-gap-width/outside-fractional/expected.json +++ b/metrics/integration/query-tests/line-gap-width/outside-fractional/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-gap-width/outside-fractional/style.json b/metrics/integration/query-tests/line-gap-width/outside-fractional/style.json index 74363ede2fe7..52ae77a45d94 100644 --- a/metrics/integration/query-tests/line-gap-width/outside-fractional/style.json +++ b/metrics/integration/query-tests/line-gap-width/outside-fractional/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-gap-width/outside/expected.json b/metrics/integration/query-tests/line-gap-width/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-gap-width/outside/expected.json +++ b/metrics/integration/query-tests/line-gap-width/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-gap-width/outside/style.json b/metrics/integration/query-tests/line-gap-width/outside/style.json index b0f6501d9c79..3fa8a0af1206 100644 --- a/metrics/integration/query-tests/line-gap-width/outside/style.json +++ b/metrics/integration/query-tests/line-gap-width/outside/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-gap-width/property-function/expected.json b/metrics/integration/query-tests/line-gap-width/property-function/expected.json index a9ebbd926df2..3e1d68017618 100644 --- a/metrics/integration/query-tests/line-gap-width/property-function/expected.json +++ b/metrics/integration/query-tests/line-gap-width/property-function/expected.json @@ -20,4 +20,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-offset/feature-state/expected.json b/metrics/integration/query-tests/line-offset/feature-state/expected.json index 41d8c6908f8c..7ecfa8e982ab 100644 --- a/metrics/integration/query-tests/line-offset/feature-state/expected.json +++ b/metrics/integration/query-tests/line-offset/feature-state/expected.json @@ -10,4 +10,4 @@ "source": "mapbox", "state": { "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-offset/feature-state/style.json b/metrics/integration/query-tests/line-offset/feature-state/style.json index e4d38be60c50..89a89772e355 100644 --- a/metrics/integration/query-tests/line-offset/feature-state/style.json +++ b/metrics/integration/query-tests/line-offset/feature-state/style.json @@ -59,4 +59,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-offset/inside-fractional/expected.json b/metrics/integration/query-tests/line-offset/inside-fractional/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-offset/inside-fractional/expected.json +++ b/metrics/integration/query-tests/line-offset/inside-fractional/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-offset/inside-fractional/style.json b/metrics/integration/query-tests/line-offset/inside-fractional/style.json index 0e993f19591c..9cfeecbf21ad 100644 --- a/metrics/integration/query-tests/line-offset/inside-fractional/style.json +++ b/metrics/integration/query-tests/line-offset/inside-fractional/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-offset/inside/expected.json b/metrics/integration/query-tests/line-offset/inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-offset/inside/expected.json +++ b/metrics/integration/query-tests/line-offset/inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-offset/inside/style.json b/metrics/integration/query-tests/line-offset/inside/style.json index e14e14bfc7a3..5fefaeaa4593 100644 --- a/metrics/integration/query-tests/line-offset/inside/style.json +++ b/metrics/integration/query-tests/line-offset/inside/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-offset/outside-fractional/expected.json b/metrics/integration/query-tests/line-offset/outside-fractional/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-offset/outside-fractional/expected.json +++ b/metrics/integration/query-tests/line-offset/outside-fractional/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-offset/outside-fractional/style.json b/metrics/integration/query-tests/line-offset/outside-fractional/style.json index f8c5b8581b90..ec64d085f9e2 100644 --- a/metrics/integration/query-tests/line-offset/outside-fractional/style.json +++ b/metrics/integration/query-tests/line-offset/outside-fractional/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-offset/outside/expected.json b/metrics/integration/query-tests/line-offset/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-offset/outside/expected.json +++ b/metrics/integration/query-tests/line-offset/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-offset/outside/style.json b/metrics/integration/query-tests/line-offset/outside/style.json index abc86be1c704..6c5497a99699 100644 --- a/metrics/integration/query-tests/line-offset/outside/style.json +++ b/metrics/integration/query-tests/line-offset/outside/style.json @@ -38,4 +38,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-offset/pattern-feature-state/expected.json b/metrics/integration/query-tests/line-offset/pattern-feature-state/expected.json index 877b7dd0d844..ede5282f9201 100644 --- a/metrics/integration/query-tests/line-offset/pattern-feature-state/expected.json +++ b/metrics/integration/query-tests/line-offset/pattern-feature-state/expected.json @@ -21,4 +21,4 @@ "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-offset/property-function/expected.json b/metrics/integration/query-tests/line-offset/property-function/expected.json index 74725ac2a729..ef2e0120ffd1 100644 --- a/metrics/integration/query-tests/line-offset/property-function/expected.json +++ b/metrics/integration/query-tests/line-offset/property-function/expected.json @@ -34,4 +34,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-translate-anchor/map/expected.json b/metrics/integration/query-tests/line-translate-anchor/map/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-translate-anchor/map/expected.json +++ b/metrics/integration/query-tests/line-translate-anchor/map/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-translate-anchor/map/style.json b/metrics/integration/query-tests/line-translate-anchor/map/style.json index cc377f800939..8fff62bdf009 100644 --- a/metrics/integration/query-tests/line-translate-anchor/map/style.json +++ b/metrics/integration/query-tests/line-translate-anchor/map/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-translate-anchor/viewport/expected.json b/metrics/integration/query-tests/line-translate-anchor/viewport/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-translate-anchor/viewport/expected.json +++ b/metrics/integration/query-tests/line-translate-anchor/viewport/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-translate-anchor/viewport/style.json b/metrics/integration/query-tests/line-translate-anchor/viewport/style.json index ec01cb100fea..0e7a9e83e99f 100644 --- a/metrics/integration/query-tests/line-translate-anchor/viewport/style.json +++ b/metrics/integration/query-tests/line-translate-anchor/viewport/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-translate/inside/expected.json b/metrics/integration/query-tests/line-translate/inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-translate/inside/expected.json +++ b/metrics/integration/query-tests/line-translate/inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-translate/inside/style.json b/metrics/integration/query-tests/line-translate/inside/style.json index dbf2ffe4ea17..484a446feb2f 100644 --- a/metrics/integration/query-tests/line-translate/inside/style.json +++ b/metrics/integration/query-tests/line-translate/inside/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-translate/outside/expected.json b/metrics/integration/query-tests/line-translate/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-translate/outside/expected.json +++ b/metrics/integration/query-tests/line-translate/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-translate/outside/style.json b/metrics/integration/query-tests/line-translate/outside/style.json index 215f21b55ac2..4844a4cbb196 100644 --- a/metrics/integration/query-tests/line-translate/outside/style.json +++ b/metrics/integration/query-tests/line-translate/outside/style.json @@ -41,4 +41,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width-features-in/inside/expected.json b/metrics/integration/query-tests/line-width-features-in/inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-width-features-in/inside/expected.json +++ b/metrics/integration/query-tests/line-width-features-in/inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-width-features-in/inside/style.json b/metrics/integration/query-tests/line-width-features-in/inside/style.json index c7149498cd86..3afc3395f744 100644 --- a/metrics/integration/query-tests/line-width-features-in/inside/style.json +++ b/metrics/integration/query-tests/line-width-features-in/inside/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width-features-in/outside/expected.json b/metrics/integration/query-tests/line-width-features-in/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-width-features-in/outside/expected.json +++ b/metrics/integration/query-tests/line-width-features-in/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-width-features-in/outside/style.json b/metrics/integration/query-tests/line-width-features-in/outside/style.json index 107593b4b81b..f9022a06a057 100644 --- a/metrics/integration/query-tests/line-width-features-in/outside/style.json +++ b/metrics/integration/query-tests/line-width-features-in/outside/style.json @@ -43,4 +43,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width-features-in/tilt-inside/expected.json b/metrics/integration/query-tests/line-width-features-in/tilt-inside/expected.json index b3e7dab548ca..d36825a6c95f 100644 --- a/metrics/integration/query-tests/line-width-features-in/tilt-inside/expected.json +++ b/metrics/integration/query-tests/line-width-features-in/tilt-inside/expected.json @@ -477,4 +477,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-width-features-in/tilt-inside/style.json b/metrics/integration/query-tests/line-width-features-in/tilt-inside/style.json index 34c6e6d05518..861a859bd8df 100644 --- a/metrics/integration/query-tests/line-width-features-in/tilt-inside/style.json +++ b/metrics/integration/query-tests/line-width-features-in/tilt-inside/style.json @@ -44,4 +44,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width-features-in/tilt-outside/expected.json b/metrics/integration/query-tests/line-width-features-in/tilt-outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-width-features-in/tilt-outside/expected.json +++ b/metrics/integration/query-tests/line-width-features-in/tilt-outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-width-features-in/tilt-outside/style.json b/metrics/integration/query-tests/line-width-features-in/tilt-outside/style.json index 94bef6d86292..cd14cefc4763 100644 --- a/metrics/integration/query-tests/line-width-features-in/tilt-outside/style.json +++ b/metrics/integration/query-tests/line-width-features-in/tilt-outside/style.json @@ -44,4 +44,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width/feature-state/expected.json b/metrics/integration/query-tests/line-width/feature-state/expected.json index 41d8c6908f8c..7ecfa8e982ab 100644 --- a/metrics/integration/query-tests/line-width/feature-state/expected.json +++ b/metrics/integration/query-tests/line-width/feature-state/expected.json @@ -10,4 +10,4 @@ "source": "mapbox", "state": { "big": true } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-width/feature-state/style.json b/metrics/integration/query-tests/line-width/feature-state/style.json index b30710cb0e7a..fe0b35992fe2 100644 --- a/metrics/integration/query-tests/line-width/feature-state/style.json +++ b/metrics/integration/query-tests/line-width/feature-state/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width/inside-fractional/expected.json b/metrics/integration/query-tests/line-width/inside-fractional/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-width/inside-fractional/expected.json +++ b/metrics/integration/query-tests/line-width/inside-fractional/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-width/inside-fractional/style.json b/metrics/integration/query-tests/line-width/inside-fractional/style.json index 424dbd943602..2a921f8f0c62 100644 --- a/metrics/integration/query-tests/line-width/inside-fractional/style.json +++ b/metrics/integration/query-tests/line-width/inside-fractional/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width/inside/expected.json b/metrics/integration/query-tests/line-width/inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/line-width/inside/expected.json +++ b/metrics/integration/query-tests/line-width/inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/line-width/inside/style.json b/metrics/integration/query-tests/line-width/inside/style.json index 3396902b7706..75605638263b 100644 --- a/metrics/integration/query-tests/line-width/inside/style.json +++ b/metrics/integration/query-tests/line-width/inside/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width/outside-fractional/expected.json b/metrics/integration/query-tests/line-width/outside-fractional/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-width/outside-fractional/expected.json +++ b/metrics/integration/query-tests/line-width/outside-fractional/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-width/outside-fractional/style.json b/metrics/integration/query-tests/line-width/outside-fractional/style.json index 66bb07494fc2..001631313ffd 100644 --- a/metrics/integration/query-tests/line-width/outside-fractional/style.json +++ b/metrics/integration/query-tests/line-width/outside-fractional/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/line-width/outside/expected.json b/metrics/integration/query-tests/line-width/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/line-width/outside/expected.json +++ b/metrics/integration/query-tests/line-width/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/line-width/outside/style.json b/metrics/integration/query-tests/line-width/outside/style.json index c0ccf7335385..7982b412c525 100644 --- a/metrics/integration/query-tests/line-width/outside/style.json +++ b/metrics/integration/query-tests/line-width/outside/style.json @@ -37,4 +37,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/options/filter-false/expected.json b/metrics/integration/query-tests/options/filter-false/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/options/filter-false/expected.json +++ b/metrics/integration/query-tests/options/filter-false/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/options/filter-true/expected.json b/metrics/integration/query-tests/options/filter-true/expected.json index 4e8e4d91f7d5..103bfdb80517 100644 --- a/metrics/integration/query-tests/options/filter-true/expected.json +++ b/metrics/integration/query-tests/options/filter-true/expected.json @@ -14,4 +14,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/options/layers-multiple/expected.json b/metrics/integration/query-tests/options/layers-multiple/expected.json index 76193dbe851c..821db063d89e 100644 --- a/metrics/integration/query-tests/options/layers-multiple/expected.json +++ b/metrics/integration/query-tests/options/layers-multiple/expected.json @@ -29,4 +29,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/options/layers-one/expected.json b/metrics/integration/query-tests/options/layers-one/expected.json index 4e8e4d91f7d5..103bfdb80517 100644 --- a/metrics/integration/query-tests/options/layers-one/expected.json +++ b/metrics/integration/query-tests/options/layers-one/expected.json @@ -14,4 +14,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/style.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/style.json index a48e146804fa..bba9be3c3ac8 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/style.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#3534/style.json @@ -59,4 +59,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/expected.json index 78cdaddf9e1c..7a64c72ec06a 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/expected.json @@ -14,4 +14,4 @@ "source": "mapbox", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/style.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/style.json index 186523338b6b..493baf0c5e26 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/style.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#4417/style.json @@ -74,4 +74,4 @@ "source": "dummy" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#4494/style.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#4494/style.json index c470cb2b1dce..892eede0a8ef 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#4494/style.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#4494/style.json @@ -36,4 +36,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#5172/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#5172/expected.json index cacc3f5ec371..3d0162abc591 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#5172/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#5172/expected.json @@ -12,4 +12,4 @@ "source": "source", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#5473/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#5473/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#5473/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#5473/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#5554/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#5554/expected.json index 781351916e1a..6e65d9c22ae3 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#5554/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#5554/expected.json @@ -14,4 +14,4 @@ "source": "secondSource", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#6075/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#6075/expected.json index cacc3f5ec371..3d0162abc591 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#6075/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#6075/expected.json @@ -12,4 +12,4 @@ "source": "source", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#7883/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#7883/expected.json index 15920911781b..3800a2cf5580 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#7883/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#7883/expected.json @@ -139,4 +139,4 @@ "source": "fill-lower", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/regressions/mapbox-gl-js#8999/expected.json b/metrics/integration/query-tests/regressions/mapbox-gl-js#8999/expected.json index dfff758fd3ac..1ddb7cf358b1 100644 --- a/metrics/integration/query-tests/regressions/mapbox-gl-js#8999/expected.json +++ b/metrics/integration/query-tests/regressions/mapbox-gl-js#8999/expected.json @@ -30,4 +30,4 @@ "source": "extrusion_three_points", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/remove-feature-state/default/expected.json b/metrics/integration/query-tests/remove-feature-state/default/expected.json index 51de80fe451b..515cb891168f 100644 --- a/metrics/integration/query-tests/remove-feature-state/default/expected.json +++ b/metrics/integration/query-tests/remove-feature-state/default/expected.json @@ -89,4 +89,4 @@ "stateA": false } } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/remove-feature-state/default/style.json b/metrics/integration/query-tests/remove-feature-state/default/style.json index 2e0da0bd8eb4..654d2b6da985 100644 --- a/metrics/integration/query-tests/remove-feature-state/default/style.json +++ b/metrics/integration/query-tests/remove-feature-state/default/style.json @@ -109,4 +109,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/fractional-outside/expected.json b/metrics/integration/query-tests/symbol-features-in/fractional-outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol-features-in/fractional-outside/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/fractional-outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol-features-in/fractional-outside/style.json b/metrics/integration/query-tests/symbol-features-in/fractional-outside/style.json index c468138abdf8..dbc524830fa4 100644 --- a/metrics/integration/query-tests/symbol-features-in/fractional-outside/style.json +++ b/metrics/integration/query-tests/symbol-features-in/fractional-outside/style.json @@ -54,4 +54,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/hidden/expected.json b/metrics/integration/query-tests/symbol-features-in/hidden/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol-features-in/hidden/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/hidden/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol-features-in/hidden/style.json b/metrics/integration/query-tests/symbol-features-in/hidden/style.json index 082e7538f497..719e03f022ed 100644 --- a/metrics/integration/query-tests/symbol-features-in/hidden/style.json +++ b/metrics/integration/query-tests/symbol-features-in/hidden/style.json @@ -54,4 +54,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/inside/expected.json b/metrics/integration/query-tests/symbol-features-in/inside/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/symbol-features-in/inside/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/inside/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol-features-in/inside/style.json b/metrics/integration/query-tests/symbol-features-in/inside/style.json index 32949c144897..7f2546b48245 100644 --- a/metrics/integration/query-tests/symbol-features-in/inside/style.json +++ b/metrics/integration/query-tests/symbol-features-in/inside/style.json @@ -54,4 +54,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/outside/expected.json b/metrics/integration/query-tests/symbol-features-in/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol-features-in/outside/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol-features-in/outside/style.json b/metrics/integration/query-tests/symbol-features-in/outside/style.json index 6f6cf26798bf..2ddcd6e2004e 100644 --- a/metrics/integration/query-tests/symbol-features-in/outside/style.json +++ b/metrics/integration/query-tests/symbol-features-in/outside/style.json @@ -54,4 +54,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/pitched-screen/expected.json b/metrics/integration/query-tests/symbol-features-in/pitched-screen/expected.json index 510c8e0424f7..d432566b6006 100644 --- a/metrics/integration/query-tests/symbol-features-in/pitched-screen/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/pitched-screen/expected.json @@ -83,4 +83,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol-features-in/pitched-screen/style.json b/metrics/integration/query-tests/symbol-features-in/pitched-screen/style.json index 7d4b0eea6900..38d0747c6a74 100644 --- a/metrics/integration/query-tests/symbol-features-in/pitched-screen/style.json +++ b/metrics/integration/query-tests/symbol-features-in/pitched-screen/style.json @@ -51,4 +51,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/tilted-inside/expected.json b/metrics/integration/query-tests/symbol-features-in/tilted-inside/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/symbol-features-in/tilted-inside/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/tilted-inside/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol-features-in/tilted-inside/style.json b/metrics/integration/query-tests/symbol-features-in/tilted-inside/style.json index bd1dd7b68da5..2fae21446504 100644 --- a/metrics/integration/query-tests/symbol-features-in/tilted-inside/style.json +++ b/metrics/integration/query-tests/symbol-features-in/tilted-inside/style.json @@ -55,4 +55,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-features-in/tilted-outside/expected.json b/metrics/integration/query-tests/symbol-features-in/tilted-outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol-features-in/tilted-outside/expected.json +++ b/metrics/integration/query-tests/symbol-features-in/tilted-outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol-features-in/tilted-outside/style.json b/metrics/integration/query-tests/symbol-features-in/tilted-outside/style.json index ad8f0abd2e6a..12424bedf2a6 100644 --- a/metrics/integration/query-tests/symbol-features-in/tilted-outside/style.json +++ b/metrics/integration/query-tests/symbol-features-in/tilted-outside/style.json @@ -55,4 +55,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol-ignore-placement/inside/expected.json b/metrics/integration/query-tests/symbol-ignore-placement/inside/expected.json index e90a5f78e71e..5a4d5fe7bd6d 100644 --- a/metrics/integration/query-tests/symbol-ignore-placement/inside/expected.json +++ b/metrics/integration/query-tests/symbol-ignore-placement/inside/expected.json @@ -341,4 +341,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol-ignore-placement/inside/style.json b/metrics/integration/query-tests/symbol-ignore-placement/inside/style.json index 00a45865abdc..fb91f66980c3 100644 --- a/metrics/integration/query-tests/symbol-ignore-placement/inside/style.json +++ b/metrics/integration/query-tests/symbol-ignore-placement/inside/style.json @@ -49,4 +49,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/filtered-rotated-after-insert/expected.json b/metrics/integration/query-tests/symbol/filtered-rotated-after-insert/expected.json index 31146faa09fd..1503a1a9be07 100644 --- a/metrics/integration/query-tests/symbol/filtered-rotated-after-insert/expected.json +++ b/metrics/integration/query-tests/symbol/filtered-rotated-after-insert/expected.json @@ -825,4 +825,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/filtered/expected.json b/metrics/integration/query-tests/symbol/filtered/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/symbol/filtered/expected.json +++ b/metrics/integration/query-tests/symbol/filtered/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/fractional-outside/expected.json b/metrics/integration/query-tests/symbol/fractional-outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol/fractional-outside/expected.json +++ b/metrics/integration/query-tests/symbol/fractional-outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol/fractional-outside/style.json b/metrics/integration/query-tests/symbol/fractional-outside/style.json index 1f1b1b80f504..c649343969f2 100644 --- a/metrics/integration/query-tests/symbol/fractional-outside/style.json +++ b/metrics/integration/query-tests/symbol/fractional-outside/style.json @@ -48,4 +48,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/hidden/expected.json b/metrics/integration/query-tests/symbol/hidden/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol/hidden/expected.json +++ b/metrics/integration/query-tests/symbol/hidden/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol/hidden/style.json b/metrics/integration/query-tests/symbol/hidden/style.json index 534d21a1bc4d..540d1e62a753 100644 --- a/metrics/integration/query-tests/symbol/hidden/style.json +++ b/metrics/integration/query-tests/symbol/hidden/style.json @@ -48,4 +48,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/inside/expected.json b/metrics/integration/query-tests/symbol/inside/expected.json index cb7374736183..77f04c496990 100644 --- a/metrics/integration/query-tests/symbol/inside/expected.json +++ b/metrics/integration/query-tests/symbol/inside/expected.json @@ -318,4 +318,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/inside/style.json b/metrics/integration/query-tests/symbol/inside/style.json index b7fd69dbca08..b2189193a1cb 100644 --- a/metrics/integration/query-tests/symbol/inside/style.json +++ b/metrics/integration/query-tests/symbol/inside/style.json @@ -48,4 +48,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/outside/expected.json b/metrics/integration/query-tests/symbol/outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol/outside/expected.json +++ b/metrics/integration/query-tests/symbol/outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol/outside/style.json b/metrics/integration/query-tests/symbol/outside/style.json index 51c391691779..94195a7b307c 100644 --- a/metrics/integration/query-tests/symbol/outside/style.json +++ b/metrics/integration/query-tests/symbol/outside/style.json @@ -48,4 +48,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/panned-after-insert/expected.json b/metrics/integration/query-tests/symbol/panned-after-insert/expected.json index 2d15e0485b00..a1e251794403 100644 --- a/metrics/integration/query-tests/symbol/panned-after-insert/expected.json +++ b/metrics/integration/query-tests/symbol/panned-after-insert/expected.json @@ -1693,4 +1693,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/panned-after-insert/style.json b/metrics/integration/query-tests/symbol/panned-after-insert/style.json index 3f571683b082..5b6cf521ff58 100644 --- a/metrics/integration/query-tests/symbol/panned-after-insert/style.json +++ b/metrics/integration/query-tests/symbol/panned-after-insert/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/rotated-after-insert/expected.json b/metrics/integration/query-tests/symbol/rotated-after-insert/expected.json index 2d15e0485b00..a1e251794403 100644 --- a/metrics/integration/query-tests/symbol/rotated-after-insert/expected.json +++ b/metrics/integration/query-tests/symbol/rotated-after-insert/expected.json @@ -1693,4 +1693,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/rotated-after-insert/style.json b/metrics/integration/query-tests/symbol/rotated-after-insert/style.json index a73a9d91c6af..d1938ca0b2c7 100644 --- a/metrics/integration/query-tests/symbol/rotated-after-insert/style.json +++ b/metrics/integration/query-tests/symbol/rotated-after-insert/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/rotated-inside/expected.json b/metrics/integration/query-tests/symbol/rotated-inside/expected.json index 857968f2f03c..3631f7adfc3c 100644 --- a/metrics/integration/query-tests/symbol/rotated-inside/expected.json +++ b/metrics/integration/query-tests/symbol/rotated-inside/expected.json @@ -158,4 +158,4 @@ "sourceLayer": "counties", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/rotated-outside/expected.json b/metrics/integration/query-tests/symbol/rotated-outside/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/integration/query-tests/symbol/rotated-outside/expected.json +++ b/metrics/integration/query-tests/symbol/rotated-outside/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/integration/query-tests/symbol/rotated-outside/style.json b/metrics/integration/query-tests/symbol/rotated-outside/style.json index 41359851cc3c..ca140d2d8a33 100644 --- a/metrics/integration/query-tests/symbol/rotated-outside/style.json +++ b/metrics/integration/query-tests/symbol/rotated-outside/style.json @@ -49,4 +49,4 @@ "interactive": true } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/symbol/rotated-sort/expected.json b/metrics/integration/query-tests/symbol/rotated-sort/expected.json index 9db38b0e7e34..0097e45e171b 100644 --- a/metrics/integration/query-tests/symbol/rotated-sort/expected.json +++ b/metrics/integration/query-tests/symbol/rotated-sort/expected.json @@ -1693,4 +1693,4 @@ "source": "geojson", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/symbol/tile-boundary/expected.json b/metrics/integration/query-tests/symbol/tile-boundary/expected.json index b3953be868f5..0527ff49470c 100644 --- a/metrics/integration/query-tests/symbol/tile-boundary/expected.json +++ b/metrics/integration/query-tests/symbol/tile-boundary/expected.json @@ -12,4 +12,4 @@ "source": "point", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/world-wrapping/box/expected.json b/metrics/integration/query-tests/world-wrapping/box/expected.json index 29b73af738ad..ff182080272a 100644 --- a/metrics/integration/query-tests/world-wrapping/box/expected.json +++ b/metrics/integration/query-tests/world-wrapping/box/expected.json @@ -101,4 +101,4 @@ "sourceLayer": "hillshade", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/world-wrapping/box/style.json b/metrics/integration/query-tests/world-wrapping/box/style.json index d5822eefe1da..03ab73981fc3 100644 --- a/metrics/integration/query-tests/world-wrapping/box/style.json +++ b/metrics/integration/query-tests/world-wrapping/box/style.json @@ -47,4 +47,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/query-tests/world-wrapping/point/expected.json b/metrics/integration/query-tests/world-wrapping/point/expected.json index 4d0b7c0d5d43..f8d8de6a13fb 100644 --- a/metrics/integration/query-tests/world-wrapping/point/expected.json +++ b/metrics/integration/query-tests/world-wrapping/point/expected.json @@ -33,4 +33,4 @@ "sourceLayer": "hillshade", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/integration/query-tests/world-wrapping/point/style.json b/metrics/integration/query-tests/world-wrapping/point/style.json index ed0037a6210a..6d2b66926b1d 100644 --- a/metrics/integration/query-tests/world-wrapping/point/style.json +++ b/metrics/integration/query-tests/world-wrapping/point/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-color/default/style.json b/metrics/integration/render-tests/background-color/default/style.json index deafaa3c81fe..385d35a80caa 100644 --- a/metrics/integration/render-tests/background-color/default/style.json +++ b/metrics/integration/render-tests/background-color/default/style.json @@ -13,4 +13,4 @@ "type": "background" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-color/function/style.json b/metrics/integration/render-tests/background-color/function/style.json index 5c76b5152f78..3f486ba822d5 100644 --- a/metrics/integration/render-tests/background-color/function/style.json +++ b/metrics/integration/render-tests/background-color/function/style.json @@ -27,4 +27,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-color/literal/style.json b/metrics/integration/render-tests/background-color/literal/style.json index c00cd11f7a3c..e24ab4b65dce 100644 --- a/metrics/integration/render-tests/background-color/literal/style.json +++ b/metrics/integration/render-tests/background-color/literal/style.json @@ -16,4 +16,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-opacity/color/style.json b/metrics/integration/render-tests/background-opacity/color/style.json index bc8bff1c88b3..69d8e940dda9 100644 --- a/metrics/integration/render-tests/background-opacity/color/style.json +++ b/metrics/integration/render-tests/background-opacity/color/style.json @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-opacity/image/style.json b/metrics/integration/render-tests/background-opacity/image/style.json index 99163fc1cc2e..e0302a60470e 100644 --- a/metrics/integration/render-tests/background-opacity/image/style.json +++ b/metrics/integration/render-tests/background-opacity/image/style.json @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-pattern/@2x/style.json b/metrics/integration/render-tests/background-pattern/@2x/style.json index ef25cf6fc0be..45ba0877bb53 100644 --- a/metrics/integration/render-tests/background-pattern/@2x/style.json +++ b/metrics/integration/render-tests/background-pattern/@2x/style.json @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-pattern/literal/style.json b/metrics/integration/render-tests/background-pattern/literal/style.json index 960e7dd8eb3b..669ddd7a00d8 100644 --- a/metrics/integration/render-tests/background-pattern/literal/style.json +++ b/metrics/integration/render-tests/background-pattern/literal/style.json @@ -17,4 +17,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-pattern/pitch/style.json b/metrics/integration/render-tests/background-pattern/pitch/style.json index 199eca6e424e..8f4e7ccb67f6 100644 --- a/metrics/integration/render-tests/background-pattern/pitch/style.json +++ b/metrics/integration/render-tests/background-pattern/pitch/style.json @@ -19,4 +19,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-pattern/rotated/style.json b/metrics/integration/render-tests/background-pattern/rotated/style.json index b6798928182b..d780610a5888 100644 --- a/metrics/integration/render-tests/background-pattern/rotated/style.json +++ b/metrics/integration/render-tests/background-pattern/rotated/style.json @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-pattern/zoomed/style.json b/metrics/integration/render-tests/background-pattern/zoomed/style.json index 569ebfa32fff..cf60fc994c69 100644 --- a/metrics/integration/render-tests/background-pattern/zoomed/style.json +++ b/metrics/integration/render-tests/background-pattern/zoomed/style.json @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-visibility/none/style.json b/metrics/integration/render-tests/background-visibility/none/style.json index ad5a8bc716b1..f6d3ec03b706 100644 --- a/metrics/integration/render-tests/background-visibility/none/style.json +++ b/metrics/integration/render-tests/background-visibility/none/style.json @@ -16,4 +16,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/background-visibility/visible/style.json b/metrics/integration/render-tests/background-visibility/visible/style.json index cd1dd0890943..21aa45f62a50 100644 --- a/metrics/integration/render-tests/background-visibility/visible/style.json +++ b/metrics/integration/render-tests/background-visibility/visible/style.json @@ -16,4 +16,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/combinations/fill-opaque--image-translucent/style.json b/metrics/integration/render-tests/combinations/fill-opaque--image-translucent/style.json index 3fde0be5a8c6..508cb848ac5c 100644 --- a/metrics/integration/render-tests/combinations/fill-opaque--image-translucent/style.json +++ b/metrics/integration/render-tests/combinations/fill-opaque--image-translucent/style.json @@ -106,4 +106,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/debug/collision-icon-text-line-translate/style.json b/metrics/integration/render-tests/debug/collision-icon-text-line-translate/style.json index 15ba4c6086b4..b8d99496038b 100644 --- a/metrics/integration/render-tests/debug/collision-icon-text-line-translate/style.json +++ b/metrics/integration/render-tests/debug/collision-icon-text-line-translate/style.json @@ -78,4 +78,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/debug/collision-icon-text-point-translate/style.json b/metrics/integration/render-tests/debug/collision-icon-text-point-translate/style.json index 3103b50a10c8..6bbca38403c0 100644 --- a/metrics/integration/render-tests/debug/collision-icon-text-point-translate/style.json +++ b/metrics/integration/render-tests/debug/collision-icon-text-point-translate/style.json @@ -72,4 +72,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/debug/collision-overscaled/style.json b/metrics/integration/render-tests/debug/collision-overscaled/style.json index 3e6aa7bcbbec..89653ab213de 100644 --- a/metrics/integration/render-tests/debug/collision-overscaled/style.json +++ b/metrics/integration/render-tests/debug/collision-overscaled/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/debug/collision/style.json b/metrics/integration/render-tests/debug/collision/style.json index 289f6a153e7d..0bcb0d47d2eb 100644 --- a/metrics/integration/render-tests/debug/collision/style.json +++ b/metrics/integration/render-tests/debug/collision/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/debug/tile-overscaled/style.json b/metrics/integration/render-tests/debug/tile-overscaled/style.json index a403723c4eeb..16b153601427 100644 --- a/metrics/integration/render-tests/debug/tile-overscaled/style.json +++ b/metrics/integration/render-tests/debug/tile-overscaled/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/empty/empty/style.json b/metrics/integration/render-tests/empty/empty/style.json index 6a58d3121362..26235d4b584f 100644 --- a/metrics/integration/render-tests/empty/empty/style.json +++ b/metrics/integration/render-tests/empty/empty/style.json @@ -13,4 +13,4 @@ "zoom": 0, "sources": {}, "layers": [] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/extent/1024-circle/style.json b/metrics/integration/render-tests/extent/1024-circle/style.json index 782425434dd3..69c733e1a2f7 100644 --- a/metrics/integration/render-tests/extent/1024-circle/style.json +++ b/metrics/integration/render-tests/extent/1024-circle/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/extent/1024-fill/style.json b/metrics/integration/render-tests/extent/1024-fill/style.json index f181bf15a7da..4def8515e15c 100644 --- a/metrics/integration/render-tests/extent/1024-fill/style.json +++ b/metrics/integration/render-tests/extent/1024-fill/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/extent/1024-line/style.json b/metrics/integration/render-tests/extent/1024-line/style.json index d4b58a6e7605..719e2eae4f87 100644 --- a/metrics/integration/render-tests/extent/1024-line/style.json +++ b/metrics/integration/render-tests/extent/1024-line/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/extent/1024-symbol/style.json b/metrics/integration/render-tests/extent/1024-symbol/style.json index 041d324aa1a7..9677b54dc1b6 100644 --- a/metrics/integration/render-tests/extent/1024-symbol/style.json +++ b/metrics/integration/render-tests/extent/1024-symbol/style.json @@ -46,4 +46,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-antialias/false/style.json b/metrics/integration/render-tests/fill-antialias/false/style.json index fc9adb4e27c0..7c508c8edf71 100644 --- a/metrics/integration/render-tests/fill-antialias/false/style.json +++ b/metrics/integration/render-tests/fill-antialias/false/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-color/default/style.json b/metrics/integration/render-tests/fill-color/default/style.json index fc9adb4e27c0..7c508c8edf71 100644 --- a/metrics/integration/render-tests/fill-color/default/style.json +++ b/metrics/integration/render-tests/fill-color/default/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-color/function/style.json b/metrics/integration/render-tests/fill-color/function/style.json index 9119cde4f00e..ef404f300f20 100644 --- a/metrics/integration/render-tests/fill-color/function/style.json +++ b/metrics/integration/render-tests/fill-color/function/style.json @@ -60,4 +60,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-color/literal/style.json b/metrics/integration/render-tests/fill-color/literal/style.json index 3b324d84d950..a1ea491b8c4c 100644 --- a/metrics/integration/render-tests/fill-color/literal/style.json +++ b/metrics/integration/render-tests/fill-color/literal/style.json @@ -49,4 +49,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-color/multiply/style.json b/metrics/integration/render-tests/fill-color/multiply/style.json index 37868e0dd9ae..1102838b130b 100644 --- a/metrics/integration/render-tests/fill-color/multiply/style.json +++ b/metrics/integration/render-tests/fill-color/multiply/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-color/opacity/style.json b/metrics/integration/render-tests/fill-color/opacity/style.json index a589d21f3d87..c7123d1ddeca 100644 --- a/metrics/integration/render-tests/fill-color/opacity/style.json +++ b/metrics/integration/render-tests/fill-color/opacity/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-extrusion-pattern/missing/style.json b/metrics/integration/render-tests/fill-extrusion-pattern/missing/style.json index 8895e09262ae..3e278f3a8c8e 100644 --- a/metrics/integration/render-tests/fill-extrusion-pattern/missing/style.json +++ b/metrics/integration/render-tests/fill-extrusion-pattern/missing/style.json @@ -95,4 +95,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-opacity/default/style.json b/metrics/integration/render-tests/fill-opacity/default/style.json index 04a517e65105..c503070e502d 100644 --- a/metrics/integration/render-tests/fill-opacity/default/style.json +++ b/metrics/integration/render-tests/fill-opacity/default/style.json @@ -45,4 +45,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-opacity/function/style.json b/metrics/integration/render-tests/fill-opacity/function/style.json index c37b640acc91..0b0ee3e429b8 100644 --- a/metrics/integration/render-tests/fill-opacity/function/style.json +++ b/metrics/integration/render-tests/fill-opacity/function/style.json @@ -59,4 +59,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-opacity/literal/style.json b/metrics/integration/render-tests/fill-opacity/literal/style.json index 664e97c2607b..a09139e87211 100644 --- a/metrics/integration/render-tests/fill-opacity/literal/style.json +++ b/metrics/integration/render-tests/fill-opacity/literal/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/default/style.json b/metrics/integration/render-tests/fill-outline-color/default/style.json index cab0a71e5172..7ae38553e668 100644 --- a/metrics/integration/render-tests/fill-outline-color/default/style.json +++ b/metrics/integration/render-tests/fill-outline-color/default/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/fill/style.json b/metrics/integration/render-tests/fill-outline-color/fill/style.json index 7d23e7648fb3..99193ac2d391 100644 --- a/metrics/integration/render-tests/fill-outline-color/fill/style.json +++ b/metrics/integration/render-tests/fill-outline-color/fill/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/function/style.json b/metrics/integration/render-tests/fill-outline-color/function/style.json index 457900c525a0..acfa1ea60098 100644 --- a/metrics/integration/render-tests/fill-outline-color/function/style.json +++ b/metrics/integration/render-tests/fill-outline-color/function/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/literal/style.json b/metrics/integration/render-tests/fill-outline-color/literal/style.json index 1e8be720930f..2ce58a0bcd0f 100644 --- a/metrics/integration/render-tests/fill-outline-color/literal/style.json +++ b/metrics/integration/render-tests/fill-outline-color/literal/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/multiply/style.json b/metrics/integration/render-tests/fill-outline-color/multiply/style.json index f54b9711aaa5..3ea255aead43 100644 --- a/metrics/integration/render-tests/fill-outline-color/multiply/style.json +++ b/metrics/integration/render-tests/fill-outline-color/multiply/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/opacity/style.json b/metrics/integration/render-tests/fill-outline-color/opacity/style.json index cc57346269ed..f37f48f9eb63 100644 --- a/metrics/integration/render-tests/fill-outline-color/opacity/style.json +++ b/metrics/integration/render-tests/fill-outline-color/opacity/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-outline-color/zoom-and-property-function/style.json b/metrics/integration/render-tests/fill-outline-color/zoom-and-property-function/style.json index 1322032145f0..dadb7b93dba3 100644 --- a/metrics/integration/render-tests/fill-outline-color/zoom-and-property-function/style.json +++ b/metrics/integration/render-tests/fill-outline-color/zoom-and-property-function/style.json @@ -174,4 +174,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/@2x/style.json b/metrics/integration/render-tests/fill-pattern/@2x/style.json index 1d12983c3923..b7e6e4e45456 100644 --- a/metrics/integration/render-tests/fill-pattern/@2x/style.json +++ b/metrics/integration/render-tests/fill-pattern/@2x/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/case-data-expression/style.json b/metrics/integration/render-tests/fill-pattern/case-data-expression/style.json index 54a92f940927..cdf00a9e340b 100644 --- a/metrics/integration/render-tests/fill-pattern/case-data-expression/style.json +++ b/metrics/integration/render-tests/fill-pattern/case-data-expression/style.json @@ -126,5 +126,3 @@ } ] } - - diff --git a/metrics/integration/render-tests/fill-pattern/invalid-feature-expression/style.json b/metrics/integration/render-tests/fill-pattern/invalid-feature-expression/style.json index 33db53cb4d7c..d179989f164c 100644 --- a/metrics/integration/render-tests/fill-pattern/invalid-feature-expression/style.json +++ b/metrics/integration/render-tests/fill-pattern/invalid-feature-expression/style.json @@ -131,5 +131,3 @@ } ] } - - diff --git a/metrics/integration/render-tests/fill-pattern/literal/style.json b/metrics/integration/render-tests/fill-pattern/literal/style.json index 32304b61472c..c5b32c0b4ca4 100644 --- a/metrics/integration/render-tests/fill-pattern/literal/style.json +++ b/metrics/integration/render-tests/fill-pattern/literal/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/opacity/style.json b/metrics/integration/render-tests/fill-pattern/opacity/style.json index eb10f8147914..d4a452ddabe1 100644 --- a/metrics/integration/render-tests/fill-pattern/opacity/style.json +++ b/metrics/integration/render-tests/fill-pattern/opacity/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/uneven-pattern/style.json b/metrics/integration/render-tests/fill-pattern/uneven-pattern/style.json index 3b2cf3baa7de..33179f392f88 100644 --- a/metrics/integration/render-tests/fill-pattern/uneven-pattern/style.json +++ b/metrics/integration/render-tests/fill-pattern/uneven-pattern/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/wrapping-with-interpolation/style.json b/metrics/integration/render-tests/fill-pattern/wrapping-with-interpolation/style.json index 9f031e4bfdc0..65044fce9ee1 100644 --- a/metrics/integration/render-tests/fill-pattern/wrapping-with-interpolation/style.json +++ b/metrics/integration/render-tests/fill-pattern/wrapping-with-interpolation/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-pattern/zoomed/style.json b/metrics/integration/render-tests/fill-pattern/zoomed/style.json index 42b7cd219136..7a6766a6d62c 100644 --- a/metrics/integration/render-tests/fill-pattern/zoomed/style.json +++ b/metrics/integration/render-tests/fill-pattern/zoomed/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-translate-anchor/map/style.json b/metrics/integration/render-tests/fill-translate-anchor/map/style.json index 32e0e178388c..e6898eb24a05 100644 --- a/metrics/integration/render-tests/fill-translate-anchor/map/style.json +++ b/metrics/integration/render-tests/fill-translate-anchor/map/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-translate-anchor/viewport/style.json b/metrics/integration/render-tests/fill-translate-anchor/viewport/style.json index e20eadf98ef6..b759ccab0abd 100644 --- a/metrics/integration/render-tests/fill-translate-anchor/viewport/style.json +++ b/metrics/integration/render-tests/fill-translate-anchor/viewport/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-translate/default/style.json b/metrics/integration/render-tests/fill-translate/default/style.json index fc9adb4e27c0..7c508c8edf71 100644 --- a/metrics/integration/render-tests/fill-translate/default/style.json +++ b/metrics/integration/render-tests/fill-translate/default/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-translate/function/style.json b/metrics/integration/render-tests/fill-translate/function/style.json index 8a76cd7a2fb8..ec7367699b78 100644 --- a/metrics/integration/render-tests/fill-translate/function/style.json +++ b/metrics/integration/render-tests/fill-translate/function/style.json @@ -66,4 +66,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-translate/literal/style.json b/metrics/integration/render-tests/fill-translate/literal/style.json index 9cbb19cd0a1b..7be1ddbf5bff 100644 --- a/metrics/integration/render-tests/fill-translate/literal/style.json +++ b/metrics/integration/render-tests/fill-translate/literal/style.json @@ -52,4 +52,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-visibility/none/style.json b/metrics/integration/render-tests/fill-visibility/none/style.json index aa8183bb9eea..881704da9e74 100644 --- a/metrics/integration/render-tests/fill-visibility/none/style.json +++ b/metrics/integration/render-tests/fill-visibility/none/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/fill-visibility/visible/style.json b/metrics/integration/render-tests/fill-visibility/visible/style.json index 8d8a786cf692..1cf07b217620 100644 --- a/metrics/integration/render-tests/fill-visibility/visible/style.json +++ b/metrics/integration/render-tests/fill-visibility/visible/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/external-feature/style.json b/metrics/integration/render-tests/geojson/external-feature/style.json index 5aeefd779c60..244e0c4ef955 100644 --- a/metrics/integration/render-tests/geojson/external-feature/style.json +++ b/metrics/integration/render-tests/geojson/external-feature/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/external-invalid/style.json b/metrics/integration/render-tests/geojson/external-invalid/style.json index 3f07825d5fde..85100757e615 100644 --- a/metrics/integration/render-tests/geojson/external-invalid/style.json +++ b/metrics/integration/render-tests/geojson/external-invalid/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/external-linestring/style.json b/metrics/integration/render-tests/geojson/external-linestring/style.json index 5aeefd779c60..244e0c4ef955 100644 --- a/metrics/integration/render-tests/geojson/external-linestring/style.json +++ b/metrics/integration/render-tests/geojson/external-linestring/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/external-malformed/style.json b/metrics/integration/render-tests/geojson/external-malformed/style.json index 3e080600e751..7e90fb9b17d9 100644 --- a/metrics/integration/render-tests/geojson/external-malformed/style.json +++ b/metrics/integration/render-tests/geojson/external-malformed/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inconsistent-winding-order/style.json b/metrics/integration/render-tests/geojson/inconsistent-winding-order/style.json index f07396f8365c..a5af7ae305d5 100644 --- a/metrics/integration/render-tests/geojson/inconsistent-winding-order/style.json +++ b/metrics/integration/render-tests/geojson/inconsistent-winding-order/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inline-feature/style.json b/metrics/integration/render-tests/geojson/inline-feature/style.json index d0a1e74e33f7..34d19a0c469d 100644 --- a/metrics/integration/render-tests/geojson/inline-feature/style.json +++ b/metrics/integration/render-tests/geojson/inline-feature/style.json @@ -734,4 +734,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inline-invalid/style.json b/metrics/integration/render-tests/geojson/inline-invalid/style.json index 64ab0777e917..0e75de893584 100644 --- a/metrics/integration/render-tests/geojson/inline-invalid/style.json +++ b/metrics/integration/render-tests/geojson/inline-invalid/style.json @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inline-linestring-fill/style.json b/metrics/integration/render-tests/geojson/inline-linestring-fill/style.json index 294ab9f16a86..809f6ed85edb 100644 --- a/metrics/integration/render-tests/geojson/inline-linestring-fill/style.json +++ b/metrics/integration/render-tests/geojson/inline-linestring-fill/style.json @@ -40,4 +40,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inline-malformed/style.json b/metrics/integration/render-tests/geojson/inline-malformed/style.json index d412d2864271..f38a0dcb3944 100644 --- a/metrics/integration/render-tests/geojson/inline-malformed/style.json +++ b/metrics/integration/render-tests/geojson/inline-malformed/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/inline-polygon-symbol/style.json b/metrics/integration/render-tests/geojson/inline-polygon-symbol/style.json index ad8d5505ddbf..87bdb5b9ff85 100644 --- a/metrics/integration/render-tests/geojson/inline-polygon-symbol/style.json +++ b/metrics/integration/render-tests/geojson/inline-polygon-symbol/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/missing/style.json b/metrics/integration/render-tests/geojson/missing/style.json index 856abfb61966..de749535786d 100644 --- a/metrics/integration/render-tests/geojson/missing/style.json +++ b/metrics/integration/render-tests/geojson/missing/style.json @@ -27,4 +27,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/geojson/reparse-overscaled/style.json b/metrics/integration/render-tests/geojson/reparse-overscaled/style.json index c27a1d2ba05d..477d977eb7e7 100644 --- a/metrics/integration/render-tests/geojson/reparse-overscaled/style.json +++ b/metrics/integration/render-tests/geojson/reparse-overscaled/style.json @@ -29,4 +29,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-color/default/style.json b/metrics/integration/render-tests/icon-color/default/style.json index 195b84d2ae0d..4cd9745554a4 100644 --- a/metrics/integration/render-tests/icon-color/default/style.json +++ b/metrics/integration/render-tests/icon-color/default/style.json @@ -29,4 +29,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-color/function/style.json b/metrics/integration/render-tests/icon-color/function/style.json index 6443a3266428..aed924b6809e 100644 --- a/metrics/integration/render-tests/icon-color/function/style.json +++ b/metrics/integration/render-tests/icon-color/function/style.json @@ -43,4 +43,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-color/literal/style.json b/metrics/integration/render-tests/icon-color/literal/style.json index 6f2cd053107c..cc9d30b0bf5e 100644 --- a/metrics/integration/render-tests/icon-color/literal/style.json +++ b/metrics/integration/render-tests/icon-color/literal/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-blur/default/style.json b/metrics/integration/render-tests/icon-halo-blur/default/style.json index 6af459788978..bbf2d5e4bbfa 100644 --- a/metrics/integration/render-tests/icon-halo-blur/default/style.json +++ b/metrics/integration/render-tests/icon-halo-blur/default/style.json @@ -33,4 +33,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-blur/function/style.json b/metrics/integration/render-tests/icon-halo-blur/function/style.json index 50d5d55e5a33..b777019ffeb1 100644 --- a/metrics/integration/render-tests/icon-halo-blur/function/style.json +++ b/metrics/integration/render-tests/icon-halo-blur/function/style.json @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-blur/literal/style.json b/metrics/integration/render-tests/icon-halo-blur/literal/style.json index 14cbc84fa57a..9ea6a34bee4a 100644 --- a/metrics/integration/render-tests/icon-halo-blur/literal/style.json +++ b/metrics/integration/render-tests/icon-halo-blur/literal/style.json @@ -34,4 +34,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/default/style.json b/metrics/integration/render-tests/icon-halo-color/default/style.json index dfbb7dbb32c8..bc7ebcd0c439 100644 --- a/metrics/integration/render-tests/icon-halo-color/default/style.json +++ b/metrics/integration/render-tests/icon-halo-color/default/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/function/style.json b/metrics/integration/render-tests/icon-halo-color/function/style.json index 521b763808fe..a747e5e6274e 100644 --- a/metrics/integration/render-tests/icon-halo-color/function/style.json +++ b/metrics/integration/render-tests/icon-halo-color/function/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/literal/style.json b/metrics/integration/render-tests/icon-halo-color/literal/style.json index 9c92b9b177e0..ba97e32e1ca7 100644 --- a/metrics/integration/render-tests/icon-halo-color/literal/style.json +++ b/metrics/integration/render-tests/icon-halo-color/literal/style.json @@ -33,4 +33,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/multiply/style.json b/metrics/integration/render-tests/icon-halo-color/multiply/style.json index 06755a5073a1..fb086533f0eb 100644 --- a/metrics/integration/render-tests/icon-halo-color/multiply/style.json +++ b/metrics/integration/render-tests/icon-halo-color/multiply/style.json @@ -34,4 +34,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/opacity/style.json b/metrics/integration/render-tests/icon-halo-color/opacity/style.json index adb4d345eb18..43912a75a73d 100644 --- a/metrics/integration/render-tests/icon-halo-color/opacity/style.json +++ b/metrics/integration/render-tests/icon-halo-color/opacity/style.json @@ -34,4 +34,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-color/transparent/style.json b/metrics/integration/render-tests/icon-halo-color/transparent/style.json index d2108d9dda08..b49b070debc7 100644 --- a/metrics/integration/render-tests/icon-halo-color/transparent/style.json +++ b/metrics/integration/render-tests/icon-halo-color/transparent/style.json @@ -34,4 +34,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-width/default/style.json b/metrics/integration/render-tests/icon-halo-width/default/style.json index 7e05a1484b7f..0c5627e34346 100644 --- a/metrics/integration/render-tests/icon-halo-width/default/style.json +++ b/metrics/integration/render-tests/icon-halo-width/default/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-width/function/style.json b/metrics/integration/render-tests/icon-halo-width/function/style.json index dc0f18869436..a9db4a7884a3 100644 --- a/metrics/integration/render-tests/icon-halo-width/function/style.json +++ b/metrics/integration/render-tests/icon-halo-width/function/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-halo-width/literal/style.json b/metrics/integration/render-tests/icon-halo-width/literal/style.json index 6af459788978..bbf2d5e4bbfa 100644 --- a/metrics/integration/render-tests/icon-halo-width/literal/style.json +++ b/metrics/integration/render-tests/icon-halo-width/literal/style.json @@ -33,4 +33,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-offset/literal/style.json b/metrics/integration/render-tests/icon-offset/literal/style.json index ee070e48b093..6476f2d2fb4f 100644 --- a/metrics/integration/render-tests/icon-offset/literal/style.json +++ b/metrics/integration/render-tests/icon-offset/literal/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/default/style.json b/metrics/integration/render-tests/icon-opacity/default/style.json index d2428e36a156..49abb78de86e 100644 --- a/metrics/integration/render-tests/icon-opacity/default/style.json +++ b/metrics/integration/render-tests/icon-opacity/default/style.json @@ -48,4 +48,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/function/style.json b/metrics/integration/render-tests/icon-opacity/function/style.json index 2188a9fc3859..d00f03234968 100644 --- a/metrics/integration/render-tests/icon-opacity/function/style.json +++ b/metrics/integration/render-tests/icon-opacity/function/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/icon-only/style.json b/metrics/integration/render-tests/icon-opacity/icon-only/style.json index 8acf8cee0119..75782495e9d4 100644 --- a/metrics/integration/render-tests/icon-opacity/icon-only/style.json +++ b/metrics/integration/render-tests/icon-opacity/icon-only/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/literal/style.json b/metrics/integration/render-tests/icon-opacity/literal/style.json index 91f053f129ce..110e607c26db 100644 --- a/metrics/integration/render-tests/icon-opacity/literal/style.json +++ b/metrics/integration/render-tests/icon-opacity/literal/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/text-and-icon/style.json b/metrics/integration/render-tests/icon-opacity/text-and-icon/style.json index 837b36b1df91..29aaa05f3809 100644 --- a/metrics/integration/render-tests/icon-opacity/text-and-icon/style.json +++ b/metrics/integration/render-tests/icon-opacity/text-and-icon/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-opacity/text-only/style.json b/metrics/integration/render-tests/icon-opacity/text-only/style.json index 88de3e6b86b6..bd56dccdd58f 100644 --- a/metrics/integration/render-tests/icon-opacity/text-only/style.json +++ b/metrics/integration/render-tests/icon-opacity/text-only/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-line/style.json b/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-line/style.json index 07e4c34b6450..ee895eaba483 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-line/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-line/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-point/style.json b/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-point/style.json index e288eaf10ac6..e01efee01472 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/auto-symbol-placement-point/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-line/style.json b/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-line/style.json index 1943dbb22b5b..a9b3781b4bd5 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-line/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-line/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-point/style.json b/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-point/style.json index 6c41bc510cff..f31576a912fc 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/map-symbol-placement-point/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/style.json b/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/style.json index 4ff754821377..e5abf6491c0b 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/style.json b/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/style.json index 3567ca88d816..abd54daad6e8 100644 --- a/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/style.json b/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/style.json index df1eb8aa177d..079e47184fd3 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/style.json @@ -70,4 +70,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor/style.json b/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor/style.json index c1f2213864a8..e15a62c15109 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-collision-variable-anchor/style.json @@ -67,4 +67,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-collision/style.json b/metrics/integration/render-tests/icon-text-fit/both-collision/style.json index 7296ab56940b..f2507c6b5fb1 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-collision/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-collision/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-padding/style.json b/metrics/integration/render-tests/icon-text-fit/both-padding/style.json index 274141e97bf6..ceb9a26dd891 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-padding/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/style.json index 087a99dd604f..eee4fe52733b 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/style.json @@ -190,4 +190,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/style.json index d21af0963b4d..45d559aedf35 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/style.json @@ -189,4 +189,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/style.json index 1e75952eb137..aee925a618b5 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/style.json @@ -191,4 +191,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-anchor/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-anchor/style.json index 354b691aa720..03369aee071b 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-anchor/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-anchor/style.json @@ -198,4 +198,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-offset/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-offset/style.json index 9218b731040f..c98ea4f6a91f 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-offset/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-icon-offset/style.json @@ -198,4 +198,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-padding/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-padding/style.json index 3be058e38f89..1f99ca895d61 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor-padding/style.json @@ -198,4 +198,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both-text-anchor/style.json b/metrics/integration/render-tests/icon-text-fit/both-text-anchor/style.json index b3a3e0b7772c..8885a32d56e7 100644 --- a/metrics/integration/render-tests/icon-text-fit/both-text-anchor/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both-text-anchor/style.json @@ -189,4 +189,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/both/style.json b/metrics/integration/render-tests/icon-text-fit/both/style.json index 17017a0351ba..7fc996b2a250 100644 --- a/metrics/integration/render-tests/icon-text-fit/both/style.json +++ b/metrics/integration/render-tests/icon-text-fit/both/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/enlargen-both-padding/style.json b/metrics/integration/render-tests/icon-text-fit/enlargen-both-padding/style.json index 2114e648b4fb..ffd297238996 100644 --- a/metrics/integration/render-tests/icon-text-fit/enlargen-both-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/enlargen-both-padding/style.json @@ -39,4 +39,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/enlargen-both/style.json b/metrics/integration/render-tests/icon-text-fit/enlargen-both/style.json index 7c76c51f153d..178002d6b71f 100644 --- a/metrics/integration/render-tests/icon-text-fit/enlargen-both/style.json +++ b/metrics/integration/render-tests/icon-text-fit/enlargen-both/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/enlargen-height/style.json b/metrics/integration/render-tests/icon-text-fit/enlargen-height/style.json index 2cf205f0b6de..caa1d9a737d6 100644 --- a/metrics/integration/render-tests/icon-text-fit/enlargen-height/style.json +++ b/metrics/integration/render-tests/icon-text-fit/enlargen-height/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/enlargen-width/style.json b/metrics/integration/render-tests/icon-text-fit/enlargen-width/style.json index 00f0e2934884..907842e2dbb2 100644 --- a/metrics/integration/render-tests/icon-text-fit/enlargen-width/style.json +++ b/metrics/integration/render-tests/icon-text-fit/enlargen-width/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/height-padding/style.json b/metrics/integration/render-tests/icon-text-fit/height-padding/style.json index 377ef31c01c1..d7826c8696cf 100644 --- a/metrics/integration/render-tests/icon-text-fit/height-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/height-padding/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/height-text-anchor-padding/style.json b/metrics/integration/render-tests/icon-text-fit/height-text-anchor-padding/style.json index 253b546ff42b..fb128f184e8f 100644 --- a/metrics/integration/render-tests/icon-text-fit/height-text-anchor-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/height-text-anchor-padding/style.json @@ -198,4 +198,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/height-text-anchor/style.json b/metrics/integration/render-tests/icon-text-fit/height-text-anchor/style.json index 582d02aab07e..29e11ab10d70 100644 --- a/metrics/integration/render-tests/icon-text-fit/height-text-anchor/style.json +++ b/metrics/integration/render-tests/icon-text-fit/height-text-anchor/style.json @@ -189,4 +189,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/height/style.json b/metrics/integration/render-tests/icon-text-fit/height/style.json index 58263210f9fc..f8fabeb74cae 100644 --- a/metrics/integration/render-tests/icon-text-fit/height/style.json +++ b/metrics/integration/render-tests/icon-text-fit/height/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/none/style.json b/metrics/integration/render-tests/icon-text-fit/none/style.json index d5a1ea091799..2026183b5e7d 100644 --- a/metrics/integration/render-tests/icon-text-fit/none/style.json +++ b/metrics/integration/render-tests/icon-text-fit/none/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-anchors-long/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-anchors-long/style.json index daa6053e117c..652199e1cd54 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-anchors-long/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-anchors-long/style.json @@ -190,4 +190,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-anchors-short/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-anchors-short/style.json index 1587d6940b34..4834988ff83e 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-anchors-short/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-anchors-short/style.json @@ -190,4 +190,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-grid-long-vertical/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-grid-long-vertical/style.json index 76d81ef81121..d427724c8e98 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-grid-long-vertical/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-grid-long-vertical/style.json @@ -188,4 +188,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-grid-long/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-grid-long/style.json index 85fe30f01c3d..05629fb17024 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-grid-long/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-grid-long/style.json @@ -179,4 +179,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-grid-short-vertical/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-grid-short-vertical/style.json index b163434ee132..6558733696e6 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-grid-short-vertical/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-grid-short-vertical/style.json @@ -188,4 +188,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/textFit-grid-short/style.json b/metrics/integration/render-tests/icon-text-fit/textFit-grid-short/style.json index 432b6cee7830..8a0411674337 100644 --- a/metrics/integration/render-tests/icon-text-fit/textFit-grid-short/style.json +++ b/metrics/integration/render-tests/icon-text-fit/textFit-grid-short/style.json @@ -179,4 +179,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/icon-text-fit/width-padding/style.json b/metrics/integration/render-tests/icon-text-fit/width-padding/style.json index c886c9a43554..dc18bccf5f40 100644 --- a/metrics/integration/render-tests/icon-text-fit/width-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/width-padding/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/width-text-anchor-padding/style.json b/metrics/integration/render-tests/icon-text-fit/width-text-anchor-padding/style.json index 0bfc7214cdb8..c3afba47b0bc 100644 --- a/metrics/integration/render-tests/icon-text-fit/width-text-anchor-padding/style.json +++ b/metrics/integration/render-tests/icon-text-fit/width-text-anchor-padding/style.json @@ -198,4 +198,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/width-text-anchor/style.json b/metrics/integration/render-tests/icon-text-fit/width-text-anchor/style.json index 783b19cdd0dd..b5762c3f0d08 100644 --- a/metrics/integration/render-tests/icon-text-fit/width-text-anchor/style.json +++ b/metrics/integration/render-tests/icon-text-fit/width-text-anchor/style.json @@ -189,4 +189,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-text-fit/width/style.json b/metrics/integration/render-tests/icon-text-fit/width/style.json index 48ba9c444666..a2dbe21815cf 100644 --- a/metrics/integration/render-tests/icon-text-fit/width/style.json +++ b/metrics/integration/render-tests/icon-text-fit/width/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-translate-anchor/map/style.json b/metrics/integration/render-tests/icon-translate-anchor/map/style.json index 152d5a30f4f3..4a3f01583615 100644 --- a/metrics/integration/render-tests/icon-translate-anchor/map/style.json +++ b/metrics/integration/render-tests/icon-translate-anchor/map/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-translate-anchor/viewport/style.json b/metrics/integration/render-tests/icon-translate-anchor/viewport/style.json index 5195e42c92ab..f66cdab28f3a 100644 --- a/metrics/integration/render-tests/icon-translate-anchor/viewport/style.json +++ b/metrics/integration/render-tests/icon-translate-anchor/viewport/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-translate/default/style.json b/metrics/integration/render-tests/icon-translate/default/style.json index 7268e11afc16..11e74054d010 100644 --- a/metrics/integration/render-tests/icon-translate/default/style.json +++ b/metrics/integration/render-tests/icon-translate/default/style.json @@ -47,4 +47,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-translate/function/style.json b/metrics/integration/render-tests/icon-translate/function/style.json index e62ec20a0962..516c3e8f8cbd 100644 --- a/metrics/integration/render-tests/icon-translate/function/style.json +++ b/metrics/integration/render-tests/icon-translate/function/style.json @@ -66,4 +66,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-translate/literal/style.json b/metrics/integration/render-tests/icon-translate/literal/style.json index 3839f991ad82..81acd98eaedf 100644 --- a/metrics/integration/render-tests/icon-translate/literal/style.json +++ b/metrics/integration/render-tests/icon-translate/literal/style.json @@ -52,4 +52,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-visibility/none/style.json b/metrics/integration/render-tests/icon-visibility/none/style.json index 4f1e76404d95..98e437b0ce20 100644 --- a/metrics/integration/render-tests/icon-visibility/none/style.json +++ b/metrics/integration/render-tests/icon-visibility/none/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/icon-visibility/visible/style.json b/metrics/integration/render-tests/icon-visibility/visible/style.json index 46d5c3358627..05960757455a 100644 --- a/metrics/integration/render-tests/icon-visibility/visible/style.json +++ b/metrics/integration/render-tests/icon-visibility/visible/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/default/style.json b/metrics/integration/render-tests/image/default/style.json index f417e14ace66..0ddb70e5daf5 100644 --- a/metrics/integration/render-tests/image/default/style.json +++ b/metrics/integration/render-tests/image/default/style.json @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/pitched/style.json b/metrics/integration/render-tests/image/pitched/style.json index e73a9db77e3d..3c0a5804855c 100644 --- a/metrics/integration/render-tests/image/pitched/style.json +++ b/metrics/integration/render-tests/image/pitched/style.json @@ -34,4 +34,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-brightness/style.json b/metrics/integration/render-tests/image/raster-brightness/style.json index 14c3f9065ef6..b50286d82adb 100644 --- a/metrics/integration/render-tests/image/raster-brightness/style.json +++ b/metrics/integration/render-tests/image/raster-brightness/style.json @@ -47,4 +47,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-contrast/style.json b/metrics/integration/render-tests/image/raster-contrast/style.json index 6d3df6a0a730..060d09222204 100644 --- a/metrics/integration/render-tests/image/raster-contrast/style.json +++ b/metrics/integration/render-tests/image/raster-contrast/style.json @@ -46,4 +46,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-hue-rotate/style.json b/metrics/integration/render-tests/image/raster-hue-rotate/style.json index c8f53c4326be..74a70ceeae61 100644 --- a/metrics/integration/render-tests/image/raster-hue-rotate/style.json +++ b/metrics/integration/render-tests/image/raster-hue-rotate/style.json @@ -46,4 +46,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-opacity/style.json b/metrics/integration/render-tests/image/raster-opacity/style.json index 09733fff75db..e80affae5e12 100644 --- a/metrics/integration/render-tests/image/raster-opacity/style.json +++ b/metrics/integration/render-tests/image/raster-opacity/style.json @@ -46,4 +46,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-saturation/style.json b/metrics/integration/render-tests/image/raster-saturation/style.json index c5bd8da83a3d..971aaa75dbd3 100644 --- a/metrics/integration/render-tests/image/raster-saturation/style.json +++ b/metrics/integration/render-tests/image/raster-saturation/style.json @@ -46,4 +46,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/image/raster-visibility/style.json b/metrics/integration/render-tests/image/raster-visibility/style.json index f417e14ace66..0ddb70e5daf5 100644 --- a/metrics/integration/render-tests/image/raster-visibility/style.json +++ b/metrics/integration/render-tests/image/raster-visibility/style.json @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-blur/default/style.json b/metrics/integration/render-tests/line-blur/default/style.json index ff08fa0a5aea..762210380bbb 100644 --- a/metrics/integration/render-tests/line-blur/default/style.json +++ b/metrics/integration/render-tests/line-blur/default/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-blur/function/style.json b/metrics/integration/render-tests/line-blur/function/style.json index a47832f33ed3..521735fcab2b 100644 --- a/metrics/integration/render-tests/line-blur/function/style.json +++ b/metrics/integration/render-tests/line-blur/function/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-blur/literal/style.json b/metrics/integration/render-tests/line-blur/literal/style.json index ccfb2e85bffa..d23550319c64 100644 --- a/metrics/integration/render-tests/line-blur/literal/style.json +++ b/metrics/integration/render-tests/line-blur/literal/style.json @@ -39,4 +39,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-cap/butt/style.json b/metrics/integration/render-tests/line-cap/butt/style.json index b336a0a1d0f3..4d1bbb4bc80f 100644 --- a/metrics/integration/render-tests/line-cap/butt/style.json +++ b/metrics/integration/render-tests/line-cap/butt/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-cap/round/style.json b/metrics/integration/render-tests/line-cap/round/style.json index 9280f3f52f61..ba5595e2c57f 100644 --- a/metrics/integration/render-tests/line-cap/round/style.json +++ b/metrics/integration/render-tests/line-cap/round/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-cap/square/style.json b/metrics/integration/render-tests/line-cap/square/style.json index 77ecd2054900..f482630f940d 100644 --- a/metrics/integration/render-tests/line-cap/square/style.json +++ b/metrics/integration/render-tests/line-cap/square/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-color/default/style.json b/metrics/integration/render-tests/line-color/default/style.json index 78021eaa628d..5f4e91291d9b 100644 --- a/metrics/integration/render-tests/line-color/default/style.json +++ b/metrics/integration/render-tests/line-color/default/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-color/function/style.json b/metrics/integration/render-tests/line-color/function/style.json index b4a5daa1b1b7..3fb9461d9938 100644 --- a/metrics/integration/render-tests/line-color/function/style.json +++ b/metrics/integration/render-tests/line-color/function/style.json @@ -49,4 +49,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-color/literal/style.json b/metrics/integration/render-tests/line-color/literal/style.json index e70ffe166819..c36df30cb1e4 100644 --- a/metrics/integration/render-tests/line-color/literal/style.json +++ b/metrics/integration/render-tests/line-color/literal/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-dasharray/long-segment/style.json b/metrics/integration/render-tests/line-dasharray/long-segment/style.json index b87c5b628b4a..2a0597226977 100644 --- a/metrics/integration/render-tests/line-dasharray/long-segment/style.json +++ b/metrics/integration/render-tests/line-dasharray/long-segment/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-dasharray/overscaled/style.json b/metrics/integration/render-tests/line-dasharray/overscaled/style.json index 0f23d1e4dd2c..1524228d7cbc 100644 --- a/metrics/integration/render-tests/line-dasharray/overscaled/style.json +++ b/metrics/integration/render-tests/line-dasharray/overscaled/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-dasharray/slant/style.json b/metrics/integration/render-tests/line-dasharray/slant/style.json index f1e503abe938..4bbcf964b90f 100644 --- a/metrics/integration/render-tests/line-dasharray/slant/style.json +++ b/metrics/integration/render-tests/line-dasharray/slant/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-gap-width/default/style.json b/metrics/integration/render-tests/line-gap-width/default/style.json index 3c1cce5bddbb..66e3852620c0 100644 --- a/metrics/integration/render-tests/line-gap-width/default/style.json +++ b/metrics/integration/render-tests/line-gap-width/default/style.json @@ -66,4 +66,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-gap-width/function/style.json b/metrics/integration/render-tests/line-gap-width/function/style.json index d66a2f77318b..c54e4c22642f 100644 --- a/metrics/integration/render-tests/line-gap-width/function/style.json +++ b/metrics/integration/render-tests/line-gap-width/function/style.json @@ -80,4 +80,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-gap-width/literal/style.json b/metrics/integration/render-tests/line-gap-width/literal/style.json index b9e0e8a24528..ddd2ce84e41c 100644 --- a/metrics/integration/render-tests/line-gap-width/literal/style.json +++ b/metrics/integration/render-tests/line-gap-width/literal/style.json @@ -69,4 +69,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-offset/default/style.json b/metrics/integration/render-tests/line-offset/default/style.json index 9fec41f7df6c..a76ac2c655ea 100644 --- a/metrics/integration/render-tests/line-offset/default/style.json +++ b/metrics/integration/render-tests/line-offset/default/style.json @@ -39,4 +39,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-offset/function/style.json b/metrics/integration/render-tests/line-offset/function/style.json index 1b8d36ceb63e..cbf7fd2e98e2 100644 --- a/metrics/integration/render-tests/line-offset/function/style.json +++ b/metrics/integration/render-tests/line-offset/function/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-offset/literal-negative/style.json b/metrics/integration/render-tests/line-offset/literal-negative/style.json index c73c27974f24..d7ecc8f46306 100644 --- a/metrics/integration/render-tests/line-offset/literal-negative/style.json +++ b/metrics/integration/render-tests/line-offset/literal-negative/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-offset/literal/style.json b/metrics/integration/render-tests/line-offset/literal/style.json index e10e900686ec..aa711bc3bf2f 100644 --- a/metrics/integration/render-tests/line-offset/literal/style.json +++ b/metrics/integration/render-tests/line-offset/literal/style.json @@ -39,4 +39,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-opacity/default/style.json b/metrics/integration/render-tests/line-opacity/default/style.json index 01b8ab97896f..895a892f32bc 100644 --- a/metrics/integration/render-tests/line-opacity/default/style.json +++ b/metrics/integration/render-tests/line-opacity/default/style.json @@ -69,4 +69,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-opacity/function/style.json b/metrics/integration/render-tests/line-opacity/function/style.json index b130e9094db9..0669af3a586e 100644 --- a/metrics/integration/render-tests/line-opacity/function/style.json +++ b/metrics/integration/render-tests/line-opacity/function/style.json @@ -81,4 +81,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-opacity/literal/style.json b/metrics/integration/render-tests/line-opacity/literal/style.json index 50213cf69e30..94a04db46bd5 100644 --- a/metrics/integration/render-tests/line-opacity/literal/style.json +++ b/metrics/integration/render-tests/line-opacity/literal/style.json @@ -70,4 +70,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-pitch/default/style.json b/metrics/integration/render-tests/line-pitch/default/style.json index 78021eaa628d..5f4e91291d9b 100644 --- a/metrics/integration/render-tests/line-pitch/default/style.json +++ b/metrics/integration/render-tests/line-pitch/default/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-pitch/pitch0/style.json b/metrics/integration/render-tests/line-pitch/pitch0/style.json index 374e28ead975..1550e816ebda 100644 --- a/metrics/integration/render-tests/line-pitch/pitch0/style.json +++ b/metrics/integration/render-tests/line-pitch/pitch0/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-pitch/pitch15/style.json b/metrics/integration/render-tests/line-pitch/pitch15/style.json index b6c2a33a496d..86ab881f2213 100644 --- a/metrics/integration/render-tests/line-pitch/pitch15/style.json +++ b/metrics/integration/render-tests/line-pitch/pitch15/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-pitch/pitch30/style.json b/metrics/integration/render-tests/line-pitch/pitch30/style.json index a8b8fab09ce1..2e0a653f78d8 100644 --- a/metrics/integration/render-tests/line-pitch/pitch30/style.json +++ b/metrics/integration/render-tests/line-pitch/pitch30/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-pitch/pitchAndBearing/style.json b/metrics/integration/render-tests/line-pitch/pitchAndBearing/style.json index daefa3a93354..57ac73b90b66 100644 --- a/metrics/integration/render-tests/line-pitch/pitchAndBearing/style.json +++ b/metrics/integration/render-tests/line-pitch/pitchAndBearing/style.json @@ -39,4 +39,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-translate-anchor/map/style.json b/metrics/integration/render-tests/line-translate-anchor/map/style.json index 718dd1912ed5..88a48cb6c5d8 100644 --- a/metrics/integration/render-tests/line-translate-anchor/map/style.json +++ b/metrics/integration/render-tests/line-translate-anchor/map/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-translate-anchor/viewport/style.json b/metrics/integration/render-tests/line-translate-anchor/viewport/style.json index f84ccfa50ccf..e53f459832c1 100644 --- a/metrics/integration/render-tests/line-translate-anchor/viewport/style.json +++ b/metrics/integration/render-tests/line-translate-anchor/viewport/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-translate/default/style.json b/metrics/integration/render-tests/line-translate/default/style.json index ff08fa0a5aea..762210380bbb 100644 --- a/metrics/integration/render-tests/line-translate/default/style.json +++ b/metrics/integration/render-tests/line-translate/default/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-translate/function/style.json b/metrics/integration/render-tests/line-translate/function/style.json index f861f7998fbb..300ed1cb2c08 100644 --- a/metrics/integration/render-tests/line-translate/function/style.json +++ b/metrics/integration/render-tests/line-translate/function/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-translate/literal/style.json b/metrics/integration/render-tests/line-translate/literal/style.json index bf5f98a87b52..5402284d5046 100644 --- a/metrics/integration/render-tests/line-translate/literal/style.json +++ b/metrics/integration/render-tests/line-translate/literal/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-triangulation/default/style.json b/metrics/integration/render-tests/line-triangulation/default/style.json index c09adcbcdf99..b0e3c1891722 100644 --- a/metrics/integration/render-tests/line-triangulation/default/style.json +++ b/metrics/integration/render-tests/line-triangulation/default/style.json @@ -200,4 +200,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-triangulation/round/style.json b/metrics/integration/render-tests/line-triangulation/round/style.json index 9045b405b576..20878e760216 100644 --- a/metrics/integration/render-tests/line-triangulation/round/style.json +++ b/metrics/integration/render-tests/line-triangulation/round/style.json @@ -203,4 +203,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-visibility/none/style.json b/metrics/integration/render-tests/line-visibility/none/style.json index 00c8e117a1f9..c4ebbbd9abff 100644 --- a/metrics/integration/render-tests/line-visibility/none/style.json +++ b/metrics/integration/render-tests/line-visibility/none/style.json @@ -41,4 +41,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-visibility/visible/style.json b/metrics/integration/render-tests/line-visibility/visible/style.json index e8b826773181..260c06613106 100644 --- a/metrics/integration/render-tests/line-visibility/visible/style.json +++ b/metrics/integration/render-tests/line-visibility/visible/style.json @@ -41,4 +41,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-width/default/style.json b/metrics/integration/render-tests/line-width/default/style.json index 12584eccff28..610969dcc126 100644 --- a/metrics/integration/render-tests/line-width/default/style.json +++ b/metrics/integration/render-tests/line-width/default/style.json @@ -35,4 +35,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-width/function/style.json b/metrics/integration/render-tests/line-width/function/style.json index b3da2cdd5890..477aa9733324 100644 --- a/metrics/integration/render-tests/line-width/function/style.json +++ b/metrics/integration/render-tests/line-width/function/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-width/literal/style.json b/metrics/integration/render-tests/line-width/literal/style.json index 7ee5743ad5a2..bad7465d9242 100644 --- a/metrics/integration/render-tests/line-width/literal/style.json +++ b/metrics/integration/render-tests/line-width/literal/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/line-width/property-function/style.json b/metrics/integration/render-tests/line-width/property-function/style.json index 69d2c3daa3e7..aa4a2af10d78 100644 --- a/metrics/integration/render-tests/line-width/property-function/style.json +++ b/metrics/integration/render-tests/line-width/property-function/style.json @@ -66,4 +66,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/linear-filter-opacity-edge/literal/style.json b/metrics/integration/render-tests/linear-filter-opacity-edge/literal/style.json index 2f11e99cf71f..bf36762d4db6 100644 --- a/metrics/integration/render-tests/linear-filter-opacity-edge/literal/style.json +++ b/metrics/integration/render-tests/linear-filter-opacity-edge/literal/style.json @@ -48,4 +48,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-alpha/default/style.json b/metrics/integration/render-tests/raster-alpha/default/style.json index 8d3ccbb5877a..841e2a3badda 100644 --- a/metrics/integration/render-tests/raster-alpha/default/style.json +++ b/metrics/integration/render-tests/raster-alpha/default/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-brightness/default/style.json b/metrics/integration/render-tests/raster-brightness/default/style.json index a2db2f18d83a..6d18deb2752d 100644 --- a/metrics/integration/render-tests/raster-brightness/default/style.json +++ b/metrics/integration/render-tests/raster-brightness/default/style.json @@ -30,4 +30,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-brightness/function/style.json b/metrics/integration/render-tests/raster-brightness/function/style.json index e2935e34074d..cd5c7ff38b2d 100644 --- a/metrics/integration/render-tests/raster-brightness/function/style.json +++ b/metrics/integration/render-tests/raster-brightness/function/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-brightness/literal/style.json b/metrics/integration/render-tests/raster-brightness/literal/style.json index 4cb59b0fc8ac..d517930450be 100644 --- a/metrics/integration/render-tests/raster-brightness/literal/style.json +++ b/metrics/integration/render-tests/raster-brightness/literal/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-contrast/default/style.json b/metrics/integration/render-tests/raster-contrast/default/style.json index a2db2f18d83a..6d18deb2752d 100644 --- a/metrics/integration/render-tests/raster-contrast/default/style.json +++ b/metrics/integration/render-tests/raster-contrast/default/style.json @@ -30,4 +30,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-contrast/function/style.json b/metrics/integration/render-tests/raster-contrast/function/style.json index dcf22a3524f3..13211e9d0472 100644 --- a/metrics/integration/render-tests/raster-contrast/function/style.json +++ b/metrics/integration/render-tests/raster-contrast/function/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-contrast/literal/style.json b/metrics/integration/render-tests/raster-contrast/literal/style.json index 25e131c1ad6b..cc8023af248e 100644 --- a/metrics/integration/render-tests/raster-contrast/literal/style.json +++ b/metrics/integration/render-tests/raster-contrast/literal/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-hue-rotate/default/style.json b/metrics/integration/render-tests/raster-hue-rotate/default/style.json index a2db2f18d83a..6d18deb2752d 100644 --- a/metrics/integration/render-tests/raster-hue-rotate/default/style.json +++ b/metrics/integration/render-tests/raster-hue-rotate/default/style.json @@ -30,4 +30,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-hue-rotate/function/style.json b/metrics/integration/render-tests/raster-hue-rotate/function/style.json index 011c5c099233..d1ef45ed7571 100644 --- a/metrics/integration/render-tests/raster-hue-rotate/function/style.json +++ b/metrics/integration/render-tests/raster-hue-rotate/function/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-hue-rotate/literal/style.json b/metrics/integration/render-tests/raster-hue-rotate/literal/style.json index 14b3c376db58..b7bf44e8b38e 100644 --- a/metrics/integration/render-tests/raster-hue-rotate/literal/style.json +++ b/metrics/integration/render-tests/raster-hue-rotate/literal/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-loading/missing/style.json b/metrics/integration/render-tests/raster-loading/missing/style.json index f23377290c79..87358a48f4b0 100644 --- a/metrics/integration/render-tests/raster-loading/missing/style.json +++ b/metrics/integration/render-tests/raster-loading/missing/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-opacity/default/style.json b/metrics/integration/render-tests/raster-opacity/default/style.json index a2db2f18d83a..6d18deb2752d 100644 --- a/metrics/integration/render-tests/raster-opacity/default/style.json +++ b/metrics/integration/render-tests/raster-opacity/default/style.json @@ -30,4 +30,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-opacity/function/style.json b/metrics/integration/render-tests/raster-opacity/function/style.json index ee238d41b8a5..5b97c049a804 100644 --- a/metrics/integration/render-tests/raster-opacity/function/style.json +++ b/metrics/integration/render-tests/raster-opacity/function/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-opacity/literal/style.json b/metrics/integration/render-tests/raster-opacity/literal/style.json index 989097bf1dc8..f6d0ba85eefe 100644 --- a/metrics/integration/render-tests/raster-opacity/literal/style.json +++ b/metrics/integration/render-tests/raster-opacity/literal/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-rotation/0/style.json b/metrics/integration/render-tests/raster-rotation/0/style.json index bfbebd2c095a..4c4dc71786cc 100644 --- a/metrics/integration/render-tests/raster-rotation/0/style.json +++ b/metrics/integration/render-tests/raster-rotation/0/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-rotation/180/style.json b/metrics/integration/render-tests/raster-rotation/180/style.json index 974b7a02d38e..eb5a37344187 100644 --- a/metrics/integration/render-tests/raster-rotation/180/style.json +++ b/metrics/integration/render-tests/raster-rotation/180/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-rotation/270/style.json b/metrics/integration/render-tests/raster-rotation/270/style.json index 3105d4859fe0..de4fd12e8a52 100644 --- a/metrics/integration/render-tests/raster-rotation/270/style.json +++ b/metrics/integration/render-tests/raster-rotation/270/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-rotation/45/style.json b/metrics/integration/render-tests/raster-rotation/45/style.json index afafdf4dad02..c5b061a2e387 100644 --- a/metrics/integration/render-tests/raster-rotation/45/style.json +++ b/metrics/integration/render-tests/raster-rotation/45/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-rotation/90/style.json b/metrics/integration/render-tests/raster-rotation/90/style.json index bb9d7269d8b3..d8ffd42c16ff 100644 --- a/metrics/integration/render-tests/raster-rotation/90/style.json +++ b/metrics/integration/render-tests/raster-rotation/90/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-saturation/default/style.json b/metrics/integration/render-tests/raster-saturation/default/style.json index a2db2f18d83a..6d18deb2752d 100644 --- a/metrics/integration/render-tests/raster-saturation/default/style.json +++ b/metrics/integration/render-tests/raster-saturation/default/style.json @@ -30,4 +30,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-saturation/function/style.json b/metrics/integration/render-tests/raster-saturation/function/style.json index aa0adda6b1d7..22dc2374a1a0 100644 --- a/metrics/integration/render-tests/raster-saturation/function/style.json +++ b/metrics/integration/render-tests/raster-saturation/function/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-saturation/literal/style.json b/metrics/integration/render-tests/raster-saturation/literal/style.json index 307b80829cde..e7004bacc172 100644 --- a/metrics/integration/render-tests/raster-saturation/literal/style.json +++ b/metrics/integration/render-tests/raster-saturation/literal/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-visibility/none/style.json b/metrics/integration/render-tests/raster-visibility/none/style.json index 1cfd1c686f9c..5786ed790a06 100644 --- a/metrics/integration/render-tests/raster-visibility/none/style.json +++ b/metrics/integration/render-tests/raster-visibility/none/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/raster-visibility/visible/style.json b/metrics/integration/render-tests/raster-visibility/visible/style.json index 54e4718e36f1..64659fc8cd63 100644 --- a/metrics/integration/render-tests/raster-visibility/visible/style.json +++ b/metrics/integration/render-tests/raster-visibility/visible/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#2305/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#2305/style.json index f7843ad50454..7b469599e7fc 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#2305/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#2305/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#2523/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#2523/style.json index 06b820a0b4ef..61ff53142b4a 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#2523/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#2523/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#2929/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#2929/style.json index 4b8b1db09a49..9969c846805a 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#2929/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#2929/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3010/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3010/style.json index 56e0e089fea9..12e0697dca1c 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3010/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3010/style.json @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3365/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3365/style.json index 58f3897aa96c..64552950a47c 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3365/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3365/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3394/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3394/style.json index 1c442038ceff..198d2a480c7b 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3394/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3394/style.json @@ -47,4 +47,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3548/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3548/style.json index 587606ebb0fb..898a20f89cc5 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3548/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3548/style.json @@ -181,4 +181,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3614/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3614/style.json index 1cc10611ffdc..1a88b5981945 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3614/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3614/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3623/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3623/style.json index 94bdbaf7c09a..31d4c835977b 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3623/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3623/style.json @@ -75,4 +75,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3682/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3682/style.json index ed5b8bb3ff09..44e931ddf647 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3682/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3682/style.json @@ -47,4 +47,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3723/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3723/style.json index 5481ce5592ea..2fb8969f9d92 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3723/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3723/style.json @@ -26,4 +26,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3819/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3819/style.json index 14adeb2c2655..fcd5b485e210 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3819/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3819/style.json @@ -38,4 +38,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#3903/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#3903/style.json index 57acc74aeb22..1acd5f1043a5 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#3903/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#3903/style.json @@ -29,4 +29,4 @@ "type": "background" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#4150/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#4150/style.json index 4c8df625cd73..949a114ef763 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#4150/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#4150/style.json @@ -120,4 +120,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#4550/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#4550/style.json index c3a81b942dd8..84a595246ac3 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#4550/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#4550/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#4551/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#4551/style.json index d2c89a4e5ad0..f222448363eb 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#4551/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#4551/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#4573/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#4573/style.json index b4c684e126f8..4d3a7217e98b 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#4573/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#4573/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#8026/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-js#8026/style.json index b5790d49bb6c..bbfc2c3698ce 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-js#8026/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-js#8026/style.json @@ -78,4 +78,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-native#3292/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-native#3292/style.json index 92dc8da5de7f..e199ae1d198f 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-native#3292/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-native#3292/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-native#5754/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-native#5754/style.json index 4efb2abe0ba2..c4e94e7675dc 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-native#5754/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-native#5754/style.json @@ -52,4 +52,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-native#6820/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-native#6820/style.json index b79d4bae66ca..9072dbee3a72 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-native#6820/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-native#6820/style.json @@ -49,4 +49,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-native#6903/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-native#6903/style.json index 2e9f0abcca2e..6451046bb301 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-native#6903/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-native#6903/style.json @@ -58,4 +58,3 @@ } ] } - diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-native#7357/style.json b/metrics/integration/render-tests/regressions/mapbox-gl-native#7357/style.json index 7e180f580236..bbbdb719d578 100644 --- a/metrics/integration/render-tests/regressions/mapbox-gl-native#7357/style.json +++ b/metrics/integration/render-tests/regressions/mapbox-gl-native#7357/style.json @@ -74,4 +74,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/remove-feature-state/composite-expression/style.json b/metrics/integration/render-tests/remove-feature-state/composite-expression/style.json index 0823a9e8afa9..2db5277ac447 100644 --- a/metrics/integration/render-tests/remove-feature-state/composite-expression/style.json +++ b/metrics/integration/render-tests/remove-feature-state/composite-expression/style.json @@ -75,4 +75,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/remove-feature-state/data-expression/style.json b/metrics/integration/render-tests/remove-feature-state/data-expression/style.json index 2c6e0b03c4d1..20e395042723 100644 --- a/metrics/integration/render-tests/remove-feature-state/data-expression/style.json +++ b/metrics/integration/render-tests/remove-feature-state/data-expression/style.json @@ -67,4 +67,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/remove-feature-state/vector-source/style.json b/metrics/integration/render-tests/remove-feature-state/vector-source/style.json index 1af55ee9957e..4c0e36fd5e90 100644 --- a/metrics/integration/render-tests/remove-feature-state/vector-source/style.json +++ b/metrics/integration/render-tests/remove-feature-state/vector-source/style.json @@ -73,4 +73,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/retina-raster/default/style.json b/metrics/integration/render-tests/retina-raster/default/style.json index e834a1228799..edbff763dd10 100644 --- a/metrics/integration/render-tests/retina-raster/default/style.json +++ b/metrics/integration/render-tests/retina-raster/default/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/image-add-nonsdf/style.json b/metrics/integration/render-tests/runtime-styling/image-add-nonsdf/style.json index 18885ac73bb1..e20c8071b2b9 100644 --- a/metrics/integration/render-tests/runtime-styling/image-add-nonsdf/style.json +++ b/metrics/integration/render-tests/runtime-styling/image-add-nonsdf/style.json @@ -38,4 +38,3 @@ }, "layers": [] } - diff --git a/metrics/integration/render-tests/runtime-styling/image-add-sdf/style.json b/metrics/integration/render-tests/runtime-styling/image-add-sdf/style.json index 1db28280b4a3..6e9540111813 100644 --- a/metrics/integration/render-tests/runtime-styling/image-add-sdf/style.json +++ b/metrics/integration/render-tests/runtime-styling/image-add-sdf/style.json @@ -44,4 +44,3 @@ }, "layers": [] } - diff --git a/metrics/integration/render-tests/runtime-styling/image-update-icon/style.json b/metrics/integration/render-tests/runtime-styling/image-update-icon/style.json index 97aeedd5b981..1b5ab80d5ec5 100644 --- a/metrics/integration/render-tests/runtime-styling/image-update-icon/style.json +++ b/metrics/integration/render-tests/runtime-styling/image-update-icon/style.json @@ -42,4 +42,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/image-update-pattern/style.json b/metrics/integration/render-tests/runtime-styling/image-update-pattern/style.json index f1ec46c722b9..727abf84d6b2 100644 --- a/metrics/integration/render-tests/runtime-styling/image-update-pattern/style.json +++ b/metrics/integration/render-tests/runtime-styling/image-update-pattern/style.json @@ -64,4 +64,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-default-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-default-to-property-expression/style.json index 346baaa178ad..b6a27a02e8dc 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-default-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-default-to-property-expression/style.json @@ -70,4 +70,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-default-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-default-to-zoom-expression/style.json index 38148fdf3348..f11e387092d8 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-default-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-default-to-zoom-expression/style.json @@ -48,4 +48,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-property-expression/style.json index 3a0827e56e93..3fe90ab1a492 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-property-expression/style.json @@ -71,4 +71,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/style.json index f5afa5d8cabf..e3822ed2db81 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-default/style.json index 79123ffb9c2d..0f24f9489a0f 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-default/style.json @@ -71,4 +71,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-literal/style.json index 6ce1247ab65e..39bd1c5a2578 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-property-expression-to-literal/style.json @@ -71,4 +71,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-text-variable-anchor/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-text-variable-anchor/style.json index c98b00662e45..1371d35e2dc3 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-text-variable-anchor/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-text-variable-anchor/style.json @@ -70,4 +70,4 @@ } ] } - \ No newline at end of file + diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-default/style.json index e4094c2d4f3b..9086ada0df1b 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-default/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/style.json index e49447f5debf..f5c0dcc35803 100644 --- a/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/style.json @@ -51,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-default-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-default-to-property-expression/style.json index 2ee40b0b33b6..642719fbdbae 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-default-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-default-to-property-expression/style.json @@ -66,4 +66,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-default-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-default-to-zoom-expression/style.json index 422fc08f7338..910a9ca8af5a 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-default-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-default-to-zoom-expression/style.json @@ -40,4 +40,4 @@ "type": "background" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/style.json index b05246aa336c..a4c9132b6667 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/style.json @@ -59,4 +59,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-expression/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-expression/style.json index 3d4e31a34fe6..ef95d6bb4a4d 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-expression/style.json @@ -43,4 +43,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-property-expression/style.json index cd33e2202a1c..41f1fd13ea08 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-literal-to-property-expression/style.json @@ -69,4 +69,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-default/style.json index 17aec8c5b711..a4cd04ad93f6 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-default/style.json @@ -69,4 +69,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-literal/style.json index 05960b6db179..da8673c1e2ed 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-property-expression-to-literal/style.json @@ -72,4 +72,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-default/style.json index f48b708e3c62..eab3a56fadf9 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-default/style.json @@ -43,4 +43,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/style.json index e71d0fd37f20..fb633e80ce5a 100644 --- a/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/style.json @@ -43,4 +43,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/style.json index deede4b3604b..84567cc1c8ca 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/style.json @@ -121,4 +121,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/style.json index 800c2b63b5e9..e80703ab543b 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/style.json @@ -74,4 +74,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/style.json index 22628a297bcb..4b4c23bc0904 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/style.json @@ -122,4 +122,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/style.json index a8dd678d8892..3cede814a077 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/style.json @@ -77,4 +77,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/style.json index 79dfc3dfd2ed..4986ef9deb50 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/style.json @@ -121,4 +121,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/style.json index bd44eb4e0c37..5fc3c07de43d 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/style.json @@ -122,4 +122,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/style.json index 0bf9a4535f38..82e5efd9ae4c 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/style.json @@ -75,4 +75,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/style.json index 61c317e35976..e5ee3c9622a2 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/style.json @@ -77,4 +77,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/style.json index dc592dc12273..a5e6022e5c6b 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/style.json @@ -115,4 +115,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/style.json index e60964fed886..5aa6fc88ae06 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/style.json @@ -53,4 +53,4 @@ "type": "background" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/style.json index 88637b70e011..eb4892af6896 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/style.json @@ -104,4 +104,4 @@ "source": "geojson" } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/style.json index b7cbb92d4b19..a680d32efd2c 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/style.json index 70a761b6a2d1..1c5fa25e8e45 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/style.json @@ -118,4 +118,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/style.json index 0a7363fc1d66..7da2deeac1ab 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/style.json @@ -116,4 +116,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/style.json index ade9d9897100..e6db5f1f4c7a 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/style.json @@ -118,4 +118,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/style.json index 1b02003bee10..1bd3f321f140 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/style.json b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/style.json index 1aa845aed217..a9219103605d 100644 --- a/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/style.json +++ b/metrics/integration/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/runtime-styling/source-add-geojson-inline/style.json b/metrics/integration/render-tests/runtime-styling/source-add-geojson-inline/style.json index 50ff2700318b..c617dc1e00ce 100644 --- a/metrics/integration/render-tests/runtime-styling/source-add-geojson-inline/style.json +++ b/metrics/integration/render-tests/runtime-styling/source-add-geojson-inline/style.json @@ -38,4 +38,4 @@ }, "sources": {}, "layers": [] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/1x-screen-1x-icon/style.json b/metrics/integration/render-tests/sprites/1x-screen-1x-icon/style.json index 2439b5aceb22..4ae44b3101d9 100644 --- a/metrics/integration/render-tests/sprites/1x-screen-1x-icon/style.json +++ b/metrics/integration/render-tests/sprites/1x-screen-1x-icon/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/1x-screen-1x-pattern/style.json b/metrics/integration/render-tests/sprites/1x-screen-1x-pattern/style.json index 7eed042e3e20..cc753959e88f 100644 --- a/metrics/integration/render-tests/sprites/1x-screen-1x-pattern/style.json +++ b/metrics/integration/render-tests/sprites/1x-screen-1x-pattern/style.json @@ -23,4 +23,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/1x-screen-2x-icon/style.json b/metrics/integration/render-tests/sprites/1x-screen-2x-icon/style.json index f0c4d7986ad4..cc317b07a421 100644 --- a/metrics/integration/render-tests/sprites/1x-screen-2x-icon/style.json +++ b/metrics/integration/render-tests/sprites/1x-screen-2x-icon/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/1x-screen-2x-pattern/style.json b/metrics/integration/render-tests/sprites/1x-screen-2x-pattern/style.json index 1baa54157917..59852736c2bf 100644 --- a/metrics/integration/render-tests/sprites/1x-screen-2x-pattern/style.json +++ b/metrics/integration/render-tests/sprites/1x-screen-2x-pattern/style.json @@ -23,4 +23,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/2x-screen-1x-icon/style.json b/metrics/integration/render-tests/sprites/2x-screen-1x-icon/style.json index 278807f2cf4f..9d9a381d3420 100644 --- a/metrics/integration/render-tests/sprites/2x-screen-1x-icon/style.json +++ b/metrics/integration/render-tests/sprites/2x-screen-1x-icon/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/2x-screen-1x-pattern/style.json b/metrics/integration/render-tests/sprites/2x-screen-1x-pattern/style.json index 3f15d1aade3b..3b9d2c8e6b62 100644 --- a/metrics/integration/render-tests/sprites/2x-screen-1x-pattern/style.json +++ b/metrics/integration/render-tests/sprites/2x-screen-1x-pattern/style.json @@ -23,4 +23,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/2x-screen-2x-icon/style.json b/metrics/integration/render-tests/sprites/2x-screen-2x-icon/style.json index 156be0b73375..ae6fd2a89db5 100644 --- a/metrics/integration/render-tests/sprites/2x-screen-2x-icon/style.json +++ b/metrics/integration/render-tests/sprites/2x-screen-2x-icon/style.json @@ -40,4 +40,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/2x-screen-2x-pattern/style.json b/metrics/integration/render-tests/sprites/2x-screen-2x-pattern/style.json index 7d7aaf231ccc..20c91b843c47 100644 --- a/metrics/integration/render-tests/sprites/2x-screen-2x-pattern/style.json +++ b/metrics/integration/render-tests/sprites/2x-screen-2x-pattern/style.json @@ -23,4 +23,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/array-default-only/style.json b/metrics/integration/render-tests/sprites/array-default-only/style.json index 02b41414e91d..ae2befb9ce52 100644 --- a/metrics/integration/render-tests/sprites/array-default-only/style.json +++ b/metrics/integration/render-tests/sprites/array-default-only/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/sprites/array-multiple/style.json b/metrics/integration/render-tests/sprites/array-multiple/style.json index 79942a3daa12..1167b879102b 100644 --- a/metrics/integration/render-tests/sprites/array-multiple/style.json +++ b/metrics/integration/render-tests/sprites/array-multiple/style.json @@ -76,4 +76,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-placement/line-overscaled/style.json b/metrics/integration/render-tests/symbol-placement/line-overscaled/style.json index 262293d6e0be..cbe7ef1bf10f 100644 --- a/metrics/integration/render-tests/symbol-placement/line-overscaled/style.json +++ b/metrics/integration/render-tests/symbol-placement/line-overscaled/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-placement/line/style.json b/metrics/integration/render-tests/symbol-placement/line/style.json index 545565e2fd4b..a7ba44b5a219 100644 --- a/metrics/integration/render-tests/symbol-placement/line/style.json +++ b/metrics/integration/render-tests/symbol-placement/line/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-placement/point/style.json b/metrics/integration/render-tests/symbol-placement/point/style.json index 1f848564165a..95de440fc723 100644 --- a/metrics/integration/render-tests/symbol-placement/point/style.json +++ b/metrics/integration/render-tests/symbol-placement/point/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-spacing/line-far/style.json b/metrics/integration/render-tests/symbol-spacing/line-far/style.json index f464e56c92c2..95ae510d84b1 100644 --- a/metrics/integration/render-tests/symbol-spacing/line-far/style.json +++ b/metrics/integration/render-tests/symbol-spacing/line-far/style.json @@ -103,4 +103,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-spacing/point-close/style.json b/metrics/integration/render-tests/symbol-spacing/point-close/style.json index d6c989cff6f9..a1d1d5a8b1e0 100644 --- a/metrics/integration/render-tests/symbol-spacing/point-close/style.json +++ b/metrics/integration/render-tests/symbol-spacing/point-close/style.json @@ -103,4 +103,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/symbol-spacing/point-far/style.json b/metrics/integration/render-tests/symbol-spacing/point-far/style.json index 893fbc5f924e..b8922c326f1c 100644 --- a/metrics/integration/render-tests/symbol-spacing/point-far/style.json +++ b/metrics/integration/render-tests/symbol-spacing/point-far/style.json @@ -103,4 +103,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-anchor/bottom/style.json b/metrics/integration/render-tests/text-anchor/bottom/style.json index 10011f1304e3..e33aa2ed1e26 100644 --- a/metrics/integration/render-tests/text-anchor/bottom/style.json +++ b/metrics/integration/render-tests/text-anchor/bottom/style.json @@ -60,4 +60,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-anchor/center/style.json b/metrics/integration/render-tests/text-anchor/center/style.json index ed3193c094c9..bd8df12070a3 100644 --- a/metrics/integration/render-tests/text-anchor/center/style.json +++ b/metrics/integration/render-tests/text-anchor/center/style.json @@ -60,4 +60,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-anchor/top/style.json b/metrics/integration/render-tests/text-anchor/top/style.json index 702fa2064334..1c57db8920fe 100644 --- a/metrics/integration/render-tests/text-anchor/top/style.json +++ b/metrics/integration/render-tests/text-anchor/top/style.json @@ -60,4 +60,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-color/default/style.json b/metrics/integration/render-tests/text-color/default/style.json index 00f4c266481a..193902f9c097 100644 --- a/metrics/integration/render-tests/text-color/default/style.json +++ b/metrics/integration/render-tests/text-color/default/style.json @@ -51,4 +51,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-color/function/style.json b/metrics/integration/render-tests/text-color/function/style.json index 2fc2eca36465..f7eeb4777c27 100644 --- a/metrics/integration/render-tests/text-color/function/style.json +++ b/metrics/integration/render-tests/text-color/function/style.json @@ -64,4 +64,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-color/literal/style.json b/metrics/integration/render-tests/text-color/literal/style.json index 525ba37472e5..65eac5edff01 100644 --- a/metrics/integration/render-tests/text-color/literal/style.json +++ b/metrics/integration/render-tests/text-color/literal/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-font/literal/style.json b/metrics/integration/render-tests/text-font/literal/style.json index d1f1a55ca140..f8097ae18359 100644 --- a/metrics/integration/render-tests/text-font/literal/style.json +++ b/metrics/integration/render-tests/text-font/literal/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-blur/default/style.json b/metrics/integration/render-tests/text-halo-blur/default/style.json index 36d958b7dc04..d87bd5a4fd00 100644 --- a/metrics/integration/render-tests/text-halo-blur/default/style.json +++ b/metrics/integration/render-tests/text-halo-blur/default/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-blur/function/style.json b/metrics/integration/render-tests/text-halo-blur/function/style.json index cd6895344acb..19283e8b3660 100644 --- a/metrics/integration/render-tests/text-halo-blur/function/style.json +++ b/metrics/integration/render-tests/text-halo-blur/function/style.json @@ -49,4 +49,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-blur/literal/style.json b/metrics/integration/render-tests/text-halo-blur/literal/style.json index 941e89e8e3d7..a5acb017f921 100644 --- a/metrics/integration/render-tests/text-halo-blur/literal/style.json +++ b/metrics/integration/render-tests/text-halo-blur/literal/style.json @@ -38,4 +38,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-color/default/style.json b/metrics/integration/render-tests/text-halo-color/default/style.json index dbd677e2002d..fe2890749a2b 100644 --- a/metrics/integration/render-tests/text-halo-color/default/style.json +++ b/metrics/integration/render-tests/text-halo-color/default/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-color/function/style.json b/metrics/integration/render-tests/text-halo-color/function/style.json index 1418f1be1a50..20a9c043d8de 100644 --- a/metrics/integration/render-tests/text-halo-color/function/style.json +++ b/metrics/integration/render-tests/text-halo-color/function/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-color/literal/style.json b/metrics/integration/render-tests/text-halo-color/literal/style.json index 91afd869ce32..60317b0823ff 100644 --- a/metrics/integration/render-tests/text-halo-color/literal/style.json +++ b/metrics/integration/render-tests/text-halo-color/literal/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-width/default/style.json b/metrics/integration/render-tests/text-halo-width/default/style.json index 0e60589a3bbd..47f185a74867 100644 --- a/metrics/integration/render-tests/text-halo-width/default/style.json +++ b/metrics/integration/render-tests/text-halo-width/default/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-width/function/style.json b/metrics/integration/render-tests/text-halo-width/function/style.json index cb39f85d95b2..7f3e46f3cd00 100644 --- a/metrics/integration/render-tests/text-halo-width/function/style.json +++ b/metrics/integration/render-tests/text-halo-width/function/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-halo-width/literal/style.json b/metrics/integration/render-tests/text-halo-width/literal/style.json index 36d958b7dc04..d87bd5a4fd00 100644 --- a/metrics/integration/render-tests/text-halo-width/literal/style.json +++ b/metrics/integration/render-tests/text-halo-width/literal/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-keep-upright/line-placement-true-offset/style.json b/metrics/integration/render-tests/text-keep-upright/line-placement-true-offset/style.json index 22d890d58afd..544ec2df72f0 100644 --- a/metrics/integration/render-tests/text-keep-upright/line-placement-true-offset/style.json +++ b/metrics/integration/render-tests/text-keep-upright/line-placement-true-offset/style.json @@ -78,4 +78,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-false/style.json b/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-false/style.json index 7d25a9a53830..c96ddb6f36e8 100644 --- a/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-false/style.json +++ b/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-false/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-true/style.json b/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-true/style.json index ce2cc454b8ac..b1b180aa9474 100644 --- a/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-true/style.json +++ b/metrics/integration/render-tests/text-keep-upright/point-placement-align-map-true/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-false/style.json b/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-false/style.json index 18fcb01fe82e..601792bbb677 100644 --- a/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-false/style.json +++ b/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-false/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-true/style.json b/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-true/style.json index f98402dfcf9d..1bd5747dd9fe 100644 --- a/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-true/style.json +++ b/metrics/integration/render-tests/text-keep-upright/point-placement-align-viewport-true/style.json @@ -50,4 +50,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-letter-spacing/function-close/style.json b/metrics/integration/render-tests/text-letter-spacing/function-close/style.json index d0e8c8a2a8cb..0a939b602d1b 100644 --- a/metrics/integration/render-tests/text-letter-spacing/function-close/style.json +++ b/metrics/integration/render-tests/text-letter-spacing/function-close/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-letter-spacing/function-far/style.json b/metrics/integration/render-tests/text-letter-spacing/function-far/style.json index d0e8c8a2a8cb..0a939b602d1b 100644 --- a/metrics/integration/render-tests/text-letter-spacing/function-far/style.json +++ b/metrics/integration/render-tests/text-letter-spacing/function-far/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-letter-spacing/literal/style.json b/metrics/integration/render-tests/text-letter-spacing/literal/style.json index 4438ec976fe1..61fb394a2009 100644 --- a/metrics/integration/render-tests/text-letter-spacing/literal/style.json +++ b/metrics/integration/render-tests/text-letter-spacing/literal/style.json @@ -54,4 +54,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-line-height/literal/style.json b/metrics/integration/render-tests/text-line-height/literal/style.json index 66fe48e7568d..09d5bed3e6b8 100644 --- a/metrics/integration/render-tests/text-line-height/literal/style.json +++ b/metrics/integration/render-tests/text-line-height/literal/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/style.json index 171bd32a029e..c1884e398e87 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/style.json index 6a1de4097fb8..370b96a2c505 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/style.json index 6d59de332bbf..758abeb058b5 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/style.json index 94417c88f9d2..8b2ec3055ea4 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/style.json index b6bd210e1be9..8e273bb1aea2 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/style.json index b169b9a8b280..eb46542c941f 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/style.json index a26cd2a040e0..0de786f85d8d 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/style.json index 8e9a0408310f..42b102ee5ab3 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/style.json index 67b2d3595a64..8f732596d511 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/style.json index 7ae1e1a80510..fdcade175e98 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/style.json index bb8bf28690a6..8f64f7655646 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/style.json index 69d6e309f351..0825cc78ba3e 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/style.json index eac8e5225df3..afe26d382c6b 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/style.json index e4e541231781..d03ca303be0d 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/style.json index 327a99cc3576..8dddf075de72 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/style.json index ed93a316bb7b..bead2da3f957 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/style.json index c98671ffb850..90fa01d00726 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/style.json b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/style.json index 63b29f28351d..0acc231b8f0d 100644 --- a/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/style.json +++ b/metrics/integration/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/style.json @@ -65,4 +65,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-offset/literal/style.json b/metrics/integration/render-tests/text-offset/literal/style.json index 2a90fe0beb96..c98ab6a7f74c 100644 --- a/metrics/integration/render-tests/text-offset/literal/style.json +++ b/metrics/integration/render-tests/text-offset/literal/style.json @@ -57,4 +57,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-opacity/default/style.json b/metrics/integration/render-tests/text-opacity/default/style.json index 00f4c266481a..193902f9c097 100644 --- a/metrics/integration/render-tests/text-opacity/default/style.json +++ b/metrics/integration/render-tests/text-opacity/default/style.json @@ -51,4 +51,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-opacity/function/style.json b/metrics/integration/render-tests/text-opacity/function/style.json index 8783c1dcd16e..43aae3944748 100644 --- a/metrics/integration/render-tests/text-opacity/function/style.json +++ b/metrics/integration/render-tests/text-opacity/function/style.json @@ -64,4 +64,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-opacity/literal/style.json b/metrics/integration/render-tests/text-opacity/literal/style.json index 2993f2e6533f..a3f378b2e413 100644 --- a/metrics/integration/render-tests/text-opacity/literal/style.json +++ b/metrics/integration/render-tests/text-opacity/literal/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-rotation-alignment/auto-symbol-placement-point/style.json b/metrics/integration/render-tests/text-rotation-alignment/auto-symbol-placement-point/style.json index eff2d74155dd..c1151db91e28 100644 --- a/metrics/integration/render-tests/text-rotation-alignment/auto-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/text-rotation-alignment/auto-symbol-placement-point/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-line/style.json b/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-line/style.json index 4ce56e1af0bf..cf060a71fd85 100644 --- a/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-line/style.json +++ b/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-line/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-point/style.json b/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-point/style.json index 84e2e3e6d252..0c4a5fdcb2e4 100644 --- a/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/text-rotation-alignment/map-symbol-placement-point/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-line/style.json b/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-line/style.json index da4bd1a92375..1e74eb082d3c 100644 --- a/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-line/style.json +++ b/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-line/style.json @@ -44,4 +44,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-point/style.json b/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-point/style.json index 5953001fd21d..06f7e6906a5c 100644 --- a/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-point/style.json +++ b/metrics/integration/render-tests/text-rotation-alignment/viewport-symbol-placement-point/style.json @@ -36,4 +36,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-tile-edge-clipping/default/style.json b/metrics/integration/render-tests/text-tile-edge-clipping/default/style.json index 6dc2c82fddf0..8ac77d92a46a 100644 --- a/metrics/integration/render-tests/text-tile-edge-clipping/default/style.json +++ b/metrics/integration/render-tests/text-tile-edge-clipping/default/style.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-transform/lowercase/style.json b/metrics/integration/render-tests/text-transform/lowercase/style.json index 7f621e81faa1..d04a9133a2fc 100644 --- a/metrics/integration/render-tests/text-transform/lowercase/style.json +++ b/metrics/integration/render-tests/text-transform/lowercase/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-transform/uppercase/style.json b/metrics/integration/render-tests/text-transform/uppercase/style.json index 375827eab37a..a5ee0d13f56a 100644 --- a/metrics/integration/render-tests/text-transform/uppercase/style.json +++ b/metrics/integration/render-tests/text-transform/uppercase/style.json @@ -55,4 +55,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-translate-anchor/map/style.json b/metrics/integration/render-tests/text-translate-anchor/map/style.json index 8193cd2053ca..b0884356b4f9 100644 --- a/metrics/integration/render-tests/text-translate-anchor/map/style.json +++ b/metrics/integration/render-tests/text-translate-anchor/map/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-translate-anchor/viewport/style.json b/metrics/integration/render-tests/text-translate-anchor/viewport/style.json index 89c8d5459612..8505182c17b6 100644 --- a/metrics/integration/render-tests/text-translate-anchor/viewport/style.json +++ b/metrics/integration/render-tests/text-translate-anchor/viewport/style.json @@ -58,4 +58,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-translate/default/style.json b/metrics/integration/render-tests/text-translate/default/style.json index 00f4c266481a..193902f9c097 100644 --- a/metrics/integration/render-tests/text-translate/default/style.json +++ b/metrics/integration/render-tests/text-translate/default/style.json @@ -51,4 +51,4 @@ "paint": {} } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-translate/function/style.json b/metrics/integration/render-tests/text-translate/function/style.json index 1c9181e12b0e..ea922f1896ea 100644 --- a/metrics/integration/render-tests/text-translate/function/style.json +++ b/metrics/integration/render-tests/text-translate/function/style.json @@ -70,4 +70,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-translate/literal/style.json b/metrics/integration/render-tests/text-translate/literal/style.json index 4443166b513a..df4f4bcc65f6 100644 --- a/metrics/integration/render-tests/text-translate/literal/style.json +++ b/metrics/integration/render-tests/text-translate/literal/style.json @@ -56,4 +56,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-variable-anchor-offset/databind-coalesce/style.json b/metrics/integration/render-tests/text-variable-anchor-offset/databind-coalesce/style.json index ea7a2e13c477..f1e9fe1e2a92 100644 --- a/metrics/integration/render-tests/text-variable-anchor-offset/databind-coalesce/style.json +++ b/metrics/integration/render-tests/text-variable-anchor-offset/databind-coalesce/style.json @@ -53,4 +53,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/text-variable-anchor-offset/databind-interpolate/style.json b/metrics/integration/render-tests/text-variable-anchor-offset/databind-interpolate/style.json index f18f9fff7142..8ac96b341551 100644 --- a/metrics/integration/render-tests/text-variable-anchor-offset/databind-interpolate/style.json +++ b/metrics/integration/render-tests/text-variable-anchor-offset/databind-interpolate/style.json @@ -53,4 +53,4 @@ } } ] - } \ No newline at end of file + } diff --git a/metrics/integration/render-tests/tilejson-bounds/default/style.json b/metrics/integration/render-tests/tilejson-bounds/default/style.json index faec53e26998..4d7885bb5008 100644 --- a/metrics/integration/render-tests/tilejson-bounds/default/style.json +++ b/metrics/integration/render-tests/tilejson-bounds/default/style.json @@ -40,4 +40,4 @@ } ] } - \ No newline at end of file + diff --git a/metrics/integration/render-tests/tilejson-bounds/overwrite-bounds/style.json b/metrics/integration/render-tests/tilejson-bounds/overwrite-bounds/style.json index f97187cdd556..0680188039d9 100644 --- a/metrics/integration/render-tests/tilejson-bounds/overwrite-bounds/style.json +++ b/metrics/integration/render-tests/tilejson-bounds/overwrite-bounds/style.json @@ -38,4 +38,4 @@ } ] } - \ No newline at end of file + diff --git a/metrics/integration/render-tests/tms/tms/style.json b/metrics/integration/render-tests/tms/tms/style.json index 7cfeef079750..349e3167ed35 100644 --- a/metrics/integration/render-tests/tms/tms/style.json +++ b/metrics/integration/render-tests/tms/tms/style.json @@ -32,4 +32,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/video/default/style.json b/metrics/integration/render-tests/video/default/style.json index 53cca09964f3..993b98ff7864 100644 --- a/metrics/integration/render-tests/video/default/style.json +++ b/metrics/integration/render-tests/video/default/style.json @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/within/layout-text/style.json b/metrics/integration/render-tests/within/layout-text/style.json index f12044e5fdcd..fe76ba917e88 100644 --- a/metrics/integration/render-tests/within/layout-text/style.json +++ b/metrics/integration/render-tests/within/layout-text/style.json @@ -108,4 +108,4 @@ } ] } - \ No newline at end of file + diff --git a/metrics/integration/render-tests/within/paint-line/style.json b/metrics/integration/render-tests/within/paint-line/style.json index 405b892218c5..bdc07932a284 100644 --- a/metrics/integration/render-tests/within/paint-line/style.json +++ b/metrics/integration/render-tests/within/paint-line/style.json @@ -196,4 +196,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/zoomed-fill/default/style.json b/metrics/integration/render-tests/zoomed-fill/default/style.json index 80570d900234..8a09b44bf05d 100644 --- a/metrics/integration/render-tests/zoomed-fill/default/style.json +++ b/metrics/integration/render-tests/zoomed-fill/default/style.json @@ -37,4 +37,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/zoomed-raster/fractional/style.json b/metrics/integration/render-tests/zoomed-raster/fractional/style.json index 76bc9e4d0760..42d8d67e6921 100644 --- a/metrics/integration/render-tests/zoomed-raster/fractional/style.json +++ b/metrics/integration/render-tests/zoomed-raster/fractional/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/zoomed-raster/overzoom/style.json b/metrics/integration/render-tests/zoomed-raster/overzoom/style.json index 3ef6ad93b73d..8816f5e374e3 100644 --- a/metrics/integration/render-tests/zoomed-raster/overzoom/style.json +++ b/metrics/integration/render-tests/zoomed-raster/overzoom/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/render-tests/zoomed-raster/underzoom/style.json b/metrics/integration/render-tests/zoomed-raster/underzoom/style.json index 9e892781049d..72b6a1863e86 100644 --- a/metrics/integration/render-tests/zoomed-raster/underzoom/style.json +++ b/metrics/integration/render-tests/zoomed-raster/underzoom/style.json @@ -31,4 +31,4 @@ } } ] -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/1x.json b/metrics/integration/sprites/1x.json index 123abb40d4ab..458da9980f74 100644 --- a/metrics/integration/sprites/1x.json +++ b/metrics/integration/sprites/1x.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 1 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/1x@2x.json b/metrics/integration/sprites/1x@2x.json index 123abb40d4ab..458da9980f74 100644 --- a/metrics/integration/sprites/1x@2x.json +++ b/metrics/integration/sprites/1x@2x.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 1 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/2x.json b/metrics/integration/sprites/2x.json index 8d246d04d6fa..6be407145b90 100644 --- a/metrics/integration/sprites/2x.json +++ b/metrics/integration/sprites/2x.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 2 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/2x@2x.json b/metrics/integration/sprites/2x@2x.json index 8d246d04d6fa..6be407145b90 100644 --- a/metrics/integration/sprites/2x@2x.json +++ b/metrics/integration/sprites/2x@2x.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 2 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/emerald.json b/metrics/integration/sprites/emerald.json index fcc09e77a387..8afeefb65155 100644 --- a/metrics/integration/sprites/emerald.json +++ b/metrics/integration/sprites/emerald.json @@ -489,4 +489,4 @@ "y": 180, "pixelRatio": 1 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/emerald@2x.json b/metrics/integration/sprites/emerald@2x.json index 7ef71ce5c3a7..c1a54b6a9e92 100644 --- a/metrics/integration/sprites/emerald@2x.json +++ b/metrics/integration/sprites/emerald@2x.json @@ -489,4 +489,4 @@ "y": 360, "pixelRatio": 2 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/icon-offset.json b/metrics/integration/sprites/icon-offset.json index e8e15268e18e..6b82fe7f8919 100644 --- a/metrics/integration/sprites/icon-offset.json +++ b/metrics/integration/sprites/icon-offset.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 1 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/mapbox/basic-v9.json b/metrics/integration/sprites/mapbox/basic-v9.json index 04c29b4402a7..178f19038972 100644 --- a/metrics/integration/sprites/mapbox/basic-v9.json +++ b/metrics/integration/sprites/mapbox/basic-v9.json @@ -1 +1 @@ -{"airfield-15":{"width":21,"height":21,"x":0,"y":0,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":21,"y":0,"pixelRatio":1,"visible":true},"alcohol-shop-15":{"width":21,"height":21,"x":0,"y":21,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":21,"height":21,"x":21,"y":21,"pixelRatio":1,"visible":true},"aquarium-15":{"width":21,"height":21,"x":42,"y":0,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":21,"height":21,"x":63,"y":0,"pixelRatio":1,"visible":true},"attraction-15":{"width":21,"height":21,"x":42,"y":21,"pixelRatio":1,"visible":true},"bakery-15":{"width":21,"height":21,"x":63,"y":21,"pixelRatio":1,"visible":true},"bank-15":{"width":21,"height":21,"x":0,"y":42,"pixelRatio":1,"visible":true},"bar-15":{"width":21,"height":21,"x":21,"y":42,"pixelRatio":1,"visible":true},"beer-15":{"width":21,"height":21,"x":42,"y":42,"pixelRatio":1,"visible":true},"bicycle-15":{"width":21,"height":21,"x":63,"y":42,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":21,"height":21,"x":0,"y":63,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":21,"y":63,"pixelRatio":1,"visible":true},"cafe-15":{"width":21,"height":21,"x":42,"y":63,"pixelRatio":1,"visible":true},"campsite-15":{"width":21,"height":21,"x":63,"y":63,"pixelRatio":1,"visible":true},"car-15":{"width":21,"height":21,"x":84,"y":0,"pixelRatio":1,"visible":true},"castle-15":{"width":21,"height":21,"x":105,"y":0,"pixelRatio":1,"visible":true},"cemetery-15":{"width":21,"height":21,"x":126,"y":0,"pixelRatio":1,"visible":true},"cinema-15":{"width":21,"height":21,"x":147,"y":0,"pixelRatio":1,"visible":true},"circle-15":{"width":21,"height":21,"x":84,"y":21,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":21,"height":21,"x":105,"y":21,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":21,"height":21,"x":126,"y":21,"pixelRatio":1,"visible":true},"college-15":{"width":21,"height":21,"x":147,"y":21,"pixelRatio":1,"visible":true},"dentist-15":{"width":21,"height":21,"x":84,"y":42,"pixelRatio":1,"visible":true},"doctor-15":{"width":21,"height":21,"x":105,"y":42,"pixelRatio":1,"visible":true},"dog-park-15":{"width":21,"height":21,"x":126,"y":42,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":21,"height":21,"x":147,"y":42,"pixelRatio":1,"visible":true},"embassy-15":{"width":21,"height":21,"x":84,"y":63,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":105,"y":63,"pixelRatio":1,"visible":true},"fast-food-15":{"width":21,"height":21,"x":126,"y":63,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":147,"y":63,"pixelRatio":1,"visible":true},"fire-station-15":{"width":21,"height":21,"x":0,"y":84,"pixelRatio":1,"visible":true},"fuel-15":{"width":21,"height":21,"x":21,"y":84,"pixelRatio":1,"visible":true},"garden-15":{"width":21,"height":21,"x":42,"y":84,"pixelRatio":1,"visible":true},"golf-15":{"width":21,"height":21,"x":63,"y":84,"pixelRatio":1,"visible":true},"grocery-15":{"width":21,"height":21,"x":84,"y":84,"pixelRatio":1,"visible":true},"harbor-15":{"width":21,"height":21,"x":105,"y":84,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":126,"y":84,"pixelRatio":1,"visible":true},"hospital-15":{"width":21,"height":21,"x":147,"y":84,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":21,"height":21,"x":0,"y":105,"pixelRatio":1,"visible":true},"information-15":{"width":21,"height":21,"x":21,"y":105,"pixelRatio":1,"visible":true},"laundry-15":{"width":21,"height":21,"x":42,"y":105,"pixelRatio":1,"visible":true},"library-15":{"width":21,"height":21,"x":63,"y":105,"pixelRatio":1,"visible":true},"lodging-15":{"width":21,"height":21,"x":84,"y":105,"pixelRatio":1,"visible":true},"marker-15":{"width":21,"height":21,"x":105,"y":105,"pixelRatio":1,"visible":true},"monument-15":{"width":21,"height":21,"x":126,"y":105,"pixelRatio":1,"visible":true},"mountain-15":{"width":21,"height":21,"x":147,"y":105,"pixelRatio":1,"visible":true},"museum-15":{"width":21,"height":21,"x":0,"y":126,"pixelRatio":1,"visible":true},"music-15":{"width":21,"height":21,"x":21,"y":126,"pixelRatio":1,"visible":true},"park-15":{"width":21,"height":21,"x":42,"y":126,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":21,"height":21,"x":63,"y":126,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":21,"height":21,"x":84,"y":126,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":21,"height":21,"x":105,"y":126,"pixelRatio":1,"visible":true},"playground-15":{"width":21,"height":21,"x":126,"y":126,"pixelRatio":1,"visible":true},"police-15":{"width":21,"height":21,"x":147,"y":126,"pixelRatio":1,"visible":true},"post-15":{"width":21,"height":21,"x":0,"y":147,"pixelRatio":1,"visible":true},"prison-15":{"width":21,"height":21,"x":21,"y":147,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":42,"y":147,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":63,"y":147,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":84,"y":147,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":21,"height":21,"x":105,"y":147,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":21,"height":21,"x":126,"y":147,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":21,"height":21,"x":147,"y":147,"pixelRatio":1,"visible":true},"restaurant-15":{"width":21,"height":21,"x":168,"y":0,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":189,"y":0,"pixelRatio":1,"visible":true},"school-15":{"width":21,"height":21,"x":210,"y":0,"pixelRatio":1,"visible":true},"shop-15":{"width":21,"height":21,"x":231,"y":0,"pixelRatio":1,"visible":true},"stadium-15":{"width":21,"height":21,"x":252,"y":0,"pixelRatio":1,"visible":true},"star-15":{"width":21,"height":21,"x":273,"y":0,"pixelRatio":1,"visible":true},"suitcase-15":{"width":21,"height":21,"x":294,"y":0,"pixelRatio":1,"visible":true},"swimming-15":{"width":21,"height":21,"x":315,"y":0,"pixelRatio":1,"visible":true},"theatre-15":{"width":21,"height":21,"x":168,"y":21,"pixelRatio":1,"visible":true},"toilet-15":{"width":21,"height":21,"x":189,"y":21,"pixelRatio":1,"visible":true},"town-hall-15":{"width":21,"height":21,"x":210,"y":21,"pixelRatio":1,"visible":true},"triangle-15":{"width":21,"height":21,"x":231,"y":21,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":21,"height":21,"x":252,"y":21,"pixelRatio":1,"visible":true},"veterinary-15":{"width":21,"height":21,"x":273,"y":21,"pixelRatio":1,"visible":true},"volcano-15":{"width":21,"height":21,"x":294,"y":21,"pixelRatio":1,"visible":true},"zoo-15":{"width":21,"height":21,"x":315,"y":21,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":168,"y":42,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":185,"y":42,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":17,"height":17,"x":202,"y":42,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":17,"height":17,"x":219,"y":42,"pixelRatio":1,"visible":true},"aquarium-11":{"width":17,"height":17,"x":236,"y":42,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":17,"height":17,"x":253,"y":42,"pixelRatio":1,"visible":true},"attraction-11":{"width":17,"height":17,"x":270,"y":42,"pixelRatio":1,"visible":true},"bakery-11":{"width":17,"height":17,"x":287,"y":42,"pixelRatio":1,"visible":true},"bank-11":{"width":17,"height":17,"x":304,"y":42,"pixelRatio":1,"visible":true},"bar-11":{"width":17,"height":17,"x":168,"y":63,"pixelRatio":1,"visible":true},"beer-11":{"width":17,"height":17,"x":185,"y":63,"pixelRatio":1,"visible":true},"bicycle-11":{"width":17,"height":17,"x":202,"y":63,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":17,"height":17,"x":219,"y":63,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":236,"y":63,"pixelRatio":1,"visible":true},"cafe-11":{"width":17,"height":17,"x":253,"y":63,"pixelRatio":1,"visible":true},"campsite-11":{"width":17,"height":17,"x":270,"y":63,"pixelRatio":1,"visible":true},"car-11":{"width":17,"height":17,"x":287,"y":63,"pixelRatio":1,"visible":true},"castle-11":{"width":17,"height":17,"x":304,"y":63,"pixelRatio":1,"visible":true},"cemetery-11":{"width":17,"height":17,"x":168,"y":84,"pixelRatio":1,"visible":true},"cinema-11":{"width":17,"height":17,"x":185,"y":84,"pixelRatio":1,"visible":true},"circle-11":{"width":17,"height":17,"x":202,"y":84,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":17,"height":17,"x":219,"y":84,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":17,"height":17,"x":236,"y":84,"pixelRatio":1,"visible":true},"college-11":{"width":17,"height":17,"x":253,"y":84,"pixelRatio":1,"visible":true},"dentist-11":{"width":17,"height":17,"x":270,"y":84,"pixelRatio":1,"visible":true},"doctor-11":{"width":17,"height":17,"x":287,"y":84,"pixelRatio":1,"visible":true},"dog-park-11":{"width":17,"height":17,"x":304,"y":84,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":17,"height":17,"x":168,"y":105,"pixelRatio":1,"visible":true},"embassy-11":{"width":17,"height":17,"x":185,"y":105,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":202,"y":105,"pixelRatio":1,"visible":true},"fast-food-11":{"width":17,"height":17,"x":219,"y":105,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":236,"y":105,"pixelRatio":1,"visible":true},"fire-station-11":{"width":17,"height":17,"x":253,"y":105,"pixelRatio":1,"visible":true},"fuel-11":{"width":17,"height":17,"x":270,"y":105,"pixelRatio":1,"visible":true},"garden-11":{"width":17,"height":17,"x":287,"y":105,"pixelRatio":1,"visible":true},"golf-11":{"width":17,"height":17,"x":304,"y":105,"pixelRatio":1,"visible":true},"grocery-11":{"width":17,"height":17,"x":168,"y":126,"pixelRatio":1,"visible":true},"harbor-11":{"width":17,"height":17,"x":185,"y":126,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":202,"y":126,"pixelRatio":1,"visible":true},"hospital-11":{"width":17,"height":17,"x":219,"y":126,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":17,"height":17,"x":236,"y":126,"pixelRatio":1,"visible":true},"information-11":{"width":17,"height":17,"x":253,"y":126,"pixelRatio":1,"visible":true},"laundry-11":{"width":17,"height":17,"x":270,"y":126,"pixelRatio":1,"visible":true},"library-11":{"width":17,"height":17,"x":287,"y":126,"pixelRatio":1,"visible":true},"lodging-11":{"width":17,"height":17,"x":304,"y":126,"pixelRatio":1,"visible":true},"marker-11":{"width":17,"height":17,"x":168,"y":147,"pixelRatio":1,"visible":true},"monument-11":{"width":17,"height":17,"x":185,"y":147,"pixelRatio":1,"visible":true},"mountain-11":{"width":17,"height":17,"x":202,"y":147,"pixelRatio":1,"visible":true},"museum-11":{"width":17,"height":17,"x":219,"y":147,"pixelRatio":1,"visible":true},"music-11":{"width":17,"height":17,"x":236,"y":147,"pixelRatio":1,"visible":true},"park-11":{"width":17,"height":17,"x":253,"y":147,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":17,"height":17,"x":270,"y":147,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":17,"height":17,"x":287,"y":147,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":17,"height":17,"x":304,"y":147,"pixelRatio":1,"visible":true},"playground-11":{"width":17,"height":17,"x":0,"y":168,"pixelRatio":1,"visible":true},"police-11":{"width":17,"height":17,"x":17,"y":168,"pixelRatio":1,"visible":true},"post-11":{"width":17,"height":17,"x":34,"y":168,"pixelRatio":1,"visible":true},"prison-11":{"width":17,"height":17,"x":51,"y":168,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":68,"y":168,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":85,"y":168,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":102,"y":168,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":17,"height":17,"x":119,"y":168,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":17,"height":17,"x":136,"y":168,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":17,"height":17,"x":153,"y":168,"pixelRatio":1,"visible":true},"restaurant-11":{"width":17,"height":17,"x":170,"y":168,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":187,"y":168,"pixelRatio":1,"visible":true},"school-11":{"width":17,"height":17,"x":204,"y":168,"pixelRatio":1,"visible":true},"shop-11":{"width":17,"height":17,"x":221,"y":168,"pixelRatio":1,"visible":true},"stadium-11":{"width":17,"height":17,"x":238,"y":168,"pixelRatio":1,"visible":true},"star-11":{"width":17,"height":17,"x":255,"y":168,"pixelRatio":1,"visible":true},"suitcase-11":{"width":17,"height":17,"x":272,"y":168,"pixelRatio":1,"visible":true},"swimming-11":{"width":17,"height":17,"x":289,"y":168,"pixelRatio":1,"visible":true},"theatre-11":{"width":17,"height":17,"x":306,"y":168,"pixelRatio":1,"visible":true},"toilet-11":{"width":17,"height":17,"x":0,"y":185,"pixelRatio":1,"visible":true},"town-hall-11":{"width":17,"height":17,"x":17,"y":185,"pixelRatio":1,"visible":true},"triangle-11":{"width":17,"height":17,"x":34,"y":185,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":17,"height":17,"x":51,"y":185,"pixelRatio":1,"visible":true},"veterinary-11":{"width":17,"height":17,"x":68,"y":185,"pixelRatio":1,"visible":true},"volcano-11":{"width":17,"height":17,"x":85,"y":185,"pixelRatio":1,"visible":true},"zoo-11":{"width":17,"height":17,"x":102,"y":185,"pixelRatio":1,"visible":true}} \ No newline at end of file +{"airfield-15":{"width":21,"height":21,"x":0,"y":0,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":21,"y":0,"pixelRatio":1,"visible":true},"alcohol-shop-15":{"width":21,"height":21,"x":0,"y":21,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":21,"height":21,"x":21,"y":21,"pixelRatio":1,"visible":true},"aquarium-15":{"width":21,"height":21,"x":42,"y":0,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":21,"height":21,"x":63,"y":0,"pixelRatio":1,"visible":true},"attraction-15":{"width":21,"height":21,"x":42,"y":21,"pixelRatio":1,"visible":true},"bakery-15":{"width":21,"height":21,"x":63,"y":21,"pixelRatio":1,"visible":true},"bank-15":{"width":21,"height":21,"x":0,"y":42,"pixelRatio":1,"visible":true},"bar-15":{"width":21,"height":21,"x":21,"y":42,"pixelRatio":1,"visible":true},"beer-15":{"width":21,"height":21,"x":42,"y":42,"pixelRatio":1,"visible":true},"bicycle-15":{"width":21,"height":21,"x":63,"y":42,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":21,"height":21,"x":0,"y":63,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":21,"y":63,"pixelRatio":1,"visible":true},"cafe-15":{"width":21,"height":21,"x":42,"y":63,"pixelRatio":1,"visible":true},"campsite-15":{"width":21,"height":21,"x":63,"y":63,"pixelRatio":1,"visible":true},"car-15":{"width":21,"height":21,"x":84,"y":0,"pixelRatio":1,"visible":true},"castle-15":{"width":21,"height":21,"x":105,"y":0,"pixelRatio":1,"visible":true},"cemetery-15":{"width":21,"height":21,"x":126,"y":0,"pixelRatio":1,"visible":true},"cinema-15":{"width":21,"height":21,"x":147,"y":0,"pixelRatio":1,"visible":true},"circle-15":{"width":21,"height":21,"x":84,"y":21,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":21,"height":21,"x":105,"y":21,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":21,"height":21,"x":126,"y":21,"pixelRatio":1,"visible":true},"college-15":{"width":21,"height":21,"x":147,"y":21,"pixelRatio":1,"visible":true},"dentist-15":{"width":21,"height":21,"x":84,"y":42,"pixelRatio":1,"visible":true},"doctor-15":{"width":21,"height":21,"x":105,"y":42,"pixelRatio":1,"visible":true},"dog-park-15":{"width":21,"height":21,"x":126,"y":42,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":21,"height":21,"x":147,"y":42,"pixelRatio":1,"visible":true},"embassy-15":{"width":21,"height":21,"x":84,"y":63,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":105,"y":63,"pixelRatio":1,"visible":true},"fast-food-15":{"width":21,"height":21,"x":126,"y":63,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":147,"y":63,"pixelRatio":1,"visible":true},"fire-station-15":{"width":21,"height":21,"x":0,"y":84,"pixelRatio":1,"visible":true},"fuel-15":{"width":21,"height":21,"x":21,"y":84,"pixelRatio":1,"visible":true},"garden-15":{"width":21,"height":21,"x":42,"y":84,"pixelRatio":1,"visible":true},"golf-15":{"width":21,"height":21,"x":63,"y":84,"pixelRatio":1,"visible":true},"grocery-15":{"width":21,"height":21,"x":84,"y":84,"pixelRatio":1,"visible":true},"harbor-15":{"width":21,"height":21,"x":105,"y":84,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":126,"y":84,"pixelRatio":1,"visible":true},"hospital-15":{"width":21,"height":21,"x":147,"y":84,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":21,"height":21,"x":0,"y":105,"pixelRatio":1,"visible":true},"information-15":{"width":21,"height":21,"x":21,"y":105,"pixelRatio":1,"visible":true},"laundry-15":{"width":21,"height":21,"x":42,"y":105,"pixelRatio":1,"visible":true},"library-15":{"width":21,"height":21,"x":63,"y":105,"pixelRatio":1,"visible":true},"lodging-15":{"width":21,"height":21,"x":84,"y":105,"pixelRatio":1,"visible":true},"marker-15":{"width":21,"height":21,"x":105,"y":105,"pixelRatio":1,"visible":true},"monument-15":{"width":21,"height":21,"x":126,"y":105,"pixelRatio":1,"visible":true},"mountain-15":{"width":21,"height":21,"x":147,"y":105,"pixelRatio":1,"visible":true},"museum-15":{"width":21,"height":21,"x":0,"y":126,"pixelRatio":1,"visible":true},"music-15":{"width":21,"height":21,"x":21,"y":126,"pixelRatio":1,"visible":true},"park-15":{"width":21,"height":21,"x":42,"y":126,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":21,"height":21,"x":63,"y":126,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":21,"height":21,"x":84,"y":126,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":21,"height":21,"x":105,"y":126,"pixelRatio":1,"visible":true},"playground-15":{"width":21,"height":21,"x":126,"y":126,"pixelRatio":1,"visible":true},"police-15":{"width":21,"height":21,"x":147,"y":126,"pixelRatio":1,"visible":true},"post-15":{"width":21,"height":21,"x":0,"y":147,"pixelRatio":1,"visible":true},"prison-15":{"width":21,"height":21,"x":21,"y":147,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":42,"y":147,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":63,"y":147,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":84,"y":147,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":21,"height":21,"x":105,"y":147,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":21,"height":21,"x":126,"y":147,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":21,"height":21,"x":147,"y":147,"pixelRatio":1,"visible":true},"restaurant-15":{"width":21,"height":21,"x":168,"y":0,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":189,"y":0,"pixelRatio":1,"visible":true},"school-15":{"width":21,"height":21,"x":210,"y":0,"pixelRatio":1,"visible":true},"shop-15":{"width":21,"height":21,"x":231,"y":0,"pixelRatio":1,"visible":true},"stadium-15":{"width":21,"height":21,"x":252,"y":0,"pixelRatio":1,"visible":true},"star-15":{"width":21,"height":21,"x":273,"y":0,"pixelRatio":1,"visible":true},"suitcase-15":{"width":21,"height":21,"x":294,"y":0,"pixelRatio":1,"visible":true},"swimming-15":{"width":21,"height":21,"x":315,"y":0,"pixelRatio":1,"visible":true},"theatre-15":{"width":21,"height":21,"x":168,"y":21,"pixelRatio":1,"visible":true},"toilet-15":{"width":21,"height":21,"x":189,"y":21,"pixelRatio":1,"visible":true},"town-hall-15":{"width":21,"height":21,"x":210,"y":21,"pixelRatio":1,"visible":true},"triangle-15":{"width":21,"height":21,"x":231,"y":21,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":21,"height":21,"x":252,"y":21,"pixelRatio":1,"visible":true},"veterinary-15":{"width":21,"height":21,"x":273,"y":21,"pixelRatio":1,"visible":true},"volcano-15":{"width":21,"height":21,"x":294,"y":21,"pixelRatio":1,"visible":true},"zoo-15":{"width":21,"height":21,"x":315,"y":21,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":168,"y":42,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":185,"y":42,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":17,"height":17,"x":202,"y":42,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":17,"height":17,"x":219,"y":42,"pixelRatio":1,"visible":true},"aquarium-11":{"width":17,"height":17,"x":236,"y":42,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":17,"height":17,"x":253,"y":42,"pixelRatio":1,"visible":true},"attraction-11":{"width":17,"height":17,"x":270,"y":42,"pixelRatio":1,"visible":true},"bakery-11":{"width":17,"height":17,"x":287,"y":42,"pixelRatio":1,"visible":true},"bank-11":{"width":17,"height":17,"x":304,"y":42,"pixelRatio":1,"visible":true},"bar-11":{"width":17,"height":17,"x":168,"y":63,"pixelRatio":1,"visible":true},"beer-11":{"width":17,"height":17,"x":185,"y":63,"pixelRatio":1,"visible":true},"bicycle-11":{"width":17,"height":17,"x":202,"y":63,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":17,"height":17,"x":219,"y":63,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":236,"y":63,"pixelRatio":1,"visible":true},"cafe-11":{"width":17,"height":17,"x":253,"y":63,"pixelRatio":1,"visible":true},"campsite-11":{"width":17,"height":17,"x":270,"y":63,"pixelRatio":1,"visible":true},"car-11":{"width":17,"height":17,"x":287,"y":63,"pixelRatio":1,"visible":true},"castle-11":{"width":17,"height":17,"x":304,"y":63,"pixelRatio":1,"visible":true},"cemetery-11":{"width":17,"height":17,"x":168,"y":84,"pixelRatio":1,"visible":true},"cinema-11":{"width":17,"height":17,"x":185,"y":84,"pixelRatio":1,"visible":true},"circle-11":{"width":17,"height":17,"x":202,"y":84,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":17,"height":17,"x":219,"y":84,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":17,"height":17,"x":236,"y":84,"pixelRatio":1,"visible":true},"college-11":{"width":17,"height":17,"x":253,"y":84,"pixelRatio":1,"visible":true},"dentist-11":{"width":17,"height":17,"x":270,"y":84,"pixelRatio":1,"visible":true},"doctor-11":{"width":17,"height":17,"x":287,"y":84,"pixelRatio":1,"visible":true},"dog-park-11":{"width":17,"height":17,"x":304,"y":84,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":17,"height":17,"x":168,"y":105,"pixelRatio":1,"visible":true},"embassy-11":{"width":17,"height":17,"x":185,"y":105,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":202,"y":105,"pixelRatio":1,"visible":true},"fast-food-11":{"width":17,"height":17,"x":219,"y":105,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":236,"y":105,"pixelRatio":1,"visible":true},"fire-station-11":{"width":17,"height":17,"x":253,"y":105,"pixelRatio":1,"visible":true},"fuel-11":{"width":17,"height":17,"x":270,"y":105,"pixelRatio":1,"visible":true},"garden-11":{"width":17,"height":17,"x":287,"y":105,"pixelRatio":1,"visible":true},"golf-11":{"width":17,"height":17,"x":304,"y":105,"pixelRatio":1,"visible":true},"grocery-11":{"width":17,"height":17,"x":168,"y":126,"pixelRatio":1,"visible":true},"harbor-11":{"width":17,"height":17,"x":185,"y":126,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":202,"y":126,"pixelRatio":1,"visible":true},"hospital-11":{"width":17,"height":17,"x":219,"y":126,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":17,"height":17,"x":236,"y":126,"pixelRatio":1,"visible":true},"information-11":{"width":17,"height":17,"x":253,"y":126,"pixelRatio":1,"visible":true},"laundry-11":{"width":17,"height":17,"x":270,"y":126,"pixelRatio":1,"visible":true},"library-11":{"width":17,"height":17,"x":287,"y":126,"pixelRatio":1,"visible":true},"lodging-11":{"width":17,"height":17,"x":304,"y":126,"pixelRatio":1,"visible":true},"marker-11":{"width":17,"height":17,"x":168,"y":147,"pixelRatio":1,"visible":true},"monument-11":{"width":17,"height":17,"x":185,"y":147,"pixelRatio":1,"visible":true},"mountain-11":{"width":17,"height":17,"x":202,"y":147,"pixelRatio":1,"visible":true},"museum-11":{"width":17,"height":17,"x":219,"y":147,"pixelRatio":1,"visible":true},"music-11":{"width":17,"height":17,"x":236,"y":147,"pixelRatio":1,"visible":true},"park-11":{"width":17,"height":17,"x":253,"y":147,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":17,"height":17,"x":270,"y":147,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":17,"height":17,"x":287,"y":147,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":17,"height":17,"x":304,"y":147,"pixelRatio":1,"visible":true},"playground-11":{"width":17,"height":17,"x":0,"y":168,"pixelRatio":1,"visible":true},"police-11":{"width":17,"height":17,"x":17,"y":168,"pixelRatio":1,"visible":true},"post-11":{"width":17,"height":17,"x":34,"y":168,"pixelRatio":1,"visible":true},"prison-11":{"width":17,"height":17,"x":51,"y":168,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":68,"y":168,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":85,"y":168,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":102,"y":168,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":17,"height":17,"x":119,"y":168,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":17,"height":17,"x":136,"y":168,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":17,"height":17,"x":153,"y":168,"pixelRatio":1,"visible":true},"restaurant-11":{"width":17,"height":17,"x":170,"y":168,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":187,"y":168,"pixelRatio":1,"visible":true},"school-11":{"width":17,"height":17,"x":204,"y":168,"pixelRatio":1,"visible":true},"shop-11":{"width":17,"height":17,"x":221,"y":168,"pixelRatio":1,"visible":true},"stadium-11":{"width":17,"height":17,"x":238,"y":168,"pixelRatio":1,"visible":true},"star-11":{"width":17,"height":17,"x":255,"y":168,"pixelRatio":1,"visible":true},"suitcase-11":{"width":17,"height":17,"x":272,"y":168,"pixelRatio":1,"visible":true},"swimming-11":{"width":17,"height":17,"x":289,"y":168,"pixelRatio":1,"visible":true},"theatre-11":{"width":17,"height":17,"x":306,"y":168,"pixelRatio":1,"visible":true},"toilet-11":{"width":17,"height":17,"x":0,"y":185,"pixelRatio":1,"visible":true},"town-hall-11":{"width":17,"height":17,"x":17,"y":185,"pixelRatio":1,"visible":true},"triangle-11":{"width":17,"height":17,"x":34,"y":185,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":17,"height":17,"x":51,"y":185,"pixelRatio":1,"visible":true},"veterinary-11":{"width":17,"height":17,"x":68,"y":185,"pixelRatio":1,"visible":true},"volcano-11":{"width":17,"height":17,"x":85,"y":185,"pixelRatio":1,"visible":true},"zoo-11":{"width":17,"height":17,"x":102,"y":185,"pixelRatio":1,"visible":true}} diff --git a/metrics/integration/sprites/mapbox/bright-v9.json b/metrics/integration/sprites/mapbox/bright-v9.json index aee4b3990d5f..244be2f16b2a 100644 --- a/metrics/integration/sprites/mapbox/bright-v9.json +++ b/metrics/integration/sprites/mapbox/bright-v9.json @@ -1 +1 @@ -{"airfield-15":{"width":21,"height":21,"x":0,"y":0,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":21,"y":0,"pixelRatio":1,"visible":true},"alcohol-shop-15":{"width":21,"height":21,"x":0,"y":21,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":21,"height":21,"x":21,"y":21,"pixelRatio":1,"visible":true},"aquarium-15":{"width":21,"height":21,"x":42,"y":0,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":21,"height":21,"x":63,"y":0,"pixelRatio":1,"visible":true},"attraction-15":{"width":21,"height":21,"x":42,"y":21,"pixelRatio":1,"visible":true},"bakery-15":{"width":21,"height":21,"x":63,"y":21,"pixelRatio":1,"visible":true},"bank-15":{"width":21,"height":21,"x":0,"y":42,"pixelRatio":1,"visible":true},"bar-15":{"width":21,"height":21,"x":21,"y":42,"pixelRatio":1,"visible":true},"beer-15":{"width":21,"height":21,"x":42,"y":42,"pixelRatio":1,"visible":true},"bicycle-15":{"width":21,"height":21,"x":63,"y":42,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":21,"height":21,"x":0,"y":63,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":21,"y":63,"pixelRatio":1,"visible":true},"cafe-15":{"width":21,"height":21,"x":42,"y":63,"pixelRatio":1,"visible":true},"campsite-15":{"width":21,"height":21,"x":63,"y":63,"pixelRatio":1,"visible":true},"car-15":{"width":21,"height":21,"x":84,"y":0,"pixelRatio":1,"visible":true},"castle-15":{"width":21,"height":21,"x":105,"y":0,"pixelRatio":1,"visible":true},"cemetery-15":{"width":21,"height":21,"x":126,"y":0,"pixelRatio":1,"visible":true},"cinema-15":{"width":21,"height":21,"x":147,"y":0,"pixelRatio":1,"visible":true},"circle-15":{"width":21,"height":21,"x":84,"y":21,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":21,"height":21,"x":105,"y":21,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":21,"height":21,"x":126,"y":21,"pixelRatio":1,"visible":true},"college-15":{"width":21,"height":21,"x":147,"y":21,"pixelRatio":1,"visible":true},"dentist-15":{"width":21,"height":21,"x":84,"y":42,"pixelRatio":1,"visible":true},"doctor-15":{"width":21,"height":21,"x":105,"y":42,"pixelRatio":1,"visible":true},"dog-park-15":{"width":21,"height":21,"x":126,"y":42,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":21,"height":21,"x":147,"y":42,"pixelRatio":1,"visible":true},"embassy-15":{"width":21,"height":21,"x":84,"y":63,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":105,"y":63,"pixelRatio":1,"visible":true},"fast-food-15":{"width":21,"height":21,"x":126,"y":63,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":147,"y":63,"pixelRatio":1,"visible":true},"fire-station-15":{"width":21,"height":21,"x":0,"y":84,"pixelRatio":1,"visible":true},"fuel-15":{"width":21,"height":21,"x":21,"y":84,"pixelRatio":1,"visible":true},"garden-15":{"width":21,"height":21,"x":42,"y":84,"pixelRatio":1,"visible":true},"golf-15":{"width":21,"height":21,"x":63,"y":84,"pixelRatio":1,"visible":true},"grocery-15":{"width":21,"height":21,"x":84,"y":84,"pixelRatio":1,"visible":true},"harbor-15":{"width":21,"height":21,"x":105,"y":84,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":126,"y":84,"pixelRatio":1,"visible":true},"hospital-15":{"width":21,"height":21,"x":147,"y":84,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":21,"height":21,"x":0,"y":105,"pixelRatio":1,"visible":true},"information-15":{"width":21,"height":21,"x":21,"y":105,"pixelRatio":1,"visible":true},"laundry-15":{"width":21,"height":21,"x":42,"y":105,"pixelRatio":1,"visible":true},"library-15":{"width":21,"height":21,"x":63,"y":105,"pixelRatio":1,"visible":true},"lodging-15":{"width":21,"height":21,"x":84,"y":105,"pixelRatio":1,"visible":true},"marker-15":{"width":21,"height":21,"x":105,"y":105,"pixelRatio":1,"visible":true},"monument-15":{"width":21,"height":21,"x":126,"y":105,"pixelRatio":1,"visible":true},"mountain-15":{"width":21,"height":21,"x":147,"y":105,"pixelRatio":1,"visible":true},"museum-15":{"width":21,"height":21,"x":0,"y":126,"pixelRatio":1,"visible":true},"music-15":{"width":21,"height":21,"x":21,"y":126,"pixelRatio":1,"visible":true},"park-15":{"width":21,"height":21,"x":42,"y":126,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":21,"height":21,"x":63,"y":126,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":21,"height":21,"x":84,"y":126,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":21,"height":21,"x":105,"y":126,"pixelRatio":1,"visible":true},"playground-15":{"width":21,"height":21,"x":126,"y":126,"pixelRatio":1,"visible":true},"police-15":{"width":21,"height":21,"x":147,"y":126,"pixelRatio":1,"visible":true},"post-15":{"width":21,"height":21,"x":0,"y":147,"pixelRatio":1,"visible":true},"prison-15":{"width":21,"height":21,"x":21,"y":147,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":42,"y":147,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":63,"y":147,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":84,"y":147,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":21,"height":21,"x":105,"y":147,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":21,"height":21,"x":126,"y":147,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":21,"height":21,"x":147,"y":147,"pixelRatio":1,"visible":true},"restaurant-15":{"width":21,"height":21,"x":168,"y":0,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":189,"y":0,"pixelRatio":1,"visible":true},"school-15":{"width":21,"height":21,"x":210,"y":0,"pixelRatio":1,"visible":true},"shop-15":{"width":21,"height":21,"x":231,"y":0,"pixelRatio":1,"visible":true},"stadium-15":{"width":21,"height":21,"x":252,"y":0,"pixelRatio":1,"visible":true},"star-15":{"width":21,"height":21,"x":273,"y":0,"pixelRatio":1,"visible":true},"suitcase-15":{"width":21,"height":21,"x":294,"y":0,"pixelRatio":1,"visible":true},"swimming-15":{"width":21,"height":21,"x":315,"y":0,"pixelRatio":1,"visible":true},"theatre-15":{"width":21,"height":21,"x":168,"y":21,"pixelRatio":1,"visible":true},"toilet-15":{"width":21,"height":21,"x":189,"y":21,"pixelRatio":1,"visible":true},"town-hall-15":{"width":21,"height":21,"x":210,"y":21,"pixelRatio":1,"visible":true},"triangle-15":{"width":21,"height":21,"x":231,"y":21,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":21,"height":21,"x":252,"y":21,"pixelRatio":1,"visible":true},"veterinary-15":{"width":21,"height":21,"x":273,"y":21,"pixelRatio":1,"visible":true},"volcano-15":{"width":21,"height":21,"x":294,"y":21,"pixelRatio":1,"visible":true},"zoo-15":{"width":21,"height":21,"x":315,"y":21,"pixelRatio":1,"visible":true},"motorway_1":{"width":18,"height":18,"x":168,"y":42,"pixelRatio":1,"visible":true},"motorway_2":{"width":25,"height":18,"x":186,"y":42,"pixelRatio":1,"visible":true},"motorway_3":{"width":32,"height":18,"x":211,"y":42,"pixelRatio":1,"visible":true},"motorway_4":{"width":39,"height":18,"x":243,"y":42,"pixelRatio":1,"visible":true},"motorway_5":{"width":45,"height":18,"x":282,"y":42,"pixelRatio":1,"visible":true},"motorway_6":{"width":50,"height":18,"x":168,"y":63,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":218,"y":63,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":235,"y":63,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":17,"height":17,"x":252,"y":63,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":17,"height":17,"x":269,"y":63,"pixelRatio":1,"visible":true},"aquarium-11":{"width":17,"height":17,"x":286,"y":63,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":17,"height":17,"x":303,"y":63,"pixelRatio":1,"visible":true},"attraction-11":{"width":17,"height":17,"x":168,"y":84,"pixelRatio":1,"visible":true},"bakery-11":{"width":17,"height":17,"x":185,"y":84,"pixelRatio":1,"visible":true},"bank-11":{"width":17,"height":17,"x":202,"y":84,"pixelRatio":1,"visible":true},"bar-11":{"width":17,"height":17,"x":219,"y":84,"pixelRatio":1,"visible":true},"beer-11":{"width":17,"height":17,"x":236,"y":84,"pixelRatio":1,"visible":true},"bicycle-11":{"width":17,"height":17,"x":253,"y":84,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":17,"height":17,"x":270,"y":84,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":287,"y":84,"pixelRatio":1,"visible":true},"cafe-11":{"width":17,"height":17,"x":304,"y":84,"pixelRatio":1,"visible":true},"campsite-11":{"width":17,"height":17,"x":168,"y":105,"pixelRatio":1,"visible":true},"car-11":{"width":17,"height":17,"x":185,"y":105,"pixelRatio":1,"visible":true},"castle-11":{"width":17,"height":17,"x":202,"y":105,"pixelRatio":1,"visible":true},"cemetery-11":{"width":17,"height":17,"x":219,"y":105,"pixelRatio":1,"visible":true},"cinema-11":{"width":17,"height":17,"x":236,"y":105,"pixelRatio":1,"visible":true},"circle-11":{"width":17,"height":17,"x":253,"y":105,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":17,"height":17,"x":270,"y":105,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":17,"height":17,"x":287,"y":105,"pixelRatio":1,"visible":true},"college-11":{"width":17,"height":17,"x":304,"y":105,"pixelRatio":1,"visible":true},"dentist-11":{"width":17,"height":17,"x":168,"y":126,"pixelRatio":1,"visible":true},"doctor-11":{"width":17,"height":17,"x":185,"y":126,"pixelRatio":1,"visible":true},"dog-park-11":{"width":17,"height":17,"x":202,"y":126,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":17,"height":17,"x":219,"y":126,"pixelRatio":1,"visible":true},"embassy-11":{"width":17,"height":17,"x":236,"y":126,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":253,"y":126,"pixelRatio":1,"visible":true},"fast-food-11":{"width":17,"height":17,"x":270,"y":126,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":287,"y":126,"pixelRatio":1,"visible":true},"fire-station-11":{"width":17,"height":17,"x":304,"y":126,"pixelRatio":1,"visible":true},"fuel-11":{"width":17,"height":17,"x":168,"y":147,"pixelRatio":1,"visible":true},"garden-11":{"width":17,"height":17,"x":185,"y":147,"pixelRatio":1,"visible":true},"golf-11":{"width":17,"height":17,"x":202,"y":147,"pixelRatio":1,"visible":true},"grocery-11":{"width":17,"height":17,"x":219,"y":147,"pixelRatio":1,"visible":true},"harbor-11":{"width":17,"height":17,"x":236,"y":147,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":253,"y":147,"pixelRatio":1,"visible":true},"hospital-11":{"width":17,"height":17,"x":270,"y":147,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":17,"height":17,"x":287,"y":147,"pixelRatio":1,"visible":true},"information-11":{"width":17,"height":17,"x":304,"y":147,"pixelRatio":1,"visible":true},"laundry-11":{"width":17,"height":17,"x":0,"y":168,"pixelRatio":1,"visible":true},"library-11":{"width":17,"height":17,"x":17,"y":168,"pixelRatio":1,"visible":true},"lodging-11":{"width":17,"height":17,"x":34,"y":168,"pixelRatio":1,"visible":true},"marker-11":{"width":17,"height":17,"x":51,"y":168,"pixelRatio":1,"visible":true},"monument-11":{"width":17,"height":17,"x":68,"y":168,"pixelRatio":1,"visible":true},"mountain-11":{"width":17,"height":17,"x":85,"y":168,"pixelRatio":1,"visible":true},"museum-11":{"width":17,"height":17,"x":102,"y":168,"pixelRatio":1,"visible":true},"music-11":{"width":17,"height":17,"x":119,"y":168,"pixelRatio":1,"visible":true},"park-11":{"width":17,"height":17,"x":136,"y":168,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":17,"height":17,"x":153,"y":168,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":17,"height":17,"x":170,"y":168,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":17,"height":17,"x":187,"y":168,"pixelRatio":1,"visible":true},"playground-11":{"width":17,"height":17,"x":204,"y":168,"pixelRatio":1,"visible":true},"police-11":{"width":17,"height":17,"x":221,"y":168,"pixelRatio":1,"visible":true},"post-11":{"width":17,"height":17,"x":238,"y":168,"pixelRatio":1,"visible":true},"prison-11":{"width":17,"height":17,"x":255,"y":168,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":272,"y":168,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":289,"y":168,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":306,"y":168,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":17,"height":17,"x":0,"y":185,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":17,"height":17,"x":17,"y":185,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":17,"height":17,"x":34,"y":185,"pixelRatio":1,"visible":true},"restaurant-11":{"width":17,"height":17,"x":51,"y":185,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":68,"y":185,"pixelRatio":1,"visible":true},"school-11":{"width":17,"height":17,"x":85,"y":185,"pixelRatio":1,"visible":true},"shop-11":{"width":17,"height":17,"x":102,"y":185,"pixelRatio":1,"visible":true},"stadium-11":{"width":17,"height":17,"x":119,"y":185,"pixelRatio":1,"visible":true},"star-11":{"width":17,"height":17,"x":136,"y":185,"pixelRatio":1,"visible":true},"suitcase-11":{"width":17,"height":17,"x":153,"y":185,"pixelRatio":1,"visible":true},"swimming-11":{"width":17,"height":17,"x":170,"y":185,"pixelRatio":1,"visible":true},"theatre-11":{"width":17,"height":17,"x":187,"y":185,"pixelRatio":1,"visible":true},"toilet-11":{"width":17,"height":17,"x":204,"y":185,"pixelRatio":1,"visible":true},"town-hall-11":{"width":17,"height":17,"x":221,"y":185,"pixelRatio":1,"visible":true},"triangle-11":{"width":17,"height":17,"x":238,"y":185,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":17,"height":17,"x":255,"y":185,"pixelRatio":1,"visible":true},"veterinary-11":{"width":17,"height":17,"x":272,"y":185,"pixelRatio":1,"visible":true},"volcano-11":{"width":17,"height":17,"x":289,"y":185,"pixelRatio":1,"visible":true},"zoo-11":{"width":17,"height":17,"x":306,"y":185,"pixelRatio":1,"visible":true},"wave":{"width":16,"height":8,"x":320,"y":63,"pixelRatio":1,"visible":true}} \ No newline at end of file +{"airfield-15":{"width":21,"height":21,"x":0,"y":0,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":21,"y":0,"pixelRatio":1,"visible":true},"alcohol-shop-15":{"width":21,"height":21,"x":0,"y":21,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":21,"height":21,"x":21,"y":21,"pixelRatio":1,"visible":true},"aquarium-15":{"width":21,"height":21,"x":42,"y":0,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":21,"height":21,"x":63,"y":0,"pixelRatio":1,"visible":true},"attraction-15":{"width":21,"height":21,"x":42,"y":21,"pixelRatio":1,"visible":true},"bakery-15":{"width":21,"height":21,"x":63,"y":21,"pixelRatio":1,"visible":true},"bank-15":{"width":21,"height":21,"x":0,"y":42,"pixelRatio":1,"visible":true},"bar-15":{"width":21,"height":21,"x":21,"y":42,"pixelRatio":1,"visible":true},"beer-15":{"width":21,"height":21,"x":42,"y":42,"pixelRatio":1,"visible":true},"bicycle-15":{"width":21,"height":21,"x":63,"y":42,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":21,"height":21,"x":0,"y":63,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":21,"y":63,"pixelRatio":1,"visible":true},"cafe-15":{"width":21,"height":21,"x":42,"y":63,"pixelRatio":1,"visible":true},"campsite-15":{"width":21,"height":21,"x":63,"y":63,"pixelRatio":1,"visible":true},"car-15":{"width":21,"height":21,"x":84,"y":0,"pixelRatio":1,"visible":true},"castle-15":{"width":21,"height":21,"x":105,"y":0,"pixelRatio":1,"visible":true},"cemetery-15":{"width":21,"height":21,"x":126,"y":0,"pixelRatio":1,"visible":true},"cinema-15":{"width":21,"height":21,"x":147,"y":0,"pixelRatio":1,"visible":true},"circle-15":{"width":21,"height":21,"x":84,"y":21,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":21,"height":21,"x":105,"y":21,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":21,"height":21,"x":126,"y":21,"pixelRatio":1,"visible":true},"college-15":{"width":21,"height":21,"x":147,"y":21,"pixelRatio":1,"visible":true},"dentist-15":{"width":21,"height":21,"x":84,"y":42,"pixelRatio":1,"visible":true},"doctor-15":{"width":21,"height":21,"x":105,"y":42,"pixelRatio":1,"visible":true},"dog-park-15":{"width":21,"height":21,"x":126,"y":42,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":21,"height":21,"x":147,"y":42,"pixelRatio":1,"visible":true},"embassy-15":{"width":21,"height":21,"x":84,"y":63,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":105,"y":63,"pixelRatio":1,"visible":true},"fast-food-15":{"width":21,"height":21,"x":126,"y":63,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":147,"y":63,"pixelRatio":1,"visible":true},"fire-station-15":{"width":21,"height":21,"x":0,"y":84,"pixelRatio":1,"visible":true},"fuel-15":{"width":21,"height":21,"x":21,"y":84,"pixelRatio":1,"visible":true},"garden-15":{"width":21,"height":21,"x":42,"y":84,"pixelRatio":1,"visible":true},"golf-15":{"width":21,"height":21,"x":63,"y":84,"pixelRatio":1,"visible":true},"grocery-15":{"width":21,"height":21,"x":84,"y":84,"pixelRatio":1,"visible":true},"harbor-15":{"width":21,"height":21,"x":105,"y":84,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":126,"y":84,"pixelRatio":1,"visible":true},"hospital-15":{"width":21,"height":21,"x":147,"y":84,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":21,"height":21,"x":0,"y":105,"pixelRatio":1,"visible":true},"information-15":{"width":21,"height":21,"x":21,"y":105,"pixelRatio":1,"visible":true},"laundry-15":{"width":21,"height":21,"x":42,"y":105,"pixelRatio":1,"visible":true},"library-15":{"width":21,"height":21,"x":63,"y":105,"pixelRatio":1,"visible":true},"lodging-15":{"width":21,"height":21,"x":84,"y":105,"pixelRatio":1,"visible":true},"marker-15":{"width":21,"height":21,"x":105,"y":105,"pixelRatio":1,"visible":true},"monument-15":{"width":21,"height":21,"x":126,"y":105,"pixelRatio":1,"visible":true},"mountain-15":{"width":21,"height":21,"x":147,"y":105,"pixelRatio":1,"visible":true},"museum-15":{"width":21,"height":21,"x":0,"y":126,"pixelRatio":1,"visible":true},"music-15":{"width":21,"height":21,"x":21,"y":126,"pixelRatio":1,"visible":true},"park-15":{"width":21,"height":21,"x":42,"y":126,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":21,"height":21,"x":63,"y":126,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":21,"height":21,"x":84,"y":126,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":21,"height":21,"x":105,"y":126,"pixelRatio":1,"visible":true},"playground-15":{"width":21,"height":21,"x":126,"y":126,"pixelRatio":1,"visible":true},"police-15":{"width":21,"height":21,"x":147,"y":126,"pixelRatio":1,"visible":true},"post-15":{"width":21,"height":21,"x":0,"y":147,"pixelRatio":1,"visible":true},"prison-15":{"width":21,"height":21,"x":21,"y":147,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":42,"y":147,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":63,"y":147,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":84,"y":147,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":21,"height":21,"x":105,"y":147,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":21,"height":21,"x":126,"y":147,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":21,"height":21,"x":147,"y":147,"pixelRatio":1,"visible":true},"restaurant-15":{"width":21,"height":21,"x":168,"y":0,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":189,"y":0,"pixelRatio":1,"visible":true},"school-15":{"width":21,"height":21,"x":210,"y":0,"pixelRatio":1,"visible":true},"shop-15":{"width":21,"height":21,"x":231,"y":0,"pixelRatio":1,"visible":true},"stadium-15":{"width":21,"height":21,"x":252,"y":0,"pixelRatio":1,"visible":true},"star-15":{"width":21,"height":21,"x":273,"y":0,"pixelRatio":1,"visible":true},"suitcase-15":{"width":21,"height":21,"x":294,"y":0,"pixelRatio":1,"visible":true},"swimming-15":{"width":21,"height":21,"x":315,"y":0,"pixelRatio":1,"visible":true},"theatre-15":{"width":21,"height":21,"x":168,"y":21,"pixelRatio":1,"visible":true},"toilet-15":{"width":21,"height":21,"x":189,"y":21,"pixelRatio":1,"visible":true},"town-hall-15":{"width":21,"height":21,"x":210,"y":21,"pixelRatio":1,"visible":true},"triangle-15":{"width":21,"height":21,"x":231,"y":21,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":21,"height":21,"x":252,"y":21,"pixelRatio":1,"visible":true},"veterinary-15":{"width":21,"height":21,"x":273,"y":21,"pixelRatio":1,"visible":true},"volcano-15":{"width":21,"height":21,"x":294,"y":21,"pixelRatio":1,"visible":true},"zoo-15":{"width":21,"height":21,"x":315,"y":21,"pixelRatio":1,"visible":true},"motorway_1":{"width":18,"height":18,"x":168,"y":42,"pixelRatio":1,"visible":true},"motorway_2":{"width":25,"height":18,"x":186,"y":42,"pixelRatio":1,"visible":true},"motorway_3":{"width":32,"height":18,"x":211,"y":42,"pixelRatio":1,"visible":true},"motorway_4":{"width":39,"height":18,"x":243,"y":42,"pixelRatio":1,"visible":true},"motorway_5":{"width":45,"height":18,"x":282,"y":42,"pixelRatio":1,"visible":true},"motorway_6":{"width":50,"height":18,"x":168,"y":63,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":218,"y":63,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":235,"y":63,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":17,"height":17,"x":252,"y":63,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":17,"height":17,"x":269,"y":63,"pixelRatio":1,"visible":true},"aquarium-11":{"width":17,"height":17,"x":286,"y":63,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":17,"height":17,"x":303,"y":63,"pixelRatio":1,"visible":true},"attraction-11":{"width":17,"height":17,"x":168,"y":84,"pixelRatio":1,"visible":true},"bakery-11":{"width":17,"height":17,"x":185,"y":84,"pixelRatio":1,"visible":true},"bank-11":{"width":17,"height":17,"x":202,"y":84,"pixelRatio":1,"visible":true},"bar-11":{"width":17,"height":17,"x":219,"y":84,"pixelRatio":1,"visible":true},"beer-11":{"width":17,"height":17,"x":236,"y":84,"pixelRatio":1,"visible":true},"bicycle-11":{"width":17,"height":17,"x":253,"y":84,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":17,"height":17,"x":270,"y":84,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":287,"y":84,"pixelRatio":1,"visible":true},"cafe-11":{"width":17,"height":17,"x":304,"y":84,"pixelRatio":1,"visible":true},"campsite-11":{"width":17,"height":17,"x":168,"y":105,"pixelRatio":1,"visible":true},"car-11":{"width":17,"height":17,"x":185,"y":105,"pixelRatio":1,"visible":true},"castle-11":{"width":17,"height":17,"x":202,"y":105,"pixelRatio":1,"visible":true},"cemetery-11":{"width":17,"height":17,"x":219,"y":105,"pixelRatio":1,"visible":true},"cinema-11":{"width":17,"height":17,"x":236,"y":105,"pixelRatio":1,"visible":true},"circle-11":{"width":17,"height":17,"x":253,"y":105,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":17,"height":17,"x":270,"y":105,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":17,"height":17,"x":287,"y":105,"pixelRatio":1,"visible":true},"college-11":{"width":17,"height":17,"x":304,"y":105,"pixelRatio":1,"visible":true},"dentist-11":{"width":17,"height":17,"x":168,"y":126,"pixelRatio":1,"visible":true},"doctor-11":{"width":17,"height":17,"x":185,"y":126,"pixelRatio":1,"visible":true},"dog-park-11":{"width":17,"height":17,"x":202,"y":126,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":17,"height":17,"x":219,"y":126,"pixelRatio":1,"visible":true},"embassy-11":{"width":17,"height":17,"x":236,"y":126,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":253,"y":126,"pixelRatio":1,"visible":true},"fast-food-11":{"width":17,"height":17,"x":270,"y":126,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":287,"y":126,"pixelRatio":1,"visible":true},"fire-station-11":{"width":17,"height":17,"x":304,"y":126,"pixelRatio":1,"visible":true},"fuel-11":{"width":17,"height":17,"x":168,"y":147,"pixelRatio":1,"visible":true},"garden-11":{"width":17,"height":17,"x":185,"y":147,"pixelRatio":1,"visible":true},"golf-11":{"width":17,"height":17,"x":202,"y":147,"pixelRatio":1,"visible":true},"grocery-11":{"width":17,"height":17,"x":219,"y":147,"pixelRatio":1,"visible":true},"harbor-11":{"width":17,"height":17,"x":236,"y":147,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":253,"y":147,"pixelRatio":1,"visible":true},"hospital-11":{"width":17,"height":17,"x":270,"y":147,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":17,"height":17,"x":287,"y":147,"pixelRatio":1,"visible":true},"information-11":{"width":17,"height":17,"x":304,"y":147,"pixelRatio":1,"visible":true},"laundry-11":{"width":17,"height":17,"x":0,"y":168,"pixelRatio":1,"visible":true},"library-11":{"width":17,"height":17,"x":17,"y":168,"pixelRatio":1,"visible":true},"lodging-11":{"width":17,"height":17,"x":34,"y":168,"pixelRatio":1,"visible":true},"marker-11":{"width":17,"height":17,"x":51,"y":168,"pixelRatio":1,"visible":true},"monument-11":{"width":17,"height":17,"x":68,"y":168,"pixelRatio":1,"visible":true},"mountain-11":{"width":17,"height":17,"x":85,"y":168,"pixelRatio":1,"visible":true},"museum-11":{"width":17,"height":17,"x":102,"y":168,"pixelRatio":1,"visible":true},"music-11":{"width":17,"height":17,"x":119,"y":168,"pixelRatio":1,"visible":true},"park-11":{"width":17,"height":17,"x":136,"y":168,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":17,"height":17,"x":153,"y":168,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":17,"height":17,"x":170,"y":168,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":17,"height":17,"x":187,"y":168,"pixelRatio":1,"visible":true},"playground-11":{"width":17,"height":17,"x":204,"y":168,"pixelRatio":1,"visible":true},"police-11":{"width":17,"height":17,"x":221,"y":168,"pixelRatio":1,"visible":true},"post-11":{"width":17,"height":17,"x":238,"y":168,"pixelRatio":1,"visible":true},"prison-11":{"width":17,"height":17,"x":255,"y":168,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":272,"y":168,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":289,"y":168,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":306,"y":168,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":17,"height":17,"x":0,"y":185,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":17,"height":17,"x":17,"y":185,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":17,"height":17,"x":34,"y":185,"pixelRatio":1,"visible":true},"restaurant-11":{"width":17,"height":17,"x":51,"y":185,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":68,"y":185,"pixelRatio":1,"visible":true},"school-11":{"width":17,"height":17,"x":85,"y":185,"pixelRatio":1,"visible":true},"shop-11":{"width":17,"height":17,"x":102,"y":185,"pixelRatio":1,"visible":true},"stadium-11":{"width":17,"height":17,"x":119,"y":185,"pixelRatio":1,"visible":true},"star-11":{"width":17,"height":17,"x":136,"y":185,"pixelRatio":1,"visible":true},"suitcase-11":{"width":17,"height":17,"x":153,"y":185,"pixelRatio":1,"visible":true},"swimming-11":{"width":17,"height":17,"x":170,"y":185,"pixelRatio":1,"visible":true},"theatre-11":{"width":17,"height":17,"x":187,"y":185,"pixelRatio":1,"visible":true},"toilet-11":{"width":17,"height":17,"x":204,"y":185,"pixelRatio":1,"visible":true},"town-hall-11":{"width":17,"height":17,"x":221,"y":185,"pixelRatio":1,"visible":true},"triangle-11":{"width":17,"height":17,"x":238,"y":185,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":17,"height":17,"x":255,"y":185,"pixelRatio":1,"visible":true},"veterinary-11":{"width":17,"height":17,"x":272,"y":185,"pixelRatio":1,"visible":true},"volcano-11":{"width":17,"height":17,"x":289,"y":185,"pixelRatio":1,"visible":true},"zoo-11":{"width":17,"height":17,"x":306,"y":185,"pixelRatio":1,"visible":true},"wave":{"width":16,"height":8,"x":320,"y":63,"pixelRatio":1,"visible":true}} diff --git a/metrics/integration/sprites/mapbox/satellite-v9.json b/metrics/integration/sprites/mapbox/satellite-v9.json index fee6ff02e344..58fa10a70c9a 100644 --- a/metrics/integration/sprites/mapbox/satellite-v9.json +++ b/metrics/integration/sprites/mapbox/satellite-v9.json @@ -1 +1 @@ -{"alcohol-shop-15":{"width":23,"height":23,"x":0,"y":0,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":23,"height":23,"x":23,"y":0,"pixelRatio":1,"visible":true},"aquarium-15":{"width":23,"height":23,"x":0,"y":23,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":23,"height":23,"x":23,"y":23,"pixelRatio":1,"visible":true},"attraction-15":{"width":23,"height":23,"x":46,"y":0,"pixelRatio":1,"visible":true},"bank-15":{"width":23,"height":23,"x":69,"y":0,"pixelRatio":1,"visible":true},"bicycle-15":{"width":23,"height":23,"x":46,"y":23,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":23,"height":23,"x":69,"y":23,"pixelRatio":1,"visible":true},"car-15":{"width":23,"height":23,"x":0,"y":46,"pixelRatio":1,"visible":true},"castle-15":{"width":23,"height":23,"x":23,"y":46,"pixelRatio":1,"visible":true},"cinema-15":{"width":23,"height":23,"x":46,"y":46,"pixelRatio":1,"visible":true},"circle-15":{"width":23,"height":23,"x":69,"y":46,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":23,"height":23,"x":0,"y":69,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":23,"height":23,"x":23,"y":69,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":23,"height":23,"x":46,"y":69,"pixelRatio":1,"visible":true},"embassy-15":{"width":23,"height":23,"x":69,"y":69,"pixelRatio":1,"visible":true},"fire-station-15":{"width":23,"height":23,"x":92,"y":0,"pixelRatio":1,"visible":true},"fuel-15":{"width":23,"height":23,"x":115,"y":0,"pixelRatio":1,"visible":true},"grocery-15":{"width":23,"height":23,"x":138,"y":0,"pixelRatio":1,"visible":true},"harbor-15":{"width":23,"height":23,"x":161,"y":0,"pixelRatio":1,"visible":true},"information-15":{"width":23,"height":23,"x":92,"y":23,"pixelRatio":1,"visible":true},"laundry-15":{"width":23,"height":23,"x":115,"y":23,"pixelRatio":1,"visible":true},"library-15":{"width":23,"height":23,"x":138,"y":23,"pixelRatio":1,"visible":true},"lodging-15":{"width":23,"height":23,"x":161,"y":23,"pixelRatio":1,"visible":true},"monument-15":{"width":23,"height":23,"x":92,"y":46,"pixelRatio":1,"visible":true},"museum-15":{"width":23,"height":23,"x":115,"y":46,"pixelRatio":1,"visible":true},"music-15":{"width":23,"height":23,"x":138,"y":46,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":23,"height":23,"x":161,"y":46,"pixelRatio":1,"visible":true},"police-15":{"width":23,"height":23,"x":92,"y":69,"pixelRatio":1,"visible":true},"post-15":{"width":23,"height":23,"x":115,"y":69,"pixelRatio":1,"visible":true},"prison-15":{"width":23,"height":23,"x":138,"y":69,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":23,"height":23,"x":161,"y":69,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":23,"height":23,"x":0,"y":92,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":23,"height":23,"x":23,"y":92,"pixelRatio":1,"visible":true},"shop-15":{"width":23,"height":23,"x":46,"y":92,"pixelRatio":1,"visible":true},"stadium-15":{"width":23,"height":23,"x":69,"y":92,"pixelRatio":1,"visible":true},"star-15":{"width":23,"height":23,"x":92,"y":92,"pixelRatio":1,"visible":true},"suitcase-15":{"width":23,"height":23,"x":115,"y":92,"pixelRatio":1,"visible":true},"swimming-15":{"width":23,"height":23,"x":138,"y":92,"pixelRatio":1,"visible":true},"theatre-15":{"width":23,"height":23,"x":161,"y":92,"pixelRatio":1,"visible":true},"toilet-15":{"width":23,"height":23,"x":0,"y":115,"pixelRatio":1,"visible":true},"town-hall-15":{"width":23,"height":23,"x":23,"y":115,"pixelRatio":1,"visible":true},"triangle-15":{"width":23,"height":23,"x":46,"y":115,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":23,"height":23,"x":69,"y":115,"pixelRatio":1,"visible":true},"veterinary-15":{"width":23,"height":23,"x":92,"y":115,"pixelRatio":1,"visible":true},"airfield-15":{"width":21,"height":21,"x":115,"y":115,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":136,"y":115,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":157,"y":115,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":0,"y":138,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":21,"y":138,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":42,"y":138,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":63,"y":138,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":84,"y":138,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":105,"y":138,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":126,"y":138,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":19,"height":19,"x":147,"y":138,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":19,"height":19,"x":0,"y":159,"pixelRatio":1,"visible":true},"aquarium-11":{"width":19,"height":19,"x":19,"y":159,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":19,"height":19,"x":38,"y":159,"pixelRatio":1,"visible":true},"attraction-11":{"width":19,"height":19,"x":57,"y":159,"pixelRatio":1,"visible":true},"bakery-15":{"width":19,"height":19,"x":76,"y":159,"pixelRatio":1,"visible":true},"bank-11":{"width":19,"height":19,"x":95,"y":159,"pixelRatio":1,"visible":true},"bar-15":{"width":19,"height":19,"x":114,"y":159,"pixelRatio":1,"visible":true},"beer-15":{"width":19,"height":19,"x":133,"y":159,"pixelRatio":1,"visible":true},"bicycle-11":{"width":19,"height":19,"x":152,"y":159,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":19,"height":19,"x":171,"y":159,"pixelRatio":1,"visible":true},"cafe-15":{"width":19,"height":19,"x":190,"y":159,"pixelRatio":1,"visible":true},"campsite-15":{"width":19,"height":19,"x":209,"y":159,"pixelRatio":1,"visible":true},"car-11":{"width":19,"height":19,"x":228,"y":159,"pixelRatio":1,"visible":true},"castle-11":{"width":19,"height":19,"x":247,"y":159,"pixelRatio":1,"visible":true},"cemetery-15":{"width":19,"height":19,"x":266,"y":159,"pixelRatio":1,"visible":true},"cinema-11":{"width":19,"height":19,"x":285,"y":159,"pixelRatio":1,"visible":true},"circle-11":{"width":19,"height":19,"x":304,"y":159,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":19,"height":19,"x":323,"y":159,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":19,"height":19,"x":342,"y":159,"pixelRatio":1,"visible":true},"college-15":{"width":19,"height":19,"x":166,"y":138,"pixelRatio":1,"visible":true},"dentist-15":{"width":19,"height":19,"x":185,"y":138,"pixelRatio":1,"visible":true},"doctor-15":{"width":19,"height":19,"x":204,"y":138,"pixelRatio":1,"visible":true},"dog-park-15":{"width":19,"height":19,"x":223,"y":138,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":19,"height":19,"x":242,"y":138,"pixelRatio":1,"visible":true},"embassy-11":{"width":19,"height":19,"x":261,"y":138,"pixelRatio":1,"visible":true},"fast-food-15":{"width":19,"height":19,"x":280,"y":138,"pixelRatio":1,"visible":true},"fire-station-11":{"width":19,"height":19,"x":299,"y":138,"pixelRatio":1,"visible":true},"fuel-11":{"width":19,"height":19,"x":318,"y":138,"pixelRatio":1,"visible":true},"garden-15":{"width":19,"height":19,"x":337,"y":138,"pixelRatio":1,"visible":true},"golf-15":{"width":19,"height":19,"x":184,"y":0,"pixelRatio":1,"visible":true},"grocery-11":{"width":19,"height":19,"x":203,"y":0,"pixelRatio":1,"visible":true},"harbor-11":{"width":19,"height":19,"x":222,"y":0,"pixelRatio":1,"visible":true},"hospital-15":{"width":19,"height":19,"x":241,"y":0,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":19,"height":19,"x":260,"y":0,"pixelRatio":1,"visible":true},"information-11":{"width":19,"height":19,"x":279,"y":0,"pixelRatio":1,"visible":true},"laundry-11":{"width":19,"height":19,"x":298,"y":0,"pixelRatio":1,"visible":true},"library-11":{"width":19,"height":19,"x":317,"y":0,"pixelRatio":1,"visible":true},"lodging-11":{"width":19,"height":19,"x":336,"y":0,"pixelRatio":1,"visible":true},"monument-11":{"width":19,"height":19,"x":184,"y":23,"pixelRatio":1,"visible":true},"mountain-15":{"width":19,"height":19,"x":203,"y":23,"pixelRatio":1,"visible":true},"museum-11":{"width":19,"height":19,"x":222,"y":23,"pixelRatio":1,"visible":true},"music-11":{"width":19,"height":19,"x":241,"y":23,"pixelRatio":1,"visible":true},"park-15":{"width":19,"height":19,"x":260,"y":23,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":19,"height":19,"x":279,"y":23,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":19,"height":19,"x":298,"y":23,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":19,"height":19,"x":317,"y":23,"pixelRatio":1,"visible":true},"playground-15":{"width":19,"height":19,"x":336,"y":23,"pixelRatio":1,"visible":true},"police-11":{"width":19,"height":19,"x":184,"y":46,"pixelRatio":1,"visible":true},"post-11":{"width":19,"height":19,"x":203,"y":46,"pixelRatio":1,"visible":true},"prison-11":{"width":19,"height":19,"x":222,"y":46,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":19,"height":19,"x":241,"y":46,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":19,"height":19,"x":260,"y":46,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":19,"height":19,"x":279,"y":46,"pixelRatio":1,"visible":true},"restaurant-15":{"width":19,"height":19,"x":298,"y":46,"pixelRatio":1,"visible":true},"school-15":{"width":19,"height":19,"x":317,"y":46,"pixelRatio":1,"visible":true},"shop-11":{"width":19,"height":19,"x":336,"y":46,"pixelRatio":1,"visible":true},"stadium-11":{"width":19,"height":19,"x":184,"y":69,"pixelRatio":1,"visible":true},"star-11":{"width":19,"height":19,"x":203,"y":69,"pixelRatio":1,"visible":true},"suitcase-11":{"width":19,"height":19,"x":222,"y":69,"pixelRatio":1,"visible":true},"swimming-11":{"width":19,"height":19,"x":241,"y":69,"pixelRatio":1,"visible":true},"theatre-11":{"width":19,"height":19,"x":260,"y":69,"pixelRatio":1,"visible":true},"toilet-11":{"width":19,"height":19,"x":279,"y":69,"pixelRatio":1,"visible":true},"town-hall-11":{"width":19,"height":19,"x":298,"y":69,"pixelRatio":1,"visible":true},"triangle-11":{"width":19,"height":19,"x":317,"y":69,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":19,"height":19,"x":336,"y":69,"pixelRatio":1,"visible":true},"veterinary-11":{"width":19,"height":19,"x":184,"y":92,"pixelRatio":1,"visible":true},"volcano-15":{"width":19,"height":19,"x":203,"y":92,"pixelRatio":1,"visible":true},"zoo-15":{"width":19,"height":19,"x":222,"y":92,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":241,"y":92,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":258,"y":92,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":275,"y":92,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":292,"y":92,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":309,"y":92,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":326,"y":92,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":343,"y":92,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":178,"y":115,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":195,"y":115,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":212,"y":115,"pixelRatio":1,"visible":true},"bakery-11":{"width":15,"height":15,"x":229,"y":115,"pixelRatio":1,"visible":true},"bar-11":{"width":15,"height":15,"x":244,"y":115,"pixelRatio":1,"visible":true},"beer-11":{"width":15,"height":15,"x":259,"y":115,"pixelRatio":1,"visible":true},"cafe-11":{"width":15,"height":15,"x":274,"y":115,"pixelRatio":1,"visible":true},"campsite-11":{"width":15,"height":15,"x":289,"y":115,"pixelRatio":1,"visible":true},"cemetery-11":{"width":15,"height":15,"x":304,"y":115,"pixelRatio":1,"visible":true},"college-11":{"width":15,"height":15,"x":319,"y":115,"pixelRatio":1,"visible":true},"dentist-11":{"width":15,"height":15,"x":334,"y":115,"pixelRatio":1,"visible":true},"doctor-11":{"width":15,"height":15,"x":349,"y":115,"pixelRatio":1,"visible":true},"dog-park-11":{"width":15,"height":15,"x":0,"y":178,"pixelRatio":1,"visible":true},"fast-food-11":{"width":15,"height":15,"x":15,"y":178,"pixelRatio":1,"visible":true},"garden-11":{"width":15,"height":15,"x":30,"y":178,"pixelRatio":1,"visible":true},"golf-11":{"width":15,"height":15,"x":45,"y":178,"pixelRatio":1,"visible":true},"hospital-11":{"width":15,"height":15,"x":60,"y":178,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":15,"height":15,"x":75,"y":178,"pixelRatio":1,"visible":true},"mountain-11":{"width":15,"height":15,"x":90,"y":178,"pixelRatio":1,"visible":true},"park-11":{"width":15,"height":15,"x":105,"y":178,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":15,"height":15,"x":120,"y":178,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":15,"height":15,"x":135,"y":178,"pixelRatio":1,"visible":true},"playground-11":{"width":15,"height":15,"x":150,"y":178,"pixelRatio":1,"visible":true},"restaurant-11":{"width":15,"height":15,"x":165,"y":178,"pixelRatio":1,"visible":true},"school-11":{"width":15,"height":15,"x":180,"y":178,"pixelRatio":1,"visible":true},"volcano-11":{"width":15,"height":15,"x":195,"y":178,"pixelRatio":1,"visible":true},"zoo-11":{"width":15,"height":15,"x":210,"y":178,"pixelRatio":1,"visible":true}} \ No newline at end of file +{"alcohol-shop-15":{"width":23,"height":23,"x":0,"y":0,"pixelRatio":1,"visible":true},"amusement-park-15":{"width":23,"height":23,"x":23,"y":0,"pixelRatio":1,"visible":true},"aquarium-15":{"width":23,"height":23,"x":0,"y":23,"pixelRatio":1,"visible":true},"art-gallery-15":{"width":23,"height":23,"x":23,"y":23,"pixelRatio":1,"visible":true},"attraction-15":{"width":23,"height":23,"x":46,"y":0,"pixelRatio":1,"visible":true},"bank-15":{"width":23,"height":23,"x":69,"y":0,"pixelRatio":1,"visible":true},"bicycle-15":{"width":23,"height":23,"x":46,"y":23,"pixelRatio":1,"visible":true},"bicycle-share-15":{"width":23,"height":23,"x":69,"y":23,"pixelRatio":1,"visible":true},"car-15":{"width":23,"height":23,"x":0,"y":46,"pixelRatio":1,"visible":true},"castle-15":{"width":23,"height":23,"x":23,"y":46,"pixelRatio":1,"visible":true},"cinema-15":{"width":23,"height":23,"x":46,"y":46,"pixelRatio":1,"visible":true},"circle-15":{"width":23,"height":23,"x":69,"y":46,"pixelRatio":1,"visible":true},"circle-stroked-15":{"width":23,"height":23,"x":0,"y":69,"pixelRatio":1,"visible":true},"clothing-store-15":{"width":23,"height":23,"x":23,"y":69,"pixelRatio":1,"visible":true},"drinking-water-15":{"width":23,"height":23,"x":46,"y":69,"pixelRatio":1,"visible":true},"embassy-15":{"width":23,"height":23,"x":69,"y":69,"pixelRatio":1,"visible":true},"fire-station-15":{"width":23,"height":23,"x":92,"y":0,"pixelRatio":1,"visible":true},"fuel-15":{"width":23,"height":23,"x":115,"y":0,"pixelRatio":1,"visible":true},"grocery-15":{"width":23,"height":23,"x":138,"y":0,"pixelRatio":1,"visible":true},"harbor-15":{"width":23,"height":23,"x":161,"y":0,"pixelRatio":1,"visible":true},"information-15":{"width":23,"height":23,"x":92,"y":23,"pixelRatio":1,"visible":true},"laundry-15":{"width":23,"height":23,"x":115,"y":23,"pixelRatio":1,"visible":true},"library-15":{"width":23,"height":23,"x":138,"y":23,"pixelRatio":1,"visible":true},"lodging-15":{"width":23,"height":23,"x":161,"y":23,"pixelRatio":1,"visible":true},"monument-15":{"width":23,"height":23,"x":92,"y":46,"pixelRatio":1,"visible":true},"museum-15":{"width":23,"height":23,"x":115,"y":46,"pixelRatio":1,"visible":true},"music-15":{"width":23,"height":23,"x":138,"y":46,"pixelRatio":1,"visible":true},"place-of-worship-15":{"width":23,"height":23,"x":161,"y":46,"pixelRatio":1,"visible":true},"police-15":{"width":23,"height":23,"x":92,"y":69,"pixelRatio":1,"visible":true},"post-15":{"width":23,"height":23,"x":115,"y":69,"pixelRatio":1,"visible":true},"prison-15":{"width":23,"height":23,"x":138,"y":69,"pixelRatio":1,"visible":true},"religious-christian-15":{"width":23,"height":23,"x":161,"y":69,"pixelRatio":1,"visible":true},"religious-jewish-15":{"width":23,"height":23,"x":0,"y":92,"pixelRatio":1,"visible":true},"religious-muslim-15":{"width":23,"height":23,"x":23,"y":92,"pixelRatio":1,"visible":true},"shop-15":{"width":23,"height":23,"x":46,"y":92,"pixelRatio":1,"visible":true},"stadium-15":{"width":23,"height":23,"x":69,"y":92,"pixelRatio":1,"visible":true},"star-15":{"width":23,"height":23,"x":92,"y":92,"pixelRatio":1,"visible":true},"suitcase-15":{"width":23,"height":23,"x":115,"y":92,"pixelRatio":1,"visible":true},"swimming-15":{"width":23,"height":23,"x":138,"y":92,"pixelRatio":1,"visible":true},"theatre-15":{"width":23,"height":23,"x":161,"y":92,"pixelRatio":1,"visible":true},"toilet-15":{"width":23,"height":23,"x":0,"y":115,"pixelRatio":1,"visible":true},"town-hall-15":{"width":23,"height":23,"x":23,"y":115,"pixelRatio":1,"visible":true},"triangle-15":{"width":23,"height":23,"x":46,"y":115,"pixelRatio":1,"visible":true},"triangle-stroked-15":{"width":23,"height":23,"x":69,"y":115,"pixelRatio":1,"visible":true},"veterinary-15":{"width":23,"height":23,"x":92,"y":115,"pixelRatio":1,"visible":true},"airfield-15":{"width":21,"height":21,"x":115,"y":115,"pixelRatio":1,"visible":true},"airport-15":{"width":21,"height":21,"x":136,"y":115,"pixelRatio":1,"visible":true},"bus-15":{"width":21,"height":21,"x":157,"y":115,"pixelRatio":1,"visible":true},"entrance-15":{"width":21,"height":21,"x":0,"y":138,"pixelRatio":1,"visible":true},"ferry-15":{"width":21,"height":21,"x":21,"y":138,"pixelRatio":1,"visible":true},"heliport-15":{"width":21,"height":21,"x":42,"y":138,"pixelRatio":1,"visible":true},"rail-15":{"width":21,"height":21,"x":63,"y":138,"pixelRatio":1,"visible":true},"rail-light-15":{"width":21,"height":21,"x":84,"y":138,"pixelRatio":1,"visible":true},"rail-metro-15":{"width":21,"height":21,"x":105,"y":138,"pixelRatio":1,"visible":true},"rocket-15":{"width":21,"height":21,"x":126,"y":138,"pixelRatio":1,"visible":true},"alcohol-shop-11":{"width":19,"height":19,"x":147,"y":138,"pixelRatio":1,"visible":true},"amusement-park-11":{"width":19,"height":19,"x":0,"y":159,"pixelRatio":1,"visible":true},"aquarium-11":{"width":19,"height":19,"x":19,"y":159,"pixelRatio":1,"visible":true},"art-gallery-11":{"width":19,"height":19,"x":38,"y":159,"pixelRatio":1,"visible":true},"attraction-11":{"width":19,"height":19,"x":57,"y":159,"pixelRatio":1,"visible":true},"bakery-15":{"width":19,"height":19,"x":76,"y":159,"pixelRatio":1,"visible":true},"bank-11":{"width":19,"height":19,"x":95,"y":159,"pixelRatio":1,"visible":true},"bar-15":{"width":19,"height":19,"x":114,"y":159,"pixelRatio":1,"visible":true},"beer-15":{"width":19,"height":19,"x":133,"y":159,"pixelRatio":1,"visible":true},"bicycle-11":{"width":19,"height":19,"x":152,"y":159,"pixelRatio":1,"visible":true},"bicycle-share-11":{"width":19,"height":19,"x":171,"y":159,"pixelRatio":1,"visible":true},"cafe-15":{"width":19,"height":19,"x":190,"y":159,"pixelRatio":1,"visible":true},"campsite-15":{"width":19,"height":19,"x":209,"y":159,"pixelRatio":1,"visible":true},"car-11":{"width":19,"height":19,"x":228,"y":159,"pixelRatio":1,"visible":true},"castle-11":{"width":19,"height":19,"x":247,"y":159,"pixelRatio":1,"visible":true},"cemetery-15":{"width":19,"height":19,"x":266,"y":159,"pixelRatio":1,"visible":true},"cinema-11":{"width":19,"height":19,"x":285,"y":159,"pixelRatio":1,"visible":true},"circle-11":{"width":19,"height":19,"x":304,"y":159,"pixelRatio":1,"visible":true},"circle-stroked-11":{"width":19,"height":19,"x":323,"y":159,"pixelRatio":1,"visible":true},"clothing-store-11":{"width":19,"height":19,"x":342,"y":159,"pixelRatio":1,"visible":true},"college-15":{"width":19,"height":19,"x":166,"y":138,"pixelRatio":1,"visible":true},"dentist-15":{"width":19,"height":19,"x":185,"y":138,"pixelRatio":1,"visible":true},"doctor-15":{"width":19,"height":19,"x":204,"y":138,"pixelRatio":1,"visible":true},"dog-park-15":{"width":19,"height":19,"x":223,"y":138,"pixelRatio":1,"visible":true},"drinking-water-11":{"width":19,"height":19,"x":242,"y":138,"pixelRatio":1,"visible":true},"embassy-11":{"width":19,"height":19,"x":261,"y":138,"pixelRatio":1,"visible":true},"fast-food-15":{"width":19,"height":19,"x":280,"y":138,"pixelRatio":1,"visible":true},"fire-station-11":{"width":19,"height":19,"x":299,"y":138,"pixelRatio":1,"visible":true},"fuel-11":{"width":19,"height":19,"x":318,"y":138,"pixelRatio":1,"visible":true},"garden-15":{"width":19,"height":19,"x":337,"y":138,"pixelRatio":1,"visible":true},"golf-15":{"width":19,"height":19,"x":184,"y":0,"pixelRatio":1,"visible":true},"grocery-11":{"width":19,"height":19,"x":203,"y":0,"pixelRatio":1,"visible":true},"harbor-11":{"width":19,"height":19,"x":222,"y":0,"pixelRatio":1,"visible":true},"hospital-15":{"width":19,"height":19,"x":241,"y":0,"pixelRatio":1,"visible":true},"ice-cream-15":{"width":19,"height":19,"x":260,"y":0,"pixelRatio":1,"visible":true},"information-11":{"width":19,"height":19,"x":279,"y":0,"pixelRatio":1,"visible":true},"laundry-11":{"width":19,"height":19,"x":298,"y":0,"pixelRatio":1,"visible":true},"library-11":{"width":19,"height":19,"x":317,"y":0,"pixelRatio":1,"visible":true},"lodging-11":{"width":19,"height":19,"x":336,"y":0,"pixelRatio":1,"visible":true},"monument-11":{"width":19,"height":19,"x":184,"y":23,"pixelRatio":1,"visible":true},"mountain-15":{"width":19,"height":19,"x":203,"y":23,"pixelRatio":1,"visible":true},"museum-11":{"width":19,"height":19,"x":222,"y":23,"pixelRatio":1,"visible":true},"music-11":{"width":19,"height":19,"x":241,"y":23,"pixelRatio":1,"visible":true},"park-15":{"width":19,"height":19,"x":260,"y":23,"pixelRatio":1,"visible":true},"pharmacy-15":{"width":19,"height":19,"x":279,"y":23,"pixelRatio":1,"visible":true},"picnic-site-15":{"width":19,"height":19,"x":298,"y":23,"pixelRatio":1,"visible":true},"place-of-worship-11":{"width":19,"height":19,"x":317,"y":23,"pixelRatio":1,"visible":true},"playground-15":{"width":19,"height":19,"x":336,"y":23,"pixelRatio":1,"visible":true},"police-11":{"width":19,"height":19,"x":184,"y":46,"pixelRatio":1,"visible":true},"post-11":{"width":19,"height":19,"x":203,"y":46,"pixelRatio":1,"visible":true},"prison-11":{"width":19,"height":19,"x":222,"y":46,"pixelRatio":1,"visible":true},"religious-christian-11":{"width":19,"height":19,"x":241,"y":46,"pixelRatio":1,"visible":true},"religious-jewish-11":{"width":19,"height":19,"x":260,"y":46,"pixelRatio":1,"visible":true},"religious-muslim-11":{"width":19,"height":19,"x":279,"y":46,"pixelRatio":1,"visible":true},"restaurant-15":{"width":19,"height":19,"x":298,"y":46,"pixelRatio":1,"visible":true},"school-15":{"width":19,"height":19,"x":317,"y":46,"pixelRatio":1,"visible":true},"shop-11":{"width":19,"height":19,"x":336,"y":46,"pixelRatio":1,"visible":true},"stadium-11":{"width":19,"height":19,"x":184,"y":69,"pixelRatio":1,"visible":true},"star-11":{"width":19,"height":19,"x":203,"y":69,"pixelRatio":1,"visible":true},"suitcase-11":{"width":19,"height":19,"x":222,"y":69,"pixelRatio":1,"visible":true},"swimming-11":{"width":19,"height":19,"x":241,"y":69,"pixelRatio":1,"visible":true},"theatre-11":{"width":19,"height":19,"x":260,"y":69,"pixelRatio":1,"visible":true},"toilet-11":{"width":19,"height":19,"x":279,"y":69,"pixelRatio":1,"visible":true},"town-hall-11":{"width":19,"height":19,"x":298,"y":69,"pixelRatio":1,"visible":true},"triangle-11":{"width":19,"height":19,"x":317,"y":69,"pixelRatio":1,"visible":true},"triangle-stroked-11":{"width":19,"height":19,"x":336,"y":69,"pixelRatio":1,"visible":true},"veterinary-11":{"width":19,"height":19,"x":184,"y":92,"pixelRatio":1,"visible":true},"volcano-15":{"width":19,"height":19,"x":203,"y":92,"pixelRatio":1,"visible":true},"zoo-15":{"width":19,"height":19,"x":222,"y":92,"pixelRatio":1,"visible":true},"airfield-11":{"width":17,"height":17,"x":241,"y":92,"pixelRatio":1,"visible":true},"airport-11":{"width":17,"height":17,"x":258,"y":92,"pixelRatio":1,"visible":true},"bus-11":{"width":17,"height":17,"x":275,"y":92,"pixelRatio":1,"visible":true},"entrance-11":{"width":17,"height":17,"x":292,"y":92,"pixelRatio":1,"visible":true},"ferry-11":{"width":17,"height":17,"x":309,"y":92,"pixelRatio":1,"visible":true},"heliport-11":{"width":17,"height":17,"x":326,"y":92,"pixelRatio":1,"visible":true},"rail-11":{"width":17,"height":17,"x":343,"y":92,"pixelRatio":1,"visible":true},"rail-light-11":{"width":17,"height":17,"x":178,"y":115,"pixelRatio":1,"visible":true},"rail-metro-11":{"width":17,"height":17,"x":195,"y":115,"pixelRatio":1,"visible":true},"rocket-11":{"width":17,"height":17,"x":212,"y":115,"pixelRatio":1,"visible":true},"bakery-11":{"width":15,"height":15,"x":229,"y":115,"pixelRatio":1,"visible":true},"bar-11":{"width":15,"height":15,"x":244,"y":115,"pixelRatio":1,"visible":true},"beer-11":{"width":15,"height":15,"x":259,"y":115,"pixelRatio":1,"visible":true},"cafe-11":{"width":15,"height":15,"x":274,"y":115,"pixelRatio":1,"visible":true},"campsite-11":{"width":15,"height":15,"x":289,"y":115,"pixelRatio":1,"visible":true},"cemetery-11":{"width":15,"height":15,"x":304,"y":115,"pixelRatio":1,"visible":true},"college-11":{"width":15,"height":15,"x":319,"y":115,"pixelRatio":1,"visible":true},"dentist-11":{"width":15,"height":15,"x":334,"y":115,"pixelRatio":1,"visible":true},"doctor-11":{"width":15,"height":15,"x":349,"y":115,"pixelRatio":1,"visible":true},"dog-park-11":{"width":15,"height":15,"x":0,"y":178,"pixelRatio":1,"visible":true},"fast-food-11":{"width":15,"height":15,"x":15,"y":178,"pixelRatio":1,"visible":true},"garden-11":{"width":15,"height":15,"x":30,"y":178,"pixelRatio":1,"visible":true},"golf-11":{"width":15,"height":15,"x":45,"y":178,"pixelRatio":1,"visible":true},"hospital-11":{"width":15,"height":15,"x":60,"y":178,"pixelRatio":1,"visible":true},"ice-cream-11":{"width":15,"height":15,"x":75,"y":178,"pixelRatio":1,"visible":true},"mountain-11":{"width":15,"height":15,"x":90,"y":178,"pixelRatio":1,"visible":true},"park-11":{"width":15,"height":15,"x":105,"y":178,"pixelRatio":1,"visible":true},"pharmacy-11":{"width":15,"height":15,"x":120,"y":178,"pixelRatio":1,"visible":true},"picnic-site-11":{"width":15,"height":15,"x":135,"y":178,"pixelRatio":1,"visible":true},"playground-11":{"width":15,"height":15,"x":150,"y":178,"pixelRatio":1,"visible":true},"restaurant-11":{"width":15,"height":15,"x":165,"y":178,"pixelRatio":1,"visible":true},"school-11":{"width":15,"height":15,"x":180,"y":178,"pixelRatio":1,"visible":true},"volcano-11":{"width":15,"height":15,"x":195,"y":178,"pixelRatio":1,"visible":true},"zoo-11":{"width":15,"height":15,"x":210,"y":178,"pixelRatio":1,"visible":true}} diff --git a/metrics/integration/sprites/solid-black.json b/metrics/integration/sprites/solid-black.json index 61199f85b97b..00897b9ac562 100644 --- a/metrics/integration/sprites/solid-black.json +++ b/metrics/integration/sprites/solid-black.json @@ -6,4 +6,4 @@ "y": 0, "pixelRatio": 1 } -} \ No newline at end of file +} diff --git a/metrics/integration/sprites/sprite.json b/metrics/integration/sprites/sprite.json index e80b4daad682..3e5ba497f481 100644 --- a/metrics/integration/sprites/sprite.json +++ b/metrics/integration/sprites/sprite.json @@ -2991,4 +2991,4 @@ "pixelRatio": 1, "sdf": false } -} \ No newline at end of file +} diff --git a/metrics/integration/testem_page.html b/metrics/integration/testem_page.html index 7cdc390cfa03..9eb4913c0e47 100644 --- a/metrics/integration/testem_page.html +++ b/metrics/integration/testem_page.html @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/metrics/ios-metal-render-test-runner-metrics.json b/metrics/ios-metal-render-test-runner-metrics.json index 6e938b69141a..ddd04d18fcda 100644 --- a/metrics/ios-metal-render-test-runner-metrics.json +++ b/metrics/ios-metal-render-test-runner-metrics.json @@ -12,4 +12,4 @@ "ignores/platform-ios-metal.json" ], "metric_path": "ios-render-test-runner" -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner-metrics.json b/metrics/ios-render-test-runner-metrics.json index 8a073b875744..32d21995bd7e 100644 --- a/metrics/ios-render-test-runner-metrics.json +++ b/metrics/ios-render-test-runner-metrics.json @@ -10,4 +10,4 @@ "ignores/platform-ios.json" ], "metric_path": "ios-render-test-runner" -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/probes/gfx/pass-double-probe/metrics.json b/metrics/ios-render-test-runner/probes/gfx/pass-double-probe/metrics.json index 274d5cd7c894..80999bbd2081 100644 --- a/metrics/ios-render-test-runner/probes/gfx/pass-double-probe/metrics.json +++ b/metrics/ios-render-test-runner/probes/gfx/pass-double-probe/metrics.json @@ -39,4 +39,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/probes/gfx/pass-probe-reset/metrics.json b/metrics/ios-render-test-runner/probes/gfx/pass-probe-reset/metrics.json index 50f2a2721a54..0fdfda151bbf 100644 --- a/metrics/ios-render-test-runner/probes/gfx/pass-probe-reset/metrics.json +++ b/metrics/ios-render-test-runner/probes/gfx/pass-probe-reset/metrics.json @@ -39,4 +39,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/probes/gfx/pass/metrics.json b/metrics/ios-render-test-runner/probes/gfx/pass/metrics.json index 930d8dcf5074..1bf3e7555540 100644 --- a/metrics/ios-render-test-runner/probes/gfx/pass/metrics.json +++ b/metrics/ios-render-test-runner/probes/gfx/pass/metrics.json @@ -20,4 +20,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/ios-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/background-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/background-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/background-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-opacity/color/metrics.json b/metrics/ios-render-test-runner/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/ios-render-test-runner/render-tests/background-opacity/color/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-opacity/image/metrics.json b/metrics/ios-render-test-runner/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/ios-render-test-runner/render-tests/background-opacity/image/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-opacity/overlay/metrics.json b/metrics/ios-render-test-runner/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/ios-render-test-runner/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/@2x/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/missing/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/missing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/pitch/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/rotated/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-pattern/zoomed/metrics.json b/metrics/ios-render-test-runner/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/ios-render-test-runner/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/background-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/background-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/background-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/ios-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/ios-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/ios-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/ios-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/basic-v9/z0/metrics.json b/metrics/ios-render-test-runner/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/ios-render-test-runner/render-tests/basic-v9/z0/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/bright-v9/z0/metrics.json b/metrics/ios-render-test-runner/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/ios-render-test-runner/render-tests/bright-v9/z0/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/blending/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/blending/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/linestring/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/point/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-geometry/polygon/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/blending/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-sort-key/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/circle-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/circle-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-lines/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-lines/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/debug/collision-pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/ios-render-test-runner/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/empty/empty/metrics.json b/metrics/ios-render-test-runner/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/empty/empty/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/extent/1024-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/ios-render-test-runner/render-tests/extent/1024-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/extent/1024-line/metrics.json b/metrics/ios-render-test-runner/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/ios-render-test-runner/render-tests/extent/1024-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/extent/1024-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/extent/1024-symbol/metrics.json index b5f9604d8e96..db8d7dd52842 100644 --- a/metrics/ios-render-test-runner/render-tests/extent/1024-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/extent/1024-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/feature-state/composite-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/ios-render-test-runner/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/feature-state/data-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/ios-render-test-runner/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/feature-state/vector-source/metrics.json b/metrics/ios-render-test-runner/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/ios-render-test-runner/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-antialias/false/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-antialias/false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/multiply/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/multiply/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json index 5c12ec1c1ea2..76b87e9c9135 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json index e7b07b6e2550..70de23c6ba2c 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-extrusion-vertical-gradient/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json index cc32c1d10777..b9b9efc9617e 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/fill/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/@2x/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/literal/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/missing/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/opacity/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-pattern/zoomed/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-pattern/zoomed/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-pattern/zoomed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-sort-key/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/fill-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/ios-render-test-runner/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/filter/equality/metrics.json b/metrics/ios-render-test-runner/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/filter/equality/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/filter/in/metrics.json b/metrics/ios-render-test-runner/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/ios-render-test-runner/render-tests/filter/in/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/filter/legacy-equality/metrics.json b/metrics/ios-render-test-runner/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/filter/none/metrics.json b/metrics/ios-render-test-runner/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/filter/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/clustered-properties/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/clustered/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/clustered/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/external-feature/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/external-feature/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/external-invalid/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/external-linestring/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/external-malformed/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-feature/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-invalid/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-malformed/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-line/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/missing/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/missing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/ios-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-color/expression/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/default/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/function/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-weight/default/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/heatmap-weight/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/ios-render-test-runner/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/center/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/center/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/left/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/right/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/top-left/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/top-right/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-anchor/top/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-anchor/top/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-width/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-width/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json index 9689f9840725..b9c1f8822ecc 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/image-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/stretchable-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/stretchable/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/stretchable/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/stretchable/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/stretchable/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-image/token/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-image/token/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-offset/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-offset/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-offset/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-opacity/text-only/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotate/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/none/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json index 37cfb3b5fd32..5020340b5dd0 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json index 52972bf07eec..b0dc3e866648 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json index 5bec05e5841c..3e8b0447fdfc 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json index 0cd910a99ac8..2a65586061c5 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json index 3e848e85338f..8935bee6fccc 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json index 6048fc7e0b6a..3a57c7e24ca9 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/icon-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/default/metrics.json b/metrics/ios-render-test-runner/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/ios-render-test-runner/render-tests/image/pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-brightness/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-brightness/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-contrast/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-contrast/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-resampling/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-resampling/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-saturation/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-saturation/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/image/raster-visibility/metrics.json b/metrics/ios-render-test-runner/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/ios-render-test-runner/render-tests/image/raster-visibility/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/is-supported-script/filter/metrics.json b/metrics/ios-render-test-runner/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/ios-render-test-runner/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/is-supported-script/layout/metrics.json b/metrics/ios-render-test-runner/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/ios-render-test-runner/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-blur/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-blur/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-blur/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-blur/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-blur/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-blur/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-blur/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/ios-render-test-runner/render-tests/line-blur/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-cap/butt/metrics.json b/metrics/ios-render-test-runner/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-cap/butt/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-cap/round/metrics.json b/metrics/ios-render-test-runner/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/ios-render-test-runner/render-tests/line-cap/round/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-cap/square/metrics.json b/metrics/ios-render-test-runner/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-cap/square/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-color/property-function-identity/metrics.json b/metrics/ios-render-test-runner/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/ios-render-test-runner/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/ios-render-test-runner/render-tests/line-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/slant/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/ios-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json index b4f03708c458..18b105187aad 100644 --- a/metrics/ios-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gap-width/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gap-width/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gap-width/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gap-width/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gap-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gap-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gradient/gradient/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-gradient/translucent/metrics.json b/metrics/ios-render-test-runner/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/ios-render-test-runner/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/bevel/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/bevel/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/miter-transparent/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/miter/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/miter/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/round-transparent/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-join/round/metrics.json b/metrics/ios-render-test-runner/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/ios-render-test-runner/render-tests/line-join/round/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-offset/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-offset/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-offset/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-offset/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-offset/literal-negative/metrics.json b/metrics/ios-render-test-runner/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-offset/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-offset/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-offset/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/ios-render-test-runner/render-tests/line-offset/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/ios-render-test-runner/render-tests/line-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/ios-render-test-runner/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-opacity/step-curve/metrics.json b/metrics/ios-render-test-runner/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/ios-render-test-runner/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/@2x/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/opacity/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/opacity/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/opacity/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/pitch/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/step-curve/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pitch/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pitch/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch0/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch15/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch30/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/ios-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-sort-key/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/ios-render-test-runner/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/ios-render-test-runner/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/ios-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-translate/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-triangulation/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/ios-render-test-runner/render-tests/line-triangulation/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-triangulation/round/metrics.json b/metrics/ios-render-test-runner/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/ios-render-test-runner/render-tests/line-triangulation/round/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/line-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/ios-render-test-runner/render-tests/line-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/default/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/very-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/zero-width-function/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/line-width/zero-width/metrics.json b/metrics/ios-render-test-runner/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/ios-render-test-runner/render-tests/line-width/zero-width/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/ios-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/map-mode/static/metrics.json b/metrics/ios-render-test-runner/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/ios-render-test-runner/render-tests/map-mode/static/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/ios-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json index c158d2da3de1..032f3000b083 100644 --- a/metrics/ios-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/map-mode/tile/metrics.json b/metrics/ios-render-test-runner/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/ios-render-test-runner/render-tests/map-mode/tile/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json b/metrics/ios-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/ios-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/projection/axonometric/metrics.json b/metrics/ios-render-test-runner/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/ios-render-test-runner/render-tests/projection/axonometric/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/projection/perspective/metrics.json b/metrics/ios-render-test-runner/render-tests/projection/perspective/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/ios-render-test-runner/render-tests/projection/perspective/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/projection/perspective/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/projection/skew/metrics.json b/metrics/ios-render-test-runner/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/ios-render-test-runner/render-tests/projection/skew/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-alpha/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-alpha/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-brightness/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-brightness/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-brightness/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-brightness/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-brightness/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-contrast/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-contrast/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-contrast/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-contrast/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-contrast/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-extent/minzoom/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-loading/missing/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-loading/missing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-resampling/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-resampling/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-resampling/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-resampling/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-resampling/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-rotation/0/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-rotation/0/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-rotation/180/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-rotation/180/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-rotation/270/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-rotation/270/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-rotation/45/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-rotation/45/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-rotation/90/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-rotation/90/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-saturation/default/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-saturation/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-saturation/function/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-saturation/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-saturation/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/raster-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/real-world/nepal/metrics.json b/metrics/ios-render-test-runner/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/ios-render-test-runner/render-tests/real-world/nepal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/real-world/norway/metrics.json b/metrics/ios-render-test-runner/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/ios-render-test-runner/render-tests/real-world/norway/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/real-world/uruguay/metrics.json b/metrics/ios-render-test-runner/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/ios-render-test-runner/render-tests/real-world/uruguay/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json index bc237525bb2f..b508cf45785f 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json index ad0cf8a26751..96b40f548e9e 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json index daa3b24ba11e..76c12734be8a 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json index 7f54e7480358..b9a7b5fe6480 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 662a5ca35c53..44aa3db9ce14 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/ios-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/ios-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/ios-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/ios-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/retina-raster/default/metrics.json b/metrics/ios-render-test-runner/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/ios-render-test-runner/render-tests/retina-raster/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json index 9b2e396f8e84..08221c27b57a 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/satellite-v9/z0/metrics.json b/metrics/ios-render-test-runner/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/ios-render-test-runner/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/ios-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/ios-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/point/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 228731dd4e22..32fd5783b7de 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index e6f162de074b..af208f4742dc 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/line/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-placement/point/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-placement/point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-z-order/default/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/ios-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/ios-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/center/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/center/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/left/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/top-left/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/top-right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-anchor/top/metrics.json b/metrics/ios-render-test-runner/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/ios-render-test-runner/render-tests/text-anchor/top/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/ios-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/ios-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/ios-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/ios-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-arabic/line-break/metrics.json b/metrics/ios-render-test-runner/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/ios-render-test-runner/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/ios-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/ios-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/ios-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/ios-render-test-runner/render-tests/text-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json index 526f4071d82d..222affd61acb 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-line/metrics.json index 089da63a881b..57cdbdbfbf11 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json index 1640b2b40ba6..0f9f3642b628 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/formatted/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/formatted/metrics.json index 883429ed733b..e985f09179ba 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/formatted/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-field/token/metrics.json b/metrics/ios-render-test-runner/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-field/token/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-font/camera-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-font/camera-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-font/data-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/text-font/data-expression/metrics.json index aac1bbcfbce4..e33d12c1328d 100644 --- a/metrics/ios-render-test-runner/render-tests/text-font/data-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-font/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-font/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-blur/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-blur/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-blur/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-color/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-color/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-color/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-color/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-color/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-color/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-width/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-width/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-width/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-width/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-halo-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/ios-render-test-runner/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-justify/auto/metrics.json b/metrics/ios-render-test-runner/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/ios-render-test-runner/render-tests/text-justify/auto/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-justify/left/metrics.json b/metrics/ios-render-test-runner/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/ios-render-test-runner/render-tests/text-justify/left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-justify/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/ios-render-test-runner/render-tests/text-justify/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-justify/right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/ios-render-test-runner/render-tests/text-justify/right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/ios-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-line-height/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/ios-render-test-runner/render-tests/text-line-height/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-angle/line-center/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-angle/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/force-newline/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/ios-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/ios-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-offset/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/ios-render-test-runner/render-tests/text-offset/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-opacity/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-opacity/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-opacity/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-opacity/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-opacity/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-opacity/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-opacity/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/ios-render-test-runner/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/ios-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/ios-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-radial-offset/basic/metrics.json b/metrics/ios-render-test-runner/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotate/with-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/composite-expression/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/composite-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/composite-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-size/zero/metrics.json b/metrics/ios-render-test-runner/render-tests/text-size/zero/metrics.json index 6acd7b5289c9..ef15ba387e2f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-size/zero/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-size/zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/ios-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-transform/lowercase/metrics.json b/metrics/ios-render-test-runner/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/ios-render-test-runner/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-transform/property-function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/ios-render-test-runner/render-tests/text-transform/property-function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-transform/uppercase/metrics.json b/metrics/ios-render-test-runner/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-translate-anchor/map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/ios-render-test-runner/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/ios-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/ios-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-translate/default/metrics.json b/metrics/ios-render-test-runner/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-translate/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-translate/function/metrics.json b/metrics/ios-render-test-runner/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-translate/function/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-translate/literal/metrics.json b/metrics/ios-render-test-runner/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-translate/literal/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 7bbece367a24..5556b79fa0c2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1a348fa3efe5..17a3110abc79 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 22295b952a86..e94f38d898df 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index c4efa5911f08..6db6f402c62f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/ios-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-visibility/none/metrics.json b/metrics/ios-render-test-runner/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/ios-render-test-runner/render-tests/text-visibility/none/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-visibility/visible/metrics.json b/metrics/ios-render-test-runner/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/ios-render-test-runner/render-tests/text-visibility/visible/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json b/metrics/ios-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json index 5231666934dc..3d72e34d0957 100644 --- a/metrics/ios-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/tile-mode/streets-v11/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/tilejson-bounds/default/metrics.json b/metrics/ios-render-test-runner/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/ios-render-test-runner/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/tms/tms/metrics.json b/metrics/ios-render-test-runner/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/ios-render-test-runner/render-tests/tms/tms/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/ios-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/ios-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/layout-text/metrics.json b/metrics/ios-render-test-runner/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/ios-render-test-runner/render-tests/within/layout-text/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/paint-circle/metrics.json b/metrics/ios-render-test-runner/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/ios-render-test-runner/render-tests/within/paint-circle/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/paint-icon/metrics.json b/metrics/ios-render-test-runner/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/ios-render-test-runner/render-tests/within/paint-icon/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/paint-line/metrics.json b/metrics/ios-render-test-runner/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/ios-render-test-runner/render-tests/within/paint-line/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/within/paint-text/metrics.json b/metrics/ios-render-test-runner/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/ios-render-test-runner/render-tests/within/paint-text/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-history/in/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-history/in/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-history/in/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-history/out/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-history/out/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-history/out/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/above/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/below/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json index ed4871473576..2fd2e941a313 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json b/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoomed-fill/default/metrics.json b/metrics/ios-render-test-runner/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/ios-render-test-runner/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json b/metrics/ios-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/ios-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/ios-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/ios-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/ios-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/ios-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/ios-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/ios-render-test-runner/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/dateline/metrics.json b/metrics/linux-clang8-release/location_indicator/dateline/metrics.json index 5aa03dea86f8..df5a0c0e5280 100644 --- a/metrics/linux-clang8-release/location_indicator/dateline/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/dateline/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/default/metrics.json b/metrics/linux-clang8-release/location_indicator/default/metrics.json index 3f23cc28b325..e647aae8ed15 100644 --- a/metrics/linux-clang8-release/location_indicator/default/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/default/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/no_radius_border/metrics.json b/metrics/linux-clang8-release/location_indicator/no_radius_border/metrics.json index 75dd4ea1d21c..f68b7bae33f7 100644 --- a/metrics/linux-clang8-release/location_indicator/no_radius_border/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/no_radius_border/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/no_radius_fill/metrics.json b/metrics/linux-clang8-release/location_indicator/no_radius_fill/metrics.json index cd7a4d1a5b00..6b997a249498 100644 --- a/metrics/linux-clang8-release/location_indicator/no_radius_fill/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/no_radius_fill/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/no_textures/metrics.json b/metrics/linux-clang8-release/location_indicator/no_textures/metrics.json index 12a0feba89f7..73e35a74b7d2 100644 --- a/metrics/linux-clang8-release/location_indicator/no_textures/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/no_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/one_texture/metrics.json b/metrics/linux-clang8-release/location_indicator/one_texture/metrics.json index 051c755c8a2f..74649e3cb39a 100644 --- a/metrics/linux-clang8-release/location_indicator/one_texture/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/one_texture/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/rotated/metrics.json b/metrics/linux-clang8-release/location_indicator/rotated/metrics.json index b7cc35ba18a2..42c9799989c1 100644 --- a/metrics/linux-clang8-release/location_indicator/rotated/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/rotated/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted/metrics.json index ad62c12ef3ab..650e1bc97f77 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift/metrics.json index 83abd1da16e7..583b5d5a0c60 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json index 034232b8fc48..9707af7c4022 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json index ec0a7c66f449..0abf5938fefc 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_left/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_left/metrics.json index 93296a9b650e..c581115dbff2 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_left/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_right/metrics.json b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_right/metrics.json index c7f7840a33d1..cf9d4c9a3e6d 100644 --- a/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_right/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/tilted_texture_shift_top_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/location_indicator/two_textures/metrics.json b/metrics/linux-clang8-release/location_indicator/two_textures/metrics.json index 8b1022a95a8d..c05984875c47 100644 --- a/metrics/linux-clang8-release/location_indicator/two_textures/metrics.json +++ b/metrics/linux-clang8-release/location_indicator/two_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/probes/gfx/pass-double-probe/metrics.json b/metrics/linux-clang8-release/probes/gfx/pass-double-probe/metrics.json index 61ee32242c77..0cd7ca1b15b5 100644 --- a/metrics/linux-clang8-release/probes/gfx/pass-double-probe/metrics.json +++ b/metrics/linux-clang8-release/probes/gfx/pass-double-probe/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/probes/gfx/pass-probe-reset/metrics.json b/metrics/linux-clang8-release/probes/gfx/pass-probe-reset/metrics.json index fdccf2715997..f0fa6d3e6e93 100644 --- a/metrics/linux-clang8-release/probes/gfx/pass-probe-reset/metrics.json +++ b/metrics/linux-clang8-release/probes/gfx/pass-probe-reset/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/probes/gfx/pass/metrics.json b/metrics/linux-clang8-release/probes/gfx/pass/metrics.json index 7d0d7d26d039..f74c5a15b304 100644 --- a/metrics/linux-clang8-release/probes/gfx/pass/metrics.json +++ b/metrics/linux-clang8-release/probes/gfx/pass/metrics.json @@ -63,4 +63,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/linux-clang8-release/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-clang8-release/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/background-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/background-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/background-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-opacity/color/metrics.json b/metrics/linux-clang8-release/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-clang8-release/render-tests/background-opacity/color/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-opacity/image/metrics.json b/metrics/linux-clang8-release/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/linux-clang8-release/render-tests/background-opacity/image/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-opacity/overlay/metrics.json b/metrics/linux-clang8-release/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/linux-clang8-release/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/@2x/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/literal/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/missing/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/missing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/pitch/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/rotated/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-pattern/zoomed/metrics.json b/metrics/linux-clang8-release/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-clang8-release/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/background-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/background-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/background-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/linux-clang8-release/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/linux-clang8-release/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/linux-clang8-release/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/linux-clang8-release/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/linux-clang8-release/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/linux-clang8-release/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/basic-v9/z0/metrics.json b/metrics/linux-clang8-release/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/linux-clang8-release/render-tests/basic-v9/z0/metrics.json +++ b/metrics/linux-clang8-release/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/bright-v9/z0/metrics.json b/metrics/linux-clang8-release/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/linux-clang8-release/render-tests/bright-v9/z0/metrics.json +++ b/metrics/linux-clang8-release/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/blending/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/blending/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/linux-clang8-release/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/linestring/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/multipoint/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/point/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-geometry/polygon/metrics.json b/metrics/linux-clang8-release/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/blending/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/map/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/antimeridian/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-sort-key/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/linux-clang8-release/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-width/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-width/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/circle-translate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/circle-translate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-lines/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-lines/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/debug/collision-pitched/metrics.json b/metrics/linux-clang8-release/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/linux-clang8-release/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/empty/empty/metrics.json b/metrics/linux-clang8-release/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/empty/empty/metrics.json +++ b/metrics/linux-clang8-release/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/extent/1024-fill/metrics.json b/metrics/linux-clang8-release/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/linux-clang8-release/render-tests/extent/1024-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/extent/1024-line/metrics.json b/metrics/linux-clang8-release/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/linux-clang8-release/render-tests/extent/1024-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/extent/1024-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/extent/1024-symbol/metrics.json index b5f9604d8e96..db8d7dd52842 100644 --- a/metrics/linux-clang8-release/render-tests/extent/1024-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/extent/1024-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/feature-state/composite-expression/metrics.json b/metrics/linux-clang8-release/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/linux-clang8-release/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/feature-state/data-expression/metrics.json b/metrics/linux-clang8-release/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/linux-clang8-release/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/feature-state/vector-source/metrics.json b/metrics/linux-clang8-release/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/linux-clang8-release/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/linux-clang8-release/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-antialias/false/metrics.json b/metrics/linux-clang8-release/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-antialias/false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/multiply/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/multiply/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/opacity/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/opacity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/linux-clang8-release/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/property-function/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json index 5c12ec1c1ea2..76b87e9c9135 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/default/metrics.json index e7b07b6e2550..70de23c6ba2c 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/function/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/literal/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/default/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json b/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/overlapping/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/linux-clang8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/fill/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/multiply/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/opacity/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/linux-clang8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/@2x/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/missing/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/linux-clang8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/linux-clang8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-sort-key/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/linux-clang8-release/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-translate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-clang8-release/render-tests/fill-translate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-clang8-release/render-tests/fill-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/fill-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-clang8-release/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/filter/equality/metrics.json b/metrics/linux-clang8-release/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/filter/equality/metrics.json +++ b/metrics/linux-clang8-release/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/filter/in/metrics.json b/metrics/linux-clang8-release/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/linux-clang8-release/render-tests/filter/in/metrics.json +++ b/metrics/linux-clang8-release/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/filter/legacy-equality/metrics.json b/metrics/linux-clang8-release/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/linux-clang8-release/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/filter/none/metrics.json b/metrics/linux-clang8-release/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/filter/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/clustered-properties/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/clustered/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/clustered/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/external-feature/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/external-feature/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/external-invalid/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/external-linestring/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/external-malformed/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-feature/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-invalid/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-malformed/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-point-circle/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-point-fill/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-point-line/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/missing/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/missing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/linux-clang8-release/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-color/expression/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-intensity/default/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-intensity/function/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-intensity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/default/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/function/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/literal/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-weight/default/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/heatmap-weight/literal/metrics.json b/metrics/linux-clang8-release/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-clang8-release/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/center/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/center/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/left/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/right/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/top-left/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/top-right/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-anchor/top/metrics.json b/metrics/linux-clang8-release/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-anchor/top/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/linux-clang8-release/render-tests/icon-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-blur/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-blur/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-blur/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/multiply/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/opacity/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-color/transparent/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-width/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-width/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-halo-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/linux-clang8-release/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json index ffd5b98d6b4c..dd3415d17845 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/image-expression/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/stretchable-content/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/stretchable-content/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/stretchable-content/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/stretchable-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/stretchable/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/stretchable/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/stretchable/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/stretchable/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-image/token/metrics.json b/metrics/linux-clang8-release/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/linux-clang8-release/render-tests/icon-image/token/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/linux-clang8-release/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-offset/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-offset/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-offset/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/icon-only/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-opacity/text-only/metrics.json b/metrics/linux-clang8-release/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-clang8-release/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/linux-clang8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotate/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotate/with-offset/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/property-function-plain/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/linux-clang8-release/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/linux-clang8-release/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/both/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/height/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/none/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json index 37cfb3b5fd32..5020340b5dd0 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json index 52972bf07eec..b0dc3e866648 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json index 5bec05e5841c..3e8b0447fdfc 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-three-part/metrics.json index 0cd910a99ac8..2a65586061c5 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-three-part/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-two-part/metrics.json index 3e848e85338f..8935bee6fccc 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-two-part/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-underscale/metrics.json index 6048fc7e0b6a..3a57c7e24ca9 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-underscale/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-text-fit/width/metrics.json b/metrics/linux-clang8-release/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-clang8-release/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/linux-clang8-release/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/linux-clang8-release/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-translate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-translate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/linux-clang8-release/render-tests/icon-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/icon-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/default/metrics.json b/metrics/linux-clang8-release/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/pitched/metrics.json b/metrics/linux-clang8-release/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/linux-clang8-release/render-tests/image/pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-brightness/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-brightness/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-contrast/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-contrast/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-hue-rotate/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-opacity/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-opacity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-resampling/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-resampling/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-saturation/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-saturation/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/image/raster-visibility/metrics.json b/metrics/linux-clang8-release/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-clang8-release/render-tests/image/raster-visibility/metrics.json +++ b/metrics/linux-clang8-release/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/is-supported-script/filter/metrics.json b/metrics/linux-clang8-release/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/linux-clang8-release/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/linux-clang8-release/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/is-supported-script/layout/metrics.json b/metrics/linux-clang8-release/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/linux-clang8-release/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/linux-clang8-release/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-blur/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-blur/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-blur/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-blur/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-blur/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-blur/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-blur/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-clang8-release/render-tests/line-blur/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-cap/butt/metrics.json b/metrics/linux-clang8-release/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-cap/butt/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-cap/round/metrics.json b/metrics/linux-clang8-release/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/linux-clang8-release/render-tests/line-cap/round/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-cap/square/metrics.json b/metrics/linux-clang8-release/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-cap/square/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-color/property-function-identity/metrics.json b/metrics/linux-clang8-release/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/linux-clang8-release/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/linux-clang8-release/render-tests/line-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/long-segment/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/round/segments/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/slant/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/linux-clang8-release/render-tests/line-dasharray/zoom-history/metrics.json index 0b59834ac4db..286060c9bdab 100644 --- a/metrics/linux-clang8-release/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gap-width/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-gap-width/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gap-width/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-gap-width/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gap-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gap-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-clang8-release/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/linux-clang8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/linux-clang8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gradient/gradient/metrics.json b/metrics/linux-clang8-release/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/linux-clang8-release/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-gradient/translucent/metrics.json b/metrics/linux-clang8-release/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/linux-clang8-release/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/bevel-transparent/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/bevel/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/bevel/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/miter-transparent/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/miter/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/miter/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/round-transparent/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-join/round/metrics.json b/metrics/linux-clang8-release/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/linux-clang8-release/render-tests/line-join/round/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-offset/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-offset/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-offset/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-offset/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-offset/literal-negative/metrics.json b/metrics/linux-clang8-release/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-offset/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-offset/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-offset/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-clang8-release/render-tests/line-offset/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-clang8-release/render-tests/line-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-clang8-release/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-opacity/step-curve/metrics.json b/metrics/linux-clang8-release/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/linux-clang8-release/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/@2x/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/overscaled/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/pitch/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/step-curve/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/linux-clang8-release/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pitch/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-pitch/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pitch/pitch0/metrics.json b/metrics/linux-clang8-release/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pitch/pitch15/metrics.json b/metrics/linux-clang8-release/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pitch/pitch30/metrics.json b/metrics/linux-clang8-release/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/linux-clang8-release/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-sort-key/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/linux-clang8-release/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-clang8-release/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-clang8-release/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-triangulation/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/linux-clang8-release/render-tests/line-triangulation/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-triangulation/round/metrics.json b/metrics/linux-clang8-release/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/linux-clang8-release/render-tests/line-triangulation/round/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-clang8-release/render-tests/line-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-clang8-release/render-tests/line-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/default/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/function/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/very-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/zero-width-function/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/line-width/zero-width/metrics.json b/metrics/linux-clang8-release/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/linux-clang8-release/render-tests/line-width/zero-width/metrics.json +++ b/metrics/linux-clang8-release/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/linux-clang8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/linux-clang8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/map-mode/static/metrics.json b/metrics/linux-clang8-release/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/linux-clang8-release/render-tests/map-mode/static/metrics.json +++ b/metrics/linux-clang8-release/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/linux-clang8-release/render-tests/map-mode/tile-avoid-edges/metrics.json index 12ed06367ea7..6604cb4c9feb 100644 --- a/metrics/linux-clang8-release/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/linux-clang8-release/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/map-mode/tile/metrics.json b/metrics/linux-clang8-release/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/linux-clang8-release/render-tests/map-mode/tile/metrics.json +++ b/metrics/linux-clang8-release/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/projection/axonometric-multiple/metrics.json b/metrics/linux-clang8-release/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/linux-clang8-release/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/linux-clang8-release/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/projection/axonometric/metrics.json b/metrics/linux-clang8-release/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-clang8-release/render-tests/projection/axonometric/metrics.json +++ b/metrics/linux-clang8-release/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/projection/perspective/metrics.json b/metrics/linux-clang8-release/render-tests/projection/perspective/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-clang8-release/render-tests/projection/perspective/metrics.json +++ b/metrics/linux-clang8-release/render-tests/projection/perspective/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/projection/skew/metrics.json b/metrics/linux-clang8-release/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-clang8-release/render-tests/projection/skew/metrics.json +++ b/metrics/linux-clang8-release/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-alpha/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/linux-clang8-release/render-tests/raster-alpha/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-brightness/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-brightness/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-brightness/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-brightness/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-brightness/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-contrast/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-contrast/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-contrast/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-contrast/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-contrast/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-extent/maxzoom/metrics.json b/metrics/linux-clang8-release/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-clang8-release/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-extent/minzoom/metrics.json b/metrics/linux-clang8-release/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-clang8-release/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-loading/missing/metrics.json b/metrics/linux-clang8-release/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/linux-clang8-release/render-tests/raster-loading/missing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/linux-clang8-release/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/linux-clang8-release/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-masking/overlapping/metrics.json b/metrics/linux-clang8-release/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/linux-clang8-release/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-resampling/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-clang8-release/render-tests/raster-resampling/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-resampling/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-clang8-release/render-tests/raster-resampling/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-resampling/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-clang8-release/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-rotation/0/metrics.json b/metrics/linux-clang8-release/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-rotation/0/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-rotation/180/metrics.json b/metrics/linux-clang8-release/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-rotation/180/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-rotation/270/metrics.json b/metrics/linux-clang8-release/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/linux-clang8-release/render-tests/raster-rotation/270/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-rotation/45/metrics.json b/metrics/linux-clang8-release/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/linux-clang8-release/render-tests/raster-rotation/45/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-rotation/90/metrics.json b/metrics/linux-clang8-release/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/linux-clang8-release/render-tests/raster-rotation/90/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-saturation/default/metrics.json b/metrics/linux-clang8-release/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-saturation/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-saturation/function/metrics.json b/metrics/linux-clang8-release/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-saturation/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-saturation/literal/metrics.json b/metrics/linux-clang8-release/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/linux-clang8-release/render-tests/raster-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/raster-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/real-world/nepal/metrics.json b/metrics/linux-clang8-release/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/linux-clang8-release/render-tests/real-world/nepal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/real-world/norway/metrics.json b/metrics/linux-clang8-release/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/linux-clang8-release/render-tests/real-world/norway/metrics.json +++ b/metrics/linux-clang8-release/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/real-world/uruguay/metrics.json b/metrics/linux-clang8-release/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/linux-clang8-release/render-tests/real-world/uruguay/metrics.json +++ b/metrics/linux-clang8-release/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json index 96bd9fd98fe0..e56676099d3f 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json index 7bca5d23fe02..e272933e8995 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json index c2b157771ed6..bd7801fad65e 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json index 6603feaf8bfe..13b901589d1e 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json index 3420d4a3fc99..01cc0d1cc08b 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json index 52ca3936645d..d9af42ea277a 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json index 4bb79fe71796..d0ceb5414074 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json index b6bf3b9d0075..87e18e45232b 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json index 71ac27d9d326..525a02be8bf4 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json index cbd01b37e008..08801eb31456 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 4a3aa63475b0..8ebdb56edb1e 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json index 6623f4879ee7..3dc3a11db4db 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 857fa5f5e3b1..7bbb5e9e4edc 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json index effeefa2aa8a..0f0f725f7054 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 6e487ce43fb0..7b805b465505 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json index 4b5fdfaa4ab2..2d7f93d1b91f 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 1b7a2185cc36..3e058d58ed63 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/linux-clang8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/linux-clang8-release/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/linux-clang8-release/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/linux-clang8-release/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/linux-clang8-release/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/linux-clang8-release/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/linux-clang8-release/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/linux-clang8-release/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/retina-raster/default/metrics.json b/metrics/linux-clang8-release/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/linux-clang8-release/render-tests/retina-raster/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-pattern/metrics.json index b6e30d5e3342..ba30b88ece16 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-remove/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-icon/metrics.json index ff91a11d5ff8..3866fc4356dd 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-pattern/metrics.json index 31a94a030d81..1f47d186634b 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/image-update-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json index dea2cb3857dc..ea696c62b6b9 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/satellite-v9/z0/metrics.json b/metrics/linux-clang8-release/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/linux-clang8-release/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/linux-clang8-release/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/linux-clang8-release/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/linux-clang8-release/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/linux-clang8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/linestring/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/point/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-geometry/polygon/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 6f795d0ee803..7369b1a5556a 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index 48f5e22ba5e0..045c5d1688e3 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/line/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-placement/point/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-placement/point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-close/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-far/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-spacing/point-close/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-spacing/point-far/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-visibility/visible/metrics.json index 1de5e049d894..9de5637253b5 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-z-order/default/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-z-order/disabled/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-z-order/pitched/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/linux-clang8-release/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/linux-clang8-release/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/linux-clang8-release/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/bottom-left/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/bottom-right/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/bottom/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/center/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/center/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/left/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/right/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/top-left/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/top-right/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-anchor/top/metrics.json b/metrics/linux-clang8-release/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-clang8-release/render-tests/text-anchor/top/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/linux-clang8-release/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/linux-clang8-release/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/linux-clang8-release/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/linux-clang8-release/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-arabic/line-break/metrics.json b/metrics/linux-clang8-release/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/linux-clang8-release/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/linux-clang8-release/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/linux-clang8-release/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/linux-clang8-release/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/linux-clang8-release/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/linux-clang8-release/render-tests/text-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-arabic/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-arabic/metrics.json index 526f4071d82d..222affd61acb 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-images/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-images/metrics.json index 52b1978f2930..9bc5091e3add 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-images/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-images/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-line/metrics.json index 089da63a881b..57cdbdbfbf11 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color/metrics.json index 1640b2b40ba6..0f9f3642b628 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/formatted/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/formatted/metrics.json index 883429ed733b..e985f09179ba 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/formatted/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-field/token/metrics.json b/metrics/linux-clang8-release/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/linux-clang8-release/render-tests/text-field/token/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-font/camera-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-clang8-release/render-tests/text-font/camera-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-font/chinese/metrics.json b/metrics/linux-clang8-release/render-tests/text-font/chinese/metrics.json index 46fdec9d0538..147bf1ce6489 100644 --- a/metrics/linux-clang8-release/render-tests/text-font/chinese/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-font/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-font/data-expression/metrics.json b/metrics/linux-clang8-release/render-tests/text-font/data-expression/metrics.json index aac1bbcfbce4..e33d12c1328d 100644 --- a/metrics/linux-clang8-release/render-tests/text-font/data-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-font/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-font/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-blur/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-blur/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-blur/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-blur/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-color/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-color/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-color/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-color/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-color/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-color/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-width/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-width/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-width/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-width/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-halo-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/linux-clang8-release/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-justify/auto/metrics.json b/metrics/linux-clang8-release/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/linux-clang8-release/render-tests/text-justify/auto/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-justify/left/metrics.json b/metrics/linux-clang8-release/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-clang8-release/render-tests/text-justify/left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-justify/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/linux-clang8-release/render-tests/text-justify/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-justify/right/metrics.json b/metrics/linux-clang8-release/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-clang8-release/render-tests/text-justify/right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-letter-spacing/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/linux-clang8-release/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/linux-clang8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-line-height/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-clang8-release/render-tests/text-line-height/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-angle/line-center/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-angle/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/force-newline/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/linux-clang8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/linux-clang8-release/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-offset/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/linux-clang8-release/render-tests/text-offset/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-opacity/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-opacity/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-opacity/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-opacity/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-opacity/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-opacity/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-opacity/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/linux-clang8-release/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/linux-clang8-release/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-clang8-release/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-radial-offset/basic/metrics.json b/metrics/linux-clang8-release/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-left/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-right/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-top/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotate/with-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/camera-function-interval/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/composite-expression/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/composite-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/composite-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-size/zero/metrics.json b/metrics/linux-clang8-release/render-tests/text-size/zero/metrics.json index 7cc4d80c96b5..3d3f3cb27384 100644 --- a/metrics/linux-clang8-release/render-tests/text-size/zero/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-size/zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/linux-clang8-release/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-transform/lowercase/metrics.json b/metrics/linux-clang8-release/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/linux-clang8-release/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-transform/property-function/metrics.json b/metrics/linux-clang8-release/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/linux-clang8-release/render-tests/text-transform/property-function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-transform/uppercase/metrics.json b/metrics/linux-clang8-release/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/linux-clang8-release/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-translate-anchor/map/metrics.json b/metrics/linux-clang8-release/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/linux-clang8-release/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/linux-clang8-release/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/linux-clang8-release/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-translate/default/metrics.json b/metrics/linux-clang8-release/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-translate/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-translate/function/metrics.json b/metrics/linux-clang8-release/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-translate/function/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-translate/literal/metrics.json b/metrics/linux-clang8-release/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-clang8-release/render-tests/text-translate/literal/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 7bbece367a24..5556b79fa0c2 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1ca57cbe487c..c070b4ab0953 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 813a3d7f1016..a579f5bf9b63 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-buttom-offset-tile-map-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-buttom-offset-tile-map-mode/metrics.json index e4ae8171f278..5459d4ed1864 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-buttom-offset-tile-map-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/left-top-right-buttom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/linux-clang8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/linux-clang8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-visibility/none/metrics.json b/metrics/linux-clang8-release/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-clang8-release/render-tests/text-visibility/none/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-visibility/visible/metrics.json b/metrics/linux-clang8-release/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/linux-clang8-release/render-tests/text-visibility/visible/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-clang8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/tile-mode/streets-v11/metrics.json b/metrics/linux-clang8-release/render-tests/tile-mode/streets-v11/metrics.json index 27458bb6ba37..bc349a3d121c 100644 --- a/metrics/linux-clang8-release/render-tests/tile-mode/streets-v11/metrics.json +++ b/metrics/linux-clang8-release/render-tests/tile-mode/streets-v11/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/tilejson-bounds/default/metrics.json b/metrics/linux-clang8-release/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/linux-clang8-release/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json b/metrics/linux-clang8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/linux-clang8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json +++ b/metrics/linux-clang8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/tms/tms/metrics.json b/metrics/linux-clang8-release/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/linux-clang8-release/render-tests/tms/tms/metrics.json +++ b/metrics/linux-clang8-release/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/linux-clang8-release/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/linux-clang8-release/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/layout-text/metrics.json b/metrics/linux-clang8-release/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/linux-clang8-release/render-tests/within/layout-text/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/paint-circle/metrics.json b/metrics/linux-clang8-release/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/linux-clang8-release/render-tests/within/paint-circle/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/paint-icon/metrics.json b/metrics/linux-clang8-release/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/linux-clang8-release/render-tests/within/paint-icon/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/paint-line/metrics.json b/metrics/linux-clang8-release/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/linux-clang8-release/render-tests/within/paint-line/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/within/paint-text/metrics.json b/metrics/linux-clang8-release/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/linux-clang8-release/render-tests/within/paint-text/metrics.json +++ b/metrics/linux-clang8-release/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-history/in/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-history/in/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-history/in/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-history/out/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-history/out/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-history/out/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/above/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/below/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/in-range/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/in-range/metrics.json index a9262cad3a1a..0031781153ad 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/out-of-range/metrics.json index a00f95be78e2..1be13b07f384 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/was-above/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoom-visibility/was-below/metrics.json b/metrics/linux-clang8-release/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-clang8-release/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoomed-fill/default/metrics.json b/metrics/linux-clang8-release/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/linux-clang8-release/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoomed-raster/fractional/metrics.json b/metrics/linux-clang8-release/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-clang8-release/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/linux-clang8-release/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/linux-clang8-release/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-clang8-release/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/linux-clang8-release/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-clang8-release/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/linux-clang8-release/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/dateline/metrics.json b/metrics/linux-gcc8-release/location_indicator/dateline/metrics.json index 2f6c9155e9b8..398ff7edd7c2 100644 --- a/metrics/linux-gcc8-release/location_indicator/dateline/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/dateline/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/default/metrics.json b/metrics/linux-gcc8-release/location_indicator/default/metrics.json index ac69157f10e9..074a7314afd4 100644 --- a/metrics/linux-gcc8-release/location_indicator/default/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/default/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/image_pixel_ratio/metrics.json b/metrics/linux-gcc8-release/location_indicator/image_pixel_ratio/metrics.json index 4e2534707d8d..a26600fa49a5 100644 --- a/metrics/linux-gcc8-release/location_indicator/image_pixel_ratio/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/image_pixel_ratio/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/no_radius_border/metrics.json b/metrics/linux-gcc8-release/location_indicator/no_radius_border/metrics.json index 089757dbd2fc..f8951f6ab29a 100644 --- a/metrics/linux-gcc8-release/location_indicator/no_radius_border/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/no_radius_border/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/no_radius_fill/metrics.json b/metrics/linux-gcc8-release/location_indicator/no_radius_fill/metrics.json index 98e4fcf8c8dc..aa21d2bcd6b8 100644 --- a/metrics/linux-gcc8-release/location_indicator/no_radius_fill/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/no_radius_fill/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/no_textures/metrics.json b/metrics/linux-gcc8-release/location_indicator/no_textures/metrics.json index 88ff6a5cec1c..ddcaae9a5f0b 100644 --- a/metrics/linux-gcc8-release/location_indicator/no_textures/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/no_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/one_texture/metrics.json b/metrics/linux-gcc8-release/location_indicator/one_texture/metrics.json index 67060da88cd1..85c9520b12af 100644 --- a/metrics/linux-gcc8-release/location_indicator/one_texture/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/one_texture/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/rotated/metrics.json b/metrics/linux-gcc8-release/location_indicator/rotated/metrics.json index 75a417e01c81..4f140d262fcc 100644 --- a/metrics/linux-gcc8-release/location_indicator/rotated/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/rotated/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted/metrics.json index 0e0a349c67ce..ef0cb59f7a01 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift/metrics.json index 5cb3be895cb8..28c11fe127a3 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json index 56203676a3ff..66f3a29505a3 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json index 73727dc0b922..c6bca28e63ff 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_bottom_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_left/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_left/metrics.json index 4d8c02fdf961..d5e5e7295eb7 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_left/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_left/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_right/metrics.json b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_right/metrics.json index 1f8d87e77806..adc7f4790357 100644 --- a/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_right/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/tilted_texture_shift_top_right/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/location_indicator/two_textures/metrics.json b/metrics/linux-gcc8-release/location_indicator/two_textures/metrics.json index 3399194e5abb..6afb7b62312b 100644 --- a/metrics/linux-gcc8-release/location_indicator/two_textures/metrics.json +++ b/metrics/linux-gcc8-release/location_indicator/two_textures/metrics.json @@ -44,4 +44,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/probes/gfx/pass-double-probe/metrics.json b/metrics/linux-gcc8-release/probes/gfx/pass-double-probe/metrics.json index a1cf51f64c68..b6e2fc796316 100644 --- a/metrics/linux-gcc8-release/probes/gfx/pass-double-probe/metrics.json +++ b/metrics/linux-gcc8-release/probes/gfx/pass-double-probe/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/probes/gfx/pass-probe-reset/metrics.json b/metrics/linux-gcc8-release/probes/gfx/pass-probe-reset/metrics.json index 0f72f9e5c27e..b820d818f3f1 100644 --- a/metrics/linux-gcc8-release/probes/gfx/pass-probe-reset/metrics.json +++ b/metrics/linux-gcc8-release/probes/gfx/pass-probe-reset/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/probes/gfx/pass/metrics.json b/metrics/linux-gcc8-release/probes/gfx/pass/metrics.json index f003dce9a005..cd1c1adcb2bb 100644 --- a/metrics/linux-gcc8-release/probes/gfx/pass/metrics.json +++ b/metrics/linux-gcc8-release/probes/gfx/pass/metrics.json @@ -63,4 +63,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/linux-gcc8-release/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-gcc8-release/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/background-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/background-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/background-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-opacity/color/metrics.json b/metrics/linux-gcc8-release/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-gcc8-release/render-tests/background-opacity/color/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-opacity/image/metrics.json b/metrics/linux-gcc8-release/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/linux-gcc8-release/render-tests/background-opacity/image/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-opacity/overlay/metrics.json b/metrics/linux-gcc8-release/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/linux-gcc8-release/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/@2x/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/missing/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/missing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/pitch/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/rotated/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-pattern/zoomed/metrics.json b/metrics/linux-gcc8-release/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/linux-gcc8-release/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/background-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/background-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/background-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/linux-gcc8-release/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/linux-gcc8-release/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/linux-gcc8-release/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/linux-gcc8-release/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/basic-v9/z0/metrics.json b/metrics/linux-gcc8-release/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/linux-gcc8-release/render-tests/basic-v9/z0/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/bright-v9/z0/metrics.json b/metrics/linux-gcc8-release/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/linux-gcc8-release/render-tests/bright-v9/z0/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/blending/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/blending/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/linestring/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/multipoint/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/point/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-geometry/polygon/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/blending/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/map/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/antimeridian/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-sort-key/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/circle-translate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/circle-translate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json index 8ed0fcb075e0..daeb965b4e10 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-lines/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-lines/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/debug/collision-pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/linux-gcc8-release/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/empty/empty/metrics.json b/metrics/linux-gcc8-release/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/empty/empty/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/extent/1024-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/linux-gcc8-release/render-tests/extent/1024-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/extent/1024-line/metrics.json b/metrics/linux-gcc8-release/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/linux-gcc8-release/render-tests/extent/1024-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/extent/1024-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/extent/1024-symbol/metrics.json index b5f9604d8e96..db8d7dd52842 100644 --- a/metrics/linux-gcc8-release/render-tests/extent/1024-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/extent/1024-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/feature-state/composite-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/linux-gcc8-release/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/feature-state/data-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/linux-gcc8-release/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/feature-state/vector-source/metrics.json b/metrics/linux-gcc8-release/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/linux-gcc8-release/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-antialias/false/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-antialias/false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/multiply/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/multiply/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/opacity/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/opacity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/property-function/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json index 5c12ec1c1ea2..76b87e9c9135 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/default/metrics.json index e7b07b6e2550..70de23c6ba2c 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/function/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/literal/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/default/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/overlapping/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/fill/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/multiply/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/opacity/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/@2x/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/missing/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-sort-key/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-translate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-translate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/fill-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-gcc8-release/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/filter/equality/metrics.json b/metrics/linux-gcc8-release/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/filter/equality/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/filter/in/metrics.json b/metrics/linux-gcc8-release/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/linux-gcc8-release/render-tests/filter/in/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/filter/legacy-equality/metrics.json b/metrics/linux-gcc8-release/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/filter/none/metrics.json b/metrics/linux-gcc8-release/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/filter/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/clustered-properties/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/clustered/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/clustered/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/external-feature/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/external-feature/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/external-invalid/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/external-linestring/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/external-malformed/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-feature/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-invalid/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-malformed/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-line/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/missing/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/missing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/linux-gcc8-release/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-color/expression/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/default/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/function/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-weight/default/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/heatmap-weight/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/linux-gcc8-release/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/center/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/center/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/left/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/right/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/top-left/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/top-right/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-anchor/top/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-anchor/top/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/multiply/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/opacity/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-color/transparent/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-width/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-width/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-halo-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json index ffd5b98d6b4c..dd3415d17845 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-image/image-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-image/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-image/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-image/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-image/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-image/token/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-image/token/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-offset/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-offset/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-offset/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/icon-only/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-opacity/text-only/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-padding/databind/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-padding/databind/metrics.json index bc3a6a1b1481..9ab0a2991d56 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-padding/databind/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-padding/databind/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-padding/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-padding/default/metrics.json index bc3a6a1b1481..9ab0a2991d56 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-padding/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-padding/default/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotate/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotate/with-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/property-function-plain/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/none/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json index fce753d43400..991ef26f44c3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json index fce753d43400..991ef26f44c3 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-collision/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-collision/metrics.json index 0ab854214ed9..e2bd3a7d7e4f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-collision/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-collision/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json index 69a1acb43f12..a7cd3243140e 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json index b885feb80cad..8a872116561c 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json index b1c125ef6dd7..04fef3035ae9 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json index b885feb80cad..8a872116561c 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-translate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-translate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/icon-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/default/metrics.json b/metrics/linux-gcc8-release/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/linux-gcc8-release/render-tests/image/pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-brightness/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-brightness/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-contrast/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-contrast/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-hue-rotate/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-opacity/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-opacity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-resampling/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-resampling/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-saturation/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-saturation/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/image/raster-visibility/metrics.json b/metrics/linux-gcc8-release/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/linux-gcc8-release/render-tests/image/raster-visibility/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/is-supported-script/filter/metrics.json b/metrics/linux-gcc8-release/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/linux-gcc8-release/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/is-supported-script/layout/metrics.json b/metrics/linux-gcc8-release/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/linux-gcc8-release/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-blur/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-blur/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-blur/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-blur/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-blur/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-blur/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-blur/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-gcc8-release/render-tests/line-blur/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-cap/butt/metrics.json b/metrics/linux-gcc8-release/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-cap/butt/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-cap/round/metrics.json b/metrics/linux-gcc8-release/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/linux-gcc8-release/render-tests/line-cap/round/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-cap/square/metrics.json b/metrics/linux-gcc8-release/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-cap/square/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-color/property-function-identity/metrics.json b/metrics/linux-gcc8-release/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/linux-gcc8-release/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/linux-gcc8-release/render-tests/line-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/long-segment/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/round/segments/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/slant/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/linux-gcc8-release/render-tests/line-dasharray/zoom-history/metrics.json index 0b59834ac4db..286060c9bdab 100644 --- a/metrics/linux-gcc8-release/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gap-width/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gap-width/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gap-width/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gap-width/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gap-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gap-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gradient/gradient/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-gradient/translucent/metrics.json b/metrics/linux-gcc8-release/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/linux-gcc8-release/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/bevel-transparent/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/bevel/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/bevel/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/miter-transparent/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/miter/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/miter/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/round-transparent/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-join/round/metrics.json b/metrics/linux-gcc8-release/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/linux-gcc8-release/render-tests/line-join/round/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-offset/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-offset/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-offset/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-offset/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-offset/literal-negative/metrics.json b/metrics/linux-gcc8-release/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-offset/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-offset/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-offset/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-gcc8-release/render-tests/line-offset/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/linux-gcc8-release/render-tests/line-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/linux-gcc8-release/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-opacity/step-curve/metrics.json b/metrics/linux-gcc8-release/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/linux-gcc8-release/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/@2x/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/overscaled/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/pitch/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/step-curve/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pitch/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pitch/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch0/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch15/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch30/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/linux-gcc8-release/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-sort-key/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/linux-gcc8-release/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-gcc8-release/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-gcc8-release/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-triangulation/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/linux-gcc8-release/render-tests/line-triangulation/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-triangulation/round/metrics.json b/metrics/linux-gcc8-release/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/linux-gcc8-release/render-tests/line-triangulation/round/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-gcc8-release/render-tests/line-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/linux-gcc8-release/render-tests/line-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/default/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/very-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/zero-width-function/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/line-width/zero-width/metrics.json b/metrics/linux-gcc8-release/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/linux-gcc8-release/render-tests/line-width/zero-width/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/linux-gcc8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/map-mode/static/metrics.json b/metrics/linux-gcc8-release/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/linux-gcc8-release/render-tests/map-mode/static/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/linux-gcc8-release/render-tests/map-mode/tile-avoid-edges/metrics.json index 12ed06367ea7..6604cb4c9feb 100644 --- a/metrics/linux-gcc8-release/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/map-mode/tile/metrics.json b/metrics/linux-gcc8-release/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/linux-gcc8-release/render-tests/map-mode/tile/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/projection/axonometric-multiple/metrics.json b/metrics/linux-gcc8-release/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/linux-gcc8-release/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/projection/axonometric/metrics.json b/metrics/linux-gcc8-release/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-gcc8-release/render-tests/projection/axonometric/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/projection/perspective/metrics.json b/metrics/linux-gcc8-release/render-tests/projection/perspective/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-gcc8-release/render-tests/projection/perspective/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/projection/perspective/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/projection/skew/metrics.json b/metrics/linux-gcc8-release/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/linux-gcc8-release/render-tests/projection/skew/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-alpha/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-alpha/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-brightness/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-brightness/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-brightness/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-brightness/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-brightness/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-contrast/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-contrast/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-contrast/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-contrast/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-contrast/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-extent/maxzoom/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-extent/minzoom/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-loading/missing/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-loading/missing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-resampling/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-resampling/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-resampling/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-resampling/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-resampling/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-rotation/0/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-rotation/0/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-rotation/180/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-rotation/180/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-rotation/270/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-rotation/270/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-rotation/45/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-rotation/45/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-rotation/90/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-rotation/90/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-saturation/default/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-saturation/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-saturation/function/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-saturation/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-saturation/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/raster-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/real-world/nepal/metrics.json b/metrics/linux-gcc8-release/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/linux-gcc8-release/render-tests/real-world/nepal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/real-world/norway/metrics.json b/metrics/linux-gcc8-release/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/linux-gcc8-release/render-tests/real-world/norway/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/real-world/uruguay/metrics.json b/metrics/linux-gcc8-release/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/linux-gcc8-release/render-tests/real-world/uruguay/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json index 96bd9fd98fe0..e56676099d3f 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json index 7bca5d23fe02..e272933e8995 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json index c2b157771ed6..bd7801fad65e 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json index 6603feaf8bfe..13b901589d1e 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json index 3420d4a3fc99..01cc0d1cc08b 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json index 52ca3936645d..d9af42ea277a 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json index 4bb79fe71796..d0ceb5414074 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json index b6bf3b9d0075..87e18e45232b 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json index 71ac27d9d326..525a02be8bf4 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json index cbd01b37e008..08801eb31456 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 4a3aa63475b0..8ebdb56edb1e 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json index 6623f4879ee7..3dc3a11db4db 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 857fa5f5e3b1..7bbb5e9e4edc 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json index effeefa2aa8a..0f0f725f7054 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 6e487ce43fb0..7b805b465505 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json index 4b5fdfaa4ab2..2d7f93d1b91f 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 1b7a2185cc36..3e058d58ed63 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/linux-gcc8-release/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/linux-gcc8-release/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/linux-gcc8-release/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/linux-gcc8-release/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/retina-raster/default/metrics.json b/metrics/linux-gcc8-release/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/linux-gcc8-release/render-tests/retina-raster/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-pattern/metrics.json index b6e30d5e3342..ba30b88ece16 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-remove/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-icon/metrics.json index ff91a11d5ff8..3866fc4356dd 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-pattern/metrics.json index 31a94a030d81..1f47d186634b 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/image-update-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json index dea2cb3857dc..ea696c62b6b9 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-glyphs/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/satellite-v9/z0/metrics.json b/metrics/linux-gcc8-release/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/linux-gcc8-release/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/linux-gcc8-release/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/linux-gcc8-release/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/array-default-only/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/array-default-only/metrics.json index 28c44c7705cb..3f7e1d890f14 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/array-default-only/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/array-default-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/sprites/array-multiple/metrics.json b/metrics/linux-gcc8-release/render-tests/sprites/array-multiple/metrics.json index 45342fbc3d74..625ad67cbb75 100644 --- a/metrics/linux-gcc8-release/render-tests/sprites/array-multiple/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/sprites/array-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/linestring/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/point/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-geometry/polygon/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 6f795d0ee803..7369b1a5556a 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index 48f5e22ba5e0..045c5d1688e3 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/line/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-placement/point/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-placement/point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-close/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-far/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-close/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-far/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-visibility/visible/metrics.json index 1de5e049d894..9de5637253b5 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-z-order/default/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-z-order/disabled/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-z-order/pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/linux-gcc8-release/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/linux-gcc8-release/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-left/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/center/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/center/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/left/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/top-left/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/top-right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-anchor/top/metrics.json b/metrics/linux-gcc8-release/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/linux-gcc8-release/render-tests/text-anchor/top/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/linux-gcc8-release/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/linux-gcc8-release/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/linux-gcc8-release/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/linux-gcc8-release/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-arabic/line-break/metrics.json b/metrics/linux-gcc8-release/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/linux-gcc8-release/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/linux-gcc8-release/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/linux-gcc8-release/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/linux-gcc8-release/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/linux-gcc8-release/render-tests/text-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-arabic/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-arabic/metrics.json index 526f4071d82d..222affd61acb 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images/metrics.json index 52b1978f2930..9bc5091e3add 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-images/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-images/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-line/metrics.json index 089da63a881b..57cdbdbfbf11 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color/metrics.json index 1640b2b40ba6..0f9f3642b628 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/formatted/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/formatted/metrics.json index 883429ed733b..e985f09179ba 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/formatted/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-field/token/metrics.json b/metrics/linux-gcc8-release/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-field/token/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-font/camera-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-font/camera-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-font/chinese/metrics.json b/metrics/linux-gcc8-release/render-tests/text-font/chinese/metrics.json index 46fdec9d0538..147bf1ce6489 100644 --- a/metrics/linux-gcc8-release/render-tests/text-font/chinese/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-font/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-font/data-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/text-font/data-expression/metrics.json index aac1bbcfbce4..e33d12c1328d 100644 --- a/metrics/linux-gcc8-release/render-tests/text-font/data-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-font/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-font/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-blur/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-blur/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-blur/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-blur/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-color/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-color/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-color/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-color/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-color/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-color/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-width/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-width/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-width/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-width/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-halo-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/linux-gcc8-release/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-justify/auto/metrics.json b/metrics/linux-gcc8-release/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/linux-gcc8-release/render-tests/text-justify/auto/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-justify/left/metrics.json b/metrics/linux-gcc8-release/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-gcc8-release/render-tests/text-justify/left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-justify/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/linux-gcc8-release/render-tests/text-justify/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-justify/right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-gcc8-release/render-tests/text-justify/right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/linux-gcc8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-line-height/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/linux-gcc8-release/render-tests/text-line-height/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-angle/line-center/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-angle/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line-center/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line-center/metrics.json index 9ab164292bee..b67a1a0819e9 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line-center/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json index 539a5a8da937..3e57c87504a5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-placement/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-placement/metrics.json index 539a5a8da937..3e57c87504a5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-placement/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/zero-width-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/linux-gcc8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/linux-gcc8-release/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-offset/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/linux-gcc8-release/render-tests/text-offset/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-opacity/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-opacity/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-opacity/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-opacity/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-opacity/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-opacity/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-opacity/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/linux-gcc8-release/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/linux-gcc8-release/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/linux-gcc8-release/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-radial-offset/basic/metrics.json b/metrics/linux-gcc8-release/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-left/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-top/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotate/with-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/camera-function-interval/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/composite-expression/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/composite-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/composite-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-size/zero/metrics.json b/metrics/linux-gcc8-release/render-tests/text-size/zero/metrics.json index 7cc4d80c96b5..3d3f3cb27384 100644 --- a/metrics/linux-gcc8-release/render-tests/text-size/zero/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-size/zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/linux-gcc8-release/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-transform/lowercase/metrics.json b/metrics/linux-gcc8-release/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/linux-gcc8-release/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-transform/property-function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/linux-gcc8-release/render-tests/text-transform/property-function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-transform/uppercase/metrics.json b/metrics/linux-gcc8-release/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-translate-anchor/map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/linux-gcc8-release/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/linux-gcc8-release/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/linux-gcc8-release/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-translate/default/metrics.json b/metrics/linux-gcc8-release/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-translate/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-translate/function/metrics.json b/metrics/linux-gcc8-release/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-translate/function/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-translate/literal/metrics.json b/metrics/linux-gcc8-release/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-translate/literal/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 7bbece367a24..5556b79fa0c2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1ca57cbe487c..c070b4ab0953 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 813a3d7f1016..a579f5bf9b63 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/linux-gcc8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-visibility/none/metrics.json b/metrics/linux-gcc8-release/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/linux-gcc8-release/render-tests/text-visibility/none/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-visibility/visible/metrics.json b/metrics/linux-gcc8-release/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/linux-gcc8-release/render-tests/text-visibility/visible/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/tile-mode/streets-v11/metrics.json b/metrics/linux-gcc8-release/render-tests/tile-mode/streets-v11/metrics.json index b8e6ac47c6af..cfd76afdc32d 100644 --- a/metrics/linux-gcc8-release/render-tests/tile-mode/streets-v11/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/tile-mode/streets-v11/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/tilejson-bounds/default/metrics.json b/metrics/linux-gcc8-release/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/linux-gcc8-release/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json b/metrics/linux-gcc8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/linux-gcc8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/tms/tms/metrics.json b/metrics/linux-gcc8-release/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/linux-gcc8-release/render-tests/tms/tms/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/linux-gcc8-release/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/linux-gcc8-release/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/layout-text/metrics.json b/metrics/linux-gcc8-release/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/linux-gcc8-release/render-tests/within/layout-text/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/paint-circle/metrics.json b/metrics/linux-gcc8-release/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/linux-gcc8-release/render-tests/within/paint-circle/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/paint-icon/metrics.json b/metrics/linux-gcc8-release/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/linux-gcc8-release/render-tests/within/paint-icon/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/paint-line/metrics.json b/metrics/linux-gcc8-release/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/linux-gcc8-release/render-tests/within/paint-line/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/within/paint-text/metrics.json b/metrics/linux-gcc8-release/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/linux-gcc8-release/render-tests/within/paint-text/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-history/in/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-history/in/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-history/in/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-history/out/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-history/out/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-history/out/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/above/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/below/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/in-range/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/in-range/metrics.json index a9262cad3a1a..0031781153ad 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/out-of-range/metrics.json index a00f95be78e2..1be13b07f384 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-above/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-below/metrics.json b/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoomed-fill/default/metrics.json b/metrics/linux-gcc8-release/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/linux-gcc8-release/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoomed-raster/fractional/metrics.json b/metrics/linux-gcc8-release/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/linux-gcc8-release/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/linux-gcc8-release/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/linux-gcc8-release/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/linux-gcc8-release/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/linux-gcc8-release/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/linux-gcc8-release/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/linux-gcc8-release/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/probes/gfx/pass-double-probe/metrics.json b/metrics/macos-xcode11-release/probes/gfx/pass-double-probe/metrics.json index 024e1f6ececf..0036a36413d7 100644 --- a/metrics/macos-xcode11-release/probes/gfx/pass-double-probe/metrics.json +++ b/metrics/macos-xcode11-release/probes/gfx/pass-double-probe/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/probes/gfx/pass-probe-reset/metrics.json b/metrics/macos-xcode11-release/probes/gfx/pass-probe-reset/metrics.json index 9b3f664d4b63..14cf728dfa03 100644 --- a/metrics/macos-xcode11-release/probes/gfx/pass-probe-reset/metrics.json +++ b/metrics/macos-xcode11-release/probes/gfx/pass-probe-reset/metrics.json @@ -82,4 +82,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/probes/gfx/pass/metrics.json b/metrics/macos-xcode11-release/probes/gfx/pass/metrics.json index c87c8e061c4f..f1ee2a7e73b7 100644 --- a/metrics/macos-xcode11-release/probes/gfx/pass/metrics.json +++ b/metrics/macos-xcode11-release/probes/gfx/pass/metrics.json @@ -63,4 +63,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/macos-xcode11-release/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/background-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/background-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/background-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-opacity/color/metrics.json b/metrics/macos-xcode11-release/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/macos-xcode11-release/render-tests/background-opacity/color/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-opacity/image/metrics.json b/metrics/macos-xcode11-release/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/macos-xcode11-release/render-tests/background-opacity/image/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-opacity/overlay/metrics.json b/metrics/macos-xcode11-release/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/macos-xcode11-release/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/@2x/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/missing/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/missing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/pitch/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/rotated/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-pattern/zoomed/metrics.json b/metrics/macos-xcode11-release/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/macos-xcode11-release/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/background-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/background-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/background-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/macos-xcode11-release/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/macos-xcode11-release/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/macos-xcode11-release/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/macos-xcode11-release/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/basic-v9/z0/metrics.json b/metrics/macos-xcode11-release/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/macos-xcode11-release/render-tests/basic-v9/z0/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/bright-v9/z0/metrics.json b/metrics/macos-xcode11-release/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/macos-xcode11-release/render-tests/bright-v9/z0/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/blending/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/blending/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/linestring/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/multipoint/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/point/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-geometry/polygon/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/blending/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/map/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/antimeridian/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-sort-key/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/circle-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/circle-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-lines/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-lines/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/debug/collision-pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/macos-xcode11-release/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/empty/empty/metrics.json b/metrics/macos-xcode11-release/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/empty/empty/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/extent/1024-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/macos-xcode11-release/render-tests/extent/1024-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/extent/1024-line/metrics.json b/metrics/macos-xcode11-release/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/macos-xcode11-release/render-tests/extent/1024-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/extent/1024-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/extent/1024-symbol/metrics.json index b5f9604d8e96..db8d7dd52842 100644 --- a/metrics/macos-xcode11-release/render-tests/extent/1024-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/extent/1024-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/feature-state/composite-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/macos-xcode11-release/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/feature-state/data-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/macos-xcode11-release/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/feature-state/vector-source/metrics.json b/metrics/macos-xcode11-release/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/macos-xcode11-release/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-antialias/false/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-antialias/false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/multiply/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/multiply/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/property-function/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json index 5c12ec1c1ea2..76b87e9c9135 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-base/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/default/metrics.json index e7b07b6e2550..70de23c6ba2c 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/function/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/literal/metrics.json index d0cf84edc1cc..9cadd158ea71 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/default/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json index 1b222aa31467..07be5a620f38 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-extrusion-vertical-gradient/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/overlapping/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json index cc32c1d10777..b9b9efc9617e 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/fill/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/multiply/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/@2x/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/literal/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/missing/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/opacity/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-pattern/zoomed/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-pattern/zoomed/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-pattern/zoomed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-sort-key/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/fill-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/macos-xcode11-release/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/filter/equality/metrics.json b/metrics/macos-xcode11-release/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/filter/equality/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/filter/in/metrics.json b/metrics/macos-xcode11-release/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/macos-xcode11-release/render-tests/filter/in/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/filter/legacy-equality/metrics.json b/metrics/macos-xcode11-release/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/filter/none/metrics.json b/metrics/macos-xcode11-release/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/filter/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/clustered-properties/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/clustered/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/clustered/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/external-feature/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/external-feature/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/external-invalid/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/external-linestring/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/external-malformed/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-feature/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-invalid/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-malformed/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-line/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/missing/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/missing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/macos-xcode11-release/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-color/expression/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/default/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/function/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-weight/default/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/heatmap-weight/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/macos-xcode11-release/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/center/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/center/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/left/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/right/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/top-left/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/top-right/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-anchor/top/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-anchor/top/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/multiply/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-color/transparent/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-width/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-width/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-halo-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json index 9689f9840725..b9c1f8822ecc 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/image-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/stretchable-content/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/stretchable-content/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/stretchable-content/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/stretchable-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/stretchable/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/stretchable/metrics.json index 253fc965aa43..e54853543f7b 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/stretchable/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/stretchable/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-image/token/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-image/token/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-offset/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-offset/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-offset/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/icon-only/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-opacity/text-only/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotate/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotate/with-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/property-function-plain/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/none/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json index 37cfb3b5fd32..5020340b5dd0 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json index 52972bf07eec..b0dc3e866648 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json index a96054ffb968..2fa4ebaed65f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json index c410a69d1954..3dd727652627 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json index 5bec05e5841c..3e8b0447fdfc 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-three-part/metrics.json index 0cd910a99ac8..2a65586061c5 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-three-part/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-two-part/metrics.json index 3e848e85338f..8935bee6fccc 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-two-part/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-underscale/metrics.json index 6048fc7e0b6a..3a57c7e24ca9 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-underscale/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/icon-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/default/metrics.json b/metrics/macos-xcode11-release/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/macos-xcode11-release/render-tests/image/pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-brightness/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-brightness/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-contrast/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-contrast/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-hue-rotate/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-resampling/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-resampling/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-saturation/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-saturation/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/image/raster-visibility/metrics.json b/metrics/macos-xcode11-release/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/macos-xcode11-release/render-tests/image/raster-visibility/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/is-supported-script/filter/metrics.json b/metrics/macos-xcode11-release/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/macos-xcode11-release/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/is-supported-script/layout/metrics.json b/metrics/macos-xcode11-release/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/macos-xcode11-release/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-blur/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-blur/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-blur/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-blur/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-blur/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-blur/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-blur/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/macos-xcode11-release/render-tests/line-blur/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-cap/butt/metrics.json b/metrics/macos-xcode11-release/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-cap/butt/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-cap/round/metrics.json b/metrics/macos-xcode11-release/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/macos-xcode11-release/render-tests/line-cap/round/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-cap/square/metrics.json b/metrics/macos-xcode11-release/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-cap/square/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-color/property-function-identity/metrics.json b/metrics/macos-xcode11-release/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/macos-xcode11-release/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/macos-xcode11-release/render-tests/line-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/long-segment/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/round/segments/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/slant/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/macos-xcode11-release/render-tests/line-dasharray/zoom-history/metrics.json index b4f03708c458..18b105187aad 100644 --- a/metrics/macos-xcode11-release/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gap-width/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gap-width/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gap-width/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gap-width/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gap-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gap-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gradient/gradient/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-gradient/translucent/metrics.json b/metrics/macos-xcode11-release/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/macos-xcode11-release/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/bevel-transparent/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/bevel/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/bevel/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/miter-transparent/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/miter/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/miter/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/round-transparent/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-join/round/metrics.json b/metrics/macos-xcode11-release/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/macos-xcode11-release/render-tests/line-join/round/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-offset/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-offset/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-offset/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-offset/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-offset/literal-negative/metrics.json b/metrics/macos-xcode11-release/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-offset/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-offset/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-offset/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/macos-xcode11-release/render-tests/line-offset/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/macos-xcode11-release/render-tests/line-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/macos-xcode11-release/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-opacity/step-curve/metrics.json b/metrics/macos-xcode11-release/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/macos-xcode11-release/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/@2x/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/opacity/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/opacity/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/opacity/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/overscaled/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/pitch/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/step-curve/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pitch/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pitch/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch0/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch15/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch30/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/macos-xcode11-release/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-sort-key/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/macos-xcode11-release/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/macos-xcode11-release/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/macos-xcode11-release/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-translate/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-triangulation/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/macos-xcode11-release/render-tests/line-triangulation/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-triangulation/round/metrics.json b/metrics/macos-xcode11-release/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/macos-xcode11-release/render-tests/line-triangulation/round/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/line-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/macos-xcode11-release/render-tests/line-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/default/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/very-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/zero-width-function/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/line-width/zero-width/metrics.json b/metrics/macos-xcode11-release/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/macos-xcode11-release/render-tests/line-width/zero-width/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/macos-xcode11-release/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/map-mode/static/metrics.json b/metrics/macos-xcode11-release/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/macos-xcode11-release/render-tests/map-mode/static/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/macos-xcode11-release/render-tests/map-mode/tile-avoid-edges/metrics.json index c158d2da3de1..032f3000b083 100644 --- a/metrics/macos-xcode11-release/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/map-mode/tile/metrics.json b/metrics/macos-xcode11-release/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/macos-xcode11-release/render-tests/map-mode/tile/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/projection/axonometric-multiple/metrics.json b/metrics/macos-xcode11-release/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/macos-xcode11-release/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/projection/axonometric/metrics.json b/metrics/macos-xcode11-release/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/macos-xcode11-release/render-tests/projection/axonometric/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/projection/perspective/metrics.json b/metrics/macos-xcode11-release/render-tests/projection/perspective/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/macos-xcode11-release/render-tests/projection/perspective/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/projection/perspective/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/projection/skew/metrics.json b/metrics/macos-xcode11-release/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/macos-xcode11-release/render-tests/projection/skew/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-alpha/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-alpha/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-brightness/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-brightness/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-brightness/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-brightness/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-brightness/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-contrast/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-contrast/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-contrast/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-contrast/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-contrast/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-extent/maxzoom/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-extent/minzoom/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-loading/missing/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-loading/missing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-resampling/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-resampling/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-resampling/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-resampling/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-resampling/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-rotation/0/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-rotation/0/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-rotation/180/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-rotation/180/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-rotation/270/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-rotation/270/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-rotation/45/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-rotation/45/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-rotation/90/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-rotation/90/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-saturation/default/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-saturation/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-saturation/function/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-saturation/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-saturation/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/raster-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/real-world/nepal/metrics.json b/metrics/macos-xcode11-release/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/macos-xcode11-release/render-tests/real-world/nepal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/real-world/norway/metrics.json b/metrics/macos-xcode11-release/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/macos-xcode11-release/render-tests/real-world/norway/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/real-world/uruguay/metrics.json b/metrics/macos-xcode11-release/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/macos-xcode11-release/render-tests/real-world/uruguay/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json index 96bd9fd98fe0..e56676099d3f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json index bc237525bb2f..b508cf45785f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json index 6603feaf8bfe..13b901589d1e 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json index ad0cf8a26751..96b40f548e9e 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json index daa3b24ba11e..76c12734be8a 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json index 7f54e7480358..b9a7b5fe6480 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 662a5ca35c53..44aa3db9ce14 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json index 4b5fdfaa4ab2..2d7f93d1b91f 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/macos-xcode11-release/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/macos-xcode11-release/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/macos-xcode11-release/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/macos-xcode11-release/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/retina-raster/default/metrics.json b/metrics/macos-xcode11-release/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/macos-xcode11-release/render-tests/retina-raster/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-pattern/metrics.json index b6e30d5e3342..ba30b88ece16 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-remove/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-icon/metrics.json index 9b2e396f8e84..08221c27b57a 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-pattern/metrics.json index 31a94a030d81..1f47d186634b 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/image-update-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-glyphs/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-glyphs/metrics.json index dea2cb3857dc..ea696c62b6b9 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-glyphs/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-glyphs/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/satellite-v9/z0/metrics.json b/metrics/macos-xcode11-release/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/macos-xcode11-release/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/macos-xcode11-release/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/macos-xcode11-release/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/linestring/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/point/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-geometry/polygon/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 228731dd4e22..32fd5783b7de 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index e6f162de074b..af208f4742dc 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/line/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-placement/point/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-placement/point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-close/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-far/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-close/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-far/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-visibility/visible/metrics.json index 1de5e049d894..9de5637253b5 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-z-order/default/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-z-order/disabled/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-z-order/pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/macos-xcode11-release/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/macos-xcode11-release/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-left/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/center/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/center/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/left/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/top-left/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/top-right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-anchor/top/metrics.json b/metrics/macos-xcode11-release/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/macos-xcode11-release/render-tests/text-anchor/top/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/macos-xcode11-release/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/macos-xcode11-release/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/macos-xcode11-release/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/macos-xcode11-release/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-arabic/line-break/metrics.json b/metrics/macos-xcode11-release/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/macos-xcode11-release/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/macos-xcode11-release/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/macos-xcode11-release/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/macos-xcode11-release/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/macos-xcode11-release/render-tests/text-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-arabic/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-arabic/metrics.json index 526f4071d82d..222affd61acb 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images/metrics.json index 52b1978f2930..9bc5091e3add 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-images/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-images/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-line/metrics.json index 089da63a881b..57cdbdbfbf11 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color/metrics.json index 1640b2b40ba6..0f9f3642b628 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/formatted/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/formatted/metrics.json index 883429ed733b..e985f09179ba 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/formatted/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-field/token/metrics.json b/metrics/macos-xcode11-release/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-field/token/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-font/camera-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-font/camera-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-font/chinese/metrics.json b/metrics/macos-xcode11-release/render-tests/text-font/chinese/metrics.json index 46fdec9d0538..147bf1ce6489 100644 --- a/metrics/macos-xcode11-release/render-tests/text-font/chinese/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-font/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-font/data-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/text-font/data-expression/metrics.json index aac1bbcfbce4..e33d12c1328d 100644 --- a/metrics/macos-xcode11-release/render-tests/text-font/data-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-font/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-font/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-blur/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-blur/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-blur/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-blur/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-color/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-color/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-color/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-color/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-color/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-color/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-width/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-width/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-width/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-width/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-halo-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/macos-xcode11-release/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-justify/auto/metrics.json b/metrics/macos-xcode11-release/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/macos-xcode11-release/render-tests/text-justify/auto/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-justify/left/metrics.json b/metrics/macos-xcode11-release/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/macos-xcode11-release/render-tests/text-justify/left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-justify/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/macos-xcode11-release/render-tests/text-justify/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-justify/right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/macos-xcode11-release/render-tests/text-justify/right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/macos-xcode11-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-line-height/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/macos-xcode11-release/render-tests/text-line-height/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-angle/line-center/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-angle/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/force-newline/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/macos-xcode11-release/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/macos-xcode11-release/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-offset/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/macos-xcode11-release/render-tests/text-offset/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-opacity/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-opacity/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-opacity/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-opacity/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-opacity/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-opacity/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-opacity/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/macos-xcode11-release/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/macos-xcode11-release/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/macos-xcode11-release/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-radial-offset/basic/metrics.json b/metrics/macos-xcode11-release/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-left/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-top/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotate/with-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/camera-function-interval/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/composite-expression/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/composite-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/composite-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-size/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-size/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/macos-xcode11-release/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-transform/lowercase/metrics.json b/metrics/macos-xcode11-release/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/macos-xcode11-release/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-transform/property-function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/macos-xcode11-release/render-tests/text-transform/property-function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-transform/uppercase/metrics.json b/metrics/macos-xcode11-release/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-translate-anchor/map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/macos-xcode11-release/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/macos-xcode11-release/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/macos-xcode11-release/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-translate/default/metrics.json b/metrics/macos-xcode11-release/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-translate/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-translate/function/metrics.json b/metrics/macos-xcode11-release/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-translate/function/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-translate/literal/metrics.json b/metrics/macos-xcode11-release/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-translate/literal/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 7bbece367a24..5556b79fa0c2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1a348fa3efe5..17a3110abc79 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 22295b952a86..e94f38d898df 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index c4efa5911f08..6db6f402c62f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/macos-xcode11-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-visibility/none/metrics.json b/metrics/macos-xcode11-release/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/macos-xcode11-release/render-tests/text-visibility/none/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-visibility/visible/metrics.json b/metrics/macos-xcode11-release/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/macos-xcode11-release/render-tests/text-visibility/visible/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/tilejson-bounds/default/metrics.json b/metrics/macos-xcode11-release/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/macos-xcode11-release/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json b/metrics/macos-xcode11-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/macos-xcode11-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/tilejson-bounds/overwrite-bounds/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/tms/tms/metrics.json b/metrics/macos-xcode11-release/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/macos-xcode11-release/render-tests/tms/tms/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/macos-xcode11-release/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/macos-xcode11-release/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/layout-text/metrics.json b/metrics/macos-xcode11-release/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/macos-xcode11-release/render-tests/within/layout-text/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/paint-circle/metrics.json b/metrics/macos-xcode11-release/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/macos-xcode11-release/render-tests/within/paint-circle/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/paint-icon/metrics.json b/metrics/macos-xcode11-release/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/macos-xcode11-release/render-tests/within/paint-icon/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/paint-line/metrics.json b/metrics/macos-xcode11-release/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/macos-xcode11-release/render-tests/within/paint-line/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/within/paint-text/metrics.json b/metrics/macos-xcode11-release/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/macos-xcode11-release/render-tests/within/paint-text/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-history/in/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-history/in/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-history/in/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-history/out/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-history/out/metrics.json index ba820d16da76..7448faf1686d 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-history/out/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/above/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/below/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/in-range/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/in-range/metrics.json index ed4871473576..2fd2e941a313 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/out-of-range/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-above/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-below/metrics.json b/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoomed-fill/default/metrics.json b/metrics/macos-xcode11-release/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/macos-xcode11-release/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoomed-raster/fractional/metrics.json b/metrics/macos-xcode11-release/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/macos-xcode11-release/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/macos-xcode11-release/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/macos-xcode11-release/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/macos-xcode11-release/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/macos-xcode11-release/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/macos-xcode11-release/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/macos-xcode11-release/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/tests/location_indicator/query_test/expected.json b/metrics/tests/location_indicator/query_test/expected.json index 3104dfe82d18..4f7dee5c009a 100644 --- a/metrics/tests/location_indicator/query_test/expected.json +++ b/metrics/tests/location_indicator/query_test/expected.json @@ -13,4 +13,4 @@ "sourceLayer": "puck123", "state": {} } -] \ No newline at end of file +] diff --git a/metrics/tests/location_indicator/query_test_miss/expected.json b/metrics/tests/location_indicator/query_test_miss/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/tests/location_indicator/query_test_miss/expected.json +++ b/metrics/tests/location_indicator/query_test_miss/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/tests/location_indicator/query_test_no_image/expected.json b/metrics/tests/location_indicator/query_test_no_image/expected.json index 0637a088a01e..fe51488c7066 100644 --- a/metrics/tests/location_indicator/query_test_no_image/expected.json +++ b/metrics/tests/location_indicator/query_test_no_image/expected.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/metrics/tests/probes/gfx/fail-ib-mem-mismatch/style.json b/metrics/tests/probes/gfx/fail-ib-mem-mismatch/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-ib-mem-mismatch/style.json +++ b/metrics/tests/probes/gfx/fail-ib-mem-mismatch/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-negative-framebuffer-count/style.json b/metrics/tests/probes/gfx/fail-negative-framebuffer-count/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-negative-framebuffer-count/style.json +++ b/metrics/tests/probes/gfx/fail-negative-framebuffer-count/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-texture-mem-mismatch/style.json b/metrics/tests/probes/gfx/fail-texture-mem-mismatch/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-texture-mem-mismatch/style.json +++ b/metrics/tests/probes/gfx/fail-texture-mem-mismatch/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-too-few-buffers/style.json b/metrics/tests/probes/gfx/fail-too-few-buffers/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-too-few-buffers/style.json +++ b/metrics/tests/probes/gfx/fail-too-few-buffers/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-too-few-textures/style.json b/metrics/tests/probes/gfx/fail-too-few-textures/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-too-few-textures/style.json +++ b/metrics/tests/probes/gfx/fail-too-few-textures/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-too-many-drawcalls/style.json b/metrics/tests/probes/gfx/fail-too-many-drawcalls/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-too-many-drawcalls/style.json +++ b/metrics/tests/probes/gfx/fail-too-many-drawcalls/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/fail-vb-mem-mismatch/style.json b/metrics/tests/probes/gfx/fail-vb-mem-mismatch/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/fail-vb-mem-mismatch/style.json +++ b/metrics/tests/probes/gfx/fail-vb-mem-mismatch/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/pass-double-probe/style.json b/metrics/tests/probes/gfx/pass-double-probe/style.json index 395f4ce50a7a..68e925146876 100644 --- a/metrics/tests/probes/gfx/pass-double-probe/style.json +++ b/metrics/tests/probes/gfx/pass-double-probe/style.json @@ -19,4 +19,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/pass-probe-reset/style.json b/metrics/tests/probes/gfx/pass-probe-reset/style.json index 698d95bb7487..a0528fa2d15d 100644 --- a/metrics/tests/probes/gfx/pass-probe-reset/style.json +++ b/metrics/tests/probes/gfx/pass-probe-reset/style.json @@ -21,4 +21,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/gfx/pass/style.json b/metrics/tests/probes/gfx/pass/style.json index 6ae3eecb8cee..37d0a9c0e5f2 100644 --- a/metrics/tests/probes/gfx/pass/style.json +++ b/metrics/tests/probes/gfx/pass/style.json @@ -17,4 +17,4 @@ "sources": {}, "layers": [] } - \ No newline at end of file + diff --git a/metrics/tests/probes/network/fail-requests-transferred/metrics.json b/metrics/tests/probes/network/fail-requests-transferred/metrics.json index 1a200ca38f46..42766770ecf0 100644 --- a/metrics/tests/probes/network/fail-requests-transferred/metrics.json +++ b/metrics/tests/probes/network/fail-requests-transferred/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/tests/probes/network/fail-requests/metrics.json b/metrics/tests/probes/network/fail-requests/metrics.json index 81c9b8a5d41c..dbf7c68e81a0 100644 --- a/metrics/tests/probes/network/fail-requests/metrics.json +++ b/metrics/tests/probes/network/fail-requests/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/tests/probes/network/fail-transferred/metrics.json b/metrics/tests/probes/network/fail-transferred/metrics.json index 20b42d5b9bc2..e97e13436181 100644 --- a/metrics/tests/probes/network/fail-transferred/metrics.json +++ b/metrics/tests/probes/network/fail-transferred/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/tests/probes/network/pass/metrics.json b/metrics/tests/probes/network/pass/metrics.json index 6afd106a456f..c90715a2f102 100644 --- a/metrics/tests/probes/network/pass/metrics.json +++ b/metrics/tests/probes/network/pass/metrics.json @@ -11,4 +11,4 @@ 0 ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-color/colorSpace-lab/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-opacity/color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json index 7e01e8e9305a..cc7daa38f8df 100644 --- a/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-opacity/image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json b/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json index 12f80d05a3e2..56ce0e291b16 100644 --- a/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-opacity/overlay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json index 89a3b9090c05..b86d5bd0f270 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json index cdb304a90f82..0e57ec4706fe 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json index 77a63a3f5850..c1c2c63efe9b 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json b/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json index b17c1d43cf32..9681b5edc269 100644 --- a/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/background-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0-narrow-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json index d149583eac76..c738e3b757bd 100644 --- a/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0-wide-x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json index f5baf3924a9d..29b4d5d491e9 100644 --- a/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json +++ b/metrics/windows-msvc-release/render-tests/basic-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json index bc753ead9081..7ea96e3a64fb 100644 --- a/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json +++ b/metrics/windows-msvc-release/render-tests/bright-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json index 3e29447ea9ae..7288b67ed1c5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/literal-stroke/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-blur/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json index b9307738e098..baa04769a3d5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json index 742ac68192da..967e8fa527de 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json b/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/blending/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/map-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-alignment/viewport-scale-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json index 62ea5c7dea03..82a579190aa5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-pitch-scale/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-radius/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json index a7ecf0458cbc..9bd7de306ebc 100644 --- a/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json index cd37b906a565..6dc76e6fad13 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/stroke-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-stroke-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/circle-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json index b65ae23a7534..089b0be4abb5 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json index 5cc4b977fff9..459db2373ea4 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json index fe9af55d5614..3341db244c6e 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json index 43b92c8fd625..bf9465ff8aab 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json index aeff97a9b285..4c90b1a1026e 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/background-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json index d5ad1d9303de..dc413c28a837 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/circle-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json index d0a09330c38e..02e32b225c17 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json index 070982798d74..ddd80ebcd4a5 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json index 9dd47aeeeb53..42b4e6f9890a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json index f460f1be9e65..758831370f8d 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-extrusion-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json index 8ed0fcb075e0..daeb965b4e10 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--image-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-opaque--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json index d9701f6181e5..e3f653570e14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json index 54232a885938..3589506596ef 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json index 158f4a877cf7..7c68a9b0ae72 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json index 511b43f4d27c..0c3fa00030fb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/fill-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json index 046dcc83f872..7e8e12d4e5c4 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json index b342e18183b4..04e5de8e775a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json index a4c2b929c75b..ab72e118cc79 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json index 5565a4dd4825..8a2c38751484 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json index 94161dda76b9..6f5af7fb644c 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/heatmap-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json index 019fd54df326..9d85d6b956f1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json index 2ecd93ab0dbd..008f32728a93 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json index f9f2c55c0509..a404300fa4ec 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json index 130eb528504b..9de2075c67f8 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json index eb8235bd2215..e643b72cc24c 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json index 6cdf449a0c79..10759b737f0a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/hillshade-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json index 34e16412442a..848c8eed8f14 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json index b9a70d7457b8..dff1b0cc4e18 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json index aac3c6d30885..3fa48c6a9654 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json index e6b45ea3c9ca..e7b5f516339a 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json index 1d0c8f8153bc..1b513e2875eb 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json index 2fb82f10860f..dbbe87baf8b0 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/line-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json index 9297ddb669bc..62d9f6ef55d7 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json index 8543c93e3fb4..313c9a782163 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json index ba3da4f660c9..87a7cf576718 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json index a6e96270b256..3f327cb1242d 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json index 46ae22eb392b..43d09834abbd 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json index 40f09a93051e..2e3add062080 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json index dfb24aaa91b2..47dea3c28e0f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json index 11aca40c0239..c842bf39097c 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/raster-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--background-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json index 7f048825740b..509f08c45c29 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--circle-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json index e06f8fc8fc11..7c9e77d58113 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-extrusion-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-opaque/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json index c1bede4b522e..b7c8916479b6 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--fill-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json index 60f01ff9e368..2914d385f21f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--heatmap-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json index 1b23d9d85c99..3496bc37bfb1 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--hillshade-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json index cafdf6fa100a..76f5b1043c9f 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--line-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json index 1900b9924907..5e9f2726e802 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--raster-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/combinations/symbol-translucent--symbol-translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json index a99484c47cc4..48ccfb3d10f2 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-line-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json index 17fba0446e86..ae2716da045e 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-icon-text-point-translate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json index 89d36a35a27d..0642fb166cb9 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json index fdbd1532eb11..bd18f217fd0c 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-lines/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json index a06fb7ad37eb..06b80cfa71a6 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json index 6168495707bc..1c5d5aa4a88c 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-pitched-wrapped/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json index a4fade43b7e4..11ce04a115e4 100644 --- a/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/debug/collision-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json b/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json +++ b/metrics/windows-msvc-release/render-tests/empty/empty/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json b/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json index 705eaa2c4e50..5f03b19103dc 100644 --- a/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/extent/1024-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json b/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json index b0ad84b7b6a3..9a39558581f0 100644 --- a/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/extent/1024-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json b/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json +++ b/metrics/windows-msvc-release/render-tests/feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json b/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-antialias/false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json index 8ae66783ec92..9c8a014abdd8 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json index 424e3e22c86b..93a93494e022 100644 --- a/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json index ccd42b0ddee6..798f9e75d8c0 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-base/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/no-alpha-no-multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json index e3548b740c87..a36c7336497e 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json index 47ec0bb2c6fc..76af83d49f01 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json index 4f179c4d25ea..f0b7c44e5dcd 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json index ffe069ce4607..ffcf48a10f68 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-height/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json index c272c32be15b..b2113a21d5e8 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/interleaved-layers/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-multiple/multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json index 808337bb3d68..b020cef1e7b0 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json index 0fa047031865..478bf76ca226 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json index 082bdc32eb19..b6166c3cef08 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json index 2c2af11696ad..96bd92fda384 100644 --- a/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-extrusion-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json index 6b55634a1cbd..ea8b468e21db 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/opaque-fill-over-symbol-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json index f9de3e6600d7..cb8de5f161be 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json index 0923fe04bb0c..30523c33b4bf 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json index cc32c1d10777..b9b9efc9617e 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json index 08002428420a..3406ae49de10 100644 --- a/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-opacity/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json index c3e66bb650f9..b5a72b5db269 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json index 0bf5f29188df..1b006a9df81b 100644 --- a/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-outline-color/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json index 51c11b8e4ab7..d3e6f4ec2f24 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json index 5b0f25c103ac..166dd8572f63 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/case-data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json index 714f677bd605..0b237d59572d 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/invalid-feature-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json index 07184a47f623..b0d20d47569d 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json index 0b64b9c6e2f1..d282554f58e4 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/uneven-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json index 8107ea657505..4ad2ae039517 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/wrapping-with-interpolation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json b/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-pattern/zoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json index a3bacd4632a5..76cbcdd189b8 100644 --- a/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json index ec5a8327773d..6da0bff68397 100644 --- a/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/fill-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json b/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json +++ b/metrics/windows-msvc-release/render-tests/filter/equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/filter/in/metrics.json b/metrics/windows-msvc-release/render-tests/filter/in/metrics.json index f955deb5a34b..57beeda8776b 100644 --- a/metrics/windows-msvc-release/render-tests/filter/in/metrics.json +++ b/metrics/windows-msvc-release/render-tests/filter/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json b/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json +++ b/metrics/windows-msvc-release/render-tests/filter/legacy-equality/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/filter/none/metrics.json b/metrics/windows-msvc-release/render-tests/filter/none/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/filter/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/filter/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json index 921bb225292b..72b49ab9b0ef 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/clustered-properties/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json index e4de306451f0..2145b19b0bd2 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/clustered/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/external-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json index c050c4e8ce06..865b69114a4a 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/external-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json index 1f4a35b3797c..a87ccb1bc270 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/external-linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json index c35eb5d52648..ac8e38686abe 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/external-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json index 92d02167a9fe..c960e36e9ef8 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inconsistent-winding-order/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json index 0d433cec13d3..bf1f7abb8e4e 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-feature/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-invalid/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json index 87bafb2c5931..5a0e0d76acc0 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json index b947079d6baa..ab0feaf4bae8 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-linestring-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-malformed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json index 676dd680b359..8895a742d9db 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json index fb542cead0b8..cd495183345f 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-point-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json index d01fbee1843d..33724cb28223 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json index 5b035beb41ad..d0105f8502b8 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json index c031604857e0..e0c7bef27f44 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/inline-polygon-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json index f1bf8426ca61..ffeae8cac591 100644 --- a/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/geojson/reparse-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json index e300a2d0a646..766fc7cb1b09 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-color/expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-intensity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json index 4daf3ff957d1..5ec8159e4117 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json index 08b7ca1c86e3..fa00147edfa0 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/antimeridian/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json index e12b80046260..b71ca144ee15 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-radius/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json index 3c0b3e0c7f78..8dcd28a36d03 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/identity-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json b/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json index 098f2da894fb..bcd4cb2e3045 100644 --- a/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/heatmap-weight/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json index 0af798152964..6bd4ade11708 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/terrarium/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-accent-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-highlight-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json index da22284860ba..f86f9785308e 100644 --- a/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/hillshade-shadow-color/zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json index 06c60d080b81..db5c47df0e48 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json b/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json index 4c633b423778..2c5e151a40db 100644 --- a/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/multiply/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json index 77eaf9695807..94201e4ae176 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-color/transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json index 7f17773165cb..b25ac99b3bb1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json index 836b87b16e2b..4c4eb5074cd3 100644 --- a/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json index ffd5b98d6b4c..dd3415d17845 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/icon-sdf-non-sdf-one-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/image-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json index 331402013d07..c49819c946fa 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/stretchable-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json index 331402013d07..c49819c946fa 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/stretchable/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json b/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json index c291562544c5..f0325df7b685 100644 --- a/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-image/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json index ef86c597d38c..84efce9404e3 100644 --- a/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-offset/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/icon-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json index 0760437163ba..53898e1973f8 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/text-and-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json b/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json index 9ff18b8ec13d..d4ca48808d66 100644 --- a/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-opacity/text-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json b/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json index f82f83756c74..8c93137d56be 100644 --- a/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-padding/databind/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json index a11af85a1f40..e6117b00a86a 100644 --- a/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-padding/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/auto-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/map-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-alignment/viewport-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pitch-scaling/rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json index f1cb4ead5fd4..73f69e541c6a 100644 --- a/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-pixelratio-mismatch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json index 39cea2f7a817..3c36120ef15e 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json index fdaf27673e24..46fcadb24316 100644 --- a/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-high-base-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/camera-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json index ff10b87fe60f..80efc975536f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/composite-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json index e85e6b42dc7a..600dae243200 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json index 6e8125cf625a..6cacde2bc1c3 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/property-function-plain/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json index 18164e288a0d..91e76593beb9 100644 --- a/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-size/property-function-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json index 533e640ba857..e0b501a8bb9b 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json index 27c166e4fad4..ed10acda227c 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json index f8a34973b45b..46c8d6368197 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json index 60e56e89fb79..4b7d57c2bbb4 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-icon-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-both/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json index d6bdd89b2137..0ad2f87fd7e2 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/enlargen-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json index f879907a0199..a21185cfed02 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json index 4ec1339ad548..b96283e28b60 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-fifteen-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json index e440a2fde34b..8405b98019cf 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json index 760868dc9960..32f0d48b4156 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json index 760868dc9960..32f0d48b4156 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-content/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json index 0c76f5850ae9..6ce8b0325d55 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-height/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json index 0c76f5850ae9..6ce8b0325d55 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part-just-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json index 5e61113a9d5f..d6ec82d8f31f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-nine-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json index a3ae8aa16e2f..3b9c68707c1f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-three-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json index fbb89bc3b6f2..733f6c4009e1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-two-part/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json index 8f94d88ce4dc..8193a6c6d747 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/stretch-underscale/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json index 3c52c61f5276..7dfedd1e1a08 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json index e102c1af5105..cf11870cf2c6 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-long/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json index 43ae8b8ec920..300023e8b9c1 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-anchors-short/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json index 63b09f892c3b..cad0e7925234 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-collision/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json index 2a7d1e9a35db..b41c0bad39e8 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json index e8f0b6ac455a..4fe530b3e37e 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-long/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json index 5718db3ff626..763e17e8c39a 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json index 4458b597c761..31b34221aed2 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/textFit-grid-short/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor-padding/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json index fd38a33aafc6..47257c2ced04 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json b/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json index 3731e0fcb28c..f27a5555fb8f 100644 --- a/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-text-fit/width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json index 40b289ac7382..69dc134352d7 100644 --- a/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/icon-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/default/metrics.json b/metrics/windows-msvc-release/render-tests/image/default/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json index 2d59478140b0..516f2bb9de78 100644 --- a/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-brightness/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-contrast/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-hue-rotate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-resampling/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-saturation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json b/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json index a5e1a3ae1af8..0d7554326177 100644 --- a/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json +++ b/metrics/windows-msvc-release/render-tests/image/raster-visibility/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json b/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json +++ b/metrics/windows-msvc-release/render-tests/is-supported-script/filter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json b/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json index f7dd7ee4c04c..94eaf35036eb 100644 --- a/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json +++ b/metrics/windows-msvc-release/render-tests/is-supported-script/layout/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-cap/butt/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json index b8fd663961a2..683e8869f74d 100644 --- a/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-cap/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json b/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-cap/square/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json index 870d30daeb3c..7cf6ee5d6980 100644 --- a/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-color/property-function-identity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json index b8b502e177ed..f00b3e536970 100644 --- a/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/fractional-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json index a68713253063..6f572a872577 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/function/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json index 089003eccef2..6e68753380e9 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json index 45bcb8f0af24..4e755b00c56f 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-constant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json index 2b8782c8187b..9af464101387 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json index fc7077f38f8b..d8d9dc5b94de 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/literal/line-width-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json index 22bd3284bd98..64acd2881156 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/long-segment/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json index 747a2afbe158..553a80fc7f5b 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/round/segments/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json index d3af311705d4..7aa6ba0d1c7c 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/round/zero-gap-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json index 5e55b94da8c4..805008108ab4 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/slant/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json index 32c56fe8f4f1..01b82ca75e08 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/zero-length-gap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json b/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json index 0b59834ac4db..286060c9bdab 100644 --- a/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-dasharray/zoom-history/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gap-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json index c5be22f70871..244ec12801d4 100644 --- a/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gradient/gradient-tile-boundaries/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gradient/gradient/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json b/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json index 2452c64b4ac7..598169b1d9ba 100644 --- a/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-gradient/translucent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/bevel-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/bevel/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/miter-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json index 418bfd0dac8e..f58d7f3410c5 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/miter/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json index c43da977410d..6099d2b006d3 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/property-function-dasharray/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json index 58f534192f03..a4a13eb4cdae 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/round-transparent/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json index 8bb30bb81b61..0e02f323f193 100644 --- a/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-join/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-offset/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-offset/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-offset/literal-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json index d3fc35379525..3a4bc9272813 100644 --- a/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json index 3a79bf070876..2a87a2adf260 100644 --- a/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json b/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json index 49ecdaab9854..fed8cf9423c1 100644 --- a/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-opacity/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json index 5163e6758e35..a2abf428c722 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/@2x/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json index d4020db05c5b..ef2bff8926ec 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/opacity/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json index d108f774d191..097e80cdffb1 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/pitch/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json index 136c14761516..7cc483d3f226 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json index fbbd2176a96c..dc08e8959713 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/step-curve/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json index 94e778f0b452..3f043408c0e5 100644 --- a/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pattern/zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pitch/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch15/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitch30/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json b/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-pitch/pitchAndBearing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json index 12a75988519c..a0bfb2d61e6f 100644 --- a/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-sort-key/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json index 8e3ab38a23fc..d79a560d5f70 100644 --- a/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-triangulation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json b/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json index 9d549815609f..1cedbbe39f07 100644 --- a/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-triangulation/round/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json index 5500efb2945c..2bd277741086 100644 --- a/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json index 37218777d269..7187015593ce 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json index e66ff128ba59..80ef087b5847 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json index b93dcb82323a..52a7d9a5f27f 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/very-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json index c6cefecd177f..81eab93f96ab 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/zero-width-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json b/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json index 2712b0b4fe0f..b96101a10cc0 100644 --- a/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json +++ b/metrics/windows-msvc-release/render-tests/line-width/zero-width/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json b/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json index bf9483fb78c1..8cf4d01508c0 100644 --- a/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/linear-filter-opacity-edge/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json index 290ed6328f69..23591d65d742 100644 --- a/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json +++ b/metrics/windows-msvc-release/render-tests/map-mode/static/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json index 12ed06367ea7..6604cb4c9feb 100644 --- a/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json +++ b/metrics/windows-msvc-release/render-tests/map-mode/tile-avoid-edges/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json b/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json index 3510a6a2db7c..995d9141c331 100644 --- a/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json +++ b/metrics/windows-msvc-release/render-tests/map-mode/tile/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json b/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json index da78bc6af7b9..202fe7d7294f 100644 --- a/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json +++ b/metrics/windows-msvc-release/render-tests/projection/axonometric-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json b/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json +++ b/metrics/windows-msvc-release/render-tests/projection/axonometric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json b/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json index b82f4dfc1829..785d404f8774 100644 --- a/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json +++ b/metrics/windows-msvc-release/render-tests/projection/skew/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json index 08d8297db801..39f69f65b748 100644 --- a/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-alpha/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-brightness/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-contrast/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json b/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-extent/maxzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json b/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-extent/minzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-hue-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json b/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json index 4bd248b8fa5c..e22f089e735b 100644 --- a/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-loading/missing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json index 12c856a69889..1ebeb723639e 100644 --- a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping-vector/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json index c0ad63d409dc..0f00ecddb5a2 100644 --- a/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-masking/overlapping/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json index 72910f7b1056..239c8476e664 100644 --- a/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-resampling/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/180/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/270/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json index b4c21ad5c914..eaeea32d5f14 100644 --- a/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/45/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json b/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json index 0d1ecd183335..bbbb385613fe 100644 --- a/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-rotation/90/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json b/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-saturation/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json index db64850e3875..fb3082aa614d 100644 --- a/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/raster-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json index f1142e011c25..772e2784b65f 100644 --- a/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/real-world/nepal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json index 45badb494a72..70157e715c3e 100644 --- a/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json +++ b/metrics/windows-msvc-release/render-tests/real-world/norway/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json b/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json index 8c183cc9f3e0..2d78407d2e28 100644 --- a/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json +++ b/metrics/windows-msvc-release/render-tests/real-world/uruguay/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json index 96bd9fd98fe0..e56676099d3f 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2305/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json index a48098b4aa6c..df6ef6aa8c5b 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2523/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json index c527b4e09d2a..89484ae76203 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2533/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json index 7d15d2a7ad34..a6e9e855f6ab 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2534/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2787/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json index 19c5ef85077f..9764c56f837f 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2846/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json index 2052d5d52ee4..7529eb1b86aa 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#2929/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3010/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json index fab92536d4ce..44da94cb7f42 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3107/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json index bcc2a3f74f95..26ccedcbcc6e 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3320/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json index 09d52d402e4d..8e00f93fdad1 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3365/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json index 65f07ee5330d..147feb028dc3 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3394/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json index c217fdfc61cc..9ad682254db1 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3426/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json index 6e40c94905ac..02b594662194 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json index 352056314945..97a82f2c6990 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3612/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3614/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json index 7bca5d23fe02..e272933e8995 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3623/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3633/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json index 16485ab8b4a3..29bd5d79b36f 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3682/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json index 0500eb4873cd..9e1610545516 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3702/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json index a01add499ee2..5bbb9e9e285a 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3723/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3819/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json index f9443ff76e43..f3cf40894937 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3910/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#3949/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4124/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4144/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4146/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json index 485b59ab36f3..2087e1a07871 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4150/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json index 3468eac0f2fd..a2ec1ec242d9 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json index ba3ca00114da..8bd27264ef80 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4235/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4550/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json index 48541088a87a..eb4921578f70 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4551/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json index 54f55f390df5..6187e2ef5784 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4564/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json index 3a2571d36aa6..bdb24cbec797 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4573/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json index 5068fa89b0a5..c0275692b339 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4579/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4605/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json index 026b6be03102..ab1502aa76c3 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4617/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4647/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json index 77e26663adf8..75208b6254dc 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4651/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json index 2a11129cdd7e..a12bda145e51 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4860/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json index e78c74800857..87958b98822d 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#4928/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json index f116462d86f7..a5d7f6590c51 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5171/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json index c2b157771ed6..bd7801fad65e 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5370/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json index 5e66f07df062..f30c133db82d 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5466/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5496/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json index 20fa03d32449..17a5608e4c03 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5544/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json index 6b144b9538d0..25ad6d321cf0 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5546/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json index 63e089963e3a..5e613a090bd5 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5576/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json index 4ab1b5696c56..3085211089bc 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5599/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json index 7ce4c1324850..b4d99c9639a7 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5631/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5642/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json index 2ce8e21873ac..1a05422da514 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5776/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json index 2043a63e49b4..d0665fd606ff 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json index 6603feaf8bfe..13b901589d1e 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5911a/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json index 9c7a3359c23c..f946223a8d87 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5947/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5953/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json index 7b8e778406ec..34b13f90c07c 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#5978/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json index f8108ef92fb4..f89be7b10033 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6160/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6238/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json index 64d5fea021d7..3cf688b7a51a 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6548/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json index 89aa855d365a..3d9e0fbbf80a 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6649/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6660/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json index c8c3dee39462..d92cd64c54d6 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#6919/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json index 693f78704260..e960f3f7caec 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7032/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json index 5d2d58d4009b..1b77f09551ef 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7066/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#7172/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json index 2e92924579bd..4bc0d80686a2 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#8273/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json index a5407ceb766c..b82aa8853d37 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-js#9009/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json index a80aa837e476..9e3eb890c008 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#10849/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json index 501f64a004eb..5ad8d61037aa 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11451/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json index 0be45de845df..51b147ed165d 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#11729/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json index 89ccfdbed1fa..70d140fcbe8d 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#12812/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json index 98442c7f4927..af60ac1aa34d 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#14402/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json index 5cb2eb842815..366dde8ad6b8 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#15139/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#3292/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json index fb4e5552f7f5..e85d091e9f4c 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5648/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json index 3420d4a3fc99..01cc0d1cc08b 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5701/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#5754/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json index 52ca3936645d..d9af42ea277a 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6063/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json index 4bb79fe71796..d0ceb5414074 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6233/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json index b6bf3b9d0075..87e18e45232b 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6820/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json index 71ac27d9d326..525a02be8bf4 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#6903/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json index cbd01b37e008..08801eb31456 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7241/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json index 38eab4e78e3d..d0501b45165f 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7572/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json index 2bd3523e2770..8c3137d88840 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7714/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#7792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json index 16c62d33f566..5448971d70ed 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8078/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8303/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json index d4eae5445586..c2b50ed1f4f0 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8460/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json index 4a3aa63475b0..8ebdb56edb1e 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8505/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json index 6623f4879ee7..3dc3a11db4db 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8871/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json index 857fa5f5e3b1..7bbb5e9e4edc 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#8952/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json index 4e5b247b0739..36da688a67f7 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9406/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json index effeefa2aa8a..0f0f725f7054 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9557/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json index 6de6aa8e28f5..9ecafe55c84e 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9792/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json index 6e487ce43fb0..7b805b465505 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9900/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json index b1cd0c9cdda6..df6305d2ce06 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9976/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json index 1b7a2185cc36..3e058d58ed63 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-native#9979/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json index eb891b578e42..596d5893bab7 100644 --- a/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json +++ b/metrics/windows-msvc-release/render-tests/regressions/mapbox-gl-shaders#37/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json index 3653638ee2e6..199b2b575507 100644 --- a/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json index f6bec0e0459b..8b4cf7dabafc 100644 --- a/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json b/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json index 16026dacebfc..bb5b3e0e76fa 100644 --- a/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json +++ b/metrics/windows-msvc-release/render-tests/remove-feature-state/vector-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json b/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/retina-raster/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json index 4deb44f270c3..9051b2dd8a03 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json index 6faf862e9356..195626668e54 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-1x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-1x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json index e0baa0c9f5ae..b2ee8647e41d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-2x-image-2x-screen/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json index 7b309facc7a0..e7846c682937 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-alpha/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-nonsdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json index b6e30d5e3342..ba30b88ece16 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json index 672f6c43ed17..c58c3f22a425 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-add-sdf/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json index ac4b3251ff9a..c47506deedec 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-remove/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json index ff91a11d5ff8..3866fc4356dd 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json index 513d31342cea..2f5b1f1f06b3 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/image-update-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json index ca19895c81d9..385524356c47 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json index c4c12ce6ccff..8fc0848bdb85 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json index ded111d5dbd0..4a0222bf2cdf 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-override-paint-property-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json index 7c2bcc88a936..56d2c48830ac 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-text-variable-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json index 23b829f1681c..663c3ce98a2a 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json index 47108b29bc17..1d0d7d25ccf5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json index 9d89d5f2f3ab..225b328f706a 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-overriden-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json index cfdc9c2e2106..748caf4284e7 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-and-property-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json index 2b00a4fa0641..5c78b6b810ed 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-and-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-expression-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-default-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-false-to-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-filter-true-to-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json index 873f47815fe8..a1e24dbecc77 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json index bb8ac8538840..5cfc25dfd956 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-add-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json index e0426e7b5136..6acf36d07ece 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-layer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json index e204a192de46..b762a231e109 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source-type/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-change-source/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-background/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-fill/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-raster/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json index d1d3c719b694..2cd5816ef0d7 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-remove-symbol/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json index ecd1b9eaf553..3eacb71976a5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layer-reorder/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-literal-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json index 43f81ae9e8ff..7b15f7584f8f 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json index 7d39e1829559..4c937ec3278d 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json index fea6fe2e598b..94fd76f9f2e5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-layout-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-default-to-zoom-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json index 869c4378bf3c..f712c8f66dcc 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json index bf5b94a7258a..c5dccb9cead5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-literal-to-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json index b7fcd0454149..c5dc4e05e947 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-property-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-expression-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-paint-property-zoom-function-to-literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-source-update/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json index 79e781048634..a2643ebba776 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-sprite/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/set-style-visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json index 7f4a0466396a..2cacd07ae368 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-geojson-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json index 2e017e0a3939..1e9df4d18692 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json index 95c3df52a82f..837ce203cf67 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-raster-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json index 9028b81da14b..b6fa97f3499c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-inline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json index 848e2d81c431..693d4819b794 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/source-add-vector-url/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-default-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-none-to-visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json index 2b08c32c8f53..35bf272d132c 100644 --- a/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/runtime-styling/visibility-visible-to-none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json b/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json index b3dedd944d23..7ab4dff21d47 100644 --- a/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json +++ b/metrics/windows-msvc-release/render-tests/satellite-v9/z0/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json b/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json index 04af83427d65..ec1e0dd374c5 100644 --- a/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sparse-tileset/overdraw/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/1x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json index 20bd7543c105..c08a49c598c2 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json index 450fd3b15f03..6d05bbbaa617 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-1x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json index e962ac627edf..af537789248d 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json index fb033edaf0c4..c0f6d012bee6 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/2x-screen-2x-pattern/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json index 28c44c7705cb..3f7e1d890f14 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/array-default-only/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json b/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json index 45342fbc3d74..625ad67cbb75 100644 --- a/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json +++ b/metrics/windows-msvc-release/render-tests/sprites/array-multiple/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/linestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multilinestring/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipoint/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json index 9deff6e405cd..6f60266cf89e 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/multipolygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json index 10e4e9f2ba12..aec759ba8191 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-geometry/polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json index 6f795d0ee803..7369b1a5556a 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json index 2bdb228c5220..1b06ecb414cc 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-buffer/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json index 48f5e22ba5e0..045c5d1688e3 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json index 480f8a18cdc8..ae11e16aa4a0 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json index daaadcdba249..88efc5dd13ca 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json index 95aa395c60af..1147f972284d 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/point-polygon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json index 178821e1ca4e..33339ca26392 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-placement/point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/icon-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json index 6c810abb8aeb..86bf8e915bcd 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/placement-tile-boundary-left-then-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json index 7298ff45e056..435793eb9022 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json index c501cdfe8be2..aad7ceb69489 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-ignore-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json index b6cfd840ae33..eeb740f782a8 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-sort-key/text-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json index 23e6cccadb7b..6445ef0b27b0 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/line-overscaled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json index bfed6ec29713..1f4e959c7eb2 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-spacing/point-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json index 95a181bd8c49..ee07c12cbd3e 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json index 1de5e049d894..9de5637253b5 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/disabled/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/icon-with-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json index b5449900fc3d..0ca3c5d69261 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json b/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json index 2acbad453c7b..6f58354de6bc 100644 --- a/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json +++ b/metrics/windows-msvc-release/render-tests/symbol-z-order/viewport-y/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json index 6d769f564896..f8232fdc3168 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json b/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json index 7cdd3a48121c..1dab2fc40430 100644 --- a/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-anchor/top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json index 932066a29ffa..e09d6f414549 100644 --- a/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-arabic/letter-spacing/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json index ed9a13583118..83245913acb4 100644 --- a/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-arabic/line-break-mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json index 8ebd514b428b..579f22445b96 100644 --- a/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-arabic/line-break/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json index a2ea9c5fb7af..ce349c7a6f4e 100644 --- a/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-arabic/mixed-numeric/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json b/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json index 987740be5e83..c55637c8d417 100644 --- a/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-arabic/multi-paragraph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json index 60c3ad345f2e..73139e6820df 100644 --- a/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json index 005fb722e852..82358779579a 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-arabic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json index 62c000b29081..0651bd495a91 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-constant-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json index a02d06724730..d5b4bbeb562b 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json index 137e66bf1483..62f32bae66dc 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-multiline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json index a56a73a714c9..691d4ace71ce 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-variable-anchors-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json index 197cdb9b5009..af7da93c8779 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-vertical/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json index 4b81074408aa..2acfc02c635a 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images-zoom-dependent-size/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json index 52b1978f2930..9bc5091e3add 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-images/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json index f30e5bd8162b..fd60d528fc1f 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json index 128115bae739..87eea7d36c24 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides-nested-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json index 0f1b65a6db06..d34153252acc 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color-overrides/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json index 85ffd10f4836..c264c7b5bb79 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted-text-color/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json index 550343cbcfcb..93d038b8f550 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/formatted/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json index f20b89d82f2d..a84be9b316a6 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json b/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json index fa46462cc5a8..b2eb00bfb73e 100644 --- a/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-field/token/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-font/camera-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json index 46fdec9d0538..147bf1ce6489 100644 --- a/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-font/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json index a9f17de4cda0..6453363b5811 100644 --- a/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-font/data-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-font/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-blur/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json index 47cea62594cc..4604bb28368b 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-color/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json index 860834fedbb2..4a929fd1bd4f 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json index 37f4af4128cb..895a928afe66 100644 --- a/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-halo-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json index 0f7801b2e470..863c1e62521d 100644 --- a/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-justify/auto/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-justify/left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json index 5c1e774f37b8..7c404abd6852 100644 --- a/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-justify/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json b/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-justify/right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json index 1a478f985788..d161cae9206a 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json index 2412b1cc57ca..c06d5652ab9c 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true-text-anchor/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json index 8a117769b217..a814f827a9f6 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/line-placement-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-map-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-false/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json index 68d8b35e7588..f26776bcda2c 100644 --- a/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-keep-upright/point-placement-align-viewport-true/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-close/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/function-far/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json index 97d7f27021aa..f9c43e0ab081 100644 --- a/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json index fd1ea83213db..ba13f3666cdd 100644 --- a/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-letter-spacing/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json index 41ff7515c7df..82bd5b085e5d 100644 --- a/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-line-height/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json index 9551aabb1476..e455ed044580 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-angle/line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json index 2ad59dd984ef..719c16bc68fe 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-angle/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-double-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json index 9ab164292bee..b67a1a0819e9 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line-center/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json index b553d8692d0a..9c8863e68845 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/force-newline/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json index 4c0301c08db3..bfba8c6501e7 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json index e6477234cc3c..0bacf085d653 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/ideographic-punctuation-breaking/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json index 05279818ae78..8fe82720b122 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json index 8eef9a416619..a997dce756f5 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json index 539a5a8da937..3e57c87504a5 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-center-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json index 539a5a8da937..3e57c87504a5 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zero-width-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json index b95ec5af3cbd..5a07d80519e9 100644 --- a/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-max-width/zoom-and-property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json index 563004e91258..bc1581ced4bb 100644 --- a/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-no-cross-source-collision/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorcenter-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorleft-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifycenter-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyleft-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetnegative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json index 6ad395e0b52d..9073a53d1143 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal-multiline-anchorright-justifyright-offsetpositive/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json index 384ce4dadbcb..b628e4f1fa43 100644 --- a/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-offset/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-opacity/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-opacity/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-opacity/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json index 6734d0b04605..2bd94ca5323b 100644 --- a/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-opacity/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json index d05556cd14e3..0ed9a3c07b9a 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json index edd93c6655a2..338809341fd1 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-overzoomed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json index 2292400be69f..8d77e25e27f3 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-depthtest/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json b/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json index 1514cee615b6..62e171b0cc77 100644 --- a/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-pitch-scaling/line-half/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json b/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-radial-offset/basic/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-bottom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-left/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json index 789eb531ac27..6e235d123bd8 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/anchor-top/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json index 0206fc826fea..25471f81337c 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json index 085933191690..d736cae46020 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json index e348c71619e7..759f85ee08f7 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotate/with-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/auto-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/map-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json index 70ac3608a98d..ad45e05ba625 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json index 905846132df2..880749e242af 100644 --- a/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-rotation-alignment/viewport-symbol-placement-point/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/camera-function-high-base/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/camera-function-interval/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json index be4621cd9356..5feb61dd8306 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-expression/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json index 5c85a420f3cf..59269fd43d8b 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-function-line-placement/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/composite-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json index bf6832d42b78..0da18b6700e2 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json index 84fc4fe605ed..2ff31eaf3ca8 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json index 7cc4d80c96b5..3d3f3cb27384 100644 --- a/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-size/zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json index 05d7f575551a..e15389d880ad 100644 --- a/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-tile-edge-clipping/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json index 2bf7d113546d..2aaf4ac7ce55 100644 --- a/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-transform/lowercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json index 94f6c3ccd623..6ce00b87e182 100644 --- a/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-transform/property-function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json b/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json index ecb73166999a..684f6471f8a8 100644 --- a/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-transform/uppercase/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-translate-anchor/map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json index 9162d111f6e3..43da58ebcc03 100644 --- a/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-translate-anchor/viewport/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-translate/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-translate/function/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json b/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json index cd668f351a51..e87a6d1819e0 100644 --- a/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-translate/literal/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-coalesce/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json index d4202bfa2267..23fc8ab5988e 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/databind-interpolate/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json index 7bbece367a24..5556b79fa0c2 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor-offset/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json index 9953c2ea9e93..5b52bc09273c 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-radial-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json index dca033517bc9..a5ae1ce41c07 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json index 1ca57cbe487c..c070b4ab0953 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-negative/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset-zero/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json index dfa752091632..12fe2bbe5450 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors-two-dimentional-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json index 806d886e75c9..2b9d167c6fb2 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image-all-anchors/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json index 031fe71047b9..8ccc0a429ecc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-image/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json index 9f7789217246..97a627d210f3 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/icon-text-fit-collision-box/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json index 813a3d7f1016..a579f5bf9b63 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json index 2a7b3b9cd610..e6630885fc9f 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/no-animate-zoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json index 102e62664bdc..dc4294751f6f 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-rotated-debug/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json index b06ed0feb281..e946eeffb5b5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/pitched/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-offset/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated-with-map/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json index 33eed36df4c9..3eb290a1dfa8 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/rotated/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json index 9dca847cbbad..7d32eb2d0162 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-justification/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json index a8acd89723c6..f654c1386cdc 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/single-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json index 40b67f14452c..23048d8379d5 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/text-allow-overlap/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json b/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json index 74f5df99b33e..d9ed35b7a888 100644 --- a/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-variable-anchor/top-bottom-left-right/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json b/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json index 7da079696671..7c49193327f0 100644 --- a/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-visibility/none/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json b/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json index d7ff42c1270c..09a1f9f03cd2 100644 --- a/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-visibility/visible/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json index 4da17ca35c83..1e674f4ec88a 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese-punctuation/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json index 4c978ab6c2b1..25c693e246c6 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/chinese/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json index 8c2cc0dbcb28..cc4ed080710e 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/latin/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json index caf18baec7cf..591800d8a395 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/line_label/mixed/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json index 23e8621fe30f..bca64dfb298b 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-arabic-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-horizontal-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json index eabb4022be51..6b909dcba832 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json index 25fb8b4d1e09..d66c55163545 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-punctuation-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json index d8ccbe177baa..a573e66c7679 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json index 632a29ad1759..1570a3859bde 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-variable-anchors-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json index 7d4c49afdfb0..250e6afdab5e 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/cjk-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json index 5cf22c6b3e56..378f68df5840 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/latin-vertical-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json index ad6e567fda4d..05bcdf449e3f 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode-icon-text-fit/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json index c1486937e1db..a98dfa199176 100644 --- a/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json +++ b/metrics/windows-msvc-release/render-tests/text-writing-mode/point_label/mixed-multiline-vertical-horizontal-mode/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json b/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json index 9ff0b2697cfc..179a2b731162 100644 --- a/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/tilejson-bounds/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json b/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json index f7ca11c2324c..8781deb0b2e6 100644 --- a/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json +++ b/metrics/windows-msvc-release/render-tests/tms/tms/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json b/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json index 12b2edda3bf3..4a5dd3be30fa 100644 --- a/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/filter-with-inlined-geojson/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json b/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json index 022aba25a686..599a5b1a43d8 100644 --- a/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/layout-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json index e76ac664a033..4eb35bdc2768 100644 --- a/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/paint-circle/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json index a65edfc8c989..a06ba3bc1ef2 100644 --- a/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/paint-icon/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json index c32db503cbc8..c97315898ef8 100644 --- a/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/paint-line/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json b/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json index b42b2f763470..52fa44e8b12a 100644 --- a/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json +++ b/metrics/windows-msvc-release/render-tests/within/paint-text/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-history/in/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json index 084056a131e3..b3c7f6690a6d 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-history/out/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json index 8fbd5d92e32a..1b60f77adfb1 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json index d11ea20c7174..ad1ba7c6cf7a 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json index a9262cad3a1a..0031781153ad 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/in-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json index a00f95be78e2..1be13b07f384 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/out-of-range/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json index b51667187e38..4d504053c7ad 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-above/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json index 01b432fe214f..e30b6a8224f5 100644 --- a/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoom-visibility/was-below/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json index ca6ff8e33383..15742bd2d9e2 100644 --- a/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoomed-fill/default/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json index 4859f4afb127..0f05c16ab794 100644 --- a/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/fractional/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json index 10305579d187..bf90ca9af088 100644 --- a/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/overzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json b/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json index 50f1262c46f7..5003122a5bc4 100644 --- a/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json +++ b/metrics/windows-msvc-release/render-tests/zoomed-raster/underzoom/metrics.json @@ -32,4 +32,4 @@ ] ] ] -} \ No newline at end of file +} diff --git a/misc/mb-icon-blue-circle.svg b/misc/mb-icon-blue-circle.svg index 93f8c86a50c9..f0e65ed25cc5 100644 --- a/misc/mb-icon-blue-circle.svg +++ b/misc/mb-icon-blue-circle.svg @@ -112,4 +112,4 @@ points="17.26,16.76 14.25,15.28 17.26,13.83 18.72,10.8 20.19,13.83 23.2,15.28 20.19,16.76 18.72,19.78 " id="polygon4306" style="fill:#4264fb" - transform="matrix(4.8529412,0,0,4.8529412,17.5,17.5)" />
\ No newline at end of file + transform="matrix(4.8529412,0,0,4.8529412,17.5,17.5)" /> diff --git a/platform/README.md b/platform/README.md index 8e2cae5cba21..3a41f103c2f2 100644 --- a/platform/README.md +++ b/platform/README.md @@ -1,3 +1,3 @@ # Platforms -MapLibre Native Android and MapLibre Native iOS are **MapLibre Core Projects** and have a substantial amount of financial resources allocated to them. Learn about the different [project tiers](https://github.com/maplibre/maplibre/blob/main/PROJECT_TIERS.md#project-tiers). \ No newline at end of file +MapLibre Native Android and MapLibre Native iOS are **MapLibre Core Projects** and have a substantial amount of financial resources allocated to them. Learn about the different [project tiers](https://github.com/maplibre/maplibre/blob/main/PROJECT_TIERS.md#project-tiers). diff --git a/platform/android/.idea/runConfigurations/Benchmark.xml b/platform/android/.idea/runConfigurations/Benchmark.xml index 6ee62224434c..54d789de04fb 100644 --- a/platform/android/.idea/runConfigurations/Benchmark.xml +++ b/platform/android/.idea/runConfigurations/Benchmark.xml @@ -61,4 +61,4 @@
* ICU coding guidelines for if() statements should be followed when using these macros. - * Compound statements (curly braces {}) must be used for if-else-while... + * Compound statements (curly braces {}) must be used for if-else-while... * bodies and all macro statements should be terminated with semicolon. * * @stable ICU 2.4 @@ -167,7 +167,7 @@ * @stable ICU 2.8 */ #define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff) - + /** * Is this code point a lead surrogate (U+d800..U+dbff)? * @param c 32-bit code point diff --git a/vendor/icu/include/unicode/utf16.h b/vendor/icu/include/unicode/utf16.h index ffdf584ec6f1..ede8bd07a4f2 100644 --- a/vendor/icu/include/unicode/utf16.h +++ b/vendor/icu/include/unicode/utf16.h @@ -19,7 +19,7 @@ /** * \file * \brief C API: 16-bit Unicode handling macros - * + * * This file defines macros to deal with 16-bit Unicode (UTF-16) code units and strings. * * For more information see utf.h and the ICU User Guide Strings chapter @@ -27,7 +27,7 @@ * * Usage: * ICU coding guidelines for if() statements should be followed when using these macros. - * Compound statements (curly braces {}) must be used for if-else-while... + * Compound statements (curly braces {}) must be used for if-else-while... * bodies and all macro statements should be terminated with semicolon. */ diff --git a/vendor/icu/include/unicode/utf8.h b/vendor/icu/include/unicode/utf8.h index 20bfc7717927..029b278f5986 100644 --- a/vendor/icu/include/unicode/utf8.h +++ b/vendor/icu/include/unicode/utf8.h @@ -19,7 +19,7 @@ /** * \file * \brief C API: 8-bit Unicode handling macros - * + * * This file defines macros to deal with 8-bit Unicode (UTF-8) code units (bytes) and strings. * * For more information see utf.h and the ICU User Guide Strings chapter @@ -27,7 +27,7 @@ * * Usage: * ICU coding guidelines for if() statements should be followed when using these macros. - * Compound statements (curly braces {}) must be used for if-else-while... + * Compound statements (curly braces {}) must be used for if-else-while... * bodies and all macro statements should be terminated with semicolon. */ diff --git a/vendor/icu/include/unicode/utypes.h b/vendor/icu/include/unicode/utypes.h index 6e22fb0f9286..625b5cbd529c 100644 --- a/vendor/icu/include/unicode/utypes.h +++ b/vendor/icu/include/unicode/utypes.h @@ -211,16 +211,16 @@ typedef double UDate; /** The number of milliseconds per day @stable ICU 2.0 */ #define U_MILLIS_PER_DAY (86400000) -/** - * Maximum UDate value - * @stable ICU 4.8 - */ +/** + * Maximum UDate value + * @stable ICU 4.8 + */ #define U_DATE_MAX DBL_MAX /** - * Minimum UDate value - * @stable ICU 4.8 - */ + * Minimum UDate value + * @stable ICU 4.8 + */ #define U_DATE_MIN -U_DATE_MAX /*===========================================================================*/ @@ -416,7 +416,7 @@ typedef enum UErrorCode { U_AMBIGUOUS_ALIAS_WARNING = -122, /**< This converter alias can go to different converter implementations */ U_DIFFERENT_UCA_VERSION = -121, /**< ucol_open encountered a mismatch between UCA version and collator image version, so the collator was constructed from rules. No impact to further function */ - + U_PLUGIN_CHANGED_LEVEL_WARNING = -120, /**< A plugin caused a level change. May not be an error, but later plugins may not load. */ #ifndef U_HIDE_DEPRECATED_API @@ -638,7 +638,7 @@ typedef enum UErrorCode { U_STRINGPREP_PROHIBITED_ERROR = U_IDNA_PROHIBITED_ERROR, U_STRINGPREP_UNASSIGNED_ERROR = U_IDNA_UNASSIGNED_ERROR, U_STRINGPREP_CHECK_BIDI_ERROR = U_IDNA_CHECK_BIDI_ERROR, - + /* * Error codes in the range 0x10500-0x105ff are reserved for Plugin related error codes. */ diff --git a/vendor/icu/include/unicode/uversion.h b/vendor/icu/include/unicode/uversion.h index e40070ec1f75..96299b072ea8 100644 --- a/vendor/icu/include/unicode/uversion.h +++ b/vendor/icu/include/unicode/uversion.h @@ -18,7 +18,7 @@ /** * \file - * \brief C API: API for accessing ICU version numbers. + * \brief C API: API for accessing ICU version numbers. */ /*===========================================================================*/ /* Main ICU version information */ diff --git a/vendor/icu/src/cmemory.cpp b/vendor/icu/src/cmemory.cpp index ebaa1562247b..f995acce1dc9 100644 --- a/vendor/icu/src/cmemory.cpp +++ b/vendor/icu/src/cmemory.cpp @@ -38,7 +38,7 @@ static UMemFreeFn *pFree; #if U_DEBUG && defined(UPRV_MALLOC_COUNT) #include static int n=0; -static long b=0; +static long b=0; #endif U_CAPI void * U_EXPORT2 diff --git a/vendor/icu/src/cmemory.h b/vendor/icu/src/cmemory.h index 2b97fd74602d..ee5ba2dc3ca8 100644 --- a/vendor/icu/src/cmemory.h +++ b/vendor/icu/src/cmemory.h @@ -101,7 +101,7 @@ typedef union { * Clears any user heap functions from u_setMemoryFunctions() * Does NOT deallocate any remaining allocated memory. */ -U_CFUNC UBool +U_CFUNC UBool cmemory_cleanup(void); /** @@ -391,7 +391,7 @@ class MaybeStackArray { // Returning NULL is rejected by gcc for operator new. // The expedient thing is just not to override operator new. // While relatively pointless, heap allocated instances will function. - // static void * U_EXPORT2 operator new(size_t size); + // static void * U_EXPORT2 operator new(size_t size); // static void * U_EXPORT2 operator new[](size_t size); #if U_HAVE_PLACEMENT_NEW // static void * U_EXPORT2 operator new(size_t, void *ptr); @@ -566,7 +566,7 @@ class MaybeStackHeaderAndArray { // No heap allocation. Use only on the stack. // (Declaring these functions private triggers a cascade of problems; // see the MaybeStackArray class for details.) - // static void * U_EXPORT2 operator new(size_t size); + // static void * U_EXPORT2 operator new(size_t size); // static void * U_EXPORT2 operator new[](size_t size); #if U_HAVE_PLACEMENT_NEW // static void * U_EXPORT2 operator new(size_t, void *ptr); diff --git a/vendor/icu/src/cstring.cpp b/vendor/icu/src/cstring.cpp index 79a62c8d0e69..921100002719 100644 --- a/vendor/icu/src/cstring.cpp +++ b/vendor/icu/src/cstring.cpp @@ -17,7 +17,7 @@ * Date Name Description * 6/18/98 hshih Created * 09/08/98 stephen Added include for ctype, for Mac Port -* 11/15/99 helena Integrated S/390 IEEE changes. +* 11/15/99 helena Integrated S/390 IEEE changes. ****************************************************************************** */ @@ -161,15 +161,15 @@ T_CString_integerToString(char* buffer, int32_t v, int32_t radix) uint8_t digit; int32_t length = 0; uint32_t uval; - + U_ASSERT(radix>=2 && radix<=16); uval = (uint32_t) v; if(v<0 && radix == 10) { /* Only in base 10 do we conside numbers to be signed. */ - uval = (uint32_t)(-v); + uval = (uint32_t)(-v); buffer[length++] = '-'; } - + tbx = sizeof(tbuf)-1; tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ do { @@ -177,7 +177,7 @@ T_CString_integerToString(char* buffer, int32_t v, int32_t radix) tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); uval = uval / radix; } while (uval != 0); - + /* copy converted number into user buffer */ uprv_strcpy(buffer+length, tbuf+tbx); length += sizeof(tbuf) - tbx -1; @@ -199,15 +199,15 @@ T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) uint8_t digit; int32_t length = 0; uint64_t uval; - + U_ASSERT(radix>=2 && radix<=16); uval = (uint64_t) v; if(v<0 && radix == 10) { /* Only in base 10 do we conside numbers to be signed. */ - uval = (uint64_t)(-v); + uval = (uint64_t)(-v); buffer[length++] = '-'; } - + tbx = sizeof(tbuf)-1; tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ do { @@ -215,7 +215,7 @@ T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); uval = uval / radix; } while (uval != 0); - + /* copy converted number into user buffer */ uprv_strcpy(buffer+length, tbuf+tbx); length += sizeof(tbuf) - tbx -1; @@ -331,7 +331,7 @@ uprv_strndup(const char *src, int32_t n) { dup = uprv_strdup(src); } else { dup = (char*)uprv_malloc(n+1); - if (dup) { + if (dup) { uprv_memcpy(dup, src, n); dup[n] = 0; } diff --git a/vendor/icu/src/cwchar.h b/vendor/icu/src/cwchar.h index 5040f74d3c9f..2f26a711b02b 100644 --- a/vendor/icu/src/cwchar.h +++ b/vendor/icu/src/cwchar.h @@ -1,6 +1,6 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* +/* ****************************************************************************** * * Copyright (C) 2001, International Business Machines @@ -42,11 +42,11 @@ # define uprv_wcscat wcscat # define uprv_wcslen wcslen #else -U_CAPI wchar_t* U_EXPORT2 +U_CAPI wchar_t* U_EXPORT2 uprv_wcscpy(wchar_t *dst, const wchar_t *src); -U_CAPI wchar_t* U_EXPORT2 +U_CAPI wchar_t* U_EXPORT2 uprv_wcscat(wchar_t *dst, const wchar_t *src); -U_CAPI size_t U_EXPORT2 +U_CAPI size_t U_EXPORT2 uprv_wcslen(const wchar_t *src); #endif diff --git a/vendor/icu/src/mutex.h b/vendor/icu/src/mutex.h index 959330500f8c..42a3ba759056 100644 --- a/vendor/icu/src/mutex.h +++ b/vendor/icu/src/mutex.h @@ -30,13 +30,13 @@ U_NAMESPACE_BEGIN //---------------------------------------------------------------------------- // Code within that accesses shared static or global data should -// should instantiate a Mutex object while doing so. You should make your own +// should instantiate a Mutex object while doing so. You should make your own // private mutex where possible. // For example: -// +// // UMutex myMutex; -// +// // void Function(int arg1, int arg2) // { // static Object* foo; // Shared read-write object diff --git a/vendor/icu/src/putilimp.h b/vendor/icu/src/putilimp.h index 64e72e71183d..03d3ee4788bf 100644 --- a/vendor/icu/src/putilimp.h +++ b/vendor/icu/src/putilimp.h @@ -217,10 +217,10 @@ typedef size_t uintptr_t; #elif __clang__ && __clang_major__==3 && __clang_minor__<=1 /* Clang 3.1, has atomic variable initializer bug. */ # define U_HAVE_STD_ATOMICS 0 -#else +#else /* U_HAVE_ATOMIC is typically set by an autoconf test of #include */ /* Can be set manually, or left undefined, on platforms without autoconf. */ -# if defined(U_HAVE_ATOMIC) && U_HAVE_ATOMIC +# if defined(U_HAVE_ATOMIC) && U_HAVE_ATOMIC # define U_HAVE_STD_ATOMICS 1 # else # define U_HAVE_STD_ATOMICS 0 @@ -408,7 +408,7 @@ U_INTERNAL double U_EXPORT2 uprv_round(double x); * Return the default codepage for this platform and locale. * This function can call setlocale() on Unix platforms. Please read the * platform documentation on setlocale() before calling this function. - * @return the default codepage for this platform + * @return the default codepage for this platform * @internal */ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); @@ -417,7 +417,7 @@ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); /** * Please use uloc_getDefault() instead. * Return the default locale ID string by querying the system, or - * zero if one cannot be found. + * zero if one cannot be found. * This function can call setlocale() on Unix platforms. Please read the * platform documentation on setlocale() before calling this function. * @return the default locale ID string diff --git a/vendor/icu/src/uchar.cpp b/vendor/icu/src/uchar.cpp index 154f429f8a99..61351b19302f 100644 --- a/vendor/icu/src/uchar.cpp +++ b/vendor/icu/src/uchar.cpp @@ -14,7 +14,7 @@ * 04/02/97 aliu Creation. * 4/15/99 Madhu Updated all the function definitions for C Implementation * 5/20/99 Madhu Added the function u_getVersion() -* 8/19/1999 srl Upgraded scripts to Unicode3.0 +* 8/19/1999 srl Upgraded scripts to Unicode3.0 * 11/11/1999 weiv added u_isalnum(), cleaned comments * 01/11/2000 helena Renamed u_getVersion to u_getUnicodeVersion. * 06/20/2000 helena OS/400 port changes; mostly typecast. diff --git a/vendor/icu/src/ucmndata.h b/vendor/icu/src/ucmndata.h index 64f478186830..5a66bde33377 100644 --- a/vendor/icu/src/ucmndata.h +++ b/vendor/icu/src/ucmndata.h @@ -98,12 +98,12 @@ U_CDECL_END typedef struct { LookupFn Lookup; - NumEntriesFn NumEntries; + NumEntriesFn NumEntries; } commonDataFuncs; /* - * Functions to check whether a UDataMemory refers to memory containing + * Functions to check whether a UDataMemory refers to memory containing * a recognizable header and table of contents a Common Data Format * * If a valid header and TOC are found, diff --git a/vendor/icu/src/uinvchar.cpp b/vendor/icu/src/uinvchar.cpp index d16e9c0cba6a..7575b5b2cc13 100644 --- a/vendor/icu/src/uinvchar.cpp +++ b/vendor/icu/src/uinvchar.cpp @@ -572,7 +572,7 @@ uprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n) { uint8_t *orig_dst = dst; - if(n==-1) { + if(n==-1) { n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ @@ -593,7 +593,7 @@ uprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n) { uint8_t *orig_dst = dst; - if(n==-1) { + if(n==-1) { n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ diff --git a/vendor/icu/src/umutex.h b/vendor/icu/src/umutex.h index 1d1fac548a48..026b18b246f8 100644 --- a/vendor/icu/src/umutex.h +++ b/vendor/icu/src/umutex.h @@ -191,16 +191,16 @@ U_NAMESPACE_BEGIN typedef int32_t u_atomic_int32_t; #define ATOMIC_INT32_T_INITIALIZER(val) val -U_COMMON_API int32_t U_EXPORT2 +U_COMMON_API int32_t U_EXPORT2 umtx_loadAcquire(u_atomic_int32_t &var); -U_COMMON_API void U_EXPORT2 +U_COMMON_API void U_EXPORT2 umtx_storeRelease(u_atomic_int32_t &var, int32_t val); -U_COMMON_API int32_t U_EXPORT2 +U_COMMON_API int32_t U_EXPORT2 umtx_atomic_inc(u_atomic_int32_t *p); -U_COMMON_API int32_t U_EXPORT2 +U_COMMON_API int32_t U_EXPORT2 umtx_atomic_dec(u_atomic_int32_t *p); U_NAMESPACE_END @@ -364,7 +364,7 @@ struct UConditionVar { }; #define U_CONDITION_INITIALIZER {NULL, NULL, 0} - + #elif U_PLATFORM_IMPLEMENTS_POSIX @@ -436,7 +436,7 @@ U_INTERNAL void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex); * Broadcast wakeup of all threads waiting on a Condition. * The associated mutex must be locked by the calling thread when calling * this function; this is a temporary ICU restriction. - * + * * @param cond the condition variable. */ U_INTERNAL void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond); diff --git a/vendor/icu/src/ushape.cpp b/vendor/icu/src/ushape.cpp index a3b21770b999..fd22d660a92b 100644 --- a/vendor/icu/src/ushape.cpp +++ b/vendor/icu/src/ushape.cpp @@ -816,9 +816,9 @@ handleGeneratedSpaces(UChar *dest, int32_t sourceLength, if(lamAlefOption || tashkeelOption){ uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); - + i = j = sourceLength; count = 0; - + while(i >= 0) { if ( (lamAlefOption && dest[i] == LAMALEF_SPACE_SUB) || (tashkeelOption && dest[i] == TASHKEEL_SPACE_SUB) ){ diff --git a/vendor/icu/src/ustr_imp.h b/vendor/icu/src/ustr_imp.h index 258e49dc49d2..c9fef15c0090 100644 --- a/vendor/icu/src/ustr_imp.h +++ b/vendor/icu/src/ustr_imp.h @@ -1,6 +1,6 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* +/* ********************************************************************** * Copyright (C) 1999-2015, International Business Machines * Corporation and others. All Rights Reserved. @@ -37,10 +37,10 @@ uprv_strCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, UBool strncmpStyle, UBool codePointOrder); -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ustr_hashUCharsN(const UChar *str, int32_t length); -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ustr_hashCharsN(const char *str, int32_t length); U_CAPI int32_t U_EXPORT2 diff --git a/vendor/icu/src/ustring.cpp b/vendor/icu/src/ustring.cpp index 0b2b3e6756df..7b4c2cd6a3ab 100644 --- a/vendor/icu/src/ustring.cpp +++ b/vendor/icu/src/ustring.cpp @@ -575,7 +575,7 @@ u_strspn(const UChar *string, const UChar *matchSet) /* ----- Text manipulation functions --- */ U_CAPI UChar* U_EXPORT2 -u_strtok_r(UChar *src, +u_strtok_r(UChar *src, const UChar *delim, UChar **saveState) { @@ -625,7 +625,7 @@ u_strtok_r(UChar *src, /* Miscellaneous functions -------------------------------------------------- */ U_CAPI UChar* U_EXPORT2 -u_strcat(UChar *dst, +u_strcat(UChar *dst, const UChar *src) { UChar *anchor = dst; /* save a pointer to start of dst */ @@ -640,9 +640,9 @@ u_strcat(UChar *dst, } U_CAPI UChar* U_EXPORT2 -u_strncat(UChar *dst, - const UChar *src, - int32_t n ) +u_strncat(UChar *dst, + const UChar *src, + int32_t n ) { if(n > 0) { UChar *anchor = dst; /* save a pointer to start of dst */ @@ -668,8 +668,8 @@ u_strncat(UChar *dst, /* ----- Text property functions --- */ U_CAPI int32_t U_EXPORT2 -u_strcmp(const UChar *s1, - const UChar *s2) +u_strcmp(const UChar *s1, + const UChar *s2) { UChar c1, c2; @@ -939,9 +939,9 @@ u_strcmpCodePointOrder(const UChar *s1, const UChar *s2) { } U_CAPI int32_t U_EXPORT2 -u_strncmp(const UChar *s1, - const UChar *s2, - int32_t n) +u_strncmp(const UChar *s1, + const UChar *s2, + int32_t n) { if(n > 0) { int32_t rc; @@ -964,8 +964,8 @@ u_strncmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t n) { } U_CAPI UChar* U_EXPORT2 -u_strcpy(UChar *dst, - const UChar *src) +u_strcpy(UChar *dst, + const UChar *src) { UChar *anchor = dst; /* save a pointer to start of dst */ @@ -976,9 +976,9 @@ u_strcpy(UChar *dst, } U_CAPI UChar* U_EXPORT2 -u_strncpy(UChar *dst, - const UChar *src, - int32_t n) +u_strncpy(UChar *dst, + const UChar *src, + int32_t n) { UChar *anchor = dst; /* save a pointer to start of dst */ @@ -991,7 +991,7 @@ u_strncpy(UChar *dst, } U_CAPI int32_t U_EXPORT2 -u_strlen(const UChar *s) +u_strlen(const UChar *s) { #if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR return (int32_t)uprv_wcslen((const wchar_t *)s); @@ -1221,7 +1221,7 @@ u_unescapeAt(UNESCAPE_CHAR_AT charAt, int8_t n = 0; int8_t minDig = 0; int8_t maxDig = 0; - int8_t bitsPerDigit = 4; + int8_t bitsPerDigit = 4; int8_t dig; int32_t i; UBool braces = FALSE; diff --git a/vendor/metal-cpp/README.md b/vendor/metal-cpp/README.md index a89fcb0efcae..51329a4d0e6a 100644 --- a/vendor/metal-cpp/README.md +++ b/vendor/metal-cpp/README.md @@ -246,7 +246,7 @@ printf( "string = \"%s\"\n", [string cStringUsingEncoding: NSASCIIStringEncoding ```objc NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSString* string = [NSString stringWithCString: "Hello World" encoding: NSASCIIStringEncoding]; - + printf( "string = \"%s\"\n", [string cStringUsingEncoding: NSASCIIStringEncoding] ); [pool release]; diff --git a/vendor/metal-cpp/SingleHeader/MakeSingleHeader.py b/vendor/metal-cpp/SingleHeader/MakeSingleHeader.py index 520cb8898507..a2e96170b6a6 100755 --- a/vendor/metal-cpp/SingleHeader/MakeSingleHeader.py +++ b/vendor/metal-cpp/SingleHeader/MakeSingleHeader.py @@ -85,7 +85,7 @@ def __get_commit_string( self ): def __get_date_string( self ): today = datetime.date.today() - + return today.strftime( self.__template_date ) def __meta_data_string( self ): @@ -158,7 +158,7 @@ def __process_foundation_directives( self, header ): def __process_header( self, header_path ): - out_header = '' + out_header = '' header_path = os.path.realpath( header_path ) @@ -167,7 +167,7 @@ def __process_header( self, header_path ): self.__base_path.append( os.path.dirname( header_path ) ) self.__included_headers.add( header_path ) - + out_header = self.__read_header( header_path ) out_header = self.__strip_pragma_once( out_header ) out_header = self.__strip_comments( out_header ) @@ -211,7 +211,7 @@ def parse_arguments(): def make_header( args ): prefix = HeaderPrefix( os.path.basename( args.output_path ) ) header = SingleHeader() - + for header_path in args.header_paths: header.append( header_path ) @@ -248,7 +248,7 @@ def write_header( args, content ): if __name__ == '__main__': result = -1 - + try: if sys.getdefaultencoding().lower() == 'ascii': reload( sys ) diff --git a/vendor/nunicode/src/libnu/gen/_ducet.c b/vendor/nunicode/src/libnu/gen/_ducet.c index cef3773e9f9d..52d21e9a34aa 100644 --- a/vendor/nunicode/src/libnu/gen/_ducet.c +++ b/vendor/nunicode/src/libnu/gen/_ducet.c @@ -10,6187 +10,6187 @@ #include const int16_t NU_DUCET_G[] = { - -20026, -20025, -20024, -20023, -20022, -20021, -20020, -20019, -20018, -20017, -20016, -20015, - -20013, 6, 49, 26, 52, 49, 56, -20011, 57, 50, 48, 83, - 68, 133, 139, 141, 144, -20010, -20005, -19999, -19998, -19997, -19996, -19994, - -19993, -19991, -19990, -19989, -19988, -19987, -19986, -19985, -19984, -19983, -19981, -19980, - -19979, -19978, -19971, -19969, -19967, -19961, -19957, -19956, -19951, -19950, -19948, -19947, - -19946, -19943, -19942, -19941, -19939, -19938, -19937, -19934, -19933, 3, 1, -19932, - -19931, -19930, -19917, -19916, -19897, -19896, -19895, -19894, -19893, -19892, -19891, -19890, - -19889, -19888, -19887, -19886, -19885, -19884, -19883, -19882, -19881, -19880, -19879, -19878, - -19877, -19876, -19874, -19873, -19872, -19871, -19870, -19869, -19868, -19867, -19866, -19865, - -19864, -19863, -19862, -19861, -19860, 0, -19859, -19858, -19857, -19856, -19855, -19854, - -19853, -19852, -19851, -19850, -19849, -19848, -19847, -19846, -19845, -19844, -19843, -19842, - -19841, -19840, -19839, -19838, -19837, -19836, -19835, -19834, -19833, -19832, -19831, -19830, - -19829, -19828, -19827, -19826, -19825, -19824, -19823, -19822, -19821, -19820, -19819, -19818, - -19817, -19816, -19815, -19814, -19813, -19812, -19811, -19810, -19809, -19808, -19807, -19806, - -19805, -19804, -19803, -19802, -19672, 1, 1, 1, 4, 1, 1, 8, - 8, 3, 4, 6, 17, 20, 17, 24, 24, -19671, -19670, -19669, - -19668, 32, -19666, -19665, -19664, 10, 16, 16, 40, 42, 40, 22, - 46, 64, 10, 54, 80, -19663, -19662, -19661, -19660, -19659, -19658, -19657, - -19656, -19655, -19654, -19653, -19652, 82, 1, 5, 1, 8, 8, 8, - 8, 1, 1, 1, 17, 17, 17, 17, 17, 5, 1, 1, - 1, 5, 1, 1, 1, 5, 1, 1, 4, 20, 25, 29, - 25, 32, 1, 3, 1, 3, -19651, -19650, -19649, -19648, -19647, -19646, - -19645, -19644, -19643, -19642, -19641, -19640, 2, 4, 2, 8, 2, 2, - 2, -19639, -19638, -19637, 2, -19636, -19635, -19634, -19633, 1, -19632, -19631, - -19630, -19629, -19628, -19627, -19626, -19625, -19624, -19623, -19622, -19621, -19620, -19619, - -19618, 1, -19617, -19616, -19615, -19614, -19613, -19612, -19611, -19610, -19609, -19608, - -19607, -19606, -19605, -19604, -19603, -19602, 5, 3, 4, 2, 9, 9, - 9, 3, -19601, -19600, 1, 5, -19599, -19598, -19597, -19596, 1, 3, - 1, 3, 1, 3, 1, 3, -19595, -19594, 1, 1, -19593, -19592, - -19591, -19590, -19589, -19588, 3, 1, -19587, -19586, -19585, -19584, -19583, -19582, - -19581, -19580, -19579, -19578, -19577, -19576, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -19575, 1, -19574, -19573, - 1, 1, -19572, -19571, -19570, -19569, -19568, -19567, -19566, -19565, -19564, -19563, - -19562, -19561, 1, 1, 1, 1, 1, 1, 1, -19560, 1, 1, - 1, -19559, -19558, -19557, -19556, 1, -19555, -19554, 1, 1, -19553, -19552, - -19551, -19550, -19549, -19548, -19547, -19546, -19545, -19544, -19543, -19542, 1, 1, - 1, 9, 2, 8, 1, 3, 1, 5, 16, 16, 16, 16, - 16, 1, -19541, -19540, -19539, 2, -19538, -19537, -19536, -19535, -19534, -19533, - -19532, -19531, -19530, -19529, 0, -19528, 15, 17, 22, 16, 24, 50, - 55, -19527, 48, 48, 64, 52, -19526, 64, -19525, 64, 64, 70, - 64, -19524, 66, 72, 74, 66, -19523, 65, 82, 64, -19522, -19521, - -19520, -19519, 1, 1, 5, -19518, 14, 3, 50, 2, 48, 11, - 51, -19517, -19516, 128, 144, 25, 29, 1, 49, 130, 129, 129, - 137, 62, 128, 128, 128, -19515, -19514, 134, 131, -19513, -19512, -19511, - -19510, -19509, -19508, -19507, -19506, -19505, -19504, -19503, -19502, -19501, -19500, -19499, - -19498, -19497, -19496, -19495, -19494, -19493, -19492, -19491, -19490, -19489, -19488, -19487, - -19486, -19485, -19484, -19483, -19482, 1, 4, 10, 12, 10, 8, 10, - 21, 22, 18, 22, 33, -19481, -19480, 39, 40, 32, 1, 3, - 4, 9, 1, 9, 2, 19, -19479, -19478, -19477, 4, -19476, -19475, - -19474, -19473, 1, 1, 1, 1, 3, 18, 21, 23, -19472, 16, - 18, 16, 81, 16, -19471, -19470, 50, 64, 64, 2, 64, 75, - 64, 72, 64, 83, 64, 37, 81, 97, 92, 120, 8, 8, - -19469, -19468, -19467, 9, 9, -19466, -19465, -19464, -19463, -19462, -19461, -19460, - -19459, 144, 28, 6, 2, -19458, -19457, -19456, -19455, 128, 67, 90, - 128, 128, 130, 136, 129, -19454, -19453, -19452, -19451, -19450, -19449, -19448, - -19447, -19446, -19445, -19444, -19443, -19442, -19440, -19439, -19438, -19437, -19436, -19435, - -19434, -19433, -19432, -19431, -19430, -19429, -19428, -19427, -19426, -19425, -19424, -19423, - -19422, 16, 8, 13, 72, 216, 220, 11, 220, 218, 256, 183, - 257, 248, 265, 211, 280, 163, 149, 218, 154, 273, 222, 218, - 259, 154, 258, 273, 278, 282, 332, 352, 352, 278, 286, 280, - 324, 213, 328, 280, 337, 337, 337, 294, 336, 281, 336, -19421, - -19420, 336, 1, 1, 1, -19419, -19418, -19416, -19415, -19414, -19413, -19412, - -19411, 1, 1, 1, -19410, 1, 2, 4, 4, 9, 10, 2, - 2, 6, 1, 16, 1, 25, 4, 25, 22, 2, 1, 1, - 7, 5, 8, 53, 53, -19409, 52, 64, 64, -19407, -19406, -19405, - -19404, 5, 1, 9, 11, -19402, -19401, 64, 64, -19400, -19399, -19398, - -19397, -19396, 0, 0, 0, -19395, 69, 71, 69, 76, 79, 90, - 97, 100, -19394, 98, 98, 98, -19393, -19392, -19391, -19390, 2, 10, - 12, 9, 9, 16, 9, 16, -19389, -19388, 16, -19387, 0, 0, - -19386, -19385, -19384, -19383, -19382, -19381, -19380, -19379, -19378, -19377, -19376, -19375, - -19374, -19373, -19372, -19371, -19370, -19369, -19368, -19367, -19366, -19365, -19364, -19363, - -19362, -19361, -19360, -19359, -19358, -19357, -19356, -19355, -19354, -19353, 9, 13, - 41, 36, 43, 64, 46, 64, 64, 64, 64, 64, -19352, 64, - 64, -19351, -19350, -19349, 29, -19348, -19347, -19346, -19345, -19344, -19343, -19342, - -19341, -19340, -19339, -19338, -19337, 45, -19336, -19335, -19334, -19333, -19332, -19331, - -19330, -19329, -19328, -19327, -19326, -19325, -19324, -19323, -19322, -19321, -19320, -19319, - -19318, -19317, -19316, -19315, -19314, -19313, -19312, -19311, -19310, 0, 0, 0, - 0, -19309, 1, 1, -19308, 1, 2, 21, 5, 32, 20, 26, - 32, 32, 32, 36, 32, -19307, 0, 0, 0, 0, -19306, -19305, - 0, 0, -19304, -19303, -19302, -19301, -19300, -19299, -19298, -19297, -19296, -19295, - -19294, -19293, 0, 0, 0, -19292, 0, 0, 0, 0, 0, 0, - 0, 0, -19291, -19290, -19289, -19288, -19287, -19286, -19285, -19284, -19283, -19282, - -19281, -19280, 0, 0, -19279, -19278, -19275, -19274, -19273, -19272, -19271, -19270, - -19269, -19268, -19267, -19266, -19265, -19264, -19263, -19262, -19261, -19260, -19259, -19258, - -19253, -19246, -19213, 0, 0, -19193, -19192, -19191, -19190, -19189, -19188, -19187, - -19186, -19185, -19184, -19183, -19182, -19181, -19180, -19179, -19178, -19177, -19173, -19172, - -19171, -19169, -19168, -19167, -19166, -19165, -19164, -19163, -19162, -19161, -19160, -19159, - -19158, -19157, 0, -19156, 0, -19155, 0, 0, 0, 0, -19154, -19153, - -19152, -19151, -19150, -19149, -19148, -19147, -19146, -19145, -19144, -19143, -19142, -19141, - -19140, -19139, -19138, -19137, -19136, -19135, -19134, -19133, -19132, -19131, -19130, -19129, - -19128, -19127, -19126, -19125, -19124, -19123, -19122, -19121, -19120, -19119, 0, 0, - -19118, -19117, 0, 0, 0, 0, 0, 0, 0, 0, -19116, -19115, - -19114, -19113, -19112, -19111, -19110, -19109, -19108, -19107, -19106, -19105, -19104, -19103, - -19102, -19101, -19100, -19099, -19098, -19097, -19096, -19095, -19094, -19093, 0, 0, - -19092, -19091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -19090, -19089, 19, 20, - 16, 19, 19, 28, 37, 67, 68, 70, -19088, -19087, -19086, -19085, - 31, 59, 64, 66, 64, 66, 64, 66, 64, -19084, 65, 66, - 88, 91, 65, 66, 97, 125, 81, 99, 103, 117, 124, 288, - 295, 315, 384, 388, -19083, -19082, -19081, -19080, 310, 1, 228, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 18, 42, 10, 33, 33, 37, 33, 45, 82, 88, -19079, -19078, - -19077, -19076, -19075, -19074, -19073, -19072, 74, 74, 76, 78, 97, 101, - 96, 96, 96, 96, 96, 96, 96, 111, 96, 155, 1, 4, - 4, 1, 8, 8, 8, -19071, -19070, -19069, -19068, -19067, -19066, -19065, - -19064, 6, 3, -19063, -19062, -19061, 32, 32, 32, 36, 32, 36, - 38, 44, 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 85, -19060, -19059, - -19058, 83, -19057, 0, -19056, -19055, -19054, -19053, -19052, -19051, 274, 274, - 0, 259, 1, 1, 1, 257, 256, 256, 257, -19050, 262, -19049, - -19048, -19047, -19046, -19045, -19044, 1, 1, 1, 1, 9, 9, 1, - 1, 1, 1, 1, 1, 263, 265, 1, 1, 1, 264, -19043, - 260, -19042, -19041, 265, 261, -19040, 259, -19039, 288, -19038, 288, -19037, - -19036, 289, 1, 1, 1, 1, -19035, -19034, 1, 1, 278, -19033, - 288, 288, 288, -19032, -19031, 256, 1, 1, 1, 1, 1, 1, - 1, 256, 257, 6, 28, 265, -19030, 265, -19029, 1, 264, -19028, - 267, 0, -19027, 276, -19026, 258, 1, 1, 1, 1, 1, 1, - 1, 12, 2, 11, 13, 16, -19025, -19024, -19023, -19022, -19021, -19020, - -19019, -19018, -19017, -19016, -19015, -19014, 1, 1, 4, 1, 1, 8, - 1, 3, 4, 6, 2, -19013, -19012, -19011, -19010, 1, 2, 4, - 1, 8, 8, 2, 2, 1, -19009, -19008, 4, 2, -19007, -19006, - -19005, -19004, -19003, -19002, -19001, -19000, 65, 68, 65, -18999, 72, 71, - 119, 73, -18998, -18997, -18996, -18995, -18994, -18993, -18992, -18991, -18990, -18989, - -18988, -18987, -18986, -18985, -18984, -18983, -18982, -18981, -18980, -18979, -18978, -18977, - -18976, -18975, -18974, -18973, -18972, -18971, -18970, -18969, -18968, -18967, -18966, -18965, - -18964, -18963, 118, 120, 120, 69, 123, 204, 126, 116, -18962, -18961, - 192, 71, -18960, -18959, -18958, -18957, 160, 160, 209, 317, 219, 336, - 292, 160, -18956, -18955, 337, 339, -18954, -18953, -18952, -18951, -18950, -18949, - -18948, -18947, -18946, -18945, -18944, -18943, -18942, -18941, -18940, -18939, -18938, -18937, - 48, 8, 139, 141, 161, 161, 172, 204, 5, 272, 284, 286, - -18936, -18935, -18934, 324, -18933, -18932, -18931, -18930, -18929, -18928, -18927, -18926, - -18925, -18924, -18923, -18922, -18921, -18920, -18919, -18918, -18917, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18916, -18915, - -18914, -18913, 0, -18912, -18911, -18910, 0, 0, 0, 0, 0, 0, - 0, 0, -18909, -18908, -18907, -18906, -18905, -18904, -18903, -18902, -18901, -18900, - -18899, -18898, -18897, -18896, -18895, -18894, -18893, -18892, -18891, -18890, -18889, -18888, - -18887, -18886, -18885, -18884, -18883, -18882, -18881, -18880, -18879, -18878, -18877, -18876, - -18875, -18874, -18873, -18872, -18871, -18870, -18869, -18868, -18867, -18866, -18865, -18864, - -18863, -18862, -18861, -18860, -18859, -18858, 0, 0, 0, -18857, 0, 0, - 0, 0, 0, 0, 0, -18856, 12, 16, 16, 19, 17, 19, - 27, 38, 49, 38, 48, 54, 48, 144, 151, 144, -18855, -18854, - -18853, -18852, -18851, -18850, -18849, -18848, -18847, -18846, -18845, -18844, -18843, -18842, - -18841, -18840, -18839, -18838, -18837, 0, -18836, -18835, -18834, 0, 0, 0, - 0, 0, 0, 0, 0, -18833, 1, 1, 1, 1, 1, 1, - 1, 1, -18832, 4, 4, 17, -18831, -18830, -18829, -18828, 1, 1, - 1, -18827, -18826, 1, 1, -18825, -18824, -18823, -18822, -18821, -18820, -18819, - -18818, 1, -18817, -18816, -18815, -18814, -18813, -18812, -18811, -18810, -18809, -18808, - -18807, -18806, -18805, -18804, -18803, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -18802, -18801, -18800, - -18799, -18798, -18797, -18796, -18795, 0, 0, 0, 0, 0, 0, 0, - 0, -18794, -18793, -18792, -18791, -18790, -18789, -18788, -18787, -18786, -18785, -18784, - -18783, -18782, -18781, -18780, -18779, -18778, -18777, -18776, -18775, -18774, -18773, -18772, - -18771, -18770, -18769, -18768, -18767, -18766, -18765, -18764, -18763, -18762, -18761, -18760, - -18759, -18758, -18757, -18756, -18755, -18754, -18753, -18752, -18751, -18750, -18749, -18748, - -18747, -18746, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, - 1, 1, 2, 2, 16, 3, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 5, 31, 1, 32, 2, 4, -18745, -18744, - -18743, -18742, -18741, -18740, -18739, -18738, -18737, -18736, -18735, -18734, -18733, -18732, - -18731, -18730, 1, 1, 1, 5, 1, 1, 8, 5, 1, 3, - 1, 16, -18729, -18728, -18727, -18726, -18725, -18724, -18723, -18722, -18721, -18720, - -18719, -18718, -18717, -18716, -18715, -18714, -18713, -18712, -18711, -18710, -18709, -18708, - -18707, -18706, -18705, -18704, -18703, -18702, -18701, -18700, -18699, -18698, -18697, -18696, - -18695, -18694, 1, 1, 4, 8, 10, 8, 14, 16, 16, 16, - 16, -18693, 16, 16, 16, 3, -18692, -18691, -18690, -18689, -18688, -18687, - -18686, -18685, 3, -18684, -18683, -18682, 8, 2, 8, 10, -18681, -18680, - -18679, -18678, -18677, -18676, -18675, -18674, -18673, -18672, -18671, -18670, -18669, -18668, - -18667, -18666, 8, 10, 14, 18, 18, 21, 21, 18, -18665, -18664, - -18663, 18, -18662, -18661, -18660, -18659, -18658, -18657, -18656, -18655, -18654, -18653, - -18652, -18651, -18650, -18649, -18648, -18647, -18646, -18645, -18644, -18643, -18642, -18641, - -18640, -18639, -18638, -18637, -18636, -18635, -18634, -18633, -18632, -18631, -18630, -18629, - -18628, -18627, -18626, -18625, -18624, -18623, -18622, -18621, -18620, -18619, -18618, -18617, - -18616, -18615, -18614, -18613, -18612, -18611, -18610, -18609, -18608, -18607, -18606, -18605, - -18604, -18603, -18602, -18601, -18600, -18599, -18598, -18597, -18596, -18595, -18594, -18593, - 1, 1, -18592, 1, 1, -18591, -18590, -18589, -18588, -18587, -18586, -18585, - -18584, -18583, -18582, -18581, -18580, -18579, -18578, -18577, -18576, 0, -18575, -18574, - -18573, -18572, 1, 1, -18571, 1, 1, 1, 1, 1, 2, 2, - 8, 3, 1, 3, 1, 17, 1, 16, 1, 7, 1, -18570, - -18569, 1, 1, 5, 1, 1, 1, 6, 1, 39, 2, 50, - 13, 11, -18568, -18567, -18566, -18565, -18564, -18563, -18562, -18561, -18560, -18559, - -18558, -18557, -18556, -18555, -18554, -18553, 16, 16, 16, 16, -18552, -18551, - -18550, -18549, -18548, -18547, -18546, -18545, -18544, -18543, -18542, -18541, 1, 5, - 5, 1, 8, 12, 8, 26, 2, 2, 2, 38, 3, 33, - 44, 48, 32, 32, 32, 32, 32, 40, 32, 32, -18540, -18539, - 32, -18538, -18537, -18536, -18535, -18534, 24, 24, 68, 24, 64, 64, - 72, 64, -18533, -18532, -18531, -18530, -18529, -18528, -18527, -18526, 88, 88, - 88, 88, 128, 128, 128, -18525, -18524, 128, 128, -18523, -18522, -18521, - -18520, 141, 2, 4, 1, 3, 8, 2, 2, 1, 1, 1, - 1, 16, 1, 17, 1, -18519, -18518, -18517, -18516, -18515, -18514, -18513, - -18512, -18511, -18510, -18509, -18508, -18507, -18506, -18505, -18504, -18503, -18502, -18501, - -18500, -18499, -18498, -18497, 0, -18496, -18495, -18494, -18493, -18492, 0, -18491, - 0, -18490, -18489, -18488, -18487, -18486, -18485, -18484, -18483, -18482, -18481, -18480, - -18479, -18478, -18477, -18476, -18475, -18474, -18473, -18472, -18471, -18470, -18469, -18468, - 0, 0, -18467, -18466, -18465, -18464, 0, 0, 0, -18463, 1, 1, - -18462, -18461, 1, 1, -18460, 1, 1, 1, 1, -18459, -18457, -18451, - -18449, 1, 1, 1, -18448, -18447, 1, 1, -18444, 1, 1, 1, - 1, 1, -18443, -18442, -18441, -18440, -18439, -18438, -18437, -18436, -18435, -18434, - -18433, -18432, -18431, -18430, -18429, -18428, 0, 0, 0, -18427, -18426, -18425, - -18424, 1, 0, 0, -18423, 1, 1, 4, 4, 1, -18422, -18421, - 9, -18420, -18419, -18418, -18417, -18416, -18415, -18414, -18413, -18412, -18411, -18410, - -18409, -18408, -18407, -18406, -18405, -18404, -18403, -18402, -18401, -18400, -18399, -18398, - -18397, -18396, -18395, -18394, -18393, -18392, -18391, -18390, -18389, -18388, 2, 5, - 12, -18387, -18386, 10, 26, 34, -18385, -18384, -18383, 33, 37, 44, - 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, -18382, - 1, -18381, 1, -18380, 1, -18379, 1, 1, 4, 6, -18378, -18377, - 24, 9, 16, 32, 16, 32, -18376, -18375, 18, 2, 1, 1, - 4, -18374, -18373, 2, 2, 2, 1, -18372, 5, 50, -18371, -18370, - 3, 1, 4, 6, 12, 12, -18369, 23, 21, -18368, -18367, -18366, - 16, 116, -18365, -18364, 22, 14, 5, 10, 34, 2, 35, 64, - 66, 69, 64, 64, 64, 64, 66, 64, 79, 1, 1, 6, - 8, -18363, -18362, 9, 13, 27, 23, 7, 32, 22, 32, 23, - 32, 28, 14, 16, 16, 19, 16, 16, 25, 16, 16, 43, - 130, 47, 136, 143, 148, 3, 3, 7, 9, -18361, 9, 20, - 15, 31, 17, 129, -18360, 24, 131, 136, 142, 16, 16, 20, - 20, 16, 27, 31, 154, 145, 170, 144, 186, 152, 184, 165, - 185, -18359, -18358, 3, 3, -18357, -18356, -18355, -18354, -18353, -18352, -18351, - -18350, -18349, -18348, -18347, -18346, 1, 7, 13, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 18, 16, 33, -18345, -18341, -18340, - -18339, -18338, -18337, -18336, -18335, -18334, -18333, -18332, -18331, -18330, -18329, -18328, - -18327, -18326, -18325, -18324, -18323, -18322, -18321, -18320, -18319, 2, 1, 1, - -18318, 5, 11, 2, 13, -18317, -18316, -18315, -18314, -18313, -18312, -18311, - -18310, -18309, -18308, -18307, -18306, -18305, -18304, -18303, -18302, -18301, -18300, -18299, - -18298, -18297, -18296, -18295, -18294, -18293, -18292, -18291, -18290, -18289, -18288, -18287, - -18286, -18285, -18284, -18283, -18282, -18281, -18280, -18279, -18278, -18277, -18276, -18275, - -18274, -18273, -18272, -18271, -18270, -18269, -18268, -18267, -18266, -18265, -18264, -18263, - -18262, -18261, -18260, -18259, -18258, -18257, -18256, -18255, -18254, 1, 1, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 30, 32, 18, 16, 20, 16, 26, 16, 30, 86, 17, 38, - 87, 96, 108, 108, 112, 112, 96, 96, 96, -18253, -18252, 96, - 96, -18251, -18250, -18249, -18248, -18247, -18246, -18245, -18244, 98, -18243, -18242, - -18241, -18240, -18239, -18238, -18237, -18236, -18235, -18234, -18233, -18232, -18231, -18230, - -18229, -18228, 1, 6, 6, -18227, -18226, 9, 12, 1, -18225, -18224, - 1, 4, -18223, -18222, -18221, -18220, -18219, -18218, -18217, -18216, -18215, -18214, - -18213, -18212, -18211, -18210, -18209, -18208, -18207, -18206, -18205, 0, -18204, -18203, - -18202, 0, 0, 0, 0, -18201, -18200, -18199, -18198, -18197, -18196, -18195, - -18194, -18193, -18192, -18191, -18190, -18189, -18188, -18187, -18186, -18185, -18184, -18183, - -18182, -18181, -18180, -18179, -18178, -18177, -18176, -18175, -18174, -18173, -18172, -18171, - -18170, -18169, -18168, -18167, -18166, -18165, -18164, -18163, -18162, -18161, -18160, -18159, - -18158, -18157, -18156, -18155, -18154, -18153, -18152, -18151, -18150, -18149, -18148, -18147, - -18146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -18145, -18144, -18143, -18142, 0, 0, - -18141, 0, -18140, -18139, -18138, 0, 0, 0, -18137, 1, -18136, 1, - -18135, -18134, 1, -18133, -18132, -18131, 1, 1, -18130, -18129, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -18128, -18127, - -18126, 1, 1, 1, 1, -18125, 0, 0, 0, 0, 0, -18124, - 0, -18123, -18122, -18121, 0, -18120, -18119, 0, -18118, 1, 1, 1, - 1, -18117, -18116, -18115, 1, 1, -18114, -18113, -18112, 1, 1, 1, - 1, 1, -18111, -18110, -18109, -18108, 1, 1, -18107, -18106, -18105, -18104, - -18103, 3, -18102, 2, -18101, 0, -18100, -18099, 17, -18098, -18097, -18096, - -18095, -18094, -18093, -18092, -18091, -18090, -18089, -18088, -18087, 1, 1, 1, - 4, -18086, -18085, -18084, -18083, -18082, -18081, -18080, -18079, -18078, -18077, -18076, - -18075, 3, -18074, -18073, -18072, -18071, -18070, -18069, -18068, -18067, -18066, -18065, - -18064, -18063, -18062, -18061, -18060, 0, -18059, -18058, -18057, -18056, -18055, -18054, - -18053, -18052, 0, 0, -18051, -18050, 0, 0, 0, -18049, -18048, -18047, - -18046, -18045, -18044, -18043, -18042, 0, 0, 0, 0, 0, 0, 0, - 0, -18041, -18040, -18039, -18038, -18037, -18036, -18035, -18034, -18033, -18032, -18031, - -18030, 0, -18029, -18028, -18027, -18026, -18025, -18024, -18023, -18022, -18021, -18020, - -18019, -18018, -18017, -18016, -18015, -18014, -18013, -18012, -18011, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -18010, -18009, -18008, -18007, -18006, 0, 0, -18005, -18004, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -18003, -18002, -18001, -18000, -17999, -17998, -17997, -17996, -17995, -17994, -17993, - -17992, -17991, -17990, -17989, -17988, -17987, -17986, -17985, -17984, -17983, -17982, -17981, - -17980, -17979, -17978, -17977, -17976, -17975, -17974, -17973, -17972, 0, -17971, -17970, - -17969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17968, -17967, -17966, -17965, -17964, -17963, -17962, -17961, -17960, -17959, -17958, - -17957, -17956, -17955, -17954, -17953, -17952, -17951, -17950, -17949, -17948, -17947, -17946, - -17945, -17944, -17943, -17942, -17941, -17940, -17939, -17938, -17937, -17936, -17935, -17934, - -17933, -17932, -17931, -17930, -17929, -17928, -17927, -17926, -17925, -17924, -17923, -17922, - -17921, 0, -17920, -17919, -17918, 0, 0, 0, 0, -17917, -17916, 0, - 0, -17915, -17914, -17913, -17912, -17911, -17910, -17909, -17908, -17907, -17906, -17905, - -17904, -17903, -17902, -17901, -17900, -17899, -17898, -17897, -17896, -17895, -17894, -17893, - -17892, -17891, -17890, -17889, -17888, -17887, -17886, -17885, -17884, -17883, -17882, -17881, - -17880, -17879, -17878, -17877, -17876, -17875, -17874, -17873, -17872, -17871, -17870, -17869, - -17868, -17867, -17866, -17865, -17864, -17863, -17862, -17861, -17860, -17859, -17858, -17857, - -17856, -17855, -17854, -17853, -17852, -17851, -17850, -17849, -17848, -17847, -17846, -17845, - -17844, -17843, -17842, -17841, -17840, -17839, -17838, -17837, -17836, -17835, -17834, -17833, - -17832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17831, -17830, -17829, -17828, -17827, -17826, -17825, - -17824, 0, 0, 0, -17823, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -17822, -17821, -17820, -17819, -17818, -17817, - -17816, -17815, -17814, -17813, -17812, -17811, 0, 0, 0, 0, -17810, -17809, - -17808, -17807, -17806, -17805, -17804, -17803, -17802, -17801, -17800, -17799, -17798, -17797, - -17796, -17795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17794, -17793, -17792, -17791, -17790, -17789, -17788, - -17787, -17786, -17785, -17784, -17783, 0, -17782, -17781, -17780, -17779, -17778, -17777, - -17776, -17775, -17774, -17773, -17772, -17771, -17770, -17769, -17768, -17767, -17766, -17765, - -17764, -17763, -17762, -17761, -17760, -17759, -17758, -17757, -17756, -17755, -17754, -17753, - -17749, -17748, -17747, -17746, -17745, -17744, -17743, -17742, -17741, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, -17740, -17739, -17738, - -17737, 0, 0, 0, 0, 0, -17736, -17735, 0, 0, -17734, -17733, - -17732, 1, -17730, -17729, -17728, -17727, -17726, -17724, -17723, -17722, -17721, -17720, - -17719, -17718, -17716, -17714, -17713, -17712, -17708, -17706, -17703, -17702, -17700, -17699, - -17698, 0, -17697, -17696, -17692, 0, 0, 0, -17691, -17690, -17686, -17682, - 0, 0, 0, 0, -17681, 0, 0, 0, 0, 0, 0, 0, - 0, -17680, -17677, -17676, -17675, 0, 0, 0, -17674, 0, 0, 0, - 0, 0, 0, 0, 0, -17673, -17672, -17671, 0, -17670, -17669, -17668, - -17667, -17666, -17665, -17664, -17663, -17662, -17661, -17660, -17659, -17658, -17657, -17656, - -17655, -17654, -17653, -17652, -17651, -17650, -17649, -17648, -17647, -17646, -17645, -17644, - -17643, -17642, -17641, -17640, -17639, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -17638, -17637, -17636, -17635, 1, 1, -17634, - -17633, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -17632, -17631, -17630, -17629, 0, 0, 0, 0, 0, 0, 0, - 0, -17628, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -17627, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17626, -17625, - -17624, 0, -17623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17622, -17621, -17620, -17619, -17618, -17617, -17616, -17615, -17614, -17613, -17612, - -17611, -17610, -17609, -17608, -17607, -17606, -17605, -17604, -17603, -17602, -17601, -17600, - -17599, -17598, -17597, -17596, -17595, -17594, -17593, -17592, -17591, -17590, 0, 0, - 0, -17589, -17588, -17587, -17586, -17585, -17584, -17583, -17582, -17581, -17580, -17579, - -17578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17577, -17576, -17575, -17574, -17573, -17572, -17571, - -17570, -17569, -17568, -17567, -17566, -17565, -17564, -17563, -17562, -17561, -17560, -17559, - -17558, -17557, -17556, -17555, -17554, -17553, -17552, -17551, -17550, -17549, -17548, -17547, - -17546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17545, -17544, -17543, -17542, -17541, -17540, -17539, - -17538, 0, 0, -17537, -17536, 0, 0, 0, 0, -17535, -17534, -17533, - -17532, -17531, -17530, -17529, -17528, 0, 0, 0, -17527, 0, 0, 0, - 0, -17526, -17525, -17524, -17523, -17522, -17521, -17520, -17519, -17518, -17517, -17516, - -17515, -17514, -17513, -17512, -17511, -17510, 0, 0, 0, -17509, 1, 1, - -17508, -17507, 1, 1, 1, 1, 1, 1, 1, 1, -17506, -17505, - -17504, -17503, -17502, -17501, -17500, 0, 0, 0, 0, 0, 0, 0, - 0, -17499, -17498, -17497, -17496, -17495, -17494, -17493, -17492, -17491, -17490, -17489, - -17488, -17487, -17486, -17485, -17484, -17483, -17482, 0, 0, -17481, -17480, -17479, - -17478, -17477, -17476, -17475, -17474, -17473, -17472, -17471, -17470, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17469, -17468, -17467, -17466, -17465, -17464, -17463, - -17462, -17461, -17460, -17459, -17458, -17457, -17456, -17455, -17454, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17453, 0, 0, -17452, -17451, -17450, -17449, - -17448, -17447, -17446, -17445, -17444, -17443, -17442, -17441, -17440, 0, 0, 0, - 0, -17439, -17438, -17437, 0, -17436, -17435, -17434, -17433, -17432, 0, 0, - -17431, -17430, -17429, 0, -17428, -17427, -17426, -17425, 0, 0, 0, -17424, - -17423, 0, 0, -17422, 0, -17421, -17420, -17419, -17418, -17417, -17416, -17415, - -17414, -17413, -17412, 0, -17411, -17410, -17409, -17408, -17407, 0, 0, 0, - -17406, 0, 0, 0, 0, 0, 0, 0, 0, -17405, -17404, -17403, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17402, - -17401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17400, -17399, -17398, -17397, -17396, -17395, -17394, -17393, -17392, -17391, -17390, - -17389, -17388, 0, -17387, -17386, -17385, -17384, -17383, -17382, 0, -17381, -17380, - -17379, -17378, -17377, 0, -17376, -17375, 0, -17374, -17373, -17372, -17371, -17370, - -17369, -17368, -17367, -17366, -17365, -17364, -17363, -17362, -17361, -17360, -17359, -17358, - -17357, -17356, -17355, -17354, -17353, -17352, -17351, -17350, -17349, 0, 0, 0, - -17348, 0, 0, 0, 0, -17347, -17346, -17345, -17344, -17343, -17342, -17341, - -17340, -17339, -17338, -17337, -17336, 0, -17335, -17334, -17333, -17332, -17331, -17330, - -17329, -17328, -17327, -17326, -17325, -17324, -17323, -17322, -17321, -17320, -17319, -17318, - -17317, -17316, -17315, -17314, -17313, -17312, -17311, -17310, -17309, 0, 0, -17308, - -17307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -17306, 0, -17305, - -17304, -17303, -17302, -17301, -17300, -17299, -17298, -17297, -17296, -17295, -17294, -17293, - -17292, -17291, -17258, -17257, -17256, -17255, -17254, -17253, -17252, -17251, -17249, -17248, - -17247, -17246, -17234, -17230, -17229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -17223, -17204, -17202, - -17201, -17200, -17199, -17198, -17196, -17195, -17189, -17188, -17187, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17186, -17185, -17182, -17180, -17166, -17162, -17160, - -17159, -17158, -17157, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, -17156, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -17155, -17154, -17153, -17151, -17150, -17149, -17148, -17147, -17146, -17145, 0, - 0, 0, 0, 0, 0, -17144, -17143, -17142, -17141, -17140, -17139, -17138, - -17137, -17136, -17135, -17134, -17133, 0, -17132, -17131, -17130, 0, 0, 0, - 0, 0, 0, 0, 0, -17129, -17128, -17127, -17126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17125, - -17124, -17123, -17122, -17121, -17120, -17119, -17118, -17117, -17116, -17115, -17114, -17113, - -17112, -17111, -17110, -17109, -17108, -17107, -17106, -17105, -17104, -17103, -17102, -17101, - -17100, -17099, -17098, -17097, -17096, -17095, -17094, -17093, -17092, -17091, -17090, -17089, - -17088, -17087, -17086, -17085, -17084, -17083, -17082, -17081, -17080, -17079, -17078, -17077, - -17076, -17075, -17074, -17073, -17072, -17071, -17070, -17069, -17068, -17067, -17066, -17065, - -17064, -17063, -17062, -17061, -17060, -17059, -17058, -17057, -17056, -17054, -17053, -17052, - -17051, -17049, -17048, -17047, -17046, -17045, -17044, -17043, -17042, -17041, -17040, -17038, - -17037, -17036, -17035, -17034, -17033, -17032, -17031, -17030, -17029, -17028, -17027, -17025, - -17024, -17023, -17022, -17021, -17020, -17019, -17018, -17016, -17015, -17014, -17013, -17012, - -17011, -17010, -17009, -17008, -17007, -17006, -17004, -17002, -17000, 1, 1, 4, - 4, 1, 1, 12, 12, 20, 20, 16, 16, 24, 24, 24, - 24, 2, 2, 41, 42, 40, 43, 41, 42, 32, 48, 52, - 55, 56, 56, 56, 56, -16998, -16997, -16996, -16995, -16994, -16991, -16990, - -16985, -16984, -16983, -16981, -16980, -16979, -16977, -16973, -16970, 16, 16, 16, - 16, 25, 26, 28, 31, 19, 64, 64, 64, 64, 64, 64, - 64, 2, 2, 2, 2, 18, 18, 2, 1, -16969, -16967, 1, - 1, -16966, -16965, -16964, -16963, -16962, -16961, -16960, -16959, 1, -16958, 2, - 4, -16957, -16956, -16955, -16953, -16946, -16942, -16941, -16940, -16939, -16938, -16937, - -16936, -16935, -16934, -16933, -16932, -16931, -16930, -16929, -16928, -16927, -16926, -16925, - -16924, -16923, -16922, -16921, -16920, -16919, -16918, -16917, -16916, -16915, -16914, -16913, - -16912, -16911, -16910, -16909, -16908, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, -16907, -16906, -16905, -16904, -16903, -16902, -16901, -16900, -16899, - -16898, -16897, -16896, -16895, -16894, -16893, -16892, -16891, -16890, -16889, -16888, -16887, - -16886, -16885, -16884, -16883, -16882, 0, 0, 0, -16881, 0, 0, 0, - 0, 0, 0, 0, 0, -16880, -16879, -16878, -16877, -16876, -16875, -16874, - -16873, -16872, -16871, -16870, -16869, -16868, -16867, -16866, -16865, -16864, -16863, -16862, - -16861, -16860, -16859, -16858, -16857, 0, 0, -16856, -16855, 0, 0, 0, - 0, 0, 0, 0, 0, -16854, 0, 0, 0, 0, -16853, -16852, - -16851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -16850, -16849, -16848, - -16847, -16846, -16845, -16844, -16843, 0, 0, -16842, -16841, 0, 0, 0, - 0, -16839, -16838, -16837, -16836, -16835, -16833, -16830, -16829, -16828, -16826, -16825, - -16824, -16823, -16822, -16821, -16820, -16819, -16818, -16817, -16816, -16815, -16814, -16813, - -16812, -16811, -16810, -16809, -16806, 0, 0, 0, 0, 0, -16805, -16803, - -16799, -16782, 0, -16781, -16780, -16778, 0, 0, 0, 0, 0, 0, - 0, 0, -16776, -16775, -16773, -16772, -16769, -16768, -16767, -16766, -16764, -16763, - -16762, -16761, -16760, -16759, -16758, -16757, -16756, -16755, -16754, -16752, 0, -16751, - -16750, -16749, -16748, -16747, -16746, -16745, 0, -16744, -16743, -16742, -16740, -16739, - -16738, -16737, 0, -16736, -16735, -16734, -16733, -16732, -16731, -16730, 0, -16729, - -16728, -16727, -16726, -16725, -16724, -16723, 0, -16722, -16721, -16720, -16719, -16718, - -16717, -16716, 0, -16715, -16714, 1, 1, 1, 1, 1, -16713, 1, - 1, 1, 1, 1, 1, 1, -16712, 1, 1, 1, -16711, -16710, - -16709, -16708, -16707, -16706, -16705, -16704, -16703, -16702, -16701, -16700, -16699, -16698, - -16697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -16696, 1, 1, 1, 1, 1, 1, - 1, -16695, 1, 1, 1, -16694, -16693, -16692, -16691, -16690, -16689, -16688, - -16687, -16686, -16685, -16684, -16683, -16682, -16681, -16680, -16679, -16678, -16677, -16676, - -16675, 1, 1, 1, 1, 1, 1, 1, 1, -16674, -16673, 1, - 1, -16672, -16671, -16670, -16669, -16668, -16667, -16666, -16665, -16664, -16663, 0, - -16662, -16661, 0, 0, 0, 0, 0, 0, -16660, 0, -16659, -16658, - -16657, -16656, -16655, -16654, -16653, -16652, -16651, -16634, -16631, -16606, -16602, -16601, - -16598, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, -16597, -16596, -16595, -16594, -16593, -16592, - -16591, -16590, -16589, -16588, -16587, -16586, -16585, -16584, -16583, 0, -16582, -16581, - -16580, -16579, -16578, -16577, -16576, -16575, 0, 0, 0, 0, 0, 0, - 0, -16574, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -16573, -16572, 1, 1, -16571, -16570, -16569, -16568, -16567, -16566, -16565, - -16564, -16563, -16562, -16561, 1, -16560, -16559, -16558, -16557, -16556, -16555, -16554, - -16553, -16552, -16551, -16550, -16549, -16548, -16547, -16546, -16545, -16544, -16543, -16542, - -16541, -16540, -16539, -16538, -16537, -16536, -16535, -16534, -16533, -16532, -16531, -16530, - -16529, -16528, -16527, -16526, -16525, -16524, -16523, -16522, -16521, -16520, -16519, -16518, - -16517, -16516, -16515, -16514, -16513, -16512, -16511, -16510, -16509, -16508, -16507, -16506, - -16497, -16496, -16495, -16494, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -16493, 0, -16492, -16491, -16490, -16489, 0, 0, - 0, -16486, -16483, 0, 0, 0, 0, -16482, -16481, -16480, -16479, -16477, - -16476, -16475, -16471, -16470, -16469, -16468, -16466, -16465, -16464, -16463, -16462, -16461, - -16460, -16459, -16442, -16437, -16435, -16417, -16408, -16394, -16393, -16392, -16391, -16390, - -16389, -16388, -16387, -16386, -16385, -16384, -16383, -16382, -16381, -16380, -16379, -16378, - -16377, -16376, -16375, -16374, -16373, -16372, -16371, -16370, -16369, -16367, -16366, -16365, - -16364, -16363, -16362, -16361, -16360, -16359, -16358, -16357, -16356, -16355, 0, -16354, - -16353, -16352, -16351, -16350, -16349, -16348, -16347, -16346, -16345, -16344, -16343, -16342, - -16339, -16334, 0, -16330, -16329, -16328, -16327, -16326, -16325, -16324, -16323, -16322, - -16321, -16320, -16319, -16318, -16317, -16316, -16315, -16314, -16313, -16312, -16311, -16310, - -16309, -16308, -16307, -16306, -16305, -16304, -16303, -16302, -16301, -16300, -16299, -16298, - 0, 0, -16297, -16296, -16295, -16294, -16293, -16292, -16291, -16290, -16289, -16288, - -16287, -16286, -16285, -16284, -16283, -16282, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -16281, -16280, -16279, - -16278, -16277, -16276, -16275, -16274, -16273, -16272, -16271, -16270, -16269, -16268, -16267, - -16266, -16265, -16264, -16263, -16262, -16261, -16260, -16259, -16258, -16257, -16256, -16255, - -16254, -16253, -16252, -16251, -16250, -16249, -16248, -16247, -16246, -16245, -16244, -16243, - -16242, -16241, -16240, -16239, -16238, -16237, -16236, -16235, -16234, -16233, -16232, -16231, - -16230, -16229, -16228, -16227, -16226, -16225, -16224, -16223, -16222, -16221, -16220, -16219, - -16218, 0, -16217, -16216, -16215, 0, 0, 0, 0, 0, 0, 0, - 0, -16214, 0, 0, 0, -16213, -16212, -16211, -16210, -16209, -16208, -16207, - -16206, -16205, -16204, -16203, -16190, -16185, -16182, -16181, -16179, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -16178, -16177, -16176, -16175, -16173, -16172, - -16171, -16170, -16169, -16168, -16167, -16166, -16165, -16164, -16163, -16162, -16161, -16160, - -16159, -16157, -16155, -16140, -16138, -16135, -16134, -16133, -16131, -16127, -16124, -16122, - -16121, -16120, -16119, -16118, -16117, -16116, -16115, -16114, -16113, -16112, -16111, -16110, - -16109, -16108, -16107, -16106, -16105, -16104, -16103, -16102, -16101, -16100, -16099, -16098, - -16097, -16095, -16094, -16093, -16092, -16091, -16090, -16089, -16088, -16087, -16086, -16084, - -16083, -16082, -16081, -16080, -16079, -16078, -16077, -16076, -16075, -16059, -16053, -16049, - -16048, -16047, -16045, -16044, -16043, -16042, -16038, -16037, -16036, -16035, -16031, -16030, - -16028, -16025, -16024, -16023, -16020, -16019, -16018, -16017, -16014, -16010, -16009, -16008, - -16007, -16006, -16005, -16004, -16003, -16002, -16001, -16000, -15999, -15998, -15997, -15996, - -15995, -15994, -15993, -15992, -15991, -15990, -15989, -15988, -15987, -15986, -15985, -15984, - -15983, -15982, -15981, -15980, -15979, -15978, -15977, -15976, -15975, -15974, -15973, -15972, - -15971, -15970, -15969, -15968, -15967, -15966, -15965, -15964, -15963, -15962, -15961, -15960, - -15959, -15958, -15957, -15956, -15955, -15954, -15953, -15952, -15951, -15950, -15949, -15948, - -15947, -15946, -15945, -15944, -15943, -15942, -15941, -15940, -15939, -15938, -15937, -15936, - -15935, -15934, -15933, -15932, -15931, -15930, -15929, -15928, -15926, -15925, -15924, -15923, - -15922, -15921, -15920, -15919, -15918, -15917, -15916, -15915, -15914, -15913, -15912, -15911, - -15910, -15909, -15908, -15907, -15906, -15905, -15904, -15903, -15902, -15901, -15900, -15899, - -15897, -15896, -15895, -15894, -15893, -15892, -15891, -15890, -15889, -15888, -15887, -15886, - -15885, -15884, -15883, -15882, -15880, -15879, -15878, -15877, -15876, -15874, -15873, -15872, - -15871, -15870, 2, 1, -15869, -15868, -15867, -15866, 1, 1, -15865, -15864, - -15863, -15862, -15861, -15860, -15859, -15858, 1, 2, 4, 1, 1, 2, - 6, 8, 1, 3, 4, 15, -15857, 5, 3, 4, 1, 3, - 4, 16, 1, 1, 5, 7, -15856, 3, 3, 12, -15855, -15854, - -15853, -15852, 1, 1, 4, 1, 1, 1, 1, 8, 1, 1, - 1, 1, 1, 3, 16, 16, -15851, -15849, -15847, -15843, -15842, -15841, - -15840, -15839, -15838, -15835, -15834, -15833, -15832, -15831, -15830, -15829, -15828, -15827, - -15826, -15825, -15824, -15823, -15822, -15821, -15820, -15819, -15818, -15817, -15816, -15815, - -15814, 1, 1, 1, 1, 1, 8, 8, 3, 12, 1, 1, - 5, 1, 16, 16, 17, 24, -15813, -15812, -15811, -15810, -15809, -15808, - -15807, -15806, -15805, -15804, -15803, -15798, -15797, -15796, -15794, -15793, 6, 6, - 8, 8, 4, 4, 4, 4, 4, 4, 5, 41, 4, 4, - 24, 1, 2, 2, 6, 6, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 79, 1, 75, 1, 81, -15792, 89, - 147, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, - 13, 14, 5, 32, 2, 33, 40, 32, 46, 137, 21, 29, - 5, 60, 7, 119, 146, 1, 144, 144, 144, 2, 2, 56, - 84, 154, 16, 116, 118, 130, 132, 147, 181, 191, 9, 158, - 209, 211, 240, 240, 256, 4, 4, 17, 69, 22, 261, 83, - 8, 6, 149, 257, 272, 148, 92, 272, 268, -15791, 57, 207, - 9, 211, -15790, -15789, -15788, -15787, -15786, -15785, -15784, 52, 52, 58, - 52, -15782, -15781, -15780, -15779, -15778, 1, 1, 4, 1, 3, 10, - 16, 16, 12, 1, 15, 2, 1, 1, 4, 177, 206, 265, - 282, 299, 304, 304, 308, 304, 307, 312, 314, 316, 258, 272, - 274, 272, 275, 280, 282, 274, 272, 274, 272, 303, 306, 274, - 317, -15776, -15775, -15774, -15773, -15772, -15771, -15770, -15769, -15768, -15767, -15766, - -15765, -15764, -15763, -15762, -15761, -15760, -15759, -15758, -15757, -15756, -15755, -15754, - -15753, -15752, 0, -15751, -15750, -15749, -15748, 0, 0, 0, -15747, -15746, - -15745, -15744, -15743, -15742, -15741, -15740, -15739, -15738, -15737, -15736, -15735, -15734, - -15733, -15732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 96, - -15731, -15730, -15729, -15728, -15727, -15726, -15725, -15724, -15723, -15722, -15721, -15720, - -15719, -15718, -15717, -15716, -15715, -15714, -15713, 73, 82, 97, -15712, -15711, - -15710, 67, 113, 114, 112, -15709, -15708, -15707, -15706, -15705, 0, 0, - -15704, -15703, 0, 0, 0, 0, -15701, -15700, -15699, -15698, 1, 1, - 9, 34, 35, 38, 49, 50, 49, 57, 56, 1, 4, 8, - 8, 22, 8, 8, 14, 16, 16, 20, 22, 4, 23, 44, - 24, 32, 2, 2, 15, 128, 128, 128, 128, 128, -15697, 128, - 128, 128, 128, 128, 128, -15696, -15694, -15693, 2, -15691, 3, 6, - 4, 128, 128, 128, 128, 128, -15690, -15689, -15688, 128, 4, 4, - 11, -15687, 8, -15686, 16, 2, 20, 1, 65, 67, 65, 2, - 68, 6, 110, 128, 128, 128, -15685, -15684, -15683, 0, 0, -15682, - -15681, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15680, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15678, -15674, - -15673, -15672, -15671, -15670, -15669, -15668, -15667, -15666, -15665, 9, 11, 47, - 16, 48, -15664, -15663, -15662, -15661, -15660, -15659, -15658, -15657, -15656, -15655, - -15654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15653, -15652, - -15651, -15650, -15649, -15648, -15647, -15646, -15645, -15644, -15643, -15642, 0, 0, - -15641, -15640, -15639, -15638, -15637, -15636, -15635, -15634, -15633, -15632, -15631, -15630, - -15629, -15628, -15627, -15622, -15618, -15616, -15614, -15613, -15612, -15610, -15609, -15597, - -15596, -15595, -15594, -15593, -15592, -15591, -15590, -15589, -15588, -15587, -15586, -15585, - -15584, -15583, -15582, -15581, -15580, -15579, 0, 0, 0, -15574, 0, 0, - 0, 0, -15573, -15572, -15570, -15569, -15568, -15567, -15566, -15565, -15564, -15563, - -15562, 48, 53, 151, 60, 146, 164, 56, 167, 13, 7, 148, - 96, 100, 160, 153, 164, 221, -15561, 325, 325, 241, 188, 184, - 189, 190, 338, -15560, 341, 322, 341, 358, 347, -15558, -15557, -15556, - -15555, -15548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15547, -15546, -15543, -15542, -15541, 322, 322, 334, 334, 336, 336, - 336, -15540, -15538, -15537, 336, 135, 67, 79, 96, 126, 152, 152, - 156, 166, -15536, -15535, 186, 168, -15533, -15532, -15531, 0, -15530, -15529, - 3, 0, -15528, -15527, -15526, -15525, -15524, -15523, -15522, -15521, -15520, -15519, - -15518, 248, -15517, 0, 0, -15516, -15515, -15514, -15513, -15512, -15511, -15510, - -15509, -15508, -15507, -15506, -15505, -15504, -15503, -15502, -15501, -15500, -15499, -15494, - -15493, -15492, -15490, -15486, -15482, 0, 0, 0, -15476, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15474, -15472, - -15469, -15467, -15466, -15464, -15463, -15434, 0, 0, -15433, -15432, 0, 0, - 0, 0, -15430, -15429, -15427, 0, -15426, -15425, -15422, -15421, -15420, -15419, - -15416, -15414, -15401, -15399, -15397, -15390, 0, 0, 0, 0, 0, 0, - 0, 0, -15386, -15385, -15384, -15383, -15382, -15381, -15380, -15379, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -15378, -15377, -15376, -15375, -15374, -15373, -15372, - -15371, -15241, -15240, -15239, -15238, -15198, -15197, -15196, -15195, -15188, -15187, -15185, - -15178, -15177, -15176, -15175, -15174, -15173, -15172, -15171, -15170, -15169, -15168, -15167, - -15166, -15165, -15164, -15163, -15162, -15161, -15160, -15159, -15158, -15157, -15156, -15155, - -15154, -15153, -15152, -15151, -15150, -15149, -15148, -15147, -15146, -15145, -15144, -15143, - -15142, -15141, -15140, -15139, -15138, -15137, -15136, -15135, -15134, -15133, -15132, -15131, - -15130, -15129, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 64, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, -15128, -15127, -15126, 2, -15125, 1, - 2, 2, 1, 1, 2, 8, 10, -15124, -15123, 2, 2, 8, - 31, 2, -15122, 5, 29, 1, 32, 32, 32, 1, 1, -15121, - -15120, -15119, 1, -15118, -15117, -15116, -15115, -15114, -15113, -15112, -15111, -15110, - -15109, -15108, -15107, -15106, -15105, -15104, -15103, -15102, -15101, -15100, -15099, -15098, - -15097, -15096, -15095, -15094, -15093, -15092, -15091, -15090, -15089, -15088, -15087, -15086, - -15085, -15084, -15083, -15082, -15080, -15079, -15078, -15077, -15076, -15075, -15074, -15073, - -15072, -15071, -15070, -15069, -15068, -15067, -15066, -15065, -15064, -15063, -15062, -15061, - -15060, -15059, -15058, -15057, -15056, -15054, -15053, -15052, -15051, -15050, -15049, -15048, - -15047, -15046, -15045, -15044, -15043, -15042, -15041, -15040, -15039, -15038, -15037, -15036, - -15035, -15034, -15033, -15032, -15031, -15030, -15029, -15028, -15027, -15026, -15025, -15024, - -15023, -15022, -15021, -15020, -15018, -15016, -15015, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 24, - 24, 28, 28, 25, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 150, 160, 160, 160, 128, 128, 133, - 134, 128, 131, 136, 136, 128, 132, 192, 192, 144, 192, 219, - 221, 192, 208, 202, 226, 208, 237, -15013, -15011, -15010, 222, 224, - 224, 233, 234, 232, 235, 2, 4, -15009, 8, 56, 59, -15008, - -15007, -15006, -15005, -15004, -15003, -15002, -15001, -15000, -14999, -14998, -14997, -14995, - -14994, -14993, -14992, -14987, -14986, -14975, -14973, -14972, -14970, -14967, -14925, -14924, - -14923, -14922, -14921, -14920, -14919, -14918, -14917, -14916, -14915, -14914, -14913, -14912, - -14911, -14910, -14909, -14908, -14907, -14906, -14905, -14904, -14903, -14902, -14900, -14899, - -14898, -14897, -14896, -14895, -14894, -14893, -14892, -14891, -14890, -14889, -14888, -14887, - -14886, -14885, -14884, -14883, -14882, -14881, -14880, -14879, -14878, -14877, -14875, -14874, - -14873, -14872, -14871, -14870, -14869, -14868, -14867, -14866, -14865, -14864, -14863, -14862, - -14861, -14860, -14859, -14858, -14857, -14856, -14855, -14854, -14853, -14852, -14851, -14850, - -14849, -14848, -14847, -14846, -14845, -14844, -14843, -14842, -14841, -14840, -14839, -14838, - -14837, -14836, -14835, -14834, -14833, -14832, -14831, -14830, -13567, -13566, -13529, -13528, - -13527, -13526, -13525, -13524, -13523, -13522, -13521, -13520, -13519, 0, 0, -13518, - -13517, 0, 0, 0, 0, -13516, -13515, -13514, -13513, -13512, -13511, -13510, - -13509, -13508, -13507, -13506, -13505, -13504, -13503, -13502, -13501, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -13500, -13499, -13498, - -13497, -13496, -13495, -13494, -13493, -13492, -13491, -13490, -13489, -13488, -13487, -13486, - -13485, -13484, -13483, -13482, -13481, -13480, -13479, -13478, -13477, -13476, -13475, -13474, - -13473, -13469, -13468, 5, 13, 1, 1, 4, 1, 1, 1, 1, - 4, 1, 1, 4, 16, 1, 1, 1, 4, 1, 1, 4, - 1, 1, 1, 1, 38, 1, 1, 4, 1, 1, 1, 1, - 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 60, 76, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, - 1, 8, 8, 1, 1, 1, 1, 1, 1, 55, 95, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, - 8, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, - 48, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 16, 1, 3, 16, 30, 1, 1, 2, 6, - 1, 1, 2, 14, 1, 1, 2, 6, 46, 3, 438, 658, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 4, 4, 1, 1, 8, 8, 1, - 1, 1, 1, 1, 1, 32, 48, 96, 96, 10, 16, 22, - 96, 96, 96, 96, 101, 96, 96, 97, 112, 96, 96, 96, - 96, 100, 100, 96, 96, 104, 104, 96, 96, 96, 96, 96, - 552, 124, 124, 68, 557, 519, 520, 522, 525, 557, 558, 556, - 577, 600, 768, 768, 768, 768, 768, 768, 768, 769, 772, 768, - 768, 768, 776, 768, 768, 768, 768, 768, 768, 768, 789, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, -13467, -13464, -13463, - -13462, -13461, -13460, -13459, -13458, -13457, -13456, -13455, -13454, -13453, -13450, -13448, - -13447, -13446, -13444, -13443, -13442, -13441, -13440, -13439, -13438, -13437, -13436, -13435, - -13434, -13433, -13430, -13429, -13428, -13427, -13422, -13420, -13419, -13418, -13416, -13415, - -13413, -13412, -13411, -13409, -13407, -13402, -13400, -13396, -13394, -13392, -13391, -13390, - -13389, -13388, -13387, -13386, -13385, -13384, -13383, -13382, -13381, -13380, -13379, -13378, - -13377, -13367, -13364, -13363, -13361, -13356, -13355, -13354, -13352, -13349, -13347, -13344, - -13343, -13342, -13341, -13340, -13339, -13338, -13337, -13336, -13335, -13334, -13333, -13332, - -13331, -13330, -13329, -13328, 92, 94, 283, 289, 933, 935, 939, 941, - 947, 952, 952, 952, 952, 1051, 1017, 952, -13327, -13326, -13325, -13324, - -13323, -13322, -13321, -13320, -13319, -13318, -13317, -13316, -13315, -13314, -13313, -12052, - 1012, 1016, 1015, 915, 918, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 514, 1, 1, 1, - 1, 515, 517, 514, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 16, -12051, -12050, -12049, -12048, - 1, 1, 1, 1, 24, 1, 1, 1, 1, 1, 15, 35, - 57, 3, 4, 2, -12047, -12046, -12045, -12044, -12043, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -12042, -12041, -12040, -12039, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -12038, -12037, -12036, -12035, -12034, -12033, -12032, -12031, -12030, -12029, -12028, - -12027, -12026, -12025, -12024, -12023, -12022, -12021, -12020, -12019, -12018, -12017, -12016, - -12015, -12014, -12013, -12012, -12011, -12010, -12009, -12008, -12007, -12006, -12005, -12004, - -12003, -12002, -12001, -12000, -11999, -11998, -11997, -11996, -11995, -11994, -11993, -11992, - -11991, -11990, -11989, -11988, -11987, -11986, -11985, -11984, -11983, -11982, -11981, -11980, - -11979, -11978, -11977, -11976, -11975, -11974, -11973, -11972, -11971, -11970, -11969, -11968, - -11967, -11966, -11965, -11964, -11963, -11962, -11961, -11960, -11959, -11958, -11957, -11956, - -11955, -11954, -11953, -11952, -11951, -11950, -11949, -11948, -11947, -11946, -11945, -11944, - -11943, -11942, -11941, -11940, -11939, -11938, -11937, -11936, -11935, -11934, -11933, -11932, - -11931, -11930, -11929, -11928, -11927, -11926, -11925, -11924, -11923, -11922, -11921, -11920, - -11919, -11918, -11917, -11916, -11915, -11914, -11913, -11912, -11911, -11910, -11909, -11908, - -11907, -11906, -11905, -11904, -11903, -11902, -11901, -11900, -11899, -11898, -11897, -11896, - -11895, -11894, -11893, -11892, -11891, -11890, -11889, -11888, -11887, -11886, -11885, -11884, - -11883, -11882, -11881, -11880, -11879, -11878, -11877, -11876, -11875, -11874, -11873, -11872, - -11871, -11870, -11869, -11868, -11867, -11866, -11865, -11864, -11863, -11862, -11861, -11860, - -11859, -11858, -11857, -11856, -11855, -11854, -11853, -11852, -11851, -11850, -11849, -11848, - -11847, -11846, -11845, -11844, -11843, -11842, -11841, -11840, -11839, -11838, -11837, -11836, - -11835, -11834, -11833, -11832, -11831, -11830, -11829, -11828, -11827, -11826, -11825, -11824, - -11823, -11822, -11821, -11820, -11819, -11818, -11817, -11816, -11815, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -11814, -11813, -11812, -11811, -11810, -11809, -11808, -11807, -11806, -11805, -11804, - -11803, 0, -11802, -11801, -11800, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11799, - -11798, -11797, -11796, -11795, -11794, -11793, -11792, -11791, -11790, -11789, -11788, 0, - 0, -11787, -11786, -11785, -11784, -11783, -11782, -11781, -11780, -11779, -11778, -11777, - -11776, -11775, -11774, -11773, -11772, -11771, -11770, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -11769, -11768, -11767, - -11766, -11765, -11764, -11763, -11762, -11761, -11760, -11759, -11758, -11757, -11756, -11755, - -11754, -11753, -11752, -11751, -11750, -11749, -11748, -11747, -11746, -11745, -11744, -11743, - -11741, -11740, -11739, -11738, -11737, -11736, -11735, -11734, -11733, -11732, -11731, -11730, - -11729, -11727, -11719, -11712, -11711, -11710, -11709, -11708, -11707, -11706, -11705, -11704, - -11703, -11702, -11701, -11700, -11699, -11698, -11697, -11696, -11695, -11694, -11693, -11692, - -11691, -11690, -11689, -11688, -11687, -11686, -11685, -11684, -11683, -11682, -11681, -11680, - -11679, -11678, -11677, -11676, -11675, -11674, -11673, -11672, -11671, -11670, -11669, -11668, - -11667, -11666, -11665, -11664, -11663, -11662, -11661, -11660, -11659, -11658, -11657, -11656, - -11655, -11654, -11653, -11652, -11651, -11650, -11649, -11648, -11647, -11646, -11645, -11644, - -11643, -11642, -11641, -11640, -11639, -11638, -11637, -11636, -11635, -11634, -11633, -11632, - -11631, -11630, -11629, -11628, -11627, -11626, -11625, -11624, -11623, -11622, -11621, -11620, - -11619, -11618, -11617, -11616, -11615, -11613, -11612, -11611, -11610, -11609, -11608, -11607, - -11606, -11605, -11604, -11603, -11602, -11601, -11584, -11583, -11582, -11581, -11579, -11578, - -11574, -11568, -11567, -11566, -11565, -11564, -11563, -11562, -11561, -11560, -11559, -11558, - -11557, -11556, -11555, -11554, -11553, -11552, -11551, -11550, -11549, -11546, -11542, -11536, - -11535, -11533, -11532, -11531, -11530, -11529, -11528, -11527, -11526, -11525, -11524, -11523, - -11522, -11521, -11520, -11519, -11518, -11517, -11516, -11515, -11514, -11513, -11512, -11511, - -11510, -11509, -11508, -11507, -11506, -11505, -11504, -11503, -11502, -11501, -11500, -11499, - -11498, -11497, -11496, -11495, -11494, -11493, -11492, -11491, -11490, -11489, -11488, -11487, - -11486, -11485, -11484, -11483, -11482, -11481, -11480, -11479, -11478, -11477, -11476, -11475, - -11474, -11473, -11472, -11471, -11470, -11469, -11468, -11467, -11466, -11465, -11464, -11463, - -11462, -11461, -11460, -11459, -11458, -11457, -11456, -11455, -11454, -11453, -11452, -11451, - -11450, -11449, -11448, -11447, -11446, -11444, -11443, -11442, -11441, -11440, -11439, -11438, - -11437, -11436, -11435, -11434, -11433, -11432, -11431, -11430, -11429, -11428, -11427, -11426, - -11425, -11408, -11407, -11406, -11405, -11403, -11402, -11398, -11392, -11391, -11390, -11389, - -11388, -11387, -11386, -11385, -11384, -11383, -11382, -11381, -11380, -11379, -11378, -11377, - -11376, -11375, -11374, -11373, -11372, -11371, -11370, -11369, -11368, -11367, -11366, -11365, - -11364, -11363, -11362, -11361, -11360, -11359, -11358, -11357, -11356, -11355, -11354, -11353, - -11352, -11351, -11350, -11349, -11348, -11347, -11346, -11345, -11344, -11343, -11342, -11341, - -11340, -11339, -11338, -11337, -11336, -11335, -11334, -11333, -11332, -11331, -11330, -11329, - -11328, -11327, -11326, -11325, -11324, -11323, -11322, -11321, -11320, -11319, -11318, -11317, - -11316, -11315, -11314, -11313, -11312, -11311, -11310, -11309, -11308, -11307, -11306, -11305, - -11304, -11303, -11302, -11301, -11300, -11299, -11298, -11297, -11296, -11295, -11294, -11293, - -11292, -11291, -11290, -11279, -11278, -11277, -11276, -11275, -11274, -11273, -11272, -11271, - -11270, -11269, -11268, -11267, -11266, -11265, -11264, -11263, -11262, -11261, -11260, -11258, - -11250, -11247, -11239, -11231, -11230, -11229, -11228, -11227, -11226, -11225, -11224, -11223, - -11222, -11221, -11220, -11219, -11217, -11216, -11215, -11214, -11213, -11212, -11211, -11210, - -11209, -11208, -11207, -11206, -11205, -11204, -11203, -11202, -11201, -11200, -11199, -11198, - -11197, -11196, -11195, -11194, -11193, -11192, -11191, -11190, -11189, -11188, -11187, -11186, - -11185, -11184, -11183, -11182, -11181, -11180, -11179, -11178, -11167, -11166, -11165, -11164, - -11163, -11162, -11161, -11160, -11159, -11158, -11156, -11155, -11154, -11153, -11152, -11151, - -11150, -11149, -11148, -11147, -11146, -11145, -11144, -11143, -11142, -11141, -11140, -11139, - -11138, -11137, -11136, -11122, -11103, -11102, -11101, -11100, -11099, -11098, -11097, -11096, - -11095, -11094, -11093, -11092, -11091, -11089, -11088, -11087, -11086, -11085, -11084, -11083, - -11082, -11081, -11080, -11079, -11078, -11077, -11076, -11075, -11074, -11073, -11072, -11071, - -11070, -11069, -11068, -11067, -11066, -11065, -11064, -11063, -11062, -11061, -11060, -11059, - -11058, -11057, -11056, -11055, -11054, -11053, -11052, -11051, -11050, -11049, -11048, -11047, - -11046, -11045, -11044, -11043, -11042, -11041, -11040, -11039, -11038, -11037, -11036, -11035, - -11034, -11033, -11032, -11031, -11030, -11029, -11028, -11027, -11026, -11025, -11024, -11023, - -11022, -11021, -11020, -11019, -11018, -11017, -11016, -11015, -11014, -11013, -11012, -11011, - -11010, -11009, -11008, -11007, -11006, -11005, -11004, -11003, -11002, -11001, -11000, -10999, - -10998, -10997, -10996, -10995, -10994, -10993, -10992, -10987, -10986, -10983, -10982, -10981, - -10980, -10979, -10978, -10977, -10976, -10964, -10959, -10958, -10957, -10956, -10955, -10954, - -10953, -10952, -10951, -10950, -10949, -10948, -10947, -10946, -10945, -10944, -10943, -10942, - -10941, -10940, -10939, -10938, -10937, -10936, -10935, -10934, -10933, -10932, -10931, -10930, - -10929, -10928, -10927, -10926, -10925, -10924, -10923, -10922, -10921, -10920, -10919, -10918, - -10917, -10916, -10915, -10914, -10913, -10912, -10911, -10910, -10909, -10908, -10907, -10906, - -10905, -10904, -10903, -10902, -10901, -10900, -10899, -10898, -10897, -10896, -10895, -10894, - -10893, -10892, -10891, -10890, -10889, -10888, -10887, -10886, -10885, -10884, -10883, -10882, - -10881, -10880, -10879, -10878, -10877, -10876, -10875, -10874, -10873, -10872, -10871, -10870, - -10869, -10868, -10867, -10866, -10865, -10864, -10863, -10862, -10861, -10860, -10859, -10858, - -10857, -10856, -10855, -10854, -10853, -10852, -10851, -10850, -10849, -10848, -10847, -10846, - -10845, -10844, -10843, -10842, -10841, -10840, -10839, -10838, -10837, -10836, -10835, -10834, - -10833, -10832, -10831, -10830, -10829, -10828, -10827, -10826, -10825, -10824, -10823, -10822, - -10821, -10820, -10819, -10818, -10817, -10816, -10811, -10807, -10806, -10805, -10804, -10803, - -10802, -10801, -10800, -10799, -10798, -10797, -10796, -10795, -10794, -10790, -10788, -10783, - -10782, -10781, -10780, -10779, -10778, -10777, -10776, -10771, -10770, -10769, -10703, -10702, - -10701, -10700, -10699, -10698, -10695, -10694, -10693, -10692, -10689, -10688, -10683, -10682, - -10681, -10680, -10679, -10678, -10677, -10676, -10675, -10674, -10673, -10672, -10671, -10670, - -10669, -10668, -10667, -10666, -10665, -10664, -10663, -10662, -10661, -10660, -10659, -10658, - -10657, -10656, -10655, -10654, -10653, -10652, -10651, -10650, -10649, -10648, -10647, -10646, - -10645, -10644, -10643, -10642, -10641, -10640, -10639, -10638, -10637, -10636, -10635, -10634, - -10633, -10632, -10631, -10630, -10629, -10628, -10627, -10626, -10625, -10624, -10623, -10622, - -10621, -10620, -10619, -10618, -10617, -10616, -10615, -10614, -10613, -10612, -10611, -10610, - -10609, -10608, -10607, -10606, -10605, -10604, -10601, -10600, -10591, -10590, -10589, -10588, - -10587, -10586, -10585, -10584, -10583, -10581, -10580, -10579, -10578, -10577, -10576, -10575, - -10574, -10573, -10572, -10571, -10570, -10553, -10552, -10550, -10549, -10547, -10545, -10544, - -10543, -10542, -10539, -10538, -10537, -10536, -10535, -10534, -10533, -10532, -10531, -10530, - -10529, -10528, -10527, -10526, -10525, -10524, -10523, -10522, -10518, -10489, -10488, -10487, - -10486, -10485, -10484, -10483, -10482, -10479, -10478, -10477, -10476, -10475, -10474, -10471, - -10470, -10469, -10468, -10465, -10464, -10463, -10462, -10459, -10458, -10457, -10456, -10455, - -10454, -10453, -10452, -10451, -10450, -10449, -10448, -10447, -10446, -10445, -10444, -10443, - -10442, -10441, -10440, -10439, -10438, -10437, -10436, -10435, -10434, -10433, -10432, -10431, - -10430, -10429, -10428, -10427, -10426, -10425, -10424, -10423, -10422, -10421, -10420, -10419, - -10418, -10417, -10416, -10415, -10414, -10413, -10412, -10411, -10410, -10409, -10408, -10407, - -10406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -10405, -10404, -10403, -10402, -10401, -10400, -10399, -10398, -10397, -10396, -10395, - -10394, -10393, -10392, -10391, -10390, -10389, -10388, -10387, -10386, -10385, -10384, -10383, - -10382, -10381, -10380, -10379, -10378, -10377, -10376, -10375, -10374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -10373, -10372, -10371, -10370, -10369, -10368, -10367, -10366, -10365, -10364, -10363, - -10362, 0, -10361, -10360, -10359, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -10358, -10357, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10356, - -10355, -10354, -10353, -10352, -10351, -10350, -10349, -10348, -10347, -10346, -10345, -10344, - -10343, -10342, -10341, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -10340, -10339, -10338, -10337, -10336, - -10335, -10334, -10333, -10332, -10331, -10330, -10329, -10328, -10327, -10326, -10325, -10324, - -10323, -10322, -10321, -10320, -10319, -10317, -10316, -10315, -10314, -10313, -10312, -10311, - -10310, -10309, -10308, -10307, -10306, -10305, -10304, -10303, -10302, -10301, -10300, -10299, - -10298, -10297, -10296, -10295, -10294, -10293, -10292, -10291, -10290, -10289, -10288, -10287, - -10286, -10285, -10284, -10283, -10282, -10281, -10280, -10279, -10278, -10277, -10276, -10275, - -10274, -10273, -10272, -10271, -10270, -10269, -10268, -10267, -10266, -10265, -10264, -10263, - -10262, -10261, -10260, -10259, -10258, -10257, -10256, -10255, -10254, -10253, -10252, -10251, - -10250, -10249, -10248, -10247, -10246, -10245, -10244, -10243, -10242, -10241, -10240, -10239, - -10238, -10237, -10236, -10235, -10234, -10233, -10232, -10231, -10230, -10229, -10228, -10227, - -10226, -10225, -10224, -10223, -10222, -10221, -10220, -10219, -10218, -10217, -10216, -10215, - -10214, -10213, -10212, -10211, -10210, -10209, -10208, -10207, -10206, 0, -10205, -10204, - -10203, -10202, -10201, -10200, -10199, 0, -10198, -10197, -10195, -10194, -10193, -10192, - 0, -10191, -10190, 0, -10189, -10188, -10187, -10186, -10185, -10184, 0, -10183, - -10182, -10181, -10180, -10179, -10178, -10177, -10176, -10175, 0, -10174, -10173, 0, - -10171, -10170, -10169, -10168, -10167, -10165, -10164, -10162, -10161, -10160, -10159, -10158, - -10157, -10156, -10155, -10154, -10153, -10152, -10151, -10150, -10149, 0, -10148, -10147, - -10146, -10145, -10144, -10143, -10142, -10141, -10140, -10139, -10138, -10137, -10136, -10135, - -10134, -10133, -10130, 0, -10126, 0, -10102, -10101, -10100, 0, 0, -10099, - -10098, -10097, -10096, -10095, -10094, -10093, -10092, -10091, -10090, -10089, -10088, -10087, - -10086, -10085, -10084, -10083, -10082, -10081, -10080, -10079, -10078, -10077, -10076, -10075, - -10074, -10073, -10072, -10071, -10070, -10069, -10068, -10067, -10066, -10065, -10064, -10063, - -10062, -10061, -10060, -10059, -10058, -10057, -10056, -10055, -10054, -10053, -10052, -10051, - -10050, 0, -10049, -10048, -10047, -10046, -10045, -10044, -10043, -10042, -10041, -10040, - -10039, -10038, -10037, -10036, -10035, -10034, -10033, -10032, -10031, -10030, -10029, -10028, - -10027, -10026, -10025, -10024, 0, -10023, -10022, -10021, -10020, -10019, 0, 0, - -10018, 0, 0, 0, -10017, -10016, 0, -10015, -10014, -10013, 0, -10012, - -10011, 0, -10010, -10009, -10008, -10007, -10006, -10005, -10004, -10003, -10002, -10001, - -10000, -9999, -9998, -9997, -9996, -9995, -9994, -9993, -9992, -9991, -9990, -9989, - -9988, -9987, 0, -9986, -9985, -9984, -9983, -9982, -9981, -9980, -9979, -9978, - -9977, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -9976, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -9975, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -9974, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -9973, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -9972, -9971, 1, 1, -9969, -9968, -9967, -9966, -9965, -9964, -9963, - -9962, -9961, -9960, -9959, -9958, -9957, -9956, -9955, -9954, -9953, -9952, -9939, - -9938, -9937, -9936, -9935, -9934, -9933, -9932, -9931, -9930, -9929, -9928, -9927, - -9925, 73, 96, -9922, -9921, 0, -9920, 96, -9919, -9918, 96, 96, - -9917, -9916, 96, 96, 96, -9915, -9914, -9913, -9912, -9911, -9910, -9909, - -9908, -9907, 96, -9906, -9905, -9904, -9890, -9887, -9886, 64, 66, 64, - 66, 0, 65, 65, 73, 64, 69, 65, 80, 80, 80, 68, - 70, 68, 70, 72, 76, 76, 140, 64, 162, 192, 192, 192, - 192, 192, 192, 37, 144, 156, 156, 160, 160, -9885, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 178, 160, 160, 160, - 160, 160, 160, 160, 160, 184, 189, -9884, 512, 512, 512, 145, - 512, -9883, -9882, -9881, -9880, -9879, -9878, -9877, -9876, -9875, -9874, -9873, - -9872, -9861, -9860, -9859, -9858, -9857, -9856, -9855, -9854, -9853, -9852, -9851, - -9850, -9849, -9848, 0, -9847, -9846, -9845, -9844, -9839, 29, 64, 70, - 72, 128, 128, 55, 128, -9838, -9837, 128, 137, -9836, -9835, -9834, - -9833, -9832, -9831, -9830, -9829, -9828, -9827, -9826, -9825, -9824, -9811, -9810, - -9809, -9808, -9807, -9806, -9805, 128, 137, 129, 134, 144, 144, 144, - 144, -9804, 164, 161, 163, -9803, -9802, -9801, -9800, 161, 162, -9799, - 0, 160, 160, 132, 132, 160, 160, 160, 164, 160, 160, 134, - 148, 133, 145, 128, 128, 244, 244, -9798, 149, -9797, 652, 128, - 135, -9796, -9795, -9794, -9793, -9792, 770, 192, -9791, 768, 768, 768, - 768, 768, 772, 252, 768, 768, 771, 784, 784, 175, 183, 229, - 230, 228, 250, -9790, 829, 785, 830, 896, 896, 896, 896, 906, - 906, -9789, -9788, -9787, -9786, -9785, 901, -9784, -9783, -9782, 928, 904, - 904, 930, 933, -9781, 769, 805, 814, 896, 896, 896, 896, 906, - 912, 901, 924, 896, 896, 920, 941, 936, 936, 942, -9780, 896, - 946, 939, 984, 901, 977, 980, 1024, 985, 1024, 1024, 1024, 998, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, -9779, 900, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, -9778, -9777, -9776, -9775, -9774, -9773, -9772, - -9771, -9770, -9769, -9768, -9767, -9766, -9765, -9764, -9763, -9762, -9761, -9760, - -9759, -9758, -9757, -9756, -9755, -9754, -9753, -9752, -9751, -9750, -9749, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -9748, -9747, -9746, -9745, -9744, -9743, 0, - 0, -9742, 0, 0, 0, -9741, 0, -9740, -9739, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -9738, -9737, -9736, -9735, -9734, -9733, -9732, -9731, -9730, -9729, -9728, - -9727, -9726, -9725, -9724, -9723, -9722, -9721, -9720, -9719, -9718, -9717, -9716, - -9715, -9714, -9713, -9712, -9711, -9710, -9709, -9708, -9707, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -9706, -9705, -9704, -9703, -9702, -9701, -9700, -9699, -9698, -9697, -9696, - -9695, -9694, -9693, -9692, -9691, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -9690, -9689, -9688, - -9687, -9686, -9685, -9684, -9683, -9682, -9681, 134, 134, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 197, 224, 224, 212, - 212, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 256, 256, 128, 128, 128, 128, 128, - 128, 128, 257, 128, 128, 128, 128, 256, 256, 256, 256, 264, - 268, 256, 256, 256, 273, 270, 276, 286, 286, 257, 288, 288, - 288, 292, 296, 288, 288, -9680, -9679, -9678, -9677, -9676, -9675, -9674, - -9673, -9672, -9671, -9670, -9669, -9668, -9667, -9666, -9665, 2, 2, 2, - 2, 2, 2, 2, 2, -9664, -9663, -9662, -9661, -9660, -9659, -9658, - -9657, -9656, -9655, -9654, -9653, -9652, -9651, -9650, -9649, -9648, -9647, -9646, - -9645, -9644, -9643, -9642, -9641, -9640, -9639, -9638, -9637, -9636, -9635, -9634, - -9633, -9632, -9631, -9630, -9629, -9628, -9627, -9626, -9625, 34, 34, 40, - 40, 40, 40, 48, 48, 60, 60, 27, 48, 48, 48, 49, - 60, -9624, -9623, -9622, -9621, -9620, -9619, -9618, -9617, -9616, -9615, -9614, - -9613, -9612, -9611, -9610, -9609, -9608, 32, 32, 35, -9607, -9606, -9605, - -9604, -9603, -9601, -9600, -9599, -9598, -9597, -9596, -9595, 16, 24, 19, - 20, 106, 106, 16, 19, -9594, 130, 128, 132, -9593, -9592, -9591, - -9590, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1, - 1, 1, 1, 1, 1, 8, 8, 14, 14, 16, 16, 16, - 16, 6, 6, 26, 26, 30, 30, 32, 32, 1, 1, 1, - -9589, 2, 8, 2, 2, 10, 14, 1, 1, 4, 1, 1, - 1, 1, 4, 1, 1, 4, 1, 1, 1, 1, 4, 1, - 1, 4, 1, 72, 72, 1, 4, 1, 1, -9588, 1, 1, - 1, -9587, -9586, -9585, -9584, -9583, -9582, -9581, -9580, 1, 1, 1, - 1, 1, 1, 1, 1, 16, 1, 7, 16, 16, 16, 16, - 16, 9, 14, 34, 1, 45, 47, 57, 130, 51, 53, 25, - 26, 20, 29, 128, 128, 89, 128, 6, -9579, 1, 27, 44, - 127, 128, 128, 128, 133, 140, 143, 150, 160, 131, 145, 148, - 148, 154, 161, 167, 204, 194, 234, 512, 512, 480, 516, 512, - 512, 0, -9578, 460, 512, -9577, -9576, -9575, -9574, 512, 512, -9573, - -9572, 512, 512, 520, 520, 512, 512, 528, 530, 457, 529, 528, - 528, 536, 545, 512, 512, 512, 512, 512, 512, 520, 520, 513, - 526, 528, 528, 522, 528, 514, 514, 516, 516, 538, 598, 523, - 593, 512, 512, 443, 512, 514, 519, 524, 524, 524, 524, 514, - 514, 514, 514, 514, 514, 552, 552, 533, 544, 544, 544, 544, - 544, 550, 640, 512, 514, 512, 517, 513, 514, 520, 520, 512, - 512, 624, 640, 512, 640, 640, 640, 640, 640, 648, 652, 648, - 656, 640, 640, 645, 653, 674, 677, 673, 680, 645, 665, 672, - 680, 646, 673, 684, 689, 127, 644, 723, 724, 648, 679, 722, - 722, 683, 729, 27, 896, 896, 896, 896, 896, 896, 896, 896, - 900, 896, 896, 896, 909, 896, 896, 897, 901, 896, 896, 909, - 929, 896, 896, 896, 900, 896, 896, 896, 909, 896, 896, 897, - 900, 896, 896, 896, 908, 896, 896, 896, 900, 896, 896, 896, - 909, 896, 988, 905, 1097, 1086, 1112, 1792, 1792, 960, 960, 960, - 960, 960, 960, 961, 975, 961, 1121, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1808, 1792, 1792, 1808, 1808, 1819, - 1823, 1856, 1856, 1856, 1856, 902, 999, 1112, 1824, 1826, 1829, 1825, - 1856, 1834, 1856, 1856, 1856, 1856, 1856, 1856, 1865, 1856, 1856, 1856, - 1856, 1856, 1856, 1857, 1874, 1856, 1856, 1856, 1856, 1856, 1856, 1892, - 1892, 10, 129, 129, 133, 27, 128, 130, 138, 129, 133, 128, - 128, 139, 143, 148, 148, 130, 130, 130, 130, 130, 137, 129, - 130, 128, 160, 164, 164, 129, 161, 176, 176, -9571, -9570, 182, - -9569, -9568, -9562, -9558, -9557, -9555, -9554, -9553, -9552, -9551, -9550, -9549, - -9548, 141, 152, 148, 148, -9547, -9545, 202, 202, -9544, -9543, -9542, - -9541, -9540, -9539, -9538, -9537, 136, 140, 130, 148, 152, 156, 144, - 389, 152, 384, 128, 128, 136, 136, 136, 136, 136, 142, 140, - 170, 137, 171, 174, 176, 404, 448, 152, 164, 157, 449, 448, - 448, -9536, -9535, -9534, -9533, -9532, -9531, -9530, -9529, -9528, -9527, -9526, - -9525, -9524, -9523, -9522, -9521, 449, 453, 144, 430, 144, 144, 460, - 460, -9520, 472, 452, 452, -9519, -9518, -9517, -9516, 492, 492, -9515, - 497, 507, 510, 502, 509, 487, 504, 325, 404, 64, 1030, 400, - 1025, -9514, -9512, -9511, -9510, -9509, -9508, -9507, -9506, -9505, -9504, -9503, - -9502, -9501, -9500, -9499, -9498, -9497, -9496, -9495, -9494, -9493, -9492, -9491, - -9490, -9489, -9488, -9487, -9486, -9485, -9484, -9483, -9482, 445, 1045, 1040, - 1042, 432, 1046, 1046, 1056, 1056, 1056, 1042, 1064, 1064, 1080, 1084, - 1084, 414, 1095, 1, 1090, 407, 1089, 1089, 1096, 1088, 1088, 1098, - 1152, 1152, 1152, 1152, 1152, -9481, -9480, -9479, -9478, -9477, -9476, -9475, - -9474, -9473, -9470, -9460, -9459, 1152, 1152, 1153, -9457, 1136, 1136, 1136, - 1141, 1129, 1136, 1168, 1168, 1153, 1158, 1177, 1185, 1188, 1188, 1194, - 1197, 1152, 1152, 1144, 1151, 1152, 1152, 1156, 1160, 1154, 1154, 1222, - 1222, 1188, 1188, 1237, 1241, 1296, 1298, 1301, 1304, 1296, 1311, 1315, - 1316, 1309, 1311, 189, 1305, 128, 135, 1311, 1323, 153, 177, 171, - 1322, 1324, 1344, 1360, 1360, 188, 2051, 1338, 1338, 2071, 2096, 2105, - 2168, 2057, 2172, 164, 2176, 2176, 2176, 2189, 2190, 2176, 2198, 2180, - 2186, 2188, 2208, 2208, 2208, 2177, 2186, 2178, 2233, 2240, 2242, 2244, - 2248, 2254, 2260, 2240, 2248, 2224, 2246, 2261, 2282, 2287, 2295, 2306, - 2306, -9456, -9455, 2304, -9453, -9452, -9451, -9450, -9449, -9448, -9447, -9446, - -9445, 2192, 2197, 2187, 2190, 2187, 2217, 2192, 2229, 2321, 2325, 2304, - 2304, 2192, 2237, 2317, 2336, 2309, 2351, 2356, 2359, 2368, 2368, 2368, - 2372, 2368, 2368, 2368, 2368, 2368, -9444, -9443, 2368, -9442, -9441, -9440, - -9439, -9438, -9437, -9436, -9435, -9434, -9433, -9432, -9431, 2368, 2370, -9430, - -9429, -9428, -9427, -9426, -9425, -9424, -9423, -9422, -9421, -9420, -9419, -9418, - -9417, -9416, -9415, -9414, -9413, -9412, -9411, -9410, -9409, -9408, -9407, -9406, - -9405, -9404, -9403, -9402, -9401, -9400, -9399, -9398, -9397, 36, 42, 63, - 138, 140, 162, 160, 245, 2066, 2124, 2135, 2144, 2176, 2182, 2184, - 2186, 938, 2176, 2176, 2176, 2176, 2176, 2177, 2187, 2190, 2202, 2176, - 2178, 2188, 2209, 2179, 2203, -9396, -9395, -9394, -9393, -9392, -9391, -9390, - -9389, -9388, -9387, -9386, -9385, -9384, -9383, -9382, -9381, 2180, 2186, 2183, - -9380, 2246, 2252, 2254, 2257, -9379, 2179, 2259, 2260, -9378, -9377, -9376, - -9375, 2242, 2275, 2282, -9374, 2304, 2306, 2282, 2309, 2277, 2279, 2304, - 2304, 2304, 2308, 2317, 2319, 2304, 2306, 2304, 2309, 2313, 2333, 2312, - 2336, -9373, -9372, 2307, 2308, 2304, 2336, -9371, -9370, 4, -9369, -9368, - 4, 1, 8, 8, 8, 1, 1, 1, 1, 22, 1, 21, - 23, -9367, -9366, -9365, 1, 1, 1, 1, -9364, 8, 8, 9, - 13, 35, -9363, -9362, 40, -9361, 8, -9360, 2, 4, 1, -9359, - -9358, -9357, -9356, 1, 1, -9355, -9354, 2, -9353, 2, 2, 4, - 22, 25, 27, 30, 64, 68, 72, -9352, 28, 73, 77, 80, - 80, -9351, -9350, -9349, -9348, -9347, -9346, -9345, -9342, -9332, -9331, -9329, - -9320, 6, -9317, 5, 9, -9316, -9315, -9313, -9312, -9311, -9310, -9309, - -9308, -9307, -9306, -9305, -9304, -9303, 2, -9302, -9301, -9300, -9299, 10, - 10, 15, 33, 36, 49, -9298, -9297, 42, 42, -9296, -9295, -9294, - 49, -9293, -9292, 32, 32, 36, 36, -9291, -9290, 35, 44, 45, - 47, 136, 138, 132, 132, 1, 1, 1, 4, 6, 8, 3, - 8, 12, 15, -9289, -9288, -9287, -9286, -9285, -9284, 0, 0, 0, - 0, -9283, -9282, -9281, -9280, -9279, -9278, 6, 6, 8, 8, 16, - 19, 8, 11, 1, 1, 16, 16, -9277, -9276, 0, -9275, -9274, - -9273, 0, 0, -9272, 0, -9271, -9270, -9269, -9268, -9267, -9266, -9265, - -9264, -9263, -9262, -9261, -9260, -9259, -9258, -9257, -9256, 0, 0, 0, - -9255, 0, 0, 0, 0, -9254, -9253, 15, 16, 16, 16, 16, - 16, -9252, -9251, -9250, -9249, -9248, -9247, -9246, -9245, -9244, -9243, 0, - 0, 0, 0, 0, 0, -9242, -9241, 0, 0, -9240, -9239, -9238, - -9237, -9236, -9235, 2, 1, 1, 2, 2, 1, -9234, -9233, -9232, - -9231, -9230, -9229, 0, 0, -9228, -9227, 6, 6, 9, 12, 8, - 15, -9226, -9225, -9224, -9223, -9222, -9221, -9220, -9219, -9218, -9217, -9216, - -9215, -9214, -9213, -9212, -9211, -9210, -9209, -9208, -9207, -9206, -9205, -9204, - -9203, -9202, -9201, -9200, -9199, -9198, -9197, -9196, -9195, 124, 124, 116, - 116, 116, 116, -9194, 121, 156, 156, 69, 73, -9193, -9192, 152, - 152, 79, 130, 205, 244, 144, 204, 240, 385, 153, 193, 217, - 384, 385, 394, 388, 397, -9191, -9190, -9189, -9188, -9187, -9186, -9185, - -9184, -9183, -9182, -9181, -9180, -9179, -9178, -9177, -9176, -9175, -9174, -9173, - -9172, -9171, -9170, -9169, -9168, -9167, -9166, -9165, -9164, -9163, -9162, -9161, - -9160, -9159, -9158, -9157, -9156, -9155, -9154, -9153, -9152, -9151, -9150, -9149, - -9148, -9147, -9146, -9145, -9144, -9143, -9142, -9141, -9140, -9139, -9138, -9137, - -9136, -9135, -9134, -9133, -9132, -9131, -9130, -9129, -9128, 134, 156, 148, - 163, -9127, -9126, 171, 203, -9125, -9124, -9123, -9122, -9121, -9120, -9119, - -9118, 29, 30, 28, 79, 51, 75, 131, 135, 35, 130, 132, - 144, 149, 160, 157, 168, -9117, -9116, -9115, 0, 0, 0, -9114, - -9113, -9112, -9111, -9110, -9109, -9108, -9107, -9106, -9105, -9104, -9103, 0, - 0, 0, 0, 0, 0, 0, 0, -9102, -9101, -9100, -9099, -9098, - -9097, 102, 123, 132, 139, 131, 173, -9096, 146, -9095, -9094, 0, - -9093, 0, 0, 0, 0, -9092, -9091, -9090, -9089, -9088, -9086, -9085, - -9082, -9081, -9080, -9079, -9078, -9077, -9076, -9075, -9074, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9073, - 0, -9072, -9071, 129, 154, -9070, -9069, 152, 163, -9068, 149, -9067, - -9066, 0, 0, 0, 0, -9065, -9064, 0, -9063, 0, 0, -9062, - -9061, 0, -9060, -9059, 0, -9058, -9057, 0, -9056, -9055, 0, 0, - 0, -9054, -9053, -9052, 0, 0, -9051, -9050, -9049, -9048, -9047, 0, - 0, -9046, -9045, -9044, -9043, -9042, -9041, -9040, -9039, 0, 0, 4, - 1, -9038, -9037, -9036, -9035, 3, -9034, -9033, -9032, -9031, -9030, -9029, - 10, -9028, 2, 28, 36, -9027, -9026, -9025, -9024, -9023, -9022, -9021, - 16, -9020, -9019, -9018, -9017, -9016, -9015, -9014, -9013, -9012, -9011, -9010, - -9009, -9008, -9007, -9006, -9005, -9004, -9003, -9002, -9001, -9000, -8999, -8998, - -8997, -8996, -8995, -8994, -8993, -8992, 8, 10, 19, -8991, -8990, -8988, - -8987, -8986, -8985, -8984, -8983, -8982, 0, -8981, -8980, -8979, -8978, -8977, - -8976, 1, 3, -8975, -8974, 2, 8, 20, 33, 41, 45, 34, - 49, 3, -8973, -8972, 5, 1, 5, 14, 24, 1, 2, 17, - 18, 45, 46, 19, 66, -8971, -8970, -8969, -8968, 35, 37, -8967, - 0, -8966, -8965, 66, 66, 76, -8964, -8962, 67, 53, 61, -8961, - 61, 64, 64, 68, -8960, -8959, -8958, 64, 64, -8957, -8956, 70, - -8955, 3, 64, 9, 67, 66, 72, 72, 72, 121, 122, -8954, - 112, 75, 108, 124, 127, -8953, -8952, -8951, -8950, -8949, -8948, -8947, - -8945, -8944, -8943, -8942, -8941, 315, -8940, 385, 396, -8939, -8938, -8937, - -8936, -8935, -8934, -8933, -8932, -8931, -8930, -8929, -8928, -8927, -8926, -8925, - -8924, 391, 397, 1, -8923, 386, 396, 448, 452, -8922, -8921, 0, - 0, 0, 0, 0, 0, 0, 0, -8920, -8919, -8918, -8917, 0, - 0, -8916, -8915, 500, 511, 366, 432, 948, 971, 51, -8914, 51, - 108, 43, 401, 262, 267, 94, 305, 212, 249, 266, 289, 263, - 920, -8913, -8912, -8911, -8910, 1, 1, 1, 271, 1, 1, 1, - 1, 1, 268, 1, 1, 1, 1, 390, 1, 1, 1, 407, - -8909, -8908, -8907, 68, 4099, -8906, -8905, 4099, -8904, 300, 624, 4112, - 4119, 4128, 4128, 4128, 4132, 127, 278, 418, 1, 1, 1, 1, - 1, 357, 383, 2055, 1, 2056, 2056, -8903, -8902, -8901, -8900, 271, - 2049, 2051, 2053, 2048, 2056, 2051, 2057, 2048, 2068, 2049, 2056, 2062, - 2068, 2057, 2065, 2056, 2072, 417, 2054, 2080, 2080, 2074, 2084, 2066, - 2070, 2083, 2085, 2056, 2092, 2088, 2095, 4096, -8899, -8898, -8897, -8896, - -8895, -8894, -8893, 4098, 4104, 4113, 4115, -8892, -8891, 4113, 4114, 1, - 1, 1, 1, 1, 1, 1, 2053, 2063, 1, 1, 1, 4241, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 532, 1024, 529, - 532, 1, 1, 1, 409, 1157, 1, 4224, 4226, 4225, -8890, 1154, - 1156, 3, 4, 1152, 1, 1167, 1, 1, 1165, 1185, 1220, 4274, - 1, 1182, 1195, -8889, -8888, 4256, 4256, 4256, 4268, 4266, 4309, 4308, - 4312, 4372, 4375, 1162, 1, 1, 1, 1, 1, 1185, 1222, 1220, - 1226, 1236, 1256, 1701, 1707, 1, 1, 1, 1615, 1164, 1, 1612, - 1, 1792, 1792, -8887, -8886, 1808, 1810, -8885, -8884, -8883, -8882, -8881, - -8880, -8879, -8878, -8877, -8876, 4231, 4253, -8875, -8874, -8873, -8872, -8871, - 4234, -8870, -8869, 1793, 1794, 1792, 1798, 1792, 1794, 1800, 1803, 1792, - 1796, 1, 1, -8868, 1809, 1, 1, 1, 1, 1, 1, 1, - 4243, 1864, 1, 1, 1, 1797, 1, 1, 1, 1, 1, 1562, - 1879, 1, 1, 1, 1, 1881, 1884, 1874, 1888, 2, 10, 10, - 342, 5, 18, 8, 1, 11, 37, 20, 32, 17, 1688, 3, - 5, 16, 36, 53, 57, 48, 48, 2, 1, 1702, 1857, 1, - 1686, 5, 1, 15, 16, 2, 21, 1, 12, 4, 18, 8, - 64, 25, 64, 4178, 4208, 1687, 1688, -8866, -8865, -8864, -8863, -8862, - -8860, -8859, -8858, -8857, -8856, -8855, -8854, -8853, -8852, 4125, 4137, 4142, - 4224, -8851, 4114, 4112, 4224, -8850, -8849, 1928, 1978, 1758, 1853, -8848, - 1764, 1946, 3304, -8847, -8846, -8845, -8844, -8843, -8842, -8841, -8840, 1804, - 3253, 3257, 3269, 3268, 3283, 3288, 3293, 3248, 3298, 1, 1, -8838, - -8837, 1735, 1, 4, 1, 5, 1, 1, 14, 40, 40, 3293, - 16, 3, 1, 10, 32, 34, 36, 7, 1, 35, 38, 46, - 46, 1760, 3333, 4299, 4302, 1, 3, 14, 1569, 10, 38, 32, - 39, 4100, 4130, 3856, 41, 6, 13, 21, 38, 25, 68, 68, - 72, 3864, 65, 68, 80, 4166, 4166, 4098, -8836, 4104, 4112, 4113, - 4193, 4099, 4114, 4118, 4125, 4100, 4196, 64, 70, 9, 73, 72, - 72, 3889, 4184, 4179, 4181, 4176, 1, 4, 4, 13, 14, 3, - 5, 7, 1, 4, 15, 4142, 4482, -8835, -8834, 4132, 4228, -8833, - -8832, -8831, -8830, -8829, -8828, -8827, 4100, -8826, -8825, 4149, 4153, 4152, - 4156, 4149, 4167, 4171, 4227, 4161, 4251, 4241, 26, 4238, 4240, 27, - 34, 4486, 4550, 1, 4141, 4130, 4142, -8824, -8823, 32, 4137, 4142, - 4512, 4180, 4516, 4521, 4543, 4106, 4132, -8822, 4165, 4096, 4140, 4142, - 4164, 4111, 4155, 25, 70, 28, 39, 31, 65, 4536, 4687, 5081, - 84, 930, 938, 931, -8821, 931, 945, 944, -8820, 929, 961, -8819, - -8818, 901, 4107, -8817, 929, 1012, 1023, 4419, -8816, -8815, -8814, 1844, - 4101, -8813, -8812, -8811, 0, 4673, 4686, -8810, -8809, -8808, -8806, -8805, - -8804, -8803, -8802, 0, 4215, 4720, 4871, -8801, -8800, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -8799, -8798, -8797, 4873, -8796, - 922, 940, 926, 1007, 930, 1096, 1019, 1131, 1016, 1121, 1156, 1158, - 1122, 1120, 1154, 1162, 1152, 1154, 17, 17, 1157, 1153, 1156, 1164, - 1152, 1176, 1182, 1184, 1190, 946, 1193, -8795, -8794, -8793, -8792, 768, - 768, 768, 768, -8791, -8790, 768, 768, 1, 1, 8, 8, 12, - 8, 2, 2, 1152, 15, 52, 54, 34, 42, 25, 30, 1, - 13, 9, 31, 1, 31, 1169, 1176, 1174, 930, 46, 64, 64, - 1280, 64, 64, 78, 64, 80, 82, 1174, 88, 66, 66, 88, - 90, 178, 82, 90, 101, 1280, 1280, 220, 83, 1282, 1291, 230, - 1288, 70, 64, 114, 72, 244, 246, 239, 118, 201, 115, 1285, - 227, 332, 336, 338, 352, 1312, 1312, 1195, 1291, 1192, 1292, 1193, - 1316, 1328, 2, 24, 266, 1325, 1321, 1329, 1284, 1284, 1296, 1300, - 1300, 1306, 1314, 1322, 1332, 1334, 1332, 1316, 1360, 1344, 1369, 1371, - 1360, 1360, 1364, 1360, 1360, 1374, 1446, 1440, 1445, 307, 165, 31, - 392, 1364, 384, 392, 309, 1409, 1414, 898, 900, 386, 389, -8789, - -8788, 898, 898, 900, 392, 427, 429, 898, 898, -8787, -8786, -8785, - -8784, -8783, -8780, -8778, -8777, -8776, -8775, 1288, 1284, 1288, -8774, -8773, - 1298, 1370, 1378, -8772, -8771, -8770, -8769, -8768, -8767, 4114, 4119, 1, - 1, 1281, -8766, -8765, 2, 1394, 1384, 1394, 1393, 1399, -8764, -8763, - 1406, 1536, 1538, 1553, 1536, 1563, 1566, 1572, 1572, 1541, 1577, 1548, - 1571, 1580, 1584, 1576, 1568, 1575, 1667, 1313, 1667, 1569, 1672, -8762, - 1664, 1580, 1664, 1666, 1664, 1666, 1674, -8761, 1664, 1664, 1664, 1546, - 1553, 1559, 1563, 1576, -8760, -8759, -8758, 0, -8757, -8756, -8755, 0, - 0, 0, 0, -8754, -8753, -8752, -8751, -8750, -8749, -8748, -8747, -8746, - -8745, -8744, -8743, -8742, -8741, -8740, -8739, -8738, -8737, -8736, -8735, -8734, - -8733, -8732, -8731, -8730, -8729, -8728, -8727, -8726, -8725, -8724, -8723, -8722, - -8721, -8720, -8719, 0, 0, -8718, -8717, 0, 0, 0, 0, 0, - 0, 0, 0, -8716, -8715, -8714, -8712, -8711, -8710, -8708, -8707, -8706, - 4288, 4303, 4325, 4349, 5025, 4512, 4801, 4320, 4526, 4335, 5025, 4335, - 4998, 36, 36, 36, 45, 5024, 5052, 5294, 5296, 5301, 5303, -8705, - -8704, 4596, -8703, -8702, 4598, 57, 5092, 62, 62, 3, 4238, 5001, - 5012, 24, 24, 24, 129, 93, 128, 128, 139, 19, 144, 129, - 145, 192, 192, 153, 155, 145, 218, 4346, 5961, 5971, 5982, 6172, - 6204, 4103, 4997, 144, 5005, -8701, -8700, -8699, -8698, -8697, 5120, -8696, - -8695, -8694, 5120, -8693, -8692, 0, 0, 0, 0, -8691, -8690, -8689, - -8688, 0, -8687, -8686, 5514, 0, 0, 0, 0, -8685, -8684, -8683, - -8682, -8681, -8680, -8679, -8678, -8677, -8676, 5151, 5152, -8674, -8673, -8672, - 5157, -8671, -8670, 0, -8669, 4392, 4397, -8668, -8667, -8666, -8665, 4393, - -8664, 4410, 4582, 5199, 5228, -8663, 4555, 4544, -8662, 5377, -8661, -8660, - 5216, -8659, 5390, -8658, 5477, -8657, -8656, 5525, -8655, 5617, 5620, -8654, - 5627, -8653, -8652, -8651, -8650, -8648, -8647, 0, 0, 0, 0, -8645, - 0, -8644, -8642, -8641, 0, -8640, 0, -8639, 0, -8638, -8637, -8636, - -8635, 5666, 5668, 5670, -8634, 5713, 5714, -8633, -8632, -8631, 5712, -8630, - -8629, 0, 0, 5834, 5834, 5834, 5834, 5843, 24, 1, 3, 280, - 280, 1837, 1920, -8628, 294, -8627, -8626, -8625, 1921, 1923, 1921, 1928, - 1253, 1920, 1928, 1935, 1941, 1943, 1941, -8624, -8623, -8622, -8621, 1933, - 1921, 1928, -8619, -8618, -8617, -8616, 1938, -8615, -8614, 0, 0, -8613, - -8612, 0, 0, -8611, -8610, -8609, -8608, -8607, 1926, 2, 10, 4, - 27, 40, 59, 32, 93, 60, 60, 461, 402, 466, 480, 485, - 385, -8606, -8605, -8604, -8603, 402, 404, 416, 395, 440, 4480, 4417, - 4481, 4483, 4488, 4488, -8602, -8601, -8600, 0, -8599, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -8598, 4481, 4483, 4481, - 4487, 4481, 4488, 4481, 432, 4480, 4480, 4484, 4484, 4480, 4496, 4496, - 434, 424, 4418, 436, 4422, 4481, 4483, 4481, 4484, -8597, -8596, 4480, - 4484, -8595, -8594, -8593, -8591, -8590, -8588, -8587, 433, -8583, -8580, 444, - -8578, 0, 0, 0, -8577, 0, -8576, 0, -8575, -8573, -8572, -8571, - 0, -8570, -8569, -8568, 0, 0, 0, 0, 0, 0, 0, 0, - -8567, -8566, -8565, -8564, 0, -8563, -8562, -8561, -8559, -8558, -8557, -8556, - 0, -8555, 0, -8554, -8553, 26, 128, 130, 128, 128, 128, 136, - 133, 130, -8552, 129, 130, 144, 144, 152, 128, 130, 128, 133, - 128, 141, 161, 141, 169, 170, 180, 178, 167, 207, 212, 261, - 151, -8551, 180, 192, 129, 193, -8549, 198, 142, 194, 284, 384, - 384, 384, 384, 384, 254, 289, 384, 295, 232, 384, 384, 384, - 388, 384, 384, 384, 396, 386, 399, 408, 384, 393, 393, 416, - 237, 416, 416, 422, 416, 419, 419, 427, 438, 442, 434, 444, - 492, 389, 468, 1027, 267, 1352, 1035, 1520, 1074, 1529, 1062, 7698, - 472, 7699, 1387, 7707, 1046, 410, 508, 1048, 258, 1064, 1097, 1368, - 7680, 7686, 7680, 7690, 1083, 7693, 7682, 8224, 1111, 8253, 8359, 8364, - 1495, 8392, 8397, 8421, 8422, 8424, 8452, 8452, 8455, 8456, 8456, 8456, - 8460, 1076, 101, 1083, 1032, 1315, 298, 8579, 315, 8577, 8586, 8594, - 8594, 8602, 8602, 8624, 1080, 1080, 1078, 8608, 1775, 8608, 8608, 8617, - -8546, -8540, 8608, 8646, -8539, -8537, -8536, -8535, 1066, 8599, 8640, 8640, - 118, 8644, 8650, 8654, 8662, 8664, 8672, 8664, 8672, 8672, 8672, 8672, - -8530, -8528, -8527, -8526, -8523, -8522, -8521, -8518, -8517, -8516, -8515, -8514, - -8513, -8510, -8508, -8507, -8505, -8496, -8495, -8493, -8492, -8491, -8490, -8489, - -8488, -8487, -8486, -8485, -8484, -8483, -8482, -8481, 8576, 8592, 8576, 8592, - 8592, 8592, 8592, 8592, 8598, 8592, 8704, 8592, 8709, 8712, 8712, 8712, - 8706, 8704, 8722, 8704, 8777, 8721, 8776, 8776, 8768, 8771, 8785, 8787, - 8784, 8786, 8793, 8798, 8768, 8770, 8768, 8772, 8777, 8771, 8776, 8784, - 8786, 8784, 8773, 8787, 8772, 8784, 8796, 8794, 8796, 1428, 1432, 1488, - 1488, 8769, 8774, 8772, 8774, -8480, -8479, 8768, 8790, -8477, -8476, -8475, - -8474, -8473, -8472, 1418, 8737, -8471, -8470, -8469, -8468, -8467, -8466, -8465, - -8458, -8457, 184, -8456, -8454, 1424, 1424, 1446, 8832, 8854, 8861, 8878, - 8730, 8947, 8957, 8960, 8960, 8960, 8960, 8960, 8705, 8712, 8723, 8960, - 8719, 8960, 8729, 8960, 8724, 8960, 8960, 8960, 8960, 8960, 8960, 8960, - 8960, 8725, 8754, 8759, 8960, 8960, 8960, 8960, 8960, 8960, 8960, 8960, - -8453, -8451, 8960, 8960, 8707, 8704, -8450, -8449, 1909, 8706, -8448, 8705, - 8709, -8446, -8444, -8439, -8438, -8436, -8435, 8705, -8434, 1846, 8705, 8708, - 8705, 8705, 8713, 8705, 8707, -8432, 8704, 8706, 8704, 8707, 8707, 8720, - -8430, 8704, 1885, 8707, 8711, 8706, 8706, 8713, 8714, 8704, 8704, 8704, - 8704, 8704, 8727, 8743, 8769, 8870, 8878, 8884, 8914, 8920, 8960, 8960, - 8960, 8960, 8960, 8960, 8960, 8962, 8960, 8970, -8417, -8415, -8414, -8413, - -8411, -8410, -8409, -8408, -8407, -8406, -8404, -8403, -8401, -8400, -8399, -8398, - 8960, -8397, -8395, -8394, -8393, -8392, -8391, -8390, 0, 0, 0, 0, - 0, -8389, 0, 0, -8388, 8976, 8993, 8976, 8997, 8992, 8992, 9000, - 9002, -8387, 9014, 8998, -8386, 0, 0, 0, 0, -8385, -8384, -8382, - -8381, 0, 0, -8380, -8379, -8378, -8377, 0, 0, 0, 0, -8376, - 8960, 8960, 8960, 8960, 8960, 8963, 8969, 8969, 8973, -8375, -8374, 8961, - 8976, -8373, -8372, -8371, -8368, -8366, -8351, -8350, 8960, 8960, 8960, 8960, - -8349, 8960, 8960, 8960, 8964, 8960, 8960, 8960, 8964, -8348, -8347, 8960, - -8346, -8345, 8961, 8961, -8344, -8343, -8342, -8341, 0, -8340, 8960, -8338, - -8336, -8335, -8334, -8333, -8332, -8331, -8330, -8329, -8328, -8327, -8326, -8325, - -8324, -8323, -8322, -8321, -8320, 8192, 8192, 8192, 8192, 8192, 8192, 8192, - 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, -8318, -8317, -8316, -8315, - -8314, -8313, -8312, -8311, -8310, -8309, -8308, -8306, -8305, -8304, -8303, -8302, - 8192, 8192, 8192, 8197, 8192, 8208, 8208, 8208, 8194, 8208, 8208, 8216, - 8216, 8220, 8220, 8240, 8216, 8193, 8202, 8205, 8207, 8208, 8213, 8208, - 8197, 8208, 8212, 8208, 8208, 8208, 8224, 8208, 8207, 8193, 8195, 8193, - 8202, 8193, 8202, 8193, 8224, 8224, 8224, 8224, 8224, 8224, 8224, 8224, - 8224, 8192, 8192, 8192, 8192, -8301, -8297, 8192, 8192, 8192, 8192, 8192, - 8192, -8296, -8294, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, - 8210, 8212, 8221, 8293, 8304, 8304, 8304, 8308, 8304, 8192, 8192, -8284, - 8192, -8275, -8271, 8196, 8256, 8256, 8256, 8256, 8264, 8256, 8256, 8256, - 8265, 8273, 8265, 8278, 8306, 8336, 8272, 8336, 8277, 8336, 8336, 8344, - 8344, 8347, 8348, 8350, 8293, 8278, 8273, 8281, 8284, 8280, 8352, 9232, - 8295, 9241, 9243, 9241, 9255, 9265, 9267, 9265, 8286, 9252, 9252, 9257, - 9248, 9260, 9289, 9263, 8272, 9296, 9296, 9296, 9249, 9296, 9298, 9296, - 9256, 8248, 8248, 8252, 9217, 9227, 9220, 9248, 9231, -8270, 9256, 9258, - 9248, -8269, -8268, -8267, -8266, 9344, 9344, 9344, 9344, 9344, 9344, 9344, - 9344, 9346, 9344, 9349, 9344, 9456, 9441, 9456, 9413, 9409, 9409, 9456, - 9417, 9456, 9408, 9456, 9409, 9464, 9412, 9465, 9466, -8265, -8264, -8263, - 9419, -8262, -8261, -8260, -8259, -8258, -8257, -8256, -8251, 9425, 9477, 9482, - -8249, 9488, 9488, 9492, 9492, 9287, 9492, 9616, 9492, 9618, 9620, 9622, - 9696, 9707, 9709, 9728, 9728, 9728, 9728, 9728, 9446, 9456, 9458, 9456, - 9462, 9456, 9458, 9456, 9728, 9728, 9728, -8248, 9728, -8247, -8246, 1, - 1, 1, 1, 5120, 1, 748, 5120, 1, 1, 1, 1, 1, - 1, 5120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 5120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 5376, 1, 5376, 5376, 1, 1, 1, 1, 1, - 1058, 1452, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9223, - 9216, 1, 1, 9217, 9217, 9217, 9217, 1, 1, 1, 1, 9216, - 9216, 9220, 9220, 9226, 9216, 9216, 9216, 9223, -8244, 9234, 9236, 9233, - 9216, 9360, 9362, 9365, 9359, 9360, 9370, 9368, 9370, 9361, 9361, 9361, - 9361, 9401, 9403, 9401, 9369, 9376, -8238, -8234, 9376, 9381, 9424, 9424, - 9381, 9425, -8233, -8225, -8219, -8217, -8216, 1, 1, 1, 9409, 1415, - 1, 1, 1, 1, 1, 1, 9409, 1481, 1, 1, 1, 1, - 1530, 9412, 9412, 9412, 9416, 9418, 9423, 1520, 9425, 9434, 9436, 9446, - 9456, 9432, 9456, 1410, 1428, 1432, 1436, 1423, 1432, -8206, 9345, 1414, - 9348, 9344, 9347, -8205, 9348, -8204, -8203, 1348, 1, 1, 1, 1, - 1, 1, 1, 1, 9365, 9364, 1, 5376, 9370, -8202, -8201, -8200, - -8199, -8198, -8197, -8196, -8194, -8192, -8190, -8189, -8181, -8178, -8177, -8176, - -8175, -8174, -8173, 9376, 1, 1, 1, 1, 9729, 9730, 1, 1, - 9399, 1, 1, 1, 9728, 9728, 9728, -8172, 9728, 8329, 8329, -8171, - 8329, 8329, 8329, 8329, 8329, 8348, 8338, 8349, 8356, 8364, 8364, 8371, - 8345, 8320, 8320, 8320, 8352, 8321, 8356, 8356, -8170, 8352, 8354, 8352, - -8169, -8168, -8167, 589, 10, 3, 9, 8320, 22, 20, 36, 35, - 49, 49, 49, 61, 68, 61, 71, 64, 68, 72, 71, 8332, - 72, 72, 72, 90, 90, 70, 94, 88, 96, 96, 96, 86, - 8323, 8344, 8344, 8344, 65, 67, 8344, 8344, 67, 65, 68, 65, - 67, 76, 78, 72, 64, 64, 74, 64, 64, 74, 91, 66, - 74, 82, 96, 100, 100, 111, 129, 39, 40, 50, 52, 128, - 128, 128, 60, 40, 128, 128, 128, 128, 138, 128, 128, 54, - 128, 49, 132, 128, 137, 137, 170, 128, 183, 152, 186, 188, - 144, 192, 198, 133, 208, 154, 194, 196, 224, 257, 229, 208, - 227, 261, 265, 257, 265, 276, 280, 231, 261, 224, 224, 181, - 224, 224, 289, 260, 260, 290, 290, 281, 294, 288, 290, 8242, - 8244, 8195, 8196, 8196, 8199, 8205, 8194, 8313, 8448, 8450, 8448, 8452, - 8448, 8448, 8448, 8456, 8448, 8448, 8452, 8452, 8449, 8456, 8456, 8456, - 8452, 8451, 8465, 8472, -8166, -8165, -8164, 8474, 8448, 8451, 8452, 8452, - 8456, 8456, 8450, 8456, 8454, 8448, 8448, 8488, 8452, 8488, 8488, 8493, - -8163, -8162, -8161, -8160, -8159, -8158, -8156, -8155, -8153, -8148, -8147, -8146, - -8144, -8143, -8141, -8138, -8133, -8130, -8125, -8123, -8122, -8121, -8120, -8119, - -8118, -8117, -8116, -8115, -8114, -8083, -8072, -8069, -7486, -7479, -7412, -7381, - -7378, -7375, -7326, -7321, -6282, -6280, -6176, -6138, -6132, -6098, -6097, -6090, - -6082, -6079, -6058, -6051, -6049, -5951, -5950, -5948, -5945, -5944, -5943, -5939, - -5917, -5916, -5915, -5913, -5912, -5911, -5910, -5909, -5908, -5905, -5901, -5870, + -20026, -20025, -20024, -20023, -20022, -20021, -20020, -20019, -20018, -20017, -20016, -20015, + -20013, 6, 49, 26, 52, 49, 56, -20011, 57, 50, 48, 83, + 68, 133, 139, 141, 144, -20010, -20005, -19999, -19998, -19997, -19996, -19994, + -19993, -19991, -19990, -19989, -19988, -19987, -19986, -19985, -19984, -19983, -19981, -19980, + -19979, -19978, -19971, -19969, -19967, -19961, -19957, -19956, -19951, -19950, -19948, -19947, + -19946, -19943, -19942, -19941, -19939, -19938, -19937, -19934, -19933, 3, 1, -19932, + -19931, -19930, -19917, -19916, -19897, -19896, -19895, -19894, -19893, -19892, -19891, -19890, + -19889, -19888, -19887, -19886, -19885, -19884, -19883, -19882, -19881, -19880, -19879, -19878, + -19877, -19876, -19874, -19873, -19872, -19871, -19870, -19869, -19868, -19867, -19866, -19865, + -19864, -19863, -19862, -19861, -19860, 0, -19859, -19858, -19857, -19856, -19855, -19854, + -19853, -19852, -19851, -19850, -19849, -19848, -19847, -19846, -19845, -19844, -19843, -19842, + -19841, -19840, -19839, -19838, -19837, -19836, -19835, -19834, -19833, -19832, -19831, -19830, + -19829, -19828, -19827, -19826, -19825, -19824, -19823, -19822, -19821, -19820, -19819, -19818, + -19817, -19816, -19815, -19814, -19813, -19812, -19811, -19810, -19809, -19808, -19807, -19806, + -19805, -19804, -19803, -19802, -19672, 1, 1, 1, 4, 1, 1, 8, + 8, 3, 4, 6, 17, 20, 17, 24, 24, -19671, -19670, -19669, + -19668, 32, -19666, -19665, -19664, 10, 16, 16, 40, 42, 40, 22, + 46, 64, 10, 54, 80, -19663, -19662, -19661, -19660, -19659, -19658, -19657, + -19656, -19655, -19654, -19653, -19652, 82, 1, 5, 1, 8, 8, 8, + 8, 1, 1, 1, 17, 17, 17, 17, 17, 5, 1, 1, + 1, 5, 1, 1, 1, 5, 1, 1, 4, 20, 25, 29, + 25, 32, 1, 3, 1, 3, -19651, -19650, -19649, -19648, -19647, -19646, + -19645, -19644, -19643, -19642, -19641, -19640, 2, 4, 2, 8, 2, 2, + 2, -19639, -19638, -19637, 2, -19636, -19635, -19634, -19633, 1, -19632, -19631, + -19630, -19629, -19628, -19627, -19626, -19625, -19624, -19623, -19622, -19621, -19620, -19619, + -19618, 1, -19617, -19616, -19615, -19614, -19613, -19612, -19611, -19610, -19609, -19608, + -19607, -19606, -19605, -19604, -19603, -19602, 5, 3, 4, 2, 9, 9, + 9, 3, -19601, -19600, 1, 5, -19599, -19598, -19597, -19596, 1, 3, + 1, 3, 1, 3, 1, 3, -19595, -19594, 1, 1, -19593, -19592, + -19591, -19590, -19589, -19588, 3, 1, -19587, -19586, -19585, -19584, -19583, -19582, + -19581, -19580, -19579, -19578, -19577, -19576, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, -19575, 1, -19574, -19573, + 1, 1, -19572, -19571, -19570, -19569, -19568, -19567, -19566, -19565, -19564, -19563, + -19562, -19561, 1, 1, 1, 1, 1, 1, 1, -19560, 1, 1, + 1, -19559, -19558, -19557, -19556, 1, -19555, -19554, 1, 1, -19553, -19552, + -19551, -19550, -19549, -19548, -19547, -19546, -19545, -19544, -19543, -19542, 1, 1, + 1, 9, 2, 8, 1, 3, 1, 5, 16, 16, 16, 16, + 16, 1, -19541, -19540, -19539, 2, -19538, -19537, -19536, -19535, -19534, -19533, + -19532, -19531, -19530, -19529, 0, -19528, 15, 17, 22, 16, 24, 50, + 55, -19527, 48, 48, 64, 52, -19526, 64, -19525, 64, 64, 70, + 64, -19524, 66, 72, 74, 66, -19523, 65, 82, 64, -19522, -19521, + -19520, -19519, 1, 1, 5, -19518, 14, 3, 50, 2, 48, 11, + 51, -19517, -19516, 128, 144, 25, 29, 1, 49, 130, 129, 129, + 137, 62, 128, 128, 128, -19515, -19514, 134, 131, -19513, -19512, -19511, + -19510, -19509, -19508, -19507, -19506, -19505, -19504, -19503, -19502, -19501, -19500, -19499, + -19498, -19497, -19496, -19495, -19494, -19493, -19492, -19491, -19490, -19489, -19488, -19487, + -19486, -19485, -19484, -19483, -19482, 1, 4, 10, 12, 10, 8, 10, + 21, 22, 18, 22, 33, -19481, -19480, 39, 40, 32, 1, 3, + 4, 9, 1, 9, 2, 19, -19479, -19478, -19477, 4, -19476, -19475, + -19474, -19473, 1, 1, 1, 1, 3, 18, 21, 23, -19472, 16, + 18, 16, 81, 16, -19471, -19470, 50, 64, 64, 2, 64, 75, + 64, 72, 64, 83, 64, 37, 81, 97, 92, 120, 8, 8, + -19469, -19468, -19467, 9, 9, -19466, -19465, -19464, -19463, -19462, -19461, -19460, + -19459, 144, 28, 6, 2, -19458, -19457, -19456, -19455, 128, 67, 90, + 128, 128, 130, 136, 129, -19454, -19453, -19452, -19451, -19450, -19449, -19448, + -19447, -19446, -19445, -19444, -19443, -19442, -19440, -19439, -19438, -19437, -19436, -19435, + -19434, -19433, -19432, -19431, -19430, -19429, -19428, -19427, -19426, -19425, -19424, -19423, + -19422, 16, 8, 13, 72, 216, 220, 11, 220, 218, 256, 183, + 257, 248, 265, 211, 280, 163, 149, 218, 154, 273, 222, 218, + 259, 154, 258, 273, 278, 282, 332, 352, 352, 278, 286, 280, + 324, 213, 328, 280, 337, 337, 337, 294, 336, 281, 336, -19421, + -19420, 336, 1, 1, 1, -19419, -19418, -19416, -19415, -19414, -19413, -19412, + -19411, 1, 1, 1, -19410, 1, 2, 4, 4, 9, 10, 2, + 2, 6, 1, 16, 1, 25, 4, 25, 22, 2, 1, 1, + 7, 5, 8, 53, 53, -19409, 52, 64, 64, -19407, -19406, -19405, + -19404, 5, 1, 9, 11, -19402, -19401, 64, 64, -19400, -19399, -19398, + -19397, -19396, 0, 0, 0, -19395, 69, 71, 69, 76, 79, 90, + 97, 100, -19394, 98, 98, 98, -19393, -19392, -19391, -19390, 2, 10, + 12, 9, 9, 16, 9, 16, -19389, -19388, 16, -19387, 0, 0, + -19386, -19385, -19384, -19383, -19382, -19381, -19380, -19379, -19378, -19377, -19376, -19375, + -19374, -19373, -19372, -19371, -19370, -19369, -19368, -19367, -19366, -19365, -19364, -19363, + -19362, -19361, -19360, -19359, -19358, -19357, -19356, -19355, -19354, -19353, 9, 13, + 41, 36, 43, 64, 46, 64, 64, 64, 64, 64, -19352, 64, + 64, -19351, -19350, -19349, 29, -19348, -19347, -19346, -19345, -19344, -19343, -19342, + -19341, -19340, -19339, -19338, -19337, 45, -19336, -19335, -19334, -19333, -19332, -19331, + -19330, -19329, -19328, -19327, -19326, -19325, -19324, -19323, -19322, -19321, -19320, -19319, + -19318, -19317, -19316, -19315, -19314, -19313, -19312, -19311, -19310, 0, 0, 0, + 0, -19309, 1, 1, -19308, 1, 2, 21, 5, 32, 20, 26, + 32, 32, 32, 36, 32, -19307, 0, 0, 0, 0, -19306, -19305, + 0, 0, -19304, -19303, -19302, -19301, -19300, -19299, -19298, -19297, -19296, -19295, + -19294, -19293, 0, 0, 0, -19292, 0, 0, 0, 0, 0, 0, + 0, 0, -19291, -19290, -19289, -19288, -19287, -19286, -19285, -19284, -19283, -19282, + -19281, -19280, 0, 0, -19279, -19278, -19275, -19274, -19273, -19272, -19271, -19270, + -19269, -19268, -19267, -19266, -19265, -19264, -19263, -19262, -19261, -19260, -19259, -19258, + -19253, -19246, -19213, 0, 0, -19193, -19192, -19191, -19190, -19189, -19188, -19187, + -19186, -19185, -19184, -19183, -19182, -19181, -19180, -19179, -19178, -19177, -19173, -19172, + -19171, -19169, -19168, -19167, -19166, -19165, -19164, -19163, -19162, -19161, -19160, -19159, + -19158, -19157, 0, -19156, 0, -19155, 0, 0, 0, 0, -19154, -19153, + -19152, -19151, -19150, -19149, -19148, -19147, -19146, -19145, -19144, -19143, -19142, -19141, + -19140, -19139, -19138, -19137, -19136, -19135, -19134, -19133, -19132, -19131, -19130, -19129, + -19128, -19127, -19126, -19125, -19124, -19123, -19122, -19121, -19120, -19119, 0, 0, + -19118, -19117, 0, 0, 0, 0, 0, 0, 0, 0, -19116, -19115, + -19114, -19113, -19112, -19111, -19110, -19109, -19108, -19107, -19106, -19105, -19104, -19103, + -19102, -19101, -19100, -19099, -19098, -19097, -19096, -19095, -19094, -19093, 0, 0, + -19092, -19091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -19090, -19089, 19, 20, + 16, 19, 19, 28, 37, 67, 68, 70, -19088, -19087, -19086, -19085, + 31, 59, 64, 66, 64, 66, 64, 66, 64, -19084, 65, 66, + 88, 91, 65, 66, 97, 125, 81, 99, 103, 117, 124, 288, + 295, 315, 384, 388, -19083, -19082, -19081, -19080, 310, 1, 228, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 18, 42, 10, 33, 33, 37, 33, 45, 82, 88, -19079, -19078, + -19077, -19076, -19075, -19074, -19073, -19072, 74, 74, 76, 78, 97, 101, + 96, 96, 96, 96, 96, 96, 96, 111, 96, 155, 1, 4, + 4, 1, 8, 8, 8, -19071, -19070, -19069, -19068, -19067, -19066, -19065, + -19064, 6, 3, -19063, -19062, -19061, 32, 32, 32, 36, 32, 36, + 38, 44, 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 85, -19060, -19059, + -19058, 83, -19057, 0, -19056, -19055, -19054, -19053, -19052, -19051, 274, 274, + 0, 259, 1, 1, 1, 257, 256, 256, 257, -19050, 262, -19049, + -19048, -19047, -19046, -19045, -19044, 1, 1, 1, 1, 9, 9, 1, + 1, 1, 1, 1, 1, 263, 265, 1, 1, 1, 264, -19043, + 260, -19042, -19041, 265, 261, -19040, 259, -19039, 288, -19038, 288, -19037, + -19036, 289, 1, 1, 1, 1, -19035, -19034, 1, 1, 278, -19033, + 288, 288, 288, -19032, -19031, 256, 1, 1, 1, 1, 1, 1, + 1, 256, 257, 6, 28, 265, -19030, 265, -19029, 1, 264, -19028, + 267, 0, -19027, 276, -19026, 258, 1, 1, 1, 1, 1, 1, + 1, 12, 2, 11, 13, 16, -19025, -19024, -19023, -19022, -19021, -19020, + -19019, -19018, -19017, -19016, -19015, -19014, 1, 1, 4, 1, 1, 8, + 1, 3, 4, 6, 2, -19013, -19012, -19011, -19010, 1, 2, 4, + 1, 8, 8, 2, 2, 1, -19009, -19008, 4, 2, -19007, -19006, + -19005, -19004, -19003, -19002, -19001, -19000, 65, 68, 65, -18999, 72, 71, + 119, 73, -18998, -18997, -18996, -18995, -18994, -18993, -18992, -18991, -18990, -18989, + -18988, -18987, -18986, -18985, -18984, -18983, -18982, -18981, -18980, -18979, -18978, -18977, + -18976, -18975, -18974, -18973, -18972, -18971, -18970, -18969, -18968, -18967, -18966, -18965, + -18964, -18963, 118, 120, 120, 69, 123, 204, 126, 116, -18962, -18961, + 192, 71, -18960, -18959, -18958, -18957, 160, 160, 209, 317, 219, 336, + 292, 160, -18956, -18955, 337, 339, -18954, -18953, -18952, -18951, -18950, -18949, + -18948, -18947, -18946, -18945, -18944, -18943, -18942, -18941, -18940, -18939, -18938, -18937, + 48, 8, 139, 141, 161, 161, 172, 204, 5, 272, 284, 286, + -18936, -18935, -18934, 324, -18933, -18932, -18931, -18930, -18929, -18928, -18927, -18926, + -18925, -18924, -18923, -18922, -18921, -18920, -18919, -18918, -18917, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18916, -18915, + -18914, -18913, 0, -18912, -18911, -18910, 0, 0, 0, 0, 0, 0, + 0, 0, -18909, -18908, -18907, -18906, -18905, -18904, -18903, -18902, -18901, -18900, + -18899, -18898, -18897, -18896, -18895, -18894, -18893, -18892, -18891, -18890, -18889, -18888, + -18887, -18886, -18885, -18884, -18883, -18882, -18881, -18880, -18879, -18878, -18877, -18876, + -18875, -18874, -18873, -18872, -18871, -18870, -18869, -18868, -18867, -18866, -18865, -18864, + -18863, -18862, -18861, -18860, -18859, -18858, 0, 0, 0, -18857, 0, 0, + 0, 0, 0, 0, 0, -18856, 12, 16, 16, 19, 17, 19, + 27, 38, 49, 38, 48, 54, 48, 144, 151, 144, -18855, -18854, + -18853, -18852, -18851, -18850, -18849, -18848, -18847, -18846, -18845, -18844, -18843, -18842, + -18841, -18840, -18839, -18838, -18837, 0, -18836, -18835, -18834, 0, 0, 0, + 0, 0, 0, 0, 0, -18833, 1, 1, 1, 1, 1, 1, + 1, 1, -18832, 4, 4, 17, -18831, -18830, -18829, -18828, 1, 1, + 1, -18827, -18826, 1, 1, -18825, -18824, -18823, -18822, -18821, -18820, -18819, + -18818, 1, -18817, -18816, -18815, -18814, -18813, -18812, -18811, -18810, -18809, -18808, + -18807, -18806, -18805, -18804, -18803, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -18802, -18801, -18800, + -18799, -18798, -18797, -18796, -18795, 0, 0, 0, 0, 0, 0, 0, + 0, -18794, -18793, -18792, -18791, -18790, -18789, -18788, -18787, -18786, -18785, -18784, + -18783, -18782, -18781, -18780, -18779, -18778, -18777, -18776, -18775, -18774, -18773, -18772, + -18771, -18770, -18769, -18768, -18767, -18766, -18765, -18764, -18763, -18762, -18761, -18760, + -18759, -18758, -18757, -18756, -18755, -18754, -18753, -18752, -18751, -18750, -18749, -18748, + -18747, -18746, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, + 1, 1, 2, 2, 16, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 5, 31, 1, 32, 2, 4, -18745, -18744, + -18743, -18742, -18741, -18740, -18739, -18738, -18737, -18736, -18735, -18734, -18733, -18732, + -18731, -18730, 1, 1, 1, 5, 1, 1, 8, 5, 1, 3, + 1, 16, -18729, -18728, -18727, -18726, -18725, -18724, -18723, -18722, -18721, -18720, + -18719, -18718, -18717, -18716, -18715, -18714, -18713, -18712, -18711, -18710, -18709, -18708, + -18707, -18706, -18705, -18704, -18703, -18702, -18701, -18700, -18699, -18698, -18697, -18696, + -18695, -18694, 1, 1, 4, 8, 10, 8, 14, 16, 16, 16, + 16, -18693, 16, 16, 16, 3, -18692, -18691, -18690, -18689, -18688, -18687, + -18686, -18685, 3, -18684, -18683, -18682, 8, 2, 8, 10, -18681, -18680, + -18679, -18678, -18677, -18676, -18675, -18674, -18673, -18672, -18671, -18670, -18669, -18668, + -18667, -18666, 8, 10, 14, 18, 18, 21, 21, 18, -18665, -18664, + -18663, 18, -18662, -18661, -18660, -18659, -18658, -18657, -18656, -18655, -18654, -18653, + -18652, -18651, -18650, -18649, -18648, -18647, -18646, -18645, -18644, -18643, -18642, -18641, + -18640, -18639, -18638, -18637, -18636, -18635, -18634, -18633, -18632, -18631, -18630, -18629, + -18628, -18627, -18626, -18625, -18624, -18623, -18622, -18621, -18620, -18619, -18618, -18617, + -18616, -18615, -18614, -18613, -18612, -18611, -18610, -18609, -18608, -18607, -18606, -18605, + -18604, -18603, -18602, -18601, -18600, -18599, -18598, -18597, -18596, -18595, -18594, -18593, + 1, 1, -18592, 1, 1, -18591, -18590, -18589, -18588, -18587, -18586, -18585, + -18584, -18583, -18582, -18581, -18580, -18579, -18578, -18577, -18576, 0, -18575, -18574, + -18573, -18572, 1, 1, -18571, 1, 1, 1, 1, 1, 2, 2, + 8, 3, 1, 3, 1, 17, 1, 16, 1, 7, 1, -18570, + -18569, 1, 1, 5, 1, 1, 1, 6, 1, 39, 2, 50, + 13, 11, -18568, -18567, -18566, -18565, -18564, -18563, -18562, -18561, -18560, -18559, + -18558, -18557, -18556, -18555, -18554, -18553, 16, 16, 16, 16, -18552, -18551, + -18550, -18549, -18548, -18547, -18546, -18545, -18544, -18543, -18542, -18541, 1, 5, + 5, 1, 8, 12, 8, 26, 2, 2, 2, 38, 3, 33, + 44, 48, 32, 32, 32, 32, 32, 40, 32, 32, -18540, -18539, + 32, -18538, -18537, -18536, -18535, -18534, 24, 24, 68, 24, 64, 64, + 72, 64, -18533, -18532, -18531, -18530, -18529, -18528, -18527, -18526, 88, 88, + 88, 88, 128, 128, 128, -18525, -18524, 128, 128, -18523, -18522, -18521, + -18520, 141, 2, 4, 1, 3, 8, 2, 2, 1, 1, 1, + 1, 16, 1, 17, 1, -18519, -18518, -18517, -18516, -18515, -18514, -18513, + -18512, -18511, -18510, -18509, -18508, -18507, -18506, -18505, -18504, -18503, -18502, -18501, + -18500, -18499, -18498, -18497, 0, -18496, -18495, -18494, -18493, -18492, 0, -18491, + 0, -18490, -18489, -18488, -18487, -18486, -18485, -18484, -18483, -18482, -18481, -18480, + -18479, -18478, -18477, -18476, -18475, -18474, -18473, -18472, -18471, -18470, -18469, -18468, + 0, 0, -18467, -18466, -18465, -18464, 0, 0, 0, -18463, 1, 1, + -18462, -18461, 1, 1, -18460, 1, 1, 1, 1, -18459, -18457, -18451, + -18449, 1, 1, 1, -18448, -18447, 1, 1, -18444, 1, 1, 1, + 1, 1, -18443, -18442, -18441, -18440, -18439, -18438, -18437, -18436, -18435, -18434, + -18433, -18432, -18431, -18430, -18429, -18428, 0, 0, 0, -18427, -18426, -18425, + -18424, 1, 0, 0, -18423, 1, 1, 4, 4, 1, -18422, -18421, + 9, -18420, -18419, -18418, -18417, -18416, -18415, -18414, -18413, -18412, -18411, -18410, + -18409, -18408, -18407, -18406, -18405, -18404, -18403, -18402, -18401, -18400, -18399, -18398, + -18397, -18396, -18395, -18394, -18393, -18392, -18391, -18390, -18389, -18388, 2, 5, + 12, -18387, -18386, 10, 26, 34, -18385, -18384, -18383, 33, 37, 44, + 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, -18382, + 1, -18381, 1, -18380, 1, -18379, 1, 1, 4, 6, -18378, -18377, + 24, 9, 16, 32, 16, 32, -18376, -18375, 18, 2, 1, 1, + 4, -18374, -18373, 2, 2, 2, 1, -18372, 5, 50, -18371, -18370, + 3, 1, 4, 6, 12, 12, -18369, 23, 21, -18368, -18367, -18366, + 16, 116, -18365, -18364, 22, 14, 5, 10, 34, 2, 35, 64, + 66, 69, 64, 64, 64, 64, 66, 64, 79, 1, 1, 6, + 8, -18363, -18362, 9, 13, 27, 23, 7, 32, 22, 32, 23, + 32, 28, 14, 16, 16, 19, 16, 16, 25, 16, 16, 43, + 130, 47, 136, 143, 148, 3, 3, 7, 9, -18361, 9, 20, + 15, 31, 17, 129, -18360, 24, 131, 136, 142, 16, 16, 20, + 20, 16, 27, 31, 154, 145, 170, 144, 186, 152, 184, 165, + 185, -18359, -18358, 3, 3, -18357, -18356, -18355, -18354, -18353, -18352, -18351, + -18350, -18349, -18348, -18347, -18346, 1, 7, 13, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 18, 16, 33, -18345, -18341, -18340, + -18339, -18338, -18337, -18336, -18335, -18334, -18333, -18332, -18331, -18330, -18329, -18328, + -18327, -18326, -18325, -18324, -18323, -18322, -18321, -18320, -18319, 2, 1, 1, + -18318, 5, 11, 2, 13, -18317, -18316, -18315, -18314, -18313, -18312, -18311, + -18310, -18309, -18308, -18307, -18306, -18305, -18304, -18303, -18302, -18301, -18300, -18299, + -18298, -18297, -18296, -18295, -18294, -18293, -18292, -18291, -18290, -18289, -18288, -18287, + -18286, -18285, -18284, -18283, -18282, -18281, -18280, -18279, -18278, -18277, -18276, -18275, + -18274, -18273, -18272, -18271, -18270, -18269, -18268, -18267, -18266, -18265, -18264, -18263, + -18262, -18261, -18260, -18259, -18258, -18257, -18256, -18255, -18254, 1, 1, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 30, 32, 18, 16, 20, 16, 26, 16, 30, 86, 17, 38, + 87, 96, 108, 108, 112, 112, 96, 96, 96, -18253, -18252, 96, + 96, -18251, -18250, -18249, -18248, -18247, -18246, -18245, -18244, 98, -18243, -18242, + -18241, -18240, -18239, -18238, -18237, -18236, -18235, -18234, -18233, -18232, -18231, -18230, + -18229, -18228, 1, 6, 6, -18227, -18226, 9, 12, 1, -18225, -18224, + 1, 4, -18223, -18222, -18221, -18220, -18219, -18218, -18217, -18216, -18215, -18214, + -18213, -18212, -18211, -18210, -18209, -18208, -18207, -18206, -18205, 0, -18204, -18203, + -18202, 0, 0, 0, 0, -18201, -18200, -18199, -18198, -18197, -18196, -18195, + -18194, -18193, -18192, -18191, -18190, -18189, -18188, -18187, -18186, -18185, -18184, -18183, + -18182, -18181, -18180, -18179, -18178, -18177, -18176, -18175, -18174, -18173, -18172, -18171, + -18170, -18169, -18168, -18167, -18166, -18165, -18164, -18163, -18162, -18161, -18160, -18159, + -18158, -18157, -18156, -18155, -18154, -18153, -18152, -18151, -18150, -18149, -18148, -18147, + -18146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18145, -18144, -18143, -18142, 0, 0, + -18141, 0, -18140, -18139, -18138, 0, 0, 0, -18137, 1, -18136, 1, + -18135, -18134, 1, -18133, -18132, -18131, 1, 1, -18130, -18129, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -18128, -18127, + -18126, 1, 1, 1, 1, -18125, 0, 0, 0, 0, 0, -18124, + 0, -18123, -18122, -18121, 0, -18120, -18119, 0, -18118, 1, 1, 1, + 1, -18117, -18116, -18115, 1, 1, -18114, -18113, -18112, 1, 1, 1, + 1, 1, -18111, -18110, -18109, -18108, 1, 1, -18107, -18106, -18105, -18104, + -18103, 3, -18102, 2, -18101, 0, -18100, -18099, 17, -18098, -18097, -18096, + -18095, -18094, -18093, -18092, -18091, -18090, -18089, -18088, -18087, 1, 1, 1, + 4, -18086, -18085, -18084, -18083, -18082, -18081, -18080, -18079, -18078, -18077, -18076, + -18075, 3, -18074, -18073, -18072, -18071, -18070, -18069, -18068, -18067, -18066, -18065, + -18064, -18063, -18062, -18061, -18060, 0, -18059, -18058, -18057, -18056, -18055, -18054, + -18053, -18052, 0, 0, -18051, -18050, 0, 0, 0, -18049, -18048, -18047, + -18046, -18045, -18044, -18043, -18042, 0, 0, 0, 0, 0, 0, 0, + 0, -18041, -18040, -18039, -18038, -18037, -18036, -18035, -18034, -18033, -18032, -18031, + -18030, 0, -18029, -18028, -18027, -18026, -18025, -18024, -18023, -18022, -18021, -18020, + -18019, -18018, -18017, -18016, -18015, -18014, -18013, -18012, -18011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18010, -18009, -18008, -18007, -18006, 0, 0, -18005, -18004, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18003, -18002, -18001, -18000, -17999, -17998, -17997, -17996, -17995, -17994, -17993, + -17992, -17991, -17990, -17989, -17988, -17987, -17986, -17985, -17984, -17983, -17982, -17981, + -17980, -17979, -17978, -17977, -17976, -17975, -17974, -17973, -17972, 0, -17971, -17970, + -17969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17968, -17967, -17966, -17965, -17964, -17963, -17962, -17961, -17960, -17959, -17958, + -17957, -17956, -17955, -17954, -17953, -17952, -17951, -17950, -17949, -17948, -17947, -17946, + -17945, -17944, -17943, -17942, -17941, -17940, -17939, -17938, -17937, -17936, -17935, -17934, + -17933, -17932, -17931, -17930, -17929, -17928, -17927, -17926, -17925, -17924, -17923, -17922, + -17921, 0, -17920, -17919, -17918, 0, 0, 0, 0, -17917, -17916, 0, + 0, -17915, -17914, -17913, -17912, -17911, -17910, -17909, -17908, -17907, -17906, -17905, + -17904, -17903, -17902, -17901, -17900, -17899, -17898, -17897, -17896, -17895, -17894, -17893, + -17892, -17891, -17890, -17889, -17888, -17887, -17886, -17885, -17884, -17883, -17882, -17881, + -17880, -17879, -17878, -17877, -17876, -17875, -17874, -17873, -17872, -17871, -17870, -17869, + -17868, -17867, -17866, -17865, -17864, -17863, -17862, -17861, -17860, -17859, -17858, -17857, + -17856, -17855, -17854, -17853, -17852, -17851, -17850, -17849, -17848, -17847, -17846, -17845, + -17844, -17843, -17842, -17841, -17840, -17839, -17838, -17837, -17836, -17835, -17834, -17833, + -17832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17831, -17830, -17829, -17828, -17827, -17826, -17825, + -17824, 0, 0, 0, -17823, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -17822, -17821, -17820, -17819, -17818, -17817, + -17816, -17815, -17814, -17813, -17812, -17811, 0, 0, 0, 0, -17810, -17809, + -17808, -17807, -17806, -17805, -17804, -17803, -17802, -17801, -17800, -17799, -17798, -17797, + -17796, -17795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17794, -17793, -17792, -17791, -17790, -17789, -17788, + -17787, -17786, -17785, -17784, -17783, 0, -17782, -17781, -17780, -17779, -17778, -17777, + -17776, -17775, -17774, -17773, -17772, -17771, -17770, -17769, -17768, -17767, -17766, -17765, + -17764, -17763, -17762, -17761, -17760, -17759, -17758, -17757, -17756, -17755, -17754, -17753, + -17749, -17748, -17747, -17746, -17745, -17744, -17743, -17742, -17741, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -17740, -17739, -17738, + -17737, 0, 0, 0, 0, 0, -17736, -17735, 0, 0, -17734, -17733, + -17732, 1, -17730, -17729, -17728, -17727, -17726, -17724, -17723, -17722, -17721, -17720, + -17719, -17718, -17716, -17714, -17713, -17712, -17708, -17706, -17703, -17702, -17700, -17699, + -17698, 0, -17697, -17696, -17692, 0, 0, 0, -17691, -17690, -17686, -17682, + 0, 0, 0, 0, -17681, 0, 0, 0, 0, 0, 0, 0, + 0, -17680, -17677, -17676, -17675, 0, 0, 0, -17674, 0, 0, 0, + 0, 0, 0, 0, 0, -17673, -17672, -17671, 0, -17670, -17669, -17668, + -17667, -17666, -17665, -17664, -17663, -17662, -17661, -17660, -17659, -17658, -17657, -17656, + -17655, -17654, -17653, -17652, -17651, -17650, -17649, -17648, -17647, -17646, -17645, -17644, + -17643, -17642, -17641, -17640, -17639, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -17638, -17637, -17636, -17635, 1, 1, -17634, + -17633, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -17632, -17631, -17630, -17629, 0, 0, 0, 0, 0, 0, 0, + 0, -17628, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -17627, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17626, -17625, + -17624, 0, -17623, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17622, -17621, -17620, -17619, -17618, -17617, -17616, -17615, -17614, -17613, -17612, + -17611, -17610, -17609, -17608, -17607, -17606, -17605, -17604, -17603, -17602, -17601, -17600, + -17599, -17598, -17597, -17596, -17595, -17594, -17593, -17592, -17591, -17590, 0, 0, + 0, -17589, -17588, -17587, -17586, -17585, -17584, -17583, -17582, -17581, -17580, -17579, + -17578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17577, -17576, -17575, -17574, -17573, -17572, -17571, + -17570, -17569, -17568, -17567, -17566, -17565, -17564, -17563, -17562, -17561, -17560, -17559, + -17558, -17557, -17556, -17555, -17554, -17553, -17552, -17551, -17550, -17549, -17548, -17547, + -17546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17545, -17544, -17543, -17542, -17541, -17540, -17539, + -17538, 0, 0, -17537, -17536, 0, 0, 0, 0, -17535, -17534, -17533, + -17532, -17531, -17530, -17529, -17528, 0, 0, 0, -17527, 0, 0, 0, + 0, -17526, -17525, -17524, -17523, -17522, -17521, -17520, -17519, -17518, -17517, -17516, + -17515, -17514, -17513, -17512, -17511, -17510, 0, 0, 0, -17509, 1, 1, + -17508, -17507, 1, 1, 1, 1, 1, 1, 1, 1, -17506, -17505, + -17504, -17503, -17502, -17501, -17500, 0, 0, 0, 0, 0, 0, 0, + 0, -17499, -17498, -17497, -17496, -17495, -17494, -17493, -17492, -17491, -17490, -17489, + -17488, -17487, -17486, -17485, -17484, -17483, -17482, 0, 0, -17481, -17480, -17479, + -17478, -17477, -17476, -17475, -17474, -17473, -17472, -17471, -17470, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17469, -17468, -17467, -17466, -17465, -17464, -17463, + -17462, -17461, -17460, -17459, -17458, -17457, -17456, -17455, -17454, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17453, 0, 0, -17452, -17451, -17450, -17449, + -17448, -17447, -17446, -17445, -17444, -17443, -17442, -17441, -17440, 0, 0, 0, + 0, -17439, -17438, -17437, 0, -17436, -17435, -17434, -17433, -17432, 0, 0, + -17431, -17430, -17429, 0, -17428, -17427, -17426, -17425, 0, 0, 0, -17424, + -17423, 0, 0, -17422, 0, -17421, -17420, -17419, -17418, -17417, -17416, -17415, + -17414, -17413, -17412, 0, -17411, -17410, -17409, -17408, -17407, 0, 0, 0, + -17406, 0, 0, 0, 0, 0, 0, 0, 0, -17405, -17404, -17403, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17402, + -17401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17400, -17399, -17398, -17397, -17396, -17395, -17394, -17393, -17392, -17391, -17390, + -17389, -17388, 0, -17387, -17386, -17385, -17384, -17383, -17382, 0, -17381, -17380, + -17379, -17378, -17377, 0, -17376, -17375, 0, -17374, -17373, -17372, -17371, -17370, + -17369, -17368, -17367, -17366, -17365, -17364, -17363, -17362, -17361, -17360, -17359, -17358, + -17357, -17356, -17355, -17354, -17353, -17352, -17351, -17350, -17349, 0, 0, 0, + -17348, 0, 0, 0, 0, -17347, -17346, -17345, -17344, -17343, -17342, -17341, + -17340, -17339, -17338, -17337, -17336, 0, -17335, -17334, -17333, -17332, -17331, -17330, + -17329, -17328, -17327, -17326, -17325, -17324, -17323, -17322, -17321, -17320, -17319, -17318, + -17317, -17316, -17315, -17314, -17313, -17312, -17311, -17310, -17309, 0, 0, -17308, + -17307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -17306, 0, -17305, + -17304, -17303, -17302, -17301, -17300, -17299, -17298, -17297, -17296, -17295, -17294, -17293, + -17292, -17291, -17258, -17257, -17256, -17255, -17254, -17253, -17252, -17251, -17249, -17248, + -17247, -17246, -17234, -17230, -17229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -17223, -17204, -17202, + -17201, -17200, -17199, -17198, -17196, -17195, -17189, -17188, -17187, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17186, -17185, -17182, -17180, -17166, -17162, -17160, + -17159, -17158, -17157, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, -17156, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -17155, -17154, -17153, -17151, -17150, -17149, -17148, -17147, -17146, -17145, 0, + 0, 0, 0, 0, 0, -17144, -17143, -17142, -17141, -17140, -17139, -17138, + -17137, -17136, -17135, -17134, -17133, 0, -17132, -17131, -17130, 0, 0, 0, + 0, 0, 0, 0, 0, -17129, -17128, -17127, -17126, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17125, + -17124, -17123, -17122, -17121, -17120, -17119, -17118, -17117, -17116, -17115, -17114, -17113, + -17112, -17111, -17110, -17109, -17108, -17107, -17106, -17105, -17104, -17103, -17102, -17101, + -17100, -17099, -17098, -17097, -17096, -17095, -17094, -17093, -17092, -17091, -17090, -17089, + -17088, -17087, -17086, -17085, -17084, -17083, -17082, -17081, -17080, -17079, -17078, -17077, + -17076, -17075, -17074, -17073, -17072, -17071, -17070, -17069, -17068, -17067, -17066, -17065, + -17064, -17063, -17062, -17061, -17060, -17059, -17058, -17057, -17056, -17054, -17053, -17052, + -17051, -17049, -17048, -17047, -17046, -17045, -17044, -17043, -17042, -17041, -17040, -17038, + -17037, -17036, -17035, -17034, -17033, -17032, -17031, -17030, -17029, -17028, -17027, -17025, + -17024, -17023, -17022, -17021, -17020, -17019, -17018, -17016, -17015, -17014, -17013, -17012, + -17011, -17010, -17009, -17008, -17007, -17006, -17004, -17002, -17000, 1, 1, 4, + 4, 1, 1, 12, 12, 20, 20, 16, 16, 24, 24, 24, + 24, 2, 2, 41, 42, 40, 43, 41, 42, 32, 48, 52, + 55, 56, 56, 56, 56, -16998, -16997, -16996, -16995, -16994, -16991, -16990, + -16985, -16984, -16983, -16981, -16980, -16979, -16977, -16973, -16970, 16, 16, 16, + 16, 25, 26, 28, 31, 19, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 2, 2, 18, 18, 2, 1, -16969, -16967, 1, + 1, -16966, -16965, -16964, -16963, -16962, -16961, -16960, -16959, 1, -16958, 2, + 4, -16957, -16956, -16955, -16953, -16946, -16942, -16941, -16940, -16939, -16938, -16937, + -16936, -16935, -16934, -16933, -16932, -16931, -16930, -16929, -16928, -16927, -16926, -16925, + -16924, -16923, -16922, -16921, -16920, -16919, -16918, -16917, -16916, -16915, -16914, -16913, + -16912, -16911, -16910, -16909, -16908, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, -16907, -16906, -16905, -16904, -16903, -16902, -16901, -16900, -16899, + -16898, -16897, -16896, -16895, -16894, -16893, -16892, -16891, -16890, -16889, -16888, -16887, + -16886, -16885, -16884, -16883, -16882, 0, 0, 0, -16881, 0, 0, 0, + 0, 0, 0, 0, 0, -16880, -16879, -16878, -16877, -16876, -16875, -16874, + -16873, -16872, -16871, -16870, -16869, -16868, -16867, -16866, -16865, -16864, -16863, -16862, + -16861, -16860, -16859, -16858, -16857, 0, 0, -16856, -16855, 0, 0, 0, + 0, 0, 0, 0, 0, -16854, 0, 0, 0, 0, -16853, -16852, + -16851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -16850, -16849, -16848, + -16847, -16846, -16845, -16844, -16843, 0, 0, -16842, -16841, 0, 0, 0, + 0, -16839, -16838, -16837, -16836, -16835, -16833, -16830, -16829, -16828, -16826, -16825, + -16824, -16823, -16822, -16821, -16820, -16819, -16818, -16817, -16816, -16815, -16814, -16813, + -16812, -16811, -16810, -16809, -16806, 0, 0, 0, 0, 0, -16805, -16803, + -16799, -16782, 0, -16781, -16780, -16778, 0, 0, 0, 0, 0, 0, + 0, 0, -16776, -16775, -16773, -16772, -16769, -16768, -16767, -16766, -16764, -16763, + -16762, -16761, -16760, -16759, -16758, -16757, -16756, -16755, -16754, -16752, 0, -16751, + -16750, -16749, -16748, -16747, -16746, -16745, 0, -16744, -16743, -16742, -16740, -16739, + -16738, -16737, 0, -16736, -16735, -16734, -16733, -16732, -16731, -16730, 0, -16729, + -16728, -16727, -16726, -16725, -16724, -16723, 0, -16722, -16721, -16720, -16719, -16718, + -16717, -16716, 0, -16715, -16714, 1, 1, 1, 1, 1, -16713, 1, + 1, 1, 1, 1, 1, 1, -16712, 1, 1, 1, -16711, -16710, + -16709, -16708, -16707, -16706, -16705, -16704, -16703, -16702, -16701, -16700, -16699, -16698, + -16697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16696, 1, 1, 1, 1, 1, 1, + 1, -16695, 1, 1, 1, -16694, -16693, -16692, -16691, -16690, -16689, -16688, + -16687, -16686, -16685, -16684, -16683, -16682, -16681, -16680, -16679, -16678, -16677, -16676, + -16675, 1, 1, 1, 1, 1, 1, 1, 1, -16674, -16673, 1, + 1, -16672, -16671, -16670, -16669, -16668, -16667, -16666, -16665, -16664, -16663, 0, + -16662, -16661, 0, 0, 0, 0, 0, 0, -16660, 0, -16659, -16658, + -16657, -16656, -16655, -16654, -16653, -16652, -16651, -16634, -16631, -16606, -16602, -16601, + -16598, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, -16597, -16596, -16595, -16594, -16593, -16592, + -16591, -16590, -16589, -16588, -16587, -16586, -16585, -16584, -16583, 0, -16582, -16581, + -16580, -16579, -16578, -16577, -16576, -16575, 0, 0, 0, 0, 0, 0, + 0, -16574, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -16573, -16572, 1, 1, -16571, -16570, -16569, -16568, -16567, -16566, -16565, + -16564, -16563, -16562, -16561, 1, -16560, -16559, -16558, -16557, -16556, -16555, -16554, + -16553, -16552, -16551, -16550, -16549, -16548, -16547, -16546, -16545, -16544, -16543, -16542, + -16541, -16540, -16539, -16538, -16537, -16536, -16535, -16534, -16533, -16532, -16531, -16530, + -16529, -16528, -16527, -16526, -16525, -16524, -16523, -16522, -16521, -16520, -16519, -16518, + -16517, -16516, -16515, -16514, -16513, -16512, -16511, -16510, -16509, -16508, -16507, -16506, + -16497, -16496, -16495, -16494, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16493, 0, -16492, -16491, -16490, -16489, 0, 0, + 0, -16486, -16483, 0, 0, 0, 0, -16482, -16481, -16480, -16479, -16477, + -16476, -16475, -16471, -16470, -16469, -16468, -16466, -16465, -16464, -16463, -16462, -16461, + -16460, -16459, -16442, -16437, -16435, -16417, -16408, -16394, -16393, -16392, -16391, -16390, + -16389, -16388, -16387, -16386, -16385, -16384, -16383, -16382, -16381, -16380, -16379, -16378, + -16377, -16376, -16375, -16374, -16373, -16372, -16371, -16370, -16369, -16367, -16366, -16365, + -16364, -16363, -16362, -16361, -16360, -16359, -16358, -16357, -16356, -16355, 0, -16354, + -16353, -16352, -16351, -16350, -16349, -16348, -16347, -16346, -16345, -16344, -16343, -16342, + -16339, -16334, 0, -16330, -16329, -16328, -16327, -16326, -16325, -16324, -16323, -16322, + -16321, -16320, -16319, -16318, -16317, -16316, -16315, -16314, -16313, -16312, -16311, -16310, + -16309, -16308, -16307, -16306, -16305, -16304, -16303, -16302, -16301, -16300, -16299, -16298, + 0, 0, -16297, -16296, -16295, -16294, -16293, -16292, -16291, -16290, -16289, -16288, + -16287, -16286, -16285, -16284, -16283, -16282, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -16281, -16280, -16279, + -16278, -16277, -16276, -16275, -16274, -16273, -16272, -16271, -16270, -16269, -16268, -16267, + -16266, -16265, -16264, -16263, -16262, -16261, -16260, -16259, -16258, -16257, -16256, -16255, + -16254, -16253, -16252, -16251, -16250, -16249, -16248, -16247, -16246, -16245, -16244, -16243, + -16242, -16241, -16240, -16239, -16238, -16237, -16236, -16235, -16234, -16233, -16232, -16231, + -16230, -16229, -16228, -16227, -16226, -16225, -16224, -16223, -16222, -16221, -16220, -16219, + -16218, 0, -16217, -16216, -16215, 0, 0, 0, 0, 0, 0, 0, + 0, -16214, 0, 0, 0, -16213, -16212, -16211, -16210, -16209, -16208, -16207, + -16206, -16205, -16204, -16203, -16190, -16185, -16182, -16181, -16179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -16178, -16177, -16176, -16175, -16173, -16172, + -16171, -16170, -16169, -16168, -16167, -16166, -16165, -16164, -16163, -16162, -16161, -16160, + -16159, -16157, -16155, -16140, -16138, -16135, -16134, -16133, -16131, -16127, -16124, -16122, + -16121, -16120, -16119, -16118, -16117, -16116, -16115, -16114, -16113, -16112, -16111, -16110, + -16109, -16108, -16107, -16106, -16105, -16104, -16103, -16102, -16101, -16100, -16099, -16098, + -16097, -16095, -16094, -16093, -16092, -16091, -16090, -16089, -16088, -16087, -16086, -16084, + -16083, -16082, -16081, -16080, -16079, -16078, -16077, -16076, -16075, -16059, -16053, -16049, + -16048, -16047, -16045, -16044, -16043, -16042, -16038, -16037, -16036, -16035, -16031, -16030, + -16028, -16025, -16024, -16023, -16020, -16019, -16018, -16017, -16014, -16010, -16009, -16008, + -16007, -16006, -16005, -16004, -16003, -16002, -16001, -16000, -15999, -15998, -15997, -15996, + -15995, -15994, -15993, -15992, -15991, -15990, -15989, -15988, -15987, -15986, -15985, -15984, + -15983, -15982, -15981, -15980, -15979, -15978, -15977, -15976, -15975, -15974, -15973, -15972, + -15971, -15970, -15969, -15968, -15967, -15966, -15965, -15964, -15963, -15962, -15961, -15960, + -15959, -15958, -15957, -15956, -15955, -15954, -15953, -15952, -15951, -15950, -15949, -15948, + -15947, -15946, -15945, -15944, -15943, -15942, -15941, -15940, -15939, -15938, -15937, -15936, + -15935, -15934, -15933, -15932, -15931, -15930, -15929, -15928, -15926, -15925, -15924, -15923, + -15922, -15921, -15920, -15919, -15918, -15917, -15916, -15915, -15914, -15913, -15912, -15911, + -15910, -15909, -15908, -15907, -15906, -15905, -15904, -15903, -15902, -15901, -15900, -15899, + -15897, -15896, -15895, -15894, -15893, -15892, -15891, -15890, -15889, -15888, -15887, -15886, + -15885, -15884, -15883, -15882, -15880, -15879, -15878, -15877, -15876, -15874, -15873, -15872, + -15871, -15870, 2, 1, -15869, -15868, -15867, -15866, 1, 1, -15865, -15864, + -15863, -15862, -15861, -15860, -15859, -15858, 1, 2, 4, 1, 1, 2, + 6, 8, 1, 3, 4, 15, -15857, 5, 3, 4, 1, 3, + 4, 16, 1, 1, 5, 7, -15856, 3, 3, 12, -15855, -15854, + -15853, -15852, 1, 1, 4, 1, 1, 1, 1, 8, 1, 1, + 1, 1, 1, 3, 16, 16, -15851, -15849, -15847, -15843, -15842, -15841, + -15840, -15839, -15838, -15835, -15834, -15833, -15832, -15831, -15830, -15829, -15828, -15827, + -15826, -15825, -15824, -15823, -15822, -15821, -15820, -15819, -15818, -15817, -15816, -15815, + -15814, 1, 1, 1, 1, 1, 8, 8, 3, 12, 1, 1, + 5, 1, 16, 16, 17, 24, -15813, -15812, -15811, -15810, -15809, -15808, + -15807, -15806, -15805, -15804, -15803, -15798, -15797, -15796, -15794, -15793, 6, 6, + 8, 8, 4, 4, 4, 4, 4, 4, 5, 41, 4, 4, + 24, 1, 2, 2, 6, 6, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 79, 1, 75, 1, 81, -15792, 89, + 147, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, + 13, 14, 5, 32, 2, 33, 40, 32, 46, 137, 21, 29, + 5, 60, 7, 119, 146, 1, 144, 144, 144, 2, 2, 56, + 84, 154, 16, 116, 118, 130, 132, 147, 181, 191, 9, 158, + 209, 211, 240, 240, 256, 4, 4, 17, 69, 22, 261, 83, + 8, 6, 149, 257, 272, 148, 92, 272, 268, -15791, 57, 207, + 9, 211, -15790, -15789, -15788, -15787, -15786, -15785, -15784, 52, 52, 58, + 52, -15782, -15781, -15780, -15779, -15778, 1, 1, 4, 1, 3, 10, + 16, 16, 12, 1, 15, 2, 1, 1, 4, 177, 206, 265, + 282, 299, 304, 304, 308, 304, 307, 312, 314, 316, 258, 272, + 274, 272, 275, 280, 282, 274, 272, 274, 272, 303, 306, 274, + 317, -15776, -15775, -15774, -15773, -15772, -15771, -15770, -15769, -15768, -15767, -15766, + -15765, -15764, -15763, -15762, -15761, -15760, -15759, -15758, -15757, -15756, -15755, -15754, + -15753, -15752, 0, -15751, -15750, -15749, -15748, 0, 0, 0, -15747, -15746, + -15745, -15744, -15743, -15742, -15741, -15740, -15739, -15738, -15737, -15736, -15735, -15734, + -15733, -15732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 96, + -15731, -15730, -15729, -15728, -15727, -15726, -15725, -15724, -15723, -15722, -15721, -15720, + -15719, -15718, -15717, -15716, -15715, -15714, -15713, 73, 82, 97, -15712, -15711, + -15710, 67, 113, 114, 112, -15709, -15708, -15707, -15706, -15705, 0, 0, + -15704, -15703, 0, 0, 0, 0, -15701, -15700, -15699, -15698, 1, 1, + 9, 34, 35, 38, 49, 50, 49, 57, 56, 1, 4, 8, + 8, 22, 8, 8, 14, 16, 16, 20, 22, 4, 23, 44, + 24, 32, 2, 2, 15, 128, 128, 128, 128, 128, -15697, 128, + 128, 128, 128, 128, 128, -15696, -15694, -15693, 2, -15691, 3, 6, + 4, 128, 128, 128, 128, 128, -15690, -15689, -15688, 128, 4, 4, + 11, -15687, 8, -15686, 16, 2, 20, 1, 65, 67, 65, 2, + 68, 6, 110, 128, 128, 128, -15685, -15684, -15683, 0, 0, -15682, + -15681, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15680, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15678, -15674, + -15673, -15672, -15671, -15670, -15669, -15668, -15667, -15666, -15665, 9, 11, 47, + 16, 48, -15664, -15663, -15662, -15661, -15660, -15659, -15658, -15657, -15656, -15655, + -15654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15653, -15652, + -15651, -15650, -15649, -15648, -15647, -15646, -15645, -15644, -15643, -15642, 0, 0, + -15641, -15640, -15639, -15638, -15637, -15636, -15635, -15634, -15633, -15632, -15631, -15630, + -15629, -15628, -15627, -15622, -15618, -15616, -15614, -15613, -15612, -15610, -15609, -15597, + -15596, -15595, -15594, -15593, -15592, -15591, -15590, -15589, -15588, -15587, -15586, -15585, + -15584, -15583, -15582, -15581, -15580, -15579, 0, 0, 0, -15574, 0, 0, + 0, 0, -15573, -15572, -15570, -15569, -15568, -15567, -15566, -15565, -15564, -15563, + -15562, 48, 53, 151, 60, 146, 164, 56, 167, 13, 7, 148, + 96, 100, 160, 153, 164, 221, -15561, 325, 325, 241, 188, 184, + 189, 190, 338, -15560, 341, 322, 341, 358, 347, -15558, -15557, -15556, + -15555, -15548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15547, -15546, -15543, -15542, -15541, 322, 322, 334, 334, 336, 336, + 336, -15540, -15538, -15537, 336, 135, 67, 79, 96, 126, 152, 152, + 156, 166, -15536, -15535, 186, 168, -15533, -15532, -15531, 0, -15530, -15529, + 3, 0, -15528, -15527, -15526, -15525, -15524, -15523, -15522, -15521, -15520, -15519, + -15518, 248, -15517, 0, 0, -15516, -15515, -15514, -15513, -15512, -15511, -15510, + -15509, -15508, -15507, -15506, -15505, -15504, -15503, -15502, -15501, -15500, -15499, -15494, + -15493, -15492, -15490, -15486, -15482, 0, 0, 0, -15476, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15474, -15472, + -15469, -15467, -15466, -15464, -15463, -15434, 0, 0, -15433, -15432, 0, 0, + 0, 0, -15430, -15429, -15427, 0, -15426, -15425, -15422, -15421, -15420, -15419, + -15416, -15414, -15401, -15399, -15397, -15390, 0, 0, 0, 0, 0, 0, + 0, 0, -15386, -15385, -15384, -15383, -15382, -15381, -15380, -15379, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15378, -15377, -15376, -15375, -15374, -15373, -15372, + -15371, -15241, -15240, -15239, -15238, -15198, -15197, -15196, -15195, -15188, -15187, -15185, + -15178, -15177, -15176, -15175, -15174, -15173, -15172, -15171, -15170, -15169, -15168, -15167, + -15166, -15165, -15164, -15163, -15162, -15161, -15160, -15159, -15158, -15157, -15156, -15155, + -15154, -15153, -15152, -15151, -15150, -15149, -15148, -15147, -15146, -15145, -15144, -15143, + -15142, -15141, -15140, -15139, -15138, -15137, -15136, -15135, -15134, -15133, -15132, -15131, + -15130, -15129, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 64, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, -15128, -15127, -15126, 2, -15125, 1, + 2, 2, 1, 1, 2, 8, 10, -15124, -15123, 2, 2, 8, + 31, 2, -15122, 5, 29, 1, 32, 32, 32, 1, 1, -15121, + -15120, -15119, 1, -15118, -15117, -15116, -15115, -15114, -15113, -15112, -15111, -15110, + -15109, -15108, -15107, -15106, -15105, -15104, -15103, -15102, -15101, -15100, -15099, -15098, + -15097, -15096, -15095, -15094, -15093, -15092, -15091, -15090, -15089, -15088, -15087, -15086, + -15085, -15084, -15083, -15082, -15080, -15079, -15078, -15077, -15076, -15075, -15074, -15073, + -15072, -15071, -15070, -15069, -15068, -15067, -15066, -15065, -15064, -15063, -15062, -15061, + -15060, -15059, -15058, -15057, -15056, -15054, -15053, -15052, -15051, -15050, -15049, -15048, + -15047, -15046, -15045, -15044, -15043, -15042, -15041, -15040, -15039, -15038, -15037, -15036, + -15035, -15034, -15033, -15032, -15031, -15030, -15029, -15028, -15027, -15026, -15025, -15024, + -15023, -15022, -15021, -15020, -15018, -15016, -15015, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 24, + 24, 28, 28, 25, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 150, 160, 160, 160, 128, 128, 133, + 134, 128, 131, 136, 136, 128, 132, 192, 192, 144, 192, 219, + 221, 192, 208, 202, 226, 208, 237, -15013, -15011, -15010, 222, 224, + 224, 233, 234, 232, 235, 2, 4, -15009, 8, 56, 59, -15008, + -15007, -15006, -15005, -15004, -15003, -15002, -15001, -15000, -14999, -14998, -14997, -14995, + -14994, -14993, -14992, -14987, -14986, -14975, -14973, -14972, -14970, -14967, -14925, -14924, + -14923, -14922, -14921, -14920, -14919, -14918, -14917, -14916, -14915, -14914, -14913, -14912, + -14911, -14910, -14909, -14908, -14907, -14906, -14905, -14904, -14903, -14902, -14900, -14899, + -14898, -14897, -14896, -14895, -14894, -14893, -14892, -14891, -14890, -14889, -14888, -14887, + -14886, -14885, -14884, -14883, -14882, -14881, -14880, -14879, -14878, -14877, -14875, -14874, + -14873, -14872, -14871, -14870, -14869, -14868, -14867, -14866, -14865, -14864, -14863, -14862, + -14861, -14860, -14859, -14858, -14857, -14856, -14855, -14854, -14853, -14852, -14851, -14850, + -14849, -14848, -14847, -14846, -14845, -14844, -14843, -14842, -14841, -14840, -14839, -14838, + -14837, -14836, -14835, -14834, -14833, -14832, -14831, -14830, -13567, -13566, -13529, -13528, + -13527, -13526, -13525, -13524, -13523, -13522, -13521, -13520, -13519, 0, 0, -13518, + -13517, 0, 0, 0, 0, -13516, -13515, -13514, -13513, -13512, -13511, -13510, + -13509, -13508, -13507, -13506, -13505, -13504, -13503, -13502, -13501, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -13500, -13499, -13498, + -13497, -13496, -13495, -13494, -13493, -13492, -13491, -13490, -13489, -13488, -13487, -13486, + -13485, -13484, -13483, -13482, -13481, -13480, -13479, -13478, -13477, -13476, -13475, -13474, + -13473, -13469, -13468, 5, 13, 1, 1, 4, 1, 1, 1, 1, + 4, 1, 1, 4, 16, 1, 1, 1, 4, 1, 1, 4, + 1, 1, 1, 1, 38, 1, 1, 4, 1, 1, 1, 1, + 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 60, 76, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, + 1, 8, 8, 1, 1, 1, 1, 1, 1, 55, 95, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, + 8, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, + 48, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 16, 1, 3, 16, 30, 1, 1, 2, 6, + 1, 1, 2, 14, 1, 1, 2, 6, 46, 3, 438, 658, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 4, 4, 1, 1, 8, 8, 1, + 1, 1, 1, 1, 1, 32, 48, 96, 96, 10, 16, 22, + 96, 96, 96, 96, 101, 96, 96, 97, 112, 96, 96, 96, + 96, 100, 100, 96, 96, 104, 104, 96, 96, 96, 96, 96, + 552, 124, 124, 68, 557, 519, 520, 522, 525, 557, 558, 556, + 577, 600, 768, 768, 768, 768, 768, 768, 768, 769, 772, 768, + 768, 768, 776, 768, 768, 768, 768, 768, 768, 768, 789, 768, + 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 768, 768, -13467, -13464, -13463, + -13462, -13461, -13460, -13459, -13458, -13457, -13456, -13455, -13454, -13453, -13450, -13448, + -13447, -13446, -13444, -13443, -13442, -13441, -13440, -13439, -13438, -13437, -13436, -13435, + -13434, -13433, -13430, -13429, -13428, -13427, -13422, -13420, -13419, -13418, -13416, -13415, + -13413, -13412, -13411, -13409, -13407, -13402, -13400, -13396, -13394, -13392, -13391, -13390, + -13389, -13388, -13387, -13386, -13385, -13384, -13383, -13382, -13381, -13380, -13379, -13378, + -13377, -13367, -13364, -13363, -13361, -13356, -13355, -13354, -13352, -13349, -13347, -13344, + -13343, -13342, -13341, -13340, -13339, -13338, -13337, -13336, -13335, -13334, -13333, -13332, + -13331, -13330, -13329, -13328, 92, 94, 283, 289, 933, 935, 939, 941, + 947, 952, 952, 952, 952, 1051, 1017, 952, -13327, -13326, -13325, -13324, + -13323, -13322, -13321, -13320, -13319, -13318, -13317, -13316, -13315, -13314, -13313, -12052, + 1012, 1016, 1015, 915, 918, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 514, 1, 1, 1, + 1, 515, 517, 514, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 16, -12051, -12050, -12049, -12048, + 1, 1, 1, 1, 24, 1, 1, 1, 1, 1, 15, 35, + 57, 3, 4, 2, -12047, -12046, -12045, -12044, -12043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12042, -12041, -12040, -12039, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12038, -12037, -12036, -12035, -12034, -12033, -12032, -12031, -12030, -12029, -12028, + -12027, -12026, -12025, -12024, -12023, -12022, -12021, -12020, -12019, -12018, -12017, -12016, + -12015, -12014, -12013, -12012, -12011, -12010, -12009, -12008, -12007, -12006, -12005, -12004, + -12003, -12002, -12001, -12000, -11999, -11998, -11997, -11996, -11995, -11994, -11993, -11992, + -11991, -11990, -11989, -11988, -11987, -11986, -11985, -11984, -11983, -11982, -11981, -11980, + -11979, -11978, -11977, -11976, -11975, -11974, -11973, -11972, -11971, -11970, -11969, -11968, + -11967, -11966, -11965, -11964, -11963, -11962, -11961, -11960, -11959, -11958, -11957, -11956, + -11955, -11954, -11953, -11952, -11951, -11950, -11949, -11948, -11947, -11946, -11945, -11944, + -11943, -11942, -11941, -11940, -11939, -11938, -11937, -11936, -11935, -11934, -11933, -11932, + -11931, -11930, -11929, -11928, -11927, -11926, -11925, -11924, -11923, -11922, -11921, -11920, + -11919, -11918, -11917, -11916, -11915, -11914, -11913, -11912, -11911, -11910, -11909, -11908, + -11907, -11906, -11905, -11904, -11903, -11902, -11901, -11900, -11899, -11898, -11897, -11896, + -11895, -11894, -11893, -11892, -11891, -11890, -11889, -11888, -11887, -11886, -11885, -11884, + -11883, -11882, -11881, -11880, -11879, -11878, -11877, -11876, -11875, -11874, -11873, -11872, + -11871, -11870, -11869, -11868, -11867, -11866, -11865, -11864, -11863, -11862, -11861, -11860, + -11859, -11858, -11857, -11856, -11855, -11854, -11853, -11852, -11851, -11850, -11849, -11848, + -11847, -11846, -11845, -11844, -11843, -11842, -11841, -11840, -11839, -11838, -11837, -11836, + -11835, -11834, -11833, -11832, -11831, -11830, -11829, -11828, -11827, -11826, -11825, -11824, + -11823, -11822, -11821, -11820, -11819, -11818, -11817, -11816, -11815, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11814, -11813, -11812, -11811, -11810, -11809, -11808, -11807, -11806, -11805, -11804, + -11803, 0, -11802, -11801, -11800, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11799, + -11798, -11797, -11796, -11795, -11794, -11793, -11792, -11791, -11790, -11789, -11788, 0, + 0, -11787, -11786, -11785, -11784, -11783, -11782, -11781, -11780, -11779, -11778, -11777, + -11776, -11775, -11774, -11773, -11772, -11771, -11770, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -11769, -11768, -11767, + -11766, -11765, -11764, -11763, -11762, -11761, -11760, -11759, -11758, -11757, -11756, -11755, + -11754, -11753, -11752, -11751, -11750, -11749, -11748, -11747, -11746, -11745, -11744, -11743, + -11741, -11740, -11739, -11738, -11737, -11736, -11735, -11734, -11733, -11732, -11731, -11730, + -11729, -11727, -11719, -11712, -11711, -11710, -11709, -11708, -11707, -11706, -11705, -11704, + -11703, -11702, -11701, -11700, -11699, -11698, -11697, -11696, -11695, -11694, -11693, -11692, + -11691, -11690, -11689, -11688, -11687, -11686, -11685, -11684, -11683, -11682, -11681, -11680, + -11679, -11678, -11677, -11676, -11675, -11674, -11673, -11672, -11671, -11670, -11669, -11668, + -11667, -11666, -11665, -11664, -11663, -11662, -11661, -11660, -11659, -11658, -11657, -11656, + -11655, -11654, -11653, -11652, -11651, -11650, -11649, -11648, -11647, -11646, -11645, -11644, + -11643, -11642, -11641, -11640, -11639, -11638, -11637, -11636, -11635, -11634, -11633, -11632, + -11631, -11630, -11629, -11628, -11627, -11626, -11625, -11624, -11623, -11622, -11621, -11620, + -11619, -11618, -11617, -11616, -11615, -11613, -11612, -11611, -11610, -11609, -11608, -11607, + -11606, -11605, -11604, -11603, -11602, -11601, -11584, -11583, -11582, -11581, -11579, -11578, + -11574, -11568, -11567, -11566, -11565, -11564, -11563, -11562, -11561, -11560, -11559, -11558, + -11557, -11556, -11555, -11554, -11553, -11552, -11551, -11550, -11549, -11546, -11542, -11536, + -11535, -11533, -11532, -11531, -11530, -11529, -11528, -11527, -11526, -11525, -11524, -11523, + -11522, -11521, -11520, -11519, -11518, -11517, -11516, -11515, -11514, -11513, -11512, -11511, + -11510, -11509, -11508, -11507, -11506, -11505, -11504, -11503, -11502, -11501, -11500, -11499, + -11498, -11497, -11496, -11495, -11494, -11493, -11492, -11491, -11490, -11489, -11488, -11487, + -11486, -11485, -11484, -11483, -11482, -11481, -11480, -11479, -11478, -11477, -11476, -11475, + -11474, -11473, -11472, -11471, -11470, -11469, -11468, -11467, -11466, -11465, -11464, -11463, + -11462, -11461, -11460, -11459, -11458, -11457, -11456, -11455, -11454, -11453, -11452, -11451, + -11450, -11449, -11448, -11447, -11446, -11444, -11443, -11442, -11441, -11440, -11439, -11438, + -11437, -11436, -11435, -11434, -11433, -11432, -11431, -11430, -11429, -11428, -11427, -11426, + -11425, -11408, -11407, -11406, -11405, -11403, -11402, -11398, -11392, -11391, -11390, -11389, + -11388, -11387, -11386, -11385, -11384, -11383, -11382, -11381, -11380, -11379, -11378, -11377, + -11376, -11375, -11374, -11373, -11372, -11371, -11370, -11369, -11368, -11367, -11366, -11365, + -11364, -11363, -11362, -11361, -11360, -11359, -11358, -11357, -11356, -11355, -11354, -11353, + -11352, -11351, -11350, -11349, -11348, -11347, -11346, -11345, -11344, -11343, -11342, -11341, + -11340, -11339, -11338, -11337, -11336, -11335, -11334, -11333, -11332, -11331, -11330, -11329, + -11328, -11327, -11326, -11325, -11324, -11323, -11322, -11321, -11320, -11319, -11318, -11317, + -11316, -11315, -11314, -11313, -11312, -11311, -11310, -11309, -11308, -11307, -11306, -11305, + -11304, -11303, -11302, -11301, -11300, -11299, -11298, -11297, -11296, -11295, -11294, -11293, + -11292, -11291, -11290, -11279, -11278, -11277, -11276, -11275, -11274, -11273, -11272, -11271, + -11270, -11269, -11268, -11267, -11266, -11265, -11264, -11263, -11262, -11261, -11260, -11258, + -11250, -11247, -11239, -11231, -11230, -11229, -11228, -11227, -11226, -11225, -11224, -11223, + -11222, -11221, -11220, -11219, -11217, -11216, -11215, -11214, -11213, -11212, -11211, -11210, + -11209, -11208, -11207, -11206, -11205, -11204, -11203, -11202, -11201, -11200, -11199, -11198, + -11197, -11196, -11195, -11194, -11193, -11192, -11191, -11190, -11189, -11188, -11187, -11186, + -11185, -11184, -11183, -11182, -11181, -11180, -11179, -11178, -11167, -11166, -11165, -11164, + -11163, -11162, -11161, -11160, -11159, -11158, -11156, -11155, -11154, -11153, -11152, -11151, + -11150, -11149, -11148, -11147, -11146, -11145, -11144, -11143, -11142, -11141, -11140, -11139, + -11138, -11137, -11136, -11122, -11103, -11102, -11101, -11100, -11099, -11098, -11097, -11096, + -11095, -11094, -11093, -11092, -11091, -11089, -11088, -11087, -11086, -11085, -11084, -11083, + -11082, -11081, -11080, -11079, -11078, -11077, -11076, -11075, -11074, -11073, -11072, -11071, + -11070, -11069, -11068, -11067, -11066, -11065, -11064, -11063, -11062, -11061, -11060, -11059, + -11058, -11057, -11056, -11055, -11054, -11053, -11052, -11051, -11050, -11049, -11048, -11047, + -11046, -11045, -11044, -11043, -11042, -11041, -11040, -11039, -11038, -11037, -11036, -11035, + -11034, -11033, -11032, -11031, -11030, -11029, -11028, -11027, -11026, -11025, -11024, -11023, + -11022, -11021, -11020, -11019, -11018, -11017, -11016, -11015, -11014, -11013, -11012, -11011, + -11010, -11009, -11008, -11007, -11006, -11005, -11004, -11003, -11002, -11001, -11000, -10999, + -10998, -10997, -10996, -10995, -10994, -10993, -10992, -10987, -10986, -10983, -10982, -10981, + -10980, -10979, -10978, -10977, -10976, -10964, -10959, -10958, -10957, -10956, -10955, -10954, + -10953, -10952, -10951, -10950, -10949, -10948, -10947, -10946, -10945, -10944, -10943, -10942, + -10941, -10940, -10939, -10938, -10937, -10936, -10935, -10934, -10933, -10932, -10931, -10930, + -10929, -10928, -10927, -10926, -10925, -10924, -10923, -10922, -10921, -10920, -10919, -10918, + -10917, -10916, -10915, -10914, -10913, -10912, -10911, -10910, -10909, -10908, -10907, -10906, + -10905, -10904, -10903, -10902, -10901, -10900, -10899, -10898, -10897, -10896, -10895, -10894, + -10893, -10892, -10891, -10890, -10889, -10888, -10887, -10886, -10885, -10884, -10883, -10882, + -10881, -10880, -10879, -10878, -10877, -10876, -10875, -10874, -10873, -10872, -10871, -10870, + -10869, -10868, -10867, -10866, -10865, -10864, -10863, -10862, -10861, -10860, -10859, -10858, + -10857, -10856, -10855, -10854, -10853, -10852, -10851, -10850, -10849, -10848, -10847, -10846, + -10845, -10844, -10843, -10842, -10841, -10840, -10839, -10838, -10837, -10836, -10835, -10834, + -10833, -10832, -10831, -10830, -10829, -10828, -10827, -10826, -10825, -10824, -10823, -10822, + -10821, -10820, -10819, -10818, -10817, -10816, -10811, -10807, -10806, -10805, -10804, -10803, + -10802, -10801, -10800, -10799, -10798, -10797, -10796, -10795, -10794, -10790, -10788, -10783, + -10782, -10781, -10780, -10779, -10778, -10777, -10776, -10771, -10770, -10769, -10703, -10702, + -10701, -10700, -10699, -10698, -10695, -10694, -10693, -10692, -10689, -10688, -10683, -10682, + -10681, -10680, -10679, -10678, -10677, -10676, -10675, -10674, -10673, -10672, -10671, -10670, + -10669, -10668, -10667, -10666, -10665, -10664, -10663, -10662, -10661, -10660, -10659, -10658, + -10657, -10656, -10655, -10654, -10653, -10652, -10651, -10650, -10649, -10648, -10647, -10646, + -10645, -10644, -10643, -10642, -10641, -10640, -10639, -10638, -10637, -10636, -10635, -10634, + -10633, -10632, -10631, -10630, -10629, -10628, -10627, -10626, -10625, -10624, -10623, -10622, + -10621, -10620, -10619, -10618, -10617, -10616, -10615, -10614, -10613, -10612, -10611, -10610, + -10609, -10608, -10607, -10606, -10605, -10604, -10601, -10600, -10591, -10590, -10589, -10588, + -10587, -10586, -10585, -10584, -10583, -10581, -10580, -10579, -10578, -10577, -10576, -10575, + -10574, -10573, -10572, -10571, -10570, -10553, -10552, -10550, -10549, -10547, -10545, -10544, + -10543, -10542, -10539, -10538, -10537, -10536, -10535, -10534, -10533, -10532, -10531, -10530, + -10529, -10528, -10527, -10526, -10525, -10524, -10523, -10522, -10518, -10489, -10488, -10487, + -10486, -10485, -10484, -10483, -10482, -10479, -10478, -10477, -10476, -10475, -10474, -10471, + -10470, -10469, -10468, -10465, -10464, -10463, -10462, -10459, -10458, -10457, -10456, -10455, + -10454, -10453, -10452, -10451, -10450, -10449, -10448, -10447, -10446, -10445, -10444, -10443, + -10442, -10441, -10440, -10439, -10438, -10437, -10436, -10435, -10434, -10433, -10432, -10431, + -10430, -10429, -10428, -10427, -10426, -10425, -10424, -10423, -10422, -10421, -10420, -10419, + -10418, -10417, -10416, -10415, -10414, -10413, -10412, -10411, -10410, -10409, -10408, -10407, + -10406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10405, -10404, -10403, -10402, -10401, -10400, -10399, -10398, -10397, -10396, -10395, + -10394, -10393, -10392, -10391, -10390, -10389, -10388, -10387, -10386, -10385, -10384, -10383, + -10382, -10381, -10380, -10379, -10378, -10377, -10376, -10375, -10374, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10373, -10372, -10371, -10370, -10369, -10368, -10367, -10366, -10365, -10364, -10363, + -10362, 0, -10361, -10360, -10359, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -10358, -10357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10356, + -10355, -10354, -10353, -10352, -10351, -10350, -10349, -10348, -10347, -10346, -10345, -10344, + -10343, -10342, -10341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10340, -10339, -10338, -10337, -10336, + -10335, -10334, -10333, -10332, -10331, -10330, -10329, -10328, -10327, -10326, -10325, -10324, + -10323, -10322, -10321, -10320, -10319, -10317, -10316, -10315, -10314, -10313, -10312, -10311, + -10310, -10309, -10308, -10307, -10306, -10305, -10304, -10303, -10302, -10301, -10300, -10299, + -10298, -10297, -10296, -10295, -10294, -10293, -10292, -10291, -10290, -10289, -10288, -10287, + -10286, -10285, -10284, -10283, -10282, -10281, -10280, -10279, -10278, -10277, -10276, -10275, + -10274, -10273, -10272, -10271, -10270, -10269, -10268, -10267, -10266, -10265, -10264, -10263, + -10262, -10261, -10260, -10259, -10258, -10257, -10256, -10255, -10254, -10253, -10252, -10251, + -10250, -10249, -10248, -10247, -10246, -10245, -10244, -10243, -10242, -10241, -10240, -10239, + -10238, -10237, -10236, -10235, -10234, -10233, -10232, -10231, -10230, -10229, -10228, -10227, + -10226, -10225, -10224, -10223, -10222, -10221, -10220, -10219, -10218, -10217, -10216, -10215, + -10214, -10213, -10212, -10211, -10210, -10209, -10208, -10207, -10206, 0, -10205, -10204, + -10203, -10202, -10201, -10200, -10199, 0, -10198, -10197, -10195, -10194, -10193, -10192, + 0, -10191, -10190, 0, -10189, -10188, -10187, -10186, -10185, -10184, 0, -10183, + -10182, -10181, -10180, -10179, -10178, -10177, -10176, -10175, 0, -10174, -10173, 0, + -10171, -10170, -10169, -10168, -10167, -10165, -10164, -10162, -10161, -10160, -10159, -10158, + -10157, -10156, -10155, -10154, -10153, -10152, -10151, -10150, -10149, 0, -10148, -10147, + -10146, -10145, -10144, -10143, -10142, -10141, -10140, -10139, -10138, -10137, -10136, -10135, + -10134, -10133, -10130, 0, -10126, 0, -10102, -10101, -10100, 0, 0, -10099, + -10098, -10097, -10096, -10095, -10094, -10093, -10092, -10091, -10090, -10089, -10088, -10087, + -10086, -10085, -10084, -10083, -10082, -10081, -10080, -10079, -10078, -10077, -10076, -10075, + -10074, -10073, -10072, -10071, -10070, -10069, -10068, -10067, -10066, -10065, -10064, -10063, + -10062, -10061, -10060, -10059, -10058, -10057, -10056, -10055, -10054, -10053, -10052, -10051, + -10050, 0, -10049, -10048, -10047, -10046, -10045, -10044, -10043, -10042, -10041, -10040, + -10039, -10038, -10037, -10036, -10035, -10034, -10033, -10032, -10031, -10030, -10029, -10028, + -10027, -10026, -10025, -10024, 0, -10023, -10022, -10021, -10020, -10019, 0, 0, + -10018, 0, 0, 0, -10017, -10016, 0, -10015, -10014, -10013, 0, -10012, + -10011, 0, -10010, -10009, -10008, -10007, -10006, -10005, -10004, -10003, -10002, -10001, + -10000, -9999, -9998, -9997, -9996, -9995, -9994, -9993, -9992, -9991, -9990, -9989, + -9988, -9987, 0, -9986, -9985, -9984, -9983, -9982, -9981, -9980, -9979, -9978, + -9977, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -9976, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -9975, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -9974, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -9973, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -9972, -9971, 1, 1, -9969, -9968, -9967, -9966, -9965, -9964, -9963, + -9962, -9961, -9960, -9959, -9958, -9957, -9956, -9955, -9954, -9953, -9952, -9939, + -9938, -9937, -9936, -9935, -9934, -9933, -9932, -9931, -9930, -9929, -9928, -9927, + -9925, 73, 96, -9922, -9921, 0, -9920, 96, -9919, -9918, 96, 96, + -9917, -9916, 96, 96, 96, -9915, -9914, -9913, -9912, -9911, -9910, -9909, + -9908, -9907, 96, -9906, -9905, -9904, -9890, -9887, -9886, 64, 66, 64, + 66, 0, 65, 65, 73, 64, 69, 65, 80, 80, 80, 68, + 70, 68, 70, 72, 76, 76, 140, 64, 162, 192, 192, 192, + 192, 192, 192, 37, 144, 156, 156, 160, 160, -9885, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 178, 160, 160, 160, + 160, 160, 160, 160, 160, 184, 189, -9884, 512, 512, 512, 145, + 512, -9883, -9882, -9881, -9880, -9879, -9878, -9877, -9876, -9875, -9874, -9873, + -9872, -9861, -9860, -9859, -9858, -9857, -9856, -9855, -9854, -9853, -9852, -9851, + -9850, -9849, -9848, 0, -9847, -9846, -9845, -9844, -9839, 29, 64, 70, + 72, 128, 128, 55, 128, -9838, -9837, 128, 137, -9836, -9835, -9834, + -9833, -9832, -9831, -9830, -9829, -9828, -9827, -9826, -9825, -9824, -9811, -9810, + -9809, -9808, -9807, -9806, -9805, 128, 137, 129, 134, 144, 144, 144, + 144, -9804, 164, 161, 163, -9803, -9802, -9801, -9800, 161, 162, -9799, + 0, 160, 160, 132, 132, 160, 160, 160, 164, 160, 160, 134, + 148, 133, 145, 128, 128, 244, 244, -9798, 149, -9797, 652, 128, + 135, -9796, -9795, -9794, -9793, -9792, 770, 192, -9791, 768, 768, 768, + 768, 768, 772, 252, 768, 768, 771, 784, 784, 175, 183, 229, + 230, 228, 250, -9790, 829, 785, 830, 896, 896, 896, 896, 906, + 906, -9789, -9788, -9787, -9786, -9785, 901, -9784, -9783, -9782, 928, 904, + 904, 930, 933, -9781, 769, 805, 814, 896, 896, 896, 896, 906, + 912, 901, 924, 896, 896, 920, 941, 936, 936, 942, -9780, 896, + 946, 939, 984, 901, 977, 980, 1024, 985, 1024, 1024, 1024, 998, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, -9779, 900, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, -9778, -9777, -9776, -9775, -9774, -9773, -9772, + -9771, -9770, -9769, -9768, -9767, -9766, -9765, -9764, -9763, -9762, -9761, -9760, + -9759, -9758, -9757, -9756, -9755, -9754, -9753, -9752, -9751, -9750, -9749, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9748, -9747, -9746, -9745, -9744, -9743, 0, + 0, -9742, 0, 0, 0, -9741, 0, -9740, -9739, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9738, -9737, -9736, -9735, -9734, -9733, -9732, -9731, -9730, -9729, -9728, + -9727, -9726, -9725, -9724, -9723, -9722, -9721, -9720, -9719, -9718, -9717, -9716, + -9715, -9714, -9713, -9712, -9711, -9710, -9709, -9708, -9707, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9706, -9705, -9704, -9703, -9702, -9701, -9700, -9699, -9698, -9697, -9696, + -9695, -9694, -9693, -9692, -9691, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -9690, -9689, -9688, + -9687, -9686, -9685, -9684, -9683, -9682, -9681, 134, 134, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 197, 224, 224, 212, + 212, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 256, 256, 128, 128, 128, 128, 128, + 128, 128, 257, 128, 128, 128, 128, 256, 256, 256, 256, 264, + 268, 256, 256, 256, 273, 270, 276, 286, 286, 257, 288, 288, + 288, 292, 296, 288, 288, -9680, -9679, -9678, -9677, -9676, -9675, -9674, + -9673, -9672, -9671, -9670, -9669, -9668, -9667, -9666, -9665, 2, 2, 2, + 2, 2, 2, 2, 2, -9664, -9663, -9662, -9661, -9660, -9659, -9658, + -9657, -9656, -9655, -9654, -9653, -9652, -9651, -9650, -9649, -9648, -9647, -9646, + -9645, -9644, -9643, -9642, -9641, -9640, -9639, -9638, -9637, -9636, -9635, -9634, + -9633, -9632, -9631, -9630, -9629, -9628, -9627, -9626, -9625, 34, 34, 40, + 40, 40, 40, 48, 48, 60, 60, 27, 48, 48, 48, 49, + 60, -9624, -9623, -9622, -9621, -9620, -9619, -9618, -9617, -9616, -9615, -9614, + -9613, -9612, -9611, -9610, -9609, -9608, 32, 32, 35, -9607, -9606, -9605, + -9604, -9603, -9601, -9600, -9599, -9598, -9597, -9596, -9595, 16, 24, 19, + 20, 106, 106, 16, 19, -9594, 130, 128, 132, -9593, -9592, -9591, + -9590, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1, + 1, 1, 1, 1, 1, 8, 8, 14, 14, 16, 16, 16, + 16, 6, 6, 26, 26, 30, 30, 32, 32, 1, 1, 1, + -9589, 2, 8, 2, 2, 10, 14, 1, 1, 4, 1, 1, + 1, 1, 4, 1, 1, 4, 1, 1, 1, 1, 4, 1, + 1, 4, 1, 72, 72, 1, 4, 1, 1, -9588, 1, 1, + 1, -9587, -9586, -9585, -9584, -9583, -9582, -9581, -9580, 1, 1, 1, + 1, 1, 1, 1, 1, 16, 1, 7, 16, 16, 16, 16, + 16, 9, 14, 34, 1, 45, 47, 57, 130, 51, 53, 25, + 26, 20, 29, 128, 128, 89, 128, 6, -9579, 1, 27, 44, + 127, 128, 128, 128, 133, 140, 143, 150, 160, 131, 145, 148, + 148, 154, 161, 167, 204, 194, 234, 512, 512, 480, 516, 512, + 512, 0, -9578, 460, 512, -9577, -9576, -9575, -9574, 512, 512, -9573, + -9572, 512, 512, 520, 520, 512, 512, 528, 530, 457, 529, 528, + 528, 536, 545, 512, 512, 512, 512, 512, 512, 520, 520, 513, + 526, 528, 528, 522, 528, 514, 514, 516, 516, 538, 598, 523, + 593, 512, 512, 443, 512, 514, 519, 524, 524, 524, 524, 514, + 514, 514, 514, 514, 514, 552, 552, 533, 544, 544, 544, 544, + 544, 550, 640, 512, 514, 512, 517, 513, 514, 520, 520, 512, + 512, 624, 640, 512, 640, 640, 640, 640, 640, 648, 652, 648, + 656, 640, 640, 645, 653, 674, 677, 673, 680, 645, 665, 672, + 680, 646, 673, 684, 689, 127, 644, 723, 724, 648, 679, 722, + 722, 683, 729, 27, 896, 896, 896, 896, 896, 896, 896, 896, + 900, 896, 896, 896, 909, 896, 896, 897, 901, 896, 896, 909, + 929, 896, 896, 896, 900, 896, 896, 896, 909, 896, 896, 897, + 900, 896, 896, 896, 908, 896, 896, 896, 900, 896, 896, 896, + 909, 896, 988, 905, 1097, 1086, 1112, 1792, 1792, 960, 960, 960, + 960, 960, 960, 961, 975, 961, 1121, 1792, 1792, 1792, 1792, 1792, + 1792, 1792, 1792, 1792, 1792, 1792, 1808, 1792, 1792, 1808, 1808, 1819, + 1823, 1856, 1856, 1856, 1856, 902, 999, 1112, 1824, 1826, 1829, 1825, + 1856, 1834, 1856, 1856, 1856, 1856, 1856, 1856, 1865, 1856, 1856, 1856, + 1856, 1856, 1856, 1857, 1874, 1856, 1856, 1856, 1856, 1856, 1856, 1892, + 1892, 10, 129, 129, 133, 27, 128, 130, 138, 129, 133, 128, + 128, 139, 143, 148, 148, 130, 130, 130, 130, 130, 137, 129, + 130, 128, 160, 164, 164, 129, 161, 176, 176, -9571, -9570, 182, + -9569, -9568, -9562, -9558, -9557, -9555, -9554, -9553, -9552, -9551, -9550, -9549, + -9548, 141, 152, 148, 148, -9547, -9545, 202, 202, -9544, -9543, -9542, + -9541, -9540, -9539, -9538, -9537, 136, 140, 130, 148, 152, 156, 144, + 389, 152, 384, 128, 128, 136, 136, 136, 136, 136, 142, 140, + 170, 137, 171, 174, 176, 404, 448, 152, 164, 157, 449, 448, + 448, -9536, -9535, -9534, -9533, -9532, -9531, -9530, -9529, -9528, -9527, -9526, + -9525, -9524, -9523, -9522, -9521, 449, 453, 144, 430, 144, 144, 460, + 460, -9520, 472, 452, 452, -9519, -9518, -9517, -9516, 492, 492, -9515, + 497, 507, 510, 502, 509, 487, 504, 325, 404, 64, 1030, 400, + 1025, -9514, -9512, -9511, -9510, -9509, -9508, -9507, -9506, -9505, -9504, -9503, + -9502, -9501, -9500, -9499, -9498, -9497, -9496, -9495, -9494, -9493, -9492, -9491, + -9490, -9489, -9488, -9487, -9486, -9485, -9484, -9483, -9482, 445, 1045, 1040, + 1042, 432, 1046, 1046, 1056, 1056, 1056, 1042, 1064, 1064, 1080, 1084, + 1084, 414, 1095, 1, 1090, 407, 1089, 1089, 1096, 1088, 1088, 1098, + 1152, 1152, 1152, 1152, 1152, -9481, -9480, -9479, -9478, -9477, -9476, -9475, + -9474, -9473, -9470, -9460, -9459, 1152, 1152, 1153, -9457, 1136, 1136, 1136, + 1141, 1129, 1136, 1168, 1168, 1153, 1158, 1177, 1185, 1188, 1188, 1194, + 1197, 1152, 1152, 1144, 1151, 1152, 1152, 1156, 1160, 1154, 1154, 1222, + 1222, 1188, 1188, 1237, 1241, 1296, 1298, 1301, 1304, 1296, 1311, 1315, + 1316, 1309, 1311, 189, 1305, 128, 135, 1311, 1323, 153, 177, 171, + 1322, 1324, 1344, 1360, 1360, 188, 2051, 1338, 1338, 2071, 2096, 2105, + 2168, 2057, 2172, 164, 2176, 2176, 2176, 2189, 2190, 2176, 2198, 2180, + 2186, 2188, 2208, 2208, 2208, 2177, 2186, 2178, 2233, 2240, 2242, 2244, + 2248, 2254, 2260, 2240, 2248, 2224, 2246, 2261, 2282, 2287, 2295, 2306, + 2306, -9456, -9455, 2304, -9453, -9452, -9451, -9450, -9449, -9448, -9447, -9446, + -9445, 2192, 2197, 2187, 2190, 2187, 2217, 2192, 2229, 2321, 2325, 2304, + 2304, 2192, 2237, 2317, 2336, 2309, 2351, 2356, 2359, 2368, 2368, 2368, + 2372, 2368, 2368, 2368, 2368, 2368, -9444, -9443, 2368, -9442, -9441, -9440, + -9439, -9438, -9437, -9436, -9435, -9434, -9433, -9432, -9431, 2368, 2370, -9430, + -9429, -9428, -9427, -9426, -9425, -9424, -9423, -9422, -9421, -9420, -9419, -9418, + -9417, -9416, -9415, -9414, -9413, -9412, -9411, -9410, -9409, -9408, -9407, -9406, + -9405, -9404, -9403, -9402, -9401, -9400, -9399, -9398, -9397, 36, 42, 63, + 138, 140, 162, 160, 245, 2066, 2124, 2135, 2144, 2176, 2182, 2184, + 2186, 938, 2176, 2176, 2176, 2176, 2176, 2177, 2187, 2190, 2202, 2176, + 2178, 2188, 2209, 2179, 2203, -9396, -9395, -9394, -9393, -9392, -9391, -9390, + -9389, -9388, -9387, -9386, -9385, -9384, -9383, -9382, -9381, 2180, 2186, 2183, + -9380, 2246, 2252, 2254, 2257, -9379, 2179, 2259, 2260, -9378, -9377, -9376, + -9375, 2242, 2275, 2282, -9374, 2304, 2306, 2282, 2309, 2277, 2279, 2304, + 2304, 2304, 2308, 2317, 2319, 2304, 2306, 2304, 2309, 2313, 2333, 2312, + 2336, -9373, -9372, 2307, 2308, 2304, 2336, -9371, -9370, 4, -9369, -9368, + 4, 1, 8, 8, 8, 1, 1, 1, 1, 22, 1, 21, + 23, -9367, -9366, -9365, 1, 1, 1, 1, -9364, 8, 8, 9, + 13, 35, -9363, -9362, 40, -9361, 8, -9360, 2, 4, 1, -9359, + -9358, -9357, -9356, 1, 1, -9355, -9354, 2, -9353, 2, 2, 4, + 22, 25, 27, 30, 64, 68, 72, -9352, 28, 73, 77, 80, + 80, -9351, -9350, -9349, -9348, -9347, -9346, -9345, -9342, -9332, -9331, -9329, + -9320, 6, -9317, 5, 9, -9316, -9315, -9313, -9312, -9311, -9310, -9309, + -9308, -9307, -9306, -9305, -9304, -9303, 2, -9302, -9301, -9300, -9299, 10, + 10, 15, 33, 36, 49, -9298, -9297, 42, 42, -9296, -9295, -9294, + 49, -9293, -9292, 32, 32, 36, 36, -9291, -9290, 35, 44, 45, + 47, 136, 138, 132, 132, 1, 1, 1, 4, 6, 8, 3, + 8, 12, 15, -9289, -9288, -9287, -9286, -9285, -9284, 0, 0, 0, + 0, -9283, -9282, -9281, -9280, -9279, -9278, 6, 6, 8, 8, 16, + 19, 8, 11, 1, 1, 16, 16, -9277, -9276, 0, -9275, -9274, + -9273, 0, 0, -9272, 0, -9271, -9270, -9269, -9268, -9267, -9266, -9265, + -9264, -9263, -9262, -9261, -9260, -9259, -9258, -9257, -9256, 0, 0, 0, + -9255, 0, 0, 0, 0, -9254, -9253, 15, 16, 16, 16, 16, + 16, -9252, -9251, -9250, -9249, -9248, -9247, -9246, -9245, -9244, -9243, 0, + 0, 0, 0, 0, 0, -9242, -9241, 0, 0, -9240, -9239, -9238, + -9237, -9236, -9235, 2, 1, 1, 2, 2, 1, -9234, -9233, -9232, + -9231, -9230, -9229, 0, 0, -9228, -9227, 6, 6, 9, 12, 8, + 15, -9226, -9225, -9224, -9223, -9222, -9221, -9220, -9219, -9218, -9217, -9216, + -9215, -9214, -9213, -9212, -9211, -9210, -9209, -9208, -9207, -9206, -9205, -9204, + -9203, -9202, -9201, -9200, -9199, -9198, -9197, -9196, -9195, 124, 124, 116, + 116, 116, 116, -9194, 121, 156, 156, 69, 73, -9193, -9192, 152, + 152, 79, 130, 205, 244, 144, 204, 240, 385, 153, 193, 217, + 384, 385, 394, 388, 397, -9191, -9190, -9189, -9188, -9187, -9186, -9185, + -9184, -9183, -9182, -9181, -9180, -9179, -9178, -9177, -9176, -9175, -9174, -9173, + -9172, -9171, -9170, -9169, -9168, -9167, -9166, -9165, -9164, -9163, -9162, -9161, + -9160, -9159, -9158, -9157, -9156, -9155, -9154, -9153, -9152, -9151, -9150, -9149, + -9148, -9147, -9146, -9145, -9144, -9143, -9142, -9141, -9140, -9139, -9138, -9137, + -9136, -9135, -9134, -9133, -9132, -9131, -9130, -9129, -9128, 134, 156, 148, + 163, -9127, -9126, 171, 203, -9125, -9124, -9123, -9122, -9121, -9120, -9119, + -9118, 29, 30, 28, 79, 51, 75, 131, 135, 35, 130, 132, + 144, 149, 160, 157, 168, -9117, -9116, -9115, 0, 0, 0, -9114, + -9113, -9112, -9111, -9110, -9109, -9108, -9107, -9106, -9105, -9104, -9103, 0, + 0, 0, 0, 0, 0, 0, 0, -9102, -9101, -9100, -9099, -9098, + -9097, 102, 123, 132, 139, 131, 173, -9096, 146, -9095, -9094, 0, + -9093, 0, 0, 0, 0, -9092, -9091, -9090, -9089, -9088, -9086, -9085, + -9082, -9081, -9080, -9079, -9078, -9077, -9076, -9075, -9074, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9073, + 0, -9072, -9071, 129, 154, -9070, -9069, 152, 163, -9068, 149, -9067, + -9066, 0, 0, 0, 0, -9065, -9064, 0, -9063, 0, 0, -9062, + -9061, 0, -9060, -9059, 0, -9058, -9057, 0, -9056, -9055, 0, 0, + 0, -9054, -9053, -9052, 0, 0, -9051, -9050, -9049, -9048, -9047, 0, + 0, -9046, -9045, -9044, -9043, -9042, -9041, -9040, -9039, 0, 0, 4, + 1, -9038, -9037, -9036, -9035, 3, -9034, -9033, -9032, -9031, -9030, -9029, + 10, -9028, 2, 28, 36, -9027, -9026, -9025, -9024, -9023, -9022, -9021, + 16, -9020, -9019, -9018, -9017, -9016, -9015, -9014, -9013, -9012, -9011, -9010, + -9009, -9008, -9007, -9006, -9005, -9004, -9003, -9002, -9001, -9000, -8999, -8998, + -8997, -8996, -8995, -8994, -8993, -8992, 8, 10, 19, -8991, -8990, -8988, + -8987, -8986, -8985, -8984, -8983, -8982, 0, -8981, -8980, -8979, -8978, -8977, + -8976, 1, 3, -8975, -8974, 2, 8, 20, 33, 41, 45, 34, + 49, 3, -8973, -8972, 5, 1, 5, 14, 24, 1, 2, 17, + 18, 45, 46, 19, 66, -8971, -8970, -8969, -8968, 35, 37, -8967, + 0, -8966, -8965, 66, 66, 76, -8964, -8962, 67, 53, 61, -8961, + 61, 64, 64, 68, -8960, -8959, -8958, 64, 64, -8957, -8956, 70, + -8955, 3, 64, 9, 67, 66, 72, 72, 72, 121, 122, -8954, + 112, 75, 108, 124, 127, -8953, -8952, -8951, -8950, -8949, -8948, -8947, + -8945, -8944, -8943, -8942, -8941, 315, -8940, 385, 396, -8939, -8938, -8937, + -8936, -8935, -8934, -8933, -8932, -8931, -8930, -8929, -8928, -8927, -8926, -8925, + -8924, 391, 397, 1, -8923, 386, 396, 448, 452, -8922, -8921, 0, + 0, 0, 0, 0, 0, 0, 0, -8920, -8919, -8918, -8917, 0, + 0, -8916, -8915, 500, 511, 366, 432, 948, 971, 51, -8914, 51, + 108, 43, 401, 262, 267, 94, 305, 212, 249, 266, 289, 263, + 920, -8913, -8912, -8911, -8910, 1, 1, 1, 271, 1, 1, 1, + 1, 1, 268, 1, 1, 1, 1, 390, 1, 1, 1, 407, + -8909, -8908, -8907, 68, 4099, -8906, -8905, 4099, -8904, 300, 624, 4112, + 4119, 4128, 4128, 4128, 4132, 127, 278, 418, 1, 1, 1, 1, + 1, 357, 383, 2055, 1, 2056, 2056, -8903, -8902, -8901, -8900, 271, + 2049, 2051, 2053, 2048, 2056, 2051, 2057, 2048, 2068, 2049, 2056, 2062, + 2068, 2057, 2065, 2056, 2072, 417, 2054, 2080, 2080, 2074, 2084, 2066, + 2070, 2083, 2085, 2056, 2092, 2088, 2095, 4096, -8899, -8898, -8897, -8896, + -8895, -8894, -8893, 4098, 4104, 4113, 4115, -8892, -8891, 4113, 4114, 1, + 1, 1, 1, 1, 1, 1, 2053, 2063, 1, 1, 1, 4241, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 532, 1024, 529, + 532, 1, 1, 1, 409, 1157, 1, 4224, 4226, 4225, -8890, 1154, + 1156, 3, 4, 1152, 1, 1167, 1, 1, 1165, 1185, 1220, 4274, + 1, 1182, 1195, -8889, -8888, 4256, 4256, 4256, 4268, 4266, 4309, 4308, + 4312, 4372, 4375, 1162, 1, 1, 1, 1, 1, 1185, 1222, 1220, + 1226, 1236, 1256, 1701, 1707, 1, 1, 1, 1615, 1164, 1, 1612, + 1, 1792, 1792, -8887, -8886, 1808, 1810, -8885, -8884, -8883, -8882, -8881, + -8880, -8879, -8878, -8877, -8876, 4231, 4253, -8875, -8874, -8873, -8872, -8871, + 4234, -8870, -8869, 1793, 1794, 1792, 1798, 1792, 1794, 1800, 1803, 1792, + 1796, 1, 1, -8868, 1809, 1, 1, 1, 1, 1, 1, 1, + 4243, 1864, 1, 1, 1, 1797, 1, 1, 1, 1, 1, 1562, + 1879, 1, 1, 1, 1, 1881, 1884, 1874, 1888, 2, 10, 10, + 342, 5, 18, 8, 1, 11, 37, 20, 32, 17, 1688, 3, + 5, 16, 36, 53, 57, 48, 48, 2, 1, 1702, 1857, 1, + 1686, 5, 1, 15, 16, 2, 21, 1, 12, 4, 18, 8, + 64, 25, 64, 4178, 4208, 1687, 1688, -8866, -8865, -8864, -8863, -8862, + -8860, -8859, -8858, -8857, -8856, -8855, -8854, -8853, -8852, 4125, 4137, 4142, + 4224, -8851, 4114, 4112, 4224, -8850, -8849, 1928, 1978, 1758, 1853, -8848, + 1764, 1946, 3304, -8847, -8846, -8845, -8844, -8843, -8842, -8841, -8840, 1804, + 3253, 3257, 3269, 3268, 3283, 3288, 3293, 3248, 3298, 1, 1, -8838, + -8837, 1735, 1, 4, 1, 5, 1, 1, 14, 40, 40, 3293, + 16, 3, 1, 10, 32, 34, 36, 7, 1, 35, 38, 46, + 46, 1760, 3333, 4299, 4302, 1, 3, 14, 1569, 10, 38, 32, + 39, 4100, 4130, 3856, 41, 6, 13, 21, 38, 25, 68, 68, + 72, 3864, 65, 68, 80, 4166, 4166, 4098, -8836, 4104, 4112, 4113, + 4193, 4099, 4114, 4118, 4125, 4100, 4196, 64, 70, 9, 73, 72, + 72, 3889, 4184, 4179, 4181, 4176, 1, 4, 4, 13, 14, 3, + 5, 7, 1, 4, 15, 4142, 4482, -8835, -8834, 4132, 4228, -8833, + -8832, -8831, -8830, -8829, -8828, -8827, 4100, -8826, -8825, 4149, 4153, 4152, + 4156, 4149, 4167, 4171, 4227, 4161, 4251, 4241, 26, 4238, 4240, 27, + 34, 4486, 4550, 1, 4141, 4130, 4142, -8824, -8823, 32, 4137, 4142, + 4512, 4180, 4516, 4521, 4543, 4106, 4132, -8822, 4165, 4096, 4140, 4142, + 4164, 4111, 4155, 25, 70, 28, 39, 31, 65, 4536, 4687, 5081, + 84, 930, 938, 931, -8821, 931, 945, 944, -8820, 929, 961, -8819, + -8818, 901, 4107, -8817, 929, 1012, 1023, 4419, -8816, -8815, -8814, 1844, + 4101, -8813, -8812, -8811, 0, 4673, 4686, -8810, -8809, -8808, -8806, -8805, + -8804, -8803, -8802, 0, 4215, 4720, 4871, -8801, -8800, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8799, -8798, -8797, 4873, -8796, + 922, 940, 926, 1007, 930, 1096, 1019, 1131, 1016, 1121, 1156, 1158, + 1122, 1120, 1154, 1162, 1152, 1154, 17, 17, 1157, 1153, 1156, 1164, + 1152, 1176, 1182, 1184, 1190, 946, 1193, -8795, -8794, -8793, -8792, 768, + 768, 768, 768, -8791, -8790, 768, 768, 1, 1, 8, 8, 12, + 8, 2, 2, 1152, 15, 52, 54, 34, 42, 25, 30, 1, + 13, 9, 31, 1, 31, 1169, 1176, 1174, 930, 46, 64, 64, + 1280, 64, 64, 78, 64, 80, 82, 1174, 88, 66, 66, 88, + 90, 178, 82, 90, 101, 1280, 1280, 220, 83, 1282, 1291, 230, + 1288, 70, 64, 114, 72, 244, 246, 239, 118, 201, 115, 1285, + 227, 332, 336, 338, 352, 1312, 1312, 1195, 1291, 1192, 1292, 1193, + 1316, 1328, 2, 24, 266, 1325, 1321, 1329, 1284, 1284, 1296, 1300, + 1300, 1306, 1314, 1322, 1332, 1334, 1332, 1316, 1360, 1344, 1369, 1371, + 1360, 1360, 1364, 1360, 1360, 1374, 1446, 1440, 1445, 307, 165, 31, + 392, 1364, 384, 392, 309, 1409, 1414, 898, 900, 386, 389, -8789, + -8788, 898, 898, 900, 392, 427, 429, 898, 898, -8787, -8786, -8785, + -8784, -8783, -8780, -8778, -8777, -8776, -8775, 1288, 1284, 1288, -8774, -8773, + 1298, 1370, 1378, -8772, -8771, -8770, -8769, -8768, -8767, 4114, 4119, 1, + 1, 1281, -8766, -8765, 2, 1394, 1384, 1394, 1393, 1399, -8764, -8763, + 1406, 1536, 1538, 1553, 1536, 1563, 1566, 1572, 1572, 1541, 1577, 1548, + 1571, 1580, 1584, 1576, 1568, 1575, 1667, 1313, 1667, 1569, 1672, -8762, + 1664, 1580, 1664, 1666, 1664, 1666, 1674, -8761, 1664, 1664, 1664, 1546, + 1553, 1559, 1563, 1576, -8760, -8759, -8758, 0, -8757, -8756, -8755, 0, + 0, 0, 0, -8754, -8753, -8752, -8751, -8750, -8749, -8748, -8747, -8746, + -8745, -8744, -8743, -8742, -8741, -8740, -8739, -8738, -8737, -8736, -8735, -8734, + -8733, -8732, -8731, -8730, -8729, -8728, -8727, -8726, -8725, -8724, -8723, -8722, + -8721, -8720, -8719, 0, 0, -8718, -8717, 0, 0, 0, 0, 0, + 0, 0, 0, -8716, -8715, -8714, -8712, -8711, -8710, -8708, -8707, -8706, + 4288, 4303, 4325, 4349, 5025, 4512, 4801, 4320, 4526, 4335, 5025, 4335, + 4998, 36, 36, 36, 45, 5024, 5052, 5294, 5296, 5301, 5303, -8705, + -8704, 4596, -8703, -8702, 4598, 57, 5092, 62, 62, 3, 4238, 5001, + 5012, 24, 24, 24, 129, 93, 128, 128, 139, 19, 144, 129, + 145, 192, 192, 153, 155, 145, 218, 4346, 5961, 5971, 5982, 6172, + 6204, 4103, 4997, 144, 5005, -8701, -8700, -8699, -8698, -8697, 5120, -8696, + -8695, -8694, 5120, -8693, -8692, 0, 0, 0, 0, -8691, -8690, -8689, + -8688, 0, -8687, -8686, 5514, 0, 0, 0, 0, -8685, -8684, -8683, + -8682, -8681, -8680, -8679, -8678, -8677, -8676, 5151, 5152, -8674, -8673, -8672, + 5157, -8671, -8670, 0, -8669, 4392, 4397, -8668, -8667, -8666, -8665, 4393, + -8664, 4410, 4582, 5199, 5228, -8663, 4555, 4544, -8662, 5377, -8661, -8660, + 5216, -8659, 5390, -8658, 5477, -8657, -8656, 5525, -8655, 5617, 5620, -8654, + 5627, -8653, -8652, -8651, -8650, -8648, -8647, 0, 0, 0, 0, -8645, + 0, -8644, -8642, -8641, 0, -8640, 0, -8639, 0, -8638, -8637, -8636, + -8635, 5666, 5668, 5670, -8634, 5713, 5714, -8633, -8632, -8631, 5712, -8630, + -8629, 0, 0, 5834, 5834, 5834, 5834, 5843, 24, 1, 3, 280, + 280, 1837, 1920, -8628, 294, -8627, -8626, -8625, 1921, 1923, 1921, 1928, + 1253, 1920, 1928, 1935, 1941, 1943, 1941, -8624, -8623, -8622, -8621, 1933, + 1921, 1928, -8619, -8618, -8617, -8616, 1938, -8615, -8614, 0, 0, -8613, + -8612, 0, 0, -8611, -8610, -8609, -8608, -8607, 1926, 2, 10, 4, + 27, 40, 59, 32, 93, 60, 60, 461, 402, 466, 480, 485, + 385, -8606, -8605, -8604, -8603, 402, 404, 416, 395, 440, 4480, 4417, + 4481, 4483, 4488, 4488, -8602, -8601, -8600, 0, -8599, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -8598, 4481, 4483, 4481, + 4487, 4481, 4488, 4481, 432, 4480, 4480, 4484, 4484, 4480, 4496, 4496, + 434, 424, 4418, 436, 4422, 4481, 4483, 4481, 4484, -8597, -8596, 4480, + 4484, -8595, -8594, -8593, -8591, -8590, -8588, -8587, 433, -8583, -8580, 444, + -8578, 0, 0, 0, -8577, 0, -8576, 0, -8575, -8573, -8572, -8571, + 0, -8570, -8569, -8568, 0, 0, 0, 0, 0, 0, 0, 0, + -8567, -8566, -8565, -8564, 0, -8563, -8562, -8561, -8559, -8558, -8557, -8556, + 0, -8555, 0, -8554, -8553, 26, 128, 130, 128, 128, 128, 136, + 133, 130, -8552, 129, 130, 144, 144, 152, 128, 130, 128, 133, + 128, 141, 161, 141, 169, 170, 180, 178, 167, 207, 212, 261, + 151, -8551, 180, 192, 129, 193, -8549, 198, 142, 194, 284, 384, + 384, 384, 384, 384, 254, 289, 384, 295, 232, 384, 384, 384, + 388, 384, 384, 384, 396, 386, 399, 408, 384, 393, 393, 416, + 237, 416, 416, 422, 416, 419, 419, 427, 438, 442, 434, 444, + 492, 389, 468, 1027, 267, 1352, 1035, 1520, 1074, 1529, 1062, 7698, + 472, 7699, 1387, 7707, 1046, 410, 508, 1048, 258, 1064, 1097, 1368, + 7680, 7686, 7680, 7690, 1083, 7693, 7682, 8224, 1111, 8253, 8359, 8364, + 1495, 8392, 8397, 8421, 8422, 8424, 8452, 8452, 8455, 8456, 8456, 8456, + 8460, 1076, 101, 1083, 1032, 1315, 298, 8579, 315, 8577, 8586, 8594, + 8594, 8602, 8602, 8624, 1080, 1080, 1078, 8608, 1775, 8608, 8608, 8617, + -8546, -8540, 8608, 8646, -8539, -8537, -8536, -8535, 1066, 8599, 8640, 8640, + 118, 8644, 8650, 8654, 8662, 8664, 8672, 8664, 8672, 8672, 8672, 8672, + -8530, -8528, -8527, -8526, -8523, -8522, -8521, -8518, -8517, -8516, -8515, -8514, + -8513, -8510, -8508, -8507, -8505, -8496, -8495, -8493, -8492, -8491, -8490, -8489, + -8488, -8487, -8486, -8485, -8484, -8483, -8482, -8481, 8576, 8592, 8576, 8592, + 8592, 8592, 8592, 8592, 8598, 8592, 8704, 8592, 8709, 8712, 8712, 8712, + 8706, 8704, 8722, 8704, 8777, 8721, 8776, 8776, 8768, 8771, 8785, 8787, + 8784, 8786, 8793, 8798, 8768, 8770, 8768, 8772, 8777, 8771, 8776, 8784, + 8786, 8784, 8773, 8787, 8772, 8784, 8796, 8794, 8796, 1428, 1432, 1488, + 1488, 8769, 8774, 8772, 8774, -8480, -8479, 8768, 8790, -8477, -8476, -8475, + -8474, -8473, -8472, 1418, 8737, -8471, -8470, -8469, -8468, -8467, -8466, -8465, + -8458, -8457, 184, -8456, -8454, 1424, 1424, 1446, 8832, 8854, 8861, 8878, + 8730, 8947, 8957, 8960, 8960, 8960, 8960, 8960, 8705, 8712, 8723, 8960, + 8719, 8960, 8729, 8960, 8724, 8960, 8960, 8960, 8960, 8960, 8960, 8960, + 8960, 8725, 8754, 8759, 8960, 8960, 8960, 8960, 8960, 8960, 8960, 8960, + -8453, -8451, 8960, 8960, 8707, 8704, -8450, -8449, 1909, 8706, -8448, 8705, + 8709, -8446, -8444, -8439, -8438, -8436, -8435, 8705, -8434, 1846, 8705, 8708, + 8705, 8705, 8713, 8705, 8707, -8432, 8704, 8706, 8704, 8707, 8707, 8720, + -8430, 8704, 1885, 8707, 8711, 8706, 8706, 8713, 8714, 8704, 8704, 8704, + 8704, 8704, 8727, 8743, 8769, 8870, 8878, 8884, 8914, 8920, 8960, 8960, + 8960, 8960, 8960, 8960, 8960, 8962, 8960, 8970, -8417, -8415, -8414, -8413, + -8411, -8410, -8409, -8408, -8407, -8406, -8404, -8403, -8401, -8400, -8399, -8398, + 8960, -8397, -8395, -8394, -8393, -8392, -8391, -8390, 0, 0, 0, 0, + 0, -8389, 0, 0, -8388, 8976, 8993, 8976, 8997, 8992, 8992, 9000, + 9002, -8387, 9014, 8998, -8386, 0, 0, 0, 0, -8385, -8384, -8382, + -8381, 0, 0, -8380, -8379, -8378, -8377, 0, 0, 0, 0, -8376, + 8960, 8960, 8960, 8960, 8960, 8963, 8969, 8969, 8973, -8375, -8374, 8961, + 8976, -8373, -8372, -8371, -8368, -8366, -8351, -8350, 8960, 8960, 8960, 8960, + -8349, 8960, 8960, 8960, 8964, 8960, 8960, 8960, 8964, -8348, -8347, 8960, + -8346, -8345, 8961, 8961, -8344, -8343, -8342, -8341, 0, -8340, 8960, -8338, + -8336, -8335, -8334, -8333, -8332, -8331, -8330, -8329, -8328, -8327, -8326, -8325, + -8324, -8323, -8322, -8321, -8320, 8192, 8192, 8192, 8192, 8192, 8192, 8192, + 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, -8318, -8317, -8316, -8315, + -8314, -8313, -8312, -8311, -8310, -8309, -8308, -8306, -8305, -8304, -8303, -8302, + 8192, 8192, 8192, 8197, 8192, 8208, 8208, 8208, 8194, 8208, 8208, 8216, + 8216, 8220, 8220, 8240, 8216, 8193, 8202, 8205, 8207, 8208, 8213, 8208, + 8197, 8208, 8212, 8208, 8208, 8208, 8224, 8208, 8207, 8193, 8195, 8193, + 8202, 8193, 8202, 8193, 8224, 8224, 8224, 8224, 8224, 8224, 8224, 8224, + 8224, 8192, 8192, 8192, 8192, -8301, -8297, 8192, 8192, 8192, 8192, 8192, + 8192, -8296, -8294, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, + 8210, 8212, 8221, 8293, 8304, 8304, 8304, 8308, 8304, 8192, 8192, -8284, + 8192, -8275, -8271, 8196, 8256, 8256, 8256, 8256, 8264, 8256, 8256, 8256, + 8265, 8273, 8265, 8278, 8306, 8336, 8272, 8336, 8277, 8336, 8336, 8344, + 8344, 8347, 8348, 8350, 8293, 8278, 8273, 8281, 8284, 8280, 8352, 9232, + 8295, 9241, 9243, 9241, 9255, 9265, 9267, 9265, 8286, 9252, 9252, 9257, + 9248, 9260, 9289, 9263, 8272, 9296, 9296, 9296, 9249, 9296, 9298, 9296, + 9256, 8248, 8248, 8252, 9217, 9227, 9220, 9248, 9231, -8270, 9256, 9258, + 9248, -8269, -8268, -8267, -8266, 9344, 9344, 9344, 9344, 9344, 9344, 9344, + 9344, 9346, 9344, 9349, 9344, 9456, 9441, 9456, 9413, 9409, 9409, 9456, + 9417, 9456, 9408, 9456, 9409, 9464, 9412, 9465, 9466, -8265, -8264, -8263, + 9419, -8262, -8261, -8260, -8259, -8258, -8257, -8256, -8251, 9425, 9477, 9482, + -8249, 9488, 9488, 9492, 9492, 9287, 9492, 9616, 9492, 9618, 9620, 9622, + 9696, 9707, 9709, 9728, 9728, 9728, 9728, 9728, 9446, 9456, 9458, 9456, + 9462, 9456, 9458, 9456, 9728, 9728, 9728, -8248, 9728, -8247, -8246, 1, + 1, 1, 1, 5120, 1, 748, 5120, 1, 1, 1, 1, 1, + 1, 5120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 5120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 5376, 1, 5376, 5376, 1, 1, 1, 1, 1, + 1058, 1452, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9223, + 9216, 1, 1, 9217, 9217, 9217, 9217, 1, 1, 1, 1, 9216, + 9216, 9220, 9220, 9226, 9216, 9216, 9216, 9223, -8244, 9234, 9236, 9233, + 9216, 9360, 9362, 9365, 9359, 9360, 9370, 9368, 9370, 9361, 9361, 9361, + 9361, 9401, 9403, 9401, 9369, 9376, -8238, -8234, 9376, 9381, 9424, 9424, + 9381, 9425, -8233, -8225, -8219, -8217, -8216, 1, 1, 1, 9409, 1415, + 1, 1, 1, 1, 1, 1, 9409, 1481, 1, 1, 1, 1, + 1530, 9412, 9412, 9412, 9416, 9418, 9423, 1520, 9425, 9434, 9436, 9446, + 9456, 9432, 9456, 1410, 1428, 1432, 1436, 1423, 1432, -8206, 9345, 1414, + 9348, 9344, 9347, -8205, 9348, -8204, -8203, 1348, 1, 1, 1, 1, + 1, 1, 1, 1, 9365, 9364, 1, 5376, 9370, -8202, -8201, -8200, + -8199, -8198, -8197, -8196, -8194, -8192, -8190, -8189, -8181, -8178, -8177, -8176, + -8175, -8174, -8173, 9376, 1, 1, 1, 1, 9729, 9730, 1, 1, + 9399, 1, 1, 1, 9728, 9728, 9728, -8172, 9728, 8329, 8329, -8171, + 8329, 8329, 8329, 8329, 8329, 8348, 8338, 8349, 8356, 8364, 8364, 8371, + 8345, 8320, 8320, 8320, 8352, 8321, 8356, 8356, -8170, 8352, 8354, 8352, + -8169, -8168, -8167, 589, 10, 3, 9, 8320, 22, 20, 36, 35, + 49, 49, 49, 61, 68, 61, 71, 64, 68, 72, 71, 8332, + 72, 72, 72, 90, 90, 70, 94, 88, 96, 96, 96, 86, + 8323, 8344, 8344, 8344, 65, 67, 8344, 8344, 67, 65, 68, 65, + 67, 76, 78, 72, 64, 64, 74, 64, 64, 74, 91, 66, + 74, 82, 96, 100, 100, 111, 129, 39, 40, 50, 52, 128, + 128, 128, 60, 40, 128, 128, 128, 128, 138, 128, 128, 54, + 128, 49, 132, 128, 137, 137, 170, 128, 183, 152, 186, 188, + 144, 192, 198, 133, 208, 154, 194, 196, 224, 257, 229, 208, + 227, 261, 265, 257, 265, 276, 280, 231, 261, 224, 224, 181, + 224, 224, 289, 260, 260, 290, 290, 281, 294, 288, 290, 8242, + 8244, 8195, 8196, 8196, 8199, 8205, 8194, 8313, 8448, 8450, 8448, 8452, + 8448, 8448, 8448, 8456, 8448, 8448, 8452, 8452, 8449, 8456, 8456, 8456, + 8452, 8451, 8465, 8472, -8166, -8165, -8164, 8474, 8448, 8451, 8452, 8452, + 8456, 8456, 8450, 8456, 8454, 8448, 8448, 8488, 8452, 8488, 8488, 8493, + -8163, -8162, -8161, -8160, -8159, -8158, -8156, -8155, -8153, -8148, -8147, -8146, + -8144, -8143, -8141, -8138, -8133, -8130, -8125, -8123, -8122, -8121, -8120, -8119, + -8118, -8117, -8116, -8115, -8114, -8083, -8072, -8069, -7486, -7479, -7412, -7381, + -7378, -7375, -7326, -7321, -6282, -6280, -6176, -6138, -6132, -6098, -6097, -6090, + -6082, -6079, -6058, -6051, -6049, -5951, -5950, -5948, -5945, -5944, -5943, -5939, + -5917, -5916, -5915, -5913, -5912, -5911, -5910, -5909, -5908, -5905, -5901, -5870, -5607, -5443, -5438, -5432, -5169, -5117, -5003, -4390, -4206, -4197, -4193, }; const size_t NU_DUCET_G_SIZE = sizeof(NU_DUCET_G) / sizeof(*NU_DUCET_G); /* codepoints */ const uint32_t NU_DUCET_VALUES_C[] = { - 0x000388, 0x000389, 0x000035, 0x000386, 0x01D6EE, 0x01D6EF, 0x01D6E2, 0x01D6E3, - 0x0000C8, 0x0000C9, 0x0000CA, 0x0000CB, 0x0003A7, 0x0003A3, 0x0000CE, 0x0000CF, - 0x01D772, 0x00042F, 0x0003A0, 0x0003BE, 0x0003BC, 0x0003BD, 0x00039C, 0x00039D, - 0x000398, 0x000399, 0x01D6FC, 0x01D6FD, 0x01D6FE, 0x01D6FF, 0x00039E, 0x00039F, - 0x0003A5, 0x0003A1, 0x01D618, 0x01D61D, 0x0003B4, 0x01D607, 0x0003BA, 0x0003BF, - 0x01D61A, 0x000471, 0x00038A, 0x00038E, 0x01D60B, 0x00038F, 0x000033, 0x01D61B, - 0x0003B0, 0x0003B1, 0x01D614, 0x01D615, 0x01D616, 0x01D617, 0x0003B6, 0x0003B7, - 0x0003B8, 0x0003B9, 0x01D619, 0x00045A, 0x01D61E, 0x01D61F, 0x0003BB, 0x0003B5, - 0x0000E0, 0x0000E1, 0x0000E2, 0x0000E3, 0x0000E4, 0x0000E5, 0x0000E6, 0x0000E7, - 0x01D602, 0x01D603, 0x0000C6, 0x0003AD, 0x01D605, 0x01D601, 0x0000FC, 0x01D61C, - 0x0000F0, 0x0000F1, 0x01D606, 0x0000EB, 0x0000F4, 0x0000F5, 0x0000F6, 0x0000EA, - 0x0000F8, 0x0000F9, 0x0000FA, 0x0000FB, 0x0000CC, 0x0000FD, 0x0000FE, 0x0000FF, - 0x01D6C0, 0x000428, 0x01D6C4, 0x01D6C5, 0x01D6F8, 0x01D6FA, 0x0000C4, 0x01D6C9, - 0x01D6CA, 0x01D6CB, 0x01D6C8, 0x01D6CD, 0x01D6CE, 0x01D6CC, 0x0000F2, 0x0000F3, - 0x0003A9, 0x0003F5, 0x000032, 0x01D633, 0x01D60F, 0x0003A4, 0x00042E, 0x000031, - 0x000030, 0x01D60A, 0x01D604, 0x01D609, 0x0000ED, 0x01D65B, 0x0003A6, 0x0003AB, - 0x01D6F2, 0x01D6F3, 0x000076, 0x000077, 0x0000C2, 0x0000C5, 0x01D6F9, 0x0000C3, - 0x0000D8, 0x0000C1, 0x00039B, 0x0000C7, 0x0000C0, 0x00038C, 0x0000DE, 0x0000DF, - 0x0000D2, 0x0000D1, 0x0000D0, 0x0000D3, 0x0000D5, 0x000069, 0x0003B3, 0x0000D6, - 0x0000D9, 0x0000DD, 0x0000DC, 0x0000DB, 0x0003B2, 0x0000D4, 0x01D6A1, 0x0000DA, - 0x01D6A0, 0x000061, 0x01D6A4, 0x01D6A5, 0x00039A, 0x01D6C7, 0x01D6A8, 0x01D6A9, - 0x01D6AE, 0x000394, 0x01D6AC, 0x01D6AD, 0x01D6F4, 0x01D6AF, 0x01D6F6, 0x01D6F5, - 0x01D6F7, 0x000038, 0x01D694, 0x01D695, 0x000034, 0x01D69E, 0x000036, 0x000037, - 0x01D69A, 0x000039, 0x01D6B8, 0x01D6BE, 0x01D6BF, 0x01D69F, 0x01D6D4, 0x01D6D5, - 0x000044, 0x000045, 0x01D6B4, 0x01D6B5, 0x000054, 0x000055, 0x000056, 0x000057, - 0x01D6BA, 0x01D6BB, 0x0000AA, 0x00004D, 0x01D6AA, 0x01D6AB, 0x01D6B6, 0x01D6B1, - 0x000051, 0x01D6CF, 0x0000B2, 0x000053, 0x01D6B7, 0x0000B5, 0x000050, 0x01D6B0, - 0x00004C, 0x0000B9, 0x0000BA, 0x000052, 0x0000BC, 0x0000BD, 0x0000BE, 0x01D6D0, - 0x000042, 0x000074, 0x000043, 0x000072, 0x01D6D2, 0x01D6F0, 0x000046, 0x000047, - 0x0000CD, 0x000049, 0x00004A, 0x00004B, 0x000048, 0x01D6DA, 0x00004E, 0x00004F, - 0x000070, 0x000071, 0x01D6D1, 0x01D6D3, 0x01D6D6, 0x01D6D7, 0x000073, 0x01D6DE, - 0x000059, 0x000079, 0x0000B3, 0x000058, 0x01D6F1, 0x01D6DF, 0x00005A, 0x000078, - 0x000101, 0x000100, 0x000103, 0x000102, 0x000105, 0x000104, 0x000107, 0x000106, - 0x000109, 0x000108, 0x00010B, 0x00010A, 0x00010D, 0x00010C, 0x00010F, 0x00010E, - 0x000111, 0x000110, 0x000113, 0x000112, 0x000115, 0x000114, 0x000117, 0x000116, - 0x000119, 0x000118, 0x00011B, 0x00011A, 0x00011D, 0x00011C, 0x00011F, 0x00011E, - 0x000121, 0x000120, 0x000123, 0x000122, 0x000125, 0x000124, 0x000127, 0x000126, - 0x000129, 0x000128, 0x01D691, 0x00012A, 0x00012D, 0x00012C, 0x00012F, 0x00012E, - 0x000131, 0x000130, 0x000133, 0x000132, 0x000135, 0x000134, 0x000137, 0x000136, - 0x000139, 0x000138, 0x00013B, 0x00013A, 0x00013D, 0x00013C, 0x00013F, 0x00013E, - 0x000141, 0x000140, 0x000143, 0x000142, 0x000145, 0x000144, 0x000147, 0x000146, - 0x000149, 0x000148, 0x01D69B, 0x00014A, 0x00014D, 0x00014C, 0x00014F, 0x00014E, - 0x000151, 0x000150, 0x000153, 0x000152, 0x000155, 0x000154, 0x000157, 0x000156, - 0x000159, 0x000158, 0x00015B, 0x00015A, 0x00015D, 0x00015C, 0x00015F, 0x00015E, - 0x000161, 0x000160, 0x000163, 0x000162, 0x000165, 0x000164, 0x000167, 0x000166, - 0x000169, 0x000168, 0x00016B, 0x00016A, 0x00016D, 0x00016C, 0x01D690, 0x01D697, - 0x000171, 0x000170, 0x000173, 0x000172, 0x000175, 0x000174, 0x000177, 0x000176, - 0x000179, 0x000178, 0x00017B, 0x00017A, 0x01D696, 0x00017C, 0x00017F, 0x00017E, - 0x000181, 0x000180, 0x000183, 0x000182, 0x000185, 0x000184, 0x000187, 0x000186, - 0x000189, 0x000188, 0x00018B, 0x00018A, 0x00018D, 0x00018C, 0x00018F, 0x00018E, - 0x000191, 0x000190, 0x000193, 0x000192, 0x000195, 0x000194, 0x000197, 0x000196, - 0x000199, 0x000198, 0x00019B, 0x00019A, 0x00019D, 0x00019C, 0x00019F, 0x00019E, - 0x0001A1, 0x0001A0, 0x0001A3, 0x0001A2, 0x0001A5, 0x0001A4, 0x0001A7, 0x0001A6, - 0x0001A9, 0x0001A8, 0x0001AB, 0x0001AA, 0x0001AD, 0x0001AC, 0x0001AF, 0x0001AE, - 0x0001B1, 0x0001B0, 0x0001B3, 0x0001B2, 0x0001B5, 0x0001B4, 0x0001B7, 0x0001B6, - 0x0001B9, 0x0001B8, 0x0001BB, 0x0001BA, 0x0001BD, 0x0001BC, 0x0001BF, 0x0001BE, - 0x0001C1, 0x0001C0, 0x0001C3, 0x0001C2, 0x0001C5, 0x0001C4, 0x0001C7, 0x0001C6, - 0x0001C9, 0x0001C8, 0x0001CB, 0x0001CA, 0x0001CD, 0x0001CC, 0x0001CF, 0x0001CE, - 0x0001D1, 0x0001D0, 0x0001D3, 0x0001D2, 0x0001D5, 0x0001D4, 0x0001D7, 0x0001D6, - 0x0001D9, 0x0001D8, 0x0001DB, 0x0001DA, 0x0001DD, 0x0001DC, 0x0001DF, 0x0001DE, - 0x0001E1, 0x0001E0, 0x0001E3, 0x0001E2, 0x0001E5, 0x0001E4, 0x0001E7, 0x0001E6, - 0x0001E9, 0x0001E8, 0x0001EB, 0x0001EA, 0x0001ED, 0x0001EC, 0x0001EF, 0x0001EE, - 0x0001F1, 0x0001F0, 0x0001F3, 0x0001F2, 0x0001F5, 0x0001F4, 0x01D711, 0x0001F6, - 0x0001F9, 0x0001F8, 0x0001FB, 0x0001FA, 0x0001FD, 0x0001FC, 0x0001FF, 0x0001FE, - 0x01D702, 0x01D703, 0x01D722, 0x01D721, 0x01D720, 0x01D723, 0x01D708, 0x01D725, - 0x01D726, 0x01D72B, 0x01D73C, 0x01D73D, 0x01D73E, 0x01D727, 0x01D710, 0x01D731, - 0x01D730, 0x01D73A, 0x01D736, 0x01D734, 0x01D753, 0x01D737, 0x01D718, 0x01D739, - 0x01D73B, 0x01D71B, 0x01D71C, 0x01D738, 0x01D73F, 0x01D71F, 0x01D781, 0x01D780, - 0x01D783, 0x01D782, 0x01D785, 0x01D784, 0x01D787, 0x01D786, 0x01D72A, 0x01D788, - 0x01D78B, 0x01D78A, 0x01D78D, 0x01D78C, 0x01D78F, 0x01D78E, 0x01D791, 0x01D790, - 0x01D793, 0x01D792, 0x01D795, 0x01D794, 0x01D797, 0x01D796, 0x01D799, 0x01D798, - 0x01D79B, 0x01D79A, 0x01D79D, 0x01D79C, 0x01D79F, 0x01D79E, 0x01D7A1, 0x01D7A0, - 0x01D7A3, 0x01D7A2, 0x01D7A5, 0x01D7A4, 0x01D7A7, 0x01D7A6, 0x01D724, 0x01D7A8, - 0x01D7AB, 0x01D7AA, 0x01D7AD, 0x01D7AC, 0x01D7AF, 0x01D7AE, 0x01D7B1, 0x01D7B0, - 0x01D7B3, 0x01D7B2, 0x01D7B5, 0x01D7B4, 0x01D7B7, 0x01D7B6, 0x01D7B9, 0x01D7B8, - 0x01D7BB, 0x01D7BA, 0x01D7BD, 0x01D7BC, 0x01D7BF, 0x01D7BE, 0x01D7C1, 0x01D7C0, - 0x01D752, 0x01D7C2, 0x01D7C5, 0x01D7C4, 0x01D7C7, 0x01D7C6, 0x01D7C9, 0x01D7C8, - 0x01D7CB, 0x01D7CA, 0x01D750, 0x01D751, 0x01D7CF, 0x01D7CE, 0x01D7D1, 0x01D7D0, - 0x01D7D3, 0x01D7D2, 0x01D7D5, 0x01D7D4, 0x01D7D7, 0x01D7D6, 0x01D7D9, 0x01D7D8, - 0x01D7DB, 0x01D7DA, 0x01D7DD, 0x01D7DC, 0x01D7DF, 0x01D7DE, 0x01D740, 0x01D741, - 0x01D773, 0x01D743, 0x01D744, 0x01D745, 0x01D746, 0x01D747, 0x01D728, 0x01D729, - 0x01D74A, 0x01D74B, 0x01D72C, 0x01D72D, 0x01D72E, 0x01D72F, 0x01D742, 0x01D749, - 0x01D7F3, 0x01D7F2, 0x01D754, 0x01D748, 0x01D756, 0x01D757, 0x01D758, 0x01D759, - 0x01D75A, 0x01D75B, 0x01D75C, 0x01D75D, 0x01D75E, 0x01D75F, 0x000218, 0x000219, - 0x000200, 0x000201, 0x000202, 0x000203, 0x000204, 0x000205, 0x000206, 0x000207, - 0x000208, 0x000209, 0x00020A, 0x00020B, 0x00020C, 0x00020D, 0x00020E, 0x00020F, - 0x000230, 0x000231, 0x000232, 0x000233, 0x000234, 0x000235, 0x000236, 0x000237, - 0x000238, 0x000239, 0x00023A, 0x00023B, 0x00021C, 0x00021D, 0x00021E, 0x00021F, - 0x000240, 0x000241, 0x000242, 0x000243, 0x000244, 0x000245, 0x000246, 0x000247, - 0x000248, 0x000249, 0x00024A, 0x00024B, 0x00024C, 0x00024D, 0x00022E, 0x00022F, - 0x000250, 0x000251, 0x000252, 0x000253, 0x000254, 0x000255, 0x000256, 0x000257, - 0x000258, 0x000259, 0x00025A, 0x00025B, 0x00025C, 0x00025D, 0x00025E, 0x00025F, - 0x000220, 0x000221, 0x000222, 0x000223, 0x000224, 0x000225, 0x000226, 0x000227, - 0x0000E8, 0x000229, 0x00022A, 0x00022B, 0x0000EC, 0x000228, 0x0000EE, 0x0000EF, - 0x000270, 0x000271, 0x000272, 0x000273, 0x000274, 0x000275, 0x00007A, 0x000277, - 0x00022C, 0x00022D, 0x00027A, 0x00027B, 0x00023C, 0x00023D, 0x00023E, 0x00023F, - 0x000728, 0x000771, 0x000772, 0x000773, 0x000724, 0x000770, 0x000776, 0x00072F, - 0x00046C, 0x00046D, 0x00072A, 0x00072B, 0x00044C, 0x00044D, 0x00044E, 0x00044F, - 0x00072C, 0x00072D, 0x000750, 0x000759, 0x000755, 0x000752, 0x00072E, 0x000756, - 0x00071E, 0x000761, 0x00075A, 0x00075B, 0x000754, 0x00071C, 0x000777, 0x000760, - 0x000460, 0x000461, 0x000462, 0x000463, 0x000465, 0x000392, 0x000466, 0x000467, - 0x000468, 0x000469, 0x00046A, 0x00046B, 0x00042C, 0x00042D, 0x00046E, 0x00046F, - 0x000726, 0x000721, 0x000720, 0x000725, 0x000474, 0x00047C, 0x000464, 0x000722, - 0x000478, 0x000479, 0x00047A, 0x000729, 0x000393, 0x00047D, 0x00047E, 0x00047F, - 0x000440, 0x000441, 0x000442, 0x000443, 0x000444, 0x000445, 0x00026E, 0x000447, - 0x000268, 0x000269, 0x00026A, 0x00026F, 0x00026C, 0x00026D, 0x00024E, 0x00024F, - 0x000470, 0x00047B, 0x000449, 0x000476, 0x000475, 0x000477, 0x000446, 0x000448, - 0x000458, 0x000459, 0x00044A, 0x00044B, 0x00045C, 0x00045D, 0x00045E, 0x00045F, - 0x000062, 0x000261, 0x000262, 0x000263, 0x000064, 0x000065, 0x000066, 0x000067, - 0x000068, 0x000267, 0x00026B, 0x00006B, 0x000396, 0x00006E, 0x00006A, 0x00006F, - 0x00027C, 0x000260, 0x000266, 0x000397, 0x000391, 0x00027D, 0x000390, 0x000276, - 0x000278, 0x000279, 0x000264, 0x000265, 0x00006C, 0x00006D, 0x00027E, 0x00027F, - 0x000692, 0x000698, 0x00069D, 0x000693, 0x000691, 0x00069A, 0x00069B, 0x000697, - 0x000690, 0x000696, 0x00A380, 0x00A381, 0x00A383, 0x00A38E, 0x00A384, 0x00A385, - 0x00A0EC, 0x00A382, 0x00A388, 0x00A389, 0x00A387, 0x00A38B, 0x00A38C, 0x00A38D, - 0x00A38A, 0x00A38F, 0x00A390, 0x00A391, 0x00A392, 0x00A39E, 0x00A394, 0x00A395, - 0x00A396, 0x00A397, 0x00A398, 0x00A399, 0x00A065, 0x00A39B, 0x00A39C, 0x00A39D, - 0x00A39A, 0x00A39F, 0x000680, 0x000687, 0x00A0EE, 0x00A3C4, 0x000768, 0x000769, - 0x000694, 0x00A386, 0x000688, 0x000689, 0x00A3A3, 0x00076C, 0x000695, 0x00069C, - 0x00076D, 0x00A0ED, 0x00A3B0, 0x00A3B1, 0x00A3B3, 0x00A3BE, 0x00A3B4, 0x00A3B5, - 0x00A3B2, 0x00A3B7, 0x00A3B8, 0x00A3B9, 0x00A3B6, 0x00A3BB, 0x000686, 0x00A3BD, - 0x00A3BA, 0x00A3BF, 0x00076E, 0x00076F, 0x00074D, 0x00A3C5, 0x00074E, 0x00074F, - 0x00A0E6, 0x00077C, 0x00A0EF, 0x00A0E8, 0x000684, 0x000685, 0x00A0CE, 0x00077D, - 0x000758, 0x000778, 0x00077E, 0x00077F, 0x00075C, 0x00075D, 0x00075E, 0x00075F, - 0x000779, 0x000765, 0x000762, 0x000763, 0x000774, 0x000775, 0x000766, 0x000767, - 0x00076A, 0x00076B, 0x00A3BC, 0x00A3AE, 0x000764, 0x00A0E3, 0x00A3A4, 0x00A3A5, - 0x00A0E5, 0x00A0E2, 0x00A3A8, 0x00A3A9, 0x00A3AA, 0x00A3AB, 0x00A3AD, 0x00A0E1, - 0x00A3AF, 0x00A0E0, 0x00077B, 0x00A0E7, 0x00077A, 0x00A0E9, 0x00A0F4, 0x00A0E4, - 0x00A0F6, 0x00A0F7, 0x000419, 0x000492, 0x000490, 0x000491, 0x00A0FC, 0x00A0FD, - 0x00A0EA, 0x00A0EB, 0x00A088, 0x00A0FE, 0x00A08C, 0x000497, 0x00A085, 0x00A084, - 0x000493, 0x00A08D, 0x00A098, 0x00A099, 0x00A08B, 0x00A089, 0x00A08E, 0x00A08F, - 0x00A09E, 0x00A09F, 0x00A091, 0x00A090, 0x00A093, 0x00A092, 0x00A09A, 0x00A09B, - 0x00A097, 0x00A096, 0x00A082, 0x00A083, 0x00A09C, 0x00A09D, 0x00A094, 0x00A095, - 0x00A080, 0x00A081, 0x00A0A4, 0x00A0A0, 0x00A0A3, 0x00A0A2, 0x00A0A5, 0x00A0A1, - 0x00A086, 0x00A087, 0x000495, 0x00A0A8, 0x00A0AB, 0x00A0AA, 0x00A0F5, 0x000496, - 0x00A0AF, 0x00A0AE, 0x00A0B4, 0x00A0B0, 0x00A0B3, 0x00A0B2, 0x00A0B5, 0x00A0B1, - 0x00A0B7, 0x00A0B6, 0x00A0BC, 0x00A0B8, 0x00A0BB, 0x00A0BA, 0x00A0BD, 0x00A0B9, - 0x00A0BF, 0x00A0BE, 0x00A1C0, 0x00A1C1, 0x00A1E2, 0x00A1E3, 0x00A0C3, 0x00A1E1, - 0x00A1E6, 0x00A1E7, 0x00A1E0, 0x00A1C8, 0x00A0C4, 0x00A0CA, 0x00A0C5, 0x00A0DD, - 0x000494, 0x00049B, 0x00A0C0, 0x00A0C1, 0x00A0C2, 0x00A0FF, 0x00A0D5, 0x00A0D4, - 0x00A0C6, 0x00A0C7, 0x00A0D9, 0x00A0D8, 0x00A0DB, 0x00A0DA, 0x00A1FC, 0x00A0DC, - 0x00A0DF, 0x00A0DE, 0x00A1FE, 0x00A1FF, 0x000413, 0x00A0F8, 0x00A0C9, 0x00A0F1, - 0x00049A, 0x00A0C8, 0x00A0F2, 0x00A0CB, 0x00A0F3, 0x00A1FA, 0x00A1F8, 0x00A0F0, - 0x00A0A6, 0x00A0A7, 0x00A1F0, 0x00A1F1, 0x00A1F2, 0x00A1F3, 0x00A1F4, 0x00A1F5, - 0x00A0CF, 0x00A1F9, 0x00A0F9, 0x00A0CC, 0x00A1F6, 0x00A1FB, 0x00A1FD, 0x00A0FB, - 0x00A0CD, 0x00A1F7, 0x00A128, 0x00A129, 0x00A12A, 0x00A12B, 0x00A184, 0x00A185, - 0x00A124, 0x00A125, 0x00A188, 0x00A189, 0x00A18A, 0x00A18B, 0x00A18C, 0x00A18D, - 0x00A18E, 0x00A18F, 0x00A12C, 0x00A12D, 0x00A178, 0x00A179, 0x00A192, 0x00A193, - 0x00A114, 0x00A115, 0x00A11A, 0x00A11B, 0x00A118, 0x00A119, 0x00A11E, 0x00A11F, - 0x00A12E, 0x00A12F, 0x00A180, 0x00A181, 0x00A182, 0x00A183, 0x00A1A4, 0x00A1A5, - 0x00A186, 0x00A187, 0x00A1A8, 0x00A1A9, 0x00A1AA, 0x00A1AB, 0x00A1AC, 0x00A1AD, - 0x00A1AE, 0x00A1AF, 0x00A190, 0x00A191, 0x00A1B2, 0x00A1B3, 0x00A194, 0x00A195, - 0x00A196, 0x00A197, 0x00A198, 0x00A199, 0x00A19A, 0x00A19B, 0x00A19C, 0x00A19D, - 0x00A19E, 0x00A19F, 0x00A1A0, 0x00A1A1, 0x00A1C2, 0x00A1C3, 0x00A1C4, 0x00A1C5, - 0x00A1C6, 0x00A1C7, 0x00A153, 0x00A1C9, 0x00A1CA, 0x00A1CB, 0x00A1CC, 0x00A1CD, - 0x00A1CE, 0x00A1CF, 0x00A1D0, 0x00A1D1, 0x00A1D2, 0x00A1D3, 0x00A1D4, 0x00A1D5, - 0x00A1D6, 0x00A1D7, 0x00A1D8, 0x00A1D9, 0x00A1DA, 0x00A1DB, 0x00A1DC, 0x00A1DD, - 0x00A1DE, 0x00A1DF, 0x00A150, 0x00A151, 0x00A152, 0x00A1A3, 0x00A144, 0x00A175, - 0x00A157, 0x00A1A2, 0x00A17B, 0x00A14A, 0x00A156, 0x00A14B, 0x00A174, 0x00A17E, - 0x00A17A, 0x00A17F, 0x00A1B0, 0x00A1B1, 0x00A1A6, 0x00A1A7, 0x00A1B4, 0x00A1B5, - 0x00A1B6, 0x00A1B7, 0x00A1B8, 0x00A1B9, 0x00A1BA, 0x00A1BB, 0x00A1BC, 0x00A1BD, - 0x00A1BE, 0x00A1BF, 0x000502, 0x000503, 0x00050A, 0x00050B, 0x000500, 0x000501, - 0x00050E, 0x00050F, 0x000508, 0x000509, 0x000504, 0x000505, 0x000506, 0x000507, - 0x000519, 0x000518, 0x00A02B, 0x000564, 0x00051D, 0x00051C, 0x00051F, 0x00051E, - 0x000521, 0x000520, 0x000523, 0x000527, 0x000525, 0x000524, 0x000522, 0x000526, - 0x000529, 0x000528, 0x00052B, 0x00052F, 0x00050C, 0x00050D, 0x00052A, 0x00052E, - 0x000531, 0x00053B, 0x000533, 0x000532, 0x00053A, 0x000537, 0x000534, 0x000535, - 0x000539, 0x000538, 0x000563, 0x00053F, 0x00053D, 0x00053C, 0x000536, 0x00053E, - 0x000541, 0x000540, 0x000543, 0x000542, 0x000545, 0x000544, 0x000547, 0x000546, - 0x00057B, 0x000565, 0x00A009, 0x00054A, 0x000575, 0x000481, 0x000549, 0x00057A, - 0x000551, 0x000550, 0x000553, 0x000571, 0x000555, 0x000554, 0x000552, 0x000556, - 0x000548, 0x000576, 0x000577, 0x00054B, 0x00054C, 0x00054D, 0x00054E, 0x00054F, - 0x000579, 0x00A01B, 0x000578, 0x00057E, 0x00052C, 0x00052D, 0x000567, 0x000561, - 0x0005EA, 0x0005E9, 0x0004D1, 0x00057F, 0x0005E8, 0x00A163, 0x00A164, 0x00A165, - 0x00A162, 0x000570, 0x00A168, 0x00A169, 0x00A16A, 0x00A16B, 0x00A16C, 0x00A16D, - 0x00A16E, 0x00A16F, 0x000573, 0x00A011, 0x000572, 0x000566, 0x0004B7, 0x00049F, - 0x000582, 0x000583, 0x000580, 0x000581, 0x000586, 0x000587, 0x000584, 0x000585, - 0x00A17C, 0x000623, 0x00A000, 0x00A001, 0x0005E6, 0x0005E7, 0x00A004, 0x00A005, - 0x000510, 0x000511, 0x000512, 0x000513, 0x000514, 0x000515, 0x000516, 0x000517, - 0x00A006, 0x00A007, 0x00051A, 0x00051B, 0x00A012, 0x00A013, 0x00A010, 0x00A00D, - 0x00A016, 0x00A017, 0x00A00A, 0x00A008, 0x00A01A, 0x00A00B, 0x00A01C, 0x00A01D, - 0x00A00E, 0x00A00F, 0x00A02C, 0x00A02D, 0x00A02E, 0x00A02F, 0x00A024, 0x00A025, - 0x00A022, 0x00A023, 0x00A038, 0x00A039, 0x00A02A, 0x00A029, 0x00A027, 0x00A00C, - 0x00A03E, 0x00A028, 0x00A030, 0x00A031, 0x00A032, 0x00A033, 0x00A03A, 0x00A03F, - 0x00A036, 0x00A037, 0x0005D9, 0x00A049, 0x00A03B, 0x00A021, 0x00A034, 0x00A035, - 0x00A03C, 0x00A03D, 0x00A042, 0x00A041, 0x00056C, 0x00A043, 0x00A046, 0x00A040, - 0x00A047, 0x0005F1, 0x0005F2, 0x0005F0, 0x00A04A, 0x00A04B, 0x00A044, 0x00A045, - 0x00A05B, 0x00A04F, 0x00A052, 0x00A053, 0x00A050, 0x00A051, 0x00A056, 0x00A057, - 0x0005DC, 0x00056E, 0x000562, 0x00056F, 0x0005D4, 0x0005D5, 0x0005DA, 0x0005DB, - 0x0005D8, 0x000569, 0x00056A, 0x00056B, 0x0005DD, 0x000568, 0x0005DE, 0x0005DF, - 0x0005D2, 0x0005D3, 0x0005E1, 0x0005E3, 0x0005E0, 0x0005E5, 0x000574, 0x0005E4, - 0x0005D0, 0x0005D1, 0x0005E2, 0x00056D, 0x00057C, 0x00057D, 0x0005D6, 0x0005D7, - 0x00A020, 0x00A026, 0x00A058, 0x00A059, 0x00A05A, 0x00A05D, 0x00A054, 0x00A055, - 0x00A05E, 0x00A05F, 0x0007CA, 0x00A340, 0x0007CC, 0x0007CD, 0x000631, 0x0007CE, - 0x00A346, 0x00A347, 0x00A364, 0x00A365, 0x00A36D, 0x0006B1, 0x00A215, 0x000633, - 0x000632, 0x00069E, 0x000683, 0x00A211, 0x00A369, 0x00A36E, 0x00A36C, 0x00069F, - 0x00A368, 0x00A210, 0x0007E3, 0x00A36F, 0x000699, 0x00A36A, 0x00A35C, 0x0007E2, - 0x0007E4, 0x0007E5, 0x000681, 0x00A21D, 0x0007E8, 0x0007E9, 0x00A37C, 0x00A214, - 0x00A362, 0x00A363, 0x0007EA, 0x000682, 0x00A2AB, 0x00A32E, 0x00A32C, 0x00068B, - 0x00A213, 0x00A20B, 0x00A21B, 0x00A374, 0x00A37E, 0x00A37F, 0x00A375, 0x00A06C, - 0x0004E8, 0x0004ED, 0x00A06B, 0x0004E6, 0x0004E5, 0x0004E7, 0x00A06E, 0x00A06F, - 0x00A06A, 0x0004E9, 0x0004CA, 0x00A060, 0x0004E4, 0x00A063, 0x0007E0, 0x0004EE, - 0x00A06D, 0x0007D4, 0x00A048, 0x00A35D, 0x00A062, 0x00A067, 0x00A04C, 0x00A04D, - 0x00A04E, 0x00A068, 0x0007DA, 0x00A291, 0x000719, 0x0004EC, 0x00A37A, 0x0007CB, - 0x00A07E, 0x00A066, 0x0004E2, 0x0004E3, 0x0004E1, 0x00A079, 0x00A05C, 0x00A078, - 0x00A07F, 0x0004EF, 0x00A064, 0x00A069, 0x0004FC, 0x0004E0, 0x0004EB, 0x00A07C, - 0x00A076, 0x00A061, 0x0004FE, 0x0004EA, 0x0004F4, 0x0004FD, 0x0004F6, 0x0004FF, - 0x0004F8, 0x0004F9, 0x0004FA, 0x0004FB, 0x00A072, 0x00A073, 0x00A074, 0x00A075, - 0x000480, 0x00A07A, 0x00A07D, 0x00A071, 0x00048C, 0x00048D, 0x00A070, 0x0004F7, - 0x00A07B, 0x00A077, 0x00048A, 0x00048B, 0x000718, 0x00071D, 0x00048E, 0x00048F, - 0x00A292, 0x00A297, 0x00A2B5, 0x00A2B9, 0x000636, 0x000635, 0x000412, 0x000727, - 0x000498, 0x000499, 0x00049E, 0x0004BA, 0x00049C, 0x00049D, 0x000723, 0x000417, - 0x0004A1, 0x0004B1, 0x0004B0, 0x0004BB, 0x0004B4, 0x0004B5, 0x0004AD, 0x0004B6, - 0x0004AA, 0x0004AB, 0x0004A2, 0x0004A3, 0x0004A8, 0x0004A9, 0x0004A0, 0x0004A5, - 0x00041B, 0x000416, 0x0004B2, 0x0004B3, 0x0004A4, 0x0004AF, 0x0004A6, 0x0004A7, - 0x0004B8, 0x0004B9, 0x000630, 0x000637, 0x0004BC, 0x0004BD, 0x0004BE, 0x0004BF, - 0x000757, 0x000634, 0x000411, 0x00041A, 0x000410, 0x00A2A5, 0x000414, 0x000415, - 0x00A2A9, 0x0004C9, 0x0004C8, 0x0004CE, 0x0004CD, 0x000753, 0x0004CC, 0x0004CF, - 0x0004D0, 0x0004D6, 0x0004D2, 0x0004D3, 0x0004C1, 0x0004D7, 0x0004DA, 0x0004DB, - 0x0004D4, 0x0004D5, 0x0004D8, 0x0004D9, 0x0004DE, 0x0004DF, 0x0004DC, 0x0004DD, - 0x0004C0, 0x000710, 0x00071A, 0x000715, 0x0004C4, 0x0004C5, 0x0004C6, 0x0004C7, - 0x000716, 0x000714, 0x0004C2, 0x0004C3, 0x000717, 0x0004CB, 0x00A3EE, 0x00A3E4, - 0x0004F0, 0x0004F1, 0x00A3E8, 0x00A3EC, 0x00A3EB, 0x0004F5, 0x00A3ED, 0x00A3EF, - 0x0004AE, 0x00A3EA, 0x0004F2, 0x0004F3, 0x00071B, 0x0004AC, 0x000712, 0x000713, - 0x000782, 0x000783, 0x000780, 0x000781, 0x000785, 0x000787, 0x000784, 0x0007B1, - 0x00079C, 0x00079D, 0x00A301, 0x00078B, 0x00A316, 0x00A317, 0x00078F, 0x000786, - 0x000791, 0x00079E, 0x00A393, 0x000792, 0x00079F, 0x000790, 0x000796, 0x000795, - 0x000798, 0x000799, 0x00079B, 0x00A318, 0x00A312, 0x00A313, 0x000794, 0x00079A, - 0x00A314, 0x00A315, 0x00A31A, 0x00A31B, 0x00A311, 0x00A319, 0x00A31E, 0x00A31D, - 0x00A31F, 0x00A310, 0x00078A, 0x00A300, 0x000788, 0x000789, 0x0007A3, 0x00078E, - 0x00A302, 0x00A303, 0x00A324, 0x00A32B, 0x0007A0, 0x0007A1, 0x00A334, 0x00A325, - 0x00A33A, 0x00A33B, 0x0007A2, 0x00A329, 0x00078C, 0x00078D, 0x00A328, 0x00A32D, - 0x00A306, 0x00A307, 0x00A335, 0x0007DB, 0x0007D0, 0x0007D5, 0x00A31C, 0x00A30B, - 0x00A32A, 0x00A32F, 0x0007D6, 0x0007C3, 0x0007C2, 0x0007C1, 0x0007C7, 0x0007D7, - 0x000751, 0x0007C9, 0x0007CF, 0x0007D1, 0x0007DC, 0x0007DD, 0x0007DE, 0x0007DF, - 0x0007D8, 0x0007D9, 0x00A359, 0x0007D3, 0x00A352, 0x00A353, 0x0007D2, 0x00071F, - 0x00A293, 0x00A35B, 0x00A350, 0x00A351, 0x00A354, 0x00A343, 0x00A341, 0x00A355, - 0x00A356, 0x00A357, 0x0007C0, 0x0007C5, 0x0007C8, 0x0007C6, 0x0007A4, 0x0007A5, - 0x00A342, 0x0007E1, 0x00A378, 0x00A379, 0x0007C4, 0x00A37B, 0x0007E6, 0x0007E7, - 0x00A35E, 0x00A3E5, 0x00A35A, 0x00A35F, 0x00A3E9, 0x00A358, 0x00A33E, 0x00A33F, - 0x00040D, 0x000401, 0x000402, 0x000403, 0x000400, 0x000405, 0x000406, 0x000407, - 0x000409, 0x000404, 0x00040A, 0x00040B, 0x000797, 0x000408, 0x00040E, 0x00040F, - 0x000450, 0x000451, 0x000452, 0x000453, 0x000455, 0x000472, 0x000456, 0x000457, - 0x000418, 0x000793, 0x00045B, 0x000454, 0x00041C, 0x00041D, 0x00041E, 0x00041F, - 0x000429, 0x000421, 0x000422, 0x000423, 0x000420, 0x000425, 0x000426, 0x000427, - 0x0003A8, 0x000424, 0x0003AA, 0x00042B, 0x0003AC, 0x00040C, 0x0003AE, 0x0003AF, - 0x00043C, 0x000431, 0x000432, 0x000433, 0x000430, 0x000435, 0x000436, 0x000437, - 0x000439, 0x000434, 0x00043A, 0x00043B, 0x000438, 0x00043D, 0x00043E, 0x00043F, - 0x0003C0, 0x0003C1, 0x0003C2, 0x0003C3, 0x0003C4, 0x0003C5, 0x0003C6, 0x0003C7, - 0x0003C8, 0x0003C9, 0x0003CA, 0x0003CB, 0x0003CC, 0x0003CD, 0x0003CE, 0x0003CF, - 0x0003D0, 0x0003D1, 0x0003D2, 0x0003D3, 0x0003D4, 0x0003D5, 0x0003D6, 0x0003D7, - 0x0003D8, 0x0003D9, 0x0003DA, 0x0003DB, 0x0003DC, 0x0003DD, 0x0003DE, 0x0003DF, - 0x0003E0, 0x0003E1, 0x0003E2, 0x0003E3, 0x0003E4, 0x0003E5, 0x0003E6, 0x0003E7, - 0x0003E8, 0x0003E9, 0x0003EA, 0x0003EB, 0x0003EC, 0x0003ED, 0x0003EE, 0x0003EF, - 0x0003F0, 0x0003F1, 0x0003F2, 0x0003F3, 0x0003F4, 0x000473, 0x00042A, 0x0003F7, - 0x0003F8, 0x0003F9, 0x0003FA, 0x0003FB, 0x0003FC, 0x0003FD, 0x0003FE, 0x0003FF, - 0x00A433, 0x00A40E, 0x00A404, 0x00A405, 0x00A435, 0x00A432, 0x00A408, 0x00A409, - 0x00A40A, 0x00A40B, 0x00A3C0, 0x00A3C1, 0x00A3E6, 0x00A3E7, 0x00A482, 0x00A483, - 0x00A3C6, 0x00A3C7, 0x00A480, 0x00A481, 0x00A48B, 0x00A48A, 0x00A3CC, 0x00A485, - 0x00A3CE, 0x00A484, 0x00A40C, 0x00A40D, 0x000802, 0x000801, 0x000803, 0x00A486, - 0x0008A2, 0x00A487, 0x00A488, 0x00A489, 0x0008BC, 0x0008BD, 0x0008BA, 0x0008BB, - 0x00080B, 0x000852, 0x00A3E0, 0x00A3E1, 0x00A3E2, 0x00A3E3, 0x00A43D, 0x00A46E, - 0x00A3A6, 0x00A3A7, 0x0008AB, 0x00A439, 0x000807, 0x000853, 0x00A3FE, 0x0008A7, - 0x00A436, 0x00A437, 0x00A3F0, 0x00A3F1, 0x00A3F2, 0x00A3F3, 0x00A3F4, 0x00A3F5, - 0x00A434, 0x00A3F7, 0x00A3F8, 0x00A3F9, 0x00A3FA, 0x00A3FB, 0x00A3FC, 0x00A3FD, - 0x00A3FF, 0x00A3F6, 0x00A4D0, 0x00A4D1, 0x00A4D2, 0x000806, 0x00A46F, 0x000800, - 0x00A4D6, 0x00A4D7, 0x00A3D8, 0x00A46A, 0x0008A0, 0x0008A5, 0x00A3DC, 0x00A3DD, - 0x00A43A, 0x00A43F, 0x00A3D0, 0x00A3D1, 0x00A3D2, 0x00A3D3, 0x00A3D4, 0x00A3D5, - 0x00A3D6, 0x00A3D7, 0x00A3C3, 0x00A3D9, 0x00A3DA, 0x00A3DB, 0x00A4D3, 0x00A3C2, - 0x00A3DE, 0x00A3DF, 0x0008A6, 0x0008AA, 0x0008A1, 0x00A465, 0x00A4E2, 0x00A4E3, - 0x0008A9, 0x00A3CD, 0x00A4E1, 0x00A4E6, 0x00A3CA, 0x00A3C9, 0x00A4E0, 0x00A3C8, - 0x00A3CF, 0x00A4E7, 0x00A4F1, 0x00A4F3, 0x00A4F0, 0x00A4F2, 0x00A438, 0x00A4F7, - 0x00A43B, 0x00A4F6, 0x00A464, 0x000804, 0x00A423, 0x000811, 0x000805, 0x00A43C, - 0x00080A, 0x00A46B, 0x00A58A, 0x00A516, 0x00A517, 0x000809, 0x000812, 0x00A589, - 0x00080D, 0x00A511, 0x00A50A, 0x00A508, 0x00A503, 0x000813, 0x00A504, 0x00A509, - 0x000808, 0x00A502, 0x00080F, 0x00A510, 0x00A513, 0x00A512, 0x00A51C, 0x00A51D, - 0x014503, 0x014500, 0x00A519, 0x00A518, 0x00080C, 0x00A51A, 0x014517, 0x000B6C, - 0x00A51F, 0x01450B, 0x00A539, 0x00A53F, 0x00A501, 0x00A538, 0x00080E, 0x014519, - 0x014518, 0x01451D, 0x01453F, 0x000810, 0x00A588, 0x01450A, 0x00A53A, 0x00A6E6, - 0x00A506, 0x00A58F, 0x014507, 0x01452B, 0x00A533, 0x00A532, 0x000815, 0x00A537, - 0x00A534, 0x00A535, 0x0008B6, 0x0008B7, 0x0008B0, 0x0008B1, 0x000854, 0x000864, - 0x00A522, 0x00A53B, 0x00A54A, 0x00A54B, 0x00A540, 0x0008B4, 0x0008B2, 0x0008B3, - 0x00A549, 0x00A576, 0x000AA2, 0x014535, 0x000857, 0x000851, 0x014506, 0x00A562, - 0x00A563, 0x000B6D, 0x00A57C, 0x000850, 0x00A557, 0x00A6E7, 0x014522, 0x000814, - 0x000861, 0x00A551, 0x00A572, 0x00A573, 0x00A57A, 0x00A57B, 0x00A578, 0x00A579, - 0x00A57D, 0x00A556, 0x00A568, 0x00A56D, 0x0008A3, 0x00A56C, 0x00A565, 0x00A564, - 0x00A56E, 0x0008B8, 0x00A521, 0x00A548, 0x00A56B, 0x00A54F, 0x00A56F, 0x00A520, - 0x00A56A, 0x00A569, 0x000860, 0x000856, 0x0008B9, 0x000865, 0x00A53C, 0x00086A, - 0x00A526, 0x00A527, 0x0145EE, 0x00A53D, 0x000A9C, 0x00A58E, 0x00090E, 0x00090F, - 0x00A53E, 0x00A54E, 0x01453C, 0x014523, 0x01453E, 0x01453D, 0x000908, 0x000909, - 0x000911, 0x000917, 0x000913, 0x000912, 0x000910, 0x00091A, 0x000915, 0x00091B, - 0x00A616, 0x0144DB, 0x01449E, 0x00A894, 0x000914, 0x00090D, 0x000916, 0x00090C, - 0x01456C, 0x0008AC, 0x00A97A, 0x0144EF, 0x0008AE, 0x0008A4, 0x000936, 0x000937, - 0x0008A8, 0x0008AD, 0x00A421, 0x00A585, 0x00A422, 0x00A427, 0x0008AF, 0x00A976, - 0x000931, 0x000930, 0x014488, 0x00A974, 0x00A420, 0x00A426, 0x00A944, 0x00A975, - 0x00A584, 0x000932, 0x0144BE, 0x000933, 0x0144BF, 0x00A977, 0x00A58B, 0x00A970, - 0x00A96B, 0x01448B, 0x01452E, 0x01452F, 0x0144F7, 0x014410, 0x01456E, 0x014564, - 0x000958, 0x00A43E, 0x01456F, 0x01457F, 0x00095C, 0x00095D, 0x00095E, 0x00095F, - 0x0144D8, 0x00A972, 0x00A971, 0x01456D, 0x014552, 0x00A97B, 0x000959, 0x014553, - 0x014545, 0x01454E, 0x014544, 0x01454F, 0x01454C, 0x014549, 0x014548, 0x01454B, - 0x01454A, 0x01454D, 0x00096E, 0x00096C, 0x0009EE, 0x00096D, 0x00096F, 0x0009EF, - 0x0009EC, 0x0009ED, 0x00A5E8, 0x00A5E5, 0x00A566, 0x00A567, 0x000968, 0x000969, - 0x00A5EE, 0x00A5EF, 0x00A5E9, 0x00A561, 0x00A560, 0x014570, 0x00A5ED, 0x00A5EC, - 0x00A5EA, 0x000978, 0x014563, 0x000979, 0x00097E, 0x00097C, 0x00097F, 0x00097D, - 0x000989, 0x000980, 0x00098A, 0x00098B, 0x000985, 0x000988, 0x000987, 0x000986, - 0x00099D, 0x00099F, 0x00A601, 0x00099C, 0x00A603, 0x00A602, 0x00A605, 0x00A604, - 0x00A607, 0x00A606, 0x00A609, 0x00A608, 0x000990, 0x00A60A, 0x000997, 0x000993, - 0x000999, 0x000998, 0x00099B, 0x00099A, 0x000994, 0x000995, 0x000996, 0x00099E, - 0x0009A2, 0x0009A3, 0x00A619, 0x00A618, 0x00098C, 0x0009A1, 0x00A61D, 0x00A61C, - 0x00A61F, 0x00A5B5, 0x00A621, 0x00A620, 0x00098F, 0x00A622, 0x00A2E2, 0x00A2E3, - 0x00A627, 0x00A626, 0x0009B0, 0x0009B7, 0x0009A8, 0x00A62A, 0x0009A0, 0x0009B6, - 0x0009B9, 0x0009B8, 0x0009B2, 0x0009A5, 0x00A2E7, 0x0009A6, 0x0009A7, 0x0009BD, - 0x0009E0, 0x0009E1, 0x0009E6, 0x0009E7, 0x0009E9, 0x0009F4, 0x0009EA, 0x0009E8, - 0x0009EB, 0x00A2E6, 0x00A2C0, 0x00A2C1, 0x0009CE, 0x0009FC, 0x00A2E0, 0x00A2E1, - 0x00A2C7, 0x0009F5, 0x0009F8, 0x0009F9, 0x00A2CC, 0x0009DC, 0x00A2CD, 0x0009F6, - 0x0009DD, 0x0009DF, 0x00A2D0, 0x00A2D1, 0x00A2D2, 0x00A2F2, 0x00A2F0, 0x00A2F1, - 0x00A2D6, 0x00A2D7, 0x0009AA, 0x0009AE, 0x0009A4, 0x00A2F6, 0x0009AF, 0x00A2F7, - 0x00A2CE, 0x00A2CF, 0x00A661, 0x00A660, 0x00A663, 0x00A662, 0x00A665, 0x0009AB, - 0x00A667, 0x00A666, 0x00A669, 0x00A668, 0x00A2F3, 0x00A66A, 0x00A66D, 0x00A66C, - 0x0009F7, 0x00A66E, 0x0009F0, 0x0009F1, 0x0009AC, 0x0009AD, 0x00A2F4, 0x00A2F5, - 0x00A2FE, 0x000B6F, 0x00A2F8, 0x00A2F9, 0x000A05, 0x00A2FF, 0x000A07, 0x000A06, - 0x00A2FC, 0x00A2FD, 0x00A692, 0x000A0A, 0x00A693, 0x00A2FB, 0x00A697, 0x00A2FA, - 0x00A6EA, 0x000A10, 0x000A13, 0x00A2A1, 0x00A2A2, 0x000A14, 0x000A17, 0x000A16, - 0x000A19, 0x000A18, 0x000A1B, 0x000A1A, 0x000A1D, 0x000A1C, 0x000A1F, 0x000A1E, - 0x00A290, 0x00A296, 0x00A2A0, 0x00A2D3, 0x00A2A6, 0x00A2A7, 0x00A2BC, 0x00A2BD, - 0x00A2BE, 0x000A28, 0x00A2C9, 0x00A2B4, 0x000A2D, 0x000A2C, 0x000A2F, 0x000A2E, - 0x000A33, 0x000A30, 0x00A2BA, 0x00A2BF, 0x000A35, 0x00A2BB, 0x000A32, 0x000A36, - 0x00A2B8, 0x000A38, 0x00A685, 0x00A2A3, 0x00A6BB, 0x00A6ED, 0x00A2C4, 0x00A2C5, - 0x00A6B5, 0x00A68A, 0x00A2C8, 0x00A684, 0x00A699, 0x00A2CB, 0x00A691, 0x00A698, - 0x00A690, 0x00A2CA, 0x00A682, 0x00A683, 0x00A6E9, 0x000A99, 0x00A6BD, 0x00A686, - 0x00A6BC, 0x00A613, 0x00A688, 0x00A689, 0x00A6CB, 0x00A68F, 0x00A6A0, 0x00A681, - 0x000A59, 0x0144DF, 0x000A5B, 0x000A5A, 0x00A6A2, 0x000A5C, 0x00A696, 0x000A5E, - 0x00A6E5, 0x000A98, 0x00A6EB, 0x00A6A6, 0x000B5F, 0x00A6A7, 0x000A67, 0x000A66, - 0x000A69, 0x000A68, 0x000A6B, 0x000A6A, 0x000A6D, 0x00A2A4, 0x000A6F, 0x000A6E, - 0x00A2AE, 0x0144D5, 0x00A2AA, 0x00A2A8, 0x00A6A1, 0x00A612, 0x00A2AC, 0x00A2AD, - 0x00A2AF, 0x014529, 0x00A6B8, 0x00A6B7, 0x00A6B2, 0x00A6B3, 0x00A6B4, 0x014524, - 0x00A6BE, 0x00A6BF, 0x0144D4, 0x00A6BA, 0x000A85, 0x00A6B9, 0x000A87, 0x000A86, - 0x000A89, 0x000A88, 0x000A8B, 0x000A8A, 0x000A8D, 0x000A8C, 0x000A8F, 0x00A7A8, - 0x00A722, 0x00A783, 0x00A217, 0x014565, 0x00A6CE, 0x00A212, 0x00A600, 0x000B68, - 0x014521, 0x00A6CF, 0x00A617, 0x00A61E, 0x00A782, 0x000B69, 0x00A781, 0x014520, - 0x000A93, 0x00A6E3, 0x000A91, 0x00A79E, 0x00A787, 0x00A611, 0x00A79F, 0x00A6E2, - 0x00A79C, 0x000AA8, 0x00A780, 0x00A7AA, 0x000AAD, 0x000AAC, 0x000AAF, 0x000AAE, - 0x000B74, 0x000AB0, 0x000AB3, 0x000AB2, 0x00A7A9, 0x000B75, 0x000AB7, 0x000AB6, - 0x00A786, 0x00A7AB, 0x00A21A, 0x00A610, 0x000A97, 0x00A732, 0x00A73E, 0x00A219, - 0x00A735, 0x00A733, 0x00A202, 0x00A203, 0x00A72A, 0x000A9B, 0x00A7AE, 0x00A216, - 0x00A73C, 0x00A723, 0x00A625, 0x00A74B, 0x00A6C5, 0x00A762, 0x00A6C8, 0x00A767, - 0x000B5C, 0x000AD0, 0x00A761, 0x00A6C4, 0x000AAB, 0x00A6C9, 0x00A744, 0x00A760, - 0x00A21E, 0x00A21F, 0x00A6E0, 0x000D93, 0x000B5D, 0x0144C5, 0x000B6E, 0x01448A, - 0x00A6D7, 0x00A766, 0x00A218, 0x00A74A, 0x00A6D6, 0x00A624, 0x00A653, 0x00A7FE, - 0x000AE9, 0x000AE8, 0x00A7FA, 0x00A76F, 0x000AED, 0x000AEC, 0x000AEF, 0x000AEE, - 0x00A765, 0x00A7FF, 0x00A769, 0x00A7FC, 0x000B73, 0x000B77, 0x00A76D, 0x00A768, - 0x00A76C, 0x00A76A, 0x000B76, 0x0144DA, 0x000A90, 0x000AB9, 0x00A77C, 0x000B72, - 0x00A76E, 0x00A763, 0x00A779, 0x00A6E8, 0x00A7FB, 0x00A778, 0x000B33, 0x000A96, - 0x000B19, 0x00A77D, 0x000B18, 0x00A623, 0x000B14, 0x000B30, 0x000B1D, 0x000B32, - 0x000B13, 0x00A79B, 0x00A795, 0x000B16, 0x00A794, 0x000B10, 0x000B17, 0x00A60B, - 0x000B1A, 0x00A6E1, 0x000B1B, 0x000B15, 0x01441D, 0x00A3CB, 0x00A8A5, 0x00A88D, - 0x000B23, 0x00A887, 0x000AB5, 0x000B06, 0x000B07, 0x014412, 0x014413, 0x01441E, - 0x000B21, 0x00A3A1, 0x014581, 0x0145B5, 0x000DEB, 0x01441F, 0x014403, 0x01459D, - 0x000B1E, 0x014417, 0x000B1F, 0x014411, 0x00A799, 0x014424, 0x014464, 0x014422, - 0x014420, 0x014421, 0x014425, 0x014428, 0x014426, 0x014468, 0x014427, 0x01442A, - 0x01442B, 0x014429, 0x000B2E, 0x000B0F, 0x014416, 0x014418, 0x01443B, 0x014414, - 0x00A79D, 0x014415, 0x000B08, 0x000B09, 0x01446C, 0x00A7A5, 0x01441C, 0x000B0C, - 0x000B2A, 0x000B2D, 0x000B2B, 0x000B2C, 0x00A2EE, 0x014405, 0x00A2EF, 0x00A3AC, - 0x000B28, 0x014401, 0x014402, 0x014406, 0x014400, 0x00A798, 0x000B1C, 0x00A79A, - 0x01444D, 0x01446A, 0x000B22, 0x000B20, 0x000B2F, 0x000B27, 0x014449, 0x00A6EC, - 0x014404, 0x00A7A4, 0x00A641, 0x014477, 0x000B24, 0x000B25, 0x000B26, 0x00A6EE, - 0x000B71, 0x000B35, 0x014444, 0x00A6EF, 0x00A6D1, 0x00A3A2, 0x000B36, 0x000B37, - 0x000B38, 0x000B39, 0x00A2ED, 0x000B3D, 0x00A2EA, 0x00A2EC, 0x014448, 0x00A2E5, - 0x00A2E4, 0x00A2E8, 0x00A3A0, 0x00A2E9, 0x014438, 0x014439, 0x014434, 0x01443A, - 0x00A2EB, 0x014435, 0x014469, 0x01446B, 0x000BA8, 0x000CB9, 0x0145DB, 0x000AA3, - 0x014465, 0x00A99E, 0x00A817, 0x000A95, 0x00A813, 0x000A9F, 0x01448D, 0x00A811, - 0x014496, 0x014484, 0x000A9D, 0x014485, 0x014489, 0x014510, 0x01448F, 0x000A94, - 0x000BA3, 0x014499, 0x01449F, 0x01448E, 0x01449B, 0x014493, 0x014497, 0x014483, - 0x000BAA, 0x014494, 0x01459A, 0x000A9A, 0x014492, 0x01449C, 0x000BA4, 0x014491, - 0x01448C, 0x014495, 0x01449D, 0x014590, 0x0145B6, 0x000BA9, 0x0144BB, 0x01458F, - 0x0144B6, 0x000BB8, 0x014482, 0x0144B2, 0x000AAA, 0x000BB9, 0x0145A5, 0x000A9E, - 0x000BD0, 0x00A810, 0x00AB9A, 0x000BEE, 0x0144B1, 0x0144B3, 0x000BEF, 0x0144B7, - 0x014481, 0x000BE8, 0x014486, 0x014487, 0x014498, 0x014480, 0x00A86E, 0x000BED, - 0x0144B0, 0x0144B5, 0x00A91E, 0x01449A, 0x0144E0, 0x0145BE, 0x0144E6, 0x00A86F, - 0x00A81A, 0x0144E7, 0x0144E8, 0x0144E9, 0x0144EB, 0x000BEC, 0x00A812, 0x00A844, - 0x0144EA, 0x00A816, 0x000BEA, 0x000BF0, 0x00A84B, 0x000BE6, 0x000BE7, 0x00A869, - 0x00A868, 0x000BEB, 0x0144FE, 0x0144FF, 0x00A863, 0x00A862, 0x0145BF, 0x00A86A, - 0x00A864, 0x00A865, 0x00A860, 0x00A861, 0x0144E3, 0x00A867, 0x0144E5, 0x0144E2, - 0x00A866, 0x0144E4, 0x000BF2, 0x000BF1, 0x00A86C, 0x000BE9, 0x00A86D, 0x0144E1, - 0x0144FC, 0x000C1E, 0x000C1B, 0x000C1C, 0x000C1A, 0x0144F5, 0x0144F3, 0x0144F2, - 0x0144B4, 0x0144F4, 0x0144F8, 0x0144F6, 0x0144F9, 0x00A885, 0x0144BA, 0x0144FA, - 0x000C12, 0x000C13, 0x0144FB, 0x00A884, 0x014501, 0x000C18, 0x000C1F, 0x014502, - 0x000C19, 0x014504, 0x00A889, 0x00A89F, 0x000C1D, 0x00A892, 0x00A893, 0x000C10, - 0x000C16, 0x00A89D, 0x00A899, 0x000C17, 0x014511, 0x00A898, 0x014513, 0x014512, - 0x00A88B, 0x000C07, 0x00A8AD, 0x014516, 0x00A8AC, 0x00A883, 0x01451E, 0x00A882, - 0x01451F, 0x01451C, 0x00A8A1, 0x00A8A8, 0x00A8AE, 0x00A8AF, 0x00A88A, 0x000C15, - 0x014525, 0x00A886, 0x014527, 0x014526, 0x00A891, 0x014528, 0x000C14, 0x01452A, - 0x00A890, 0x000C59, 0x00A896, 0x00A897, 0x00A89C, 0x000C05, 0x000C06, 0x000C09, - 0x000C08, 0x014534, 0x000C0A, 0x000C0B, 0x014539, 0x014538, 0x01453B, 0x01453A, - 0x00A88E, 0x000C34, 0x000C24, 0x000C21, 0x000C0C, 0x00A88F, 0x00A888, 0x00A88C, - 0x000C5A, 0x000C2A, 0x00A8D3, 0x00A8D0, 0x000C0E, 0x00A8D7, 0x00A8F6, 0x000C0F, - 0x00A8D1, 0x00A8D2, 0x000C22, 0x00A8D6, 0x000C36, 0x000C23, 0x000C79, 0x00A8FD, - 0x000C20, 0x000C31, 0x000C30, 0x000C38, 0x00A8B2, 0x00A8A3, 0x00A8A2, 0x000C35, - 0x000C32, 0x000C33, 0x00A8F2, 0x00A8A0, 0x014561, 0x014560, 0x00A8F7, 0x014562, - 0x00A8A6, 0x00A8A7, 0x014567, 0x014566, 0x014569, 0x014568, 0x01456B, 0x01456A, - 0x000C99, 0x00A8B3, 0x000C9D, 0x000C9F, 0x00A8FB, 0x000C37, 0x014573, 0x014572, - 0x014575, 0x014574, 0x014577, 0x014576, 0x014579, 0x00A902, 0x01457B, 0x01457A, - 0x01457D, 0x01457C, 0x00A90B, 0x01457E, 0x00A901, 0x00A903, 0x014583, 0x014582, - 0x00A91C, 0x00A90A, 0x00A911, 0x00A910, 0x00A918, 0x00A907, 0x00A905, 0x00A91F, - 0x00A917, 0x00A916, 0x00A91D, 0x00A909, 0x014591, 0x00A919, 0x014593, 0x014592, - 0x014595, 0x014594, 0x014597, 0x014596, 0x014599, 0x014598, 0x01459B, 0x00A900, - 0x00A906, 0x01459C, 0x01459F, 0x01459E, 0x00A93A, 0x00A923, 0x00A908, 0x00A938, - 0x00A93C, 0x000C9E, 0x00A935, 0x00A933, 0x00A93E, 0x00A932, 0x00A93B, 0x00A934, - 0x00A937, 0x00A90E, 0x00A921, 0x00A93D, 0x00A90F, 0x00A939, 0x00A90C, 0x00A90D, - 0x00A93F, 0x0145B4, 0x000C25, 0x000C28, 0x0145B9, 0x0145B8, 0x0145BB, 0x0145BA, - 0x000C26, 0x0145BC, 0x00A96C, 0x000C27, 0x000C80, 0x014585, 0x00A964, 0x00A965, - 0x00A96E, 0x00A96D, 0x014490, 0x000C3D, 0x0145B7, 0x000C9C, 0x000C98, 0x000C7A, - 0x000CF1, 0x000CED, 0x000C2B, 0x000CF2, 0x000CEC, 0x000C39, 0x000CEE, 0x000CEF, - 0x000CE9, 0x000CE8, 0x00A920, 0x00A960, 0x00A922, 0x00A962, 0x00A961, 0x00A96F, - 0x00A967, 0x00A963, 0x00A966, 0x00A968, 0x00A969, 0x0145E0, 0x0145E3, 0x0145E2, - 0x0145E5, 0x0145E4, 0x0145E7, 0x0145E6, 0x0145E9, 0x0145E8, 0x0145EB, 0x0145EA, - 0x000D10, 0x000D0B, 0x00A979, 0x00A978, 0x00A96A, 0x000D06, 0x000D07, 0x00A97C, - 0x0145F5, 0x0145F4, 0x00A984, 0x000D05, 0x0145F9, 0x0145F8, 0x0145FB, 0x0145FA, - 0x00A985, 0x0145FC, 0x0145FF, 0x00A988, 0x000D17, 0x00A98A, 0x000D30, 0x000D16, - 0x00A98F, 0x000D18, 0x00A991, 0x00A990, 0x00A993, 0x00A992, 0x000D19, 0x000D15, - 0x00A997, 0x00A996, 0x00A999, 0x00A998, 0x000D31, 0x000D0C, 0x000D2F, 0x00A99C, - 0x00A99F, 0x000D09, 0x00A9A1, 0x00A9A0, 0x000D0A, 0x00A9A2, 0x000D37, 0x000D08, - 0x00A9A7, 0x00A9A6, 0x000D1C, 0x000D1D, 0x000D14, 0x000D33, 0x00A9AD, 0x00A9AC, - 0x000D1E, 0x000D1B, 0x000D12, 0x000D13, 0x000D1F, 0x00A9B2, 0x000D1A, 0x000D32, - 0x01463F, 0x014635, 0x014636, 0x014637, 0x014633, 0x01461C, 0x01460C, 0x01460D, - 0x000C7B, 0x000C7C, 0x01460F, 0x000D6B, 0x000C2C, 0x01461D, 0x01461E, 0x01461F, - 0x000D54, 0x000D55, 0x000C58, 0x000D5C, 0x000D5A, 0x00F933, 0x000D5B, 0x000D56, - 0x000D5F, 0x000D5D, 0x000D59, 0x00A9D0, 0x00A9D3, 0x000D58, 0x000D7C, 0x000D5E, - 0x000D61, 0x00A9D6, 0x000D78, 0x000C2F, 0x000D2C, 0x000D2D, 0x000D7D, 0x000D2E, - 0x000D38, 0x000D29, 0x00A9E1, 0x00A9E0, 0x00A9E3, 0x00A9E2, 0x000D28, 0x00A9E4, - 0x00A9E7, 0x000D35, 0x000D36, 0x00A9E8, 0x00A9EB, 0x00A9EA, 0x00A9ED, 0x00A9EC, - 0x00A9EF, 0x00A9EE, 0x01463B, 0x000D3A, 0x000D34, 0x000D39, 0x000C2E, 0x000C2D, - 0x000DB5, 0x000D89, 0x00A9F9, 0x00A9F8, 0x000D8F, 0x000D87, 0x00A9FD, 0x00A9FC, - 0x00F90A, 0x000D88, 0x000DBA, 0x000DBB, 0x000D86, 0x000DB4, 0x000D8B, 0x000D85, - 0x000D91, 0x000D90, 0x000DB6, 0x000D92, 0x000D95, 0x000D94, 0x00A205, 0x000D96, - 0x000D8A, 0x000D8D, 0x000D9B, 0x000D9A, 0x000D9D, 0x000D9C, 0x000D9F, 0x000D9E, - 0x00A201, 0x000DA9, 0x000DB3, 0x000DA2, 0x000DA5, 0x000DA7, 0x000DA3, 0x000DB7, - 0x000DA4, 0x00A21C, 0x00AAA0, 0x000D8E, 0x000D8C, 0x00AAA2, 0x000DA1, 0x000DAB, - 0x000DA0, 0x00AAA7, 0x000DB1, 0x000DA6, 0x00AAAB, 0x000DB0, 0x000DAF, 0x00AAA6, - 0x000DAA, 0x000DB8, 0x00A200, 0x000DB9, 0x000DBD, 0x00AA6E, 0x00AAA4, 0x00AAAE, - 0x00AAAF, 0x01463C, 0x01463E, 0x000C6E, 0x000C6F, 0x00AAAA, 0x00AAAD, 0x014638, - 0x00A207, 0x014634, 0x014627, 0x00AA69, 0x014621, 0x014639, 0x01463A, 0x014620, - 0x01463D, 0x01462D, 0x00F9E3, 0x00F90C, 0x00ABE1, 0x00AADB, 0x00F90F, 0x00ABE0, - 0x00AA56, 0x00AA6F, 0x00AA6C, 0x00AA6D, 0x00F90D, 0x00AA68, 0x00AA55, 0x00F93D, - 0x000C68, 0x00AA54, 0x000DEC, 0x000C66, 0x00F93E, 0x000C67, 0x000DE7, 0x000DE6, - 0x000DA8, 0x000DE8, 0x000DEF, 0x000DEA, 0x000DED, 0x000DE9, 0x000DAE, 0x000DEE, - 0x000C78, 0x00AA65, 0x00AAA8, 0x00AAA9, 0x00ABE2, 0x000C7D, 0x014622, 0x014623, - 0x00AA64, 0x00AA6B, 0x00ABF0, 0x00AA6A, 0x00F9FD, 0x00F9FC, 0x000C7E, 0x00F935, - 0x00AAAC, 0x00F9FE, 0x00A204, 0x00F936, 0x00ABF2, 0x00ABF9, 0x00F93F, 0x00ABF8, - 0x00A206, 0x00ABF7, 0x00A20E, 0x000E10, 0x00A20F, 0x00A23A, 0x00AABA, 0x00AABB, - 0x014626, 0x000E13, 0x00A208, 0x00A209, 0x00A20A, 0x000E11, 0x00AAB5, 0x00A20D, - 0x000E12, 0x0006A0, 0x00A230, 0x00A221, 0x0006BC, 0x0006BD, 0x0006BE, 0x0006AF, - 0x00A236, 0x00A237, 0x0006A3, 0x0006A1, 0x00A20C, 0x0006D2, 0x000E1A, 0x000E1B, - 0x0006A2, 0x00063B, 0x00AA84, 0x00AA85, 0x0006BA, 0x000E16, 0x00AABC, 0x00AABD, - 0x0006B0, 0x00AA8A, 0x0006B8, 0x0006BF, 0x00F9EF, 0x000E15, 0x0006B6, 0x0006B7, - 0x0006B5, 0x00AA8B, 0x0006B4, 0x0006BB, 0x0006D3, 0x0006B9, 0x00A235, 0x000E17, - 0x00AAA5, 0x00A233, 0x00A232, 0x00A23B, 0x00AAB9, 0x00AAA3, 0x0006AC, 0x00A231, - 0x00A234, 0x000E14, 0x0006C1, 0x00A254, 0x0006C7, 0x00ABF6, 0x0006C0, 0x00A255, - 0x00ABA6, 0x00F9F6, 0x00F9F5, 0x0006C3, 0x00A225, 0x0006C5, 0x00A226, 0x0006C2, - 0x000638, 0x00A25F, 0x00A25B, 0x00A241, 0x00A259, 0x00A224, 0x00A25A, 0x0006CF, - 0x0006A8, 0x0006A5, 0x00ABD2, 0x00F9C8, 0x0006A6, 0x0006AB, 0x00F908, 0x0006A7, - 0x0006AE, 0x0006A9, 0x00F9F4, 0x00F9FF, 0x0006A4, 0x00A223, 0x000639, 0x0006C6, - 0x00A220, 0x0006C4, 0x00A23C, 0x0006CE, 0x00A222, 0x00A25E, 0x00063A, 0x00ABA1, - 0x0006AD, 0x00F9CC, 0x00ABA0, 0x00A258, 0x00A227, 0x00A23D, 0x0006AA, 0x00ABA7, - 0x00A23E, 0x000647, 0x00F9FA, 0x00A239, 0x00A238, 0x00A23F, 0x00AAA1, 0x00A240, - 0x00ABCD, 0x00068A, 0x000646, 0x000645, 0x00AB03, 0x00AB02, 0x00AB06, 0x00062E, - 0x00F943, 0x000672, 0x00A248, 0x00A249, 0x00A24E, 0x000644, 0x00A24C, 0x00A24D, - 0x00068F, 0x00A24F, 0x000649, 0x000671, 0x000648, 0x00067A, 0x00067B, 0x000675, - 0x000620, 0x000621, 0x000622, 0x00062F, 0x000625, 0x00062B, 0x000626, 0x000627, - 0x00F958, 0x000629, 0x000628, 0x00A261, 0x00A260, 0x00F95F, 0x00062D, 0x000624, - 0x00062A, 0x000673, 0x00A22A, 0x00A22B, 0x00068D, 0x00063D, 0x00063C, 0x00062C, - 0x00063E, 0x00A22F, 0x0006B3, 0x00A271, 0x00A272, 0x00A273, 0x00068E, 0x00063F, - 0x00A276, 0x000EC2, 0x000EC3, 0x00F9C6, 0x000EDC, 0x00AB89, 0x000641, 0x000643, - 0x000642, 0x00064A, 0x00A245, 0x00ABA2, 0x00A242, 0x00A243, 0x0006B2, 0x00F9C2, - 0x00F9AB, 0x00F9F0, 0x00F9C1, 0x00A25C, 0x00A247, 0x00F9A4, 0x00A25D, 0x00ABB9, - 0x00ABB8, 0x00F9F9, 0x00ABBF, 0x00ABB7, 0x00F9FB, 0x00F9DE, 0x00F9DD, 0x00F981, - 0x00F980, 0x00F9A6, 0x00F9A5, 0x00F9D4, 0x00F9D5, 0x00F9D8, 0x00F9C5, 0x00F9C0, - 0x00F9D9, 0x00F9DA, 0x00F9C3, 0x00F9CF, 0x00F9C7, 0x00F9C4, 0x00F9DF, 0x00F9A2, - 0x00A246, 0x00F9AF, 0x00F9A1, 0x00ABCC, 0x00068C, 0x00A244, 0x00F9AE, 0x00F9A7, - 0x00F9A8, 0x00ABB3, 0x00F9A3, 0x00F909, 0x00F9AC, 0x00F9CB, 0x00ABBD, 0x00F9BC, - 0x00F9F1, 0x00F9AD, 0x00F9AA, 0x00F9F2, 0x00F9BD, 0x00F9BE, 0x00F9A9, 0x00A24A, - 0x00F9B8, 0x00A24B, 0x00A805, 0x00A995, 0x0145EC, 0x00F9BF, 0x00F9F7, 0x0145EF, - 0x0145ED, 0x000CB0, 0x01458E, 0x00AB96, 0x00A99B, 0x000F31, 0x000F32, 0x000F33, - 0x00A99A, 0x00AB90, 0x000F23, 0x00F9D3, 0x00AB93, 0x000F30, 0x000F20, 0x000F21, - 0x00AB97, 0x0144C9, 0x00AB91, 0x0144CA, 0x000F27, 0x000C87, 0x000C85, 0x0144CE, - 0x000C8B, 0x00AB92, 0x00A801, 0x0144CF, 0x000C86, 0x00A858, 0x000C8F, 0x0144C8, - 0x00A85E, 0x000F29, 0x000F2A, 0x000F2B, 0x0144FD, 0x00A80A, 0x000CB3, 0x00A81C, - 0x00ABAC, 0x000C89, 0x00F9E9, 0x000C8A, 0x00A818, 0x00A803, 0x00A85B, 0x00F9E8, - 0x000F53, 0x00AB99, 0x0144CC, 0x000CB7, 0x000664, 0x00A819, 0x00A81F, 0x00F9D6, - 0x00A81D, 0x000CB6, 0x0144DE, 0x00A800, 0x00AB82, 0x00A871, 0x00066E, 0x000C8E, - 0x00AB84, 0x00AB85, 0x00ABBE, 0x00ABBB, 0x00A854, 0x00ABD3, 0x00A856, 0x00AB83, - 0x00F993, 0x00ABBC, 0x00AB8A, 0x00AB81, 0x00AB80, 0x00AB8B, 0x00F991, 0x00AB8F, - 0x000662, 0x000661, 0x00AB98, 0x000663, 0x00AB88, 0x000660, 0x00AB9C, 0x00AB9D, - 0x00AB86, 0x00AB9F, 0x000669, 0x00ABB2, 0x000668, 0x000665, 0x000667, 0x00066F, - 0x00067D, 0x000674, 0x000F2F, 0x00067C, 0x000676, 0x00AB8E, 0x00ABF3, 0x000677, - 0x000678, 0x000679, 0x00067E, 0x000666, 0x00ABBA, 0x00ABB5, 0x00ABB4, 0x00067F, - 0x000F5A, 0x00A808, 0x00A85A, 0x00A855, 0x00F997, 0x0144C4, 0x0144CB, 0x00A809, - 0x000F89, 0x000F88, 0x000E18, 0x00F98E, 0x00FBAF, 0x00F992, 0x000F8C, 0x000E04, - 0x00FBD5, 0x0144CD, 0x000E06, 0x00FBD6, 0x000E24, 0x000E07, 0x000F56, 0x000F57, - 0x00FBAC, 0x00FBE2, 0x00FBFB, 0x00A859, 0x00FBAD, 0x000E1C, 0x000E2C, 0x00FBDB, - 0x00FBE3, 0x00FBD3, 0x00FB72, 0x00FBE0, 0x00FB49, 0x000E05, 0x00FB70, 0x000F2C, - 0x00FB5C, 0x000F28, 0x00A842, 0x00A841, 0x0006EE, 0x000F2D, 0x000F2E, 0x0006EF, - 0x0006F4, 0x00FBDA, 0x00F99B, 0x000E0B, 0x00FBA8, 0x0006F5, 0x0006F6, 0x0006F7, - 0x0006F8, 0x0006F9, 0x0006FA, 0x0006FB, 0x0006FC, 0x00F995, 0x00A85F, 0x0006FF, - 0x0006CD, 0x000F50, 0x000F52, 0x00FBD4, 0x00F9D7, 0x0006F1, 0x00A85D, 0x0006F0, - 0x0006C8, 0x0006C9, 0x000F5B, 0x00FBAE, 0x000F55, 0x000E1F, 0x00F990, 0x000F54, - 0x000F51, 0x000F41, 0x0006D0, 0x0006D1, 0x000E19, 0x0006D5, 0x0011CD, 0x00FB90, - 0x000EC0, 0x000EC1, 0x0006CB, 0x0011C9, 0x0011CF, 0x0006F2, 0x00FB97, 0x0006CA, - 0x000CE0, 0x000CE1, 0x000EC4, 0x000C61, 0x000C60, 0x000E51, 0x000CE6, 0x000CE7, - 0x000C6A, 0x000C6B, 0x000CEA, 0x000CEB, 0x0006CC, 0x000C69, 0x000C6C, 0x000C6D, - 0x00F923, 0x000E40, 0x0011FF, 0x0011F9, 0x0011F4, 0x00FB17, 0x0006F3, 0x00FB14, - 0x000E1D, 0x000E45, 0x0011FA, 0x000E53, 0x0011FE, 0x0011FB, 0x000E1E, 0x00F9B0, - 0x00FAC7, 0x00F930, 0x00F937, 0x00FD82, 0x00F9B5, 0x00F9B6, 0x00F9B7, 0x00F93A, - 0x00F9B9, 0x00F9BA, 0x00F939, 0x00F938, 0x00FB9B, 0x00F93C, 0x0011F2, 0x00FB60, - 0x0011C8, 0x00FB64, 0x00FB68, 0x00FAA1, 0x00FB65, 0x00FB66, 0x0011C2, 0x00FB48, - 0x00FB6A, 0x00FB69, 0x00FB6B, 0x00FB4C, 0x00FB4D, 0x00FB4E, 0x00FB4F, 0x00FB6C, - 0x0011A4, 0x0011AE, 0x0011A2, 0x00FB6E, 0x0011A8, 0x0011A5, 0x0011A6, 0x0011A7, - 0x00FB6F, 0x0011A9, 0x0011AA, 0x0011AB, 0x0011AC, 0x0011AF, 0x00FB6D, 0x001114, - 0x0011DC, 0x00FD97, 0x00FB63, 0x00FB7C, 0x00FA5D, 0x0011AD, 0x00108E, 0x00FB61, - 0x0011B8, 0x0011B9, 0x00FB62, 0x00FDB1, 0x001116, 0x0011BD, 0x0011BE, 0x0011BF, - 0x00FB71, 0x00FB7D, 0x00FB7F, 0x00FB74, 0x00FB75, 0x00FB76, 0x0011C3, 0x00FB78, - 0x00FB79, 0x00FB7A, 0x00A5E0, 0x00FB7E, 0x00A840, 0x00A84F, 0x00FB7B, 0x00A843, - 0x00A846, 0x00A845, 0x00A849, 0x00A5C9, 0x00A5C8, 0x00A5CE, 0x00A848, 0x00A847, - 0x00A84E, 0x00A84A, 0x0011D3, 0x0011D2, 0x00A84C, 0x00A873, 0x00A872, 0x00A84D, - 0x0014B2, 0x0011DD, 0x00A85C, 0x00A870, 0x0014B3, 0x0011DF, 0x00FA92, 0x00FA82, - 0x00A5FE, 0x0011F3, 0x00A5E3, 0x00A5E1, 0x0011DE, 0x00148C, 0x0011D8, 0x00A5F8, - 0x00A5E2, 0x0011D1, 0x0011D9, 0x0011D5, 0x0011D4, 0x00A86B, 0x0011D6, 0x0011D7, - 0x0011DB, 0x0011DA, 0x00A5F9, 0x00A5F1, 0x00A5F2, 0x00A5F3, 0x00A5F0, 0x00A5F5, - 0x00A5F4, 0x00A5FF, 0x0011A3, 0x00A5F6, 0x00A5F7, 0x00A5FB, 0x0011A1, 0x00FB22, - 0x00118D, 0x00A5FA, 0x00AB21, 0x00A5A0, 0x00A986, 0x00A98E, 0x00A9A5, 0x00A987, - 0x00A989, 0x00A5C5, 0x00AB38, 0x00AB25, 0x00FA91, 0x00A98B, 0x00FA9F, 0x00AB0D, - 0x00AB0C, 0x00A5DE, 0x00A5C3, 0x00A5DF, 0x00AB36, 0x00AB37, 0x00A5D8, 0x00AB39, - 0x00A5C2, 0x00AB3F, 0x00A99D, 0x00AB3A, 0x00AB3D, 0x00A9B0, 0x0011BA, 0x00AB34, - 0x00AB3E, 0x00A5D9, 0x00A5A2, 0x00A5CB, 0x00AB33, 0x00A5A3, 0x00A5A7, 0x00A5CF, - 0x00A5BC, 0x00A5C4, 0x00A5CD, 0x00A9A3, 0x00AB31, 0x00A5CC, 0x00A98D, 0x00A5A1, - 0x00AB30, 0x00A9B1, 0x00AB35, 0x00A5B1, 0x00AB32, 0x00A5BD, 0x00A5B4, 0x00A5BE, - 0x00A5B0, 0x00AB3B, 0x00A5B8, 0x00A5B9, 0x00A5BA, 0x00A5BB, 0x00A5B6, 0x00A5A6, - 0x00A5BF, 0x00A5B7, 0x00A9A8, 0x0011C0, 0x00FA81, 0x00AB52, 0x00FA93, 0x00FB40, - 0x00AB51, 0x00FB44, 0x00A98C, 0x00FBA4, 0x00FA87, 0x00AB50, 0x00FB46, 0x00FB4A, - 0x00FB5D, 0x00FB67, 0x00FB93, 0x00A5D5, 0x00FB73, 0x00FBA6, 0x00FAA5, 0x00FAAB, - 0x00FB5E, 0x00FB91, 0x00FB92, 0x00AB53, 0x00FBA9, 0x00FBAA, 0x00A5DB, 0x00A9D1, - 0x00A5D4, 0x00A5DC, 0x00A9AA, 0x00FA97, 0x00A9A4, 0x00FBA5, 0x00FB77, 0x00FBA2, - 0x00FB21, 0x00FB20, 0x0011F0, 0x00FBA0, 0x00FB25, 0x00FB26, 0x00FB27, 0x00FB2A, - 0x00FB28, 0x00A9AB, 0x00FBA1, 0x00FB24, 0x00FB2F, 0x00FB2B, 0x00AA59, 0x0144EE, - 0x001180, 0x001183, 0x001182, 0x00FB2C, 0x001181, 0x00119D, 0x0011B2, 0x00A9A9, - 0x001185, 0x00AB57, 0x001187, 0x00FBA7, 0x00FB2D, 0x00FB2E, 0x00119E, 0x00119F, - 0x001190, 0x001194, 0x001192, 0x001191, 0x00FB4B, 0x00FB47, 0x001196, 0x001197, - 0x001199, 0x00119B, 0x001198, 0x00118C, 0x00119C, 0x001195, 0x00A994, 0x00FB52, - 0x00FB51, 0x00118B, 0x00FB53, 0x00FB43, 0x00FB50, 0x00148D, 0x00FB57, 0x001186, - 0x00FB54, 0x00A58D, 0x00FB56, 0x00AB22, 0x00AB28, 0x001184, 0x00AB24, 0x001188, - 0x00AB26, 0x0011B0, 0x00AB20, 0x00AB2B, 0x00AB2A, 0x00AB29, 0x00AB2C, 0x00AB2D, - 0x00AB2E, 0x00FB58, 0x0011B4, 0x001189, 0x00FB59, 0x0011D0, 0x00118A, 0x00FB5A, - 0x00118F, 0x00FB5B, 0x0011BC, 0x00FB55, 0x00FB41, 0x00FBAB, 0x001130, 0x00FB5F, - 0x0011A0, 0x00AB3C, 0x00A58C, 0x00AA40, 0x00AA41, 0x00AA42, 0x00AA4B, 0x00AA45, - 0x00F911, 0x00FB82, 0x00F917, 0x00F910, 0x00FB88, 0x00FB8E, 0x00AA44, 0x00F952, - 0x00FB81, 0x00AA47, 0x00118E, 0x00F916, 0x00A5B2, 0x00FB8F, 0x00FB80, 0x00FB85, - 0x00FB86, 0x00FB87, 0x00AA58, 0x00FB9C, 0x00FB95, 0x00F912, 0x00F913, 0x00AA48, - 0x00AA49, 0x00AA4A, 0x00AA66, 0x00FB9D, 0x00FB9E, 0x00FB9F, 0x00A5B3, 0x00F928, - 0x00AA74, 0x0011B1, 0x00FBB1, 0x0011B5, 0x00FBA3, 0x00F92E, 0x0011B7, 0x001112, - 0x00F941, 0x0011BB, 0x00F92F, 0x00F91A, 0x00F919, 0x00AA72, 0x00F91B, 0x00F942, - 0x00F946, 0x00F940, 0x00F951, 0x00AA71, 0x00F94B, 0x00F947, 0x00F915, 0x00FAD7, - 0x00AA73, 0x001193, 0x00AB01, 0x00F918, 0x00AB23, 0x00F914, 0x00AB16, 0x00FC41, - 0x00F953, 0x00FC43, 0x00FC42, 0x00F91D, 0x00FC44, 0x00FC47, 0x00F91C, 0x00FC49, - 0x00FC48, 0x00FC4B, 0x00FC4A, 0x00FC4D, 0x00FC4C, 0x00FC4F, 0x00F91F, 0x00F900, - 0x00AB12, 0x00F902, 0x00F903, 0x00AB11, 0x00F901, 0x00AB13, 0x00F907, 0x00F906, - 0x00F978, 0x00F90E, 0x00A628, 0x00A629, 0x00FC5C, 0x00F91E, 0x00F95E, 0x00FC61, - 0x00FC60, 0x00FC63, 0x00FC62, 0x00FC65, 0x00FC64, 0x00FC67, 0x00A62B, 0x00FC69, - 0x00FC68, 0x00FC6B, 0x00FC6A, 0x00FC6D, 0x00FC6C, 0x00FC6F, 0x00FC6E, 0x00FC71, - 0x00FC70, 0x00FC73, 0x00FC72, 0x00FC75, 0x00FC74, 0x00FC77, 0x00FC76, 0x00FC79, - 0x00FC78, 0x00FC7B, 0x00FC7A, 0x00FC7D, 0x00FC7C, 0x00FC7F, 0x00FC7E, 0x00A912, - 0x00A640, 0x00A64F, 0x00A914, 0x00A91B, 0x00A65E, 0x00A643, 0x00A915, 0x00A65C, - 0x00A65A, 0x00AB15, 0x00A658, 0x00A65F, 0x00A651, 0x00A652, 0x00A65D, 0x00A650, - 0x00A655, 0x00A657, 0x00A659, 0x00A64B, 0x00A642, 0x00A65B, 0x00A64A, 0x00A654, - 0x00A656, 0x00A645, 0x00A644, 0x00A664, 0x00A64E, 0x00A64C, 0x00A66B, 0x00A64D, - 0x00A646, 0x00A647, 0x00F905, 0x00F904, 0x00A649, 0x00ABCE, 0x00AB04, 0x00A648, - 0x00ABC8, 0x00ABCF, 0x00AB0E, 0x00A930, 0x00ABF4, 0x00F90B, 0x00ABF5, 0x00A895, - 0x00AB14, 0x00AB05, 0x00F932, 0x00AB0B, 0x00A91A, 0x00AB0A, 0x00F931, 0x00A940, - 0x00AB09, 0x00A973, 0x00FB96, 0x00ABC1, 0x00120D, 0x00120C, 0x00ABA4, 0x00ABA5, - 0x00F9E1, 0x00F9E2, 0x00F9EE, 0x00F9ED, 0x00ABAE, 0x00F9CD, 0x00AB8C, 0x00AB8D, - 0x00F9C9, 0x00F9CA, 0x00ABC4, 0x00F9CE, 0x00ABC2, 0x014419, 0x00F9EB, 0x00ABC5, - 0x00ABC6, 0x00ABC9, 0x01443F, 0x00ABC0, 0x00ABCA, 0x00ABCB, 0x00ABC7, 0x00ABAD, - 0x00AB9E, 0x00F9EA, 0x00F9DB, 0x00ABAA, 0x00F9EC, 0x00AA46, 0x00ABA8, 0x00ABF1, - 0x00ABA3, 0x001230, 0x001233, 0x014407, 0x001235, 0x001234, 0x001237, 0x001236, - 0x00F9E5, 0x001238, 0x00123B, 0x00F9E7, 0x00123D, 0x00ABB1, 0x00123F, 0x00123E, - 0x001241, 0x001240, 0x001243, 0x001242, 0x001245, 0x00ABB0, 0x001247, 0x001246, - 0x00ABB6, 0x00A89E, 0x00F9F3, 0x00124A, 0x00F9F8, 0x00ABD9, 0x00ABD4, 0x00F982, - 0x00F985, 0x00F987, 0x00F983, 0x00A9D9, 0x00A9D8, 0x00A943, 0x00F986, 0x00F984, - 0x00ABDA, 0x00ABDB, 0x00F98B, 0x00ABD5, 0x00ABD6, 0x00125C, 0x00A9D4, 0x00A9D5, - 0x001261, 0x00F98A, 0x001263, 0x001262, 0x001265, 0x00F99C, 0x00F989, 0x001266, - 0x001269, 0x00A945, 0x00126B, 0x00126A, 0x00F999, 0x00F998, 0x00F99D, 0x00F9A0, - 0x00ABD7, 0x00ABC3, 0x00ABDC, 0x00F98D, 0x00ABDE, 0x00ABDD, 0x00A9E9, 0x00F988, - 0x00F98F, 0x00A9FE, 0x00A9F2, 0x00A9F1, 0x00A9F3, 0x00127C, 0x00A9F6, 0x00ABDF, - 0x00A9F0, 0x00A9F7, 0x00A942, 0x00ABD0, 0x00ABD8, 0x00A9FB, 0x00ABD1, 0x00A9F5, - 0x00A9FA, 0x00A9F4, 0x00ABAB, 0x00ABA9, 0x00128D, 0x00128C, 0x00AB95, 0x00A9AE, - 0x00ABAF, 0x00A833, 0x00F9D2, 0x00A913, 0x00A9AF, 0x00F9D0, 0x00AB94, 0x00AB9B, - 0x00F9D1, 0x00F9DC, 0x00F9E0, 0x00AB87, 0x00F9E4, 0x00F9E6, 0x01E816, 0x01E815, - 0x0012A1, 0x0012A0, 0x0012A3, 0x0012A2, 0x0012A5, 0x0012A4, 0x0012A7, 0x0012A6, - 0x0012A9, 0x0012A8, 0x0012AB, 0x0012AA, 0x0012AD, 0x0012AC, 0x0012AF, 0x0012AE, - 0x01E811, 0x0012B0, 0x0012B3, 0x0012B2, 0x0012B5, 0x0012B4, 0x01E812, 0x01E810, - 0x0012B9, 0x0012B8, 0x0012BB, 0x0012BA, 0x0012BD, 0x0012BC, 0x01E81D, 0x0012BE, - 0x01E81F, 0x0012C0, 0x0012C3, 0x0012C2, 0x0012C5, 0x0012C4, 0x01E819, 0x01E818, - 0x0012C9, 0x01E81A, 0x0012CB, 0x0012CA, 0x0012CD, 0x0012CC, 0x01E814, 0x0012CE, - 0x0012D1, 0x0012D0, 0x0012D3, 0x0012D2, 0x0012D5, 0x0012D4, 0x01E81B, 0x0012D6, - 0x0012D9, 0x0012D8, 0x0012DB, 0x0012DA, 0x0012DD, 0x0012DC, 0x0012DF, 0x0012DE, - 0x01E82D, 0x01E803, 0x0012E3, 0x0012E2, 0x01E802, 0x01E800, 0x01E828, 0x01E801, - 0x01E82E, 0x01E82F, 0x01E804, 0x01E805, 0x01E806, 0x01E809, 0x01E80A, 0x01E80B, - 0x0012F1, 0x0012F0, 0x0012F3, 0x0012F2, 0x01E808, 0x01E80F, 0x0012F7, 0x0012F6, - 0x01E81E, 0x01E81C, 0x0012FB, 0x0012FA, 0x0012FD, 0x0012FC, 0x01E82A, 0x01E821, - 0x01E822, 0x01E851, 0x01E850, 0x01E833, 0x01E826, 0x01E827, 0x01E854, 0x01E82B, - 0x01E820, 0x01E823, 0x01E80C, 0x01E80D, 0x01E80E, 0x01E825, 0x01E841, 0x01E83D, - 0x01E83C, 0x01E85B, 0x01E853, 0x01E843, 0x01E835, 0x01E836, 0x01E839, 0x01E83A, - 0x01E852, 0x01E829, 0x01E838, 0x01E83E, 0x01E83F, 0x01E824, 0x01E860, 0x01E861, - 0x01E883, 0x00A931, 0x01E863, 0x01E865, 0x01E866, 0x00A9D7, 0x00A904, 0x00A9D2, - 0x01E84C, 0x00A941, 0x00A936, 0x01E84D, 0x00A946, 0x00F996, 0x01E891, 0x01E874, - 0x01E893, 0x01E892, 0x01E895, 0x01E894, 0x01E876, 0x01E896, 0x01E899, 0x01E87A, - 0x01E89B, 0x01E89A, 0x01E89D, 0x01E89C, 0x00A925, 0x01E89E, 0x01E8A1, 0x01E8A0, - 0x01E872, 0x01E8A2, 0x01E8A5, 0x01E8A4, 0x01E8A7, 0x01E8A6, 0x00A924, 0x01E8A8, - 0x01E8AB, 0x01E87B, 0x00F99A, 0x01E82C, 0x00F99F, 0x00F99E, 0x00F994, 0x00FE80, - 0x01E870, 0x01E877, 0x00FEB9, 0x00FEB8, 0x00FE8F, 0x00FE86, 0x00FE87, 0x00FE88, - 0x00FE89, 0x00FE8A, 0x00FE8B, 0x00FEBB, 0x00FE8D, 0x00FE8E, 0x01E8C1, 0x01E8C0, - 0x01E842, 0x01E8C2, 0x01E840, 0x01E8C4, 0x01E8C7, 0x01E847, 0x01E8C9, 0x01E8C8, - 0x01E8CB, 0x01E84B, 0x01E845, 0x00FE9D, 0x01E8CF, 0x01E846, 0x00FEB5, 0x01E849, - 0x01E867, 0x00FEBA, 0x01E85E, 0x01E855, 0x01E856, 0x01E857, 0x01E858, 0x01E859, - 0x01E85A, 0x00FE79, 0x01E85C, 0x01E85D, 0x01E84E, 0x01E85F, 0x00FEBF, 0x00FEB0, - 0x00FED1, 0x00FED2, 0x00FEB3, 0x00FEB4, 0x00FEB1, 0x00FED6, 0x00FED7, 0x00FEA2, - 0x00FEBC, 0x01E871, 0x00148E, 0x00FE78, 0x01E844, 0x00FEB7, 0x00FEB6, 0x00FEA5, - 0x01E848, 0x01E84F, 0x00FE72, 0x00FE70, 0x01E873, 0x00FE77, 0x00FEA7, 0x00FEAB, - 0x00FE7B, 0x00FE7A, 0x00FEAC, 0x01E84A, 0x00FE74, 0x00FE76, 0x01E901, 0x01E900, - 0x01E903, 0x01E902, 0x01E905, 0x01E904, 0x01E907, 0x01E906, 0x01E909, 0x01E908, - 0x01E90B, 0x01E90A, 0x01E90D, 0x01E90C, 0x01E90F, 0x01E90E, 0x01E911, 0x01E910, - 0x01E913, 0x01E912, 0x00FEA1, 0x00FEA0, 0x00FED0, 0x01E916, 0x01E919, 0x01E918, - 0x01E91B, 0x01E91A, 0x00FE71, 0x01E91C, 0x01E91F, 0x01E91E, 0x01E921, 0x01E920, - 0x01E923, 0x01E922, 0x00FEA3, 0x00FEA4, 0x00FE73, 0x01E926, 0x01E929, 0x01E928, - 0x01E92B, 0x01E92A, 0x00FEBD, 0x01E92C, 0x01E92F, 0x00FEBE, 0x01E931, 0x01E930, - 0x01E933, 0x01E932, 0x00FEB2, 0x01E934, 0x01E937, 0x01E936, 0x01E939, 0x01E938, - 0x01E93B, 0x01E93A, 0x01E93D, 0x01E93C, 0x01E93F, 0x01E93E, 0x01E941, 0x01E940, - 0x01E943, 0x01E942, 0x00FA90, 0x01E864, 0x00FA83, 0x00FAA2, 0x01E86E, 0x00FA80, - 0x01E868, 0x01E869, 0x00FAA0, 0x01E86D, 0x01E86C, 0x00FA95, 0x01E951, 0x01E950, - 0x01E953, 0x01E952, 0x01E955, 0x01E954, 0x01E957, 0x01E956, 0x01E959, 0x01E958, - 0x00FA9B, 0x00FC46, 0x00FE83, 0x00FE84, 0x00148F, 0x00FA86, 0x00FAA7, 0x00FE82, - 0x001504, 0x001505, 0x01E87C, 0x00FA8F, 0x00FE81, 0x01E862, 0x00151E, 0x01E87D, - 0x00FE85, 0x00FE8C, 0x00FE9C, 0x00151F, 0x01E86A, 0x01E86B, 0x00FA99, 0x01E878, - 0x001509, 0x001518, 0x01E875, 0x00151A, 0x01E86F, 0x01E87E, 0x001517, 0x00FE9A, - 0x001519, 0x00151C, 0x01E879, 0x00FA85, 0x01E87F, 0x00FE95, 0x00151B, 0x00FE90, - 0x00FE9B, 0x00FE92, 0x00FE93, 0x0014AE, 0x0014AF, 0x00FE94, 0x00FE97, 0x001506, - 0x00150A, 0x00150B, 0x00FE91, 0x00FE96, 0x00150E, 0x0014A8, 0x001508, 0x00150F, - 0x001488, 0x001461, 0x0011CB, 0x00FAB3, 0x001117, 0x0011C5, 0x00FAD1, 0x0011E0, - 0x00FAC3, 0x00FAD2, 0x00FAD3, 0x00FE7C, 0x00147C, 0x0014AD, 0x00146C, 0x00FE7D, - 0x00FE9E, 0x001440, 0x001443, 0x001442, 0x00FE7E, 0x001441, 0x001447, 0x001444, - 0x00FE99, 0x00FE7F, 0x00FE9F, 0x00FE98, 0x00144A, 0x001445, 0x001446, 0x00144B, - 0x001470, 0x001479, 0x001478, 0x00147D, 0x001462, 0x00144D, 0x00144E, 0x00147F, - 0x001449, 0x00FF4D, 0x00FF4F, 0x00FF4C, 0x001448, 0x00145C, 0x00144F, 0x00FF11, - 0x00FF10, 0x00FF13, 0x00FF12, 0x00FF15, 0x00FF14, 0x00FF17, 0x00FF16, 0x00FF19, - 0x00147E, 0x001463, 0x00147A, 0x00147B, 0x00FF7D, 0x00FF7E, 0x00FF7F, 0x00FF78, - 0x00FF7B, 0x00FF6E, 0x00FF6D, 0x00FF6C, 0x00FF66, 0x00FF67, 0x00FF79, 0x00FF6B, - 0x00FF68, 0x00FF7C, 0x00FF6A, 0x00FF6F, 0x00FF69, 0x00FF74, 0x001474, 0x00FF31, - 0x00FF30, 0x00FF33, 0x00FF32, 0x00FF35, 0x00FF34, 0x00FF71, 0x00FF73, 0x00FF39, - 0x00FF38, 0x00FF72, 0x00FF3A, 0x00FF7A, 0x00FF75, 0x00FF76, 0x00FF77, 0x0011C7, - 0x00FF42, 0x0014A0, 0x0014A3, 0x00F96C, 0x00F975, 0x0014A1, 0x0014A4, 0x00FF41, - 0x00FF43, 0x00F94A, 0x00F949, 0x0014AB, 0x0014A5, 0x00F962, 0x00F94F, 0x0014A7, - 0x00FF47, 0x00FF46, 0x00F94D, 0x00F977, 0x00F94E, 0x0011CE, 0x00F973, 0x00F971, - 0x00F948, 0x00F976, 0x00F97B, 0x00F974, 0x00F97A, 0x0011F5, 0x00F97E, 0x00FAB7, - 0x00FF45, 0x00F968, 0x00FA9A, 0x00FA94, 0x0145A8, 0x00FB83, 0x00FF44, 0x00F94C, - 0x0014A2, 0x0145A4, 0x0014BC, 0x0145AE, 0x0145AB, 0x0145A9, 0x0145A2, 0x0145A3, - 0x0145AF, 0x0145AD, 0x00FF4E, 0x0145AA, 0x00FF48, 0x00F96D, 0x00F972, 0x00FF49, - 0x00F96E, 0x00FF4B, 0x00FF4A, 0x00F970, 0x0145AC, 0x00F96F, 0x0145BD, 0x00FF81, - 0x00FF80, 0x00FF83, 0x00FF82, 0x00FF85, 0x00FAA6, 0x00FF87, 0x00FF86, 0x00FF89, - 0x0145D0, 0x0145DF, 0x00FF8A, 0x0145D6, 0x00FF8C, 0x0145C1, 0x0145DC, 0x00FF91, - 0x0145D4, 0x00FF93, 0x00FF92, 0x0145DD, 0x00FF94, 0x00FF97, 0x0145D3, 0x00FF99, - 0x00FF98, 0x00FF9B, 0x00FF9A, 0x00FF9D, 0x00FF9C, 0x0014A9, 0x0145D2, 0x00FEA9, - 0x0145DA, 0x0145D5, 0x0145D7, 0x0145D1, 0x0145C3, 0x00FEAF, 0x00FEA6, 0x0014F4, - 0x00FEA8, 0x0014AA, 0x0014FB, 0x0145C2, 0x01E813, 0x0145C6, 0x00FEAA, 0x00FFB1, - 0x0145C0, 0x00FFB3, 0x00FFB2, 0x0145C7, 0x00FEAD, 0x00FA22, 0x0145FD, 0x001093, - 0x00FA21, 0x00FEAE, 0x001092, 0x001081, 0x0145D8, 0x0145D9, 0x0145DE, 0x0145FE, - 0x00FED8, 0x00FFC3, 0x00FFC2, 0x00FFC5, 0x00FFC4, 0x00FFC7, 0x00FFC6, 0x0010B1, - 0x001110, 0x00FFCB, 0x00FFCA, 0x00FFCD, 0x00FFCC, 0x00FFCF, 0x00FFCE, 0x00FED4, - 0x00FA41, 0x00FA42, 0x0010B2, 0x0010B3, 0x00111C, 0x00FED3, 0x00110C, 0x001113, - 0x0015EE, 0x00FA50, 0x001111, 0x00FA84, 0x00FFDC, 0x00FA96, 0x00FEDB, 0x0015EF, - 0x00F961, 0x00F960, 0x00F963, 0x00F966, 0x001102, 0x00FA40, 0x00F967, 0x001489, - 0x00F969, 0x00F96A, 0x00F96B, 0x001103, 0x0015EC, 0x00148A, 0x00F965, 0x00FA20, - 0x001090, 0x001091, 0x00148B, 0x00FED5, 0x00F97D, 0x00FA9D, 0x00FA27, 0x00FEDA, - 0x00FEDF, 0x00F979, 0x00FED9, 0x00F97F, 0x0015E6, 0x00FEDE, 0x00FEDD, 0x0015CE, - 0x0015EA, 0x010003, 0x010034, 0x0015E4, 0x010007, 0x0015E9, 0x010035, 0x010018, - 0x010039, 0x01003A, 0x01003F, 0x01001C, 0x01001D, 0x01001E, 0x01001F, 0x010011, - 0x010010, 0x0015E1, 0x010012, 0x010016, 0x010014, 0x0015E5, 0x0015E2, 0x01001B, - 0x0015ED, 0x0015E0, 0x01001A, 0x010019, 0x010015, 0x010017, 0x0015E7, 0x010031, - 0x0015F0, 0x0015F1, 0x0015F8, 0x0015EB, 0x0015F4, 0x010030, 0x010037, 0x0015F7, - 0x0015E8, 0x0015F9, 0x0015FA, 0x0015FB, 0x0015FC, 0x010036, 0x0015FE, 0x0015FF, - 0x0015C0, 0x0015C1, 0x0015BF, 0x0015C3, 0x0015B9, 0x0015B4, 0x00158C, 0x0015C5, - 0x0015C2, 0x001513, 0x0015BB, 0x0015BA, 0x010032, 0x0015C7, 0x0015C4, 0x010041, - 0x0015DE, 0x0015D0, 0x0015B6, 0x0015DF, 0x0015D7, 0x0015DD, 0x0015B5, 0x0015D4, - 0x0015D9, 0x0015CB, 0x0015DB, 0x0015D8, 0x0015DC, 0x0015C6, 0x0015DA, 0x010051, - 0x0015CF, 0x010059, 0x010052, 0x0015B7, 0x010050, 0x010055, 0x0015B0, 0x010056, - 0x01005B, 0x010043, 0x0015CA, 0x0011FC, 0x0015C8, 0x0015C9, 0x010042, 0x010020, - 0x0015B3, 0x010022, 0x010023, 0x010026, 0x001501, 0x010054, 0x010021, 0x010029, - 0x01002B, 0x01005A, 0x010058, 0x0015B2, 0x010025, 0x010024, 0x01002F, 0x0011F6, - 0x010040, 0x0015F3, 0x0011C1, 0x0011F8, 0x01004B, 0x001515, 0x0015F2, 0x010038, - 0x0015A8, 0x010028, 0x0015F6, 0x0015FD, 0x01003D, 0x0011C6, 0x0015AE, 0x0015AF, - 0x001512, 0x010081, 0x0015E3, 0x010080, 0x010087, 0x001511, 0x010082, 0x01008B, - 0x010088, 0x01008F, 0x0011CC, 0x010085, 0x010084, 0x0015F5, 0x010086, 0x0011F7, - 0x001500, 0x010093, 0x001502, 0x001503, 0x0015CC, 0x0015A2, 0x001484, 0x001507, - 0x0015A0, 0x0011F1, 0x0015CD, 0x0015A3, 0x0011CA, 0x0015AB, 0x0015A6, 0x0015A7, - 0x001510, 0x0015A9, 0x0100A0, 0x001516, 0x0015AA, 0x0100A7, 0x0011C4, 0x001514, - 0x0015BC, 0x0015BE, 0x00151D, 0x0015AD, 0x0015B8, 0x0015BD, 0x0015A4, 0x0015A5, - 0x0100B0, 0x0100B1, 0x0100B2, 0x0100B7, 0x0100B4, 0x0100B5, 0x0100B6, 0x0100BB, - 0x0100B8, 0x001641, 0x001602, 0x001603, 0x001605, 0x0100BF, 0x00168E, 0x001606, - 0x0100C0, 0x0100C3, 0x001610, 0x010045, 0x010047, 0x0100C7, 0x010046, 0x010048, - 0x010049, 0x01004A, 0x01004D, 0x01005C, 0x010044, 0x00168D, 0x01004C, 0x0100D1, - 0x0100D0, 0x001613, 0x0100D2, 0x0100D5, 0x0100D4, 0x0100D7, 0x0100D6, 0x0100D9, - 0x0100D8, 0x0100DB, 0x0100DA, 0x0100DD, 0x01005D, 0x0100DF, 0x0100DE, 0x001633, - 0x0100E0, 0x0100E3, 0x0016B0, 0x001631, 0x001632, 0x0100E7, 0x0016B7, 0x0016B6, - 0x0016BE, 0x0016B9, 0x0016BA, 0x0016BB, 0x0016B5, 0x001618, 0x0016BD, 0x0100F1, - 0x0100F0, 0x00161D, 0x0100F2, 0x0100F5, 0x0100F4, 0x0100F7, 0x0100F6, 0x0100F9, - 0x0100F8, 0x00161A, 0x0100FA, 0x001643, 0x00165C, 0x001646, 0x00161F, 0x001642, - 0x01010B, 0x001611, 0x001612, 0x01011C, 0x01011D, 0x001615, 0x010131, 0x001617, - 0x010118, 0x001619, 0x01011F, 0x00161B, 0x001614, 0x001616, 0x01011E, 0x010111, - 0x00163A, 0x010113, 0x010112, 0x010110, 0x00161C, 0x010117, 0x010116, 0x01011B, - 0x010109, 0x01010A, 0x01010D, 0x010114, 0x010115, 0x01011A, 0x010119, 0x010108, - 0x010120, 0x01010C, 0x010122, 0x010121, 0x01010F, 0x01010E, 0x010107, 0x010129, - 0x00163B, 0x01012B, 0x01012A, 0x010124, 0x010125, 0x010126, 0x010127, 0x00161E, - 0x0016B1, 0x00168A, 0x001683, 0x001682, 0x001681, 0x001686, 0x001684, 0x010132, - 0x010128, 0x001687, 0x0016B4, 0x01012D, 0x01012C, 0x01012F, 0x01012E, 0x01015D, - 0x010140, 0x010141, 0x010142, 0x010147, 0x01015C, 0x00168C, 0x01015E, 0x01E915, - 0x001640, 0x001645, 0x01015F, 0x001647, 0x00160C, 0x00164E, 0x001644, 0x010151, - 0x010150, 0x010157, 0x010152, 0x010155, 0x010154, 0x010153, 0x010156, 0x010159, - 0x001672, 0x001677, 0x01015A, 0x010158, 0x001676, 0x01015B, 0x0016B3, 0x010130, - 0x001648, 0x010163, 0x010143, 0x0016B2, 0x001634, 0x001660, 0x00163E, 0x001685, - 0x001638, 0x001639, 0x001689, 0x00168B, 0x00163D, 0x00163F, 0x0016EF, 0x010172, - 0x010123, 0x010170, 0x010133, 0x010176, 0x010171, 0x010174, 0x010175, 0x0016C3, - 0x0016C2, 0x010178, 0x0016C0, 0x001699, 0x0016C6, 0x0016C1, 0x010177, 0x0016C7, - 0x0016C5, 0x001691, 0x0016C4, 0x001693, 0x001692, 0x001697, 0x001694, 0x01018B, - 0x001698, 0x0016CB, 0x01018A, 0x00169A, 0x0016CA, 0x0016DC, 0x001696, 0x001695, - 0x0016E1, 0x0016E0, 0x0016E3, 0x0016E2, 0x0016E7, 0x0016CD, 0x001673, 0x0016F4, - 0x0016C9, 0x0016CE, 0x0012C8, 0x001671, 0x0016CC, 0x001485, 0x001674, 0x00164C, - 0x0016E5, 0x0016F2, 0x0016F3, 0x0016E4, 0x0016E6, 0x0016F1, 0x0016F7, 0x0016F5, - 0x0016E8, 0x0016F0, 0x0016EA, 0x0016E9, 0x0016F8, 0x00164A, 0x0016EE, 0x0016F6, - 0x001701, 0x001700, 0x001703, 0x001702, 0x001705, 0x001704, 0x001707, 0x001706, - 0x001709, 0x001708, 0x00170B, 0x00170A, 0x001486, 0x00170C, 0x00170F, 0x00170E, - 0x001487, 0x001710, 0x001711, 0x001480, 0x001481, 0x001482, 0x001483, 0x00149C, - 0x00149D, 0x00125D, 0x00149E, 0x00149F, 0x001498, 0x00167D, 0x00167E, 0x01E92D, - 0x001721, 0x001720, 0x001723, 0x001722, 0x001725, 0x001661, 0x001727, 0x001726, - 0x001729, 0x001769, 0x00172B, 0x00172A, 0x00176C, 0x00172C, 0x00176E, 0x001667, - 0x001731, 0x001730, 0x001499, 0x00167F, 0x001665, 0x001664, 0x00149A, 0x00149B, - 0x001494, 0x001669, 0x00166B, 0x001495, 0x00166C, 0x001496, 0x001497, 0x00166F, - 0x001741, 0x000F5D, 0x001743, 0x001742, 0x001745, 0x001747, 0x00164F, 0x001744, - 0x001649, 0x001740, 0x00174B, 0x00164B, 0x00166A, 0x00174C, 0x001746, 0x00174A, - 0x001751, 0x001750, 0x001765, 0x01031C, 0x001766, 0x00164D, 0x010304, 0x01030A, - 0x001748, 0x001749, 0x00176A, 0x00176B, 0x001768, 0x00174D, 0x00174E, 0x00174F, - 0x000F5C, 0x001670, 0x001678, 0x0012CF, 0x01030F, 0x010307, 0x01031E, 0x010309, - 0x010318, 0x01031A, 0x00167C, 0x00167A, 0x001763, 0x010308, 0x010339, 0x001679, - 0x001760, 0x001668, 0x001770, 0x001762, 0x010333, 0x01033F, 0x001675, 0x001761, - 0x010331, 0x00167B, 0x001662, 0x010332, 0x010335, 0x001663, 0x001666, 0x001767, - 0x001781, 0x001784, 0x001783, 0x001782, 0x001785, 0x001780, 0x001787, 0x001786, - 0x001799, 0x001798, 0x00178B, 0x00178A, 0x00179D, 0x001789, 0x00179F, 0x00179E, - 0x001791, 0x01030E, 0x001793, 0x00178E, 0x00178D, 0x001794, 0x00178F, 0x001792, - 0x001790, 0x00179C, 0x00179B, 0x00179A, 0x001788, 0x001795, 0x001796, 0x001797, - 0x001490, 0x0017A3, 0x001491, 0x0017A1, 0x0017A6, 0x0017A7, 0x0017A2, 0x0017A5, - 0x0017A0, 0x001492, 0x01E92E, 0x0017A9, 0x00178C, 0x0017AC, 0x01E897, 0x00122D, - 0x0017B1, 0x0017B2, 0x0017B3, 0x0017B0, 0x010334, 0x0010C0, 0x001231, 0x010338, - 0x00122C, 0x01033B, 0x01033A, 0x01030C, 0x01030D, 0x01033E, 0x001493, 0x0010E2, - 0x00158D, 0x00156C, 0x010323, 0x010330, 0x01E8B2, 0x0010F3, 0x00123C, 0x01E8B1, - 0x001250, 0x00156D, 0x01E8B0, 0x001253, 0x01E8B6, 0x010336, 0x001252, 0x01E8B3, - 0x00156E, 0x00156F, 0x0102A7, 0x001255, 0x010295, 0x001225, 0x01E8B7, 0x010298, - 0x0102A0, 0x0102A4, 0x01029B, 0x01E8BB, 0x0102A6, 0x0017DC, 0x001251, 0x010292, - 0x0017E1, 0x0017E2, 0x0017E3, 0x0017E0, 0x0017E5, 0x0017E6, 0x0017E7, 0x0017E4, - 0x0017E9, 0x0017E8, 0x010291, 0x010290, 0x010294, 0x010297, 0x010296, 0x001100, - 0x001239, 0x0017F2, 0x0017F0, 0x001568, 0x01E89F, 0x0017F1, 0x0017F3, 0x0017F4, - 0x0017F9, 0x001569, 0x0102A2, 0x0102A1, 0x0017F5, 0x0017F8, 0x0017F7, 0x0017F6, - 0x000F5E, 0x00186E, 0x001853, 0x001866, 0x001864, 0x001865, 0x001867, 0x00183C, - 0x001868, 0x001869, 0x00186A, 0x00186B, 0x000F5F, 0x00186D, 0x000EDD, 0x00186F, - 0x001835, 0x000F58, 0x000ED8, 0x000ED9, 0x000EDE, 0x000EDF, 0x01E882, 0x0102E8, - 0x0102ED, 0x01E88B, 0x0102EB, 0x0102EC, 0x0102D0, 0x0102EE, 0x0102EF, 0x00156A, - 0x001833, 0x001831, 0x00183D, 0x001830, 0x001837, 0x001850, 0x001832, 0x001875, - 0x001862, 0x001863, 0x001836, 0x001857, 0x001874, 0x001861, 0x001860, 0x0102E1, - 0x0102E4, 0x001852, 0x0102E2, 0x0102E6, 0x0102A5, 0x0102E7, 0x001851, 0x0102A8, - 0x0102A9, 0x0102AA, 0x0102AB, 0x0102AC, 0x0102AD, 0x0102C3, 0x0102AF, 0x0102E5, - 0x001841, 0x001840, 0x0102E9, 0x001842, 0x001845, 0x001844, 0x001847, 0x001846, - 0x001849, 0x001848, 0x00184B, 0x00184A, 0x00182D, 0x0102EA, 0x00184F, 0x00184E, - 0x001871, 0x00182C, 0x010313, 0x001872, 0x010364, 0x001870, 0x001877, 0x010348, - 0x010349, 0x010368, 0x010369, 0x001876, 0x01036F, 0x00185C, 0x01036B, 0x00184D, - 0x001822, 0x001821, 0x001820, 0x001823, 0x001826, 0x001825, 0x00184C, 0x001827, - 0x00182A, 0x010312, 0x00182B, 0x010311, 0x00182E, 0x010315, 0x00182F, 0x010321, - 0x010320, 0x001829, 0x010322, 0x001828, 0x010360, 0x010361, 0x010362, 0x001834, - 0x010366, 0x001873, 0x010367, 0x01032D, 0x00183A, 0x01032F, 0x01032E, 0x00183B, - 0x000ED2, 0x014624, 0x000ED3, 0x010374, 0x010375, 0x01E8A3, 0x000ED6, 0x00156B, - 0x01462A, 0x001564, 0x000EAE, 0x000EAD, 0x01462B, 0x000EAF, 0x010365, 0x010341, - 0x010343, 0x010347, 0x010342, 0x01035D, 0x0103CD, 0x01035F, 0x010340, 0x0103C8, - 0x010359, 0x01035C, 0x0103CB, 0x0103CE, 0x0103CC, 0x010346, 0x0103CF, 0x010352, - 0x01EE03, 0x010353, 0x0103C3, 0x010350, 0x010351, 0x010354, 0x010355, 0x010310, - 0x010358, 0x01035E, 0x01035A, 0x010356, 0x01035B, 0x010357, 0x01EE11, 0x01EE10, - 0x01EE13, 0x01EE12, 0x01EE15, 0x01EE14, 0x01EE17, 0x01EE16, 0x01EE19, 0x01EE18, - 0x01EE1B, 0x01EE1A, 0x01EE1D, 0x01EE1C, 0x01EE1F, 0x01EE1E, 0x01EE21, 0x010345, - 0x010344, 0x01EE22, 0x010372, 0x01EE24, 0x01EE27, 0x010373, 0x01EE29, 0x010371, - 0x01EE2B, 0x01EE2A, 0x010370, 0x01EE2C, 0x01EE2F, 0x01034A, 0x01EE31, 0x01EE30, - 0x010394, 0x010381, 0x010382, 0x010380, 0x01EE37, 0x010384, 0x010386, 0x01039A, - 0x0103CA, 0x0103AF, 0x01038F, 0x010385, 0x01039B, 0x010387, 0x010399, 0x0103A2, - 0x01030B, 0x010393, 0x0103C9, 0x01EEA1, 0x01EE47, 0x010392, 0x010302, 0x01038B, - 0x01EE4B, 0x010300, 0x010391, 0x010390, 0x010397, 0x010396, 0x010395, 0x010303, - 0x0103B4, 0x01EE52, 0x010383, 0x01EE06, 0x0103A7, 0x01EE02, 0x0103B5, 0x00186C, - 0x0103B9, 0x0103B8, 0x0103D3, 0x0103BB, 0x0103BD, 0x010319, 0x0103BF, 0x0103B1, - 0x0103B0, 0x01EE62, 0x0103B2, 0x01039C, 0x0103B6, 0x0103B7, 0x01EE69, 0x01EE68, - 0x010398, 0x01039D, 0x01EE6D, 0x01EE6C, 0x01EE6F, 0x01EE6E, 0x01EE71, 0x01EE70, - 0x01031B, 0x0103C0, 0x01EE75, 0x01EE74, 0x01EE77, 0x01EE76, 0x0103C1, 0x010314, - 0x01EE7B, 0x010316, 0x001913, 0x0103AD, 0x001901, 0x01031D, 0x010317, 0x001912, - 0x01EE91, 0x00190C, 0x01EE90, 0x01EE96, 0x01EE95, 0x01EE97, 0x01EE94, 0x010306, - 0x0103D1, 0x0103D2, 0x010301, 0x0103D5, 0x0103D4, 0x0103C2, 0x010305, 0x0103A0, - 0x0103A1, 0x010337, 0x0103AB, 0x0103A4, 0x001910, 0x0103A6, 0x01031F, 0x0103A8, - 0x001911, 0x0103AA, 0x01EE83, 0x001915, 0x001917, 0x0103A5, 0x0103BE, 0x0103AC, - 0x00195A, 0x01EEA2, 0x01EEA5, 0x001956, 0x01EEA7, 0x01EEA6, 0x01EEA9, 0x01EEA8, - 0x01EEAB, 0x0103A9, 0x01EEAD, 0x01EEAC, 0x01EEAF, 0x01EEAE, 0x0103AE, 0x00195B, - 0x001955, 0x001950, 0x001953, 0x001952, 0x001914, 0x001957, 0x001916, 0x01EE82, - 0x001918, 0x001919, 0x00191A, 0x00191B, 0x01EE9B, 0x00191D, 0x00191E, 0x01EE81, - 0x01EE80, 0x01EEB6, 0x01EE86, 0x01EE85, 0x01EE84, 0x01EE87, 0x01EE89, 0x01EEB5, - 0x01EE88, 0x01EE8B, 0x01EE8D, 0x00185D, 0x01EE8C, 0x01EEB2, 0x01EEB7, 0x001854, - 0x01EEB3, 0x01EEB0, 0x001855, 0x01EE8E, 0x001954, 0x01EE8F, 0x001856, 0x01EE9A, - 0x001958, 0x001959, 0x00195E, 0x01EE99, 0x01EE98, 0x00195D, 0x01EEB1, 0x00195F, - 0x0019B5, 0x001983, 0x001984, 0x0019B6, 0x001986, 0x001981, 0x001982, 0x001985, - 0x001989, 0x001980, 0x00198B, 0x00198F, 0x0019D6, 0x001987, 0x00198C, 0x0019BB, - 0x001991, 0x001988, 0x001993, 0x001992, 0x0019D1, 0x0019D2, 0x0019D3, 0x00198E, - 0x0019D7, 0x001998, 0x00198A, 0x00198D, 0x0019D0, 0x00199C, 0x00199F, 0x00199E, - 0x010415, 0x01041A, 0x0019A3, 0x010422, 0x010414, 0x01041F, 0x010416, 0x010420, - 0x010421, 0x010424, 0x0019A1, 0x0019A2, 0x010426, 0x010419, 0x01042B, 0x010563, - 0x0019D4, 0x010427, 0x0019B3, 0x0019B2, 0x0019D5, 0x0019B0, 0x0019B1, 0x01042F, - 0x0019DA, 0x0019BC, 0x0019D8, 0x0019D9, 0x01EE0C, 0x01EE0D, 0x010418, 0x0019B7, - 0x010474, 0x0019C3, 0x01EE2D, 0x014601, 0x014600, 0x014606, 0x014607, 0x01EE2E, - 0x0019C2, 0x0019C0, 0x010473, 0x01044C, 0x0019C5, 0x0019C1, 0x0019C7, 0x01EE32, - 0x010450, 0x010483, 0x01EE34, 0x01EE35, 0x0019C4, 0x01EE36, 0x0019C6, 0x01EEB9, - 0x01EE3B, 0x0019C9, 0x01EEB8, 0x00185B, 0x010456, 0x01EE39, 0x00185A, 0x010491, - 0x010490, 0x010493, 0x010492, 0x010495, 0x010494, 0x0019A5, 0x0019A6, 0x010499, - 0x010498, 0x01049B, 0x01049A, 0x01049D, 0x01049C, 0x010497, 0x010496, 0x0104A1, - 0x0104A0, 0x01EE57, 0x0104A2, 0x0104A5, 0x0104A4, 0x0104A7, 0x0104A6, 0x01EE51, - 0x01EE59, 0x0019B9, 0x0019BA, 0x01EE54, 0x01EE5B, 0x01EE49, 0x0104A9, 0x0104B1, - 0x0104B0, 0x01EE42, 0x0104B2, 0x0104A8, 0x0104B4, 0x0104B7, 0x01EE6A, 0x01EE61, - 0x010475, 0x0104BB, 0x01EE67, 0x01EE4D, 0x01EE4E, 0x01EE4F, 0x01EE64, 0x0104C2, - 0x01EE72, 0x001B18, 0x001B06, 0x01EE7C, 0x001B14, 0x01EE7E, 0x01EE79, 0x001B1E, - 0x01EE7A, 0x0104C1, 0x001B1B, 0x01EE5D, 0x0104C0, 0x01EE5F, 0x0104C3, 0x01EEBA, - 0x010470, 0x0104D3, 0x001A82, 0x001A83, 0x001A84, 0x010477, 0x0104C7, 0x0104D9, - 0x0104D8, 0x010476, 0x0104DA, 0x0104DD, 0x0104DC, 0x0104DF, 0x0104DE, 0x0104E2, - 0x0104E0, 0x0104E3, 0x01EEB4, 0x01EEA3, 0x0104E1, 0x0104E4, 0x0104E5, 0x010428, - 0x010425, 0x0104EB, 0x01EEBB, 0x0104E8, 0x0104EF, 0x0104E6, 0x0104E7, 0x0104F1, - 0x010451, 0x010452, 0x0104F2, 0x0104F0, 0x0104F4, 0x0104F7, 0x0104F6, 0x0104FB, - 0x010472, 0x0104F8, 0x01045B, 0x010471, 0x0104F5, 0x0104FA, 0x0104F9, 0x001A43, - 0x001A81, 0x001A41, 0x001A42, 0x001A40, 0x010455, 0x001A46, 0x001A47, 0x010502, - 0x010458, 0x001A99, 0x001A96, 0x01045F, 0x001A87, 0x01051C, 0x001A45, 0x010511, - 0x010510, 0x010513, 0x001A44, 0x010515, 0x010514, 0x010517, 0x010516, 0x010519, - 0x010518, 0x01051B, 0x01051A, 0x01051D, 0x001A4A, 0x01051F, 0x01051E, 0x010501, - 0x010500, 0x010507, 0x010522, 0x010520, 0x010521, 0x010527, 0x010506, 0x010505, - 0x010503, 0x001A49, 0x001A4B, 0x010524, 0x010525, 0x010526, 0x001A48, 0x001A4F, - 0x000AA4, 0x000A21, 0x000A22, 0x000A23, 0x000A15, 0x000AA5, 0x000AA6, 0x000AA7, - 0x01047D, 0x000A09, 0x000A08, 0x000A39, 0x000A20, 0x000A27, 0x000A0F, 0x010541, - 0x010540, 0x010543, 0x010542, 0x010545, 0x010544, 0x010547, 0x010546, 0x010549, - 0x010548, 0x01054B, 0x01054A, 0x01054D, 0x01054C, 0x01054F, 0x01054E, 0x010535, - 0x010552, 0x01053D, 0x01050B, 0x010534, 0x010553, 0x010504, 0x010536, 0x010538, - 0x010539, 0x01053A, 0x01053B, 0x01053C, 0x01055C, 0x01053E, 0x01053F, 0x010561, - 0x010560, 0x000AA1, 0x010562, 0x01F109, 0x01F108, 0x01047A, 0x010479, 0x000AA0, - 0x01F10A, 0x010457, 0x01047B, 0x000AB8, 0x001BAE, 0x001BAF, 0x000ABD, 0x010454, - 0x01055D, 0x01055E, 0x01055F, 0x010554, 0x010555, 0x010556, 0x001BCF, 0x010532, - 0x010537, 0x01055A, 0x010531, 0x010530, 0x010559, 0x010558, 0x01055B, 0x001BC8, - 0x010484, 0x001BD0, 0x000E9D, 0x010480, 0x001BD5, 0x001A90, 0x001BD6, 0x001BD7, - 0x01048A, 0x010482, 0x001A4D, 0x010485, 0x001A4C, 0x001BDB, 0x001A4E, 0x001A98, - 0x001A94, 0x0104B3, 0x014644, 0x000AE1, 0x000E84, 0x001A93, 0x01F10C, 0x0104B8, - 0x000AE0, 0x001A91, 0x001A92, 0x001A95, 0x001A97, 0x0104BE, 0x0104BF, 0x000A72, - 0x000E9C, 0x000A25, 0x0104A3, 0x000A26, 0x000A73, 0x000AE6, 0x000AE7, 0x010488, - 0x000AEA, 0x000AF9, 0x000AEB, 0x0104BA, 0x000A24, 0x01048E, 0x000A74, 0x000A6C, - 0x001B0C, 0x001B48, 0x001B46, 0x001B4B, 0x001B45, 0x001B19, 0x001B47, 0x010523, - 0x001B09, 0x001B08, 0x001B0B, 0x001B0A, 0x001B0D, 0x001B4A, 0x001B0F, 0x001B0E, - 0x001B11, 0x001B10, 0x001B13, 0x001B12, 0x001B15, 0x01442F, 0x001B17, 0x001B16, - 0x000E8D, 0x014442, 0x014447, 0x01440F, 0x001B1A, 0x001B1C, 0x014441, 0x014409, - 0x001B30, 0x001B20, 0x001B23, 0x001B22, 0x001B25, 0x001B21, 0x001B27, 0x001B24, - 0x0104DB, 0x0104D2, 0x0104D0, 0x001B29, 0x001B2A, 0x001B2C, 0x001B26, 0x001B2B, - 0x01440D, 0x001B33, 0x01440E, 0x01441B, 0x014432, 0x014536, 0x0144EC, 0x014537, - 0x014460, 0x001B32, 0x0144ED, 0x014431, 0x001B31, 0x000A2A, 0x001B49, 0x000A2B, - 0x0144AC, 0x014430, 0x000EB3, 0x01447B, 0x014433, 0x010512, 0x000EB2, 0x014437, - 0x000F68, 0x000F6C, 0x000F4A, 0x000EB0, 0x01441A, 0x01447C, 0x000F4E, 0x010601, - 0x001B51, 0x001B53, 0x010602, 0x010600, 0x001B56, 0x001B54, 0x001B52, 0x001B55, - 0x001B50, 0x010604, 0x001B58, 0x010606, 0x010605, 0x001B59, 0x010607, 0x001B57, - 0x01440A, 0x01440B, 0x014462, 0x014461, 0x0144D0, 0x014473, 0x014436, 0x010608, - 0x010609, 0x01060A, 0x01060B, 0x01060C, 0x01060D, 0x01060E, 0x01447E, 0x014475, - 0x014472, 0x014466, 0x01445A, 0x014476, 0x01445C, 0x01444C, 0x000F69, 0x014463, - 0x010623, 0x01445D, 0x01443E, 0x01445E, 0x014467, 0x01443C, 0x01445F, 0x010633, - 0x001B83, 0x01440C, 0x01443D, 0x01063C, 0x000E8A, 0x01063E, 0x000E87, 0x014423, - 0x01063A, 0x01447F, 0x014443, 0x014453, 0x001B8D, 0x001B8C, 0x01063D, 0x010655, - 0x010654, 0x001B90, 0x001B93, 0x010656, 0x010657, 0x001B91, 0x001B92, 0x0144AD, - 0x01065B, 0x00A804, 0x001B9C, 0x0144AE, 0x01065F, 0x001B95, 0x001B96, 0x001B97, - 0x001B84, 0x001A85, 0x001B8E, 0x001B8F, 0x001B88, 0x001B85, 0x001B86, 0x001B87, - 0x01F102, 0x010652, 0x010651, 0x001B8B, 0x01F10B, 0x010650, 0x001B8A, 0x001B89, - 0x001BB1, 0x001BB0, 0x001BB3, 0x001BB2, 0x001BB5, 0x001BB4, 0x001BB7, 0x001BB6, - 0x001BB9, 0x001BB8, 0x001BBB, 0x001BBA, 0x001BBD, 0x001A80, 0x001BBF, 0x001BBE, - 0x001BC1, 0x00A832, 0x001BC3, 0x001BC2, 0x001BC5, 0x001BC4, 0x0144AF, 0x001BC6, - 0x001BC9, 0x001BC0, 0x001BCB, 0x001BCA, 0x001BCD, 0x001BCC, 0x001BC7, 0x001BCE, - 0x001BD1, 0x01F103, 0x001BD3, 0x001BD2, 0x0144D2, 0x0144D1, 0x001A86, 0x014440, - 0x001A89, 0x01444B, 0x00A89B, 0x001A88, 0x0144B8, 0x001BDC, 0x00A89A, 0x00A822, - 0x001BE1, 0x001BE0, 0x001BE3, 0x001BE2, 0x001BE5, 0x001BE4, 0x00A8D8, 0x00AA9C, - 0x014445, 0x001BBC, 0x014452, 0x014616, 0x00A8F3, 0x000E88, 0x01444A, 0x0106A1, - 0x0106A0, 0x014446, 0x0106A2, 0x001BA0, 0x0106A4, 0x0106A7, 0x0106A6, 0x0106A9, - 0x0106A8, 0x0106AB, 0x0106AA, 0x0106AE, 0x0106A5, 0x0106AF, 0x0106AD, 0x0144B9, - 0x001C0D, 0x001C00, 0x001C03, 0x001C06, 0x001C05, 0x001C04, 0x001C07, 0x001C0C, - 0x001C09, 0x001C18, 0x001C0B, 0x0106AC, 0x001C0A, 0x001C0F, 0x001C1E, 0x0106DF, - 0x001C11, 0x001C10, 0x001C13, 0x001C12, 0x001C16, 0x001C17, 0x0106C3, 0x001C14, - 0x001C19, 0x001C1A, 0x001C1B, 0x001C1C, 0x001C1D, 0x001C15, 0x001C1F, 0x0106D3, - 0x0106D0, 0x0106D1, 0x0106D2, 0x0106D7, 0x0106D4, 0x0106D5, 0x0106D6, 0x0106DB, - 0x01F101, 0x0106D9, 0x0106DA, 0x01F100, 0x0106D8, 0x0106DC, 0x0106DE, 0x001C08, - 0x001C20, 0x001C21, 0x001C22, 0x001C23, 0x001C74, 0x001C71, 0x001C76, 0x001C77, - 0x001C60, 0x001C61, 0x001C62, 0x001C63, 0x001C0E, 0x001C75, 0x0106FF, 0x0106F1, - 0x0106F0, 0x0106F7, 0x0106F2, 0x0106F5, 0x01F107, 0x01F106, 0x0106F6, 0x01F105, - 0x0106F8, 0x0106F9, 0x0106FA, 0x0106F4, 0x0106DD, 0x0106FB, 0x001C54, 0x010710, - 0x010711, 0x001C50, 0x001C53, 0x010717, 0x001C51, 0x010715, 0x010716, 0x001C52, - 0x001C5A, 0x001C5B, 0x001C56, 0x001C59, 0x001C5F, 0x001C55, 0x010714, 0x001C57, - 0x001C40, 0x001C41, 0x001C42, 0x001C43, 0x001C44, 0x001C45, 0x01F104, 0x001C47, - 0x001C70, 0x001C49, 0x001C72, 0x001C73, 0x001C5C, 0x010712, 0x001C46, 0x010721, - 0x010720, 0x001C5D, 0x010722, 0x010725, 0x010724, 0x010727, 0x010726, 0x010718, - 0x01071F, 0x01072B, 0x01071A, 0x010728, 0x010729, 0x01071E, 0x001C58, 0x001C5E, - 0x00A8B0, 0x00A8B1, 0x00A8AB, 0x00A8A9, 0x0145E1, 0x00A8D5, 0x00A8A4, 0x00A8D9, - 0x001C82, 0x00A8AA, 0x00AA86, 0x001C83, 0x01071B, 0x01072F, 0x010719, 0x001C81, - 0x001C85, 0x010743, 0x001C80, 0x001C86, 0x000C9B, 0x001C87, 0x001C84, 0x000C97, - 0x001565, 0x000C93, 0x001C88, 0x014584, 0x01444E, 0x001566, 0x014589, 0x010751, - 0x010750, 0x000C9A, 0x010752, 0x010755, 0x010754, 0x0145B1, 0x0145B2, 0x0145B3, - 0x0145B0, 0x014515, 0x014514, 0x00AA80, 0x000F25, 0x014533, 0x01451B, 0x01458C, - 0x000F24, 0x01458D, 0x014618, 0x00AA89, 0x01450C, 0x01462C, 0x000C92, 0x014603, - 0x014630, 0x000CB2, 0x000C96, 0x000C95, 0x00A8F4, 0x000CB8, 0x00AA88, 0x01462E, - 0x01442E, 0x01450D, 0x01450E, 0x01450F, 0x000D6D, 0x014610, 0x000F22, 0x000F42, - 0x000D68, 0x00AA9E, 0x000D6E, 0x014505, 0x014631, 0x000F40, 0x001567, 0x01461A, - 0x000C94, 0x001560, 0x014602, 0x000D6C, 0x001561, 0x000C90, 0x00A80F, 0x01455E, - 0x0145CC, 0x0145C5, 0x01071C, 0x014478, 0x01071D, 0x01444F, 0x014540, 0x000CA8, - 0x00A8D4, 0x001C6C, 0x010703, 0x0145CD, 0x014479, 0x001C65, 0x001C66, 0x001C67, - 0x014474, 0x001C69, 0x001C6A, 0x01446F, 0x01455F, 0x001CEC, 0x001CEF, 0x001CEE, - 0x001CF1, 0x001CF0, 0x01447A, 0x001562, 0x001CF5, 0x0145F2, 0x0145F3, 0x001CF6, - 0x0145F6, 0x014531, 0x0145F7, 0x014532, 0x014530, 0x00A8F5, 0x01460E, 0x014578, - 0x001D01, 0x001D02, 0x001D03, 0x001D00, 0x001D05, 0x001D06, 0x001D07, 0x001D04, - 0x001D0C, 0x001D0A, 0x001D0B, 0x000D0F, 0x001D09, 0x001D1D, 0x001D0F, 0x001D0D, - 0x001D11, 0x001D10, 0x001D13, 0x001D12, 0x001D15, 0x001D14, 0x001D17, 0x001D08, - 0x001D19, 0x001D18, 0x001D1B, 0x001D1A, 0x001D1E, 0x001D1F, 0x001D16, 0x001D1C, - 0x001D21, 0x001D24, 0x001D23, 0x001D22, 0x000D27, 0x001D20, 0x001D27, 0x001D26, - 0x001D29, 0x001D2A, 0x001D2B, 0x000D23, 0x000D0E, 0x001D25, 0x001D0E, 0x000D2B, - 0x000D21, 0x000D76, 0x000D22, 0x000D25, 0x000D26, 0x01446E, 0x001563, 0x00A815, - 0x001D28, 0x000D24, 0x000D7B, 0x000D6F, 0x01462F, 0x00157C, 0x000D75, 0x000D3D, - 0x000DC0, 0x000D20, 0x000D77, 0x000D6A, 0x000DC4, 0x000D67, 0x000D73, 0x000D69, - 0x000D66, 0x000D71, 0x000D4E, 0x000D72, 0x000D70, 0x000D60, 0x000D2A, 0x010801, - 0x010803, 0x010820, 0x010802, 0x010800, 0x010826, 0x010804, 0x010805, 0x010818, - 0x01080B, 0x01081A, 0x01080A, 0x010814, 0x010808, 0x01081C, 0x01080C, 0x010811, - 0x010817, 0x01081B, 0x010812, 0x010810, 0x001D74, 0x001D6D, 0x001D6C, 0x001D6F, - 0x001D6B, 0x001D79, 0x001D7A, 0x001D7B, 0x001D6E, 0x001D7D, 0x001D7E, 0x001D7F, - 0x010834, 0x010835, 0x001D73, 0x001D72, 0x010827, 0x001D71, 0x010822, 0x010838, - 0x001D70, 0x01083C, 0x010821, 0x001D75, 0x010823, 0x001D77, 0x001D76, 0x001D7C, - 0x001D81, 0x010833, 0x001D83, 0x001D82, 0x001D85, 0x010832, 0x010831, 0x001D86, - 0x010819, 0x001D98, 0x010837, 0x010830, 0x01080F, 0x001D8C, 0x01081F, 0x01085B, - 0x001D91, 0x001D90, 0x001D93, 0x001D92, 0x001D95, 0x001D94, 0x001D97, 0x001D96, - 0x01085F, 0x01085D, 0x01083F, 0x010842, 0x01085A, 0x001D99, 0x001D9A, 0x010840, - 0x010841, 0x010853, 0x010852, 0x010847, 0x010845, 0x010846, 0x010851, 0x010850, - 0x010854, 0x01084A, 0x01084B, 0x010855, 0x010844, 0x010859, 0x010843, 0x01084F, - 0x010875, 0x010849, 0x01082C, 0x01087B, 0x010825, 0x010824, 0x01087F, 0x010828, - 0x010829, 0x01082A, 0x01087A, 0x01082E, 0x01082D, 0x01082B, 0x01082F, 0x010873, - 0x010872, 0x010862, 0x010863, 0x010860, 0x010861, 0x010871, 0x010867, 0x010858, - 0x010870, 0x010865, 0x010874, 0x01085C, 0x010866, 0x01085E, 0x010876, 0x010881, - 0x014632, 0x010883, 0x010882, 0x010885, 0x000DC6, 0x000DC5, 0x010886, 0x010889, - 0x010888, 0x01088B, 0x01088A, 0x00A821, 0x000DAC, 0x01088F, 0x000DC3, 0x010891, - 0x00AA99, 0x000D7A, 0x010892, 0x010895, 0x00AA9A, 0x00A814, 0x010896, 0x010899, - 0x010898, 0x01089B, 0x01089A, 0x000DC2, 0x00AA9F, 0x00AA83, 0x000D7E, 0x000DC1, - 0x014613, 0x000D7F, 0x00AA87, 0x014625, 0x0108AC, 0x0108A7, 0x000CB5, 0x000D74, - 0x00AA81, 0x0108AB, 0x0108AA, 0x0108A8, 0x0108A9, 0x0108AF, 0x00A835, 0x000DAD, - 0x014611, 0x001E61, 0x001E62, 0x001E63, 0x00A834, 0x001E65, 0x001E66, 0x00AA98, - 0x01461B, 0x014615, 0x014619, 0x014612, 0x001E7C, 0x001E7D, 0x001E6C, 0x01086A, - 0x001E1D, 0x01084D, 0x001E7E, 0x001E7F, 0x001E1F, 0x01084E, 0x001E14, 0x01086D, - 0x001E78, 0x010848, 0x001E1B, 0x001E1A, 0x001E1E, 0x001E18, 0x0108E3, 0x0108FC, - 0x0108FD, 0x010868, 0x001E74, 0x001EAD, 0x01086C, 0x01086E, 0x001EAE, 0x01084C, - 0x0108FB, 0x001EBD, 0x0108FE, 0x001EAA, 0x001EAF, 0x0108FF, 0x001E79, 0x0108E1, - 0x0108E0, 0x001EBE, 0x0108E2, 0x0108E5, 0x0108E4, 0x0108E7, 0x0108E6, 0x001EBF, - 0x0108E8, 0x0108EB, 0x0108EA, 0x001EB9, 0x0108EC, 0x0108F4, 0x0108EE, 0x0108F2, - 0x001ED8, 0x01087C, 0x001E43, 0x0108F1, 0x01087D, 0x001ED4, 0x01086F, 0x010879, - 0x010869, 0x01086B, 0x001EDA, 0x0108F0, 0x01087E, 0x010864, 0x0108F5, 0x001ED5, - 0x001E40, 0x001E41, 0x001E42, 0x001E4D, 0x001E44, 0x001E45, 0x001E46, 0x001E47, - 0x001E48, 0x001E49, 0x001E4A, 0x001E4B, 0x001E7A, 0x001E5C, 0x001E4E, 0x001E4F, - 0x001E70, 0x001E73, 0x001E72, 0x001ED9, 0x001EDD, 0x001E71, 0x001E76, 0x001EDF, - 0x010901, 0x010902, 0x001E7B, 0x001E75, 0x001E4C, 0x001E77, 0x010907, 0x010922, - 0x010920, 0x001EDB, 0x010913, 0x010927, 0x010921, 0x010924, 0x010925, 0x010929, - 0x010928, 0x01092B, 0x01092A, 0x001EDE, 0x01092C, 0x010926, 0x01092E, 0x010910, - 0x010911, 0x010912, 0x001E83, 0x010914, 0x001E82, 0x010916, 0x010917, 0x010918, - 0x001E85, 0x001E81, 0x01091B, 0x01092D, 0x010915, 0x001E8A, 0x01092F, 0x001E86, - 0x001E8C, 0x001EBA, 0x001E90, 0x010900, 0x010905, 0x010906, 0x001E93, 0x001EB8, - 0x001E92, 0x001E8E, 0x01090B, 0x010904, 0x001E8B, 0x001E9C, 0x001E88, 0x001E84, - 0x001EA3, 0x001EB1, 0x001EB2, 0x001EB0, 0x001EB4, 0x001EA2, 0x001EB6, 0x001EB7, - 0x001EA1, 0x001E89, 0x001EA5, 0x001EBB, 0x001EB5, 0x001E8D, 0x001EA7, 0x001E8F, - 0x001EA8, 0x00A820, 0x001EA6, 0x001E91, 0x001E97, 0x00AA11, 0x00AA82, 0x010930, - 0x010931, 0x010932, 0x001EAB, 0x001EA4, 0x001EAC, 0x001EB3, 0x010937, 0x001EBC, - 0x001ED0, 0x001EC2, 0x001EC1, 0x001ED3, 0x00AA13, 0x001ED1, 0x001ED2, 0x00AA9D, - 0x01446D, 0x001ED6, 0x00AAB6, 0x014617, 0x001ED7, 0x001ECC, 0x014614, 0x00AAB1, - 0x010980, 0x001E94, 0x001E9D, 0x010985, 0x010984, 0x010987, 0x001E96, 0x001E95, - 0x001E98, 0x001E99, 0x001E9A, 0x001E9B, 0x001EFD, 0x001E9F, 0x001E9E, 0x000CAF, - 0x001EF0, 0x001EF1, 0x000CA3, 0x00A850, 0x001EF4, 0x001EF5, 0x001EF6, 0x001EF7, - 0x001EF8, 0x001EF9, 0x001EFA, 0x001EFB, 0x000CA2, 0x001EFF, 0x001EFE, 0x0109A1, - 0x0109A0, 0x0109A3, 0x0109A2, 0x0109A6, 0x001EF3, 0x0109A7, 0x0109A5, 0x0109AB, - 0x0109A8, 0x0109A9, 0x0109AA, 0x0109A4, 0x0109AC, 0x010923, 0x0109AE, 0x001EF2, - 0x001F2C, 0x001F2D, 0x001F2E, 0x010934, 0x010935, 0x010936, 0x001F24, 0x010938, - 0x010939, 0x001F28, 0x001F2F, 0x0109BD, 0x0109AD, 0x0109AF, 0x0109BE, 0x0109EC, - 0x000E52, 0x001F10, 0x014608, 0x01460B, 0x001F1D, 0x001F14, 0x000E50, 0x0109C3, - 0x0109EF, 0x001F18, 0x001F1B, 0x0109ED, 0x001F68, 0x001F19, 0x001F1A, 0x0109D5, - 0x0109DC, 0x001F23, 0x0109D2, 0x0109D3, 0x0109D4, 0x0109D7, 0x0109D6, 0x001F22, - 0x0109D8, 0x0109DB, 0x0109DA, 0x0109DE, 0x001F26, 0x001F21, 0x0109D9, 0x0109F0, - 0x0109F1, 0x0109F2, 0x0109E2, 0x0109E1, 0x0109E0, 0x0109E7, 0x0109F7, 0x0109EA, - 0x0109E5, 0x0109E8, 0x0109E9, 0x0109E4, 0x0109EE, 0x0109E6, 0x0109DD, 0x001F25, - 0x0109EB, 0x000E81, 0x001F43, 0x001F42, 0x000F43, 0x001F41, 0x001F40, 0x0109DF, - 0x000E09, 0x000E82, 0x001F78, 0x00AAE9, 0x00A81B, 0x001F44, 0x001F4C, 0x00AAE8, - 0x001F51, 0x001F50, 0x001F53, 0x001F52, 0x001F55, 0x001F54, 0x001F57, 0x001F56, - 0x001F59, 0x001F49, 0x001F5B, 0x001F4B, 0x001F5D, 0x001F45, 0x001F5F, 0x001F4D, - 0x010A00, 0x010A13, 0x001F6C, 0x010A15, 0x001F62, 0x00AA1B, 0x010A16, 0x001F63, - 0x001F48, 0x00AA14, 0x001F4A, 0x010A1F, 0x001F60, 0x001F61, 0x010A1D, 0x010A23, - 0x001F65, 0x001F66, 0x001F73, 0x001F72, 0x001F76, 0x001F71, 0x001F74, 0x001F75, - 0x000E9E, 0x001F69, 0x001F7B, 0x001F6D, 0x001F79, 0x001F7C, 0x001F7D, 0x010A31, - 0x00AA10, 0x010A33, 0x010A32, 0x010A30, 0x00157D, 0x000E0D, 0x000E0E, 0x00157E, - 0x001F98, 0x000E08, 0x000E0A, 0x00AA27, 0x000E0F, 0x00AA21, 0x00AA20, 0x001F9E, - 0x001F91, 0x001F93, 0x00157F, 0x001F90, 0x001F96, 0x001F94, 0x001F92, 0x001F95, - 0x001F99, 0x000F8B, 0x001F9B, 0x001F9A, 0x001F9D, 0x000F8A, 0x001F9F, 0x001F97, - 0x000E21, 0x000E22, 0x000E23, 0x000F59, 0x000E25, 0x000E9F, 0x000E27, 0x000E20, - 0x000F26, 0x000CAE, 0x000E2A, 0x000E2B, 0x000E28, 0x000E29, 0x000E26, 0x000E2F, - 0x000E99, 0x001578, 0x001579, 0x00157A, 0x00157B, 0x001574, 0x001575, 0x001576, - 0x001577, 0x001570, 0x001571, 0x000E96, 0x001572, 0x000E2D, 0x000E2E, 0x000E97, - 0x000F00, 0x001573, 0x001FC3, 0x001FC2, 0x00154C, 0x001FC4, 0x001FC7, 0x001FC6, - 0x001FC9, 0x00154D, 0x001FCB, 0x001FCA, 0x00154E, 0x001FCC, 0x00154F, 0x001548, - 0x000E54, 0x001549, 0x00154A, 0x00154B, 0x000E55, 0x000E56, 0x000E57, 0x000CDE, - 0x001544, 0x000E59, 0x001545, 0x001546, 0x000E58, 0x001547, 0x001540, 0x001541, - 0x001542, 0x001543, 0x00155C, 0x00152E, 0x00152F, 0x001528, 0x00158E, 0x00158F, - 0x001588, 0x001584, 0x001591, 0x00126D, 0x00127E, 0x00127F, 0x001278, 0x001279, - 0x00127A, 0x00127B, 0x001FF3, 0x001FF2, 0x001274, 0x001FF4, 0x001FF7, 0x001FF6, - 0x001FF9, 0x001FF8, 0x001FFB, 0x001FFA, 0x001275, 0x001276, 0x00AA25, 0x001277, - 0x00AA24, 0x001270, 0x00AA28, 0x001271, 0x001272, 0x001273, 0x00124C, 0x00124D, - 0x01E8AC, 0x01E8AD, 0x01E8BC, 0x01E8BD, 0x01E8BF, 0x01E8B5, 0x00AA57, 0x010AC1, - 0x010AC0, 0x010AC3, 0x010AC2, 0x010AC5, 0x010AC4, 0x010AC7, 0x010AC6, 0x00120E, - 0x00120F, 0x010ACB, 0x001208, 0x010ACD, 0x010ACC, 0x010ACF, 0x010ACE, 0x010AD1, - 0x001209, 0x010AD3, 0x00AA52, 0x00AA53, 0x00AA50, 0x00AA51, 0x010AD6, 0x010AD9, - 0x00120A, 0x001201, 0x010ADA, 0x010ADD, 0x010ADC, 0x001202, 0x010ADE, 0x010AE1, - 0x010AE0, 0x010AE3, 0x010AE2, 0x0012E8, 0x010AE4, 0x00FC5D, 0x00FC5E, 0x00FC58, - 0x00FC3F, 0x010AEB, 0x00FC3B, 0x010AED, 0x010AEC, 0x010AEF, 0x010AEE, 0x00FC34, - 0x00FC35, 0x00FC36, 0x00FC37, 0x00FC30, 0x00FC31, 0x00FC32, 0x00FC0C, 0x00FC0D, - 0x00FC0E, 0x00FC13, 0x00FCEC, 0x00FCED, 0x00FCEE, 0x00FCEA, 0x00FCA5, 0x010B10, - 0x010B11, 0x010B1C, 0x00FCA6, 0x010B14, 0x010B15, 0x010B16, 0x010B17, 0x010B18, - 0x010B19, 0x010B1A, 0x010B1B, 0x00FCA0, 0x010B1D, 0x010B1E, 0x010B1F, 0x010B02, - 0x010B01, 0x010B13, 0x010B12, 0x010B00, 0x010B05, 0x00FC8D, 0x010B07, 0x00FC8E, - 0x00FC85, 0x010B04, 0x010B0A, 0x010B06, 0x00FC86, 0x0013BD, 0x0013BE, 0x0013BF, - 0x0013B8, 0x0013B9, 0x010B03, 0x0013BA, 0x0013BB, 0x0013B4, 0x0013B5, 0x0013B6, - 0x0013B7, 0x0013B0, 0x0013B1, 0x0013B2, 0x0013B3, 0x00138C, 0x010B09, 0x00FD53, - 0x00FD2C, 0x00FD2D, 0x00FD2E, 0x00FD2F, 0x00FD28, 0x00FD29, 0x00FD2A, 0x00FD2B, - 0x00FD24, 0x00FD25, 0x00FD26, 0x00FD27, 0x00FD20, 0x00FD21, 0x00FD22, 0x00FD23, - 0x010B23, 0x00FD3C, 0x010B33, 0x00106F, 0x00FD38, 0x00FD39, 0x00FD3A, 0x00FD3B, - 0x00FD36, 0x00FD37, 0x00FD31, 0x00FD32, 0x00FD0B, 0x00FD00, 0x00FD01, 0x010B30, - 0x010B31, 0x010B32, 0x010B52, 0x010B34, 0x010B35, 0x010B50, 0x010B51, 0x010B54, - 0x010B58, 0x010B5B, 0x010B5F, 0x010B55, 0x010B0B, 0x00FD02, 0x010B08, 0x00FD03, - 0x010B0D, 0x010B0E, 0x00FD1C, 0x00FD1D, 0x00FD1E, 0x00FD19, 0x00FD1A, 0x00105D, - 0x00105A, 0x00105B, 0x001054, 0x001055, 0x001050, 0x001051, 0x010B0F, 0x001052, - 0x001053, 0x001028, 0x00FDFA, 0x00FDF3, 0x00103F, 0x00FDC4, 0x00FDC5, 0x00FDC6, - 0x00FDC7, 0x00FDC0, 0x00FDC1, 0x010B0C, 0x00FDC2, 0x00100D, 0x00100E, 0x00100F, - 0x001008, 0x010B83, 0x001009, 0x00100A, 0x010B82, 0x00100B, 0x001004, 0x001005, - 0x001006, 0x001007, 0x001000, 0x010B81, 0x001001, 0x001002, 0x001003, 0x010B80, - 0x00101C, 0x010B91, 0x010B90, 0x010B84, 0x010B85, 0x010B86, 0x010B87, 0x010B88, - 0x010B89, 0x010B8A, 0x010B8B, 0x010B8E, 0x010B8D, 0x00FDB3, 0x010B8F, 0x00FD8A, - 0x010BAC, 0x00FD83, 0x00FD9D, 0x00FD9E, 0x010BAE, 0x00FD9F, 0x00FD98, 0x010BA9, - 0x010BAB, 0x010BAF, 0x010BAA, 0x00FD99, 0x010B8C, 0x00FD9A, 0x010BAD, 0x00FD95, - 0x0010C1, 0x0010C2, 0x0010DF, 0x002102, 0x0010D8, 0x00FA43, 0x002107, 0x00FA5C, - 0x00FA5E, 0x00FA5F, 0x00210B, 0x00210A, 0x00210D, 0x00210C, 0x00210F, 0x00210E, - 0x00FA58, 0x00FA59, 0x00FA5A, 0x00FA5B, 0x00FA54, 0x00FA55, 0x00FA56, 0x00FA51, - 0x00FA52, 0x00FA53, 0x00FA2C, 0x00FA2D, 0x00FA2E, 0x00211C, 0x00FA29, 0x00FA2A, - 0x00115D, 0x00115E, 0x00115F, 0x001158, 0x001159, 0x00115A, 0x00115B, 0x001154, - 0x001155, 0x001156, 0x001157, 0x001150, 0x001151, 0x00212C, 0x001152, 0x001153, - 0x002131, 0x002130, 0x002133, 0x002132, 0x002135, 0x002134, 0x002137, 0x002136, - 0x00112C, 0x002138, 0x00112D, 0x00112E, 0x00213D, 0x00112F, 0x00213F, 0x00213E, - 0x001128, 0x001129, 0x00112A, 0x00112B, 0x001124, 0x001125, 0x002147, 0x002146, - 0x001126, 0x001127, 0x001120, 0x002148, 0x00214E, 0x001121, 0x001122, 0x001123, - 0x002151, 0x00113C, 0x002153, 0x002152, 0x002155, 0x002154, 0x00110D, 0x00110E, - 0x00110F, 0x002158, 0x001108, 0x00110B, 0x00215D, 0x00215C, 0x00215F, 0x00215E, - 0x002171, 0x001104, 0x002163, 0x002162, 0x0011B6, 0x002161, 0x0011B3, 0x00119A, - 0x00FB23, 0x00FB3C, 0x00FB3E, 0x00FB38, 0x00FB39, 0x00FB3A, 0x00FB3B, 0x00216C, - 0x00FB34, 0x00FB35, 0x00FB36, 0x00FB30, 0x00FB31, 0x00FB32, 0x00FB33, 0x00FB04, - 0x00FB05, 0x00FB06, 0x00FB00, 0x00FB01, 0x00FB02, 0x00217C, 0x00FB03, 0x00FB1D, - 0x00FB1F, 0x000E44, 0x002183, 0x00FB15, 0x002182, 0x002184, 0x00FB16, 0x002181, - 0x002189, 0x002185, 0x000E41, 0x000E42, 0x002188, 0x000E43, 0x00FB13, 0x002186, - 0x00FBEC, 0x00FBED, 0x00FBEE, 0x00FBE9, 0x00FBEA, 0x00FBF3, 0x000E30, 0x000E32, - 0x000E33, 0x000E0C, 0x00FBD7, 0x000E01, 0x000E02, 0x000E03, 0x00AA67, 0x00AA60, - 0x00AA61, 0x00AA62, 0x00AA63, 0x00AA7E, 0x00AA7F, 0x00AA7A, 0x00FBB0, 0x00AA75, - 0x00AA76, 0x00FB8C, 0x00FB8D, 0x00AA8F, 0x00FB89, 0x00FB8A, 0x00FB8B, 0x00FB84, - 0x00FB98, 0x00FB99, 0x00FB9A, 0x00FB94, 0x000ED4, 0x000ED5, 0x000ED7, 0x000ED0, - 0x000ED1, 0x00AA26, 0x00AA22, 0x00AA23, 0x000EAA, 0x000EAB, 0x000EA5, 0x000EA7, - 0x000EA1, 0x000EA2, 0x00AA8D, 0x000EA3, 0x000EBD, 0x00AA8C, 0x00AA0C, 0x00AA0D, - 0x00AA8E, 0x00AA0E, 0x00AA0F, 0x00AA08, 0x00AA09, 0x00AA0B, 0x00AA06, 0x00AA00, - 0x00AA01, 0x00AA03, 0x00AA1D, 0x00AA1F, 0x00AA18, 0x00AA1A, 0x00AA15, 0x00AA12, - 0x000E9A, 0x000E9B, 0x000E94, 0x000E95, 0x00AAEA, 0x00AAE4, 0x00AAE5, 0x00AAE7, - 0x00AAE0, 0x00AAE1, 0x00AA17, 0x000F6A, 0x000F6B, 0x000F64, 0x000F65, 0x000F66, - 0x000F67, 0x000F60, 0x000F61, 0x000F62, 0x000F63, 0x014645, 0x014646, 0x014640, - 0x014641, 0x014642, 0x014643, 0x000F4C, 0x000F4D, 0x000F4F, 0x00AAC2, 0x000F49, - 0x000F4B, 0x000F44, 0x000F45, 0x000F46, 0x000F47, 0x014609, 0x01460A, 0x014604, - 0x014605, 0x00AA9B, 0x00AA94, 0x00AA95, 0x00AA16, 0x00AA96, 0x00AA97, 0x00AA90, - 0x00AA1E, 0x00AA91, 0x00AA92, 0x00AA93, 0x00AB64, 0x00AB65, 0x00AB60, 0x00AB61, - 0x00AB62, 0x00AB63, 0x00AB7C, 0x00AB7D, 0x00AB7E, 0x00AB7F, 0x00AB78, 0x00AB79, - 0x00AB7A, 0x00AB7B, 0x00AB74, 0x00AB75, 0x00AB76, 0x00AB77, 0x00AB70, 0x00AB71, - 0x00AB72, 0x00AB73, 0x00AB4C, 0x00AB4D, 0x00AB4E, 0x00AB4F, 0x00AB48, 0x00AB49, - 0x00AB4A, 0x00AB4B, 0x00AB44, 0x00AB45, 0x00AB46, 0x00AB47, 0x00AB40, 0x00AB41, - 0x00AB42, 0x00AB43, 0x00AB58, 0x00AB59, 0x00AB5A, 0x00AB54, 0x00AB55, 0x00AB56, - 0x00F964, 0x00F97C, 0x00F944, 0x00F945, 0x00F95C, 0x00F95D, 0x00F95B, 0x00F954, - 0x00F955, 0x00F956, 0x00F957, 0x00F950, 0x00F92C, 0x00F92D, 0x00F929, 0x00F92A, - 0x00F92B, 0x00F924, 0x00AAC0, 0x00F925, 0x00AAE2, 0x00AAE6, 0x00F926, 0x00F927, - 0x00F920, 0x00F921, 0x00F922, 0x00F93B, 0x00F934, 0x00F9BB, 0x00F9B4, 0x00F9B1, - 0x00F9B2, 0x00F9B3, 0x00F98C, 0x00A857, 0x00A851, 0x00A852, 0x00A853, 0x000CAC, - 0x000CAD, 0x000CAA, 0x000CAB, 0x000CA4, 0x000CA5, 0x000CA6, 0x00AADC, 0x000CA7, - 0x000CA0, 0x000CA1, 0x000CBD, 0x00A830, 0x00A831, 0x00A80C, 0x00A80D, 0x00A80E, - 0x000CB1, 0x000C8C, 0x00A807, 0x000C88, 0x00A81E, 0x01447D, 0x014470, 0x014471, - 0x014458, 0x014459, 0x01445B, 0x014454, 0x014455, 0x014456, 0x014457, 0x014450, - 0x014451, 0x01442C, 0x01442D, 0x014408, 0x0144F0, 0x0144F1, 0x00AAE3, 0x0144C6, - 0x0144C7, 0x0144C0, 0x0144C1, 0x0144C2, 0x0144C3, 0x0144DC, 0x0144DD, 0x0144D9, - 0x0144D6, 0x0144D7, 0x0144D3, 0x0144A8, 0x0144A9, 0x0144AA, 0x0144AB, 0x0144A4, - 0x0144A5, 0x0144A6, 0x0144A7, 0x0144A0, 0x00AA1C, 0x0144A1, 0x0144A2, 0x0144A3, - 0x0144BC, 0x0144BD, 0x00AA19, 0x014571, 0x014546, 0x014547, 0x014541, 0x014542, - 0x014543, 0x01455C, 0x01455D, 0x014558, 0x014559, 0x01455A, 0x01455B, 0x014554, - 0x014555, 0x014556, 0x014557, 0x014550, 0x014551, 0x01452C, 0x01452D, 0x014508, - 0x014509, 0x01451A, 0x0145F0, 0x0145F1, 0x0145CE, 0x0145CF, 0x0145C8, 0x0145C9, - 0x0145CA, 0x0145CB, 0x0145C4, 0x0145A6, 0x0145A7, 0x0145A0, 0x0145A1, 0x014588, - 0x01458A, 0x01458B, 0x014586, 0x014587, 0x014580, 0x00A61A, 0x00A61B, 0x00A614, - 0x00A615, 0x00A6E4, 0x000B6A, 0x000B6B, 0x000B66, 0x000B67, 0x000B60, 0x000B61, - 0x00A6CC, 0x00A6CD, 0x00A6CA, 0x00A6C6, 0x00A6C7, 0x00A6C0, 0x00A6C1, 0x00A6C2, - 0x00A6C3, 0x00A6DC, 0x00A6DD, 0x00A6DE, 0x00A6DF, 0x00A6D8, 0x00A6D9, 0x00A6DA, - 0x00A6DB, 0x00A6D4, 0x00A6D5, 0x00A6D0, 0x00A6D2, 0x00A6D3, 0x00A6AC, 0x00A6AD, - 0x00A6AE, 0x00AA02, 0x00A6AF, 0x00A6A8, 0x00A6A9, 0x00A6AA, 0x00A6AB, 0x00A6A4, - 0x00A6A5, 0x00A6A3, 0x00A6B6, 0x00A6B0, 0x00A6B1, 0x00A68C, 0x00A68D, 0x00A68E, - 0x00A68B, 0x00A687, 0x00AAF2, 0x00A680, 0x000B0A, 0x000B0B, 0x000B05, 0x00A69A, - 0x00A69B, 0x00A694, 0x00A695, 0x00A76B, 0x00A764, 0x00A77E, 0x00A77F, 0x00A77A, - 0x00A77B, 0x00A774, 0x00A775, 0x00A776, 0x00A777, 0x00A771, 0x00A772, 0x00A773, - 0x00A74C, 0x00A74D, 0x00A74E, 0x00A74F, 0x00AA07, 0x00A748, 0x00A749, 0x00A745, - 0x00A746, 0x00A747, 0x00A740, 0x00A741, 0x00A742, 0x00A743, 0x00A75C, 0x00A75D, - 0x00A75E, 0x00A75F, 0x00A758, 0x00A759, 0x00A75A, 0x00A75B, 0x00A754, 0x00A755, - 0x00A756, 0x00A757, 0x00A750, 0x00A751, 0x00A752, 0x00A753, 0x00A72C, 0x00A72D, - 0x00A72E, 0x00A72F, 0x00A728, 0x00A729, 0x00A72B, 0x00A724, 0x00A725, 0x00A726, - 0x00A727, 0x000BAE, 0x000BAF, 0x00A73D, 0x00A73F, 0x00A738, 0x00A739, 0x00A73A, - 0x00A73B, 0x00A734, 0x00A736, 0x00A737, 0x00A730, 0x00A731, 0x000BB4, 0x000BB5, - 0x000BB6, 0x000BB7, 0x000BB0, 0x000BB1, 0x000BB2, 0x000BB3, 0x000B8E, 0x000B8F, - 0x000B88, 0x000B89, 0x000B8A, 0x000B85, 0x000B86, 0x000B87, 0x000B83, 0x000B9C, - 0x000B9E, 0x000B9F, 0x000B99, 0x000B9A, 0x000B94, 0x000B95, 0x000B90, 0x000B92, - 0x000B93, 0x000868, 0x000869, 0x00A7FD, 0x000866, 0x000867, 0x000862, 0x000863, - 0x00A7F7, 0x00084C, 0x00084D, 0x00084E, 0x00084F, 0x000848, 0x000849, 0x00084A, - 0x00084B, 0x000844, 0x00AA04, 0x00AA0A, 0x000845, 0x000846, 0x00AA05, 0x000847, - 0x000840, 0x000841, 0x000842, 0x000843, 0x000858, 0x00A7AC, 0x00A7AD, 0x000855, - 0x00A7A6, 0x00A7A7, 0x00A7A0, 0x00A7A1, 0x00A7A2, 0x00A7A3, 0x00A7B4, 0x00A7B5, - 0x00A7B6, 0x00A7B7, 0x00A7B0, 0x00A7B1, 0x00A7B2, 0x00A7B3, 0x00A78C, 0x00A78D, - 0x00A78E, 0x00A78F, 0x00A78B, 0x00A784, 0x00A785, 0x00A796, 0x00A797, 0x00A790, - 0x00A791, 0x00A792, 0x00A793, 0x00A46C, 0x00A46D, 0x00A468, 0x00A469, 0x00A466, - 0x00A467, 0x00A460, 0x00A461, 0x00A462, 0x00A463, 0x00A47C, 0x00A47D, 0x00A47E, - 0x00A47F, 0x00A478, 0x00A479, 0x00A47A, 0x00A47B, 0x00A474, 0x00A475, 0x00A476, - 0x00A477, 0x00A470, 0x00A471, 0x00A472, 0x00A473, 0x00A44C, 0x00A44D, 0x00A44E, - 0x00A44F, 0x00A448, 0x00A449, 0x00A44A, 0x00A44B, 0x00A444, 0x00A445, 0x00A446, - 0x00A447, 0x00A440, 0x00A441, 0x00A442, 0x00A443, 0x00A45C, 0x00A45D, 0x00A45E, - 0x00A45F, 0x00A458, 0x00A459, 0x00A45A, 0x00A45B, 0x00A454, 0x00A455, 0x00A456, - 0x00A457, 0x00A450, 0x00A451, 0x00A452, 0x00A453, 0x00A42C, 0x00A42D, 0x00A42E, - 0x00A42F, 0x00A428, 0x00A429, 0x00A42A, 0x00A42B, 0x00A424, 0x00A425, 0x00A430, - 0x00A431, 0x00A40F, 0x00A406, 0x00A407, 0x00A400, 0x00A401, 0x00A402, 0x00A403, - 0x00A41C, 0x00A41D, 0x00A41E, 0x00A41F, 0x00A418, 0x00A419, 0x00A41A, 0x00A41B, - 0x00A414, 0x00A415, 0x00A416, 0x00A417, 0x00A410, 0x00A411, 0x00A412, 0x00A413, - 0x00A4EC, 0x00A4ED, 0x00A4EE, 0x00A4EF, 0x00A4E8, 0x00A4E9, 0x00A4EA, 0x00A4EB, - 0x00A4E4, 0x00A4E5, 0x00096A, 0x00096B, 0x000966, 0x000967, 0x000960, 0x000961, - 0x00A4F4, 0x00A4F5, 0x00097A, 0x00097B, 0x000974, 0x000975, 0x000976, 0x000977, - 0x000972, 0x000973, 0x00A4DC, 0x00A4DD, 0x00A4DE, 0x00A4DF, 0x00A4D8, 0x00A4D9, - 0x00A4DA, 0x00A4DB, 0x00A4D4, 0x00A4D5, 0x00095A, 0x00095B, 0x000950, 0x00092C, - 0x00092D, 0x00092E, 0x00092F, 0x000928, 0x000929, 0x00092A, 0x00092B, 0x000924, - 0x000925, 0x000926, 0x000927, 0x000920, 0x000921, 0x000922, 0x000923, 0x00093D, - 0x000938, 0x000939, 0x00A48C, 0x000934, 0x000935, 0x00090A, 0x00090B, 0x000904, - 0x000905, 0x000906, 0x000907, 0x00091C, 0x00091D, 0x00091E, 0x00091F, 0x000918, - 0x000919, 0x00A57E, 0x00A57F, 0x00A574, 0x00A575, 0x00A577, 0x00A570, 0x00A571, - 0x00A54C, 0x00A54D, 0x00A544, 0x00A545, 0x00A546, 0x00A547, 0x00A541, 0x00A542, - 0x00A543, 0x00A55C, 0x00A55D, 0x00A55E, 0x00A55F, 0x00A558, 0x00A559, 0x00A55A, - 0x00A55B, 0x002460, 0x00A554, 0x00A555, 0x00A550, 0x002464, 0x002467, 0x00A552, - 0x002469, 0x002468, 0x00246B, 0x00246A, 0x00246D, 0x00246C, 0x00246F, 0x00246E, - 0x00A553, 0x002470, 0x00A52C, 0x00A52D, 0x002475, 0x002474, 0x002477, 0x002476, - 0x002479, 0x002478, 0x00247B, 0x00247A, 0x00247D, 0x00A52E, 0x00247F, 0x00247E, - 0x00A52F, 0x00A528, 0x00A529, 0x00A52A, 0x00A52B, 0x00A524, 0x00A525, 0x00A523, - 0x00A536, 0x00A530, 0x00A531, 0x00A50C, 0x00A50D, 0x00A50E, 0x00A50F, 0x00A50B, - 0x00A505, 0x00A507, 0x00A500, 0x00A51E, 0x00A51B, 0x00A514, 0x00A515, 0x00A5EB, - 0x00A5E4, 0x00A5E6, 0x00A5E7, 0x00A5FC, 0x00A5FD, 0x00A5CA, 0x00A5C6, 0x00A5C7, - 0x00A5C0, 0x00A5C1, 0x00A5DD, 0x00A5DA, 0x00A5D6, 0x00A5D7, 0x00A5D0, 0x00A5D1, - 0x00A5D2, 0x00A5D3, 0x00A5AC, 0x00A5AD, 0x00A5AE, 0x00A5AF, 0x00A5A8, 0x00A5A9, - 0x00A5AA, 0x00A5AB, 0x00A5A4, 0x00A5A5, 0x00A586, 0x00A587, 0x00A580, 0x00A581, - 0x00A582, 0x00A583, 0x00A59C, 0x00A59D, 0x00A59E, 0x00A59F, 0x00A598, 0x00A599, - 0x00A59A, 0x00A59B, 0x00A594, 0x00A595, 0x00A596, 0x00A597, 0x00A590, 0x00A591, - 0x00A592, 0x00A593, 0x00A26C, 0x00A26D, 0x00A26E, 0x00A26F, 0x00A268, 0x00A269, - 0x00A26A, 0x00A26B, 0x00A264, 0x00A265, 0x00A266, 0x00A267, 0x00A262, 0x00A263, - 0x00A27C, 0x00A27D, 0x00A27E, 0x00A27F, 0x00A278, 0x00A279, 0x00A27A, 0x00A27B, - 0x00A274, 0x00A275, 0x00A277, 0x00A270, 0x00A256, 0x00A257, 0x00A250, 0x00A251, - 0x00A252, 0x00A253, 0x00A22C, 0x00A22D, 0x00A22E, 0x0024EC, 0x00A228, 0x00A229, - 0x00A2C6, 0x0024F0, 0x00A2C2, 0x00A2C3, 0x0024F5, 0x0024F4, 0x0024F7, 0x0024F6, - 0x0024F9, 0x0024F8, 0x0024FB, 0x0024FA, 0x0024FD, 0x00A2DC, 0x0024FF, 0x0024FE, - 0x00A2DD, 0x00A2DE, 0x00A2DF, 0x00A2D8, 0x00A2D9, 0x00A2DA, 0x00A2DB, 0x00A2D4, - 0x00A2D5, 0x00A2B6, 0x00A2B7, 0x00A2B0, 0x00A2B1, 0x00A2B2, 0x00A2B3, 0x00A28C, - 0x00A28D, 0x00A28E, 0x00A28F, 0x00A288, 0x00A289, 0x00A28A, 0x00A28B, 0x00A284, - 0x00A285, 0x00A286, 0x00A287, 0x00A280, 0x00A281, 0x00A282, 0x00A283, 0x00A29C, - 0x00A29D, 0x00A29E, 0x00A29F, 0x00A298, 0x00A299, 0x00A29A, 0x00A29B, 0x00A294, - 0x014628, 0x00A295, 0x00A36B, 0x00A366, 0x00A367, 0x00A360, 0x00A361, 0x00A37D, - 0x00A376, 0x00A377, 0x00A370, 0x00A371, 0x00A372, 0x00A373, 0x00A34C, 0x00A34D, - 0x00A34E, 0x00A34F, 0x00A348, 0x00A349, 0x00A34A, 0x00A34B, 0x00A344, 0x00A345, - 0x00A326, 0x00A327, 0x00A320, 0x00A321, 0x00A322, 0x00A323, 0x00A33C, 0x00A33D, - 0x00A338, 0x014629, 0x00A339, 0x00A336, 0x00A337, 0x00A330, 0x00A331, 0x00A332, - 0x00A333, 0x00A30C, 0x00A30D, 0x011005, 0x00A30E, 0x00A30F, 0x011006, 0x011009, - 0x011008, 0x00A308, 0x01100A, 0x01100D, 0x01100C, 0x01100F, 0x01100E, 0x00A309, - 0x00A30A, 0x00A304, 0x00A305, 0x00A002, 0x00A003, 0x00A01E, 0x00A01F, 0x00A018, - 0x00A019, 0x00A014, 0x00A0FA, 0x00A0D6, 0x00A0D7, 0x00A0D0, 0x00A0D1, 0x00A0D2, - 0x00A0D3, 0x00A0AC, 0x00A0AD, 0x00A0A9, 0x00A08A, 0x00A166, 0x00A167, 0x00A160, - 0x00A161, 0x00A17D, 0x00A176, 0x00A177, 0x00A170, 0x00A171, 0x00A172, 0x00A173, - 0x00A14C, 0x011033, 0x00A14D, 0x00A14E, 0x00A14F, 0x00A148, 0x00A149, 0x00A145, - 0x00A146, 0x00A147, 0x00A140, 0x00A141, 0x00A142, 0x00A143, 0x00A15C, 0x00A15D, - 0x00A15E, 0x00A15F, 0x00A158, 0x00A159, 0x00A15A, 0x00A15B, 0x00A154, 0x00A155, - 0x00A126, 0x00A127, 0x00A120, 0x00A121, 0x00A122, 0x00A123, 0x00A13C, 0x00A13D, - 0x00A13E, 0x00A13F, 0x00A138, 0x00A139, 0x00A13A, 0x00A13B, 0x00A134, 0x00A135, - 0x00A136, 0x00A137, 0x00A130, 0x00A131, 0x00A132, 0x00A133, 0x00A10C, 0x00A10D, - 0x00A10E, 0x00A10F, 0x00A108, 0x00A109, 0x00A10A, 0x00A10B, 0x00A104, 0x00A105, - 0x00A106, 0x00A107, 0x00A100, 0x00A101, 0x00A102, 0x00A103, 0x00A11C, 0x00A11D, - 0x00A116, 0x00A117, 0x00A110, 0x00A111, 0x00A112, 0x00A113, 0x00A1EC, 0x00A1ED, - 0x00A1EE, 0x00A1EF, 0x00A1E8, 0x00A1E9, 0x00A1EA, 0x00A1EB, 0x00A1E4, 0x00A1E5, - 0x00021A, 0x00021B, 0x000214, 0x000215, 0x000216, 0x000217, 0x000210, 0x000211, - 0x000212, 0x000213, 0x0002AC, 0x0002AD, 0x0002AE, 0x0002AF, 0x0002A8, 0x0002A9, - 0x0002AA, 0x0002AB, 0x0002A4, 0x0002A5, 0x0002A6, 0x0002A7, 0x0002A0, 0x0002A1, - 0x0002A2, 0x0002A3, 0x00028C, 0x00028D, 0x00028E, 0x00028F, 0x000288, 0x000289, - 0x00028A, 0x00028B, 0x000284, 0x000285, 0x000286, 0x000287, 0x000280, 0x000281, - 0x000282, 0x000283, 0x00029C, 0x00029D, 0x00029E, 0x00029F, 0x000298, 0x000299, - 0x00029A, 0x00029B, 0x000294, 0x000295, 0x000296, 0x000297, 0x000290, 0x000291, - 0x000292, 0x000293, 0x00037C, 0x00037D, 0x00037F, 0x00037B, 0x000376, 0x000377, - 0x000370, 0x000371, 0x000372, 0x000373, 0x01D66C, 0x01D66D, 0x01D66E, 0x01D66F, - 0x01D668, 0x01D669, 0x01D66A, 0x01D66B, 0x01D664, 0x01D665, 0x01D666, 0x01D667, - 0x01D660, 0x01D661, 0x01D662, 0x01D663, 0x01D67C, 0x01D67D, 0x01D67E, 0x01D67F, - 0x01D678, 0x01D679, 0x01D67A, 0x01D67B, 0x01D674, 0x01D675, 0x01D676, 0x01D677, - 0x01D670, 0x01D671, 0x01D654, 0x01D600, 0x01D613, 0x01D6E9, 0x01D6EA, 0x01D6EB, - 0x01D6E5, 0x01D6E6, 0x01D6E7, 0x01D6E0, 0x01D6E1, 0x000395, 0x01D6C6, 0x000063, - 0x01D6C2, 0x01D6C3, 0x01D6DC, 0x01D6DD, 0x01D6D9, 0x000075, 0x000041, 0x01D6A2, - 0x01D6A3, 0x01D6BC, 0x01D6BD, 0x01D6B9, 0x01D6B2, 0x01D6B3, 0x01D68C, 0x01D68D, - 0x01D68E, 0x01D68F, 0x01D688, 0x011105, 0x011104, 0x011107, 0x011106, 0x011109, - 0x011108, 0x01110B, 0x01110A, 0x01110D, 0x01110C, 0x01110F, 0x01110E, 0x01D689, - 0x01D68A, 0x01D68B, 0x01D684, 0x01D685, 0x01D686, 0x01D687, 0x01D680, 0x01D681, - 0x01D682, 0x01D683, 0x01D69C, 0x01D69D, 0x01D698, 0x01D699, 0x01D692, 0x011121, - 0x011120, 0x011123, 0x011122, 0x01D693, 0x01D76C, 0x01D76D, 0x01D76E, 0x01D768, - 0x01D769, 0x01D76A, 0x01D76B, 0x01D764, 0x01D765, 0x01D766, 0x01D767, 0x01D760, - 0x01D761, 0x01D762, 0x01D763, 0x01D77C, 0x01D77D, 0x011137, 0x011136, 0x011139, - 0x011138, 0x01113B, 0x01113A, 0x01113D, 0x01113C, 0x01113F, 0x01113E, 0x01D77E, - 0x01D77F, 0x01D778, 0x01D779, 0x01D77A, 0x01D77B, 0x01D774, 0x01D775, 0x01D776, - 0x01D777, 0x01D770, 0x01D771, 0x0000E9, 0x01D755, 0x01D732, 0x01D733, 0x011151, - 0x011150, 0x01D70C, 0x011152, 0x011155, 0x011154, 0x011157, 0x011156, 0x011159, - 0x011158, 0x01115B, 0x01115A, 0x01115D, 0x01115C, 0x01115F, 0x01115E, 0x01D70D, - 0x01D70E, 0x01D70F, 0x01D709, 0x01D70A, 0x01D70B, 0x01D704, 0x01D705, 0x01D706, - 0x01D707, 0x01D700, 0x01D701, 0x01D71D, 0x01D71E, 0x01D719, 0x01D71A, 0x01D714, - 0x01D716, 0x01D717, 0x01E924, 0x01E925, 0x01D712, 0x01E927, 0x01D713, 0x01D7EC, - 0x01D7ED, 0x01D7EE, 0x01D7EF, 0x01D7E8, 0x01D7E9, 0x01D7EA, 0x01D7EB, 0x01D7E4, - 0x01D7E5, 0x01D7E6, 0x01D7E7, 0x011185, 0x011184, 0x011187, 0x011186, 0x011189, - 0x011188, 0x01118B, 0x01118A, 0x01118D, 0x01118C, 0x01118F, 0x01118E, 0x01D7E0, - 0x01D7E1, 0x01D7E2, 0x01D7E3, 0x01D7FC, 0x01D7FD, 0x01D7FE, 0x01D7FF, 0x01D7F8, - 0x01D7F9, 0x01D7FA, 0x01D7FB, 0x01D7F4, 0x01D7F5, 0x01D7F6, 0x01D7F7, 0x01D7F0, - 0x01D7F1, 0x0111A3, 0x00016E, 0x00016F, 0x00017D, 0x00014B, 0x00012B, 0x0001F7, - 0x01D4F2, 0x01D4F3, 0x01D4CC, 0x01D4CD, 0x01D4CE, 0x01D4CF, 0x01D4C8, 0x01D4C9, - 0x01D4CA, 0x01D4CB, 0x01D4C5, 0x01D4C6, 0x01D4C7, 0x01D4C0, 0x01D4C1, 0x01D4C2, - 0x01D4C3, 0x01D4DC, 0x01D4DD, 0x01D4DE, 0x01D4DF, 0x01D4D8, 0x01D4D9, 0x01D4DA, - 0x01D4DB, 0x01D4D4, 0x01D4D5, 0x01D4D6, 0x01D4D7, 0x01D4D0, 0x01D4D1, 0x01D4D2, - 0x01D4D3, 0x01D4AC, 0x01D4AE, 0x01D4AF, 0x01D4A9, 0x01D4AA, 0x01D4AB, 0x01D4A5, - 0x01D4A6, 0x01D4A2, 0x01D4BD, 0x01D4BE, 0x01D4BF, 0x01D4B8, 0x01D4B9, 0x01D4BB, - 0x01D4B4, 0x01D4B5, 0x01D4B6, 0x01D4B7, 0x01D4B0, 0x01D4B1, 0x01D4B2, 0x01D4B3, - 0x01D48C, 0x01D48D, 0x01D48E, 0x01D48F, 0x01D488, 0x01D489, 0x01D48A, 0x01D48B, - 0x01D484, 0x01D485, 0x01D486, 0x01D487, 0x01D480, 0x01D481, 0x01D482, 0x01D483, - 0x01D49C, 0x01D49E, 0x01D49F, 0x01D498, 0x01D499, 0x01D49A, 0x01D49B, 0x01D494, - 0x01D495, 0x01D496, 0x01D497, 0x01D490, 0x01D491, 0x01D492, 0x01D493, 0x01D56C, - 0x01D56D, 0x01D56E, 0x01D56F, 0x01D568, 0x01D569, 0x01D56A, 0x01D56B, 0x01D564, - 0x01D565, 0x01D566, 0x01D567, 0x01D560, 0x01D561, 0x01D562, 0x01D563, 0x01D57C, - 0x01D57D, 0x01D57E, 0x01D57F, 0x01D578, 0x01D579, 0x01D57A, 0x01D57B, 0x01D574, - 0x01D575, 0x01D576, 0x01D577, 0x01D570, 0x01D571, 0x01D572, 0x01D573, 0x01D54C, - 0x01D54D, 0x01D54E, 0x01D54F, 0x01D54A, 0x01D54B, 0x01D544, 0x002777, 0x002776, - 0x002779, 0x002778, 0x00277B, 0x00277A, 0x00277D, 0x00277C, 0x00277F, 0x00277E, - 0x002781, 0x002780, 0x002783, 0x002782, 0x002785, 0x002784, 0x002787, 0x002786, - 0x002789, 0x002788, 0x00278B, 0x00278A, 0x00278D, 0x01D546, 0x00278F, 0x00278E, - 0x002791, 0x01D540, 0x002793, 0x002792, 0x01D541, 0x01D542, 0x01D543, 0x01D55C, - 0x01D55D, 0x01D55E, 0x01D55F, 0x01D558, 0x01D559, 0x01D55A, 0x01D55B, 0x01D554, - 0x01D555, 0x01D556, 0x01D557, 0x01D550, 0x01D552, 0x01D553, 0x01D52C, 0x01D52D, - 0x01D52E, 0x01D52F, 0x01D528, 0x01D529, 0x01D52A, 0x01D52B, 0x01D524, 0x01D525, - 0x01D526, 0x01D527, 0x01E914, 0x01D520, 0x01D521, 0x01E917, 0x01D522, 0x01D523, - 0x01D53C, 0x01D53D, 0x01D53E, 0x01E91D, 0x01D538, 0x01D539, 0x01D53B, 0x01D534, - 0x01D535, 0x01D536, 0x01D537, 0x01D530, 0x01D531, 0x01D532, 0x01D533, 0x01D50D, - 0x01D50E, 0x01D50F, 0x01D508, 0x01D509, 0x01D50A, 0x01D504, 0x01D505, 0x01D507, - 0x01D500, 0x01D501, 0x01D502, 0x01E935, 0x01D503, 0x01D51C, 0x01D51E, 0x01D51F, - 0x01D518, 0x01D519, 0x01D51A, 0x01D51B, 0x01D514, 0x01D516, 0x01D517, 0x01D510, - 0x01D511, 0x01D512, 0x01D513, 0x01D5EC, 0x01D5ED, 0x01D5EE, 0x01D5EF, 0x01D5E8, - 0x01D5E9, 0x01D5EA, 0x01D5EB, 0x01D5E4, 0x01D5E5, 0x01D5E6, 0x01D5E7, 0x01D5E0, - 0x01D5E1, 0x01D5E2, 0x01D5E3, 0x01D5FC, 0x01D5FD, 0x01D5FE, 0x01D5FF, 0x01D5F8, - 0x01D5F9, 0x01D5FA, 0x01D5FB, 0x01D5F4, 0x01D5F5, 0x01D5F6, 0x01D5F7, 0x01D5F0, - 0x01D5F1, 0x01D5F2, 0x01D5F3, 0x01D5CC, 0x01D5CD, 0x01D5CE, 0x01D5CF, 0x01D5C8, - 0x01D5C9, 0x01D5CA, 0x01D5CB, 0x01D5C4, 0x01D5C5, 0x01D5C6, 0x01D5C7, 0x01D5C0, - 0x01D5C1, 0x01D5C2, 0x01D5C3, 0x01D5DC, 0x01D5DD, 0x01D5DE, 0x01D5DF, 0x01D5D8, - 0x01D5D9, 0x01D5DA, 0x01D5DB, 0x01D5D4, 0x01D5D5, 0x01D5D6, 0x01D5D7, 0x01D5D0, - 0x01D5D1, 0x01D5D2, 0x01D5D3, 0x01D5AC, 0x01D5AD, 0x01D5AE, 0x01D5AF, 0x01D5A8, - 0x01D5A9, 0x01D5AA, 0x01D5AB, 0x01D5A4, 0x01D5A5, 0x01D5A6, 0x01D5A7, 0x01D5A0, - 0x01D5A1, 0x01D5A2, 0x01D5A3, 0x01D5BC, 0x01D5BD, 0x01D5BE, 0x01D5BF, 0x01D5B8, - 0x01D5B9, 0x01D5BA, 0x01D5BB, 0x01D5B4, 0x01D5B5, 0x01D5B6, 0x01D5B7, 0x01D5B0, - 0x01D5B1, 0x01D5B2, 0x01D5B3, 0x01D58C, 0x01D58D, 0x01D58E, 0x01D58F, 0x01D588, - 0x01D589, 0x01D58A, 0x01D58B, 0x01D584, 0x01D585, 0x01E8AF, 0x01D586, 0x01D587, - 0x01D580, 0x01D581, 0x01D582, 0x01D583, 0x01D59C, 0x01D59D, 0x01D59E, 0x01D59F, - 0x01D598, 0x01D599, 0x01D59A, 0x01D59B, 0x01D594, 0x01D595, 0x01D596, 0x01D597, - 0x01D590, 0x01D591, 0x01D592, 0x01D593, 0x01D36C, 0x01D36D, 0x01D36E, 0x01D36F, - 0x01D368, 0x01D369, 0x01D36A, 0x01D36B, 0x01D364, 0x01D365, 0x01D366, 0x01D367, - 0x01D360, 0x01D361, 0x01D362, 0x01D363, 0x01D370, 0x01D371, 0x01342C, 0x01342D, - 0x01342E, 0x013428, 0x013429, 0x01342A, 0x01342B, 0x013424, 0x013425, 0x013426, - 0x013427, 0x013420, 0x013421, 0x013422, 0x013423, 0x01340C, 0x01340D, 0x01340E, - 0x01340F, 0x013408, 0x013409, 0x01340A, 0x01340B, 0x013404, 0x013405, 0x013406, - 0x013407, 0x013400, 0x013401, 0x013402, 0x013403, 0x01341C, 0x01341D, 0x01341E, - 0x01341F, 0x013418, 0x013419, 0x01341A, 0x01341B, 0x013414, 0x013415, 0x013416, - 0x013417, 0x013410, 0x013411, 0x013412, 0x013413, 0x01326C, 0x01326D, 0x01326E, - 0x01326F, 0x013268, 0x013269, 0x01326A, 0x01326B, 0x013264, 0x013265, 0x013266, - 0x013267, 0x013260, 0x013261, 0x013262, 0x013263, 0x01327C, 0x01327D, 0x01327E, - 0x01327F, 0x013278, 0x013279, 0x01327A, 0x01327B, 0x013274, 0x013275, 0x013276, - 0x013277, 0x013270, 0x013271, 0x013272, 0x013273, 0x01324C, 0x01324D, 0x01324E, - 0x01324F, 0x013248, 0x013249, 0x01324A, 0x01324B, 0x013244, 0x013245, 0x013246, - 0x013247, 0x013240, 0x013241, 0x013242, 0x013243, 0x01325C, 0x01325D, 0x01325E, - 0x01325F, 0x013258, 0x013259, 0x01B012, 0x01B013, 0x01325A, 0x01325B, 0x013254, - 0x013255, 0x01B010, 0x01B011, 0x013256, 0x013257, 0x013250, 0x013251, 0x01B016, - 0x01B017, 0x013252, 0x013253, 0x01322C, 0x01322D, 0x01322E, 0x01322F, 0x01B014, - 0x01B015, 0x013228, 0x013229, 0x01322A, 0x01322B, 0x013224, 0x013225, 0x013226, - 0x013227, 0x01B039, 0x01B03E, 0x01B038, 0x01B03F, 0x01B034, 0x01B035, 0x01B024, - 0x01B025, 0x01B02A, 0x01B02B, 0x01B03A, 0x01B03B, 0x01B01C, 0x01B02F, 0x01B03D, - 0x01B02E, 0x01B01A, 0x01B019, 0x01B01B, 0x01B018, 0x01B01E, 0x01B002, 0x01B01F, - 0x01B003, 0x01B000, 0x01B001, 0x01B028, 0x01B029, 0x013220, 0x01B01D, 0x01B006, - 0x01B007, 0x013221, 0x013222, 0x013223, 0x01323C, 0x01323D, 0x01323E, 0x01323F, - 0x013238, 0x013239, 0x01323A, 0x01323B, 0x013234, 0x013235, 0x013236, 0x013237, - 0x013230, 0x013231, 0x013232, 0x01B053, 0x01B052, 0x013233, 0x01320C, 0x01320D, - 0x01320E, 0x01B059, 0x01320F, 0x01B05E, 0x013208, 0x013209, 0x01B05F, 0x01320A, - 0x01320B, 0x01B020, 0x01B021, 0x01B022, 0x01B023, 0x01B065, 0x01B064, 0x01B026, - 0x01B027, 0x01B069, 0x01B068, 0x01B06B, 0x01B06A, 0x01B06D, 0x01B06C, 0x01B06F, - 0x01B06E, 0x013204, 0x013205, 0x013206, 0x013207, 0x013200, 0x013201, 0x013202, - 0x013203, 0x01321C, 0x01321D, 0x01321E, 0x01321F, 0x01B03C, 0x013218, 0x013219, - 0x01321A, 0x01321B, 0x013214, 0x013215, 0x013216, 0x013217, 0x013210, 0x011411, - 0x011410, 0x011413, 0x011412, 0x011415, 0x011414, 0x011417, 0x011416, 0x013211, - 0x013212, 0x01141B, 0x01141A, 0x013213, 0x0132EC, 0x0132ED, 0x0132EE, 0x0132EF, - 0x0132E8, 0x0132E9, 0x0132EA, 0x0132EB, 0x0132E4, 0x0132E5, 0x0132E6, 0x0132E7, - 0x0132E0, 0x0132E1, 0x0132E2, 0x0132E3, 0x0132FC, 0x0132FD, 0x0132FE, 0x0132FF, - 0x0132F8, 0x0132F9, 0x0132FA, 0x0132FB, 0x0132F4, 0x0132F5, 0x0132F6, 0x0132F7, - 0x0132F0, 0x0132F1, 0x0132F2, 0x0132F3, 0x0132CC, 0x0132CD, 0x0132CE, 0x0132CF, - 0x0132C8, 0x0132C9, 0x0132CA, 0x0132CB, 0x0132C4, 0x0132C5, 0x0132C6, 0x0132C7, - 0x0132C0, 0x0132C1, 0x0132C2, 0x0132C3, 0x0132DC, 0x0132DD, 0x0132DE, 0x0132DF, - 0x0132D8, 0x0132D9, 0x0132DA, 0x0132DB, 0x0132D4, 0x0132D5, 0x0132D6, 0x0132D7, - 0x0132D0, 0x0132D1, 0x0132D2, 0x0132D3, 0x0132AC, 0x0132AD, 0x0132AE, 0x0132AF, - 0x0132A8, 0x0132A9, 0x0132AA, 0x0132AB, 0x0132A4, 0x0132A5, 0x0132A6, 0x0132A7, - 0x0132A0, 0x0132A1, 0x0132A2, 0x01B0EE, 0x01B0EF, 0x01B0E5, 0x01B0E4, 0x0132A3, - 0x0132BC, 0x01B0E9, 0x01B0E8, 0x0132BD, 0x0132BE, 0x0132BF, 0x0132B8, 0x01B0EA, - 0x01B0EB, 0x0132B9, 0x0132BA, 0x0132BB, 0x0132B4, 0x0132B5, 0x0132B6, 0x011482, - 0x011483, 0x01B0EC, 0x01B0ED, 0x01149C, 0x01149D, 0x01149E, 0x01149F, 0x011498, - 0x011499, 0x01B101, 0x01B100, 0x01B103, 0x01B102, 0x01149A, 0x01149B, 0x01B107, - 0x01B106, 0x011493, 0x011492, 0x011490, 0x011491, 0x011497, 0x011496, 0x011494, - 0x011495, 0x01B111, 0x01B110, 0x01B113, 0x01B112, 0x01B115, 0x01B114, 0x01B117, - 0x01B116, 0x01B119, 0x01B118, 0x01B11B, 0x01B11A, 0x01B11D, 0x01B11C, 0x011481, - 0x01B11E, 0x011480, 0x01148B, 0x011485, 0x011486, 0x011484, 0x011487, 0x0114A0, - 0x0114A1, 0x0114A2, 0x0114A3, 0x01148C, 0x01148D, 0x01148E, 0x01148F, 0x0114AB, - 0x0114A5, 0x01148A, 0x0114A4, 0x0114A6, 0x011489, 0x0114A7, 0x011488, 0x0114C4, - 0x0132B7, 0x0132B0, 0x0132B1, 0x0114D6, 0x0114D7, 0x0114C7, 0x0114C5, 0x0132B2, - 0x0132B3, 0x01328C, 0x01328D, 0x01328E, 0x01328F, 0x013288, 0x013289, 0x0114D2, - 0x0114D3, 0x0114D0, 0x0114D1, 0x01328A, 0x0114D4, 0x01328B, 0x0114D5, 0x0114D9, - 0x0114D8, 0x013284, 0x013285, 0x013286, 0x013287, 0x013280, 0x013281, 0x013282, - 0x013283, 0x01329C, 0x01329D, 0x01329E, 0x01329F, 0x013298, 0x013299, 0x0114A8, - 0x0114A9, 0x0114AA, 0x01329A, 0x0114AC, 0x0114AD, 0x0114AE, 0x0114AF, 0x01329B, - 0x013294, 0x013295, 0x013296, 0x013297, 0x013290, 0x013291, 0x013292, 0x013293, - 0x01336C, 0x01336D, 0x01336E, 0x01336F, 0x013368, 0x013369, 0x01336A, 0x01336B, - 0x013364, 0x013365, 0x013366, 0x013367, 0x013360, 0x013361, 0x013362, 0x013363, - 0x01337C, 0x01337D, 0x01337E, 0x01337F, 0x013378, 0x013379, 0x01337A, 0x01337B, - 0x013374, 0x013375, 0x013376, 0x013377, 0x013370, 0x013371, 0x013372, 0x013373, - 0x01334C, 0x01334D, 0x01334E, 0x01334F, 0x013348, 0x013349, 0x01334A, 0x01334B, - 0x013344, 0x013345, 0x013346, 0x013347, 0x013340, 0x013341, 0x013342, 0x013343, - 0x01335C, 0x01335D, 0x01335E, 0x01335F, 0x013358, 0x013359, 0x01335A, 0x01335B, - 0x013354, 0x013355, 0x013356, 0x013357, 0x013350, 0x013351, 0x013352, 0x013353, - 0x01332C, 0x01332D, 0x01332E, 0x01332F, 0x013328, 0x013329, 0x01332A, 0x01332B, - 0x013324, 0x013325, 0x013326, 0x013327, 0x013320, 0x013321, 0x013322, 0x013323, - 0x01333C, 0x01333D, 0x01333E, 0x01333F, 0x013338, 0x013339, 0x01333A, 0x01333B, - 0x013334, 0x013335, 0x013336, 0x013337, 0x013330, 0x013331, 0x013332, 0x013333, - 0x01330C, 0x01330D, 0x01330E, 0x01330F, 0x013308, 0x013309, 0x01330A, 0x01330B, - 0x013304, 0x013305, 0x013306, 0x013307, 0x013300, 0x013301, 0x013302, 0x013303, - 0x01331C, 0x01331D, 0x01331E, 0x01331F, 0x013318, 0x013319, 0x01331A, 0x01331B, - 0x013314, 0x013315, 0x013316, 0x013317, 0x013310, 0x013311, 0x013312, 0x013313, - 0x0133EC, 0x0133ED, 0x0133EE, 0x0133EF, 0x0133E8, 0x0133E9, 0x0133EA, 0x011581, - 0x011580, 0x011583, 0x011582, 0x0133EB, 0x011584, 0x011587, 0x011586, 0x011589, - 0x011588, 0x01158B, 0x01158A, 0x01158D, 0x01158C, 0x01158F, 0x01158E, 0x0133E4, - 0x0133E5, 0x0133E6, 0x0133E7, 0x0133E0, 0x0133E1, 0x0133E2, 0x0133E3, 0x011599, - 0x011598, 0x0133FC, 0x0133FD, 0x01159D, 0x01159C, 0x01159F, 0x01159E, 0x0133FE, - 0x0133FF, 0x0133F8, 0x0133F9, 0x0133FA, 0x0133FB, 0x0133F4, 0x0133F5, 0x0133F6, - 0x0133F7, 0x0133F0, 0x0133F1, 0x0133F2, 0x0133F3, 0x0133CC, 0x0133CD, 0x0133CE, - 0x0133CF, 0x0133C8, 0x0133C9, 0x0133CA, 0x0133CB, 0x0133C4, 0x0133C5, 0x0133C6, - 0x0133C7, 0x0133C0, 0x0133C1, 0x0133C2, 0x0133C3, 0x0133DC, 0x0133DD, 0x0133DE, - 0x0133DF, 0x0133D8, 0x0133D9, 0x0133DA, 0x0133DB, 0x0133D4, 0x0133D5, 0x0133D6, - 0x0133D7, 0x0133D0, 0x0133D1, 0x0133D2, 0x0133D3, 0x0133AC, 0x0133AD, 0x0133AE, - 0x0133AF, 0x0133A8, 0x0133A9, 0x0133AA, 0x0133AB, 0x0133A4, 0x0133A5, 0x0133A6, - 0x0133A7, 0x0133A0, 0x0133A1, 0x0133A2, 0x0133A3, 0x0133BC, 0x0133BD, 0x0133BE, - 0x0133BF, 0x0133B8, 0x0133B9, 0x0133BA, 0x0133BB, 0x0133B4, 0x0133B5, 0x0133B6, - 0x0133B7, 0x0133B0, 0x0133B1, 0x0133B2, 0x0133B3, 0x01338C, 0x01338D, 0x01338E, - 0x01338F, 0x013388, 0x013389, 0x01338A, 0x01338B, 0x013384, 0x013385, 0x013386, - 0x013387, 0x013380, 0x013381, 0x013382, 0x013383, 0x01339C, 0x01339D, 0x01339E, - 0x01339F, 0x011603, 0x013398, 0x013399, 0x01339A, 0x01339B, 0x013394, 0x013395, - 0x013396, 0x013397, 0x013390, 0x013391, 0x013392, 0x013393, 0x01306C, 0x011611, - 0x011610, 0x011613, 0x011612, 0x011615, 0x011614, 0x011617, 0x011616, 0x011619, - 0x011618, 0x01161B, 0x01161A, 0x01161D, 0x01161C, 0x01161F, 0x01161E, 0x011621, - 0x011620, 0x01306D, 0x011622, 0x011625, 0x011624, 0x011627, 0x011626, 0x011629, - 0x011628, 0x01162B, 0x01162A, 0x01162D, 0x01162C, 0x01162F, 0x01162E, 0x01306E, - 0x01306F, 0x013068, 0x013069, 0x01306A, 0x01306B, 0x013064, 0x013065, 0x013066, - 0x013067, 0x013060, 0x013061, 0x013062, 0x013063, 0x01307C, 0x01307D, 0x01307E, - 0x01307F, 0x013078, 0x013079, 0x01307A, 0x011644, 0x01307B, 0x013074, 0x013075, - 0x013076, 0x013077, 0x013070, 0x013071, 0x013072, 0x013073, 0x01304C, 0x011651, - 0x011650, 0x011653, 0x011652, 0x011655, 0x011654, 0x011657, 0x011656, 0x011659, - 0x011658, 0x01304D, 0x01304E, 0x01304F, 0x013048, 0x013049, 0x01304A, 0x01304B, - 0x013044, 0x013045, 0x013046, 0x013047, 0x013040, 0x013041, 0x013042, 0x013043, - 0x01305C, 0x01305D, 0x01305E, 0x01305F, 0x013058, 0x013059, 0x01305A, 0x01305B, - 0x013054, 0x013055, 0x013056, 0x013057, 0x013050, 0x013051, 0x013052, 0x013053, - 0x01302C, 0x01302D, 0x01302E, 0x01302F, 0x013028, 0x013029, 0x01302A, 0x01302B, - 0x013024, 0x011683, 0x013025, 0x013026, 0x013027, 0x013020, 0x013021, 0x013022, - 0x013023, 0x01303C, 0x01303D, 0x01303E, 0x01303F, 0x013038, 0x013039, 0x011691, - 0x011690, 0x011693, 0x011692, 0x011695, 0x011694, 0x011697, 0x01303A, 0x011699, - 0x011698, 0x01169B, 0x01169A, 0x01169D, 0x01169C, 0x01169F, 0x01303B, 0x0116A1, - 0x0116A0, 0x013034, 0x0116A2, 0x0116A5, 0x0116A4, 0x0116A7, 0x0116A6, 0x0116A9, - 0x0116A8, 0x013035, 0x0116AA, 0x013036, 0x013037, 0x013030, 0x013031, 0x013032, - 0x013033, 0x01300C, 0x01300D, 0x01300E, 0x01300F, 0x013008, 0x013009, 0x01300A, - 0x01300B, 0x013004, 0x013005, 0x013006, 0x013007, 0x013000, 0x013001, 0x0116C1, - 0x0116C0, 0x0116C3, 0x0116C2, 0x0116C5, 0x0116C4, 0x0116C7, 0x0116C6, 0x0116C9, - 0x0116C8, 0x013002, 0x013003, 0x01301C, 0x01301D, 0x01301E, 0x01301F, 0x013018, - 0x013019, 0x01301A, 0x01301B, 0x013014, 0x013015, 0x013016, 0x013017, 0x013010, - 0x013011, 0x013012, 0x013013, 0x0130EC, 0x0130ED, 0x0130EE, 0x0130EF, 0x0130E8, - 0x0130E9, 0x0130EA, 0x0130EB, 0x0130E4, 0x0130E5, 0x0130E6, 0x0130E7, 0x0130E0, - 0x0130E1, 0x0130E2, 0x0130E3, 0x0130FC, 0x0130FD, 0x0130FE, 0x0130FF, 0x0130F8, - 0x0130F9, 0x0130FA, 0x0130FB, 0x0130F4, 0x0130F5, 0x0130F6, 0x0130F7, 0x0130F0, - 0x0130F1, 0x0130F2, 0x0130F3, 0x0130CC, 0x0130CD, 0x0130CE, 0x0130CF, 0x0130C8, - 0x0130C9, 0x0130CA, 0x0130CB, 0x0130C4, 0x0130C5, 0x0130C6, 0x0130C7, 0x0130C0, - 0x0130C1, 0x0130C2, 0x0130C3, 0x0130DC, 0x0130DD, 0x0130DE, 0x0130DF, 0x0130D8, - 0x0130D9, 0x0130DA, 0x0130DB, 0x0130D4, 0x0130D5, 0x0130D6, 0x0130D7, 0x0130D0, - 0x0130D1, 0x0130D2, 0x0130D3, 0x0130AC, 0x0130AD, 0x0130AE, 0x0130AF, 0x0130A8, - 0x0130A9, 0x0130AA, 0x0130AB, 0x0130A4, 0x0130A5, 0x0130A6, 0x0130A7, 0x0130A0, - 0x0130A1, 0x0130A2, 0x0130A3, 0x0130BC, 0x0130BD, 0x0130BE, 0x0130BF, 0x0130B8, - 0x002C81, 0x002C80, 0x002C83, 0x002C82, 0x002C85, 0x0130B9, 0x002C87, 0x002C86, - 0x002C89, 0x0130BA, 0x0130BB, 0x002C8A, 0x0130B4, 0x0130B5, 0x0130B6, 0x0130B7, - 0x002C91, 0x002C90, 0x002C93, 0x002C92, 0x002C95, 0x002C94, 0x002C97, 0x002C96, - 0x002C99, 0x002C98, 0x002C9B, 0x002C9A, 0x002C9D, 0x002C9C, 0x002C9F, 0x002C9E, - 0x0130B0, 0x0130B1, 0x0130B2, 0x0130B3, 0x01308C, 0x01308D, 0x01308E, 0x01308F, - 0x013088, 0x013089, 0x01308A, 0x01308B, 0x013084, 0x013085, 0x013086, 0x013087, - 0x013080, 0x013081, 0x013082, 0x013083, 0x002CB5, 0x01309C, 0x01309D, 0x01309E, - 0x01309F, 0x013098, 0x013099, 0x01309A, 0x01309B, 0x013094, 0x013095, 0x013096, - 0x013097, 0x013090, 0x013091, 0x013092, 0x013093, 0x01316C, 0x01316D, 0x01316E, - 0x01316F, 0x013168, 0x013169, 0x01316A, 0x01316B, 0x013164, 0x013165, 0x013166, - 0x013167, 0x013160, 0x013161, 0x013162, 0x013163, 0x01317C, 0x01317D, 0x01317E, - 0x01317F, 0x013178, 0x013179, 0x01317A, 0x01317B, 0x013174, 0x013175, 0x013176, - 0x013177, 0x013170, 0x013171, 0x013172, 0x013173, 0x01314C, 0x01314D, 0x01314E, - 0x01314F, 0x013148, 0x013149, 0x01314A, 0x01314B, 0x013144, 0x013145, 0x013146, - 0x013147, 0x013140, 0x013141, 0x013142, 0x013143, 0x01315C, 0x01315D, 0x01315E, - 0x01315F, 0x013158, 0x013159, 0x01315A, 0x01315B, 0x013154, 0x013155, 0x013156, - 0x013157, 0x013150, 0x013151, 0x013152, 0x013153, 0x01312C, 0x01312D, 0x01312E, - 0x01312F, 0x013128, 0x013129, 0x01312A, 0x01312B, 0x002D0C, 0x013124, 0x013125, - 0x002D11, 0x002D10, 0x002D13, 0x002D12, 0x002D15, 0x013126, 0x002D17, 0x002D16, - 0x002D19, 0x013127, 0x002D1B, 0x002D1A, 0x013120, 0x013121, 0x013122, 0x013123, - 0x01313C, 0x01313D, 0x01313E, 0x01313F, 0x013138, 0x013139, 0x01313A, 0x01313B, - 0x013134, 0x013135, 0x013136, 0x013137, 0x013130, 0x013131, 0x013132, 0x013133, - 0x002D31, 0x002D30, 0x002D33, 0x002D32, 0x002D35, 0x01310C, 0x002D37, 0x002D36, - 0x002D39, 0x01310D, 0x01310E, 0x002D3A, 0x01310F, 0x013108, 0x013109, 0x01310A, - 0x002D41, 0x002D40, 0x002D43, 0x002D42, 0x002D45, 0x002D44, 0x002D47, 0x002D46, - 0x002D49, 0x002D48, 0x002D4B, 0x002D4A, 0x002D4D, 0x002D4C, 0x002D4F, 0x002D4E, - 0x01310B, 0x013104, 0x013105, 0x013106, 0x013107, 0x013100, 0x013101, 0x013102, - 0x013103, 0x01311C, 0x01311D, 0x01311E, 0x01311F, 0x002D5C, 0x013118, 0x013119, - 0x01311A, 0x01311B, 0x013114, 0x013115, 0x013116, 0x013117, 0x013110, 0x013111, - 0x013112, 0x013113, 0x0131EC, 0x0131ED, 0x0131EE, 0x0131EF, 0x0131E8, 0x0131E9, - 0x0131EA, 0x0131EB, 0x0131E4, 0x0131E5, 0x0131E6, 0x0131E7, 0x0131E0, 0x0131E1, - 0x0131E2, 0x0131E3, 0x0131FC, 0x0131FD, 0x0131FE, 0x0131FF, 0x0131F8, 0x0131F9, - 0x0131FA, 0x0131FB, 0x0131F4, 0x0131F5, 0x0131F6, 0x0131F7, 0x0131F0, 0x0131F1, - 0x0131F2, 0x0131F3, 0x0131CC, 0x0131CD, 0x0131CE, 0x0131CF, 0x0131C8, 0x0131C9, - 0x0131CA, 0x0131CB, 0x0131C4, 0x0131C5, 0x0131C6, 0x0131C7, 0x0131C0, 0x0131C1, - 0x0131C2, 0x0131C3, 0x0131DC, 0x0131DD, 0x0131DE, 0x0131DF, 0x0131D8, 0x0131D9, - 0x0131DA, 0x0131DB, 0x0131D4, 0x0131D5, 0x0131D6, 0x0131D7, 0x0131D0, 0x0131D1, - 0x0131D2, 0x0131D3, 0x0131AC, 0x0131AD, 0x0131AE, 0x0131AF, 0x0131A8, 0x0131A9, - 0x0131AA, 0x0131AB, 0x0131A4, 0x0131A5, 0x0131A6, 0x0131A7, 0x0131A0, 0x0131A1, - 0x0131A2, 0x0131A3, 0x0131BC, 0x0131BD, 0x0131BE, 0x0131BF, 0x0131B8, 0x0131B9, - 0x002DC1, 0x002DC0, 0x002DC3, 0x002DC2, 0x002DC5, 0x002DC4, 0x0131BA, 0x002DC6, - 0x002DC9, 0x002DC8, 0x002DCB, 0x002DCA, 0x002DCD, 0x002DCC, 0x0131BB, 0x002DCE, - 0x0131B4, 0x0131B5, 0x0131B6, 0x0131B7, 0x0131B0, 0x0131B1, 0x0131B2, 0x0131B3, - 0x01318C, 0x01318D, 0x01318E, 0x01318F, 0x013188, 0x002DDC, 0x013189, 0x01318A, - 0x01318B, 0x013184, 0x013185, 0x013186, 0x013187, 0x013180, 0x013181, 0x013182, - 0x013183, 0x01319C, 0x01319D, 0x01319E, 0x01319F, 0x013198, 0x013199, 0x01319A, - 0x01319B, 0x013194, 0x013195, 0x013196, 0x013197, 0x013190, 0x013191, 0x013192, - 0x013193, 0x02FA0C, 0x02FA0D, 0x02FA0E, 0x02FA0F, 0x02FA08, 0x02FA09, 0x02FA0A, - 0x02FA0B, 0x02FA04, 0x02FA05, 0x02FA06, 0x02FA07, 0x02FA00, 0x02FA01, 0x02FA02, - 0x02FA03, 0x02FA1C, 0x02FA1D, 0x02FA18, 0x02FA19, 0x02FA1A, 0x02FA1B, 0x02FA14, - 0x02FA15, 0x02FA16, 0x02FA17, 0x02FA10, 0x02FA11, 0x02FA12, 0x02FA13, 0x01246C, - 0x01246D, 0x01246E, 0x012468, 0x012469, 0x01246A, 0x01246B, 0x012464, 0x012465, - 0x012466, 0x012467, 0x012460, 0x012461, 0x012462, 0x012463, 0x01244C, 0x01244D, - 0x01244E, 0x01244F, 0x012448, 0x012449, 0x01244A, 0x01244B, 0x012444, 0x012445, - 0x012446, 0x012447, 0x012440, 0x012441, 0x012442, 0x012443, 0x01245C, 0x01245D, - 0x01245E, 0x01245F, 0x012458, 0x012459, 0x01245A, 0x01245B, 0x012454, 0x012455, - 0x012456, 0x012457, 0x012450, 0x012451, 0x012452, 0x012453, 0x01242C, 0x01242D, - 0x01242E, 0x01242F, 0x012428, 0x012429, 0x01242A, 0x01242B, 0x012424, 0x012425, - 0x012426, 0x012427, 0x012420, 0x012421, 0x012422, 0x012423, 0x01243C, 0x01243D, - 0x01243E, 0x01243F, 0x012438, 0x012439, 0x01243A, 0x01243B, 0x012434, 0x012435, - 0x012436, 0x012437, 0x012430, 0x012431, 0x012432, 0x012433, 0x01240C, 0x01240D, - 0x01240E, 0x01240F, 0x012408, 0x012409, 0x01240A, 0x01240B, 0x012404, 0x012405, - 0x012406, 0x012407, 0x012400, 0x012401, 0x012402, 0x012403, 0x01241C, 0x01241D, - 0x01241E, 0x01241F, 0x012418, 0x012419, 0x01241A, 0x01241B, 0x012414, 0x012415, - 0x012416, 0x012417, 0x012410, 0x012411, 0x012412, 0x012413, 0x0124EC, 0x0124ED, - 0x0124EE, 0x0124EF, 0x0124E8, 0x0124E9, 0x0124EA, 0x0124EB, 0x0124E4, 0x0124E5, - 0x0124E6, 0x0124E7, 0x0124E0, 0x0124E1, 0x0124E2, 0x0124E3, 0x0124FC, 0x0124FD, - 0x0124FE, 0x0124FF, 0x0124F8, 0x0124F9, 0x0124FA, 0x0124FB, 0x0124F4, 0x0124F5, - 0x0124F6, 0x0124F7, 0x0124F0, 0x0124F1, 0x0124F2, 0x0124F3, 0x0124CC, 0x0124CD, - 0x0124CE, 0x0124CF, 0x0124C8, 0x0124C9, 0x0124CA, 0x0124CB, 0x0124C4, 0x0124C5, - 0x0124C6, 0x0124C7, 0x0124C0, 0x0124C1, 0x0124C2, 0x0124C3, 0x0124DC, 0x0124DD, - 0x0124DE, 0x0124DF, 0x0124D8, 0x0124D9, 0x0124DA, 0x0124DB, 0x0124D4, 0x0124D5, - 0x0124D6, 0x0124D7, 0x0124D0, 0x0124D1, 0x0124D2, 0x0124D3, 0x0124AC, 0x0124AD, - 0x0124AE, 0x0124AF, 0x0124A8, 0x0124A9, 0x0124AA, 0x0124AB, 0x0124A4, 0x0124A5, - 0x0124A6, 0x0124A7, 0x0124A0, 0x0124A1, 0x0124A2, 0x0124A3, 0x0124BC, 0x0124BD, - 0x0124BE, 0x0124BF, 0x0124B8, 0x0124B9, 0x0124BA, 0x0124BB, 0x0124B4, 0x0124B5, - 0x0124B6, 0x0124B7, 0x0124B0, 0x0124B1, 0x0124B2, 0x0124B3, 0x01248C, 0x01248D, - 0x01248E, 0x01248F, 0x012488, 0x012489, 0x01248A, 0x01248B, 0x012484, 0x012485, - 0x012486, 0x012487, 0x012480, 0x012481, 0x012482, 0x012483, 0x01249C, 0x01249D, - 0x01249E, 0x01249F, 0x012498, 0x012499, 0x01249A, 0x01249B, 0x012494, 0x012495, - 0x012496, 0x012497, 0x012490, 0x012491, 0x012492, 0x012493, 0x012540, 0x012541, - 0x012542, 0x012543, 0x01252C, 0x01252D, 0x01252E, 0x01252F, 0x012528, 0x012539, - 0x01253A, 0x01253B, 0x012534, 0x02F84F, 0x016801, 0x016800, 0x016803, 0x016802, - 0x016805, 0x016804, 0x016807, 0x016806, 0x016809, 0x016808, 0x01680B, 0x01680A, - 0x01680D, 0x01680C, 0x01680F, 0x01680E, 0x016811, 0x016810, 0x016813, 0x016812, - 0x016815, 0x016814, 0x016817, 0x016816, 0x016819, 0x016818, 0x01681B, 0x01681A, - 0x01681D, 0x016849, 0x01681F, 0x01681E, 0x016821, 0x016820, 0x016823, 0x016822, - 0x016825, 0x016824, 0x016827, 0x016826, 0x016829, 0x016828, 0x01682B, 0x01682A, - 0x01682D, 0x01682C, 0x01682F, 0x01682E, 0x016831, 0x016862, 0x016833, 0x016832, - 0x016835, 0x016842, 0x016837, 0x01686B, 0x01687D, 0x016838, 0x01684E, 0x01684D, - 0x01683D, 0x01683C, 0x01683F, 0x01683E, 0x011A00, 0x016840, 0x01681C, 0x01685E, - 0x016843, 0x011A0B, 0x016844, 0x011A0E, 0x011A0F, 0x01684B, 0x01685F, 0x011A11, - 0x011A10, 0x011A13, 0x011A12, 0x011A15, 0x011A1B, 0x011A17, 0x016857, 0x016852, - 0x011A14, 0x011A18, 0x01686F, 0x016855, 0x01685D, 0x011A16, 0x011A1A, 0x016853, - 0x016851, 0x011A32, 0x016850, 0x01684F, 0x01685C, 0x011A22, 0x011A23, 0x01683A, - 0x01686D, 0x016834, 0x016860, 0x011A24, 0x011A2B, 0x016861, 0x01687C, 0x011A21, - 0x011A27, 0x011A1C, 0x011A3A, 0x01687E, 0x011A0D, 0x011A1E, 0x01684A, 0x01685B, - 0x011A19, 0x016854, 0x016856, 0x016859, 0x011A1D, 0x011A1F, 0x01685A, 0x01687F, - 0x016878, 0x016836, 0x016877, 0x016830, 0x011A31, 0x011A30, 0x016883, 0x016882, - 0x016881, 0x016886, 0x016885, 0x016880, 0x016884, 0x01688D, 0x01687A, 0x01687B, - 0x01689C, 0x01688C, 0x01688F, 0x01688E, 0x016892, 0x016895, 0x016893, 0x011A0C, - 0x011A50, 0x016896, 0x016897, 0x016891, 0x016890, 0x01689D, 0x016899, 0x016894, - 0x016898, 0x01689E, 0x01689F, 0x01689A, 0x011A20, 0x01686E, 0x011A5D, 0x011A5C, - 0x016875, 0x011A5E, 0x011A5F, 0x016874, 0x0168B8, 0x0168B9, 0x016839, 0x011A71, - 0x011A73, 0x011A2E, 0x011A72, 0x011A70, 0x0168B1, 0x011A25, 0x0168B3, 0x0168B2, - 0x0168B5, 0x0168B4, 0x0168B7, 0x0168B6, 0x0168B0, 0x0168BA, 0x0168BB, 0x011A81, - 0x011A80, 0x011A83, 0x011A82, 0x01686C, 0x0168C5, 0x011A87, 0x0168C1, 0x011A89, - 0x016871, 0x0168C4, 0x0168C7, 0x0168C6, 0x011A88, 0x011A86, 0x0168C2, 0x0168C3, - 0x0168C0, 0x0168E4, 0x01684C, 0x016870, 0x0168C8, 0x016858, 0x016848, 0x016841, - 0x011AC7, 0x016845, 0x016846, 0x016847, 0x0168C9, 0x0168D8, 0x0168CA, 0x0168CB, - 0x0168DD, 0x0168DC, 0x0168DF, 0x0168DE, 0x0168E5, 0x016872, 0x0168E6, 0x0168E7, - 0x0168E0, 0x0168E1, 0x0168E2, 0x0168E3, 0x016876, 0x0168E8, 0x0168EC, 0x0168ED, - 0x0168EE, 0x0168EF, 0x0168EA, 0x0168EB, 0x016864, 0x0168E9, 0x016867, 0x011A76, - 0x0168FC, 0x0168FD, 0x011A2F, 0x016873, 0x0168FE, 0x0168FF, 0x011A2A, 0x011AC1, - 0x011AC0, 0x011AC3, 0x011AC2, 0x011AC5, 0x011AC4, 0x011A77, 0x011AC6, 0x011AC9, - 0x011AC8, 0x011ACB, 0x011ACA, 0x011ACD, 0x011ACC, 0x011ACF, 0x011ACE, 0x011AD2, - 0x011AD7, 0x011AD3, 0x011AD1, 0x011AD5, 0x011AD4, 0x011AD0, 0x011AD6, 0x011AD9, - 0x011AD8, 0x011ADB, 0x011ADA, 0x011ADD, 0x011ADC, 0x011ADF, 0x011ADE, 0x011AE1, - 0x011AE0, 0x011AE3, 0x011AE2, 0x011AE5, 0x011AE4, 0x011AE7, 0x011AE6, 0x011AE9, - 0x011AE8, 0x011AEB, 0x011AEA, 0x011AED, 0x011AEC, 0x011AEF, 0x011AEE, 0x011AF1, - 0x011AF0, 0x011AF3, 0x011AF2, 0x011AF5, 0x011AF4, 0x011AF7, 0x011AF6, 0x003043, - 0x011AF8, 0x003041, 0x003042, 0x003045, 0x003048, 0x003082, 0x003046, 0x003047, - 0x003022, 0x003021, 0x003023, 0x003080, 0x003044, 0x00304D, 0x003057, 0x003056, - 0x00304F, 0x003038, 0x003007, 0x00304B, 0x003055, 0x00305C, 0x00304A, 0x003049, - 0x003066, 0x003065, 0x00304E, 0x003061, 0x003067, 0x00305D, 0x003006, 0x00305E, - 0x003059, 0x0030A7, 0x003058, 0x003039, 0x00304C, 0x00316D, 0x00305F, 0x011A2C, - 0x003072, 0x003073, 0x011A26, 0x00303A, 0x016961, 0x016960, 0x003054, 0x011A29, - 0x00305B, 0x016869, 0x016863, 0x016866, 0x00305A, 0x01696D, 0x003071, 0x00303C, - 0x01696E, 0x01696C, 0x01696F, 0x003092, 0x00111E, 0x00111F, 0x003090, 0x011A28, - 0x003081, 0x016865, 0x001118, 0x001119, 0x011A2D, 0x016879, 0x01686A, 0x011A6F, - 0x00111A, 0x01697F, 0x003094, 0x01697E, 0x011A7D, 0x011A7C, 0x001115, 0x003093, - 0x011A79, 0x011A7A, 0x00111B, 0x011A78, 0x011A7E, 0x003095, 0x011A7F, 0x011A7B, - 0x011A6C, 0x001101, 0x0030A3, 0x0030A2, 0x001133, 0x0030A1, 0x001106, 0x001107, - 0x0030B8, 0x0030B9, 0x00110A, 0x011A6E, 0x001105, 0x00111D, 0x011A63, 0x011A62, - 0x0030BA, 0x0030B5, 0x0030BD, 0x0030BF, 0x00308E, 0x0030B4, 0x0030B7, 0x0030B6, - 0x0030BB, 0x00308D, 0x003083, 0x00308F, 0x003088, 0x011A74, 0x0030BC, 0x0030BE, - 0x011A61, 0x011A60, 0x001142, 0x00309F, 0x011A66, 0x003096, 0x011A67, 0x011A68, - 0x011A6B, 0x011A6A, 0x011A69, 0x011A75, 0x011A65, 0x011A64, 0x011A6D, 0x001109, - 0x001140, 0x001141, 0x001144, 0x001143, 0x003091, 0x001145, 0x001146, 0x001147, - 0x001138, 0x001149, 0x00113A, 0x00114B, 0x00115C, 0x00113D, 0x00113E, 0x00113F, - 0x0011EC, 0x001139, 0x001134, 0x00113B, 0x003064, 0x0011ED, 0x0011EE, 0x0011EF, - 0x003068, 0x003069, 0x00306A, 0x00306B, 0x00306C, 0x0011E9, 0x0011EA, 0x0011E8, - 0x003070, 0x001131, 0x001132, 0x001137, 0x003074, 0x003075, 0x003076, 0x003077, - 0x003078, 0x003079, 0x00307A, 0x001135, 0x001136, 0x00307D, 0x00307E, 0x00307F, - 0x0011E5, 0x003176, 0x0011E4, 0x0011EB, 0x003105, 0x00311D, 0x003107, 0x003106, - 0x003109, 0x003108, 0x00310B, 0x00310A, 0x00310D, 0x00310C, 0x00310F, 0x00310E, - 0x003114, 0x003115, 0x003116, 0x003117, 0x003112, 0x003113, 0x003162, 0x003161, - 0x003110, 0x003111, 0x00311E, 0x00311F, 0x003119, 0x00311C, 0x00311A, 0x00311B, - 0x003121, 0x003120, 0x003123, 0x003122, 0x003125, 0x016A2D, 0x003127, 0x003126, - 0x003129, 0x00317D, 0x00312B, 0x0011E6, 0x016A28, 0x00312C, 0x016A2F, 0x0011E7, - 0x003131, 0x003118, 0x003133, 0x003132, 0x003135, 0x003134, 0x003137, 0x003136, - 0x003139, 0x003138, 0x00313B, 0x00313A, 0x00313D, 0x00313C, 0x00313F, 0x00313E, - 0x003141, 0x003140, 0x003143, 0x003142, 0x016A54, 0x0011E2, 0x00317E, 0x003146, - 0x003145, 0x016A55, 0x003144, 0x003149, 0x003170, 0x0011E1, 0x00314B, 0x003147, - 0x003151, 0x003150, 0x003153, 0x003152, 0x003155, 0x003154, 0x003157, 0x003156, - 0x003159, 0x003158, 0x00315B, 0x00315A, 0x00315D, 0x00315C, 0x00315F, 0x00315E, - 0x011C52, 0x00312A, 0x00316B, 0x00314D, 0x016A57, 0x011C1B, 0x003173, 0x00314F, - 0x00316C, 0x003148, 0x00314A, 0x003124, 0x011C1A, 0x011C51, 0x00314E, 0x003172, - 0x003177, 0x016A50, 0x011C13, 0x003163, 0x003171, 0x003174, 0x011C12, 0x00312E, - 0x011C57, 0x003128, 0x003178, 0x011C10, 0x011C15, 0x00317F, 0x016A52, 0x011C50, - 0x003182, 0x003180, 0x003183, 0x003185, 0x003186, 0x003181, 0x003187, 0x003188, - 0x00318C, 0x00318A, 0x00318B, 0x00318E, 0x003184, 0x003189, 0x00318D, 0x0030A4, - 0x0030AC, 0x003193, 0x011C40, 0x003192, 0x003195, 0x003194, 0x0030AE, 0x0030AD, - 0x0030A8, 0x016A58, 0x0030AA, 0x0030AB, 0x0030AF, 0x0030A9, 0x00316E, 0x00316F, - 0x0031B0, 0x0031A0, 0x0031A3, 0x0031A2, 0x0031A5, 0x0031A1, 0x0031A7, 0x0031A6, - 0x0031A9, 0x0031A8, 0x0031AB, 0x0031AA, 0x0031A4, 0x0031AE, 0x0031AF, 0x0030A6, - 0x0031B5, 0x0031B2, 0x0031B3, 0x0031B4, 0x0031B8, 0x0031B1, 0x0031B7, 0x0031B6, - 0x003169, 0x0031BA, 0x0031B9, 0x003168, 0x0031AC, 0x0031AD, 0x00312D, 0x0030A5, - 0x0030D0, 0x016A5C, 0x0030D2, 0x0030D1, 0x0030D7, 0x00314C, 0x0030D4, 0x011C18, - 0x0030DA, 0x0030D9, 0x011C1F, 0x0030DB, 0x0030DE, 0x016A2E, 0x0030D6, 0x0030D5, - 0x003165, 0x0030D3, 0x016A2C, 0x011C1D, 0x011C17, 0x011C11, 0x016A56, 0x016A5A, - 0x011C82, 0x011C83, 0x011C73, 0x003164, 0x011C19, 0x0011FD, 0x0011E3, 0x011C80, - 0x0030DD, 0x016ADD, 0x003160, 0x003167, 0x0031FC, 0x016AD8, 0x00317C, 0x003175, - 0x016ADF, 0x003179, 0x00317A, 0x00317B, 0x0031FD, 0x0030DF, 0x0031FE, 0x0031FF, - 0x0031F1, 0x0031F0, 0x0031F3, 0x0031F2, 0x00316A, 0x003166, 0x0031F5, 0x0030D8, - 0x0031F4, 0x0031F8, 0x0031FB, 0x0031FA, 0x0031F9, 0x011C81, 0x0031F6, 0x0031F7, - 0x016ADC, 0x011C16, 0x011C14, 0x016A68, 0x011C0B, 0x016ADE, 0x011C87, 0x011C1C, - 0x011C04, 0x011C06, 0x016A51, 0x016A53, 0x011C05, 0x011C1E, 0x016A42, 0x016A5B, - 0x016A41, 0x016A59, 0x016A40, 0x016A43, 0x016B26, 0x016B6F, 0x016B20, 0x011C54, - 0x016B27, 0x003285, 0x016A44, 0x0010B5, 0x011C55, 0x011C56, 0x003286, 0x003287, - 0x003288, 0x0010B7, 0x003284, 0x011C53, 0x016A45, 0x016B29, 0x016A49, 0x016B2A, - 0x016B25, 0x016A47, 0x016B24, 0x0010B6, 0x016A5D, 0x011C03, 0x016B2B, 0x016A5E, - 0x0010B0, 0x011C58, 0x016A4B, 0x003289, 0x016A62, 0x016A63, 0x016B23, 0x016B22, - 0x016B65, 0x016B2D, 0x016B2E, 0x016B64, 0x016B21, 0x016B28, 0x016B6B, 0x016B2F, - 0x016A4A, 0x016B69, 0x016A60, 0x016A61, 0x0032BC, 0x011C07, 0x011C5F, 0x0010BA, - 0x0010BB, 0x016A65, 0x016A66, 0x016A67, 0x011C5B, 0x016A69, 0x016B2C, 0x011D02, - 0x011D17, 0x016B8C, 0x011D01, 0x011D1C, 0x016B50, 0x016B59, 0x016B56, 0x016B55, - 0x011D1E, 0x011D1A, 0x011D1B, 0x016B57, 0x011D19, 0x011D18, 0x011D00, 0x016B08, - 0x016B5B, 0x011D13, 0x016B13, 0x016B06, 0x016B54, 0x011D12, 0x016B5D, 0x011D10, - 0x011D11, 0x011D14, 0x011D1F, 0x016B05, 0x011D15, 0x011D16, 0x016B52, 0x016B53, - 0x016B5E, 0x016B5F, 0x011D03, 0x016B51, 0x011D21, 0x011D22, 0x016B60, 0x011D29, - 0x011D2B, 0x016B04, 0x011D20, 0x016B66, 0x016B6A, 0x011D26, 0x011D2D, 0x016B63, - 0x011D1D, 0x011D30, 0x016B68, 0x011D24, 0x016B73, 0x016B61, 0x016B12, 0x016B67, - 0x016B72, 0x016B71, 0x016B7D, 0x011D52, 0x016B58, 0x011D2A, 0x016B7E, 0x016B7F, - 0x016B0E, 0x016B0D, 0x016B0F, 0x011C01, 0x011C00, 0x016B80, 0x016B83, 0x016B82, - 0x016B87, 0x016B81, 0x016B89, 0x016B8B, 0x011C0F, 0x016B8D, 0x016B88, 0x016B8A, - 0x016B86, 0x001080, 0x016B8F, 0x016B8E, 0x011D53, 0x001011, 0x011C0C, 0x011C0A, - 0x016B84, 0x016B85, 0x011C0E, 0x0010A3, 0x011C08, 0x0010EC, 0x0010B4, 0x0010A0, - 0x0010A4, 0x0010A2, 0x0032B1, 0x011C26, 0x011C2B, 0x001013, 0x011C25, 0x011D2C, - 0x011D28, 0x011C24, 0x011C0D, 0x011D2F, 0x001012, 0x0010BC, 0x011D2E, 0x0010A6, - 0x003283, 0x0010C4, 0x001010, 0x0010C3, 0x0010C5, 0x0010C7, 0x0010D3, 0x011C28, - 0x011C29, 0x011C2A, 0x0010ED, 0x011C2C, 0x0010CD, 0x003282, 0x001098, 0x001017, - 0x001096, 0x001095, 0x001094, 0x011D04, 0x011D05, 0x011D06, 0x001097, 0x011D08, - 0x011D09, 0x001099, 0x011D0B, 0x011D0C, 0x011D0D, 0x011D0E, 0x011D0F, 0x0010DC, - 0x0010D2, 0x003281, 0x0010E1, 0x0010E3, 0x0010E6, 0x0010E7, 0x0010D1, 0x0010E0, - 0x0010E8, 0x0010E9, 0x0010EA, 0x0010EB, 0x0010E5, 0x0010FD, 0x0010E4, 0x0010EF, - 0x016B5C, 0x0010F0, 0x011D23, 0x0010F2, 0x0010F5, 0x0010F1, 0x0010F7, 0x0010F4, - 0x0010F8, 0x0010EE, 0x0010FA, 0x0010F9, 0x0010FF, 0x0010FE, 0x003280, 0x0010F6, - 0x016B6C, 0x016B6D, 0x016B6E, 0x001022, 0x016B70, 0x001020, 0x001026, 0x001027, - 0x016B74, 0x016B75, 0x016B76, 0x016B77, 0x00100C, 0x001025, 0x001024, 0x001029, - 0x001310, 0x001315, 0x001312, 0x001313, 0x001014, 0x001015, 0x001016, 0x00101D, - 0x001018, 0x001019, 0x00101A, 0x00101B, 0x00102A, 0x00101F, 0x00101E, 0x011D50, - 0x011D51, 0x001163, 0x001162, 0x00117D, 0x001167, 0x001161, 0x011D57, 0x00117E, - 0x001178, 0x001160, 0x001179, 0x00117A, 0x001168, 0x00117F, 0x001166, 0x00116A, - 0x00116C, 0x001021, 0x00116E, 0x001023, 0x001174, 0x001165, 0x001164, 0x00116D, - 0x00117B, 0x001170, 0x001169, 0x00116B, 0x00117C, 0x001175, 0x001176, 0x00116F, - 0x001040, 0x001041, 0x001042, 0x001043, 0x001047, 0x00114D, 0x00114E, 0x00114F, - 0x001049, 0x001044, 0x00114A, 0x001302, 0x001045, 0x001148, 0x00114C, 0x001046, - 0x001318, 0x001304, 0x001303, 0x001334, 0x001314, 0x00131C, 0x001306, 0x001301, - 0x001048, 0x001319, 0x00131A, 0x00131B, 0x00105C, 0x00131D, 0x00131E, 0x00131F, - 0x001172, 0x001061, 0x00133C, 0x001332, 0x001065, 0x001333, 0x001177, 0x001066, - 0x001331, 0x00130C, 0x001352, 0x001353, 0x001330, 0x001351, 0x00106E, 0x001337, - 0x001070, 0x001171, 0x001300, 0x001173, 0x001324, 0x001075, 0x001076, 0x001077, - 0x00107C, 0x001079, 0x00107A, 0x00107B, 0x001078, 0x00107D, 0x00107E, 0x00107F, - 0x001380, 0x001381, 0x001382, 0x001383, 0x001384, 0x001385, 0x001386, 0x001387, - 0x001388, 0x001389, 0x00138A, 0x00138B, 0x0013E9, 0x00138D, 0x00138E, 0x00138F, - 0x001308, 0x001309, 0x00130E, 0x00130D, 0x00130F, 0x001305, 0x001336, 0x001307, - 0x0013E8, 0x0013ED, 0x00130A, 0x00130B, 0x0013EC, 0x0013AD, 0x0013EE, 0x0013EF, - 0x0013A0, 0x0010A1, 0x0013A2, 0x0013A3, 0x0013A1, 0x0010A5, 0x0013A4, 0x0010A7, - 0x0010A8, 0x0010A9, 0x0010AA, 0x0010AB, 0x0010AC, 0x0010AD, 0x0010AE, 0x0010AF, - 0x0013A8, 0x0013A9, 0x0013AE, 0x0013AF, 0x0013AC, 0x0013A5, 0x0013A6, 0x0013A7, - 0x0010B8, 0x0010B9, 0x0013AA, 0x0013AB, 0x0013BC, 0x0010BD, 0x0010BE, 0x0010BF, - 0x0013C1, 0x0013C2, 0x0013C3, 0x0013D6, 0x0013C5, 0x0013D5, 0x0013C7, 0x0013D7, - 0x0013D8, 0x0013D9, 0x0013C0, 0x0013DB, 0x0013C6, 0x0013DD, 0x0013DA, 0x0013DF, - 0x0010D0, 0x0013D4, 0x0013D3, 0x0013DC, 0x0010D4, 0x0010D5, 0x0010D6, 0x0010D7, - 0x0013D2, 0x0010D9, 0x0010DA, 0x0010DB, 0x0013D1, 0x0010DD, 0x0010DE, 0x0013D0, - 0x0013E0, 0x0013E1, 0x0013E2, 0x0013E3, 0x0013C4, 0x0013E5, 0x0013E6, 0x0013E7, - 0x0013C8, 0x0013C9, 0x0013CA, 0x0013CB, 0x0013CC, 0x0013CD, 0x0013CE, 0x0013CF, - 0x0013F0, 0x0013F1, 0x0013F2, 0x0013F3, 0x0013F4, 0x0013F5, 0x0013E4, 0x0013EA, - 0x0013F8, 0x0013F9, 0x0013FA, 0x0013FB, 0x0013FC, 0x0013FD, 0x0013DE, 0x0013EB, - 0x02F848, 0x02F849, 0x02F84A, 0x02F84B, 0x02F844, 0x02F845, 0x02F846, 0x02F847, - 0x02F840, 0x02F841, 0x02F842, 0x02F843, 0x02F85C, 0x02F85D, 0x02F85E, 0x02F82F, - 0x02F828, 0x02F829, 0x02F82A, 0x02F82B, 0x02F824, 0x02F825, 0x02F826, 0x02F827, - 0x02F820, 0x02F821, 0x02F822, 0x02F823, 0x02F83C, 0x02F83D, 0x02F83E, 0x02F83F, - 0x001524, 0x001520, 0x02F838, 0x001523, 0x02F839, 0x001521, 0x001522, 0x02F83A, - 0x00152B, 0x02F83B, 0x02F834, 0x02F835, 0x00152C, 0x001525, 0x001526, 0x001527, - 0x02F836, 0x001529, 0x02F837, 0x02F830, 0x001534, 0x00153D, 0x02F831, 0x00152D, - 0x001538, 0x00153B, 0x00153A, 0x00152A, 0x00153C, 0x001539, 0x00153E, 0x00153F, - 0x02F832, 0x02F833, 0x02F80C, 0x02F80D, 0x02F80E, 0x02F80F, 0x02F808, 0x02F809, - 0x02F80A, 0x02F80B, 0x02F804, 0x02F805, 0x02F806, 0x02F807, 0x02F800, 0x02F801, - 0x001553, 0x02F802, 0x001554, 0x02F803, 0x001556, 0x001551, 0x001552, 0x02F81C, - 0x001550, 0x02F81D, 0x00155A, 0x00155B, 0x001558, 0x001555, 0x02F81E, 0x001557, - 0x02F81F, 0x001260, 0x02F818, 0x02F819, 0x02F81A, 0x001267, 0x02F81B, 0x02F814, - 0x001268, 0x02F815, 0x02F816, 0x02F817, 0x00126C, 0x02F810, 0x00126E, 0x00126F, - 0x00155D, 0x001559, 0x02F811, 0x02F812, 0x02F813, 0x02F8EC, 0x00155E, 0x00155F, - 0x02F8ED, 0x02F8EE, 0x02F8EF, 0x02F8E8, 0x02F8E9, 0x02F8EA, 0x02F8EB, 0x02F8E4, - 0x02F8E5, 0x02F8E6, 0x02F8E7, 0x02F8E0, 0x001284, 0x02F8E1, 0x02F8E2, 0x02F8E3, - 0x001288, 0x02F8FC, 0x00128A, 0x00128B, 0x02F8FD, 0x02F8FE, 0x02F8FF, 0x02F8F8, - 0x02F8F9, 0x02F8FA, 0x02F8FB, 0x02F8F4, 0x02F8F5, 0x02F8F6, 0x02F8F7, 0x02F8F0, - 0x001298, 0x001299, 0x02F8F1, 0x01230E, 0x01230F, 0x00129D, 0x00129E, 0x00129F, - 0x012308, 0x012309, 0x01230A, 0x01230B, 0x012304, 0x012305, 0x012306, 0x012307, - 0x012300, 0x012301, 0x012302, 0x012303, 0x01231C, 0x01231D, 0x01231E, 0x01231F, - 0x012318, 0x012319, 0x01231A, 0x01231B, 0x012314, 0x012315, 0x012316, 0x012317, - 0x012310, 0x012311, 0x012312, 0x012313, 0x01238C, 0x01238D, 0x01238E, 0x01238F, - 0x012388, 0x012389, 0x01238A, 0x01238B, 0x012384, 0x012385, 0x012386, 0x012387, - 0x012380, 0x012381, 0x012382, 0x012383, 0x012398, 0x012399, 0x012394, 0x012395, - 0x012396, 0x012397, 0x012390, 0x012391, 0x012392, 0x012393, 0x01206C, 0x01206D, - 0x01206E, 0x01BC01, 0x01BC00, 0x01BC03, 0x01BC02, 0x01BC05, 0x01BC04, 0x01BC07, - 0x01BC06, 0x01BC09, 0x01BC08, 0x01BC0B, 0x01BC0A, 0x01BC0D, 0x01BC0C, 0x01BC0F, - 0x01BC0E, 0x01BC11, 0x01BC10, 0x01BC13, 0x01BC12, 0x01BC15, 0x01BC14, 0x01BC17, - 0x01BC16, 0x01BC19, 0x01BC18, 0x01BC1B, 0x01BC1A, 0x01BC1D, 0x01BC1C, 0x01BC1F, - 0x01BC1E, 0x01BC21, 0x01BC20, 0x01BC23, 0x01BC22, 0x01206F, 0x012068, 0x01BC27, - 0x01BC26, 0x001581, 0x001582, 0x001583, 0x001599, 0x00159C, 0x001587, 0x00159B, - 0x00159A, 0x01BC31, 0x01BC30, 0x01BC33, 0x01BC32, 0x01BC35, 0x01BC34, 0x01BC37, - 0x01BC36, 0x01BC39, 0x01BC38, 0x01BC3B, 0x01BC3A, 0x01BC3D, 0x01BC3C, 0x01BC3F, - 0x01BC3E, 0x001590, 0x001593, 0x001592, 0x001595, 0x001594, 0x001597, 0x001596, - 0x001580, 0x001585, 0x001586, 0x01BC52, 0x01BC53, 0x01BC50, 0x01BC51, 0x01BC57, - 0x00158A, 0x001589, 0x01BC69, 0x00158B, 0x01BC68, 0x0015A1, 0x00159D, 0x0015AC, - 0x001533, 0x0015B1, 0x00159E, 0x00159F, 0x001536, 0x001531, 0x001532, 0x001530, - 0x00150C, 0x01BC64, 0x001537, 0x01BC6A, 0x001598, 0x01BC24, 0x01BC25, 0x00150D, - 0x01BC65, 0x01BC28, 0x01BC29, 0x01BC2A, 0x01BC2B, 0x01BC2C, 0x01BC2D, 0x01BC2E, - 0x01BC2F, 0x0015D1, 0x0015D2, 0x0015D3, 0x001535, 0x0015D5, 0x0015D6, 0x012228, - 0x01222C, 0x0120E0, 0x01225B, 0x0120EE, 0x0120ED, 0x0120EF, 0x0120EC, 0x0120E8, - 0x0120E9, 0x01BC81, 0x0120E6, 0x01BC62, 0x01BC63, 0x01BC85, 0x01BC84, 0x01BC83, - 0x012013, 0x01BC61, 0x01BC88, 0x01BC60, 0x012254, 0x012012, 0x01BC66, 0x012010, - 0x01BC67, 0x01BC92, 0x01BC90, 0x01BC93, 0x01BC91, 0x01BC96, 0x01BC78, 0x01BC97, - 0x0120FC, 0x01BC7A, 0x0120E3, 0x01BC98, 0x01BC99, 0x0120FD, 0x01BC95, 0x01BC94, - 0x01BC82, 0x01BC80, 0x0120E1, 0x01BC7C, 0x012016, 0x01BC74, 0x012017, 0x01BC86, - 0x01BC87, 0x0120E2, 0x01BC79, 0x0120EA, 0x01BC76, 0x01BC77, 0x0120E7, 0x0120F8, - 0x0120F9, 0x01BC70, 0x01BC7B, 0x01BC72, 0x01BC73, 0x0120FE, 0x01BC75, 0x0120C0, - 0x0120C1, 0x0120C2, 0x0120C3, 0x0120C4, 0x0120C5, 0x0120C6, 0x0120C7, 0x0120C8, - 0x0120C9, 0x0120CA, 0x0120CB, 0x01BC42, 0x01BC43, 0x01BC44, 0x01BC45, 0x01BC4E, - 0x01BC4F, 0x01BC4C, 0x01BC49, 0x012253, 0x01BC48, 0x01BC4A, 0x01BC4D, 0x01BC4B, - 0x0120CF, 0x012252, 0x012251, 0x0120DC, 0x012250, 0x01BC54, 0x01BC55, 0x01BC56, - 0x01BC41, 0x01BC58, 0x01BC59, 0x01BC5A, 0x01BC5B, 0x01BC5C, 0x01BC5D, 0x01BC5E, - 0x01BC5F, 0x01BC40, 0x01BC71, 0x0120CC, 0x0120CD, 0x0120CE, 0x0120FF, 0x01BC46, - 0x01BC47, 0x0120F2, 0x0120F3, 0x0120F1, 0x0120F6, 0x0120F0, 0x0120F7, 0x012256, - 0x012255, 0x012257, 0x0120FB, 0x0120F4, 0x0120F5, 0x0120FA, 0x0122ED, 0x012081, - 0x012080, 0x012083, 0x012082, 0x012085, 0x012084, 0x012087, 0x012086, 0x012089, - 0x012088, 0x01208B, 0x01208A, 0x01208D, 0x01208C, 0x01208F, 0x01208E, 0x0120D0, - 0x0120D1, 0x0120D2, 0x0120D3, 0x0120D4, 0x0120D5, 0x0120D6, 0x0120D7, 0x012099, - 0x012098, 0x0120DA, 0x0120DB, 0x01209D, 0x01209C, 0x01209F, 0x01209E, 0x0120A1, - 0x0120A0, 0x0120A3, 0x0120A2, 0x0120A5, 0x0120A4, 0x0120A7, 0x0120A6, 0x0120A9, - 0x0120A8, 0x0120AB, 0x0120AA, 0x0120AD, 0x0120AC, 0x0120AF, 0x0120AE, 0x0120B1, - 0x0120B0, 0x0120B3, 0x0120B2, 0x0120B5, 0x0120B4, 0x0120B7, 0x0120B6, 0x0120B9, - 0x0120B8, 0x0120BB, 0x0120BA, 0x0120BD, 0x0120BC, 0x0120BF, 0x0120BE, 0x0120D8, - 0x0120D9, 0x0120DE, 0x0120DF, 0x0120DD, 0x016F01, 0x016F00, 0x016F03, 0x016F02, - 0x016F05, 0x016F04, 0x016F07, 0x016F06, 0x016F09, 0x016F08, 0x016F0B, 0x016F0A, - 0x016F0D, 0x016F0C, 0x016F0F, 0x016F0E, 0x016F11, 0x016F10, 0x016F13, 0x016F12, - 0x016F15, 0x016F14, 0x016F17, 0x016F16, 0x016F19, 0x016F18, 0x016F1B, 0x016F1A, - 0x016F1D, 0x016F1C, 0x016F1F, 0x016F1E, 0x016F21, 0x016F20, 0x016F23, 0x016F22, - 0x016F25, 0x016F24, 0x016F27, 0x016F26, 0x016F29, 0x016F28, 0x016F2B, 0x016F2A, - 0x016F2D, 0x016F2C, 0x016F2F, 0x016F2E, 0x016F31, 0x016F30, 0x016F33, 0x016F32, - 0x016F35, 0x016F34, 0x016F37, 0x016F36, 0x016F39, 0x016F38, 0x016F3B, 0x016F3A, - 0x016F3D, 0x016F3C, 0x016F3F, 0x012106, 0x012107, 0x016F43, 0x016F40, 0x012102, - 0x01210B, 0x016F44, 0x012103, 0x012109, 0x012105, 0x01210F, 0x016F42, 0x012111, - 0x012110, 0x012113, 0x012112, 0x001369, 0x012108, 0x012117, 0x016F50, 0x012119, - 0x01211B, 0x012118, 0x012104, 0x01211D, 0x01211F, 0x01211C, 0x01211E, 0x00136A, - 0x001282, 0x001281, 0x016F41, 0x001283, 0x001286, 0x001285, 0x001280, 0x001287, - 0x00136C, 0x00136D, 0x00129C, 0x01210C, 0x01210D, 0x01210E, 0x00136E, 0x00136F, - 0x001212, 0x012133, 0x012132, 0x001213, 0x001211, 0x00121C, 0x012136, 0x001217, - 0x001219, 0x001218, 0x00121B, 0x00121A, 0x001216, 0x001215, 0x001214, 0x012240, - 0x012241, 0x012243, 0x016F3E, 0x012244, 0x012245, 0x012242, 0x012247, 0x012248, - 0x012249, 0x01224A, 0x01224B, 0x01224C, 0x01224D, 0x012246, 0x01224F, 0x001210, - 0x001200, 0x001204, 0x001207, 0x001203, 0x00121D, 0x00121E, 0x00121F, 0x012258, - 0x012259, 0x01225A, 0x01224E, 0x01225C, 0x01225D, 0x01225E, 0x01225F, 0x012260, - 0x012261, 0x012262, 0x012263, 0x012264, 0x012265, 0x012266, 0x012267, 0x012268, - 0x012269, 0x01226A, 0x01226B, 0x01226C, 0x01226D, 0x01226E, 0x01226F, 0x012270, - 0x012271, 0x012272, 0x012273, 0x012274, 0x012275, 0x012276, 0x012277, 0x012278, - 0x012279, 0x01227A, 0x01227B, 0x01227C, 0x01227D, 0x01227E, 0x01227F, 0x001229, - 0x001254, 0x001244, 0x001248, 0x001264, 0x001293, 0x001205, 0x001206, 0x001256, - 0x001228, 0x00125A, 0x00120B, 0x00125B, 0x001258, 0x00127D, 0x00122E, 0x00124B, - 0x0012E0, 0x0012E1, 0x0012E6, 0x0012E7, 0x0012E4, 0x001221, 0x001222, 0x001223, - 0x001220, 0x001226, 0x0012EA, 0x0012EB, 0x0012EC, 0x001227, 0x0012E9, 0x0012E5, - 0x0121E1, 0x00122B, 0x0012F5, 0x001232, 0x0012F4, 0x001224, 0x00122A, 0x00122F, - 0x0012F9, 0x0012F8, 0x0012EE, 0x00123A, 0x0012ED, 0x0012EF, 0x0012FF, 0x0012FE, - 0x001320, 0x001291, 0x001296, 0x001295, 0x00132C, 0x001297, 0x001322, 0x001323, - 0x001321, 0x001328, 0x001325, 0x001327, 0x00133D, 0x00133E, 0x00133F, 0x0121C1, - 0x0121C0, 0x0121C3, 0x0121C2, 0x0121C5, 0x0121C4, 0x0121C7, 0x0121C6, 0x0121C9, - 0x0121C8, 0x0121CB, 0x0121CA, 0x0121CD, 0x0121CC, 0x0121CF, 0x0121CE, 0x001338, - 0x001339, 0x00133A, 0x00133B, 0x0121D5, 0x0121D4, 0x001335, 0x0121D6, 0x0121D9, - 0x0121D8, 0x0121DB, 0x0121DA, 0x0121DD, 0x0121DC, 0x0121DF, 0x0121DE, 0x00D7BE, - 0x0121E0, 0x0121E3, 0x0121E2, 0x0121E5, 0x0121E4, 0x0121E7, 0x0121E6, 0x0121E9, - 0x0121E8, 0x0121EB, 0x0121EA, 0x0121ED, 0x0121EC, 0x0121EF, 0x0121EE, 0x0121F1, - 0x0121F0, 0x0121F3, 0x0121F2, 0x0121F5, 0x0121F4, 0x0121F7, 0x0121F6, 0x0121F9, - 0x0121F8, 0x0121FB, 0x0121FA, 0x0121FD, 0x0121FC, 0x0121FF, 0x0121FE, 0x012201, - 0x012200, 0x001350, 0x001356, 0x012205, 0x012204, 0x012202, 0x012203, 0x012209, - 0x012208, 0x01220B, 0x01220A, 0x001354, 0x001357, 0x012206, 0x012207, 0x012211, - 0x012210, 0x012213, 0x012212, 0x012215, 0x012214, 0x012217, 0x012216, 0x012219, - 0x012218, 0x01221B, 0x01221A, 0x01221D, 0x01221C, 0x01221F, 0x01221E, 0x001326, - 0x00129B, 0x012232, 0x00135A, 0x001359, 0x001294, 0x001355, 0x012231, 0x00129A, - 0x001358, 0x001329, 0x00132A, 0x00132B, 0x00132E, 0x00132D, 0x01220F, 0x00132F, - 0x001379, 0x001371, 0x001378, 0x00137B, 0x001290, 0x001375, 0x001292, 0x001377, - 0x012233, 0x00134C, 0x00D7B8, 0x00D7B9, 0x00D7BA, 0x01220E, 0x00D7BC, 0x012220, - 0x012221, 0x00D7BF, 0x00D7BB, 0x012224, 0x012225, 0x012222, 0x012223, 0x012238, - 0x012229, 0x01222A, 0x01222B, 0x00D7B6, 0x00D7B7, 0x012226, 0x012227, 0x012230, - 0x012234, 0x01222E, 0x01222F, 0x00D7B4, 0x012235, 0x012236, 0x012237, 0x012239, - 0x00D7B5, 0x01223A, 0x01223B, 0x01223C, 0x01223D, 0x01223E, 0x01223F, 0x00134E, - 0x00D7D1, 0x00D7D3, 0x001373, 0x001372, 0x00D7D2, 0x001374, 0x001376, 0x00137C, - 0x01222D, 0x001370, 0x00136B, 0x01220C, 0x01220D, 0x00134D, 0x00137A, 0x00134F, - 0x001340, 0x001341, 0x001342, 0x001343, 0x001344, 0x001345, 0x001346, 0x001347, - 0x001348, 0x00134B, 0x00134A, 0x00D7D7, 0x001349, 0x00D7D0, 0x00D7BD, 0x012281, - 0x012280, 0x0122A8, 0x0122CE, 0x012285, 0x012284, 0x012282, 0x012283, 0x012289, - 0x012288, 0x01228B, 0x01228A, 0x01228D, 0x01228C, 0x012286, 0x012287, 0x012291, - 0x012290, 0x012293, 0x012292, 0x012295, 0x012294, 0x012297, 0x012296, 0x012299, - 0x012298, 0x01229B, 0x01229A, 0x01229D, 0x01229C, 0x01229F, 0x01229E, 0x0122A1, - 0x0122A0, 0x0122A3, 0x0122A2, 0x0122A5, 0x0122A4, 0x0122A7, 0x0122A6, 0x0122A9, - 0x0122B9, 0x0122AB, 0x0122AA, 0x0122AD, 0x0122AC, 0x0122AF, 0x0122AE, 0x0122B1, - 0x0122B0, 0x0122B3, 0x0122B2, 0x0122B5, 0x0122B4, 0x0122B7, 0x0122B6, 0x01228F, - 0x0122B8, 0x0122BB, 0x0122BA, 0x0122BD, 0x0122BC, 0x0122BF, 0x0122BE, 0x0122C1, - 0x0122C0, 0x0122C3, 0x0122C2, 0x0122C5, 0x0122C4, 0x0122E8, 0x0122C6, 0x0122C9, - 0x0122D9, 0x0122CB, 0x0122CA, 0x0122CD, 0x0122CC, 0x0122CF, 0x0122C7, 0x0122D1, - 0x01228E, 0x0122D3, 0x0122D2, 0x0122D5, 0x0122D4, 0x0122D7, 0x0122D6, 0x0122D0, - 0x0122D8, 0x0122DB, 0x0122DA, 0x0122DD, 0x0122DC, 0x0122DF, 0x0122DE, 0x0122E2, - 0x0122E0, 0x0122E3, 0x0122FD, 0x0122E6, 0x0122E4, 0x0122E7, 0x0122E1, 0x0122EA, - 0x0122F9, 0x0122EB, 0x0122E5, 0x0122EF, 0x0122EC, 0x0122FE, 0x0122E9, 0x0122F1, - 0x0122F0, 0x0122F3, 0x0122F2, 0x0122F5, 0x0122F4, 0x0122F7, 0x0122F6, 0x0122C8, - 0x0122F8, 0x0122FB, 0x0122FA, 0x0122FF, 0x0122FC, 0x02F861, 0x02F860, 0x02F863, - 0x01230C, 0x012324, 0x01234F, 0x02F867, 0x02F866, 0x02F869, 0x02F868, 0x01230D, - 0x02F86A, 0x02F86D, 0x02F86C, 0x02F86F, 0x02F86E, 0x02F871, 0x02F870, 0x02F82E, - 0x02F82D, 0x02F875, 0x02F874, 0x02F877, 0x02F876, 0x02F879, 0x02F878, 0x02F87B, - 0x02F87A, 0x02F87D, 0x02F87C, 0x02F87F, 0x02F87E, 0x02F890, 0x02F897, 0x01232C, - 0x012320, 0x012323, 0x012322, 0x012325, 0x012321, 0x012327, 0x012326, 0x012338, - 0x012328, 0x01232B, 0x01232A, 0x01232D, 0x012329, 0x01232F, 0x01232E, 0x012334, - 0x012330, 0x012333, 0x012332, 0x012335, 0x012331, 0x012337, 0x012336, 0x01233C, - 0x02F891, 0x01233B, 0x01233A, 0x01233D, 0x012339, 0x01233F, 0x01233E, 0x012341, - 0x012340, 0x012343, 0x012342, 0x012345, 0x012344, 0x012347, 0x012346, 0x012349, - 0x012359, 0x01234B, 0x01234A, 0x01234D, 0x01234C, 0x012364, 0x01234E, 0x012351, - 0x012350, 0x012353, 0x012352, 0x012355, 0x012354, 0x012357, 0x012356, 0x0122EE, - 0x012358, 0x01235B, 0x01235A, 0x01235D, 0x01235C, 0x01235F, 0x01235E, 0x012361, - 0x012360, 0x012363, 0x012362, 0x012365, 0x012375, 0x012367, 0x012366, 0x012369, - 0x012368, 0x01236B, 0x01236A, 0x01236D, 0x01236C, 0x01236F, 0x01236E, 0x012371, - 0x012370, 0x012373, 0x012372, 0x012348, 0x012374, 0x012377, 0x012376, 0x012379, - 0x012378, 0x01237B, 0x01237A, 0x01237D, 0x01237C, 0x01237F, 0x01237E, 0x02F882, - 0x02F883, 0x02F880, 0x02F881, 0x02F886, 0x02F887, 0x02F888, 0x02F889, 0x02F88A, - 0x02F88B, 0x02F884, 0x02F885, 0x02F89E, 0x02F88F, 0x02F88C, 0x02F88D, 0x02F892, - 0x02F893, 0x02F894, 0x02F895, 0x02F896, 0x02F8B3, 0x02F898, 0x02F899, 0x02F94C, - 0x02F89B, 0x02F89C, 0x02F89D, 0x02F89F, 0x02F89A, 0x02F901, 0x02F900, 0x02F903, - 0x02F902, 0x02F905, 0x02F904, 0x02F907, 0x02F906, 0x02F909, 0x02F908, 0x02F90B, - 0x02F90A, 0x02F90D, 0x02F90C, 0x02F90F, 0x02F91F, 0x02F911, 0x02F910, 0x02F913, - 0x02F912, 0x02F915, 0x02F914, 0x02F917, 0x02F916, 0x02F919, 0x02F918, 0x02F91B, - 0x02F91A, 0x02F91D, 0x02F91C, 0x02F92E, 0x02F91E, 0x02F921, 0x02F920, 0x02F923, - 0x02F922, 0x02F90E, 0x02F924, 0x02F927, 0x02F926, 0x02F929, 0x02F928, 0x02F92B, - 0x02F92A, 0x02F92D, 0x02F925, 0x02F92F, 0x02F93F, 0x02F931, 0x02F930, 0x02F933, - 0x02F932, 0x02F935, 0x02F934, 0x02F937, 0x02F82C, 0x02F939, 0x02F938, 0x02F93B, - 0x02F93A, 0x02F93D, 0x02F93C, 0x02F936, 0x02F93E, 0x02F941, 0x02F947, 0x02F940, - 0x02F942, 0x02F945, 0x02F94B, 0x02F944, 0x02F946, 0x02F949, 0x02F94F, 0x02F948, - 0x02F94A, 0x02F95C, 0x02F96D, 0x02F94D, 0x02F95F, 0x02F951, 0x02F950, 0x02F953, - 0x02F952, 0x02F955, 0x02F954, 0x02F957, 0x02F956, 0x02F959, 0x02F958, 0x02F95B, - 0x02F95A, 0x02F96C, 0x02F943, 0x02F95D, 0x02F95E, 0x02F94E, 0x02F92C, 0x02F963, - 0x02F962, 0x02F960, 0x02F961, 0x02F967, 0x02F966, 0x02F969, 0x02F968, 0x02F96B, - 0x02F96A, 0x02F964, 0x02F965, 0x02F96F, 0x02F96E, 0x02F971, 0x02F970, 0x02F853, - 0x02F972, 0x02F975, 0x02F974, 0x02F977, 0x02F976, 0x02F979, 0x02F978, 0x02F97B, - 0x02F97A, 0x02F97D, 0x02F97C, 0x02F97F, 0x02F97E, 0x02F981, 0x02F980, 0x02F983, - 0x02F987, 0x02F985, 0x02F984, 0x02F982, 0x02F986, 0x02F989, 0x02F988, 0x02F98B, - 0x02F98F, 0x02F98D, 0x02F98C, 0x02F99E, 0x02F98E, 0x02F991, 0x02F990, 0x02F9AE, - 0x02F997, 0x02F995, 0x02F994, 0x02F993, 0x02F996, 0x02F999, 0x02F998, 0x02F99B, - 0x02F99F, 0x02F99D, 0x02F99C, 0x02F99A, 0x02F992, 0x02F9A1, 0x02F9A0, 0x02F9A3, - 0x02F9A2, 0x02F9A5, 0x02F9A4, 0x02F9A7, 0x02F9A6, 0x02F9A9, 0x02F9A8, 0x02F9AB, - 0x02F9AA, 0x02F98A, 0x02F9AC, 0x02F9AF, 0x02F9BF, 0x02F9B1, 0x02F9B0, 0x02F9B3, - 0x02F9EC, 0x02F9B5, 0x02F9B4, 0x02F9B7, 0x02F9B6, 0x02F9B9, 0x02F9B8, 0x02F9BB, - 0x02F9BA, 0x02F9BD, 0x02F9BC, 0x02F9B2, 0x02F9BE, 0x02F9C1, 0x02F9C0, 0x02F9C3, - 0x02F9C2, 0x02F9C5, 0x02F9C4, 0x02F9C7, 0x02F9C6, 0x02F9C9, 0x02F9C8, 0x02F9CB, - 0x02F9DB, 0x02F9CD, 0x02F9CC, 0x02F9CF, 0x02F9CE, 0x02F9D1, 0x02F9D0, 0x02F9D3, - 0x02F9D2, 0x02F9D5, 0x02F9D4, 0x02F9D7, 0x02F9D6, 0x02F9D9, 0x02F9D8, 0x02F9ED, - 0x02F9DA, 0x02F9DD, 0x02F9DC, 0x02F9DF, 0x02F9DE, 0x02F9CA, 0x02F9AD, 0x02F9E3, - 0x02F9E2, 0x02F9E0, 0x02F9E1, 0x02F9E7, 0x02F9E6, 0x02F9E9, 0x02F9E8, 0x02F9EB, - 0x02F9EA, 0x02F9E4, 0x02F9E5, 0x02F9EF, 0x02F9EE, 0x02F9F1, 0x02F9F0, 0x02F9F3, - 0x02F9F2, 0x02F9F5, 0x02F9F4, 0x02F9F7, 0x02F9F6, 0x02F9F9, 0x02F9F8, 0x02F9FB, - 0x02F9FA, 0x02F9FD, 0x02F9FC, 0x02F9FF, 0x02F9FE, 0x012069, 0x01206A, 0x01206B, - 0x012064, 0x012065, 0x012066, 0x012067, 0x012060, 0x012061, 0x012062, 0x012063, - 0x01207C, 0x01207D, 0x01207E, 0x01207F, 0x012078, 0x012079, 0x01207A, 0x01207B, - 0x012074, 0x012075, 0x012076, 0x012077, 0x012070, 0x012071, 0x012072, 0x012073, - 0x01204C, 0x01204D, 0x01204E, 0x01204F, 0x012048, 0x012049, 0x01204A, 0x01204B, - 0x012044, 0x012045, 0x012046, 0x012047, 0x012040, 0x012041, 0x012042, 0x012043, - 0x01205C, 0x01205D, 0x01205E, 0x00D7B0, 0x01205F, 0x012058, 0x012059, 0x01205A, - 0x01205B, 0x012054, 0x012055, 0x012056, 0x012057, 0x012050, 0x012051, 0x012052, - 0x012053, 0x01202C, 0x01202D, 0x01202E, 0x01202F, 0x012028, 0x012029, 0x01202A, - 0x01202B, 0x012024, 0x012025, 0x012026, 0x00D7B1, 0x012027, 0x012020, 0x012021, - 0x012022, 0x012023, 0x01203C, 0x01203D, 0x01203E, 0x01203F, 0x012038, 0x012039, - 0x01203A, 0x01203B, 0x012034, 0x012035, 0x012036, 0x012037, 0x012030, 0x012031, - 0x012032, 0x012033, 0x01200C, 0x01200D, 0x01200E, 0x02F862, 0x02F864, 0x012501, - 0x012500, 0x012503, 0x012502, 0x02F865, 0x012504, 0x012525, 0x02F86B, 0x012509, - 0x012508, 0x01250B, 0x01250A, 0x01250D, 0x01250C, 0x01250F, 0x01250E, 0x012511, - 0x012510, 0x012513, 0x012512, 0x012515, 0x012514, 0x012517, 0x012516, 0x012519, - 0x012518, 0x01251B, 0x01251A, 0x01251D, 0x012524, 0x01251F, 0x01251E, 0x012521, - 0x012520, 0x012523, 0x012522, 0x01253C, 0x012535, 0x012527, 0x01200F, 0x01252B, - 0x012526, 0x012008, 0x012529, 0x012009, 0x01200A, 0x01252A, 0x01200B, 0x012531, - 0x012530, 0x012533, 0x012532, 0x012537, 0x02F8BB, 0x02F8B5, 0x012536, 0x02F8B4, - 0x012538, 0x012004, 0x012005, 0x01253D, 0x02F8B2, 0x01253F, 0x01253E, 0x012006, - 0x012007, 0x012000, 0x012001, 0x02F88E, 0x012002, 0x012003, 0x01201C, 0x01201D, - 0x01201E, 0x01201F, 0x012018, 0x012019, 0x01201A, 0x01201B, 0x012014, 0x012015, - 0x012011, 0x0120EB, 0x0120E4, 0x02F8B1, 0x0120E5, 0x02F8B0, 0x01209A, 0x01209B, - 0x02F8B6, 0x012094, 0x02F8B7, 0x012095, 0x012096, 0x012097, 0x012090, 0x012091, - 0x012092, 0x012093, 0x01216C, 0x01216D, 0x01216E, 0x01216F, 0x012168, 0x012169, - 0x01216A, 0x01216B, 0x012164, 0x012165, 0x012166, 0x012167, 0x012160, 0x012161, - 0x012162, 0x012163, 0x01217C, 0x01217D, 0x01217E, 0x01217F, 0x012178, 0x012179, - 0x01217A, 0x01217B, 0x012174, 0x012175, 0x012176, 0x012177, 0x02F8B9, 0x012170, - 0x012171, 0x012172, 0x012173, 0x01214C, 0x01214D, 0x01214E, 0x01214F, 0x012148, - 0x012149, 0x01214A, 0x01214B, 0x012144, 0x012145, 0x012146, 0x012147, 0x012140, - 0x012141, 0x012142, 0x012143, 0x01215C, 0x01215D, 0x01215E, 0x01215F, 0x012158, - 0x02F8BA, 0x012159, 0x01215A, 0x01215B, 0x012154, 0x012155, 0x012156, 0x012157, - 0x012150, 0x012151, 0x012152, 0x012153, 0x01212C, 0x01212D, 0x01212E, 0x01212F, - 0x012128, 0x012129, 0x01212A, 0x01212B, 0x012124, 0x012125, 0x012126, 0x012127, - 0x012120, 0x012121, 0x012122, 0x012123, 0x01213C, 0x01213D, 0x01213E, 0x01213F, - 0x012138, 0x012139, 0x01213A, 0x01213B, 0x012134, 0x012135, 0x012137, 0x012130, - 0x012131, 0x01210A, 0x012100, 0x012101, 0x01211A, 0x012114, 0x012115, 0x012116, - 0x0121D7, 0x0121D0, 0x0121D1, 0x0121D2, 0x0121D3, 0x0121AC, 0x0121AD, 0x0121AE, - 0x0121AF, 0x0121A8, 0x0121A9, 0x0121AA, 0x0121AB, 0x0121A4, 0x0121A5, 0x0121A6, - 0x0121A7, 0x0121A0, 0x0121A1, 0x0121A2, 0x0121A3, 0x0121BC, 0x0121BD, 0x0121BE, - 0x0121BF, 0x0121B8, 0x0121B9, 0x0121BA, 0x0121BB, 0x0121B4, 0x0121B5, 0x0121B6, - 0x0121B7, 0x0121B0, 0x0121B1, 0x0121B2, 0x0121B3, 0x01218C, 0x01218D, 0x01218E, - 0x01218F, 0x012188, 0x012189, 0x01218A, 0x01218B, 0x012184, 0x012185, 0x012186, - 0x012187, 0x012180, 0x00D7C1, 0x00D7C0, 0x00D7C3, 0x00D7C2, 0x00D7C5, 0x00D7C4, - 0x012181, 0x00D7C6, 0x012182, 0x012183, 0x00D7CB, 0x00D7E8, 0x00D7CD, 0x00D7CC, - 0x00D7CF, 0x00D7CE, 0x01219C, 0x01219D, 0x01219E, 0x01219F, 0x00D7D5, 0x00D7D4, - 0x00D7EF, 0x00D7D6, 0x00D7D9, 0x00D7D8, 0x00D7DB, 0x00D7DA, 0x00D7DD, 0x00D7DC, - 0x00D7DF, 0x00D7DE, 0x00D7E1, 0x00D7E0, 0x00D7E3, 0x00D7E2, 0x00D7E5, 0x00D7E4, - 0x00D7E9, 0x00D7E6, 0x00D7F8, 0x00D7ED, 0x00D7EB, 0x00D7EA, 0x00D7B2, 0x00D7EE, - 0x00D7EC, 0x00D7B3, 0x00D7F1, 0x00D7F0, 0x00D7F3, 0x00D7F2, 0x00D7F5, 0x00D7F4, - 0x00D7F7, 0x00D7F6, 0x00D7F9, 0x00D7FA, 0x00D7FB, 0x012198, 0x012199, 0x01219A, - 0x01219B, 0x00D7E7, 0x00FA00, 0x00FA03, 0x00FA02, 0x02F8A1, 0x02F858, 0x02F8A2, - 0x02F8A3, 0x02F8A0, 0x02F8A5, 0x02F8A6, 0x02F8A7, 0x02F8A8, 0x02F8A9, 0x02F8AA, - 0x02F8AB, 0x02F8A4, 0x02F8AD, 0x02F8AE, 0x02F8AF, 0x00FA01, 0x00FA1C, 0x00FA1D, - 0x00FA1E, 0x00FA06, 0x02F84D, 0x00FA19, 0x00FA1F, 0x02F8B8, 0x02F8AC, 0x02F84E, - 0x02F84C, 0x02F8BC, 0x02F8BD, 0x02F8BE, 0x02F8BF, 0x02F8C0, 0x02F8C1, 0x02F8C2, - 0x02F8C3, 0x02F8C4, 0x02F8C5, 0x02F8C6, 0x02F8C7, 0x02F8C8, 0x02F8C9, 0x02F8CA, - 0x02F8CB, 0x02F8CC, 0x02F8CD, 0x02F8CE, 0x02F8CF, 0x02F8D0, 0x02F8D1, 0x02F8D2, - 0x02F8D3, 0x02F8D4, 0x02F8D5, 0x02F8D6, 0x02F8D7, 0x02F8D8, 0x02F8D9, 0x02F8DA, - 0x02F8DB, 0x02F8DC, 0x02F8DD, 0x02F8DE, 0x02F8DF, 0x02F873, 0x02F973, 0x02F85A, - 0x02F85B, 0x02F872, 0x02F856, 0x00FA0A, 0x02F85F, 0x00FA0B, 0x00FA04, 0x00FA05, - 0x00FA07, 0x02F854, 0x02F855, 0x00FA4B, 0x00FA0C, 0x00FA61, 0x00FA0D, 0x02F8F2, - 0x02F8F3, 0x00FA60, 0x00FA09, 0x02F851, 0x02F852, 0x00FA08, 0x00FA0E, 0x02F857, - 0x02F850, 0x00FA0F, 0x00FA24, 0x00FA3D, 0x00FA71, 0x00FA25, 0x00FA34, 0x00FC22, - 0x00FA3C, 0x00FA26, 0x00FA28, 0x00FA3B, 0x00FA3A, 0x00FA38, 0x00FA75, 0x00FA2B, - 0x00FA3E, 0x00FA7B, 0x00FA32, 0x00FA31, 0x00FA73, 0x00FA33, 0x00FA30, 0x00FA36, - 0x00FA57, 0x00FA62, 0x00FA77, 0x00FA2F, 0x00FA72, 0x00FA3F, 0x00FA39, 0x00FA35, - 0x00FA37, 0x00FA23, 0x012194, 0x012195, 0x012196, 0x012197, 0x012190, 0x012191, - 0x012192, 0x012193, 0x00324C, 0x00324D, 0x00324E, 0x00324F, 0x003248, 0x003249, - 0x00324A, 0x00324B, 0x00FC10, 0x00FC11, 0x00FC12, 0x00325C, 0x00FC14, 0x00FC15, - 0x00FC16, 0x00FC17, 0x00FC1A, 0x00FC19, 0x00325D, 0x00FC1B, 0x00325E, 0x00FC18, - 0x00325F, 0x00FC1F, 0x00FC50, 0x00FC57, 0x00FC52, 0x00FC51, 0x00FC54, 0x02F859, - 0x00FC56, 0x00FC55, 0x00FCF8, 0x00FCF9, 0x00FCFA, 0x003258, 0x00FCFC, 0x003259, - 0x00FCFE, 0x00FCFD, 0x00325A, 0x00325B, 0x003254, 0x003255, 0x00FA49, 0x00FC53, - 0x003256, 0x003257, 0x003251, 0x00FA4A, 0x003252, 0x003253, 0x00FCF5, 0x003228, - 0x003229, 0x003224, 0x00FC01, 0x00FCE9, 0x00FCE8, 0x00FC02, 0x00FCE4, 0x00FC05, - 0x00FC03, 0x00FA47, 0x012506, 0x012507, 0x00FC0B, 0x00FCE3, 0x012505, 0x00FC09, - 0x00FC07, 0x00FCEF, 0x00FA46, 0x00FCC8, 0x00FCC9, 0x00FCCA, 0x00FCC4, 0x00FCF1, - 0x00FCF2, 0x00FCF7, 0x00FA45, 0x00FCF0, 0x00FCF6, 0x00FCF4, 0x003225, 0x003226, - 0x00FCFF, 0x003227, 0x003220, 0x00FCE5, 0x003221, 0x01251C, 0x00FCEB, 0x003222, - 0x00FCE7, 0x003223, 0x00FCCF, 0x011C6C, 0x00FA44, 0x00FC3A, 0x00FC1C, 0x00FCE6, - 0x00FC1E, 0x011C68, 0x00FC00, 0x00FC08, 0x00FC0A, 0x011C69, 0x00FC04, 0x00FC0F, - 0x00FC06, 0x011C6A, 0x00FC33, 0x011C6B, 0x011C64, 0x011C65, 0x00FC1D, 0x00FCCC, - 0x00FCCD, 0x00FCCE, 0x011C66, 0x011C67, 0x011C60, 0x011C61, 0x011C62, 0x011C63, - 0x011C7C, 0x011C7D, 0x011C7E, 0x011C7F, 0x011C78, 0x011C79, 0x011C7A, 0x011C7B, - 0x011C74, 0x011C75, 0x011C76, 0x011C77, 0x011C72, 0x0032BD, 0x0032BE, 0x0032BF, - 0x0032B8, 0x0032B9, 0x0032BA, 0x0032BB, 0x0032B4, 0x0032B5, 0x0032B6, 0x0032B7, - 0x0032B2, 0x0032B3, 0x011C5C, 0x011C5D, 0x011C5E, 0x00FF23, 0x011C59, 0x011C5A, - 0x011C2D, 0x011C2E, 0x00FC3C, 0x016A64, 0x011C27, 0x011C20, 0x011C21, 0x00FC3D, - 0x00FC3E, 0x011C22, 0x011C23, 0x016A4C, 0x00FC38, 0x00FC27, 0x00FF36, 0x00FC21, - 0x00FF37, 0x00FC23, 0x016A4D, 0x016A4E, 0x016A4F, 0x016A48, 0x00FC39, 0x016A46, - 0x011C02, 0x016A29, 0x016A2A, 0x016A2B, 0x016A24, 0x016A25, 0x016A26, 0x016A27, - 0x016A20, 0x016A21, 0x00FA48, 0x016A22, 0x016A23, 0x016A38, 0x00FA4C, 0x00FA4D, - 0x00FA4E, 0x00FA4F, 0x016A34, 0x016A35, 0x016A36, 0x016A37, 0x016A30, 0x016A31, - 0x016A32, 0x016A33, 0x016A0C, 0x016A0D, 0x016A0E, 0x016A0F, 0x016A08, 0x016A09, - 0x016A0A, 0x016A0B, 0x016A04, 0x016A05, 0x016A06, 0x00FA63, 0x00FA64, 0x00FA65, - 0x00FA66, 0x00FA67, 0x00FA68, 0x00FA69, 0x00FA6A, 0x00FA6B, 0x00FA6C, 0x00FA6D, - 0x016A07, 0x016A00, 0x00FA70, 0x016A01, 0x016A02, 0x016A03, 0x00FA74, 0x016A1C, - 0x00FA76, 0x016A1D, 0x00FA78, 0x00FA79, 0x00FA7A, 0x016A1E, 0x00FA7C, 0x00FA7D, - 0x00FA7E, 0x00FA7F, 0x016A1F, 0x016A18, 0x016A19, 0x016A1A, 0x016A1B, 0x016A14, - 0x016A15, 0x016A16, 0x016A17, 0x016A10, 0x016A11, 0x016A12, 0x016A13, 0x016AEC, - 0x016AED, 0x016AE8, 0x016AE9, 0x016AEA, 0x016AEB, 0x016AE4, 0x016AE5, 0x016AE6, - 0x016AE7, 0x016AE0, 0x016AE1, 0x016AE2, 0x016AE3, 0x011C8C, 0x011C8D, 0x011C8E, - 0x011C8F, 0x011C88, 0x011C89, 0x011C8A, 0x011C8B, 0x011C84, 0x011C85, 0x011C86, - 0x016AD9, 0x016ADA, 0x016ADB, 0x016AD4, 0x016AD5, 0x016AD6, 0x016AD7, 0x016AD0, - 0x016AD1, 0x016AD2, 0x00FC20, 0x00FC25, 0x00FC24, 0x016AD3, 0x00FC26, 0x011D46, - 0x011D58, 0x011D59, 0x011D54, 0x011D55, 0x011D56, 0x011D25, 0x011D27, 0x00306D, - 0x00306E, 0x00306F, 0x003060, 0x00FC2A, 0x003062, 0x003063, 0x00FC29, 0x00307C, - 0x00307B, 0x003050, 0x003051, 0x003052, 0x003053, 0x00FC2B, 0x003028, 0x003029, - 0x003024, 0x003025, 0x003026, 0x003027, 0x016B0C, 0x016B09, 0x016B0A, 0x016B0B, - 0x016B07, 0x016B00, 0x016B01, 0x016B02, 0x016B03, 0x016B1C, 0x016B1D, 0x016B1E, - 0x016B1F, 0x016B18, 0x016B19, 0x016B1A, 0x016B1B, 0x016B14, 0x016B15, 0x016B16, - 0x016B17, 0x016B10, 0x016B11, 0x0030EC, 0x0030ED, 0x0030EE, 0x0030EF, 0x0030E8, - 0x0030E9, 0x0030EA, 0x0030EB, 0x0030E4, 0x0030E5, 0x0030E6, 0x0030E7, 0x0030E0, - 0x0030E1, 0x0030E2, 0x0030E3, 0x0030FF, 0x0030F8, 0x0030F9, 0x0030FA, 0x0030F4, - 0x0030F5, 0x0030F6, 0x0030F7, 0x0030F0, 0x0030F1, 0x0030F2, 0x0030F3, 0x0030CC, - 0x0030CD, 0x0030CE, 0x0030CF, 0x0030C8, 0x0030C9, 0x0030CA, 0x0030CB, 0x0030C4, - 0x0030C5, 0x0030C6, 0x0030C7, 0x0030C0, 0x0030C1, 0x0030C2, 0x0030C3, 0x0030DC, - 0x00FAB1, 0x0030B0, 0x0030B1, 0x0030B2, 0x0030B3, 0x00308C, 0x00FAB0, 0x003089, - 0x00308A, 0x00308B, 0x003084, 0x003085, 0x003086, 0x003087, 0x016868, 0x01683B, - 0x0168F8, 0x0168F9, 0x00FC28, 0x0168FA, 0x0168FB, 0x0168F4, 0x00FC2C, 0x00FC2D, - 0x00FC2E, 0x00FC2F, 0x0168F5, 0x0168F6, 0x0168F7, 0x0168F0, 0x0168F1, 0x0168F2, - 0x0168F3, 0x0168CC, 0x0168CD, 0x0168CE, 0x0168CF, 0x0168D9, 0x0168DA, 0x0168DB, - 0x0168D4, 0x0168D5, 0x0168D6, 0x0168D7, 0x0168D0, 0x0168D1, 0x0168D2, 0x0168D3, - 0x0168AC, 0x0168AD, 0x0168AE, 0x0168AF, 0x0168A8, 0x0168A9, 0x0168AA, 0x0168AB, - 0x0168A4, 0x0168A5, 0x0168A6, 0x00FAB4, 0x00FABA, 0x0168A7, 0x0168A0, 0x0168A1, - 0x0168A2, 0x0168A3, 0x0168BC, 0x00FC59, 0x00FC5A, 0x00FC5B, 0x0168BD, 0x00FABB, - 0x0168BE, 0x00FC5F, 0x0168BF, 0x016888, 0x016889, 0x01688A, 0x01688B, 0x016887, - 0x01689B, 0x016968, 0x016969, 0x01696A, 0x01696B, 0x016964, 0x016965, 0x016966, - 0x016967, 0x016962, 0x016963, 0x01697C, 0x01697D, 0x016978, 0x016979, 0x01697A, - 0x01697B, 0x016974, 0x00FAB5, 0x016975, 0x016976, 0x016977, 0x016970, 0x016971, - 0x00FAB6, 0x016972, 0x016973, 0x01694C, 0x01694D, 0x01694E, 0x01694F, 0x016948, - 0x016949, 0x01694A, 0x01694B, 0x016944, 0x016945, 0x016946, 0x016947, 0x016940, - 0x016941, 0x00FAB2, 0x016942, 0x016943, 0x01695C, 0x01695D, 0x01695E, 0x01695F, - 0x016958, 0x016959, 0x01695A, 0x01695B, 0x016954, 0x016955, 0x016956, 0x016957, - 0x016950, 0x016951, 0x016952, 0x016953, 0x01692C, 0x01692D, 0x01692E, 0x01692F, - 0x016928, 0x016929, 0x01692A, 0x01692B, 0x016924, 0x016925, 0x00FA8C, 0x016926, - 0x016927, 0x016920, 0x016921, 0x016922, 0x016923, 0x01693C, 0x01693D, 0x01693E, - 0x01693F, 0x016938, 0x016939, 0x01693A, 0x01693B, 0x016934, 0x016935, 0x016936, - 0x016937, 0x016930, 0x016931, 0x016932, 0x016933, 0x01690C, 0x01690D, 0x01690E, - 0x01690F, 0x016908, 0x016909, 0x01690A, 0x01690B, 0x016904, 0x016905, 0x016906, - 0x016907, 0x016900, 0x016901, 0x016902, 0x016903, 0x01691C, 0x01691D, 0x01691E, - 0x01691F, 0x016918, 0x016919, 0x01691A, 0x01691B, 0x016914, 0x016915, 0x016916, - 0x016917, 0x016910, 0x016911, 0x016912, 0x016913, 0x0169EC, 0x0169ED, 0x0169EE, - 0x0169EF, 0x0169E8, 0x0169E9, 0x0169EA, 0x0169EB, 0x0169E4, 0x0169E5, 0x0169E6, - 0x0169E7, 0x0169E0, 0x0169E1, 0x0169E2, 0x0169E3, 0x0169FC, 0x0169FD, 0x0169FE, - 0x0169FF, 0x0169F8, 0x0169F9, 0x0169FA, 0x0169FB, 0x0169F4, 0x0169F5, 0x0169F6, - 0x0169F7, 0x0169F0, 0x00FAC0, 0x00FAC1, 0x00FAC6, 0x0169F1, 0x00FFD4, 0x00FFD5, - 0x0169F2, 0x0169F3, 0x0169CC, 0x0169CD, 0x00FAC4, 0x00FFDA, 0x0169CE, 0x0169CF, - 0x0169C8, 0x00FAC5, 0x00FAC8, 0x0169C9, 0x00FACA, 0x0169CA, 0x0169CB, 0x00FFAC, - 0x00FFAD, 0x00FFAE, 0x0169C4, 0x0169C5, 0x0169C6, 0x0169C7, 0x00FAAC, 0x00FACB, - 0x00FAD8, 0x0169C0, 0x0169C1, 0x0169C2, 0x0169C3, 0x00FAA9, 0x0169DC, 0x0169DD, - 0x0169DE, 0x00FAA4, 0x00FFA7, 0x00FAC9, 0x0169DF, 0x00FAAA, 0x00FACC, 0x00FACD, - 0x00FACE, 0x00FACF, 0x0169D8, 0x00FFAB, 0x00FFA2, 0x00FFA1, 0x00FAAE, 0x00FFA0, - 0x00FFA6, 0x00FAAD, 0x00FFA9, 0x00FFA8, 0x00FAA8, 0x00FFAA, 0x00FFA4, 0x00FAAF, - 0x00FFAF, 0x00FFA5, 0x0169D9, 0x0169DA, 0x0169DB, 0x0169D4, 0x0169D5, 0x0169D6, - 0x0169D7, 0x0169D0, 0x0169D1, 0x0169D2, 0x00FFD3, 0x0169D3, 0x0169AC, 0x0169AD, - 0x0169AE, 0x0169AF, 0x0169A8, 0x0169A9, 0x0169AA, 0x0169AB, 0x0169A4, 0x00FAC2, - 0x0169A5, 0x0169A6, 0x0169A7, 0x0169A0, 0x0169A1, 0x0169A2, 0x0169A3, 0x0169BC, - 0x0169BD, 0x0169BE, 0x0169BF, 0x0169B8, 0x0169B9, 0x0169BA, 0x0169BB, 0x0169B4, - 0x0169B5, 0x0169B6, 0x0169B7, 0x0169B0, 0x0169B1, 0x0169B2, 0x0169B3, 0x01698C, - 0x01698D, 0x01698E, 0x00FAD0, 0x01698F, 0x00FFD2, 0x00FFD6, 0x016988, 0x00FAD5, - 0x00FAD6, 0x00FFD7, 0x016989, 0x00FAD9, 0x01698A, 0x01698B, 0x016984, 0x00FAD4, - 0x00FFDB, 0x016985, 0x00FA10, 0x016986, 0x00FA12, 0x00FF84, 0x00FA14, 0x00FA15, - 0x00FA16, 0x00FA17, 0x00FA18, 0x00FF88, 0x00FA1A, 0x00FF8B, 0x00FF8D, 0x00FA1B, - 0x00FF8F, 0x00FF8E, 0x016987, 0x00FA11, 0x016980, 0x00FA13, 0x016981, 0x016982, - 0x016983, 0x01699C, 0x01699D, 0x01699E, 0x01699F, 0x016998, 0x016999, 0x01699A, - 0x01699B, 0x016994, 0x016995, 0x016996, 0x016997, 0x00FFA3, 0x016990, 0x016991, - 0x016992, 0x016993, 0x0118EC, 0x00FFBD, 0x0118ED, 0x0118EE, 0x00FFBE, 0x00FFBC, - 0x0118EF, 0x00FAA3, 0x00FFB0, 0x00FFB5, 0x00FFB6, 0x0118E8, 0x00FABC, 0x00FABD, - 0x00FABE, 0x00FFB7, 0x00FABF, 0x00FFB9, 0x00FFBA, 0x00FFBB, 0x00FAB8, 0x00FAB9, - 0x00FFB4, 0x00FFB8, 0x0118E9, 0x0118EA, 0x0118EB, 0x0118E4, 0x0118E5, 0x0118E6, - 0x0118E7, 0x0118E0, 0x0118E1, 0x0118E2, 0x0118E3, 0x0118FF, 0x0118F0, 0x0118F1, - 0x0118F2, 0x0118CC, 0x0118CD, 0x0118CE, 0x0118CF, 0x0118C8, 0x0118C9, 0x0118CA, - 0x0118CB, 0x0118C4, 0x0118C5, 0x0118C6, 0x0118C7, 0x0118C0, 0x0118C1, 0x0118C2, - 0x0118C3, 0x0118DC, 0x0118DD, 0x0118DE, 0x0118DF, 0x0118D8, 0x0118D9, 0x0118DA, - 0x0118DB, 0x0118D4, 0x0118D5, 0x0118D6, 0x0118D7, 0x0118D0, 0x0118D1, 0x0118D2, - 0x0118D3, 0x0118AC, 0x0118AD, 0x0118AE, 0x0118AF, 0x0118A8, 0x0118A9, 0x0118AA, - 0x0118AB, 0x0118A4, 0x0118A5, 0x0118A6, 0x0118A7, 0x0118A0, 0x0118A1, 0x0118A2, - 0x0118A3, 0x0118BC, 0x0118BD, 0x0118BE, 0x0118BF, 0x0118B8, 0x0118B9, 0x0118BA, - 0x0118BB, 0x0118B4, 0x0118B5, 0x0118B6, 0x0118B7, 0x0118B0, 0x0118B1, 0x0118B2, - 0x0118B3, 0x002C6C, 0x002C6D, 0x002C6E, 0x002C6F, 0x002C68, 0x002C69, 0x002C6A, - 0x002C6B, 0x002C64, 0x002C65, 0x002C66, 0x002C67, 0x002C60, 0x002C61, 0x002C62, - 0x002C63, 0x002C7E, 0x002C7F, 0x002C78, 0x002C79, 0x002C7A, 0x002C7B, 0x002C74, - 0x002C75, 0x002C76, 0x002C77, 0x002C70, 0x002C71, 0x002C72, 0x002C73, 0x002C4C, - 0x002C4D, 0x002C4E, 0x002C4F, 0x002C48, 0x002C49, 0x002C4A, 0x002C4B, 0x002C44, - 0x002C45, 0x002C46, 0x002C47, 0x002C40, 0x002C41, 0x002C42, 0x002C43, 0x002C5C, - 0x002C5D, 0x002C5E, 0x00FCD8, 0x00FCDD, 0x00FCDC, 0x002C58, 0x00FCD4, 0x00FCDE, - 0x00FCD6, 0x00FCDF, 0x002C59, 0x00FCD9, 0x00FCDA, 0x002C5A, 0x002C5B, 0x002C54, - 0x002C55, 0x002C56, 0x002C57, 0x002C50, 0x002C51, 0x002C52, 0x002C53, 0x002C2C, - 0x002C2D, 0x002C2E, 0x002C28, 0x002C29, 0x002C2A, 0x002C2B, 0x002C24, 0x002C25, - 0x002C26, 0x002C27, 0x002C20, 0x002C21, 0x002C22, 0x002C23, 0x002C3C, 0x00FCC5, - 0x002C3D, 0x002C3E, 0x002C3F, 0x002C38, 0x002C39, 0x002C3A, 0x002C3B, 0x002C34, - 0x002C35, 0x002C36, 0x002C37, 0x002C30, 0x002C31, 0x002C32, 0x002C33, 0x002C0C, - 0x002C0D, 0x002C0E, 0x002C0F, 0x002C08, 0x002C09, 0x002C0A, 0x002C0B, 0x002C04, - 0x002C05, 0x002C06, 0x00FC80, 0x00FC81, 0x00FC82, 0x00FCD2, 0x00FC84, 0x00FCD5, - 0x00FCD0, 0x00FC87, 0x00FC88, 0x00FC89, 0x00FC8A, 0x00FC8B, 0x00FC8C, 0x002C07, - 0x00FCDB, 0x00FC8F, 0x00FCC1, 0x00FC90, 0x00FC91, 0x00FC92, 0x00FCC2, 0x00FC94, - 0x002C00, 0x00FC96, 0x00FCD1, 0x00FCC0, 0x00FCD3, 0x00FCC7, 0x00FC93, 0x00FC97, - 0x00FCC6, 0x00FC95, 0x00FCA4, 0x00FCA1, 0x00FCA2, 0x00FC83, 0x00FCB9, 0x00FCD7, - 0x00FCC3, 0x00FCA7, 0x002C01, 0x00FCBB, 0x002C02, 0x00FCFB, 0x00FCCB, 0x00FCF3, - 0x00FCBA, 0x002C03, 0x00FCB0, 0x00FCB1, 0x00FCB2, 0x00FCB3, 0x00FCB4, 0x00FCB5, - 0x00FCB6, 0x00FCB7, 0x00FC98, 0x00FC99, 0x00FC9A, 0x00FC9B, 0x00FC9C, 0x00FC9D, - 0x00FC9E, 0x00FC9F, 0x002C1C, 0x002C1D, 0x002C1E, 0x002C1F, 0x002C18, 0x002C19, - 0x002C1A, 0x002C1B, 0x00FCBC, 0x002C14, 0x002C15, 0x002C16, 0x002C17, 0x00FCBD, - 0x00FCBE, 0x00FCBF, 0x002C10, 0x002C11, 0x002C12, 0x00FCA3, 0x002C13, 0x002CEC, - 0x002CED, 0x002CEE, 0x002CEB, 0x00FCE1, 0x00FCE2, 0x002CE4, 0x00FCE0, 0x00FCB8, - 0x002CE0, 0x002CE1, 0x002CE2, 0x002CE3, 0x002CFD, 0x002CF2, 0x002CF3, 0x002CCC, - 0x002CCD, 0x00FCAF, 0x00FCA8, 0x00FCA9, 0x00FCAA, 0x00FCAB, 0x00FCAC, 0x00FCAD, - 0x00FCAE, 0x002CCE, 0x002CCF, 0x002CC8, 0x002CC9, 0x002CCA, 0x002CCB, 0x002CC4, - 0x002CC5, 0x002CC6, 0x002CC7, 0x002CC0, 0x002CC1, 0x002CC2, 0x002CC3, 0x002CDC, - 0x002CDD, 0x002CDE, 0x002CDF, 0x002CD8, 0x002CD9, 0x002CDA, 0x002CDB, 0x002CD4, - 0x002CD5, 0x002CD6, 0x002CD7, 0x002CD0, 0x002CD1, 0x002CD2, 0x002CD3, 0x002CAC, - 0x002CAD, 0x002CAE, 0x002CAF, 0x002CA8, 0x002CA9, 0x002CAA, 0x002CAB, 0x002CA4, - 0x002CA5, 0x002CA6, 0x002CA7, 0x002CA0, 0x002CA1, 0x002CA2, 0x002CA3, 0x002CBC, - 0x002CBD, 0x002CBE, 0x002CBF, 0x002CB8, 0x002CB9, 0x002CBA, 0x002CBB, 0x002CB4, - 0x002CB6, 0x002CB7, 0x002CB0, 0x002CB1, 0x002CB2, 0x002CB3, 0x002C8C, 0x002C8D, - 0x002C8E, 0x002C8F, 0x002C88, 0x002C8B, 0x002C84, 0x011623, 0x002D64, 0x002D65, - 0x002D66, 0x002D67, 0x002D60, 0x002D61, 0x002D62, 0x002D63, 0x01160C, 0x01160D, - 0x01160E, 0x01160F, 0x011608, 0x011609, 0x01160A, 0x01160B, 0x011604, 0x011605, - 0x011606, 0x011607, 0x011600, 0x011601, 0x011602, 0x002D5D, 0x00FD7C, 0x00FD6D, - 0x002D5E, 0x002D5F, 0x00FD50, 0x00FD51, 0x00FD52, 0x002D58, 0x00FD54, 0x00FD55, - 0x00FD56, 0x00FD57, 0x00FD58, 0x00FD59, 0x00FD5A, 0x00FD5B, 0x00FD5C, 0x00FD5D, - 0x00FD5E, 0x00FD5F, 0x00FD78, 0x00FD7D, 0x00FD7E, 0x00FD62, 0x00FD74, 0x00FD75, - 0x00FD76, 0x00FD7F, 0x00FD67, 0x00FD79, 0x00FD7A, 0x00FD61, 0x002D59, 0x00FD60, - 0x00FD6B, 0x002D5A, 0x00FD65, 0x00FD71, 0x00FD72, 0x00FD73, 0x00FD64, 0x00FD70, - 0x00FD66, 0x00FD77, 0x00FD68, 0x00FD7B, 0x00FD6A, 0x00FD63, 0x00FD6C, 0x00FD69, - 0x00FD6E, 0x00FD6F, 0x002D5B, 0x002D54, 0x002D55, 0x002D56, 0x002D57, 0x002D50, - 0x002D51, 0x002D52, 0x002D53, 0x002D2D, 0x002D24, 0x002D25, 0x002D27, 0x002D20, - 0x002D21, 0x002D22, 0x002D23, 0x002D3C, 0x002D3D, 0x002D3E, 0x002D3F, 0x002D38, - 0x002D3B, 0x002D34, 0x002D0D, 0x002D0E, 0x002D0F, 0x002D08, 0x002D09, 0x002D0A, - 0x002D0B, 0x002D04, 0x002D05, 0x002D06, 0x002D07, 0x002D00, 0x002D01, 0x002D02, - 0x002D03, 0x002D1C, 0x002D1D, 0x002D1E, 0x002D1F, 0x002D18, 0x002D14, 0x0116A3, - 0x01168C, 0x01168D, 0x01168E, 0x01168F, 0x011688, 0x011689, 0x01168A, 0x01168B, - 0x011684, 0x011685, 0x011686, 0x011687, 0x011680, 0x011681, 0x011682, 0x01169E, - 0x011696, 0x002DDD, 0x002DDE, 0x002DD8, 0x002DD9, 0x002DDA, 0x002DDB, 0x002DD4, - 0x002DD5, 0x002DD6, 0x002DD0, 0x002DD1, 0x002DD2, 0x002DD3, 0x002DAC, 0x002DAD, - 0x002DAE, 0x002DA8, 0x002DA9, 0x002DAA, 0x002DAB, 0x002DA4, 0x002DA5, 0x002DA6, - 0x002DA0, 0x002DA1, 0x002DA2, 0x002DA3, 0x01E807, 0x002DBC, 0x002DBD, 0x002DBE, - 0x002DB8, 0x002DB9, 0x002DBA, 0x002DBB, 0x002DB4, 0x002DB5, 0x002DB6, 0x002DB0, - 0x01E817, 0x002DB1, 0x002DB2, 0x002DB3, 0x002D8C, 0x002D8D, 0x002D8E, 0x002D8F, - 0x002D88, 0x002D89, 0x002D8A, 0x002D8B, 0x01E83B, 0x002D84, 0x002D85, 0x002D86, - 0x002D87, 0x01E830, 0x01E831, 0x002D80, 0x002D81, 0x01E834, 0x002D82, 0x002D83, - 0x01E837, 0x002D94, 0x01E832, 0x002D95, 0x002D96, 0x002D90, 0x00FD04, 0x00FD05, - 0x00FD06, 0x00FD07, 0x00FD08, 0x00FD09, 0x00FD0A, 0x00FD0F, 0x00FD0C, 0x00FD0D, - 0x00FD0E, 0x00FD1F, 0x00FD10, 0x00FD11, 0x00FD12, 0x00FD13, 0x002D91, 0x00FD16, - 0x00FD1B, 0x00FD17, 0x002D92, 0x00FD18, 0x002D93, 0x011738, 0x00FD15, 0x00FD14, - 0x011739, 0x01173A, 0x01173B, 0x011734, 0x011735, 0x011736, 0x011737, 0x011730, - 0x011731, 0x011732, 0x011733, 0x01170C, 0x01170D, 0x01170E, 0x01170F, 0x011708, - 0x011709, 0x01170A, 0x00FD30, 0x01170B, 0x011704, 0x011705, 0x00FD35, 0x00FD34, - 0x011706, 0x00FD33, 0x011707, 0x011700, 0x011701, 0x011702, 0x011703, 0x00FD3D, - 0x011718, 0x011719, 0x011714, 0x011715, 0x011716, 0x011717, 0x011710, 0x011711, - 0x011712, 0x011713, 0x011448, 0x011449, 0x01144A, 0x011447, 0x011458, 0x011459, - 0x011454, 0x011455, 0x011456, 0x011457, 0x011450, 0x011451, 0x011452, 0x011453, - 0x01142C, 0x01142D, 0x01142E, 0x01142F, 0x011428, 0x011429, 0x01142A, 0x01142B, - 0x011424, 0x011425, 0x011426, 0x011427, 0x011420, 0x011421, 0x011422, 0x011423, - 0x011434, 0x011430, 0x011431, 0x011432, 0x011433, 0x01140C, 0x01140D, 0x01140E, - 0x01140F, 0x011408, 0x011409, 0x01140A, 0x01140B, 0x011404, 0x011405, 0x011406, - 0x011407, 0x011400, 0x011401, 0x011402, 0x011403, 0x01141C, 0x01141D, 0x01141E, - 0x01141F, 0x011418, 0x011419, 0x01B066, 0x01B067, 0x01B060, 0x01B061, 0x01B062, - 0x01B063, 0x01B07C, 0x01B07D, 0x01B07E, 0x01B07F, 0x01B078, 0x01B079, 0x01B07A, - 0x01B07B, 0x01B074, 0x01B075, 0x01B076, 0x01B077, 0x01B070, 0x01B071, 0x01B072, - 0x01B073, 0x01B04C, 0x01B04D, 0x01B04E, 0x01B04F, 0x01B048, 0x01B049, 0x01B04A, - 0x01B04B, 0x01B044, 0x01B045, 0x01B046, 0x01B047, 0x01B040, 0x00FDA4, 0x00FDA5, - 0x00FDAC, 0x01B041, 0x00FDA8, 0x00FDA9, 0x00FDAA, 0x00FDAB, 0x00FDAE, 0x00FDAD, - 0x01B042, 0x00FDAF, 0x01B043, 0x01B05C, 0x01B05D, 0x01B058, 0x01B05A, 0x01B05B, - 0x01B054, 0x01B055, 0x01B056, 0x01B057, 0x01B050, 0x01B051, 0x01B02C, 0x00FEC4, - 0x01B02D, 0x01B036, 0x00FEC7, 0x00FEC2, 0x01B037, 0x00FDC3, 0x00FEC0, 0x00FEC1, - 0x01B030, 0x00FEC5, 0x01B031, 0x01B032, 0x01B033, 0x00FEC6, 0x01B00C, 0x01B00D, - 0x01B00E, 0x00FDF9, 0x00FDF1, 0x00FDFB, 0x00FDF7, 0x01B00F, 0x01B008, 0x00FDF5, - 0x00FDF6, 0x01B009, 0x01B00A, 0x01B00B, 0x01B004, 0x01B005, 0x00FDF4, 0x01B0E6, - 0x00FDF8, 0x01B0E7, 0x00FDF0, 0x01B0E0, 0x00FDF2, 0x01B0E1, 0x01B0E2, 0x01B0E3, - 0x01B0FC, 0x01B0FD, 0x01B0FE, 0x01B0FF, 0x01B0F8, 0x01B0F9, 0x01B0FA, 0x01B0FB, - 0x00FEDC, 0x01B0F4, 0x01B0F5, 0x01B0F6, 0x01B0F7, 0x01B0F0, 0x01B0F1, 0x01B0F2, - 0x01B0F3, 0x00FEC3, 0x01B0CC, 0x01B0CD, 0x01B0CE, 0x01B0CF, 0x01B0C8, 0x01B0C9, - 0x01B0CA, 0x01B0CB, 0x01B0C4, 0x01B0C5, 0x01B0C6, 0x01B0C7, 0x00FDA2, 0x01B0C0, - 0x01B0C1, 0x01B0C2, 0x01B0C3, 0x01B0DC, 0x01B0DD, 0x01B0DE, 0x01B0DF, 0x01B0D8, - 0x01B0D9, 0x00FDA1, 0x01B0DA, 0x01B0DB, 0x01B0D4, 0x01B0D5, 0x00FDA0, 0x01B0D6, - 0x01B0D7, 0x01B0D0, 0x01B0D1, 0x01B0D2, 0x01B0D3, 0x01B0AC, 0x01B0AD, 0x01B0AE, - 0x01B0AF, 0x01B0A8, 0x01B0A9, 0x01B0AA, 0x01B0AB, 0x01B0A4, 0x01B0A5, 0x01B0A6, - 0x01B0A7, 0x01B0A0, 0x01B0A1, 0x01B0A2, 0x01B0A3, 0x01B0BC, 0x01B0BD, 0x01B0BE, - 0x01B0BF, 0x01B0B8, 0x01B0B9, 0x01B0BA, 0x01B0BB, 0x01B0B4, 0x01B0B5, 0x01B0B6, - 0x01B0B7, 0x01B0B0, 0x01B0B1, 0x01B0B2, 0x01B0B3, 0x01B08C, 0x01B08D, 0x01B08E, - 0x01B08F, 0x01B088, 0x01B089, 0x01B08A, 0x01B08B, 0x01B084, 0x01B085, 0x01B086, - 0x01B087, 0x01B080, 0x01B081, 0x01B082, 0x01B083, 0x01B09C, 0x01B09D, 0x01B09E, - 0x01B09F, 0x01B098, 0x01B099, 0x01B09A, 0x01B09B, 0x01B094, 0x01B095, 0x01B096, - 0x01B097, 0x01B090, 0x01B091, 0x01B092, 0x01B093, 0x0115D8, 0x0115D9, 0x0115DA, - 0x0115DB, 0x0115AC, 0x0115AD, 0x0115AE, 0x0115A8, 0x0115A9, 0x0115AA, 0x0115AB, - 0x0115A4, 0x0115A5, 0x0115A6, 0x0115A7, 0x0115A0, 0x0115A1, 0x0115A2, 0x0115A3, - 0x01B10C, 0x01B10D, 0x01B10E, 0x01B10F, 0x01B108, 0x01B109, 0x01B10A, 0x00FDA7, - 0x01B10B, 0x01B104, 0x01B105, 0x011585, 0x01159A, 0x01159B, 0x011594, 0x011595, - 0x00FDA6, 0x011596, 0x00FD81, 0x00FF2D, 0x00FF2E, 0x011597, 0x00FD80, 0x00FD84, - 0x00FD87, 0x00FD86, 0x00FD8B, 0x00FD89, 0x00FD88, 0x00FF2F, 0x00FD85, 0x00FD8E, - 0x00FD8D, 0x00FD8F, 0x00FD93, 0x011590, 0x00FD92, 0x011591, 0x00FD96, 0x00FD94, - 0x011592, 0x011593, 0x011228, 0x011229, 0x01122A, 0x00FDBC, 0x00FD8C, 0x00FD9C, - 0x00FD9B, 0x00FF2C, 0x01122B, 0x011224, 0x00FF2B, 0x011225, 0x011226, 0x011227, - 0x011220, 0x011221, 0x00FF21, 0x011222, 0x00FDBD, 0x00FF22, 0x00FF25, 0x00FF24, - 0x00FF27, 0x00FF26, 0x00FDB7, 0x00FDBB, 0x00FDB2, 0x00FDB0, 0x00FDB6, 0x00FF28, - 0x00FF2A, 0x00FDB5, 0x00FDB8, 0x00FDB9, 0x00FDBA, 0x00FF29, 0x011223, 0x00FDB4, - 0x00FDBE, 0x00FDBF, 0x00FEE8, 0x00FEEC, 0x01120C, 0x01120D, 0x00FECC, 0x00FEED, - 0x00FEEE, 0x01120E, 0x00FECA, 0x00FEC9, 0x00FF53, 0x00FECB, 0x00FEC8, 0x00FECD, - 0x00FECE, 0x00FECF, 0x00FF50, 0x00FF51, 0x00FF52, 0x01120F, 0x011208, 0x011209, - 0x01120A, 0x00FF56, 0x01120B, 0x011204, 0x011205, 0x011206, 0x011207, 0x011200, - 0x011201, 0x011202, 0x00FEF8, 0x00FEE2, 0x00FDA3, 0x00FEE3, 0x00FEE0, 0x00FEE1, - 0x00FEFC, 0x00FEE5, 0x00FEF9, 0x00FEE9, 0x00FEEA, 0x00FEEF, 0x00FEE4, 0x00FEEB, - 0x00FEE6, 0x00FEE7, 0x00FF54, 0x00FF55, 0x00FEF2, 0x00FEF3, 0x00FEF0, 0x00FEF1, - 0x00FEF7, 0x00FF57, 0x00FF58, 0x00FEFA, 0x00FF5A, 0x00FF59, 0x00FEF4, 0x00FEF5, - 0x00FEF6, 0x00FEFB, 0x011203, 0x01121C, 0x01121D, 0x01121E, 0x01121F, 0x011218, - 0x011219, 0x01121A, 0x01121B, 0x011214, 0x011215, 0x011216, 0x011217, 0x011210, - 0x011211, 0x011213, 0x0112F8, 0x0112F9, 0x0112F4, 0x0112F5, 0x0112F6, 0x0112F7, - 0x0112F0, 0x0112F1, 0x0112F2, 0x0112F3, 0x0112CC, 0x0112CD, 0x0112CE, 0x0112CF, - 0x0112C8, 0x0112C9, 0x0112CA, 0x0112CB, 0x0112C4, 0x0112C5, 0x0112C6, 0x0112C7, - 0x0112C0, 0x0112C1, 0x0112C2, 0x0112C3, 0x0112DC, 0x0112DD, 0x0112DE, 0x0112D8, - 0x0112D9, 0x0112DA, 0x0112DB, 0x0112D4, 0x0112D5, 0x0112D6, 0x0112D7, 0x0112D0, - 0x0112D1, 0x0112D2, 0x0112D3, 0x0112A8, 0x0112A4, 0x0112A5, 0x0112A6, 0x0112A7, - 0x0112A0, 0x0112A1, 0x0112A2, 0x0112A3, 0x0112BC, 0x0112BD, 0x0112BE, 0x0112BF, - 0x0112B8, 0x0112B9, 0x0112BA, 0x0112BB, 0x0112B4, 0x0112B5, 0x0112B6, 0x0112B7, - 0x0112B0, 0x0112B1, 0x0112B2, 0x0112B3, 0x01128C, 0x01128D, 0x01128F, 0x011288, - 0x01128A, 0x01128B, 0x011284, 0x011285, 0x011286, 0x011280, 0x011281, 0x011282, - 0x011283, 0x01129C, 0x01129D, 0x01129F, 0x011298, 0x011299, 0x01129A, 0x01129B, - 0x011294, 0x011295, 0x011296, 0x011297, 0x011290, 0x011291, 0x011292, 0x011293, - 0x011360, 0x011361, 0x01135D, 0x01135E, 0x01135F, 0x011350, 0x01132C, 0x01132D, - 0x01132E, 0x01132F, 0x011328, 0x01132A, 0x01132B, 0x011324, 0x011325, 0x011326, - 0x011327, 0x011320, 0x011321, 0x011322, 0x011323, 0x01133D, 0x011338, 0x011339, - 0x011335, 0x011336, 0x011337, 0x011330, 0x011332, 0x011333, 0x01130C, 0x01130F, - 0x011308, 0x011309, 0x01130A, 0x01130B, 0x011305, 0x011306, 0x011307, 0x01131C, - 0x01131D, 0x01131E, 0x01131F, 0x011318, 0x011319, 0x01131A, 0x01131B, 0x011314, - 0x011315, 0x011316, 0x011317, 0x011310, 0x011313, 0x01106C, 0x01106D, 0x01106E, - 0x01106F, 0x011068, 0x011069, 0x01106A, 0x01106B, 0x011064, 0x011065, 0x011066, - 0x011067, 0x011060, 0x011061, 0x011062, 0x011063, 0x01105C, 0x01105D, 0x01105E, - 0x01105F, 0x011058, 0x011059, 0x01105A, 0x01105B, 0x011054, 0x011055, 0x011056, - 0x011057, 0x011052, 0x011053, 0x01102C, 0x01102D, 0x01102E, 0x01102F, 0x011028, - 0x011029, 0x01102A, 0x01102B, 0x011024, 0x011025, 0x011026, 0x011027, 0x011020, - 0x011021, 0x011022, 0x011023, 0x011034, 0x011035, 0x011036, 0x011037, 0x011030, - 0x011031, 0x011032, 0x01100B, 0x011004, 0x011007, 0x011003, 0x01101C, 0x01101D, - 0x01101E, 0x01101F, 0x011018, 0x011019, 0x01101A, 0x01101B, 0x011014, 0x011015, - 0x011016, 0x011017, 0x011010, 0x011011, 0x011012, 0x011013, 0x0110E8, 0x0110E4, - 0x0110E5, 0x0110E6, 0x0110E7, 0x0110E0, 0x0110E1, 0x0110E2, 0x0110E3, 0x0110F8, - 0x0110F9, 0x0110F4, 0x0110F5, 0x0110F6, 0x0110F7, 0x0110F0, 0x0110F1, 0x0110F2, - 0x0110F3, 0x0110DC, 0x0110DD, 0x0110DE, 0x0110DF, 0x0110D8, 0x0110D9, 0x0110DA, - 0x0110DB, 0x0110D4, 0x0110D5, 0x0110D6, 0x0110D7, 0x0110D0, 0x0110D1, 0x0110D2, - 0x0110D3, 0x0110AC, 0x0110AD, 0x0110AE, 0x0110AF, 0x0110A8, 0x0110A9, 0x0110AA, - 0x0110AB, 0x0110A4, 0x0110A5, 0x0110A6, 0x0110A7, 0x0110A0, 0x0110A1, 0x0110A2, - 0x0110A3, 0x01108C, 0x01108D, 0x01108E, 0x01108F, 0x011088, 0x011089, 0x01108A, - 0x01108B, 0x011084, 0x011085, 0x011086, 0x011087, 0x011083, 0x01109C, 0x01109D, - 0x01109E, 0x01109F, 0x011098, 0x011099, 0x01109A, 0x01109B, 0x011094, 0x011095, - 0x011096, 0x011097, 0x011090, 0x011091, 0x011092, 0x011093, 0x01116C, 0x01116D, - 0x01116E, 0x01116F, 0x011168, 0x011169, 0x01116A, 0x01116B, 0x011164, 0x011165, - 0x011166, 0x011167, 0x011160, 0x011161, 0x011162, 0x011163, 0x011176, 0x011170, - 0x011171, 0x011172, 0x00278C, 0x011153, 0x011124, 0x011125, 0x011126, 0x002790, - 0x002465, 0x002466, 0x002461, 0x002462, 0x002463, 0x00247C, 0x002471, 0x002472, - 0x002473, 0x011103, 0x01111C, 0x01111D, 0x01111E, 0x01111F, 0x011118, 0x011119, - 0x01111A, 0x01111B, 0x011114, 0x011115, 0x011116, 0x011117, 0x011110, 0x011111, - 0x011112, 0x011113, 0x0111EC, 0x0111ED, 0x0111EE, 0x0111EF, 0x0111E8, 0x0111E9, - 0x0111EA, 0x0111EB, 0x0111E4, 0x0111E5, 0x0111E6, 0x0111E7, 0x0111E1, 0x0111E2, - 0x0111E3, 0x0111F4, 0x0111F0, 0x0111F1, 0x0111F2, 0x01E8AE, 0x01E8B4, 0x0111F3, - 0x0111C4, 0x0111C1, 0x01E8B9, 0x01E8BE, 0x01E8B8, 0x0111C2, 0x01E8A9, 0x01E8BA, - 0x01E8AA, 0x0111C3, 0x0111DC, 0x0111D8, 0x01E887, 0x01E880, 0x01E881, 0x0111D9, - 0x0111DA, 0x0111D4, 0x0111D5, 0x0111D6, 0x01E884, 0x0111D7, 0x0111D0, 0x01E886, - 0x01E885, 0x0111D1, 0x01E890, 0x0111D2, 0x01E889, 0x01E888, 0x01E88D, 0x0111D3, - 0x0111AC, 0x0111AD, 0x01E898, 0x0111AE, 0x01E88A, 0x0111AF, 0x0111A8, 0x0111A9, - 0x0111AA, 0x0111AB, 0x0111A4, 0x0111A5, 0x01E8C3, 0x0111A6, 0x0111A7, 0x0111A0, - 0x0111A1, 0x0111A2, 0x01E88F, 0x0024ED, 0x0024EE, 0x0024EF, 0x0024EA, 0x0024EB, - 0x0111B0, 0x0111B1, 0x0111B2, 0x0024FC, 0x0024F1, 0x0024F2, 0x0024F3, 0x011183, - 0x01119C, 0x01119D, 0x01119E, 0x01119F, 0x011198, 0x01E88C, 0x01E8CA, 0x01E88E, - 0x011199, 0x01119A, 0x01119B, 0x011194, 0x011195, 0x011196, 0x011197, 0x011190, - 0x011191, 0x011192, 0x011193, 0x010E6C, 0x010E6D, 0x010E6E, 0x010E6F, 0x010E68, - 0x010E69, 0x010E6A, 0x010E6B, 0x010E64, 0x010E65, 0x010E66, 0x010E67, 0x010E60, - 0x010E61, 0x010E62, 0x010E63, 0x010E7C, 0x010E7D, 0x010E7E, 0x010E78, 0x010E79, - 0x010E7A, 0x010E7B, 0x010E74, 0x010E75, 0x010E76, 0x010E77, 0x010E70, 0x010E71, - 0x010E72, 0x010E73, 0x00248C, 0x00248D, 0x00248E, 0x00248F, 0x002488, 0x002489, - 0x00248A, 0x00248B, 0x002484, 0x002485, 0x002486, 0x002487, 0x002480, 0x002481, - 0x002482, 0x002483, 0x002498, 0x002499, 0x00249A, 0x00249B, 0x002494, 0x002495, - 0x002496, 0x002497, 0x002490, 0x002491, 0x002492, 0x002493, 0x010C48, 0x010C44, - 0x010C45, 0x010C46, 0x010C47, 0x010C40, 0x010C41, 0x010C42, 0x010C43, 0x010C2C, - 0x010C2D, 0x010C2E, 0x010C2F, 0x010C28, 0x010C29, 0x010C2A, 0x010C2B, 0x010C24, - 0x010C25, 0x010C26, 0x010C27, 0x010C20, 0x010C21, 0x010C22, 0x010C23, 0x010C3C, - 0x010C3D, 0x010C3E, 0x010C3F, 0x010C38, 0x010C39, 0x010C3A, 0x010C3B, 0x010C34, - 0x010C35, 0x010C36, 0x010C37, 0x010C30, 0x010C31, 0x010C32, 0x010C33, 0x010C0C, - 0x010C0D, 0x010C0E, 0x010C0F, 0x010C08, 0x010C09, 0x010C0A, 0x010C0B, 0x010C04, - 0x010C05, 0x010C06, 0x010C07, 0x010C00, 0x010C01, 0x010C02, 0x010C03, 0x010C1C, - 0x010C1D, 0x010C1E, 0x010C1F, 0x010C18, 0x010C19, 0x010C1A, 0x010C1B, 0x010C14, - 0x010C15, 0x010C16, 0x010C17, 0x010C10, 0x010C11, 0x010C12, 0x010C13, 0x010CEC, - 0x010CED, 0x010CEE, 0x010CEF, 0x010CE8, 0x010CE9, 0x010CEA, 0x010CEB, 0x010CE4, - 0x010CE5, 0x010CE6, 0x010CE7, 0x010CE0, 0x010CE1, 0x010CE2, 0x010CE3, 0x010CFC, - 0x010CFD, 0x010CFE, 0x010CFF, 0x010CFA, 0x010CFB, 0x010CF0, 0x010CF1, 0x010CF2, - 0x010CCC, 0x010CCD, 0x010CCE, 0x010CCF, 0x010CC8, 0x010CC9, 0x010CCA, 0x010CCB, - 0x010CC4, 0x010CC5, 0x010CC6, 0x010CC7, 0x010CC0, 0x010CC1, 0x010CC2, 0x010CC3, - 0x010CDC, 0x010CDD, 0x010CDE, 0x010CDF, 0x010CD8, 0x010CD9, 0x010CDA, 0x010CDB, - 0x010CD4, 0x010CD5, 0x010CD6, 0x010CD7, 0x010CD0, 0x010CD1, 0x010CD2, 0x010CD3, - 0x010CAC, 0x010CAD, 0x010CAE, 0x010CAF, 0x010CA8, 0x010CA9, 0x010CAA, 0x010CAB, - 0x010CA4, 0x010CA5, 0x010CA6, 0x010CA7, 0x010CA0, 0x010CA1, 0x010CA2, 0x010CA3, - 0x010CB0, 0x010CB1, 0x010CB2, 0x010C8C, 0x010C8D, 0x010C8E, 0x010C8F, 0x010C88, - 0x010C89, 0x010C8A, 0x010C8B, 0x010C84, 0x010C85, 0x010C86, 0x010C87, 0x010C80, - 0x010C81, 0x010C82, 0x010C83, 0x010C9C, 0x010C9D, 0x010C9E, 0x010C9F, 0x010C98, - 0x010C99, 0x010C9A, 0x010C9B, 0x010C94, 0x010C95, 0x010C96, 0x010C97, 0x010C90, - 0x010C91, 0x010C92, 0x010C93, 0x002078, 0x002079, 0x002074, 0x002075, 0x002076, - 0x002077, 0x002070, 0x010A6C, 0x010A6D, 0x010A6E, 0x010A6F, 0x010A68, 0x010A69, - 0x010A6A, 0x010A6B, 0x010A64, 0x010A65, 0x010A66, 0x010A67, 0x010A60, 0x010A61, - 0x010A62, 0x010A63, 0x010A7C, 0x010A7D, 0x010A7E, 0x010A78, 0x010A79, 0x010A7A, - 0x010A7B, 0x010A74, 0x010A75, 0x010A76, 0x010A77, 0x010A70, 0x010A71, 0x010A72, - 0x010A73, 0x010A44, 0x010A45, 0x010A46, 0x010A47, 0x010A40, 0x010A41, 0x010A42, - 0x010A43, 0x002088, 0x002089, 0x002084, 0x002085, 0x002086, 0x002087, 0x002080, - 0x002081, 0x002082, 0x002083, 0x010A2C, 0x010A2D, 0x010A2E, 0x010A2F, 0x010A28, - 0x010A29, 0x010A2A, 0x010A2B, 0x010A24, 0x010A25, 0x010A26, 0x010A27, 0x010A20, - 0x010A21, 0x010A22, 0x00216D, 0x00216E, 0x00216F, 0x002168, 0x002169, 0x00216A, - 0x00216B, 0x002164, 0x002165, 0x002166, 0x002167, 0x002160, 0x00217D, 0x00217E, - 0x00217F, 0x002178, 0x002179, 0x00217A, 0x00217B, 0x002174, 0x002175, 0x002176, - 0x002177, 0x002170, 0x002172, 0x002173, 0x010A1C, 0x010A1E, 0x002149, 0x010A19, - 0x010A1A, 0x010A1B, 0x002145, 0x010A17, 0x010A10, 0x010A11, 0x010A12, 0x002159, - 0x00215A, 0x00215B, 0x002156, 0x002157, 0x002150, 0x00212D, 0x00212F, 0x002128, - 0x00212A, 0x00212B, 0x002124, 0x002126, 0x00213C, 0x002139, 0x010AC9, 0x010ACA, - 0x010ADF, 0x010AD8, 0x010ADB, 0x010AD4, 0x010AD5, 0x010AD7, 0x010AD0, 0x010AD2, - 0x00211D, 0x002119, 0x00211A, 0x00211B, 0x002115, 0x002110, 0x002111, 0x002112, - 0x002113, 0x010A8C, 0x010A8D, 0x010A8E, 0x010A8F, 0x010A88, 0x010A89, 0x010A8A, - 0x010A8B, 0x010A84, 0x010A85, 0x010A86, 0x010A87, 0x010A80, 0x010A81, 0x010A82, - 0x010A83, 0x010A9C, 0x010A9D, 0x010A9E, 0x010A9F, 0x010A98, 0x010A99, 0x010A9A, - 0x010A9B, 0x010A94, 0x010A95, 0x010A96, 0x010A97, 0x010A90, 0x010A91, 0x010A92, - 0x010A93, 0x010B6C, 0x010B6D, 0x010B6E, 0x010B6F, 0x010B68, 0x010B69, 0x010B6A, - 0x010B6B, 0x010B64, 0x010B65, 0x010B66, 0x010B67, 0x010B60, 0x010B61, 0x010B62, - 0x010B63, 0x010B7C, 0x010B7D, 0x010B7E, 0x010B7F, 0x010B78, 0x010B79, 0x010B7A, - 0x010B7B, 0x010B70, 0x010B71, 0x010B72, 0x010B4C, 0x010B4D, 0x010B4E, 0x010B4F, - 0x010B48, 0x010B49, 0x010B4A, 0x010B4B, 0x010B44, 0x010B45, 0x010B46, 0x010B47, - 0x010B40, 0x010B41, 0x010B42, 0x010B43, 0x010B5C, 0x010B5D, 0x010B5E, 0x010B59, - 0x010B5A, 0x002187, 0x002180, 0x010B53, 0x010B2C, 0x010B2D, 0x010B2E, 0x010B2F, - 0x010B28, 0x010B29, 0x010B2A, 0x010B2B, 0x010B24, 0x010B25, 0x010B26, 0x010B27, - 0x010B20, 0x010B21, 0x010B22, 0x001E6D, 0x001E6E, 0x001E6F, 0x001E68, 0x001E69, - 0x001E6A, 0x001E6B, 0x001E64, 0x001E67, 0x001E60, 0x001E5D, 0x001E5E, 0x001E5F, - 0x001E58, 0x001E59, 0x001E5A, 0x001E5B, 0x001E54, 0x001E55, 0x001E56, 0x001E57, - 0x001E50, 0x001E51, 0x001E52, 0x001E53, 0x001E2C, 0x001E2D, 0x001E2E, 0x001E2F, - 0x001E28, 0x001E29, 0x001E2A, 0x001E2B, 0x001E24, 0x001E25, 0x001E26, 0x001E27, - 0x001E20, 0x001E21, 0x001E22, 0x001E23, 0x001E3C, 0x001E3D, 0x001E3E, 0x001E3F, - 0x001E38, 0x001E39, 0x001E3A, 0x001E3B, 0x001E34, 0x001E35, 0x001E36, 0x001E37, - 0x001E30, 0x001E31, 0x001E32, 0x001E33, 0x001E0C, 0x001E0D, 0x001E0E, 0x001E0F, - 0x001E08, 0x001E09, 0x001E0A, 0x001E0B, 0x001E04, 0x001E05, 0x001E06, 0x001E07, - 0x001E00, 0x001E01, 0x001E02, 0x001E03, 0x001E1C, 0x001E19, 0x001E15, 0x001E16, - 0x001E17, 0x001E10, 0x001E11, 0x001E12, 0x001E13, 0x001EEC, 0x001EED, 0x001EEE, - 0x001EEF, 0x001EE8, 0x001EE9, 0x001EEA, 0x001EEB, 0x001EE4, 0x001EE5, 0x001EE6, - 0x001EE7, 0x001EE0, 0x001EE1, 0x001EE2, 0x001EE3, 0x01E8CC, 0x01E8CD, 0x01E8CE, - 0x001EFC, 0x001ECD, 0x001ECE, 0x001ECF, 0x001EC8, 0x001EC9, 0x001ECA, 0x001ECB, - 0x001EC4, 0x001EC5, 0x001EC6, 0x001EC7, 0x001EC0, 0x001EC3, 0x001EDC, 0x001EA9, - 0x001EA0, 0x001E87, 0x001E80, 0x001F6E, 0x001F6F, 0x001F6A, 0x001F6B, 0x001F64, - 0x001F67, 0x01080D, 0x01080E, 0x001F7A, 0x001F77, 0x001F70, 0x01081D, 0x01081E, - 0x010815, 0x010816, 0x010813, 0x0108ED, 0x0108EF, 0x0108E9, 0x001F29, 0x001F2A, - 0x001F2B, 0x001F27, 0x001F20, 0x001F3C, 0x001F3D, 0x001F3E, 0x001F3F, 0x001F38, - 0x001F39, 0x001F3A, 0x001F3B, 0x001F34, 0x001F35, 0x001F36, 0x001F37, 0x001F30, - 0x001F31, 0x001F32, 0x001F33, 0x001F0C, 0x001F0D, 0x001F0E, 0x001F0F, 0x001F08, - 0x001F09, 0x001F0A, 0x001F0B, 0x001F04, 0x001F05, 0x001F06, 0x001F07, 0x001F00, - 0x001F01, 0x001F02, 0x001F03, 0x001F1C, 0x0108AD, 0x0108AE, 0x001F15, 0x001F11, - 0x001F12, 0x001F13, 0x001FEC, 0x001FE8, 0x001FE9, 0x001FEA, 0x001FEB, 0x001FE4, - 0x001FE5, 0x001FE6, 0x001FE7, 0x001FE0, 0x001FE1, 0x001FE2, 0x001FE3, 0x001FFC, - 0x01088C, 0x01088D, 0x01088E, 0x010884, 0x00FA88, 0x00FA8E, 0x010887, 0x010880, - 0x01089C, 0x00FA9C, 0x01089D, 0x00FA89, 0x00FA98, 0x00FA8B, 0x00FA8A, 0x00FA9E, - 0x01089E, 0x00FA8D, 0x001FC8, 0x010894, 0x010897, 0x010890, 0x010893, 0x001FD8, - 0x001FD9, 0x001FDA, 0x001FDB, 0x001FD6, 0x001FD7, 0x001FD0, 0x001FD1, 0x001FD2, - 0x001FD3, 0x001FAC, 0x001FAD, 0x001FAE, 0x001FAF, 0x001FA8, 0x001FA9, 0x001FAA, - 0x001FAB, 0x001FA4, 0x001FA5, 0x001FA6, 0x001FA7, 0x001FA0, 0x001FA1, 0x001FA2, - 0x001FA3, 0x001FBC, 0x001FBE, 0x001FB8, 0x001FB9, 0x001FBA, 0x001FBB, 0x001FB4, - 0x001FB6, 0x001FB7, 0x001FB0, 0x001FB1, 0x001FB2, 0x001FB3, 0x001F8C, 0x001F8D, - 0x001F8E, 0x001F8F, 0x001F88, 0x001F89, 0x001F8A, 0x001F8B, 0x001F84, 0x001F85, - 0x001F86, 0x001F87, 0x001F80, 0x001F81, 0x001F82, 0x001F83, 0x001F9C, 0x001C6D, - 0x001C6E, 0x001C6F, 0x001C68, 0x001C6B, 0x001C64, 0x010933, 0x01090C, 0x01090D, - 0x01090E, 0x01090F, 0x010908, 0x010909, 0x01090A, 0x010903, 0x001C4D, 0x001C4E, - 0x001C4F, 0x001C48, 0x010919, 0x01091A, 0x0109E3, 0x0109FC, 0x0109FD, 0x0109FE, - 0x0109FF, 0x0109F8, 0x0109F9, 0x0109FA, 0x0109FB, 0x0109F4, 0x0109F5, 0x0109F6, - 0x0109F3, 0x0109CC, 0x0109CD, 0x0109CE, 0x0109CF, 0x0109C8, 0x0109C9, 0x0109CA, - 0x0109CB, 0x0109C4, 0x0109C5, 0x0109C6, 0x0109C7, 0x0109C0, 0x0109C1, 0x0109C2, - 0x001C01, 0x001C02, 0x0109BC, 0x0109BF, 0x001CE9, 0x001CEA, 0x001CEB, 0x0109B4, - 0x0109B5, 0x0109B6, 0x0109B7, 0x0109B0, 0x0109B1, 0x0109B2, 0x0109B3, 0x01098C, - 0x01098D, 0x01098E, 0x01098F, 0x010988, 0x010989, 0x01098A, 0x01098B, 0x010986, - 0x010981, 0x010982, 0x010983, 0x01099C, 0x01099D, 0x01099E, 0x01099F, 0x010998, - 0x010999, 0x01099A, 0x01099B, 0x010994, 0x010995, 0x010996, 0x010997, 0x010990, - 0x010991, 0x010992, 0x010993, 0x01066C, 0x01066D, 0x01066E, 0x01066F, 0x010668, - 0x010669, 0x01066A, 0x01066B, 0x010664, 0x010665, 0x010666, 0x010667, 0x010660, - 0x010661, 0x010662, 0x010663, 0x01067C, 0x01067D, 0x01067E, 0x01067F, 0x010678, - 0x010679, 0x01067A, 0x01067B, 0x010674, 0x010675, 0x010676, 0x010677, 0x010670, - 0x010671, 0x010672, 0x010673, 0x01064C, 0x01064D, 0x01064E, 0x01064F, 0x010648, - 0x010649, 0x01064A, 0x01064B, 0x010644, 0x010645, 0x010646, 0x010647, 0x010640, - 0x010641, 0x010642, 0x010643, 0x01065C, 0x01065D, 0x01065E, 0x010658, 0x010659, - 0x01065A, 0x010653, 0x01062C, 0x01062D, 0x01062E, 0x01062F, 0x010628, 0x010629, - 0x01062A, 0x01062B, 0x010624, 0x010625, 0x010626, 0x010627, 0x010620, 0x010621, - 0x010622, 0x01063F, 0x010638, 0x010639, 0x01063B, 0x010634, 0x010635, 0x010636, - 0x010637, 0x010630, 0x010631, 0x010632, 0x01060F, 0x010603, 0x01061C, 0x01061D, - 0x01061E, 0x01061F, 0x010618, 0x010619, 0x01061A, 0x01061B, 0x010614, 0x010615, - 0x010616, 0x010617, 0x010610, 0x010611, 0x010612, 0x010613, 0x0106EC, 0x0106ED, - 0x0106EE, 0x0106EF, 0x0106E8, 0x0106E9, 0x0106EA, 0x0106EB, 0x0106E4, 0x0106E5, - 0x0106E6, 0x0106E7, 0x0106E0, 0x0106E1, 0x0106E2, 0x0106E3, 0x0106FC, 0x0106FD, - 0x0106FE, 0x0106F3, 0x0106CC, 0x0106CD, 0x0106CE, 0x0106CF, 0x0106C8, 0x0106C9, - 0x0106CA, 0x0106CB, 0x0106C4, 0x0106C5, 0x0106C6, 0x0106C7, 0x0106C0, 0x0106C1, - 0x0106C2, 0x0106A3, 0x0106BC, 0x0106BD, 0x0106BE, 0x0106BF, 0x0106B8, 0x0106B9, - 0x0106BA, 0x0106BB, 0x0106B4, 0x0106B5, 0x0106B6, 0x0106B7, 0x0106B0, 0x0106B1, - 0x0106B2, 0x0106B3, 0x01068C, 0x01068D, 0x01068E, 0x01068F, 0x010688, 0x010689, - 0x01068A, 0x01068B, 0x010684, 0x010685, 0x010686, 0x010687, 0x010680, 0x010681, - 0x010682, 0x010683, 0x01069C, 0x01069D, 0x01069E, 0x01069F, 0x010698, 0x010699, - 0x01069A, 0x01069B, 0x010694, 0x010695, 0x010696, 0x010697, 0x010690, 0x010691, - 0x010692, 0x010693, 0x010764, 0x010765, 0x010766, 0x010767, 0x010760, 0x010761, - 0x010762, 0x010763, 0x01074C, 0x01074D, 0x01074E, 0x01074F, 0x010748, 0x010749, - 0x01074A, 0x01074B, 0x010744, 0x010745, 0x010746, 0x010747, 0x010740, 0x010741, - 0x010742, 0x001D8D, 0x001D8E, 0x001D8F, 0x001D88, 0x001D89, 0x001D8A, 0x001D8B, - 0x001D84, 0x001D87, 0x001D80, 0x010753, 0x01072C, 0x01072D, 0x01072E, 0x01072A, - 0x010723, 0x010734, 0x010735, 0x010736, 0x010730, 0x010731, 0x010732, 0x010733, - 0x01070C, 0x01070D, 0x01070E, 0x01070F, 0x010708, 0x010709, 0x01070A, 0x01070B, - 0x010704, 0x010705, 0x010706, 0x010707, 0x010700, 0x010701, 0x010702, 0x010713, - 0x001A54, 0x001A50, 0x001A51, 0x001A52, 0x001A53, 0x001A2C, 0x001A2D, 0x001A2E, - 0x001A2F, 0x001A28, 0x001A29, 0x001A2A, 0x001A2B, 0x001A24, 0x001A25, 0x001A26, - 0x001A27, 0x001A20, 0x001A21, 0x001A22, 0x001A23, 0x001A3C, 0x001A3D, 0x001A3E, - 0x001A3F, 0x001A38, 0x001A39, 0x001A3A, 0x001A3B, 0x001A34, 0x001A35, 0x001A36, - 0x001A37, 0x001A30, 0x001A31, 0x001A32, 0x001A33, 0x001A0C, 0x001A0D, 0x001A0E, - 0x001A0F, 0x001A08, 0x001A09, 0x001A0A, 0x001A0B, 0x001A04, 0x001A05, 0x001A06, - 0x001A07, 0x001A00, 0x001A01, 0x001A02, 0x001A03, 0x001A14, 0x001A15, 0x001A16, - 0x001A10, 0x001A11, 0x001A12, 0x001A13, 0x01046C, 0x01046D, 0x01046E, 0x01046F, - 0x010468, 0x010469, 0x01046A, 0x01046B, 0x010464, 0x010465, 0x010466, 0x010467, - 0x010460, 0x010461, 0x010462, 0x010463, 0x01047C, 0x01047E, 0x01047F, 0x010478, - 0x01044D, 0x01044E, 0x01044F, 0x010448, 0x010449, 0x01044A, 0x01044B, 0x010444, - 0x010445, 0x010446, 0x010447, 0x010440, 0x010441, 0x010442, 0x010443, 0x01045C, - 0x01045D, 0x01045E, 0x010459, 0x01045A, 0x010453, 0x01042C, 0x01042D, 0x01042E, - 0x010429, 0x01042A, 0x010423, 0x01043C, 0x01043D, 0x01043E, 0x01043F, 0x010438, - 0x010439, 0x01043A, 0x01043B, 0x010434, 0x010435, 0x010436, 0x010437, 0x010430, - 0x010431, 0x010432, 0x010433, 0x01040C, 0x01040D, 0x01040E, 0x01040F, 0x010408, - 0x010409, 0x01040A, 0x01040B, 0x010404, 0x010405, 0x010406, 0x010407, 0x010400, - 0x010401, 0x010402, 0x010403, 0x01041C, 0x01041D, 0x01041E, 0x01041B, 0x010417, - 0x010410, 0x010411, 0x010412, 0x010413, 0x0104EC, 0x0104ED, 0x0104EE, 0x0104E9, - 0x0104EA, 0x001B2D, 0x001B2E, 0x001B2F, 0x001B28, 0x0104F3, 0x0104CC, 0x0104CD, - 0x0104CE, 0x0104CF, 0x0104C8, 0x0104C9, 0x0104CA, 0x0104CB, 0x0104C4, 0x0104C5, - 0x0104C6, 0x001B05, 0x001B07, 0x0104D1, 0x001B1D, 0x001B1F, 0x0104BC, 0x0104BD, - 0x0104B9, 0x0104B5, 0x0104B6, 0x01048C, 0x01048D, 0x01048F, 0x010489, 0x01048B, - 0x010486, 0x010487, 0x010481, 0x001BDD, 0x001BDE, 0x001BDF, 0x001BD8, 0x001BD9, - 0x001BDA, 0x001BD4, 0x01EE0E, 0x01EE0F, 0x01EE08, 0x01EE09, 0x01EE0A, 0x01EE0B, - 0x01EE05, 0x01EE07, 0x01EE00, 0x01EE01, 0x010557, 0x010550, 0x010551, 0x001B9D, - 0x001B9E, 0x001B9F, 0x001B98, 0x001B99, 0x001B9A, 0x001B9B, 0x001B94, 0x010533, - 0x01050C, 0x01050D, 0x01050E, 0x01050F, 0x010508, 0x010509, 0x01050A, 0x00185E, - 0x00185F, 0x001858, 0x001859, 0x001824, 0x00183E, 0x00183F, 0x001838, 0x001839, - 0x01EE92, 0x01EE93, 0x001818, 0x001819, 0x001814, 0x001815, 0x001816, 0x001817, - 0x001810, 0x001811, 0x001812, 0x001813, 0x0018EC, 0x0018ED, 0x0018EE, 0x0018EF, - 0x0018E8, 0x0018E9, 0x0018EA, 0x0018EB, 0x0018E4, 0x0018E5, 0x0018E6, 0x0018E7, - 0x0018E0, 0x0018E1, 0x0018E2, 0x0018E3, 0x0018F4, 0x0018F5, 0x0018F0, 0x0018F1, - 0x0018F2, 0x0018F3, 0x0018CC, 0x0018CD, 0x0018CE, 0x0018CF, 0x0018C8, 0x0018C9, - 0x0018CA, 0x0018CB, 0x0018C4, 0x0018C5, 0x0018C6, 0x0018C7, 0x0018C0, 0x0018C1, - 0x0018C2, 0x0018C3, 0x0018DC, 0x0018DD, 0x0018DE, 0x0018DF, 0x0018D8, 0x0018D9, - 0x0018DA, 0x0018DB, 0x0018D4, 0x0018D5, 0x0018D6, 0x0018D7, 0x0018D0, 0x0018D1, - 0x0018D2, 0x0018D3, 0x0018A8, 0x0018AA, 0x0018A4, 0x0018A5, 0x0018A6, 0x0018A7, - 0x0018A0, 0x0018A1, 0x0018A2, 0x0018A3, 0x0018BC, 0x0018BD, 0x0018BE, 0x0018BF, - 0x0018B8, 0x01D608, 0x0018B9, 0x0018BA, 0x0018BB, 0x01D60C, 0x01D60D, 0x01D60E, - 0x0018B4, 0x0018B5, 0x0018B6, 0x0018B7, 0x0018B0, 0x0018B1, 0x0018B2, 0x0018B3, - 0x00188C, 0x00188D, 0x00188E, 0x00188F, 0x001888, 0x001889, 0x00188A, 0x00188B, - 0x001884, 0x01D620, 0x01D621, 0x01D622, 0x01D623, 0x01D624, 0x01D625, 0x01D626, - 0x01D627, 0x01D628, 0x01D629, 0x01D62A, 0x01D62B, 0x01D62C, 0x01D62D, 0x01D62E, - 0x01D62F, 0x01D630, 0x01D631, 0x01D632, 0x001887, 0x01D634, 0x01D635, 0x01D636, - 0x01D637, 0x01D638, 0x01D639, 0x01D63A, 0x01D63B, 0x01D63C, 0x01D63D, 0x01D63E, - 0x01D63F, 0x01D640, 0x01D641, 0x01D642, 0x01D643, 0x01D644, 0x01D645, 0x01D646, - 0x01D647, 0x01D648, 0x01D649, 0x01D64A, 0x01D64B, 0x01D64C, 0x01D64D, 0x01D64E, - 0x01D64F, 0x01D650, 0x01D651, 0x01D652, 0x01D653, 0x001880, 0x01D655, 0x01D656, - 0x01D657, 0x01D658, 0x01D659, 0x01D65A, 0x001881, 0x01D65C, 0x01D65D, 0x01D65E, - 0x01D65F, 0x001882, 0x001883, 0x00189C, 0x00189D, 0x00189E, 0x00189F, 0x001898, - 0x001899, 0x00189A, 0x00189B, 0x001894, 0x001895, 0x001896, 0x001897, 0x001890, - 0x001891, 0x001892, 0x001893, 0x01D672, 0x01D673, 0x00196C, 0x00196D, 0x001968, - 0x001969, 0x00196A, 0x00196B, 0x001964, 0x001965, 0x001966, 0x001967, 0x001960, - 0x001961, 0x001962, 0x001963, 0x001974, 0x001970, 0x001971, 0x001972, 0x001973, - 0x00194C, 0x00194D, 0x00194E, 0x00194F, 0x001948, 0x001949, 0x00194A, 0x00194B, - 0x001946, 0x001947, 0x00195C, 0x001951, 0x0102E3, 0x0102F8, 0x0102F9, 0x0102FA, - 0x0102FB, 0x0102F4, 0x0102F5, 0x0102F6, 0x0102F7, 0x0102F0, 0x0102F1, 0x0102F2, - 0x0102F3, 0x0102CC, 0x0102CD, 0x0102CE, 0x0102CF, 0x0102C8, 0x0102C9, 0x0102CA, - 0x0102CB, 0x0102C4, 0x0102C5, 0x0102C6, 0x0102C7, 0x0102C0, 0x0102C1, 0x0102C2, - 0x00190D, 0x00190E, 0x00190F, 0x001908, 0x001909, 0x00190A, 0x00190B, 0x001904, - 0x001905, 0x001906, 0x001907, 0x001900, 0x001902, 0x001903, 0x00191C, 0x0102AE, - 0x0102A3, 0x0102BC, 0x0102BD, 0x0102BE, 0x0102BF, 0x0102B8, 0x0102B9, 0x0102BA, - 0x0102BB, 0x0102B4, 0x0102B5, 0x0102B6, 0x0102B7, 0x0102B0, 0x0102B1, 0x0102B2, - 0x0102B3, 0x01028C, 0x01028D, 0x01028E, 0x01028F, 0x010288, 0x010289, 0x01028A, - 0x01028B, 0x010284, 0x010285, 0x010286, 0x010287, 0x010280, 0x010281, 0x010282, - 0x010283, 0x01029C, 0x0019C8, 0x010299, 0x01029A, 0x010293, 0x01036C, 0x01036D, - 0x01036E, 0x01036A, 0x010363, 0x0019A8, 0x0019A9, 0x0019AA, 0x0019AB, 0x0019A4, - 0x0019A7, 0x0019A0, 0x00FC40, 0x0019BD, 0x0019BE, 0x0019BF, 0x0019B8, 0x00FC45, - 0x0019B4, 0x00199D, 0x001999, 0x00199A, 0x00199B, 0x001994, 0x001995, 0x001996, - 0x00FC4E, 0x001997, 0x001990, 0x01033C, 0x01033D, 0x00165D, 0x00165E, 0x00165F, - 0x001658, 0x001659, 0x00165A, 0x00165B, 0x001654, 0x001655, 0x001656, 0x001657, - 0x001650, 0x001651, 0x001652, 0x001653, 0x00162C, 0x00162D, 0x00162E, 0x00162F, - 0x00FC66, 0x001628, 0x001629, 0x00162A, 0x00162B, 0x001624, 0x001625, 0x001626, - 0x001627, 0x001620, 0x001621, 0x001622, 0x001623, 0x00163C, 0x001635, 0x001636, - 0x001637, 0x001630, 0x00160D, 0x00160E, 0x00160F, 0x001608, 0x001609, 0x00160A, - 0x00160B, 0x001604, 0x001607, 0x001600, 0x001601, 0x0103A3, 0x0103BC, 0x0103BA, - 0x0103B3, 0x01038C, 0x01038D, 0x01038E, 0x010388, 0x010389, 0x01038A, 0x0016CF, - 0x0016C8, 0x0016DD, 0x0016DE, 0x0016DF, 0x0016D8, 0x0016D9, 0x0016DA, 0x0016DB, - 0x0016D4, 0x0016D5, 0x0016D6, 0x0016D7, 0x0016D0, 0x0016D1, 0x0016D2, 0x0016D3, - 0x0016AC, 0x0016AD, 0x0016AE, 0x0016AF, 0x0016A8, 0x0016A9, 0x0016AA, 0x0016AB, - 0x0016A4, 0x0016A5, 0x0016A6, 0x0016A7, 0x0016A0, 0x0016A1, 0x0016A2, 0x0016A3, - 0x0016BC, 0x0016BF, 0x0016B8, 0x00168F, 0x001688, 0x010057, 0x010053, 0x01002C, - 0x01002D, 0x01002E, 0x01002A, 0x001690, 0x01003C, 0x00176F, 0x001764, 0x010033, - 0x01000D, 0x01000E, 0x01000F, 0x010008, 0x010009, 0x01000A, 0x01000B, 0x010004, - 0x010005, 0x010006, 0x010000, 0x010001, 0x010002, 0x010013, 0x0100EC, 0x0100ED, - 0x0100EE, 0x0100EF, 0x0100E8, 0x0100E9, 0x0100EA, 0x0100EB, 0x0100E4, 0x0100E5, - 0x0100E6, 0x0100E1, 0x0100E2, 0x00172D, 0x00172E, 0x00172F, 0x001728, 0x001724, - 0x0100F3, 0x0100CC, 0x0100CD, 0x0100CE, 0x0100CF, 0x0100C8, 0x0100C9, 0x0100CA, - 0x0100CB, 0x0100C4, 0x0100C5, 0x0100C6, 0x0100C1, 0x0100C2, 0x0100DC, 0x0100D3, - 0x0100AC, 0x0100AD, 0x0100AE, 0x0100AF, 0x0100A8, 0x0100A9, 0x0100AA, 0x0100AB, - 0x0100A4, 0x0100A5, 0x0100A6, 0x0100A1, 0x0100A2, 0x0100A3, 0x0100BC, 0x0100BD, - 0x0100BE, 0x0100B9, 0x0100BA, 0x0100B3, 0x01008C, 0x01008D, 0x01008E, 0x010089, - 0x01008A, 0x010083, 0x01009C, 0x01009D, 0x01009E, 0x01009F, 0x010098, 0x010099, - 0x01009A, 0x01009B, 0x010094, 0x010095, 0x010096, 0x010097, 0x010090, 0x010091, - 0x010092, 0x01016C, 0x01016D, 0x01016E, 0x01016F, 0x010168, 0x010169, 0x01016A, - 0x01016B, 0x010164, 0x010165, 0x010166, 0x010167, 0x010160, 0x010161, 0x010162, - 0x0017AD, 0x0017AE, 0x0017AF, 0x0017A8, 0x0017AA, 0x0017AB, 0x0017A4, 0x010173, - 0x01014C, 0x01014D, 0x01014E, 0x01014F, 0x010148, 0x010149, 0x01014A, 0x01014B, - 0x010144, 0x010145, 0x010146, 0x00146D, 0x00146E, 0x00146F, 0x001468, 0x001469, - 0x00146A, 0x00146B, 0x001464, 0x001465, 0x001466, 0x001467, 0x001460, 0x001475, - 0x001476, 0x001477, 0x00F95A, 0x001471, 0x001472, 0x001473, 0x00144C, 0x00145D, - 0x00F959, 0x01D401, 0x01D400, 0x01D403, 0x01D402, 0x01D405, 0x01D404, 0x01D407, - 0x01D406, 0x01D409, 0x01D408, 0x01D40B, 0x01D40A, 0x01D40D, 0x01D40C, 0x01D40F, - 0x01D40E, 0x01D411, 0x01D410, 0x01D413, 0x01D412, 0x01D415, 0x01D414, 0x01D417, - 0x01D416, 0x01D419, 0x01D418, 0x01D41B, 0x01D41A, 0x01D41D, 0x01D41C, 0x01D41F, - 0x01D41E, 0x01D421, 0x01D420, 0x01D423, 0x01D422, 0x01D425, 0x01D424, 0x01D427, - 0x01D426, 0x01D429, 0x01D428, 0x01D42B, 0x01D42A, 0x01D42D, 0x01D42C, 0x01D42F, - 0x01D42E, 0x01D431, 0x01D430, 0x01D433, 0x01D432, 0x01D435, 0x01D434, 0x01D437, - 0x01D436, 0x01D439, 0x01D438, 0x01D43B, 0x01D43A, 0x01D43D, 0x01D43C, 0x01D43F, - 0x01D43E, 0x01D441, 0x01D440, 0x01D443, 0x01D442, 0x01D445, 0x01D444, 0x01D447, - 0x01D446, 0x01D449, 0x01D448, 0x01D44B, 0x01D44A, 0x01D44D, 0x01D44C, 0x01D44F, - 0x01D44E, 0x01D451, 0x01D450, 0x01D453, 0x01D452, 0x01D6D8, 0x01D454, 0x01D457, - 0x01D456, 0x01D459, 0x01D458, 0x01D45B, 0x01D45A, 0x01D45D, 0x01D45C, 0x01D45F, - 0x01D45E, 0x01D461, 0x01D460, 0x01D463, 0x01D462, 0x01D465, 0x01D464, 0x01D467, - 0x01D466, 0x01D469, 0x01D468, 0x01D46B, 0x01D46A, 0x01D46D, 0x01D46C, 0x01D46F, - 0x01D46E, 0x01D471, 0x01D470, 0x01D473, 0x01D472, 0x01D475, 0x01D474, 0x01D477, - 0x01D476, 0x01D479, 0x01D478, 0x01D47B, 0x01D47A, 0x01D47D, 0x01D47C, 0x01D47F, - 0x01D47E, 0x00145E, 0x00145F, 0x001458, 0x001459, 0x00145A, 0x00145B, 0x001454, - 0x001455, 0x001456, 0x001457, 0x001450, 0x001451, 0x001452, 0x001453, 0x00142C, - 0x00142D, 0x00142E, 0x00142F, 0x001428, 0x001429, 0x00142A, 0x00142B, 0x001424, - 0x001425, 0x001426, 0x001427, 0x001420, 0x001421, 0x001422, 0x001423, 0x00143C, - 0x00143D, 0x00143E, 0x00143F, 0x001438, 0x001439, 0x00143A, 0x00143B, 0x001434, - 0x001435, 0x001436, 0x001437, 0x001430, 0x001431, 0x001432, 0x001433, 0x00140C, - 0x00140D, 0x00140E, 0x00140F, 0x001408, 0x001409, 0x00140A, 0x00140B, 0x001404, - 0x001405, 0x001406, 0x001407, 0x001401, 0x001402, 0x001403, 0x00141C, 0x00141D, - 0x00141E, 0x00141F, 0x001418, 0x001419, 0x00141A, 0x00141B, 0x001414, 0x001415, - 0x001416, 0x001417, 0x00FF18, 0x001410, 0x001411, 0x001412, 0x001413, 0x0014EC, - 0x0014ED, 0x0014EE, 0x0014EF, 0x0014E8, 0x0014E9, 0x0014EA, 0x0014EB, 0x0014E4, - 0x0014E5, 0x0014E6, 0x0014E7, 0x0014E0, 0x0014E1, 0x0014E2, 0x0014E3, 0x0014FC, - 0x0014FD, 0x01D4E1, 0x01D4E0, 0x01D4E3, 0x01D4E2, 0x01D4E5, 0x01D4E4, 0x01D4E7, - 0x01D4E6, 0x01D4E9, 0x01D4E8, 0x01D4EB, 0x01D4EA, 0x01D4ED, 0x01D4EC, 0x01D4EF, - 0x01D4EE, 0x01D4F1, 0x01D4F0, 0x0014FE, 0x0014FF, 0x01D4F5, 0x01D4F4, 0x01D4F7, - 0x01D4F6, 0x01D4F9, 0x01D4F8, 0x01D4FB, 0x01D4FA, 0x01D4FD, 0x01D4FC, 0x01D4FF, - 0x01D4FE, 0x0014F8, 0x0014F9, 0x0014FA, 0x0014F5, 0x0014F6, 0x00FBDC, 0x00FBDD, - 0x0014F7, 0x0014F0, 0x0014F1, 0x00FBD9, 0x0014F2, 0x0014F3, 0x0014CC, 0x00FBDE, - 0x00FBDF, 0x0014CD, 0x0014CE, 0x0014CF, 0x01D612, 0x0014C8, 0x0014C9, 0x00FBE4, - 0x00FBE5, 0x00FBE6, 0x00FBE8, 0x0014CA, 0x0014CB, 0x00FBEF, 0x00FBFC, 0x00FBFD, - 0x0014C4, 0x00FBEB, 0x00FBF7, 0x00FBF0, 0x00FBF1, 0x00FBF2, 0x0014C5, 0x00FBF4, - 0x0014C6, 0x00FBF6, 0x0014C7, 0x00FBF9, 0x00FBFA, 0x00FBFF, 0x00FBF8, 0x00FBF5, - 0x00FBFE, 0x0014C0, 0x0014C1, 0x0014C2, 0x0014C3, 0x01D611, 0x0014DC, 0x0014DD, - 0x0014DE, 0x0014DF, 0x0014D8, 0x0014D9, 0x0014DA, 0x0014DB, 0x0014D4, 0x01D610, - 0x0014D5, 0x0014D6, 0x00FF90, 0x0014D7, 0x0014D0, 0x0014D1, 0x0014D2, 0x00FF95, - 0x00FF96, 0x01D6E8, 0x01D6EC, 0x00FBD8, 0x0014D3, 0x01D74C, 0x01D74D, 0x01D74E, - 0x01D6ED, 0x0014AC, 0x0014A6, 0x00FBE7, 0x0014BD, 0x00FBE1, 0x0014BE, 0x0014BF, - 0x0014B8, 0x0014B9, 0x0014BA, 0x0014BB, 0x0014B4, 0x0014B5, 0x0014B6, 0x0014B7, + 0x000388, 0x000389, 0x000035, 0x000386, 0x01D6EE, 0x01D6EF, 0x01D6E2, 0x01D6E3, + 0x0000C8, 0x0000C9, 0x0000CA, 0x0000CB, 0x0003A7, 0x0003A3, 0x0000CE, 0x0000CF, + 0x01D772, 0x00042F, 0x0003A0, 0x0003BE, 0x0003BC, 0x0003BD, 0x00039C, 0x00039D, + 0x000398, 0x000399, 0x01D6FC, 0x01D6FD, 0x01D6FE, 0x01D6FF, 0x00039E, 0x00039F, + 0x0003A5, 0x0003A1, 0x01D618, 0x01D61D, 0x0003B4, 0x01D607, 0x0003BA, 0x0003BF, + 0x01D61A, 0x000471, 0x00038A, 0x00038E, 0x01D60B, 0x00038F, 0x000033, 0x01D61B, + 0x0003B0, 0x0003B1, 0x01D614, 0x01D615, 0x01D616, 0x01D617, 0x0003B6, 0x0003B7, + 0x0003B8, 0x0003B9, 0x01D619, 0x00045A, 0x01D61E, 0x01D61F, 0x0003BB, 0x0003B5, + 0x0000E0, 0x0000E1, 0x0000E2, 0x0000E3, 0x0000E4, 0x0000E5, 0x0000E6, 0x0000E7, + 0x01D602, 0x01D603, 0x0000C6, 0x0003AD, 0x01D605, 0x01D601, 0x0000FC, 0x01D61C, + 0x0000F0, 0x0000F1, 0x01D606, 0x0000EB, 0x0000F4, 0x0000F5, 0x0000F6, 0x0000EA, + 0x0000F8, 0x0000F9, 0x0000FA, 0x0000FB, 0x0000CC, 0x0000FD, 0x0000FE, 0x0000FF, + 0x01D6C0, 0x000428, 0x01D6C4, 0x01D6C5, 0x01D6F8, 0x01D6FA, 0x0000C4, 0x01D6C9, + 0x01D6CA, 0x01D6CB, 0x01D6C8, 0x01D6CD, 0x01D6CE, 0x01D6CC, 0x0000F2, 0x0000F3, + 0x0003A9, 0x0003F5, 0x000032, 0x01D633, 0x01D60F, 0x0003A4, 0x00042E, 0x000031, + 0x000030, 0x01D60A, 0x01D604, 0x01D609, 0x0000ED, 0x01D65B, 0x0003A6, 0x0003AB, + 0x01D6F2, 0x01D6F3, 0x000076, 0x000077, 0x0000C2, 0x0000C5, 0x01D6F9, 0x0000C3, + 0x0000D8, 0x0000C1, 0x00039B, 0x0000C7, 0x0000C0, 0x00038C, 0x0000DE, 0x0000DF, + 0x0000D2, 0x0000D1, 0x0000D0, 0x0000D3, 0x0000D5, 0x000069, 0x0003B3, 0x0000D6, + 0x0000D9, 0x0000DD, 0x0000DC, 0x0000DB, 0x0003B2, 0x0000D4, 0x01D6A1, 0x0000DA, + 0x01D6A0, 0x000061, 0x01D6A4, 0x01D6A5, 0x00039A, 0x01D6C7, 0x01D6A8, 0x01D6A9, + 0x01D6AE, 0x000394, 0x01D6AC, 0x01D6AD, 0x01D6F4, 0x01D6AF, 0x01D6F6, 0x01D6F5, + 0x01D6F7, 0x000038, 0x01D694, 0x01D695, 0x000034, 0x01D69E, 0x000036, 0x000037, + 0x01D69A, 0x000039, 0x01D6B8, 0x01D6BE, 0x01D6BF, 0x01D69F, 0x01D6D4, 0x01D6D5, + 0x000044, 0x000045, 0x01D6B4, 0x01D6B5, 0x000054, 0x000055, 0x000056, 0x000057, + 0x01D6BA, 0x01D6BB, 0x0000AA, 0x00004D, 0x01D6AA, 0x01D6AB, 0x01D6B6, 0x01D6B1, + 0x000051, 0x01D6CF, 0x0000B2, 0x000053, 0x01D6B7, 0x0000B5, 0x000050, 0x01D6B0, + 0x00004C, 0x0000B9, 0x0000BA, 0x000052, 0x0000BC, 0x0000BD, 0x0000BE, 0x01D6D0, + 0x000042, 0x000074, 0x000043, 0x000072, 0x01D6D2, 0x01D6F0, 0x000046, 0x000047, + 0x0000CD, 0x000049, 0x00004A, 0x00004B, 0x000048, 0x01D6DA, 0x00004E, 0x00004F, + 0x000070, 0x000071, 0x01D6D1, 0x01D6D3, 0x01D6D6, 0x01D6D7, 0x000073, 0x01D6DE, + 0x000059, 0x000079, 0x0000B3, 0x000058, 0x01D6F1, 0x01D6DF, 0x00005A, 0x000078, + 0x000101, 0x000100, 0x000103, 0x000102, 0x000105, 0x000104, 0x000107, 0x000106, + 0x000109, 0x000108, 0x00010B, 0x00010A, 0x00010D, 0x00010C, 0x00010F, 0x00010E, + 0x000111, 0x000110, 0x000113, 0x000112, 0x000115, 0x000114, 0x000117, 0x000116, + 0x000119, 0x000118, 0x00011B, 0x00011A, 0x00011D, 0x00011C, 0x00011F, 0x00011E, + 0x000121, 0x000120, 0x000123, 0x000122, 0x000125, 0x000124, 0x000127, 0x000126, + 0x000129, 0x000128, 0x01D691, 0x00012A, 0x00012D, 0x00012C, 0x00012F, 0x00012E, + 0x000131, 0x000130, 0x000133, 0x000132, 0x000135, 0x000134, 0x000137, 0x000136, + 0x000139, 0x000138, 0x00013B, 0x00013A, 0x00013D, 0x00013C, 0x00013F, 0x00013E, + 0x000141, 0x000140, 0x000143, 0x000142, 0x000145, 0x000144, 0x000147, 0x000146, + 0x000149, 0x000148, 0x01D69B, 0x00014A, 0x00014D, 0x00014C, 0x00014F, 0x00014E, + 0x000151, 0x000150, 0x000153, 0x000152, 0x000155, 0x000154, 0x000157, 0x000156, + 0x000159, 0x000158, 0x00015B, 0x00015A, 0x00015D, 0x00015C, 0x00015F, 0x00015E, + 0x000161, 0x000160, 0x000163, 0x000162, 0x000165, 0x000164, 0x000167, 0x000166, + 0x000169, 0x000168, 0x00016B, 0x00016A, 0x00016D, 0x00016C, 0x01D690, 0x01D697, + 0x000171, 0x000170, 0x000173, 0x000172, 0x000175, 0x000174, 0x000177, 0x000176, + 0x000179, 0x000178, 0x00017B, 0x00017A, 0x01D696, 0x00017C, 0x00017F, 0x00017E, + 0x000181, 0x000180, 0x000183, 0x000182, 0x000185, 0x000184, 0x000187, 0x000186, + 0x000189, 0x000188, 0x00018B, 0x00018A, 0x00018D, 0x00018C, 0x00018F, 0x00018E, + 0x000191, 0x000190, 0x000193, 0x000192, 0x000195, 0x000194, 0x000197, 0x000196, + 0x000199, 0x000198, 0x00019B, 0x00019A, 0x00019D, 0x00019C, 0x00019F, 0x00019E, + 0x0001A1, 0x0001A0, 0x0001A3, 0x0001A2, 0x0001A5, 0x0001A4, 0x0001A7, 0x0001A6, + 0x0001A9, 0x0001A8, 0x0001AB, 0x0001AA, 0x0001AD, 0x0001AC, 0x0001AF, 0x0001AE, + 0x0001B1, 0x0001B0, 0x0001B3, 0x0001B2, 0x0001B5, 0x0001B4, 0x0001B7, 0x0001B6, + 0x0001B9, 0x0001B8, 0x0001BB, 0x0001BA, 0x0001BD, 0x0001BC, 0x0001BF, 0x0001BE, + 0x0001C1, 0x0001C0, 0x0001C3, 0x0001C2, 0x0001C5, 0x0001C4, 0x0001C7, 0x0001C6, + 0x0001C9, 0x0001C8, 0x0001CB, 0x0001CA, 0x0001CD, 0x0001CC, 0x0001CF, 0x0001CE, + 0x0001D1, 0x0001D0, 0x0001D3, 0x0001D2, 0x0001D5, 0x0001D4, 0x0001D7, 0x0001D6, + 0x0001D9, 0x0001D8, 0x0001DB, 0x0001DA, 0x0001DD, 0x0001DC, 0x0001DF, 0x0001DE, + 0x0001E1, 0x0001E0, 0x0001E3, 0x0001E2, 0x0001E5, 0x0001E4, 0x0001E7, 0x0001E6, + 0x0001E9, 0x0001E8, 0x0001EB, 0x0001EA, 0x0001ED, 0x0001EC, 0x0001EF, 0x0001EE, + 0x0001F1, 0x0001F0, 0x0001F3, 0x0001F2, 0x0001F5, 0x0001F4, 0x01D711, 0x0001F6, + 0x0001F9, 0x0001F8, 0x0001FB, 0x0001FA, 0x0001FD, 0x0001FC, 0x0001FF, 0x0001FE, + 0x01D702, 0x01D703, 0x01D722, 0x01D721, 0x01D720, 0x01D723, 0x01D708, 0x01D725, + 0x01D726, 0x01D72B, 0x01D73C, 0x01D73D, 0x01D73E, 0x01D727, 0x01D710, 0x01D731, + 0x01D730, 0x01D73A, 0x01D736, 0x01D734, 0x01D753, 0x01D737, 0x01D718, 0x01D739, + 0x01D73B, 0x01D71B, 0x01D71C, 0x01D738, 0x01D73F, 0x01D71F, 0x01D781, 0x01D780, + 0x01D783, 0x01D782, 0x01D785, 0x01D784, 0x01D787, 0x01D786, 0x01D72A, 0x01D788, + 0x01D78B, 0x01D78A, 0x01D78D, 0x01D78C, 0x01D78F, 0x01D78E, 0x01D791, 0x01D790, + 0x01D793, 0x01D792, 0x01D795, 0x01D794, 0x01D797, 0x01D796, 0x01D799, 0x01D798, + 0x01D79B, 0x01D79A, 0x01D79D, 0x01D79C, 0x01D79F, 0x01D79E, 0x01D7A1, 0x01D7A0, + 0x01D7A3, 0x01D7A2, 0x01D7A5, 0x01D7A4, 0x01D7A7, 0x01D7A6, 0x01D724, 0x01D7A8, + 0x01D7AB, 0x01D7AA, 0x01D7AD, 0x01D7AC, 0x01D7AF, 0x01D7AE, 0x01D7B1, 0x01D7B0, + 0x01D7B3, 0x01D7B2, 0x01D7B5, 0x01D7B4, 0x01D7B7, 0x01D7B6, 0x01D7B9, 0x01D7B8, + 0x01D7BB, 0x01D7BA, 0x01D7BD, 0x01D7BC, 0x01D7BF, 0x01D7BE, 0x01D7C1, 0x01D7C0, + 0x01D752, 0x01D7C2, 0x01D7C5, 0x01D7C4, 0x01D7C7, 0x01D7C6, 0x01D7C9, 0x01D7C8, + 0x01D7CB, 0x01D7CA, 0x01D750, 0x01D751, 0x01D7CF, 0x01D7CE, 0x01D7D1, 0x01D7D0, + 0x01D7D3, 0x01D7D2, 0x01D7D5, 0x01D7D4, 0x01D7D7, 0x01D7D6, 0x01D7D9, 0x01D7D8, + 0x01D7DB, 0x01D7DA, 0x01D7DD, 0x01D7DC, 0x01D7DF, 0x01D7DE, 0x01D740, 0x01D741, + 0x01D773, 0x01D743, 0x01D744, 0x01D745, 0x01D746, 0x01D747, 0x01D728, 0x01D729, + 0x01D74A, 0x01D74B, 0x01D72C, 0x01D72D, 0x01D72E, 0x01D72F, 0x01D742, 0x01D749, + 0x01D7F3, 0x01D7F2, 0x01D754, 0x01D748, 0x01D756, 0x01D757, 0x01D758, 0x01D759, + 0x01D75A, 0x01D75B, 0x01D75C, 0x01D75D, 0x01D75E, 0x01D75F, 0x000218, 0x000219, + 0x000200, 0x000201, 0x000202, 0x000203, 0x000204, 0x000205, 0x000206, 0x000207, + 0x000208, 0x000209, 0x00020A, 0x00020B, 0x00020C, 0x00020D, 0x00020E, 0x00020F, + 0x000230, 0x000231, 0x000232, 0x000233, 0x000234, 0x000235, 0x000236, 0x000237, + 0x000238, 0x000239, 0x00023A, 0x00023B, 0x00021C, 0x00021D, 0x00021E, 0x00021F, + 0x000240, 0x000241, 0x000242, 0x000243, 0x000244, 0x000245, 0x000246, 0x000247, + 0x000248, 0x000249, 0x00024A, 0x00024B, 0x00024C, 0x00024D, 0x00022E, 0x00022F, + 0x000250, 0x000251, 0x000252, 0x000253, 0x000254, 0x000255, 0x000256, 0x000257, + 0x000258, 0x000259, 0x00025A, 0x00025B, 0x00025C, 0x00025D, 0x00025E, 0x00025F, + 0x000220, 0x000221, 0x000222, 0x000223, 0x000224, 0x000225, 0x000226, 0x000227, + 0x0000E8, 0x000229, 0x00022A, 0x00022B, 0x0000EC, 0x000228, 0x0000EE, 0x0000EF, + 0x000270, 0x000271, 0x000272, 0x000273, 0x000274, 0x000275, 0x00007A, 0x000277, + 0x00022C, 0x00022D, 0x00027A, 0x00027B, 0x00023C, 0x00023D, 0x00023E, 0x00023F, + 0x000728, 0x000771, 0x000772, 0x000773, 0x000724, 0x000770, 0x000776, 0x00072F, + 0x00046C, 0x00046D, 0x00072A, 0x00072B, 0x00044C, 0x00044D, 0x00044E, 0x00044F, + 0x00072C, 0x00072D, 0x000750, 0x000759, 0x000755, 0x000752, 0x00072E, 0x000756, + 0x00071E, 0x000761, 0x00075A, 0x00075B, 0x000754, 0x00071C, 0x000777, 0x000760, + 0x000460, 0x000461, 0x000462, 0x000463, 0x000465, 0x000392, 0x000466, 0x000467, + 0x000468, 0x000469, 0x00046A, 0x00046B, 0x00042C, 0x00042D, 0x00046E, 0x00046F, + 0x000726, 0x000721, 0x000720, 0x000725, 0x000474, 0x00047C, 0x000464, 0x000722, + 0x000478, 0x000479, 0x00047A, 0x000729, 0x000393, 0x00047D, 0x00047E, 0x00047F, + 0x000440, 0x000441, 0x000442, 0x000443, 0x000444, 0x000445, 0x00026E, 0x000447, + 0x000268, 0x000269, 0x00026A, 0x00026F, 0x00026C, 0x00026D, 0x00024E, 0x00024F, + 0x000470, 0x00047B, 0x000449, 0x000476, 0x000475, 0x000477, 0x000446, 0x000448, + 0x000458, 0x000459, 0x00044A, 0x00044B, 0x00045C, 0x00045D, 0x00045E, 0x00045F, + 0x000062, 0x000261, 0x000262, 0x000263, 0x000064, 0x000065, 0x000066, 0x000067, + 0x000068, 0x000267, 0x00026B, 0x00006B, 0x000396, 0x00006E, 0x00006A, 0x00006F, + 0x00027C, 0x000260, 0x000266, 0x000397, 0x000391, 0x00027D, 0x000390, 0x000276, + 0x000278, 0x000279, 0x000264, 0x000265, 0x00006C, 0x00006D, 0x00027E, 0x00027F, + 0x000692, 0x000698, 0x00069D, 0x000693, 0x000691, 0x00069A, 0x00069B, 0x000697, + 0x000690, 0x000696, 0x00A380, 0x00A381, 0x00A383, 0x00A38E, 0x00A384, 0x00A385, + 0x00A0EC, 0x00A382, 0x00A388, 0x00A389, 0x00A387, 0x00A38B, 0x00A38C, 0x00A38D, + 0x00A38A, 0x00A38F, 0x00A390, 0x00A391, 0x00A392, 0x00A39E, 0x00A394, 0x00A395, + 0x00A396, 0x00A397, 0x00A398, 0x00A399, 0x00A065, 0x00A39B, 0x00A39C, 0x00A39D, + 0x00A39A, 0x00A39F, 0x000680, 0x000687, 0x00A0EE, 0x00A3C4, 0x000768, 0x000769, + 0x000694, 0x00A386, 0x000688, 0x000689, 0x00A3A3, 0x00076C, 0x000695, 0x00069C, + 0x00076D, 0x00A0ED, 0x00A3B0, 0x00A3B1, 0x00A3B3, 0x00A3BE, 0x00A3B4, 0x00A3B5, + 0x00A3B2, 0x00A3B7, 0x00A3B8, 0x00A3B9, 0x00A3B6, 0x00A3BB, 0x000686, 0x00A3BD, + 0x00A3BA, 0x00A3BF, 0x00076E, 0x00076F, 0x00074D, 0x00A3C5, 0x00074E, 0x00074F, + 0x00A0E6, 0x00077C, 0x00A0EF, 0x00A0E8, 0x000684, 0x000685, 0x00A0CE, 0x00077D, + 0x000758, 0x000778, 0x00077E, 0x00077F, 0x00075C, 0x00075D, 0x00075E, 0x00075F, + 0x000779, 0x000765, 0x000762, 0x000763, 0x000774, 0x000775, 0x000766, 0x000767, + 0x00076A, 0x00076B, 0x00A3BC, 0x00A3AE, 0x000764, 0x00A0E3, 0x00A3A4, 0x00A3A5, + 0x00A0E5, 0x00A0E2, 0x00A3A8, 0x00A3A9, 0x00A3AA, 0x00A3AB, 0x00A3AD, 0x00A0E1, + 0x00A3AF, 0x00A0E0, 0x00077B, 0x00A0E7, 0x00077A, 0x00A0E9, 0x00A0F4, 0x00A0E4, + 0x00A0F6, 0x00A0F7, 0x000419, 0x000492, 0x000490, 0x000491, 0x00A0FC, 0x00A0FD, + 0x00A0EA, 0x00A0EB, 0x00A088, 0x00A0FE, 0x00A08C, 0x000497, 0x00A085, 0x00A084, + 0x000493, 0x00A08D, 0x00A098, 0x00A099, 0x00A08B, 0x00A089, 0x00A08E, 0x00A08F, + 0x00A09E, 0x00A09F, 0x00A091, 0x00A090, 0x00A093, 0x00A092, 0x00A09A, 0x00A09B, + 0x00A097, 0x00A096, 0x00A082, 0x00A083, 0x00A09C, 0x00A09D, 0x00A094, 0x00A095, + 0x00A080, 0x00A081, 0x00A0A4, 0x00A0A0, 0x00A0A3, 0x00A0A2, 0x00A0A5, 0x00A0A1, + 0x00A086, 0x00A087, 0x000495, 0x00A0A8, 0x00A0AB, 0x00A0AA, 0x00A0F5, 0x000496, + 0x00A0AF, 0x00A0AE, 0x00A0B4, 0x00A0B0, 0x00A0B3, 0x00A0B2, 0x00A0B5, 0x00A0B1, + 0x00A0B7, 0x00A0B6, 0x00A0BC, 0x00A0B8, 0x00A0BB, 0x00A0BA, 0x00A0BD, 0x00A0B9, + 0x00A0BF, 0x00A0BE, 0x00A1C0, 0x00A1C1, 0x00A1E2, 0x00A1E3, 0x00A0C3, 0x00A1E1, + 0x00A1E6, 0x00A1E7, 0x00A1E0, 0x00A1C8, 0x00A0C4, 0x00A0CA, 0x00A0C5, 0x00A0DD, + 0x000494, 0x00049B, 0x00A0C0, 0x00A0C1, 0x00A0C2, 0x00A0FF, 0x00A0D5, 0x00A0D4, + 0x00A0C6, 0x00A0C7, 0x00A0D9, 0x00A0D8, 0x00A0DB, 0x00A0DA, 0x00A1FC, 0x00A0DC, + 0x00A0DF, 0x00A0DE, 0x00A1FE, 0x00A1FF, 0x000413, 0x00A0F8, 0x00A0C9, 0x00A0F1, + 0x00049A, 0x00A0C8, 0x00A0F2, 0x00A0CB, 0x00A0F3, 0x00A1FA, 0x00A1F8, 0x00A0F0, + 0x00A0A6, 0x00A0A7, 0x00A1F0, 0x00A1F1, 0x00A1F2, 0x00A1F3, 0x00A1F4, 0x00A1F5, + 0x00A0CF, 0x00A1F9, 0x00A0F9, 0x00A0CC, 0x00A1F6, 0x00A1FB, 0x00A1FD, 0x00A0FB, + 0x00A0CD, 0x00A1F7, 0x00A128, 0x00A129, 0x00A12A, 0x00A12B, 0x00A184, 0x00A185, + 0x00A124, 0x00A125, 0x00A188, 0x00A189, 0x00A18A, 0x00A18B, 0x00A18C, 0x00A18D, + 0x00A18E, 0x00A18F, 0x00A12C, 0x00A12D, 0x00A178, 0x00A179, 0x00A192, 0x00A193, + 0x00A114, 0x00A115, 0x00A11A, 0x00A11B, 0x00A118, 0x00A119, 0x00A11E, 0x00A11F, + 0x00A12E, 0x00A12F, 0x00A180, 0x00A181, 0x00A182, 0x00A183, 0x00A1A4, 0x00A1A5, + 0x00A186, 0x00A187, 0x00A1A8, 0x00A1A9, 0x00A1AA, 0x00A1AB, 0x00A1AC, 0x00A1AD, + 0x00A1AE, 0x00A1AF, 0x00A190, 0x00A191, 0x00A1B2, 0x00A1B3, 0x00A194, 0x00A195, + 0x00A196, 0x00A197, 0x00A198, 0x00A199, 0x00A19A, 0x00A19B, 0x00A19C, 0x00A19D, + 0x00A19E, 0x00A19F, 0x00A1A0, 0x00A1A1, 0x00A1C2, 0x00A1C3, 0x00A1C4, 0x00A1C5, + 0x00A1C6, 0x00A1C7, 0x00A153, 0x00A1C9, 0x00A1CA, 0x00A1CB, 0x00A1CC, 0x00A1CD, + 0x00A1CE, 0x00A1CF, 0x00A1D0, 0x00A1D1, 0x00A1D2, 0x00A1D3, 0x00A1D4, 0x00A1D5, + 0x00A1D6, 0x00A1D7, 0x00A1D8, 0x00A1D9, 0x00A1DA, 0x00A1DB, 0x00A1DC, 0x00A1DD, + 0x00A1DE, 0x00A1DF, 0x00A150, 0x00A151, 0x00A152, 0x00A1A3, 0x00A144, 0x00A175, + 0x00A157, 0x00A1A2, 0x00A17B, 0x00A14A, 0x00A156, 0x00A14B, 0x00A174, 0x00A17E, + 0x00A17A, 0x00A17F, 0x00A1B0, 0x00A1B1, 0x00A1A6, 0x00A1A7, 0x00A1B4, 0x00A1B5, + 0x00A1B6, 0x00A1B7, 0x00A1B8, 0x00A1B9, 0x00A1BA, 0x00A1BB, 0x00A1BC, 0x00A1BD, + 0x00A1BE, 0x00A1BF, 0x000502, 0x000503, 0x00050A, 0x00050B, 0x000500, 0x000501, + 0x00050E, 0x00050F, 0x000508, 0x000509, 0x000504, 0x000505, 0x000506, 0x000507, + 0x000519, 0x000518, 0x00A02B, 0x000564, 0x00051D, 0x00051C, 0x00051F, 0x00051E, + 0x000521, 0x000520, 0x000523, 0x000527, 0x000525, 0x000524, 0x000522, 0x000526, + 0x000529, 0x000528, 0x00052B, 0x00052F, 0x00050C, 0x00050D, 0x00052A, 0x00052E, + 0x000531, 0x00053B, 0x000533, 0x000532, 0x00053A, 0x000537, 0x000534, 0x000535, + 0x000539, 0x000538, 0x000563, 0x00053F, 0x00053D, 0x00053C, 0x000536, 0x00053E, + 0x000541, 0x000540, 0x000543, 0x000542, 0x000545, 0x000544, 0x000547, 0x000546, + 0x00057B, 0x000565, 0x00A009, 0x00054A, 0x000575, 0x000481, 0x000549, 0x00057A, + 0x000551, 0x000550, 0x000553, 0x000571, 0x000555, 0x000554, 0x000552, 0x000556, + 0x000548, 0x000576, 0x000577, 0x00054B, 0x00054C, 0x00054D, 0x00054E, 0x00054F, + 0x000579, 0x00A01B, 0x000578, 0x00057E, 0x00052C, 0x00052D, 0x000567, 0x000561, + 0x0005EA, 0x0005E9, 0x0004D1, 0x00057F, 0x0005E8, 0x00A163, 0x00A164, 0x00A165, + 0x00A162, 0x000570, 0x00A168, 0x00A169, 0x00A16A, 0x00A16B, 0x00A16C, 0x00A16D, + 0x00A16E, 0x00A16F, 0x000573, 0x00A011, 0x000572, 0x000566, 0x0004B7, 0x00049F, + 0x000582, 0x000583, 0x000580, 0x000581, 0x000586, 0x000587, 0x000584, 0x000585, + 0x00A17C, 0x000623, 0x00A000, 0x00A001, 0x0005E6, 0x0005E7, 0x00A004, 0x00A005, + 0x000510, 0x000511, 0x000512, 0x000513, 0x000514, 0x000515, 0x000516, 0x000517, + 0x00A006, 0x00A007, 0x00051A, 0x00051B, 0x00A012, 0x00A013, 0x00A010, 0x00A00D, + 0x00A016, 0x00A017, 0x00A00A, 0x00A008, 0x00A01A, 0x00A00B, 0x00A01C, 0x00A01D, + 0x00A00E, 0x00A00F, 0x00A02C, 0x00A02D, 0x00A02E, 0x00A02F, 0x00A024, 0x00A025, + 0x00A022, 0x00A023, 0x00A038, 0x00A039, 0x00A02A, 0x00A029, 0x00A027, 0x00A00C, + 0x00A03E, 0x00A028, 0x00A030, 0x00A031, 0x00A032, 0x00A033, 0x00A03A, 0x00A03F, + 0x00A036, 0x00A037, 0x0005D9, 0x00A049, 0x00A03B, 0x00A021, 0x00A034, 0x00A035, + 0x00A03C, 0x00A03D, 0x00A042, 0x00A041, 0x00056C, 0x00A043, 0x00A046, 0x00A040, + 0x00A047, 0x0005F1, 0x0005F2, 0x0005F0, 0x00A04A, 0x00A04B, 0x00A044, 0x00A045, + 0x00A05B, 0x00A04F, 0x00A052, 0x00A053, 0x00A050, 0x00A051, 0x00A056, 0x00A057, + 0x0005DC, 0x00056E, 0x000562, 0x00056F, 0x0005D4, 0x0005D5, 0x0005DA, 0x0005DB, + 0x0005D8, 0x000569, 0x00056A, 0x00056B, 0x0005DD, 0x000568, 0x0005DE, 0x0005DF, + 0x0005D2, 0x0005D3, 0x0005E1, 0x0005E3, 0x0005E0, 0x0005E5, 0x000574, 0x0005E4, + 0x0005D0, 0x0005D1, 0x0005E2, 0x00056D, 0x00057C, 0x00057D, 0x0005D6, 0x0005D7, + 0x00A020, 0x00A026, 0x00A058, 0x00A059, 0x00A05A, 0x00A05D, 0x00A054, 0x00A055, + 0x00A05E, 0x00A05F, 0x0007CA, 0x00A340, 0x0007CC, 0x0007CD, 0x000631, 0x0007CE, + 0x00A346, 0x00A347, 0x00A364, 0x00A365, 0x00A36D, 0x0006B1, 0x00A215, 0x000633, + 0x000632, 0x00069E, 0x000683, 0x00A211, 0x00A369, 0x00A36E, 0x00A36C, 0x00069F, + 0x00A368, 0x00A210, 0x0007E3, 0x00A36F, 0x000699, 0x00A36A, 0x00A35C, 0x0007E2, + 0x0007E4, 0x0007E5, 0x000681, 0x00A21D, 0x0007E8, 0x0007E9, 0x00A37C, 0x00A214, + 0x00A362, 0x00A363, 0x0007EA, 0x000682, 0x00A2AB, 0x00A32E, 0x00A32C, 0x00068B, + 0x00A213, 0x00A20B, 0x00A21B, 0x00A374, 0x00A37E, 0x00A37F, 0x00A375, 0x00A06C, + 0x0004E8, 0x0004ED, 0x00A06B, 0x0004E6, 0x0004E5, 0x0004E7, 0x00A06E, 0x00A06F, + 0x00A06A, 0x0004E9, 0x0004CA, 0x00A060, 0x0004E4, 0x00A063, 0x0007E0, 0x0004EE, + 0x00A06D, 0x0007D4, 0x00A048, 0x00A35D, 0x00A062, 0x00A067, 0x00A04C, 0x00A04D, + 0x00A04E, 0x00A068, 0x0007DA, 0x00A291, 0x000719, 0x0004EC, 0x00A37A, 0x0007CB, + 0x00A07E, 0x00A066, 0x0004E2, 0x0004E3, 0x0004E1, 0x00A079, 0x00A05C, 0x00A078, + 0x00A07F, 0x0004EF, 0x00A064, 0x00A069, 0x0004FC, 0x0004E0, 0x0004EB, 0x00A07C, + 0x00A076, 0x00A061, 0x0004FE, 0x0004EA, 0x0004F4, 0x0004FD, 0x0004F6, 0x0004FF, + 0x0004F8, 0x0004F9, 0x0004FA, 0x0004FB, 0x00A072, 0x00A073, 0x00A074, 0x00A075, + 0x000480, 0x00A07A, 0x00A07D, 0x00A071, 0x00048C, 0x00048D, 0x00A070, 0x0004F7, + 0x00A07B, 0x00A077, 0x00048A, 0x00048B, 0x000718, 0x00071D, 0x00048E, 0x00048F, + 0x00A292, 0x00A297, 0x00A2B5, 0x00A2B9, 0x000636, 0x000635, 0x000412, 0x000727, + 0x000498, 0x000499, 0x00049E, 0x0004BA, 0x00049C, 0x00049D, 0x000723, 0x000417, + 0x0004A1, 0x0004B1, 0x0004B0, 0x0004BB, 0x0004B4, 0x0004B5, 0x0004AD, 0x0004B6, + 0x0004AA, 0x0004AB, 0x0004A2, 0x0004A3, 0x0004A8, 0x0004A9, 0x0004A0, 0x0004A5, + 0x00041B, 0x000416, 0x0004B2, 0x0004B3, 0x0004A4, 0x0004AF, 0x0004A6, 0x0004A7, + 0x0004B8, 0x0004B9, 0x000630, 0x000637, 0x0004BC, 0x0004BD, 0x0004BE, 0x0004BF, + 0x000757, 0x000634, 0x000411, 0x00041A, 0x000410, 0x00A2A5, 0x000414, 0x000415, + 0x00A2A9, 0x0004C9, 0x0004C8, 0x0004CE, 0x0004CD, 0x000753, 0x0004CC, 0x0004CF, + 0x0004D0, 0x0004D6, 0x0004D2, 0x0004D3, 0x0004C1, 0x0004D7, 0x0004DA, 0x0004DB, + 0x0004D4, 0x0004D5, 0x0004D8, 0x0004D9, 0x0004DE, 0x0004DF, 0x0004DC, 0x0004DD, + 0x0004C0, 0x000710, 0x00071A, 0x000715, 0x0004C4, 0x0004C5, 0x0004C6, 0x0004C7, + 0x000716, 0x000714, 0x0004C2, 0x0004C3, 0x000717, 0x0004CB, 0x00A3EE, 0x00A3E4, + 0x0004F0, 0x0004F1, 0x00A3E8, 0x00A3EC, 0x00A3EB, 0x0004F5, 0x00A3ED, 0x00A3EF, + 0x0004AE, 0x00A3EA, 0x0004F2, 0x0004F3, 0x00071B, 0x0004AC, 0x000712, 0x000713, + 0x000782, 0x000783, 0x000780, 0x000781, 0x000785, 0x000787, 0x000784, 0x0007B1, + 0x00079C, 0x00079D, 0x00A301, 0x00078B, 0x00A316, 0x00A317, 0x00078F, 0x000786, + 0x000791, 0x00079E, 0x00A393, 0x000792, 0x00079F, 0x000790, 0x000796, 0x000795, + 0x000798, 0x000799, 0x00079B, 0x00A318, 0x00A312, 0x00A313, 0x000794, 0x00079A, + 0x00A314, 0x00A315, 0x00A31A, 0x00A31B, 0x00A311, 0x00A319, 0x00A31E, 0x00A31D, + 0x00A31F, 0x00A310, 0x00078A, 0x00A300, 0x000788, 0x000789, 0x0007A3, 0x00078E, + 0x00A302, 0x00A303, 0x00A324, 0x00A32B, 0x0007A0, 0x0007A1, 0x00A334, 0x00A325, + 0x00A33A, 0x00A33B, 0x0007A2, 0x00A329, 0x00078C, 0x00078D, 0x00A328, 0x00A32D, + 0x00A306, 0x00A307, 0x00A335, 0x0007DB, 0x0007D0, 0x0007D5, 0x00A31C, 0x00A30B, + 0x00A32A, 0x00A32F, 0x0007D6, 0x0007C3, 0x0007C2, 0x0007C1, 0x0007C7, 0x0007D7, + 0x000751, 0x0007C9, 0x0007CF, 0x0007D1, 0x0007DC, 0x0007DD, 0x0007DE, 0x0007DF, + 0x0007D8, 0x0007D9, 0x00A359, 0x0007D3, 0x00A352, 0x00A353, 0x0007D2, 0x00071F, + 0x00A293, 0x00A35B, 0x00A350, 0x00A351, 0x00A354, 0x00A343, 0x00A341, 0x00A355, + 0x00A356, 0x00A357, 0x0007C0, 0x0007C5, 0x0007C8, 0x0007C6, 0x0007A4, 0x0007A5, + 0x00A342, 0x0007E1, 0x00A378, 0x00A379, 0x0007C4, 0x00A37B, 0x0007E6, 0x0007E7, + 0x00A35E, 0x00A3E5, 0x00A35A, 0x00A35F, 0x00A3E9, 0x00A358, 0x00A33E, 0x00A33F, + 0x00040D, 0x000401, 0x000402, 0x000403, 0x000400, 0x000405, 0x000406, 0x000407, + 0x000409, 0x000404, 0x00040A, 0x00040B, 0x000797, 0x000408, 0x00040E, 0x00040F, + 0x000450, 0x000451, 0x000452, 0x000453, 0x000455, 0x000472, 0x000456, 0x000457, + 0x000418, 0x000793, 0x00045B, 0x000454, 0x00041C, 0x00041D, 0x00041E, 0x00041F, + 0x000429, 0x000421, 0x000422, 0x000423, 0x000420, 0x000425, 0x000426, 0x000427, + 0x0003A8, 0x000424, 0x0003AA, 0x00042B, 0x0003AC, 0x00040C, 0x0003AE, 0x0003AF, + 0x00043C, 0x000431, 0x000432, 0x000433, 0x000430, 0x000435, 0x000436, 0x000437, + 0x000439, 0x000434, 0x00043A, 0x00043B, 0x000438, 0x00043D, 0x00043E, 0x00043F, + 0x0003C0, 0x0003C1, 0x0003C2, 0x0003C3, 0x0003C4, 0x0003C5, 0x0003C6, 0x0003C7, + 0x0003C8, 0x0003C9, 0x0003CA, 0x0003CB, 0x0003CC, 0x0003CD, 0x0003CE, 0x0003CF, + 0x0003D0, 0x0003D1, 0x0003D2, 0x0003D3, 0x0003D4, 0x0003D5, 0x0003D6, 0x0003D7, + 0x0003D8, 0x0003D9, 0x0003DA, 0x0003DB, 0x0003DC, 0x0003DD, 0x0003DE, 0x0003DF, + 0x0003E0, 0x0003E1, 0x0003E2, 0x0003E3, 0x0003E4, 0x0003E5, 0x0003E6, 0x0003E7, + 0x0003E8, 0x0003E9, 0x0003EA, 0x0003EB, 0x0003EC, 0x0003ED, 0x0003EE, 0x0003EF, + 0x0003F0, 0x0003F1, 0x0003F2, 0x0003F3, 0x0003F4, 0x000473, 0x00042A, 0x0003F7, + 0x0003F8, 0x0003F9, 0x0003FA, 0x0003FB, 0x0003FC, 0x0003FD, 0x0003FE, 0x0003FF, + 0x00A433, 0x00A40E, 0x00A404, 0x00A405, 0x00A435, 0x00A432, 0x00A408, 0x00A409, + 0x00A40A, 0x00A40B, 0x00A3C0, 0x00A3C1, 0x00A3E6, 0x00A3E7, 0x00A482, 0x00A483, + 0x00A3C6, 0x00A3C7, 0x00A480, 0x00A481, 0x00A48B, 0x00A48A, 0x00A3CC, 0x00A485, + 0x00A3CE, 0x00A484, 0x00A40C, 0x00A40D, 0x000802, 0x000801, 0x000803, 0x00A486, + 0x0008A2, 0x00A487, 0x00A488, 0x00A489, 0x0008BC, 0x0008BD, 0x0008BA, 0x0008BB, + 0x00080B, 0x000852, 0x00A3E0, 0x00A3E1, 0x00A3E2, 0x00A3E3, 0x00A43D, 0x00A46E, + 0x00A3A6, 0x00A3A7, 0x0008AB, 0x00A439, 0x000807, 0x000853, 0x00A3FE, 0x0008A7, + 0x00A436, 0x00A437, 0x00A3F0, 0x00A3F1, 0x00A3F2, 0x00A3F3, 0x00A3F4, 0x00A3F5, + 0x00A434, 0x00A3F7, 0x00A3F8, 0x00A3F9, 0x00A3FA, 0x00A3FB, 0x00A3FC, 0x00A3FD, + 0x00A3FF, 0x00A3F6, 0x00A4D0, 0x00A4D1, 0x00A4D2, 0x000806, 0x00A46F, 0x000800, + 0x00A4D6, 0x00A4D7, 0x00A3D8, 0x00A46A, 0x0008A0, 0x0008A5, 0x00A3DC, 0x00A3DD, + 0x00A43A, 0x00A43F, 0x00A3D0, 0x00A3D1, 0x00A3D2, 0x00A3D3, 0x00A3D4, 0x00A3D5, + 0x00A3D6, 0x00A3D7, 0x00A3C3, 0x00A3D9, 0x00A3DA, 0x00A3DB, 0x00A4D3, 0x00A3C2, + 0x00A3DE, 0x00A3DF, 0x0008A6, 0x0008AA, 0x0008A1, 0x00A465, 0x00A4E2, 0x00A4E3, + 0x0008A9, 0x00A3CD, 0x00A4E1, 0x00A4E6, 0x00A3CA, 0x00A3C9, 0x00A4E0, 0x00A3C8, + 0x00A3CF, 0x00A4E7, 0x00A4F1, 0x00A4F3, 0x00A4F0, 0x00A4F2, 0x00A438, 0x00A4F7, + 0x00A43B, 0x00A4F6, 0x00A464, 0x000804, 0x00A423, 0x000811, 0x000805, 0x00A43C, + 0x00080A, 0x00A46B, 0x00A58A, 0x00A516, 0x00A517, 0x000809, 0x000812, 0x00A589, + 0x00080D, 0x00A511, 0x00A50A, 0x00A508, 0x00A503, 0x000813, 0x00A504, 0x00A509, + 0x000808, 0x00A502, 0x00080F, 0x00A510, 0x00A513, 0x00A512, 0x00A51C, 0x00A51D, + 0x014503, 0x014500, 0x00A519, 0x00A518, 0x00080C, 0x00A51A, 0x014517, 0x000B6C, + 0x00A51F, 0x01450B, 0x00A539, 0x00A53F, 0x00A501, 0x00A538, 0x00080E, 0x014519, + 0x014518, 0x01451D, 0x01453F, 0x000810, 0x00A588, 0x01450A, 0x00A53A, 0x00A6E6, + 0x00A506, 0x00A58F, 0x014507, 0x01452B, 0x00A533, 0x00A532, 0x000815, 0x00A537, + 0x00A534, 0x00A535, 0x0008B6, 0x0008B7, 0x0008B0, 0x0008B1, 0x000854, 0x000864, + 0x00A522, 0x00A53B, 0x00A54A, 0x00A54B, 0x00A540, 0x0008B4, 0x0008B2, 0x0008B3, + 0x00A549, 0x00A576, 0x000AA2, 0x014535, 0x000857, 0x000851, 0x014506, 0x00A562, + 0x00A563, 0x000B6D, 0x00A57C, 0x000850, 0x00A557, 0x00A6E7, 0x014522, 0x000814, + 0x000861, 0x00A551, 0x00A572, 0x00A573, 0x00A57A, 0x00A57B, 0x00A578, 0x00A579, + 0x00A57D, 0x00A556, 0x00A568, 0x00A56D, 0x0008A3, 0x00A56C, 0x00A565, 0x00A564, + 0x00A56E, 0x0008B8, 0x00A521, 0x00A548, 0x00A56B, 0x00A54F, 0x00A56F, 0x00A520, + 0x00A56A, 0x00A569, 0x000860, 0x000856, 0x0008B9, 0x000865, 0x00A53C, 0x00086A, + 0x00A526, 0x00A527, 0x0145EE, 0x00A53D, 0x000A9C, 0x00A58E, 0x00090E, 0x00090F, + 0x00A53E, 0x00A54E, 0x01453C, 0x014523, 0x01453E, 0x01453D, 0x000908, 0x000909, + 0x000911, 0x000917, 0x000913, 0x000912, 0x000910, 0x00091A, 0x000915, 0x00091B, + 0x00A616, 0x0144DB, 0x01449E, 0x00A894, 0x000914, 0x00090D, 0x000916, 0x00090C, + 0x01456C, 0x0008AC, 0x00A97A, 0x0144EF, 0x0008AE, 0x0008A4, 0x000936, 0x000937, + 0x0008A8, 0x0008AD, 0x00A421, 0x00A585, 0x00A422, 0x00A427, 0x0008AF, 0x00A976, + 0x000931, 0x000930, 0x014488, 0x00A974, 0x00A420, 0x00A426, 0x00A944, 0x00A975, + 0x00A584, 0x000932, 0x0144BE, 0x000933, 0x0144BF, 0x00A977, 0x00A58B, 0x00A970, + 0x00A96B, 0x01448B, 0x01452E, 0x01452F, 0x0144F7, 0x014410, 0x01456E, 0x014564, + 0x000958, 0x00A43E, 0x01456F, 0x01457F, 0x00095C, 0x00095D, 0x00095E, 0x00095F, + 0x0144D8, 0x00A972, 0x00A971, 0x01456D, 0x014552, 0x00A97B, 0x000959, 0x014553, + 0x014545, 0x01454E, 0x014544, 0x01454F, 0x01454C, 0x014549, 0x014548, 0x01454B, + 0x01454A, 0x01454D, 0x00096E, 0x00096C, 0x0009EE, 0x00096D, 0x00096F, 0x0009EF, + 0x0009EC, 0x0009ED, 0x00A5E8, 0x00A5E5, 0x00A566, 0x00A567, 0x000968, 0x000969, + 0x00A5EE, 0x00A5EF, 0x00A5E9, 0x00A561, 0x00A560, 0x014570, 0x00A5ED, 0x00A5EC, + 0x00A5EA, 0x000978, 0x014563, 0x000979, 0x00097E, 0x00097C, 0x00097F, 0x00097D, + 0x000989, 0x000980, 0x00098A, 0x00098B, 0x000985, 0x000988, 0x000987, 0x000986, + 0x00099D, 0x00099F, 0x00A601, 0x00099C, 0x00A603, 0x00A602, 0x00A605, 0x00A604, + 0x00A607, 0x00A606, 0x00A609, 0x00A608, 0x000990, 0x00A60A, 0x000997, 0x000993, + 0x000999, 0x000998, 0x00099B, 0x00099A, 0x000994, 0x000995, 0x000996, 0x00099E, + 0x0009A2, 0x0009A3, 0x00A619, 0x00A618, 0x00098C, 0x0009A1, 0x00A61D, 0x00A61C, + 0x00A61F, 0x00A5B5, 0x00A621, 0x00A620, 0x00098F, 0x00A622, 0x00A2E2, 0x00A2E3, + 0x00A627, 0x00A626, 0x0009B0, 0x0009B7, 0x0009A8, 0x00A62A, 0x0009A0, 0x0009B6, + 0x0009B9, 0x0009B8, 0x0009B2, 0x0009A5, 0x00A2E7, 0x0009A6, 0x0009A7, 0x0009BD, + 0x0009E0, 0x0009E1, 0x0009E6, 0x0009E7, 0x0009E9, 0x0009F4, 0x0009EA, 0x0009E8, + 0x0009EB, 0x00A2E6, 0x00A2C0, 0x00A2C1, 0x0009CE, 0x0009FC, 0x00A2E0, 0x00A2E1, + 0x00A2C7, 0x0009F5, 0x0009F8, 0x0009F9, 0x00A2CC, 0x0009DC, 0x00A2CD, 0x0009F6, + 0x0009DD, 0x0009DF, 0x00A2D0, 0x00A2D1, 0x00A2D2, 0x00A2F2, 0x00A2F0, 0x00A2F1, + 0x00A2D6, 0x00A2D7, 0x0009AA, 0x0009AE, 0x0009A4, 0x00A2F6, 0x0009AF, 0x00A2F7, + 0x00A2CE, 0x00A2CF, 0x00A661, 0x00A660, 0x00A663, 0x00A662, 0x00A665, 0x0009AB, + 0x00A667, 0x00A666, 0x00A669, 0x00A668, 0x00A2F3, 0x00A66A, 0x00A66D, 0x00A66C, + 0x0009F7, 0x00A66E, 0x0009F0, 0x0009F1, 0x0009AC, 0x0009AD, 0x00A2F4, 0x00A2F5, + 0x00A2FE, 0x000B6F, 0x00A2F8, 0x00A2F9, 0x000A05, 0x00A2FF, 0x000A07, 0x000A06, + 0x00A2FC, 0x00A2FD, 0x00A692, 0x000A0A, 0x00A693, 0x00A2FB, 0x00A697, 0x00A2FA, + 0x00A6EA, 0x000A10, 0x000A13, 0x00A2A1, 0x00A2A2, 0x000A14, 0x000A17, 0x000A16, + 0x000A19, 0x000A18, 0x000A1B, 0x000A1A, 0x000A1D, 0x000A1C, 0x000A1F, 0x000A1E, + 0x00A290, 0x00A296, 0x00A2A0, 0x00A2D3, 0x00A2A6, 0x00A2A7, 0x00A2BC, 0x00A2BD, + 0x00A2BE, 0x000A28, 0x00A2C9, 0x00A2B4, 0x000A2D, 0x000A2C, 0x000A2F, 0x000A2E, + 0x000A33, 0x000A30, 0x00A2BA, 0x00A2BF, 0x000A35, 0x00A2BB, 0x000A32, 0x000A36, + 0x00A2B8, 0x000A38, 0x00A685, 0x00A2A3, 0x00A6BB, 0x00A6ED, 0x00A2C4, 0x00A2C5, + 0x00A6B5, 0x00A68A, 0x00A2C8, 0x00A684, 0x00A699, 0x00A2CB, 0x00A691, 0x00A698, + 0x00A690, 0x00A2CA, 0x00A682, 0x00A683, 0x00A6E9, 0x000A99, 0x00A6BD, 0x00A686, + 0x00A6BC, 0x00A613, 0x00A688, 0x00A689, 0x00A6CB, 0x00A68F, 0x00A6A0, 0x00A681, + 0x000A59, 0x0144DF, 0x000A5B, 0x000A5A, 0x00A6A2, 0x000A5C, 0x00A696, 0x000A5E, + 0x00A6E5, 0x000A98, 0x00A6EB, 0x00A6A6, 0x000B5F, 0x00A6A7, 0x000A67, 0x000A66, + 0x000A69, 0x000A68, 0x000A6B, 0x000A6A, 0x000A6D, 0x00A2A4, 0x000A6F, 0x000A6E, + 0x00A2AE, 0x0144D5, 0x00A2AA, 0x00A2A8, 0x00A6A1, 0x00A612, 0x00A2AC, 0x00A2AD, + 0x00A2AF, 0x014529, 0x00A6B8, 0x00A6B7, 0x00A6B2, 0x00A6B3, 0x00A6B4, 0x014524, + 0x00A6BE, 0x00A6BF, 0x0144D4, 0x00A6BA, 0x000A85, 0x00A6B9, 0x000A87, 0x000A86, + 0x000A89, 0x000A88, 0x000A8B, 0x000A8A, 0x000A8D, 0x000A8C, 0x000A8F, 0x00A7A8, + 0x00A722, 0x00A783, 0x00A217, 0x014565, 0x00A6CE, 0x00A212, 0x00A600, 0x000B68, + 0x014521, 0x00A6CF, 0x00A617, 0x00A61E, 0x00A782, 0x000B69, 0x00A781, 0x014520, + 0x000A93, 0x00A6E3, 0x000A91, 0x00A79E, 0x00A787, 0x00A611, 0x00A79F, 0x00A6E2, + 0x00A79C, 0x000AA8, 0x00A780, 0x00A7AA, 0x000AAD, 0x000AAC, 0x000AAF, 0x000AAE, + 0x000B74, 0x000AB0, 0x000AB3, 0x000AB2, 0x00A7A9, 0x000B75, 0x000AB7, 0x000AB6, + 0x00A786, 0x00A7AB, 0x00A21A, 0x00A610, 0x000A97, 0x00A732, 0x00A73E, 0x00A219, + 0x00A735, 0x00A733, 0x00A202, 0x00A203, 0x00A72A, 0x000A9B, 0x00A7AE, 0x00A216, + 0x00A73C, 0x00A723, 0x00A625, 0x00A74B, 0x00A6C5, 0x00A762, 0x00A6C8, 0x00A767, + 0x000B5C, 0x000AD0, 0x00A761, 0x00A6C4, 0x000AAB, 0x00A6C9, 0x00A744, 0x00A760, + 0x00A21E, 0x00A21F, 0x00A6E0, 0x000D93, 0x000B5D, 0x0144C5, 0x000B6E, 0x01448A, + 0x00A6D7, 0x00A766, 0x00A218, 0x00A74A, 0x00A6D6, 0x00A624, 0x00A653, 0x00A7FE, + 0x000AE9, 0x000AE8, 0x00A7FA, 0x00A76F, 0x000AED, 0x000AEC, 0x000AEF, 0x000AEE, + 0x00A765, 0x00A7FF, 0x00A769, 0x00A7FC, 0x000B73, 0x000B77, 0x00A76D, 0x00A768, + 0x00A76C, 0x00A76A, 0x000B76, 0x0144DA, 0x000A90, 0x000AB9, 0x00A77C, 0x000B72, + 0x00A76E, 0x00A763, 0x00A779, 0x00A6E8, 0x00A7FB, 0x00A778, 0x000B33, 0x000A96, + 0x000B19, 0x00A77D, 0x000B18, 0x00A623, 0x000B14, 0x000B30, 0x000B1D, 0x000B32, + 0x000B13, 0x00A79B, 0x00A795, 0x000B16, 0x00A794, 0x000B10, 0x000B17, 0x00A60B, + 0x000B1A, 0x00A6E1, 0x000B1B, 0x000B15, 0x01441D, 0x00A3CB, 0x00A8A5, 0x00A88D, + 0x000B23, 0x00A887, 0x000AB5, 0x000B06, 0x000B07, 0x014412, 0x014413, 0x01441E, + 0x000B21, 0x00A3A1, 0x014581, 0x0145B5, 0x000DEB, 0x01441F, 0x014403, 0x01459D, + 0x000B1E, 0x014417, 0x000B1F, 0x014411, 0x00A799, 0x014424, 0x014464, 0x014422, + 0x014420, 0x014421, 0x014425, 0x014428, 0x014426, 0x014468, 0x014427, 0x01442A, + 0x01442B, 0x014429, 0x000B2E, 0x000B0F, 0x014416, 0x014418, 0x01443B, 0x014414, + 0x00A79D, 0x014415, 0x000B08, 0x000B09, 0x01446C, 0x00A7A5, 0x01441C, 0x000B0C, + 0x000B2A, 0x000B2D, 0x000B2B, 0x000B2C, 0x00A2EE, 0x014405, 0x00A2EF, 0x00A3AC, + 0x000B28, 0x014401, 0x014402, 0x014406, 0x014400, 0x00A798, 0x000B1C, 0x00A79A, + 0x01444D, 0x01446A, 0x000B22, 0x000B20, 0x000B2F, 0x000B27, 0x014449, 0x00A6EC, + 0x014404, 0x00A7A4, 0x00A641, 0x014477, 0x000B24, 0x000B25, 0x000B26, 0x00A6EE, + 0x000B71, 0x000B35, 0x014444, 0x00A6EF, 0x00A6D1, 0x00A3A2, 0x000B36, 0x000B37, + 0x000B38, 0x000B39, 0x00A2ED, 0x000B3D, 0x00A2EA, 0x00A2EC, 0x014448, 0x00A2E5, + 0x00A2E4, 0x00A2E8, 0x00A3A0, 0x00A2E9, 0x014438, 0x014439, 0x014434, 0x01443A, + 0x00A2EB, 0x014435, 0x014469, 0x01446B, 0x000BA8, 0x000CB9, 0x0145DB, 0x000AA3, + 0x014465, 0x00A99E, 0x00A817, 0x000A95, 0x00A813, 0x000A9F, 0x01448D, 0x00A811, + 0x014496, 0x014484, 0x000A9D, 0x014485, 0x014489, 0x014510, 0x01448F, 0x000A94, + 0x000BA3, 0x014499, 0x01449F, 0x01448E, 0x01449B, 0x014493, 0x014497, 0x014483, + 0x000BAA, 0x014494, 0x01459A, 0x000A9A, 0x014492, 0x01449C, 0x000BA4, 0x014491, + 0x01448C, 0x014495, 0x01449D, 0x014590, 0x0145B6, 0x000BA9, 0x0144BB, 0x01458F, + 0x0144B6, 0x000BB8, 0x014482, 0x0144B2, 0x000AAA, 0x000BB9, 0x0145A5, 0x000A9E, + 0x000BD0, 0x00A810, 0x00AB9A, 0x000BEE, 0x0144B1, 0x0144B3, 0x000BEF, 0x0144B7, + 0x014481, 0x000BE8, 0x014486, 0x014487, 0x014498, 0x014480, 0x00A86E, 0x000BED, + 0x0144B0, 0x0144B5, 0x00A91E, 0x01449A, 0x0144E0, 0x0145BE, 0x0144E6, 0x00A86F, + 0x00A81A, 0x0144E7, 0x0144E8, 0x0144E9, 0x0144EB, 0x000BEC, 0x00A812, 0x00A844, + 0x0144EA, 0x00A816, 0x000BEA, 0x000BF0, 0x00A84B, 0x000BE6, 0x000BE7, 0x00A869, + 0x00A868, 0x000BEB, 0x0144FE, 0x0144FF, 0x00A863, 0x00A862, 0x0145BF, 0x00A86A, + 0x00A864, 0x00A865, 0x00A860, 0x00A861, 0x0144E3, 0x00A867, 0x0144E5, 0x0144E2, + 0x00A866, 0x0144E4, 0x000BF2, 0x000BF1, 0x00A86C, 0x000BE9, 0x00A86D, 0x0144E1, + 0x0144FC, 0x000C1E, 0x000C1B, 0x000C1C, 0x000C1A, 0x0144F5, 0x0144F3, 0x0144F2, + 0x0144B4, 0x0144F4, 0x0144F8, 0x0144F6, 0x0144F9, 0x00A885, 0x0144BA, 0x0144FA, + 0x000C12, 0x000C13, 0x0144FB, 0x00A884, 0x014501, 0x000C18, 0x000C1F, 0x014502, + 0x000C19, 0x014504, 0x00A889, 0x00A89F, 0x000C1D, 0x00A892, 0x00A893, 0x000C10, + 0x000C16, 0x00A89D, 0x00A899, 0x000C17, 0x014511, 0x00A898, 0x014513, 0x014512, + 0x00A88B, 0x000C07, 0x00A8AD, 0x014516, 0x00A8AC, 0x00A883, 0x01451E, 0x00A882, + 0x01451F, 0x01451C, 0x00A8A1, 0x00A8A8, 0x00A8AE, 0x00A8AF, 0x00A88A, 0x000C15, + 0x014525, 0x00A886, 0x014527, 0x014526, 0x00A891, 0x014528, 0x000C14, 0x01452A, + 0x00A890, 0x000C59, 0x00A896, 0x00A897, 0x00A89C, 0x000C05, 0x000C06, 0x000C09, + 0x000C08, 0x014534, 0x000C0A, 0x000C0B, 0x014539, 0x014538, 0x01453B, 0x01453A, + 0x00A88E, 0x000C34, 0x000C24, 0x000C21, 0x000C0C, 0x00A88F, 0x00A888, 0x00A88C, + 0x000C5A, 0x000C2A, 0x00A8D3, 0x00A8D0, 0x000C0E, 0x00A8D7, 0x00A8F6, 0x000C0F, + 0x00A8D1, 0x00A8D2, 0x000C22, 0x00A8D6, 0x000C36, 0x000C23, 0x000C79, 0x00A8FD, + 0x000C20, 0x000C31, 0x000C30, 0x000C38, 0x00A8B2, 0x00A8A3, 0x00A8A2, 0x000C35, + 0x000C32, 0x000C33, 0x00A8F2, 0x00A8A0, 0x014561, 0x014560, 0x00A8F7, 0x014562, + 0x00A8A6, 0x00A8A7, 0x014567, 0x014566, 0x014569, 0x014568, 0x01456B, 0x01456A, + 0x000C99, 0x00A8B3, 0x000C9D, 0x000C9F, 0x00A8FB, 0x000C37, 0x014573, 0x014572, + 0x014575, 0x014574, 0x014577, 0x014576, 0x014579, 0x00A902, 0x01457B, 0x01457A, + 0x01457D, 0x01457C, 0x00A90B, 0x01457E, 0x00A901, 0x00A903, 0x014583, 0x014582, + 0x00A91C, 0x00A90A, 0x00A911, 0x00A910, 0x00A918, 0x00A907, 0x00A905, 0x00A91F, + 0x00A917, 0x00A916, 0x00A91D, 0x00A909, 0x014591, 0x00A919, 0x014593, 0x014592, + 0x014595, 0x014594, 0x014597, 0x014596, 0x014599, 0x014598, 0x01459B, 0x00A900, + 0x00A906, 0x01459C, 0x01459F, 0x01459E, 0x00A93A, 0x00A923, 0x00A908, 0x00A938, + 0x00A93C, 0x000C9E, 0x00A935, 0x00A933, 0x00A93E, 0x00A932, 0x00A93B, 0x00A934, + 0x00A937, 0x00A90E, 0x00A921, 0x00A93D, 0x00A90F, 0x00A939, 0x00A90C, 0x00A90D, + 0x00A93F, 0x0145B4, 0x000C25, 0x000C28, 0x0145B9, 0x0145B8, 0x0145BB, 0x0145BA, + 0x000C26, 0x0145BC, 0x00A96C, 0x000C27, 0x000C80, 0x014585, 0x00A964, 0x00A965, + 0x00A96E, 0x00A96D, 0x014490, 0x000C3D, 0x0145B7, 0x000C9C, 0x000C98, 0x000C7A, + 0x000CF1, 0x000CED, 0x000C2B, 0x000CF2, 0x000CEC, 0x000C39, 0x000CEE, 0x000CEF, + 0x000CE9, 0x000CE8, 0x00A920, 0x00A960, 0x00A922, 0x00A962, 0x00A961, 0x00A96F, + 0x00A967, 0x00A963, 0x00A966, 0x00A968, 0x00A969, 0x0145E0, 0x0145E3, 0x0145E2, + 0x0145E5, 0x0145E4, 0x0145E7, 0x0145E6, 0x0145E9, 0x0145E8, 0x0145EB, 0x0145EA, + 0x000D10, 0x000D0B, 0x00A979, 0x00A978, 0x00A96A, 0x000D06, 0x000D07, 0x00A97C, + 0x0145F5, 0x0145F4, 0x00A984, 0x000D05, 0x0145F9, 0x0145F8, 0x0145FB, 0x0145FA, + 0x00A985, 0x0145FC, 0x0145FF, 0x00A988, 0x000D17, 0x00A98A, 0x000D30, 0x000D16, + 0x00A98F, 0x000D18, 0x00A991, 0x00A990, 0x00A993, 0x00A992, 0x000D19, 0x000D15, + 0x00A997, 0x00A996, 0x00A999, 0x00A998, 0x000D31, 0x000D0C, 0x000D2F, 0x00A99C, + 0x00A99F, 0x000D09, 0x00A9A1, 0x00A9A0, 0x000D0A, 0x00A9A2, 0x000D37, 0x000D08, + 0x00A9A7, 0x00A9A6, 0x000D1C, 0x000D1D, 0x000D14, 0x000D33, 0x00A9AD, 0x00A9AC, + 0x000D1E, 0x000D1B, 0x000D12, 0x000D13, 0x000D1F, 0x00A9B2, 0x000D1A, 0x000D32, + 0x01463F, 0x014635, 0x014636, 0x014637, 0x014633, 0x01461C, 0x01460C, 0x01460D, + 0x000C7B, 0x000C7C, 0x01460F, 0x000D6B, 0x000C2C, 0x01461D, 0x01461E, 0x01461F, + 0x000D54, 0x000D55, 0x000C58, 0x000D5C, 0x000D5A, 0x00F933, 0x000D5B, 0x000D56, + 0x000D5F, 0x000D5D, 0x000D59, 0x00A9D0, 0x00A9D3, 0x000D58, 0x000D7C, 0x000D5E, + 0x000D61, 0x00A9D6, 0x000D78, 0x000C2F, 0x000D2C, 0x000D2D, 0x000D7D, 0x000D2E, + 0x000D38, 0x000D29, 0x00A9E1, 0x00A9E0, 0x00A9E3, 0x00A9E2, 0x000D28, 0x00A9E4, + 0x00A9E7, 0x000D35, 0x000D36, 0x00A9E8, 0x00A9EB, 0x00A9EA, 0x00A9ED, 0x00A9EC, + 0x00A9EF, 0x00A9EE, 0x01463B, 0x000D3A, 0x000D34, 0x000D39, 0x000C2E, 0x000C2D, + 0x000DB5, 0x000D89, 0x00A9F9, 0x00A9F8, 0x000D8F, 0x000D87, 0x00A9FD, 0x00A9FC, + 0x00F90A, 0x000D88, 0x000DBA, 0x000DBB, 0x000D86, 0x000DB4, 0x000D8B, 0x000D85, + 0x000D91, 0x000D90, 0x000DB6, 0x000D92, 0x000D95, 0x000D94, 0x00A205, 0x000D96, + 0x000D8A, 0x000D8D, 0x000D9B, 0x000D9A, 0x000D9D, 0x000D9C, 0x000D9F, 0x000D9E, + 0x00A201, 0x000DA9, 0x000DB3, 0x000DA2, 0x000DA5, 0x000DA7, 0x000DA3, 0x000DB7, + 0x000DA4, 0x00A21C, 0x00AAA0, 0x000D8E, 0x000D8C, 0x00AAA2, 0x000DA1, 0x000DAB, + 0x000DA0, 0x00AAA7, 0x000DB1, 0x000DA6, 0x00AAAB, 0x000DB0, 0x000DAF, 0x00AAA6, + 0x000DAA, 0x000DB8, 0x00A200, 0x000DB9, 0x000DBD, 0x00AA6E, 0x00AAA4, 0x00AAAE, + 0x00AAAF, 0x01463C, 0x01463E, 0x000C6E, 0x000C6F, 0x00AAAA, 0x00AAAD, 0x014638, + 0x00A207, 0x014634, 0x014627, 0x00AA69, 0x014621, 0x014639, 0x01463A, 0x014620, + 0x01463D, 0x01462D, 0x00F9E3, 0x00F90C, 0x00ABE1, 0x00AADB, 0x00F90F, 0x00ABE0, + 0x00AA56, 0x00AA6F, 0x00AA6C, 0x00AA6D, 0x00F90D, 0x00AA68, 0x00AA55, 0x00F93D, + 0x000C68, 0x00AA54, 0x000DEC, 0x000C66, 0x00F93E, 0x000C67, 0x000DE7, 0x000DE6, + 0x000DA8, 0x000DE8, 0x000DEF, 0x000DEA, 0x000DED, 0x000DE9, 0x000DAE, 0x000DEE, + 0x000C78, 0x00AA65, 0x00AAA8, 0x00AAA9, 0x00ABE2, 0x000C7D, 0x014622, 0x014623, + 0x00AA64, 0x00AA6B, 0x00ABF0, 0x00AA6A, 0x00F9FD, 0x00F9FC, 0x000C7E, 0x00F935, + 0x00AAAC, 0x00F9FE, 0x00A204, 0x00F936, 0x00ABF2, 0x00ABF9, 0x00F93F, 0x00ABF8, + 0x00A206, 0x00ABF7, 0x00A20E, 0x000E10, 0x00A20F, 0x00A23A, 0x00AABA, 0x00AABB, + 0x014626, 0x000E13, 0x00A208, 0x00A209, 0x00A20A, 0x000E11, 0x00AAB5, 0x00A20D, + 0x000E12, 0x0006A0, 0x00A230, 0x00A221, 0x0006BC, 0x0006BD, 0x0006BE, 0x0006AF, + 0x00A236, 0x00A237, 0x0006A3, 0x0006A1, 0x00A20C, 0x0006D2, 0x000E1A, 0x000E1B, + 0x0006A2, 0x00063B, 0x00AA84, 0x00AA85, 0x0006BA, 0x000E16, 0x00AABC, 0x00AABD, + 0x0006B0, 0x00AA8A, 0x0006B8, 0x0006BF, 0x00F9EF, 0x000E15, 0x0006B6, 0x0006B7, + 0x0006B5, 0x00AA8B, 0x0006B4, 0x0006BB, 0x0006D3, 0x0006B9, 0x00A235, 0x000E17, + 0x00AAA5, 0x00A233, 0x00A232, 0x00A23B, 0x00AAB9, 0x00AAA3, 0x0006AC, 0x00A231, + 0x00A234, 0x000E14, 0x0006C1, 0x00A254, 0x0006C7, 0x00ABF6, 0x0006C0, 0x00A255, + 0x00ABA6, 0x00F9F6, 0x00F9F5, 0x0006C3, 0x00A225, 0x0006C5, 0x00A226, 0x0006C2, + 0x000638, 0x00A25F, 0x00A25B, 0x00A241, 0x00A259, 0x00A224, 0x00A25A, 0x0006CF, + 0x0006A8, 0x0006A5, 0x00ABD2, 0x00F9C8, 0x0006A6, 0x0006AB, 0x00F908, 0x0006A7, + 0x0006AE, 0x0006A9, 0x00F9F4, 0x00F9FF, 0x0006A4, 0x00A223, 0x000639, 0x0006C6, + 0x00A220, 0x0006C4, 0x00A23C, 0x0006CE, 0x00A222, 0x00A25E, 0x00063A, 0x00ABA1, + 0x0006AD, 0x00F9CC, 0x00ABA0, 0x00A258, 0x00A227, 0x00A23D, 0x0006AA, 0x00ABA7, + 0x00A23E, 0x000647, 0x00F9FA, 0x00A239, 0x00A238, 0x00A23F, 0x00AAA1, 0x00A240, + 0x00ABCD, 0x00068A, 0x000646, 0x000645, 0x00AB03, 0x00AB02, 0x00AB06, 0x00062E, + 0x00F943, 0x000672, 0x00A248, 0x00A249, 0x00A24E, 0x000644, 0x00A24C, 0x00A24D, + 0x00068F, 0x00A24F, 0x000649, 0x000671, 0x000648, 0x00067A, 0x00067B, 0x000675, + 0x000620, 0x000621, 0x000622, 0x00062F, 0x000625, 0x00062B, 0x000626, 0x000627, + 0x00F958, 0x000629, 0x000628, 0x00A261, 0x00A260, 0x00F95F, 0x00062D, 0x000624, + 0x00062A, 0x000673, 0x00A22A, 0x00A22B, 0x00068D, 0x00063D, 0x00063C, 0x00062C, + 0x00063E, 0x00A22F, 0x0006B3, 0x00A271, 0x00A272, 0x00A273, 0x00068E, 0x00063F, + 0x00A276, 0x000EC2, 0x000EC3, 0x00F9C6, 0x000EDC, 0x00AB89, 0x000641, 0x000643, + 0x000642, 0x00064A, 0x00A245, 0x00ABA2, 0x00A242, 0x00A243, 0x0006B2, 0x00F9C2, + 0x00F9AB, 0x00F9F0, 0x00F9C1, 0x00A25C, 0x00A247, 0x00F9A4, 0x00A25D, 0x00ABB9, + 0x00ABB8, 0x00F9F9, 0x00ABBF, 0x00ABB7, 0x00F9FB, 0x00F9DE, 0x00F9DD, 0x00F981, + 0x00F980, 0x00F9A6, 0x00F9A5, 0x00F9D4, 0x00F9D5, 0x00F9D8, 0x00F9C5, 0x00F9C0, + 0x00F9D9, 0x00F9DA, 0x00F9C3, 0x00F9CF, 0x00F9C7, 0x00F9C4, 0x00F9DF, 0x00F9A2, + 0x00A246, 0x00F9AF, 0x00F9A1, 0x00ABCC, 0x00068C, 0x00A244, 0x00F9AE, 0x00F9A7, + 0x00F9A8, 0x00ABB3, 0x00F9A3, 0x00F909, 0x00F9AC, 0x00F9CB, 0x00ABBD, 0x00F9BC, + 0x00F9F1, 0x00F9AD, 0x00F9AA, 0x00F9F2, 0x00F9BD, 0x00F9BE, 0x00F9A9, 0x00A24A, + 0x00F9B8, 0x00A24B, 0x00A805, 0x00A995, 0x0145EC, 0x00F9BF, 0x00F9F7, 0x0145EF, + 0x0145ED, 0x000CB0, 0x01458E, 0x00AB96, 0x00A99B, 0x000F31, 0x000F32, 0x000F33, + 0x00A99A, 0x00AB90, 0x000F23, 0x00F9D3, 0x00AB93, 0x000F30, 0x000F20, 0x000F21, + 0x00AB97, 0x0144C9, 0x00AB91, 0x0144CA, 0x000F27, 0x000C87, 0x000C85, 0x0144CE, + 0x000C8B, 0x00AB92, 0x00A801, 0x0144CF, 0x000C86, 0x00A858, 0x000C8F, 0x0144C8, + 0x00A85E, 0x000F29, 0x000F2A, 0x000F2B, 0x0144FD, 0x00A80A, 0x000CB3, 0x00A81C, + 0x00ABAC, 0x000C89, 0x00F9E9, 0x000C8A, 0x00A818, 0x00A803, 0x00A85B, 0x00F9E8, + 0x000F53, 0x00AB99, 0x0144CC, 0x000CB7, 0x000664, 0x00A819, 0x00A81F, 0x00F9D6, + 0x00A81D, 0x000CB6, 0x0144DE, 0x00A800, 0x00AB82, 0x00A871, 0x00066E, 0x000C8E, + 0x00AB84, 0x00AB85, 0x00ABBE, 0x00ABBB, 0x00A854, 0x00ABD3, 0x00A856, 0x00AB83, + 0x00F993, 0x00ABBC, 0x00AB8A, 0x00AB81, 0x00AB80, 0x00AB8B, 0x00F991, 0x00AB8F, + 0x000662, 0x000661, 0x00AB98, 0x000663, 0x00AB88, 0x000660, 0x00AB9C, 0x00AB9D, + 0x00AB86, 0x00AB9F, 0x000669, 0x00ABB2, 0x000668, 0x000665, 0x000667, 0x00066F, + 0x00067D, 0x000674, 0x000F2F, 0x00067C, 0x000676, 0x00AB8E, 0x00ABF3, 0x000677, + 0x000678, 0x000679, 0x00067E, 0x000666, 0x00ABBA, 0x00ABB5, 0x00ABB4, 0x00067F, + 0x000F5A, 0x00A808, 0x00A85A, 0x00A855, 0x00F997, 0x0144C4, 0x0144CB, 0x00A809, + 0x000F89, 0x000F88, 0x000E18, 0x00F98E, 0x00FBAF, 0x00F992, 0x000F8C, 0x000E04, + 0x00FBD5, 0x0144CD, 0x000E06, 0x00FBD6, 0x000E24, 0x000E07, 0x000F56, 0x000F57, + 0x00FBAC, 0x00FBE2, 0x00FBFB, 0x00A859, 0x00FBAD, 0x000E1C, 0x000E2C, 0x00FBDB, + 0x00FBE3, 0x00FBD3, 0x00FB72, 0x00FBE0, 0x00FB49, 0x000E05, 0x00FB70, 0x000F2C, + 0x00FB5C, 0x000F28, 0x00A842, 0x00A841, 0x0006EE, 0x000F2D, 0x000F2E, 0x0006EF, + 0x0006F4, 0x00FBDA, 0x00F99B, 0x000E0B, 0x00FBA8, 0x0006F5, 0x0006F6, 0x0006F7, + 0x0006F8, 0x0006F9, 0x0006FA, 0x0006FB, 0x0006FC, 0x00F995, 0x00A85F, 0x0006FF, + 0x0006CD, 0x000F50, 0x000F52, 0x00FBD4, 0x00F9D7, 0x0006F1, 0x00A85D, 0x0006F0, + 0x0006C8, 0x0006C9, 0x000F5B, 0x00FBAE, 0x000F55, 0x000E1F, 0x00F990, 0x000F54, + 0x000F51, 0x000F41, 0x0006D0, 0x0006D1, 0x000E19, 0x0006D5, 0x0011CD, 0x00FB90, + 0x000EC0, 0x000EC1, 0x0006CB, 0x0011C9, 0x0011CF, 0x0006F2, 0x00FB97, 0x0006CA, + 0x000CE0, 0x000CE1, 0x000EC4, 0x000C61, 0x000C60, 0x000E51, 0x000CE6, 0x000CE7, + 0x000C6A, 0x000C6B, 0x000CEA, 0x000CEB, 0x0006CC, 0x000C69, 0x000C6C, 0x000C6D, + 0x00F923, 0x000E40, 0x0011FF, 0x0011F9, 0x0011F4, 0x00FB17, 0x0006F3, 0x00FB14, + 0x000E1D, 0x000E45, 0x0011FA, 0x000E53, 0x0011FE, 0x0011FB, 0x000E1E, 0x00F9B0, + 0x00FAC7, 0x00F930, 0x00F937, 0x00FD82, 0x00F9B5, 0x00F9B6, 0x00F9B7, 0x00F93A, + 0x00F9B9, 0x00F9BA, 0x00F939, 0x00F938, 0x00FB9B, 0x00F93C, 0x0011F2, 0x00FB60, + 0x0011C8, 0x00FB64, 0x00FB68, 0x00FAA1, 0x00FB65, 0x00FB66, 0x0011C2, 0x00FB48, + 0x00FB6A, 0x00FB69, 0x00FB6B, 0x00FB4C, 0x00FB4D, 0x00FB4E, 0x00FB4F, 0x00FB6C, + 0x0011A4, 0x0011AE, 0x0011A2, 0x00FB6E, 0x0011A8, 0x0011A5, 0x0011A6, 0x0011A7, + 0x00FB6F, 0x0011A9, 0x0011AA, 0x0011AB, 0x0011AC, 0x0011AF, 0x00FB6D, 0x001114, + 0x0011DC, 0x00FD97, 0x00FB63, 0x00FB7C, 0x00FA5D, 0x0011AD, 0x00108E, 0x00FB61, + 0x0011B8, 0x0011B9, 0x00FB62, 0x00FDB1, 0x001116, 0x0011BD, 0x0011BE, 0x0011BF, + 0x00FB71, 0x00FB7D, 0x00FB7F, 0x00FB74, 0x00FB75, 0x00FB76, 0x0011C3, 0x00FB78, + 0x00FB79, 0x00FB7A, 0x00A5E0, 0x00FB7E, 0x00A840, 0x00A84F, 0x00FB7B, 0x00A843, + 0x00A846, 0x00A845, 0x00A849, 0x00A5C9, 0x00A5C8, 0x00A5CE, 0x00A848, 0x00A847, + 0x00A84E, 0x00A84A, 0x0011D3, 0x0011D2, 0x00A84C, 0x00A873, 0x00A872, 0x00A84D, + 0x0014B2, 0x0011DD, 0x00A85C, 0x00A870, 0x0014B3, 0x0011DF, 0x00FA92, 0x00FA82, + 0x00A5FE, 0x0011F3, 0x00A5E3, 0x00A5E1, 0x0011DE, 0x00148C, 0x0011D8, 0x00A5F8, + 0x00A5E2, 0x0011D1, 0x0011D9, 0x0011D5, 0x0011D4, 0x00A86B, 0x0011D6, 0x0011D7, + 0x0011DB, 0x0011DA, 0x00A5F9, 0x00A5F1, 0x00A5F2, 0x00A5F3, 0x00A5F0, 0x00A5F5, + 0x00A5F4, 0x00A5FF, 0x0011A3, 0x00A5F6, 0x00A5F7, 0x00A5FB, 0x0011A1, 0x00FB22, + 0x00118D, 0x00A5FA, 0x00AB21, 0x00A5A0, 0x00A986, 0x00A98E, 0x00A9A5, 0x00A987, + 0x00A989, 0x00A5C5, 0x00AB38, 0x00AB25, 0x00FA91, 0x00A98B, 0x00FA9F, 0x00AB0D, + 0x00AB0C, 0x00A5DE, 0x00A5C3, 0x00A5DF, 0x00AB36, 0x00AB37, 0x00A5D8, 0x00AB39, + 0x00A5C2, 0x00AB3F, 0x00A99D, 0x00AB3A, 0x00AB3D, 0x00A9B0, 0x0011BA, 0x00AB34, + 0x00AB3E, 0x00A5D9, 0x00A5A2, 0x00A5CB, 0x00AB33, 0x00A5A3, 0x00A5A7, 0x00A5CF, + 0x00A5BC, 0x00A5C4, 0x00A5CD, 0x00A9A3, 0x00AB31, 0x00A5CC, 0x00A98D, 0x00A5A1, + 0x00AB30, 0x00A9B1, 0x00AB35, 0x00A5B1, 0x00AB32, 0x00A5BD, 0x00A5B4, 0x00A5BE, + 0x00A5B0, 0x00AB3B, 0x00A5B8, 0x00A5B9, 0x00A5BA, 0x00A5BB, 0x00A5B6, 0x00A5A6, + 0x00A5BF, 0x00A5B7, 0x00A9A8, 0x0011C0, 0x00FA81, 0x00AB52, 0x00FA93, 0x00FB40, + 0x00AB51, 0x00FB44, 0x00A98C, 0x00FBA4, 0x00FA87, 0x00AB50, 0x00FB46, 0x00FB4A, + 0x00FB5D, 0x00FB67, 0x00FB93, 0x00A5D5, 0x00FB73, 0x00FBA6, 0x00FAA5, 0x00FAAB, + 0x00FB5E, 0x00FB91, 0x00FB92, 0x00AB53, 0x00FBA9, 0x00FBAA, 0x00A5DB, 0x00A9D1, + 0x00A5D4, 0x00A5DC, 0x00A9AA, 0x00FA97, 0x00A9A4, 0x00FBA5, 0x00FB77, 0x00FBA2, + 0x00FB21, 0x00FB20, 0x0011F0, 0x00FBA0, 0x00FB25, 0x00FB26, 0x00FB27, 0x00FB2A, + 0x00FB28, 0x00A9AB, 0x00FBA1, 0x00FB24, 0x00FB2F, 0x00FB2B, 0x00AA59, 0x0144EE, + 0x001180, 0x001183, 0x001182, 0x00FB2C, 0x001181, 0x00119D, 0x0011B2, 0x00A9A9, + 0x001185, 0x00AB57, 0x001187, 0x00FBA7, 0x00FB2D, 0x00FB2E, 0x00119E, 0x00119F, + 0x001190, 0x001194, 0x001192, 0x001191, 0x00FB4B, 0x00FB47, 0x001196, 0x001197, + 0x001199, 0x00119B, 0x001198, 0x00118C, 0x00119C, 0x001195, 0x00A994, 0x00FB52, + 0x00FB51, 0x00118B, 0x00FB53, 0x00FB43, 0x00FB50, 0x00148D, 0x00FB57, 0x001186, + 0x00FB54, 0x00A58D, 0x00FB56, 0x00AB22, 0x00AB28, 0x001184, 0x00AB24, 0x001188, + 0x00AB26, 0x0011B0, 0x00AB20, 0x00AB2B, 0x00AB2A, 0x00AB29, 0x00AB2C, 0x00AB2D, + 0x00AB2E, 0x00FB58, 0x0011B4, 0x001189, 0x00FB59, 0x0011D0, 0x00118A, 0x00FB5A, + 0x00118F, 0x00FB5B, 0x0011BC, 0x00FB55, 0x00FB41, 0x00FBAB, 0x001130, 0x00FB5F, + 0x0011A0, 0x00AB3C, 0x00A58C, 0x00AA40, 0x00AA41, 0x00AA42, 0x00AA4B, 0x00AA45, + 0x00F911, 0x00FB82, 0x00F917, 0x00F910, 0x00FB88, 0x00FB8E, 0x00AA44, 0x00F952, + 0x00FB81, 0x00AA47, 0x00118E, 0x00F916, 0x00A5B2, 0x00FB8F, 0x00FB80, 0x00FB85, + 0x00FB86, 0x00FB87, 0x00AA58, 0x00FB9C, 0x00FB95, 0x00F912, 0x00F913, 0x00AA48, + 0x00AA49, 0x00AA4A, 0x00AA66, 0x00FB9D, 0x00FB9E, 0x00FB9F, 0x00A5B3, 0x00F928, + 0x00AA74, 0x0011B1, 0x00FBB1, 0x0011B5, 0x00FBA3, 0x00F92E, 0x0011B7, 0x001112, + 0x00F941, 0x0011BB, 0x00F92F, 0x00F91A, 0x00F919, 0x00AA72, 0x00F91B, 0x00F942, + 0x00F946, 0x00F940, 0x00F951, 0x00AA71, 0x00F94B, 0x00F947, 0x00F915, 0x00FAD7, + 0x00AA73, 0x001193, 0x00AB01, 0x00F918, 0x00AB23, 0x00F914, 0x00AB16, 0x00FC41, + 0x00F953, 0x00FC43, 0x00FC42, 0x00F91D, 0x00FC44, 0x00FC47, 0x00F91C, 0x00FC49, + 0x00FC48, 0x00FC4B, 0x00FC4A, 0x00FC4D, 0x00FC4C, 0x00FC4F, 0x00F91F, 0x00F900, + 0x00AB12, 0x00F902, 0x00F903, 0x00AB11, 0x00F901, 0x00AB13, 0x00F907, 0x00F906, + 0x00F978, 0x00F90E, 0x00A628, 0x00A629, 0x00FC5C, 0x00F91E, 0x00F95E, 0x00FC61, + 0x00FC60, 0x00FC63, 0x00FC62, 0x00FC65, 0x00FC64, 0x00FC67, 0x00A62B, 0x00FC69, + 0x00FC68, 0x00FC6B, 0x00FC6A, 0x00FC6D, 0x00FC6C, 0x00FC6F, 0x00FC6E, 0x00FC71, + 0x00FC70, 0x00FC73, 0x00FC72, 0x00FC75, 0x00FC74, 0x00FC77, 0x00FC76, 0x00FC79, + 0x00FC78, 0x00FC7B, 0x00FC7A, 0x00FC7D, 0x00FC7C, 0x00FC7F, 0x00FC7E, 0x00A912, + 0x00A640, 0x00A64F, 0x00A914, 0x00A91B, 0x00A65E, 0x00A643, 0x00A915, 0x00A65C, + 0x00A65A, 0x00AB15, 0x00A658, 0x00A65F, 0x00A651, 0x00A652, 0x00A65D, 0x00A650, + 0x00A655, 0x00A657, 0x00A659, 0x00A64B, 0x00A642, 0x00A65B, 0x00A64A, 0x00A654, + 0x00A656, 0x00A645, 0x00A644, 0x00A664, 0x00A64E, 0x00A64C, 0x00A66B, 0x00A64D, + 0x00A646, 0x00A647, 0x00F905, 0x00F904, 0x00A649, 0x00ABCE, 0x00AB04, 0x00A648, + 0x00ABC8, 0x00ABCF, 0x00AB0E, 0x00A930, 0x00ABF4, 0x00F90B, 0x00ABF5, 0x00A895, + 0x00AB14, 0x00AB05, 0x00F932, 0x00AB0B, 0x00A91A, 0x00AB0A, 0x00F931, 0x00A940, + 0x00AB09, 0x00A973, 0x00FB96, 0x00ABC1, 0x00120D, 0x00120C, 0x00ABA4, 0x00ABA5, + 0x00F9E1, 0x00F9E2, 0x00F9EE, 0x00F9ED, 0x00ABAE, 0x00F9CD, 0x00AB8C, 0x00AB8D, + 0x00F9C9, 0x00F9CA, 0x00ABC4, 0x00F9CE, 0x00ABC2, 0x014419, 0x00F9EB, 0x00ABC5, + 0x00ABC6, 0x00ABC9, 0x01443F, 0x00ABC0, 0x00ABCA, 0x00ABCB, 0x00ABC7, 0x00ABAD, + 0x00AB9E, 0x00F9EA, 0x00F9DB, 0x00ABAA, 0x00F9EC, 0x00AA46, 0x00ABA8, 0x00ABF1, + 0x00ABA3, 0x001230, 0x001233, 0x014407, 0x001235, 0x001234, 0x001237, 0x001236, + 0x00F9E5, 0x001238, 0x00123B, 0x00F9E7, 0x00123D, 0x00ABB1, 0x00123F, 0x00123E, + 0x001241, 0x001240, 0x001243, 0x001242, 0x001245, 0x00ABB0, 0x001247, 0x001246, + 0x00ABB6, 0x00A89E, 0x00F9F3, 0x00124A, 0x00F9F8, 0x00ABD9, 0x00ABD4, 0x00F982, + 0x00F985, 0x00F987, 0x00F983, 0x00A9D9, 0x00A9D8, 0x00A943, 0x00F986, 0x00F984, + 0x00ABDA, 0x00ABDB, 0x00F98B, 0x00ABD5, 0x00ABD6, 0x00125C, 0x00A9D4, 0x00A9D5, + 0x001261, 0x00F98A, 0x001263, 0x001262, 0x001265, 0x00F99C, 0x00F989, 0x001266, + 0x001269, 0x00A945, 0x00126B, 0x00126A, 0x00F999, 0x00F998, 0x00F99D, 0x00F9A0, + 0x00ABD7, 0x00ABC3, 0x00ABDC, 0x00F98D, 0x00ABDE, 0x00ABDD, 0x00A9E9, 0x00F988, + 0x00F98F, 0x00A9FE, 0x00A9F2, 0x00A9F1, 0x00A9F3, 0x00127C, 0x00A9F6, 0x00ABDF, + 0x00A9F0, 0x00A9F7, 0x00A942, 0x00ABD0, 0x00ABD8, 0x00A9FB, 0x00ABD1, 0x00A9F5, + 0x00A9FA, 0x00A9F4, 0x00ABAB, 0x00ABA9, 0x00128D, 0x00128C, 0x00AB95, 0x00A9AE, + 0x00ABAF, 0x00A833, 0x00F9D2, 0x00A913, 0x00A9AF, 0x00F9D0, 0x00AB94, 0x00AB9B, + 0x00F9D1, 0x00F9DC, 0x00F9E0, 0x00AB87, 0x00F9E4, 0x00F9E6, 0x01E816, 0x01E815, + 0x0012A1, 0x0012A0, 0x0012A3, 0x0012A2, 0x0012A5, 0x0012A4, 0x0012A7, 0x0012A6, + 0x0012A9, 0x0012A8, 0x0012AB, 0x0012AA, 0x0012AD, 0x0012AC, 0x0012AF, 0x0012AE, + 0x01E811, 0x0012B0, 0x0012B3, 0x0012B2, 0x0012B5, 0x0012B4, 0x01E812, 0x01E810, + 0x0012B9, 0x0012B8, 0x0012BB, 0x0012BA, 0x0012BD, 0x0012BC, 0x01E81D, 0x0012BE, + 0x01E81F, 0x0012C0, 0x0012C3, 0x0012C2, 0x0012C5, 0x0012C4, 0x01E819, 0x01E818, + 0x0012C9, 0x01E81A, 0x0012CB, 0x0012CA, 0x0012CD, 0x0012CC, 0x01E814, 0x0012CE, + 0x0012D1, 0x0012D0, 0x0012D3, 0x0012D2, 0x0012D5, 0x0012D4, 0x01E81B, 0x0012D6, + 0x0012D9, 0x0012D8, 0x0012DB, 0x0012DA, 0x0012DD, 0x0012DC, 0x0012DF, 0x0012DE, + 0x01E82D, 0x01E803, 0x0012E3, 0x0012E2, 0x01E802, 0x01E800, 0x01E828, 0x01E801, + 0x01E82E, 0x01E82F, 0x01E804, 0x01E805, 0x01E806, 0x01E809, 0x01E80A, 0x01E80B, + 0x0012F1, 0x0012F0, 0x0012F3, 0x0012F2, 0x01E808, 0x01E80F, 0x0012F7, 0x0012F6, + 0x01E81E, 0x01E81C, 0x0012FB, 0x0012FA, 0x0012FD, 0x0012FC, 0x01E82A, 0x01E821, + 0x01E822, 0x01E851, 0x01E850, 0x01E833, 0x01E826, 0x01E827, 0x01E854, 0x01E82B, + 0x01E820, 0x01E823, 0x01E80C, 0x01E80D, 0x01E80E, 0x01E825, 0x01E841, 0x01E83D, + 0x01E83C, 0x01E85B, 0x01E853, 0x01E843, 0x01E835, 0x01E836, 0x01E839, 0x01E83A, + 0x01E852, 0x01E829, 0x01E838, 0x01E83E, 0x01E83F, 0x01E824, 0x01E860, 0x01E861, + 0x01E883, 0x00A931, 0x01E863, 0x01E865, 0x01E866, 0x00A9D7, 0x00A904, 0x00A9D2, + 0x01E84C, 0x00A941, 0x00A936, 0x01E84D, 0x00A946, 0x00F996, 0x01E891, 0x01E874, + 0x01E893, 0x01E892, 0x01E895, 0x01E894, 0x01E876, 0x01E896, 0x01E899, 0x01E87A, + 0x01E89B, 0x01E89A, 0x01E89D, 0x01E89C, 0x00A925, 0x01E89E, 0x01E8A1, 0x01E8A0, + 0x01E872, 0x01E8A2, 0x01E8A5, 0x01E8A4, 0x01E8A7, 0x01E8A6, 0x00A924, 0x01E8A8, + 0x01E8AB, 0x01E87B, 0x00F99A, 0x01E82C, 0x00F99F, 0x00F99E, 0x00F994, 0x00FE80, + 0x01E870, 0x01E877, 0x00FEB9, 0x00FEB8, 0x00FE8F, 0x00FE86, 0x00FE87, 0x00FE88, + 0x00FE89, 0x00FE8A, 0x00FE8B, 0x00FEBB, 0x00FE8D, 0x00FE8E, 0x01E8C1, 0x01E8C0, + 0x01E842, 0x01E8C2, 0x01E840, 0x01E8C4, 0x01E8C7, 0x01E847, 0x01E8C9, 0x01E8C8, + 0x01E8CB, 0x01E84B, 0x01E845, 0x00FE9D, 0x01E8CF, 0x01E846, 0x00FEB5, 0x01E849, + 0x01E867, 0x00FEBA, 0x01E85E, 0x01E855, 0x01E856, 0x01E857, 0x01E858, 0x01E859, + 0x01E85A, 0x00FE79, 0x01E85C, 0x01E85D, 0x01E84E, 0x01E85F, 0x00FEBF, 0x00FEB0, + 0x00FED1, 0x00FED2, 0x00FEB3, 0x00FEB4, 0x00FEB1, 0x00FED6, 0x00FED7, 0x00FEA2, + 0x00FEBC, 0x01E871, 0x00148E, 0x00FE78, 0x01E844, 0x00FEB7, 0x00FEB6, 0x00FEA5, + 0x01E848, 0x01E84F, 0x00FE72, 0x00FE70, 0x01E873, 0x00FE77, 0x00FEA7, 0x00FEAB, + 0x00FE7B, 0x00FE7A, 0x00FEAC, 0x01E84A, 0x00FE74, 0x00FE76, 0x01E901, 0x01E900, + 0x01E903, 0x01E902, 0x01E905, 0x01E904, 0x01E907, 0x01E906, 0x01E909, 0x01E908, + 0x01E90B, 0x01E90A, 0x01E90D, 0x01E90C, 0x01E90F, 0x01E90E, 0x01E911, 0x01E910, + 0x01E913, 0x01E912, 0x00FEA1, 0x00FEA0, 0x00FED0, 0x01E916, 0x01E919, 0x01E918, + 0x01E91B, 0x01E91A, 0x00FE71, 0x01E91C, 0x01E91F, 0x01E91E, 0x01E921, 0x01E920, + 0x01E923, 0x01E922, 0x00FEA3, 0x00FEA4, 0x00FE73, 0x01E926, 0x01E929, 0x01E928, + 0x01E92B, 0x01E92A, 0x00FEBD, 0x01E92C, 0x01E92F, 0x00FEBE, 0x01E931, 0x01E930, + 0x01E933, 0x01E932, 0x00FEB2, 0x01E934, 0x01E937, 0x01E936, 0x01E939, 0x01E938, + 0x01E93B, 0x01E93A, 0x01E93D, 0x01E93C, 0x01E93F, 0x01E93E, 0x01E941, 0x01E940, + 0x01E943, 0x01E942, 0x00FA90, 0x01E864, 0x00FA83, 0x00FAA2, 0x01E86E, 0x00FA80, + 0x01E868, 0x01E869, 0x00FAA0, 0x01E86D, 0x01E86C, 0x00FA95, 0x01E951, 0x01E950, + 0x01E953, 0x01E952, 0x01E955, 0x01E954, 0x01E957, 0x01E956, 0x01E959, 0x01E958, + 0x00FA9B, 0x00FC46, 0x00FE83, 0x00FE84, 0x00148F, 0x00FA86, 0x00FAA7, 0x00FE82, + 0x001504, 0x001505, 0x01E87C, 0x00FA8F, 0x00FE81, 0x01E862, 0x00151E, 0x01E87D, + 0x00FE85, 0x00FE8C, 0x00FE9C, 0x00151F, 0x01E86A, 0x01E86B, 0x00FA99, 0x01E878, + 0x001509, 0x001518, 0x01E875, 0x00151A, 0x01E86F, 0x01E87E, 0x001517, 0x00FE9A, + 0x001519, 0x00151C, 0x01E879, 0x00FA85, 0x01E87F, 0x00FE95, 0x00151B, 0x00FE90, + 0x00FE9B, 0x00FE92, 0x00FE93, 0x0014AE, 0x0014AF, 0x00FE94, 0x00FE97, 0x001506, + 0x00150A, 0x00150B, 0x00FE91, 0x00FE96, 0x00150E, 0x0014A8, 0x001508, 0x00150F, + 0x001488, 0x001461, 0x0011CB, 0x00FAB3, 0x001117, 0x0011C5, 0x00FAD1, 0x0011E0, + 0x00FAC3, 0x00FAD2, 0x00FAD3, 0x00FE7C, 0x00147C, 0x0014AD, 0x00146C, 0x00FE7D, + 0x00FE9E, 0x001440, 0x001443, 0x001442, 0x00FE7E, 0x001441, 0x001447, 0x001444, + 0x00FE99, 0x00FE7F, 0x00FE9F, 0x00FE98, 0x00144A, 0x001445, 0x001446, 0x00144B, + 0x001470, 0x001479, 0x001478, 0x00147D, 0x001462, 0x00144D, 0x00144E, 0x00147F, + 0x001449, 0x00FF4D, 0x00FF4F, 0x00FF4C, 0x001448, 0x00145C, 0x00144F, 0x00FF11, + 0x00FF10, 0x00FF13, 0x00FF12, 0x00FF15, 0x00FF14, 0x00FF17, 0x00FF16, 0x00FF19, + 0x00147E, 0x001463, 0x00147A, 0x00147B, 0x00FF7D, 0x00FF7E, 0x00FF7F, 0x00FF78, + 0x00FF7B, 0x00FF6E, 0x00FF6D, 0x00FF6C, 0x00FF66, 0x00FF67, 0x00FF79, 0x00FF6B, + 0x00FF68, 0x00FF7C, 0x00FF6A, 0x00FF6F, 0x00FF69, 0x00FF74, 0x001474, 0x00FF31, + 0x00FF30, 0x00FF33, 0x00FF32, 0x00FF35, 0x00FF34, 0x00FF71, 0x00FF73, 0x00FF39, + 0x00FF38, 0x00FF72, 0x00FF3A, 0x00FF7A, 0x00FF75, 0x00FF76, 0x00FF77, 0x0011C7, + 0x00FF42, 0x0014A0, 0x0014A3, 0x00F96C, 0x00F975, 0x0014A1, 0x0014A4, 0x00FF41, + 0x00FF43, 0x00F94A, 0x00F949, 0x0014AB, 0x0014A5, 0x00F962, 0x00F94F, 0x0014A7, + 0x00FF47, 0x00FF46, 0x00F94D, 0x00F977, 0x00F94E, 0x0011CE, 0x00F973, 0x00F971, + 0x00F948, 0x00F976, 0x00F97B, 0x00F974, 0x00F97A, 0x0011F5, 0x00F97E, 0x00FAB7, + 0x00FF45, 0x00F968, 0x00FA9A, 0x00FA94, 0x0145A8, 0x00FB83, 0x00FF44, 0x00F94C, + 0x0014A2, 0x0145A4, 0x0014BC, 0x0145AE, 0x0145AB, 0x0145A9, 0x0145A2, 0x0145A3, + 0x0145AF, 0x0145AD, 0x00FF4E, 0x0145AA, 0x00FF48, 0x00F96D, 0x00F972, 0x00FF49, + 0x00F96E, 0x00FF4B, 0x00FF4A, 0x00F970, 0x0145AC, 0x00F96F, 0x0145BD, 0x00FF81, + 0x00FF80, 0x00FF83, 0x00FF82, 0x00FF85, 0x00FAA6, 0x00FF87, 0x00FF86, 0x00FF89, + 0x0145D0, 0x0145DF, 0x00FF8A, 0x0145D6, 0x00FF8C, 0x0145C1, 0x0145DC, 0x00FF91, + 0x0145D4, 0x00FF93, 0x00FF92, 0x0145DD, 0x00FF94, 0x00FF97, 0x0145D3, 0x00FF99, + 0x00FF98, 0x00FF9B, 0x00FF9A, 0x00FF9D, 0x00FF9C, 0x0014A9, 0x0145D2, 0x00FEA9, + 0x0145DA, 0x0145D5, 0x0145D7, 0x0145D1, 0x0145C3, 0x00FEAF, 0x00FEA6, 0x0014F4, + 0x00FEA8, 0x0014AA, 0x0014FB, 0x0145C2, 0x01E813, 0x0145C6, 0x00FEAA, 0x00FFB1, + 0x0145C0, 0x00FFB3, 0x00FFB2, 0x0145C7, 0x00FEAD, 0x00FA22, 0x0145FD, 0x001093, + 0x00FA21, 0x00FEAE, 0x001092, 0x001081, 0x0145D8, 0x0145D9, 0x0145DE, 0x0145FE, + 0x00FED8, 0x00FFC3, 0x00FFC2, 0x00FFC5, 0x00FFC4, 0x00FFC7, 0x00FFC6, 0x0010B1, + 0x001110, 0x00FFCB, 0x00FFCA, 0x00FFCD, 0x00FFCC, 0x00FFCF, 0x00FFCE, 0x00FED4, + 0x00FA41, 0x00FA42, 0x0010B2, 0x0010B3, 0x00111C, 0x00FED3, 0x00110C, 0x001113, + 0x0015EE, 0x00FA50, 0x001111, 0x00FA84, 0x00FFDC, 0x00FA96, 0x00FEDB, 0x0015EF, + 0x00F961, 0x00F960, 0x00F963, 0x00F966, 0x001102, 0x00FA40, 0x00F967, 0x001489, + 0x00F969, 0x00F96A, 0x00F96B, 0x001103, 0x0015EC, 0x00148A, 0x00F965, 0x00FA20, + 0x001090, 0x001091, 0x00148B, 0x00FED5, 0x00F97D, 0x00FA9D, 0x00FA27, 0x00FEDA, + 0x00FEDF, 0x00F979, 0x00FED9, 0x00F97F, 0x0015E6, 0x00FEDE, 0x00FEDD, 0x0015CE, + 0x0015EA, 0x010003, 0x010034, 0x0015E4, 0x010007, 0x0015E9, 0x010035, 0x010018, + 0x010039, 0x01003A, 0x01003F, 0x01001C, 0x01001D, 0x01001E, 0x01001F, 0x010011, + 0x010010, 0x0015E1, 0x010012, 0x010016, 0x010014, 0x0015E5, 0x0015E2, 0x01001B, + 0x0015ED, 0x0015E0, 0x01001A, 0x010019, 0x010015, 0x010017, 0x0015E7, 0x010031, + 0x0015F0, 0x0015F1, 0x0015F8, 0x0015EB, 0x0015F4, 0x010030, 0x010037, 0x0015F7, + 0x0015E8, 0x0015F9, 0x0015FA, 0x0015FB, 0x0015FC, 0x010036, 0x0015FE, 0x0015FF, + 0x0015C0, 0x0015C1, 0x0015BF, 0x0015C3, 0x0015B9, 0x0015B4, 0x00158C, 0x0015C5, + 0x0015C2, 0x001513, 0x0015BB, 0x0015BA, 0x010032, 0x0015C7, 0x0015C4, 0x010041, + 0x0015DE, 0x0015D0, 0x0015B6, 0x0015DF, 0x0015D7, 0x0015DD, 0x0015B5, 0x0015D4, + 0x0015D9, 0x0015CB, 0x0015DB, 0x0015D8, 0x0015DC, 0x0015C6, 0x0015DA, 0x010051, + 0x0015CF, 0x010059, 0x010052, 0x0015B7, 0x010050, 0x010055, 0x0015B0, 0x010056, + 0x01005B, 0x010043, 0x0015CA, 0x0011FC, 0x0015C8, 0x0015C9, 0x010042, 0x010020, + 0x0015B3, 0x010022, 0x010023, 0x010026, 0x001501, 0x010054, 0x010021, 0x010029, + 0x01002B, 0x01005A, 0x010058, 0x0015B2, 0x010025, 0x010024, 0x01002F, 0x0011F6, + 0x010040, 0x0015F3, 0x0011C1, 0x0011F8, 0x01004B, 0x001515, 0x0015F2, 0x010038, + 0x0015A8, 0x010028, 0x0015F6, 0x0015FD, 0x01003D, 0x0011C6, 0x0015AE, 0x0015AF, + 0x001512, 0x010081, 0x0015E3, 0x010080, 0x010087, 0x001511, 0x010082, 0x01008B, + 0x010088, 0x01008F, 0x0011CC, 0x010085, 0x010084, 0x0015F5, 0x010086, 0x0011F7, + 0x001500, 0x010093, 0x001502, 0x001503, 0x0015CC, 0x0015A2, 0x001484, 0x001507, + 0x0015A0, 0x0011F1, 0x0015CD, 0x0015A3, 0x0011CA, 0x0015AB, 0x0015A6, 0x0015A7, + 0x001510, 0x0015A9, 0x0100A0, 0x001516, 0x0015AA, 0x0100A7, 0x0011C4, 0x001514, + 0x0015BC, 0x0015BE, 0x00151D, 0x0015AD, 0x0015B8, 0x0015BD, 0x0015A4, 0x0015A5, + 0x0100B0, 0x0100B1, 0x0100B2, 0x0100B7, 0x0100B4, 0x0100B5, 0x0100B6, 0x0100BB, + 0x0100B8, 0x001641, 0x001602, 0x001603, 0x001605, 0x0100BF, 0x00168E, 0x001606, + 0x0100C0, 0x0100C3, 0x001610, 0x010045, 0x010047, 0x0100C7, 0x010046, 0x010048, + 0x010049, 0x01004A, 0x01004D, 0x01005C, 0x010044, 0x00168D, 0x01004C, 0x0100D1, + 0x0100D0, 0x001613, 0x0100D2, 0x0100D5, 0x0100D4, 0x0100D7, 0x0100D6, 0x0100D9, + 0x0100D8, 0x0100DB, 0x0100DA, 0x0100DD, 0x01005D, 0x0100DF, 0x0100DE, 0x001633, + 0x0100E0, 0x0100E3, 0x0016B0, 0x001631, 0x001632, 0x0100E7, 0x0016B7, 0x0016B6, + 0x0016BE, 0x0016B9, 0x0016BA, 0x0016BB, 0x0016B5, 0x001618, 0x0016BD, 0x0100F1, + 0x0100F0, 0x00161D, 0x0100F2, 0x0100F5, 0x0100F4, 0x0100F7, 0x0100F6, 0x0100F9, + 0x0100F8, 0x00161A, 0x0100FA, 0x001643, 0x00165C, 0x001646, 0x00161F, 0x001642, + 0x01010B, 0x001611, 0x001612, 0x01011C, 0x01011D, 0x001615, 0x010131, 0x001617, + 0x010118, 0x001619, 0x01011F, 0x00161B, 0x001614, 0x001616, 0x01011E, 0x010111, + 0x00163A, 0x010113, 0x010112, 0x010110, 0x00161C, 0x010117, 0x010116, 0x01011B, + 0x010109, 0x01010A, 0x01010D, 0x010114, 0x010115, 0x01011A, 0x010119, 0x010108, + 0x010120, 0x01010C, 0x010122, 0x010121, 0x01010F, 0x01010E, 0x010107, 0x010129, + 0x00163B, 0x01012B, 0x01012A, 0x010124, 0x010125, 0x010126, 0x010127, 0x00161E, + 0x0016B1, 0x00168A, 0x001683, 0x001682, 0x001681, 0x001686, 0x001684, 0x010132, + 0x010128, 0x001687, 0x0016B4, 0x01012D, 0x01012C, 0x01012F, 0x01012E, 0x01015D, + 0x010140, 0x010141, 0x010142, 0x010147, 0x01015C, 0x00168C, 0x01015E, 0x01E915, + 0x001640, 0x001645, 0x01015F, 0x001647, 0x00160C, 0x00164E, 0x001644, 0x010151, + 0x010150, 0x010157, 0x010152, 0x010155, 0x010154, 0x010153, 0x010156, 0x010159, + 0x001672, 0x001677, 0x01015A, 0x010158, 0x001676, 0x01015B, 0x0016B3, 0x010130, + 0x001648, 0x010163, 0x010143, 0x0016B2, 0x001634, 0x001660, 0x00163E, 0x001685, + 0x001638, 0x001639, 0x001689, 0x00168B, 0x00163D, 0x00163F, 0x0016EF, 0x010172, + 0x010123, 0x010170, 0x010133, 0x010176, 0x010171, 0x010174, 0x010175, 0x0016C3, + 0x0016C2, 0x010178, 0x0016C0, 0x001699, 0x0016C6, 0x0016C1, 0x010177, 0x0016C7, + 0x0016C5, 0x001691, 0x0016C4, 0x001693, 0x001692, 0x001697, 0x001694, 0x01018B, + 0x001698, 0x0016CB, 0x01018A, 0x00169A, 0x0016CA, 0x0016DC, 0x001696, 0x001695, + 0x0016E1, 0x0016E0, 0x0016E3, 0x0016E2, 0x0016E7, 0x0016CD, 0x001673, 0x0016F4, + 0x0016C9, 0x0016CE, 0x0012C8, 0x001671, 0x0016CC, 0x001485, 0x001674, 0x00164C, + 0x0016E5, 0x0016F2, 0x0016F3, 0x0016E4, 0x0016E6, 0x0016F1, 0x0016F7, 0x0016F5, + 0x0016E8, 0x0016F0, 0x0016EA, 0x0016E9, 0x0016F8, 0x00164A, 0x0016EE, 0x0016F6, + 0x001701, 0x001700, 0x001703, 0x001702, 0x001705, 0x001704, 0x001707, 0x001706, + 0x001709, 0x001708, 0x00170B, 0x00170A, 0x001486, 0x00170C, 0x00170F, 0x00170E, + 0x001487, 0x001710, 0x001711, 0x001480, 0x001481, 0x001482, 0x001483, 0x00149C, + 0x00149D, 0x00125D, 0x00149E, 0x00149F, 0x001498, 0x00167D, 0x00167E, 0x01E92D, + 0x001721, 0x001720, 0x001723, 0x001722, 0x001725, 0x001661, 0x001727, 0x001726, + 0x001729, 0x001769, 0x00172B, 0x00172A, 0x00176C, 0x00172C, 0x00176E, 0x001667, + 0x001731, 0x001730, 0x001499, 0x00167F, 0x001665, 0x001664, 0x00149A, 0x00149B, + 0x001494, 0x001669, 0x00166B, 0x001495, 0x00166C, 0x001496, 0x001497, 0x00166F, + 0x001741, 0x000F5D, 0x001743, 0x001742, 0x001745, 0x001747, 0x00164F, 0x001744, + 0x001649, 0x001740, 0x00174B, 0x00164B, 0x00166A, 0x00174C, 0x001746, 0x00174A, + 0x001751, 0x001750, 0x001765, 0x01031C, 0x001766, 0x00164D, 0x010304, 0x01030A, + 0x001748, 0x001749, 0x00176A, 0x00176B, 0x001768, 0x00174D, 0x00174E, 0x00174F, + 0x000F5C, 0x001670, 0x001678, 0x0012CF, 0x01030F, 0x010307, 0x01031E, 0x010309, + 0x010318, 0x01031A, 0x00167C, 0x00167A, 0x001763, 0x010308, 0x010339, 0x001679, + 0x001760, 0x001668, 0x001770, 0x001762, 0x010333, 0x01033F, 0x001675, 0x001761, + 0x010331, 0x00167B, 0x001662, 0x010332, 0x010335, 0x001663, 0x001666, 0x001767, + 0x001781, 0x001784, 0x001783, 0x001782, 0x001785, 0x001780, 0x001787, 0x001786, + 0x001799, 0x001798, 0x00178B, 0x00178A, 0x00179D, 0x001789, 0x00179F, 0x00179E, + 0x001791, 0x01030E, 0x001793, 0x00178E, 0x00178D, 0x001794, 0x00178F, 0x001792, + 0x001790, 0x00179C, 0x00179B, 0x00179A, 0x001788, 0x001795, 0x001796, 0x001797, + 0x001490, 0x0017A3, 0x001491, 0x0017A1, 0x0017A6, 0x0017A7, 0x0017A2, 0x0017A5, + 0x0017A0, 0x001492, 0x01E92E, 0x0017A9, 0x00178C, 0x0017AC, 0x01E897, 0x00122D, + 0x0017B1, 0x0017B2, 0x0017B3, 0x0017B0, 0x010334, 0x0010C0, 0x001231, 0x010338, + 0x00122C, 0x01033B, 0x01033A, 0x01030C, 0x01030D, 0x01033E, 0x001493, 0x0010E2, + 0x00158D, 0x00156C, 0x010323, 0x010330, 0x01E8B2, 0x0010F3, 0x00123C, 0x01E8B1, + 0x001250, 0x00156D, 0x01E8B0, 0x001253, 0x01E8B6, 0x010336, 0x001252, 0x01E8B3, + 0x00156E, 0x00156F, 0x0102A7, 0x001255, 0x010295, 0x001225, 0x01E8B7, 0x010298, + 0x0102A0, 0x0102A4, 0x01029B, 0x01E8BB, 0x0102A6, 0x0017DC, 0x001251, 0x010292, + 0x0017E1, 0x0017E2, 0x0017E3, 0x0017E0, 0x0017E5, 0x0017E6, 0x0017E7, 0x0017E4, + 0x0017E9, 0x0017E8, 0x010291, 0x010290, 0x010294, 0x010297, 0x010296, 0x001100, + 0x001239, 0x0017F2, 0x0017F0, 0x001568, 0x01E89F, 0x0017F1, 0x0017F3, 0x0017F4, + 0x0017F9, 0x001569, 0x0102A2, 0x0102A1, 0x0017F5, 0x0017F8, 0x0017F7, 0x0017F6, + 0x000F5E, 0x00186E, 0x001853, 0x001866, 0x001864, 0x001865, 0x001867, 0x00183C, + 0x001868, 0x001869, 0x00186A, 0x00186B, 0x000F5F, 0x00186D, 0x000EDD, 0x00186F, + 0x001835, 0x000F58, 0x000ED8, 0x000ED9, 0x000EDE, 0x000EDF, 0x01E882, 0x0102E8, + 0x0102ED, 0x01E88B, 0x0102EB, 0x0102EC, 0x0102D0, 0x0102EE, 0x0102EF, 0x00156A, + 0x001833, 0x001831, 0x00183D, 0x001830, 0x001837, 0x001850, 0x001832, 0x001875, + 0x001862, 0x001863, 0x001836, 0x001857, 0x001874, 0x001861, 0x001860, 0x0102E1, + 0x0102E4, 0x001852, 0x0102E2, 0x0102E6, 0x0102A5, 0x0102E7, 0x001851, 0x0102A8, + 0x0102A9, 0x0102AA, 0x0102AB, 0x0102AC, 0x0102AD, 0x0102C3, 0x0102AF, 0x0102E5, + 0x001841, 0x001840, 0x0102E9, 0x001842, 0x001845, 0x001844, 0x001847, 0x001846, + 0x001849, 0x001848, 0x00184B, 0x00184A, 0x00182D, 0x0102EA, 0x00184F, 0x00184E, + 0x001871, 0x00182C, 0x010313, 0x001872, 0x010364, 0x001870, 0x001877, 0x010348, + 0x010349, 0x010368, 0x010369, 0x001876, 0x01036F, 0x00185C, 0x01036B, 0x00184D, + 0x001822, 0x001821, 0x001820, 0x001823, 0x001826, 0x001825, 0x00184C, 0x001827, + 0x00182A, 0x010312, 0x00182B, 0x010311, 0x00182E, 0x010315, 0x00182F, 0x010321, + 0x010320, 0x001829, 0x010322, 0x001828, 0x010360, 0x010361, 0x010362, 0x001834, + 0x010366, 0x001873, 0x010367, 0x01032D, 0x00183A, 0x01032F, 0x01032E, 0x00183B, + 0x000ED2, 0x014624, 0x000ED3, 0x010374, 0x010375, 0x01E8A3, 0x000ED6, 0x00156B, + 0x01462A, 0x001564, 0x000EAE, 0x000EAD, 0x01462B, 0x000EAF, 0x010365, 0x010341, + 0x010343, 0x010347, 0x010342, 0x01035D, 0x0103CD, 0x01035F, 0x010340, 0x0103C8, + 0x010359, 0x01035C, 0x0103CB, 0x0103CE, 0x0103CC, 0x010346, 0x0103CF, 0x010352, + 0x01EE03, 0x010353, 0x0103C3, 0x010350, 0x010351, 0x010354, 0x010355, 0x010310, + 0x010358, 0x01035E, 0x01035A, 0x010356, 0x01035B, 0x010357, 0x01EE11, 0x01EE10, + 0x01EE13, 0x01EE12, 0x01EE15, 0x01EE14, 0x01EE17, 0x01EE16, 0x01EE19, 0x01EE18, + 0x01EE1B, 0x01EE1A, 0x01EE1D, 0x01EE1C, 0x01EE1F, 0x01EE1E, 0x01EE21, 0x010345, + 0x010344, 0x01EE22, 0x010372, 0x01EE24, 0x01EE27, 0x010373, 0x01EE29, 0x010371, + 0x01EE2B, 0x01EE2A, 0x010370, 0x01EE2C, 0x01EE2F, 0x01034A, 0x01EE31, 0x01EE30, + 0x010394, 0x010381, 0x010382, 0x010380, 0x01EE37, 0x010384, 0x010386, 0x01039A, + 0x0103CA, 0x0103AF, 0x01038F, 0x010385, 0x01039B, 0x010387, 0x010399, 0x0103A2, + 0x01030B, 0x010393, 0x0103C9, 0x01EEA1, 0x01EE47, 0x010392, 0x010302, 0x01038B, + 0x01EE4B, 0x010300, 0x010391, 0x010390, 0x010397, 0x010396, 0x010395, 0x010303, + 0x0103B4, 0x01EE52, 0x010383, 0x01EE06, 0x0103A7, 0x01EE02, 0x0103B5, 0x00186C, + 0x0103B9, 0x0103B8, 0x0103D3, 0x0103BB, 0x0103BD, 0x010319, 0x0103BF, 0x0103B1, + 0x0103B0, 0x01EE62, 0x0103B2, 0x01039C, 0x0103B6, 0x0103B7, 0x01EE69, 0x01EE68, + 0x010398, 0x01039D, 0x01EE6D, 0x01EE6C, 0x01EE6F, 0x01EE6E, 0x01EE71, 0x01EE70, + 0x01031B, 0x0103C0, 0x01EE75, 0x01EE74, 0x01EE77, 0x01EE76, 0x0103C1, 0x010314, + 0x01EE7B, 0x010316, 0x001913, 0x0103AD, 0x001901, 0x01031D, 0x010317, 0x001912, + 0x01EE91, 0x00190C, 0x01EE90, 0x01EE96, 0x01EE95, 0x01EE97, 0x01EE94, 0x010306, + 0x0103D1, 0x0103D2, 0x010301, 0x0103D5, 0x0103D4, 0x0103C2, 0x010305, 0x0103A0, + 0x0103A1, 0x010337, 0x0103AB, 0x0103A4, 0x001910, 0x0103A6, 0x01031F, 0x0103A8, + 0x001911, 0x0103AA, 0x01EE83, 0x001915, 0x001917, 0x0103A5, 0x0103BE, 0x0103AC, + 0x00195A, 0x01EEA2, 0x01EEA5, 0x001956, 0x01EEA7, 0x01EEA6, 0x01EEA9, 0x01EEA8, + 0x01EEAB, 0x0103A9, 0x01EEAD, 0x01EEAC, 0x01EEAF, 0x01EEAE, 0x0103AE, 0x00195B, + 0x001955, 0x001950, 0x001953, 0x001952, 0x001914, 0x001957, 0x001916, 0x01EE82, + 0x001918, 0x001919, 0x00191A, 0x00191B, 0x01EE9B, 0x00191D, 0x00191E, 0x01EE81, + 0x01EE80, 0x01EEB6, 0x01EE86, 0x01EE85, 0x01EE84, 0x01EE87, 0x01EE89, 0x01EEB5, + 0x01EE88, 0x01EE8B, 0x01EE8D, 0x00185D, 0x01EE8C, 0x01EEB2, 0x01EEB7, 0x001854, + 0x01EEB3, 0x01EEB0, 0x001855, 0x01EE8E, 0x001954, 0x01EE8F, 0x001856, 0x01EE9A, + 0x001958, 0x001959, 0x00195E, 0x01EE99, 0x01EE98, 0x00195D, 0x01EEB1, 0x00195F, + 0x0019B5, 0x001983, 0x001984, 0x0019B6, 0x001986, 0x001981, 0x001982, 0x001985, + 0x001989, 0x001980, 0x00198B, 0x00198F, 0x0019D6, 0x001987, 0x00198C, 0x0019BB, + 0x001991, 0x001988, 0x001993, 0x001992, 0x0019D1, 0x0019D2, 0x0019D3, 0x00198E, + 0x0019D7, 0x001998, 0x00198A, 0x00198D, 0x0019D0, 0x00199C, 0x00199F, 0x00199E, + 0x010415, 0x01041A, 0x0019A3, 0x010422, 0x010414, 0x01041F, 0x010416, 0x010420, + 0x010421, 0x010424, 0x0019A1, 0x0019A2, 0x010426, 0x010419, 0x01042B, 0x010563, + 0x0019D4, 0x010427, 0x0019B3, 0x0019B2, 0x0019D5, 0x0019B0, 0x0019B1, 0x01042F, + 0x0019DA, 0x0019BC, 0x0019D8, 0x0019D9, 0x01EE0C, 0x01EE0D, 0x010418, 0x0019B7, + 0x010474, 0x0019C3, 0x01EE2D, 0x014601, 0x014600, 0x014606, 0x014607, 0x01EE2E, + 0x0019C2, 0x0019C0, 0x010473, 0x01044C, 0x0019C5, 0x0019C1, 0x0019C7, 0x01EE32, + 0x010450, 0x010483, 0x01EE34, 0x01EE35, 0x0019C4, 0x01EE36, 0x0019C6, 0x01EEB9, + 0x01EE3B, 0x0019C9, 0x01EEB8, 0x00185B, 0x010456, 0x01EE39, 0x00185A, 0x010491, + 0x010490, 0x010493, 0x010492, 0x010495, 0x010494, 0x0019A5, 0x0019A6, 0x010499, + 0x010498, 0x01049B, 0x01049A, 0x01049D, 0x01049C, 0x010497, 0x010496, 0x0104A1, + 0x0104A0, 0x01EE57, 0x0104A2, 0x0104A5, 0x0104A4, 0x0104A7, 0x0104A6, 0x01EE51, + 0x01EE59, 0x0019B9, 0x0019BA, 0x01EE54, 0x01EE5B, 0x01EE49, 0x0104A9, 0x0104B1, + 0x0104B0, 0x01EE42, 0x0104B2, 0x0104A8, 0x0104B4, 0x0104B7, 0x01EE6A, 0x01EE61, + 0x010475, 0x0104BB, 0x01EE67, 0x01EE4D, 0x01EE4E, 0x01EE4F, 0x01EE64, 0x0104C2, + 0x01EE72, 0x001B18, 0x001B06, 0x01EE7C, 0x001B14, 0x01EE7E, 0x01EE79, 0x001B1E, + 0x01EE7A, 0x0104C1, 0x001B1B, 0x01EE5D, 0x0104C0, 0x01EE5F, 0x0104C3, 0x01EEBA, + 0x010470, 0x0104D3, 0x001A82, 0x001A83, 0x001A84, 0x010477, 0x0104C7, 0x0104D9, + 0x0104D8, 0x010476, 0x0104DA, 0x0104DD, 0x0104DC, 0x0104DF, 0x0104DE, 0x0104E2, + 0x0104E0, 0x0104E3, 0x01EEB4, 0x01EEA3, 0x0104E1, 0x0104E4, 0x0104E5, 0x010428, + 0x010425, 0x0104EB, 0x01EEBB, 0x0104E8, 0x0104EF, 0x0104E6, 0x0104E7, 0x0104F1, + 0x010451, 0x010452, 0x0104F2, 0x0104F0, 0x0104F4, 0x0104F7, 0x0104F6, 0x0104FB, + 0x010472, 0x0104F8, 0x01045B, 0x010471, 0x0104F5, 0x0104FA, 0x0104F9, 0x001A43, + 0x001A81, 0x001A41, 0x001A42, 0x001A40, 0x010455, 0x001A46, 0x001A47, 0x010502, + 0x010458, 0x001A99, 0x001A96, 0x01045F, 0x001A87, 0x01051C, 0x001A45, 0x010511, + 0x010510, 0x010513, 0x001A44, 0x010515, 0x010514, 0x010517, 0x010516, 0x010519, + 0x010518, 0x01051B, 0x01051A, 0x01051D, 0x001A4A, 0x01051F, 0x01051E, 0x010501, + 0x010500, 0x010507, 0x010522, 0x010520, 0x010521, 0x010527, 0x010506, 0x010505, + 0x010503, 0x001A49, 0x001A4B, 0x010524, 0x010525, 0x010526, 0x001A48, 0x001A4F, + 0x000AA4, 0x000A21, 0x000A22, 0x000A23, 0x000A15, 0x000AA5, 0x000AA6, 0x000AA7, + 0x01047D, 0x000A09, 0x000A08, 0x000A39, 0x000A20, 0x000A27, 0x000A0F, 0x010541, + 0x010540, 0x010543, 0x010542, 0x010545, 0x010544, 0x010547, 0x010546, 0x010549, + 0x010548, 0x01054B, 0x01054A, 0x01054D, 0x01054C, 0x01054F, 0x01054E, 0x010535, + 0x010552, 0x01053D, 0x01050B, 0x010534, 0x010553, 0x010504, 0x010536, 0x010538, + 0x010539, 0x01053A, 0x01053B, 0x01053C, 0x01055C, 0x01053E, 0x01053F, 0x010561, + 0x010560, 0x000AA1, 0x010562, 0x01F109, 0x01F108, 0x01047A, 0x010479, 0x000AA0, + 0x01F10A, 0x010457, 0x01047B, 0x000AB8, 0x001BAE, 0x001BAF, 0x000ABD, 0x010454, + 0x01055D, 0x01055E, 0x01055F, 0x010554, 0x010555, 0x010556, 0x001BCF, 0x010532, + 0x010537, 0x01055A, 0x010531, 0x010530, 0x010559, 0x010558, 0x01055B, 0x001BC8, + 0x010484, 0x001BD0, 0x000E9D, 0x010480, 0x001BD5, 0x001A90, 0x001BD6, 0x001BD7, + 0x01048A, 0x010482, 0x001A4D, 0x010485, 0x001A4C, 0x001BDB, 0x001A4E, 0x001A98, + 0x001A94, 0x0104B3, 0x014644, 0x000AE1, 0x000E84, 0x001A93, 0x01F10C, 0x0104B8, + 0x000AE0, 0x001A91, 0x001A92, 0x001A95, 0x001A97, 0x0104BE, 0x0104BF, 0x000A72, + 0x000E9C, 0x000A25, 0x0104A3, 0x000A26, 0x000A73, 0x000AE6, 0x000AE7, 0x010488, + 0x000AEA, 0x000AF9, 0x000AEB, 0x0104BA, 0x000A24, 0x01048E, 0x000A74, 0x000A6C, + 0x001B0C, 0x001B48, 0x001B46, 0x001B4B, 0x001B45, 0x001B19, 0x001B47, 0x010523, + 0x001B09, 0x001B08, 0x001B0B, 0x001B0A, 0x001B0D, 0x001B4A, 0x001B0F, 0x001B0E, + 0x001B11, 0x001B10, 0x001B13, 0x001B12, 0x001B15, 0x01442F, 0x001B17, 0x001B16, + 0x000E8D, 0x014442, 0x014447, 0x01440F, 0x001B1A, 0x001B1C, 0x014441, 0x014409, + 0x001B30, 0x001B20, 0x001B23, 0x001B22, 0x001B25, 0x001B21, 0x001B27, 0x001B24, + 0x0104DB, 0x0104D2, 0x0104D0, 0x001B29, 0x001B2A, 0x001B2C, 0x001B26, 0x001B2B, + 0x01440D, 0x001B33, 0x01440E, 0x01441B, 0x014432, 0x014536, 0x0144EC, 0x014537, + 0x014460, 0x001B32, 0x0144ED, 0x014431, 0x001B31, 0x000A2A, 0x001B49, 0x000A2B, + 0x0144AC, 0x014430, 0x000EB3, 0x01447B, 0x014433, 0x010512, 0x000EB2, 0x014437, + 0x000F68, 0x000F6C, 0x000F4A, 0x000EB0, 0x01441A, 0x01447C, 0x000F4E, 0x010601, + 0x001B51, 0x001B53, 0x010602, 0x010600, 0x001B56, 0x001B54, 0x001B52, 0x001B55, + 0x001B50, 0x010604, 0x001B58, 0x010606, 0x010605, 0x001B59, 0x010607, 0x001B57, + 0x01440A, 0x01440B, 0x014462, 0x014461, 0x0144D0, 0x014473, 0x014436, 0x010608, + 0x010609, 0x01060A, 0x01060B, 0x01060C, 0x01060D, 0x01060E, 0x01447E, 0x014475, + 0x014472, 0x014466, 0x01445A, 0x014476, 0x01445C, 0x01444C, 0x000F69, 0x014463, + 0x010623, 0x01445D, 0x01443E, 0x01445E, 0x014467, 0x01443C, 0x01445F, 0x010633, + 0x001B83, 0x01440C, 0x01443D, 0x01063C, 0x000E8A, 0x01063E, 0x000E87, 0x014423, + 0x01063A, 0x01447F, 0x014443, 0x014453, 0x001B8D, 0x001B8C, 0x01063D, 0x010655, + 0x010654, 0x001B90, 0x001B93, 0x010656, 0x010657, 0x001B91, 0x001B92, 0x0144AD, + 0x01065B, 0x00A804, 0x001B9C, 0x0144AE, 0x01065F, 0x001B95, 0x001B96, 0x001B97, + 0x001B84, 0x001A85, 0x001B8E, 0x001B8F, 0x001B88, 0x001B85, 0x001B86, 0x001B87, + 0x01F102, 0x010652, 0x010651, 0x001B8B, 0x01F10B, 0x010650, 0x001B8A, 0x001B89, + 0x001BB1, 0x001BB0, 0x001BB3, 0x001BB2, 0x001BB5, 0x001BB4, 0x001BB7, 0x001BB6, + 0x001BB9, 0x001BB8, 0x001BBB, 0x001BBA, 0x001BBD, 0x001A80, 0x001BBF, 0x001BBE, + 0x001BC1, 0x00A832, 0x001BC3, 0x001BC2, 0x001BC5, 0x001BC4, 0x0144AF, 0x001BC6, + 0x001BC9, 0x001BC0, 0x001BCB, 0x001BCA, 0x001BCD, 0x001BCC, 0x001BC7, 0x001BCE, + 0x001BD1, 0x01F103, 0x001BD3, 0x001BD2, 0x0144D2, 0x0144D1, 0x001A86, 0x014440, + 0x001A89, 0x01444B, 0x00A89B, 0x001A88, 0x0144B8, 0x001BDC, 0x00A89A, 0x00A822, + 0x001BE1, 0x001BE0, 0x001BE3, 0x001BE2, 0x001BE5, 0x001BE4, 0x00A8D8, 0x00AA9C, + 0x014445, 0x001BBC, 0x014452, 0x014616, 0x00A8F3, 0x000E88, 0x01444A, 0x0106A1, + 0x0106A0, 0x014446, 0x0106A2, 0x001BA0, 0x0106A4, 0x0106A7, 0x0106A6, 0x0106A9, + 0x0106A8, 0x0106AB, 0x0106AA, 0x0106AE, 0x0106A5, 0x0106AF, 0x0106AD, 0x0144B9, + 0x001C0D, 0x001C00, 0x001C03, 0x001C06, 0x001C05, 0x001C04, 0x001C07, 0x001C0C, + 0x001C09, 0x001C18, 0x001C0B, 0x0106AC, 0x001C0A, 0x001C0F, 0x001C1E, 0x0106DF, + 0x001C11, 0x001C10, 0x001C13, 0x001C12, 0x001C16, 0x001C17, 0x0106C3, 0x001C14, + 0x001C19, 0x001C1A, 0x001C1B, 0x001C1C, 0x001C1D, 0x001C15, 0x001C1F, 0x0106D3, + 0x0106D0, 0x0106D1, 0x0106D2, 0x0106D7, 0x0106D4, 0x0106D5, 0x0106D6, 0x0106DB, + 0x01F101, 0x0106D9, 0x0106DA, 0x01F100, 0x0106D8, 0x0106DC, 0x0106DE, 0x001C08, + 0x001C20, 0x001C21, 0x001C22, 0x001C23, 0x001C74, 0x001C71, 0x001C76, 0x001C77, + 0x001C60, 0x001C61, 0x001C62, 0x001C63, 0x001C0E, 0x001C75, 0x0106FF, 0x0106F1, + 0x0106F0, 0x0106F7, 0x0106F2, 0x0106F5, 0x01F107, 0x01F106, 0x0106F6, 0x01F105, + 0x0106F8, 0x0106F9, 0x0106FA, 0x0106F4, 0x0106DD, 0x0106FB, 0x001C54, 0x010710, + 0x010711, 0x001C50, 0x001C53, 0x010717, 0x001C51, 0x010715, 0x010716, 0x001C52, + 0x001C5A, 0x001C5B, 0x001C56, 0x001C59, 0x001C5F, 0x001C55, 0x010714, 0x001C57, + 0x001C40, 0x001C41, 0x001C42, 0x001C43, 0x001C44, 0x001C45, 0x01F104, 0x001C47, + 0x001C70, 0x001C49, 0x001C72, 0x001C73, 0x001C5C, 0x010712, 0x001C46, 0x010721, + 0x010720, 0x001C5D, 0x010722, 0x010725, 0x010724, 0x010727, 0x010726, 0x010718, + 0x01071F, 0x01072B, 0x01071A, 0x010728, 0x010729, 0x01071E, 0x001C58, 0x001C5E, + 0x00A8B0, 0x00A8B1, 0x00A8AB, 0x00A8A9, 0x0145E1, 0x00A8D5, 0x00A8A4, 0x00A8D9, + 0x001C82, 0x00A8AA, 0x00AA86, 0x001C83, 0x01071B, 0x01072F, 0x010719, 0x001C81, + 0x001C85, 0x010743, 0x001C80, 0x001C86, 0x000C9B, 0x001C87, 0x001C84, 0x000C97, + 0x001565, 0x000C93, 0x001C88, 0x014584, 0x01444E, 0x001566, 0x014589, 0x010751, + 0x010750, 0x000C9A, 0x010752, 0x010755, 0x010754, 0x0145B1, 0x0145B2, 0x0145B3, + 0x0145B0, 0x014515, 0x014514, 0x00AA80, 0x000F25, 0x014533, 0x01451B, 0x01458C, + 0x000F24, 0x01458D, 0x014618, 0x00AA89, 0x01450C, 0x01462C, 0x000C92, 0x014603, + 0x014630, 0x000CB2, 0x000C96, 0x000C95, 0x00A8F4, 0x000CB8, 0x00AA88, 0x01462E, + 0x01442E, 0x01450D, 0x01450E, 0x01450F, 0x000D6D, 0x014610, 0x000F22, 0x000F42, + 0x000D68, 0x00AA9E, 0x000D6E, 0x014505, 0x014631, 0x000F40, 0x001567, 0x01461A, + 0x000C94, 0x001560, 0x014602, 0x000D6C, 0x001561, 0x000C90, 0x00A80F, 0x01455E, + 0x0145CC, 0x0145C5, 0x01071C, 0x014478, 0x01071D, 0x01444F, 0x014540, 0x000CA8, + 0x00A8D4, 0x001C6C, 0x010703, 0x0145CD, 0x014479, 0x001C65, 0x001C66, 0x001C67, + 0x014474, 0x001C69, 0x001C6A, 0x01446F, 0x01455F, 0x001CEC, 0x001CEF, 0x001CEE, + 0x001CF1, 0x001CF0, 0x01447A, 0x001562, 0x001CF5, 0x0145F2, 0x0145F3, 0x001CF6, + 0x0145F6, 0x014531, 0x0145F7, 0x014532, 0x014530, 0x00A8F5, 0x01460E, 0x014578, + 0x001D01, 0x001D02, 0x001D03, 0x001D00, 0x001D05, 0x001D06, 0x001D07, 0x001D04, + 0x001D0C, 0x001D0A, 0x001D0B, 0x000D0F, 0x001D09, 0x001D1D, 0x001D0F, 0x001D0D, + 0x001D11, 0x001D10, 0x001D13, 0x001D12, 0x001D15, 0x001D14, 0x001D17, 0x001D08, + 0x001D19, 0x001D18, 0x001D1B, 0x001D1A, 0x001D1E, 0x001D1F, 0x001D16, 0x001D1C, + 0x001D21, 0x001D24, 0x001D23, 0x001D22, 0x000D27, 0x001D20, 0x001D27, 0x001D26, + 0x001D29, 0x001D2A, 0x001D2B, 0x000D23, 0x000D0E, 0x001D25, 0x001D0E, 0x000D2B, + 0x000D21, 0x000D76, 0x000D22, 0x000D25, 0x000D26, 0x01446E, 0x001563, 0x00A815, + 0x001D28, 0x000D24, 0x000D7B, 0x000D6F, 0x01462F, 0x00157C, 0x000D75, 0x000D3D, + 0x000DC0, 0x000D20, 0x000D77, 0x000D6A, 0x000DC4, 0x000D67, 0x000D73, 0x000D69, + 0x000D66, 0x000D71, 0x000D4E, 0x000D72, 0x000D70, 0x000D60, 0x000D2A, 0x010801, + 0x010803, 0x010820, 0x010802, 0x010800, 0x010826, 0x010804, 0x010805, 0x010818, + 0x01080B, 0x01081A, 0x01080A, 0x010814, 0x010808, 0x01081C, 0x01080C, 0x010811, + 0x010817, 0x01081B, 0x010812, 0x010810, 0x001D74, 0x001D6D, 0x001D6C, 0x001D6F, + 0x001D6B, 0x001D79, 0x001D7A, 0x001D7B, 0x001D6E, 0x001D7D, 0x001D7E, 0x001D7F, + 0x010834, 0x010835, 0x001D73, 0x001D72, 0x010827, 0x001D71, 0x010822, 0x010838, + 0x001D70, 0x01083C, 0x010821, 0x001D75, 0x010823, 0x001D77, 0x001D76, 0x001D7C, + 0x001D81, 0x010833, 0x001D83, 0x001D82, 0x001D85, 0x010832, 0x010831, 0x001D86, + 0x010819, 0x001D98, 0x010837, 0x010830, 0x01080F, 0x001D8C, 0x01081F, 0x01085B, + 0x001D91, 0x001D90, 0x001D93, 0x001D92, 0x001D95, 0x001D94, 0x001D97, 0x001D96, + 0x01085F, 0x01085D, 0x01083F, 0x010842, 0x01085A, 0x001D99, 0x001D9A, 0x010840, + 0x010841, 0x010853, 0x010852, 0x010847, 0x010845, 0x010846, 0x010851, 0x010850, + 0x010854, 0x01084A, 0x01084B, 0x010855, 0x010844, 0x010859, 0x010843, 0x01084F, + 0x010875, 0x010849, 0x01082C, 0x01087B, 0x010825, 0x010824, 0x01087F, 0x010828, + 0x010829, 0x01082A, 0x01087A, 0x01082E, 0x01082D, 0x01082B, 0x01082F, 0x010873, + 0x010872, 0x010862, 0x010863, 0x010860, 0x010861, 0x010871, 0x010867, 0x010858, + 0x010870, 0x010865, 0x010874, 0x01085C, 0x010866, 0x01085E, 0x010876, 0x010881, + 0x014632, 0x010883, 0x010882, 0x010885, 0x000DC6, 0x000DC5, 0x010886, 0x010889, + 0x010888, 0x01088B, 0x01088A, 0x00A821, 0x000DAC, 0x01088F, 0x000DC3, 0x010891, + 0x00AA99, 0x000D7A, 0x010892, 0x010895, 0x00AA9A, 0x00A814, 0x010896, 0x010899, + 0x010898, 0x01089B, 0x01089A, 0x000DC2, 0x00AA9F, 0x00AA83, 0x000D7E, 0x000DC1, + 0x014613, 0x000D7F, 0x00AA87, 0x014625, 0x0108AC, 0x0108A7, 0x000CB5, 0x000D74, + 0x00AA81, 0x0108AB, 0x0108AA, 0x0108A8, 0x0108A9, 0x0108AF, 0x00A835, 0x000DAD, + 0x014611, 0x001E61, 0x001E62, 0x001E63, 0x00A834, 0x001E65, 0x001E66, 0x00AA98, + 0x01461B, 0x014615, 0x014619, 0x014612, 0x001E7C, 0x001E7D, 0x001E6C, 0x01086A, + 0x001E1D, 0x01084D, 0x001E7E, 0x001E7F, 0x001E1F, 0x01084E, 0x001E14, 0x01086D, + 0x001E78, 0x010848, 0x001E1B, 0x001E1A, 0x001E1E, 0x001E18, 0x0108E3, 0x0108FC, + 0x0108FD, 0x010868, 0x001E74, 0x001EAD, 0x01086C, 0x01086E, 0x001EAE, 0x01084C, + 0x0108FB, 0x001EBD, 0x0108FE, 0x001EAA, 0x001EAF, 0x0108FF, 0x001E79, 0x0108E1, + 0x0108E0, 0x001EBE, 0x0108E2, 0x0108E5, 0x0108E4, 0x0108E7, 0x0108E6, 0x001EBF, + 0x0108E8, 0x0108EB, 0x0108EA, 0x001EB9, 0x0108EC, 0x0108F4, 0x0108EE, 0x0108F2, + 0x001ED8, 0x01087C, 0x001E43, 0x0108F1, 0x01087D, 0x001ED4, 0x01086F, 0x010879, + 0x010869, 0x01086B, 0x001EDA, 0x0108F0, 0x01087E, 0x010864, 0x0108F5, 0x001ED5, + 0x001E40, 0x001E41, 0x001E42, 0x001E4D, 0x001E44, 0x001E45, 0x001E46, 0x001E47, + 0x001E48, 0x001E49, 0x001E4A, 0x001E4B, 0x001E7A, 0x001E5C, 0x001E4E, 0x001E4F, + 0x001E70, 0x001E73, 0x001E72, 0x001ED9, 0x001EDD, 0x001E71, 0x001E76, 0x001EDF, + 0x010901, 0x010902, 0x001E7B, 0x001E75, 0x001E4C, 0x001E77, 0x010907, 0x010922, + 0x010920, 0x001EDB, 0x010913, 0x010927, 0x010921, 0x010924, 0x010925, 0x010929, + 0x010928, 0x01092B, 0x01092A, 0x001EDE, 0x01092C, 0x010926, 0x01092E, 0x010910, + 0x010911, 0x010912, 0x001E83, 0x010914, 0x001E82, 0x010916, 0x010917, 0x010918, + 0x001E85, 0x001E81, 0x01091B, 0x01092D, 0x010915, 0x001E8A, 0x01092F, 0x001E86, + 0x001E8C, 0x001EBA, 0x001E90, 0x010900, 0x010905, 0x010906, 0x001E93, 0x001EB8, + 0x001E92, 0x001E8E, 0x01090B, 0x010904, 0x001E8B, 0x001E9C, 0x001E88, 0x001E84, + 0x001EA3, 0x001EB1, 0x001EB2, 0x001EB0, 0x001EB4, 0x001EA2, 0x001EB6, 0x001EB7, + 0x001EA1, 0x001E89, 0x001EA5, 0x001EBB, 0x001EB5, 0x001E8D, 0x001EA7, 0x001E8F, + 0x001EA8, 0x00A820, 0x001EA6, 0x001E91, 0x001E97, 0x00AA11, 0x00AA82, 0x010930, + 0x010931, 0x010932, 0x001EAB, 0x001EA4, 0x001EAC, 0x001EB3, 0x010937, 0x001EBC, + 0x001ED0, 0x001EC2, 0x001EC1, 0x001ED3, 0x00AA13, 0x001ED1, 0x001ED2, 0x00AA9D, + 0x01446D, 0x001ED6, 0x00AAB6, 0x014617, 0x001ED7, 0x001ECC, 0x014614, 0x00AAB1, + 0x010980, 0x001E94, 0x001E9D, 0x010985, 0x010984, 0x010987, 0x001E96, 0x001E95, + 0x001E98, 0x001E99, 0x001E9A, 0x001E9B, 0x001EFD, 0x001E9F, 0x001E9E, 0x000CAF, + 0x001EF0, 0x001EF1, 0x000CA3, 0x00A850, 0x001EF4, 0x001EF5, 0x001EF6, 0x001EF7, + 0x001EF8, 0x001EF9, 0x001EFA, 0x001EFB, 0x000CA2, 0x001EFF, 0x001EFE, 0x0109A1, + 0x0109A0, 0x0109A3, 0x0109A2, 0x0109A6, 0x001EF3, 0x0109A7, 0x0109A5, 0x0109AB, + 0x0109A8, 0x0109A9, 0x0109AA, 0x0109A4, 0x0109AC, 0x010923, 0x0109AE, 0x001EF2, + 0x001F2C, 0x001F2D, 0x001F2E, 0x010934, 0x010935, 0x010936, 0x001F24, 0x010938, + 0x010939, 0x001F28, 0x001F2F, 0x0109BD, 0x0109AD, 0x0109AF, 0x0109BE, 0x0109EC, + 0x000E52, 0x001F10, 0x014608, 0x01460B, 0x001F1D, 0x001F14, 0x000E50, 0x0109C3, + 0x0109EF, 0x001F18, 0x001F1B, 0x0109ED, 0x001F68, 0x001F19, 0x001F1A, 0x0109D5, + 0x0109DC, 0x001F23, 0x0109D2, 0x0109D3, 0x0109D4, 0x0109D7, 0x0109D6, 0x001F22, + 0x0109D8, 0x0109DB, 0x0109DA, 0x0109DE, 0x001F26, 0x001F21, 0x0109D9, 0x0109F0, + 0x0109F1, 0x0109F2, 0x0109E2, 0x0109E1, 0x0109E0, 0x0109E7, 0x0109F7, 0x0109EA, + 0x0109E5, 0x0109E8, 0x0109E9, 0x0109E4, 0x0109EE, 0x0109E6, 0x0109DD, 0x001F25, + 0x0109EB, 0x000E81, 0x001F43, 0x001F42, 0x000F43, 0x001F41, 0x001F40, 0x0109DF, + 0x000E09, 0x000E82, 0x001F78, 0x00AAE9, 0x00A81B, 0x001F44, 0x001F4C, 0x00AAE8, + 0x001F51, 0x001F50, 0x001F53, 0x001F52, 0x001F55, 0x001F54, 0x001F57, 0x001F56, + 0x001F59, 0x001F49, 0x001F5B, 0x001F4B, 0x001F5D, 0x001F45, 0x001F5F, 0x001F4D, + 0x010A00, 0x010A13, 0x001F6C, 0x010A15, 0x001F62, 0x00AA1B, 0x010A16, 0x001F63, + 0x001F48, 0x00AA14, 0x001F4A, 0x010A1F, 0x001F60, 0x001F61, 0x010A1D, 0x010A23, + 0x001F65, 0x001F66, 0x001F73, 0x001F72, 0x001F76, 0x001F71, 0x001F74, 0x001F75, + 0x000E9E, 0x001F69, 0x001F7B, 0x001F6D, 0x001F79, 0x001F7C, 0x001F7D, 0x010A31, + 0x00AA10, 0x010A33, 0x010A32, 0x010A30, 0x00157D, 0x000E0D, 0x000E0E, 0x00157E, + 0x001F98, 0x000E08, 0x000E0A, 0x00AA27, 0x000E0F, 0x00AA21, 0x00AA20, 0x001F9E, + 0x001F91, 0x001F93, 0x00157F, 0x001F90, 0x001F96, 0x001F94, 0x001F92, 0x001F95, + 0x001F99, 0x000F8B, 0x001F9B, 0x001F9A, 0x001F9D, 0x000F8A, 0x001F9F, 0x001F97, + 0x000E21, 0x000E22, 0x000E23, 0x000F59, 0x000E25, 0x000E9F, 0x000E27, 0x000E20, + 0x000F26, 0x000CAE, 0x000E2A, 0x000E2B, 0x000E28, 0x000E29, 0x000E26, 0x000E2F, + 0x000E99, 0x001578, 0x001579, 0x00157A, 0x00157B, 0x001574, 0x001575, 0x001576, + 0x001577, 0x001570, 0x001571, 0x000E96, 0x001572, 0x000E2D, 0x000E2E, 0x000E97, + 0x000F00, 0x001573, 0x001FC3, 0x001FC2, 0x00154C, 0x001FC4, 0x001FC7, 0x001FC6, + 0x001FC9, 0x00154D, 0x001FCB, 0x001FCA, 0x00154E, 0x001FCC, 0x00154F, 0x001548, + 0x000E54, 0x001549, 0x00154A, 0x00154B, 0x000E55, 0x000E56, 0x000E57, 0x000CDE, + 0x001544, 0x000E59, 0x001545, 0x001546, 0x000E58, 0x001547, 0x001540, 0x001541, + 0x001542, 0x001543, 0x00155C, 0x00152E, 0x00152F, 0x001528, 0x00158E, 0x00158F, + 0x001588, 0x001584, 0x001591, 0x00126D, 0x00127E, 0x00127F, 0x001278, 0x001279, + 0x00127A, 0x00127B, 0x001FF3, 0x001FF2, 0x001274, 0x001FF4, 0x001FF7, 0x001FF6, + 0x001FF9, 0x001FF8, 0x001FFB, 0x001FFA, 0x001275, 0x001276, 0x00AA25, 0x001277, + 0x00AA24, 0x001270, 0x00AA28, 0x001271, 0x001272, 0x001273, 0x00124C, 0x00124D, + 0x01E8AC, 0x01E8AD, 0x01E8BC, 0x01E8BD, 0x01E8BF, 0x01E8B5, 0x00AA57, 0x010AC1, + 0x010AC0, 0x010AC3, 0x010AC2, 0x010AC5, 0x010AC4, 0x010AC7, 0x010AC6, 0x00120E, + 0x00120F, 0x010ACB, 0x001208, 0x010ACD, 0x010ACC, 0x010ACF, 0x010ACE, 0x010AD1, + 0x001209, 0x010AD3, 0x00AA52, 0x00AA53, 0x00AA50, 0x00AA51, 0x010AD6, 0x010AD9, + 0x00120A, 0x001201, 0x010ADA, 0x010ADD, 0x010ADC, 0x001202, 0x010ADE, 0x010AE1, + 0x010AE0, 0x010AE3, 0x010AE2, 0x0012E8, 0x010AE4, 0x00FC5D, 0x00FC5E, 0x00FC58, + 0x00FC3F, 0x010AEB, 0x00FC3B, 0x010AED, 0x010AEC, 0x010AEF, 0x010AEE, 0x00FC34, + 0x00FC35, 0x00FC36, 0x00FC37, 0x00FC30, 0x00FC31, 0x00FC32, 0x00FC0C, 0x00FC0D, + 0x00FC0E, 0x00FC13, 0x00FCEC, 0x00FCED, 0x00FCEE, 0x00FCEA, 0x00FCA5, 0x010B10, + 0x010B11, 0x010B1C, 0x00FCA6, 0x010B14, 0x010B15, 0x010B16, 0x010B17, 0x010B18, + 0x010B19, 0x010B1A, 0x010B1B, 0x00FCA0, 0x010B1D, 0x010B1E, 0x010B1F, 0x010B02, + 0x010B01, 0x010B13, 0x010B12, 0x010B00, 0x010B05, 0x00FC8D, 0x010B07, 0x00FC8E, + 0x00FC85, 0x010B04, 0x010B0A, 0x010B06, 0x00FC86, 0x0013BD, 0x0013BE, 0x0013BF, + 0x0013B8, 0x0013B9, 0x010B03, 0x0013BA, 0x0013BB, 0x0013B4, 0x0013B5, 0x0013B6, + 0x0013B7, 0x0013B0, 0x0013B1, 0x0013B2, 0x0013B3, 0x00138C, 0x010B09, 0x00FD53, + 0x00FD2C, 0x00FD2D, 0x00FD2E, 0x00FD2F, 0x00FD28, 0x00FD29, 0x00FD2A, 0x00FD2B, + 0x00FD24, 0x00FD25, 0x00FD26, 0x00FD27, 0x00FD20, 0x00FD21, 0x00FD22, 0x00FD23, + 0x010B23, 0x00FD3C, 0x010B33, 0x00106F, 0x00FD38, 0x00FD39, 0x00FD3A, 0x00FD3B, + 0x00FD36, 0x00FD37, 0x00FD31, 0x00FD32, 0x00FD0B, 0x00FD00, 0x00FD01, 0x010B30, + 0x010B31, 0x010B32, 0x010B52, 0x010B34, 0x010B35, 0x010B50, 0x010B51, 0x010B54, + 0x010B58, 0x010B5B, 0x010B5F, 0x010B55, 0x010B0B, 0x00FD02, 0x010B08, 0x00FD03, + 0x010B0D, 0x010B0E, 0x00FD1C, 0x00FD1D, 0x00FD1E, 0x00FD19, 0x00FD1A, 0x00105D, + 0x00105A, 0x00105B, 0x001054, 0x001055, 0x001050, 0x001051, 0x010B0F, 0x001052, + 0x001053, 0x001028, 0x00FDFA, 0x00FDF3, 0x00103F, 0x00FDC4, 0x00FDC5, 0x00FDC6, + 0x00FDC7, 0x00FDC0, 0x00FDC1, 0x010B0C, 0x00FDC2, 0x00100D, 0x00100E, 0x00100F, + 0x001008, 0x010B83, 0x001009, 0x00100A, 0x010B82, 0x00100B, 0x001004, 0x001005, + 0x001006, 0x001007, 0x001000, 0x010B81, 0x001001, 0x001002, 0x001003, 0x010B80, + 0x00101C, 0x010B91, 0x010B90, 0x010B84, 0x010B85, 0x010B86, 0x010B87, 0x010B88, + 0x010B89, 0x010B8A, 0x010B8B, 0x010B8E, 0x010B8D, 0x00FDB3, 0x010B8F, 0x00FD8A, + 0x010BAC, 0x00FD83, 0x00FD9D, 0x00FD9E, 0x010BAE, 0x00FD9F, 0x00FD98, 0x010BA9, + 0x010BAB, 0x010BAF, 0x010BAA, 0x00FD99, 0x010B8C, 0x00FD9A, 0x010BAD, 0x00FD95, + 0x0010C1, 0x0010C2, 0x0010DF, 0x002102, 0x0010D8, 0x00FA43, 0x002107, 0x00FA5C, + 0x00FA5E, 0x00FA5F, 0x00210B, 0x00210A, 0x00210D, 0x00210C, 0x00210F, 0x00210E, + 0x00FA58, 0x00FA59, 0x00FA5A, 0x00FA5B, 0x00FA54, 0x00FA55, 0x00FA56, 0x00FA51, + 0x00FA52, 0x00FA53, 0x00FA2C, 0x00FA2D, 0x00FA2E, 0x00211C, 0x00FA29, 0x00FA2A, + 0x00115D, 0x00115E, 0x00115F, 0x001158, 0x001159, 0x00115A, 0x00115B, 0x001154, + 0x001155, 0x001156, 0x001157, 0x001150, 0x001151, 0x00212C, 0x001152, 0x001153, + 0x002131, 0x002130, 0x002133, 0x002132, 0x002135, 0x002134, 0x002137, 0x002136, + 0x00112C, 0x002138, 0x00112D, 0x00112E, 0x00213D, 0x00112F, 0x00213F, 0x00213E, + 0x001128, 0x001129, 0x00112A, 0x00112B, 0x001124, 0x001125, 0x002147, 0x002146, + 0x001126, 0x001127, 0x001120, 0x002148, 0x00214E, 0x001121, 0x001122, 0x001123, + 0x002151, 0x00113C, 0x002153, 0x002152, 0x002155, 0x002154, 0x00110D, 0x00110E, + 0x00110F, 0x002158, 0x001108, 0x00110B, 0x00215D, 0x00215C, 0x00215F, 0x00215E, + 0x002171, 0x001104, 0x002163, 0x002162, 0x0011B6, 0x002161, 0x0011B3, 0x00119A, + 0x00FB23, 0x00FB3C, 0x00FB3E, 0x00FB38, 0x00FB39, 0x00FB3A, 0x00FB3B, 0x00216C, + 0x00FB34, 0x00FB35, 0x00FB36, 0x00FB30, 0x00FB31, 0x00FB32, 0x00FB33, 0x00FB04, + 0x00FB05, 0x00FB06, 0x00FB00, 0x00FB01, 0x00FB02, 0x00217C, 0x00FB03, 0x00FB1D, + 0x00FB1F, 0x000E44, 0x002183, 0x00FB15, 0x002182, 0x002184, 0x00FB16, 0x002181, + 0x002189, 0x002185, 0x000E41, 0x000E42, 0x002188, 0x000E43, 0x00FB13, 0x002186, + 0x00FBEC, 0x00FBED, 0x00FBEE, 0x00FBE9, 0x00FBEA, 0x00FBF3, 0x000E30, 0x000E32, + 0x000E33, 0x000E0C, 0x00FBD7, 0x000E01, 0x000E02, 0x000E03, 0x00AA67, 0x00AA60, + 0x00AA61, 0x00AA62, 0x00AA63, 0x00AA7E, 0x00AA7F, 0x00AA7A, 0x00FBB0, 0x00AA75, + 0x00AA76, 0x00FB8C, 0x00FB8D, 0x00AA8F, 0x00FB89, 0x00FB8A, 0x00FB8B, 0x00FB84, + 0x00FB98, 0x00FB99, 0x00FB9A, 0x00FB94, 0x000ED4, 0x000ED5, 0x000ED7, 0x000ED0, + 0x000ED1, 0x00AA26, 0x00AA22, 0x00AA23, 0x000EAA, 0x000EAB, 0x000EA5, 0x000EA7, + 0x000EA1, 0x000EA2, 0x00AA8D, 0x000EA3, 0x000EBD, 0x00AA8C, 0x00AA0C, 0x00AA0D, + 0x00AA8E, 0x00AA0E, 0x00AA0F, 0x00AA08, 0x00AA09, 0x00AA0B, 0x00AA06, 0x00AA00, + 0x00AA01, 0x00AA03, 0x00AA1D, 0x00AA1F, 0x00AA18, 0x00AA1A, 0x00AA15, 0x00AA12, + 0x000E9A, 0x000E9B, 0x000E94, 0x000E95, 0x00AAEA, 0x00AAE4, 0x00AAE5, 0x00AAE7, + 0x00AAE0, 0x00AAE1, 0x00AA17, 0x000F6A, 0x000F6B, 0x000F64, 0x000F65, 0x000F66, + 0x000F67, 0x000F60, 0x000F61, 0x000F62, 0x000F63, 0x014645, 0x014646, 0x014640, + 0x014641, 0x014642, 0x014643, 0x000F4C, 0x000F4D, 0x000F4F, 0x00AAC2, 0x000F49, + 0x000F4B, 0x000F44, 0x000F45, 0x000F46, 0x000F47, 0x014609, 0x01460A, 0x014604, + 0x014605, 0x00AA9B, 0x00AA94, 0x00AA95, 0x00AA16, 0x00AA96, 0x00AA97, 0x00AA90, + 0x00AA1E, 0x00AA91, 0x00AA92, 0x00AA93, 0x00AB64, 0x00AB65, 0x00AB60, 0x00AB61, + 0x00AB62, 0x00AB63, 0x00AB7C, 0x00AB7D, 0x00AB7E, 0x00AB7F, 0x00AB78, 0x00AB79, + 0x00AB7A, 0x00AB7B, 0x00AB74, 0x00AB75, 0x00AB76, 0x00AB77, 0x00AB70, 0x00AB71, + 0x00AB72, 0x00AB73, 0x00AB4C, 0x00AB4D, 0x00AB4E, 0x00AB4F, 0x00AB48, 0x00AB49, + 0x00AB4A, 0x00AB4B, 0x00AB44, 0x00AB45, 0x00AB46, 0x00AB47, 0x00AB40, 0x00AB41, + 0x00AB42, 0x00AB43, 0x00AB58, 0x00AB59, 0x00AB5A, 0x00AB54, 0x00AB55, 0x00AB56, + 0x00F964, 0x00F97C, 0x00F944, 0x00F945, 0x00F95C, 0x00F95D, 0x00F95B, 0x00F954, + 0x00F955, 0x00F956, 0x00F957, 0x00F950, 0x00F92C, 0x00F92D, 0x00F929, 0x00F92A, + 0x00F92B, 0x00F924, 0x00AAC0, 0x00F925, 0x00AAE2, 0x00AAE6, 0x00F926, 0x00F927, + 0x00F920, 0x00F921, 0x00F922, 0x00F93B, 0x00F934, 0x00F9BB, 0x00F9B4, 0x00F9B1, + 0x00F9B2, 0x00F9B3, 0x00F98C, 0x00A857, 0x00A851, 0x00A852, 0x00A853, 0x000CAC, + 0x000CAD, 0x000CAA, 0x000CAB, 0x000CA4, 0x000CA5, 0x000CA6, 0x00AADC, 0x000CA7, + 0x000CA0, 0x000CA1, 0x000CBD, 0x00A830, 0x00A831, 0x00A80C, 0x00A80D, 0x00A80E, + 0x000CB1, 0x000C8C, 0x00A807, 0x000C88, 0x00A81E, 0x01447D, 0x014470, 0x014471, + 0x014458, 0x014459, 0x01445B, 0x014454, 0x014455, 0x014456, 0x014457, 0x014450, + 0x014451, 0x01442C, 0x01442D, 0x014408, 0x0144F0, 0x0144F1, 0x00AAE3, 0x0144C6, + 0x0144C7, 0x0144C0, 0x0144C1, 0x0144C2, 0x0144C3, 0x0144DC, 0x0144DD, 0x0144D9, + 0x0144D6, 0x0144D7, 0x0144D3, 0x0144A8, 0x0144A9, 0x0144AA, 0x0144AB, 0x0144A4, + 0x0144A5, 0x0144A6, 0x0144A7, 0x0144A0, 0x00AA1C, 0x0144A1, 0x0144A2, 0x0144A3, + 0x0144BC, 0x0144BD, 0x00AA19, 0x014571, 0x014546, 0x014547, 0x014541, 0x014542, + 0x014543, 0x01455C, 0x01455D, 0x014558, 0x014559, 0x01455A, 0x01455B, 0x014554, + 0x014555, 0x014556, 0x014557, 0x014550, 0x014551, 0x01452C, 0x01452D, 0x014508, + 0x014509, 0x01451A, 0x0145F0, 0x0145F1, 0x0145CE, 0x0145CF, 0x0145C8, 0x0145C9, + 0x0145CA, 0x0145CB, 0x0145C4, 0x0145A6, 0x0145A7, 0x0145A0, 0x0145A1, 0x014588, + 0x01458A, 0x01458B, 0x014586, 0x014587, 0x014580, 0x00A61A, 0x00A61B, 0x00A614, + 0x00A615, 0x00A6E4, 0x000B6A, 0x000B6B, 0x000B66, 0x000B67, 0x000B60, 0x000B61, + 0x00A6CC, 0x00A6CD, 0x00A6CA, 0x00A6C6, 0x00A6C7, 0x00A6C0, 0x00A6C1, 0x00A6C2, + 0x00A6C3, 0x00A6DC, 0x00A6DD, 0x00A6DE, 0x00A6DF, 0x00A6D8, 0x00A6D9, 0x00A6DA, + 0x00A6DB, 0x00A6D4, 0x00A6D5, 0x00A6D0, 0x00A6D2, 0x00A6D3, 0x00A6AC, 0x00A6AD, + 0x00A6AE, 0x00AA02, 0x00A6AF, 0x00A6A8, 0x00A6A9, 0x00A6AA, 0x00A6AB, 0x00A6A4, + 0x00A6A5, 0x00A6A3, 0x00A6B6, 0x00A6B0, 0x00A6B1, 0x00A68C, 0x00A68D, 0x00A68E, + 0x00A68B, 0x00A687, 0x00AAF2, 0x00A680, 0x000B0A, 0x000B0B, 0x000B05, 0x00A69A, + 0x00A69B, 0x00A694, 0x00A695, 0x00A76B, 0x00A764, 0x00A77E, 0x00A77F, 0x00A77A, + 0x00A77B, 0x00A774, 0x00A775, 0x00A776, 0x00A777, 0x00A771, 0x00A772, 0x00A773, + 0x00A74C, 0x00A74D, 0x00A74E, 0x00A74F, 0x00AA07, 0x00A748, 0x00A749, 0x00A745, + 0x00A746, 0x00A747, 0x00A740, 0x00A741, 0x00A742, 0x00A743, 0x00A75C, 0x00A75D, + 0x00A75E, 0x00A75F, 0x00A758, 0x00A759, 0x00A75A, 0x00A75B, 0x00A754, 0x00A755, + 0x00A756, 0x00A757, 0x00A750, 0x00A751, 0x00A752, 0x00A753, 0x00A72C, 0x00A72D, + 0x00A72E, 0x00A72F, 0x00A728, 0x00A729, 0x00A72B, 0x00A724, 0x00A725, 0x00A726, + 0x00A727, 0x000BAE, 0x000BAF, 0x00A73D, 0x00A73F, 0x00A738, 0x00A739, 0x00A73A, + 0x00A73B, 0x00A734, 0x00A736, 0x00A737, 0x00A730, 0x00A731, 0x000BB4, 0x000BB5, + 0x000BB6, 0x000BB7, 0x000BB0, 0x000BB1, 0x000BB2, 0x000BB3, 0x000B8E, 0x000B8F, + 0x000B88, 0x000B89, 0x000B8A, 0x000B85, 0x000B86, 0x000B87, 0x000B83, 0x000B9C, + 0x000B9E, 0x000B9F, 0x000B99, 0x000B9A, 0x000B94, 0x000B95, 0x000B90, 0x000B92, + 0x000B93, 0x000868, 0x000869, 0x00A7FD, 0x000866, 0x000867, 0x000862, 0x000863, + 0x00A7F7, 0x00084C, 0x00084D, 0x00084E, 0x00084F, 0x000848, 0x000849, 0x00084A, + 0x00084B, 0x000844, 0x00AA04, 0x00AA0A, 0x000845, 0x000846, 0x00AA05, 0x000847, + 0x000840, 0x000841, 0x000842, 0x000843, 0x000858, 0x00A7AC, 0x00A7AD, 0x000855, + 0x00A7A6, 0x00A7A7, 0x00A7A0, 0x00A7A1, 0x00A7A2, 0x00A7A3, 0x00A7B4, 0x00A7B5, + 0x00A7B6, 0x00A7B7, 0x00A7B0, 0x00A7B1, 0x00A7B2, 0x00A7B3, 0x00A78C, 0x00A78D, + 0x00A78E, 0x00A78F, 0x00A78B, 0x00A784, 0x00A785, 0x00A796, 0x00A797, 0x00A790, + 0x00A791, 0x00A792, 0x00A793, 0x00A46C, 0x00A46D, 0x00A468, 0x00A469, 0x00A466, + 0x00A467, 0x00A460, 0x00A461, 0x00A462, 0x00A463, 0x00A47C, 0x00A47D, 0x00A47E, + 0x00A47F, 0x00A478, 0x00A479, 0x00A47A, 0x00A47B, 0x00A474, 0x00A475, 0x00A476, + 0x00A477, 0x00A470, 0x00A471, 0x00A472, 0x00A473, 0x00A44C, 0x00A44D, 0x00A44E, + 0x00A44F, 0x00A448, 0x00A449, 0x00A44A, 0x00A44B, 0x00A444, 0x00A445, 0x00A446, + 0x00A447, 0x00A440, 0x00A441, 0x00A442, 0x00A443, 0x00A45C, 0x00A45D, 0x00A45E, + 0x00A45F, 0x00A458, 0x00A459, 0x00A45A, 0x00A45B, 0x00A454, 0x00A455, 0x00A456, + 0x00A457, 0x00A450, 0x00A451, 0x00A452, 0x00A453, 0x00A42C, 0x00A42D, 0x00A42E, + 0x00A42F, 0x00A428, 0x00A429, 0x00A42A, 0x00A42B, 0x00A424, 0x00A425, 0x00A430, + 0x00A431, 0x00A40F, 0x00A406, 0x00A407, 0x00A400, 0x00A401, 0x00A402, 0x00A403, + 0x00A41C, 0x00A41D, 0x00A41E, 0x00A41F, 0x00A418, 0x00A419, 0x00A41A, 0x00A41B, + 0x00A414, 0x00A415, 0x00A416, 0x00A417, 0x00A410, 0x00A411, 0x00A412, 0x00A413, + 0x00A4EC, 0x00A4ED, 0x00A4EE, 0x00A4EF, 0x00A4E8, 0x00A4E9, 0x00A4EA, 0x00A4EB, + 0x00A4E4, 0x00A4E5, 0x00096A, 0x00096B, 0x000966, 0x000967, 0x000960, 0x000961, + 0x00A4F4, 0x00A4F5, 0x00097A, 0x00097B, 0x000974, 0x000975, 0x000976, 0x000977, + 0x000972, 0x000973, 0x00A4DC, 0x00A4DD, 0x00A4DE, 0x00A4DF, 0x00A4D8, 0x00A4D9, + 0x00A4DA, 0x00A4DB, 0x00A4D4, 0x00A4D5, 0x00095A, 0x00095B, 0x000950, 0x00092C, + 0x00092D, 0x00092E, 0x00092F, 0x000928, 0x000929, 0x00092A, 0x00092B, 0x000924, + 0x000925, 0x000926, 0x000927, 0x000920, 0x000921, 0x000922, 0x000923, 0x00093D, + 0x000938, 0x000939, 0x00A48C, 0x000934, 0x000935, 0x00090A, 0x00090B, 0x000904, + 0x000905, 0x000906, 0x000907, 0x00091C, 0x00091D, 0x00091E, 0x00091F, 0x000918, + 0x000919, 0x00A57E, 0x00A57F, 0x00A574, 0x00A575, 0x00A577, 0x00A570, 0x00A571, + 0x00A54C, 0x00A54D, 0x00A544, 0x00A545, 0x00A546, 0x00A547, 0x00A541, 0x00A542, + 0x00A543, 0x00A55C, 0x00A55D, 0x00A55E, 0x00A55F, 0x00A558, 0x00A559, 0x00A55A, + 0x00A55B, 0x002460, 0x00A554, 0x00A555, 0x00A550, 0x002464, 0x002467, 0x00A552, + 0x002469, 0x002468, 0x00246B, 0x00246A, 0x00246D, 0x00246C, 0x00246F, 0x00246E, + 0x00A553, 0x002470, 0x00A52C, 0x00A52D, 0x002475, 0x002474, 0x002477, 0x002476, + 0x002479, 0x002478, 0x00247B, 0x00247A, 0x00247D, 0x00A52E, 0x00247F, 0x00247E, + 0x00A52F, 0x00A528, 0x00A529, 0x00A52A, 0x00A52B, 0x00A524, 0x00A525, 0x00A523, + 0x00A536, 0x00A530, 0x00A531, 0x00A50C, 0x00A50D, 0x00A50E, 0x00A50F, 0x00A50B, + 0x00A505, 0x00A507, 0x00A500, 0x00A51E, 0x00A51B, 0x00A514, 0x00A515, 0x00A5EB, + 0x00A5E4, 0x00A5E6, 0x00A5E7, 0x00A5FC, 0x00A5FD, 0x00A5CA, 0x00A5C6, 0x00A5C7, + 0x00A5C0, 0x00A5C1, 0x00A5DD, 0x00A5DA, 0x00A5D6, 0x00A5D7, 0x00A5D0, 0x00A5D1, + 0x00A5D2, 0x00A5D3, 0x00A5AC, 0x00A5AD, 0x00A5AE, 0x00A5AF, 0x00A5A8, 0x00A5A9, + 0x00A5AA, 0x00A5AB, 0x00A5A4, 0x00A5A5, 0x00A586, 0x00A587, 0x00A580, 0x00A581, + 0x00A582, 0x00A583, 0x00A59C, 0x00A59D, 0x00A59E, 0x00A59F, 0x00A598, 0x00A599, + 0x00A59A, 0x00A59B, 0x00A594, 0x00A595, 0x00A596, 0x00A597, 0x00A590, 0x00A591, + 0x00A592, 0x00A593, 0x00A26C, 0x00A26D, 0x00A26E, 0x00A26F, 0x00A268, 0x00A269, + 0x00A26A, 0x00A26B, 0x00A264, 0x00A265, 0x00A266, 0x00A267, 0x00A262, 0x00A263, + 0x00A27C, 0x00A27D, 0x00A27E, 0x00A27F, 0x00A278, 0x00A279, 0x00A27A, 0x00A27B, + 0x00A274, 0x00A275, 0x00A277, 0x00A270, 0x00A256, 0x00A257, 0x00A250, 0x00A251, + 0x00A252, 0x00A253, 0x00A22C, 0x00A22D, 0x00A22E, 0x0024EC, 0x00A228, 0x00A229, + 0x00A2C6, 0x0024F0, 0x00A2C2, 0x00A2C3, 0x0024F5, 0x0024F4, 0x0024F7, 0x0024F6, + 0x0024F9, 0x0024F8, 0x0024FB, 0x0024FA, 0x0024FD, 0x00A2DC, 0x0024FF, 0x0024FE, + 0x00A2DD, 0x00A2DE, 0x00A2DF, 0x00A2D8, 0x00A2D9, 0x00A2DA, 0x00A2DB, 0x00A2D4, + 0x00A2D5, 0x00A2B6, 0x00A2B7, 0x00A2B0, 0x00A2B1, 0x00A2B2, 0x00A2B3, 0x00A28C, + 0x00A28D, 0x00A28E, 0x00A28F, 0x00A288, 0x00A289, 0x00A28A, 0x00A28B, 0x00A284, + 0x00A285, 0x00A286, 0x00A287, 0x00A280, 0x00A281, 0x00A282, 0x00A283, 0x00A29C, + 0x00A29D, 0x00A29E, 0x00A29F, 0x00A298, 0x00A299, 0x00A29A, 0x00A29B, 0x00A294, + 0x014628, 0x00A295, 0x00A36B, 0x00A366, 0x00A367, 0x00A360, 0x00A361, 0x00A37D, + 0x00A376, 0x00A377, 0x00A370, 0x00A371, 0x00A372, 0x00A373, 0x00A34C, 0x00A34D, + 0x00A34E, 0x00A34F, 0x00A348, 0x00A349, 0x00A34A, 0x00A34B, 0x00A344, 0x00A345, + 0x00A326, 0x00A327, 0x00A320, 0x00A321, 0x00A322, 0x00A323, 0x00A33C, 0x00A33D, + 0x00A338, 0x014629, 0x00A339, 0x00A336, 0x00A337, 0x00A330, 0x00A331, 0x00A332, + 0x00A333, 0x00A30C, 0x00A30D, 0x011005, 0x00A30E, 0x00A30F, 0x011006, 0x011009, + 0x011008, 0x00A308, 0x01100A, 0x01100D, 0x01100C, 0x01100F, 0x01100E, 0x00A309, + 0x00A30A, 0x00A304, 0x00A305, 0x00A002, 0x00A003, 0x00A01E, 0x00A01F, 0x00A018, + 0x00A019, 0x00A014, 0x00A0FA, 0x00A0D6, 0x00A0D7, 0x00A0D0, 0x00A0D1, 0x00A0D2, + 0x00A0D3, 0x00A0AC, 0x00A0AD, 0x00A0A9, 0x00A08A, 0x00A166, 0x00A167, 0x00A160, + 0x00A161, 0x00A17D, 0x00A176, 0x00A177, 0x00A170, 0x00A171, 0x00A172, 0x00A173, + 0x00A14C, 0x011033, 0x00A14D, 0x00A14E, 0x00A14F, 0x00A148, 0x00A149, 0x00A145, + 0x00A146, 0x00A147, 0x00A140, 0x00A141, 0x00A142, 0x00A143, 0x00A15C, 0x00A15D, + 0x00A15E, 0x00A15F, 0x00A158, 0x00A159, 0x00A15A, 0x00A15B, 0x00A154, 0x00A155, + 0x00A126, 0x00A127, 0x00A120, 0x00A121, 0x00A122, 0x00A123, 0x00A13C, 0x00A13D, + 0x00A13E, 0x00A13F, 0x00A138, 0x00A139, 0x00A13A, 0x00A13B, 0x00A134, 0x00A135, + 0x00A136, 0x00A137, 0x00A130, 0x00A131, 0x00A132, 0x00A133, 0x00A10C, 0x00A10D, + 0x00A10E, 0x00A10F, 0x00A108, 0x00A109, 0x00A10A, 0x00A10B, 0x00A104, 0x00A105, + 0x00A106, 0x00A107, 0x00A100, 0x00A101, 0x00A102, 0x00A103, 0x00A11C, 0x00A11D, + 0x00A116, 0x00A117, 0x00A110, 0x00A111, 0x00A112, 0x00A113, 0x00A1EC, 0x00A1ED, + 0x00A1EE, 0x00A1EF, 0x00A1E8, 0x00A1E9, 0x00A1EA, 0x00A1EB, 0x00A1E4, 0x00A1E5, + 0x00021A, 0x00021B, 0x000214, 0x000215, 0x000216, 0x000217, 0x000210, 0x000211, + 0x000212, 0x000213, 0x0002AC, 0x0002AD, 0x0002AE, 0x0002AF, 0x0002A8, 0x0002A9, + 0x0002AA, 0x0002AB, 0x0002A4, 0x0002A5, 0x0002A6, 0x0002A7, 0x0002A0, 0x0002A1, + 0x0002A2, 0x0002A3, 0x00028C, 0x00028D, 0x00028E, 0x00028F, 0x000288, 0x000289, + 0x00028A, 0x00028B, 0x000284, 0x000285, 0x000286, 0x000287, 0x000280, 0x000281, + 0x000282, 0x000283, 0x00029C, 0x00029D, 0x00029E, 0x00029F, 0x000298, 0x000299, + 0x00029A, 0x00029B, 0x000294, 0x000295, 0x000296, 0x000297, 0x000290, 0x000291, + 0x000292, 0x000293, 0x00037C, 0x00037D, 0x00037F, 0x00037B, 0x000376, 0x000377, + 0x000370, 0x000371, 0x000372, 0x000373, 0x01D66C, 0x01D66D, 0x01D66E, 0x01D66F, + 0x01D668, 0x01D669, 0x01D66A, 0x01D66B, 0x01D664, 0x01D665, 0x01D666, 0x01D667, + 0x01D660, 0x01D661, 0x01D662, 0x01D663, 0x01D67C, 0x01D67D, 0x01D67E, 0x01D67F, + 0x01D678, 0x01D679, 0x01D67A, 0x01D67B, 0x01D674, 0x01D675, 0x01D676, 0x01D677, + 0x01D670, 0x01D671, 0x01D654, 0x01D600, 0x01D613, 0x01D6E9, 0x01D6EA, 0x01D6EB, + 0x01D6E5, 0x01D6E6, 0x01D6E7, 0x01D6E0, 0x01D6E1, 0x000395, 0x01D6C6, 0x000063, + 0x01D6C2, 0x01D6C3, 0x01D6DC, 0x01D6DD, 0x01D6D9, 0x000075, 0x000041, 0x01D6A2, + 0x01D6A3, 0x01D6BC, 0x01D6BD, 0x01D6B9, 0x01D6B2, 0x01D6B3, 0x01D68C, 0x01D68D, + 0x01D68E, 0x01D68F, 0x01D688, 0x011105, 0x011104, 0x011107, 0x011106, 0x011109, + 0x011108, 0x01110B, 0x01110A, 0x01110D, 0x01110C, 0x01110F, 0x01110E, 0x01D689, + 0x01D68A, 0x01D68B, 0x01D684, 0x01D685, 0x01D686, 0x01D687, 0x01D680, 0x01D681, + 0x01D682, 0x01D683, 0x01D69C, 0x01D69D, 0x01D698, 0x01D699, 0x01D692, 0x011121, + 0x011120, 0x011123, 0x011122, 0x01D693, 0x01D76C, 0x01D76D, 0x01D76E, 0x01D768, + 0x01D769, 0x01D76A, 0x01D76B, 0x01D764, 0x01D765, 0x01D766, 0x01D767, 0x01D760, + 0x01D761, 0x01D762, 0x01D763, 0x01D77C, 0x01D77D, 0x011137, 0x011136, 0x011139, + 0x011138, 0x01113B, 0x01113A, 0x01113D, 0x01113C, 0x01113F, 0x01113E, 0x01D77E, + 0x01D77F, 0x01D778, 0x01D779, 0x01D77A, 0x01D77B, 0x01D774, 0x01D775, 0x01D776, + 0x01D777, 0x01D770, 0x01D771, 0x0000E9, 0x01D755, 0x01D732, 0x01D733, 0x011151, + 0x011150, 0x01D70C, 0x011152, 0x011155, 0x011154, 0x011157, 0x011156, 0x011159, + 0x011158, 0x01115B, 0x01115A, 0x01115D, 0x01115C, 0x01115F, 0x01115E, 0x01D70D, + 0x01D70E, 0x01D70F, 0x01D709, 0x01D70A, 0x01D70B, 0x01D704, 0x01D705, 0x01D706, + 0x01D707, 0x01D700, 0x01D701, 0x01D71D, 0x01D71E, 0x01D719, 0x01D71A, 0x01D714, + 0x01D716, 0x01D717, 0x01E924, 0x01E925, 0x01D712, 0x01E927, 0x01D713, 0x01D7EC, + 0x01D7ED, 0x01D7EE, 0x01D7EF, 0x01D7E8, 0x01D7E9, 0x01D7EA, 0x01D7EB, 0x01D7E4, + 0x01D7E5, 0x01D7E6, 0x01D7E7, 0x011185, 0x011184, 0x011187, 0x011186, 0x011189, + 0x011188, 0x01118B, 0x01118A, 0x01118D, 0x01118C, 0x01118F, 0x01118E, 0x01D7E0, + 0x01D7E1, 0x01D7E2, 0x01D7E3, 0x01D7FC, 0x01D7FD, 0x01D7FE, 0x01D7FF, 0x01D7F8, + 0x01D7F9, 0x01D7FA, 0x01D7FB, 0x01D7F4, 0x01D7F5, 0x01D7F6, 0x01D7F7, 0x01D7F0, + 0x01D7F1, 0x0111A3, 0x00016E, 0x00016F, 0x00017D, 0x00014B, 0x00012B, 0x0001F7, + 0x01D4F2, 0x01D4F3, 0x01D4CC, 0x01D4CD, 0x01D4CE, 0x01D4CF, 0x01D4C8, 0x01D4C9, + 0x01D4CA, 0x01D4CB, 0x01D4C5, 0x01D4C6, 0x01D4C7, 0x01D4C0, 0x01D4C1, 0x01D4C2, + 0x01D4C3, 0x01D4DC, 0x01D4DD, 0x01D4DE, 0x01D4DF, 0x01D4D8, 0x01D4D9, 0x01D4DA, + 0x01D4DB, 0x01D4D4, 0x01D4D5, 0x01D4D6, 0x01D4D7, 0x01D4D0, 0x01D4D1, 0x01D4D2, + 0x01D4D3, 0x01D4AC, 0x01D4AE, 0x01D4AF, 0x01D4A9, 0x01D4AA, 0x01D4AB, 0x01D4A5, + 0x01D4A6, 0x01D4A2, 0x01D4BD, 0x01D4BE, 0x01D4BF, 0x01D4B8, 0x01D4B9, 0x01D4BB, + 0x01D4B4, 0x01D4B5, 0x01D4B6, 0x01D4B7, 0x01D4B0, 0x01D4B1, 0x01D4B2, 0x01D4B3, + 0x01D48C, 0x01D48D, 0x01D48E, 0x01D48F, 0x01D488, 0x01D489, 0x01D48A, 0x01D48B, + 0x01D484, 0x01D485, 0x01D486, 0x01D487, 0x01D480, 0x01D481, 0x01D482, 0x01D483, + 0x01D49C, 0x01D49E, 0x01D49F, 0x01D498, 0x01D499, 0x01D49A, 0x01D49B, 0x01D494, + 0x01D495, 0x01D496, 0x01D497, 0x01D490, 0x01D491, 0x01D492, 0x01D493, 0x01D56C, + 0x01D56D, 0x01D56E, 0x01D56F, 0x01D568, 0x01D569, 0x01D56A, 0x01D56B, 0x01D564, + 0x01D565, 0x01D566, 0x01D567, 0x01D560, 0x01D561, 0x01D562, 0x01D563, 0x01D57C, + 0x01D57D, 0x01D57E, 0x01D57F, 0x01D578, 0x01D579, 0x01D57A, 0x01D57B, 0x01D574, + 0x01D575, 0x01D576, 0x01D577, 0x01D570, 0x01D571, 0x01D572, 0x01D573, 0x01D54C, + 0x01D54D, 0x01D54E, 0x01D54F, 0x01D54A, 0x01D54B, 0x01D544, 0x002777, 0x002776, + 0x002779, 0x002778, 0x00277B, 0x00277A, 0x00277D, 0x00277C, 0x00277F, 0x00277E, + 0x002781, 0x002780, 0x002783, 0x002782, 0x002785, 0x002784, 0x002787, 0x002786, + 0x002789, 0x002788, 0x00278B, 0x00278A, 0x00278D, 0x01D546, 0x00278F, 0x00278E, + 0x002791, 0x01D540, 0x002793, 0x002792, 0x01D541, 0x01D542, 0x01D543, 0x01D55C, + 0x01D55D, 0x01D55E, 0x01D55F, 0x01D558, 0x01D559, 0x01D55A, 0x01D55B, 0x01D554, + 0x01D555, 0x01D556, 0x01D557, 0x01D550, 0x01D552, 0x01D553, 0x01D52C, 0x01D52D, + 0x01D52E, 0x01D52F, 0x01D528, 0x01D529, 0x01D52A, 0x01D52B, 0x01D524, 0x01D525, + 0x01D526, 0x01D527, 0x01E914, 0x01D520, 0x01D521, 0x01E917, 0x01D522, 0x01D523, + 0x01D53C, 0x01D53D, 0x01D53E, 0x01E91D, 0x01D538, 0x01D539, 0x01D53B, 0x01D534, + 0x01D535, 0x01D536, 0x01D537, 0x01D530, 0x01D531, 0x01D532, 0x01D533, 0x01D50D, + 0x01D50E, 0x01D50F, 0x01D508, 0x01D509, 0x01D50A, 0x01D504, 0x01D505, 0x01D507, + 0x01D500, 0x01D501, 0x01D502, 0x01E935, 0x01D503, 0x01D51C, 0x01D51E, 0x01D51F, + 0x01D518, 0x01D519, 0x01D51A, 0x01D51B, 0x01D514, 0x01D516, 0x01D517, 0x01D510, + 0x01D511, 0x01D512, 0x01D513, 0x01D5EC, 0x01D5ED, 0x01D5EE, 0x01D5EF, 0x01D5E8, + 0x01D5E9, 0x01D5EA, 0x01D5EB, 0x01D5E4, 0x01D5E5, 0x01D5E6, 0x01D5E7, 0x01D5E0, + 0x01D5E1, 0x01D5E2, 0x01D5E3, 0x01D5FC, 0x01D5FD, 0x01D5FE, 0x01D5FF, 0x01D5F8, + 0x01D5F9, 0x01D5FA, 0x01D5FB, 0x01D5F4, 0x01D5F5, 0x01D5F6, 0x01D5F7, 0x01D5F0, + 0x01D5F1, 0x01D5F2, 0x01D5F3, 0x01D5CC, 0x01D5CD, 0x01D5CE, 0x01D5CF, 0x01D5C8, + 0x01D5C9, 0x01D5CA, 0x01D5CB, 0x01D5C4, 0x01D5C5, 0x01D5C6, 0x01D5C7, 0x01D5C0, + 0x01D5C1, 0x01D5C2, 0x01D5C3, 0x01D5DC, 0x01D5DD, 0x01D5DE, 0x01D5DF, 0x01D5D8, + 0x01D5D9, 0x01D5DA, 0x01D5DB, 0x01D5D4, 0x01D5D5, 0x01D5D6, 0x01D5D7, 0x01D5D0, + 0x01D5D1, 0x01D5D2, 0x01D5D3, 0x01D5AC, 0x01D5AD, 0x01D5AE, 0x01D5AF, 0x01D5A8, + 0x01D5A9, 0x01D5AA, 0x01D5AB, 0x01D5A4, 0x01D5A5, 0x01D5A6, 0x01D5A7, 0x01D5A0, + 0x01D5A1, 0x01D5A2, 0x01D5A3, 0x01D5BC, 0x01D5BD, 0x01D5BE, 0x01D5BF, 0x01D5B8, + 0x01D5B9, 0x01D5BA, 0x01D5BB, 0x01D5B4, 0x01D5B5, 0x01D5B6, 0x01D5B7, 0x01D5B0, + 0x01D5B1, 0x01D5B2, 0x01D5B3, 0x01D58C, 0x01D58D, 0x01D58E, 0x01D58F, 0x01D588, + 0x01D589, 0x01D58A, 0x01D58B, 0x01D584, 0x01D585, 0x01E8AF, 0x01D586, 0x01D587, + 0x01D580, 0x01D581, 0x01D582, 0x01D583, 0x01D59C, 0x01D59D, 0x01D59E, 0x01D59F, + 0x01D598, 0x01D599, 0x01D59A, 0x01D59B, 0x01D594, 0x01D595, 0x01D596, 0x01D597, + 0x01D590, 0x01D591, 0x01D592, 0x01D593, 0x01D36C, 0x01D36D, 0x01D36E, 0x01D36F, + 0x01D368, 0x01D369, 0x01D36A, 0x01D36B, 0x01D364, 0x01D365, 0x01D366, 0x01D367, + 0x01D360, 0x01D361, 0x01D362, 0x01D363, 0x01D370, 0x01D371, 0x01342C, 0x01342D, + 0x01342E, 0x013428, 0x013429, 0x01342A, 0x01342B, 0x013424, 0x013425, 0x013426, + 0x013427, 0x013420, 0x013421, 0x013422, 0x013423, 0x01340C, 0x01340D, 0x01340E, + 0x01340F, 0x013408, 0x013409, 0x01340A, 0x01340B, 0x013404, 0x013405, 0x013406, + 0x013407, 0x013400, 0x013401, 0x013402, 0x013403, 0x01341C, 0x01341D, 0x01341E, + 0x01341F, 0x013418, 0x013419, 0x01341A, 0x01341B, 0x013414, 0x013415, 0x013416, + 0x013417, 0x013410, 0x013411, 0x013412, 0x013413, 0x01326C, 0x01326D, 0x01326E, + 0x01326F, 0x013268, 0x013269, 0x01326A, 0x01326B, 0x013264, 0x013265, 0x013266, + 0x013267, 0x013260, 0x013261, 0x013262, 0x013263, 0x01327C, 0x01327D, 0x01327E, + 0x01327F, 0x013278, 0x013279, 0x01327A, 0x01327B, 0x013274, 0x013275, 0x013276, + 0x013277, 0x013270, 0x013271, 0x013272, 0x013273, 0x01324C, 0x01324D, 0x01324E, + 0x01324F, 0x013248, 0x013249, 0x01324A, 0x01324B, 0x013244, 0x013245, 0x013246, + 0x013247, 0x013240, 0x013241, 0x013242, 0x013243, 0x01325C, 0x01325D, 0x01325E, + 0x01325F, 0x013258, 0x013259, 0x01B012, 0x01B013, 0x01325A, 0x01325B, 0x013254, + 0x013255, 0x01B010, 0x01B011, 0x013256, 0x013257, 0x013250, 0x013251, 0x01B016, + 0x01B017, 0x013252, 0x013253, 0x01322C, 0x01322D, 0x01322E, 0x01322F, 0x01B014, + 0x01B015, 0x013228, 0x013229, 0x01322A, 0x01322B, 0x013224, 0x013225, 0x013226, + 0x013227, 0x01B039, 0x01B03E, 0x01B038, 0x01B03F, 0x01B034, 0x01B035, 0x01B024, + 0x01B025, 0x01B02A, 0x01B02B, 0x01B03A, 0x01B03B, 0x01B01C, 0x01B02F, 0x01B03D, + 0x01B02E, 0x01B01A, 0x01B019, 0x01B01B, 0x01B018, 0x01B01E, 0x01B002, 0x01B01F, + 0x01B003, 0x01B000, 0x01B001, 0x01B028, 0x01B029, 0x013220, 0x01B01D, 0x01B006, + 0x01B007, 0x013221, 0x013222, 0x013223, 0x01323C, 0x01323D, 0x01323E, 0x01323F, + 0x013238, 0x013239, 0x01323A, 0x01323B, 0x013234, 0x013235, 0x013236, 0x013237, + 0x013230, 0x013231, 0x013232, 0x01B053, 0x01B052, 0x013233, 0x01320C, 0x01320D, + 0x01320E, 0x01B059, 0x01320F, 0x01B05E, 0x013208, 0x013209, 0x01B05F, 0x01320A, + 0x01320B, 0x01B020, 0x01B021, 0x01B022, 0x01B023, 0x01B065, 0x01B064, 0x01B026, + 0x01B027, 0x01B069, 0x01B068, 0x01B06B, 0x01B06A, 0x01B06D, 0x01B06C, 0x01B06F, + 0x01B06E, 0x013204, 0x013205, 0x013206, 0x013207, 0x013200, 0x013201, 0x013202, + 0x013203, 0x01321C, 0x01321D, 0x01321E, 0x01321F, 0x01B03C, 0x013218, 0x013219, + 0x01321A, 0x01321B, 0x013214, 0x013215, 0x013216, 0x013217, 0x013210, 0x011411, + 0x011410, 0x011413, 0x011412, 0x011415, 0x011414, 0x011417, 0x011416, 0x013211, + 0x013212, 0x01141B, 0x01141A, 0x013213, 0x0132EC, 0x0132ED, 0x0132EE, 0x0132EF, + 0x0132E8, 0x0132E9, 0x0132EA, 0x0132EB, 0x0132E4, 0x0132E5, 0x0132E6, 0x0132E7, + 0x0132E0, 0x0132E1, 0x0132E2, 0x0132E3, 0x0132FC, 0x0132FD, 0x0132FE, 0x0132FF, + 0x0132F8, 0x0132F9, 0x0132FA, 0x0132FB, 0x0132F4, 0x0132F5, 0x0132F6, 0x0132F7, + 0x0132F0, 0x0132F1, 0x0132F2, 0x0132F3, 0x0132CC, 0x0132CD, 0x0132CE, 0x0132CF, + 0x0132C8, 0x0132C9, 0x0132CA, 0x0132CB, 0x0132C4, 0x0132C5, 0x0132C6, 0x0132C7, + 0x0132C0, 0x0132C1, 0x0132C2, 0x0132C3, 0x0132DC, 0x0132DD, 0x0132DE, 0x0132DF, + 0x0132D8, 0x0132D9, 0x0132DA, 0x0132DB, 0x0132D4, 0x0132D5, 0x0132D6, 0x0132D7, + 0x0132D0, 0x0132D1, 0x0132D2, 0x0132D3, 0x0132AC, 0x0132AD, 0x0132AE, 0x0132AF, + 0x0132A8, 0x0132A9, 0x0132AA, 0x0132AB, 0x0132A4, 0x0132A5, 0x0132A6, 0x0132A7, + 0x0132A0, 0x0132A1, 0x0132A2, 0x01B0EE, 0x01B0EF, 0x01B0E5, 0x01B0E4, 0x0132A3, + 0x0132BC, 0x01B0E9, 0x01B0E8, 0x0132BD, 0x0132BE, 0x0132BF, 0x0132B8, 0x01B0EA, + 0x01B0EB, 0x0132B9, 0x0132BA, 0x0132BB, 0x0132B4, 0x0132B5, 0x0132B6, 0x011482, + 0x011483, 0x01B0EC, 0x01B0ED, 0x01149C, 0x01149D, 0x01149E, 0x01149F, 0x011498, + 0x011499, 0x01B101, 0x01B100, 0x01B103, 0x01B102, 0x01149A, 0x01149B, 0x01B107, + 0x01B106, 0x011493, 0x011492, 0x011490, 0x011491, 0x011497, 0x011496, 0x011494, + 0x011495, 0x01B111, 0x01B110, 0x01B113, 0x01B112, 0x01B115, 0x01B114, 0x01B117, + 0x01B116, 0x01B119, 0x01B118, 0x01B11B, 0x01B11A, 0x01B11D, 0x01B11C, 0x011481, + 0x01B11E, 0x011480, 0x01148B, 0x011485, 0x011486, 0x011484, 0x011487, 0x0114A0, + 0x0114A1, 0x0114A2, 0x0114A3, 0x01148C, 0x01148D, 0x01148E, 0x01148F, 0x0114AB, + 0x0114A5, 0x01148A, 0x0114A4, 0x0114A6, 0x011489, 0x0114A7, 0x011488, 0x0114C4, + 0x0132B7, 0x0132B0, 0x0132B1, 0x0114D6, 0x0114D7, 0x0114C7, 0x0114C5, 0x0132B2, + 0x0132B3, 0x01328C, 0x01328D, 0x01328E, 0x01328F, 0x013288, 0x013289, 0x0114D2, + 0x0114D3, 0x0114D0, 0x0114D1, 0x01328A, 0x0114D4, 0x01328B, 0x0114D5, 0x0114D9, + 0x0114D8, 0x013284, 0x013285, 0x013286, 0x013287, 0x013280, 0x013281, 0x013282, + 0x013283, 0x01329C, 0x01329D, 0x01329E, 0x01329F, 0x013298, 0x013299, 0x0114A8, + 0x0114A9, 0x0114AA, 0x01329A, 0x0114AC, 0x0114AD, 0x0114AE, 0x0114AF, 0x01329B, + 0x013294, 0x013295, 0x013296, 0x013297, 0x013290, 0x013291, 0x013292, 0x013293, + 0x01336C, 0x01336D, 0x01336E, 0x01336F, 0x013368, 0x013369, 0x01336A, 0x01336B, + 0x013364, 0x013365, 0x013366, 0x013367, 0x013360, 0x013361, 0x013362, 0x013363, + 0x01337C, 0x01337D, 0x01337E, 0x01337F, 0x013378, 0x013379, 0x01337A, 0x01337B, + 0x013374, 0x013375, 0x013376, 0x013377, 0x013370, 0x013371, 0x013372, 0x013373, + 0x01334C, 0x01334D, 0x01334E, 0x01334F, 0x013348, 0x013349, 0x01334A, 0x01334B, + 0x013344, 0x013345, 0x013346, 0x013347, 0x013340, 0x013341, 0x013342, 0x013343, + 0x01335C, 0x01335D, 0x01335E, 0x01335F, 0x013358, 0x013359, 0x01335A, 0x01335B, + 0x013354, 0x013355, 0x013356, 0x013357, 0x013350, 0x013351, 0x013352, 0x013353, + 0x01332C, 0x01332D, 0x01332E, 0x01332F, 0x013328, 0x013329, 0x01332A, 0x01332B, + 0x013324, 0x013325, 0x013326, 0x013327, 0x013320, 0x013321, 0x013322, 0x013323, + 0x01333C, 0x01333D, 0x01333E, 0x01333F, 0x013338, 0x013339, 0x01333A, 0x01333B, + 0x013334, 0x013335, 0x013336, 0x013337, 0x013330, 0x013331, 0x013332, 0x013333, + 0x01330C, 0x01330D, 0x01330E, 0x01330F, 0x013308, 0x013309, 0x01330A, 0x01330B, + 0x013304, 0x013305, 0x013306, 0x013307, 0x013300, 0x013301, 0x013302, 0x013303, + 0x01331C, 0x01331D, 0x01331E, 0x01331F, 0x013318, 0x013319, 0x01331A, 0x01331B, + 0x013314, 0x013315, 0x013316, 0x013317, 0x013310, 0x013311, 0x013312, 0x013313, + 0x0133EC, 0x0133ED, 0x0133EE, 0x0133EF, 0x0133E8, 0x0133E9, 0x0133EA, 0x011581, + 0x011580, 0x011583, 0x011582, 0x0133EB, 0x011584, 0x011587, 0x011586, 0x011589, + 0x011588, 0x01158B, 0x01158A, 0x01158D, 0x01158C, 0x01158F, 0x01158E, 0x0133E4, + 0x0133E5, 0x0133E6, 0x0133E7, 0x0133E0, 0x0133E1, 0x0133E2, 0x0133E3, 0x011599, + 0x011598, 0x0133FC, 0x0133FD, 0x01159D, 0x01159C, 0x01159F, 0x01159E, 0x0133FE, + 0x0133FF, 0x0133F8, 0x0133F9, 0x0133FA, 0x0133FB, 0x0133F4, 0x0133F5, 0x0133F6, + 0x0133F7, 0x0133F0, 0x0133F1, 0x0133F2, 0x0133F3, 0x0133CC, 0x0133CD, 0x0133CE, + 0x0133CF, 0x0133C8, 0x0133C9, 0x0133CA, 0x0133CB, 0x0133C4, 0x0133C5, 0x0133C6, + 0x0133C7, 0x0133C0, 0x0133C1, 0x0133C2, 0x0133C3, 0x0133DC, 0x0133DD, 0x0133DE, + 0x0133DF, 0x0133D8, 0x0133D9, 0x0133DA, 0x0133DB, 0x0133D4, 0x0133D5, 0x0133D6, + 0x0133D7, 0x0133D0, 0x0133D1, 0x0133D2, 0x0133D3, 0x0133AC, 0x0133AD, 0x0133AE, + 0x0133AF, 0x0133A8, 0x0133A9, 0x0133AA, 0x0133AB, 0x0133A4, 0x0133A5, 0x0133A6, + 0x0133A7, 0x0133A0, 0x0133A1, 0x0133A2, 0x0133A3, 0x0133BC, 0x0133BD, 0x0133BE, + 0x0133BF, 0x0133B8, 0x0133B9, 0x0133BA, 0x0133BB, 0x0133B4, 0x0133B5, 0x0133B6, + 0x0133B7, 0x0133B0, 0x0133B1, 0x0133B2, 0x0133B3, 0x01338C, 0x01338D, 0x01338E, + 0x01338F, 0x013388, 0x013389, 0x01338A, 0x01338B, 0x013384, 0x013385, 0x013386, + 0x013387, 0x013380, 0x013381, 0x013382, 0x013383, 0x01339C, 0x01339D, 0x01339E, + 0x01339F, 0x011603, 0x013398, 0x013399, 0x01339A, 0x01339B, 0x013394, 0x013395, + 0x013396, 0x013397, 0x013390, 0x013391, 0x013392, 0x013393, 0x01306C, 0x011611, + 0x011610, 0x011613, 0x011612, 0x011615, 0x011614, 0x011617, 0x011616, 0x011619, + 0x011618, 0x01161B, 0x01161A, 0x01161D, 0x01161C, 0x01161F, 0x01161E, 0x011621, + 0x011620, 0x01306D, 0x011622, 0x011625, 0x011624, 0x011627, 0x011626, 0x011629, + 0x011628, 0x01162B, 0x01162A, 0x01162D, 0x01162C, 0x01162F, 0x01162E, 0x01306E, + 0x01306F, 0x013068, 0x013069, 0x01306A, 0x01306B, 0x013064, 0x013065, 0x013066, + 0x013067, 0x013060, 0x013061, 0x013062, 0x013063, 0x01307C, 0x01307D, 0x01307E, + 0x01307F, 0x013078, 0x013079, 0x01307A, 0x011644, 0x01307B, 0x013074, 0x013075, + 0x013076, 0x013077, 0x013070, 0x013071, 0x013072, 0x013073, 0x01304C, 0x011651, + 0x011650, 0x011653, 0x011652, 0x011655, 0x011654, 0x011657, 0x011656, 0x011659, + 0x011658, 0x01304D, 0x01304E, 0x01304F, 0x013048, 0x013049, 0x01304A, 0x01304B, + 0x013044, 0x013045, 0x013046, 0x013047, 0x013040, 0x013041, 0x013042, 0x013043, + 0x01305C, 0x01305D, 0x01305E, 0x01305F, 0x013058, 0x013059, 0x01305A, 0x01305B, + 0x013054, 0x013055, 0x013056, 0x013057, 0x013050, 0x013051, 0x013052, 0x013053, + 0x01302C, 0x01302D, 0x01302E, 0x01302F, 0x013028, 0x013029, 0x01302A, 0x01302B, + 0x013024, 0x011683, 0x013025, 0x013026, 0x013027, 0x013020, 0x013021, 0x013022, + 0x013023, 0x01303C, 0x01303D, 0x01303E, 0x01303F, 0x013038, 0x013039, 0x011691, + 0x011690, 0x011693, 0x011692, 0x011695, 0x011694, 0x011697, 0x01303A, 0x011699, + 0x011698, 0x01169B, 0x01169A, 0x01169D, 0x01169C, 0x01169F, 0x01303B, 0x0116A1, + 0x0116A0, 0x013034, 0x0116A2, 0x0116A5, 0x0116A4, 0x0116A7, 0x0116A6, 0x0116A9, + 0x0116A8, 0x013035, 0x0116AA, 0x013036, 0x013037, 0x013030, 0x013031, 0x013032, + 0x013033, 0x01300C, 0x01300D, 0x01300E, 0x01300F, 0x013008, 0x013009, 0x01300A, + 0x01300B, 0x013004, 0x013005, 0x013006, 0x013007, 0x013000, 0x013001, 0x0116C1, + 0x0116C0, 0x0116C3, 0x0116C2, 0x0116C5, 0x0116C4, 0x0116C7, 0x0116C6, 0x0116C9, + 0x0116C8, 0x013002, 0x013003, 0x01301C, 0x01301D, 0x01301E, 0x01301F, 0x013018, + 0x013019, 0x01301A, 0x01301B, 0x013014, 0x013015, 0x013016, 0x013017, 0x013010, + 0x013011, 0x013012, 0x013013, 0x0130EC, 0x0130ED, 0x0130EE, 0x0130EF, 0x0130E8, + 0x0130E9, 0x0130EA, 0x0130EB, 0x0130E4, 0x0130E5, 0x0130E6, 0x0130E7, 0x0130E0, + 0x0130E1, 0x0130E2, 0x0130E3, 0x0130FC, 0x0130FD, 0x0130FE, 0x0130FF, 0x0130F8, + 0x0130F9, 0x0130FA, 0x0130FB, 0x0130F4, 0x0130F5, 0x0130F6, 0x0130F7, 0x0130F0, + 0x0130F1, 0x0130F2, 0x0130F3, 0x0130CC, 0x0130CD, 0x0130CE, 0x0130CF, 0x0130C8, + 0x0130C9, 0x0130CA, 0x0130CB, 0x0130C4, 0x0130C5, 0x0130C6, 0x0130C7, 0x0130C0, + 0x0130C1, 0x0130C2, 0x0130C3, 0x0130DC, 0x0130DD, 0x0130DE, 0x0130DF, 0x0130D8, + 0x0130D9, 0x0130DA, 0x0130DB, 0x0130D4, 0x0130D5, 0x0130D6, 0x0130D7, 0x0130D0, + 0x0130D1, 0x0130D2, 0x0130D3, 0x0130AC, 0x0130AD, 0x0130AE, 0x0130AF, 0x0130A8, + 0x0130A9, 0x0130AA, 0x0130AB, 0x0130A4, 0x0130A5, 0x0130A6, 0x0130A7, 0x0130A0, + 0x0130A1, 0x0130A2, 0x0130A3, 0x0130BC, 0x0130BD, 0x0130BE, 0x0130BF, 0x0130B8, + 0x002C81, 0x002C80, 0x002C83, 0x002C82, 0x002C85, 0x0130B9, 0x002C87, 0x002C86, + 0x002C89, 0x0130BA, 0x0130BB, 0x002C8A, 0x0130B4, 0x0130B5, 0x0130B6, 0x0130B7, + 0x002C91, 0x002C90, 0x002C93, 0x002C92, 0x002C95, 0x002C94, 0x002C97, 0x002C96, + 0x002C99, 0x002C98, 0x002C9B, 0x002C9A, 0x002C9D, 0x002C9C, 0x002C9F, 0x002C9E, + 0x0130B0, 0x0130B1, 0x0130B2, 0x0130B3, 0x01308C, 0x01308D, 0x01308E, 0x01308F, + 0x013088, 0x013089, 0x01308A, 0x01308B, 0x013084, 0x013085, 0x013086, 0x013087, + 0x013080, 0x013081, 0x013082, 0x013083, 0x002CB5, 0x01309C, 0x01309D, 0x01309E, + 0x01309F, 0x013098, 0x013099, 0x01309A, 0x01309B, 0x013094, 0x013095, 0x013096, + 0x013097, 0x013090, 0x013091, 0x013092, 0x013093, 0x01316C, 0x01316D, 0x01316E, + 0x01316F, 0x013168, 0x013169, 0x01316A, 0x01316B, 0x013164, 0x013165, 0x013166, + 0x013167, 0x013160, 0x013161, 0x013162, 0x013163, 0x01317C, 0x01317D, 0x01317E, + 0x01317F, 0x013178, 0x013179, 0x01317A, 0x01317B, 0x013174, 0x013175, 0x013176, + 0x013177, 0x013170, 0x013171, 0x013172, 0x013173, 0x01314C, 0x01314D, 0x01314E, + 0x01314F, 0x013148, 0x013149, 0x01314A, 0x01314B, 0x013144, 0x013145, 0x013146, + 0x013147, 0x013140, 0x013141, 0x013142, 0x013143, 0x01315C, 0x01315D, 0x01315E, + 0x01315F, 0x013158, 0x013159, 0x01315A, 0x01315B, 0x013154, 0x013155, 0x013156, + 0x013157, 0x013150, 0x013151, 0x013152, 0x013153, 0x01312C, 0x01312D, 0x01312E, + 0x01312F, 0x013128, 0x013129, 0x01312A, 0x01312B, 0x002D0C, 0x013124, 0x013125, + 0x002D11, 0x002D10, 0x002D13, 0x002D12, 0x002D15, 0x013126, 0x002D17, 0x002D16, + 0x002D19, 0x013127, 0x002D1B, 0x002D1A, 0x013120, 0x013121, 0x013122, 0x013123, + 0x01313C, 0x01313D, 0x01313E, 0x01313F, 0x013138, 0x013139, 0x01313A, 0x01313B, + 0x013134, 0x013135, 0x013136, 0x013137, 0x013130, 0x013131, 0x013132, 0x013133, + 0x002D31, 0x002D30, 0x002D33, 0x002D32, 0x002D35, 0x01310C, 0x002D37, 0x002D36, + 0x002D39, 0x01310D, 0x01310E, 0x002D3A, 0x01310F, 0x013108, 0x013109, 0x01310A, + 0x002D41, 0x002D40, 0x002D43, 0x002D42, 0x002D45, 0x002D44, 0x002D47, 0x002D46, + 0x002D49, 0x002D48, 0x002D4B, 0x002D4A, 0x002D4D, 0x002D4C, 0x002D4F, 0x002D4E, + 0x01310B, 0x013104, 0x013105, 0x013106, 0x013107, 0x013100, 0x013101, 0x013102, + 0x013103, 0x01311C, 0x01311D, 0x01311E, 0x01311F, 0x002D5C, 0x013118, 0x013119, + 0x01311A, 0x01311B, 0x013114, 0x013115, 0x013116, 0x013117, 0x013110, 0x013111, + 0x013112, 0x013113, 0x0131EC, 0x0131ED, 0x0131EE, 0x0131EF, 0x0131E8, 0x0131E9, + 0x0131EA, 0x0131EB, 0x0131E4, 0x0131E5, 0x0131E6, 0x0131E7, 0x0131E0, 0x0131E1, + 0x0131E2, 0x0131E3, 0x0131FC, 0x0131FD, 0x0131FE, 0x0131FF, 0x0131F8, 0x0131F9, + 0x0131FA, 0x0131FB, 0x0131F4, 0x0131F5, 0x0131F6, 0x0131F7, 0x0131F0, 0x0131F1, + 0x0131F2, 0x0131F3, 0x0131CC, 0x0131CD, 0x0131CE, 0x0131CF, 0x0131C8, 0x0131C9, + 0x0131CA, 0x0131CB, 0x0131C4, 0x0131C5, 0x0131C6, 0x0131C7, 0x0131C0, 0x0131C1, + 0x0131C2, 0x0131C3, 0x0131DC, 0x0131DD, 0x0131DE, 0x0131DF, 0x0131D8, 0x0131D9, + 0x0131DA, 0x0131DB, 0x0131D4, 0x0131D5, 0x0131D6, 0x0131D7, 0x0131D0, 0x0131D1, + 0x0131D2, 0x0131D3, 0x0131AC, 0x0131AD, 0x0131AE, 0x0131AF, 0x0131A8, 0x0131A9, + 0x0131AA, 0x0131AB, 0x0131A4, 0x0131A5, 0x0131A6, 0x0131A7, 0x0131A0, 0x0131A1, + 0x0131A2, 0x0131A3, 0x0131BC, 0x0131BD, 0x0131BE, 0x0131BF, 0x0131B8, 0x0131B9, + 0x002DC1, 0x002DC0, 0x002DC3, 0x002DC2, 0x002DC5, 0x002DC4, 0x0131BA, 0x002DC6, + 0x002DC9, 0x002DC8, 0x002DCB, 0x002DCA, 0x002DCD, 0x002DCC, 0x0131BB, 0x002DCE, + 0x0131B4, 0x0131B5, 0x0131B6, 0x0131B7, 0x0131B0, 0x0131B1, 0x0131B2, 0x0131B3, + 0x01318C, 0x01318D, 0x01318E, 0x01318F, 0x013188, 0x002DDC, 0x013189, 0x01318A, + 0x01318B, 0x013184, 0x013185, 0x013186, 0x013187, 0x013180, 0x013181, 0x013182, + 0x013183, 0x01319C, 0x01319D, 0x01319E, 0x01319F, 0x013198, 0x013199, 0x01319A, + 0x01319B, 0x013194, 0x013195, 0x013196, 0x013197, 0x013190, 0x013191, 0x013192, + 0x013193, 0x02FA0C, 0x02FA0D, 0x02FA0E, 0x02FA0F, 0x02FA08, 0x02FA09, 0x02FA0A, + 0x02FA0B, 0x02FA04, 0x02FA05, 0x02FA06, 0x02FA07, 0x02FA00, 0x02FA01, 0x02FA02, + 0x02FA03, 0x02FA1C, 0x02FA1D, 0x02FA18, 0x02FA19, 0x02FA1A, 0x02FA1B, 0x02FA14, + 0x02FA15, 0x02FA16, 0x02FA17, 0x02FA10, 0x02FA11, 0x02FA12, 0x02FA13, 0x01246C, + 0x01246D, 0x01246E, 0x012468, 0x012469, 0x01246A, 0x01246B, 0x012464, 0x012465, + 0x012466, 0x012467, 0x012460, 0x012461, 0x012462, 0x012463, 0x01244C, 0x01244D, + 0x01244E, 0x01244F, 0x012448, 0x012449, 0x01244A, 0x01244B, 0x012444, 0x012445, + 0x012446, 0x012447, 0x012440, 0x012441, 0x012442, 0x012443, 0x01245C, 0x01245D, + 0x01245E, 0x01245F, 0x012458, 0x012459, 0x01245A, 0x01245B, 0x012454, 0x012455, + 0x012456, 0x012457, 0x012450, 0x012451, 0x012452, 0x012453, 0x01242C, 0x01242D, + 0x01242E, 0x01242F, 0x012428, 0x012429, 0x01242A, 0x01242B, 0x012424, 0x012425, + 0x012426, 0x012427, 0x012420, 0x012421, 0x012422, 0x012423, 0x01243C, 0x01243D, + 0x01243E, 0x01243F, 0x012438, 0x012439, 0x01243A, 0x01243B, 0x012434, 0x012435, + 0x012436, 0x012437, 0x012430, 0x012431, 0x012432, 0x012433, 0x01240C, 0x01240D, + 0x01240E, 0x01240F, 0x012408, 0x012409, 0x01240A, 0x01240B, 0x012404, 0x012405, + 0x012406, 0x012407, 0x012400, 0x012401, 0x012402, 0x012403, 0x01241C, 0x01241D, + 0x01241E, 0x01241F, 0x012418, 0x012419, 0x01241A, 0x01241B, 0x012414, 0x012415, + 0x012416, 0x012417, 0x012410, 0x012411, 0x012412, 0x012413, 0x0124EC, 0x0124ED, + 0x0124EE, 0x0124EF, 0x0124E8, 0x0124E9, 0x0124EA, 0x0124EB, 0x0124E4, 0x0124E5, + 0x0124E6, 0x0124E7, 0x0124E0, 0x0124E1, 0x0124E2, 0x0124E3, 0x0124FC, 0x0124FD, + 0x0124FE, 0x0124FF, 0x0124F8, 0x0124F9, 0x0124FA, 0x0124FB, 0x0124F4, 0x0124F5, + 0x0124F6, 0x0124F7, 0x0124F0, 0x0124F1, 0x0124F2, 0x0124F3, 0x0124CC, 0x0124CD, + 0x0124CE, 0x0124CF, 0x0124C8, 0x0124C9, 0x0124CA, 0x0124CB, 0x0124C4, 0x0124C5, + 0x0124C6, 0x0124C7, 0x0124C0, 0x0124C1, 0x0124C2, 0x0124C3, 0x0124DC, 0x0124DD, + 0x0124DE, 0x0124DF, 0x0124D8, 0x0124D9, 0x0124DA, 0x0124DB, 0x0124D4, 0x0124D5, + 0x0124D6, 0x0124D7, 0x0124D0, 0x0124D1, 0x0124D2, 0x0124D3, 0x0124AC, 0x0124AD, + 0x0124AE, 0x0124AF, 0x0124A8, 0x0124A9, 0x0124AA, 0x0124AB, 0x0124A4, 0x0124A5, + 0x0124A6, 0x0124A7, 0x0124A0, 0x0124A1, 0x0124A2, 0x0124A3, 0x0124BC, 0x0124BD, + 0x0124BE, 0x0124BF, 0x0124B8, 0x0124B9, 0x0124BA, 0x0124BB, 0x0124B4, 0x0124B5, + 0x0124B6, 0x0124B7, 0x0124B0, 0x0124B1, 0x0124B2, 0x0124B3, 0x01248C, 0x01248D, + 0x01248E, 0x01248F, 0x012488, 0x012489, 0x01248A, 0x01248B, 0x012484, 0x012485, + 0x012486, 0x012487, 0x012480, 0x012481, 0x012482, 0x012483, 0x01249C, 0x01249D, + 0x01249E, 0x01249F, 0x012498, 0x012499, 0x01249A, 0x01249B, 0x012494, 0x012495, + 0x012496, 0x012497, 0x012490, 0x012491, 0x012492, 0x012493, 0x012540, 0x012541, + 0x012542, 0x012543, 0x01252C, 0x01252D, 0x01252E, 0x01252F, 0x012528, 0x012539, + 0x01253A, 0x01253B, 0x012534, 0x02F84F, 0x016801, 0x016800, 0x016803, 0x016802, + 0x016805, 0x016804, 0x016807, 0x016806, 0x016809, 0x016808, 0x01680B, 0x01680A, + 0x01680D, 0x01680C, 0x01680F, 0x01680E, 0x016811, 0x016810, 0x016813, 0x016812, + 0x016815, 0x016814, 0x016817, 0x016816, 0x016819, 0x016818, 0x01681B, 0x01681A, + 0x01681D, 0x016849, 0x01681F, 0x01681E, 0x016821, 0x016820, 0x016823, 0x016822, + 0x016825, 0x016824, 0x016827, 0x016826, 0x016829, 0x016828, 0x01682B, 0x01682A, + 0x01682D, 0x01682C, 0x01682F, 0x01682E, 0x016831, 0x016862, 0x016833, 0x016832, + 0x016835, 0x016842, 0x016837, 0x01686B, 0x01687D, 0x016838, 0x01684E, 0x01684D, + 0x01683D, 0x01683C, 0x01683F, 0x01683E, 0x011A00, 0x016840, 0x01681C, 0x01685E, + 0x016843, 0x011A0B, 0x016844, 0x011A0E, 0x011A0F, 0x01684B, 0x01685F, 0x011A11, + 0x011A10, 0x011A13, 0x011A12, 0x011A15, 0x011A1B, 0x011A17, 0x016857, 0x016852, + 0x011A14, 0x011A18, 0x01686F, 0x016855, 0x01685D, 0x011A16, 0x011A1A, 0x016853, + 0x016851, 0x011A32, 0x016850, 0x01684F, 0x01685C, 0x011A22, 0x011A23, 0x01683A, + 0x01686D, 0x016834, 0x016860, 0x011A24, 0x011A2B, 0x016861, 0x01687C, 0x011A21, + 0x011A27, 0x011A1C, 0x011A3A, 0x01687E, 0x011A0D, 0x011A1E, 0x01684A, 0x01685B, + 0x011A19, 0x016854, 0x016856, 0x016859, 0x011A1D, 0x011A1F, 0x01685A, 0x01687F, + 0x016878, 0x016836, 0x016877, 0x016830, 0x011A31, 0x011A30, 0x016883, 0x016882, + 0x016881, 0x016886, 0x016885, 0x016880, 0x016884, 0x01688D, 0x01687A, 0x01687B, + 0x01689C, 0x01688C, 0x01688F, 0x01688E, 0x016892, 0x016895, 0x016893, 0x011A0C, + 0x011A50, 0x016896, 0x016897, 0x016891, 0x016890, 0x01689D, 0x016899, 0x016894, + 0x016898, 0x01689E, 0x01689F, 0x01689A, 0x011A20, 0x01686E, 0x011A5D, 0x011A5C, + 0x016875, 0x011A5E, 0x011A5F, 0x016874, 0x0168B8, 0x0168B9, 0x016839, 0x011A71, + 0x011A73, 0x011A2E, 0x011A72, 0x011A70, 0x0168B1, 0x011A25, 0x0168B3, 0x0168B2, + 0x0168B5, 0x0168B4, 0x0168B7, 0x0168B6, 0x0168B0, 0x0168BA, 0x0168BB, 0x011A81, + 0x011A80, 0x011A83, 0x011A82, 0x01686C, 0x0168C5, 0x011A87, 0x0168C1, 0x011A89, + 0x016871, 0x0168C4, 0x0168C7, 0x0168C6, 0x011A88, 0x011A86, 0x0168C2, 0x0168C3, + 0x0168C0, 0x0168E4, 0x01684C, 0x016870, 0x0168C8, 0x016858, 0x016848, 0x016841, + 0x011AC7, 0x016845, 0x016846, 0x016847, 0x0168C9, 0x0168D8, 0x0168CA, 0x0168CB, + 0x0168DD, 0x0168DC, 0x0168DF, 0x0168DE, 0x0168E5, 0x016872, 0x0168E6, 0x0168E7, + 0x0168E0, 0x0168E1, 0x0168E2, 0x0168E3, 0x016876, 0x0168E8, 0x0168EC, 0x0168ED, + 0x0168EE, 0x0168EF, 0x0168EA, 0x0168EB, 0x016864, 0x0168E9, 0x016867, 0x011A76, + 0x0168FC, 0x0168FD, 0x011A2F, 0x016873, 0x0168FE, 0x0168FF, 0x011A2A, 0x011AC1, + 0x011AC0, 0x011AC3, 0x011AC2, 0x011AC5, 0x011AC4, 0x011A77, 0x011AC6, 0x011AC9, + 0x011AC8, 0x011ACB, 0x011ACA, 0x011ACD, 0x011ACC, 0x011ACF, 0x011ACE, 0x011AD2, + 0x011AD7, 0x011AD3, 0x011AD1, 0x011AD5, 0x011AD4, 0x011AD0, 0x011AD6, 0x011AD9, + 0x011AD8, 0x011ADB, 0x011ADA, 0x011ADD, 0x011ADC, 0x011ADF, 0x011ADE, 0x011AE1, + 0x011AE0, 0x011AE3, 0x011AE2, 0x011AE5, 0x011AE4, 0x011AE7, 0x011AE6, 0x011AE9, + 0x011AE8, 0x011AEB, 0x011AEA, 0x011AED, 0x011AEC, 0x011AEF, 0x011AEE, 0x011AF1, + 0x011AF0, 0x011AF3, 0x011AF2, 0x011AF5, 0x011AF4, 0x011AF7, 0x011AF6, 0x003043, + 0x011AF8, 0x003041, 0x003042, 0x003045, 0x003048, 0x003082, 0x003046, 0x003047, + 0x003022, 0x003021, 0x003023, 0x003080, 0x003044, 0x00304D, 0x003057, 0x003056, + 0x00304F, 0x003038, 0x003007, 0x00304B, 0x003055, 0x00305C, 0x00304A, 0x003049, + 0x003066, 0x003065, 0x00304E, 0x003061, 0x003067, 0x00305D, 0x003006, 0x00305E, + 0x003059, 0x0030A7, 0x003058, 0x003039, 0x00304C, 0x00316D, 0x00305F, 0x011A2C, + 0x003072, 0x003073, 0x011A26, 0x00303A, 0x016961, 0x016960, 0x003054, 0x011A29, + 0x00305B, 0x016869, 0x016863, 0x016866, 0x00305A, 0x01696D, 0x003071, 0x00303C, + 0x01696E, 0x01696C, 0x01696F, 0x003092, 0x00111E, 0x00111F, 0x003090, 0x011A28, + 0x003081, 0x016865, 0x001118, 0x001119, 0x011A2D, 0x016879, 0x01686A, 0x011A6F, + 0x00111A, 0x01697F, 0x003094, 0x01697E, 0x011A7D, 0x011A7C, 0x001115, 0x003093, + 0x011A79, 0x011A7A, 0x00111B, 0x011A78, 0x011A7E, 0x003095, 0x011A7F, 0x011A7B, + 0x011A6C, 0x001101, 0x0030A3, 0x0030A2, 0x001133, 0x0030A1, 0x001106, 0x001107, + 0x0030B8, 0x0030B9, 0x00110A, 0x011A6E, 0x001105, 0x00111D, 0x011A63, 0x011A62, + 0x0030BA, 0x0030B5, 0x0030BD, 0x0030BF, 0x00308E, 0x0030B4, 0x0030B7, 0x0030B6, + 0x0030BB, 0x00308D, 0x003083, 0x00308F, 0x003088, 0x011A74, 0x0030BC, 0x0030BE, + 0x011A61, 0x011A60, 0x001142, 0x00309F, 0x011A66, 0x003096, 0x011A67, 0x011A68, + 0x011A6B, 0x011A6A, 0x011A69, 0x011A75, 0x011A65, 0x011A64, 0x011A6D, 0x001109, + 0x001140, 0x001141, 0x001144, 0x001143, 0x003091, 0x001145, 0x001146, 0x001147, + 0x001138, 0x001149, 0x00113A, 0x00114B, 0x00115C, 0x00113D, 0x00113E, 0x00113F, + 0x0011EC, 0x001139, 0x001134, 0x00113B, 0x003064, 0x0011ED, 0x0011EE, 0x0011EF, + 0x003068, 0x003069, 0x00306A, 0x00306B, 0x00306C, 0x0011E9, 0x0011EA, 0x0011E8, + 0x003070, 0x001131, 0x001132, 0x001137, 0x003074, 0x003075, 0x003076, 0x003077, + 0x003078, 0x003079, 0x00307A, 0x001135, 0x001136, 0x00307D, 0x00307E, 0x00307F, + 0x0011E5, 0x003176, 0x0011E4, 0x0011EB, 0x003105, 0x00311D, 0x003107, 0x003106, + 0x003109, 0x003108, 0x00310B, 0x00310A, 0x00310D, 0x00310C, 0x00310F, 0x00310E, + 0x003114, 0x003115, 0x003116, 0x003117, 0x003112, 0x003113, 0x003162, 0x003161, + 0x003110, 0x003111, 0x00311E, 0x00311F, 0x003119, 0x00311C, 0x00311A, 0x00311B, + 0x003121, 0x003120, 0x003123, 0x003122, 0x003125, 0x016A2D, 0x003127, 0x003126, + 0x003129, 0x00317D, 0x00312B, 0x0011E6, 0x016A28, 0x00312C, 0x016A2F, 0x0011E7, + 0x003131, 0x003118, 0x003133, 0x003132, 0x003135, 0x003134, 0x003137, 0x003136, + 0x003139, 0x003138, 0x00313B, 0x00313A, 0x00313D, 0x00313C, 0x00313F, 0x00313E, + 0x003141, 0x003140, 0x003143, 0x003142, 0x016A54, 0x0011E2, 0x00317E, 0x003146, + 0x003145, 0x016A55, 0x003144, 0x003149, 0x003170, 0x0011E1, 0x00314B, 0x003147, + 0x003151, 0x003150, 0x003153, 0x003152, 0x003155, 0x003154, 0x003157, 0x003156, + 0x003159, 0x003158, 0x00315B, 0x00315A, 0x00315D, 0x00315C, 0x00315F, 0x00315E, + 0x011C52, 0x00312A, 0x00316B, 0x00314D, 0x016A57, 0x011C1B, 0x003173, 0x00314F, + 0x00316C, 0x003148, 0x00314A, 0x003124, 0x011C1A, 0x011C51, 0x00314E, 0x003172, + 0x003177, 0x016A50, 0x011C13, 0x003163, 0x003171, 0x003174, 0x011C12, 0x00312E, + 0x011C57, 0x003128, 0x003178, 0x011C10, 0x011C15, 0x00317F, 0x016A52, 0x011C50, + 0x003182, 0x003180, 0x003183, 0x003185, 0x003186, 0x003181, 0x003187, 0x003188, + 0x00318C, 0x00318A, 0x00318B, 0x00318E, 0x003184, 0x003189, 0x00318D, 0x0030A4, + 0x0030AC, 0x003193, 0x011C40, 0x003192, 0x003195, 0x003194, 0x0030AE, 0x0030AD, + 0x0030A8, 0x016A58, 0x0030AA, 0x0030AB, 0x0030AF, 0x0030A9, 0x00316E, 0x00316F, + 0x0031B0, 0x0031A0, 0x0031A3, 0x0031A2, 0x0031A5, 0x0031A1, 0x0031A7, 0x0031A6, + 0x0031A9, 0x0031A8, 0x0031AB, 0x0031AA, 0x0031A4, 0x0031AE, 0x0031AF, 0x0030A6, + 0x0031B5, 0x0031B2, 0x0031B3, 0x0031B4, 0x0031B8, 0x0031B1, 0x0031B7, 0x0031B6, + 0x003169, 0x0031BA, 0x0031B9, 0x003168, 0x0031AC, 0x0031AD, 0x00312D, 0x0030A5, + 0x0030D0, 0x016A5C, 0x0030D2, 0x0030D1, 0x0030D7, 0x00314C, 0x0030D4, 0x011C18, + 0x0030DA, 0x0030D9, 0x011C1F, 0x0030DB, 0x0030DE, 0x016A2E, 0x0030D6, 0x0030D5, + 0x003165, 0x0030D3, 0x016A2C, 0x011C1D, 0x011C17, 0x011C11, 0x016A56, 0x016A5A, + 0x011C82, 0x011C83, 0x011C73, 0x003164, 0x011C19, 0x0011FD, 0x0011E3, 0x011C80, + 0x0030DD, 0x016ADD, 0x003160, 0x003167, 0x0031FC, 0x016AD8, 0x00317C, 0x003175, + 0x016ADF, 0x003179, 0x00317A, 0x00317B, 0x0031FD, 0x0030DF, 0x0031FE, 0x0031FF, + 0x0031F1, 0x0031F0, 0x0031F3, 0x0031F2, 0x00316A, 0x003166, 0x0031F5, 0x0030D8, + 0x0031F4, 0x0031F8, 0x0031FB, 0x0031FA, 0x0031F9, 0x011C81, 0x0031F6, 0x0031F7, + 0x016ADC, 0x011C16, 0x011C14, 0x016A68, 0x011C0B, 0x016ADE, 0x011C87, 0x011C1C, + 0x011C04, 0x011C06, 0x016A51, 0x016A53, 0x011C05, 0x011C1E, 0x016A42, 0x016A5B, + 0x016A41, 0x016A59, 0x016A40, 0x016A43, 0x016B26, 0x016B6F, 0x016B20, 0x011C54, + 0x016B27, 0x003285, 0x016A44, 0x0010B5, 0x011C55, 0x011C56, 0x003286, 0x003287, + 0x003288, 0x0010B7, 0x003284, 0x011C53, 0x016A45, 0x016B29, 0x016A49, 0x016B2A, + 0x016B25, 0x016A47, 0x016B24, 0x0010B6, 0x016A5D, 0x011C03, 0x016B2B, 0x016A5E, + 0x0010B0, 0x011C58, 0x016A4B, 0x003289, 0x016A62, 0x016A63, 0x016B23, 0x016B22, + 0x016B65, 0x016B2D, 0x016B2E, 0x016B64, 0x016B21, 0x016B28, 0x016B6B, 0x016B2F, + 0x016A4A, 0x016B69, 0x016A60, 0x016A61, 0x0032BC, 0x011C07, 0x011C5F, 0x0010BA, + 0x0010BB, 0x016A65, 0x016A66, 0x016A67, 0x011C5B, 0x016A69, 0x016B2C, 0x011D02, + 0x011D17, 0x016B8C, 0x011D01, 0x011D1C, 0x016B50, 0x016B59, 0x016B56, 0x016B55, + 0x011D1E, 0x011D1A, 0x011D1B, 0x016B57, 0x011D19, 0x011D18, 0x011D00, 0x016B08, + 0x016B5B, 0x011D13, 0x016B13, 0x016B06, 0x016B54, 0x011D12, 0x016B5D, 0x011D10, + 0x011D11, 0x011D14, 0x011D1F, 0x016B05, 0x011D15, 0x011D16, 0x016B52, 0x016B53, + 0x016B5E, 0x016B5F, 0x011D03, 0x016B51, 0x011D21, 0x011D22, 0x016B60, 0x011D29, + 0x011D2B, 0x016B04, 0x011D20, 0x016B66, 0x016B6A, 0x011D26, 0x011D2D, 0x016B63, + 0x011D1D, 0x011D30, 0x016B68, 0x011D24, 0x016B73, 0x016B61, 0x016B12, 0x016B67, + 0x016B72, 0x016B71, 0x016B7D, 0x011D52, 0x016B58, 0x011D2A, 0x016B7E, 0x016B7F, + 0x016B0E, 0x016B0D, 0x016B0F, 0x011C01, 0x011C00, 0x016B80, 0x016B83, 0x016B82, + 0x016B87, 0x016B81, 0x016B89, 0x016B8B, 0x011C0F, 0x016B8D, 0x016B88, 0x016B8A, + 0x016B86, 0x001080, 0x016B8F, 0x016B8E, 0x011D53, 0x001011, 0x011C0C, 0x011C0A, + 0x016B84, 0x016B85, 0x011C0E, 0x0010A3, 0x011C08, 0x0010EC, 0x0010B4, 0x0010A0, + 0x0010A4, 0x0010A2, 0x0032B1, 0x011C26, 0x011C2B, 0x001013, 0x011C25, 0x011D2C, + 0x011D28, 0x011C24, 0x011C0D, 0x011D2F, 0x001012, 0x0010BC, 0x011D2E, 0x0010A6, + 0x003283, 0x0010C4, 0x001010, 0x0010C3, 0x0010C5, 0x0010C7, 0x0010D3, 0x011C28, + 0x011C29, 0x011C2A, 0x0010ED, 0x011C2C, 0x0010CD, 0x003282, 0x001098, 0x001017, + 0x001096, 0x001095, 0x001094, 0x011D04, 0x011D05, 0x011D06, 0x001097, 0x011D08, + 0x011D09, 0x001099, 0x011D0B, 0x011D0C, 0x011D0D, 0x011D0E, 0x011D0F, 0x0010DC, + 0x0010D2, 0x003281, 0x0010E1, 0x0010E3, 0x0010E6, 0x0010E7, 0x0010D1, 0x0010E0, + 0x0010E8, 0x0010E9, 0x0010EA, 0x0010EB, 0x0010E5, 0x0010FD, 0x0010E4, 0x0010EF, + 0x016B5C, 0x0010F0, 0x011D23, 0x0010F2, 0x0010F5, 0x0010F1, 0x0010F7, 0x0010F4, + 0x0010F8, 0x0010EE, 0x0010FA, 0x0010F9, 0x0010FF, 0x0010FE, 0x003280, 0x0010F6, + 0x016B6C, 0x016B6D, 0x016B6E, 0x001022, 0x016B70, 0x001020, 0x001026, 0x001027, + 0x016B74, 0x016B75, 0x016B76, 0x016B77, 0x00100C, 0x001025, 0x001024, 0x001029, + 0x001310, 0x001315, 0x001312, 0x001313, 0x001014, 0x001015, 0x001016, 0x00101D, + 0x001018, 0x001019, 0x00101A, 0x00101B, 0x00102A, 0x00101F, 0x00101E, 0x011D50, + 0x011D51, 0x001163, 0x001162, 0x00117D, 0x001167, 0x001161, 0x011D57, 0x00117E, + 0x001178, 0x001160, 0x001179, 0x00117A, 0x001168, 0x00117F, 0x001166, 0x00116A, + 0x00116C, 0x001021, 0x00116E, 0x001023, 0x001174, 0x001165, 0x001164, 0x00116D, + 0x00117B, 0x001170, 0x001169, 0x00116B, 0x00117C, 0x001175, 0x001176, 0x00116F, + 0x001040, 0x001041, 0x001042, 0x001043, 0x001047, 0x00114D, 0x00114E, 0x00114F, + 0x001049, 0x001044, 0x00114A, 0x001302, 0x001045, 0x001148, 0x00114C, 0x001046, + 0x001318, 0x001304, 0x001303, 0x001334, 0x001314, 0x00131C, 0x001306, 0x001301, + 0x001048, 0x001319, 0x00131A, 0x00131B, 0x00105C, 0x00131D, 0x00131E, 0x00131F, + 0x001172, 0x001061, 0x00133C, 0x001332, 0x001065, 0x001333, 0x001177, 0x001066, + 0x001331, 0x00130C, 0x001352, 0x001353, 0x001330, 0x001351, 0x00106E, 0x001337, + 0x001070, 0x001171, 0x001300, 0x001173, 0x001324, 0x001075, 0x001076, 0x001077, + 0x00107C, 0x001079, 0x00107A, 0x00107B, 0x001078, 0x00107D, 0x00107E, 0x00107F, + 0x001380, 0x001381, 0x001382, 0x001383, 0x001384, 0x001385, 0x001386, 0x001387, + 0x001388, 0x001389, 0x00138A, 0x00138B, 0x0013E9, 0x00138D, 0x00138E, 0x00138F, + 0x001308, 0x001309, 0x00130E, 0x00130D, 0x00130F, 0x001305, 0x001336, 0x001307, + 0x0013E8, 0x0013ED, 0x00130A, 0x00130B, 0x0013EC, 0x0013AD, 0x0013EE, 0x0013EF, + 0x0013A0, 0x0010A1, 0x0013A2, 0x0013A3, 0x0013A1, 0x0010A5, 0x0013A4, 0x0010A7, + 0x0010A8, 0x0010A9, 0x0010AA, 0x0010AB, 0x0010AC, 0x0010AD, 0x0010AE, 0x0010AF, + 0x0013A8, 0x0013A9, 0x0013AE, 0x0013AF, 0x0013AC, 0x0013A5, 0x0013A6, 0x0013A7, + 0x0010B8, 0x0010B9, 0x0013AA, 0x0013AB, 0x0013BC, 0x0010BD, 0x0010BE, 0x0010BF, + 0x0013C1, 0x0013C2, 0x0013C3, 0x0013D6, 0x0013C5, 0x0013D5, 0x0013C7, 0x0013D7, + 0x0013D8, 0x0013D9, 0x0013C0, 0x0013DB, 0x0013C6, 0x0013DD, 0x0013DA, 0x0013DF, + 0x0010D0, 0x0013D4, 0x0013D3, 0x0013DC, 0x0010D4, 0x0010D5, 0x0010D6, 0x0010D7, + 0x0013D2, 0x0010D9, 0x0010DA, 0x0010DB, 0x0013D1, 0x0010DD, 0x0010DE, 0x0013D0, + 0x0013E0, 0x0013E1, 0x0013E2, 0x0013E3, 0x0013C4, 0x0013E5, 0x0013E6, 0x0013E7, + 0x0013C8, 0x0013C9, 0x0013CA, 0x0013CB, 0x0013CC, 0x0013CD, 0x0013CE, 0x0013CF, + 0x0013F0, 0x0013F1, 0x0013F2, 0x0013F3, 0x0013F4, 0x0013F5, 0x0013E4, 0x0013EA, + 0x0013F8, 0x0013F9, 0x0013FA, 0x0013FB, 0x0013FC, 0x0013FD, 0x0013DE, 0x0013EB, + 0x02F848, 0x02F849, 0x02F84A, 0x02F84B, 0x02F844, 0x02F845, 0x02F846, 0x02F847, + 0x02F840, 0x02F841, 0x02F842, 0x02F843, 0x02F85C, 0x02F85D, 0x02F85E, 0x02F82F, + 0x02F828, 0x02F829, 0x02F82A, 0x02F82B, 0x02F824, 0x02F825, 0x02F826, 0x02F827, + 0x02F820, 0x02F821, 0x02F822, 0x02F823, 0x02F83C, 0x02F83D, 0x02F83E, 0x02F83F, + 0x001524, 0x001520, 0x02F838, 0x001523, 0x02F839, 0x001521, 0x001522, 0x02F83A, + 0x00152B, 0x02F83B, 0x02F834, 0x02F835, 0x00152C, 0x001525, 0x001526, 0x001527, + 0x02F836, 0x001529, 0x02F837, 0x02F830, 0x001534, 0x00153D, 0x02F831, 0x00152D, + 0x001538, 0x00153B, 0x00153A, 0x00152A, 0x00153C, 0x001539, 0x00153E, 0x00153F, + 0x02F832, 0x02F833, 0x02F80C, 0x02F80D, 0x02F80E, 0x02F80F, 0x02F808, 0x02F809, + 0x02F80A, 0x02F80B, 0x02F804, 0x02F805, 0x02F806, 0x02F807, 0x02F800, 0x02F801, + 0x001553, 0x02F802, 0x001554, 0x02F803, 0x001556, 0x001551, 0x001552, 0x02F81C, + 0x001550, 0x02F81D, 0x00155A, 0x00155B, 0x001558, 0x001555, 0x02F81E, 0x001557, + 0x02F81F, 0x001260, 0x02F818, 0x02F819, 0x02F81A, 0x001267, 0x02F81B, 0x02F814, + 0x001268, 0x02F815, 0x02F816, 0x02F817, 0x00126C, 0x02F810, 0x00126E, 0x00126F, + 0x00155D, 0x001559, 0x02F811, 0x02F812, 0x02F813, 0x02F8EC, 0x00155E, 0x00155F, + 0x02F8ED, 0x02F8EE, 0x02F8EF, 0x02F8E8, 0x02F8E9, 0x02F8EA, 0x02F8EB, 0x02F8E4, + 0x02F8E5, 0x02F8E6, 0x02F8E7, 0x02F8E0, 0x001284, 0x02F8E1, 0x02F8E2, 0x02F8E3, + 0x001288, 0x02F8FC, 0x00128A, 0x00128B, 0x02F8FD, 0x02F8FE, 0x02F8FF, 0x02F8F8, + 0x02F8F9, 0x02F8FA, 0x02F8FB, 0x02F8F4, 0x02F8F5, 0x02F8F6, 0x02F8F7, 0x02F8F0, + 0x001298, 0x001299, 0x02F8F1, 0x01230E, 0x01230F, 0x00129D, 0x00129E, 0x00129F, + 0x012308, 0x012309, 0x01230A, 0x01230B, 0x012304, 0x012305, 0x012306, 0x012307, + 0x012300, 0x012301, 0x012302, 0x012303, 0x01231C, 0x01231D, 0x01231E, 0x01231F, + 0x012318, 0x012319, 0x01231A, 0x01231B, 0x012314, 0x012315, 0x012316, 0x012317, + 0x012310, 0x012311, 0x012312, 0x012313, 0x01238C, 0x01238D, 0x01238E, 0x01238F, + 0x012388, 0x012389, 0x01238A, 0x01238B, 0x012384, 0x012385, 0x012386, 0x012387, + 0x012380, 0x012381, 0x012382, 0x012383, 0x012398, 0x012399, 0x012394, 0x012395, + 0x012396, 0x012397, 0x012390, 0x012391, 0x012392, 0x012393, 0x01206C, 0x01206D, + 0x01206E, 0x01BC01, 0x01BC00, 0x01BC03, 0x01BC02, 0x01BC05, 0x01BC04, 0x01BC07, + 0x01BC06, 0x01BC09, 0x01BC08, 0x01BC0B, 0x01BC0A, 0x01BC0D, 0x01BC0C, 0x01BC0F, + 0x01BC0E, 0x01BC11, 0x01BC10, 0x01BC13, 0x01BC12, 0x01BC15, 0x01BC14, 0x01BC17, + 0x01BC16, 0x01BC19, 0x01BC18, 0x01BC1B, 0x01BC1A, 0x01BC1D, 0x01BC1C, 0x01BC1F, + 0x01BC1E, 0x01BC21, 0x01BC20, 0x01BC23, 0x01BC22, 0x01206F, 0x012068, 0x01BC27, + 0x01BC26, 0x001581, 0x001582, 0x001583, 0x001599, 0x00159C, 0x001587, 0x00159B, + 0x00159A, 0x01BC31, 0x01BC30, 0x01BC33, 0x01BC32, 0x01BC35, 0x01BC34, 0x01BC37, + 0x01BC36, 0x01BC39, 0x01BC38, 0x01BC3B, 0x01BC3A, 0x01BC3D, 0x01BC3C, 0x01BC3F, + 0x01BC3E, 0x001590, 0x001593, 0x001592, 0x001595, 0x001594, 0x001597, 0x001596, + 0x001580, 0x001585, 0x001586, 0x01BC52, 0x01BC53, 0x01BC50, 0x01BC51, 0x01BC57, + 0x00158A, 0x001589, 0x01BC69, 0x00158B, 0x01BC68, 0x0015A1, 0x00159D, 0x0015AC, + 0x001533, 0x0015B1, 0x00159E, 0x00159F, 0x001536, 0x001531, 0x001532, 0x001530, + 0x00150C, 0x01BC64, 0x001537, 0x01BC6A, 0x001598, 0x01BC24, 0x01BC25, 0x00150D, + 0x01BC65, 0x01BC28, 0x01BC29, 0x01BC2A, 0x01BC2B, 0x01BC2C, 0x01BC2D, 0x01BC2E, + 0x01BC2F, 0x0015D1, 0x0015D2, 0x0015D3, 0x001535, 0x0015D5, 0x0015D6, 0x012228, + 0x01222C, 0x0120E0, 0x01225B, 0x0120EE, 0x0120ED, 0x0120EF, 0x0120EC, 0x0120E8, + 0x0120E9, 0x01BC81, 0x0120E6, 0x01BC62, 0x01BC63, 0x01BC85, 0x01BC84, 0x01BC83, + 0x012013, 0x01BC61, 0x01BC88, 0x01BC60, 0x012254, 0x012012, 0x01BC66, 0x012010, + 0x01BC67, 0x01BC92, 0x01BC90, 0x01BC93, 0x01BC91, 0x01BC96, 0x01BC78, 0x01BC97, + 0x0120FC, 0x01BC7A, 0x0120E3, 0x01BC98, 0x01BC99, 0x0120FD, 0x01BC95, 0x01BC94, + 0x01BC82, 0x01BC80, 0x0120E1, 0x01BC7C, 0x012016, 0x01BC74, 0x012017, 0x01BC86, + 0x01BC87, 0x0120E2, 0x01BC79, 0x0120EA, 0x01BC76, 0x01BC77, 0x0120E7, 0x0120F8, + 0x0120F9, 0x01BC70, 0x01BC7B, 0x01BC72, 0x01BC73, 0x0120FE, 0x01BC75, 0x0120C0, + 0x0120C1, 0x0120C2, 0x0120C3, 0x0120C4, 0x0120C5, 0x0120C6, 0x0120C7, 0x0120C8, + 0x0120C9, 0x0120CA, 0x0120CB, 0x01BC42, 0x01BC43, 0x01BC44, 0x01BC45, 0x01BC4E, + 0x01BC4F, 0x01BC4C, 0x01BC49, 0x012253, 0x01BC48, 0x01BC4A, 0x01BC4D, 0x01BC4B, + 0x0120CF, 0x012252, 0x012251, 0x0120DC, 0x012250, 0x01BC54, 0x01BC55, 0x01BC56, + 0x01BC41, 0x01BC58, 0x01BC59, 0x01BC5A, 0x01BC5B, 0x01BC5C, 0x01BC5D, 0x01BC5E, + 0x01BC5F, 0x01BC40, 0x01BC71, 0x0120CC, 0x0120CD, 0x0120CE, 0x0120FF, 0x01BC46, + 0x01BC47, 0x0120F2, 0x0120F3, 0x0120F1, 0x0120F6, 0x0120F0, 0x0120F7, 0x012256, + 0x012255, 0x012257, 0x0120FB, 0x0120F4, 0x0120F5, 0x0120FA, 0x0122ED, 0x012081, + 0x012080, 0x012083, 0x012082, 0x012085, 0x012084, 0x012087, 0x012086, 0x012089, + 0x012088, 0x01208B, 0x01208A, 0x01208D, 0x01208C, 0x01208F, 0x01208E, 0x0120D0, + 0x0120D1, 0x0120D2, 0x0120D3, 0x0120D4, 0x0120D5, 0x0120D6, 0x0120D7, 0x012099, + 0x012098, 0x0120DA, 0x0120DB, 0x01209D, 0x01209C, 0x01209F, 0x01209E, 0x0120A1, + 0x0120A0, 0x0120A3, 0x0120A2, 0x0120A5, 0x0120A4, 0x0120A7, 0x0120A6, 0x0120A9, + 0x0120A8, 0x0120AB, 0x0120AA, 0x0120AD, 0x0120AC, 0x0120AF, 0x0120AE, 0x0120B1, + 0x0120B0, 0x0120B3, 0x0120B2, 0x0120B5, 0x0120B4, 0x0120B7, 0x0120B6, 0x0120B9, + 0x0120B8, 0x0120BB, 0x0120BA, 0x0120BD, 0x0120BC, 0x0120BF, 0x0120BE, 0x0120D8, + 0x0120D9, 0x0120DE, 0x0120DF, 0x0120DD, 0x016F01, 0x016F00, 0x016F03, 0x016F02, + 0x016F05, 0x016F04, 0x016F07, 0x016F06, 0x016F09, 0x016F08, 0x016F0B, 0x016F0A, + 0x016F0D, 0x016F0C, 0x016F0F, 0x016F0E, 0x016F11, 0x016F10, 0x016F13, 0x016F12, + 0x016F15, 0x016F14, 0x016F17, 0x016F16, 0x016F19, 0x016F18, 0x016F1B, 0x016F1A, + 0x016F1D, 0x016F1C, 0x016F1F, 0x016F1E, 0x016F21, 0x016F20, 0x016F23, 0x016F22, + 0x016F25, 0x016F24, 0x016F27, 0x016F26, 0x016F29, 0x016F28, 0x016F2B, 0x016F2A, + 0x016F2D, 0x016F2C, 0x016F2F, 0x016F2E, 0x016F31, 0x016F30, 0x016F33, 0x016F32, + 0x016F35, 0x016F34, 0x016F37, 0x016F36, 0x016F39, 0x016F38, 0x016F3B, 0x016F3A, + 0x016F3D, 0x016F3C, 0x016F3F, 0x012106, 0x012107, 0x016F43, 0x016F40, 0x012102, + 0x01210B, 0x016F44, 0x012103, 0x012109, 0x012105, 0x01210F, 0x016F42, 0x012111, + 0x012110, 0x012113, 0x012112, 0x001369, 0x012108, 0x012117, 0x016F50, 0x012119, + 0x01211B, 0x012118, 0x012104, 0x01211D, 0x01211F, 0x01211C, 0x01211E, 0x00136A, + 0x001282, 0x001281, 0x016F41, 0x001283, 0x001286, 0x001285, 0x001280, 0x001287, + 0x00136C, 0x00136D, 0x00129C, 0x01210C, 0x01210D, 0x01210E, 0x00136E, 0x00136F, + 0x001212, 0x012133, 0x012132, 0x001213, 0x001211, 0x00121C, 0x012136, 0x001217, + 0x001219, 0x001218, 0x00121B, 0x00121A, 0x001216, 0x001215, 0x001214, 0x012240, + 0x012241, 0x012243, 0x016F3E, 0x012244, 0x012245, 0x012242, 0x012247, 0x012248, + 0x012249, 0x01224A, 0x01224B, 0x01224C, 0x01224D, 0x012246, 0x01224F, 0x001210, + 0x001200, 0x001204, 0x001207, 0x001203, 0x00121D, 0x00121E, 0x00121F, 0x012258, + 0x012259, 0x01225A, 0x01224E, 0x01225C, 0x01225D, 0x01225E, 0x01225F, 0x012260, + 0x012261, 0x012262, 0x012263, 0x012264, 0x012265, 0x012266, 0x012267, 0x012268, + 0x012269, 0x01226A, 0x01226B, 0x01226C, 0x01226D, 0x01226E, 0x01226F, 0x012270, + 0x012271, 0x012272, 0x012273, 0x012274, 0x012275, 0x012276, 0x012277, 0x012278, + 0x012279, 0x01227A, 0x01227B, 0x01227C, 0x01227D, 0x01227E, 0x01227F, 0x001229, + 0x001254, 0x001244, 0x001248, 0x001264, 0x001293, 0x001205, 0x001206, 0x001256, + 0x001228, 0x00125A, 0x00120B, 0x00125B, 0x001258, 0x00127D, 0x00122E, 0x00124B, + 0x0012E0, 0x0012E1, 0x0012E6, 0x0012E7, 0x0012E4, 0x001221, 0x001222, 0x001223, + 0x001220, 0x001226, 0x0012EA, 0x0012EB, 0x0012EC, 0x001227, 0x0012E9, 0x0012E5, + 0x0121E1, 0x00122B, 0x0012F5, 0x001232, 0x0012F4, 0x001224, 0x00122A, 0x00122F, + 0x0012F9, 0x0012F8, 0x0012EE, 0x00123A, 0x0012ED, 0x0012EF, 0x0012FF, 0x0012FE, + 0x001320, 0x001291, 0x001296, 0x001295, 0x00132C, 0x001297, 0x001322, 0x001323, + 0x001321, 0x001328, 0x001325, 0x001327, 0x00133D, 0x00133E, 0x00133F, 0x0121C1, + 0x0121C0, 0x0121C3, 0x0121C2, 0x0121C5, 0x0121C4, 0x0121C7, 0x0121C6, 0x0121C9, + 0x0121C8, 0x0121CB, 0x0121CA, 0x0121CD, 0x0121CC, 0x0121CF, 0x0121CE, 0x001338, + 0x001339, 0x00133A, 0x00133B, 0x0121D5, 0x0121D4, 0x001335, 0x0121D6, 0x0121D9, + 0x0121D8, 0x0121DB, 0x0121DA, 0x0121DD, 0x0121DC, 0x0121DF, 0x0121DE, 0x00D7BE, + 0x0121E0, 0x0121E3, 0x0121E2, 0x0121E5, 0x0121E4, 0x0121E7, 0x0121E6, 0x0121E9, + 0x0121E8, 0x0121EB, 0x0121EA, 0x0121ED, 0x0121EC, 0x0121EF, 0x0121EE, 0x0121F1, + 0x0121F0, 0x0121F3, 0x0121F2, 0x0121F5, 0x0121F4, 0x0121F7, 0x0121F6, 0x0121F9, + 0x0121F8, 0x0121FB, 0x0121FA, 0x0121FD, 0x0121FC, 0x0121FF, 0x0121FE, 0x012201, + 0x012200, 0x001350, 0x001356, 0x012205, 0x012204, 0x012202, 0x012203, 0x012209, + 0x012208, 0x01220B, 0x01220A, 0x001354, 0x001357, 0x012206, 0x012207, 0x012211, + 0x012210, 0x012213, 0x012212, 0x012215, 0x012214, 0x012217, 0x012216, 0x012219, + 0x012218, 0x01221B, 0x01221A, 0x01221D, 0x01221C, 0x01221F, 0x01221E, 0x001326, + 0x00129B, 0x012232, 0x00135A, 0x001359, 0x001294, 0x001355, 0x012231, 0x00129A, + 0x001358, 0x001329, 0x00132A, 0x00132B, 0x00132E, 0x00132D, 0x01220F, 0x00132F, + 0x001379, 0x001371, 0x001378, 0x00137B, 0x001290, 0x001375, 0x001292, 0x001377, + 0x012233, 0x00134C, 0x00D7B8, 0x00D7B9, 0x00D7BA, 0x01220E, 0x00D7BC, 0x012220, + 0x012221, 0x00D7BF, 0x00D7BB, 0x012224, 0x012225, 0x012222, 0x012223, 0x012238, + 0x012229, 0x01222A, 0x01222B, 0x00D7B6, 0x00D7B7, 0x012226, 0x012227, 0x012230, + 0x012234, 0x01222E, 0x01222F, 0x00D7B4, 0x012235, 0x012236, 0x012237, 0x012239, + 0x00D7B5, 0x01223A, 0x01223B, 0x01223C, 0x01223D, 0x01223E, 0x01223F, 0x00134E, + 0x00D7D1, 0x00D7D3, 0x001373, 0x001372, 0x00D7D2, 0x001374, 0x001376, 0x00137C, + 0x01222D, 0x001370, 0x00136B, 0x01220C, 0x01220D, 0x00134D, 0x00137A, 0x00134F, + 0x001340, 0x001341, 0x001342, 0x001343, 0x001344, 0x001345, 0x001346, 0x001347, + 0x001348, 0x00134B, 0x00134A, 0x00D7D7, 0x001349, 0x00D7D0, 0x00D7BD, 0x012281, + 0x012280, 0x0122A8, 0x0122CE, 0x012285, 0x012284, 0x012282, 0x012283, 0x012289, + 0x012288, 0x01228B, 0x01228A, 0x01228D, 0x01228C, 0x012286, 0x012287, 0x012291, + 0x012290, 0x012293, 0x012292, 0x012295, 0x012294, 0x012297, 0x012296, 0x012299, + 0x012298, 0x01229B, 0x01229A, 0x01229D, 0x01229C, 0x01229F, 0x01229E, 0x0122A1, + 0x0122A0, 0x0122A3, 0x0122A2, 0x0122A5, 0x0122A4, 0x0122A7, 0x0122A6, 0x0122A9, + 0x0122B9, 0x0122AB, 0x0122AA, 0x0122AD, 0x0122AC, 0x0122AF, 0x0122AE, 0x0122B1, + 0x0122B0, 0x0122B3, 0x0122B2, 0x0122B5, 0x0122B4, 0x0122B7, 0x0122B6, 0x01228F, + 0x0122B8, 0x0122BB, 0x0122BA, 0x0122BD, 0x0122BC, 0x0122BF, 0x0122BE, 0x0122C1, + 0x0122C0, 0x0122C3, 0x0122C2, 0x0122C5, 0x0122C4, 0x0122E8, 0x0122C6, 0x0122C9, + 0x0122D9, 0x0122CB, 0x0122CA, 0x0122CD, 0x0122CC, 0x0122CF, 0x0122C7, 0x0122D1, + 0x01228E, 0x0122D3, 0x0122D2, 0x0122D5, 0x0122D4, 0x0122D7, 0x0122D6, 0x0122D0, + 0x0122D8, 0x0122DB, 0x0122DA, 0x0122DD, 0x0122DC, 0x0122DF, 0x0122DE, 0x0122E2, + 0x0122E0, 0x0122E3, 0x0122FD, 0x0122E6, 0x0122E4, 0x0122E7, 0x0122E1, 0x0122EA, + 0x0122F9, 0x0122EB, 0x0122E5, 0x0122EF, 0x0122EC, 0x0122FE, 0x0122E9, 0x0122F1, + 0x0122F0, 0x0122F3, 0x0122F2, 0x0122F5, 0x0122F4, 0x0122F7, 0x0122F6, 0x0122C8, + 0x0122F8, 0x0122FB, 0x0122FA, 0x0122FF, 0x0122FC, 0x02F861, 0x02F860, 0x02F863, + 0x01230C, 0x012324, 0x01234F, 0x02F867, 0x02F866, 0x02F869, 0x02F868, 0x01230D, + 0x02F86A, 0x02F86D, 0x02F86C, 0x02F86F, 0x02F86E, 0x02F871, 0x02F870, 0x02F82E, + 0x02F82D, 0x02F875, 0x02F874, 0x02F877, 0x02F876, 0x02F879, 0x02F878, 0x02F87B, + 0x02F87A, 0x02F87D, 0x02F87C, 0x02F87F, 0x02F87E, 0x02F890, 0x02F897, 0x01232C, + 0x012320, 0x012323, 0x012322, 0x012325, 0x012321, 0x012327, 0x012326, 0x012338, + 0x012328, 0x01232B, 0x01232A, 0x01232D, 0x012329, 0x01232F, 0x01232E, 0x012334, + 0x012330, 0x012333, 0x012332, 0x012335, 0x012331, 0x012337, 0x012336, 0x01233C, + 0x02F891, 0x01233B, 0x01233A, 0x01233D, 0x012339, 0x01233F, 0x01233E, 0x012341, + 0x012340, 0x012343, 0x012342, 0x012345, 0x012344, 0x012347, 0x012346, 0x012349, + 0x012359, 0x01234B, 0x01234A, 0x01234D, 0x01234C, 0x012364, 0x01234E, 0x012351, + 0x012350, 0x012353, 0x012352, 0x012355, 0x012354, 0x012357, 0x012356, 0x0122EE, + 0x012358, 0x01235B, 0x01235A, 0x01235D, 0x01235C, 0x01235F, 0x01235E, 0x012361, + 0x012360, 0x012363, 0x012362, 0x012365, 0x012375, 0x012367, 0x012366, 0x012369, + 0x012368, 0x01236B, 0x01236A, 0x01236D, 0x01236C, 0x01236F, 0x01236E, 0x012371, + 0x012370, 0x012373, 0x012372, 0x012348, 0x012374, 0x012377, 0x012376, 0x012379, + 0x012378, 0x01237B, 0x01237A, 0x01237D, 0x01237C, 0x01237F, 0x01237E, 0x02F882, + 0x02F883, 0x02F880, 0x02F881, 0x02F886, 0x02F887, 0x02F888, 0x02F889, 0x02F88A, + 0x02F88B, 0x02F884, 0x02F885, 0x02F89E, 0x02F88F, 0x02F88C, 0x02F88D, 0x02F892, + 0x02F893, 0x02F894, 0x02F895, 0x02F896, 0x02F8B3, 0x02F898, 0x02F899, 0x02F94C, + 0x02F89B, 0x02F89C, 0x02F89D, 0x02F89F, 0x02F89A, 0x02F901, 0x02F900, 0x02F903, + 0x02F902, 0x02F905, 0x02F904, 0x02F907, 0x02F906, 0x02F909, 0x02F908, 0x02F90B, + 0x02F90A, 0x02F90D, 0x02F90C, 0x02F90F, 0x02F91F, 0x02F911, 0x02F910, 0x02F913, + 0x02F912, 0x02F915, 0x02F914, 0x02F917, 0x02F916, 0x02F919, 0x02F918, 0x02F91B, + 0x02F91A, 0x02F91D, 0x02F91C, 0x02F92E, 0x02F91E, 0x02F921, 0x02F920, 0x02F923, + 0x02F922, 0x02F90E, 0x02F924, 0x02F927, 0x02F926, 0x02F929, 0x02F928, 0x02F92B, + 0x02F92A, 0x02F92D, 0x02F925, 0x02F92F, 0x02F93F, 0x02F931, 0x02F930, 0x02F933, + 0x02F932, 0x02F935, 0x02F934, 0x02F937, 0x02F82C, 0x02F939, 0x02F938, 0x02F93B, + 0x02F93A, 0x02F93D, 0x02F93C, 0x02F936, 0x02F93E, 0x02F941, 0x02F947, 0x02F940, + 0x02F942, 0x02F945, 0x02F94B, 0x02F944, 0x02F946, 0x02F949, 0x02F94F, 0x02F948, + 0x02F94A, 0x02F95C, 0x02F96D, 0x02F94D, 0x02F95F, 0x02F951, 0x02F950, 0x02F953, + 0x02F952, 0x02F955, 0x02F954, 0x02F957, 0x02F956, 0x02F959, 0x02F958, 0x02F95B, + 0x02F95A, 0x02F96C, 0x02F943, 0x02F95D, 0x02F95E, 0x02F94E, 0x02F92C, 0x02F963, + 0x02F962, 0x02F960, 0x02F961, 0x02F967, 0x02F966, 0x02F969, 0x02F968, 0x02F96B, + 0x02F96A, 0x02F964, 0x02F965, 0x02F96F, 0x02F96E, 0x02F971, 0x02F970, 0x02F853, + 0x02F972, 0x02F975, 0x02F974, 0x02F977, 0x02F976, 0x02F979, 0x02F978, 0x02F97B, + 0x02F97A, 0x02F97D, 0x02F97C, 0x02F97F, 0x02F97E, 0x02F981, 0x02F980, 0x02F983, + 0x02F987, 0x02F985, 0x02F984, 0x02F982, 0x02F986, 0x02F989, 0x02F988, 0x02F98B, + 0x02F98F, 0x02F98D, 0x02F98C, 0x02F99E, 0x02F98E, 0x02F991, 0x02F990, 0x02F9AE, + 0x02F997, 0x02F995, 0x02F994, 0x02F993, 0x02F996, 0x02F999, 0x02F998, 0x02F99B, + 0x02F99F, 0x02F99D, 0x02F99C, 0x02F99A, 0x02F992, 0x02F9A1, 0x02F9A0, 0x02F9A3, + 0x02F9A2, 0x02F9A5, 0x02F9A4, 0x02F9A7, 0x02F9A6, 0x02F9A9, 0x02F9A8, 0x02F9AB, + 0x02F9AA, 0x02F98A, 0x02F9AC, 0x02F9AF, 0x02F9BF, 0x02F9B1, 0x02F9B0, 0x02F9B3, + 0x02F9EC, 0x02F9B5, 0x02F9B4, 0x02F9B7, 0x02F9B6, 0x02F9B9, 0x02F9B8, 0x02F9BB, + 0x02F9BA, 0x02F9BD, 0x02F9BC, 0x02F9B2, 0x02F9BE, 0x02F9C1, 0x02F9C0, 0x02F9C3, + 0x02F9C2, 0x02F9C5, 0x02F9C4, 0x02F9C7, 0x02F9C6, 0x02F9C9, 0x02F9C8, 0x02F9CB, + 0x02F9DB, 0x02F9CD, 0x02F9CC, 0x02F9CF, 0x02F9CE, 0x02F9D1, 0x02F9D0, 0x02F9D3, + 0x02F9D2, 0x02F9D5, 0x02F9D4, 0x02F9D7, 0x02F9D6, 0x02F9D9, 0x02F9D8, 0x02F9ED, + 0x02F9DA, 0x02F9DD, 0x02F9DC, 0x02F9DF, 0x02F9DE, 0x02F9CA, 0x02F9AD, 0x02F9E3, + 0x02F9E2, 0x02F9E0, 0x02F9E1, 0x02F9E7, 0x02F9E6, 0x02F9E9, 0x02F9E8, 0x02F9EB, + 0x02F9EA, 0x02F9E4, 0x02F9E5, 0x02F9EF, 0x02F9EE, 0x02F9F1, 0x02F9F0, 0x02F9F3, + 0x02F9F2, 0x02F9F5, 0x02F9F4, 0x02F9F7, 0x02F9F6, 0x02F9F9, 0x02F9F8, 0x02F9FB, + 0x02F9FA, 0x02F9FD, 0x02F9FC, 0x02F9FF, 0x02F9FE, 0x012069, 0x01206A, 0x01206B, + 0x012064, 0x012065, 0x012066, 0x012067, 0x012060, 0x012061, 0x012062, 0x012063, + 0x01207C, 0x01207D, 0x01207E, 0x01207F, 0x012078, 0x012079, 0x01207A, 0x01207B, + 0x012074, 0x012075, 0x012076, 0x012077, 0x012070, 0x012071, 0x012072, 0x012073, + 0x01204C, 0x01204D, 0x01204E, 0x01204F, 0x012048, 0x012049, 0x01204A, 0x01204B, + 0x012044, 0x012045, 0x012046, 0x012047, 0x012040, 0x012041, 0x012042, 0x012043, + 0x01205C, 0x01205D, 0x01205E, 0x00D7B0, 0x01205F, 0x012058, 0x012059, 0x01205A, + 0x01205B, 0x012054, 0x012055, 0x012056, 0x012057, 0x012050, 0x012051, 0x012052, + 0x012053, 0x01202C, 0x01202D, 0x01202E, 0x01202F, 0x012028, 0x012029, 0x01202A, + 0x01202B, 0x012024, 0x012025, 0x012026, 0x00D7B1, 0x012027, 0x012020, 0x012021, + 0x012022, 0x012023, 0x01203C, 0x01203D, 0x01203E, 0x01203F, 0x012038, 0x012039, + 0x01203A, 0x01203B, 0x012034, 0x012035, 0x012036, 0x012037, 0x012030, 0x012031, + 0x012032, 0x012033, 0x01200C, 0x01200D, 0x01200E, 0x02F862, 0x02F864, 0x012501, + 0x012500, 0x012503, 0x012502, 0x02F865, 0x012504, 0x012525, 0x02F86B, 0x012509, + 0x012508, 0x01250B, 0x01250A, 0x01250D, 0x01250C, 0x01250F, 0x01250E, 0x012511, + 0x012510, 0x012513, 0x012512, 0x012515, 0x012514, 0x012517, 0x012516, 0x012519, + 0x012518, 0x01251B, 0x01251A, 0x01251D, 0x012524, 0x01251F, 0x01251E, 0x012521, + 0x012520, 0x012523, 0x012522, 0x01253C, 0x012535, 0x012527, 0x01200F, 0x01252B, + 0x012526, 0x012008, 0x012529, 0x012009, 0x01200A, 0x01252A, 0x01200B, 0x012531, + 0x012530, 0x012533, 0x012532, 0x012537, 0x02F8BB, 0x02F8B5, 0x012536, 0x02F8B4, + 0x012538, 0x012004, 0x012005, 0x01253D, 0x02F8B2, 0x01253F, 0x01253E, 0x012006, + 0x012007, 0x012000, 0x012001, 0x02F88E, 0x012002, 0x012003, 0x01201C, 0x01201D, + 0x01201E, 0x01201F, 0x012018, 0x012019, 0x01201A, 0x01201B, 0x012014, 0x012015, + 0x012011, 0x0120EB, 0x0120E4, 0x02F8B1, 0x0120E5, 0x02F8B0, 0x01209A, 0x01209B, + 0x02F8B6, 0x012094, 0x02F8B7, 0x012095, 0x012096, 0x012097, 0x012090, 0x012091, + 0x012092, 0x012093, 0x01216C, 0x01216D, 0x01216E, 0x01216F, 0x012168, 0x012169, + 0x01216A, 0x01216B, 0x012164, 0x012165, 0x012166, 0x012167, 0x012160, 0x012161, + 0x012162, 0x012163, 0x01217C, 0x01217D, 0x01217E, 0x01217F, 0x012178, 0x012179, + 0x01217A, 0x01217B, 0x012174, 0x012175, 0x012176, 0x012177, 0x02F8B9, 0x012170, + 0x012171, 0x012172, 0x012173, 0x01214C, 0x01214D, 0x01214E, 0x01214F, 0x012148, + 0x012149, 0x01214A, 0x01214B, 0x012144, 0x012145, 0x012146, 0x012147, 0x012140, + 0x012141, 0x012142, 0x012143, 0x01215C, 0x01215D, 0x01215E, 0x01215F, 0x012158, + 0x02F8BA, 0x012159, 0x01215A, 0x01215B, 0x012154, 0x012155, 0x012156, 0x012157, + 0x012150, 0x012151, 0x012152, 0x012153, 0x01212C, 0x01212D, 0x01212E, 0x01212F, + 0x012128, 0x012129, 0x01212A, 0x01212B, 0x012124, 0x012125, 0x012126, 0x012127, + 0x012120, 0x012121, 0x012122, 0x012123, 0x01213C, 0x01213D, 0x01213E, 0x01213F, + 0x012138, 0x012139, 0x01213A, 0x01213B, 0x012134, 0x012135, 0x012137, 0x012130, + 0x012131, 0x01210A, 0x012100, 0x012101, 0x01211A, 0x012114, 0x012115, 0x012116, + 0x0121D7, 0x0121D0, 0x0121D1, 0x0121D2, 0x0121D3, 0x0121AC, 0x0121AD, 0x0121AE, + 0x0121AF, 0x0121A8, 0x0121A9, 0x0121AA, 0x0121AB, 0x0121A4, 0x0121A5, 0x0121A6, + 0x0121A7, 0x0121A0, 0x0121A1, 0x0121A2, 0x0121A3, 0x0121BC, 0x0121BD, 0x0121BE, + 0x0121BF, 0x0121B8, 0x0121B9, 0x0121BA, 0x0121BB, 0x0121B4, 0x0121B5, 0x0121B6, + 0x0121B7, 0x0121B0, 0x0121B1, 0x0121B2, 0x0121B3, 0x01218C, 0x01218D, 0x01218E, + 0x01218F, 0x012188, 0x012189, 0x01218A, 0x01218B, 0x012184, 0x012185, 0x012186, + 0x012187, 0x012180, 0x00D7C1, 0x00D7C0, 0x00D7C3, 0x00D7C2, 0x00D7C5, 0x00D7C4, + 0x012181, 0x00D7C6, 0x012182, 0x012183, 0x00D7CB, 0x00D7E8, 0x00D7CD, 0x00D7CC, + 0x00D7CF, 0x00D7CE, 0x01219C, 0x01219D, 0x01219E, 0x01219F, 0x00D7D5, 0x00D7D4, + 0x00D7EF, 0x00D7D6, 0x00D7D9, 0x00D7D8, 0x00D7DB, 0x00D7DA, 0x00D7DD, 0x00D7DC, + 0x00D7DF, 0x00D7DE, 0x00D7E1, 0x00D7E0, 0x00D7E3, 0x00D7E2, 0x00D7E5, 0x00D7E4, + 0x00D7E9, 0x00D7E6, 0x00D7F8, 0x00D7ED, 0x00D7EB, 0x00D7EA, 0x00D7B2, 0x00D7EE, + 0x00D7EC, 0x00D7B3, 0x00D7F1, 0x00D7F0, 0x00D7F3, 0x00D7F2, 0x00D7F5, 0x00D7F4, + 0x00D7F7, 0x00D7F6, 0x00D7F9, 0x00D7FA, 0x00D7FB, 0x012198, 0x012199, 0x01219A, + 0x01219B, 0x00D7E7, 0x00FA00, 0x00FA03, 0x00FA02, 0x02F8A1, 0x02F858, 0x02F8A2, + 0x02F8A3, 0x02F8A0, 0x02F8A5, 0x02F8A6, 0x02F8A7, 0x02F8A8, 0x02F8A9, 0x02F8AA, + 0x02F8AB, 0x02F8A4, 0x02F8AD, 0x02F8AE, 0x02F8AF, 0x00FA01, 0x00FA1C, 0x00FA1D, + 0x00FA1E, 0x00FA06, 0x02F84D, 0x00FA19, 0x00FA1F, 0x02F8B8, 0x02F8AC, 0x02F84E, + 0x02F84C, 0x02F8BC, 0x02F8BD, 0x02F8BE, 0x02F8BF, 0x02F8C0, 0x02F8C1, 0x02F8C2, + 0x02F8C3, 0x02F8C4, 0x02F8C5, 0x02F8C6, 0x02F8C7, 0x02F8C8, 0x02F8C9, 0x02F8CA, + 0x02F8CB, 0x02F8CC, 0x02F8CD, 0x02F8CE, 0x02F8CF, 0x02F8D0, 0x02F8D1, 0x02F8D2, + 0x02F8D3, 0x02F8D4, 0x02F8D5, 0x02F8D6, 0x02F8D7, 0x02F8D8, 0x02F8D9, 0x02F8DA, + 0x02F8DB, 0x02F8DC, 0x02F8DD, 0x02F8DE, 0x02F8DF, 0x02F873, 0x02F973, 0x02F85A, + 0x02F85B, 0x02F872, 0x02F856, 0x00FA0A, 0x02F85F, 0x00FA0B, 0x00FA04, 0x00FA05, + 0x00FA07, 0x02F854, 0x02F855, 0x00FA4B, 0x00FA0C, 0x00FA61, 0x00FA0D, 0x02F8F2, + 0x02F8F3, 0x00FA60, 0x00FA09, 0x02F851, 0x02F852, 0x00FA08, 0x00FA0E, 0x02F857, + 0x02F850, 0x00FA0F, 0x00FA24, 0x00FA3D, 0x00FA71, 0x00FA25, 0x00FA34, 0x00FC22, + 0x00FA3C, 0x00FA26, 0x00FA28, 0x00FA3B, 0x00FA3A, 0x00FA38, 0x00FA75, 0x00FA2B, + 0x00FA3E, 0x00FA7B, 0x00FA32, 0x00FA31, 0x00FA73, 0x00FA33, 0x00FA30, 0x00FA36, + 0x00FA57, 0x00FA62, 0x00FA77, 0x00FA2F, 0x00FA72, 0x00FA3F, 0x00FA39, 0x00FA35, + 0x00FA37, 0x00FA23, 0x012194, 0x012195, 0x012196, 0x012197, 0x012190, 0x012191, + 0x012192, 0x012193, 0x00324C, 0x00324D, 0x00324E, 0x00324F, 0x003248, 0x003249, + 0x00324A, 0x00324B, 0x00FC10, 0x00FC11, 0x00FC12, 0x00325C, 0x00FC14, 0x00FC15, + 0x00FC16, 0x00FC17, 0x00FC1A, 0x00FC19, 0x00325D, 0x00FC1B, 0x00325E, 0x00FC18, + 0x00325F, 0x00FC1F, 0x00FC50, 0x00FC57, 0x00FC52, 0x00FC51, 0x00FC54, 0x02F859, + 0x00FC56, 0x00FC55, 0x00FCF8, 0x00FCF9, 0x00FCFA, 0x003258, 0x00FCFC, 0x003259, + 0x00FCFE, 0x00FCFD, 0x00325A, 0x00325B, 0x003254, 0x003255, 0x00FA49, 0x00FC53, + 0x003256, 0x003257, 0x003251, 0x00FA4A, 0x003252, 0x003253, 0x00FCF5, 0x003228, + 0x003229, 0x003224, 0x00FC01, 0x00FCE9, 0x00FCE8, 0x00FC02, 0x00FCE4, 0x00FC05, + 0x00FC03, 0x00FA47, 0x012506, 0x012507, 0x00FC0B, 0x00FCE3, 0x012505, 0x00FC09, + 0x00FC07, 0x00FCEF, 0x00FA46, 0x00FCC8, 0x00FCC9, 0x00FCCA, 0x00FCC4, 0x00FCF1, + 0x00FCF2, 0x00FCF7, 0x00FA45, 0x00FCF0, 0x00FCF6, 0x00FCF4, 0x003225, 0x003226, + 0x00FCFF, 0x003227, 0x003220, 0x00FCE5, 0x003221, 0x01251C, 0x00FCEB, 0x003222, + 0x00FCE7, 0x003223, 0x00FCCF, 0x011C6C, 0x00FA44, 0x00FC3A, 0x00FC1C, 0x00FCE6, + 0x00FC1E, 0x011C68, 0x00FC00, 0x00FC08, 0x00FC0A, 0x011C69, 0x00FC04, 0x00FC0F, + 0x00FC06, 0x011C6A, 0x00FC33, 0x011C6B, 0x011C64, 0x011C65, 0x00FC1D, 0x00FCCC, + 0x00FCCD, 0x00FCCE, 0x011C66, 0x011C67, 0x011C60, 0x011C61, 0x011C62, 0x011C63, + 0x011C7C, 0x011C7D, 0x011C7E, 0x011C7F, 0x011C78, 0x011C79, 0x011C7A, 0x011C7B, + 0x011C74, 0x011C75, 0x011C76, 0x011C77, 0x011C72, 0x0032BD, 0x0032BE, 0x0032BF, + 0x0032B8, 0x0032B9, 0x0032BA, 0x0032BB, 0x0032B4, 0x0032B5, 0x0032B6, 0x0032B7, + 0x0032B2, 0x0032B3, 0x011C5C, 0x011C5D, 0x011C5E, 0x00FF23, 0x011C59, 0x011C5A, + 0x011C2D, 0x011C2E, 0x00FC3C, 0x016A64, 0x011C27, 0x011C20, 0x011C21, 0x00FC3D, + 0x00FC3E, 0x011C22, 0x011C23, 0x016A4C, 0x00FC38, 0x00FC27, 0x00FF36, 0x00FC21, + 0x00FF37, 0x00FC23, 0x016A4D, 0x016A4E, 0x016A4F, 0x016A48, 0x00FC39, 0x016A46, + 0x011C02, 0x016A29, 0x016A2A, 0x016A2B, 0x016A24, 0x016A25, 0x016A26, 0x016A27, + 0x016A20, 0x016A21, 0x00FA48, 0x016A22, 0x016A23, 0x016A38, 0x00FA4C, 0x00FA4D, + 0x00FA4E, 0x00FA4F, 0x016A34, 0x016A35, 0x016A36, 0x016A37, 0x016A30, 0x016A31, + 0x016A32, 0x016A33, 0x016A0C, 0x016A0D, 0x016A0E, 0x016A0F, 0x016A08, 0x016A09, + 0x016A0A, 0x016A0B, 0x016A04, 0x016A05, 0x016A06, 0x00FA63, 0x00FA64, 0x00FA65, + 0x00FA66, 0x00FA67, 0x00FA68, 0x00FA69, 0x00FA6A, 0x00FA6B, 0x00FA6C, 0x00FA6D, + 0x016A07, 0x016A00, 0x00FA70, 0x016A01, 0x016A02, 0x016A03, 0x00FA74, 0x016A1C, + 0x00FA76, 0x016A1D, 0x00FA78, 0x00FA79, 0x00FA7A, 0x016A1E, 0x00FA7C, 0x00FA7D, + 0x00FA7E, 0x00FA7F, 0x016A1F, 0x016A18, 0x016A19, 0x016A1A, 0x016A1B, 0x016A14, + 0x016A15, 0x016A16, 0x016A17, 0x016A10, 0x016A11, 0x016A12, 0x016A13, 0x016AEC, + 0x016AED, 0x016AE8, 0x016AE9, 0x016AEA, 0x016AEB, 0x016AE4, 0x016AE5, 0x016AE6, + 0x016AE7, 0x016AE0, 0x016AE1, 0x016AE2, 0x016AE3, 0x011C8C, 0x011C8D, 0x011C8E, + 0x011C8F, 0x011C88, 0x011C89, 0x011C8A, 0x011C8B, 0x011C84, 0x011C85, 0x011C86, + 0x016AD9, 0x016ADA, 0x016ADB, 0x016AD4, 0x016AD5, 0x016AD6, 0x016AD7, 0x016AD0, + 0x016AD1, 0x016AD2, 0x00FC20, 0x00FC25, 0x00FC24, 0x016AD3, 0x00FC26, 0x011D46, + 0x011D58, 0x011D59, 0x011D54, 0x011D55, 0x011D56, 0x011D25, 0x011D27, 0x00306D, + 0x00306E, 0x00306F, 0x003060, 0x00FC2A, 0x003062, 0x003063, 0x00FC29, 0x00307C, + 0x00307B, 0x003050, 0x003051, 0x003052, 0x003053, 0x00FC2B, 0x003028, 0x003029, + 0x003024, 0x003025, 0x003026, 0x003027, 0x016B0C, 0x016B09, 0x016B0A, 0x016B0B, + 0x016B07, 0x016B00, 0x016B01, 0x016B02, 0x016B03, 0x016B1C, 0x016B1D, 0x016B1E, + 0x016B1F, 0x016B18, 0x016B19, 0x016B1A, 0x016B1B, 0x016B14, 0x016B15, 0x016B16, + 0x016B17, 0x016B10, 0x016B11, 0x0030EC, 0x0030ED, 0x0030EE, 0x0030EF, 0x0030E8, + 0x0030E9, 0x0030EA, 0x0030EB, 0x0030E4, 0x0030E5, 0x0030E6, 0x0030E7, 0x0030E0, + 0x0030E1, 0x0030E2, 0x0030E3, 0x0030FF, 0x0030F8, 0x0030F9, 0x0030FA, 0x0030F4, + 0x0030F5, 0x0030F6, 0x0030F7, 0x0030F0, 0x0030F1, 0x0030F2, 0x0030F3, 0x0030CC, + 0x0030CD, 0x0030CE, 0x0030CF, 0x0030C8, 0x0030C9, 0x0030CA, 0x0030CB, 0x0030C4, + 0x0030C5, 0x0030C6, 0x0030C7, 0x0030C0, 0x0030C1, 0x0030C2, 0x0030C3, 0x0030DC, + 0x00FAB1, 0x0030B0, 0x0030B1, 0x0030B2, 0x0030B3, 0x00308C, 0x00FAB0, 0x003089, + 0x00308A, 0x00308B, 0x003084, 0x003085, 0x003086, 0x003087, 0x016868, 0x01683B, + 0x0168F8, 0x0168F9, 0x00FC28, 0x0168FA, 0x0168FB, 0x0168F4, 0x00FC2C, 0x00FC2D, + 0x00FC2E, 0x00FC2F, 0x0168F5, 0x0168F6, 0x0168F7, 0x0168F0, 0x0168F1, 0x0168F2, + 0x0168F3, 0x0168CC, 0x0168CD, 0x0168CE, 0x0168CF, 0x0168D9, 0x0168DA, 0x0168DB, + 0x0168D4, 0x0168D5, 0x0168D6, 0x0168D7, 0x0168D0, 0x0168D1, 0x0168D2, 0x0168D3, + 0x0168AC, 0x0168AD, 0x0168AE, 0x0168AF, 0x0168A8, 0x0168A9, 0x0168AA, 0x0168AB, + 0x0168A4, 0x0168A5, 0x0168A6, 0x00FAB4, 0x00FABA, 0x0168A7, 0x0168A0, 0x0168A1, + 0x0168A2, 0x0168A3, 0x0168BC, 0x00FC59, 0x00FC5A, 0x00FC5B, 0x0168BD, 0x00FABB, + 0x0168BE, 0x00FC5F, 0x0168BF, 0x016888, 0x016889, 0x01688A, 0x01688B, 0x016887, + 0x01689B, 0x016968, 0x016969, 0x01696A, 0x01696B, 0x016964, 0x016965, 0x016966, + 0x016967, 0x016962, 0x016963, 0x01697C, 0x01697D, 0x016978, 0x016979, 0x01697A, + 0x01697B, 0x016974, 0x00FAB5, 0x016975, 0x016976, 0x016977, 0x016970, 0x016971, + 0x00FAB6, 0x016972, 0x016973, 0x01694C, 0x01694D, 0x01694E, 0x01694F, 0x016948, + 0x016949, 0x01694A, 0x01694B, 0x016944, 0x016945, 0x016946, 0x016947, 0x016940, + 0x016941, 0x00FAB2, 0x016942, 0x016943, 0x01695C, 0x01695D, 0x01695E, 0x01695F, + 0x016958, 0x016959, 0x01695A, 0x01695B, 0x016954, 0x016955, 0x016956, 0x016957, + 0x016950, 0x016951, 0x016952, 0x016953, 0x01692C, 0x01692D, 0x01692E, 0x01692F, + 0x016928, 0x016929, 0x01692A, 0x01692B, 0x016924, 0x016925, 0x00FA8C, 0x016926, + 0x016927, 0x016920, 0x016921, 0x016922, 0x016923, 0x01693C, 0x01693D, 0x01693E, + 0x01693F, 0x016938, 0x016939, 0x01693A, 0x01693B, 0x016934, 0x016935, 0x016936, + 0x016937, 0x016930, 0x016931, 0x016932, 0x016933, 0x01690C, 0x01690D, 0x01690E, + 0x01690F, 0x016908, 0x016909, 0x01690A, 0x01690B, 0x016904, 0x016905, 0x016906, + 0x016907, 0x016900, 0x016901, 0x016902, 0x016903, 0x01691C, 0x01691D, 0x01691E, + 0x01691F, 0x016918, 0x016919, 0x01691A, 0x01691B, 0x016914, 0x016915, 0x016916, + 0x016917, 0x016910, 0x016911, 0x016912, 0x016913, 0x0169EC, 0x0169ED, 0x0169EE, + 0x0169EF, 0x0169E8, 0x0169E9, 0x0169EA, 0x0169EB, 0x0169E4, 0x0169E5, 0x0169E6, + 0x0169E7, 0x0169E0, 0x0169E1, 0x0169E2, 0x0169E3, 0x0169FC, 0x0169FD, 0x0169FE, + 0x0169FF, 0x0169F8, 0x0169F9, 0x0169FA, 0x0169FB, 0x0169F4, 0x0169F5, 0x0169F6, + 0x0169F7, 0x0169F0, 0x00FAC0, 0x00FAC1, 0x00FAC6, 0x0169F1, 0x00FFD4, 0x00FFD5, + 0x0169F2, 0x0169F3, 0x0169CC, 0x0169CD, 0x00FAC4, 0x00FFDA, 0x0169CE, 0x0169CF, + 0x0169C8, 0x00FAC5, 0x00FAC8, 0x0169C9, 0x00FACA, 0x0169CA, 0x0169CB, 0x00FFAC, + 0x00FFAD, 0x00FFAE, 0x0169C4, 0x0169C5, 0x0169C6, 0x0169C7, 0x00FAAC, 0x00FACB, + 0x00FAD8, 0x0169C0, 0x0169C1, 0x0169C2, 0x0169C3, 0x00FAA9, 0x0169DC, 0x0169DD, + 0x0169DE, 0x00FAA4, 0x00FFA7, 0x00FAC9, 0x0169DF, 0x00FAAA, 0x00FACC, 0x00FACD, + 0x00FACE, 0x00FACF, 0x0169D8, 0x00FFAB, 0x00FFA2, 0x00FFA1, 0x00FAAE, 0x00FFA0, + 0x00FFA6, 0x00FAAD, 0x00FFA9, 0x00FFA8, 0x00FAA8, 0x00FFAA, 0x00FFA4, 0x00FAAF, + 0x00FFAF, 0x00FFA5, 0x0169D9, 0x0169DA, 0x0169DB, 0x0169D4, 0x0169D5, 0x0169D6, + 0x0169D7, 0x0169D0, 0x0169D1, 0x0169D2, 0x00FFD3, 0x0169D3, 0x0169AC, 0x0169AD, + 0x0169AE, 0x0169AF, 0x0169A8, 0x0169A9, 0x0169AA, 0x0169AB, 0x0169A4, 0x00FAC2, + 0x0169A5, 0x0169A6, 0x0169A7, 0x0169A0, 0x0169A1, 0x0169A2, 0x0169A3, 0x0169BC, + 0x0169BD, 0x0169BE, 0x0169BF, 0x0169B8, 0x0169B9, 0x0169BA, 0x0169BB, 0x0169B4, + 0x0169B5, 0x0169B6, 0x0169B7, 0x0169B0, 0x0169B1, 0x0169B2, 0x0169B3, 0x01698C, + 0x01698D, 0x01698E, 0x00FAD0, 0x01698F, 0x00FFD2, 0x00FFD6, 0x016988, 0x00FAD5, + 0x00FAD6, 0x00FFD7, 0x016989, 0x00FAD9, 0x01698A, 0x01698B, 0x016984, 0x00FAD4, + 0x00FFDB, 0x016985, 0x00FA10, 0x016986, 0x00FA12, 0x00FF84, 0x00FA14, 0x00FA15, + 0x00FA16, 0x00FA17, 0x00FA18, 0x00FF88, 0x00FA1A, 0x00FF8B, 0x00FF8D, 0x00FA1B, + 0x00FF8F, 0x00FF8E, 0x016987, 0x00FA11, 0x016980, 0x00FA13, 0x016981, 0x016982, + 0x016983, 0x01699C, 0x01699D, 0x01699E, 0x01699F, 0x016998, 0x016999, 0x01699A, + 0x01699B, 0x016994, 0x016995, 0x016996, 0x016997, 0x00FFA3, 0x016990, 0x016991, + 0x016992, 0x016993, 0x0118EC, 0x00FFBD, 0x0118ED, 0x0118EE, 0x00FFBE, 0x00FFBC, + 0x0118EF, 0x00FAA3, 0x00FFB0, 0x00FFB5, 0x00FFB6, 0x0118E8, 0x00FABC, 0x00FABD, + 0x00FABE, 0x00FFB7, 0x00FABF, 0x00FFB9, 0x00FFBA, 0x00FFBB, 0x00FAB8, 0x00FAB9, + 0x00FFB4, 0x00FFB8, 0x0118E9, 0x0118EA, 0x0118EB, 0x0118E4, 0x0118E5, 0x0118E6, + 0x0118E7, 0x0118E0, 0x0118E1, 0x0118E2, 0x0118E3, 0x0118FF, 0x0118F0, 0x0118F1, + 0x0118F2, 0x0118CC, 0x0118CD, 0x0118CE, 0x0118CF, 0x0118C8, 0x0118C9, 0x0118CA, + 0x0118CB, 0x0118C4, 0x0118C5, 0x0118C6, 0x0118C7, 0x0118C0, 0x0118C1, 0x0118C2, + 0x0118C3, 0x0118DC, 0x0118DD, 0x0118DE, 0x0118DF, 0x0118D8, 0x0118D9, 0x0118DA, + 0x0118DB, 0x0118D4, 0x0118D5, 0x0118D6, 0x0118D7, 0x0118D0, 0x0118D1, 0x0118D2, + 0x0118D3, 0x0118AC, 0x0118AD, 0x0118AE, 0x0118AF, 0x0118A8, 0x0118A9, 0x0118AA, + 0x0118AB, 0x0118A4, 0x0118A5, 0x0118A6, 0x0118A7, 0x0118A0, 0x0118A1, 0x0118A2, + 0x0118A3, 0x0118BC, 0x0118BD, 0x0118BE, 0x0118BF, 0x0118B8, 0x0118B9, 0x0118BA, + 0x0118BB, 0x0118B4, 0x0118B5, 0x0118B6, 0x0118B7, 0x0118B0, 0x0118B1, 0x0118B2, + 0x0118B3, 0x002C6C, 0x002C6D, 0x002C6E, 0x002C6F, 0x002C68, 0x002C69, 0x002C6A, + 0x002C6B, 0x002C64, 0x002C65, 0x002C66, 0x002C67, 0x002C60, 0x002C61, 0x002C62, + 0x002C63, 0x002C7E, 0x002C7F, 0x002C78, 0x002C79, 0x002C7A, 0x002C7B, 0x002C74, + 0x002C75, 0x002C76, 0x002C77, 0x002C70, 0x002C71, 0x002C72, 0x002C73, 0x002C4C, + 0x002C4D, 0x002C4E, 0x002C4F, 0x002C48, 0x002C49, 0x002C4A, 0x002C4B, 0x002C44, + 0x002C45, 0x002C46, 0x002C47, 0x002C40, 0x002C41, 0x002C42, 0x002C43, 0x002C5C, + 0x002C5D, 0x002C5E, 0x00FCD8, 0x00FCDD, 0x00FCDC, 0x002C58, 0x00FCD4, 0x00FCDE, + 0x00FCD6, 0x00FCDF, 0x002C59, 0x00FCD9, 0x00FCDA, 0x002C5A, 0x002C5B, 0x002C54, + 0x002C55, 0x002C56, 0x002C57, 0x002C50, 0x002C51, 0x002C52, 0x002C53, 0x002C2C, + 0x002C2D, 0x002C2E, 0x002C28, 0x002C29, 0x002C2A, 0x002C2B, 0x002C24, 0x002C25, + 0x002C26, 0x002C27, 0x002C20, 0x002C21, 0x002C22, 0x002C23, 0x002C3C, 0x00FCC5, + 0x002C3D, 0x002C3E, 0x002C3F, 0x002C38, 0x002C39, 0x002C3A, 0x002C3B, 0x002C34, + 0x002C35, 0x002C36, 0x002C37, 0x002C30, 0x002C31, 0x002C32, 0x002C33, 0x002C0C, + 0x002C0D, 0x002C0E, 0x002C0F, 0x002C08, 0x002C09, 0x002C0A, 0x002C0B, 0x002C04, + 0x002C05, 0x002C06, 0x00FC80, 0x00FC81, 0x00FC82, 0x00FCD2, 0x00FC84, 0x00FCD5, + 0x00FCD0, 0x00FC87, 0x00FC88, 0x00FC89, 0x00FC8A, 0x00FC8B, 0x00FC8C, 0x002C07, + 0x00FCDB, 0x00FC8F, 0x00FCC1, 0x00FC90, 0x00FC91, 0x00FC92, 0x00FCC2, 0x00FC94, + 0x002C00, 0x00FC96, 0x00FCD1, 0x00FCC0, 0x00FCD3, 0x00FCC7, 0x00FC93, 0x00FC97, + 0x00FCC6, 0x00FC95, 0x00FCA4, 0x00FCA1, 0x00FCA2, 0x00FC83, 0x00FCB9, 0x00FCD7, + 0x00FCC3, 0x00FCA7, 0x002C01, 0x00FCBB, 0x002C02, 0x00FCFB, 0x00FCCB, 0x00FCF3, + 0x00FCBA, 0x002C03, 0x00FCB0, 0x00FCB1, 0x00FCB2, 0x00FCB3, 0x00FCB4, 0x00FCB5, + 0x00FCB6, 0x00FCB7, 0x00FC98, 0x00FC99, 0x00FC9A, 0x00FC9B, 0x00FC9C, 0x00FC9D, + 0x00FC9E, 0x00FC9F, 0x002C1C, 0x002C1D, 0x002C1E, 0x002C1F, 0x002C18, 0x002C19, + 0x002C1A, 0x002C1B, 0x00FCBC, 0x002C14, 0x002C15, 0x002C16, 0x002C17, 0x00FCBD, + 0x00FCBE, 0x00FCBF, 0x002C10, 0x002C11, 0x002C12, 0x00FCA3, 0x002C13, 0x002CEC, + 0x002CED, 0x002CEE, 0x002CEB, 0x00FCE1, 0x00FCE2, 0x002CE4, 0x00FCE0, 0x00FCB8, + 0x002CE0, 0x002CE1, 0x002CE2, 0x002CE3, 0x002CFD, 0x002CF2, 0x002CF3, 0x002CCC, + 0x002CCD, 0x00FCAF, 0x00FCA8, 0x00FCA9, 0x00FCAA, 0x00FCAB, 0x00FCAC, 0x00FCAD, + 0x00FCAE, 0x002CCE, 0x002CCF, 0x002CC8, 0x002CC9, 0x002CCA, 0x002CCB, 0x002CC4, + 0x002CC5, 0x002CC6, 0x002CC7, 0x002CC0, 0x002CC1, 0x002CC2, 0x002CC3, 0x002CDC, + 0x002CDD, 0x002CDE, 0x002CDF, 0x002CD8, 0x002CD9, 0x002CDA, 0x002CDB, 0x002CD4, + 0x002CD5, 0x002CD6, 0x002CD7, 0x002CD0, 0x002CD1, 0x002CD2, 0x002CD3, 0x002CAC, + 0x002CAD, 0x002CAE, 0x002CAF, 0x002CA8, 0x002CA9, 0x002CAA, 0x002CAB, 0x002CA4, + 0x002CA5, 0x002CA6, 0x002CA7, 0x002CA0, 0x002CA1, 0x002CA2, 0x002CA3, 0x002CBC, + 0x002CBD, 0x002CBE, 0x002CBF, 0x002CB8, 0x002CB9, 0x002CBA, 0x002CBB, 0x002CB4, + 0x002CB6, 0x002CB7, 0x002CB0, 0x002CB1, 0x002CB2, 0x002CB3, 0x002C8C, 0x002C8D, + 0x002C8E, 0x002C8F, 0x002C88, 0x002C8B, 0x002C84, 0x011623, 0x002D64, 0x002D65, + 0x002D66, 0x002D67, 0x002D60, 0x002D61, 0x002D62, 0x002D63, 0x01160C, 0x01160D, + 0x01160E, 0x01160F, 0x011608, 0x011609, 0x01160A, 0x01160B, 0x011604, 0x011605, + 0x011606, 0x011607, 0x011600, 0x011601, 0x011602, 0x002D5D, 0x00FD7C, 0x00FD6D, + 0x002D5E, 0x002D5F, 0x00FD50, 0x00FD51, 0x00FD52, 0x002D58, 0x00FD54, 0x00FD55, + 0x00FD56, 0x00FD57, 0x00FD58, 0x00FD59, 0x00FD5A, 0x00FD5B, 0x00FD5C, 0x00FD5D, + 0x00FD5E, 0x00FD5F, 0x00FD78, 0x00FD7D, 0x00FD7E, 0x00FD62, 0x00FD74, 0x00FD75, + 0x00FD76, 0x00FD7F, 0x00FD67, 0x00FD79, 0x00FD7A, 0x00FD61, 0x002D59, 0x00FD60, + 0x00FD6B, 0x002D5A, 0x00FD65, 0x00FD71, 0x00FD72, 0x00FD73, 0x00FD64, 0x00FD70, + 0x00FD66, 0x00FD77, 0x00FD68, 0x00FD7B, 0x00FD6A, 0x00FD63, 0x00FD6C, 0x00FD69, + 0x00FD6E, 0x00FD6F, 0x002D5B, 0x002D54, 0x002D55, 0x002D56, 0x002D57, 0x002D50, + 0x002D51, 0x002D52, 0x002D53, 0x002D2D, 0x002D24, 0x002D25, 0x002D27, 0x002D20, + 0x002D21, 0x002D22, 0x002D23, 0x002D3C, 0x002D3D, 0x002D3E, 0x002D3F, 0x002D38, + 0x002D3B, 0x002D34, 0x002D0D, 0x002D0E, 0x002D0F, 0x002D08, 0x002D09, 0x002D0A, + 0x002D0B, 0x002D04, 0x002D05, 0x002D06, 0x002D07, 0x002D00, 0x002D01, 0x002D02, + 0x002D03, 0x002D1C, 0x002D1D, 0x002D1E, 0x002D1F, 0x002D18, 0x002D14, 0x0116A3, + 0x01168C, 0x01168D, 0x01168E, 0x01168F, 0x011688, 0x011689, 0x01168A, 0x01168B, + 0x011684, 0x011685, 0x011686, 0x011687, 0x011680, 0x011681, 0x011682, 0x01169E, + 0x011696, 0x002DDD, 0x002DDE, 0x002DD8, 0x002DD9, 0x002DDA, 0x002DDB, 0x002DD4, + 0x002DD5, 0x002DD6, 0x002DD0, 0x002DD1, 0x002DD2, 0x002DD3, 0x002DAC, 0x002DAD, + 0x002DAE, 0x002DA8, 0x002DA9, 0x002DAA, 0x002DAB, 0x002DA4, 0x002DA5, 0x002DA6, + 0x002DA0, 0x002DA1, 0x002DA2, 0x002DA3, 0x01E807, 0x002DBC, 0x002DBD, 0x002DBE, + 0x002DB8, 0x002DB9, 0x002DBA, 0x002DBB, 0x002DB4, 0x002DB5, 0x002DB6, 0x002DB0, + 0x01E817, 0x002DB1, 0x002DB2, 0x002DB3, 0x002D8C, 0x002D8D, 0x002D8E, 0x002D8F, + 0x002D88, 0x002D89, 0x002D8A, 0x002D8B, 0x01E83B, 0x002D84, 0x002D85, 0x002D86, + 0x002D87, 0x01E830, 0x01E831, 0x002D80, 0x002D81, 0x01E834, 0x002D82, 0x002D83, + 0x01E837, 0x002D94, 0x01E832, 0x002D95, 0x002D96, 0x002D90, 0x00FD04, 0x00FD05, + 0x00FD06, 0x00FD07, 0x00FD08, 0x00FD09, 0x00FD0A, 0x00FD0F, 0x00FD0C, 0x00FD0D, + 0x00FD0E, 0x00FD1F, 0x00FD10, 0x00FD11, 0x00FD12, 0x00FD13, 0x002D91, 0x00FD16, + 0x00FD1B, 0x00FD17, 0x002D92, 0x00FD18, 0x002D93, 0x011738, 0x00FD15, 0x00FD14, + 0x011739, 0x01173A, 0x01173B, 0x011734, 0x011735, 0x011736, 0x011737, 0x011730, + 0x011731, 0x011732, 0x011733, 0x01170C, 0x01170D, 0x01170E, 0x01170F, 0x011708, + 0x011709, 0x01170A, 0x00FD30, 0x01170B, 0x011704, 0x011705, 0x00FD35, 0x00FD34, + 0x011706, 0x00FD33, 0x011707, 0x011700, 0x011701, 0x011702, 0x011703, 0x00FD3D, + 0x011718, 0x011719, 0x011714, 0x011715, 0x011716, 0x011717, 0x011710, 0x011711, + 0x011712, 0x011713, 0x011448, 0x011449, 0x01144A, 0x011447, 0x011458, 0x011459, + 0x011454, 0x011455, 0x011456, 0x011457, 0x011450, 0x011451, 0x011452, 0x011453, + 0x01142C, 0x01142D, 0x01142E, 0x01142F, 0x011428, 0x011429, 0x01142A, 0x01142B, + 0x011424, 0x011425, 0x011426, 0x011427, 0x011420, 0x011421, 0x011422, 0x011423, + 0x011434, 0x011430, 0x011431, 0x011432, 0x011433, 0x01140C, 0x01140D, 0x01140E, + 0x01140F, 0x011408, 0x011409, 0x01140A, 0x01140B, 0x011404, 0x011405, 0x011406, + 0x011407, 0x011400, 0x011401, 0x011402, 0x011403, 0x01141C, 0x01141D, 0x01141E, + 0x01141F, 0x011418, 0x011419, 0x01B066, 0x01B067, 0x01B060, 0x01B061, 0x01B062, + 0x01B063, 0x01B07C, 0x01B07D, 0x01B07E, 0x01B07F, 0x01B078, 0x01B079, 0x01B07A, + 0x01B07B, 0x01B074, 0x01B075, 0x01B076, 0x01B077, 0x01B070, 0x01B071, 0x01B072, + 0x01B073, 0x01B04C, 0x01B04D, 0x01B04E, 0x01B04F, 0x01B048, 0x01B049, 0x01B04A, + 0x01B04B, 0x01B044, 0x01B045, 0x01B046, 0x01B047, 0x01B040, 0x00FDA4, 0x00FDA5, + 0x00FDAC, 0x01B041, 0x00FDA8, 0x00FDA9, 0x00FDAA, 0x00FDAB, 0x00FDAE, 0x00FDAD, + 0x01B042, 0x00FDAF, 0x01B043, 0x01B05C, 0x01B05D, 0x01B058, 0x01B05A, 0x01B05B, + 0x01B054, 0x01B055, 0x01B056, 0x01B057, 0x01B050, 0x01B051, 0x01B02C, 0x00FEC4, + 0x01B02D, 0x01B036, 0x00FEC7, 0x00FEC2, 0x01B037, 0x00FDC3, 0x00FEC0, 0x00FEC1, + 0x01B030, 0x00FEC5, 0x01B031, 0x01B032, 0x01B033, 0x00FEC6, 0x01B00C, 0x01B00D, + 0x01B00E, 0x00FDF9, 0x00FDF1, 0x00FDFB, 0x00FDF7, 0x01B00F, 0x01B008, 0x00FDF5, + 0x00FDF6, 0x01B009, 0x01B00A, 0x01B00B, 0x01B004, 0x01B005, 0x00FDF4, 0x01B0E6, + 0x00FDF8, 0x01B0E7, 0x00FDF0, 0x01B0E0, 0x00FDF2, 0x01B0E1, 0x01B0E2, 0x01B0E3, + 0x01B0FC, 0x01B0FD, 0x01B0FE, 0x01B0FF, 0x01B0F8, 0x01B0F9, 0x01B0FA, 0x01B0FB, + 0x00FEDC, 0x01B0F4, 0x01B0F5, 0x01B0F6, 0x01B0F7, 0x01B0F0, 0x01B0F1, 0x01B0F2, + 0x01B0F3, 0x00FEC3, 0x01B0CC, 0x01B0CD, 0x01B0CE, 0x01B0CF, 0x01B0C8, 0x01B0C9, + 0x01B0CA, 0x01B0CB, 0x01B0C4, 0x01B0C5, 0x01B0C6, 0x01B0C7, 0x00FDA2, 0x01B0C0, + 0x01B0C1, 0x01B0C2, 0x01B0C3, 0x01B0DC, 0x01B0DD, 0x01B0DE, 0x01B0DF, 0x01B0D8, + 0x01B0D9, 0x00FDA1, 0x01B0DA, 0x01B0DB, 0x01B0D4, 0x01B0D5, 0x00FDA0, 0x01B0D6, + 0x01B0D7, 0x01B0D0, 0x01B0D1, 0x01B0D2, 0x01B0D3, 0x01B0AC, 0x01B0AD, 0x01B0AE, + 0x01B0AF, 0x01B0A8, 0x01B0A9, 0x01B0AA, 0x01B0AB, 0x01B0A4, 0x01B0A5, 0x01B0A6, + 0x01B0A7, 0x01B0A0, 0x01B0A1, 0x01B0A2, 0x01B0A3, 0x01B0BC, 0x01B0BD, 0x01B0BE, + 0x01B0BF, 0x01B0B8, 0x01B0B9, 0x01B0BA, 0x01B0BB, 0x01B0B4, 0x01B0B5, 0x01B0B6, + 0x01B0B7, 0x01B0B0, 0x01B0B1, 0x01B0B2, 0x01B0B3, 0x01B08C, 0x01B08D, 0x01B08E, + 0x01B08F, 0x01B088, 0x01B089, 0x01B08A, 0x01B08B, 0x01B084, 0x01B085, 0x01B086, + 0x01B087, 0x01B080, 0x01B081, 0x01B082, 0x01B083, 0x01B09C, 0x01B09D, 0x01B09E, + 0x01B09F, 0x01B098, 0x01B099, 0x01B09A, 0x01B09B, 0x01B094, 0x01B095, 0x01B096, + 0x01B097, 0x01B090, 0x01B091, 0x01B092, 0x01B093, 0x0115D8, 0x0115D9, 0x0115DA, + 0x0115DB, 0x0115AC, 0x0115AD, 0x0115AE, 0x0115A8, 0x0115A9, 0x0115AA, 0x0115AB, + 0x0115A4, 0x0115A5, 0x0115A6, 0x0115A7, 0x0115A0, 0x0115A1, 0x0115A2, 0x0115A3, + 0x01B10C, 0x01B10D, 0x01B10E, 0x01B10F, 0x01B108, 0x01B109, 0x01B10A, 0x00FDA7, + 0x01B10B, 0x01B104, 0x01B105, 0x011585, 0x01159A, 0x01159B, 0x011594, 0x011595, + 0x00FDA6, 0x011596, 0x00FD81, 0x00FF2D, 0x00FF2E, 0x011597, 0x00FD80, 0x00FD84, + 0x00FD87, 0x00FD86, 0x00FD8B, 0x00FD89, 0x00FD88, 0x00FF2F, 0x00FD85, 0x00FD8E, + 0x00FD8D, 0x00FD8F, 0x00FD93, 0x011590, 0x00FD92, 0x011591, 0x00FD96, 0x00FD94, + 0x011592, 0x011593, 0x011228, 0x011229, 0x01122A, 0x00FDBC, 0x00FD8C, 0x00FD9C, + 0x00FD9B, 0x00FF2C, 0x01122B, 0x011224, 0x00FF2B, 0x011225, 0x011226, 0x011227, + 0x011220, 0x011221, 0x00FF21, 0x011222, 0x00FDBD, 0x00FF22, 0x00FF25, 0x00FF24, + 0x00FF27, 0x00FF26, 0x00FDB7, 0x00FDBB, 0x00FDB2, 0x00FDB0, 0x00FDB6, 0x00FF28, + 0x00FF2A, 0x00FDB5, 0x00FDB8, 0x00FDB9, 0x00FDBA, 0x00FF29, 0x011223, 0x00FDB4, + 0x00FDBE, 0x00FDBF, 0x00FEE8, 0x00FEEC, 0x01120C, 0x01120D, 0x00FECC, 0x00FEED, + 0x00FEEE, 0x01120E, 0x00FECA, 0x00FEC9, 0x00FF53, 0x00FECB, 0x00FEC8, 0x00FECD, + 0x00FECE, 0x00FECF, 0x00FF50, 0x00FF51, 0x00FF52, 0x01120F, 0x011208, 0x011209, + 0x01120A, 0x00FF56, 0x01120B, 0x011204, 0x011205, 0x011206, 0x011207, 0x011200, + 0x011201, 0x011202, 0x00FEF8, 0x00FEE2, 0x00FDA3, 0x00FEE3, 0x00FEE0, 0x00FEE1, + 0x00FEFC, 0x00FEE5, 0x00FEF9, 0x00FEE9, 0x00FEEA, 0x00FEEF, 0x00FEE4, 0x00FEEB, + 0x00FEE6, 0x00FEE7, 0x00FF54, 0x00FF55, 0x00FEF2, 0x00FEF3, 0x00FEF0, 0x00FEF1, + 0x00FEF7, 0x00FF57, 0x00FF58, 0x00FEFA, 0x00FF5A, 0x00FF59, 0x00FEF4, 0x00FEF5, + 0x00FEF6, 0x00FEFB, 0x011203, 0x01121C, 0x01121D, 0x01121E, 0x01121F, 0x011218, + 0x011219, 0x01121A, 0x01121B, 0x011214, 0x011215, 0x011216, 0x011217, 0x011210, + 0x011211, 0x011213, 0x0112F8, 0x0112F9, 0x0112F4, 0x0112F5, 0x0112F6, 0x0112F7, + 0x0112F0, 0x0112F1, 0x0112F2, 0x0112F3, 0x0112CC, 0x0112CD, 0x0112CE, 0x0112CF, + 0x0112C8, 0x0112C9, 0x0112CA, 0x0112CB, 0x0112C4, 0x0112C5, 0x0112C6, 0x0112C7, + 0x0112C0, 0x0112C1, 0x0112C2, 0x0112C3, 0x0112DC, 0x0112DD, 0x0112DE, 0x0112D8, + 0x0112D9, 0x0112DA, 0x0112DB, 0x0112D4, 0x0112D5, 0x0112D6, 0x0112D7, 0x0112D0, + 0x0112D1, 0x0112D2, 0x0112D3, 0x0112A8, 0x0112A4, 0x0112A5, 0x0112A6, 0x0112A7, + 0x0112A0, 0x0112A1, 0x0112A2, 0x0112A3, 0x0112BC, 0x0112BD, 0x0112BE, 0x0112BF, + 0x0112B8, 0x0112B9, 0x0112BA, 0x0112BB, 0x0112B4, 0x0112B5, 0x0112B6, 0x0112B7, + 0x0112B0, 0x0112B1, 0x0112B2, 0x0112B3, 0x01128C, 0x01128D, 0x01128F, 0x011288, + 0x01128A, 0x01128B, 0x011284, 0x011285, 0x011286, 0x011280, 0x011281, 0x011282, + 0x011283, 0x01129C, 0x01129D, 0x01129F, 0x011298, 0x011299, 0x01129A, 0x01129B, + 0x011294, 0x011295, 0x011296, 0x011297, 0x011290, 0x011291, 0x011292, 0x011293, + 0x011360, 0x011361, 0x01135D, 0x01135E, 0x01135F, 0x011350, 0x01132C, 0x01132D, + 0x01132E, 0x01132F, 0x011328, 0x01132A, 0x01132B, 0x011324, 0x011325, 0x011326, + 0x011327, 0x011320, 0x011321, 0x011322, 0x011323, 0x01133D, 0x011338, 0x011339, + 0x011335, 0x011336, 0x011337, 0x011330, 0x011332, 0x011333, 0x01130C, 0x01130F, + 0x011308, 0x011309, 0x01130A, 0x01130B, 0x011305, 0x011306, 0x011307, 0x01131C, + 0x01131D, 0x01131E, 0x01131F, 0x011318, 0x011319, 0x01131A, 0x01131B, 0x011314, + 0x011315, 0x011316, 0x011317, 0x011310, 0x011313, 0x01106C, 0x01106D, 0x01106E, + 0x01106F, 0x011068, 0x011069, 0x01106A, 0x01106B, 0x011064, 0x011065, 0x011066, + 0x011067, 0x011060, 0x011061, 0x011062, 0x011063, 0x01105C, 0x01105D, 0x01105E, + 0x01105F, 0x011058, 0x011059, 0x01105A, 0x01105B, 0x011054, 0x011055, 0x011056, + 0x011057, 0x011052, 0x011053, 0x01102C, 0x01102D, 0x01102E, 0x01102F, 0x011028, + 0x011029, 0x01102A, 0x01102B, 0x011024, 0x011025, 0x011026, 0x011027, 0x011020, + 0x011021, 0x011022, 0x011023, 0x011034, 0x011035, 0x011036, 0x011037, 0x011030, + 0x011031, 0x011032, 0x01100B, 0x011004, 0x011007, 0x011003, 0x01101C, 0x01101D, + 0x01101E, 0x01101F, 0x011018, 0x011019, 0x01101A, 0x01101B, 0x011014, 0x011015, + 0x011016, 0x011017, 0x011010, 0x011011, 0x011012, 0x011013, 0x0110E8, 0x0110E4, + 0x0110E5, 0x0110E6, 0x0110E7, 0x0110E0, 0x0110E1, 0x0110E2, 0x0110E3, 0x0110F8, + 0x0110F9, 0x0110F4, 0x0110F5, 0x0110F6, 0x0110F7, 0x0110F0, 0x0110F1, 0x0110F2, + 0x0110F3, 0x0110DC, 0x0110DD, 0x0110DE, 0x0110DF, 0x0110D8, 0x0110D9, 0x0110DA, + 0x0110DB, 0x0110D4, 0x0110D5, 0x0110D6, 0x0110D7, 0x0110D0, 0x0110D1, 0x0110D2, + 0x0110D3, 0x0110AC, 0x0110AD, 0x0110AE, 0x0110AF, 0x0110A8, 0x0110A9, 0x0110AA, + 0x0110AB, 0x0110A4, 0x0110A5, 0x0110A6, 0x0110A7, 0x0110A0, 0x0110A1, 0x0110A2, + 0x0110A3, 0x01108C, 0x01108D, 0x01108E, 0x01108F, 0x011088, 0x011089, 0x01108A, + 0x01108B, 0x011084, 0x011085, 0x011086, 0x011087, 0x011083, 0x01109C, 0x01109D, + 0x01109E, 0x01109F, 0x011098, 0x011099, 0x01109A, 0x01109B, 0x011094, 0x011095, + 0x011096, 0x011097, 0x011090, 0x011091, 0x011092, 0x011093, 0x01116C, 0x01116D, + 0x01116E, 0x01116F, 0x011168, 0x011169, 0x01116A, 0x01116B, 0x011164, 0x011165, + 0x011166, 0x011167, 0x011160, 0x011161, 0x011162, 0x011163, 0x011176, 0x011170, + 0x011171, 0x011172, 0x00278C, 0x011153, 0x011124, 0x011125, 0x011126, 0x002790, + 0x002465, 0x002466, 0x002461, 0x002462, 0x002463, 0x00247C, 0x002471, 0x002472, + 0x002473, 0x011103, 0x01111C, 0x01111D, 0x01111E, 0x01111F, 0x011118, 0x011119, + 0x01111A, 0x01111B, 0x011114, 0x011115, 0x011116, 0x011117, 0x011110, 0x011111, + 0x011112, 0x011113, 0x0111EC, 0x0111ED, 0x0111EE, 0x0111EF, 0x0111E8, 0x0111E9, + 0x0111EA, 0x0111EB, 0x0111E4, 0x0111E5, 0x0111E6, 0x0111E7, 0x0111E1, 0x0111E2, + 0x0111E3, 0x0111F4, 0x0111F0, 0x0111F1, 0x0111F2, 0x01E8AE, 0x01E8B4, 0x0111F3, + 0x0111C4, 0x0111C1, 0x01E8B9, 0x01E8BE, 0x01E8B8, 0x0111C2, 0x01E8A9, 0x01E8BA, + 0x01E8AA, 0x0111C3, 0x0111DC, 0x0111D8, 0x01E887, 0x01E880, 0x01E881, 0x0111D9, + 0x0111DA, 0x0111D4, 0x0111D5, 0x0111D6, 0x01E884, 0x0111D7, 0x0111D0, 0x01E886, + 0x01E885, 0x0111D1, 0x01E890, 0x0111D2, 0x01E889, 0x01E888, 0x01E88D, 0x0111D3, + 0x0111AC, 0x0111AD, 0x01E898, 0x0111AE, 0x01E88A, 0x0111AF, 0x0111A8, 0x0111A9, + 0x0111AA, 0x0111AB, 0x0111A4, 0x0111A5, 0x01E8C3, 0x0111A6, 0x0111A7, 0x0111A0, + 0x0111A1, 0x0111A2, 0x01E88F, 0x0024ED, 0x0024EE, 0x0024EF, 0x0024EA, 0x0024EB, + 0x0111B0, 0x0111B1, 0x0111B2, 0x0024FC, 0x0024F1, 0x0024F2, 0x0024F3, 0x011183, + 0x01119C, 0x01119D, 0x01119E, 0x01119F, 0x011198, 0x01E88C, 0x01E8CA, 0x01E88E, + 0x011199, 0x01119A, 0x01119B, 0x011194, 0x011195, 0x011196, 0x011197, 0x011190, + 0x011191, 0x011192, 0x011193, 0x010E6C, 0x010E6D, 0x010E6E, 0x010E6F, 0x010E68, + 0x010E69, 0x010E6A, 0x010E6B, 0x010E64, 0x010E65, 0x010E66, 0x010E67, 0x010E60, + 0x010E61, 0x010E62, 0x010E63, 0x010E7C, 0x010E7D, 0x010E7E, 0x010E78, 0x010E79, + 0x010E7A, 0x010E7B, 0x010E74, 0x010E75, 0x010E76, 0x010E77, 0x010E70, 0x010E71, + 0x010E72, 0x010E73, 0x00248C, 0x00248D, 0x00248E, 0x00248F, 0x002488, 0x002489, + 0x00248A, 0x00248B, 0x002484, 0x002485, 0x002486, 0x002487, 0x002480, 0x002481, + 0x002482, 0x002483, 0x002498, 0x002499, 0x00249A, 0x00249B, 0x002494, 0x002495, + 0x002496, 0x002497, 0x002490, 0x002491, 0x002492, 0x002493, 0x010C48, 0x010C44, + 0x010C45, 0x010C46, 0x010C47, 0x010C40, 0x010C41, 0x010C42, 0x010C43, 0x010C2C, + 0x010C2D, 0x010C2E, 0x010C2F, 0x010C28, 0x010C29, 0x010C2A, 0x010C2B, 0x010C24, + 0x010C25, 0x010C26, 0x010C27, 0x010C20, 0x010C21, 0x010C22, 0x010C23, 0x010C3C, + 0x010C3D, 0x010C3E, 0x010C3F, 0x010C38, 0x010C39, 0x010C3A, 0x010C3B, 0x010C34, + 0x010C35, 0x010C36, 0x010C37, 0x010C30, 0x010C31, 0x010C32, 0x010C33, 0x010C0C, + 0x010C0D, 0x010C0E, 0x010C0F, 0x010C08, 0x010C09, 0x010C0A, 0x010C0B, 0x010C04, + 0x010C05, 0x010C06, 0x010C07, 0x010C00, 0x010C01, 0x010C02, 0x010C03, 0x010C1C, + 0x010C1D, 0x010C1E, 0x010C1F, 0x010C18, 0x010C19, 0x010C1A, 0x010C1B, 0x010C14, + 0x010C15, 0x010C16, 0x010C17, 0x010C10, 0x010C11, 0x010C12, 0x010C13, 0x010CEC, + 0x010CED, 0x010CEE, 0x010CEF, 0x010CE8, 0x010CE9, 0x010CEA, 0x010CEB, 0x010CE4, + 0x010CE5, 0x010CE6, 0x010CE7, 0x010CE0, 0x010CE1, 0x010CE2, 0x010CE3, 0x010CFC, + 0x010CFD, 0x010CFE, 0x010CFF, 0x010CFA, 0x010CFB, 0x010CF0, 0x010CF1, 0x010CF2, + 0x010CCC, 0x010CCD, 0x010CCE, 0x010CCF, 0x010CC8, 0x010CC9, 0x010CCA, 0x010CCB, + 0x010CC4, 0x010CC5, 0x010CC6, 0x010CC7, 0x010CC0, 0x010CC1, 0x010CC2, 0x010CC3, + 0x010CDC, 0x010CDD, 0x010CDE, 0x010CDF, 0x010CD8, 0x010CD9, 0x010CDA, 0x010CDB, + 0x010CD4, 0x010CD5, 0x010CD6, 0x010CD7, 0x010CD0, 0x010CD1, 0x010CD2, 0x010CD3, + 0x010CAC, 0x010CAD, 0x010CAE, 0x010CAF, 0x010CA8, 0x010CA9, 0x010CAA, 0x010CAB, + 0x010CA4, 0x010CA5, 0x010CA6, 0x010CA7, 0x010CA0, 0x010CA1, 0x010CA2, 0x010CA3, + 0x010CB0, 0x010CB1, 0x010CB2, 0x010C8C, 0x010C8D, 0x010C8E, 0x010C8F, 0x010C88, + 0x010C89, 0x010C8A, 0x010C8B, 0x010C84, 0x010C85, 0x010C86, 0x010C87, 0x010C80, + 0x010C81, 0x010C82, 0x010C83, 0x010C9C, 0x010C9D, 0x010C9E, 0x010C9F, 0x010C98, + 0x010C99, 0x010C9A, 0x010C9B, 0x010C94, 0x010C95, 0x010C96, 0x010C97, 0x010C90, + 0x010C91, 0x010C92, 0x010C93, 0x002078, 0x002079, 0x002074, 0x002075, 0x002076, + 0x002077, 0x002070, 0x010A6C, 0x010A6D, 0x010A6E, 0x010A6F, 0x010A68, 0x010A69, + 0x010A6A, 0x010A6B, 0x010A64, 0x010A65, 0x010A66, 0x010A67, 0x010A60, 0x010A61, + 0x010A62, 0x010A63, 0x010A7C, 0x010A7D, 0x010A7E, 0x010A78, 0x010A79, 0x010A7A, + 0x010A7B, 0x010A74, 0x010A75, 0x010A76, 0x010A77, 0x010A70, 0x010A71, 0x010A72, + 0x010A73, 0x010A44, 0x010A45, 0x010A46, 0x010A47, 0x010A40, 0x010A41, 0x010A42, + 0x010A43, 0x002088, 0x002089, 0x002084, 0x002085, 0x002086, 0x002087, 0x002080, + 0x002081, 0x002082, 0x002083, 0x010A2C, 0x010A2D, 0x010A2E, 0x010A2F, 0x010A28, + 0x010A29, 0x010A2A, 0x010A2B, 0x010A24, 0x010A25, 0x010A26, 0x010A27, 0x010A20, + 0x010A21, 0x010A22, 0x00216D, 0x00216E, 0x00216F, 0x002168, 0x002169, 0x00216A, + 0x00216B, 0x002164, 0x002165, 0x002166, 0x002167, 0x002160, 0x00217D, 0x00217E, + 0x00217F, 0x002178, 0x002179, 0x00217A, 0x00217B, 0x002174, 0x002175, 0x002176, + 0x002177, 0x002170, 0x002172, 0x002173, 0x010A1C, 0x010A1E, 0x002149, 0x010A19, + 0x010A1A, 0x010A1B, 0x002145, 0x010A17, 0x010A10, 0x010A11, 0x010A12, 0x002159, + 0x00215A, 0x00215B, 0x002156, 0x002157, 0x002150, 0x00212D, 0x00212F, 0x002128, + 0x00212A, 0x00212B, 0x002124, 0x002126, 0x00213C, 0x002139, 0x010AC9, 0x010ACA, + 0x010ADF, 0x010AD8, 0x010ADB, 0x010AD4, 0x010AD5, 0x010AD7, 0x010AD0, 0x010AD2, + 0x00211D, 0x002119, 0x00211A, 0x00211B, 0x002115, 0x002110, 0x002111, 0x002112, + 0x002113, 0x010A8C, 0x010A8D, 0x010A8E, 0x010A8F, 0x010A88, 0x010A89, 0x010A8A, + 0x010A8B, 0x010A84, 0x010A85, 0x010A86, 0x010A87, 0x010A80, 0x010A81, 0x010A82, + 0x010A83, 0x010A9C, 0x010A9D, 0x010A9E, 0x010A9F, 0x010A98, 0x010A99, 0x010A9A, + 0x010A9B, 0x010A94, 0x010A95, 0x010A96, 0x010A97, 0x010A90, 0x010A91, 0x010A92, + 0x010A93, 0x010B6C, 0x010B6D, 0x010B6E, 0x010B6F, 0x010B68, 0x010B69, 0x010B6A, + 0x010B6B, 0x010B64, 0x010B65, 0x010B66, 0x010B67, 0x010B60, 0x010B61, 0x010B62, + 0x010B63, 0x010B7C, 0x010B7D, 0x010B7E, 0x010B7F, 0x010B78, 0x010B79, 0x010B7A, + 0x010B7B, 0x010B70, 0x010B71, 0x010B72, 0x010B4C, 0x010B4D, 0x010B4E, 0x010B4F, + 0x010B48, 0x010B49, 0x010B4A, 0x010B4B, 0x010B44, 0x010B45, 0x010B46, 0x010B47, + 0x010B40, 0x010B41, 0x010B42, 0x010B43, 0x010B5C, 0x010B5D, 0x010B5E, 0x010B59, + 0x010B5A, 0x002187, 0x002180, 0x010B53, 0x010B2C, 0x010B2D, 0x010B2E, 0x010B2F, + 0x010B28, 0x010B29, 0x010B2A, 0x010B2B, 0x010B24, 0x010B25, 0x010B26, 0x010B27, + 0x010B20, 0x010B21, 0x010B22, 0x001E6D, 0x001E6E, 0x001E6F, 0x001E68, 0x001E69, + 0x001E6A, 0x001E6B, 0x001E64, 0x001E67, 0x001E60, 0x001E5D, 0x001E5E, 0x001E5F, + 0x001E58, 0x001E59, 0x001E5A, 0x001E5B, 0x001E54, 0x001E55, 0x001E56, 0x001E57, + 0x001E50, 0x001E51, 0x001E52, 0x001E53, 0x001E2C, 0x001E2D, 0x001E2E, 0x001E2F, + 0x001E28, 0x001E29, 0x001E2A, 0x001E2B, 0x001E24, 0x001E25, 0x001E26, 0x001E27, + 0x001E20, 0x001E21, 0x001E22, 0x001E23, 0x001E3C, 0x001E3D, 0x001E3E, 0x001E3F, + 0x001E38, 0x001E39, 0x001E3A, 0x001E3B, 0x001E34, 0x001E35, 0x001E36, 0x001E37, + 0x001E30, 0x001E31, 0x001E32, 0x001E33, 0x001E0C, 0x001E0D, 0x001E0E, 0x001E0F, + 0x001E08, 0x001E09, 0x001E0A, 0x001E0B, 0x001E04, 0x001E05, 0x001E06, 0x001E07, + 0x001E00, 0x001E01, 0x001E02, 0x001E03, 0x001E1C, 0x001E19, 0x001E15, 0x001E16, + 0x001E17, 0x001E10, 0x001E11, 0x001E12, 0x001E13, 0x001EEC, 0x001EED, 0x001EEE, + 0x001EEF, 0x001EE8, 0x001EE9, 0x001EEA, 0x001EEB, 0x001EE4, 0x001EE5, 0x001EE6, + 0x001EE7, 0x001EE0, 0x001EE1, 0x001EE2, 0x001EE3, 0x01E8CC, 0x01E8CD, 0x01E8CE, + 0x001EFC, 0x001ECD, 0x001ECE, 0x001ECF, 0x001EC8, 0x001EC9, 0x001ECA, 0x001ECB, + 0x001EC4, 0x001EC5, 0x001EC6, 0x001EC7, 0x001EC0, 0x001EC3, 0x001EDC, 0x001EA9, + 0x001EA0, 0x001E87, 0x001E80, 0x001F6E, 0x001F6F, 0x001F6A, 0x001F6B, 0x001F64, + 0x001F67, 0x01080D, 0x01080E, 0x001F7A, 0x001F77, 0x001F70, 0x01081D, 0x01081E, + 0x010815, 0x010816, 0x010813, 0x0108ED, 0x0108EF, 0x0108E9, 0x001F29, 0x001F2A, + 0x001F2B, 0x001F27, 0x001F20, 0x001F3C, 0x001F3D, 0x001F3E, 0x001F3F, 0x001F38, + 0x001F39, 0x001F3A, 0x001F3B, 0x001F34, 0x001F35, 0x001F36, 0x001F37, 0x001F30, + 0x001F31, 0x001F32, 0x001F33, 0x001F0C, 0x001F0D, 0x001F0E, 0x001F0F, 0x001F08, + 0x001F09, 0x001F0A, 0x001F0B, 0x001F04, 0x001F05, 0x001F06, 0x001F07, 0x001F00, + 0x001F01, 0x001F02, 0x001F03, 0x001F1C, 0x0108AD, 0x0108AE, 0x001F15, 0x001F11, + 0x001F12, 0x001F13, 0x001FEC, 0x001FE8, 0x001FE9, 0x001FEA, 0x001FEB, 0x001FE4, + 0x001FE5, 0x001FE6, 0x001FE7, 0x001FE0, 0x001FE1, 0x001FE2, 0x001FE3, 0x001FFC, + 0x01088C, 0x01088D, 0x01088E, 0x010884, 0x00FA88, 0x00FA8E, 0x010887, 0x010880, + 0x01089C, 0x00FA9C, 0x01089D, 0x00FA89, 0x00FA98, 0x00FA8B, 0x00FA8A, 0x00FA9E, + 0x01089E, 0x00FA8D, 0x001FC8, 0x010894, 0x010897, 0x010890, 0x010893, 0x001FD8, + 0x001FD9, 0x001FDA, 0x001FDB, 0x001FD6, 0x001FD7, 0x001FD0, 0x001FD1, 0x001FD2, + 0x001FD3, 0x001FAC, 0x001FAD, 0x001FAE, 0x001FAF, 0x001FA8, 0x001FA9, 0x001FAA, + 0x001FAB, 0x001FA4, 0x001FA5, 0x001FA6, 0x001FA7, 0x001FA0, 0x001FA1, 0x001FA2, + 0x001FA3, 0x001FBC, 0x001FBE, 0x001FB8, 0x001FB9, 0x001FBA, 0x001FBB, 0x001FB4, + 0x001FB6, 0x001FB7, 0x001FB0, 0x001FB1, 0x001FB2, 0x001FB3, 0x001F8C, 0x001F8D, + 0x001F8E, 0x001F8F, 0x001F88, 0x001F89, 0x001F8A, 0x001F8B, 0x001F84, 0x001F85, + 0x001F86, 0x001F87, 0x001F80, 0x001F81, 0x001F82, 0x001F83, 0x001F9C, 0x001C6D, + 0x001C6E, 0x001C6F, 0x001C68, 0x001C6B, 0x001C64, 0x010933, 0x01090C, 0x01090D, + 0x01090E, 0x01090F, 0x010908, 0x010909, 0x01090A, 0x010903, 0x001C4D, 0x001C4E, + 0x001C4F, 0x001C48, 0x010919, 0x01091A, 0x0109E3, 0x0109FC, 0x0109FD, 0x0109FE, + 0x0109FF, 0x0109F8, 0x0109F9, 0x0109FA, 0x0109FB, 0x0109F4, 0x0109F5, 0x0109F6, + 0x0109F3, 0x0109CC, 0x0109CD, 0x0109CE, 0x0109CF, 0x0109C8, 0x0109C9, 0x0109CA, + 0x0109CB, 0x0109C4, 0x0109C5, 0x0109C6, 0x0109C7, 0x0109C0, 0x0109C1, 0x0109C2, + 0x001C01, 0x001C02, 0x0109BC, 0x0109BF, 0x001CE9, 0x001CEA, 0x001CEB, 0x0109B4, + 0x0109B5, 0x0109B6, 0x0109B7, 0x0109B0, 0x0109B1, 0x0109B2, 0x0109B3, 0x01098C, + 0x01098D, 0x01098E, 0x01098F, 0x010988, 0x010989, 0x01098A, 0x01098B, 0x010986, + 0x010981, 0x010982, 0x010983, 0x01099C, 0x01099D, 0x01099E, 0x01099F, 0x010998, + 0x010999, 0x01099A, 0x01099B, 0x010994, 0x010995, 0x010996, 0x010997, 0x010990, + 0x010991, 0x010992, 0x010993, 0x01066C, 0x01066D, 0x01066E, 0x01066F, 0x010668, + 0x010669, 0x01066A, 0x01066B, 0x010664, 0x010665, 0x010666, 0x010667, 0x010660, + 0x010661, 0x010662, 0x010663, 0x01067C, 0x01067D, 0x01067E, 0x01067F, 0x010678, + 0x010679, 0x01067A, 0x01067B, 0x010674, 0x010675, 0x010676, 0x010677, 0x010670, + 0x010671, 0x010672, 0x010673, 0x01064C, 0x01064D, 0x01064E, 0x01064F, 0x010648, + 0x010649, 0x01064A, 0x01064B, 0x010644, 0x010645, 0x010646, 0x010647, 0x010640, + 0x010641, 0x010642, 0x010643, 0x01065C, 0x01065D, 0x01065E, 0x010658, 0x010659, + 0x01065A, 0x010653, 0x01062C, 0x01062D, 0x01062E, 0x01062F, 0x010628, 0x010629, + 0x01062A, 0x01062B, 0x010624, 0x010625, 0x010626, 0x010627, 0x010620, 0x010621, + 0x010622, 0x01063F, 0x010638, 0x010639, 0x01063B, 0x010634, 0x010635, 0x010636, + 0x010637, 0x010630, 0x010631, 0x010632, 0x01060F, 0x010603, 0x01061C, 0x01061D, + 0x01061E, 0x01061F, 0x010618, 0x010619, 0x01061A, 0x01061B, 0x010614, 0x010615, + 0x010616, 0x010617, 0x010610, 0x010611, 0x010612, 0x010613, 0x0106EC, 0x0106ED, + 0x0106EE, 0x0106EF, 0x0106E8, 0x0106E9, 0x0106EA, 0x0106EB, 0x0106E4, 0x0106E5, + 0x0106E6, 0x0106E7, 0x0106E0, 0x0106E1, 0x0106E2, 0x0106E3, 0x0106FC, 0x0106FD, + 0x0106FE, 0x0106F3, 0x0106CC, 0x0106CD, 0x0106CE, 0x0106CF, 0x0106C8, 0x0106C9, + 0x0106CA, 0x0106CB, 0x0106C4, 0x0106C5, 0x0106C6, 0x0106C7, 0x0106C0, 0x0106C1, + 0x0106C2, 0x0106A3, 0x0106BC, 0x0106BD, 0x0106BE, 0x0106BF, 0x0106B8, 0x0106B9, + 0x0106BA, 0x0106BB, 0x0106B4, 0x0106B5, 0x0106B6, 0x0106B7, 0x0106B0, 0x0106B1, + 0x0106B2, 0x0106B3, 0x01068C, 0x01068D, 0x01068E, 0x01068F, 0x010688, 0x010689, + 0x01068A, 0x01068B, 0x010684, 0x010685, 0x010686, 0x010687, 0x010680, 0x010681, + 0x010682, 0x010683, 0x01069C, 0x01069D, 0x01069E, 0x01069F, 0x010698, 0x010699, + 0x01069A, 0x01069B, 0x010694, 0x010695, 0x010696, 0x010697, 0x010690, 0x010691, + 0x010692, 0x010693, 0x010764, 0x010765, 0x010766, 0x010767, 0x010760, 0x010761, + 0x010762, 0x010763, 0x01074C, 0x01074D, 0x01074E, 0x01074F, 0x010748, 0x010749, + 0x01074A, 0x01074B, 0x010744, 0x010745, 0x010746, 0x010747, 0x010740, 0x010741, + 0x010742, 0x001D8D, 0x001D8E, 0x001D8F, 0x001D88, 0x001D89, 0x001D8A, 0x001D8B, + 0x001D84, 0x001D87, 0x001D80, 0x010753, 0x01072C, 0x01072D, 0x01072E, 0x01072A, + 0x010723, 0x010734, 0x010735, 0x010736, 0x010730, 0x010731, 0x010732, 0x010733, + 0x01070C, 0x01070D, 0x01070E, 0x01070F, 0x010708, 0x010709, 0x01070A, 0x01070B, + 0x010704, 0x010705, 0x010706, 0x010707, 0x010700, 0x010701, 0x010702, 0x010713, + 0x001A54, 0x001A50, 0x001A51, 0x001A52, 0x001A53, 0x001A2C, 0x001A2D, 0x001A2E, + 0x001A2F, 0x001A28, 0x001A29, 0x001A2A, 0x001A2B, 0x001A24, 0x001A25, 0x001A26, + 0x001A27, 0x001A20, 0x001A21, 0x001A22, 0x001A23, 0x001A3C, 0x001A3D, 0x001A3E, + 0x001A3F, 0x001A38, 0x001A39, 0x001A3A, 0x001A3B, 0x001A34, 0x001A35, 0x001A36, + 0x001A37, 0x001A30, 0x001A31, 0x001A32, 0x001A33, 0x001A0C, 0x001A0D, 0x001A0E, + 0x001A0F, 0x001A08, 0x001A09, 0x001A0A, 0x001A0B, 0x001A04, 0x001A05, 0x001A06, + 0x001A07, 0x001A00, 0x001A01, 0x001A02, 0x001A03, 0x001A14, 0x001A15, 0x001A16, + 0x001A10, 0x001A11, 0x001A12, 0x001A13, 0x01046C, 0x01046D, 0x01046E, 0x01046F, + 0x010468, 0x010469, 0x01046A, 0x01046B, 0x010464, 0x010465, 0x010466, 0x010467, + 0x010460, 0x010461, 0x010462, 0x010463, 0x01047C, 0x01047E, 0x01047F, 0x010478, + 0x01044D, 0x01044E, 0x01044F, 0x010448, 0x010449, 0x01044A, 0x01044B, 0x010444, + 0x010445, 0x010446, 0x010447, 0x010440, 0x010441, 0x010442, 0x010443, 0x01045C, + 0x01045D, 0x01045E, 0x010459, 0x01045A, 0x010453, 0x01042C, 0x01042D, 0x01042E, + 0x010429, 0x01042A, 0x010423, 0x01043C, 0x01043D, 0x01043E, 0x01043F, 0x010438, + 0x010439, 0x01043A, 0x01043B, 0x010434, 0x010435, 0x010436, 0x010437, 0x010430, + 0x010431, 0x010432, 0x010433, 0x01040C, 0x01040D, 0x01040E, 0x01040F, 0x010408, + 0x010409, 0x01040A, 0x01040B, 0x010404, 0x010405, 0x010406, 0x010407, 0x010400, + 0x010401, 0x010402, 0x010403, 0x01041C, 0x01041D, 0x01041E, 0x01041B, 0x010417, + 0x010410, 0x010411, 0x010412, 0x010413, 0x0104EC, 0x0104ED, 0x0104EE, 0x0104E9, + 0x0104EA, 0x001B2D, 0x001B2E, 0x001B2F, 0x001B28, 0x0104F3, 0x0104CC, 0x0104CD, + 0x0104CE, 0x0104CF, 0x0104C8, 0x0104C9, 0x0104CA, 0x0104CB, 0x0104C4, 0x0104C5, + 0x0104C6, 0x001B05, 0x001B07, 0x0104D1, 0x001B1D, 0x001B1F, 0x0104BC, 0x0104BD, + 0x0104B9, 0x0104B5, 0x0104B6, 0x01048C, 0x01048D, 0x01048F, 0x010489, 0x01048B, + 0x010486, 0x010487, 0x010481, 0x001BDD, 0x001BDE, 0x001BDF, 0x001BD8, 0x001BD9, + 0x001BDA, 0x001BD4, 0x01EE0E, 0x01EE0F, 0x01EE08, 0x01EE09, 0x01EE0A, 0x01EE0B, + 0x01EE05, 0x01EE07, 0x01EE00, 0x01EE01, 0x010557, 0x010550, 0x010551, 0x001B9D, + 0x001B9E, 0x001B9F, 0x001B98, 0x001B99, 0x001B9A, 0x001B9B, 0x001B94, 0x010533, + 0x01050C, 0x01050D, 0x01050E, 0x01050F, 0x010508, 0x010509, 0x01050A, 0x00185E, + 0x00185F, 0x001858, 0x001859, 0x001824, 0x00183E, 0x00183F, 0x001838, 0x001839, + 0x01EE92, 0x01EE93, 0x001818, 0x001819, 0x001814, 0x001815, 0x001816, 0x001817, + 0x001810, 0x001811, 0x001812, 0x001813, 0x0018EC, 0x0018ED, 0x0018EE, 0x0018EF, + 0x0018E8, 0x0018E9, 0x0018EA, 0x0018EB, 0x0018E4, 0x0018E5, 0x0018E6, 0x0018E7, + 0x0018E0, 0x0018E1, 0x0018E2, 0x0018E3, 0x0018F4, 0x0018F5, 0x0018F0, 0x0018F1, + 0x0018F2, 0x0018F3, 0x0018CC, 0x0018CD, 0x0018CE, 0x0018CF, 0x0018C8, 0x0018C9, + 0x0018CA, 0x0018CB, 0x0018C4, 0x0018C5, 0x0018C6, 0x0018C7, 0x0018C0, 0x0018C1, + 0x0018C2, 0x0018C3, 0x0018DC, 0x0018DD, 0x0018DE, 0x0018DF, 0x0018D8, 0x0018D9, + 0x0018DA, 0x0018DB, 0x0018D4, 0x0018D5, 0x0018D6, 0x0018D7, 0x0018D0, 0x0018D1, + 0x0018D2, 0x0018D3, 0x0018A8, 0x0018AA, 0x0018A4, 0x0018A5, 0x0018A6, 0x0018A7, + 0x0018A0, 0x0018A1, 0x0018A2, 0x0018A3, 0x0018BC, 0x0018BD, 0x0018BE, 0x0018BF, + 0x0018B8, 0x01D608, 0x0018B9, 0x0018BA, 0x0018BB, 0x01D60C, 0x01D60D, 0x01D60E, + 0x0018B4, 0x0018B5, 0x0018B6, 0x0018B7, 0x0018B0, 0x0018B1, 0x0018B2, 0x0018B3, + 0x00188C, 0x00188D, 0x00188E, 0x00188F, 0x001888, 0x001889, 0x00188A, 0x00188B, + 0x001884, 0x01D620, 0x01D621, 0x01D622, 0x01D623, 0x01D624, 0x01D625, 0x01D626, + 0x01D627, 0x01D628, 0x01D629, 0x01D62A, 0x01D62B, 0x01D62C, 0x01D62D, 0x01D62E, + 0x01D62F, 0x01D630, 0x01D631, 0x01D632, 0x001887, 0x01D634, 0x01D635, 0x01D636, + 0x01D637, 0x01D638, 0x01D639, 0x01D63A, 0x01D63B, 0x01D63C, 0x01D63D, 0x01D63E, + 0x01D63F, 0x01D640, 0x01D641, 0x01D642, 0x01D643, 0x01D644, 0x01D645, 0x01D646, + 0x01D647, 0x01D648, 0x01D649, 0x01D64A, 0x01D64B, 0x01D64C, 0x01D64D, 0x01D64E, + 0x01D64F, 0x01D650, 0x01D651, 0x01D652, 0x01D653, 0x001880, 0x01D655, 0x01D656, + 0x01D657, 0x01D658, 0x01D659, 0x01D65A, 0x001881, 0x01D65C, 0x01D65D, 0x01D65E, + 0x01D65F, 0x001882, 0x001883, 0x00189C, 0x00189D, 0x00189E, 0x00189F, 0x001898, + 0x001899, 0x00189A, 0x00189B, 0x001894, 0x001895, 0x001896, 0x001897, 0x001890, + 0x001891, 0x001892, 0x001893, 0x01D672, 0x01D673, 0x00196C, 0x00196D, 0x001968, + 0x001969, 0x00196A, 0x00196B, 0x001964, 0x001965, 0x001966, 0x001967, 0x001960, + 0x001961, 0x001962, 0x001963, 0x001974, 0x001970, 0x001971, 0x001972, 0x001973, + 0x00194C, 0x00194D, 0x00194E, 0x00194F, 0x001948, 0x001949, 0x00194A, 0x00194B, + 0x001946, 0x001947, 0x00195C, 0x001951, 0x0102E3, 0x0102F8, 0x0102F9, 0x0102FA, + 0x0102FB, 0x0102F4, 0x0102F5, 0x0102F6, 0x0102F7, 0x0102F0, 0x0102F1, 0x0102F2, + 0x0102F3, 0x0102CC, 0x0102CD, 0x0102CE, 0x0102CF, 0x0102C8, 0x0102C9, 0x0102CA, + 0x0102CB, 0x0102C4, 0x0102C5, 0x0102C6, 0x0102C7, 0x0102C0, 0x0102C1, 0x0102C2, + 0x00190D, 0x00190E, 0x00190F, 0x001908, 0x001909, 0x00190A, 0x00190B, 0x001904, + 0x001905, 0x001906, 0x001907, 0x001900, 0x001902, 0x001903, 0x00191C, 0x0102AE, + 0x0102A3, 0x0102BC, 0x0102BD, 0x0102BE, 0x0102BF, 0x0102B8, 0x0102B9, 0x0102BA, + 0x0102BB, 0x0102B4, 0x0102B5, 0x0102B6, 0x0102B7, 0x0102B0, 0x0102B1, 0x0102B2, + 0x0102B3, 0x01028C, 0x01028D, 0x01028E, 0x01028F, 0x010288, 0x010289, 0x01028A, + 0x01028B, 0x010284, 0x010285, 0x010286, 0x010287, 0x010280, 0x010281, 0x010282, + 0x010283, 0x01029C, 0x0019C8, 0x010299, 0x01029A, 0x010293, 0x01036C, 0x01036D, + 0x01036E, 0x01036A, 0x010363, 0x0019A8, 0x0019A9, 0x0019AA, 0x0019AB, 0x0019A4, + 0x0019A7, 0x0019A0, 0x00FC40, 0x0019BD, 0x0019BE, 0x0019BF, 0x0019B8, 0x00FC45, + 0x0019B4, 0x00199D, 0x001999, 0x00199A, 0x00199B, 0x001994, 0x001995, 0x001996, + 0x00FC4E, 0x001997, 0x001990, 0x01033C, 0x01033D, 0x00165D, 0x00165E, 0x00165F, + 0x001658, 0x001659, 0x00165A, 0x00165B, 0x001654, 0x001655, 0x001656, 0x001657, + 0x001650, 0x001651, 0x001652, 0x001653, 0x00162C, 0x00162D, 0x00162E, 0x00162F, + 0x00FC66, 0x001628, 0x001629, 0x00162A, 0x00162B, 0x001624, 0x001625, 0x001626, + 0x001627, 0x001620, 0x001621, 0x001622, 0x001623, 0x00163C, 0x001635, 0x001636, + 0x001637, 0x001630, 0x00160D, 0x00160E, 0x00160F, 0x001608, 0x001609, 0x00160A, + 0x00160B, 0x001604, 0x001607, 0x001600, 0x001601, 0x0103A3, 0x0103BC, 0x0103BA, + 0x0103B3, 0x01038C, 0x01038D, 0x01038E, 0x010388, 0x010389, 0x01038A, 0x0016CF, + 0x0016C8, 0x0016DD, 0x0016DE, 0x0016DF, 0x0016D8, 0x0016D9, 0x0016DA, 0x0016DB, + 0x0016D4, 0x0016D5, 0x0016D6, 0x0016D7, 0x0016D0, 0x0016D1, 0x0016D2, 0x0016D3, + 0x0016AC, 0x0016AD, 0x0016AE, 0x0016AF, 0x0016A8, 0x0016A9, 0x0016AA, 0x0016AB, + 0x0016A4, 0x0016A5, 0x0016A6, 0x0016A7, 0x0016A0, 0x0016A1, 0x0016A2, 0x0016A3, + 0x0016BC, 0x0016BF, 0x0016B8, 0x00168F, 0x001688, 0x010057, 0x010053, 0x01002C, + 0x01002D, 0x01002E, 0x01002A, 0x001690, 0x01003C, 0x00176F, 0x001764, 0x010033, + 0x01000D, 0x01000E, 0x01000F, 0x010008, 0x010009, 0x01000A, 0x01000B, 0x010004, + 0x010005, 0x010006, 0x010000, 0x010001, 0x010002, 0x010013, 0x0100EC, 0x0100ED, + 0x0100EE, 0x0100EF, 0x0100E8, 0x0100E9, 0x0100EA, 0x0100EB, 0x0100E4, 0x0100E5, + 0x0100E6, 0x0100E1, 0x0100E2, 0x00172D, 0x00172E, 0x00172F, 0x001728, 0x001724, + 0x0100F3, 0x0100CC, 0x0100CD, 0x0100CE, 0x0100CF, 0x0100C8, 0x0100C9, 0x0100CA, + 0x0100CB, 0x0100C4, 0x0100C5, 0x0100C6, 0x0100C1, 0x0100C2, 0x0100DC, 0x0100D3, + 0x0100AC, 0x0100AD, 0x0100AE, 0x0100AF, 0x0100A8, 0x0100A9, 0x0100AA, 0x0100AB, + 0x0100A4, 0x0100A5, 0x0100A6, 0x0100A1, 0x0100A2, 0x0100A3, 0x0100BC, 0x0100BD, + 0x0100BE, 0x0100B9, 0x0100BA, 0x0100B3, 0x01008C, 0x01008D, 0x01008E, 0x010089, + 0x01008A, 0x010083, 0x01009C, 0x01009D, 0x01009E, 0x01009F, 0x010098, 0x010099, + 0x01009A, 0x01009B, 0x010094, 0x010095, 0x010096, 0x010097, 0x010090, 0x010091, + 0x010092, 0x01016C, 0x01016D, 0x01016E, 0x01016F, 0x010168, 0x010169, 0x01016A, + 0x01016B, 0x010164, 0x010165, 0x010166, 0x010167, 0x010160, 0x010161, 0x010162, + 0x0017AD, 0x0017AE, 0x0017AF, 0x0017A8, 0x0017AA, 0x0017AB, 0x0017A4, 0x010173, + 0x01014C, 0x01014D, 0x01014E, 0x01014F, 0x010148, 0x010149, 0x01014A, 0x01014B, + 0x010144, 0x010145, 0x010146, 0x00146D, 0x00146E, 0x00146F, 0x001468, 0x001469, + 0x00146A, 0x00146B, 0x001464, 0x001465, 0x001466, 0x001467, 0x001460, 0x001475, + 0x001476, 0x001477, 0x00F95A, 0x001471, 0x001472, 0x001473, 0x00144C, 0x00145D, + 0x00F959, 0x01D401, 0x01D400, 0x01D403, 0x01D402, 0x01D405, 0x01D404, 0x01D407, + 0x01D406, 0x01D409, 0x01D408, 0x01D40B, 0x01D40A, 0x01D40D, 0x01D40C, 0x01D40F, + 0x01D40E, 0x01D411, 0x01D410, 0x01D413, 0x01D412, 0x01D415, 0x01D414, 0x01D417, + 0x01D416, 0x01D419, 0x01D418, 0x01D41B, 0x01D41A, 0x01D41D, 0x01D41C, 0x01D41F, + 0x01D41E, 0x01D421, 0x01D420, 0x01D423, 0x01D422, 0x01D425, 0x01D424, 0x01D427, + 0x01D426, 0x01D429, 0x01D428, 0x01D42B, 0x01D42A, 0x01D42D, 0x01D42C, 0x01D42F, + 0x01D42E, 0x01D431, 0x01D430, 0x01D433, 0x01D432, 0x01D435, 0x01D434, 0x01D437, + 0x01D436, 0x01D439, 0x01D438, 0x01D43B, 0x01D43A, 0x01D43D, 0x01D43C, 0x01D43F, + 0x01D43E, 0x01D441, 0x01D440, 0x01D443, 0x01D442, 0x01D445, 0x01D444, 0x01D447, + 0x01D446, 0x01D449, 0x01D448, 0x01D44B, 0x01D44A, 0x01D44D, 0x01D44C, 0x01D44F, + 0x01D44E, 0x01D451, 0x01D450, 0x01D453, 0x01D452, 0x01D6D8, 0x01D454, 0x01D457, + 0x01D456, 0x01D459, 0x01D458, 0x01D45B, 0x01D45A, 0x01D45D, 0x01D45C, 0x01D45F, + 0x01D45E, 0x01D461, 0x01D460, 0x01D463, 0x01D462, 0x01D465, 0x01D464, 0x01D467, + 0x01D466, 0x01D469, 0x01D468, 0x01D46B, 0x01D46A, 0x01D46D, 0x01D46C, 0x01D46F, + 0x01D46E, 0x01D471, 0x01D470, 0x01D473, 0x01D472, 0x01D475, 0x01D474, 0x01D477, + 0x01D476, 0x01D479, 0x01D478, 0x01D47B, 0x01D47A, 0x01D47D, 0x01D47C, 0x01D47F, + 0x01D47E, 0x00145E, 0x00145F, 0x001458, 0x001459, 0x00145A, 0x00145B, 0x001454, + 0x001455, 0x001456, 0x001457, 0x001450, 0x001451, 0x001452, 0x001453, 0x00142C, + 0x00142D, 0x00142E, 0x00142F, 0x001428, 0x001429, 0x00142A, 0x00142B, 0x001424, + 0x001425, 0x001426, 0x001427, 0x001420, 0x001421, 0x001422, 0x001423, 0x00143C, + 0x00143D, 0x00143E, 0x00143F, 0x001438, 0x001439, 0x00143A, 0x00143B, 0x001434, + 0x001435, 0x001436, 0x001437, 0x001430, 0x001431, 0x001432, 0x001433, 0x00140C, + 0x00140D, 0x00140E, 0x00140F, 0x001408, 0x001409, 0x00140A, 0x00140B, 0x001404, + 0x001405, 0x001406, 0x001407, 0x001401, 0x001402, 0x001403, 0x00141C, 0x00141D, + 0x00141E, 0x00141F, 0x001418, 0x001419, 0x00141A, 0x00141B, 0x001414, 0x001415, + 0x001416, 0x001417, 0x00FF18, 0x001410, 0x001411, 0x001412, 0x001413, 0x0014EC, + 0x0014ED, 0x0014EE, 0x0014EF, 0x0014E8, 0x0014E9, 0x0014EA, 0x0014EB, 0x0014E4, + 0x0014E5, 0x0014E6, 0x0014E7, 0x0014E0, 0x0014E1, 0x0014E2, 0x0014E3, 0x0014FC, + 0x0014FD, 0x01D4E1, 0x01D4E0, 0x01D4E3, 0x01D4E2, 0x01D4E5, 0x01D4E4, 0x01D4E7, + 0x01D4E6, 0x01D4E9, 0x01D4E8, 0x01D4EB, 0x01D4EA, 0x01D4ED, 0x01D4EC, 0x01D4EF, + 0x01D4EE, 0x01D4F1, 0x01D4F0, 0x0014FE, 0x0014FF, 0x01D4F5, 0x01D4F4, 0x01D4F7, + 0x01D4F6, 0x01D4F9, 0x01D4F8, 0x01D4FB, 0x01D4FA, 0x01D4FD, 0x01D4FC, 0x01D4FF, + 0x01D4FE, 0x0014F8, 0x0014F9, 0x0014FA, 0x0014F5, 0x0014F6, 0x00FBDC, 0x00FBDD, + 0x0014F7, 0x0014F0, 0x0014F1, 0x00FBD9, 0x0014F2, 0x0014F3, 0x0014CC, 0x00FBDE, + 0x00FBDF, 0x0014CD, 0x0014CE, 0x0014CF, 0x01D612, 0x0014C8, 0x0014C9, 0x00FBE4, + 0x00FBE5, 0x00FBE6, 0x00FBE8, 0x0014CA, 0x0014CB, 0x00FBEF, 0x00FBFC, 0x00FBFD, + 0x0014C4, 0x00FBEB, 0x00FBF7, 0x00FBF0, 0x00FBF1, 0x00FBF2, 0x0014C5, 0x00FBF4, + 0x0014C6, 0x00FBF6, 0x0014C7, 0x00FBF9, 0x00FBFA, 0x00FBFF, 0x00FBF8, 0x00FBF5, + 0x00FBFE, 0x0014C0, 0x0014C1, 0x0014C2, 0x0014C3, 0x01D611, 0x0014DC, 0x0014DD, + 0x0014DE, 0x0014DF, 0x0014D8, 0x0014D9, 0x0014DA, 0x0014DB, 0x0014D4, 0x01D610, + 0x0014D5, 0x0014D6, 0x00FF90, 0x0014D7, 0x0014D0, 0x0014D1, 0x0014D2, 0x00FF95, + 0x00FF96, 0x01D6E8, 0x01D6EC, 0x00FBD8, 0x0014D3, 0x01D74C, 0x01D74D, 0x01D74E, + 0x01D6ED, 0x0014AC, 0x0014A6, 0x00FBE7, 0x0014BD, 0x00FBE1, 0x0014BE, 0x0014BF, + 0x0014B8, 0x0014B9, 0x0014BA, 0x0014BB, 0x0014B4, 0x0014B5, 0x0014B6, 0x0014B7, 0x0014B0, 0x0014B1, 0x01D6E4, }; /* indexes */ const uint16_t NU_DUCET_VALUES_I[] = { - 0x0781, 0x07BC, 0x0209, 0x075B, 0x07FE, 0x0802, 0x0760, 0x0765, 0x032D, 0x032C, - 0x032F, 0x0335, 0x0866, 0x0830, 0x03E7, 0x03E9, 0x0767, 0x0A68, 0x081A, 0x07FF, - 0x07F6, 0x07FB, 0x07F9, 0x07FD, 0x07C3, 0x07D9, 0x0749, 0x0763, 0x0767, 0x076C, - 0x0801, 0x080D, 0x0851, 0x0828, 0x0554, 0x0669, 0x076B, 0x06D2, 0x07EA, 0x0803, - 0x05BC, 0x0A7D, 0x07E2, 0x0856, 0x0300, 0x0897, 0x01DF, 0x05E9, 0x084C, 0x072F, - 0x0485, 0x04AB, 0x0510, 0x053D, 0x078C, 0x0792, 0x07C0, 0x07C6, 0x0578, 0x09C6, - 0x0688, 0x069C, 0x07F1, 0x076F, 0x023F, 0x023E, 0x0245, 0x024F, 0x024D, 0x024B, - 0x025D, 0x02C2, 0x061A, 0x065F, 0x0288, 0x0776, 0x0694, 0x05DD, 0x0600, 0x063C, - 0x02E8, 0x0493, 0x06B2, 0x0319, 0x04C1, 0x04CA, 0x04C7, 0x0313, 0x04D0, 0x05FB, - 0x05FA, 0x05FD, 0x03E5, 0x06A7, 0x06F5, 0x06AB, 0x089A, 0x0A44, 0x0767, 0x076C, - 0x0867, 0x089A, 0x0278, 0x07C2, 0x07D8, 0x07ED, 0x07AA, 0x07F8, 0x07FC, 0x07F2, - 0x04BF, 0x04BE, 0x0886, 0x0778, 0x01C9, 0x056A, 0x03BD, 0x083C, 0x0A62, 0x01A2, - 0x0198, 0x02D0, 0x067F, 0x02AE, 0x03CC, 0x036D, 0x0862, 0x0859, 0x082A, 0x07C5, - 0x0656, 0x0676, 0x0270, 0x0276, 0x086B, 0x027A, 0x04FA, 0x0269, 0x07F3, 0x02CC, - 0x026A, 0x0814, 0x06F6, 0x05A7, 0x04E9, 0x04A1, 0x02FA, 0x04E8, 0x04F4, 0x03CB, - 0x0766, 0x04F1, 0x061D, 0x06B4, 0x0622, 0x061F, 0x0761, 0x04EB, 0x0694, 0x061C, - 0x067F, 0x023D, 0x03FD, 0x0414, 0x07EE, 0x078D, 0x0760, 0x0765, 0x07BF, 0x076D, - 0x0783, 0x078F, 0x0832, 0x07C5, 0x085E, 0x083D, 0x0863, 0x022A, 0x0424, 0x044C, - 0x01F5, 0x061A, 0x0215, 0x021F, 0x0551, 0x0234, 0x082A, 0x0867, 0x086B, 0x065F, - 0x082F, 0x083B, 0x02F0, 0x032B, 0x07FE, 0x0802, 0x05DE, 0x061B, 0x0660, 0x0680, - 0x0832, 0x083D, 0x0292, 0x047F, 0x0769, 0x076E, 0x0816, 0x07F0, 0x0552, 0x0800, - 0x01DB, 0x05AD, 0x081B, 0x07F7, 0x0539, 0x07E7, 0x044D, 0x01BD, 0x0511, 0x056B, - 0x01C3, 0x01C1, 0x01F2, 0x080C, 0x02A9, 0x05CD, 0x02C7, 0x055D, 0x0827, 0x0816, - 0x036E, 0x038A, 0x03E4, 0x03E3, 0x040F, 0x0425, 0x03B3, 0x0885, 0x049D, 0x04E7, - 0x0534, 0x054E, 0x0819, 0x082F, 0x0850, 0x0861, 0x059A, 0x07ED, 0x06B3, 0x06A6, - 0x01F0, 0x0695, 0x081B, 0x0861, 0x06D3, 0x068D, 0x0253, 0x027E, 0x0240, 0x026B, - 0x0252, 0x027D, 0x02BE, 0x02C8, 0x02BF, 0x02C9, 0x02C1, 0x02CB, 0x02C0, 0x02CA, - 0x02DF, 0x02F1, 0x02E2, 0x02F4, 0x031F, 0x033B, 0x0312, 0x032E, 0x031B, 0x0337, - 0x031E, 0x033A, 0x0318, 0x0334, 0x0381, 0x038D, 0x0380, 0x038C, 0x0383, 0x038F, - 0x0384, 0x0390, 0x03A8, 0x03B4, 0x03AD, 0x03B9, 0x03D3, 0x03EB, 0x03B2, 0x03EE, - 0x03CE, 0x03E6, 0x03D4, 0x03ED, 0x03FC, 0x03EC, 0x03DF, 0x03F8, 0x040B, 0x0410, - 0x041F, 0x0428, 0x044E, 0x055C, 0x0450, 0x043D, 0x044F, 0x043F, 0x0456, 0x043E, - 0x0451, 0x0445, 0x049E, 0x0440, 0x04A3, 0x0490, 0x04A0, 0x0495, 0x0719, 0x0492, - 0x056A, 0x04BB, 0x04D4, 0x04FE, 0x04C0, 0x04EA, 0x04C9, 0x04F3, 0x04E4, 0x050E, - 0x055E, 0x056C, 0x0561, 0x056F, 0x055F, 0x056D, 0x059B, 0x05AE, 0x059D, 0x05B0, - 0x05A1, 0x05B4, 0x059E, 0x05B1, 0x05D1, 0x05E1, 0x05CE, 0x05DF, 0x05EB, 0x05EC, - 0x0606, 0x0628, 0x0609, 0x062B, 0x05FC, 0x061E, 0x0389, 0x049C, 0x0605, 0x0627, - 0x0608, 0x062A, 0x0679, 0x0683, 0x06A9, 0x06B6, 0x06D4, 0x06B7, 0x06D7, 0x06CA, - 0x047E, 0x06CD, 0x05A8, 0x06CC, 0x02B8, 0x02B0, 0x02B9, 0x02BA, 0x0714, 0x0715, - 0x02D8, 0x051F, 0x0306, 0x02D7, 0x030B, 0x0308, 0x06D1, 0x030A, 0x0353, 0x0350, - 0x037A, 0x0356, 0x039E, 0x0379, 0x03BF, 0x03A4, 0x0404, 0x0408, 0x0430, 0x0431, - 0x0476, 0x0463, 0x04B0, 0x064F, 0x052B, 0x04B1, 0x04DA, 0x0504, 0x03A5, 0x03A6, - 0x0545, 0x0546, 0x0711, 0x057B, 0x05C6, 0x0710, 0x05F0, 0x05C9, 0x05F1, 0x05F2, - 0x0630, 0x05F4, 0x0654, 0x060E, 0x06C3, 0x066F, 0x06DE, 0x06C2, 0x06ED, 0x06DD, - 0x06F0, 0x06F1, 0x0709, 0x06F3, 0x0712, 0x0713, 0x06FB, 0x05DA, 0x0728, 0x0727, - 0x072A, 0x0729, 0x02FD, 0x02FF, 0x045A, 0x02EC, 0x0448, 0x0459, 0x04A9, 0x04AA, - 0x0275, 0x049B, 0x03E8, 0x024A, 0x04F0, 0x03D0, 0x0620, 0x04C6, 0x0626, 0x05FE, - 0x0623, 0x0604, 0x0625, 0x0601, 0x0624, 0x0603, 0x034F, 0x0602, 0x024E, 0x0279, - 0x0251, 0x027C, 0x025F, 0x028A, 0x039A, 0x039B, 0x0382, 0x038E, 0x041E, 0x0427, - 0x04D2, 0x04FC, 0x04D3, 0x04FD, 0x06EC, 0x06EE, 0x02FE, 0x040C, 0x02EB, 0x02FC, - 0x037F, 0x038B, 0x0861, 0x03C0, 0x0491, 0x049F, 0x024C, 0x0277, 0x025E, 0x0289, - 0x04D1, 0x04FB, 0x07AA, 0x07C2, 0x07BF, 0x078F, 0x0783, 0x07C5, 0x07FC, 0x07F0, - 0x07F4, 0x081B, 0x07AA, 0x07C2, 0x07D8, 0x07FA, 0x0850, 0x0863, 0x085E, 0x0779, - 0x0749, 0x089A, 0x0861, 0x0763, 0x07ED, 0x076C, 0x078D, 0x0819, 0x0760, 0x0767, - 0x07ED, 0x076E, 0x082F, 0x0827, 0x083B, 0x082F, 0x0861, 0x0850, 0x0869, 0x0865, - 0x0816, 0x0885, 0x07C2, 0x0779, 0x0861, 0x07ED, 0x0819, 0x0827, 0x0765, 0x0760, - 0x076E, 0x0769, 0x078F, 0x0783, 0x07C5, 0x07BF, 0x07F0, 0x07E7, 0x07FA, 0x07F4, - 0x0802, 0x07FE, 0x081B, 0x0816, 0x07C5, 0x082A, 0x083D, 0x0832, 0x0863, 0x085E, - 0x086B, 0x0867, 0x07E7, 0x089A, 0x0763, 0x0749, 0x076C, 0x0767, 0x078D, 0x0779, - 0x07C2, 0x07AA, 0x07ED, 0x07D8, 0x07F8, 0x07F2, 0x0800, 0x07FC, 0x0819, 0x080C, - 0x082F, 0x0827, 0x083B, 0x082F, 0x0861, 0x0850, 0x0869, 0x0865, 0x07ED, 0x0885, - 0x07C2, 0x0779, 0x0861, 0x07ED, 0x0819, 0x0827, 0x0785, 0x0787, 0x0779, 0x07C2, - 0x01B1, 0x019D, 0x01E4, 0x01CF, 0x020E, 0x01FA, 0x0224, 0x021A, 0x0239, 0x022F, - 0x01B1, 0x019D, 0x01E4, 0x01CF, 0x020E, 0x01FA, 0x0224, 0x021A, 0x07F2, 0x07F8, - 0x076C, 0x0800, 0x080C, 0x0819, 0x0827, 0x082F, 0x07FE, 0x0802, 0x0850, 0x0861, - 0x082A, 0x07C5, 0x0832, 0x083D, 0x07FC, 0x083B, 0x0224, 0x021A, 0x0827, 0x082F, - 0x0760, 0x0765, 0x0769, 0x076E, 0x0783, 0x078F, 0x07BF, 0x07C5, 0x07E7, 0x07F0, - 0x05B7, 0x05A4, 0x0280, 0x0255, 0x0281, 0x0256, 0x033F, 0x0323, 0x0340, 0x0324, - 0x03F0, 0x03D7, 0x03F1, 0x03D8, 0x0502, 0x04D8, 0x0503, 0x04D9, 0x04F9, 0x04CF, - 0x06BA, 0x06AE, 0x0471, 0x04B7, 0x05F5, 0x0413, 0x02EA, 0x0550, 0x0295, 0x02D3, - 0x06C8, 0x06C7, 0x03B5, 0x03A9, 0x06E5, 0x0718, 0x0717, 0x02B1, 0x0645, 0x0675, - 0x034B, 0x034A, 0x0417, 0x0416, 0x055B, 0x055A, 0x0581, 0x0580, 0x04F8, 0x04CE, - 0x029A, 0x029C, 0x02A0, 0x02B7, 0x051E, 0x02D9, 0x0305, 0x0307, 0x0359, 0x0352, - 0x035A, 0x0355, 0x035B, 0x035F, 0x0360, 0x041A, 0x04B2, 0x030C, 0x0532, 0x0531, - 0x06E2, 0x06E1, 0x027B, 0x0250, 0x0311, 0x031C, 0x04F2, 0x04C8, 0x03CD, 0x0338, - 0x03CF, 0x03D1, 0x0652, 0x0489, 0x04AF, 0x04B6, 0x04AC, 0x052A, 0x06C9, 0x052E, - 0x04F7, 0x04CD, 0x0585, 0x0587, 0x02D2, 0x0464, 0x05EE, 0x05C1, 0x103C, 0x0DB8, - 0x0D7D, 0x0C6F, 0x1037, 0x0E0C, 0x1014, 0x1027, 0x0A7A, 0x0A79, 0x103E, 0x103F, - 0x0A54, 0x0A5D, 0x0A61, 0x0A67, 0x1040, 0x1021, 0x0CD1, 0x0D9B, 0x0CD6, 0x0CD3, - 0x1024, 0x0CD8, 0x1030, 0x0EB6, 0x0D9C, 0x0DB5, 0x0CD5, 0x102E, 0x1015, 0x0EB5, - 0x0A1A, 0x0A19, 0x0A5A, 0x0A58, 0x0A6B, 0x0764, 0x0A6E, 0x0A6D, 0x0A76, 0x0A75, - 0x0A72, 0x0A71, 0x0A55, 0x0A5F, 0x0A7C, 0x0A7B, 0x1039, 0x1034, 0x1033, 0x1038, - 0x0A83, 0x0A20, 0x0A6C, 0x1035, 0x0A08, 0x0A07, 0x0A22, 0x103D, 0x0768, 0x0A1F, - 0x0A1C, 0x0A1B, 0x09DC, 0x09E2, 0x09E9, 0x09F6, 0x0A09, 0x0A0B, 0x0473, 0x0A2D, - 0x0403, 0x0407, 0x03FE, 0x064E, 0x046B, 0x046F, 0x06C1, 0x06C0, 0x0A7E, 0x0A21, - 0x0A47, 0x0A84, 0x0A81, 0x0A82, 0x0A23, 0x0A43, 0x0989, 0x09AA, 0x0A4B, 0x0A50, - 0x098E, 0x0978, 0x09F7, 0x0A41, 0x02A3, 0x0396, 0x0399, 0x03A3, 0x02DE, 0x030F, - 0x0363, 0x037E, 0x03A7, 0x03CA, 0x0467, 0x041C, 0x078E, 0x048F, 0x040A, 0x04BD, - 0x0589, 0x039D, 0x03C2, 0x07AB, 0x074A, 0x058A, 0x07D4, 0x0515, 0x054C, 0x0583, - 0x0362, 0x064A, 0x043C, 0x0478, 0x058D, 0x058F, 0x0DAA, 0x0DB0, 0x0E41, 0x0DAB, - 0x0DA7, 0x0E06, 0x0E07, 0x0DAF, 0x0D99, 0x0DAE, 0x3242, 0x3243, 0x3245, 0x3250, - 0x3246, 0x3247, 0x2FAE, 0x3244, 0x324A, 0x324B, 0x3249, 0x324D, 0x324E, 0x324F, - 0x324C, 0x3251, 0x3252, 0x3253, 0x3254, 0x3260, 0x3256, 0x3257, 0x3258, 0x3259, - 0x325A, 0x325B, 0x2F27, 0x325D, 0x325E, 0x325F, 0x325C, 0x3261, 0x0CCC, 0x0D50, - 0x2FB0, 0x3286, 0x0F99, 0x0F9A, 0x0DAC, 0x3248, 0x0D88, 0x0D8B, 0x3265, 0x0DB7, - 0x0DAD, 0x0E08, 0x0E0B, 0x2FAF, 0x3272, 0x3273, 0x3275, 0x3280, 0x3276, 0x3277, - 0x3274, 0x3279, 0x327A, 0x327B, 0x3278, 0x327D, 0x0D4A, 0x327F, 0x327C, 0x3281, - 0x0D7B, 0x0D7C, 0x102B, 0x3287, 0x1032, 0x103B, 0x2FA8, 0x0D7E, 0x2FB1, 0x2FAA, - 0x0D45, 0x0D78, 0x2F90, 0x0E0D, 0x0D7A, 0x0FD9, 0x0E0E, 0x0EF5, 0x0E0A, 0x0E8B, - 0x0E8C, 0x0E8D, 0x0FDA, 0x0F64, 0x0F10, 0x0F13, 0x0C70, 0x1013, 0x0F65, 0x0F98, - 0x0F44, 0x0DB6, 0x327E, 0x3270, 0x0F14, 0x2FA5, 0x3266, 0x3267, 0x2FA7, 0x2FA4, - 0x326A, 0x326B, 0x326C, 0x326D, 0x326F, 0x2FA3, 0x3271, 0x2FA2, 0x101E, 0x2FA9, - 0x101D, 0x2FAB, 0x2FB6, 0x2FA6, 0x2FB8, 0x2FB9, 0x0988, 0x0933, 0x0931, 0x092E, - 0x2FBE, 0x2FBF, 0x2FAC, 0x2FAD, 0x2F4A, 0x2FC0, 0x2F4E, 0x095D, 0x2F47, 0x2F46, - 0x0932, 0x2F4F, 0x2F5A, 0x2F5B, 0x2F4D, 0x2F4B, 0x2F50, 0x2F51, 0x2F60, 0x2F61, - 0x2F53, 0x2F52, 0x2F55, 0x2F54, 0x2F5C, 0x2F5D, 0x2F59, 0x2F58, 0x2F44, 0x2F45, - 0x2F5E, 0x2F5F, 0x2F56, 0x2F57, 0x2F42, 0x2F43, 0x2F66, 0x2F62, 0x2F65, 0x2F64, - 0x2F67, 0x2F63, 0x2F48, 0x2F49, 0x0936, 0x2F6A, 0x2F6D, 0x2F6C, 0x2FB7, 0x095E, - 0x2F71, 0x2F70, 0x2F76, 0x2F72, 0x2F75, 0x2F74, 0x2F77, 0x2F73, 0x2F79, 0x2F78, - 0x2F7E, 0x2F7A, 0x2F7D, 0x2F7C, 0x2F7F, 0x2F7B, 0x2F81, 0x2F80, 0x3082, 0x3083, - 0x30A4, 0x30A5, 0x2F85, 0x30A3, 0x30A8, 0x30A9, 0x30A2, 0x308A, 0x2F86, 0x2F8C, - 0x2F87, 0x2F9F, 0x0937, 0x0991, 0x2F82, 0x2F83, 0x2F84, 0x2FC1, 0x2F97, 0x2F96, - 0x2F88, 0x2F89, 0x2F9B, 0x2F9A, 0x2F9D, 0x2F9C, 0x30BE, 0x2F9E, 0x2FA1, 0x2FA0, - 0x30C0, 0x30C1, 0x092F, 0x2FBA, 0x2F8B, 0x2FB3, 0x0992, 0x2F8A, 0x2FB4, 0x2F8D, - 0x2FB5, 0x30BC, 0x30BA, 0x2FB2, 0x2F68, 0x2F69, 0x30B2, 0x30B3, 0x30B4, 0x30B5, - 0x30B6, 0x30B7, 0x2F91, 0x30BB, 0x2FBB, 0x2F8E, 0x30B8, 0x30BD, 0x30BF, 0x2FBD, - 0x2F8F, 0x30B9, 0x2FEA, 0x2FEB, 0x2FEC, 0x2FED, 0x3046, 0x3047, 0x2FE6, 0x2FE7, - 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x2FEE, 0x2FEF, - 0x303A, 0x303B, 0x3054, 0x3055, 0x2FD6, 0x2FD7, 0x2FDC, 0x2FDD, 0x2FDA, 0x2FDB, - 0x2FE0, 0x2FE1, 0x2FF0, 0x2FF1, 0x3042, 0x3043, 0x3044, 0x3045, 0x3066, 0x3067, - 0x3048, 0x3049, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, - 0x3052, 0x3053, 0x3074, 0x3075, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, - 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3084, 0x3085, - 0x3086, 0x3087, 0x3088, 0x3089, 0x3015, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, - 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3095, 0x3096, 0x3097, 0x3098, 0x3099, - 0x309A, 0x309B, 0x309C, 0x309D, 0x309E, 0x309F, 0x30A0, 0x30A1, 0x3012, 0x3013, - 0x3014, 0x3065, 0x3006, 0x3037, 0x3019, 0x3064, 0x303D, 0x300C, 0x3018, 0x300D, - 0x3036, 0x3040, 0x303C, 0x3041, 0x3072, 0x3073, 0x3068, 0x3069, 0x3076, 0x3077, - 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, - 0x0946, 0x0945, 0x09C9, 0x09C8, 0x093E, 0x093D, 0x09EF, 0x09EE, 0x09AF, 0x09AE, - 0x0966, 0x0965, 0x0974, 0x0973, 0x0A69, 0x0A6A, 0x2EED, 0x0B95, 0x0A89, 0x0A8A, - 0x099B, 0x099C, 0x09A8, 0x09A9, 0x09C2, 0x0A15, 0x09D6, 0x09D7, 0x09C3, 0x0A16, - 0x09BA, 0x09BB, 0x0959, 0x09A4, 0x09E6, 0x09E5, 0x095A, 0x09A5, 0x0B90, 0x0BA5, - 0x0B94, 0x0B92, 0x0BA3, 0x0B9D, 0x0B96, 0x0B99, 0x0BA1, 0x0B9F, 0x0B93, 0x0BAD, - 0x0BA9, 0x0BA7, 0x0B9B, 0x0BAB, 0x0BB1, 0x0BAF, 0x0BB5, 0x0BB3, 0x0BBD, 0x0BBB, - 0x0BC1, 0x0BBF, 0x0BC8, 0x0B97, 0x2ECC, 0x0BC7, 0x0BBC, 0x09DA, 0x0BC5, 0x0BC6, - 0x0BD6, 0x0BD4, 0x0BDA, 0x0BB0, 0x0BDE, 0x0BDC, 0x0BD8, 0x0BE0, 0x0BC3, 0x0BBE, - 0x0BC0, 0x0BC9, 0x0BCB, 0x0BCD, 0x0BD0, 0x0BD2, 0x0BC4, 0x2EDD, 0x0BC2, 0x0BCE, - 0x0A32, 0x0A31, 0x0B9C, 0x0B8F, 0x0C2C, 0x0C26, 0x091C, 0x0BD1, 0x0C23, 0x3025, - 0x3026, 0x3027, 0x3024, 0x0BAE, 0x302A, 0x302B, 0x302C, 0x302D, 0x302E, 0x302F, - 0x3030, 0x3031, 0x0BB4, 0x2ED4, 0x0BB2, 0x0B9A, 0x0A35, 0x0997, 0x0BD7, 0x0BD9, - 0x0BD3, 0x0BD5, 0x0BDF, 0x0B98, 0x0BDB, 0x0BDD, 0x303E, 0x0C61, 0x2EC3, 0x2EC4, - 0x0C1E, 0x0C21, 0x2EC7, 0x2EC8, 0x0968, 0x0967, 0x09A7, 0x09A6, 0x09B1, 0x09B0, - 0x09E1, 0x09E0, 0x2EC9, 0x2ECA, 0x099E, 0x099D, 0x2ED5, 0x2ED6, 0x2ED3, 0x2ED0, - 0x2ED8, 0x2ED9, 0x2ECD, 0x2ECB, 0x2EDC, 0x2ECE, 0x2EDE, 0x2EDF, 0x2ED1, 0x2ED2, - 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, 0x2EE6, 0x2EE7, 0x2EE4, 0x2EE5, 0x2EFA, 0x2EFB, - 0x2EEC, 0x2EEB, 0x2EE9, 0x2ECF, 0x2F00, 0x2EEA, 0x2EF2, 0x2EF3, 0x2EF4, 0x2EF5, - 0x2EFC, 0x2F01, 0x2EF8, 0x2EF9, 0x0C00, 0x2F0B, 0x2EFD, 0x2EE3, 0x2EF6, 0x2EF7, - 0x2EFE, 0x2EFF, 0x2F04, 0x2F03, 0x0BA6, 0x2F05, 0x2F08, 0x2F02, 0x2F09, 0x0BFA, - 0x0C03, 0x0BF9, 0x2F0C, 0x2F0D, 0x2F06, 0x2F07, 0x2F1D, 0x2F11, 0x2F14, 0x2F15, - 0x2F12, 0x2F13, 0x2F18, 0x2F19, 0x0C0B, 0x0BAA, 0x0B91, 0x0BAC, 0x0BF3, 0x0BF6, - 0x0C09, 0x0C05, 0x0BFE, 0x0BA0, 0x0BA2, 0x0BA4, 0x0C11, 0x0B9E, 0x0C0E, 0x0C14, - 0x0BEC, 0x0BEF, 0x0C15, 0x0C1C, 0x0C12, 0x0C20, 0x0BB6, 0x0C19, 0x0BE1, 0x0BE8, - 0x0C17, 0x0BA8, 0x0BCA, 0x0BCC, 0x0BFB, 0x0BFD, 0x2EE2, 0x2EE8, 0x2F1A, 0x2F1B, - 0x2F1C, 0x2F1F, 0x2F16, 0x2F17, 0x2F20, 0x2F21, 0x108C, 0x3202, 0x108E, 0x108F, - 0x0D9D, 0x1090, 0x3208, 0x3209, 0x3226, 0x3227, 0x322F, 0x0F04, 0x30D7, 0x0DBC, - 0x0DA3, 0x0E43, 0x0D40, 0x30D3, 0x322B, 0x3230, 0x322E, 0x0E61, 0x322A, 0x30D2, - 0x10A8, 0x3231, 0x0DB3, 0x322C, 0x321E, 0x10A7, 0x10A9, 0x10AA, 0x0D76, 0x30DF, - 0x1099, 0x109B, 0x323E, 0x30D6, 0x3224, 0x3225, 0x109E, 0x0D77, 0x316D, 0x31F0, - 0x31EE, 0x0D8D, 0x30D5, 0x30CD, 0x30DD, 0x3236, 0x3240, 0x3241, 0x3237, 0x2F2E, - 0x09D2, 0x0A5E, 0x2F2D, 0x09CE, 0x0979, 0x09CB, 0x2F30, 0x2F31, 0x2F2C, 0x09D0, - 0x09BC, 0x2F22, 0x097D, 0x2F25, 0x10A5, 0x09FF, 0x2F2F, 0x1096, 0x2F0A, 0x321F, - 0x2F24, 0x2F29, 0x2F0E, 0x2F0F, 0x2F10, 0x2F2A, 0x109F, 0x3153, 0x102A, 0x0A60, - 0x323C, 0x108D, 0x2F40, 0x2F28, 0x097E, 0x097A, 0x096F, 0x2F3B, 0x2F1E, 0x2F3A, - 0x2F41, 0x09FA, 0x2F26, 0x2F2B, 0x0A0E, 0x0970, 0x09D1, 0x2F3E, 0x2F38, 0x2F23, - 0x0A10, 0x09D3, 0x0A30, 0x0A0D, 0x0939, 0x0A0F, 0x0A53, 0x0A51, 0x0935, 0x0934, - 0x2F34, 0x2F35, 0x2F36, 0x2F37, 0x09DB, 0x2F3C, 0x2F3F, 0x2F33, 0x0A57, 0x0A56, - 0x2F32, 0x0938, 0x2F3D, 0x2F39, 0x0980, 0x097F, 0x1029, 0x102F, 0x09DF, 0x09DE, - 0x3154, 0x3159, 0x3177, 0x317B, 0x0E29, 0x0E0F, 0x092B, 0x103A, 0x0948, 0x0947, - 0x0998, 0x0A14, 0x099A, 0x0999, 0x1036, 0x0961, 0x0995, 0x0A02, 0x0A03, 0x0A13, - 0x0A2A, 0x0A29, 0x09F0, 0x0A36, 0x09E8, 0x09E7, 0x09BF, 0x09BE, 0x0A88, 0x0A87, - 0x0996, 0x09C4, 0x09A0, 0x0956, 0x0A12, 0x0A11, 0x09C5, 0x0A00, 0x09D9, 0x09D8, - 0x0A3A, 0x0A39, 0x0D83, 0x0E45, 0x0A3E, 0x0A3D, 0x0A40, 0x0A3F, 0x0D79, 0x0DE0, - 0x0928, 0x098F, 0x091E, 0x3167, 0x093C, 0x094D, 0x316B, 0x09BD, 0x09C0, 0x09B4, - 0x09B5, 0x0CD4, 0x0A37, 0x0A8B, 0x091F, 0x094F, 0x0920, 0x091D, 0x0957, 0x094B, - 0x0924, 0x0922, 0x0926, 0x0925, 0x0923, 0x0921, 0x0962, 0x0960, 0x0958, 0x0955, - 0x0A8C, 0x101F, 0x102C, 0x1026, 0x0993, 0x09A3, 0x09A2, 0x09C1, 0x1025, 0x1023, - 0x0954, 0x0994, 0x1028, 0x0A38, 0x32B0, 0x32A6, 0x09FD, 0x09F8, 0x32AA, 0x32AE, - 0x32AD, 0x0A2E, 0x32AF, 0x32B1, 0x0A01, 0x32AC, 0x09FE, 0x09F9, 0x102D, 0x09F1, - 0x1020, 0x1022, 0x1069, 0x106A, 0x1065, 0x1068, 0x106D, 0x106F, 0x106C, 0x108B, - 0x106B, 0x1081, 0x31C3, 0x1076, 0x31D8, 0x31D9, 0x107F, 0x106E, 0x1084, 0x1082, - 0x3255, 0x1085, 0x1083, 0x1080, 0x1089, 0x1088, 0x1079, 0x1066, 0x1077, 0x31DA, - 0x31D4, 0x31D5, 0x1087, 0x1067, 0x31D6, 0x31D7, 0x31DC, 0x31DD, 0x31D3, 0x31DB, - 0x31E0, 0x31DF, 0x31E1, 0x31D2, 0x1075, 0x31C2, 0x1072, 0x1074, 0x1071, 0x107D, - 0x31C4, 0x31C5, 0x31E6, 0x31ED, 0x107A, 0x107B, 0x31F6, 0x31E7, 0x31FC, 0x31FD, - 0x1070, 0x31EB, 0x1078, 0x107C, 0x31EA, 0x31EF, 0x31C8, 0x31C9, 0x31F7, 0x10A0, - 0x1092, 0x1097, 0x31DE, 0x31CD, 0x31EC, 0x31F1, 0x1098, 0x01DF, 0x01C9, 0x01A2, - 0x021F, 0x109A, 0x0CD2, 0x0234, 0x1091, 0x1093, 0x10A1, 0x10A2, 0x10A3, 0x10A4, - 0x109C, 0x109D, 0x321B, 0x1095, 0x3214, 0x3215, 0x1094, 0x1031, 0x3155, 0x321D, - 0x3212, 0x3213, 0x3216, 0x3205, 0x3203, 0x3217, 0x3218, 0x3219, 0x0198, 0x0209, - 0x022A, 0x0215, 0x107E, 0x1073, 0x3204, 0x10A6, 0x323A, 0x323B, 0x01F5, 0x323D, - 0x10AB, 0x10AC, 0x3220, 0x32A7, 0x321C, 0x3221, 0x32AB, 0x321A, 0x3200, 0x3201, - 0x097C, 0x0950, 0x0942, 0x0930, 0x094E, 0x096C, 0x0983, 0x0984, 0x09AB, 0x0952, - 0x09C7, 0x09F5, 0x108A, 0x098A, 0x09FC, 0x0A42, 0x094A, 0x094C, 0x0941, 0x092D, - 0x096B, 0x0A80, 0x0981, 0x0982, 0x097B, 0x1086, 0x09F4, 0x0951, 0x09B3, 0x09B9, - 0x09CD, 0x09D5, 0x0A48, 0x09E4, 0x09EB, 0x09FB, 0x09DD, 0x0A0C, 0x0A24, 0x0A2F, - 0x086A, 0x0A0A, 0x07E5, 0x0A52, 0x0740, 0x0990, 0x07A3, 0x07CF, 0x09B2, 0x0927, - 0x0929, 0x092C, 0x091B, 0x0949, 0x0953, 0x095F, 0x0987, 0x093A, 0x098D, 0x099F, - 0x0977, 0x09B8, 0x09CA, 0x09D4, 0x0817, 0x0823, 0x0833, 0x082D, 0x083A, 0x083E, - 0x085F, 0x0864, 0x0868, 0x086D, 0x07D3, 0x084B, 0x080A, 0x0847, 0x087E, 0x07EF, - 0x0762, 0x07C1, 0x085B, 0x085C, 0x085D, 0x0860, 0x0818, 0x07EC, 0x0822, 0x0821, - 0x078B, 0x078A, 0x0786, 0x0784, 0x0820, 0x081F, 0x089D, 0x089C, 0x08E2, 0x08E1, - 0x08EC, 0x08EB, 0x08EE, 0x08ED, 0x08F4, 0x08F3, 0x0902, 0x0901, 0x0908, 0x0907, - 0x0910, 0x090F, 0x07EB, 0x0826, 0x082E, 0x07E8, 0x07C4, 0x0A7F, 0x0A4D, 0x08A1, - 0x08A0, 0x0831, 0x081E, 0x081D, 0x082C, 0x0837, 0x0835, 0x0839, 0x32F5, 0x32D0, - 0x32C6, 0x32C7, 0x32F7, 0x32F4, 0x32CA, 0x32CB, 0x32CC, 0x32CD, 0x3282, 0x3283, - 0x32A8, 0x32A9, 0x3344, 0x3345, 0x3288, 0x3289, 0x3342, 0x3343, 0x334D, 0x334C, - 0x328E, 0x3347, 0x3290, 0x3346, 0x32CE, 0x32CF, 0x0C47, 0x0C46, 0x0C48, 0x3348, - 0x0D55, 0x3349, 0x334A, 0x334B, 0x0ECD, 0x0F8F, 0x1016, 0x0EA7, 0x0C50, 0x105E, - 0x32A2, 0x32A3, 0x32A4, 0x32A5, 0x32FF, 0x3330, 0x3268, 0x3269, 0x0FDB, 0x32FB, - 0x0C4C, 0x105F, 0x32C0, 0x0F66, 0x32F8, 0x32F9, 0x32B2, 0x32B3, 0x32B4, 0x32B5, - 0x32B6, 0x32B7, 0x32F6, 0x32B9, 0x32BA, 0x32BB, 0x32BC, 0x32BD, 0x32BE, 0x32BF, - 0x32C1, 0x32B8, 0x334F, 0x3350, 0x3351, 0x0C4B, 0x3331, 0x0C45, 0x3355, 0x3356, - 0x329A, 0x332C, 0x0CD7, 0x0ECF, 0x329E, 0x329F, 0x32FC, 0x3301, 0x3292, 0x3293, - 0x3294, 0x3295, 0x3296, 0x3297, 0x3298, 0x3299, 0x3285, 0x329B, 0x329C, 0x329D, - 0x3352, 0x3284, 0x32A0, 0x32A1, 0x0F45, 0x0DB9, 0x0CD9, 0x3327, 0x3361, 0x3362, - 0x0C99, 0x328F, 0x3360, 0x3365, 0x328C, 0x328B, 0x335F, 0x328A, 0x3291, 0x3366, - 0x3370, 0x3372, 0x336F, 0x3371, 0x32FA, 0x3376, 0x32FD, 0x3375, 0x3326, 0x0C49, - 0x32E5, 0x0C56, 0x0C4A, 0x32FE, 0x0C4F, 0x332D, 0x2636, 0x25B6, 0x25B7, 0x0C4E, - 0x0C57, 0x2635, 0x0C52, 0x25B1, 0x25A9, 0x25A7, 0x25A2, 0x0C58, 0x25A3, 0x25A8, - 0x0C4D, 0x25A1, 0x0C54, 0x25B0, 0x25B3, 0x25B2, 0x25BC, 0x25BD, 0x4495, 0x4492, - 0x25B9, 0x25B8, 0x0C51, 0x25BA, 0x44A9, 0x0215, 0x25C0, 0x449D, 0x25DB, 0x25E1, - 0x25A0, 0x25DA, 0x0C53, 0x44AB, 0x44AA, 0x44AF, 0x44D1, 0x0C55, 0x2634, 0x449C, - 0x25DC, 0x2703, 0x25A5, 0x263B, 0x4499, 0x44BD, 0x25D4, 0x25D3, 0x0C5A, 0x25D9, - 0x25D6, 0x25D7, 0x0CDA, 0x0CDB, 0x0F02, 0x0FD7, 0x1060, 0x1045, 0x25C3, 0x25DD, - 0x25ED, 0x25EE, 0x25E2, 0x0EFC, 0x0DBA, 0x0E8E, 0x25EC, 0x2620, 0x138B, 0x44C7, - 0x1063, 0x105D, 0x4498, 0x260A, 0x260B, 0x021F, 0x2626, 0x105C, 0x25FB, 0x2704, - 0x44B4, 0x0C59, 0x1042, 0x25F4, 0x261C, 0x261D, 0x2624, 0x2625, 0x2622, 0x2623, - 0x2627, 0x25FA, 0x2610, 0x2616, 0x0E62, 0x2615, 0x260D, 0x260C, 0x2617, 0x0D2A, - 0x25C2, 0x25EB, 0x2614, 0x25F2, 0x2619, 0x25C1, 0x2612, 0x2611, 0x1041, 0x1062, - 0x0DBB, 0x1046, 0x25DE, 0x104B, 0x25C7, 0x25C8, 0x4580, 0x25DF, 0x1384, 0x263A, - 0x12BE, 0x12BF, 0x25E0, 0x25F1, 0x44CE, 0x44B5, 0x44D0, 0x44CF, 0x12B6, 0x12B7, - 0x12C1, 0x12C9, 0x12C3, 0x12C2, 0x12C0, 0x12CE, 0x12C5, 0x12CF, 0x25EA, 0x446D, - 0x4430, 0x1548, 0x12C4, 0x12BD, 0x12C7, 0x12BB, 0x44FE, 0x0C9A, 0x2B27, 0x4481, - 0x0D94, 0x0EAE, 0x12F5, 0x12F6, 0x0C98, 0x0C9C, 0x32E3, 0x262F, 0x32E4, 0x32E9, - 0x0E42, 0x2B23, 0x12F0, 0x12EF, 0x441A, 0x2B21, 0x32E2, 0x32E8, 0x1D57, 0x2B22, - 0x262E, 0x12F1, 0x4450, 0x12F2, 0x4451, 0x2B24, 0x2637, 0x2B1D, 0x2B18, 0x441D, - 0x44C0, 0x44C1, 0x4489, 0x43A2, 0x4500, 0x44F6, 0x12C6, 0x3300, 0x4501, 0x4511, - 0x12DA, 0x12DD, 0x12E7, 0x12ED, 0x446A, 0x2B1F, 0x2B1E, 0x44FF, 0x44E4, 0x2B28, - 0x12C8, 0x44E5, 0x44D7, 0x44E0, 0x44D6, 0x44E1, 0x44DE, 0x44DB, 0x44DA, 0x44DD, - 0x44DC, 0x44DF, 0x022A, 0x0215, 0x022A, 0x021F, 0x0234, 0x0234, 0x0215, 0x021F, - 0x2699, 0x2696, 0x260E, 0x260F, 0x01C9, 0x01DF, 0x269F, 0x26A0, 0x269A, 0x2609, - 0x2607, 0x4502, 0x269E, 0x269D, 0x269B, 0x12D8, 0x44F5, 0x12D2, 0x12DB, 0x12D3, - 0x12E9, 0x12FA, 0x1307, 0x1302, 0x1308, 0x1309, 0x1303, 0x1306, 0x1305, 0x1304, - 0x1319, 0x131B, 0x26B2, 0x1318, 0x26B4, 0x26B3, 0x26B6, 0x26B5, 0x26B8, 0x26B7, - 0x26BA, 0x26B9, 0x130E, 0x26BB, 0x1313, 0x130F, 0x1315, 0x1314, 0x1317, 0x1316, - 0x1310, 0x1311, 0x1312, 0x131A, 0x131F, 0x1321, 0x2601, 0x25FE, 0x130B, 0x131D, - 0x2679, 0x2661, 0x2689, 0x2662, 0x01A2, 0x0198, 0x130D, 0x01C9, 0x31A4, 0x31A5, - 0x021F, 0x0215, 0x132F, 0x1334, 0x1327, 0x2618, 0x131C, 0x1333, 0x1336, 0x1335, - 0x1331, 0x1324, 0x31A9, 0x1325, 0x1326, 0x1337, 0x130A, 0x130C, 0x0198, 0x01A2, - 0x01DF, 0x0037, 0x01F5, 0x01C9, 0x0209, 0x31A8, 0x3182, 0x3183, 0x1323, 0x1338, - 0x31A2, 0x31A3, 0x3189, 0x0038, 0x003B, 0x003C, 0x318E, 0x131E, 0x318F, 0x0039, - 0x1320, 0x132E, 0x3192, 0x3193, 0x3194, 0x31B4, 0x31B2, 0x31B3, 0x3198, 0x3199, - 0x1328, 0x132C, 0x1322, 0x31B8, 0x132D, 0x31B9, 0x3190, 0x3191, 0x0A25, 0x0A26, - 0x0943, 0x0944, 0x09AC, 0x1329, 0x09B6, 0x09B7, 0x09CC, 0x09CF, 0x31B5, 0x09CF, - 0x09CC, 0x09CF, 0x003A, 0x09CC, 0x1330, 0x1332, 0x132A, 0x132B, 0x31B6, 0x31B7, - 0x31C0, 0x0234, 0x31BA, 0x31BB, 0x133E, 0x31C1, 0x1343, 0x133F, 0x31BE, 0x31BF, - 0x0A34, 0x133C, 0x0A33, 0x31BD, 0x0A45, 0x31BC, 0x2707, 0x1340, 0x133D, 0x3163, - 0x3164, 0x1341, 0x134C, 0x134A, 0x134F, 0x134E, 0x1351, 0x1350, 0x1354, 0x1352, - 0x1356, 0x1355, 0x3152, 0x3158, 0x3162, 0x3195, 0x3168, 0x3169, 0x317E, 0x317F, - 0x3180, 0x135F, 0x318B, 0x3176, 0x1364, 0x1363, 0x1366, 0x1365, 0x1369, 0x1367, - 0x317C, 0x3181, 0x136A, 0x317D, 0x1368, 0x1347, 0x317A, 0x1346, 0x095B, 0x3165, - 0x26D8, 0x270A, 0x3186, 0x3187, 0x26D2, 0x09F3, 0x318A, 0x095C, 0x09CC, 0x318D, - 0x0A2B, 0x09CF, 0x0A2C, 0x318C, 0x0976, 0x0975, 0x2706, 0x1381, 0x26DA, 0x0A3C, - 0x26D9, 0x25AC, 0x0972, 0x0971, 0x26E8, 0x0A27, 0x26BD, 0x093F, 0x134B, 0x4471, - 0x1353, 0x134D, 0x26BF, 0x136B, 0x0A46, 0x1362, 0x2702, 0x1380, 0x2708, 0x26C3, - 0x13CB, 0x26C4, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x3166, - 0x0234, 0x022A, 0x3170, 0x4467, 0x316C, 0x316A, 0x26BE, 0x2633, 0x316E, 0x316F, - 0x3171, 0x44BB, 0x26D5, 0x26D4, 0x26CF, 0x26D0, 0x26D1, 0x44B6, 0x26DB, 0x26DC, - 0x4466, 0x26D7, 0x136D, 0x26D6, 0x136F, 0x136E, 0x1371, 0x1370, 0x1373, 0x1372, - 0x1377, 0x1375, 0x1378, 0x05B9, 0x071B, 0x0569, 0x30D9, 0x44F7, 0x26EB, 0x30D4, - 0x26B1, 0x01C9, 0x44B3, 0x26EC, 0x25F6, 0x2681, 0x0577, 0x01DF, 0x0474, 0x44B2, - 0x137B, 0x2700, 0x137A, 0x063B, 0x05D8, 0x2613, 0x0619, 0x26FF, 0x050D, 0x1391, - 0x0475, 0x03C3, 0x1395, 0x1394, 0x1397, 0x1396, 0x003F, 0x1398, 0x139F, 0x1399, - 0x05A6, 0x0040, 0x139C, 0x139B, 0x05E7, 0x035C, 0x30DC, 0x25FD, 0x137F, 0x028C, - 0x02DD, 0x30DB, 0x0262, 0x0261, 0x30C4, 0x30C5, 0x070B, 0x1383, 0x03FF, 0x30D8, - 0x0290, 0x071A, 0x0209, 0x052C, 0x26E2, 0x06EA, 0x26E5, 0x06F9, 0x13BC, 0x136C, - 0x065E, 0x26E1, 0x1393, 0x26E6, 0x0439, 0x0668, 0x30E0, 0x30E1, 0x26FD, 0x14BA, - 0x13BE, 0x4457, 0x022A, 0x441C, 0x26F4, 0x06FA, 0x30DA, 0x052D, 0x26F3, 0x01F5, - 0x0A5B, 0x0400, 0x01DF, 0x01C9, 0x0650, 0x0706, 0x021F, 0x0215, 0x0234, 0x022A, - 0x06F7, 0x048D, 0x06FD, 0x054B, 0x003E, 0x0042, 0x0704, 0x06FE, 0x0705, 0x0703, - 0x0041, 0x446C, 0x1379, 0x139E, 0x0366, 0x003D, 0x0707, 0x06E9, 0x02FB, 0x2705, - 0x037D, 0x0708, 0x13CE, 0x137E, 0x13B3, 0x0394, 0x13B2, 0x01DF, 0x13AE, 0x13CC, - 0x13B7, 0x13CD, 0x13AD, 0x025C, 0x03C1, 0x13B0, 0x02D6, 0x13AC, 0x13B1, 0x26BC, - 0x13B4, 0x26FE, 0x13B5, 0x13AF, 0x43AF, 0x328D, 0x1559, 0x1541, 0x13BF, 0x153B, - 0x139A, 0x13A2, 0x13A3, 0x43A4, 0x43A5, 0x43B0, 0x13BB, 0x3263, 0x4513, 0x4547, - 0x0209, 0x43B1, 0x4395, 0x452F, 0x13B8, 0x43A9, 0x13B9, 0x43A3, 0x0375, 0x43B6, - 0x43F6, 0x43B4, 0x43B2, 0x43B3, 0x43B7, 0x43BA, 0x43B8, 0x43FA, 0x43B9, 0x43BC, - 0x43BD, 0x43BB, 0x13C9, 0x13AB, 0x43A8, 0x43AA, 0x43CD, 0x43A6, 0x04E3, 0x43A7, - 0x13A4, 0x13A5, 0x43FE, 0x049A, 0x43AE, 0x13A9, 0x13C5, 0x13C8, 0x13C6, 0x13C7, - 0x31B0, 0x4397, 0x31B1, 0x326E, 0x13C4, 0x4393, 0x4394, 0x4398, 0x4392, 0x0376, - 0x13B6, 0x0287, 0x43DF, 0x43FC, 0x13BD, 0x13BA, 0x13CA, 0x13C3, 0x43DB, 0x2709, - 0x4396, 0x04A8, 0x0963, 0x4409, 0x13C0, 0x13C1, 0x13C2, 0x270B, 0x13D0, 0x13CF, - 0x43D6, 0x270C, 0x26EE, 0x3264, 0x13D1, 0x13D2, 0x13D3, 0x13D4, 0x31AF, 0x13D5, - 0x31AC, 0x31AE, 0x43DA, 0x31A7, 0x31A6, 0x31AA, 0x3262, 0x31AB, 0x43CA, 0x43CB, - 0x43C6, 0x43CC, 0x31AD, 0x43C7, 0x43FB, 0x43FD, 0x13EB, 0x1464, 0x456D, 0x138C, - 0x43F7, 0x2017, 0x152A, 0x137D, 0x1526, 0x1388, 0x441F, 0x1524, 0x4428, 0x4416, - 0x1386, 0x4417, 0x441B, 0x44A2, 0x4421, 0x137C, 0x13E9, 0x442B, 0x4431, 0x4420, - 0x442D, 0x4425, 0x4429, 0x4415, 0x13EC, 0x4426, 0x452C, 0x1382, 0x4424, 0x442E, - 0x13EA, 0x4423, 0x441E, 0x4427, 0x442F, 0x4522, 0x4548, 0x13F5, 0x444D, 0x4521, - 0x4448, 0x13F9, 0x4414, 0x4444, 0x1392, 0x13FA, 0x4537, 0x1387, 0x13D6, 0x1523, - 0x211D, 0x022A, 0x4443, 0x4445, 0x0234, 0x4449, 0x4413, 0x01C9, 0x4418, 0x4419, - 0x442A, 0x4412, 0x1C95, 0x021F, 0x4442, 0x4447, 0x1D6E, 0x442C, 0x4472, 0x4550, - 0x4478, 0x1C98, 0x152D, 0x4479, 0x447A, 0x447B, 0x447D, 0x0215, 0x1525, 0x1C75, - 0x447C, 0x1529, 0x01F5, 0x0049, 0x1C80, 0x0198, 0x01A2, 0x1C79, 0x1C8E, 0x0209, - 0x4490, 0x4491, 0x1C9C, 0x1C9B, 0x4551, 0x1C7A, 0x1C9D, 0x1C9E, 0x1CA1, 0x1CA2, - 0x4475, 0x1C89, 0x4477, 0x4474, 0x1CA3, 0x4476, 0x004B, 0x004A, 0x1C7C, 0x01DF, - 0x1C8F, 0x4473, 0x448E, 0x1416, 0x1412, 0x1413, 0x1410, 0x4487, 0x4485, 0x4484, - 0x4446, 0x4486, 0x448A, 0x4488, 0x448B, 0x1539, 0x444C, 0x448C, 0x1408, 0x1409, - 0x448D, 0x1538, 0x4493, 0x140E, 0x1417, 0x4494, 0x140F, 0x4496, 0x153D, 0x1553, - 0x1415, 0x1546, 0x1547, 0x1407, 0x140C, 0x1551, 0x154D, 0x140D, 0x44A3, 0x154C, - 0x44A5, 0x44A4, 0x153F, 0x13FD, 0x1561, 0x44A8, 0x1560, 0x1537, 0x44B0, 0x1536, - 0x44B1, 0x44AE, 0x1555, 0x155C, 0x1562, 0x1563, 0x153E, 0x140B, 0x44B7, 0x153A, - 0x44B9, 0x44B8, 0x1545, 0x44BA, 0x140A, 0x44BC, 0x1544, 0x1414, 0x154A, 0x154B, - 0x1550, 0x13FB, 0x13FC, 0x13FF, 0x13FE, 0x44C6, 0x1400, 0x1401, 0x44CB, 0x44CA, - 0x44CD, 0x44CC, 0x1542, 0x1430, 0x141C, 0x1419, 0x1403, 0x1543, 0x153C, 0x1540, - 0x1431, 0x1421, 0x01DF, 0x0198, 0x1405, 0x021F, 0x1300, 0x1406, 0x01A2, 0x01C9, - 0x141A, 0x0215, 0x142B, 0x141B, 0x01A2, 0x12AB, 0x1418, 0x1428, 0x1427, 0x142D, - 0x1566, 0x1557, 0x1556, 0x142A, 0x1429, 0x142F, 0x12FF, 0x1554, 0x44F3, 0x44F2, - 0x1300, 0x44F4, 0x155A, 0x155B, 0x44F9, 0x44F8, 0x44FB, 0x44FA, 0x44FD, 0x44FC, - 0x1447, 0x1567, 0x144B, 0x144D, 0x1301, 0x142C, 0x4505, 0x4504, 0x4507, 0x4506, - 0x4509, 0x4508, 0x450B, 0x01C9, 0x450D, 0x450C, 0x450F, 0x450E, 0x1D5B, 0x4510, - 0x01A2, 0x01DF, 0x4515, 0x4514, 0x1D6C, 0x1D5A, 0x1D61, 0x1D60, 0x1D68, 0x021F, - 0x0209, 0x1D6F, 0x1D67, 0x1D66, 0x1D6D, 0x0234, 0x4523, 0x1D69, 0x4525, 0x4524, - 0x4527, 0x4526, 0x4529, 0x4528, 0x452B, 0x452A, 0x452D, 0x0198, 0x0215, 0x452E, - 0x4531, 0x4530, 0x1D4D, 0x1D73, 0x022A, 0x1D4B, 0x1D4F, 0x144C, 0x1D48, 0x1D46, - 0x1D51, 0x1D45, 0x1D4E, 0x1D47, 0x1D4A, 0x1D5E, 0x1D71, 0x1D50, 0x1D5F, 0x1D4C, - 0x1D5C, 0x1D5D, 0x1D52, 0x4546, 0x141D, 0x1420, 0x454B, 0x454A, 0x454D, 0x454C, - 0x141E, 0x454E, 0x2B19, 0x141F, 0x146A, 0x4517, 0x2B11, 0x2B12, 0x2B1B, 0x2B1A, - 0x4422, 0x1432, 0x4549, 0x144A, 0x1446, 0x01C9, 0x1468, 0x021F, 0x1422, 0x1469, - 0x0215, 0x142E, 0x022A, 0x0234, 0x01DF, 0x01C9, 0x1D70, 0x2B0D, 0x1D72, 0x2B0F, - 0x2B0E, 0x2B1C, 0x2B14, 0x2B10, 0x2B13, 0x2B15, 0x2B16, 0x4572, 0x4575, 0x4574, - 0x4577, 0x4576, 0x4579, 0x4578, 0x457B, 0x457A, 0x457D, 0x457C, 0x1478, 0x1472, - 0x2B26, 0x2B25, 0x2B17, 0x146C, 0x146D, 0x2B29, 0x4587, 0x4586, 0x1FFD, 0x146B, - 0x458B, 0x458A, 0x458D, 0x458C, 0x1FFE, 0x458E, 0x4591, 0x2001, 0x147F, 0x2003, - 0x149C, 0x147E, 0x2008, 0x1480, 0x200A, 0x2009, 0x200C, 0x200B, 0x1481, 0x147C, - 0x2010, 0x200F, 0x2012, 0x2011, 0x14A9, 0x1474, 0x149A, 0x2015, 0x2018, 0x1470, - 0x201A, 0x2019, 0x1471, 0x201B, 0x14A2, 0x146E, 0x2020, 0x201F, 0x1484, 0x1485, - 0x147B, 0x14A5, 0x2026, 0x2025, 0x1486, 0x1483, 0x1479, 0x147A, 0x1487, 0x202B, - 0x1482, 0x149E, 0x45D1, 0x45C7, 0x45C8, 0x45C9, 0x45C5, 0x45AE, 0x459E, 0x459F, - 0x01DF, 0x01A2, 0x45A1, 0x0209, 0x1423, 0x45AF, 0x45B0, 0x45B1, 0x1499, 0x149B, - 0x1411, 0x0050, 0x004E, 0x4783, 0x004F, 0x14A8, 0x146F, 0x0051, 0x004D, 0x0198, - 0x01DF, 0x004C, 0x149D, 0x0052, 0x1475, 0x0215, 0x005B, 0x1426, 0x1496, 0x1497, - 0x149F, 0x1498, 0x14A3, 0x1493, 0x1D87, 0x1D7F, 0x1DA7, 0x1D91, 0x1491, 0x1DBF, - 0x1D99, 0x14A0, 0x14A1, 0x1DBA, 0x1D8C, 0x1D80, 0x1DA1, 0x1D93, 0x1DA8, 0x1DA4, - 0x45CD, 0x14AA, 0x14A7, 0x14A4, 0x1425, 0x1424, 0x14D8, 0x14B0, 0x0234, 0x022A, - 0x14B6, 0x14AE, 0x1DBD, 0x1DB0, 0x4874, 0x14AF, 0x14DD, 0x14DE, 0x14AD, 0x14D7, - 0x14B2, 0x14AC, 0x14B8, 0x14B7, 0x14D9, 0x14B9, 0x14BC, 0x14BB, 0x30C7, 0x14BD, - 0x14B1, 0x14B4, 0x14BF, 0x14BE, 0x14C1, 0x14C0, 0x14C3, 0x14C2, 0x30C3, 0x14CD, - 0x14D6, 0x14C6, 0x14C9, 0x14CB, 0x14C7, 0x14DA, 0x14C8, 0x30DE, 0x1B37, 0x14B5, - 0x14B3, 0x1B43, 0x14C5, 0x14CF, 0x14C4, 0x1B61, 0x14D5, 0x14CA, 0x1B79, 0x14D4, - 0x14D3, 0x1B5B, 0x14CE, 0x14DB, 0x30C2, 0x14DC, 0x14DF, 0x1DD2, 0x1B4F, 0x1B8B, - 0x1B91, 0x45CE, 0x45D0, 0x022A, 0x0234, 0x1B73, 0x1B85, 0x45CA, 0x30C9, 0x45C6, - 0x45B9, 0x1DA3, 0x45B3, 0x45CB, 0x45CC, 0x45B2, 0x45CF, 0x45BF, 0x4724, 0x4665, - 0x1514, 0x1BA1, 0x47CD, 0x1513, 0x0215, 0x1DB8, 0x1DCE, 0x1DD1, 0x46C4, 0x1DA0, - 0x0209, 0x47C0, 0x01C9, 0x01F5, 0x0215, 0x0198, 0x4807, 0x01A2, 0x01A2, 0x0198, - 0x14CC, 0x01C9, 0x0234, 0x01F5, 0x021F, 0x01DF, 0x14D2, 0x022A, 0x0198, 0x1D98, - 0x1B67, 0x1B6D, 0x1515, 0x01C9, 0x45B4, 0x45B5, 0x1D92, 0x1DB3, 0x0198, 0x1DAF, - 0x45E3, 0x4848, 0x01DF, 0x4819, 0x1B7F, 0x4801, 0x30C6, 0x481E, 0x01C9, 0x0234, - 0x487B, 0x022A, 0x30C8, 0x021F, 0x30D0, 0x18EF, 0x30D1, 0x30FC, 0x1B9B, 0x1B9C, - 0x45B8, 0x1901, 0x30CA, 0x30CB, 0x30CC, 0x18F5, 0x1B98, 0x30CF, 0x18FB, 0x0E89, - 0x30F2, 0x30E3, 0x0F95, 0x0F96, 0x0FAA, 0x0EFD, 0x30F8, 0x30F9, 0x0EA8, 0x0EA4, - 0x30CE, 0x1017, 0x192B, 0x1931, 0x0EA6, 0x0F11, 0x1A8F, 0x1A95, 0x0F8B, 0x1913, - 0x1B9D, 0x1B9E, 0x0F03, 0x1AB3, 0x0F43, 0x0D4F, 0x4772, 0x190D, 0x0F41, 0x0F42, - 0x0F40, 0x1AB9, 0x0F0F, 0x0F90, 0x1018, 0x0F97, 0x30F7, 0x1919, 0x1B55, 0x30F5, - 0x30F4, 0x30FD, 0x1B9A, 0x1B49, 0x0EF4, 0x30F3, 0x30F6, 0x1907, 0x0FAF, 0x3116, - 0x0FC8, 0x0215, 0x0FB8, 0x3117, 0x2135, 0x47F0, 0x4730, 0x0FB5, 0x30E7, 0x0FC2, - 0x30E8, 0x0FB0, 0x0E58, 0x3121, 0x311D, 0x3103, 0x311B, 0x30E6, 0x311C, 0x0FD8, - 0x0ECE, 0x0EAF, 0x14FA, 0x46FF, 0x0EB0, 0x0EF3, 0x48BE, 0x0ECC, 0x0EFB, 0x0EED, - 0x4701, 0x4610, 0x0EA9, 0x30E5, 0x0E63, 0x0FC5, 0x30E2, 0x0FC1, 0x30FE, 0x1008, - 0x30E4, 0x3120, 0x0E78, 0x212B, 0x0EF6, 0x476A, 0x2129, 0x311A, 0x30E9, 0x30FF, - 0x0EF2, 0x2137, 0x3100, 0x0F9B, 0x475F, 0x30FB, 0x30FA, 0x3101, 0x1B3D, 0x3102, - 0x14F5, 0x0D8C, 0x0F67, 0x0F46, 0x1127, 0x1126, 0x112A, 0x0D67, 0x469F, 0x0C64, - 0x310A, 0x310B, 0x3110, 0x0F15, 0x310E, 0x310F, 0x0D98, 0x3111, 0x0FDC, 0x0C65, - 0x0FBB, 0x0D1E, 0x0CC2, 0x0C9D, 0x1012, 0x0C5B, 0x0C5E, 0x0D7F, 0x0C6B, 0x0D06, - 0x0C71, 0x0C9B, 0x480D, 0x0CDC, 0x0CA7, 0x3123, 0x3122, 0x4677, 0x0D56, 0x0C68, - 0x0CDF, 0x0C6E, 0x30EC, 0x30ED, 0x0D91, 0x100F, 0x0F12, 0x0D2B, 0x1010, 0x30F1, - 0x0F0A, 0x3133, 0x3134, 0x3135, 0x0D95, 0x1011, 0x3138, 0x1A74, 0x1A75, 0x4882, - 0x1A55, 0x20FB, 0x0E8F, 0x0ED0, 0x0EB9, 0x0FE3, 0x3107, 0x212D, 0x3104, 0x3105, - 0x0F09, 0x4814, 0x468C, 0x4818, 0x477F, 0x311E, 0x3109, 0x46D5, 0x311F, 0x215B, - 0x2159, 0x47B3, 0x2167, 0x2157, 0x474B, 0x4632, 0x460F, 0x4669, 0x4635, 0x47B0, - 0x471B, 0x45EE, 0x4685, 0x46A5, 0x46F0, 0x4753, 0x46B6, 0x4704, 0x4866, 0x47BB, - 0x4615, 0x48BC, 0x4681, 0x4698, 0x3108, 0x47CF, 0x483E, 0x14F4, 0x0D8E, 0x3106, - 0x476E, 0x4762, 0x45E5, 0x214F, 0x46AB, 0x4666, 0x46AE, 0x4737, 0x2163, 0x4678, - 0x4889, 0x4767, 0x4677, 0x48AA, 0x467D, 0x46E9, 0x464D, 0x310C, 0x488B, 0x310D, - 0x151A, 0x200E, 0x457E, 0x470F, 0x47AA, 0x4581, 0x457F, 0x145D, 0x4520, 0x2115, - 0x2014, 0x022C, 0x0236, 0x019A, 0x2013, 0x2109, 0x01DF, 0x4886, 0x210F, 0x0221, - 0x0198, 0x01A2, 0x2117, 0x445B, 0x210B, 0x445C, 0x021F, 0x1435, 0x1433, 0x4460, - 0x1439, 0x210D, 0x1517, 0x4461, 0x1434, 0x1C90, 0x143E, 0x445A, 0x1C9F, 0x0234, - 0x01A4, 0x01CB, 0x448F, 0x151E, 0x1465, 0x152F, 0x2141, 0x1437, 0x4872, 0x1438, - 0x152B, 0x1518, 0x1C96, 0x4834, 0x1BB7, 0x211B, 0x445E, 0x1462, 0x01F5, 0x152C, - 0x1532, 0x4732, 0x1530, 0x1461, 0x4470, 0x1516, 0x20ED, 0x1C91, 0x0CA5, 0x143D, - 0x20F1, 0x20F3, 0x2165, 0x215F, 0x1C8A, 0x14FB, 0x1C8C, 0x20EF, 0x4750, 0x2161, - 0x20FD, 0x20EB, 0x20E9, 0x20FF, 0x46E2, 0x2107, 0x01C9, 0x01A2, 0x2119, 0x01DF, - 0x20F9, 0x0198, 0x2121, 0x2123, 0x20F5, 0x2127, 0x0234, 0x214D, 0x022A, 0x0209, - 0x021F, 0x0EB7, 0x0D24, 0x0C5C, 0x0217, 0x0D23, 0x0FBC, 0x2105, 0x01DF, 0x0FC9, - 0x0FE4, 0x0D19, 0x0CC7, 0x0215, 0x215D, 0x2153, 0x2151, 0x0D25, 0x1BBE, 0x151C, - 0x1C94, 0x1C8B, 0x47E7, 0x4456, 0x445D, 0x151D, 0x1BD1, 0x1BD0, 0x191F, 0x4693, - 0x1019, 0x473F, 0x1BD2, 0x18A7, 0x0EF7, 0x445F, 0x18B3, 0x0EF8, 0x1967, 0x18B9, - 0x1BBA, 0x1BBB, 0x0FAB, 0x0FD2, 0x0C78, 0x1C93, 0x0FAC, 0x1937, 0x1997, 0x0FCF, - 0x0FD1, 0x0EFA, 0x0D49, 0x0FC4, 0x0C29, 0x18AD, 0x0EB1, 0x01E1, 0x0CCD, 0x022A, - 0x1C73, 0x1C72, 0x0D9A, 0x01F7, 0x020B, 0x0DB4, 0x01F5, 0x0FC6, 0x487C, 0x18D1, - 0x0FB1, 0x0209, 0x0215, 0x021F, 0x022A, 0x0234, 0x0E09, 0x0E44, 0x0E8A, 0x47A2, - 0x1CA0, 0x0FB6, 0x1007, 0x1BB4, 0x1BB6, 0x0EF9, 0x485C, 0x01A2, 0x1C9A, 0x0198, - 0x0FCD, 0x0FD0, 0x1BBF, 0x101B, 0x1BB9, 0x1949, 0x46C5, 0x1BB8, 0x1BB5, 0x1BA6, - 0x1009, 0x100E, 0x1925, 0x0FB7, 0x2BF8, 0x0EEE, 0x1A72, 0x1A73, 0x0FD4, 0x2BF3, - 0x2BFB, 0x01C9, 0x0F0D, 0x0FD3, 0x143A, 0x143C, 0x1A76, 0x1404, 0x1402, 0x01A2, - 0x0198, 0x01A2, 0x01F5, 0x0209, 0x01F5, 0x0209, 0x1002, 0x01DF, 0x0215, 0x021F, - 0x4817, 0x19AD, 0x2C32, 0x2C2C, 0x2C27, 0x0BB9, 0x01DF, 0x0BB7, 0x193D, 0x19B2, - 0x2C2D, 0x01DF, 0x2C31, 0x2C2E, 0x1943, 0x47E5, 0x488E, 0x46E4, 0x4857, 0x0F2D, - 0x45E9, 0x47A1, 0x4871, 0x48AE, 0x46B4, 0x45E1, 0x48A8, 0x4892, 0x0F07, 0x479D, - 0x2C24, 0x0D1F, 0x2BF1, 0x0D26, 0x0D1A, 0x476F, 0x0D27, 0x0D1D, 0x2BEA, 0x0C24, - 0x0EAD, 0x0D1B, 0x0EAC, 0x0BEA, 0x0C07, 0x0C1B, 0x0BE6, 0x0EAA, 0x2BA3, 0x2BCA, - 0x2BA1, 0x0EB4, 0x2BBE, 0x2BA4, 0x2BA5, 0x2BA6, 0x0EB3, 0x2BBF, 0x2BC0, 0x2BC3, - 0x2BC4, 0x2BCB, 0x0EAB, 0x2AA7, 0x2C0B, 0x0F77, 0x0D28, 0x0D4B, 0x47F6, 0x2BC7, - 0x1DB9, 0x0D20, 0x2BE0, 0x2BE1, 0x0D29, 0x0F5B, 0x2AAB, 0x2BE5, 0x2BE6, 0x2BE7, - 0x0EB2, 0x0D4C, 0x0D53, 0x0D46, 0x0D47, 0x0D44, 0x2BEB, 0x0D41, 0x0D42, 0x0D4E, - 0x2691, 0x0D54, 0x1C71, 0x1C84, 0x0D4D, 0x1C74, 0x1C77, 0x1C76, 0x1C7E, 0x2676, - 0x2675, 0x267C, 0x1C7D, 0x1C78, 0x1C83, 0x1C7F, 0x2BFF, 0x2BFE, 0x1C81, 0x1CA4, - 0x1C92, 0x1C82, 0x226E, 0x2C0C, 0x1C97, 0x1C99, 0x226F, 0x2C0F, 0x46F8, 0x469A, - 0x26AF, 0x2C26, 0x2694, 0x2692, 0x2C0E, 0x2248, 0x2C06, 0x26A9, 0x2693, 0x2BFD, - 0x2C07, 0x2C02, 0x2C01, 0x1C7B, 0x2C03, 0x2C04, 0x2C0A, 0x2C09, 0x26AA, 0x26A2, - 0x26A3, 0x26A4, 0x26A1, 0x26A6, 0x26A5, 0x26B0, 0x2BA2, 0x26A7, 0x26A8, 0x26AC, - 0x2B9F, 0x0BF2, 0x2B87, 0x26AB, 0x1230, 0x264C, 0x1FFF, 0x2007, 0x201E, 0x2000, - 0x2002, 0x2672, 0x0469, 0x1234, 0x46EF, 0x2004, 0x475E, 0x11F0, 0x11EF, 0x268F, - 0x2670, 0x2690, 0x0398, 0x046D, 0x2688, 0x046A, 0x266F, 0x0522, 0x2016, 0x048B, - 0x0514, 0x2029, 0x2BE2, 0x034D, 0x051D, 0x268A, 0x264E, 0x2678, 0x0349, 0x264F, - 0x2653, 0x267D, 0x2669, 0x2671, 0x267B, 0x201C, 0x0299, 0x267A, 0x2006, 0x264D, - 0x029E, 0x202A, 0x0374, 0x265D, 0x0348, 0x266A, 0x2660, 0x266B, 0x265C, 0x04B8, - 0x2665, 0x2666, 0x2667, 0x2668, 0x2663, 0x2652, 0x266C, 0x2664, 0x2021, 0x2BE8, - 0x4672, 0x0649, 0x46F9, 0x0C13, 0x0643, 0x0C1A, 0x2005, 0x0FBA, 0x46B9, 0x0642, - 0x0C1F, 0x0C2D, 0x0CCE, 0x0D1C, 0x0F00, 0x2685, 0x0D48, 0x0FB4, 0x477E, 0x4791, - 0x0D22, 0x0EEF, 0x0F01, 0x06A2, 0x0FB2, 0x0FAE, 0x268C, 0x01A2, 0x2684, 0x268D, - 0x2023, 0x472A, 0x201D, 0x0FB9, 0x0D43, 0x0F91, 0x0BE7, 0x0C18, 0x2C21, 0x0F94, - 0x0C0D, 0x0C10, 0x0C25, 0x0C28, 0x0C2E, 0x2024, 0x0F93, 0x0C08, 0x0BE3, 0x0C27, - 0x0234, 0x4480, 0x2B77, 0x2B7A, 0x2B79, 0x0C2B, 0x2B78, 0x2B9A, 0x2BD2, 0x2022, - 0x2B7D, 0x069F, 0x2B80, 0x0FB3, 0x0C2A, 0x0BE2, 0x2B9B, 0x2B9D, 0x2B8A, 0x2B90, - 0x2B8D, 0x2B8B, 0x0BF7, 0x0C22, 0x2B93, 0x2B94, 0x2B96, 0x2B98, 0x2B95, 0x2B86, - 0x2B99, 0x2B92, 0x200D, 0x0CC6, 0x0C66, 0x2B85, 0x0CC5, 0x0C1D, 0x0C67, 0x2249, - 0x0CCA, 0x2B7F, 0x0CC3, 0x2639, 0x0CCB, 0x1231, 0x1247, 0x2B7B, 0x1233, 0x2B81, - 0x1235, 0x2BCC, 0x122F, 0x124A, 0x1249, 0x1248, 0x124B, 0x124C, 0x124D, 0x0CC8, - 0x2BD8, 0x2B83, 0x0CC9, 0x2BFC, 0x2B84, 0x0CD0, 0x2B89, 0x0CCF, 0x2BE4, 0x0CC4, - 0x0C16, 0x0FAD, 0x2AD6, 0x0D21, 0x2B9E, 0x04BC, 0x2638, 0x1FBC, 0x1FBD, 0x1FBE, - 0x1FC6, 0x1FC0, 0x4829, 0x0D93, 0x4768, 0x481C, 0x0D8A, 0x0EF1, 0x1FBF, 0x461B, - 0x0D52, 0x1FC2, 0x2B88, 0x474E, 0x265E, 0x0EF0, 0x0D51, 0x0D8F, 0x0D97, 0x0D96, - 0x022A, 0x0F05, 0x0EFF, 0x4835, 0x4867, 0x1FC3, 0x1FC4, 0x1FC5, 0x1D9C, 0x0F06, - 0x0F8E, 0x0F8D, 0x265F, 0x4699, 0x1DE9, 0x2BCF, 0x101A, 0x2BDB, 0x0F92, 0x4606, - 0x2BDF, 0x2AA3, 0x4842, 0x2BE3, 0x461C, 0x48A4, 0x486F, 0x1D8E, 0x45E0, 0x465D, - 0x475B, 0x48B0, 0x4883, 0x1DD3, 0x467F, 0x4790, 0x4726, 0x4968, 0x1DC4, 0x2B8F, - 0x1125, 0x480E, 0x1232, 0x470F, 0x11D2, 0x0F3C, 0x47EA, 0x0F3E, 0x0F3D, 0x4714, - 0x0F3F, 0x0F60, 0x4628, 0x0F62, 0x0F61, 0x0F85, 0x0F63, 0x0F87, 0x0F86, 0x0F89, - 0x481B, 0x484B, 0x11CE, 0x4859, 0x4850, 0x11CD, 0x46F5, 0x11CF, 0x48BE, 0x462E, - 0x45FB, 0x4780, 0x022A, 0x0234, 0x0DA1, 0x4756, 0x45DD, 0x000F, 0x000B, 0x0016, - 0x0013, 0x0C80, 0x0C7F, 0x0C82, 0x2680, 0x0C89, 0x0C88, 0x0CB6, 0x0CB5, 0x0CB8, - 0x0CB7, 0x0CBA, 0x0CB9, 0x0CF8, 0x0CF7, 0x0CFC, 0x0CF9, 0x0CFE, 0x0CFD, 0x0D0F, - 0x0D0E, 0x0D11, 0x0D10, 0x0D13, 0x0D12, 0x0E9C, 0x0E9B, 0x0EC5, 0x0EC4, 0x1D62, - 0x0964, 0x0A49, 0x1D64, 0x1D6B, 0x0A86, 0x0969, 0x1D65, 0x0A78, 0x0A74, 0x11D1, - 0x0A70, 0x0A85, 0x0A4E, 0x0A5C, 0x0A77, 0x0A4F, 0x0A63, 0x0A65, 0x0A6F, 0x0A04, - 0x096A, 0x0A73, 0x0A06, 0x0A64, 0x0A66, 0x096D, 0x096E, 0x09AD, 0x0A4A, 0x0A1E, - 0x09CC, 0x0A1D, 0x0986, 0x0985, 0x45DB, 0x473B, 0x098B, 0x14F6, 0x1128, 0x098C, - 0x14F0, 0x14F7, 0x11F1, 0x1D43, 0x01F5, 0x4641, 0x0209, 0x1549, 0x11D0, 0x1129, - 0x4755, 0x11EE, 0x1D6A, 0x11ED, 0x4712, 0x1D53, 0x11EC, 0x2B20, 0x0F0E, 0x14E9, - 0x10F2, 0x10F1, 0x2131, 0x2133, 0x46FB, 0x470A, 0x4754, 0x4633, 0x2145, 0x4778, - 0x2101, 0x2103, 0x4702, 0x472A, 0x14EC, 0x478D, 0x14EA, 0x43AB, 0x4623, 0x14ED, - 0x14EE, 0x14F1, 0x43D1, 0x14E8, 0x14F2, 0x14F3, 0x14EF, 0x2143, 0x2125, 0x488D, - 0x4764, 0x213D, 0x4738, 0x1FC1, 0x2139, 0x01A2, 0x212F, 0x111C, 0x111F, 0x4399, - 0x1121, 0x1120, 0x1123, 0x1122, 0x477B, 0x112B, 0x112E, 0x4831, 0x1130, 0x214B, - 0x1132, 0x1131, 0x1135, 0x1134, 0x1137, 0x1136, 0x1139, 0x2149, 0x113B, 0x113A, - 0x2155, 0x1552, 0x48B2, 0x113D, 0x47AC, 0x1501, 0x14FC, 0x469D, 0x4793, 0x48A6, - 0x46EA, 0x0234, 0x022A, 0x1D56, 0x4880, 0x4743, 0x1502, 0x150E, 0x46F4, 0x14FD, - 0x14FE, 0x114B, 0x01F5, 0x0209, 0x114E, 0x4616, 0x1150, 0x114F, 0x1152, 0x460E, - 0x48B4, 0x1153, 0x115B, 0x1D58, 0x115D, 0x115C, 0x4811, 0x485B, 0x4617, 0x4830, - 0x14FF, 0x14EB, 0x150F, 0x485F, 0x1511, 0x1510, 0x1D7D, 0x48B1, 0x46BE, 0x1DC0, - 0x01C9, 0x01A2, 0x01DF, 0x116F, 0x0215, 0x1512, 0x0198, 0x021F, 0x1D55, 0x14F8, - 0x1500, 0x1DAD, 0x14F9, 0x0209, 0x1DD5, 0x01F5, 0x213F, 0x213B, 0x1180, 0x117F, - 0x2113, 0x2027, 0x2147, 0x0046, 0x46C8, 0x1D63, 0x2028, 0x489C, 0x2111, 0x211F, - 0x45FC, 0x4888, 0x46ED, 0x20F7, 0x4769, 0x47CB, 0x297A, 0x2979, 0x1194, 0x1193, - 0x1196, 0x1195, 0x1198, 0x1197, 0x119A, 0x1199, 0x119D, 0x119C, 0x119F, 0x119E, - 0x11A1, 0x11A0, 0x11A3, 0x11A2, 0x2975, 0x11A4, 0x11A6, 0x11A5, 0x11A8, 0x11A7, - 0x2976, 0x2974, 0x11AA, 0x11A9, 0x11AC, 0x11AB, 0x11AE, 0x11AD, 0x2981, 0x11AF, - 0x2983, 0x11B0, 0x11B2, 0x11B1, 0x11B4, 0x11B3, 0x297D, 0x297C, 0x11B6, 0x297E, - 0x11B8, 0x11B7, 0x11BA, 0x11B9, 0x2978, 0x11BB, 0x11BE, 0x11BD, 0x11C0, 0x11BF, - 0x11C2, 0x11C1, 0x297F, 0x11C3, 0x11C5, 0x11C4, 0x11C7, 0x11C6, 0x11C9, 0x11C8, - 0x11CB, 0x11CA, 0x2991, 0x2967, 0x11D6, 0x11D5, 0x2966, 0x2964, 0x298C, 0x2965, - 0x2992, 0x2993, 0x2968, 0x2969, 0x296A, 0x296D, 0x296E, 0x296F, 0x11E4, 0x11E3, - 0x11E6, 0x11E5, 0x296C, 0x2973, 0x11EA, 0x11E9, 0x2982, 0x2980, 0x11F5, 0x11F4, - 0x11F7, 0x11F6, 0x298E, 0x2985, 0x2986, 0x29B5, 0x29B4, 0x2997, 0x298A, 0x298B, - 0x29B8, 0x298F, 0x2984, 0x2987, 0x2970, 0x2971, 0x2972, 0x2989, 0x29A5, 0x29A1, - 0x29A0, 0x29BF, 0x29B7, 0x29A7, 0x2999, 0x299A, 0x299D, 0x299E, 0x29B6, 0x298D, - 0x299C, 0x29A2, 0x29A3, 0x2988, 0x29C4, 0x29C5, 0x29E7, 0x1D44, 0x29C7, 0x29C9, - 0x29CA, 0x021F, 0x01F5, 0x01C9, 0x29B0, 0x1D54, 0x1D49, 0x29B1, 0x1D59, 0x47C3, - 0x29F5, 0x29D8, 0x29F7, 0x29F6, 0x29F9, 0x29F8, 0x29DA, 0x29FA, 0x29FD, 0x29DE, - 0x29FF, 0x29FE, 0x2A01, 0x2A00, 0x1D75, 0x2A02, 0x2A05, 0x2A04, 0x29D6, 0x2A06, - 0x2A09, 0x2A08, 0x2A0B, 0x2A0A, 0x1D74, 0x2A0C, 0x2A0F, 0x29DF, 0x4863, 0x2990, - 0x474D, 0x463A, 0x4771, 0x0C5D, 0x29D4, 0x29DB, 0x0E1F, 0x0DEB, 0x0CBB, 0x0C69, - 0x0C6D, 0x0C6C, 0x0C8B, 0x0C7D, 0x0C72, 0x0E11, 0x0CA1, 0x0C9F, 0x2A25, 0x2A24, - 0x29A6, 0x2A26, 0x29A4, 0x2A28, 0x01A2, 0x29AB, 0x01DF, 0x01C9, 0x0209, 0x29AF, - 0x29A9, 0x0D3A, 0x0234, 0x29AA, 0x0DFE, 0x29AD, 0x29CB, 0x0E18, 0x29C2, 0x29B9, - 0x29BA, 0x29BB, 0x29BC, 0x29BD, 0x29BE, 0x000C, 0x29C0, 0x29C1, 0x29B2, 0x29C3, - 0x0E2B, 0x0DA5, 0x0E9D, 0x0E98, 0x0DBE, 0x0DC9, 0x0DD8, 0x0EC0, 0x0EBB, 0x0D5C, - 0x0E17, 0x29D5, 0x224A, 0x000E, 0x29A8, 0x0DE2, 0x0DF1, 0x0D70, 0x29AC, 0x29B3, - 0x0004, 0x0003, 0x29D7, 0x0008, 0x0D69, 0x0D86, 0x0010, 0x0012, 0x0D85, 0x29AE, - 0x0006, 0x000A, 0x2A2C, 0x2A2A, 0x2A30, 0x2A2E, 0x2A34, 0x2A32, 0x2A38, 0x2A36, - 0x2A3C, 0x2A3A, 0x2A40, 0x2A3E, 0x2A44, 0x2A42, 0x2A48, 0x2A46, 0x2A4C, 0x2A4A, - 0x2A50, 0x2A4E, 0x0D62, 0x0D31, 0x0E7D, 0x2A56, 0x2A5C, 0x2A5A, 0x2A60, 0x2A5E, - 0x0002, 0x2A62, 0x2A68, 0x2A66, 0x2A6C, 0x2A6A, 0x2A2B, 0x2A29, 0x0D58, 0x0D5B, - 0x0001, 0x2A31, 0x2A37, 0x2A35, 0x2A3B, 0x2A39, 0x0E39, 0x2A3D, 0x2A43, 0x0E32, - 0x2A47, 0x2A45, 0x2A4B, 0x2A49, 0x0DCF, 0x2A4D, 0x2A53, 0x2A51, 0x2A57, 0x2A55, - 0x2A5B, 0x2A59, 0x2A5F, 0x2A5D, 0x2A63, 0x2A61, 0x2A67, 0x2A65, 0x2A6B, 0x2A69, - 0x46E6, 0x29C8, 0x469C, 0x4774, 0x29D2, 0x466E, 0x29CC, 0x29CD, 0x4761, 0x29D1, - 0x29D0, 0x4719, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, - 0x0234, 0x022A, 0x4745, 0x0F5E, 0x0C63, 0x0C62, 0x224B, 0x46B3, 0x4782, 0x0C5F, - 0x22C0, 0x22C1, 0x29E0, 0x46DE, 0x0C60, 0x29C6, 0x22DA, 0x29E1, 0x0C6A, 0x0C7A, - 0x0D0A, 0x22DB, 0x29CE, 0x29CF, 0x473A, 0x29DC, 0x22C5, 0x22D4, 0x29D9, 0x22D6, - 0x29D3, 0x29E2, 0x22D3, 0x0D0D, 0x22D5, 0x22D8, 0x29DD, 0x46A8, 0x29E3, 0x0CFF, - 0x22D7, 0x0CB2, 0x0D08, 0x0CAF, 0x0CDE, 0x226A, 0x226B, 0x0CDD, 0x0CE1, 0x22C2, - 0x22C6, 0x22C7, 0x0CA9, 0x0CF1, 0x22CA, 0x2264, 0x22C4, 0x22CB, 0x2244, 0x221D, - 0x2BF5, 0x4802, 0x2AAC, 0x2BED, 0x492D, 0x2C11, 0x4865, 0x48E0, 0x48EA, 0x0015, - 0x2238, 0x2269, 0x2228, 0x0014, 0x0D32, 0x21FC, 0x21FF, 0x21FE, 0x0018, 0x21FD, - 0x2203, 0x2200, 0x0D14, 0x0017, 0x0D2D, 0x0CEE, 0x2206, 0x2201, 0x2202, 0x2207, - 0x222C, 0x2235, 0x2234, 0x2239, 0x221E, 0x2209, 0x220A, 0x223B, 0x2205, 0x047C, - 0x04E2, 0x0446, 0x2204, 0x2218, 0x220B, 0x01A3, 0x0199, 0x01E0, 0x01CA, 0x020A, - 0x01F6, 0x0220, 0x0216, 0x0235, 0x223A, 0x221F, 0x2236, 0x2237, 0x2CB5, 0x2CBA, - 0x2CBF, 0x2C96, 0x2CA8, 0x2D35, 0x2D2F, 0x2D29, 0x2D5C, 0x2C67, 0x2C9D, 0x2C82, - 0x2C6D, 0x2CAF, 0x2C7C, 0x2CCE, 0x2C74, 0x2C7E, 0x2230, 0x0553, 0x053C, 0x05B8, - 0x0575, 0x063A, 0x05E6, 0x2C69, 0x2C77, 0x06BD, 0x0698, 0x2C6F, 0x06DA, 0x2CA2, - 0x2C84, 0x2C8B, 0x2C90, 0x2BEF, 0x02A7, 0x225C, 0x225F, 0x4658, 0x46D7, 0x225D, - 0x2260, 0x025B, 0x02C4, 0x465C, 0x4890, 0x2267, 0x2261, 0x477A, 0x47BD, 0x2263, - 0x0386, 0x0365, 0x4731, 0x45E2, 0x473D, 0x2BF9, 0x46D1, 0x4861, 0x484F, 0x4779, - 0x47B8, 0x47FD, 0x4707, 0x2C28, 0x4873, 0x483A, 0x0329, 0x4722, 0x473E, 0x46FD, - 0x453A, 0x0D92, 0x02E6, 0x4710, 0x225E, 0x4536, 0x2278, 0x4540, 0x453D, 0x453B, - 0x4534, 0x4535, 0x4541, 0x453F, 0x0499, 0x453C, 0x03B1, 0x4785, 0x4720, 0x03DB, - 0x480F, 0x0422, 0x040D, 0x471C, 0x453E, 0x483E, 0x454F, 0x2CC9, 0x2CC4, 0x2CD6, - 0x2CD1, 0x2CDF, 0x4781, 0x2CE6, 0x2CE2, 0x2CEC, 0x4562, 0x4571, 0x2CF4, 0x4568, - 0x2D04, 0x4553, 0x456E, 0x2D1F, 0x4566, 0x2D25, 0x2D22, 0x456F, 0x2D2B, 0x2D3C, - 0x4565, 0x2D44, 0x2D40, 0x2D4C, 0x2D48, 0x2D5F, 0x2D52, 0x2265, 0x4564, 0x0D82, - 0x456C, 0x4567, 0x4569, 0x4563, 0x4555, 0x0DA6, 0x0D6D, 0x22B0, 0x0D6C, 0x2266, - 0x22B7, 0x4554, 0x2977, 0x4558, 0x0D81, 0x2A81, 0x4552, 0x2A87, 0x2A84, 0x4559, - 0x0DA0, 0x4844, 0x458F, 0x01DF, 0x48C5, 0x0D9F, 0x01C9, 0x1DD0, 0x456A, 0x456B, - 0x4570, 0x4590, 0x0EBF, 0x2B33, 0x2B30, 0x2B39, 0x2B36, 0x2B3F, 0x2B3C, 0x0B4C, - 0x2A9D, 0x2B45, 0x2B42, 0x2B4B, 0x2B48, 0x2B51, 0x2B4E, 0x0E97, 0x46E5, 0x46EB, - 0x0B4F, 0x0B55, 0x2AB3, 0x0E91, 0x2A91, 0x2AA6, 0x23B2, 0x4799, 0x2AA0, 0x46A3, - 0x2B6C, 0x471C, 0x0ED2, 0x23B3, 0x4764, 0x46AD, 0x4622, 0x46A7, 0x2A73, 0x46C3, - 0x45D9, 0x2245, 0x46E8, 0x47BC, 0x462B, 0x2A76, 0x23B0, 0x2246, 0x45EC, 0x481A, - 0x0198, 0x01A2, 0x2247, 0x0EC6, 0x4841, 0x478B, 0x48C8, 0x0EDC, 0x0F17, 0x4607, - 0x0EE4, 0x461E, 0x23AA, 0x0F24, 0x0F35, 0x2392, 0x23AE, 0x36F5, 0x3724, 0x23A8, - 0x36F9, 0x23AD, 0x3725, 0x3709, 0x3729, 0x372A, 0x372D, 0x370D, 0x370E, 0x370F, - 0x3710, 0x3702, 0x3701, 0x23A5, 0x3703, 0x3707, 0x3705, 0x23A9, 0x23A6, 0x370C, - 0x23B1, 0x23A4, 0x370B, 0x370A, 0x3706, 0x3708, 0x23AB, 0x3721, 0x23B4, 0x23B5, - 0x23BC, 0x23AF, 0x23B8, 0x3720, 0x3727, 0x23BB, 0x23AC, 0x23BD, 0x23BE, 0x23BF, - 0x23C0, 0x3726, 0x23C2, 0x23C3, 0x2384, 0x2385, 0x2383, 0x2387, 0x237D, 0x2378, - 0x2348, 0x2389, 0x2386, 0x22CF, 0x237F, 0x237E, 0x3722, 0x238B, 0x2388, 0x372F, - 0x23A2, 0x2394, 0x237A, 0x23A3, 0x239B, 0x23A1, 0x2379, 0x2398, 0x239D, 0x238F, - 0x239F, 0x239C, 0x23A0, 0x238A, 0x239E, 0x373D, 0x2393, 0x3745, 0x373E, 0x237B, - 0x373C, 0x3741, 0x2374, 0x3742, 0x3747, 0x3731, 0x238E, 0x2C2F, 0x238C, 0x238D, - 0x3730, 0x3711, 0x2377, 0x3713, 0x3714, 0x3717, 0x22BD, 0x3740, 0x3712, 0x3719, - 0x371B, 0x3746, 0x3744, 0x2376, 0x3716, 0x3715, 0x371F, 0x2C29, 0x372E, 0x23B7, - 0x2BE9, 0x2C2B, 0x3739, 0x22D1, 0x23B6, 0x3728, 0x236C, 0x3718, 0x23BA, 0x23C1, - 0x372C, 0x2BEE, 0x2372, 0x2373, 0x22CE, 0x374B, 0x23A7, 0x374A, 0x3751, 0x22CD, - 0x374C, 0x3755, 0x3752, 0x3759, 0x2BF6, 0x374F, 0x374E, 0x23B9, 0x3750, 0x2C2A, - 0x22BC, 0x375D, 0x22BE, 0x22BF, 0x2390, 0x2365, 0x2240, 0x22C3, 0x2363, 0x2C22, - 0x2391, 0x2366, 0x2BF4, 0x236F, 0x2369, 0x236B, 0x22CC, 0x236D, 0x376A, 0x22D2, - 0x236E, 0x3771, 0x2BEC, 0x22D0, 0x2380, 0x2382, 0x22D9, 0x2371, 0x237C, 0x2381, - 0x2367, 0x2368, 0x377A, 0x377B, 0x377C, 0x3781, 0x377E, 0x377F, 0x3780, 0x3785, - 0x3782, 0x2405, 0x23C6, 0x23C7, 0x23C9, 0x3789, 0x248D, 0x23CA, 0x378A, 0x378D, - 0x23D4, 0x3733, 0x3735, 0x3791, 0x3734, 0x3736, 0x3737, 0x3738, 0x373B, 0x3748, - 0x3732, 0x248C, 0x373A, 0x379B, 0x379A, 0x23D7, 0x379C, 0x379F, 0x379E, 0x37A1, - 0x37A0, 0x37A3, 0x37A2, 0x37A5, 0x37A4, 0x37A7, 0x3749, 0x37A9, 0x37A8, 0x23F7, - 0x37AA, 0x37AD, 0x24A9, 0x23F5, 0x23F6, 0x37B1, 0x24B1, 0x24AF, 0x24B8, 0x24B2, - 0x24B4, 0x24B5, 0x24AE, 0x23DC, 0x24B7, 0x37BB, 0x37BA, 0x23E1, 0x37BC, 0x37BF, - 0x37BE, 0x37C1, 0x37C0, 0x37C3, 0x37C2, 0x23DE, 0x37C4, 0x2407, 0x2420, 0x240A, - 0x23E3, 0x2406, 0x0209, 0x23D5, 0x23D6, 0x0096, 0x0097, 0x23D9, 0x00AB, 0x23DB, - 0x0092, 0x23DD, 0x0099, 0x23DF, 0x23D8, 0x23DA, 0x0098, 0x008B, 0x23FE, 0x008D, - 0x008C, 0x008A, 0x23E0, 0x0091, 0x0090, 0x0095, 0x01DF, 0x01F5, 0x021F, 0x008E, - 0x008F, 0x0094, 0x0093, 0x01C9, 0x009A, 0x0215, 0x009C, 0x009B, 0x0234, 0x022A, - 0x01A2, 0x00A3, 0x23FF, 0x00A5, 0x00A4, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x23E2, - 0x24AA, 0x2489, 0x2482, 0x2481, 0x2480, 0x2485, 0x2483, 0x00AC, 0x00A2, 0x2486, - 0x24AD, 0x00A7, 0x00A6, 0x00A9, 0x00A8, 0x01C9, 0x00AE, 0x00AF, 0x01A2, 0x00B3, - 0x01C9, 0x248B, 0x01C9, 0x2A54, 0x2404, 0x2409, 0x0209, 0x240B, 0x23D0, 0x2412, - 0x2408, 0x00BB, 0x00BA, 0x00C1, 0x00BC, 0x00BF, 0x00BE, 0x00BD, 0x00C0, 0x01A2, - 0x2354, 0x2431, 0x01A2, 0x01A2, 0x2358, 0x01C9, 0x24AC, 0x00AA, 0x240C, 0x00C5, - 0x0209, 0x24AB, 0x23F8, 0x2424, 0x2402, 0x2484, 0x23FC, 0x23FD, 0x2488, 0x248A, - 0x2401, 0x2403, 0x24D8, 0x00D4, 0x009D, 0x00D2, 0x00AD, 0x00D7, 0x00D3, 0x00D5, - 0x00D6, 0x24BE, 0x24BC, 0x00D9, 0x24BA, 0x2498, 0x24C1, 0x24BB, 0x00D8, 0x24C3, - 0x24C0, 0x2490, 0x24BF, 0x2492, 0x2491, 0x2496, 0x2493, 0x00DA, 0x2497, 0x24C8, - 0x0198, 0x2499, 0x24C7, 0x24DC, 0x2495, 0x2494, 0x24EA, 0x24E6, 0x24E7, 0x24EB, - 0x24EE, 0x24CB, 0x2355, 0x24A7, 0x24C6, 0x24CC, 0x11B5, 0x2353, 0x24CA, 0x2241, - 0x2356, 0x2410, 0x24EC, 0x24CD, 0x24E0, 0x24E9, 0x24ED, 0x24B0, 0x24E2, 0x24BD, - 0x24EF, 0x24A1, 0x24C9, 0x24B3, 0x24E4, 0x240E, 0x24C2, 0x24D5, 0x1CC5, 0x1CC4, - 0x1CC7, 0x1CC6, 0x1CC9, 0x1CC8, 0x1CCB, 0x1CCA, 0x1CCD, 0x1CCC, 0x1CCF, 0x1CCE, - 0x2242, 0x1CD0, 0x1CD2, 0x1CD1, 0x2243, 0x1CD3, 0x1CD4, 0x223C, 0x223D, 0x223E, - 0x223F, 0x2258, 0x2259, 0x114C, 0x225A, 0x225B, 0x2254, 0x2437, 0x2438, 0x2A3F, - 0x1CD6, 0x1CD5, 0x1CD8, 0x1CD7, 0x1CDA, 0x2425, 0x1CDC, 0x1CDB, 0x1CDE, 0x1D02, - 0x1CE0, 0x1CDF, 0x1D05, 0x1CE1, 0x1D06, 0x242B, 0x1CE6, 0x1CE5, 0x2255, 0x2439, - 0x2429, 0x2428, 0x2256, 0x2257, 0x2250, 0x242D, 0x242F, 0x2251, 0x2430, 0x2252, - 0x2253, 0x2339, 0x1CE8, 0x1BC1, 0x1CEA, 0x1CE9, 0x1CEC, 0x1CEE, 0x2413, 0x1CEB, - 0x240D, 0x1CE7, 0x1CF2, 0x240F, 0x242E, 0x1CF3, 0x1CED, 0x1CF1, 0x1CF8, 0x1CF7, - 0x1CFE, 0x3514, 0x1CFF, 0x2411, 0x34FB, 0x3501, 0x1CEF, 0x1CF0, 0x1D03, 0x1D04, - 0x1D01, 0x1CF4, 0x1CF5, 0x1CF6, 0x1BC0, 0x234A, 0x2432, 0x11BC, 0x3507, 0x34FE, - 0x3516, 0x3500, 0x3510, 0x3512, 0x2436, 0x2434, 0x1CFC, 0x34FF, 0x3523, 0x2433, - 0x1CF9, 0x242C, 0x1D08, 0x1CFB, 0x351D, 0x3529, 0x2357, 0x1CFA, 0x351B, 0x2435, - 0x2426, 0x351C, 0x351F, 0x2427, 0x242A, 0x1D00, 0x1E11, 0x1E14, 0x1E13, 0x1E12, - 0x1E15, 0x1E10, 0x1E17, 0x1E16, 0x1E29, 0x1E28, 0x1E1B, 0x1E1A, 0x1E2D, 0x1E19, - 0x1E2F, 0x1E2E, 0x1E21, 0x3505, 0x1E23, 0x1E1E, 0x1E1D, 0x1E24, 0x1E1F, 0x1E22, - 0x1E20, 0x1E2C, 0x1E2B, 0x1E2A, 0x1E18, 0x1E25, 0x1E26, 0x1E27, 0x224C, 0x1E34, - 0x224D, 0x1E31, 0x1E37, 0x1E38, 0x1E32, 0x1E36, 0x1E30, 0x224E, 0x2A41, 0x1E3A, - 0x1E1C, 0x1E3D, 0x29FB, 0x1118, 0x1E42, 0x1E43, 0x1E44, 0x1E41, 0x351E, 0x0B7F, - 0x111D, 0x3522, 0x1117, 0x3525, 0x3524, 0x3503, 0x3504, 0x3528, 0x224F, 0x0B4D, - 0x2349, 0x2328, 0x0085, 0x351A, 0x2A16, 0x0B50, 0x112F, 0x2A15, 0x1141, 0x2329, - 0x2A14, 0x1144, 0x2A1A, 0x3520, 0x1143, 0x2A17, 0x232A, 0x232B, 0x34B3, 0x1146, - 0x34A4, 0x1110, 0x2A1B, 0x34A7, 0x34AC, 0x34B0, 0x34AA, 0x2A1F, 0x34B2, 0x1E33, - 0x1142, 0x34A1, 0x01A2, 0x01C9, 0x01DF, 0x0198, 0x0209, 0x0215, 0x021F, 0x01F5, - 0x0234, 0x022A, 0x34A0, 0x349F, 0x34A3, 0x34A6, 0x34A5, 0x2A6D, 0x112C, 0x01C9, - 0x0198, 0x2324, 0x2A03, 0x01A2, 0x01DF, 0x01F5, 0x0234, 0x2325, 0x34AE, 0x34AD, - 0x0209, 0x022A, 0x021F, 0x0215, 0x1BC2, 0x2085, 0x2070, 0x2051, 0x2056, 0x2058, - 0x205E, 0x2083, 0x2066, 0x2069, 0x2071, 0x207B, 0x1BC3, 0x208C, 0x1A5B, 0x2087, - 0x206F, 0x1BBC, 0x022A, 0x0234, 0x19B3, 0x19E3, 0x29E6, 0x022A, 0x00DE, 0x29EF, - 0x00DC, 0x00DD, 0x34DC, 0x00DF, 0x00E0, 0x2326, 0x2067, 0x205D, 0x2086, 0x205C, - 0x2076, 0x2065, 0x2064, 0x2077, 0x204A, 0x207F, 0x2073, 0x207E, 0x2080, 0x2040, - 0x2045, 0x01A2, 0x01F5, 0x206B, 0x01C9, 0x0215, 0x34B1, 0x021F, 0x2068, 0x34B4, - 0x34B5, 0x34B6, 0x34B7, 0x34B8, 0x34B9, 0x34CF, 0x34BB, 0x0209, 0x208F, 0x208E, - 0x0234, 0x2090, 0x2037, 0x2034, 0x203F, 0x203D, 0x2044, 0x2042, 0x204E, 0x2049, - 0x2054, 0x00DB, 0x205A, 0x2055, 0x206C, 0x2052, 0x350B, 0x2075, 0x0AFF, 0x2093, - 0x2072, 0x3532, 0x3533, 0x0B03, 0x0B04, 0x207C, 0x0B0A, 0x206D, 0x0B06, 0x2053, - 0x2036, 0x2033, 0x2031, 0x203C, 0x2043, 0x2041, 0x2050, 0x2046, 0x204D, 0x350A, - 0x204F, 0x3509, 0x2059, 0x350D, 0x205B, 0x0209, 0x01A2, 0x2048, 0x0084, 0x2047, - 0x0AFB, 0x0AFC, 0x0AFD, 0x206A, 0x0B01, 0x2039, 0x0B02, 0x3517, 0x207D, 0x3519, - 0x3518, 0x2082, 0x01C9, 0x45B6, 0x01DF, 0x0B0F, 0x0B10, 0x2A07, 0x0215, 0x2327, - 0x45BC, 0x2320, 0x1A67, 0x1A61, 0x45BD, 0x1A6D, 0x0B00, 0x352B, 0x352D, 0x3531, - 0x352C, 0x0AF8, 0x3AC8, 0x0AFA, 0x352A, 0x3AC3, 0x0AF4, 0x0AF7, 0x3AC6, 0x3AC9, - 0x3AC7, 0x3530, 0x3ACA, 0x0AED, 0x0D80, 0x0AEE, 0x3AC2, 0x0AEB, 0x0AEC, 0x0AEF, - 0x0AF0, 0x3508, 0x0AF3, 0x0AF9, 0x0AF5, 0x0AF1, 0x0AF6, 0x0AF2, 0x0E10, 0x0E90, - 0x0D9E, 0x0EBA, 0x0CE0, 0x0DE1, 0x0D68, 0x0D07, 0x0E2A, 0x0D84, 0x0E79, 0x0E59, - 0x0F8C, 0x0CA6, 0x0EB8, 0x0EA5, 0x0CA8, 0x352F, 0x352E, 0x0D2C, 0x0B0D, 0x0F9C, - 0x0D57, 0x0B0E, 0x0FE5, 0x0B0C, 0x0F16, 0x0ED1, 0x0B0B, 0x0F47, 0x0E64, 0x3534, - 0x0E10, 0x0E90, 0x3A95, 0x3A82, 0x3A83, 0x3A81, 0x0D68, 0x3A85, 0x3A87, 0x3A9B, - 0x3AC5, 0x3AAE, 0x3A90, 0x3A86, 0x3A9C, 0x3A88, 0x3A9A, 0x3AA1, 0x3502, 0x3A94, - 0x3AC4, 0x0CA8, 0x0D57, 0x3A93, 0x34F9, 0x3A8C, 0x0F16, 0x34F7, 0x3A92, 0x3A91, - 0x3A98, 0x3A97, 0x3A96, 0x34FA, 0x3AB3, 0x0EBA, 0x3A84, 0x0DA4, 0x3AA6, 0x0D2C, - 0x3AB4, 0x2089, 0x3AB8, 0x3AB7, 0x00ED, 0x3ABA, 0x3ABC, 0x3511, 0x3ABE, 0x3AB0, - 0x3AAF, 0x0D2C, 0x3AB1, 0x3A9D, 0x3AB5, 0x3AB6, 0x0FE5, 0x0E46, 0x3A99, 0x3A9E, - 0x0F68, 0x0F47, 0x0E64, 0x0DBD, 0x0E10, 0x0E90, 0x3513, 0x3ABF, 0x0CE0, 0x0DE1, - 0x0D68, 0x0D07, 0x3AC0, 0x350C, 0x0E79, 0x350E, 0x1CBA, 0x3AAC, 0x1CA6, 0x3515, - 0x350F, 0x1CB9, 0x0E10, 0x1CB3, 0x0E90, 0x0D07, 0x0CE0, 0x0D68, 0x0DE1, 0x34FD, - 0x01A2, 0x01C9, 0x34F8, 0x00EF, 0x00EE, 0x3AC1, 0x34FC, 0x3A9F, 0x3AA0, 0x3521, - 0x3AAA, 0x3AA3, 0x1CB7, 0x3AA5, 0x3506, 0x3AA7, 0x1CB8, 0x3AA9, 0x0D80, 0x1CBC, - 0x1CBE, 0x3AA4, 0x3ABD, 0x3AAB, 0x1E4F, 0x0D2C, 0x0FBD, 0x1E4B, 0x0D57, 0x0DA4, - 0x0FE5, 0x0E46, 0x0F16, 0x3AA8, 0x0F68, 0x0F47, 0x0E64, 0x0DBD, 0x3AAD, 0x1E50, - 0x1E4A, 0x1E45, 0x1E48, 0x1E47, 0x1CBB, 0x1E4C, 0x1CBD, 0x0D2C, 0x1CBF, 0x1CC0, - 0x1CC1, 0x1CC2, 0x0E79, 0x1CAE, 0x1CB2, 0x0CA8, 0x0C9E, 0x0D07, 0x0DA4, 0x0FBD, - 0x0F9C, 0x0D57, 0x0FE5, 0x0CE0, 0x0E46, 0x0F16, 0x0F68, 0x2035, 0x0F47, 0x0EBA, - 0x0D68, 0x2084, 0x0D9E, 0x0E90, 0x2074, 0x0DBD, 0x1E49, 0x0E64, 0x2079, 0x0E59, - 0x1E4D, 0x1E4E, 0x1E53, 0x0E2A, 0x0D84, 0x1E52, 0x0E10, 0x1E54, 0x1F49, 0x1E77, - 0x1E7C, 0x1F4A, 0x1E86, 0x1E6D, 0x1E72, 0x1E81, 0x1E95, 0x1E68, 0x1E9F, 0x1EB3, - 0x0215, 0x1E8B, 0x1EA4, 0x1F4F, 0x1EBD, 0x1E90, 0x1EC7, 0x1EC2, 0x01A2, 0x01C9, - 0x01DF, 0x1EAE, 0x021F, 0x1EE0, 0x1E9A, 0x1EA9, 0x0198, 0x1EF4, 0x1F03, 0x1EFE, - 0x3560, 0x356A, 0x1F17, 0x357A, 0x355E, 0x3574, 0x3562, 0x3576, 0x3578, 0x357E, - 0x1F0D, 0x1F12, 0x3582, 0x3568, 0x353B, 0x36B9, 0x01F5, 0x3584, 0x1F47, 0x1F46, - 0x0209, 0x1F44, 0x1F45, 0x3543, 0x01A2, 0x1F50, 0x022A, 0x0234, 0x0F47, 0x0F68, - 0x3566, 0x1F4B, 0x35A9, 0x1F57, 0x0F68, 0x4593, 0x4592, 0x4598, 0x4599, 0x0DBD, - 0x1F56, 0x1F54, 0x35A8, 0x357D, 0x1F59, 0x1F55, 0x1F5B, 0x0EBA, 0x3585, 0x3643, - 0x0DE1, 0x0CE0, 0x1F58, 0x0D07, 0x1F5A, 0x0E2A, 0x0E79, 0x1F5D, 0x0D84, 0x2092, - 0x358B, 0x0E2A, 0x2091, 0x3651, 0x3650, 0x3653, 0x3652, 0x3655, 0x3654, 0x1F21, - 0x1F26, 0x3659, 0x3658, 0x365B, 0x365A, 0x365D, 0x365C, 0x3657, 0x3656, 0x01A2, - 0x0198, 0x0D68, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0E10, 0x0E2A, 0x1F4D, - 0x1F4E, 0x0DE1, 0x0E79, 0x0FE5, 0x0234, 0x2178, 0x2176, 0x0D2C, 0x217A, 0x022A, - 0x217E, 0x2184, 0x0ED1, 0x0CA8, 0x35AA, 0x218C, 0x0D57, 0x0F68, 0x0DBD, 0x0E64, - 0x0F9C, 0x219A, 0x0EBA, 0x1FDC, 0x1FC8, 0x0CA6, 0x1FD8, 0x0EA5, 0x0E2A, 0x1FE2, - 0x0E59, 0x2198, 0x1FDF, 0x0F8C, 0x2196, 0x0EB8, 0x219C, 0x0E59, 0x35A5, 0x21BC, - 0x01C9, 0x01DF, 0x01F5, 0x35AC, 0x21A4, 0x2177, 0x2175, 0x35AB, 0x2179, 0x217F, - 0x217D, 0x2183, 0x2181, 0x2189, 0x2185, 0x218B, 0x0DE1, 0x0D80, 0x2187, 0x218D, - 0x218F, 0x3535, 0x3580, 0x219B, 0x0E79, 0x2195, 0x21A3, 0x2191, 0x2193, 0x21A7, - 0x3586, 0x3587, 0x21A9, 0x21A5, 0x21AD, 0x21B3, 0x21B1, 0x21BB, 0x35A7, 0x21B5, - 0x3590, 0x35A6, 0x21AF, 0x21B9, 0x21B7, 0x1F81, 0x01A2, 0x1F7F, 0x1F80, 0x1F7E, - 0x358A, 0x1F84, 0x1F86, 0x3660, 0x358D, 0x0234, 0x0215, 0x3594, 0x021F, 0x367A, - 0x1F83, 0x366F, 0x366E, 0x3671, 0x1F82, 0x3673, 0x3672, 0x3675, 0x3674, 0x3677, - 0x3676, 0x3679, 0x3678, 0x367B, 0x1F89, 0x367D, 0x367C, 0x365F, 0x365E, 0x3665, - 0x3680, 0x367E, 0x367F, 0x3685, 0x3664, 0x3663, 0x3661, 0x1F88, 0x1F8A, 0x3682, - 0x3683, 0x3684, 0x1F87, 0x1F8F, 0x138D, 0x1358, 0x1359, 0x135A, 0x1349, 0x138E, - 0x138F, 0x1390, 0x35B2, 0x133B, 0x1344, 0x1348, 0x1357, 0x135E, 0x1345, 0x3697, - 0x3696, 0x3699, 0x3698, 0x369B, 0x369A, 0x369D, 0x369C, 0x369F, 0x369E, 0x36A1, - 0x36A0, 0x36A3, 0x36A2, 0x36A5, 0x36A4, 0x368B, 0x36A8, 0x3693, 0x3669, 0x368A, - 0x36A9, 0x3662, 0x368C, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x36B2, 0x3694, - 0x3695, 0x36B7, 0x36B6, 0x138A, 0x36B8, 0x022D, 0x0222, 0x35AF, 0x35AE, 0x1389, - 0x0237, 0x358C, 0x35B0, 0x139D, 0x17F2, 0x180C, 0x13A0, 0x3589, 0x36B3, 0x36B4, - 0x36B5, 0x36AA, 0x36AB, 0x36AC, 0x1D2D, 0x3688, 0x368D, 0x36B0, 0x3687, 0x3686, - 0x36AF, 0x36AE, 0x36B1, 0x1D27, 0x3644, 0x1D2E, 0x1A1F, 0x3640, 0x1D33, 0x0198, - 0x1D34, 0x1D35, 0x364A, 0x3642, 0x1F8D, 0x3645, 0x1F8B, 0x1D38, 0x1F8E, 0x022A, - 0x01F5, 0x217C, 0x45D6, 0x1376, 0x19C5, 0x01DF, 0x019E, 0x2186, 0x1374, 0x01A2, - 0x01C9, 0x0209, 0x021F, 0x2192, 0x2194, 0x1342, 0x1A19, 0x135C, 0x01DF, 0x135D, - 0x133A, 0x0198, 0x01A2, 0x3648, 0x01F5, 0x1385, 0x0209, 0x218A, 0x135B, 0x364E, - 0x1339, 0x0215, 0x1FCE, 0x1FED, 0x1FD7, 0x1FFB, 0x1FD6, 0x1FDD, 0x1FE7, 0x3681, - 0x1FCB, 0x1FCA, 0x1FCD, 0x1FCC, 0x1FCF, 0x1FFA, 0x1FD1, 0x1FD0, 0x1FD3, 0x1FD2, - 0x1FD5, 0x1FD4, 0x1FD9, 0x43C1, 0x1FDB, 0x1FDA, 0x19E9, 0x43D4, 0x43D9, 0x43A1, - 0x1FDE, 0x1FE0, 0x43D3, 0x439B, 0x1FF7, 0x1FE4, 0x1FE8, 0x1FE6, 0x1FEA, 0x1FE5, - 0x1FEC, 0x1FE9, 0x217B, 0x21BA, 0x21B6, 0x1FEF, 0x1FF0, 0x1FF2, 0x1FEB, 0x1FF1, - 0x439F, 0x1FFC, 0x43A0, 0x43AD, 0x43C4, 0x44C8, 0x447E, 0x44C9, 0x43F2, 0x1FF9, - 0x447F, 0x43C3, 0x1FF8, 0x1360, 0x1FF6, 0x1361, 0x443E, 0x43C2, 0x1A70, 0x440D, - 0x43C5, 0x3670, 0x1A6F, 0x43C9, 0x1BCE, 0x1BC8, 0x1BAE, 0x1A6E, 0x43AC, 0x440E, - 0x1BB2, 0x37C6, 0x01A2, 0x01DF, 0x37C7, 0x37C5, 0x0215, 0x01F5, 0x01C9, 0x0209, - 0x0198, 0x37C9, 0x022A, 0x37CB, 0x37CA, 0x0234, 0x37CC, 0x021F, 0x439C, 0x439D, - 0x43F4, 0x43F3, 0x4462, 0x4405, 0x43C8, 0x37CD, 0x37CE, 0x37CF, 0x37D0, 0x37D1, - 0x37D2, 0x37D3, 0x4410, 0x4407, 0x4404, 0x43F8, 0x43EC, 0x4408, 0x43EE, 0x43DE, - 0x1BA4, 0x43F5, 0x37E8, 0x43EF, 0x43D0, 0x43F0, 0x43F9, 0x43CE, 0x43F1, 0x37F8, - 0x17E8, 0x439E, 0x43CF, 0x3801, 0x19DD, 0x3803, 0x19CB, 0x43B5, 0x37FF, 0x4411, - 0x43D5, 0x43E5, 0x17F5, 0x17F4, 0x3802, 0x381A, 0x3819, 0x17F8, 0x17FB, 0x381B, - 0x381C, 0x17F9, 0x17FA, 0x443F, 0x3820, 0x1519, 0x1807, 0x4440, 0x3824, 0x17FD, - 0x17FE, 0x17FF, 0x17EA, 0x0209, 0x17F6, 0x17F7, 0x17EE, 0x17EB, 0x17EC, 0x17ED, - 0x01A5, 0x3817, 0x3816, 0x17F3, 0x019E, 0x3815, 0x17F0, 0x17EF, 0x01A2, 0x0198, - 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x1806, 0x17E9, - 0x1801, 0x0198, 0x1803, 0x17F1, 0x1D21, 0x0045, 0x1D23, 0x1D22, 0x1D24, 0x1D23, - 0x4441, 0x1D25, 0x1D28, 0x1D20, 0x1D2A, 0x1D29, 0x1D2B, 0x1D2B, 0x1D26, 0x1D2C, - 0x1D2F, 0x01CC, 0x1D31, 0x1D30, 0x4464, 0x4463, 0x0215, 0x43D2, 0x0234, 0x43DD, - 0x154F, 0x022A, 0x444A, 0x1D39, 0x154E, 0x1535, 0x1D3E, 0x1D3D, 0x1D40, 0x1D3F, - 0x1D42, 0x1D41, 0x022A, 0x1B1F, 0x43D7, 0x1808, 0x43E4, 0x45A8, 0x1300, 0x19D1, - 0x43DC, 0x3866, 0x3865, 0x43D8, 0x3867, 0x180D, 0x3869, 0x386C, 0x386B, 0x386E, - 0x386D, 0x3870, 0x386F, 0x3873, 0x386A, 0x3874, 0x3872, 0x444B, 0x1C5A, 0x1C4A, - 0x1C4D, 0x1C50, 0x1C4F, 0x1C4E, 0x1C51, 0x1C59, 0x1C53, 0x1C65, 0x1C58, 0x3871, - 0x1C57, 0x1C5C, 0x1C6B, 0x38A4, 0x1C5E, 0x1C5D, 0x1C60, 0x1C5F, 0x1C63, 0x1C64, - 0x3888, 0x1C61, 0x1C66, 0x1C67, 0x1C68, 0x1C69, 0x1C6A, 0x1C62, 0x1C6C, 0x3898, - 0x3895, 0x3896, 0x3897, 0x389C, 0x3899, 0x389A, 0x389B, 0x38A0, 0x019B, 0x389E, - 0x389F, 0x019C, 0x389D, 0x38A1, 0x38A3, 0x1C52, 0x1C6D, 0x1C6E, 0x1C6F, 0x1C70, - 0x20C5, 0x20C2, 0x20C7, 0x20C8, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x1C5B, 0x20C6, - 0x38C4, 0x38B6, 0x38B5, 0x38BC, 0x38B7, 0x38BA, 0x0218, 0x020C, 0x38BB, 0x01F8, - 0x38BD, 0x38BE, 0x38BF, 0x38B9, 0x38A2, 0x38C0, 0x01F5, 0x38D5, 0x38D6, 0x0198, - 0x01DF, 0x38DC, 0x01A2, 0x38DA, 0x38DB, 0x01C9, 0x20AB, 0x20AC, 0x0215, 0x0234, - 0x20B0, 0x0209, 0x38D9, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0209, - 0x01E2, 0x021F, 0x20C1, 0x0234, 0x20C3, 0x20C4, 0x20AD, 0x38D7, 0x0215, 0x38E6, - 0x38E5, 0x20AE, 0x38E7, 0x38EA, 0x38E9, 0x38EC, 0x38EB, 0x38DD, 0x38E4, 0x38F0, - 0x38DF, 0x38ED, 0x38EE, 0x38E3, 0x022A, 0x20AF, 0x1564, 0x1565, 0x155F, 0x155D, - 0x4573, 0x0209, 0x1558, 0x0234, 0x09CC, 0x155E, 0x1A9B, 0x09E3, 0x38E0, 0x38F4, - 0x38DE, 0x093B, 0x09EA, 0x38FF, 0x092A, 0x0A4C, 0x1449, 0x0A59, 0x09EA, 0x1445, - 0x2321, 0x1441, 0x0A05, 0x4516, 0x43E0, 0x2322, 0x451B, 0x390D, 0x390C, 0x1448, - 0x390E, 0x3911, 0x3910, 0x4543, 0x4544, 0x4545, 0x4542, 0x44A7, 0x44A6, 0x1A77, - 0x0209, 0x44C5, 0x44AD, 0x451E, 0x01F5, 0x451F, 0x45AA, 0x1AAD, 0x449E, 0x45BE, - 0x1440, 0x4595, 0x45C2, 0x145F, 0x1444, 0x1443, 0x1300, 0x1463, 0x1AA7, 0x45C0, - 0x43C0, 0x449F, 0x44A0, 0x44A1, 0x021F, 0x45A2, 0x01C9, 0x1BA7, 0x01C9, 0x1B2B, - 0x022A, 0x4497, 0x45C3, 0x1BA3, 0x2323, 0x45AC, 0x1442, 0x231C, 0x4594, 0x0215, - 0x231D, 0x143F, 0x1522, 0x44F0, 0x455E, 0x4557, 0x38E1, 0x440A, 0x38E2, 0x43E1, - 0x44D2, 0x1456, 0x01F5, 0x20BD, 0x38C8, 0x455F, 0x440B, 0x20B6, 0x20B7, 0x20B8, - 0x4406, 0x20BA, 0x20BB, 0x4401, 0x44F1, 0x12FC, 0x12FC, 0x12FC, 0x12FC, 0x12FC, - 0x440C, 0x231E, 0x12FD, 0x4584, 0x4585, 0x12FE, 0x4588, 0x44C3, 0x4589, 0x44C4, - 0x44C2, 0x1300, 0x45A0, 0x450A, 0x0297, 0x0298, 0x02B2, 0x0293, 0x0301, 0x0302, - 0x0347, 0x02D1, 0x0460, 0x0415, 0x042E, 0x1477, 0x0402, 0x063F, 0x0512, 0x0486, - 0x0513, 0x0520, 0x051C, 0x0521, 0x0533, 0x0516, 0x0528, 0x035E, 0x057F, 0x053E, - 0x05EA, 0x0584, 0x0640, 0x0651, 0x0527, 0x063D, 0x0689, 0x0720, 0x06EF, 0x06DC, - 0x1490, 0x066A, 0x07F5, 0x076A, 0x082B, 0x086C, 0x09A1, 0x148B, 0x1476, 0x0721, - 0x04AD, 0x1495, 0x1489, 0x0059, 0x148A, 0x148E, 0x148F, 0x4400, 0x231F, 0x1528, - 0x081C, 0x148D, 0x1492, 0x0234, 0x45C1, 0x236A, 0x0058, 0x14AB, 0x14E0, 0x1488, - 0x005A, 0x01F5, 0x14E4, 0x01A2, 0x0056, 0x01DF, 0x0198, 0x0054, 0x149D, 0x0055, - 0x0053, 0x1473, 0x1494, 0x391B, 0x391D, 0x3937, 0x391C, 0x391A, 0x393D, 0x391E, - 0x391F, 0x392F, 0x3922, 0x3931, 0x3921, 0x392B, 0x3920, 0x3933, 0x3923, 0x3928, - 0x392E, 0x3932, 0x3929, 0x3927, 0x05BE, 0x0303, 0x02B3, 0x0487, 0x0641, 0x0388, - 0x05D7, 0x0405, 0x0377, 0x053F, 0x0647, 0x0655, 0x394B, 0x394C, 0x058E, 0x0582, - 0x393E, 0x0543, 0x3939, 0x394E, 0x04AE, 0x394F, 0x3938, 0x05EF, 0x393A, 0x03A0, - 0x06DF, 0x0409, 0x0304, 0x394A, 0x039C, 0x0378, 0x046E, 0x3949, 0x3948, 0x0488, - 0x3930, 0x05CB, 0x394D, 0x3947, 0x3926, 0x066D, 0x3936, 0x00FE, 0x0309, 0x029F, - 0x0358, 0x034C, 0x0354, 0x035D, 0x0523, 0x0406, 0x0102, 0x0100, 0x3950, 0x3A0E, - 0x01DF, 0x0648, 0x06F2, 0x3A0C, 0x3A0D, 0x3A1F, 0x3A1E, 0x3A13, 0x3A11, 0x3A12, - 0x3A1D, 0x3A1C, 0x3A20, 0x3A16, 0x3A17, 0x3A21, 0x3A10, 0x01C9, 0x3A0F, 0x3A1B, - 0x39D6, 0x3A15, 0x3943, 0x01DF, 0x393C, 0x393B, 0x00F1, 0x393F, 0x3940, 0x3941, - 0x01C9, 0x3945, 0x3944, 0x3942, 0x3946, 0x39D4, 0x39D3, 0x39C3, 0x39C4, 0x39C1, - 0x39C2, 0x39D2, 0x39C8, 0x01A2, 0x39D1, 0x39C6, 0x39D5, 0x00FF, 0x39C7, 0x0101, - 0x39D7, 0x39D8, 0x45C4, 0x39DA, 0x39DB, 0x39DD, 0x14E6, 0x14E5, 0x39DF, 0x39E1, - 0x39E0, 0x39E3, 0x39E2, 0x1534, 0x14D0, 0x39E6, 0x14E3, 0x39E8, 0x1B0D, 0x148C, - 0x39EB, 0x39EC, 0x1B13, 0x1527, 0x39EE, 0x39F1, 0x39F0, 0x39F3, 0x39F2, 0x14E2, - 0x1B31, 0x1A89, 0x14A6, 0x14E1, 0x45A5, 0x147D, 0x1AA1, 0x45B7, 0x0209, 0x01A2, - 0x1460, 0x0057, 0x1A7D, 0x01F5, 0x01F5, 0x01C9, 0x01DF, 0x00F4, 0x0048, 0x14D1, - 0x45A3, 0x05A0, 0x05B5, 0x05A2, 0x0047, 0x059C, 0x05B2, 0x1B07, 0x45AD, 0x45A7, - 0x45AB, 0x45A4, 0x0661, 0x0657, 0x05E2, 0x39CB, 0x031D, 0x3A19, 0x0662, 0x0658, - 0x0364, 0x3A1A, 0x033D, 0x39CF, 0x0629, 0x3A14, 0x0328, 0x0344, 0x036F, 0x0343, - 0x39FA, 0x0209, 0x00F5, 0x39C9, 0x0639, 0x0259, 0x39CD, 0x39CE, 0x026C, 0x3A18, - 0x01A2, 0x031A, 0x00F6, 0x0273, 0x0241, 0x00F7, 0x0607, 0x39F8, 0x39F7, 0x0330, - 0x39F9, 0x39FC, 0x39FB, 0x39FE, 0x39FD, 0x0314, 0x39FF, 0x3A02, 0x3A01, 0x0325, - 0x3A03, 0x3A0A, 0x3A05, 0x3A09, 0x050B, 0x01F5, 0x047B, 0x3A08, 0x0209, 0x04EF, - 0x39D0, 0x01A2, 0x39CA, 0x39CC, 0x0505, 0x3A07, 0x00F0, 0x39C5, 0x3A0B, 0x04C5, - 0x0481, 0x047A, 0x0482, 0x04CB, 0x04A2, 0x0494, 0x04A4, 0x0496, 0x04A6, 0x0498, - 0x04A5, 0x0497, 0x062C, 0x0573, 0x04F6, 0x04CC, 0x05E4, 0x0615, 0x0637, 0x04E1, - 0x04DC, 0x05D4, 0x0638, 0x04DE, 0x0C30, 0x0C31, 0x060A, 0x0617, 0x04F5, 0x0616, - 0x0C36, 0x34DF, 0x34DD, 0x04DB, 0x0C42, 0x34E4, 0x34DE, 0x34E1, 0x34E2, 0x34E6, - 0x34E5, 0x34E8, 0x34E7, 0x0508, 0x34E9, 0x34E3, 0x34EB, 0x0C3F, 0x0C40, 0x0C41, - 0x0677, 0x0C43, 0x0681, 0x01A2, 0x00FB, 0x00FC, 0x067B, 0x0678, 0x01DF, 0x34EA, - 0x0C44, 0x0697, 0x34EC, 0x0685, 0x0696, 0x033E, 0x06D5, 0x0C2F, 0x0C34, 0x0C35, - 0x06CE, 0x0341, 0x06D8, 0x06B9, 0x0C3A, 0x0C33, 0x068F, 0x05C3, 0x0686, 0x0684, - 0x0254, 0x0242, 0x026F, 0x026D, 0x026E, 0x027F, 0x0283, 0x0258, 0x0257, 0x067D, - 0x0246, 0x0322, 0x0243, 0x068E, 0x0247, 0x06AD, 0x0274, 0x1533, 0x0272, 0x06CB, - 0x05CF, 0x1FA4, 0x1A83, 0x34ED, 0x34EE, 0x34EF, 0x0248, 0x0271, 0x0284, 0x0244, - 0x34F4, 0x0336, 0x04EC, 0x0333, 0x0315, 0x04C3, 0x1FA6, 0x04C2, 0x04ED, 0x1B25, - 0x43FF, 0x04EE, 0x1B99, 0x45A9, 0x04C4, 0x050A, 0x45A6, 0x1B97, 0x4359, 0x06D9, - 0x05C4, 0x4363, 0x4361, 0x4366, 0x03B0, 0x06CF, 0x067A, 0x06AA, 0x0266, 0x05A9, - 0x0672, 0x030E, 0x05BA, 0x145C, 0x0635, 0x0613, 0x1451, 0x1C85, 0x06BC, 0x06B0, - 0x06BB, 0x06AF, 0x06B8, 0x06AC, 0x045B, 0x0449, 0x1450, 0x06C4, 0x06C5, 0x435A, - 0x4358, 0x435E, 0x435C, 0x4364, 0x06A8, 0x4367, 0x4362, 0x4371, 0x4369, 0x436B, - 0x436E, 0x4360, 0x4374, 0x34E0, 0x4378, 0x06B5, 0x07AD, 0x07B5, 0x07B1, 0x34F1, - 0x34F2, 0x34F3, 0x0794, 0x34F5, 0x34F6, 0x07AC, 0x07B9, 0x0172, 0x4376, 0x437A, - 0x438E, 0x0168, 0x01C9, 0x0770, 0x459A, 0x459D, 0x077F, 0x0771, 0x0198, 0x01F5, - 0x016B, 0x077B, 0x0780, 0x0169, 0x0887, 0x077E, 0x077D, 0x0151, 0x0158, 0x079E, - 0x014E, 0x014F, 0x0150, 0x0153, 0x0152, 0x0796, 0x0154, 0x0157, 0x0156, 0x015A, - 0x0798, 0x079B, 0x0155, 0x016C, 0x016D, 0x016E, 0x015E, 0x015D, 0x015C, 0x0163, - 0x0174, 0x0166, 0x0161, 0x0164, 0x0165, 0x0160, 0x016A, 0x0162, 0x0159, 0x079C, - 0x0167, 0x19B9, 0x0809, 0x0806, 0x1BA8, 0x0807, 0x0804, 0x015B, 0x18C5, 0x19BF, - 0x080B, 0x150C, 0x152E, 0x0805, 0x080F, 0x150B, 0x0843, 0x083F, 0x0845, 0x0841, - 0x0844, 0x0840, 0x0846, 0x0842, 0x0852, 0x0811, 0x0854, 0x0813, 0x0853, 0x0808, - 0x0855, 0x0812, 0x1843, 0x1847, 0x0888, 0x1848, 0x0871, 0x1FAE, 0x1849, 0x0879, - 0x080E, 0x1FA7, 0x0810, 0x1851, 0x086E, 0x0876, 0x184F, 0x1855, 0x0877, 0x0873, - 0x0776, 0x0777, 0x07D0, 0x0740, 0x07A5, 0x07A3, 0x1A25, 0x088F, 0x0847, 0x0890, - 0x080A, 0x0880, 0x087E, 0x1863, 0x1FA3, 0x1865, 0x1864, 0x1862, 0x2338, 0x18DD, - 0x18E3, 0x233A, 0x07B3, 0x18BF, 0x18CB, 0x1FBA, 0x18E9, 0x1FB4, 0x1FB3, 0x07B2, - 0x07A2, 0x079F, 0x233B, 0x079A, 0x0799, 0x0795, 0x0797, 0x079D, 0x07BB, 0x1BD4, - 0x07B8, 0x07B0, 0x07B6, 0x1BD3, 0x07BA, 0x07A1, 0x1955, 0x195B, 0x1961, 0x1BBD, - 0x196D, 0x1A2B, 0x1979, 0x194F, 0x0215, 0x145B, 0x198B, 0x1991, 0x197F, 0x1985, - 0x1973, 0x19A9, 0x1A07, 0x2334, 0x2335, 0x2336, 0x2337, 0x2330, 0x2331, 0x2332, - 0x2333, 0x232C, 0x232D, 0x19FB, 0x232E, 0x199D, 0x19A3, 0x1A01, 0x1BCF, 0x232F, - 0x07A9, 0x07A6, 0x2308, 0x07A4, 0x07A8, 0x07A7, 0x0781, 0x2309, 0x07BC, 0x07BD, - 0x230A, 0x07BE, 0x230B, 0x2304, 0x01F5, 0x2305, 0x2306, 0x2307, 0x0209, 0x0215, - 0x021F, 0x1466, 0x2300, 0x0234, 0x2301, 0x2302, 0x022A, 0x2303, 0x22FC, 0x22FD, - 0x22FE, 0x22FF, 0x2318, 0x22EA, 0x22EB, 0x22E4, 0x234B, 0x234C, 0x2344, 0x2340, - 0x234E, 0x115F, 0x1171, 0x1172, 0x116B, 0x116C, 0x116D, 0x116E, 0x0884, 0x0881, - 0x1166, 0x087F, 0x0883, 0x0882, 0x0814, 0x0815, 0x0897, 0x0898, 0x1167, 0x1168, - 0x1FB8, 0x1169, 0x1FB7, 0x1162, 0x1FBB, 0x1163, 0x1164, 0x1165, 0x113F, 0x1140, - 0x2A10, 0x2A11, 0x2A20, 0x2A21, 0x2A23, 0x2A19, 0x021F, 0x3A5E, 0x3A5D, 0x3A60, - 0x3A5F, 0x3A62, 0x3A61, 0x3A64, 0x3A63, 0x10F3, 0x10F4, 0x3A67, 0x10ED, 0x3A69, - 0x3A68, 0x3A6B, 0x3A6A, 0x3A6D, 0x10EE, 0x3A6F, 0x01C9, 0x01DF, 0x0198, 0x01A2, - 0x3A72, 0x3A75, 0x10EF, 0x10E6, 0x3A76, 0x3A79, 0x3A78, 0x10E7, 0x3A7A, 0x3A7D, - 0x3A7C, 0x3A7F, 0x3A7E, 0x11DB, 0x3A80, 0x0FE2, 0x0005, 0x0FFF, 0x0F3A, 0x01A2, - 0x0EE9, 0x0103, 0x0209, 0x0105, 0x0104, 0x0EC9, 0x0ECA, 0x0ECB, 0x0EE5, 0x0EA1, - 0x0EA2, 0x0EA3, 0x0D01, 0x0D02, 0x0D03, 0x0D17, 0x0EDB, 0x0F23, 0x0F73, 0x0DF0, - 0x0CED, 0x399B, 0x399C, 0x39A7, 0x0D09, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, - 0x39A4, 0x39A5, 0x39A6, 0x0CAE, 0x39A8, 0x39A9, 0x39AA, 0x398D, 0x398C, 0x399E, - 0x399D, 0x398B, 0x3990, 0x0F81, 0x3992, 0x0F82, 0x0F30, 0x398F, 0x3995, 0x3991, - 0x0F33, 0x2104, 0x2106, 0x2108, 0x20FA, 0x20FC, 0x398E, 0x20FE, 0x2100, 0x20F2, - 0x20F4, 0x20F6, 0x20F8, 0x20EA, 0x20EC, 0x20EE, 0x20F0, 0x126A, 0x3994, 0x0CE6, - 0x0E36, 0x0DE3, 0x0DE4, 0x0DE6, 0x0DF9, 0x0DF8, 0x0DD3, 0x0E1B, 0x0E38, 0x0DF2, - 0x0DF4, 0x0DF7, 0x0D6F, 0x0E1D, 0x0E1E, 0x0E37, 0x39AE, 0x0CA0, 0x39BE, 0x1DD8, - 0x0DED, 0x0DEE, 0x0E4D, 0x0E5D, 0x0DCC, 0x0DEC, 0x0DC8, 0x0DEA, 0x0E01, 0x0D66, - 0x0D3E, 0x39BB, 0x39BC, 0x39BD, 0x3A34, 0x39BF, 0x39C0, 0x3A32, 0x3A33, 0x3A36, - 0x01A2, 0x01F5, 0x0109, 0x3A37, 0x3996, 0x0D3F, 0x3993, 0x0D74, 0x3998, 0x3999, - 0x0D61, 0x0D38, 0x0D39, 0x0DFC, 0x0DFD, 0x1DD7, 0x1D82, 0x1D90, 0x1DE3, 0x1DE4, - 0x1DC9, 0x1DCA, 0x399A, 0x1DE1, 0x1DE2, 0x1DE6, 0x0E24, 0x0CA3, 0x1DCD, 0x0E67, - 0x0E16, 0x0DD2, 0x0F79, 0x0F57, 0x0E9A, 0x3997, 0x0CB3, 0x1D9F, 0x1DA2, 0x1DA5, - 0x1D8F, 0x3A4E, 0x1D96, 0x1D9A, 0x3A4D, 0x1D9B, 0x1D81, 0x1D83, 0x1D86, 0x1D8A, - 0x1D76, 0x3A4C, 0x1D78, 0x1D7A, 0x1D7E, 0x3A4B, 0x1DC6, 0x3A5C, 0x3A5B, 0x3A4F, - 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A59, 0x3A58, 0x0F7B, - 0x3A5A, 0x0F4F, 0x01F5, 0x0F19, 0x0FEB, 0x0CB4, 0x010F, 0x0CF3, 0x0F6C, 0x01A2, - 0x01DF, 0x0110, 0x01C9, 0x0F78, 0x3A57, 0x0F80, 0x010E, 0x0F6E, 0x0B28, 0x0B3D, - 0x0B44, 0x02D0, 0x0B2C, 0x46F1, 0x0357, 0x47F1, 0x47F6, 0x4810, 0x03BD, 0x0389, - 0x03BD, 0x03BD, 0x03AD, 0x03B2, 0x47C5, 0x47C7, 0x47CA, 0x47E4, 0x47A5, 0x47A8, - 0x47AD, 0x479A, 0x479E, 0x479F, 0x48A0, 0x48AD, 0x486A, 0x0578, 0x48CA, 0x489E, - 0x2B0B, 0x2B0C, 0x2B2A, 0x2B04, 0x2B06, 0x2B08, 0x2B09, 0x2AFF, 0x2B00, 0x2B01, - 0x2B02, 0x2AFB, 0x2AFC, 0x02AE, 0x2AFD, 0x2AFE, 0x0372, 0x0346, 0x0485, 0x037C, - 0x0BE5, 0x04E6, 0x0BEE, 0x0BEB, 0x2ACE, 0x0BF1, 0x2AD0, 0x2AD2, 0x0767, 0x2AD4, - 0x081B, 0x0769, 0x2AC8, 0x2AC9, 0x2ACB, 0x2ACC, 0x2AC3, 0x2AC4, 0x032A, 0x02EF, - 0x2AC5, 0x2AC6, 0x2ABA, 0x03E2, 0x037B, 0x2ABC, 0x2ABF, 0x2AC1, 0x01C8, 0x2AE4, - 0x01C2, 0x01C0, 0x01C4, 0x01DD, 0x2A94, 0x2A97, 0x2A9A, 0x0208, 0x2A85, 0x2A8E, - 0x0214, 0x01F4, 0x01BF, 0x0229, 0x03DD, 0x2A79, 0x03F9, 0x03F7, 0x2BDE, 0x03F6, - 0x2BD5, 0x2B97, 0x0BF5, 0x0C0C, 0x0C0F, 0x0BFF, 0x0C02, 0x0C0A, 0x0C06, 0x0458, - 0x0BF4, 0x0BF8, 0x0BFC, 0x0BE4, 0x0BE9, 0x0BED, 0x0BF0, 0x0369, 0x05AA, 0x05AB, - 0x0367, 0x036A, 0x036B, 0x0447, 0x0368, 0x0C01, 0x0C04, 0x19B1, 0x02DB, 0x0BB8, - 0x0069, 0x02DA, 0x0BCF, 0x0068, 0x01A1, 0x0215, 0x19AE, 0x19AF, 0x006C, 0x19B0, - 0x0BBA, 0x006A, 0x0C90, 0x0C83, 0x0C91, 0x0FDE, 0x0C8C, 0x0C85, 0x19AA, 0x19AB, - 0x19AC, 0x18D7, 0x0FCB, 0x1895, 0x189B, 0x18A1, 0x1D9E, 0x1D7C, 0x1D85, 0x1D88, - 0x1D8B, 0x1D89, 0x1D95, 0x1DC5, 0x101C, 0x1DEA, 0x1DEB, 0x0DA9, 0x0DA8, 0x1AD1, - 0x0D89, 0x0DB2, 0x0DB1, 0x0D90, 0x0F0B, 0x0F0C, 0x0F08, 0x0EFE, 0x01F5, 0x0209, - 0x021F, 0x0198, 0x01A2, 0x1FB9, 0x1FB5, 0x1FB6, 0x19D7, 0x1A4F, 0x1A43, 0x1A49, - 0x1A31, 0x1A37, 0x1AC5, 0x1A3D, 0x1A71, 0x1ABF, 0x1F9F, 0x1FA0, 0x1ACB, 0x1FA1, - 0x1FA2, 0x1F9B, 0x1F9C, 0x1F9E, 0x1F99, 0x1F93, 0x1F94, 0x1F96, 0x1FB0, 0x1FB2, - 0x1FAB, 0x1FAD, 0x1FA8, 0x1FA5, 0x1A0D, 0x1A13, 0x19EF, 0x19F5, 0x150D, 0x1507, - 0x1508, 0x150A, 0x1503, 0x1504, 0x1FAA, 0x1BC7, 0x1BA5, 0x1BCA, 0x1BCB, 0x1BCC, - 0x1BCD, 0x1BC4, 0x1BC5, 0x1BC6, 0x1BC9, 0x45D7, 0x45D8, 0x45D2, 0x45D3, 0x45D4, - 0x45D5, 0x1BB0, 0x1BB1, 0x1BB3, 0x1BA0, 0x1BAD, 0x1BAF, 0x1BA9, 0x1BAA, 0x1BAB, - 0x1BAC, 0x459B, 0x459C, 0x4596, 0x4597, 0x1B19, 0x1AEF, 0x1AF5, 0x1FA9, 0x1AFB, - 0x1B01, 0x1AD7, 0x1FB1, 0x1ADD, 0x1AE3, 0x1AE9, 0x02A2, 0x089B, 0x06FF, 0x0700, - 0x0524, 0x0701, 0x20E1, 0x20E3, 0x20E5, 0x20E7, 0x20D9, 0x20DB, 0x20DD, 0x20DF, - 0x20D1, 0x20D3, 0x20D5, 0x20D7, 0x20C9, 0x20CB, 0x20CD, 0x20CF, 0x0594, 0x05C7, - 0x063E, 0x0646, 0x0591, 0x058C, 0x0592, 0x0593, 0x051B, 0x0579, 0x057C, 0x0590, - 0x0519, 0x0517, 0x0518, 0x051A, 0x06A0, 0x06A1, 0x06C6, 0x06A4, 0x06A5, 0x069E, - 0x4792, 0x47F5, 0x47B1, 0x47E9, 0x470F, 0x4845, 0x46CD, 0x4609, 0x4608, 0x47A4, - 0x47C1, 0x47C6, 0x4869, 0x45E8, 0x46F8, 0x472C, 0x4760, 0x4839, 0x1B9F, 0x46CC, - 0x1505, 0x1509, 0x47EF, 0x482C, 0x48AF, 0x4687, 0x4742, 0x478E, 0x47E3, 0x45F2, - 0x4899, 0x4875, 0x488F, 0x4893, 0x4718, 0x1C8D, 0x1C86, 0x1C87, 0x1C88, 0x1459, - 0x145A, 0x1457, 0x1458, 0x1452, 0x1453, 0x1454, 0x1BA2, 0x1455, 0x144E, 0x144F, - 0x1467, 0x0043, 0x0044, 0x151F, 0x1520, 0x1521, 0x145E, 0x143B, 0x151B, 0x1436, - 0x1531, 0x440F, 0x4402, 0x4403, 0x43EA, 0x43EB, 0x43ED, 0x43E6, 0x43E7, 0x43E8, - 0x43E9, 0x43E2, 0x43E3, 0x43BE, 0x43BF, 0x439A, 0x4482, 0x4483, 0x1506, 0x4458, - 0x4459, 0x4452, 0x4453, 0x4454, 0x4455, 0x446E, 0x446F, 0x446B, 0x4468, 0x4469, - 0x4465, 0x443A, 0x443B, 0x443C, 0x443D, 0x4436, 0x4437, 0x4438, 0x4439, 0x4432, - 0x1FAF, 0x4433, 0x4434, 0x4435, 0x444E, 0x444F, 0x1FAC, 0x4503, 0x44D8, 0x44D9, - 0x44D3, 0x44D4, 0x44D5, 0x44EE, 0x44EF, 0x44EA, 0x44EB, 0x44EC, 0x44ED, 0x44E6, - 0x44E7, 0x44E8, 0x44E9, 0x44E2, 0x44E3, 0x44BE, 0x44BF, 0x449A, 0x449B, 0x44AC, - 0x4582, 0x4583, 0x4560, 0x4561, 0x455A, 0x455B, 0x455C, 0x455D, 0x4556, 0x4538, - 0x4539, 0x4532, 0x4533, 0x451A, 0x451C, 0x451D, 0x4518, 0x4519, 0x4512, 0x2608, - 0x2630, 0x25BF, 0x25D5, 0x2701, 0x01F5, 0x0209, 0x0198, 0x01A2, 0x13A8, 0x13AA, - 0x26E9, 0x26EA, 0x26E7, 0x26E3, 0x26E4, 0x26DD, 0x26DE, 0x26DF, 0x26E0, 0x26F9, - 0x26FA, 0x26FB, 0x26FC, 0x26F5, 0x26F6, 0x26F7, 0x26F8, 0x26F1, 0x26F2, 0x26ED, - 0x26EF, 0x26F0, 0x26C9, 0x26CA, 0x26CB, 0x1F95, 0x26CC, 0x26C5, 0x26C6, 0x26C7, - 0x26C8, 0x26C1, 0x26C2, 0x26C0, 0x26D3, 0x26CD, 0x26CE, 0x09ED, 0x09EC, 0x0A28, - 0x09F2, 0x0A3B, 0x14E7, 0x0940, 0x13A6, 0x13A7, 0x13A1, 0x09CF, 0x09CC, 0x0A18, - 0x0A17, 0x0702, 0x06F8, 0x03A2, 0x03A1, 0x02E9, 0x0371, 0x04B9, 0x0596, 0x0597, - 0x05F6, 0x030D, 0x0472, 0x048E, 0x0526, 0x0525, 0x050F, 0x04E5, 0x1F9A, 0x0462, - 0x0461, 0x0438, 0x045F, 0x045E, 0x0435, 0x0434, 0x0437, 0x0436, 0x0599, 0x0598, - 0x066C, 0x066B, 0x0558, 0x0557, 0x057E, 0x057D, 0x054A, 0x0549, 0x0556, 0x0555, - 0x0542, 0x0541, 0x0548, 0x0547, 0x070D, 0x070C, 0x070F, 0x070E, 0x05E8, 0x05DC, - 0x070A, 0x0723, 0x0722, 0x03C9, 0x03C8, 0x13ED, 0x13EE, 0x0265, 0x02DC, 0x028F, - 0x0264, 0x028B, 0x0260, 0x028D, 0x028E, 0x0263, 0x0373, 0x05BD, 0x13F2, 0x13F1, - 0x13F7, 0x13F8, 0x13EF, 0x13F4, 0x13F0, 0x13F3, 0x13DD, 0x13DE, 0x13DA, 0x13DB, - 0x13DC, 0x13D7, 0x13D8, 0x13D9, 0x13E3, 0x13F6, 0x13E7, 0x13E8, 0x13E5, 0x13E6, - 0x13E2, 0x13E4, 0x13DF, 0x13E0, 0x13E1, 0x1049, 0x104A, 0x048C, 0x1047, 0x1048, - 0x1043, 0x1044, 0x0401, 0x1058, 0x1059, 0x105A, 0x105B, 0x1054, 0x1055, 0x1056, - 0x1057, 0x1050, 0x1F97, 0x1F9D, 0x1051, 0x1052, 0x1F98, 0x1053, 0x104C, 0x104D, - 0x104E, 0x104F, 0x1064, 0x0397, 0x046C, 0x1061, 0x0576, 0x0568, 0x0393, 0x0387, - 0x042C, 0x0423, 0x02BC, 0x02BB, 0x0530, 0x052F, 0x043B, 0x05F8, 0x0419, 0x06A3, - 0x071C, 0x064B, 0x0470, 0x071E, 0x071D, 0x05BB, 0x05A8, 0x02B5, 0x02B4, 0x04B4, - 0x04B3, 0x02D5, 0x02D4, 0x332E, 0x332F, 0x332A, 0x332B, 0x3328, 0x3329, 0x3322, - 0x3323, 0x3324, 0x3325, 0x333E, 0x333F, 0x3340, 0x3341, 0x333A, 0x333B, 0x333C, - 0x333D, 0x3336, 0x3337, 0x3338, 0x3339, 0x3332, 0x3333, 0x3334, 0x3335, 0x330E, - 0x330F, 0x3310, 0x3311, 0x330A, 0x330B, 0x330C, 0x330D, 0x3306, 0x3307, 0x3308, - 0x3309, 0x3302, 0x3303, 0x3304, 0x3305, 0x331E, 0x331F, 0x3320, 0x3321, 0x331A, - 0x331B, 0x331C, 0x331D, 0x3316, 0x3317, 0x3318, 0x3319, 0x3312, 0x3313, 0x3314, - 0x3315, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32EA, 0x32EB, 0x32EC, 0x32ED, 0x32E6, - 0x32E7, 0x32F2, 0x32F3, 0x32D1, 0x32C8, 0x32C9, 0x32C2, 0x32C3, 0x32C4, 0x32C5, - 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32DA, 0x32DB, 0x32DC, 0x32DD, 0x32D6, 0x32D7, - 0x32D8, 0x32D9, 0x32D2, 0x32D3, 0x32D4, 0x32D5, 0x336C, 0x336A, 0x336D, 0x336E, - 0x3367, 0x3368, 0x336B, 0x3369, 0x3363, 0x3364, 0x01F5, 0x0209, 0x0198, 0x01A2, - 0x12BA, 0x12BC, 0x3373, 0x3374, 0x12EE, 0x12CB, 0x12B1, 0x12B2, 0x12B3, 0x12B4, - 0x12AC, 0x12B0, 0x335B, 0x335C, 0x335D, 0x335E, 0x3357, 0x3358, 0x3359, 0x335A, - 0x3353, 0x3354, 0x12CA, 0x12D1, 0x12AA, 0x12E8, 0x12EA, 0x12EB, 0x12EC, 0x12E3, - 0x12E4, 0x12E5, 0x12E6, 0x12DF, 0x12E0, 0x12E1, 0x12E2, 0x12D7, 0x12D9, 0x12DC, - 0x12DE, 0x12F9, 0x12F7, 0x12F8, 0x334E, 0x12F3, 0x12F4, 0x12B8, 0x12B9, 0x12AD, - 0x12AE, 0x12AF, 0x12B5, 0x12D0, 0x12D4, 0x12D5, 0x12D6, 0x12CC, 0x12CD, 0x2628, - 0x2629, 0x261E, 0x261F, 0x2621, 0x261A, 0x261B, 0x25EF, 0x25F0, 0x25E6, 0x25E7, - 0x25E8, 0x25E9, 0x25E3, 0x25E4, 0x25E5, 0x2603, 0x2604, 0x2605, 0x2606, 0x25FC, - 0x25FF, 0x2600, 0x2602, 0x01B2, 0x25F8, 0x25F9, 0x25F3, 0x020F, 0x0230, 0x25F5, - 0x01B3, 0x023A, 0x01B5, 0x01B4, 0x01B7, 0x01B6, 0x01B9, 0x01B8, 0x25F7, 0x01BA, - 0x25CD, 0x25CE, 0x0024, 0x0019, 0x0027, 0x0026, 0x0029, 0x0028, 0x002B, 0x002A, - 0x001A, 0x25CF, 0x001C, 0x001B, 0x25D0, 0x25C9, 0x25CA, 0x25CB, 0x25CC, 0x25C5, - 0x25C6, 0x25C4, 0x25D8, 0x25D1, 0x25D2, 0x25AB, 0x25AD, 0x25AE, 0x25AF, 0x25AA, - 0x25A4, 0x25A6, 0x259F, 0x25BE, 0x25BB, 0x25B4, 0x25B5, 0x269C, 0x2695, 0x2697, - 0x2698, 0x26AD, 0x26AE, 0x2677, 0x2673, 0x2674, 0x266D, 0x266E, 0x268E, 0x268B, - 0x2686, 0x2687, 0x267E, 0x267F, 0x2682, 0x2683, 0x2658, 0x2659, 0x265A, 0x265B, - 0x2654, 0x2655, 0x2656, 0x2657, 0x2650, 0x2651, 0x2631, 0x2632, 0x262A, 0x262B, - 0x262C, 0x262D, 0x2648, 0x2649, 0x264A, 0x264B, 0x2644, 0x2645, 0x2646, 0x2647, - 0x2640, 0x2641, 0x2642, 0x2643, 0x263C, 0x263D, 0x263E, 0x263F, 0x312E, 0x312F, - 0x3130, 0x3131, 0x312A, 0x312B, 0x312C, 0x312D, 0x3126, 0x3127, 0x3128, 0x3129, - 0x3124, 0x3125, 0x313E, 0x313F, 0x3140, 0x3141, 0x313A, 0x313B, 0x313C, 0x313D, - 0x3136, 0x3137, 0x3139, 0x3132, 0x3118, 0x3119, 0x3112, 0x3113, 0x3114, 0x3115, - 0x30EE, 0x30EF, 0x30F0, 0x01B5, 0x30EA, 0x30EB, 0x3188, 0x01B9, 0x3184, 0x3185, - 0x01B2, 0x01D1, 0x01E5, 0x01D0, 0x020F, 0x01FB, 0x0225, 0x021B, 0x023A, 0x319E, - 0x019E, 0x01B3, 0x319F, 0x31A0, 0x31A1, 0x319A, 0x319B, 0x319C, 0x319D, 0x3196, - 0x3197, 0x3178, 0x3179, 0x3172, 0x3173, 0x3174, 0x3175, 0x314E, 0x314F, 0x3150, - 0x3151, 0x314A, 0x314B, 0x314C, 0x314D, 0x3146, 0x3147, 0x3148, 0x3149, 0x3142, - 0x3143, 0x3144, 0x3145, 0x315E, 0x315F, 0x3160, 0x3161, 0x315A, 0x315B, 0x315C, - 0x315D, 0x3156, 0x45BA, 0x3157, 0x322D, 0x3228, 0x3229, 0x3222, 0x3223, 0x323F, - 0x3238, 0x3239, 0x3232, 0x3233, 0x3234, 0x3235, 0x320E, 0x320F, 0x3210, 0x3211, - 0x320A, 0x320B, 0x320C, 0x320D, 0x3206, 0x3207, 0x31E8, 0x31E9, 0x31E2, 0x31E3, - 0x31E4, 0x31E5, 0x31FE, 0x31FF, 0x31FA, 0x45BB, 0x31FB, 0x31F8, 0x31F9, 0x31F2, - 0x31F3, 0x31F4, 0x31F5, 0x31CE, 0x31CF, 0x180E, 0x31D0, 0x31D1, 0x180F, 0x1812, - 0x1811, 0x31CA, 0x1813, 0x1816, 0x1815, 0x1818, 0x1817, 0x31CB, 0x31CC, 0x31C6, - 0x31C7, 0x2EC5, 0x2EC6, 0x2EE0, 0x2EE1, 0x2EDA, 0x2EDB, 0x2ED7, 0x2FBC, 0x2F98, - 0x2F99, 0x2F92, 0x2F93, 0x2F94, 0x2F95, 0x2F6E, 0x2F6F, 0x2F6B, 0x2F4C, 0x3028, - 0x3029, 0x3022, 0x3023, 0x303F, 0x3038, 0x3039, 0x3032, 0x3033, 0x3034, 0x3035, - 0x300E, 0x183C, 0x300F, 0x3010, 0x3011, 0x300A, 0x300B, 0x3007, 0x3008, 0x3009, - 0x3002, 0x3003, 0x3004, 0x3005, 0x301E, 0x301F, 0x3020, 0x3021, 0x301A, 0x301B, - 0x301C, 0x301D, 0x3016, 0x3017, 0x2FE8, 0x2FE9, 0x2FE2, 0x2FE3, 0x2FE4, 0x2FE5, - 0x2FFE, 0x2FFF, 0x3000, 0x3001, 0x2FFA, 0x2FFB, 0x2FFC, 0x2FFD, 0x2FF6, 0x2FF7, - 0x2FF8, 0x2FF9, 0x2FF2, 0x2FF3, 0x2FF4, 0x2FF5, 0x2FCE, 0x2FCF, 0x2FD0, 0x2FD1, - 0x2FCA, 0x2FCB, 0x2FCC, 0x2FCD, 0x2FC6, 0x2FC7, 0x2FC8, 0x2FC9, 0x2FC2, 0x2FC3, - 0x2FC4, 0x2FC5, 0x2FDE, 0x2FDF, 0x2FD8, 0x2FD9, 0x2FD2, 0x2FD3, 0x2FD4, 0x2FD5, - 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30A6, 0x30A7, - 0x05E3, 0x05D3, 0x062E, 0x060C, 0x062F, 0x060D, 0x0570, 0x0562, 0x0571, 0x0563, - 0x072D, 0x072E, 0x064C, 0x064D, 0x05D9, 0x036C, 0x044A, 0x044B, 0x02EE, 0x02ED, - 0x05DA, 0x05DB, 0x0559, 0x0724, 0x0725, 0x02EB, 0x0674, 0x068C, 0x0477, 0x06BF, - 0x05F3, 0x0644, 0x0653, 0x066E, 0x041B, 0x05CA, 0x05CC, 0x05F7, 0x057A, 0x0595, - 0x05C0, 0x05C5, 0x03BE, 0x0418, 0x043A, 0x045D, 0x072C, 0x02AF, 0x0361, 0x039F, - 0x0716, 0x071F, 0x0726, 0x072B, 0x06E3, 0x06E4, 0x06EB, 0x06F4, 0x0834, 0x0838, - 0x07E9, 0x0836, 0x0789, 0x0788, 0x0791, 0x0790, 0x089F, 0x089E, 0x067F, 0x0694, - 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, - 0x0424, 0x044C, 0x047E, 0x049C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, - 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x06BE, 0x05AC, - 0x045C, 0x07C5, 0x07E7, 0x07F0, 0x076E, 0x0783, 0x078F, 0x0827, 0x0819, 0x077A, - 0x0779, 0x02BD, 0x0749, 0x0763, 0x0779, 0x07C2, 0x0869, 0x05F9, 0x0268, 0x06B2, - 0x06D2, 0x085E, 0x0863, 0x07C5, 0x07F4, 0x07FA, 0x02C6, 0x02EF, 0x032A, 0x036D, - 0x06BE, 0x1DEE, 0x1DED, 0x1DF0, 0x1DEF, 0x1DF2, 0x1DF1, 0x1DF4, 0x1DF3, 0x1DF6, - 0x1DF5, 0x1DF8, 0x1DF7, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, 0x0688, 0x069C, - 0x0554, 0x0578, 0x05BC, 0x05E9, 0x05AC, 0x05DD, 0x04E6, 0x0538, 0x03E2, 0x1E0A, - 0x1E09, 0x1E0C, 0x1E0B, 0x040E, 0x0867, 0x086B, 0x089A, 0x0832, 0x083D, 0x085E, - 0x0863, 0x0816, 0x081B, 0x082A, 0x07C5, 0x07F4, 0x07FA, 0x07FE, 0x0802, 0x07FC, - 0x0800, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, - 0x022A, 0x080C, 0x0819, 0x07D8, 0x07ED, 0x07F2, 0x07F8, 0x0779, 0x078D, 0x07AA, - 0x07C2, 0x0749, 0x0763, 0x0310, 0x0819, 0x0867, 0x086B, 0x1596, 0x1595, 0x0827, - 0x1597, 0x159A, 0x1599, 0x159C, 0x159B, 0x159E, 0x159D, 0x15A0, 0x159F, 0x15A2, - 0x15A1, 0x15A4, 0x15A3, 0x082F, 0x082F, 0x083B, 0x0800, 0x080C, 0x0819, 0x07D8, - 0x07ED, 0x07F2, 0x07F8, 0x0779, 0x078D, 0x0765, 0x0769, 0x0861, 0x0827, 0x0885, - 0x0779, 0x07C2, 0x2A2D, 0x2A2F, 0x0865, 0x2A33, 0x0869, 0x019D, 0x01B1, 0x01CF, - 0x01E4, 0x021A, 0x0224, 0x022F, 0x0239, 0x01CF, 0x01E4, 0x01FA, 0x020E, 0x15BD, - 0x15BC, 0x15BF, 0x15BE, 0x15C1, 0x15C0, 0x15C3, 0x15C2, 0x15C5, 0x15C4, 0x15C7, - 0x15C6, 0x022F, 0x0239, 0x019D, 0x01B1, 0x021A, 0x0224, 0x022F, 0x0239, 0x01CF, - 0x01E4, 0x01FA, 0x020E, 0x022F, 0x0239, 0x019D, 0x01B1, 0x01FA, 0x020E, 0x15DB, - 0x0621, 0x05FF, 0x06D6, 0x04BA, 0x03D5, 0x06FC, 0x03E2, 0x040E, 0x067F, 0x0694, - 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x0538, 0x0551, 0x056A, 0x0424, - 0x044C, 0x047E, 0x049C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, 0x042D, - 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x0554, - 0x05BC, 0x05E9, 0x04AB, 0x0510, 0x053D, 0x0412, 0x042D, 0x0395, 0x03B2, 0x03E2, - 0x040E, 0x02C6, 0x02EF, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, - 0x0688, 0x069C, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, - 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x0291, 0x02D0, - 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, - 0x0538, 0x0551, 0x056A, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x067F, 0x0694, 0x06B2, - 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, 0x0554, - 0x0578, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, 0x042D, - 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x063C, 0x0669, 0x0688, 0x069C, 0x05BC, - 0x05E9, 0x0485, 0x01D0, 0x01B2, 0x01FB, 0x01E5, 0x021B, 0x020F, 0x0230, 0x0225, - 0x01B3, 0x023A, 0x01D0, 0x01B2, 0x01FB, 0x01E5, 0x021B, 0x020F, 0x0230, 0x0225, - 0x01B3, 0x023A, 0x01D0, 0x01B2, 0x01FB, 0x0510, 0x021B, 0x020F, 0x0230, 0x03FB, - 0x01B3, 0x023A, 0x0412, 0x042D, 0x045C, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, - 0x03B2, 0x03E2, 0x040E, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x0267, 0x02A8, - 0x04E6, 0x0538, 0x0551, 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, - 0x03E2, 0x040E, 0x2A52, 0x02C6, 0x02EF, 0x2A58, 0x032A, 0x036D, 0x0346, 0x0372, - 0x0395, 0x2A64, 0x0291, 0x02AE, 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, - 0x05DD, 0x061A, 0x065F, 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x0291, - 0x02AE, 0x0300, 0x067F, 0x0694, 0x06B2, 0x2A4F, 0x06D2, 0x06BE, 0x0267, 0x02A8, - 0x063C, 0x0669, 0x0688, 0x069C, 0x0554, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, - 0x053D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, 0x0688, 0x069C, 0x0554, - 0x0578, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, 0x053D, 0x04E6, 0x0538, 0x0551, - 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x02C6, - 0x02EF, 0x032A, 0x036D, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, - 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x03FB, - 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, - 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, - 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, - 0x0300, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, - 0x0669, 0x0688, 0x069C, 0x0554, 0x0578, 0x05BC, 0x05E9, 0x0389, 0x03B2, 0x03E2, - 0x040E, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x2A13, 0x0267, 0x02A8, - 0x063C, 0x0669, 0x0688, 0x069C, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, 0x05DD, - 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, - 0x0192, 0x0193, 0x0194, 0x0195, 0x0234, 0x018F, 0x0190, 0x0191, 0x0209, 0x0215, - 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0196, 0x0197, 0x4355, 0x4356, - 0x4357, 0x4351, 0x4352, 0x4353, 0x4354, 0x434D, 0x434E, 0x434F, 0x4350, 0x4349, - 0x434A, 0x434B, 0x434C, 0x4335, 0x4336, 0x4337, 0x4338, 0x4331, 0x4332, 0x4333, - 0x4334, 0x432D, 0x432E, 0x432F, 0x4330, 0x4329, 0x432A, 0x432B, 0x432C, 0x4345, - 0x4346, 0x4347, 0x4348, 0x4341, 0x4342, 0x4343, 0x4344, 0x433D, 0x433E, 0x433F, - 0x4340, 0x4339, 0x433A, 0x433B, 0x433C, 0x4195, 0x4196, 0x4197, 0x4198, 0x4191, - 0x4192, 0x4193, 0x4194, 0x418D, 0x418E, 0x418F, 0x4190, 0x4189, 0x418A, 0x418B, - 0x418C, 0x41A5, 0x41A6, 0x41A7, 0x41A8, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x419D, - 0x419E, 0x419F, 0x41A0, 0x4199, 0x419A, 0x419B, 0x419C, 0x4175, 0x4176, 0x4177, - 0x4178, 0x4171, 0x4172, 0x4173, 0x4174, 0x416D, 0x416E, 0x416F, 0x4170, 0x4169, - 0x416A, 0x416B, 0x416C, 0x4185, 0x4186, 0x4187, 0x4188, 0x4181, 0x4182, 0x2D71, - 0x2D72, 0x4183, 0x4184, 0x417D, 0x417E, 0x2D6F, 0x2D70, 0x417F, 0x4180, 0x4179, - 0x417A, 0x2D75, 0x2D76, 0x417B, 0x417C, 0x4155, 0x4156, 0x4157, 0x4158, 0x2D73, - 0x2D74, 0x4151, 0x4152, 0x4153, 0x4154, 0x414D, 0x414E, 0x414F, 0x4150, 0x2D98, - 0x2D9D, 0x2D97, 0x2D9E, 0x2D93, 0x2D94, 0x2D83, 0x2D84, 0x2D89, 0x2D8A, 0x2D99, - 0x2D9A, 0x2D7B, 0x2D8E, 0x2D9C, 0x2D8D, 0x2D79, 0x2D78, 0x2D7A, 0x2D77, 0x2D7D, - 0x2D60, 0x2D7E, 0x2D61, 0x2C78, 0x2D6D, 0x2D87, 0x2D88, 0x4149, 0x2D7C, 0x2D64, - 0x2D65, 0x414A, 0x414B, 0x414C, 0x4165, 0x4166, 0x4167, 0x4168, 0x4161, 0x4162, - 0x4163, 0x4164, 0x415D, 0x415E, 0x415F, 0x4160, 0x4159, 0x415A, 0x415B, 0x2DB2, - 0x2DB1, 0x415C, 0x4135, 0x4136, 0x4137, 0x2DB8, 0x4138, 0x2DBD, 0x4131, 0x4132, - 0x2DBE, 0x4133, 0x4134, 0x2D7F, 0x2D80, 0x2D81, 0x2D82, 0x2DC4, 0x2DC3, 0x2D85, - 0x2D86, 0x2DC8, 0x2DC7, 0x2DCA, 0x2DC9, 0x2DCC, 0x2DCB, 0x2DCE, 0x2DCD, 0x412D, - 0x412E, 0x412F, 0x4130, 0x4129, 0x412A, 0x412B, 0x412C, 0x4145, 0x4146, 0x4147, - 0x4148, 0x2D9B, 0x4141, 0x4142, 0x4143, 0x4144, 0x413D, 0x413E, 0x413F, 0x4140, - 0x4139, 0x16B6, 0x16B5, 0x16B8, 0x16B7, 0x16BA, 0x16B9, 0x16BC, 0x16BB, 0x413A, - 0x413B, 0x16C0, 0x16BF, 0x413C, 0x4215, 0x4216, 0x4217, 0x4218, 0x4211, 0x4212, - 0x4213, 0x4214, 0x420D, 0x420E, 0x420F, 0x4210, 0x4209, 0x420A, 0x420B, 0x420C, - 0x4225, 0x4226, 0x4227, 0x4228, 0x4221, 0x4222, 0x4223, 0x4224, 0x421D, 0x421E, - 0x421F, 0x4220, 0x4219, 0x421A, 0x421B, 0x421C, 0x41F5, 0x41F6, 0x41F7, 0x41F8, - 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41ED, 0x41EE, 0x41EF, 0x41F0, 0x41E9, 0x41EA, - 0x41EB, 0x41EC, 0x4205, 0x4206, 0x4207, 0x4208, 0x4201, 0x4202, 0x4203, 0x4204, - 0x41FD, 0x41FE, 0x41FF, 0x4200, 0x41F9, 0x41FA, 0x41FB, 0x41FC, 0x41D5, 0x41D6, - 0x41D7, 0x41D8, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41CD, 0x41CE, 0x41CF, 0x41D0, - 0x41C9, 0x41CA, 0x41CB, 0x2E4D, 0x2E4E, 0x2E44, 0x2E43, 0x41CC, 0x41E5, 0x2E48, - 0x2E47, 0x41E6, 0x41E7, 0x41E8, 0x41E1, 0x2E49, 0x2E4A, 0x41E2, 0x41E3, 0x41E4, - 0x41DD, 0x41DE, 0x41DF, 0x16DF, 0x16E0, 0x2E4B, 0x2E4C, 0x16F9, 0x16FA, 0x16FB, - 0x16FC, 0x16F5, 0x16F6, 0x2E60, 0x2E5F, 0x2E62, 0x2E61, 0x16F7, 0x16F8, 0x2E66, - 0x2E65, 0x16F0, 0x16EF, 0x16ED, 0x16EE, 0x16F4, 0x16F3, 0x16F1, 0x16F2, 0x2E70, - 0x2E6F, 0x2E72, 0x2E71, 0x2E74, 0x2E73, 0x2E76, 0x2E75, 0x2E78, 0x2E77, 0x2E7A, - 0x2E79, 0x2E7C, 0x2E7B, 0x16DE, 0x2E7D, 0x16DD, 0x16E8, 0x16E2, 0x16E3, 0x16E1, - 0x16E4, 0x16FD, 0x16FE, 0x16FF, 0x1700, 0x16E9, 0x16EA, 0x16EB, 0x16EC, 0x1708, - 0x1702, 0x16E7, 0x1701, 0x1703, 0x16E6, 0x1704, 0x16E5, 0x170D, 0x41E0, 0x41D9, - 0x41DA, 0x0215, 0x021F, 0x16DC, 0x170E, 0x41DB, 0x41DC, 0x41B5, 0x41B6, 0x41B7, - 0x41B8, 0x41B1, 0x41B2, 0x01C9, 0x01DF, 0x0198, 0x01A2, 0x41B3, 0x01F5, 0x41B4, - 0x0209, 0x0234, 0x022A, 0x41AD, 0x41AE, 0x41AF, 0x41B0, 0x41A9, 0x41AA, 0x41AB, - 0x41AC, 0x41C5, 0x41C6, 0x41C7, 0x41C8, 0x41C1, 0x41C2, 0x1705, 0x1706, 0x1707, - 0x41C3, 0x1709, 0x170A, 0x170B, 0x170C, 0x41C4, 0x41BD, 0x41BE, 0x41BF, 0x41C0, - 0x41B9, 0x41BA, 0x41BB, 0x41BC, 0x4295, 0x4296, 0x4297, 0x4298, 0x4291, 0x4292, - 0x4293, 0x4294, 0x428D, 0x428E, 0x428F, 0x4290, 0x4289, 0x428A, 0x428B, 0x428C, - 0x42A5, 0x42A6, 0x42A7, 0x42A8, 0x42A1, 0x42A2, 0x42A3, 0x42A4, 0x429D, 0x429E, - 0x429F, 0x42A0, 0x4299, 0x429A, 0x429B, 0x429C, 0x4275, 0x4276, 0x4277, 0x4278, - 0x4271, 0x4272, 0x4273, 0x4274, 0x426D, 0x426E, 0x426F, 0x4270, 0x4269, 0x426A, - 0x426B, 0x426C, 0x4285, 0x4286, 0x4287, 0x4288, 0x4281, 0x4282, 0x4283, 0x4284, - 0x427D, 0x427E, 0x427F, 0x4280, 0x4279, 0x427A, 0x427B, 0x427C, 0x4255, 0x4256, - 0x4257, 0x4258, 0x4251, 0x4252, 0x4253, 0x4254, 0x424D, 0x424E, 0x424F, 0x4250, - 0x4249, 0x424A, 0x424B, 0x424C, 0x4265, 0x4266, 0x4267, 0x4268, 0x4261, 0x4262, - 0x4263, 0x4264, 0x425D, 0x425E, 0x425F, 0x4260, 0x4259, 0x425A, 0x425B, 0x425C, - 0x4235, 0x4236, 0x4237, 0x4238, 0x4231, 0x4232, 0x4233, 0x4234, 0x422D, 0x422E, - 0x422F, 0x4230, 0x4229, 0x422A, 0x422B, 0x422C, 0x4245, 0x4246, 0x4247, 0x4248, - 0x4241, 0x4242, 0x4243, 0x4244, 0x423D, 0x423E, 0x423F, 0x4240, 0x4239, 0x423A, - 0x423B, 0x423C, 0x4315, 0x4316, 0x4317, 0x4318, 0x4311, 0x4312, 0x4313, 0x1710, - 0x170F, 0x1714, 0x1711, 0x4314, 0x1716, 0x171A, 0x1719, 0x171C, 0x171B, 0x171E, - 0x171D, 0x1720, 0x171F, 0x1722, 0x1721, 0x430D, 0x430E, 0x430F, 0x4310, 0x4309, - 0x430A, 0x430B, 0x430C, 0x172C, 0x172B, 0x4325, 0x4326, 0x1730, 0x172F, 0x1732, - 0x1731, 0x4327, 0x4328, 0x4321, 0x4322, 0x4323, 0x4324, 0x431D, 0x431E, 0x431F, - 0x4320, 0x4319, 0x431A, 0x431B, 0x431C, 0x42F5, 0x42F6, 0x42F7, 0x42F8, 0x42F1, - 0x42F2, 0x42F3, 0x42F4, 0x42ED, 0x42EE, 0x42EF, 0x42F0, 0x42E9, 0x42EA, 0x42EB, - 0x42EC, 0x4305, 0x4306, 0x4307, 0x4308, 0x4301, 0x4302, 0x4303, 0x4304, 0x42FD, - 0x42FE, 0x42FF, 0x4300, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42D5, 0x42D6, 0x42D7, - 0x42D8, 0x42D1, 0x42D2, 0x42D3, 0x42D4, 0x42CD, 0x42CE, 0x42CF, 0x42D0, 0x42C9, - 0x42CA, 0x42CB, 0x42CC, 0x42E5, 0x42E6, 0x42E7, 0x42E8, 0x42E1, 0x42E2, 0x42E3, - 0x42E4, 0x42DD, 0x42DE, 0x42DF, 0x42E0, 0x42D9, 0x42DA, 0x42DB, 0x42DC, 0x42B5, - 0x42B6, 0x42B7, 0x42B8, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42AD, 0x42AE, 0x42AF, - 0x42B0, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42C5, 0x42C6, 0x42C7, 0x42C8, 0x1745, - 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42BD, 0x42BE, 0x42BF, 0x42C0, 0x42B9, 0x42BA, - 0x42BB, 0x42BC, 0x3F95, 0x1753, 0x1752, 0x1755, 0x1754, 0x1757, 0x1756, 0x1759, - 0x1758, 0x175B, 0x175A, 0x175D, 0x175C, 0x175F, 0x175E, 0x1761, 0x1760, 0x1763, - 0x1762, 0x3F96, 0x1764, 0x1767, 0x1766, 0x1769, 0x1768, 0x176B, 0x176A, 0x176D, - 0x176C, 0x176F, 0x176E, 0x1771, 0x1770, 0x3F97, 0x3F98, 0x3F91, 0x3F92, 0x3F93, - 0x3F94, 0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F89, 0x3F8A, 0x3F8B, 0x3F8C, 0x3FA5, - 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA1, 0x3FA2, 0x3FA3, 0x1772, 0x3FA4, 0x3F9D, 0x3F9E, - 0x3F9F, 0x3FA0, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C, 0x3F75, 0x01A2, 0x0198, 0x01DF, - 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x3F76, 0x3F77, 0x3F78, - 0x3F71, 0x3F72, 0x3F73, 0x3F74, 0x3F6D, 0x3F6E, 0x3F6F, 0x3F70, 0x3F69, 0x3F6A, - 0x3F6B, 0x3F6C, 0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F81, 0x3F82, 0x3F83, 0x3F84, - 0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C, 0x3F55, 0x3F56, - 0x3F57, 0x3F58, 0x3F51, 0x3F52, 0x3F53, 0x3F54, 0x3F4D, 0x1776, 0x3F4E, 0x3F4F, - 0x3F50, 0x3F49, 0x3F4A, 0x3F4B, 0x3F4C, 0x3F65, 0x3F66, 0x3F67, 0x3F68, 0x3F61, - 0x3F62, 0x1787, 0x1786, 0x1789, 0x1788, 0x178B, 0x178A, 0x178D, 0x3F63, 0x178F, - 0x178E, 0x1791, 0x1790, 0x1793, 0x1792, 0x1795, 0x3F64, 0x1797, 0x1796, 0x3F5D, - 0x1798, 0x179B, 0x179A, 0x177E, 0x179C, 0x177F, 0x177D, 0x3F5E, 0x179D, 0x3F5F, - 0x3F60, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C, 0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F31, - 0x3F32, 0x3F33, 0x3F34, 0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, 0x3F29, 0x3F2A, 0x01A2, - 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x3F2B, - 0x3F2C, 0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F41, 0x3F42, 0x3F43, 0x3F44, 0x3F3D, - 0x3F3E, 0x3F3F, 0x3F40, 0x3F39, 0x3F3A, 0x3F3B, 0x3F3C, 0x4015, 0x4016, 0x4017, - 0x4018, 0x4011, 0x4012, 0x4013, 0x4014, 0x400D, 0x400E, 0x400F, 0x4010, 0x4009, - 0x400A, 0x400B, 0x400C, 0x4025, 0x4026, 0x4027, 0x4028, 0x4021, 0x4022, 0x4023, - 0x4024, 0x401D, 0x401E, 0x401F, 0x4020, 0x4019, 0x401A, 0x401B, 0x401C, 0x3FF5, - 0x3FF6, 0x3FF7, 0x3FF8, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4, 0x3FED, 0x3FEE, 0x3FEF, - 0x3FF0, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC, 0x4005, 0x4006, 0x4007, 0x4008, 0x4001, - 0x4002, 0x4003, 0x4004, 0x3FFD, 0x3FFE, 0x3FFF, 0x4000, 0x3FF9, 0x3FFA, 0x3FFB, - 0x3FFC, 0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD1, 0x3FD2, 0x3FD3, 0x3FD4, 0x3FCD, - 0x3FCE, 0x3FCF, 0x3FD0, 0x3FC9, 0x3FCA, 0x3FCB, 0x3FCC, 0x3FE5, 0x3FE6, 0x3FE7, - 0x3FE8, 0x3FE1, 0x08A2, 0x08A3, 0x08A4, 0x08A5, 0x08A6, 0x3FE2, 0x08A8, 0x08A9, - 0x08AA, 0x3FE3, 0x3FE4, 0x08AF, 0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x08B4, 0x08B5, - 0x08B6, 0x08B7, 0x08B8, 0x08BA, 0x08BD, 0x08BE, 0x08BF, 0x08C0, 0x08C1, 0x08C2, - 0x08C7, 0x08C8, 0x08C9, 0x08CA, 0x3FD9, 0x3FDA, 0x3FDB, 0x3FDC, 0x3FB5, 0x3FB6, - 0x3FB7, 0x3FB8, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4, 0x3FAD, 0x3FAE, 0x3FAF, 0x3FB0, - 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC, 0x0913, 0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC1, - 0x3FC2, 0x3FC3, 0x3FC4, 0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, 0x3FB9, 0x3FBA, 0x3FBB, - 0x3FBC, 0x4095, 0x4096, 0x4097, 0x4098, 0x4091, 0x4092, 0x4093, 0x4094, 0x408D, - 0x408E, 0x408F, 0x4090, 0x4089, 0x408A, 0x408B, 0x408C, 0x40A5, 0x40A6, 0x40A7, - 0x40A8, 0x40A1, 0x40A2, 0x40A3, 0x40A4, 0x409D, 0x409E, 0x409F, 0x40A0, 0x4099, - 0x409A, 0x409B, 0x409C, 0x4075, 0x4076, 0x4077, 0x4078, 0x4071, 0x4072, 0x4073, - 0x4074, 0x406D, 0x406E, 0x406F, 0x4070, 0x4069, 0x406A, 0x406B, 0x406C, 0x4085, - 0x4086, 0x4087, 0x4088, 0x4081, 0x4082, 0x4083, 0x4084, 0x407D, 0x407E, 0x407F, - 0x4080, 0x4079, 0x407A, 0x407B, 0x407C, 0x4055, 0x4056, 0x4057, 0x4058, 0x4051, - 0x4052, 0x4053, 0x4054, 0x0B39, 0x404D, 0x404E, 0x0B4B, 0x0B48, 0x0B54, 0x0B4E, - 0x0B5A, 0x404F, 0x0B60, 0x0B5D, 0x0B66, 0x4050, 0x0B6C, 0x0B69, 0x4049, 0x404A, - 0x404B, 0x404C, 0x4065, 0x4066, 0x4067, 0x4068, 0x4061, 0x4062, 0x4063, 0x4064, - 0x405D, 0x405E, 0x405F, 0x4060, 0x4059, 0x405A, 0x405B, 0x405C, 0x10AE, 0x10AD, - 0x10B0, 0x10AF, 0x10B2, 0x4035, 0x10B4, 0x10B3, 0x10B6, 0x4036, 0x4037, 0x10B7, - 0x4038, 0x4031, 0x4032, 0x4033, 0x10BF, 0x10BE, 0x10C1, 0x10C0, 0x10C3, 0x10C2, - 0x10C5, 0x10C4, 0x10C7, 0x10C6, 0x10C9, 0x10C8, 0x10CB, 0x10CA, 0x10CD, 0x10CC, - 0x4034, 0x402D, 0x402E, 0x402F, 0x4030, 0x4029, 0x402A, 0x402B, 0x402C, 0x4045, - 0x4046, 0x4047, 0x4048, 0x10DB, 0x4041, 0x4042, 0x4043, 0x4044, 0x403D, 0x403E, - 0x403F, 0x4040, 0x4039, 0x403A, 0x403B, 0x403C, 0x4115, 0x4116, 0x4117, 0x4118, - 0x4111, 0x4112, 0x4113, 0x4114, 0x410D, 0x410E, 0x410F, 0x4110, 0x4109, 0x410A, - 0x410B, 0x410C, 0x4125, 0x4126, 0x4127, 0x4128, 0x4121, 0x4122, 0x4123, 0x4124, - 0x411D, 0x411E, 0x411F, 0x4120, 0x4119, 0x411A, 0x411B, 0x411C, 0x40F5, 0x40F6, - 0x40F7, 0x40F8, 0x40F1, 0x40F2, 0x40F3, 0x40F4, 0x40ED, 0x40EE, 0x40EF, 0x40F0, - 0x40E9, 0x40EA, 0x40EB, 0x40EC, 0x4105, 0x4106, 0x4107, 0x4108, 0x4101, 0x4102, - 0x4103, 0x4104, 0x40FD, 0x40FE, 0x40FF, 0x4100, 0x40F9, 0x40FA, 0x40FB, 0x40FC, - 0x40D5, 0x40D6, 0x40D7, 0x40D8, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40CD, 0x40CE, - 0x40CF, 0x40D0, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40E5, 0x40E6, 0x40E7, 0x40E8, - 0x40E1, 0x40E2, 0x128F, 0x128E, 0x1291, 0x1290, 0x1293, 0x1292, 0x40E3, 0x1294, - 0x1296, 0x1295, 0x1298, 0x1297, 0x129A, 0x1299, 0x40E4, 0x129B, 0x40DD, 0x40DE, - 0x40DF, 0x40E0, 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40B5, 0x40B6, 0x40B7, 0x40B8, - 0x40B1, 0x12A7, 0x40B2, 0x40B3, 0x40B4, 0x40AD, 0x40AE, 0x40AF, 0x40B0, 0x40A9, - 0x40AA, 0x40AB, 0x40AC, 0x40C5, 0x40C6, 0x40C7, 0x40C8, 0x40C1, 0x40C2, 0x40C3, - 0x40C4, 0x40BD, 0x40BE, 0x40BF, 0x40C0, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x48AB, - 0x490A, 0x490B, 0x48AC, 0x4909, 0x4975, 0x48A7, 0x48A9, 0x48A1, 0x48A2, 0x48A3, - 0x48A5, 0x489A, 0x4974, 0x489D, 0x4908, 0x48BA, 0x497B, 0x48B6, 0x48B7, 0x48B8, - 0x48B9, 0x4979, 0x48B3, 0x490D, 0x48B5, 0x4976, 0x490C, 0x4977, 0x4978, 0x021F, - 0x022A, 0x0234, 0x018E, 0x01F5, 0x0209, 0x0215, 0x018A, 0x018B, 0x018C, 0x018D, - 0x0186, 0x0187, 0x0188, 0x0189, 0x01F5, 0x0209, 0x0215, 0x01A2, 0x0234, 0x0234, - 0x01C9, 0x01DF, 0x022A, 0x022A, 0x0234, 0x0234, 0x0215, 0x021F, 0x021F, 0x021F, - 0x0182, 0x0183, 0x0184, 0x0185, 0x01A2, 0x01C9, 0x0180, 0x0181, 0x0209, 0x0209, - 0x01C9, 0x01DF, 0x01C9, 0x01DF, 0x01F5, 0x01F5, 0x01A2, 0x01C9, 0x01DF, 0x01DF, - 0x0215, 0x021F, 0x022A, 0x0234, 0x01DF, 0x01DF, 0x01F5, 0x0209, 0x01DF, 0x01F5, - 0x0209, 0x01C9, 0x01F5, 0x01F5, 0x01F5, 0x01F5, 0x01F5, 0x0209, 0x01DF, 0x01DF, - 0x01A2, 0x01C9, 0x01DF, 0x01DF, 0x01F5, 0x0209, 0x017E, 0x017F, 0x021F, 0x022A, - 0x0234, 0x01F5, 0x01DF, 0x01F5, 0x0209, 0x0215, 0x0215, 0x021F, 0x022A, 0x0234, - 0x01C9, 0x01DF, 0x01F5, 0x0209, 0x022A, 0x0234, 0x01A2, 0x01C9, 0x01F5, 0x0209, - 0x0215, 0x021F, 0x0234, 0x01A2, 0x01C9, 0x01DF, 0x0209, 0x0215, 0x021F, 0x022A, - 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4, 0x3ECD, 0x3ECE, 0x3ECF, 0x3ED0, 0x3EC9, 0x3ECA, - 0x3ECB, 0x3ECC, 0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4, - 0x3EDD, 0x3EDE, 0x3EDF, 0x3EE0, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC, 0x3ED5, 0x3ED6, - 0x3ED7, 0x3ED8, 0x3EB1, 0x3EB2, 0x3EB3, 0x3EB4, 0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, - 0x3EA9, 0x3EAA, 0x3EAB, 0x3EAC, 0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EC1, 0x3EC2, - 0x3EC3, 0x3EC4, 0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EB9, 0x3EBA, 0x3EBB, 0x3EBC, - 0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3E91, 0x3E92, 0x3E93, 0x3E94, 0x3E8D, 0x3E8E, - 0x3E8F, 0x3E90, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C, 0x3E85, 0x3E86, 0x3E87, 0x3E88, - 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4, 0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, 0x3E99, 0x3E9A, - 0x3E9B, 0x3E9C, 0x3E95, 0x3E96, 0x3E97, 0x3E98, 0x3E71, 0x3E72, 0x3E73, 0x3E74, - 0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E69, 0x3E6A, 0x3E6B, 0x3E6C, 0x3E65, 0x3E66, - 0x3E67, 0x3E68, 0x3E81, 0x3E82, 0x3E83, 0x3E84, 0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, - 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C, 0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3F25, 0x3F26, - 0x3F27, 0x3F28, 0x3F11, 0x3F12, 0x3F13, 0x3F14, 0x3F0D, 0x3F1E, 0x3F1F, 0x3F20, - 0x3F19, 0x464C, 0x270E, 0x270D, 0x2710, 0x270F, 0x2712, 0x2711, 0x2714, 0x2713, - 0x2716, 0x2715, 0x2718, 0x2717, 0x271A, 0x2719, 0x271C, 0x271B, 0x271E, 0x271D, - 0x2720, 0x271F, 0x2722, 0x2721, 0x2724, 0x2723, 0x2726, 0x2725, 0x2728, 0x2727, - 0x272A, 0x2756, 0x272C, 0x272B, 0x272E, 0x272D, 0x2730, 0x272F, 0x2732, 0x2731, - 0x2734, 0x2733, 0x2736, 0x2735, 0x2738, 0x2737, 0x273A, 0x2739, 0x273C, 0x273B, - 0x273E, 0x276F, 0x2740, 0x273F, 0x2742, 0x274F, 0x2744, 0x2778, 0x278A, 0x2745, - 0x275B, 0x275A, 0x274A, 0x2749, 0x274C, 0x274B, 0x1BFE, 0x274D, 0x2729, 0x276B, - 0x2750, 0x1BD5, 0x2751, 0x1BD9, 0x1BDA, 0x2758, 0x276C, 0x1BDC, 0x1BDB, 0x1BDE, - 0x1BDD, 0x1BE0, 0x1BE6, 0x1BE2, 0x2764, 0x275F, 0x1BDF, 0x1BE3, 0x277C, 0x2762, - 0x276A, 0x1BE1, 0x1BE5, 0x2760, 0x275E, 0x1BD6, 0x275D, 0x275C, 0x2769, 0x1BED, - 0x1BEE, 0x2747, 0x277A, 0x2741, 0x276D, 0x1BEF, 0x1BF6, 0x276E, 0x2789, 0x1BEC, - 0x1BF2, 0x1BE7, 0x1BF7, 0x278B, 0x1BD8, 0x1BE9, 0x2757, 0x2768, 0x1BE4, 0x2761, - 0x2763, 0x2766, 0x1BE8, 0x1BEA, 0x2767, 0x278C, 0x2785, 0x2743, 0x2784, 0x273D, - 0x1BFD, 0x1BFC, 0x2790, 0x278F, 0x278E, 0x2793, 0x2792, 0x278D, 0x2791, 0x279A, - 0x2787, 0x2788, 0x27A9, 0x2799, 0x279C, 0x279B, 0x279F, 0x27A2, 0x27A0, 0x1BD7, - 0x1BFF, 0x27A3, 0x27A4, 0x279E, 0x279D, 0x27AA, 0x27A6, 0x27A1, 0x27A5, 0x27AB, - 0x27AC, 0x27A7, 0x1BEB, 0x277B, 0x1C02, 0x1C00, 0x2782, 0x1C03, 0x1C04, 0x2781, - 0x27C5, 0x27C6, 0x2746, 0x1C16, 0x1C18, 0x1BFA, 0x1C17, 0x1C15, 0x27BE, 0x1BF0, - 0x27C0, 0x27BF, 0x27C2, 0x27C1, 0x27C4, 0x27C3, 0x27BD, 0x27C7, 0x27C8, 0x1C29, - 0x1C28, 0x1C01, 0x1C2B, 0x2779, 0x27D2, 0x1C24, 0x27CE, 0x1C2A, 0x277E, 0x27D1, - 0x27D4, 0x27D3, 0x1C27, 0x1C22, 0x27CF, 0x27D0, 0x27CD, 0x27F1, 0x2759, 0x277D, - 0x27D5, 0x2765, 0x2755, 0x274E, 0x340C, 0x2752, 0x2753, 0x2754, 0x27D6, 0x27E5, - 0x27D7, 0x27D8, 0x27EA, 0x27E9, 0x27EC, 0x27EB, 0x27F2, 0x277F, 0x27F3, 0x27F4, - 0x27ED, 0x27EE, 0x27EF, 0x27F0, 0x2783, 0x27F5, 0x27F9, 0x27FA, 0x27FB, 0x27FC, - 0x27F7, 0x27F8, 0x2771, 0x27F6, 0x2774, 0x1C1B, 0x2809, 0x280A, 0x1BFB, 0x2780, - 0x280B, 0x280C, 0x1BF5, 0x3406, 0x3405, 0x3408, 0x3407, 0x340A, 0x3409, 0x1C1C, - 0x340B, 0x340E, 0x340D, 0x3410, 0x340F, 0x3412, 0x3411, 0x3414, 0x3413, 0x3417, - 0x3400, 0x3418, 0x3416, 0x33FE, 0x3419, 0x3415, 0x33FF, 0x3402, 0x3401, 0x3404, - 0x3403, 0x341B, 0x341A, 0x341C, 0x3421, 0x341E, 0x341D, 0x3420, 0x341F, 0x3428, - 0x3422, 0x3434, 0x3426, 0x3427, 0x3429, 0x3430, 0x3435, 0x3431, 0x342E, 0x3423, - 0x342F, 0x3425, 0x3436, 0x342C, 0x3424, 0x3432, 0x342A, 0x342B, 0x342D, 0x2C6A, - 0x3433, 0x2C64, 0x2C65, 0x2C70, 0x2C7A, 0x2D23, 0x2C71, 0x2C79, 0x01C9, 0x01A2, - 0x01DF, 0x2D1C, 0x2C6B, 0x2C8C, 0x2CAA, 0x2CA5, 0x2C91, 0x47D2, 0x0198, 0x2C86, - 0x2CA4, 0x2CB7, 0x2C80, 0x2C7F, 0x2CD2, 0x2CCC, 0x2C8D, 0x2CC5, 0x2CD3, 0x2CBB, - 0x2CA9, 0x2CBC, 0x2CB0, 0x2C7B, 0x2CAB, 0x47D3, 0x2C87, 0x2C08, 0x2CC0, 0x1BF8, - 0x2CF5, 0x2CF6, 0x1BF1, 0x47D4, 0x286E, 0x286D, 0x2C9F, 0x1BF4, 0x2CB6, 0x2776, - 0x2770, 0x2773, 0x2CB1, 0x287A, 0x2CEF, 0x2D15, 0x287B, 0x2879, 0x287C, 0x2D59, - 0x2AB7, 0x2AB9, 0x2D53, 0x1BF3, 0x2D20, 0x2772, 0x2AAD, 0x2AAE, 0x1BF9, 0x2786, - 0x2777, 0x1C14, 0x2AAF, 0x288C, 0x2C72, 0x288B, 0x1C23, 0x1C21, 0x2AA9, 0x2D5D, - 0x1C1E, 0x1C1F, 0x2AB2, 0x1C1D, 0x1C25, 0x2C85, 0x1C26, 0x1C20, 0x1C11, 0x2A70, - 0x2C6C, 0x2C68, 0x2ADA, 0x2C66, 0x2A7F, 0x2A82, 0x2CAE, 0x2CB3, 0x2A8B, 0x1C13, - 0x2A7C, 0x2AB5, 0x1C08, 0x1C07, 0x2CB4, 0x2CA6, 0x2CBD, 0x2CC2, 0x2D4D, 0x2CA1, - 0x2CAD, 0x2CA7, 0x2CB8, 0x2D49, 0x2D26, 0x2D4E, 0x2D33, 0x1C19, 0x2CB9, 0x2CBE, - 0x1C06, 0x1C05, 0x2AEB, 0x2D38, 0x1C0B, 0x2C97, 0x1C0C, 0x1C0D, 0x1C10, 0x1C0F, - 0x1C0E, 0x1C1A, 0x1C0A, 0x1C09, 0x1C12, 0x2A88, 0x2AE8, 0x2AEA, 0x2AED, 0x2AEC, - 0x2D56, 0x2AEE, 0x2AEF, 0x2AF0, 0x2AE0, 0x2AF3, 0x2AE2, 0x2AF5, 0x2B0A, 0x2AE5, - 0x2AE6, 0x2AE7, 0x2C1D, 0x2AE1, 0x2ADB, 0x2AE3, 0x2CCB, 0x2C1E, 0x2C1F, 0x2C20, - 0x2CD7, 0x2CD8, 0x2CDD, 0x2CE0, 0x2CE3, 0x2C1A, 0x2C1B, 0x2C19, 0x2CEE, 0x2AD7, - 0x2AD8, 0x2ADF, 0x2CF7, 0x2CFD, 0x2CFE, 0x2CFF, 0x2D05, 0x2D06, 0x2D07, 0x2ADC, - 0x2ADD, 0x2D0F, 0x2D16, 0x2D19, 0x2C16, 0x2AC7, 0x2C15, 0x2C1C, 0x2E7E, 0x2EA9, - 0x2E82, 0x2E80, 0x2E85, 0x2E83, 0x2E88, 0x2E86, 0x2E8A, 0x2E89, 0x2E90, 0x2E8C, - 0x2E98, 0x2E99, 0x2E9A, 0x2E9B, 0x2E95, 0x2E97, 0x2B68, 0x2B65, 0x2E92, 0x2E94, - 0x2EAC, 0x2EAE, 0x2E9E, 0x2EA7, 0x2EA2, 0x2EA4, 0x2EB1, 0x2EAF, 0x2EB3, 0x2EB2, - 0x2EB6, 0x293A, 0x2EBB, 0x2EBA, 0x2EC1, 0x2AD9, 0x2E8E, 0x2C17, 0x2935, 0x2E96, - 0x293C, 0x2C18, 0x2A6E, 0x2E9D, 0x2BC1, 0x2A71, 0x2BC5, 0x2A74, 0x2A77, 0x2BC8, - 0x2A7D, 0x2A7A, 0x2BD0, 0x2BCD, 0x2BD6, 0x2BD3, 0x2BDC, 0x2BD9, 0x2A80, 0x2AB0, - 0x2A86, 0x2A83, 0x36E7, 0x2C13, 0x2ADE, 0x2A8C, 0x2A89, 0x36E8, 0x2ABD, 0x2A95, - 0x2C10, 0x2C12, 0x2A9B, 0x2A8F, 0x2B35, 0x2B32, 0x2B3B, 0x2B38, 0x2B41, 0x2B3E, - 0x2B47, 0x2B44, 0x2B4D, 0x2B4A, 0x2B53, 0x2B50, 0x2B59, 0x2B56, 0x2B5F, 0x2B5C, - 0x01C9, 0x2E84, 0x2C00, 0x2AA1, 0x36EA, 0x1880, 0x2ABB, 0x2B2F, 0x2C05, 0x2A92, - 0x2A98, 0x2EB4, 0x187F, 0x01A2, 0x2AA4, 0x2AB8, 0x2ACA, 0x36E3, 0x1878, 0x2B6B, - 0x2AB6, 0x2AC0, 0x1877, 0x2EA8, 0x021F, 0x2EBE, 0x2ACD, 0x1875, 0x187A, 0x2AE9, - 0x36E5, 0x0198, 0x2C23, 0x2AF1, 0x2C25, 0x2B05, 0x2B07, 0x2AF7, 0x2B7C, 0x2B7E, - 0x2B91, 0x2B8C, 0x2B8E, 0x2BA0, 0x2B03, 0x2B82, 0x2B9C, 0x2C6E, 0x2C8A, 0x47E1, - 0x1894, 0x47DF, 0x47E2, 0x47E0, 0x2C8F, 0x2C8E, 0x2C7D, 0x36EB, 0x2C83, 0x2C89, - 0x2C94, 0x2C81, 0x2AB4, 0x2C0D, 0x2EB7, 0x2E7F, 0x2E8B, 0x2E93, 0x2EAB, 0x2E9C, - 0x2EA5, 0x2EA6, 0x2EA3, 0x2EC0, 0x2EBF, 0x2EBC, 0x2EAA, 0x2EAD, 0x2EB0, 0x2C75, - 0x2E87, 0x2EB5, 0x2EBD, 0x2E81, 0x2E9F, 0x2EB8, 0x2E91, 0x2E8D, 0x2BF7, 0x2EA1, - 0x2EA0, 0x2BF2, 0x2EB9, 0x2E8F, 0x2EC2, 0x2C73, 0x2CF2, 0x36EF, 0x2CF9, 0x2CF3, - 0x2D03, 0x2A9E, 0x2CFB, 0x187D, 0x2D0B, 0x2D0A, 0x1884, 0x2D11, 0x2D17, 0x293B, - 0x2D02, 0x2D01, 0x2AA8, 0x2CFA, 0x2939, 0x1882, 0x187C, 0x1876, 0x36E9, 0x36ED, - 0x1C3C, 0x1C3D, 0x1C2D, 0x2B2C, 0x187E, 0x2C30, 0x2C14, 0x1C3A, 0x2D13, 0x2953, - 0x2B62, 0x2BF0, 0x2D3E, 0x294E, 0x2AD5, 0x2AC2, 0x2955, 0x2ACF, 0x2AD1, 0x2AD3, - 0x2D42, 0x2D1A, 0x2D46, 0x2D4A, 0x2CAC, 0x2C93, 0x2CD9, 0x2CB2, 0x2BFA, 0x2AAA, - 0x2CF0, 0x2D09, 0x2CE4, 0x2D08, 0x2D3A, 0x2D1D, 0x2D10, 0x1C3B, 0x2CF8, 0x2D00, - 0x2952, 0x187B, 0x1879, 0x022A, 0x1870, 0x2954, 0x1C41, 0x1881, 0x186A, 0x186C, - 0x36E4, 0x36E6, 0x186B, 0x1883, 0x36D5, 0x36EE, 0x36D4, 0x36EC, 0x36D3, 0x36D6, - 0x345D, 0x3473, 0x3457, 0x01F5, 0x345E, 0x47DC, 0x36D7, 0x0B5B, 0x0209, 0x0215, - 0x47D6, 0x47DB, 0x47D8, 0x0B61, 0x47DA, 0x01DF, 0x36D8, 0x3460, 0x36DC, 0x3461, - 0x345C, 0x36DA, 0x345B, 0x0B5E, 0x36F0, 0x1869, 0x3462, 0x36F1, 0x0B49, 0x022A, - 0x36DE, 0x47DD, 0x01C9, 0x01DF, 0x345A, 0x3459, 0x3469, 0x3464, 0x3465, 0x3468, - 0x3458, 0x345F, 0x346F, 0x3466, 0x36DD, 0x346D, 0x0198, 0x01A2, 0x0203, 0x186D, - 0x0215, 0x0B6A, 0x0B6D, 0x0209, 0x0215, 0x021F, 0x01C9, 0x0234, 0x3463, 0x17BA, - 0x17CD, 0x348B, 0x17B9, 0x17D2, 0x0198, 0x0234, 0x0215, 0x0209, 0x17D4, 0x17D0, - 0x17D1, 0x021F, 0x17CF, 0x17CE, 0x17B8, 0x343F, 0x0140, 0x17C9, 0x344A, 0x343D, - 0x01F5, 0x17C8, 0x0142, 0x17C6, 0x17C7, 0x17CA, 0x17D5, 0x343C, 0x17CB, 0x17CC, - 0x01C9, 0x01DF, 0x0143, 0x0144, 0x17BB, 0x01A2, 0x17D7, 0x17D8, 0x0145, 0x17E0, - 0x17E2, 0x343B, 0x17D6, 0x346A, 0x346E, 0x17DC, 0x17E4, 0x3467, 0x17D3, 0x17E7, - 0x346C, 0x17DA, 0x3477, 0x0146, 0x3449, 0x346B, 0x3476, 0x3475, 0x347C, 0x01C9, - 0x022A, 0x17E1, 0x347D, 0x347E, 0x3445, 0x3444, 0x3446, 0x1867, 0x1866, 0x347F, - 0x3482, 0x3481, 0x3486, 0x3480, 0x3488, 0x348A, 0x1874, 0x348C, 0x3487, 0x3489, - 0x3485, 0x1DC8, 0x348E, 0x348D, 0x01DF, 0x1DAA, 0x1871, 0x186F, 0x3483, 0x3484, - 0x1873, 0x0B1C, 0x186E, 0x0B6E, 0x0B58, 0x0B13, 0x0B1F, 0x0B19, 0x01EC, 0x188B, - 0x1890, 0x1DAE, 0x188A, 0x17E3, 0x17DF, 0x1889, 0x1872, 0x17E6, 0x1DAB, 0x0B70, - 0x17E5, 0x0B25, 0x47DE, 0x0B79, 0x1DA9, 0x0B52, 0x0B82, 0x0B86, 0x0B1A, 0x188D, - 0x188E, 0x188F, 0x0B71, 0x1891, 0x0B8C, 0x47D7, 0x022A, 0x1DBB, 0x0215, 0x0209, - 0x01F5, 0x17BC, 0x17BD, 0x17BE, 0x021F, 0x17BF, 0x17C0, 0x0234, 0x17C1, 0x17C2, - 0x17C3, 0x17C4, 0x17C5, 0x0B38, 0x0B17, 0x47D9, 0x0B4A, 0x0B53, 0x0B5C, 0x0B5F, - 0x0B14, 0x0B47, 0x0B62, 0x0B65, 0x0B68, 0x0B6B, 0x0B59, 0x0B8A, 0x0B56, 0x0B7A, - 0x0141, 0x0B7D, 0x17D9, 0x0B3B, 0x0B80, 0x0B26, 0x0B84, 0x0B77, 0x0B87, 0x0B74, - 0x0B89, 0x0B88, 0x0B8E, 0x0B8D, 0x47D5, 0x0B83, 0x3470, 0x3471, 0x3472, 0x1DDC, - 0x3474, 0x1DD4, 0x1DE0, 0x1DE5, 0x3478, 0x3479, 0x347A, 0x347B, 0x1D9D, 0x1DDF, - 0x1DDE, 0x1DE7, 0x120C, 0x1210, 0x120D, 0x120E, 0x1DB1, 0x1DB4, 0x1DB5, 0x1DC7, - 0x1DBE, 0x1DC1, 0x1DC2, 0x1DC3, 0x1DE8, 0x1DCF, 0x1DCC, 0x0198, 0x01A2, 0x2B34, - 0x2B31, 0x2B74, 0x2B40, 0x2B2E, 0x021F, 0x2B75, 0x2B6F, 0x2B2B, 0x2B70, 0x2B71, - 0x2B43, 0x2B76, 0x2B3D, 0x2B49, 0x2B4F, 0x1DDB, 0x2B55, 0x1DDD, 0x2B67, 0x2B3A, - 0x2B37, 0x2B52, 0x2B72, 0x2B5B, 0x2B46, 0x2B4C, 0x2B73, 0x2B6A, 0x2B6D, 0x2B58, - 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x021F, 0x2AF8, 0x2AF9, 0x2AFA, 0x0234, 0x01F5, - 0x2AF4, 0x11FD, 0x0209, 0x2AF2, 0x2AF6, 0x0215, 0x1211, 0x11FF, 0x11FE, 0x123A, - 0x120F, 0x1215, 0x1201, 0x11FC, 0x022A, 0x1212, 0x1213, 0x1214, 0x1DD6, 0x1216, - 0x1217, 0x1218, 0x2B61, 0x1D94, 0x1243, 0x1238, 0x1DCB, 0x1239, 0x2B6E, 0x1DDA, - 0x1237, 0x1208, 0x1264, 0x1265, 0x1236, 0x1263, 0x1DA6, 0x123D, 0x1DD9, 0x2B5E, - 0x11FB, 0x2B64, 0x1221, 0x1D77, 0x1D79, 0x1D7B, 0x1DB2, 0x1D8D, 0x1D97, 0x1DAC, - 0x1D84, 0x1DB6, 0x1DB7, 0x1DBC, 0x1106, 0x1107, 0x1108, 0x1109, 0x1155, 0x1156, - 0x1157, 0x1158, 0x125E, 0x125F, 0x1260, 0x1261, 0x215C, 0x126B, 0x126C, 0x126D, - 0x1204, 0x1205, 0x120A, 0x1209, 0x120B, 0x1200, 0x123C, 0x1202, 0x215A, 0x2164, - 0x1206, 0x1207, 0x2162, 0x20E4, 0x2166, 0x2168, 0x20CA, 0x0B16, 0x20CE, 0x20D0, - 0x20CC, 0x0B22, 0x20D2, 0x0B2B, 0x0B2E, 0x0B31, 0x0B34, 0x0B37, 0x0B3A, 0x0B40, - 0x0B43, 0x0B46, 0x20DA, 0x20DC, 0x20E6, 0x20E8, 0x20E2, 0x20D4, 0x20D6, 0x20D8, - 0x0B64, 0x0B67, 0x20DE, 0x20E0, 0x2102, 0x0B73, 0x0B76, 0x0B7C, 0x210C, 0x210E, - 0x2110, 0x2136, 0x2114, 0x2134, 0x2118, 0x2138, 0x213A, 0x213C, 0x210A, 0x2140, - 0x2116, 0x2144, 0x213E, 0x2148, 0x0B11, 0x2132, 0x2130, 0x2142, 0x0B1D, 0x0B20, - 0x0B23, 0x0B29, 0x212E, 0x0B2F, 0x0B32, 0x0B35, 0x212C, 0x0B3E, 0x0B41, 0x212A, - 0x214A, 0x214C, 0x214E, 0x2150, 0x2112, 0x2154, 0x2156, 0x2158, 0x211A, 0x211C, - 0x211E, 0x2120, 0x2122, 0x2124, 0x2126, 0x2128, 0x216A, 0x216C, 0x216E, 0x2170, - 0x2172, 0x2174, 0x2152, 0x215E, 0x2169, 0x216B, 0x216D, 0x216F, 0x2171, 0x2173, - 0x2146, 0x2160, 0x4644, 0x4645, 0x4647, 0x464E, 0x463F, 0x4640, 0x4640, 0x4642, - 0x4639, 0x463B, 0x463C, 0x463D, 0x4661, 0x4662, 0x4663, 0x4627, 0x461F, 0x4620, - 0x4621, 0x4622, 0x48CF, 0x4619, 0x461A, 0x461D, 0x4611, 0x4612, 0x4613, 0x4614, - 0x4638, 0x4634, 0x4636, 0x4637, 0x22E0, 0x22DC, 0x4916, 0x22DF, 0x462F, 0x22DD, - 0x22DE, 0x4630, 0x22E7, 0x4631, 0x4915, 0x4748, 0x22E8, 0x22E1, 0x22E2, 0x22E3, - 0x462C, 0x22E5, 0x462D, 0x4629, 0x22F0, 0x22F9, 0x462A, 0x22E9, 0x22F4, 0x22F7, - 0x22F6, 0x22E6, 0x22F8, 0x22F5, 0x22FA, 0x22FB, 0x462A, 0x462A, 0x48CB, 0x4912, - 0x45F6, 0x45F7, 0x45EF, 0x45F0, 0x45F3, 0x45F1, 0x45E6, 0x45EA, 0x45EB, 0x45ED, - 0x45DE, 0x45DC, 0x230F, 0x45DF, 0x2310, 0x490E, 0x2312, 0x230D, 0x230E, 0x4970, - 0x230C, 0x460B, 0x2316, 0x2317, 0x2314, 0x2311, 0x460C, 0x2313, 0x48CE, 0x114D, - 0x4603, 0x45E4, 0x4604, 0x1154, 0x4605, 0x45F9, 0x115A, 0x45FF, 0x4911, 0x4602, - 0x115E, 0x45F8, 0x1160, 0x1161, 0x2319, 0x2315, 0x45FD, 0x490F, 0x48CC, 0x492F, - 0x231A, 0x231B, 0x4713, 0x48E1, 0x4715, 0x470C, 0x470D, 0x470E, 0x4711, 0x4709, - 0x4705, 0x470B, 0x48E0, 0x4700, 0x1178, 0x4706, 0x4708, 0x492E, 0x117C, 0x4721, - 0x117D, 0x117E, 0x4723, 0x471F, 0x4725, 0x491C, 0x4932, 0x471E, 0x4933, 0x471A, - 0x471C, 0x471D, 0x4931, 0x4930, 0x118A, 0x118B, 0x4716, 0x3DD9, 0x3DDA, 0x118F, - 0x1190, 0x1191, 0x3DD3, 0x3DD4, 0x3DD5, 0x3DD6, 0x3DCF, 0x3DD0, 0x3DD1, 0x3DD2, - 0x3DCB, 0x3DCC, 0x3DCD, 0x3DCE, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DE3, 0x3DE4, - 0x3DE5, 0x3DE6, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DDB, 0x3DDC, 0x3DDD, 0x3DDE, - 0x3E57, 0x3E58, 0x3E59, 0x3E5A, 0x3E53, 0x3E54, 0x3E55, 0x3E56, 0x3E4F, 0x3E50, - 0x3E51, 0x3E52, 0x3E4B, 0x3E4C, 0x3E4D, 0x3E4E, 0x3E63, 0x3E64, 0x3E5F, 0x3E60, - 0x3E61, 0x3E62, 0x3E5B, 0x3E5C, 0x3E5D, 0x3E5E, 0x3B37, 0x3B38, 0x3B39, 0x35B6, - 0x35B5, 0x35B8, 0x35B7, 0x35BA, 0x35B9, 0x35BC, 0x35BB, 0x35BE, 0x35BD, 0x35C0, - 0x35BF, 0x35C2, 0x35C1, 0x35C4, 0x35C3, 0x35C6, 0x35C5, 0x35C8, 0x35C7, 0x35CA, - 0x35C9, 0x35CC, 0x35CB, 0x35CE, 0x35CD, 0x35D0, 0x35CF, 0x35D2, 0x35D1, 0x35D4, - 0x35D3, 0x35D6, 0x35D5, 0x35D8, 0x35D7, 0x3B3A, 0x3B33, 0x35DC, 0x35DB, 0x233D, - 0x233E, 0x233F, 0x235C, 0x235F, 0x2343, 0x235E, 0x235D, 0x35E6, 0x35E5, 0x35E8, - 0x35E7, 0x35EA, 0x35E9, 0x35EC, 0x35EB, 0x35EE, 0x35ED, 0x35F0, 0x35EF, 0x35F2, - 0x35F1, 0x35F4, 0x35F3, 0x234D, 0x2350, 0x234F, 0x2352, 0x2351, 0x235A, 0x2359, - 0x233C, 0x2341, 0x2342, 0x3607, 0x3608, 0x3605, 0x3606, 0x360C, 0x2346, 0x2345, - 0x361E, 0x2347, 0x361D, 0x2364, 0x2360, 0x2370, 0x22EF, 0x2375, 0x2361, 0x2362, - 0x22F2, 0x22ED, 0x22EE, 0x22EC, 0x22C8, 0x3619, 0x22F3, 0x361F, 0x235B, 0x35D9, - 0x35DA, 0x22C9, 0x361A, 0x35DD, 0x35DE, 0x35DF, 0x35E0, 0x35E1, 0x35E2, 0x35E3, - 0x35E4, 0x2395, 0x2396, 0x2397, 0x22F1, 0x2399, 0x239A, 0x3CF3, 0x3CF7, 0x3BAB, - 0x3D26, 0x3BB9, 0x3BB8, 0x3BBA, 0x3BB7, 0x3BB3, 0x3BB4, 0x362E, 0x3BB1, 0x3617, - 0x3618, 0x3632, 0x3631, 0x3630, 0x3ADE, 0x3616, 0x3635, 0x3615, 0x3D1F, 0x3ADD, - 0x361B, 0x3ADB, 0x361C, 0x3638, 0x3636, 0x3639, 0x3637, 0x363C, 0x3628, 0x363D, - 0x3BC7, 0x362A, 0x3BAE, 0x363E, 0x363F, 0x3BC8, 0x363B, 0x363A, 0x362F, 0x362D, - 0x3BAC, 0x362C, 0x3AE1, 0x3624, 0x3AE2, 0x3633, 0x3634, 0x3BAD, 0x3629, 0x3BB5, - 0x3626, 0x3627, 0x3BB2, 0x3BC3, 0x3BC4, 0x3620, 0x362B, 0x3622, 0x3623, 0x3BC9, - 0x3625, 0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, 0x3B92, 0x3B93, - 0x3B94, 0x3B95, 0x3B96, 0x35F7, 0x35F8, 0x35F9, 0x35FA, 0x3603, 0x3604, 0x3601, - 0x35FE, 0x3D1E, 0x35FD, 0x35FF, 0x3602, 0x3600, 0x3B9A, 0x3D1D, 0x3D1C, 0x3BA7, - 0x3D1B, 0x3609, 0x360A, 0x360B, 0x35F6, 0x360D, 0x360E, 0x360F, 0x3610, 0x3611, - 0x3612, 0x3613, 0x3614, 0x35F5, 0x3621, 0x3B97, 0x3B98, 0x3B99, 0x3BCA, 0x35FB, - 0x35FC, 0x3BBD, 0x3BBE, 0x3BBC, 0x3BC1, 0x3BBB, 0x3BC2, 0x3D21, 0x3D20, 0x3D22, - 0x3BC6, 0x3BBF, 0x3BC0, 0x3BC5, 0x3DB8, 0x3B4C, 0x3B4B, 0x3B4E, 0x3B4D, 0x3B50, - 0x3B4F, 0x3B52, 0x3B51, 0x3B54, 0x3B53, 0x3B56, 0x3B55, 0x3B58, 0x3B57, 0x3B5A, - 0x3B59, 0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, 0x3BA2, 0x3B64, - 0x3B63, 0x3BA5, 0x3BA6, 0x3B68, 0x3B67, 0x3B6A, 0x3B69, 0x3B6C, 0x3B6B, 0x3B6E, - 0x3B6D, 0x3B70, 0x3B6F, 0x3B72, 0x3B71, 0x3B74, 0x3B73, 0x3B76, 0x3B75, 0x3B78, - 0x3B77, 0x3B7A, 0x3B79, 0x3B7C, 0x3B7B, 0x3B7E, 0x3B7D, 0x3B80, 0x3B7F, 0x3B82, - 0x3B81, 0x3B84, 0x3B83, 0x3B86, 0x3B85, 0x3B88, 0x3B87, 0x3B8A, 0x3B89, 0x3BA3, - 0x3BA4, 0x3BA9, 0x3BAA, 0x3BA8, 0x3378, 0x3377, 0x337A, 0x3379, 0x337D, 0x337B, - 0x337E, 0x337C, 0x3380, 0x337F, 0x3382, 0x3381, 0x3384, 0x3383, 0x3386, 0x3385, - 0x3389, 0x3387, 0x3388, 0x338A, 0x338C, 0x338B, 0x338E, 0x338D, 0x3390, 0x338F, - 0x3392, 0x3391, 0x3394, 0x3393, 0x3396, 0x3395, 0x3398, 0x3397, 0x339A, 0x3399, - 0x339B, 0x339C, 0x339E, 0x339D, 0x33A0, 0x339F, 0x33A2, 0x33A1, 0x33A4, 0x33A3, - 0x33A6, 0x33A5, 0x33A8, 0x33A7, 0x33AA, 0x33A9, 0x33AC, 0x33AB, 0x33AE, 0x33AD, - 0x33B0, 0x33AF, 0x33B2, 0x33B1, 0x33B4, 0x33B3, 0x33B5, 0x3BD1, 0x3BD2, 0x33BA, - 0x33B7, 0x3BCD, 0x3BD6, 0x33BB, 0x3BCE, 0x3BD4, 0x3BD0, 0x3BDA, 0x33B9, 0x3BDC, - 0x3BDB, 0x3BDE, 0x3BDD, 0x01A2, 0x3BD3, 0x3BE2, 0x33BC, 0x3BE4, 0x3BE6, 0x3BE3, - 0x3BCF, 0x3BE8, 0x3BEA, 0x3BE7, 0x3BE9, 0x01C9, 0x1176, 0x1175, 0x33B8, 0x1177, - 0x117A, 0x1179, 0x1174, 0x117B, 0x01F5, 0x0209, 0x118E, 0x3BD7, 0x3BD8, 0x3BD9, - 0x0215, 0x021F, 0x10F8, 0x3BFE, 0x3BFD, 0x10F9, 0x10F7, 0x1102, 0x3C01, 0x10FD, - 0x10FF, 0x10FE, 0x1101, 0x1100, 0x10FC, 0x10FB, 0x10FA, 0x3D0B, 0x3D0C, 0x3D0E, - 0x33B6, 0x3D0F, 0x3D10, 0x3D0D, 0x3D12, 0x3D13, 0x3D14, 0x3D15, 0x3D16, 0x3D17, - 0x3D18, 0x3D11, 0x3D1A, 0x10F6, 0x10E5, 0x10E9, 0x10EC, 0x10E8, 0x1103, 0x1104, - 0x1105, 0x3D23, 0x3D24, 0x3D25, 0x3D19, 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, - 0x3D2C, 0x3D2D, 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34, 0x3D35, 0x3D36, 0x3D37, - 0x3D38, 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C, 0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, - 0x3D42, 0x3D43, 0x3D44, 0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, - 0x3D4C, 0x1114, 0x1145, 0x1138, 0x113C, 0x1151, 0x1184, 0x10EA, 0x10EB, 0x1147, - 0x1113, 0x1149, 0x10F0, 0x114A, 0x1148, 0x1170, 0x1119, 0x113E, 0x11D3, 0x11D4, - 0x11D9, 0x11DA, 0x11D7, 0x110C, 0x110D, 0x110E, 0x110B, 0x1111, 0x11DD, 0x11DE, - 0x11DF, 0x1112, 0x11DC, 0x11D8, 0x3CAC, 0x1116, 0x11E8, 0x111E, 0x11E7, 0x110F, - 0x1115, 0x111A, 0x11F3, 0x11F2, 0x11E1, 0x112D, 0x11E0, 0x11E2, 0x11F9, 0x11F8, - 0x121D, 0x1182, 0x1187, 0x1186, 0x122A, 0x1188, 0x121F, 0x1220, 0x121E, 0x1226, - 0x1222, 0x1224, 0x1244, 0x1245, 0x1246, 0x3C8C, 0x3C8B, 0x3C8E, 0x3C8D, 0x3C90, - 0x3C8F, 0x3C92, 0x3C91, 0x3C94, 0x3C93, 0x3C96, 0x3C95, 0x3C98, 0x3C97, 0x3C9A, - 0x3C99, 0x123F, 0x1240, 0x1241, 0x1242, 0x3CA0, 0x3C9F, 0x123B, 0x3CA1, 0x3CA4, - 0x3CA3, 0x3CA6, 0x3CA5, 0x3CA8, 0x3CA7, 0x3CAA, 0x3CA9, 0x2BB5, 0x3CAB, 0x3CAE, - 0x3CAD, 0x3CB0, 0x3CAF, 0x3CB2, 0x3CB1, 0x3CB4, 0x3CB3, 0x3CB6, 0x3CB5, 0x3CB8, - 0x3CB7, 0x3CBA, 0x3CB9, 0x3CBC, 0x3CBB, 0x3CBE, 0x3CBD, 0x3CC0, 0x3CBF, 0x3CC2, - 0x3CC1, 0x3CC4, 0x3CC3, 0x3CC6, 0x3CC5, 0x3CC8, 0x3CC7, 0x3CCA, 0x3CC9, 0x3CCC, - 0x3CCB, 0x1262, 0x1268, 0x3CD0, 0x3CCF, 0x3CCD, 0x3CCE, 0x3CD4, 0x3CD3, 0x3CD6, - 0x3CD5, 0x1266, 0x1269, 0x3CD1, 0x3CD2, 0x3CDC, 0x3CDB, 0x3CDE, 0x3CDD, 0x3CE0, - 0x3CDF, 0x3CE2, 0x3CE1, 0x3CE4, 0x3CE3, 0x3CE6, 0x3CE5, 0x3CE8, 0x3CE7, 0x3CEA, - 0x3CE9, 0x1223, 0x118D, 0x3CFD, 0x1271, 0x1270, 0x1185, 0x1267, 0x3CFC, 0x118C, - 0x126F, 0x1227, 0x1228, 0x1229, 0x122C, 0x122B, 0x3CDA, 0x122D, 0x0063, 0x0234, - 0x0062, 0x0065, 0x1181, 0x005F, 0x1183, 0x0061, 0x3CFE, 0x125A, 0x2BAF, 0x2BB0, - 0x2BB1, 0x3CD9, 0x2BB3, 0x3CEB, 0x3CEC, 0x2BB6, 0x2BB2, 0x3CEF, 0x3CF0, 0x3CED, - 0x3CEE, 0x3D03, 0x3CF4, 0x3CF5, 0x3CF6, 0x2BAD, 0x2BAE, 0x3CF1, 0x3CF2, 0x3CFB, - 0x3CFF, 0x3CF9, 0x3CFA, 0x2BAB, 0x3D00, 0x3D01, 0x3D02, 0x3D04, 0x2BAC, 0x3D05, - 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x125C, 0x2C39, 0x2C3B, 0x005D, 0x005C, - 0x2C3A, 0x005E, 0x0060, 0x0066, 0x3CF8, 0x022A, 0x01DF, 0x3CD7, 0x3CD8, 0x125B, - 0x0064, 0x125D, 0x124E, 0x124F, 0x1250, 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, - 0x1256, 0x1259, 0x1258, 0x2C3F, 0x1257, 0x2C38, 0x2BB4, 0x3D4E, 0x3D4D, 0x3D75, - 0x3D9B, 0x3D52, 0x3D51, 0x3D4F, 0x3D50, 0x3D56, 0x3D55, 0x3D58, 0x3D57, 0x3D5A, - 0x3D59, 0x3D53, 0x3D54, 0x3D5E, 0x3D5D, 0x3D60, 0x3D5F, 0x3D62, 0x3D61, 0x3D64, - 0x3D63, 0x3D66, 0x3D65, 0x3D68, 0x3D67, 0x3D6A, 0x3D69, 0x3D6C, 0x3D6B, 0x3D6E, - 0x3D6D, 0x3D70, 0x3D6F, 0x3D72, 0x3D71, 0x3D74, 0x3D73, 0x3D76, 0x3D86, 0x3D78, - 0x3D77, 0x3D7A, 0x3D79, 0x3D7C, 0x3D7B, 0x3D7E, 0x3D7D, 0x3D80, 0x3D7F, 0x3D82, - 0x3D81, 0x3D84, 0x3D83, 0x3D5C, 0x3D85, 0x3D88, 0x3D87, 0x3D8A, 0x3D89, 0x3D8C, - 0x3D8B, 0x3D8E, 0x3D8D, 0x3D90, 0x3D8F, 0x3D92, 0x3D91, 0x3DB3, 0x3D93, 0x3D96, - 0x3DA4, 0x3D98, 0x3D97, 0x3D9A, 0x3D99, 0x3D9C, 0x3D94, 0x3D9E, 0x3D5B, 0x3DA0, - 0x3D9F, 0x3D2F, 0x3D2E, 0x3DA2, 0x3DA1, 0x3D9D, 0x3DA3, 0x3DA6, 0x3DA5, 0x3DA8, - 0x3DA7, 0x3DAA, 0x3DA9, 0x3DAD, 0x3DAB, 0x3DAE, 0x3DC8, 0x3DB1, 0x3DAF, 0x3DB2, - 0x3DAC, 0x3DB5, 0x3DC4, 0x3DB6, 0x3DB0, 0x3DBA, 0x3DB7, 0x3DC9, 0x3DB4, 0x3DBC, - 0x3DBB, 0x3DBE, 0x3DBD, 0x3DC0, 0x3DBF, 0x3DC2, 0x3DC1, 0x3D95, 0x3DC3, 0x3DC6, - 0x3DC5, 0x3DCA, 0x3DC7, 0x4919, 0x4918, 0x466C, 0x3DD7, 0x3DEF, 0x3E1A, 0x48D0, - 0x466F, 0x4671, 0x48D1, 0x3DD8, 0x4673, 0x4675, 0x491A, 0x4677, 0x4676, 0x491B, - 0x4679, 0x4626, 0x4625, 0x467C, 0x46A1, 0x467E, 0x48D2, 0x4684, 0x4682, 0x491D, - 0x4683, 0x491E, 0x4686, 0x4688, 0x4689, 0x469E, 0x4928, 0x3DF7, 0x3DEB, 0x3DEE, - 0x3DED, 0x3DF0, 0x3DEC, 0x3DF2, 0x3DF1, 0x3E03, 0x3DF3, 0x3DF6, 0x3DF5, 0x3DF8, - 0x3DF4, 0x3DFA, 0x3DF9, 0x3DFF, 0x3DFB, 0x3DFE, 0x3DFD, 0x3E00, 0x3DFC, 0x3E02, - 0x3E01, 0x3E07, 0x4921, 0x3E06, 0x3E05, 0x3E08, 0x3E04, 0x3E0A, 0x3E09, 0x3E0C, - 0x3E0B, 0x3E0E, 0x3E0D, 0x3E10, 0x3E0F, 0x3E12, 0x3E11, 0x3E14, 0x3E24, 0x3E16, - 0x3E15, 0x3E18, 0x3E17, 0x3E2F, 0x3E19, 0x3E1C, 0x3E1B, 0x3E1E, 0x3E1D, 0x3E20, - 0x3E1F, 0x3E22, 0x3E21, 0x3DB9, 0x3E23, 0x3E26, 0x3E25, 0x3E28, 0x3E27, 0x3E2A, - 0x3E29, 0x3E2C, 0x3E2B, 0x3E2E, 0x3E2D, 0x3E30, 0x3E40, 0x3E32, 0x3E31, 0x3E34, - 0x3E33, 0x3E36, 0x3E35, 0x3E38, 0x3E37, 0x3E3A, 0x3E39, 0x3E3C, 0x3E3B, 0x3E3E, - 0x3E3D, 0x3E13, 0x3E3F, 0x3E42, 0x3E41, 0x3E44, 0x3E43, 0x3E46, 0x3E45, 0x3E48, - 0x3E47, 0x3E4A, 0x3E49, 0x468E, 0x48D3, 0x468A, 0x468D, 0x4691, 0x4692, 0x48D4, - 0x491F, 0x48D5, 0x4695, 0x468F, 0x4690, 0x46AA, 0x497A, 0x4696, 0x4697, 0x4921, - 0x47F2, 0x46A0, 0x46A0, 0x48D6, 0x46C7, 0x4952, 0x46A2, 0x48ED, 0x48D7, 0x46A6, - 0x46A9, 0x46AC, 0x46A4, 0x472D, 0x4729, 0x472B, 0x472A, 0x472F, 0x472E, 0x4728, - 0x4934, 0x4736, 0x4735, 0x473A, 0x48E3, 0x4935, 0x4739, 0x4740, 0x493A, 0x4937, - 0x4936, 0x4746, 0x4741, 0x4744, 0x4745, 0x4747, 0x48E4, 0x4749, 0x474A, 0x4910, - 0x474C, 0x4938, 0x474F, 0x476C, 0x4752, 0x4759, 0x4757, 0x493B, 0x475A, 0x4733, - 0x475C, 0x493D, 0x493C, 0x4765, 0x4763, 0x4766, 0x48E5, 0x48E6, 0x475D, 0x476D, - 0x48E9, 0x4770, 0x476F, 0x48E7, 0x4773, 0x493E, 0x4775, 0x493F, 0x4624, 0x4920, - 0x477A, 0x4940, 0x477C, 0x4942, 0x4941, 0x4777, 0x48E8, 0x4944, 0x4787, 0x4784, - 0x4943, 0x4786, 0x48EC, 0x4946, 0x4787, 0x48EB, 0x478E, 0x4789, 0x478A, 0x494C, - 0x48F3, 0x4948, 0x47AB, 0x48EE, 0x4791, 0x4799, 0x4949, 0x494B, 0x494A, 0x47A3, - 0x47A0, 0x47A5, 0x48EF, 0x47A7, 0x47A6, 0x47BF, 0x4945, 0x494D, 0x494D, 0x478C, - 0x48E6, 0x47AF, 0x47AE, 0x48F0, 0x494E, 0x48F2, 0x47B5, 0x47B7, 0x47B9, 0x4951, - 0x47BA, 0x48F1, 0x494F, 0x47C4, 0x47C2, 0x48F4, 0x47C8, 0x4652, 0x4953, 0x4955, - 0x48F5, 0x4956, 0x47CC, 0x47D1, 0x47CE, 0x4957, 0x47E4, 0x47E6, 0x4958, 0x47E8, - 0x4959, 0x48F6, 0x4929, 0x47ED, 0x495A, 0x47EE, 0x48F8, 0x47EC, 0x4670, 0x492A, - 0x495B, 0x47F2, 0x47F8, 0x4860, 0x47F3, 0x480B, 0x48F9, 0x47F9, 0x47F7, 0x48FB, - 0x495C, 0x47FC, 0x47FB, 0x47FA, 0x47FE, 0x47FF, 0x47FD, 0x4805, 0x4810, 0x4806, - 0x4800, 0x4804, 0x4618, 0x4808, 0x4803, 0x480A, 0x4809, 0x495F, 0x495D, 0x48FA, - 0x495E, 0x4813, 0x4812, 0x4963, 0x4815, 0x492B, 0x4816, 0x48FC, 0x48FE, 0x4962, - 0x4961, 0x481D, 0x487E, 0x481F, 0x481E, 0x4822, 0x4820, 0x4824, 0x4821, 0x4827, - 0x4823, 0x4826, 0x4825, 0x48FD, 0x4828, 0x482B, 0x482A, 0x482E, 0x48FF, 0x4964, - 0x482F, 0x4833, 0x4832, 0x4836, 0x4900, 0x4965, 0x4855, 0x4901, 0x4966, 0x483D, - 0x4902, 0x484A, 0x4843, 0x4967, 0x484C, 0x484E, 0x484D, 0x4854, 0x4853, 0x4913, - 0x4969, 0x496D, 0x4856, 0x4914, 0x4858, 0x485D, 0x485A, 0x48CD, 0x4960, 0x486B, - 0x4868, 0x496A, 0x496B, 0x4876, 0x486E, 0x487A, 0x4879, 0x487D, 0x4878, 0x486D, - 0x496C, 0x4903, 0x487F, 0x496E, 0x4881, 0x488C, 0x4904, 0x4891, 0x468B, 0x4971, - 0x496F, 0x4906, 0x4905, 0x4972, 0x4896, 0x4973, 0x4907, 0x4898, 0x4898, 0x3B34, - 0x3B35, 0x3B36, 0x3B2F, 0x3B30, 0x3B31, 0x3B32, 0x3B2B, 0x3B2C, 0x3B2D, 0x3B2E, - 0x3B47, 0x3B48, 0x3B49, 0x3B4A, 0x3B43, 0x3B44, 0x3B45, 0x3B46, 0x3B3F, 0x3B40, - 0x3B41, 0x3B42, 0x3B3B, 0x3B3C, 0x3B3D, 0x3B3E, 0x3B17, 0x3B18, 0x3B19, 0x3B1A, - 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B0F, 0x3B10, 0x3B11, 0x3B12, 0x3B0B, 0x3B0C, - 0x3B0D, 0x3B0E, 0x3B27, 0x3B28, 0x3B29, 0x2BA7, 0x3B2A, 0x3B23, 0x3B24, 0x3B25, - 0x3B26, 0x3B1F, 0x3B20, 0x3B21, 0x3B22, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3AF7, - 0x3AF8, 0x3AF9, 0x3AFA, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AEF, 0x3AF0, 0x3AF1, - 0x2BA8, 0x3AF2, 0x3AEB, 0x3AEC, 0x3AED, 0x3AEE, 0x3B07, 0x3B08, 0x3B09, 0x3B0A, - 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3AFF, 0x3B00, 0x3B01, 0x3B02, 0x3AFB, 0x3AFC, - 0x3AFD, 0x3AFE, 0x3AD7, 0x3AD8, 0x3AD9, 0x466B, 0x466D, 0x3EE6, 0x3EE5, 0x3EE8, - 0x3EE7, 0x466A, 0x3EE9, 0x3F0A, 0x4673, 0x3EEE, 0x3EED, 0x3EF0, 0x3EEF, 0x3EF2, - 0x3EF1, 0x3EF4, 0x3EF3, 0x3EF6, 0x3EF5, 0x3EF8, 0x3EF7, 0x3EFA, 0x3EF9, 0x3EFC, - 0x3EFB, 0x3EFE, 0x3EFD, 0x3F00, 0x3EFF, 0x3F02, 0x3F09, 0x3F04, 0x3F03, 0x3F06, - 0x3F05, 0x3F08, 0x3F07, 0x3F21, 0x3F1A, 0x3F0C, 0x3ADA, 0x3F10, 0x3F0B, 0x3AD3, - 0x3F0E, 0x3AD4, 0x3AD5, 0x3F0F, 0x3AD6, 0x3F16, 0x3F15, 0x3F18, 0x3F17, 0x3F1C, - 0x46D4, 0x46CB, 0x3F1B, 0x46CA, 0x3F1D, 0x3ACF, 0x3AD0, 0x3F22, 0x46C6, 0x3F24, - 0x3F23, 0x3AD1, 0x3AD2, 0x3ACB, 0x3ACC, 0x4699, 0x3ACD, 0x3ACE, 0x3AE7, 0x3AE8, - 0x3AE9, 0x3AEA, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3ADF, 0x3AE0, 0x3ADC, 0x3BB6, - 0x3BAF, 0x46C4, 0x3BB0, 0x46C3, 0x3B65, 0x3B66, 0x46CF, 0x3B5F, 0x46D3, 0x3B60, - 0x3B61, 0x3B62, 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3C37, 0x3C38, 0x3C39, 0x3C3A, - 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C2F, 0x3C30, 0x3C31, 0x3C32, 0x3C2B, 0x3C2C, - 0x3C2D, 0x3C2E, 0x3C47, 0x3C48, 0x3C49, 0x3C4A, 0x3C43, 0x3C44, 0x3C45, 0x3C46, - 0x3C3F, 0x3C40, 0x3C41, 0x3C42, 0x46D2, 0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C17, - 0x3C18, 0x3C19, 0x3C1A, 0x3C13, 0x3C14, 0x3C15, 0x3C16, 0x3C0F, 0x3C10, 0x3C11, - 0x3C12, 0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, 0x3C27, 0x3C28, 0x3C29, 0x3C2A, 0x3C23, - 0x46D0, 0x3C24, 0x3C25, 0x3C26, 0x3C1F, 0x3C20, 0x3C21, 0x3C22, 0x3C1B, 0x3C1C, - 0x3C1D, 0x3C1E, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA, 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, - 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2, 0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3C07, 0x3C08, - 0x3C09, 0x3C0A, 0x3C03, 0x3C04, 0x3C05, 0x3C06, 0x3BFF, 0x3C00, 0x3C02, 0x3BFB, - 0x3BFC, 0x3BD5, 0x3BCB, 0x3BCC, 0x3BE5, 0x3BDF, 0x3BE0, 0x3BE1, 0x3CA2, 0x3C9B, - 0x3C9C, 0x3C9D, 0x3C9E, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, 0x3C73, 0x3C74, 0x3C75, - 0x3C76, 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C6B, 0x3C6C, 0x3C6D, 0x3C6E, 0x3C87, - 0x3C88, 0x3C89, 0x3C8A, 0x3C83, 0x3C84, 0x3C85, 0x3C86, 0x3C7F, 0x3C80, 0x3C81, - 0x3C82, 0x3C7B, 0x3C7C, 0x3C7D, 0x3C7E, 0x3C57, 0x3C58, 0x3C59, 0x3C5A, 0x3C53, - 0x3C54, 0x3C55, 0x3C56, 0x3C4F, 0x3C50, 0x3C51, 0x3C52, 0x3C4B, 0x2BB8, 0x2BB7, - 0x2BBA, 0x2BB9, 0x2BBC, 0x2BBB, 0x3C4C, 0x2BBD, 0x3C4D, 0x3C4E, 0x2C33, 0x2C50, - 0x2C35, 0x2C34, 0x2C37, 0x2C36, 0x3C67, 0x3C68, 0x3C69, 0x3C6A, 0x2C3D, 0x2C3C, - 0x2C57, 0x2C3E, 0x2C41, 0x2C40, 0x2C43, 0x2C42, 0x2C45, 0x2C44, 0x2C47, 0x2C46, - 0x2C49, 0x2C48, 0x2C4B, 0x2C4A, 0x2C4D, 0x2C4C, 0x2C51, 0x2C4E, 0x2C60, 0x2C55, - 0x2C53, 0x2C52, 0x2BA9, 0x2C56, 0x2C54, 0x2BAA, 0x2C59, 0x2C58, 0x2C5B, 0x2C5A, - 0x2C5D, 0x2C5C, 0x2C5F, 0x2C5E, 0x2C61, 0x2C62, 0x2C63, 0x3C63, 0x3C64, 0x3C65, - 0x3C66, 0x2C4F, 0x460D, 0x47B6, 0x46CE, 0x48D9, 0x465A, 0x48D8, 0x46B1, 0x46B0, - 0x46B2, 0x46B7, 0x46B8, 0x46B9, 0x46B8, 0x46BC, 0x46BD, 0x4922, 0x46BF, 0x46C0, - 0x46C2, 0x4694, 0x4894, 0x47B4, 0x47D0, 0x46F3, 0x464F, 0x479B, 0x48C4, 0x4925, - 0x46C1, 0x464A, 0x4649, 0x46D6, 0x46DB, 0x4926, 0x46DD, 0x46DA, 0x46D8, 0x48DA, - 0x46DF, 0x46E1, 0x46E3, 0x46E0, 0x48DB, 0x46E5, 0x46E7, 0x4927, 0x46EC, 0x46F6, - 0x46EE, 0x48DE, 0x46F1, 0x48DD, 0x48DC, 0x4600, 0x4601, 0x46F7, 0x46F2, 0x47EB, - 0x48F7, 0x46F8, 0x46F9, 0x46FA, 0x46FE, 0x46FC, 0x492C, 0x48DF, 0x4703, 0x467B, - 0x4954, 0x465F, 0x4660, 0x467A, 0x4655, 0x483B, 0x4668, 0x469B, 0x4674, 0x4727, - 0x485E, 0x4653, 0x4650, 0x478F, 0x45F4, 0x483C, 0x4646, 0x48E2, 0x4717, 0x4837, - 0x4884, 0x465E, 0x4651, 0x482D, 0x48BF, 0x4654, 0x460D, 0x48C0, 0x48C7, 0x46B1, - 0x4605, 0x4864, 0x461D, 0x0E3A, 0x4682, 0x486C, 0x48C9, 0x4680, 0x4659, 0x464B, - 0x45FE, 0x489F, 0x46BB, 0x4648, 0x45F6, 0x45F3, 0x45E7, 0x461A, 0x45EA, 0x4643, - 0x47C3, 0x4846, 0x461F, 0x488A, 0x45FA, 0x46BD, 0x4656, 0x4625, 0x4649, 0x48C6, - 0x3C5F, 0x3C60, 0x3C61, 0x3C62, 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, 0x0210, 0x021C, - 0x0226, 0x0231, 0x01B3, 0x01D1, 0x01E6, 0x01FC, 0x0D05, 0x0D15, 0x0D16, 0x01E8, - 0x0D18, 0x0D3B, 0x0D3D, 0x0D63, 0x0D72, 0x0D71, 0x01E9, 0x0D73, 0x01EA, 0x0D64, - 0x01EB, 0x0DDD, 0x0F8A, 0x0FFE, 0x0FA7, 0x0FA6, 0x0FA9, 0x4917, 0x0FFD, 0x0FFC, - 0x0E77, 0x0E87, 0x0E88, 0x01D9, 0x0DDF, 0x01DA, 0x0E05, 0x0E04, 0x01E6, 0x01E7, - 0x01D5, 0x01D6, 0x4758, 0x0FA8, 0x01D7, 0x01D8, 0x01D2, 0x476B, 0x01D3, 0x01D4, - 0x0E56, 0x0030, 0x0035, 0x0032, 0x0C8E, 0x0DEF, 0x0DCE, 0x0C8F, 0x0CF0, 0x0CBC, - 0x0C95, 0x473E, 0x3EEB, 0x3EEC, 0x0D00, 0x0CEF, 0x3EEA, 0x0CC0, 0x0CBE, 0x0F74, - 0x4734, 0x0ED7, 0x0F18, 0x0F1B, 0x0ED3, 0x0FEF, 0x0009, 0x0E76, 0x472D, 0x0FEE, - 0x0E57, 0x0011, 0x0034, 0x002E, 0x0D65, 0x0033, 0x002D, 0x0D0B, 0x0031, 0x3F01, - 0x0EDA, 0x002F, 0x0DCD, 0x0036, 0x0F4D, 0x012B, 0x4708, 0x0EE8, 0x0DD9, 0x0D0C, - 0x0DDB, 0x0127, 0x0C8D, 0x0CBF, 0x0CC1, 0x0128, 0x0C96, 0x0D04, 0x0CBD, 0x0129, - 0x0EC7, 0x012A, 0x0123, 0x0124, 0x0DDA, 0x0F1F, 0x0F21, 0x0F49, 0x0125, 0x0126, - 0x021F, 0x022A, 0x0234, 0x0122, 0x1C36, 0x1C37, 0x1C38, 0x1C39, 0x1C32, 0x1C33, - 0x1C34, 0x1C35, 0x1C2E, 0x1C2F, 0x1C30, 0x1C31, 0x1C2C, 0x0204, 0x0205, 0x0210, - 0x01FF, 0x0200, 0x0201, 0x0202, 0x01EF, 0x01FC, 0x01FD, 0x01FE, 0x01ED, 0x01EE, - 0x01DF, 0x01F5, 0x0209, 0x02CE, 0x0234, 0x01A2, 0x1892, 0x1893, 0x0EEA, 0x01F5, - 0x188C, 0x1885, 0x1886, 0x0EEB, 0x0EEC, 0x1887, 0x1888, 0x36DF, 0x0EE6, 0x0E55, - 0x0663, 0x0E26, 0x0687, 0x0E3B, 0x36E0, 0x36E1, 0x36E2, 0x36DB, 0x0EE7, 0x36D9, - 0x1868, 0x2936, 0x2937, 0x2938, 0x2931, 0x2932, 0x2933, 0x2934, 0x292D, 0x292E, - 0x4751, 0x292F, 0x2930, 0x2945, 0x4795, 0x4797, 0x4796, 0x4798, 0x2941, 0x2942, - 0x2943, 0x2944, 0x293D, 0x293E, 0x293F, 0x2940, 0x2919, 0x291A, 0x291B, 0x291C, - 0x2915, 0x2916, 0x2917, 0x2918, 0x2911, 0x2912, 0x2913, 0x4847, 0x4851, 0x4852, - 0x4862, 0x4864, 0x488E, 0x4897, 0x489B, 0x46AF, 0x4939, 0x47F4, 0x2914, 0x290D, - 0x45DA, 0x290E, 0x290F, 0x2910, 0x45F5, 0x2929, 0x4619, 0x292A, 0x4643, 0x463E, - 0x4642, 0x292B, 0x4657, 0x465B, 0x4664, 0x4667, 0x292C, 0x2925, 0x2926, 0x2927, - 0x2928, 0x2921, 0x2922, 0x2923, 0x2924, 0x291D, 0x291E, 0x291F, 0x2920, 0x2962, - 0x2963, 0x295E, 0x295F, 0x2960, 0x2961, 0x295A, 0x295B, 0x295C, 0x295D, 0x2956, - 0x2957, 0x2958, 0x2959, 0x1C46, 0x1C47, 0x1C48, 0x1C49, 0x1C42, 0x1C43, 0x1C44, - 0x1C45, 0x1C3E, 0x1C3F, 0x1C40, 0x294F, 0x2950, 0x2951, 0x294A, 0x294B, 0x294C, - 0x294D, 0x2946, 0x2947, 0x2948, 0x0E20, 0x0E3E, 0x0E3C, 0x2949, 0x0E54, 0x17DD, - 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x17DB, 0x17DE, 0x2CE7, 0x2CEA, 0x2CED, - 0x2CC1, 0x0E75, 0x2CC6, 0x2CCA, 0x0E73, 0x2D0E, 0x2D0D, 0x2C92, 0x2C98, 0x2C99, - 0x2C9E, 0x0E85, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, 0x3443, 0x3440, - 0x3441, 0x3442, 0x343E, 0x3437, 0x3438, 0x3439, 0x343A, 0x3453, 0x3454, 0x3455, - 0x3456, 0x344F, 0x3450, 0x3451, 0x3452, 0x344B, 0x344C, 0x344D, 0x344E, 0x3447, - 0x3448, 0x2D47, 0x2D4B, 0x2D4F, 0x2D50, 0x2D36, 0x2D3B, 0x2D3F, 0x2D43, 0x2D2A, - 0x2D2E, 0x2D30, 0x2D34, 0x2D1E, 0x2D21, 0x2D24, 0x2D28, 0x2CA3, 0x2D55, 0x2D58, - 0x2D5B, 0x2C76, 0x2C88, 0x2C9A, 0x2D51, 0x2D54, 0x2D57, 0x2D5A, 0x2D5E, 0x2CE5, - 0x2CE8, 0x2CEB, 0x2CF1, 0x2CDA, 0x2CDB, 0x2CDE, 0x2CE1, 0x2CCF, 0x2CD0, 0x2CD4, - 0x2CD5, 0x2CC3, 0x2CC7, 0x2CC8, 0x2CCD, 0x2D12, 0x47C9, 0x2C95, 0x2C9B, 0x2C9C, - 0x2CA0, 0x2D45, 0x47C3, 0x2D39, 0x2D3D, 0x2D41, 0x2D27, 0x2D2C, 0x2D2D, 0x2D32, - 0x2775, 0x2748, 0x2805, 0x2806, 0x0E60, 0x2807, 0x2808, 0x2801, 0x0E86, 0x0E9E, - 0x0E9F, 0x0EA0, 0x2802, 0x2803, 0x2804, 0x27FD, 0x27FE, 0x27FF, 0x2800, 0x27D9, - 0x27DA, 0x27DB, 0x27DC, 0x27E6, 0x27E7, 0x27E8, 0x27E1, 0x27E2, 0x27E3, 0x27E4, - 0x27DD, 0x27DE, 0x27DF, 0x27E0, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27B5, 0x27B6, - 0x27B7, 0x27B8, 0x27B1, 0x27B2, 0x27B3, 0x480C, 0x4844, 0x27B4, 0x27AD, 0x27AE, - 0x27AF, 0x27B0, 0x27C9, 0x1000, 0x1001, 0x0D87, 0x27CA, 0x4840, 0x27CB, 0x0007, - 0x27CC, 0x2795, 0x2796, 0x2797, 0x2798, 0x2794, 0x27A8, 0x2875, 0x2876, 0x2877, - 0x2878, 0x2871, 0x2872, 0x2873, 0x2874, 0x286F, 0x2870, 0x2889, 0x288A, 0x2885, - 0x2886, 0x2887, 0x2888, 0x2881, 0x4827, 0x2882, 0x2883, 0x2884, 0x287D, 0x287E, - 0x4838, 0x287F, 0x2880, 0x2859, 0x285A, 0x285B, 0x285C, 0x2855, 0x2856, 0x2857, - 0x2858, 0x2851, 0x2852, 0x2853, 0x2854, 0x284D, 0x284E, 0x47E4, 0x284F, 0x2850, - 0x2869, 0x286A, 0x286B, 0x286C, 0x2865, 0x2866, 0x2867, 0x2868, 0x2861, 0x2862, - 0x2863, 0x2864, 0x285D, 0x285E, 0x285F, 0x2860, 0x2839, 0x283A, 0x283B, 0x283C, - 0x2835, 0x2836, 0x2837, 0x2838, 0x2831, 0x2832, 0x46C9, 0x2833, 0x2834, 0x282D, - 0x282E, 0x282F, 0x2830, 0x2849, 0x284A, 0x284B, 0x284C, 0x2845, 0x2846, 0x2847, - 0x2848, 0x2841, 0x2842, 0x2843, 0x2844, 0x283D, 0x283E, 0x283F, 0x2840, 0x2819, - 0x281A, 0x281B, 0x281C, 0x2815, 0x2816, 0x2817, 0x2818, 0x2811, 0x2812, 0x2813, - 0x2814, 0x280D, 0x280E, 0x280F, 0x2810, 0x2829, 0x282A, 0x282B, 0x282C, 0x2825, - 0x2826, 0x2827, 0x2828, 0x2821, 0x2822, 0x2823, 0x2824, 0x281D, 0x281E, 0x281F, - 0x2820, 0x28F9, 0x28FA, 0x28FB, 0x28FC, 0x28F5, 0x28F6, 0x28F7, 0x28F8, 0x28F1, - 0x28F2, 0x28F3, 0x28F4, 0x28ED, 0x28EE, 0x28EF, 0x28F0, 0x2909, 0x290A, 0x290B, - 0x290C, 0x2905, 0x2906, 0x2907, 0x2908, 0x2901, 0x2902, 0x2903, 0x2904, 0x28FD, - 0x484A, 0x4852, 0x4887, 0x28FE, 0x2B5A, 0x2B5D, 0x28FF, 0x2900, 0x28D9, 0x28DA, - 0x4870, 0x2B66, 0x28DB, 0x28DC, 0x28D5, 0x4877, 0x4894, 0x28D6, 0x4897, 0x28D7, - 0x28D8, 0x2BD4, 0x2BD7, 0x2BDA, 0x28D1, 0x28D2, 0x28D3, 0x28D4, 0x47A9, 0x4898, - 0x48BB, 0x28CD, 0x28CE, 0x28CF, 0x28D0, 0x4789, 0x28E9, 0x28EA, 0x28EB, 0x477D, - 0x2A78, 0x4895, 0x28EC, 0x4788, 0x489B, 0x48A7, 0x48BE, 0x4924, 0x28E5, 0x2BD1, - 0x2A72, 0x2A6F, 0x47B2, 0x2B2D, 0x2BC9, 0x47AD, 0x2A7E, 0x2A7B, 0x4784, 0x2BCE, - 0x2A75, 0x47BE, 0x2BDD, 0x2BC6, 0x28E6, 0x28E7, 0x28E8, 0x28E1, 0x28E2, 0x28E3, - 0x28E4, 0x28DD, 0x28DE, 0x28DF, 0x2B57, 0x28E0, 0x28B9, 0x28BA, 0x28BB, 0x28BC, - 0x28B5, 0x28B6, 0x28B7, 0x28B8, 0x28B1, 0x485D, 0x28B2, 0x28B3, 0x28B4, 0x28AD, - 0x28AE, 0x28AF, 0x28B0, 0x28C9, 0x28CA, 0x28CB, 0x28CC, 0x28C5, 0x28C6, 0x28C7, - 0x28C8, 0x28C1, 0x28C2, 0x28C3, 0x28C4, 0x28BD, 0x28BE, 0x28BF, 0x28C0, 0x2899, - 0x289A, 0x289B, 0x4923, 0x289C, 0x2B54, 0x2B60, 0x2895, 0x4947, 0x4950, 0x2B63, - 0x2896, 0x48BD, 0x2897, 0x2898, 0x2891, 0x48EB, 0x2B69, 0x2892, 0x4657, 0x2893, - 0x46EF, 0x2CDC, 0x48C3, 0x460A, 0x4761, 0x4781, 0x4794, 0x2CE9, 0x479C, 0x2CFC, - 0x2D0C, 0x47A0, 0x2D18, 0x2D14, 0x2894, 0x48C1, 0x288D, 0x48C2, 0x288E, 0x288F, - 0x2890, 0x28A9, 0x28AA, 0x28AB, 0x28AC, 0x28A5, 0x28A6, 0x28A7, 0x28A8, 0x28A1, - 0x28A2, 0x28A3, 0x28A4, 0x2BC2, 0x289D, 0x289E, 0x289F, 0x28A0, 0x0139, 0x2AA2, - 0x013A, 0x013B, 0x2AA5, 0x2A9F, 0x013C, 0x4776, 0x2AB1, 0x2A8A, 0x2A8D, 0x022A, - 0x4846, 0x4845, 0x4843, 0x2A90, 0x4847, 0x2A96, 0x2A99, 0x2A9C, 0x483C, 0x483F, - 0x2ABE, 0x2A93, 0x0234, 0x0137, 0x0138, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, - 0x01A2, 0x01C9, 0x01DF, 0x33BD, 0x013D, 0x013E, 0x013F, 0x33D6, 0x33D8, 0x33DA, - 0x33DC, 0x33CE, 0x33D0, 0x33D2, 0x33D4, 0x33C6, 0x33C8, 0x33CA, 0x33CC, 0x33BE, - 0x33C0, 0x33C2, 0x33C4, 0x33F6, 0x33F8, 0x33FA, 0x33FC, 0x33EE, 0x33F0, 0x33F2, - 0x33F4, 0x33E6, 0x33E8, 0x33EA, 0x33EC, 0x33DE, 0x33E0, 0x33E2, 0x33E4, 0x33D7, - 0x33D9, 0x33DB, 0x33DD, 0x33CF, 0x33D1, 0x33D3, 0x33D5, 0x33C7, 0x33C9, 0x33CB, - 0x33CD, 0x33BF, 0x33C1, 0x33C3, 0x33C5, 0x33F7, 0x33F9, 0x33FB, 0x33FD, 0x33EF, - 0x33F1, 0x33F3, 0x33F5, 0x33E7, 0x33E9, 0x33EB, 0x33ED, 0x33DF, 0x33E1, 0x33E3, - 0x33E5, 0x06E7, 0x029D, 0x048A, 0x029B, 0x03C4, 0x0433, 0x0432, 0x06E8, 0x058B, - 0x0294, 0x05ED, 0x03C5, 0x0466, 0x0465, 0x0468, 0x0540, 0x05C2, 0x06E6, 0x034E, - 0x0588, 0x0529, 0x0351, 0x0671, 0x03C7, 0x03C6, 0x054D, 0x02A1, 0x0670, 0x068B, - 0x068A, 0x0AC5, 0x0AC7, 0x0AC9, 0x0ACB, 0x0ABD, 0x0ABF, 0x0AC1, 0x0AC3, 0x0AB5, - 0x0AB7, 0x0AB9, 0x0ABB, 0x0AAD, 0x0AAF, 0x0AB1, 0x0AB3, 0x0AE5, 0x0AE7, 0x0AE9, - 0x0FA0, 0x0FEA, 0x0FE9, 0x0ADD, 0x0F6F, 0x0FEC, 0x0F71, 0x0C7B, 0x0ADF, 0x0F9E, - 0x0FE7, 0x0AE1, 0x0AE3, 0x0AD5, 0x0AD7, 0x0AD9, 0x0ADB, 0x0ACD, 0x0ACF, 0x0AD1, - 0x0AD3, 0x0AE6, 0x0AE8, 0x0AEA, 0x0ADE, 0x0AE0, 0x0AE2, 0x0AE4, 0x0AD6, 0x0AD8, - 0x0ADA, 0x0ADC, 0x0ACE, 0x0AD0, 0x0AD2, 0x0AD4, 0x0AA5, 0x0ED4, 0x0AA7, 0x0AA9, - 0x0AAB, 0x0A9D, 0x0A9F, 0x0AA1, 0x0AA3, 0x0A95, 0x0A97, 0x0A99, 0x0A9B, 0x0A8D, - 0x0A8F, 0x0A91, 0x0A93, 0x0AA6, 0x0AA8, 0x0AAA, 0x0AAC, 0x0A9E, 0x0AA0, 0x0AA2, - 0x0AA4, 0x0A96, 0x0A98, 0x0A9A, 0x0EDD, 0x0EDE, 0x0EDF, 0x0F6A, 0x0EE3, 0x0F70, - 0x0F50, 0x0F34, 0x0F56, 0x0F5A, 0x0F7C, 0x0F7D, 0x0F7E, 0x0A9C, 0x0FE8, 0x0F83, - 0x0E96, 0x0FE0, 0x0FF3, 0x0FF4, 0x0EBC, 0x0FF8, 0x0A8E, 0x0FFA, 0x0F53, 0x0E94, - 0x0F6D, 0x0ED6, 0x0FF5, 0x0C73, 0x0ED5, 0x0FF9, 0x0CE9, 0x0CE2, 0x0CE4, 0x0EE2, - 0x0E5B, 0x0F9F, 0x0EBD, 0x0D2E, 0x0A90, 0x0E68, 0x0A92, 0x0DDE, 0x0F1D, 0x000D, - 0x0E66, 0x0A94, 0x0DC4, 0x0E12, 0x0E14, 0x0E15, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E30, - 0x0C74, 0x0C75, 0x0C76, 0x0C77, 0x0CAA, 0x0CAB, 0x0CAC, 0x0CAD, 0x0AC6, 0x0AC8, - 0x0ACA, 0x0ACC, 0x0ABE, 0x0AC0, 0x0AC2, 0x0AC4, 0x0E7B, 0x0AB6, 0x0AB8, 0x0ABA, - 0x0ABC, 0x0E7C, 0x0E92, 0x0E93, 0x0AAE, 0x0AB0, 0x0AB2, 0x0CE7, 0x0AB4, 0x08E3, - 0x0904, 0x0903, 0x08E4, 0x0CB0, 0x0CB1, 0x08B9, 0x0C7C, 0x0E48, 0x0918, 0x0917, - 0x091A, 0x0919, 0x0083, 0x08F0, 0x08EF, 0x08F8, 0x08F7, 0x0DC3, 0x0D2F, 0x0D59, - 0x0D5A, 0x0D6A, 0x0D6B, 0x0DBF, 0x0DC1, 0x08FA, 0x08F9, 0x08F2, 0x08F1, 0x08F6, - 0x08F5, 0x08E8, 0x08E7, 0x08EA, 0x08E9, 0x08E0, 0x08DF, 0x08E6, 0x08E5, 0x090E, - 0x090D, 0x0916, 0x0915, 0x090A, 0x0909, 0x090C, 0x090B, 0x0900, 0x08FF, 0x0906, - 0x0905, 0x08FC, 0x08FB, 0x08FE, 0x08FD, 0x08D8, 0x08D7, 0x08DA, 0x08D9, 0x08D4, - 0x08D3, 0x08D6, 0x08D5, 0x08D0, 0x08CF, 0x08D2, 0x08D1, 0x08CC, 0x08CB, 0x08CE, - 0x08CD, 0x08C6, 0x08C5, 0x08DE, 0x08DD, 0x08BC, 0x08BB, 0x08C4, 0x08C3, 0x0914, - 0x08AD, 0x08AC, 0x08DC, 0x08DB, 0x0912, 0x0911, 0x08B1, 0x08B0, 0x08B3, 0x08B2, - 0x08AB, 0x08AE, 0x08A7, 0x1765, 0x10E3, 0x10E4, 0x10B9, 0x10D2, 0x10DF, 0x10E0, - 0x10E1, 0x10E2, 0x174E, 0x174F, 0x1750, 0x1751, 0x174A, 0x174B, 0x174C, 0x174D, - 0x1746, 0x1747, 0x1748, 0x1749, 0x1742, 0x1743, 0x1744, 0x10DC, 0x0E99, 0x0DE9, - 0x10DD, 0x10DE, 0x0CE3, 0x0CF4, 0x0CE5, 0x10D7, 0x0CE8, 0x0CEA, 0x0CEB, 0x0CEC, - 0x0D35, 0x0D30, 0x0D5F, 0x0D5E, 0x0DC2, 0x0DC0, 0x0DD0, 0x0DD4, 0x0E6E, 0x0E95, - 0x0EC1, 0x0DD5, 0x0E50, 0x0E6C, 0x0E6D, 0x0EC2, 0x0DF5, 0x0E7F, 0x0E81, 0x0DC5, - 0x10D8, 0x0DC6, 0x0DE8, 0x10D9, 0x0E13, 0x0E4F, 0x0E4A, 0x0E4B, 0x0E19, 0x0E2F, - 0x0E1C, 0x0E69, 0x0DE5, 0x0E80, 0x0DFA, 0x0DC7, 0x0DFB, 0x0DF3, 0x0E33, 0x0E35, - 0x10DA, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10CE, 0x10CF, 0x10D0, 0x10D1, 0x0B8B, - 0x0B78, 0x0B81, 0x0B85, 0x0B7E, 0x0B27, 0x0B3C, 0x0B51, 0x10BA, 0x10BB, 0x10BC, - 0x10BD, 0x10B5, 0x10B8, 0x10B1, 0x0B3F, 0x0B42, 0x0B45, 0x0B2D, 0x0B30, 0x0B33, - 0x0B36, 0x0B1E, 0x0B21, 0x0B24, 0x0B2A, 0x0B12, 0x0B15, 0x0B18, 0x0B1B, 0x0B6F, - 0x0B72, 0x0B75, 0x0B7B, 0x0B63, 0x0B57, 0x1799, 0x1782, 0x1783, 0x1784, 0x1785, - 0x177B, 0x177C, 0x1780, 0x1781, 0x1777, 0x1778, 0x1779, 0x177A, 0x1773, 0x1774, - 0x1775, 0x1794, 0x178C, 0x12A8, 0x12A9, 0x12A3, 0x12A4, 0x12A5, 0x12A6, 0x12A0, - 0x12A1, 0x12A2, 0x129C, 0x129D, 0x129E, 0x129F, 0x127D, 0x127E, 0x127F, 0x1279, - 0x127A, 0x127B, 0x127C, 0x1276, 0x1277, 0x1278, 0x1272, 0x1273, 0x1274, 0x1275, - 0x296B, 0x128B, 0x128C, 0x128D, 0x1287, 0x1288, 0x1289, 0x128A, 0x1284, 0x1285, - 0x1286, 0x1280, 0x297B, 0x1281, 0x1282, 0x1283, 0x11EB, 0x11FA, 0x1203, 0x1225, - 0x1189, 0x1192, 0x119B, 0x11CC, 0x299F, 0x1133, 0x1159, 0x116A, 0x1173, 0x2994, - 0x2995, 0x10F5, 0x110A, 0x2998, 0x111B, 0x1124, 0x299B, 0x121A, 0x2996, 0x121B, - 0x121C, 0x122E, 0x0D75, 0x0E27, 0x0E28, 0x0E3F, 0x0E40, 0x0DFF, 0x0E00, 0x0E21, - 0x0E03, 0x0E02, 0x0DDC, 0x0D6E, 0x0E3D, 0x0E51, 0x0E52, 0x0E70, 0x123E, 0x0E83, - 0x0D60, 0x0DD6, 0x126E, 0x0DD7, 0x1219, 0x022A, 0x0E82, 0x0E71, 0x0234, 0x0111, - 0x0112, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x17AA, - 0x17AB, 0x17AC, 0x17AD, 0x17A6, 0x17A7, 0x17A8, 0x0DE7, 0x17A9, 0x17A2, 0x17A3, - 0x0DCB, 0x0DCA, 0x17A4, 0x0E49, 0x17A5, 0x179E, 0x179F, 0x17A0, 0x17A1, 0x0CA2, - 0x17B6, 0x17B7, 0x17B2, 0x17B3, 0x17B4, 0x17B5, 0x17AE, 0x17AF, 0x17B0, 0x17B1, - 0x16DB, 0x16A3, 0x16A4, 0x16DA, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, - 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x16D1, 0x16D2, 0x16D3, 0x16D4, 0x16CD, 0x16CE, - 0x16CF, 0x16D0, 0x16C9, 0x16CA, 0x16CB, 0x16CC, 0x16C5, 0x16C6, 0x16C7, 0x16C8, - 0x16D9, 0x16D5, 0x16D6, 0x16D7, 0x16D8, 0x16B1, 0x16B2, 0x16B3, 0x16B4, 0x16AD, - 0x16AE, 0x16AF, 0x16B0, 0x16A9, 0x16AA, 0x16AB, 0x16AC, 0x16A5, 0x16A6, 0x16A7, - 0x16A8, 0x16C1, 0x16C2, 0x16C3, 0x16C4, 0x16BD, 0x16BE, 0x2DC5, 0x2DC6, 0x2DBF, - 0x2DC0, 0x2DC1, 0x2DC2, 0x2DDB, 0x2DDC, 0x2DDD, 0x2DDE, 0x2DD7, 0x2DD8, 0x2DD9, - 0x2DDA, 0x2DD3, 0x2DD4, 0x2DD5, 0x2DD6, 0x2DCF, 0x2DD0, 0x2DD1, 0x2DD2, 0x2DAB, - 0x2DAC, 0x2DAD, 0x2DAE, 0x2DA7, 0x2DA8, 0x2DA9, 0x2DAA, 0x2DA3, 0x2DA4, 0x2DA5, - 0x2DA6, 0x2D9F, 0x0CFA, 0x0D37, 0x0F2B, 0x2DA0, 0x0DD1, 0x0E1A, 0x0DF6, 0x0E34, - 0x0FF2, 0x0F32, 0x2DA1, 0x0FF1, 0x2DA2, 0x2DBB, 0x2DBC, 0x2DB7, 0x2DB9, 0x2DBA, - 0x2DB3, 0x2DB4, 0x2DB5, 0x2DB6, 0x2DAF, 0x2DB0, 0x2D8B, 0x0E4C, 0x2D8C, 0x2D95, - 0x0E5A, 0x0E4E, 0x2D96, 0x0ED8, 0x0E31, 0x0E53, 0x2D8F, 0x0E5F, 0x2D90, 0x2D91, - 0x2D92, 0x0E5E, 0x2D6A, 0x2D6B, 0x2D6C, 0x0E23, 0x0EC8, 0x0D3C, 0x0E74, 0x2D6E, - 0x2D66, 0x0E22, 0x0DA2, 0x2D67, 0x2D68, 0x2D69, 0x2D62, 0x2D63, 0x0F5F, 0x2E45, - 0x0FC0, 0x2E46, 0x0E25, 0x2E3F, 0x0CA4, 0x2E40, 0x2E41, 0x2E42, 0x2E5B, 0x2E5C, - 0x2E5D, 0x2E5E, 0x2E57, 0x2E58, 0x2E59, 0x2E5A, 0x0ED9, 0x2E53, 0x2E54, 0x2E55, - 0x2E56, 0x2E4F, 0x2E50, 0x2E51, 0x2E52, 0x0E47, 0x2E2B, 0x2E2C, 0x2E2D, 0x2E2E, - 0x2E27, 0x2E28, 0x2E29, 0x2E2A, 0x2E23, 0x2E24, 0x2E25, 0x2E26, 0x0CF5, 0x2E1F, - 0x2E20, 0x2E21, 0x2E22, 0x2E3B, 0x2E3C, 0x2E3D, 0x2E3E, 0x2E37, 0x2E38, 0x0CF6, - 0x2E39, 0x2E3A, 0x2E33, 0x2E34, 0x0CF2, 0x2E35, 0x2E36, 0x2E2F, 0x2E30, 0x2E31, - 0x2E32, 0x2E0B, 0x2E0C, 0x2E0D, 0x2E0E, 0x2E07, 0x2E08, 0x2E09, 0x2E0A, 0x2E03, - 0x2E04, 0x2E05, 0x2E06, 0x2DFF, 0x2E00, 0x2E01, 0x2E02, 0x2E1B, 0x2E1C, 0x2E1D, - 0x2E1E, 0x2E17, 0x2E18, 0x2E19, 0x2E1A, 0x2E13, 0x2E14, 0x2E15, 0x2E16, 0x2E0F, - 0x2E10, 0x2E11, 0x2E12, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DE7, 0x2DE8, 0x2DE9, - 0x2DEA, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6, 0x2DDF, 0x2DE0, 0x2DE1, 0x2DE2, 0x2DFB, - 0x2DFC, 0x2DFD, 0x2DFE, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA, 0x2DF3, 0x2DF4, 0x2DF5, - 0x2DF6, 0x2DEF, 0x2DF0, 0x2DF1, 0x2DF2, 0x1712, 0x1713, 0x1715, 0x1717, 0x173F, - 0x1740, 0x1741, 0x173B, 0x173C, 0x173D, 0x173E, 0x1737, 0x1738, 0x1739, 0x173A, - 0x1733, 0x1734, 0x1735, 0x1736, 0x2E6B, 0x2E6C, 0x2E6D, 0x2E6E, 0x2E67, 0x2E68, - 0x2E69, 0x0D36, 0x2E6A, 0x2E63, 0x2E64, 0x1718, 0x172D, 0x172E, 0x1727, 0x1728, - 0x0D33, 0x1729, 0x0F2E, 0x0483, 0x04A7, 0x172A, 0x0F2C, 0x0F29, 0x0F31, 0x0F1E, - 0x0F58, 0x0F4E, 0x0F20, 0x050C, 0x0F2F, 0x0F51, 0x0F4C, 0x0F52, 0x0FA1, 0x1723, - 0x0F4B, 0x1724, 0x0F7A, 0x0FA2, 0x1725, 0x1726, 0x1616, 0x1617, 0x1618, 0x0F2A, - 0x0F4A, 0x0FF6, 0x0F7F, 0x0457, 0x1619, 0x1612, 0x042B, 0x1613, 0x1614, 0x1615, - 0x160E, 0x160F, 0x0286, 0x1610, 0x0F76, 0x02AD, 0x0345, 0x02F8, 0x0392, 0x0370, - 0x0EE1, 0x0EE0, 0x0EC3, 0x0FF7, 0x0E6F, 0x03BC, 0x0411, 0x0F1C, 0x0F6B, 0x0F59, - 0x0F1A, 0x03F4, 0x1611, 0x0EBE, 0x0D34, 0x0D5D, 0x0F72, 0x0FA3, 0x15FB, 0x15FC, - 0x0E6A, 0x0FBF, 0x0FBE, 0x15FD, 0x0E6B, 0x0E72, 0x05A5, 0x0E65, 0x0E5C, 0x0E84, - 0x0E7E, 0x0E7A, 0x0537, 0x054F, 0x0567, 0x15FE, 0x15F7, 0x15F8, 0x15F9, 0x0659, - 0x15FA, 0x15F3, 0x15F4, 0x15F5, 0x15F6, 0x15EF, 0x15F0, 0x15F1, 0x0F26, 0x0F55, - 0x0CFB, 0x0F48, 0x0F22, 0x0F5C, 0x0F28, 0x0F84, 0x0F38, 0x0FA5, 0x0FA4, 0x0FE1, - 0x0F54, 0x0F9D, 0x0F75, 0x0F69, 0x05D6, 0x0618, 0x0FF0, 0x0FE6, 0x0FDF, 0x0FFB, - 0x0F37, 0x067E, 0x0690, 0x0F27, 0x06D0, 0x06B1, 0x0FED, 0x0F36, 0x0F25, 0x0F39, - 0x15F2, 0x160A, 0x160B, 0x160C, 0x160D, 0x1606, 0x1607, 0x1608, 0x1609, 0x1602, - 0x1603, 0x1604, 0x1605, 0x15FF, 0x1600, 0x1601, 0x022A, 0x0234, 0x01F5, 0x0209, - 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x1636, 0x1637, 0x1638, 0x1639, - 0x1632, 0x1633, 0x1634, 0x1635, 0x162E, 0x162F, 0x1630, 0x1631, 0x162A, 0x162B, - 0x162C, 0x162D, 0x1646, 0x1647, 0x1648, 0x1642, 0x1643, 0x1644, 0x1645, 0x163E, - 0x163F, 0x1640, 0x1641, 0x163A, 0x163B, 0x163C, 0x163D, 0x166D, 0x166B, 0x164D, - 0x164E, 0x166C, 0x1667, 0x1668, 0x1669, 0x166A, 0x1626, 0x1627, 0x1628, 0x1629, - 0x1622, 0x1623, 0x1624, 0x1625, 0x161E, 0x161F, 0x1620, 0x1621, 0x161A, 0x161B, - 0x161C, 0x161D, 0x1655, 0x1656, 0x1657, 0x1652, 0x1653, 0x1654, 0x164F, 0x1650, - 0x1651, 0x1649, 0x164A, 0x164B, 0x164C, 0x1664, 0x1665, 0x1666, 0x1660, 0x1661, - 0x1662, 0x1663, 0x165C, 0x165D, 0x165E, 0x165F, 0x1658, 0x1659, 0x165A, 0x165B, - 0x1676, 0x1678, 0x16A2, 0x16A0, 0x16A1, 0x166E, 0x1693, 0x1694, 0x1695, 0x1696, - 0x1690, 0x1691, 0x1692, 0x168C, 0x168D, 0x168E, 0x168F, 0x1688, 0x1689, 0x168A, - 0x168B, 0x169F, 0x169D, 0x169E, 0x169A, 0x169B, 0x169C, 0x1697, 0x1698, 0x1699, - 0x1677, 0x1679, 0x1672, 0x1673, 0x1674, 0x1675, 0x166F, 0x1670, 0x1671, 0x1684, - 0x1685, 0x1686, 0x1687, 0x1680, 0x1681, 0x1682, 0x1683, 0x167C, 0x167D, 0x167E, - 0x167F, 0x167A, 0x167B, 0x0215, 0x021F, 0x022A, 0x0234, 0x01C9, 0x01DF, 0x01F5, - 0x0209, 0x011C, 0x011D, 0x0198, 0x01A2, 0x0118, 0x0119, 0x011A, 0x011B, 0x0114, - 0x0115, 0x0116, 0x0117, 0x021F, 0x022A, 0x0234, 0x0113, 0x01DF, 0x01F5, 0x0209, - 0x0215, 0x01A2, 0x01C9, 0x1835, 0x1836, 0x1837, 0x1838, 0x1831, 0x1832, 0x1833, - 0x1834, 0x182D, 0x182E, 0x182F, 0x1830, 0x1829, 0x182A, 0x182B, 0x182C, 0x183F, - 0x1840, 0x1841, 0x1842, 0x1839, 0x183A, 0x183B, 0x1814, 0x183E, 0x1810, 0x183D, - 0x1825, 0x1826, 0x1827, 0x1828, 0x1821, 0x1822, 0x1823, 0x1824, 0x181D, 0x181E, - 0x181F, 0x1820, 0x1819, 0x181A, 0x181B, 0x181C, 0x36D2, 0x36CE, 0x36CF, 0x36D0, - 0x36D1, 0x36CA, 0x36CB, 0x36CC, 0x36CD, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, - 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x36C6, 0x36C7, 0x36C8, 0x36C9, 0x36C2, - 0x36C3, 0x36C4, 0x36C5, 0x36BE, 0x36BF, 0x36C0, 0x36C1, 0x36BA, 0x36BB, 0x36BC, - 0x36BD, 0x1591, 0x1592, 0x1593, 0x1594, 0x158E, 0x158F, 0x1590, 0x158B, 0x1589, - 0x158A, 0x158C, 0x158D, 0x1585, 0x1586, 0x1587, 0x1588, 0x1571, 0x1572, 0x1573, - 0x1574, 0x156D, 0x156E, 0x156F, 0x1570, 0x1569, 0x156A, 0x156B, 0x156C, 0x1568, - 0x1581, 0x1582, 0x1583, 0x1584, 0x157D, 0x157E, 0x157F, 0x1580, 0x1579, 0x157A, - 0x157B, 0x157C, 0x1575, 0x1576, 0x1577, 0x1578, 0x15B1, 0x15B2, 0x15B3, 0x15B4, - 0x15AD, 0x15AE, 0x15AF, 0x15B0, 0x15A9, 0x15AA, 0x15AB, 0x15AC, 0x15A5, 0x15A6, - 0x15A7, 0x15A8, 0x15B5, 0x15B6, 0x15B7, 0x15B8, 0x01E5, 0x1598, 0x1E0D, 0x1E0E, - 0x1E0F, 0x0225, 0x021B, 0x0225, 0x01D0, 0x01E5, 0x01FB, 0x002C, 0x01BB, 0x01BC, - 0x01D1, 0x1DEC, 0x1E05, 0x1E06, 0x1E07, 0x1E08, 0x1E01, 0x1E02, 0x1E03, 0x1E04, - 0x1DFD, 0x1DFE, 0x1DFF, 0x1E00, 0x1DF9, 0x1DFA, 0x1DFB, 0x1DFC, 0x012E, 0x012F, - 0x0130, 0x0131, 0x022A, 0x0234, 0x012C, 0x012D, 0x01F5, 0x0209, 0x0215, 0x021F, - 0x01A2, 0x01C9, 0x01DF, 0x0136, 0x0132, 0x0133, 0x0134, 0x2A12, 0x2A18, 0x0135, - 0x15B9, 0x15EB, 0x2A1D, 0x2A22, 0x2A1C, 0x15EC, 0x2A0D, 0x2A1E, 0x2A0E, 0x15ED, - 0x15EE, 0x022A, 0x29EB, 0x29E4, 0x29E5, 0x0234, 0x15BA, 0x01F5, 0x0209, 0x0215, - 0x29E8, 0x021F, 0x0198, 0x29EA, 0x29E9, 0x01A2, 0x29F4, 0x01C9, 0x29ED, 0x29EC, - 0x29F1, 0x01DF, 0x15E4, 0x15E5, 0x29FC, 0x15E6, 0x29EE, 0x15E7, 0x15E0, 0x15E1, - 0x15E2, 0x15E3, 0x15DC, 0x15DD, 0x2A27, 0x15DE, 0x15DF, 0x15D8, 0x15D9, 0x15DA, - 0x29F3, 0x01B6, 0x01B7, 0x01B8, 0x019E, 0x01B4, 0x15E8, 0x15E9, 0x15EA, 0x0230, - 0x01BA, 0x01BB, 0x01BC, 0x15BB, 0x15D4, 0x15D5, 0x15D6, 0x15D7, 0x15D0, 0x29F0, - 0x01F5, 0x29F2, 0x15D1, 0x15D2, 0x15D3, 0x15CC, 0x15CD, 0x15CE, 0x15CF, 0x15C8, - 0x15C9, 0x15CA, 0x15CB, 0x0070, 0x0071, 0x0072, 0x0073, 0x0234, 0x006D, 0x006E, - 0x006F, 0x0209, 0x0215, 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0080, - 0x0081, 0x0082, 0x007C, 0x007D, 0x007E, 0x007F, 0x0078, 0x0079, 0x007A, 0x007B, - 0x0074, 0x0075, 0x0076, 0x0077, 0x020D, 0x0219, 0x0223, 0x022E, 0x01A6, 0x01CD, - 0x01E3, 0x01F9, 0x0021, 0x0022, 0x0023, 0x0025, 0x001D, 0x001E, 0x001F, 0x0020, - 0x01AE, 0x01AF, 0x01B0, 0x01CE, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x0238, 0x01A7, - 0x01A8, 0x01A9, 0x259E, 0x259A, 0x259B, 0x259C, 0x259D, 0x2596, 0x2597, 0x2598, - 0x2599, 0x2582, 0x2583, 0x2584, 0x2585, 0x257E, 0x257F, 0x2580, 0x2581, 0x257A, - 0x257B, 0x257C, 0x257D, 0x2576, 0x2577, 0x2578, 0x2579, 0x2592, 0x2593, 0x2594, - 0x2595, 0x258E, 0x258F, 0x2590, 0x2591, 0x258A, 0x258B, 0x258C, 0x258D, 0x2586, - 0x2587, 0x2588, 0x2589, 0x2562, 0x2563, 0x2564, 0x2565, 0x255E, 0x255F, 0x2560, - 0x2561, 0x255A, 0x255B, 0x255C, 0x255D, 0x2556, 0x2557, 0x2558, 0x2559, 0x2572, - 0x2573, 0x2574, 0x2575, 0x256E, 0x256F, 0x2570, 0x2571, 0x256A, 0x256B, 0x256C, - 0x256D, 0x2566, 0x2567, 0x2568, 0x2569, 0x2548, 0x2549, 0x254C, 0x254E, 0x2540, - 0x2542, 0x2544, 0x2545, 0x2538, 0x253A, 0x253C, 0x253E, 0x2530, 0x2532, 0x2534, - 0x2535, 0x0086, 0x0087, 0x0088, 0x0089, 0x01A2, 0x0209, 0x2550, 0x2552, 0x2554, - 0x2508, 0x250A, 0x250C, 0x250E, 0x2500, 0x2502, 0x2503, 0x2504, 0x24F8, 0x24FA, - 0x24FC, 0x24FE, 0x24F0, 0x24F1, 0x24F4, 0x24F6, 0x2527, 0x252A, 0x252B, 0x252C, - 0x2520, 0x2522, 0x2524, 0x2526, 0x2518, 0x251A, 0x251C, 0x251E, 0x2510, 0x2511, - 0x2514, 0x2516, 0x254A, 0x254B, 0x254D, 0x254F, 0x2541, 0x2543, 0x2546, 0x2547, - 0x2539, 0x253B, 0x253D, 0x253F, 0x2531, 0x2533, 0x2536, 0x2537, 0x2551, 0x2553, - 0x2555, 0x2509, 0x250B, 0x250D, 0x250F, 0x2501, 0x2505, 0x2506, 0x2507, 0x24F9, - 0x24FB, 0x24FD, 0x24FF, 0x24F2, 0x24F3, 0x24F5, 0x24F7, 0x2529, 0x252D, 0x252E, - 0x252F, 0x2521, 0x2523, 0x2525, 0x2528, 0x2519, 0x251B, 0x251D, 0x251F, 0x2512, - 0x2513, 0x2515, 0x2517, 0x0232, 0x023B, 0x0206, 0x0211, 0x021D, 0x0227, 0x019F, - 0x395D, 0x395E, 0x395F, 0x3960, 0x3959, 0x395A, 0x395B, 0x395C, 0x3955, 0x3956, - 0x3957, 0x3958, 0x3951, 0x3952, 0x3953, 0x3954, 0x396D, 0x01A2, 0x00F8, 0x3969, - 0x396A, 0x396B, 0x396C, 0x3965, 0x3966, 0x3967, 0x3968, 0x3961, 0x3962, 0x3963, - 0x3964, 0x011E, 0x011F, 0x0120, 0x0121, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0233, - 0x023C, 0x0207, 0x0212, 0x021E, 0x0228, 0x01A0, 0x01BE, 0x01DC, 0x01F1, 0x185E, - 0x185F, 0x1860, 0x1861, 0x185A, 0x185B, 0x185C, 0x185D, 0x1856, 0x1857, 0x1858, - 0x1859, 0x1852, 0x1853, 0x1854, 0x02CF, 0x02F9, 0x0484, 0x03FA, 0x0699, 0x069A, - 0x069B, 0x0664, 0x0665, 0x0666, 0x0667, 0x03F5, 0x02C5, 0x02E7, 0x047D, 0x03E1, - 0x0691, 0x0692, 0x0693, 0x065A, 0x065B, 0x065C, 0x065D, 0x03DC, 0x03DE, 0x03E0, - 0x184E, 0x1850, 0x040E, 0x184B, 0x184C, 0x184D, 0x0300, 0x184A, 0x1844, 0x1845, - 0x1846, 0x01C5, 0x0213, 0x01C7, 0x01DE, 0x01F3, 0x01C6, 0x02D0, 0x032A, 0x06DB, - 0x0425, 0x0276, 0x06DB, 0x0886, 0x0819, 0x03E2, 0x3A65, 0x3A66, 0x3A7B, 0x3A74, - 0x3A77, 0x3A70, 0x3A71, 0x3A73, 0x3A6C, 0x3A6E, 0x0578, 0x053D, 0x0554, 0x0578, - 0x04AB, 0x03FB, 0x03FB, 0x045C, 0x044C, 0x397A, 0x397B, 0x397C, 0x397D, 0x3976, - 0x3977, 0x3978, 0x3979, 0x3972, 0x3973, 0x3974, 0x3975, 0x396E, 0x396F, 0x3970, - 0x3971, 0x398A, 0x01A2, 0x00F9, 0x00FA, 0x3986, 0x3987, 0x3988, 0x3989, 0x3982, - 0x3983, 0x3984, 0x3985, 0x397E, 0x397F, 0x3980, 0x3981, 0x3A44, 0x3A45, 0x3A46, - 0x3A47, 0x3A40, 0x3A41, 0x3A42, 0x3A43, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A38, - 0x3A39, 0x3A3A, 0x3A3B, 0x010A, 0x010B, 0x010C, 0x010D, 0x01A2, 0x01C9, 0x01DF, - 0x01F5, 0x3A48, 0x3A49, 0x3A4A, 0x3A2E, 0x3A2F, 0x3A30, 0x3A31, 0x3A2A, 0x3A2B, - 0x3A2C, 0x3A2D, 0x3A26, 0x3A27, 0x3A28, 0x3A29, 0x3A22, 0x3A23, 0x3A24, 0x3A25, - 0x0106, 0x0107, 0x0108, 0x01C9, 0x01DF, 0x006B, 0x0067, 0x3A35, 0x39B7, 0x39B8, - 0x39B9, 0x39BA, 0x39B3, 0x39B4, 0x39B5, 0x39B6, 0x39AF, 0x39B0, 0x39B1, 0x39B2, - 0x39AB, 0x39AC, 0x39AD, 0x05D2, 0x05E5, 0x05D5, 0x05B6, 0x05A3, 0x05E0, 0x05D0, - 0x05AF, 0x059F, 0x05B3, 0x0565, 0x0574, 0x0566, 0x056E, 0x0560, 0x0572, 0x0564, - 0x053A, 0x0535, 0x053B, 0x0536, 0x0500, 0x04D6, 0x04FF, 0x04D5, 0x03F3, 0x03DA, - 0x03EA, 0x03D2, 0x03B8, 0x03AC, 0x03BB, 0x03AF, 0x03BA, 0x03AE, 0x03B6, 0x03AA, - 0x0391, 0x0385, 0x03B7, 0x03AB, 0x0454, 0x0443, 0x0480, 0x0479, 0x0453, 0x0442, - 0x0455, 0x0444, 0x042A, 0x0421, 0x0452, 0x0441, 0x0426, 0x041D, 0x0429, 0x0420, - 0x02F5, 0x02E3, 0x02F7, 0x02E5, 0x02CD, 0x02C3, 0x02F2, 0x02E0, 0x02AB, 0x02A5, - 0x02AC, 0x02A6, 0x0285, 0x025A, 0x02AA, 0x02A4, 0x0339, 0x0327, 0x0321, 0x033C, - 0x0320, 0x02F3, 0x02E1, 0x02F6, 0x02E4, 0x0634, 0x0612, 0x0633, 0x0611, 0x0631, - 0x060F, 0x0632, 0x0610, 0x0636, 0x0614, 0x062D, 0x060B, 0x0507, 0x04DD, 0x0509, - 0x04DF, 0x0215, 0x021F, 0x022A, 0x0673, 0x04E0, 0x0501, 0x04D7, 0x03EF, 0x03D6, - 0x03F2, 0x03D9, 0x0332, 0x0316, 0x0342, 0x0326, 0x0331, 0x0317, 0x0506, 0x0249, - 0x0282, 0x067C, 0x0682, 0x088C, 0x0894, 0x088A, 0x0892, 0x086F, 0x087B, 0x3924, - 0x3925, 0x0848, 0x07CF, 0x0742, 0x3934, 0x3935, 0x392C, 0x392D, 0x392A, 0x3A04, - 0x3A06, 0x3A00, 0x07B4, 0x07AF, 0x07B7, 0x07A0, 0x0793, 0x07DB, 0x07DF, 0x07DD, - 0x07E1, 0x07DA, 0x07DE, 0x07DC, 0x07E0, 0x07C8, 0x07CC, 0x07CA, 0x07CE, 0x07C7, - 0x07CB, 0x07C9, 0x07CD, 0x074C, 0x0754, 0x0750, 0x0758, 0x074B, 0x0753, 0x074E, - 0x0756, 0x0731, 0x0739, 0x0735, 0x073D, 0x0730, 0x0738, 0x0733, 0x073B, 0x077C, - 0x00F2, 0x00F3, 0x0774, 0x0773, 0x0772, 0x0775, 0x0829, 0x0858, 0x085A, 0x0857, - 0x0856, 0x0824, 0x0825, 0x084A, 0x084E, 0x0849, 0x084F, 0x084D, 0x084C, 0x0899, - 0x39E5, 0x39E4, 0x39E7, 0x39DC, 0x46B5, 0x46DC, 0x39DE, 0x39D9, 0x39F5, 0x4751, - 0x39F4, 0x46BD, 0x473C, 0x46C3, 0x46BA, 0x4759, 0x39F6, 0x46D9, 0x0782, 0x39ED, - 0x39EF, 0x39E9, 0x39EA, 0x07E4, 0x07E6, 0x07E3, 0x07E2, 0x07D2, 0x07D6, 0x07D1, - 0x07D7, 0x07D5, 0x07D4, 0x0889, 0x0891, 0x088D, 0x0895, 0x088E, 0x0896, 0x088B, - 0x0893, 0x0870, 0x0878, 0x0874, 0x087C, 0x0875, 0x087D, 0x0872, 0x087A, 0x075F, - 0x07C6, 0x075D, 0x075E, 0x075C, 0x075B, 0x0741, 0x0745, 0x0746, 0x0744, 0x0747, - 0x0743, 0x0748, 0x074D, 0x0755, 0x0751, 0x0759, 0x0752, 0x075A, 0x074F, 0x0757, - 0x0732, 0x073A, 0x0736, 0x073E, 0x0737, 0x073F, 0x0734, 0x073C, 0x07AE, 0x20BE, - 0x20BF, 0x20C0, 0x20B9, 0x20BC, 0x20B5, 0x34F0, 0x0C3B, 0x0C3C, 0x0C3D, 0x0C3E, - 0x0C37, 0x0C38, 0x0C39, 0x0C32, 0x1C54, 0x1C55, 0x1C56, 0x022A, 0x00FD, 0x01C9, - 0x015F, 0x0179, 0x017A, 0x017B, 0x017C, 0x0175, 0x0176, 0x0177, 0x0178, 0x0170, - 0x0171, 0x0173, 0x016F, 0x014A, 0x014B, 0x014C, 0x014D, 0x0234, 0x0147, 0x0148, - 0x0149, 0x0209, 0x0215, 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x1C4B, 0x1C4C, - 0x017D, 0x438F, 0x12FB, 0x12FC, 0x12FC, 0x4384, 0x4387, 0x438A, 0x438C, 0x437B, - 0x437E, 0x4380, 0x4382, 0x436F, 0x4370, 0x4372, 0x4373, 0x4368, 0x436A, 0x436C, - 0x436D, 0x4365, 0x435B, 0x435D, 0x435F, 0x438B, 0x438D, 0x4390, 0x4391, 0x4385, - 0x4386, 0x4388, 0x4389, 0x437D, 0x437F, 0x4381, 0x4383, 0x4375, 0x4377, 0x4379, - 0x437C, 0x3831, 0x3832, 0x3833, 0x3834, 0x382D, 0x382E, 0x382F, 0x3830, 0x3829, - 0x382A, 0x382B, 0x382C, 0x3825, 0x3826, 0x3827, 0x3828, 0x3841, 0x3842, 0x3843, - 0x3844, 0x383D, 0x383E, 0x383F, 0x3840, 0x3839, 0x383A, 0x383B, 0x383C, 0x3835, - 0x3836, 0x3837, 0x3838, 0x3811, 0x3812, 0x3813, 0x3814, 0x380D, 0x380E, 0x380F, - 0x3810, 0x3809, 0x380A, 0x380B, 0x380C, 0x3805, 0x3806, 0x3807, 0x3808, 0x3821, - 0x3822, 0x3823, 0x381D, 0x381E, 0x381F, 0x3818, 0x37F1, 0x37F2, 0x37F3, 0x37F4, - 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37E9, 0x37EA, 0x37EB, 0x37EC, 0x37E5, 0x37E6, - 0x37E7, 0x3804, 0x37FD, 0x37FE, 0x3800, 0x37F9, 0x37FA, 0x37FB, 0x37FC, 0x37F5, - 0x37F6, 0x37F7, 0x37D4, 0x37C8, 0x37E1, 0x37E2, 0x37E3, 0x37E4, 0x37DD, 0x37DE, - 0x37DF, 0x37E0, 0x37D9, 0x37DA, 0x37DB, 0x37DC, 0x37D5, 0x37D6, 0x37D7, 0x37D8, - 0x38B1, 0x38B2, 0x38B3, 0x38B4, 0x38AD, 0x38AE, 0x38AF, 0x38B0, 0x38A9, 0x38AA, - 0x38AB, 0x38AC, 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38C1, 0x38C2, 0x38C3, 0x38B8, - 0x3891, 0x3892, 0x3893, 0x3894, 0x388D, 0x388E, 0x388F, 0x3890, 0x3889, 0x388A, - 0x388B, 0x388C, 0x3885, 0x3886, 0x3887, 0x3868, 0x3881, 0x3882, 0x3883, 0x3884, - 0x387D, 0x387E, 0x387F, 0x3880, 0x3879, 0x387A, 0x387B, 0x387C, 0x3875, 0x3876, - 0x3877, 0x3878, 0x3851, 0x3852, 0x3853, 0x3854, 0x384D, 0x384E, 0x384F, 0x3850, - 0x3849, 0x384A, 0x384B, 0x384C, 0x3845, 0x3846, 0x3847, 0x3848, 0x3861, 0x3862, - 0x3863, 0x3864, 0x385D, 0x385E, 0x385F, 0x3860, 0x3859, 0x385A, 0x385B, 0x385C, - 0x3855, 0x3856, 0x3857, 0x3858, 0x3916, 0x3917, 0x3918, 0x3919, 0x3912, 0x3913, - 0x3914, 0x3915, 0x3908, 0x3909, 0x390A, 0x390B, 0x3904, 0x3905, 0x3906, 0x3907, - 0x3900, 0x3901, 0x3902, 0x3903, 0x38FC, 0x38FD, 0x38FE, 0x069D, 0x06E0, 0x0296, - 0x0544, 0x0586, 0x05BF, 0x05C8, 0x042F, 0x04B5, 0x02B6, 0x390F, 0x38F1, 0x38F2, - 0x38F3, 0x38EF, 0x38E8, 0x38F9, 0x38FA, 0x38FB, 0x38F5, 0x38F6, 0x38F7, 0x38F8, - 0x38D1, 0x38D2, 0x38D3, 0x38D4, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38C9, 0x38CA, - 0x38CB, 0x38CC, 0x38C5, 0x38C6, 0x38C7, 0x38D8, 0x1F85, 0x1F90, 0x1F91, 0x1F92, - 0x1F8C, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F66, 0x1F67, 0x1F68, 0x1F69, 0x1F62, - 0x1F63, 0x1F64, 0x1F65, 0x1F5E, 0x1F5F, 0x1F60, 0x1F61, 0x1F7A, 0x1F7B, 0x1F7C, - 0x1F7D, 0x1F76, 0x1F77, 0x1F78, 0x1F79, 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1F6E, - 0x1F6F, 0x1F70, 0x1F71, 0x1D15, 0x1D16, 0x1D17, 0x1D18, 0x1D11, 0x1D12, 0x1D13, - 0x1D14, 0x1D0D, 0x1D0E, 0x1D0F, 0x1D10, 0x1D09, 0x1D0A, 0x1D0B, 0x1D0C, 0x1D1D, - 0x1D1E, 0x1D1F, 0x1D19, 0x1D1A, 0x1D1B, 0x1D1C, 0x35A1, 0x35A2, 0x35A3, 0x35A4, - 0x359D, 0x359E, 0x359F, 0x35A0, 0x3599, 0x359A, 0x359B, 0x359C, 0x3595, 0x3596, - 0x3597, 0x3598, 0x35B1, 0x35B3, 0x35B4, 0x35AD, 0x357F, 0x3581, 0x3583, 0x3575, - 0x3577, 0x3579, 0x357B, 0x356D, 0x356F, 0x3571, 0x3573, 0x3565, 0x3567, 0x3569, - 0x356B, 0x3591, 0x3592, 0x3593, 0x358E, 0x358F, 0x3588, 0x353D, 0x353F, 0x3541, - 0x3537, 0x3539, 0x357C, 0x355D, 0x355F, 0x3561, 0x3563, 0x3555, 0x3557, 0x3559, - 0x355B, 0x354D, 0x354F, 0x3551, 0x3553, 0x3545, 0x3547, 0x3549, 0x354B, 0x354E, - 0x3550, 0x3552, 0x3554, 0x3546, 0x3548, 0x354A, 0x354C, 0x353E, 0x3540, 0x3542, - 0x3544, 0x3536, 0x3538, 0x353A, 0x353C, 0x356E, 0x3570, 0x3572, 0x356C, 0x3564, - 0x3556, 0x3558, 0x355A, 0x355C, 0x219D, 0x219F, 0x21A1, 0x2197, 0x2199, 0x1FF3, - 0x1FF4, 0x1FF5, 0x1FEE, 0x21AB, 0x21AE, 0x21B0, 0x21B2, 0x21B4, 0x21A6, 0x21A8, - 0x21AA, 0x21AC, 0x219E, 0x21A0, 0x21A2, 0x1FC7, 0x1FC9, 0x21B8, 0x1FE1, 0x1FE3, - 0x218E, 0x2190, 0x2188, 0x2180, 0x2182, 0x364C, 0x364D, 0x364F, 0x3649, 0x364B, - 0x3646, 0x3647, 0x3641, 0x1D3A, 0x1D3B, 0x1D3C, 0x1D36, 0x1D37, 0x1D37, 0x1D32, - 0x0DBD, 0x0E64, 0x0E46, 0x0FE5, 0x0ED1, 0x0F16, 0x0FBD, 0x0D57, 0x0C9E, 0x0CA8, - 0x36AD, 0x36A6, 0x36A7, 0x1809, 0x180A, 0x180B, 0x1800, 0x1802, 0x1804, 0x1805, - 0x17FC, 0x3689, 0x366A, 0x366B, 0x366C, 0x366D, 0x3666, 0x3667, 0x3668, 0x2038, - 0x203B, 0x2088, 0x208B, 0x203E, 0x208A, 0x208D, 0x2078, 0x207A, 0x0EBA, 0x0D9E, - 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, - 0x2476, 0x2477, 0x2478, 0x2479, 0x2472, 0x2473, 0x2474, 0x2475, 0x246E, 0x246F, - 0x2470, 0x2471, 0x246A, 0x246B, 0x246C, 0x246D, 0x247E, 0x247F, 0x247A, 0x247B, - 0x247C, 0x247D, 0x2456, 0x2457, 0x2458, 0x2459, 0x2452, 0x2453, 0x2454, 0x2455, - 0x244E, 0x244F, 0x2450, 0x2451, 0x244A, 0x244B, 0x244C, 0x244D, 0x2466, 0x2467, - 0x2468, 0x2469, 0x2462, 0x2463, 0x2464, 0x2465, 0x245E, 0x245F, 0x2460, 0x2461, - 0x245A, 0x245B, 0x245C, 0x245D, 0x20A1, 0x20AA, 0x2062, 0x2063, 0x20A8, 0x20A9, - 0x209C, 0x209E, 0x2061, 0x20A3, 0x2446, 0x2447, 0x2448, 0x2449, 0x2442, 0x0291, - 0x2443, 0x2444, 0x2445, 0x0346, 0x0372, 0x0395, 0x243E, 0x243F, 0x2440, 0x2441, - 0x243A, 0x243B, 0x243C, 0x243D, 0x2094, 0x2096, 0x2097, 0x2099, 0x203A, 0x2081, - 0x204B, 0x206E, 0x2030, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x02C6, 0x02EF, 0x032A, - 0x036D, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x0424, 0x044C, 0x047E, 0x049C, 0x04E6, - 0x0538, 0x0551, 0x2032, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x067F, 0x0694, 0x06B2, - 0x06D2, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x0346, 0x0372, 0x0395, 0x03BD, 0x03FB, - 0x0412, 0x042D, 0x045C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x0554, 0x0578, 0x05BC, - 0x05E9, 0x063C, 0x0669, 0x0688, 0x069C, 0x202C, 0x06DB, 0x0267, 0x02A8, 0x02C6, - 0x02EF, 0x032A, 0x202D, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x202E, 0x202F, 0x205F, - 0x2060, 0x2095, 0x2098, 0x209B, 0x20A5, 0x2057, 0x204C, 0x20A2, 0x20A4, 0x20A6, - 0x20A7, 0x209A, 0x209D, 0x209F, 0x20A0, 0x02D0, 0x0300, 0x1E61, 0x1E62, 0x1E5D, - 0x1E5E, 0x1E5F, 0x1E60, 0x1E59, 0x1E5A, 0x1E5B, 0x1E5C, 0x1E55, 0x1E56, 0x1E57, - 0x1E58, 0x1E67, 0x1E63, 0x1E64, 0x1E65, 0x1E66, 0x0215, 0x021F, 0x022A, 0x0234, - 0x01C9, 0x01DF, 0x01F5, 0x0209, 0x0198, 0x01A2, 0x1E51, 0x1E46, 0x01DF, 0x00E9, - 0x00EA, 0x00EB, 0x00EC, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E1, 0x00E2, 0x00E3, - 0x00E4, 0x34D8, 0x34D9, 0x34DA, 0x34DB, 0x34D4, 0x34D5, 0x34D6, 0x34D7, 0x34D0, - 0x34D1, 0x34D2, 0x34D3, 0x34CC, 0x34CD, 0x34CE, 0x1CB4, 0x1CB5, 0x1CB6, 0x1CAD, - 0x1CAF, 0x1CB0, 0x1CB1, 0x1CA9, 0x1CAA, 0x1CAB, 0x1CAC, 0x1CA5, 0x1CA7, 0x1CA8, - 0x1CC3, 0x34BA, 0x34AF, 0x34C8, 0x34C9, 0x34CA, 0x34CB, 0x34C4, 0x34C5, 0x34C6, - 0x34C7, 0x34C0, 0x34C1, 0x34C2, 0x34C3, 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x349B, - 0x349C, 0x349D, 0x349E, 0x3497, 0x3498, 0x3499, 0x349A, 0x3493, 0x3494, 0x3495, - 0x3496, 0x348F, 0x3490, 0x3491, 0x3492, 0x34AB, 0x1F5C, 0x34A8, 0x34A9, 0x34A2, - 0x0B07, 0x0B08, 0x0B09, 0x0B05, 0x0AFE, 0x1F30, 0x1F35, 0x1F3A, 0x1F3F, 0x1F1C, - 0x1F2B, 0x1F08, 0x0F3B, 0x1F51, 0x1F52, 0x1F53, 0x1F4C, 0x0F5D, 0x1F48, 0x1EF9, - 0x1EE5, 0x1EEA, 0x1EEF, 0x1ECC, 0x1ED1, 0x1ED6, 0x0F88, 0x1EDB, 0x1EB8, 0x3526, - 0x3527, 0x2421, 0x2422, 0x2423, 0x241C, 0x241D, 0x241E, 0x241F, 0x2418, 0x2419, - 0x241A, 0x241B, 0x2414, 0x2415, 0x2416, 0x2417, 0x23F0, 0x23F1, 0x23F2, 0x23F3, - 0x0C81, 0x23EC, 0x23ED, 0x23EE, 0x23EF, 0x23E8, 0x23E9, 0x23EA, 0x23EB, 0x23E4, - 0x23E5, 0x23E6, 0x23E7, 0x2400, 0x23F9, 0x23FA, 0x23FB, 0x23F4, 0x23D1, 0x23D2, - 0x23D3, 0x23CC, 0x23CD, 0x23CE, 0x23CF, 0x23C8, 0x23CB, 0x23C4, 0x23C5, 0x3AA2, - 0x3ABB, 0x3AB9, 0x3AB2, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A89, 0x3A8A, 0x3A8B, 0x24CE, - 0x24C4, 0x24DD, 0x24DE, 0x24DF, 0x24D7, 0x24D9, 0x24DA, 0x24DB, 0x24D3, 0x24C5, - 0x24D4, 0x24D6, 0x24CF, 0x24D0, 0x24D1, 0x24D2, 0x24A4, 0x24A5, 0x24A6, 0x24A8, - 0x24A2, 0x24A3, 0x24E1, 0x24E3, 0x249D, 0x249E, 0x249F, 0x24A0, 0x249A, 0x249B, - 0x249C, 0x24E5, 0x24B6, 0x24B9, 0x24E8, 0x248E, 0x2487, 0x3743, 0x373F, 0x371C, - 0x371D, 0x371E, 0x371A, 0x248F, 0x372B, 0x1D07, 0x1CFD, 0x3723, 0x36FE, 0x36FF, - 0x3700, 0x36FA, 0x36FB, 0x36FC, 0x36FD, 0x36F6, 0x36F7, 0x36F8, 0x36F2, 0x36F3, - 0x36F4, 0x3704, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37B2, 0x37B3, 0x37B4, 0x37B5, - 0x37AE, 0x37AF, 0x37B0, 0x37AB, 0x37AC, 0x1CE2, 0x1CE3, 0x1CE4, 0x1CDD, 0x1CD9, - 0x37BD, 0x3796, 0x3797, 0x3798, 0x3799, 0x3792, 0x3793, 0x3794, 0x3795, 0x378E, - 0x378F, 0x3790, 0x378B, 0x378C, 0x37A6, 0x379D, 0x3776, 0x3777, 0x3778, 0x3779, - 0x3772, 0x3773, 0x3774, 0x3775, 0x376E, 0x376F, 0x3770, 0x376B, 0x376C, 0x376D, - 0x3786, 0x3787, 0x3788, 0x3783, 0x3784, 0x377D, 0x3756, 0x3757, 0x3758, 0x3753, - 0x3754, 0x374D, 0x3766, 0x3767, 0x3768, 0x3769, 0x3762, 0x3763, 0x3764, 0x3765, - 0x375E, 0x375F, 0x3760, 0x3761, 0x375A, 0x375B, 0x375C, 0x00CE, 0x00CF, 0x00D0, - 0x00D1, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00C2, - 0x00C3, 0x00C4, 0x1E3E, 0x1E3F, 0x1E40, 0x1E39, 0x1E3B, 0x1E3C, 0x1E35, 0x0209, - 0x00B7, 0x00B8, 0x00B9, 0x0209, 0x0209, 0x00B4, 0x00B5, 0x00B6, 0x00B0, 0x00B1, - 0x00B2, 0x2229, 0x222A, 0x222B, 0x2224, 0x2225, 0x2226, 0x2227, 0x2220, 0x2221, - 0x2222, 0x2223, 0x221C, 0x2231, 0x2232, 0x2233, 0x4849, 0x222D, 0x222E, 0x222F, - 0x2208, 0x2219, 0x4885, 0x02AE, 0x0291, 0x0300, 0x02D0, 0x0372, 0x0346, 0x03BD, - 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, 0x0485, 0x053D, 0x0510, 0x0578, - 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, 0x06BE, 0x02A8, - 0x0267, 0x02EF, 0x02C6, 0x036D, 0x032A, 0x03B2, 0x0389, 0x040E, 0x03E2, 0x044C, - 0x0424, 0x049C, 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, 0x05AC, 0x065F, - 0x061A, 0x0694, 0x067F, 0x06D2, 0x06B2, 0x02AE, 0x0291, 0x0300, 0x02D0, 0x0372, - 0x0346, 0x03BD, 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, 0x0485, 0x053D, - 0x0510, 0x0578, 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, - 0x06BE, 0x02A8, 0x0267, 0x02EF, 0x02C6, 0x036D, 0x032A, 0x0865, 0x0389, 0x040E, - 0x03E2, 0x044C, 0x0424, 0x049C, 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, - 0x05AC, 0x065F, 0x061A, 0x0694, 0x067F, 0x06D2, 0x06B2, 0x02AE, 0x0291, 0x0300, - 0x02D0, 0x0372, 0x0346, 0x03BD, 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, - 0x0485, 0x053D, 0x0510, 0x0578, 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, - 0x0688, 0x221A, 0x221B, 0x2214, 0x2215, 0x2216, 0x2217, 0x2210, 0x2211, 0x2212, - 0x2213, 0x220C, 0x220D, 0x220E, 0x220F, 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21E4, - 0x21E5, 0x21E6, 0x21E7, 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21DC, 0x21DD, 0x21DE, - 0x21DF, 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21F4, 0x21F5, 0x21F6, 0x21F7, 0x21F0, - 0x21F1, 0x21F2, 0x21F3, 0x21EC, 0x21ED, 0x21EE, 0x21EF, 0x21C8, 0x21C9, 0x21CA, - 0x21CB, 0x21C4, 0x21C5, 0x21C6, 0x21C7, 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21BD, - 0x21BE, 0x21BF, 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21D4, 0x21D5, 0x21D6, 0x21D7, - 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x022B, 0x21CC, 0x21CD, 0x21CE, 0x21CF, 0x22A8, - 0x22A9, 0x22AA, 0x22AB, 0x22A4, 0x22A5, 0x22A6, 0x22A7, 0x22A0, 0x22A1, 0x22A2, - 0x22A3, 0x229C, 0x229D, 0x229E, 0x229F, 0x22B8, 0x22B9, 0x0578, 0x0554, 0x05E9, - 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, 0x06BE, 0x02A8, 0x0267, 0x02EF, - 0x02C6, 0x036D, 0x032A, 0x03B2, 0x0389, 0x22BA, 0x22BB, 0x044C, 0x0424, 0x049C, - 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, 0x05AC, 0x065F, 0x061A, 0x22B4, - 0x22B5, 0x22B6, 0x22B1, 0x22B2, 0x0FCE, 0x0FCC, 0x22B3, 0x22AC, 0x22AD, 0x0FC7, - 0x22AE, 0x22AF, 0x2288, 0x0FD6, 0x0FD5, 0x2289, 0x228A, 0x228B, 0x042D, 0x2284, - 0x2285, 0x100D, 0x100C, 0x100A, 0x0FDD, 0x2286, 0x2287, 0x0C84, 0x1006, 0x1005, - 0x2280, 0x0C7E, 0x0C8A, 0x0C93, 0x0C86, 0x0C92, 0x2281, 0x0C94, 0x2282, 0x0C97, - 0x2283, 0x0C95, 0x0C88, 0x1004, 0x0C79, 0x0C87, 0x1003, 0x227C, 0x227D, 0x227E, - 0x227F, 0x0412, 0x2298, 0x2299, 0x229A, 0x229B, 0x2294, 0x2295, 0x2296, 0x2297, - 0x2290, 0x03FB, 0x2291, 0x2292, 0x2D1B, 0x2293, 0x228C, 0x228D, 0x228E, 0x2D31, - 0x2D37, 0x07BF, 0x07F4, 0x0FCA, 0x228F, 0x0865, 0x0869, 0x0885, 0x07FA, 0x2268, - 0x2262, 0x100B, 0x2279, 0x0FC3, 0x227A, 0x227B, 0x2274, 0x2275, 0x2276, 0x2277, + 0x0781, 0x07BC, 0x0209, 0x075B, 0x07FE, 0x0802, 0x0760, 0x0765, 0x032D, 0x032C, + 0x032F, 0x0335, 0x0866, 0x0830, 0x03E7, 0x03E9, 0x0767, 0x0A68, 0x081A, 0x07FF, + 0x07F6, 0x07FB, 0x07F9, 0x07FD, 0x07C3, 0x07D9, 0x0749, 0x0763, 0x0767, 0x076C, + 0x0801, 0x080D, 0x0851, 0x0828, 0x0554, 0x0669, 0x076B, 0x06D2, 0x07EA, 0x0803, + 0x05BC, 0x0A7D, 0x07E2, 0x0856, 0x0300, 0x0897, 0x01DF, 0x05E9, 0x084C, 0x072F, + 0x0485, 0x04AB, 0x0510, 0x053D, 0x078C, 0x0792, 0x07C0, 0x07C6, 0x0578, 0x09C6, + 0x0688, 0x069C, 0x07F1, 0x076F, 0x023F, 0x023E, 0x0245, 0x024F, 0x024D, 0x024B, + 0x025D, 0x02C2, 0x061A, 0x065F, 0x0288, 0x0776, 0x0694, 0x05DD, 0x0600, 0x063C, + 0x02E8, 0x0493, 0x06B2, 0x0319, 0x04C1, 0x04CA, 0x04C7, 0x0313, 0x04D0, 0x05FB, + 0x05FA, 0x05FD, 0x03E5, 0x06A7, 0x06F5, 0x06AB, 0x089A, 0x0A44, 0x0767, 0x076C, + 0x0867, 0x089A, 0x0278, 0x07C2, 0x07D8, 0x07ED, 0x07AA, 0x07F8, 0x07FC, 0x07F2, + 0x04BF, 0x04BE, 0x0886, 0x0778, 0x01C9, 0x056A, 0x03BD, 0x083C, 0x0A62, 0x01A2, + 0x0198, 0x02D0, 0x067F, 0x02AE, 0x03CC, 0x036D, 0x0862, 0x0859, 0x082A, 0x07C5, + 0x0656, 0x0676, 0x0270, 0x0276, 0x086B, 0x027A, 0x04FA, 0x0269, 0x07F3, 0x02CC, + 0x026A, 0x0814, 0x06F6, 0x05A7, 0x04E9, 0x04A1, 0x02FA, 0x04E8, 0x04F4, 0x03CB, + 0x0766, 0x04F1, 0x061D, 0x06B4, 0x0622, 0x061F, 0x0761, 0x04EB, 0x0694, 0x061C, + 0x067F, 0x023D, 0x03FD, 0x0414, 0x07EE, 0x078D, 0x0760, 0x0765, 0x07BF, 0x076D, + 0x0783, 0x078F, 0x0832, 0x07C5, 0x085E, 0x083D, 0x0863, 0x022A, 0x0424, 0x044C, + 0x01F5, 0x061A, 0x0215, 0x021F, 0x0551, 0x0234, 0x082A, 0x0867, 0x086B, 0x065F, + 0x082F, 0x083B, 0x02F0, 0x032B, 0x07FE, 0x0802, 0x05DE, 0x061B, 0x0660, 0x0680, + 0x0832, 0x083D, 0x0292, 0x047F, 0x0769, 0x076E, 0x0816, 0x07F0, 0x0552, 0x0800, + 0x01DB, 0x05AD, 0x081B, 0x07F7, 0x0539, 0x07E7, 0x044D, 0x01BD, 0x0511, 0x056B, + 0x01C3, 0x01C1, 0x01F2, 0x080C, 0x02A9, 0x05CD, 0x02C7, 0x055D, 0x0827, 0x0816, + 0x036E, 0x038A, 0x03E4, 0x03E3, 0x040F, 0x0425, 0x03B3, 0x0885, 0x049D, 0x04E7, + 0x0534, 0x054E, 0x0819, 0x082F, 0x0850, 0x0861, 0x059A, 0x07ED, 0x06B3, 0x06A6, + 0x01F0, 0x0695, 0x081B, 0x0861, 0x06D3, 0x068D, 0x0253, 0x027E, 0x0240, 0x026B, + 0x0252, 0x027D, 0x02BE, 0x02C8, 0x02BF, 0x02C9, 0x02C1, 0x02CB, 0x02C0, 0x02CA, + 0x02DF, 0x02F1, 0x02E2, 0x02F4, 0x031F, 0x033B, 0x0312, 0x032E, 0x031B, 0x0337, + 0x031E, 0x033A, 0x0318, 0x0334, 0x0381, 0x038D, 0x0380, 0x038C, 0x0383, 0x038F, + 0x0384, 0x0390, 0x03A8, 0x03B4, 0x03AD, 0x03B9, 0x03D3, 0x03EB, 0x03B2, 0x03EE, + 0x03CE, 0x03E6, 0x03D4, 0x03ED, 0x03FC, 0x03EC, 0x03DF, 0x03F8, 0x040B, 0x0410, + 0x041F, 0x0428, 0x044E, 0x055C, 0x0450, 0x043D, 0x044F, 0x043F, 0x0456, 0x043E, + 0x0451, 0x0445, 0x049E, 0x0440, 0x04A3, 0x0490, 0x04A0, 0x0495, 0x0719, 0x0492, + 0x056A, 0x04BB, 0x04D4, 0x04FE, 0x04C0, 0x04EA, 0x04C9, 0x04F3, 0x04E4, 0x050E, + 0x055E, 0x056C, 0x0561, 0x056F, 0x055F, 0x056D, 0x059B, 0x05AE, 0x059D, 0x05B0, + 0x05A1, 0x05B4, 0x059E, 0x05B1, 0x05D1, 0x05E1, 0x05CE, 0x05DF, 0x05EB, 0x05EC, + 0x0606, 0x0628, 0x0609, 0x062B, 0x05FC, 0x061E, 0x0389, 0x049C, 0x0605, 0x0627, + 0x0608, 0x062A, 0x0679, 0x0683, 0x06A9, 0x06B6, 0x06D4, 0x06B7, 0x06D7, 0x06CA, + 0x047E, 0x06CD, 0x05A8, 0x06CC, 0x02B8, 0x02B0, 0x02B9, 0x02BA, 0x0714, 0x0715, + 0x02D8, 0x051F, 0x0306, 0x02D7, 0x030B, 0x0308, 0x06D1, 0x030A, 0x0353, 0x0350, + 0x037A, 0x0356, 0x039E, 0x0379, 0x03BF, 0x03A4, 0x0404, 0x0408, 0x0430, 0x0431, + 0x0476, 0x0463, 0x04B0, 0x064F, 0x052B, 0x04B1, 0x04DA, 0x0504, 0x03A5, 0x03A6, + 0x0545, 0x0546, 0x0711, 0x057B, 0x05C6, 0x0710, 0x05F0, 0x05C9, 0x05F1, 0x05F2, + 0x0630, 0x05F4, 0x0654, 0x060E, 0x06C3, 0x066F, 0x06DE, 0x06C2, 0x06ED, 0x06DD, + 0x06F0, 0x06F1, 0x0709, 0x06F3, 0x0712, 0x0713, 0x06FB, 0x05DA, 0x0728, 0x0727, + 0x072A, 0x0729, 0x02FD, 0x02FF, 0x045A, 0x02EC, 0x0448, 0x0459, 0x04A9, 0x04AA, + 0x0275, 0x049B, 0x03E8, 0x024A, 0x04F0, 0x03D0, 0x0620, 0x04C6, 0x0626, 0x05FE, + 0x0623, 0x0604, 0x0625, 0x0601, 0x0624, 0x0603, 0x034F, 0x0602, 0x024E, 0x0279, + 0x0251, 0x027C, 0x025F, 0x028A, 0x039A, 0x039B, 0x0382, 0x038E, 0x041E, 0x0427, + 0x04D2, 0x04FC, 0x04D3, 0x04FD, 0x06EC, 0x06EE, 0x02FE, 0x040C, 0x02EB, 0x02FC, + 0x037F, 0x038B, 0x0861, 0x03C0, 0x0491, 0x049F, 0x024C, 0x0277, 0x025E, 0x0289, + 0x04D1, 0x04FB, 0x07AA, 0x07C2, 0x07BF, 0x078F, 0x0783, 0x07C5, 0x07FC, 0x07F0, + 0x07F4, 0x081B, 0x07AA, 0x07C2, 0x07D8, 0x07FA, 0x0850, 0x0863, 0x085E, 0x0779, + 0x0749, 0x089A, 0x0861, 0x0763, 0x07ED, 0x076C, 0x078D, 0x0819, 0x0760, 0x0767, + 0x07ED, 0x076E, 0x082F, 0x0827, 0x083B, 0x082F, 0x0861, 0x0850, 0x0869, 0x0865, + 0x0816, 0x0885, 0x07C2, 0x0779, 0x0861, 0x07ED, 0x0819, 0x0827, 0x0765, 0x0760, + 0x076E, 0x0769, 0x078F, 0x0783, 0x07C5, 0x07BF, 0x07F0, 0x07E7, 0x07FA, 0x07F4, + 0x0802, 0x07FE, 0x081B, 0x0816, 0x07C5, 0x082A, 0x083D, 0x0832, 0x0863, 0x085E, + 0x086B, 0x0867, 0x07E7, 0x089A, 0x0763, 0x0749, 0x076C, 0x0767, 0x078D, 0x0779, + 0x07C2, 0x07AA, 0x07ED, 0x07D8, 0x07F8, 0x07F2, 0x0800, 0x07FC, 0x0819, 0x080C, + 0x082F, 0x0827, 0x083B, 0x082F, 0x0861, 0x0850, 0x0869, 0x0865, 0x07ED, 0x0885, + 0x07C2, 0x0779, 0x0861, 0x07ED, 0x0819, 0x0827, 0x0785, 0x0787, 0x0779, 0x07C2, + 0x01B1, 0x019D, 0x01E4, 0x01CF, 0x020E, 0x01FA, 0x0224, 0x021A, 0x0239, 0x022F, + 0x01B1, 0x019D, 0x01E4, 0x01CF, 0x020E, 0x01FA, 0x0224, 0x021A, 0x07F2, 0x07F8, + 0x076C, 0x0800, 0x080C, 0x0819, 0x0827, 0x082F, 0x07FE, 0x0802, 0x0850, 0x0861, + 0x082A, 0x07C5, 0x0832, 0x083D, 0x07FC, 0x083B, 0x0224, 0x021A, 0x0827, 0x082F, + 0x0760, 0x0765, 0x0769, 0x076E, 0x0783, 0x078F, 0x07BF, 0x07C5, 0x07E7, 0x07F0, + 0x05B7, 0x05A4, 0x0280, 0x0255, 0x0281, 0x0256, 0x033F, 0x0323, 0x0340, 0x0324, + 0x03F0, 0x03D7, 0x03F1, 0x03D8, 0x0502, 0x04D8, 0x0503, 0x04D9, 0x04F9, 0x04CF, + 0x06BA, 0x06AE, 0x0471, 0x04B7, 0x05F5, 0x0413, 0x02EA, 0x0550, 0x0295, 0x02D3, + 0x06C8, 0x06C7, 0x03B5, 0x03A9, 0x06E5, 0x0718, 0x0717, 0x02B1, 0x0645, 0x0675, + 0x034B, 0x034A, 0x0417, 0x0416, 0x055B, 0x055A, 0x0581, 0x0580, 0x04F8, 0x04CE, + 0x029A, 0x029C, 0x02A0, 0x02B7, 0x051E, 0x02D9, 0x0305, 0x0307, 0x0359, 0x0352, + 0x035A, 0x0355, 0x035B, 0x035F, 0x0360, 0x041A, 0x04B2, 0x030C, 0x0532, 0x0531, + 0x06E2, 0x06E1, 0x027B, 0x0250, 0x0311, 0x031C, 0x04F2, 0x04C8, 0x03CD, 0x0338, + 0x03CF, 0x03D1, 0x0652, 0x0489, 0x04AF, 0x04B6, 0x04AC, 0x052A, 0x06C9, 0x052E, + 0x04F7, 0x04CD, 0x0585, 0x0587, 0x02D2, 0x0464, 0x05EE, 0x05C1, 0x103C, 0x0DB8, + 0x0D7D, 0x0C6F, 0x1037, 0x0E0C, 0x1014, 0x1027, 0x0A7A, 0x0A79, 0x103E, 0x103F, + 0x0A54, 0x0A5D, 0x0A61, 0x0A67, 0x1040, 0x1021, 0x0CD1, 0x0D9B, 0x0CD6, 0x0CD3, + 0x1024, 0x0CD8, 0x1030, 0x0EB6, 0x0D9C, 0x0DB5, 0x0CD5, 0x102E, 0x1015, 0x0EB5, + 0x0A1A, 0x0A19, 0x0A5A, 0x0A58, 0x0A6B, 0x0764, 0x0A6E, 0x0A6D, 0x0A76, 0x0A75, + 0x0A72, 0x0A71, 0x0A55, 0x0A5F, 0x0A7C, 0x0A7B, 0x1039, 0x1034, 0x1033, 0x1038, + 0x0A83, 0x0A20, 0x0A6C, 0x1035, 0x0A08, 0x0A07, 0x0A22, 0x103D, 0x0768, 0x0A1F, + 0x0A1C, 0x0A1B, 0x09DC, 0x09E2, 0x09E9, 0x09F6, 0x0A09, 0x0A0B, 0x0473, 0x0A2D, + 0x0403, 0x0407, 0x03FE, 0x064E, 0x046B, 0x046F, 0x06C1, 0x06C0, 0x0A7E, 0x0A21, + 0x0A47, 0x0A84, 0x0A81, 0x0A82, 0x0A23, 0x0A43, 0x0989, 0x09AA, 0x0A4B, 0x0A50, + 0x098E, 0x0978, 0x09F7, 0x0A41, 0x02A3, 0x0396, 0x0399, 0x03A3, 0x02DE, 0x030F, + 0x0363, 0x037E, 0x03A7, 0x03CA, 0x0467, 0x041C, 0x078E, 0x048F, 0x040A, 0x04BD, + 0x0589, 0x039D, 0x03C2, 0x07AB, 0x074A, 0x058A, 0x07D4, 0x0515, 0x054C, 0x0583, + 0x0362, 0x064A, 0x043C, 0x0478, 0x058D, 0x058F, 0x0DAA, 0x0DB0, 0x0E41, 0x0DAB, + 0x0DA7, 0x0E06, 0x0E07, 0x0DAF, 0x0D99, 0x0DAE, 0x3242, 0x3243, 0x3245, 0x3250, + 0x3246, 0x3247, 0x2FAE, 0x3244, 0x324A, 0x324B, 0x3249, 0x324D, 0x324E, 0x324F, + 0x324C, 0x3251, 0x3252, 0x3253, 0x3254, 0x3260, 0x3256, 0x3257, 0x3258, 0x3259, + 0x325A, 0x325B, 0x2F27, 0x325D, 0x325E, 0x325F, 0x325C, 0x3261, 0x0CCC, 0x0D50, + 0x2FB0, 0x3286, 0x0F99, 0x0F9A, 0x0DAC, 0x3248, 0x0D88, 0x0D8B, 0x3265, 0x0DB7, + 0x0DAD, 0x0E08, 0x0E0B, 0x2FAF, 0x3272, 0x3273, 0x3275, 0x3280, 0x3276, 0x3277, + 0x3274, 0x3279, 0x327A, 0x327B, 0x3278, 0x327D, 0x0D4A, 0x327F, 0x327C, 0x3281, + 0x0D7B, 0x0D7C, 0x102B, 0x3287, 0x1032, 0x103B, 0x2FA8, 0x0D7E, 0x2FB1, 0x2FAA, + 0x0D45, 0x0D78, 0x2F90, 0x0E0D, 0x0D7A, 0x0FD9, 0x0E0E, 0x0EF5, 0x0E0A, 0x0E8B, + 0x0E8C, 0x0E8D, 0x0FDA, 0x0F64, 0x0F10, 0x0F13, 0x0C70, 0x1013, 0x0F65, 0x0F98, + 0x0F44, 0x0DB6, 0x327E, 0x3270, 0x0F14, 0x2FA5, 0x3266, 0x3267, 0x2FA7, 0x2FA4, + 0x326A, 0x326B, 0x326C, 0x326D, 0x326F, 0x2FA3, 0x3271, 0x2FA2, 0x101E, 0x2FA9, + 0x101D, 0x2FAB, 0x2FB6, 0x2FA6, 0x2FB8, 0x2FB9, 0x0988, 0x0933, 0x0931, 0x092E, + 0x2FBE, 0x2FBF, 0x2FAC, 0x2FAD, 0x2F4A, 0x2FC0, 0x2F4E, 0x095D, 0x2F47, 0x2F46, + 0x0932, 0x2F4F, 0x2F5A, 0x2F5B, 0x2F4D, 0x2F4B, 0x2F50, 0x2F51, 0x2F60, 0x2F61, + 0x2F53, 0x2F52, 0x2F55, 0x2F54, 0x2F5C, 0x2F5D, 0x2F59, 0x2F58, 0x2F44, 0x2F45, + 0x2F5E, 0x2F5F, 0x2F56, 0x2F57, 0x2F42, 0x2F43, 0x2F66, 0x2F62, 0x2F65, 0x2F64, + 0x2F67, 0x2F63, 0x2F48, 0x2F49, 0x0936, 0x2F6A, 0x2F6D, 0x2F6C, 0x2FB7, 0x095E, + 0x2F71, 0x2F70, 0x2F76, 0x2F72, 0x2F75, 0x2F74, 0x2F77, 0x2F73, 0x2F79, 0x2F78, + 0x2F7E, 0x2F7A, 0x2F7D, 0x2F7C, 0x2F7F, 0x2F7B, 0x2F81, 0x2F80, 0x3082, 0x3083, + 0x30A4, 0x30A5, 0x2F85, 0x30A3, 0x30A8, 0x30A9, 0x30A2, 0x308A, 0x2F86, 0x2F8C, + 0x2F87, 0x2F9F, 0x0937, 0x0991, 0x2F82, 0x2F83, 0x2F84, 0x2FC1, 0x2F97, 0x2F96, + 0x2F88, 0x2F89, 0x2F9B, 0x2F9A, 0x2F9D, 0x2F9C, 0x30BE, 0x2F9E, 0x2FA1, 0x2FA0, + 0x30C0, 0x30C1, 0x092F, 0x2FBA, 0x2F8B, 0x2FB3, 0x0992, 0x2F8A, 0x2FB4, 0x2F8D, + 0x2FB5, 0x30BC, 0x30BA, 0x2FB2, 0x2F68, 0x2F69, 0x30B2, 0x30B3, 0x30B4, 0x30B5, + 0x30B6, 0x30B7, 0x2F91, 0x30BB, 0x2FBB, 0x2F8E, 0x30B8, 0x30BD, 0x30BF, 0x2FBD, + 0x2F8F, 0x30B9, 0x2FEA, 0x2FEB, 0x2FEC, 0x2FED, 0x3046, 0x3047, 0x2FE6, 0x2FE7, + 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x2FEE, 0x2FEF, + 0x303A, 0x303B, 0x3054, 0x3055, 0x2FD6, 0x2FD7, 0x2FDC, 0x2FDD, 0x2FDA, 0x2FDB, + 0x2FE0, 0x2FE1, 0x2FF0, 0x2FF1, 0x3042, 0x3043, 0x3044, 0x3045, 0x3066, 0x3067, + 0x3048, 0x3049, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3052, 0x3053, 0x3074, 0x3075, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, + 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3084, 0x3085, + 0x3086, 0x3087, 0x3088, 0x3089, 0x3015, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3095, 0x3096, 0x3097, 0x3098, 0x3099, + 0x309A, 0x309B, 0x309C, 0x309D, 0x309E, 0x309F, 0x30A0, 0x30A1, 0x3012, 0x3013, + 0x3014, 0x3065, 0x3006, 0x3037, 0x3019, 0x3064, 0x303D, 0x300C, 0x3018, 0x300D, + 0x3036, 0x3040, 0x303C, 0x3041, 0x3072, 0x3073, 0x3068, 0x3069, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, + 0x0946, 0x0945, 0x09C9, 0x09C8, 0x093E, 0x093D, 0x09EF, 0x09EE, 0x09AF, 0x09AE, + 0x0966, 0x0965, 0x0974, 0x0973, 0x0A69, 0x0A6A, 0x2EED, 0x0B95, 0x0A89, 0x0A8A, + 0x099B, 0x099C, 0x09A8, 0x09A9, 0x09C2, 0x0A15, 0x09D6, 0x09D7, 0x09C3, 0x0A16, + 0x09BA, 0x09BB, 0x0959, 0x09A4, 0x09E6, 0x09E5, 0x095A, 0x09A5, 0x0B90, 0x0BA5, + 0x0B94, 0x0B92, 0x0BA3, 0x0B9D, 0x0B96, 0x0B99, 0x0BA1, 0x0B9F, 0x0B93, 0x0BAD, + 0x0BA9, 0x0BA7, 0x0B9B, 0x0BAB, 0x0BB1, 0x0BAF, 0x0BB5, 0x0BB3, 0x0BBD, 0x0BBB, + 0x0BC1, 0x0BBF, 0x0BC8, 0x0B97, 0x2ECC, 0x0BC7, 0x0BBC, 0x09DA, 0x0BC5, 0x0BC6, + 0x0BD6, 0x0BD4, 0x0BDA, 0x0BB0, 0x0BDE, 0x0BDC, 0x0BD8, 0x0BE0, 0x0BC3, 0x0BBE, + 0x0BC0, 0x0BC9, 0x0BCB, 0x0BCD, 0x0BD0, 0x0BD2, 0x0BC4, 0x2EDD, 0x0BC2, 0x0BCE, + 0x0A32, 0x0A31, 0x0B9C, 0x0B8F, 0x0C2C, 0x0C26, 0x091C, 0x0BD1, 0x0C23, 0x3025, + 0x3026, 0x3027, 0x3024, 0x0BAE, 0x302A, 0x302B, 0x302C, 0x302D, 0x302E, 0x302F, + 0x3030, 0x3031, 0x0BB4, 0x2ED4, 0x0BB2, 0x0B9A, 0x0A35, 0x0997, 0x0BD7, 0x0BD9, + 0x0BD3, 0x0BD5, 0x0BDF, 0x0B98, 0x0BDB, 0x0BDD, 0x303E, 0x0C61, 0x2EC3, 0x2EC4, + 0x0C1E, 0x0C21, 0x2EC7, 0x2EC8, 0x0968, 0x0967, 0x09A7, 0x09A6, 0x09B1, 0x09B0, + 0x09E1, 0x09E0, 0x2EC9, 0x2ECA, 0x099E, 0x099D, 0x2ED5, 0x2ED6, 0x2ED3, 0x2ED0, + 0x2ED8, 0x2ED9, 0x2ECD, 0x2ECB, 0x2EDC, 0x2ECE, 0x2EDE, 0x2EDF, 0x2ED1, 0x2ED2, + 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, 0x2EE6, 0x2EE7, 0x2EE4, 0x2EE5, 0x2EFA, 0x2EFB, + 0x2EEC, 0x2EEB, 0x2EE9, 0x2ECF, 0x2F00, 0x2EEA, 0x2EF2, 0x2EF3, 0x2EF4, 0x2EF5, + 0x2EFC, 0x2F01, 0x2EF8, 0x2EF9, 0x0C00, 0x2F0B, 0x2EFD, 0x2EE3, 0x2EF6, 0x2EF7, + 0x2EFE, 0x2EFF, 0x2F04, 0x2F03, 0x0BA6, 0x2F05, 0x2F08, 0x2F02, 0x2F09, 0x0BFA, + 0x0C03, 0x0BF9, 0x2F0C, 0x2F0D, 0x2F06, 0x2F07, 0x2F1D, 0x2F11, 0x2F14, 0x2F15, + 0x2F12, 0x2F13, 0x2F18, 0x2F19, 0x0C0B, 0x0BAA, 0x0B91, 0x0BAC, 0x0BF3, 0x0BF6, + 0x0C09, 0x0C05, 0x0BFE, 0x0BA0, 0x0BA2, 0x0BA4, 0x0C11, 0x0B9E, 0x0C0E, 0x0C14, + 0x0BEC, 0x0BEF, 0x0C15, 0x0C1C, 0x0C12, 0x0C20, 0x0BB6, 0x0C19, 0x0BE1, 0x0BE8, + 0x0C17, 0x0BA8, 0x0BCA, 0x0BCC, 0x0BFB, 0x0BFD, 0x2EE2, 0x2EE8, 0x2F1A, 0x2F1B, + 0x2F1C, 0x2F1F, 0x2F16, 0x2F17, 0x2F20, 0x2F21, 0x108C, 0x3202, 0x108E, 0x108F, + 0x0D9D, 0x1090, 0x3208, 0x3209, 0x3226, 0x3227, 0x322F, 0x0F04, 0x30D7, 0x0DBC, + 0x0DA3, 0x0E43, 0x0D40, 0x30D3, 0x322B, 0x3230, 0x322E, 0x0E61, 0x322A, 0x30D2, + 0x10A8, 0x3231, 0x0DB3, 0x322C, 0x321E, 0x10A7, 0x10A9, 0x10AA, 0x0D76, 0x30DF, + 0x1099, 0x109B, 0x323E, 0x30D6, 0x3224, 0x3225, 0x109E, 0x0D77, 0x316D, 0x31F0, + 0x31EE, 0x0D8D, 0x30D5, 0x30CD, 0x30DD, 0x3236, 0x3240, 0x3241, 0x3237, 0x2F2E, + 0x09D2, 0x0A5E, 0x2F2D, 0x09CE, 0x0979, 0x09CB, 0x2F30, 0x2F31, 0x2F2C, 0x09D0, + 0x09BC, 0x2F22, 0x097D, 0x2F25, 0x10A5, 0x09FF, 0x2F2F, 0x1096, 0x2F0A, 0x321F, + 0x2F24, 0x2F29, 0x2F0E, 0x2F0F, 0x2F10, 0x2F2A, 0x109F, 0x3153, 0x102A, 0x0A60, + 0x323C, 0x108D, 0x2F40, 0x2F28, 0x097E, 0x097A, 0x096F, 0x2F3B, 0x2F1E, 0x2F3A, + 0x2F41, 0x09FA, 0x2F26, 0x2F2B, 0x0A0E, 0x0970, 0x09D1, 0x2F3E, 0x2F38, 0x2F23, + 0x0A10, 0x09D3, 0x0A30, 0x0A0D, 0x0939, 0x0A0F, 0x0A53, 0x0A51, 0x0935, 0x0934, + 0x2F34, 0x2F35, 0x2F36, 0x2F37, 0x09DB, 0x2F3C, 0x2F3F, 0x2F33, 0x0A57, 0x0A56, + 0x2F32, 0x0938, 0x2F3D, 0x2F39, 0x0980, 0x097F, 0x1029, 0x102F, 0x09DF, 0x09DE, + 0x3154, 0x3159, 0x3177, 0x317B, 0x0E29, 0x0E0F, 0x092B, 0x103A, 0x0948, 0x0947, + 0x0998, 0x0A14, 0x099A, 0x0999, 0x1036, 0x0961, 0x0995, 0x0A02, 0x0A03, 0x0A13, + 0x0A2A, 0x0A29, 0x09F0, 0x0A36, 0x09E8, 0x09E7, 0x09BF, 0x09BE, 0x0A88, 0x0A87, + 0x0996, 0x09C4, 0x09A0, 0x0956, 0x0A12, 0x0A11, 0x09C5, 0x0A00, 0x09D9, 0x09D8, + 0x0A3A, 0x0A39, 0x0D83, 0x0E45, 0x0A3E, 0x0A3D, 0x0A40, 0x0A3F, 0x0D79, 0x0DE0, + 0x0928, 0x098F, 0x091E, 0x3167, 0x093C, 0x094D, 0x316B, 0x09BD, 0x09C0, 0x09B4, + 0x09B5, 0x0CD4, 0x0A37, 0x0A8B, 0x091F, 0x094F, 0x0920, 0x091D, 0x0957, 0x094B, + 0x0924, 0x0922, 0x0926, 0x0925, 0x0923, 0x0921, 0x0962, 0x0960, 0x0958, 0x0955, + 0x0A8C, 0x101F, 0x102C, 0x1026, 0x0993, 0x09A3, 0x09A2, 0x09C1, 0x1025, 0x1023, + 0x0954, 0x0994, 0x1028, 0x0A38, 0x32B0, 0x32A6, 0x09FD, 0x09F8, 0x32AA, 0x32AE, + 0x32AD, 0x0A2E, 0x32AF, 0x32B1, 0x0A01, 0x32AC, 0x09FE, 0x09F9, 0x102D, 0x09F1, + 0x1020, 0x1022, 0x1069, 0x106A, 0x1065, 0x1068, 0x106D, 0x106F, 0x106C, 0x108B, + 0x106B, 0x1081, 0x31C3, 0x1076, 0x31D8, 0x31D9, 0x107F, 0x106E, 0x1084, 0x1082, + 0x3255, 0x1085, 0x1083, 0x1080, 0x1089, 0x1088, 0x1079, 0x1066, 0x1077, 0x31DA, + 0x31D4, 0x31D5, 0x1087, 0x1067, 0x31D6, 0x31D7, 0x31DC, 0x31DD, 0x31D3, 0x31DB, + 0x31E0, 0x31DF, 0x31E1, 0x31D2, 0x1075, 0x31C2, 0x1072, 0x1074, 0x1071, 0x107D, + 0x31C4, 0x31C5, 0x31E6, 0x31ED, 0x107A, 0x107B, 0x31F6, 0x31E7, 0x31FC, 0x31FD, + 0x1070, 0x31EB, 0x1078, 0x107C, 0x31EA, 0x31EF, 0x31C8, 0x31C9, 0x31F7, 0x10A0, + 0x1092, 0x1097, 0x31DE, 0x31CD, 0x31EC, 0x31F1, 0x1098, 0x01DF, 0x01C9, 0x01A2, + 0x021F, 0x109A, 0x0CD2, 0x0234, 0x1091, 0x1093, 0x10A1, 0x10A2, 0x10A3, 0x10A4, + 0x109C, 0x109D, 0x321B, 0x1095, 0x3214, 0x3215, 0x1094, 0x1031, 0x3155, 0x321D, + 0x3212, 0x3213, 0x3216, 0x3205, 0x3203, 0x3217, 0x3218, 0x3219, 0x0198, 0x0209, + 0x022A, 0x0215, 0x107E, 0x1073, 0x3204, 0x10A6, 0x323A, 0x323B, 0x01F5, 0x323D, + 0x10AB, 0x10AC, 0x3220, 0x32A7, 0x321C, 0x3221, 0x32AB, 0x321A, 0x3200, 0x3201, + 0x097C, 0x0950, 0x0942, 0x0930, 0x094E, 0x096C, 0x0983, 0x0984, 0x09AB, 0x0952, + 0x09C7, 0x09F5, 0x108A, 0x098A, 0x09FC, 0x0A42, 0x094A, 0x094C, 0x0941, 0x092D, + 0x096B, 0x0A80, 0x0981, 0x0982, 0x097B, 0x1086, 0x09F4, 0x0951, 0x09B3, 0x09B9, + 0x09CD, 0x09D5, 0x0A48, 0x09E4, 0x09EB, 0x09FB, 0x09DD, 0x0A0C, 0x0A24, 0x0A2F, + 0x086A, 0x0A0A, 0x07E5, 0x0A52, 0x0740, 0x0990, 0x07A3, 0x07CF, 0x09B2, 0x0927, + 0x0929, 0x092C, 0x091B, 0x0949, 0x0953, 0x095F, 0x0987, 0x093A, 0x098D, 0x099F, + 0x0977, 0x09B8, 0x09CA, 0x09D4, 0x0817, 0x0823, 0x0833, 0x082D, 0x083A, 0x083E, + 0x085F, 0x0864, 0x0868, 0x086D, 0x07D3, 0x084B, 0x080A, 0x0847, 0x087E, 0x07EF, + 0x0762, 0x07C1, 0x085B, 0x085C, 0x085D, 0x0860, 0x0818, 0x07EC, 0x0822, 0x0821, + 0x078B, 0x078A, 0x0786, 0x0784, 0x0820, 0x081F, 0x089D, 0x089C, 0x08E2, 0x08E1, + 0x08EC, 0x08EB, 0x08EE, 0x08ED, 0x08F4, 0x08F3, 0x0902, 0x0901, 0x0908, 0x0907, + 0x0910, 0x090F, 0x07EB, 0x0826, 0x082E, 0x07E8, 0x07C4, 0x0A7F, 0x0A4D, 0x08A1, + 0x08A0, 0x0831, 0x081E, 0x081D, 0x082C, 0x0837, 0x0835, 0x0839, 0x32F5, 0x32D0, + 0x32C6, 0x32C7, 0x32F7, 0x32F4, 0x32CA, 0x32CB, 0x32CC, 0x32CD, 0x3282, 0x3283, + 0x32A8, 0x32A9, 0x3344, 0x3345, 0x3288, 0x3289, 0x3342, 0x3343, 0x334D, 0x334C, + 0x328E, 0x3347, 0x3290, 0x3346, 0x32CE, 0x32CF, 0x0C47, 0x0C46, 0x0C48, 0x3348, + 0x0D55, 0x3349, 0x334A, 0x334B, 0x0ECD, 0x0F8F, 0x1016, 0x0EA7, 0x0C50, 0x105E, + 0x32A2, 0x32A3, 0x32A4, 0x32A5, 0x32FF, 0x3330, 0x3268, 0x3269, 0x0FDB, 0x32FB, + 0x0C4C, 0x105F, 0x32C0, 0x0F66, 0x32F8, 0x32F9, 0x32B2, 0x32B3, 0x32B4, 0x32B5, + 0x32B6, 0x32B7, 0x32F6, 0x32B9, 0x32BA, 0x32BB, 0x32BC, 0x32BD, 0x32BE, 0x32BF, + 0x32C1, 0x32B8, 0x334F, 0x3350, 0x3351, 0x0C4B, 0x3331, 0x0C45, 0x3355, 0x3356, + 0x329A, 0x332C, 0x0CD7, 0x0ECF, 0x329E, 0x329F, 0x32FC, 0x3301, 0x3292, 0x3293, + 0x3294, 0x3295, 0x3296, 0x3297, 0x3298, 0x3299, 0x3285, 0x329B, 0x329C, 0x329D, + 0x3352, 0x3284, 0x32A0, 0x32A1, 0x0F45, 0x0DB9, 0x0CD9, 0x3327, 0x3361, 0x3362, + 0x0C99, 0x328F, 0x3360, 0x3365, 0x328C, 0x328B, 0x335F, 0x328A, 0x3291, 0x3366, + 0x3370, 0x3372, 0x336F, 0x3371, 0x32FA, 0x3376, 0x32FD, 0x3375, 0x3326, 0x0C49, + 0x32E5, 0x0C56, 0x0C4A, 0x32FE, 0x0C4F, 0x332D, 0x2636, 0x25B6, 0x25B7, 0x0C4E, + 0x0C57, 0x2635, 0x0C52, 0x25B1, 0x25A9, 0x25A7, 0x25A2, 0x0C58, 0x25A3, 0x25A8, + 0x0C4D, 0x25A1, 0x0C54, 0x25B0, 0x25B3, 0x25B2, 0x25BC, 0x25BD, 0x4495, 0x4492, + 0x25B9, 0x25B8, 0x0C51, 0x25BA, 0x44A9, 0x0215, 0x25C0, 0x449D, 0x25DB, 0x25E1, + 0x25A0, 0x25DA, 0x0C53, 0x44AB, 0x44AA, 0x44AF, 0x44D1, 0x0C55, 0x2634, 0x449C, + 0x25DC, 0x2703, 0x25A5, 0x263B, 0x4499, 0x44BD, 0x25D4, 0x25D3, 0x0C5A, 0x25D9, + 0x25D6, 0x25D7, 0x0CDA, 0x0CDB, 0x0F02, 0x0FD7, 0x1060, 0x1045, 0x25C3, 0x25DD, + 0x25ED, 0x25EE, 0x25E2, 0x0EFC, 0x0DBA, 0x0E8E, 0x25EC, 0x2620, 0x138B, 0x44C7, + 0x1063, 0x105D, 0x4498, 0x260A, 0x260B, 0x021F, 0x2626, 0x105C, 0x25FB, 0x2704, + 0x44B4, 0x0C59, 0x1042, 0x25F4, 0x261C, 0x261D, 0x2624, 0x2625, 0x2622, 0x2623, + 0x2627, 0x25FA, 0x2610, 0x2616, 0x0E62, 0x2615, 0x260D, 0x260C, 0x2617, 0x0D2A, + 0x25C2, 0x25EB, 0x2614, 0x25F2, 0x2619, 0x25C1, 0x2612, 0x2611, 0x1041, 0x1062, + 0x0DBB, 0x1046, 0x25DE, 0x104B, 0x25C7, 0x25C8, 0x4580, 0x25DF, 0x1384, 0x263A, + 0x12BE, 0x12BF, 0x25E0, 0x25F1, 0x44CE, 0x44B5, 0x44D0, 0x44CF, 0x12B6, 0x12B7, + 0x12C1, 0x12C9, 0x12C3, 0x12C2, 0x12C0, 0x12CE, 0x12C5, 0x12CF, 0x25EA, 0x446D, + 0x4430, 0x1548, 0x12C4, 0x12BD, 0x12C7, 0x12BB, 0x44FE, 0x0C9A, 0x2B27, 0x4481, + 0x0D94, 0x0EAE, 0x12F5, 0x12F6, 0x0C98, 0x0C9C, 0x32E3, 0x262F, 0x32E4, 0x32E9, + 0x0E42, 0x2B23, 0x12F0, 0x12EF, 0x441A, 0x2B21, 0x32E2, 0x32E8, 0x1D57, 0x2B22, + 0x262E, 0x12F1, 0x4450, 0x12F2, 0x4451, 0x2B24, 0x2637, 0x2B1D, 0x2B18, 0x441D, + 0x44C0, 0x44C1, 0x4489, 0x43A2, 0x4500, 0x44F6, 0x12C6, 0x3300, 0x4501, 0x4511, + 0x12DA, 0x12DD, 0x12E7, 0x12ED, 0x446A, 0x2B1F, 0x2B1E, 0x44FF, 0x44E4, 0x2B28, + 0x12C8, 0x44E5, 0x44D7, 0x44E0, 0x44D6, 0x44E1, 0x44DE, 0x44DB, 0x44DA, 0x44DD, + 0x44DC, 0x44DF, 0x022A, 0x0215, 0x022A, 0x021F, 0x0234, 0x0234, 0x0215, 0x021F, + 0x2699, 0x2696, 0x260E, 0x260F, 0x01C9, 0x01DF, 0x269F, 0x26A0, 0x269A, 0x2609, + 0x2607, 0x4502, 0x269E, 0x269D, 0x269B, 0x12D8, 0x44F5, 0x12D2, 0x12DB, 0x12D3, + 0x12E9, 0x12FA, 0x1307, 0x1302, 0x1308, 0x1309, 0x1303, 0x1306, 0x1305, 0x1304, + 0x1319, 0x131B, 0x26B2, 0x1318, 0x26B4, 0x26B3, 0x26B6, 0x26B5, 0x26B8, 0x26B7, + 0x26BA, 0x26B9, 0x130E, 0x26BB, 0x1313, 0x130F, 0x1315, 0x1314, 0x1317, 0x1316, + 0x1310, 0x1311, 0x1312, 0x131A, 0x131F, 0x1321, 0x2601, 0x25FE, 0x130B, 0x131D, + 0x2679, 0x2661, 0x2689, 0x2662, 0x01A2, 0x0198, 0x130D, 0x01C9, 0x31A4, 0x31A5, + 0x021F, 0x0215, 0x132F, 0x1334, 0x1327, 0x2618, 0x131C, 0x1333, 0x1336, 0x1335, + 0x1331, 0x1324, 0x31A9, 0x1325, 0x1326, 0x1337, 0x130A, 0x130C, 0x0198, 0x01A2, + 0x01DF, 0x0037, 0x01F5, 0x01C9, 0x0209, 0x31A8, 0x3182, 0x3183, 0x1323, 0x1338, + 0x31A2, 0x31A3, 0x3189, 0x0038, 0x003B, 0x003C, 0x318E, 0x131E, 0x318F, 0x0039, + 0x1320, 0x132E, 0x3192, 0x3193, 0x3194, 0x31B4, 0x31B2, 0x31B3, 0x3198, 0x3199, + 0x1328, 0x132C, 0x1322, 0x31B8, 0x132D, 0x31B9, 0x3190, 0x3191, 0x0A25, 0x0A26, + 0x0943, 0x0944, 0x09AC, 0x1329, 0x09B6, 0x09B7, 0x09CC, 0x09CF, 0x31B5, 0x09CF, + 0x09CC, 0x09CF, 0x003A, 0x09CC, 0x1330, 0x1332, 0x132A, 0x132B, 0x31B6, 0x31B7, + 0x31C0, 0x0234, 0x31BA, 0x31BB, 0x133E, 0x31C1, 0x1343, 0x133F, 0x31BE, 0x31BF, + 0x0A34, 0x133C, 0x0A33, 0x31BD, 0x0A45, 0x31BC, 0x2707, 0x1340, 0x133D, 0x3163, + 0x3164, 0x1341, 0x134C, 0x134A, 0x134F, 0x134E, 0x1351, 0x1350, 0x1354, 0x1352, + 0x1356, 0x1355, 0x3152, 0x3158, 0x3162, 0x3195, 0x3168, 0x3169, 0x317E, 0x317F, + 0x3180, 0x135F, 0x318B, 0x3176, 0x1364, 0x1363, 0x1366, 0x1365, 0x1369, 0x1367, + 0x317C, 0x3181, 0x136A, 0x317D, 0x1368, 0x1347, 0x317A, 0x1346, 0x095B, 0x3165, + 0x26D8, 0x270A, 0x3186, 0x3187, 0x26D2, 0x09F3, 0x318A, 0x095C, 0x09CC, 0x318D, + 0x0A2B, 0x09CF, 0x0A2C, 0x318C, 0x0976, 0x0975, 0x2706, 0x1381, 0x26DA, 0x0A3C, + 0x26D9, 0x25AC, 0x0972, 0x0971, 0x26E8, 0x0A27, 0x26BD, 0x093F, 0x134B, 0x4471, + 0x1353, 0x134D, 0x26BF, 0x136B, 0x0A46, 0x1362, 0x2702, 0x1380, 0x2708, 0x26C3, + 0x13CB, 0x26C4, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x3166, + 0x0234, 0x022A, 0x3170, 0x4467, 0x316C, 0x316A, 0x26BE, 0x2633, 0x316E, 0x316F, + 0x3171, 0x44BB, 0x26D5, 0x26D4, 0x26CF, 0x26D0, 0x26D1, 0x44B6, 0x26DB, 0x26DC, + 0x4466, 0x26D7, 0x136D, 0x26D6, 0x136F, 0x136E, 0x1371, 0x1370, 0x1373, 0x1372, + 0x1377, 0x1375, 0x1378, 0x05B9, 0x071B, 0x0569, 0x30D9, 0x44F7, 0x26EB, 0x30D4, + 0x26B1, 0x01C9, 0x44B3, 0x26EC, 0x25F6, 0x2681, 0x0577, 0x01DF, 0x0474, 0x44B2, + 0x137B, 0x2700, 0x137A, 0x063B, 0x05D8, 0x2613, 0x0619, 0x26FF, 0x050D, 0x1391, + 0x0475, 0x03C3, 0x1395, 0x1394, 0x1397, 0x1396, 0x003F, 0x1398, 0x139F, 0x1399, + 0x05A6, 0x0040, 0x139C, 0x139B, 0x05E7, 0x035C, 0x30DC, 0x25FD, 0x137F, 0x028C, + 0x02DD, 0x30DB, 0x0262, 0x0261, 0x30C4, 0x30C5, 0x070B, 0x1383, 0x03FF, 0x30D8, + 0x0290, 0x071A, 0x0209, 0x052C, 0x26E2, 0x06EA, 0x26E5, 0x06F9, 0x13BC, 0x136C, + 0x065E, 0x26E1, 0x1393, 0x26E6, 0x0439, 0x0668, 0x30E0, 0x30E1, 0x26FD, 0x14BA, + 0x13BE, 0x4457, 0x022A, 0x441C, 0x26F4, 0x06FA, 0x30DA, 0x052D, 0x26F3, 0x01F5, + 0x0A5B, 0x0400, 0x01DF, 0x01C9, 0x0650, 0x0706, 0x021F, 0x0215, 0x0234, 0x022A, + 0x06F7, 0x048D, 0x06FD, 0x054B, 0x003E, 0x0042, 0x0704, 0x06FE, 0x0705, 0x0703, + 0x0041, 0x446C, 0x1379, 0x139E, 0x0366, 0x003D, 0x0707, 0x06E9, 0x02FB, 0x2705, + 0x037D, 0x0708, 0x13CE, 0x137E, 0x13B3, 0x0394, 0x13B2, 0x01DF, 0x13AE, 0x13CC, + 0x13B7, 0x13CD, 0x13AD, 0x025C, 0x03C1, 0x13B0, 0x02D6, 0x13AC, 0x13B1, 0x26BC, + 0x13B4, 0x26FE, 0x13B5, 0x13AF, 0x43AF, 0x328D, 0x1559, 0x1541, 0x13BF, 0x153B, + 0x139A, 0x13A2, 0x13A3, 0x43A4, 0x43A5, 0x43B0, 0x13BB, 0x3263, 0x4513, 0x4547, + 0x0209, 0x43B1, 0x4395, 0x452F, 0x13B8, 0x43A9, 0x13B9, 0x43A3, 0x0375, 0x43B6, + 0x43F6, 0x43B4, 0x43B2, 0x43B3, 0x43B7, 0x43BA, 0x43B8, 0x43FA, 0x43B9, 0x43BC, + 0x43BD, 0x43BB, 0x13C9, 0x13AB, 0x43A8, 0x43AA, 0x43CD, 0x43A6, 0x04E3, 0x43A7, + 0x13A4, 0x13A5, 0x43FE, 0x049A, 0x43AE, 0x13A9, 0x13C5, 0x13C8, 0x13C6, 0x13C7, + 0x31B0, 0x4397, 0x31B1, 0x326E, 0x13C4, 0x4393, 0x4394, 0x4398, 0x4392, 0x0376, + 0x13B6, 0x0287, 0x43DF, 0x43FC, 0x13BD, 0x13BA, 0x13CA, 0x13C3, 0x43DB, 0x2709, + 0x4396, 0x04A8, 0x0963, 0x4409, 0x13C0, 0x13C1, 0x13C2, 0x270B, 0x13D0, 0x13CF, + 0x43D6, 0x270C, 0x26EE, 0x3264, 0x13D1, 0x13D2, 0x13D3, 0x13D4, 0x31AF, 0x13D5, + 0x31AC, 0x31AE, 0x43DA, 0x31A7, 0x31A6, 0x31AA, 0x3262, 0x31AB, 0x43CA, 0x43CB, + 0x43C6, 0x43CC, 0x31AD, 0x43C7, 0x43FB, 0x43FD, 0x13EB, 0x1464, 0x456D, 0x138C, + 0x43F7, 0x2017, 0x152A, 0x137D, 0x1526, 0x1388, 0x441F, 0x1524, 0x4428, 0x4416, + 0x1386, 0x4417, 0x441B, 0x44A2, 0x4421, 0x137C, 0x13E9, 0x442B, 0x4431, 0x4420, + 0x442D, 0x4425, 0x4429, 0x4415, 0x13EC, 0x4426, 0x452C, 0x1382, 0x4424, 0x442E, + 0x13EA, 0x4423, 0x441E, 0x4427, 0x442F, 0x4522, 0x4548, 0x13F5, 0x444D, 0x4521, + 0x4448, 0x13F9, 0x4414, 0x4444, 0x1392, 0x13FA, 0x4537, 0x1387, 0x13D6, 0x1523, + 0x211D, 0x022A, 0x4443, 0x4445, 0x0234, 0x4449, 0x4413, 0x01C9, 0x4418, 0x4419, + 0x442A, 0x4412, 0x1C95, 0x021F, 0x4442, 0x4447, 0x1D6E, 0x442C, 0x4472, 0x4550, + 0x4478, 0x1C98, 0x152D, 0x4479, 0x447A, 0x447B, 0x447D, 0x0215, 0x1525, 0x1C75, + 0x447C, 0x1529, 0x01F5, 0x0049, 0x1C80, 0x0198, 0x01A2, 0x1C79, 0x1C8E, 0x0209, + 0x4490, 0x4491, 0x1C9C, 0x1C9B, 0x4551, 0x1C7A, 0x1C9D, 0x1C9E, 0x1CA1, 0x1CA2, + 0x4475, 0x1C89, 0x4477, 0x4474, 0x1CA3, 0x4476, 0x004B, 0x004A, 0x1C7C, 0x01DF, + 0x1C8F, 0x4473, 0x448E, 0x1416, 0x1412, 0x1413, 0x1410, 0x4487, 0x4485, 0x4484, + 0x4446, 0x4486, 0x448A, 0x4488, 0x448B, 0x1539, 0x444C, 0x448C, 0x1408, 0x1409, + 0x448D, 0x1538, 0x4493, 0x140E, 0x1417, 0x4494, 0x140F, 0x4496, 0x153D, 0x1553, + 0x1415, 0x1546, 0x1547, 0x1407, 0x140C, 0x1551, 0x154D, 0x140D, 0x44A3, 0x154C, + 0x44A5, 0x44A4, 0x153F, 0x13FD, 0x1561, 0x44A8, 0x1560, 0x1537, 0x44B0, 0x1536, + 0x44B1, 0x44AE, 0x1555, 0x155C, 0x1562, 0x1563, 0x153E, 0x140B, 0x44B7, 0x153A, + 0x44B9, 0x44B8, 0x1545, 0x44BA, 0x140A, 0x44BC, 0x1544, 0x1414, 0x154A, 0x154B, + 0x1550, 0x13FB, 0x13FC, 0x13FF, 0x13FE, 0x44C6, 0x1400, 0x1401, 0x44CB, 0x44CA, + 0x44CD, 0x44CC, 0x1542, 0x1430, 0x141C, 0x1419, 0x1403, 0x1543, 0x153C, 0x1540, + 0x1431, 0x1421, 0x01DF, 0x0198, 0x1405, 0x021F, 0x1300, 0x1406, 0x01A2, 0x01C9, + 0x141A, 0x0215, 0x142B, 0x141B, 0x01A2, 0x12AB, 0x1418, 0x1428, 0x1427, 0x142D, + 0x1566, 0x1557, 0x1556, 0x142A, 0x1429, 0x142F, 0x12FF, 0x1554, 0x44F3, 0x44F2, + 0x1300, 0x44F4, 0x155A, 0x155B, 0x44F9, 0x44F8, 0x44FB, 0x44FA, 0x44FD, 0x44FC, + 0x1447, 0x1567, 0x144B, 0x144D, 0x1301, 0x142C, 0x4505, 0x4504, 0x4507, 0x4506, + 0x4509, 0x4508, 0x450B, 0x01C9, 0x450D, 0x450C, 0x450F, 0x450E, 0x1D5B, 0x4510, + 0x01A2, 0x01DF, 0x4515, 0x4514, 0x1D6C, 0x1D5A, 0x1D61, 0x1D60, 0x1D68, 0x021F, + 0x0209, 0x1D6F, 0x1D67, 0x1D66, 0x1D6D, 0x0234, 0x4523, 0x1D69, 0x4525, 0x4524, + 0x4527, 0x4526, 0x4529, 0x4528, 0x452B, 0x452A, 0x452D, 0x0198, 0x0215, 0x452E, + 0x4531, 0x4530, 0x1D4D, 0x1D73, 0x022A, 0x1D4B, 0x1D4F, 0x144C, 0x1D48, 0x1D46, + 0x1D51, 0x1D45, 0x1D4E, 0x1D47, 0x1D4A, 0x1D5E, 0x1D71, 0x1D50, 0x1D5F, 0x1D4C, + 0x1D5C, 0x1D5D, 0x1D52, 0x4546, 0x141D, 0x1420, 0x454B, 0x454A, 0x454D, 0x454C, + 0x141E, 0x454E, 0x2B19, 0x141F, 0x146A, 0x4517, 0x2B11, 0x2B12, 0x2B1B, 0x2B1A, + 0x4422, 0x1432, 0x4549, 0x144A, 0x1446, 0x01C9, 0x1468, 0x021F, 0x1422, 0x1469, + 0x0215, 0x142E, 0x022A, 0x0234, 0x01DF, 0x01C9, 0x1D70, 0x2B0D, 0x1D72, 0x2B0F, + 0x2B0E, 0x2B1C, 0x2B14, 0x2B10, 0x2B13, 0x2B15, 0x2B16, 0x4572, 0x4575, 0x4574, + 0x4577, 0x4576, 0x4579, 0x4578, 0x457B, 0x457A, 0x457D, 0x457C, 0x1478, 0x1472, + 0x2B26, 0x2B25, 0x2B17, 0x146C, 0x146D, 0x2B29, 0x4587, 0x4586, 0x1FFD, 0x146B, + 0x458B, 0x458A, 0x458D, 0x458C, 0x1FFE, 0x458E, 0x4591, 0x2001, 0x147F, 0x2003, + 0x149C, 0x147E, 0x2008, 0x1480, 0x200A, 0x2009, 0x200C, 0x200B, 0x1481, 0x147C, + 0x2010, 0x200F, 0x2012, 0x2011, 0x14A9, 0x1474, 0x149A, 0x2015, 0x2018, 0x1470, + 0x201A, 0x2019, 0x1471, 0x201B, 0x14A2, 0x146E, 0x2020, 0x201F, 0x1484, 0x1485, + 0x147B, 0x14A5, 0x2026, 0x2025, 0x1486, 0x1483, 0x1479, 0x147A, 0x1487, 0x202B, + 0x1482, 0x149E, 0x45D1, 0x45C7, 0x45C8, 0x45C9, 0x45C5, 0x45AE, 0x459E, 0x459F, + 0x01DF, 0x01A2, 0x45A1, 0x0209, 0x1423, 0x45AF, 0x45B0, 0x45B1, 0x1499, 0x149B, + 0x1411, 0x0050, 0x004E, 0x4783, 0x004F, 0x14A8, 0x146F, 0x0051, 0x004D, 0x0198, + 0x01DF, 0x004C, 0x149D, 0x0052, 0x1475, 0x0215, 0x005B, 0x1426, 0x1496, 0x1497, + 0x149F, 0x1498, 0x14A3, 0x1493, 0x1D87, 0x1D7F, 0x1DA7, 0x1D91, 0x1491, 0x1DBF, + 0x1D99, 0x14A0, 0x14A1, 0x1DBA, 0x1D8C, 0x1D80, 0x1DA1, 0x1D93, 0x1DA8, 0x1DA4, + 0x45CD, 0x14AA, 0x14A7, 0x14A4, 0x1425, 0x1424, 0x14D8, 0x14B0, 0x0234, 0x022A, + 0x14B6, 0x14AE, 0x1DBD, 0x1DB0, 0x4874, 0x14AF, 0x14DD, 0x14DE, 0x14AD, 0x14D7, + 0x14B2, 0x14AC, 0x14B8, 0x14B7, 0x14D9, 0x14B9, 0x14BC, 0x14BB, 0x30C7, 0x14BD, + 0x14B1, 0x14B4, 0x14BF, 0x14BE, 0x14C1, 0x14C0, 0x14C3, 0x14C2, 0x30C3, 0x14CD, + 0x14D6, 0x14C6, 0x14C9, 0x14CB, 0x14C7, 0x14DA, 0x14C8, 0x30DE, 0x1B37, 0x14B5, + 0x14B3, 0x1B43, 0x14C5, 0x14CF, 0x14C4, 0x1B61, 0x14D5, 0x14CA, 0x1B79, 0x14D4, + 0x14D3, 0x1B5B, 0x14CE, 0x14DB, 0x30C2, 0x14DC, 0x14DF, 0x1DD2, 0x1B4F, 0x1B8B, + 0x1B91, 0x45CE, 0x45D0, 0x022A, 0x0234, 0x1B73, 0x1B85, 0x45CA, 0x30C9, 0x45C6, + 0x45B9, 0x1DA3, 0x45B3, 0x45CB, 0x45CC, 0x45B2, 0x45CF, 0x45BF, 0x4724, 0x4665, + 0x1514, 0x1BA1, 0x47CD, 0x1513, 0x0215, 0x1DB8, 0x1DCE, 0x1DD1, 0x46C4, 0x1DA0, + 0x0209, 0x47C0, 0x01C9, 0x01F5, 0x0215, 0x0198, 0x4807, 0x01A2, 0x01A2, 0x0198, + 0x14CC, 0x01C9, 0x0234, 0x01F5, 0x021F, 0x01DF, 0x14D2, 0x022A, 0x0198, 0x1D98, + 0x1B67, 0x1B6D, 0x1515, 0x01C9, 0x45B4, 0x45B5, 0x1D92, 0x1DB3, 0x0198, 0x1DAF, + 0x45E3, 0x4848, 0x01DF, 0x4819, 0x1B7F, 0x4801, 0x30C6, 0x481E, 0x01C9, 0x0234, + 0x487B, 0x022A, 0x30C8, 0x021F, 0x30D0, 0x18EF, 0x30D1, 0x30FC, 0x1B9B, 0x1B9C, + 0x45B8, 0x1901, 0x30CA, 0x30CB, 0x30CC, 0x18F5, 0x1B98, 0x30CF, 0x18FB, 0x0E89, + 0x30F2, 0x30E3, 0x0F95, 0x0F96, 0x0FAA, 0x0EFD, 0x30F8, 0x30F9, 0x0EA8, 0x0EA4, + 0x30CE, 0x1017, 0x192B, 0x1931, 0x0EA6, 0x0F11, 0x1A8F, 0x1A95, 0x0F8B, 0x1913, + 0x1B9D, 0x1B9E, 0x0F03, 0x1AB3, 0x0F43, 0x0D4F, 0x4772, 0x190D, 0x0F41, 0x0F42, + 0x0F40, 0x1AB9, 0x0F0F, 0x0F90, 0x1018, 0x0F97, 0x30F7, 0x1919, 0x1B55, 0x30F5, + 0x30F4, 0x30FD, 0x1B9A, 0x1B49, 0x0EF4, 0x30F3, 0x30F6, 0x1907, 0x0FAF, 0x3116, + 0x0FC8, 0x0215, 0x0FB8, 0x3117, 0x2135, 0x47F0, 0x4730, 0x0FB5, 0x30E7, 0x0FC2, + 0x30E8, 0x0FB0, 0x0E58, 0x3121, 0x311D, 0x3103, 0x311B, 0x30E6, 0x311C, 0x0FD8, + 0x0ECE, 0x0EAF, 0x14FA, 0x46FF, 0x0EB0, 0x0EF3, 0x48BE, 0x0ECC, 0x0EFB, 0x0EED, + 0x4701, 0x4610, 0x0EA9, 0x30E5, 0x0E63, 0x0FC5, 0x30E2, 0x0FC1, 0x30FE, 0x1008, + 0x30E4, 0x3120, 0x0E78, 0x212B, 0x0EF6, 0x476A, 0x2129, 0x311A, 0x30E9, 0x30FF, + 0x0EF2, 0x2137, 0x3100, 0x0F9B, 0x475F, 0x30FB, 0x30FA, 0x3101, 0x1B3D, 0x3102, + 0x14F5, 0x0D8C, 0x0F67, 0x0F46, 0x1127, 0x1126, 0x112A, 0x0D67, 0x469F, 0x0C64, + 0x310A, 0x310B, 0x3110, 0x0F15, 0x310E, 0x310F, 0x0D98, 0x3111, 0x0FDC, 0x0C65, + 0x0FBB, 0x0D1E, 0x0CC2, 0x0C9D, 0x1012, 0x0C5B, 0x0C5E, 0x0D7F, 0x0C6B, 0x0D06, + 0x0C71, 0x0C9B, 0x480D, 0x0CDC, 0x0CA7, 0x3123, 0x3122, 0x4677, 0x0D56, 0x0C68, + 0x0CDF, 0x0C6E, 0x30EC, 0x30ED, 0x0D91, 0x100F, 0x0F12, 0x0D2B, 0x1010, 0x30F1, + 0x0F0A, 0x3133, 0x3134, 0x3135, 0x0D95, 0x1011, 0x3138, 0x1A74, 0x1A75, 0x4882, + 0x1A55, 0x20FB, 0x0E8F, 0x0ED0, 0x0EB9, 0x0FE3, 0x3107, 0x212D, 0x3104, 0x3105, + 0x0F09, 0x4814, 0x468C, 0x4818, 0x477F, 0x311E, 0x3109, 0x46D5, 0x311F, 0x215B, + 0x2159, 0x47B3, 0x2167, 0x2157, 0x474B, 0x4632, 0x460F, 0x4669, 0x4635, 0x47B0, + 0x471B, 0x45EE, 0x4685, 0x46A5, 0x46F0, 0x4753, 0x46B6, 0x4704, 0x4866, 0x47BB, + 0x4615, 0x48BC, 0x4681, 0x4698, 0x3108, 0x47CF, 0x483E, 0x14F4, 0x0D8E, 0x3106, + 0x476E, 0x4762, 0x45E5, 0x214F, 0x46AB, 0x4666, 0x46AE, 0x4737, 0x2163, 0x4678, + 0x4889, 0x4767, 0x4677, 0x48AA, 0x467D, 0x46E9, 0x464D, 0x310C, 0x488B, 0x310D, + 0x151A, 0x200E, 0x457E, 0x470F, 0x47AA, 0x4581, 0x457F, 0x145D, 0x4520, 0x2115, + 0x2014, 0x022C, 0x0236, 0x019A, 0x2013, 0x2109, 0x01DF, 0x4886, 0x210F, 0x0221, + 0x0198, 0x01A2, 0x2117, 0x445B, 0x210B, 0x445C, 0x021F, 0x1435, 0x1433, 0x4460, + 0x1439, 0x210D, 0x1517, 0x4461, 0x1434, 0x1C90, 0x143E, 0x445A, 0x1C9F, 0x0234, + 0x01A4, 0x01CB, 0x448F, 0x151E, 0x1465, 0x152F, 0x2141, 0x1437, 0x4872, 0x1438, + 0x152B, 0x1518, 0x1C96, 0x4834, 0x1BB7, 0x211B, 0x445E, 0x1462, 0x01F5, 0x152C, + 0x1532, 0x4732, 0x1530, 0x1461, 0x4470, 0x1516, 0x20ED, 0x1C91, 0x0CA5, 0x143D, + 0x20F1, 0x20F3, 0x2165, 0x215F, 0x1C8A, 0x14FB, 0x1C8C, 0x20EF, 0x4750, 0x2161, + 0x20FD, 0x20EB, 0x20E9, 0x20FF, 0x46E2, 0x2107, 0x01C9, 0x01A2, 0x2119, 0x01DF, + 0x20F9, 0x0198, 0x2121, 0x2123, 0x20F5, 0x2127, 0x0234, 0x214D, 0x022A, 0x0209, + 0x021F, 0x0EB7, 0x0D24, 0x0C5C, 0x0217, 0x0D23, 0x0FBC, 0x2105, 0x01DF, 0x0FC9, + 0x0FE4, 0x0D19, 0x0CC7, 0x0215, 0x215D, 0x2153, 0x2151, 0x0D25, 0x1BBE, 0x151C, + 0x1C94, 0x1C8B, 0x47E7, 0x4456, 0x445D, 0x151D, 0x1BD1, 0x1BD0, 0x191F, 0x4693, + 0x1019, 0x473F, 0x1BD2, 0x18A7, 0x0EF7, 0x445F, 0x18B3, 0x0EF8, 0x1967, 0x18B9, + 0x1BBA, 0x1BBB, 0x0FAB, 0x0FD2, 0x0C78, 0x1C93, 0x0FAC, 0x1937, 0x1997, 0x0FCF, + 0x0FD1, 0x0EFA, 0x0D49, 0x0FC4, 0x0C29, 0x18AD, 0x0EB1, 0x01E1, 0x0CCD, 0x022A, + 0x1C73, 0x1C72, 0x0D9A, 0x01F7, 0x020B, 0x0DB4, 0x01F5, 0x0FC6, 0x487C, 0x18D1, + 0x0FB1, 0x0209, 0x0215, 0x021F, 0x022A, 0x0234, 0x0E09, 0x0E44, 0x0E8A, 0x47A2, + 0x1CA0, 0x0FB6, 0x1007, 0x1BB4, 0x1BB6, 0x0EF9, 0x485C, 0x01A2, 0x1C9A, 0x0198, + 0x0FCD, 0x0FD0, 0x1BBF, 0x101B, 0x1BB9, 0x1949, 0x46C5, 0x1BB8, 0x1BB5, 0x1BA6, + 0x1009, 0x100E, 0x1925, 0x0FB7, 0x2BF8, 0x0EEE, 0x1A72, 0x1A73, 0x0FD4, 0x2BF3, + 0x2BFB, 0x01C9, 0x0F0D, 0x0FD3, 0x143A, 0x143C, 0x1A76, 0x1404, 0x1402, 0x01A2, + 0x0198, 0x01A2, 0x01F5, 0x0209, 0x01F5, 0x0209, 0x1002, 0x01DF, 0x0215, 0x021F, + 0x4817, 0x19AD, 0x2C32, 0x2C2C, 0x2C27, 0x0BB9, 0x01DF, 0x0BB7, 0x193D, 0x19B2, + 0x2C2D, 0x01DF, 0x2C31, 0x2C2E, 0x1943, 0x47E5, 0x488E, 0x46E4, 0x4857, 0x0F2D, + 0x45E9, 0x47A1, 0x4871, 0x48AE, 0x46B4, 0x45E1, 0x48A8, 0x4892, 0x0F07, 0x479D, + 0x2C24, 0x0D1F, 0x2BF1, 0x0D26, 0x0D1A, 0x476F, 0x0D27, 0x0D1D, 0x2BEA, 0x0C24, + 0x0EAD, 0x0D1B, 0x0EAC, 0x0BEA, 0x0C07, 0x0C1B, 0x0BE6, 0x0EAA, 0x2BA3, 0x2BCA, + 0x2BA1, 0x0EB4, 0x2BBE, 0x2BA4, 0x2BA5, 0x2BA6, 0x0EB3, 0x2BBF, 0x2BC0, 0x2BC3, + 0x2BC4, 0x2BCB, 0x0EAB, 0x2AA7, 0x2C0B, 0x0F77, 0x0D28, 0x0D4B, 0x47F6, 0x2BC7, + 0x1DB9, 0x0D20, 0x2BE0, 0x2BE1, 0x0D29, 0x0F5B, 0x2AAB, 0x2BE5, 0x2BE6, 0x2BE7, + 0x0EB2, 0x0D4C, 0x0D53, 0x0D46, 0x0D47, 0x0D44, 0x2BEB, 0x0D41, 0x0D42, 0x0D4E, + 0x2691, 0x0D54, 0x1C71, 0x1C84, 0x0D4D, 0x1C74, 0x1C77, 0x1C76, 0x1C7E, 0x2676, + 0x2675, 0x267C, 0x1C7D, 0x1C78, 0x1C83, 0x1C7F, 0x2BFF, 0x2BFE, 0x1C81, 0x1CA4, + 0x1C92, 0x1C82, 0x226E, 0x2C0C, 0x1C97, 0x1C99, 0x226F, 0x2C0F, 0x46F8, 0x469A, + 0x26AF, 0x2C26, 0x2694, 0x2692, 0x2C0E, 0x2248, 0x2C06, 0x26A9, 0x2693, 0x2BFD, + 0x2C07, 0x2C02, 0x2C01, 0x1C7B, 0x2C03, 0x2C04, 0x2C0A, 0x2C09, 0x26AA, 0x26A2, + 0x26A3, 0x26A4, 0x26A1, 0x26A6, 0x26A5, 0x26B0, 0x2BA2, 0x26A7, 0x26A8, 0x26AC, + 0x2B9F, 0x0BF2, 0x2B87, 0x26AB, 0x1230, 0x264C, 0x1FFF, 0x2007, 0x201E, 0x2000, + 0x2002, 0x2672, 0x0469, 0x1234, 0x46EF, 0x2004, 0x475E, 0x11F0, 0x11EF, 0x268F, + 0x2670, 0x2690, 0x0398, 0x046D, 0x2688, 0x046A, 0x266F, 0x0522, 0x2016, 0x048B, + 0x0514, 0x2029, 0x2BE2, 0x034D, 0x051D, 0x268A, 0x264E, 0x2678, 0x0349, 0x264F, + 0x2653, 0x267D, 0x2669, 0x2671, 0x267B, 0x201C, 0x0299, 0x267A, 0x2006, 0x264D, + 0x029E, 0x202A, 0x0374, 0x265D, 0x0348, 0x266A, 0x2660, 0x266B, 0x265C, 0x04B8, + 0x2665, 0x2666, 0x2667, 0x2668, 0x2663, 0x2652, 0x266C, 0x2664, 0x2021, 0x2BE8, + 0x4672, 0x0649, 0x46F9, 0x0C13, 0x0643, 0x0C1A, 0x2005, 0x0FBA, 0x46B9, 0x0642, + 0x0C1F, 0x0C2D, 0x0CCE, 0x0D1C, 0x0F00, 0x2685, 0x0D48, 0x0FB4, 0x477E, 0x4791, + 0x0D22, 0x0EEF, 0x0F01, 0x06A2, 0x0FB2, 0x0FAE, 0x268C, 0x01A2, 0x2684, 0x268D, + 0x2023, 0x472A, 0x201D, 0x0FB9, 0x0D43, 0x0F91, 0x0BE7, 0x0C18, 0x2C21, 0x0F94, + 0x0C0D, 0x0C10, 0x0C25, 0x0C28, 0x0C2E, 0x2024, 0x0F93, 0x0C08, 0x0BE3, 0x0C27, + 0x0234, 0x4480, 0x2B77, 0x2B7A, 0x2B79, 0x0C2B, 0x2B78, 0x2B9A, 0x2BD2, 0x2022, + 0x2B7D, 0x069F, 0x2B80, 0x0FB3, 0x0C2A, 0x0BE2, 0x2B9B, 0x2B9D, 0x2B8A, 0x2B90, + 0x2B8D, 0x2B8B, 0x0BF7, 0x0C22, 0x2B93, 0x2B94, 0x2B96, 0x2B98, 0x2B95, 0x2B86, + 0x2B99, 0x2B92, 0x200D, 0x0CC6, 0x0C66, 0x2B85, 0x0CC5, 0x0C1D, 0x0C67, 0x2249, + 0x0CCA, 0x2B7F, 0x0CC3, 0x2639, 0x0CCB, 0x1231, 0x1247, 0x2B7B, 0x1233, 0x2B81, + 0x1235, 0x2BCC, 0x122F, 0x124A, 0x1249, 0x1248, 0x124B, 0x124C, 0x124D, 0x0CC8, + 0x2BD8, 0x2B83, 0x0CC9, 0x2BFC, 0x2B84, 0x0CD0, 0x2B89, 0x0CCF, 0x2BE4, 0x0CC4, + 0x0C16, 0x0FAD, 0x2AD6, 0x0D21, 0x2B9E, 0x04BC, 0x2638, 0x1FBC, 0x1FBD, 0x1FBE, + 0x1FC6, 0x1FC0, 0x4829, 0x0D93, 0x4768, 0x481C, 0x0D8A, 0x0EF1, 0x1FBF, 0x461B, + 0x0D52, 0x1FC2, 0x2B88, 0x474E, 0x265E, 0x0EF0, 0x0D51, 0x0D8F, 0x0D97, 0x0D96, + 0x022A, 0x0F05, 0x0EFF, 0x4835, 0x4867, 0x1FC3, 0x1FC4, 0x1FC5, 0x1D9C, 0x0F06, + 0x0F8E, 0x0F8D, 0x265F, 0x4699, 0x1DE9, 0x2BCF, 0x101A, 0x2BDB, 0x0F92, 0x4606, + 0x2BDF, 0x2AA3, 0x4842, 0x2BE3, 0x461C, 0x48A4, 0x486F, 0x1D8E, 0x45E0, 0x465D, + 0x475B, 0x48B0, 0x4883, 0x1DD3, 0x467F, 0x4790, 0x4726, 0x4968, 0x1DC4, 0x2B8F, + 0x1125, 0x480E, 0x1232, 0x470F, 0x11D2, 0x0F3C, 0x47EA, 0x0F3E, 0x0F3D, 0x4714, + 0x0F3F, 0x0F60, 0x4628, 0x0F62, 0x0F61, 0x0F85, 0x0F63, 0x0F87, 0x0F86, 0x0F89, + 0x481B, 0x484B, 0x11CE, 0x4859, 0x4850, 0x11CD, 0x46F5, 0x11CF, 0x48BE, 0x462E, + 0x45FB, 0x4780, 0x022A, 0x0234, 0x0DA1, 0x4756, 0x45DD, 0x000F, 0x000B, 0x0016, + 0x0013, 0x0C80, 0x0C7F, 0x0C82, 0x2680, 0x0C89, 0x0C88, 0x0CB6, 0x0CB5, 0x0CB8, + 0x0CB7, 0x0CBA, 0x0CB9, 0x0CF8, 0x0CF7, 0x0CFC, 0x0CF9, 0x0CFE, 0x0CFD, 0x0D0F, + 0x0D0E, 0x0D11, 0x0D10, 0x0D13, 0x0D12, 0x0E9C, 0x0E9B, 0x0EC5, 0x0EC4, 0x1D62, + 0x0964, 0x0A49, 0x1D64, 0x1D6B, 0x0A86, 0x0969, 0x1D65, 0x0A78, 0x0A74, 0x11D1, + 0x0A70, 0x0A85, 0x0A4E, 0x0A5C, 0x0A77, 0x0A4F, 0x0A63, 0x0A65, 0x0A6F, 0x0A04, + 0x096A, 0x0A73, 0x0A06, 0x0A64, 0x0A66, 0x096D, 0x096E, 0x09AD, 0x0A4A, 0x0A1E, + 0x09CC, 0x0A1D, 0x0986, 0x0985, 0x45DB, 0x473B, 0x098B, 0x14F6, 0x1128, 0x098C, + 0x14F0, 0x14F7, 0x11F1, 0x1D43, 0x01F5, 0x4641, 0x0209, 0x1549, 0x11D0, 0x1129, + 0x4755, 0x11EE, 0x1D6A, 0x11ED, 0x4712, 0x1D53, 0x11EC, 0x2B20, 0x0F0E, 0x14E9, + 0x10F2, 0x10F1, 0x2131, 0x2133, 0x46FB, 0x470A, 0x4754, 0x4633, 0x2145, 0x4778, + 0x2101, 0x2103, 0x4702, 0x472A, 0x14EC, 0x478D, 0x14EA, 0x43AB, 0x4623, 0x14ED, + 0x14EE, 0x14F1, 0x43D1, 0x14E8, 0x14F2, 0x14F3, 0x14EF, 0x2143, 0x2125, 0x488D, + 0x4764, 0x213D, 0x4738, 0x1FC1, 0x2139, 0x01A2, 0x212F, 0x111C, 0x111F, 0x4399, + 0x1121, 0x1120, 0x1123, 0x1122, 0x477B, 0x112B, 0x112E, 0x4831, 0x1130, 0x214B, + 0x1132, 0x1131, 0x1135, 0x1134, 0x1137, 0x1136, 0x1139, 0x2149, 0x113B, 0x113A, + 0x2155, 0x1552, 0x48B2, 0x113D, 0x47AC, 0x1501, 0x14FC, 0x469D, 0x4793, 0x48A6, + 0x46EA, 0x0234, 0x022A, 0x1D56, 0x4880, 0x4743, 0x1502, 0x150E, 0x46F4, 0x14FD, + 0x14FE, 0x114B, 0x01F5, 0x0209, 0x114E, 0x4616, 0x1150, 0x114F, 0x1152, 0x460E, + 0x48B4, 0x1153, 0x115B, 0x1D58, 0x115D, 0x115C, 0x4811, 0x485B, 0x4617, 0x4830, + 0x14FF, 0x14EB, 0x150F, 0x485F, 0x1511, 0x1510, 0x1D7D, 0x48B1, 0x46BE, 0x1DC0, + 0x01C9, 0x01A2, 0x01DF, 0x116F, 0x0215, 0x1512, 0x0198, 0x021F, 0x1D55, 0x14F8, + 0x1500, 0x1DAD, 0x14F9, 0x0209, 0x1DD5, 0x01F5, 0x213F, 0x213B, 0x1180, 0x117F, + 0x2113, 0x2027, 0x2147, 0x0046, 0x46C8, 0x1D63, 0x2028, 0x489C, 0x2111, 0x211F, + 0x45FC, 0x4888, 0x46ED, 0x20F7, 0x4769, 0x47CB, 0x297A, 0x2979, 0x1194, 0x1193, + 0x1196, 0x1195, 0x1198, 0x1197, 0x119A, 0x1199, 0x119D, 0x119C, 0x119F, 0x119E, + 0x11A1, 0x11A0, 0x11A3, 0x11A2, 0x2975, 0x11A4, 0x11A6, 0x11A5, 0x11A8, 0x11A7, + 0x2976, 0x2974, 0x11AA, 0x11A9, 0x11AC, 0x11AB, 0x11AE, 0x11AD, 0x2981, 0x11AF, + 0x2983, 0x11B0, 0x11B2, 0x11B1, 0x11B4, 0x11B3, 0x297D, 0x297C, 0x11B6, 0x297E, + 0x11B8, 0x11B7, 0x11BA, 0x11B9, 0x2978, 0x11BB, 0x11BE, 0x11BD, 0x11C0, 0x11BF, + 0x11C2, 0x11C1, 0x297F, 0x11C3, 0x11C5, 0x11C4, 0x11C7, 0x11C6, 0x11C9, 0x11C8, + 0x11CB, 0x11CA, 0x2991, 0x2967, 0x11D6, 0x11D5, 0x2966, 0x2964, 0x298C, 0x2965, + 0x2992, 0x2993, 0x2968, 0x2969, 0x296A, 0x296D, 0x296E, 0x296F, 0x11E4, 0x11E3, + 0x11E6, 0x11E5, 0x296C, 0x2973, 0x11EA, 0x11E9, 0x2982, 0x2980, 0x11F5, 0x11F4, + 0x11F7, 0x11F6, 0x298E, 0x2985, 0x2986, 0x29B5, 0x29B4, 0x2997, 0x298A, 0x298B, + 0x29B8, 0x298F, 0x2984, 0x2987, 0x2970, 0x2971, 0x2972, 0x2989, 0x29A5, 0x29A1, + 0x29A0, 0x29BF, 0x29B7, 0x29A7, 0x2999, 0x299A, 0x299D, 0x299E, 0x29B6, 0x298D, + 0x299C, 0x29A2, 0x29A3, 0x2988, 0x29C4, 0x29C5, 0x29E7, 0x1D44, 0x29C7, 0x29C9, + 0x29CA, 0x021F, 0x01F5, 0x01C9, 0x29B0, 0x1D54, 0x1D49, 0x29B1, 0x1D59, 0x47C3, + 0x29F5, 0x29D8, 0x29F7, 0x29F6, 0x29F9, 0x29F8, 0x29DA, 0x29FA, 0x29FD, 0x29DE, + 0x29FF, 0x29FE, 0x2A01, 0x2A00, 0x1D75, 0x2A02, 0x2A05, 0x2A04, 0x29D6, 0x2A06, + 0x2A09, 0x2A08, 0x2A0B, 0x2A0A, 0x1D74, 0x2A0C, 0x2A0F, 0x29DF, 0x4863, 0x2990, + 0x474D, 0x463A, 0x4771, 0x0C5D, 0x29D4, 0x29DB, 0x0E1F, 0x0DEB, 0x0CBB, 0x0C69, + 0x0C6D, 0x0C6C, 0x0C8B, 0x0C7D, 0x0C72, 0x0E11, 0x0CA1, 0x0C9F, 0x2A25, 0x2A24, + 0x29A6, 0x2A26, 0x29A4, 0x2A28, 0x01A2, 0x29AB, 0x01DF, 0x01C9, 0x0209, 0x29AF, + 0x29A9, 0x0D3A, 0x0234, 0x29AA, 0x0DFE, 0x29AD, 0x29CB, 0x0E18, 0x29C2, 0x29B9, + 0x29BA, 0x29BB, 0x29BC, 0x29BD, 0x29BE, 0x000C, 0x29C0, 0x29C1, 0x29B2, 0x29C3, + 0x0E2B, 0x0DA5, 0x0E9D, 0x0E98, 0x0DBE, 0x0DC9, 0x0DD8, 0x0EC0, 0x0EBB, 0x0D5C, + 0x0E17, 0x29D5, 0x224A, 0x000E, 0x29A8, 0x0DE2, 0x0DF1, 0x0D70, 0x29AC, 0x29B3, + 0x0004, 0x0003, 0x29D7, 0x0008, 0x0D69, 0x0D86, 0x0010, 0x0012, 0x0D85, 0x29AE, + 0x0006, 0x000A, 0x2A2C, 0x2A2A, 0x2A30, 0x2A2E, 0x2A34, 0x2A32, 0x2A38, 0x2A36, + 0x2A3C, 0x2A3A, 0x2A40, 0x2A3E, 0x2A44, 0x2A42, 0x2A48, 0x2A46, 0x2A4C, 0x2A4A, + 0x2A50, 0x2A4E, 0x0D62, 0x0D31, 0x0E7D, 0x2A56, 0x2A5C, 0x2A5A, 0x2A60, 0x2A5E, + 0x0002, 0x2A62, 0x2A68, 0x2A66, 0x2A6C, 0x2A6A, 0x2A2B, 0x2A29, 0x0D58, 0x0D5B, + 0x0001, 0x2A31, 0x2A37, 0x2A35, 0x2A3B, 0x2A39, 0x0E39, 0x2A3D, 0x2A43, 0x0E32, + 0x2A47, 0x2A45, 0x2A4B, 0x2A49, 0x0DCF, 0x2A4D, 0x2A53, 0x2A51, 0x2A57, 0x2A55, + 0x2A5B, 0x2A59, 0x2A5F, 0x2A5D, 0x2A63, 0x2A61, 0x2A67, 0x2A65, 0x2A6B, 0x2A69, + 0x46E6, 0x29C8, 0x469C, 0x4774, 0x29D2, 0x466E, 0x29CC, 0x29CD, 0x4761, 0x29D1, + 0x29D0, 0x4719, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, + 0x0234, 0x022A, 0x4745, 0x0F5E, 0x0C63, 0x0C62, 0x224B, 0x46B3, 0x4782, 0x0C5F, + 0x22C0, 0x22C1, 0x29E0, 0x46DE, 0x0C60, 0x29C6, 0x22DA, 0x29E1, 0x0C6A, 0x0C7A, + 0x0D0A, 0x22DB, 0x29CE, 0x29CF, 0x473A, 0x29DC, 0x22C5, 0x22D4, 0x29D9, 0x22D6, + 0x29D3, 0x29E2, 0x22D3, 0x0D0D, 0x22D5, 0x22D8, 0x29DD, 0x46A8, 0x29E3, 0x0CFF, + 0x22D7, 0x0CB2, 0x0D08, 0x0CAF, 0x0CDE, 0x226A, 0x226B, 0x0CDD, 0x0CE1, 0x22C2, + 0x22C6, 0x22C7, 0x0CA9, 0x0CF1, 0x22CA, 0x2264, 0x22C4, 0x22CB, 0x2244, 0x221D, + 0x2BF5, 0x4802, 0x2AAC, 0x2BED, 0x492D, 0x2C11, 0x4865, 0x48E0, 0x48EA, 0x0015, + 0x2238, 0x2269, 0x2228, 0x0014, 0x0D32, 0x21FC, 0x21FF, 0x21FE, 0x0018, 0x21FD, + 0x2203, 0x2200, 0x0D14, 0x0017, 0x0D2D, 0x0CEE, 0x2206, 0x2201, 0x2202, 0x2207, + 0x222C, 0x2235, 0x2234, 0x2239, 0x221E, 0x2209, 0x220A, 0x223B, 0x2205, 0x047C, + 0x04E2, 0x0446, 0x2204, 0x2218, 0x220B, 0x01A3, 0x0199, 0x01E0, 0x01CA, 0x020A, + 0x01F6, 0x0220, 0x0216, 0x0235, 0x223A, 0x221F, 0x2236, 0x2237, 0x2CB5, 0x2CBA, + 0x2CBF, 0x2C96, 0x2CA8, 0x2D35, 0x2D2F, 0x2D29, 0x2D5C, 0x2C67, 0x2C9D, 0x2C82, + 0x2C6D, 0x2CAF, 0x2C7C, 0x2CCE, 0x2C74, 0x2C7E, 0x2230, 0x0553, 0x053C, 0x05B8, + 0x0575, 0x063A, 0x05E6, 0x2C69, 0x2C77, 0x06BD, 0x0698, 0x2C6F, 0x06DA, 0x2CA2, + 0x2C84, 0x2C8B, 0x2C90, 0x2BEF, 0x02A7, 0x225C, 0x225F, 0x4658, 0x46D7, 0x225D, + 0x2260, 0x025B, 0x02C4, 0x465C, 0x4890, 0x2267, 0x2261, 0x477A, 0x47BD, 0x2263, + 0x0386, 0x0365, 0x4731, 0x45E2, 0x473D, 0x2BF9, 0x46D1, 0x4861, 0x484F, 0x4779, + 0x47B8, 0x47FD, 0x4707, 0x2C28, 0x4873, 0x483A, 0x0329, 0x4722, 0x473E, 0x46FD, + 0x453A, 0x0D92, 0x02E6, 0x4710, 0x225E, 0x4536, 0x2278, 0x4540, 0x453D, 0x453B, + 0x4534, 0x4535, 0x4541, 0x453F, 0x0499, 0x453C, 0x03B1, 0x4785, 0x4720, 0x03DB, + 0x480F, 0x0422, 0x040D, 0x471C, 0x453E, 0x483E, 0x454F, 0x2CC9, 0x2CC4, 0x2CD6, + 0x2CD1, 0x2CDF, 0x4781, 0x2CE6, 0x2CE2, 0x2CEC, 0x4562, 0x4571, 0x2CF4, 0x4568, + 0x2D04, 0x4553, 0x456E, 0x2D1F, 0x4566, 0x2D25, 0x2D22, 0x456F, 0x2D2B, 0x2D3C, + 0x4565, 0x2D44, 0x2D40, 0x2D4C, 0x2D48, 0x2D5F, 0x2D52, 0x2265, 0x4564, 0x0D82, + 0x456C, 0x4567, 0x4569, 0x4563, 0x4555, 0x0DA6, 0x0D6D, 0x22B0, 0x0D6C, 0x2266, + 0x22B7, 0x4554, 0x2977, 0x4558, 0x0D81, 0x2A81, 0x4552, 0x2A87, 0x2A84, 0x4559, + 0x0DA0, 0x4844, 0x458F, 0x01DF, 0x48C5, 0x0D9F, 0x01C9, 0x1DD0, 0x456A, 0x456B, + 0x4570, 0x4590, 0x0EBF, 0x2B33, 0x2B30, 0x2B39, 0x2B36, 0x2B3F, 0x2B3C, 0x0B4C, + 0x2A9D, 0x2B45, 0x2B42, 0x2B4B, 0x2B48, 0x2B51, 0x2B4E, 0x0E97, 0x46E5, 0x46EB, + 0x0B4F, 0x0B55, 0x2AB3, 0x0E91, 0x2A91, 0x2AA6, 0x23B2, 0x4799, 0x2AA0, 0x46A3, + 0x2B6C, 0x471C, 0x0ED2, 0x23B3, 0x4764, 0x46AD, 0x4622, 0x46A7, 0x2A73, 0x46C3, + 0x45D9, 0x2245, 0x46E8, 0x47BC, 0x462B, 0x2A76, 0x23B0, 0x2246, 0x45EC, 0x481A, + 0x0198, 0x01A2, 0x2247, 0x0EC6, 0x4841, 0x478B, 0x48C8, 0x0EDC, 0x0F17, 0x4607, + 0x0EE4, 0x461E, 0x23AA, 0x0F24, 0x0F35, 0x2392, 0x23AE, 0x36F5, 0x3724, 0x23A8, + 0x36F9, 0x23AD, 0x3725, 0x3709, 0x3729, 0x372A, 0x372D, 0x370D, 0x370E, 0x370F, + 0x3710, 0x3702, 0x3701, 0x23A5, 0x3703, 0x3707, 0x3705, 0x23A9, 0x23A6, 0x370C, + 0x23B1, 0x23A4, 0x370B, 0x370A, 0x3706, 0x3708, 0x23AB, 0x3721, 0x23B4, 0x23B5, + 0x23BC, 0x23AF, 0x23B8, 0x3720, 0x3727, 0x23BB, 0x23AC, 0x23BD, 0x23BE, 0x23BF, + 0x23C0, 0x3726, 0x23C2, 0x23C3, 0x2384, 0x2385, 0x2383, 0x2387, 0x237D, 0x2378, + 0x2348, 0x2389, 0x2386, 0x22CF, 0x237F, 0x237E, 0x3722, 0x238B, 0x2388, 0x372F, + 0x23A2, 0x2394, 0x237A, 0x23A3, 0x239B, 0x23A1, 0x2379, 0x2398, 0x239D, 0x238F, + 0x239F, 0x239C, 0x23A0, 0x238A, 0x239E, 0x373D, 0x2393, 0x3745, 0x373E, 0x237B, + 0x373C, 0x3741, 0x2374, 0x3742, 0x3747, 0x3731, 0x238E, 0x2C2F, 0x238C, 0x238D, + 0x3730, 0x3711, 0x2377, 0x3713, 0x3714, 0x3717, 0x22BD, 0x3740, 0x3712, 0x3719, + 0x371B, 0x3746, 0x3744, 0x2376, 0x3716, 0x3715, 0x371F, 0x2C29, 0x372E, 0x23B7, + 0x2BE9, 0x2C2B, 0x3739, 0x22D1, 0x23B6, 0x3728, 0x236C, 0x3718, 0x23BA, 0x23C1, + 0x372C, 0x2BEE, 0x2372, 0x2373, 0x22CE, 0x374B, 0x23A7, 0x374A, 0x3751, 0x22CD, + 0x374C, 0x3755, 0x3752, 0x3759, 0x2BF6, 0x374F, 0x374E, 0x23B9, 0x3750, 0x2C2A, + 0x22BC, 0x375D, 0x22BE, 0x22BF, 0x2390, 0x2365, 0x2240, 0x22C3, 0x2363, 0x2C22, + 0x2391, 0x2366, 0x2BF4, 0x236F, 0x2369, 0x236B, 0x22CC, 0x236D, 0x376A, 0x22D2, + 0x236E, 0x3771, 0x2BEC, 0x22D0, 0x2380, 0x2382, 0x22D9, 0x2371, 0x237C, 0x2381, + 0x2367, 0x2368, 0x377A, 0x377B, 0x377C, 0x3781, 0x377E, 0x377F, 0x3780, 0x3785, + 0x3782, 0x2405, 0x23C6, 0x23C7, 0x23C9, 0x3789, 0x248D, 0x23CA, 0x378A, 0x378D, + 0x23D4, 0x3733, 0x3735, 0x3791, 0x3734, 0x3736, 0x3737, 0x3738, 0x373B, 0x3748, + 0x3732, 0x248C, 0x373A, 0x379B, 0x379A, 0x23D7, 0x379C, 0x379F, 0x379E, 0x37A1, + 0x37A0, 0x37A3, 0x37A2, 0x37A5, 0x37A4, 0x37A7, 0x3749, 0x37A9, 0x37A8, 0x23F7, + 0x37AA, 0x37AD, 0x24A9, 0x23F5, 0x23F6, 0x37B1, 0x24B1, 0x24AF, 0x24B8, 0x24B2, + 0x24B4, 0x24B5, 0x24AE, 0x23DC, 0x24B7, 0x37BB, 0x37BA, 0x23E1, 0x37BC, 0x37BF, + 0x37BE, 0x37C1, 0x37C0, 0x37C3, 0x37C2, 0x23DE, 0x37C4, 0x2407, 0x2420, 0x240A, + 0x23E3, 0x2406, 0x0209, 0x23D5, 0x23D6, 0x0096, 0x0097, 0x23D9, 0x00AB, 0x23DB, + 0x0092, 0x23DD, 0x0099, 0x23DF, 0x23D8, 0x23DA, 0x0098, 0x008B, 0x23FE, 0x008D, + 0x008C, 0x008A, 0x23E0, 0x0091, 0x0090, 0x0095, 0x01DF, 0x01F5, 0x021F, 0x008E, + 0x008F, 0x0094, 0x0093, 0x01C9, 0x009A, 0x0215, 0x009C, 0x009B, 0x0234, 0x022A, + 0x01A2, 0x00A3, 0x23FF, 0x00A5, 0x00A4, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x23E2, + 0x24AA, 0x2489, 0x2482, 0x2481, 0x2480, 0x2485, 0x2483, 0x00AC, 0x00A2, 0x2486, + 0x24AD, 0x00A7, 0x00A6, 0x00A9, 0x00A8, 0x01C9, 0x00AE, 0x00AF, 0x01A2, 0x00B3, + 0x01C9, 0x248B, 0x01C9, 0x2A54, 0x2404, 0x2409, 0x0209, 0x240B, 0x23D0, 0x2412, + 0x2408, 0x00BB, 0x00BA, 0x00C1, 0x00BC, 0x00BF, 0x00BE, 0x00BD, 0x00C0, 0x01A2, + 0x2354, 0x2431, 0x01A2, 0x01A2, 0x2358, 0x01C9, 0x24AC, 0x00AA, 0x240C, 0x00C5, + 0x0209, 0x24AB, 0x23F8, 0x2424, 0x2402, 0x2484, 0x23FC, 0x23FD, 0x2488, 0x248A, + 0x2401, 0x2403, 0x24D8, 0x00D4, 0x009D, 0x00D2, 0x00AD, 0x00D7, 0x00D3, 0x00D5, + 0x00D6, 0x24BE, 0x24BC, 0x00D9, 0x24BA, 0x2498, 0x24C1, 0x24BB, 0x00D8, 0x24C3, + 0x24C0, 0x2490, 0x24BF, 0x2492, 0x2491, 0x2496, 0x2493, 0x00DA, 0x2497, 0x24C8, + 0x0198, 0x2499, 0x24C7, 0x24DC, 0x2495, 0x2494, 0x24EA, 0x24E6, 0x24E7, 0x24EB, + 0x24EE, 0x24CB, 0x2355, 0x24A7, 0x24C6, 0x24CC, 0x11B5, 0x2353, 0x24CA, 0x2241, + 0x2356, 0x2410, 0x24EC, 0x24CD, 0x24E0, 0x24E9, 0x24ED, 0x24B0, 0x24E2, 0x24BD, + 0x24EF, 0x24A1, 0x24C9, 0x24B3, 0x24E4, 0x240E, 0x24C2, 0x24D5, 0x1CC5, 0x1CC4, + 0x1CC7, 0x1CC6, 0x1CC9, 0x1CC8, 0x1CCB, 0x1CCA, 0x1CCD, 0x1CCC, 0x1CCF, 0x1CCE, + 0x2242, 0x1CD0, 0x1CD2, 0x1CD1, 0x2243, 0x1CD3, 0x1CD4, 0x223C, 0x223D, 0x223E, + 0x223F, 0x2258, 0x2259, 0x114C, 0x225A, 0x225B, 0x2254, 0x2437, 0x2438, 0x2A3F, + 0x1CD6, 0x1CD5, 0x1CD8, 0x1CD7, 0x1CDA, 0x2425, 0x1CDC, 0x1CDB, 0x1CDE, 0x1D02, + 0x1CE0, 0x1CDF, 0x1D05, 0x1CE1, 0x1D06, 0x242B, 0x1CE6, 0x1CE5, 0x2255, 0x2439, + 0x2429, 0x2428, 0x2256, 0x2257, 0x2250, 0x242D, 0x242F, 0x2251, 0x2430, 0x2252, + 0x2253, 0x2339, 0x1CE8, 0x1BC1, 0x1CEA, 0x1CE9, 0x1CEC, 0x1CEE, 0x2413, 0x1CEB, + 0x240D, 0x1CE7, 0x1CF2, 0x240F, 0x242E, 0x1CF3, 0x1CED, 0x1CF1, 0x1CF8, 0x1CF7, + 0x1CFE, 0x3514, 0x1CFF, 0x2411, 0x34FB, 0x3501, 0x1CEF, 0x1CF0, 0x1D03, 0x1D04, + 0x1D01, 0x1CF4, 0x1CF5, 0x1CF6, 0x1BC0, 0x234A, 0x2432, 0x11BC, 0x3507, 0x34FE, + 0x3516, 0x3500, 0x3510, 0x3512, 0x2436, 0x2434, 0x1CFC, 0x34FF, 0x3523, 0x2433, + 0x1CF9, 0x242C, 0x1D08, 0x1CFB, 0x351D, 0x3529, 0x2357, 0x1CFA, 0x351B, 0x2435, + 0x2426, 0x351C, 0x351F, 0x2427, 0x242A, 0x1D00, 0x1E11, 0x1E14, 0x1E13, 0x1E12, + 0x1E15, 0x1E10, 0x1E17, 0x1E16, 0x1E29, 0x1E28, 0x1E1B, 0x1E1A, 0x1E2D, 0x1E19, + 0x1E2F, 0x1E2E, 0x1E21, 0x3505, 0x1E23, 0x1E1E, 0x1E1D, 0x1E24, 0x1E1F, 0x1E22, + 0x1E20, 0x1E2C, 0x1E2B, 0x1E2A, 0x1E18, 0x1E25, 0x1E26, 0x1E27, 0x224C, 0x1E34, + 0x224D, 0x1E31, 0x1E37, 0x1E38, 0x1E32, 0x1E36, 0x1E30, 0x224E, 0x2A41, 0x1E3A, + 0x1E1C, 0x1E3D, 0x29FB, 0x1118, 0x1E42, 0x1E43, 0x1E44, 0x1E41, 0x351E, 0x0B7F, + 0x111D, 0x3522, 0x1117, 0x3525, 0x3524, 0x3503, 0x3504, 0x3528, 0x224F, 0x0B4D, + 0x2349, 0x2328, 0x0085, 0x351A, 0x2A16, 0x0B50, 0x112F, 0x2A15, 0x1141, 0x2329, + 0x2A14, 0x1144, 0x2A1A, 0x3520, 0x1143, 0x2A17, 0x232A, 0x232B, 0x34B3, 0x1146, + 0x34A4, 0x1110, 0x2A1B, 0x34A7, 0x34AC, 0x34B0, 0x34AA, 0x2A1F, 0x34B2, 0x1E33, + 0x1142, 0x34A1, 0x01A2, 0x01C9, 0x01DF, 0x0198, 0x0209, 0x0215, 0x021F, 0x01F5, + 0x0234, 0x022A, 0x34A0, 0x349F, 0x34A3, 0x34A6, 0x34A5, 0x2A6D, 0x112C, 0x01C9, + 0x0198, 0x2324, 0x2A03, 0x01A2, 0x01DF, 0x01F5, 0x0234, 0x2325, 0x34AE, 0x34AD, + 0x0209, 0x022A, 0x021F, 0x0215, 0x1BC2, 0x2085, 0x2070, 0x2051, 0x2056, 0x2058, + 0x205E, 0x2083, 0x2066, 0x2069, 0x2071, 0x207B, 0x1BC3, 0x208C, 0x1A5B, 0x2087, + 0x206F, 0x1BBC, 0x022A, 0x0234, 0x19B3, 0x19E3, 0x29E6, 0x022A, 0x00DE, 0x29EF, + 0x00DC, 0x00DD, 0x34DC, 0x00DF, 0x00E0, 0x2326, 0x2067, 0x205D, 0x2086, 0x205C, + 0x2076, 0x2065, 0x2064, 0x2077, 0x204A, 0x207F, 0x2073, 0x207E, 0x2080, 0x2040, + 0x2045, 0x01A2, 0x01F5, 0x206B, 0x01C9, 0x0215, 0x34B1, 0x021F, 0x2068, 0x34B4, + 0x34B5, 0x34B6, 0x34B7, 0x34B8, 0x34B9, 0x34CF, 0x34BB, 0x0209, 0x208F, 0x208E, + 0x0234, 0x2090, 0x2037, 0x2034, 0x203F, 0x203D, 0x2044, 0x2042, 0x204E, 0x2049, + 0x2054, 0x00DB, 0x205A, 0x2055, 0x206C, 0x2052, 0x350B, 0x2075, 0x0AFF, 0x2093, + 0x2072, 0x3532, 0x3533, 0x0B03, 0x0B04, 0x207C, 0x0B0A, 0x206D, 0x0B06, 0x2053, + 0x2036, 0x2033, 0x2031, 0x203C, 0x2043, 0x2041, 0x2050, 0x2046, 0x204D, 0x350A, + 0x204F, 0x3509, 0x2059, 0x350D, 0x205B, 0x0209, 0x01A2, 0x2048, 0x0084, 0x2047, + 0x0AFB, 0x0AFC, 0x0AFD, 0x206A, 0x0B01, 0x2039, 0x0B02, 0x3517, 0x207D, 0x3519, + 0x3518, 0x2082, 0x01C9, 0x45B6, 0x01DF, 0x0B0F, 0x0B10, 0x2A07, 0x0215, 0x2327, + 0x45BC, 0x2320, 0x1A67, 0x1A61, 0x45BD, 0x1A6D, 0x0B00, 0x352B, 0x352D, 0x3531, + 0x352C, 0x0AF8, 0x3AC8, 0x0AFA, 0x352A, 0x3AC3, 0x0AF4, 0x0AF7, 0x3AC6, 0x3AC9, + 0x3AC7, 0x3530, 0x3ACA, 0x0AED, 0x0D80, 0x0AEE, 0x3AC2, 0x0AEB, 0x0AEC, 0x0AEF, + 0x0AF0, 0x3508, 0x0AF3, 0x0AF9, 0x0AF5, 0x0AF1, 0x0AF6, 0x0AF2, 0x0E10, 0x0E90, + 0x0D9E, 0x0EBA, 0x0CE0, 0x0DE1, 0x0D68, 0x0D07, 0x0E2A, 0x0D84, 0x0E79, 0x0E59, + 0x0F8C, 0x0CA6, 0x0EB8, 0x0EA5, 0x0CA8, 0x352F, 0x352E, 0x0D2C, 0x0B0D, 0x0F9C, + 0x0D57, 0x0B0E, 0x0FE5, 0x0B0C, 0x0F16, 0x0ED1, 0x0B0B, 0x0F47, 0x0E64, 0x3534, + 0x0E10, 0x0E90, 0x3A95, 0x3A82, 0x3A83, 0x3A81, 0x0D68, 0x3A85, 0x3A87, 0x3A9B, + 0x3AC5, 0x3AAE, 0x3A90, 0x3A86, 0x3A9C, 0x3A88, 0x3A9A, 0x3AA1, 0x3502, 0x3A94, + 0x3AC4, 0x0CA8, 0x0D57, 0x3A93, 0x34F9, 0x3A8C, 0x0F16, 0x34F7, 0x3A92, 0x3A91, + 0x3A98, 0x3A97, 0x3A96, 0x34FA, 0x3AB3, 0x0EBA, 0x3A84, 0x0DA4, 0x3AA6, 0x0D2C, + 0x3AB4, 0x2089, 0x3AB8, 0x3AB7, 0x00ED, 0x3ABA, 0x3ABC, 0x3511, 0x3ABE, 0x3AB0, + 0x3AAF, 0x0D2C, 0x3AB1, 0x3A9D, 0x3AB5, 0x3AB6, 0x0FE5, 0x0E46, 0x3A99, 0x3A9E, + 0x0F68, 0x0F47, 0x0E64, 0x0DBD, 0x0E10, 0x0E90, 0x3513, 0x3ABF, 0x0CE0, 0x0DE1, + 0x0D68, 0x0D07, 0x3AC0, 0x350C, 0x0E79, 0x350E, 0x1CBA, 0x3AAC, 0x1CA6, 0x3515, + 0x350F, 0x1CB9, 0x0E10, 0x1CB3, 0x0E90, 0x0D07, 0x0CE0, 0x0D68, 0x0DE1, 0x34FD, + 0x01A2, 0x01C9, 0x34F8, 0x00EF, 0x00EE, 0x3AC1, 0x34FC, 0x3A9F, 0x3AA0, 0x3521, + 0x3AAA, 0x3AA3, 0x1CB7, 0x3AA5, 0x3506, 0x3AA7, 0x1CB8, 0x3AA9, 0x0D80, 0x1CBC, + 0x1CBE, 0x3AA4, 0x3ABD, 0x3AAB, 0x1E4F, 0x0D2C, 0x0FBD, 0x1E4B, 0x0D57, 0x0DA4, + 0x0FE5, 0x0E46, 0x0F16, 0x3AA8, 0x0F68, 0x0F47, 0x0E64, 0x0DBD, 0x3AAD, 0x1E50, + 0x1E4A, 0x1E45, 0x1E48, 0x1E47, 0x1CBB, 0x1E4C, 0x1CBD, 0x0D2C, 0x1CBF, 0x1CC0, + 0x1CC1, 0x1CC2, 0x0E79, 0x1CAE, 0x1CB2, 0x0CA8, 0x0C9E, 0x0D07, 0x0DA4, 0x0FBD, + 0x0F9C, 0x0D57, 0x0FE5, 0x0CE0, 0x0E46, 0x0F16, 0x0F68, 0x2035, 0x0F47, 0x0EBA, + 0x0D68, 0x2084, 0x0D9E, 0x0E90, 0x2074, 0x0DBD, 0x1E49, 0x0E64, 0x2079, 0x0E59, + 0x1E4D, 0x1E4E, 0x1E53, 0x0E2A, 0x0D84, 0x1E52, 0x0E10, 0x1E54, 0x1F49, 0x1E77, + 0x1E7C, 0x1F4A, 0x1E86, 0x1E6D, 0x1E72, 0x1E81, 0x1E95, 0x1E68, 0x1E9F, 0x1EB3, + 0x0215, 0x1E8B, 0x1EA4, 0x1F4F, 0x1EBD, 0x1E90, 0x1EC7, 0x1EC2, 0x01A2, 0x01C9, + 0x01DF, 0x1EAE, 0x021F, 0x1EE0, 0x1E9A, 0x1EA9, 0x0198, 0x1EF4, 0x1F03, 0x1EFE, + 0x3560, 0x356A, 0x1F17, 0x357A, 0x355E, 0x3574, 0x3562, 0x3576, 0x3578, 0x357E, + 0x1F0D, 0x1F12, 0x3582, 0x3568, 0x353B, 0x36B9, 0x01F5, 0x3584, 0x1F47, 0x1F46, + 0x0209, 0x1F44, 0x1F45, 0x3543, 0x01A2, 0x1F50, 0x022A, 0x0234, 0x0F47, 0x0F68, + 0x3566, 0x1F4B, 0x35A9, 0x1F57, 0x0F68, 0x4593, 0x4592, 0x4598, 0x4599, 0x0DBD, + 0x1F56, 0x1F54, 0x35A8, 0x357D, 0x1F59, 0x1F55, 0x1F5B, 0x0EBA, 0x3585, 0x3643, + 0x0DE1, 0x0CE0, 0x1F58, 0x0D07, 0x1F5A, 0x0E2A, 0x0E79, 0x1F5D, 0x0D84, 0x2092, + 0x358B, 0x0E2A, 0x2091, 0x3651, 0x3650, 0x3653, 0x3652, 0x3655, 0x3654, 0x1F21, + 0x1F26, 0x3659, 0x3658, 0x365B, 0x365A, 0x365D, 0x365C, 0x3657, 0x3656, 0x01A2, + 0x0198, 0x0D68, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0E10, 0x0E2A, 0x1F4D, + 0x1F4E, 0x0DE1, 0x0E79, 0x0FE5, 0x0234, 0x2178, 0x2176, 0x0D2C, 0x217A, 0x022A, + 0x217E, 0x2184, 0x0ED1, 0x0CA8, 0x35AA, 0x218C, 0x0D57, 0x0F68, 0x0DBD, 0x0E64, + 0x0F9C, 0x219A, 0x0EBA, 0x1FDC, 0x1FC8, 0x0CA6, 0x1FD8, 0x0EA5, 0x0E2A, 0x1FE2, + 0x0E59, 0x2198, 0x1FDF, 0x0F8C, 0x2196, 0x0EB8, 0x219C, 0x0E59, 0x35A5, 0x21BC, + 0x01C9, 0x01DF, 0x01F5, 0x35AC, 0x21A4, 0x2177, 0x2175, 0x35AB, 0x2179, 0x217F, + 0x217D, 0x2183, 0x2181, 0x2189, 0x2185, 0x218B, 0x0DE1, 0x0D80, 0x2187, 0x218D, + 0x218F, 0x3535, 0x3580, 0x219B, 0x0E79, 0x2195, 0x21A3, 0x2191, 0x2193, 0x21A7, + 0x3586, 0x3587, 0x21A9, 0x21A5, 0x21AD, 0x21B3, 0x21B1, 0x21BB, 0x35A7, 0x21B5, + 0x3590, 0x35A6, 0x21AF, 0x21B9, 0x21B7, 0x1F81, 0x01A2, 0x1F7F, 0x1F80, 0x1F7E, + 0x358A, 0x1F84, 0x1F86, 0x3660, 0x358D, 0x0234, 0x0215, 0x3594, 0x021F, 0x367A, + 0x1F83, 0x366F, 0x366E, 0x3671, 0x1F82, 0x3673, 0x3672, 0x3675, 0x3674, 0x3677, + 0x3676, 0x3679, 0x3678, 0x367B, 0x1F89, 0x367D, 0x367C, 0x365F, 0x365E, 0x3665, + 0x3680, 0x367E, 0x367F, 0x3685, 0x3664, 0x3663, 0x3661, 0x1F88, 0x1F8A, 0x3682, + 0x3683, 0x3684, 0x1F87, 0x1F8F, 0x138D, 0x1358, 0x1359, 0x135A, 0x1349, 0x138E, + 0x138F, 0x1390, 0x35B2, 0x133B, 0x1344, 0x1348, 0x1357, 0x135E, 0x1345, 0x3697, + 0x3696, 0x3699, 0x3698, 0x369B, 0x369A, 0x369D, 0x369C, 0x369F, 0x369E, 0x36A1, + 0x36A0, 0x36A3, 0x36A2, 0x36A5, 0x36A4, 0x368B, 0x36A8, 0x3693, 0x3669, 0x368A, + 0x36A9, 0x3662, 0x368C, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x36B2, 0x3694, + 0x3695, 0x36B7, 0x36B6, 0x138A, 0x36B8, 0x022D, 0x0222, 0x35AF, 0x35AE, 0x1389, + 0x0237, 0x358C, 0x35B0, 0x139D, 0x17F2, 0x180C, 0x13A0, 0x3589, 0x36B3, 0x36B4, + 0x36B5, 0x36AA, 0x36AB, 0x36AC, 0x1D2D, 0x3688, 0x368D, 0x36B0, 0x3687, 0x3686, + 0x36AF, 0x36AE, 0x36B1, 0x1D27, 0x3644, 0x1D2E, 0x1A1F, 0x3640, 0x1D33, 0x0198, + 0x1D34, 0x1D35, 0x364A, 0x3642, 0x1F8D, 0x3645, 0x1F8B, 0x1D38, 0x1F8E, 0x022A, + 0x01F5, 0x217C, 0x45D6, 0x1376, 0x19C5, 0x01DF, 0x019E, 0x2186, 0x1374, 0x01A2, + 0x01C9, 0x0209, 0x021F, 0x2192, 0x2194, 0x1342, 0x1A19, 0x135C, 0x01DF, 0x135D, + 0x133A, 0x0198, 0x01A2, 0x3648, 0x01F5, 0x1385, 0x0209, 0x218A, 0x135B, 0x364E, + 0x1339, 0x0215, 0x1FCE, 0x1FED, 0x1FD7, 0x1FFB, 0x1FD6, 0x1FDD, 0x1FE7, 0x3681, + 0x1FCB, 0x1FCA, 0x1FCD, 0x1FCC, 0x1FCF, 0x1FFA, 0x1FD1, 0x1FD0, 0x1FD3, 0x1FD2, + 0x1FD5, 0x1FD4, 0x1FD9, 0x43C1, 0x1FDB, 0x1FDA, 0x19E9, 0x43D4, 0x43D9, 0x43A1, + 0x1FDE, 0x1FE0, 0x43D3, 0x439B, 0x1FF7, 0x1FE4, 0x1FE8, 0x1FE6, 0x1FEA, 0x1FE5, + 0x1FEC, 0x1FE9, 0x217B, 0x21BA, 0x21B6, 0x1FEF, 0x1FF0, 0x1FF2, 0x1FEB, 0x1FF1, + 0x439F, 0x1FFC, 0x43A0, 0x43AD, 0x43C4, 0x44C8, 0x447E, 0x44C9, 0x43F2, 0x1FF9, + 0x447F, 0x43C3, 0x1FF8, 0x1360, 0x1FF6, 0x1361, 0x443E, 0x43C2, 0x1A70, 0x440D, + 0x43C5, 0x3670, 0x1A6F, 0x43C9, 0x1BCE, 0x1BC8, 0x1BAE, 0x1A6E, 0x43AC, 0x440E, + 0x1BB2, 0x37C6, 0x01A2, 0x01DF, 0x37C7, 0x37C5, 0x0215, 0x01F5, 0x01C9, 0x0209, + 0x0198, 0x37C9, 0x022A, 0x37CB, 0x37CA, 0x0234, 0x37CC, 0x021F, 0x439C, 0x439D, + 0x43F4, 0x43F3, 0x4462, 0x4405, 0x43C8, 0x37CD, 0x37CE, 0x37CF, 0x37D0, 0x37D1, + 0x37D2, 0x37D3, 0x4410, 0x4407, 0x4404, 0x43F8, 0x43EC, 0x4408, 0x43EE, 0x43DE, + 0x1BA4, 0x43F5, 0x37E8, 0x43EF, 0x43D0, 0x43F0, 0x43F9, 0x43CE, 0x43F1, 0x37F8, + 0x17E8, 0x439E, 0x43CF, 0x3801, 0x19DD, 0x3803, 0x19CB, 0x43B5, 0x37FF, 0x4411, + 0x43D5, 0x43E5, 0x17F5, 0x17F4, 0x3802, 0x381A, 0x3819, 0x17F8, 0x17FB, 0x381B, + 0x381C, 0x17F9, 0x17FA, 0x443F, 0x3820, 0x1519, 0x1807, 0x4440, 0x3824, 0x17FD, + 0x17FE, 0x17FF, 0x17EA, 0x0209, 0x17F6, 0x17F7, 0x17EE, 0x17EB, 0x17EC, 0x17ED, + 0x01A5, 0x3817, 0x3816, 0x17F3, 0x019E, 0x3815, 0x17F0, 0x17EF, 0x01A2, 0x0198, + 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x1806, 0x17E9, + 0x1801, 0x0198, 0x1803, 0x17F1, 0x1D21, 0x0045, 0x1D23, 0x1D22, 0x1D24, 0x1D23, + 0x4441, 0x1D25, 0x1D28, 0x1D20, 0x1D2A, 0x1D29, 0x1D2B, 0x1D2B, 0x1D26, 0x1D2C, + 0x1D2F, 0x01CC, 0x1D31, 0x1D30, 0x4464, 0x4463, 0x0215, 0x43D2, 0x0234, 0x43DD, + 0x154F, 0x022A, 0x444A, 0x1D39, 0x154E, 0x1535, 0x1D3E, 0x1D3D, 0x1D40, 0x1D3F, + 0x1D42, 0x1D41, 0x022A, 0x1B1F, 0x43D7, 0x1808, 0x43E4, 0x45A8, 0x1300, 0x19D1, + 0x43DC, 0x3866, 0x3865, 0x43D8, 0x3867, 0x180D, 0x3869, 0x386C, 0x386B, 0x386E, + 0x386D, 0x3870, 0x386F, 0x3873, 0x386A, 0x3874, 0x3872, 0x444B, 0x1C5A, 0x1C4A, + 0x1C4D, 0x1C50, 0x1C4F, 0x1C4E, 0x1C51, 0x1C59, 0x1C53, 0x1C65, 0x1C58, 0x3871, + 0x1C57, 0x1C5C, 0x1C6B, 0x38A4, 0x1C5E, 0x1C5D, 0x1C60, 0x1C5F, 0x1C63, 0x1C64, + 0x3888, 0x1C61, 0x1C66, 0x1C67, 0x1C68, 0x1C69, 0x1C6A, 0x1C62, 0x1C6C, 0x3898, + 0x3895, 0x3896, 0x3897, 0x389C, 0x3899, 0x389A, 0x389B, 0x38A0, 0x019B, 0x389E, + 0x389F, 0x019C, 0x389D, 0x38A1, 0x38A3, 0x1C52, 0x1C6D, 0x1C6E, 0x1C6F, 0x1C70, + 0x20C5, 0x20C2, 0x20C7, 0x20C8, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x1C5B, 0x20C6, + 0x38C4, 0x38B6, 0x38B5, 0x38BC, 0x38B7, 0x38BA, 0x0218, 0x020C, 0x38BB, 0x01F8, + 0x38BD, 0x38BE, 0x38BF, 0x38B9, 0x38A2, 0x38C0, 0x01F5, 0x38D5, 0x38D6, 0x0198, + 0x01DF, 0x38DC, 0x01A2, 0x38DA, 0x38DB, 0x01C9, 0x20AB, 0x20AC, 0x0215, 0x0234, + 0x20B0, 0x0209, 0x38D9, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0209, + 0x01E2, 0x021F, 0x20C1, 0x0234, 0x20C3, 0x20C4, 0x20AD, 0x38D7, 0x0215, 0x38E6, + 0x38E5, 0x20AE, 0x38E7, 0x38EA, 0x38E9, 0x38EC, 0x38EB, 0x38DD, 0x38E4, 0x38F0, + 0x38DF, 0x38ED, 0x38EE, 0x38E3, 0x022A, 0x20AF, 0x1564, 0x1565, 0x155F, 0x155D, + 0x4573, 0x0209, 0x1558, 0x0234, 0x09CC, 0x155E, 0x1A9B, 0x09E3, 0x38E0, 0x38F4, + 0x38DE, 0x093B, 0x09EA, 0x38FF, 0x092A, 0x0A4C, 0x1449, 0x0A59, 0x09EA, 0x1445, + 0x2321, 0x1441, 0x0A05, 0x4516, 0x43E0, 0x2322, 0x451B, 0x390D, 0x390C, 0x1448, + 0x390E, 0x3911, 0x3910, 0x4543, 0x4544, 0x4545, 0x4542, 0x44A7, 0x44A6, 0x1A77, + 0x0209, 0x44C5, 0x44AD, 0x451E, 0x01F5, 0x451F, 0x45AA, 0x1AAD, 0x449E, 0x45BE, + 0x1440, 0x4595, 0x45C2, 0x145F, 0x1444, 0x1443, 0x1300, 0x1463, 0x1AA7, 0x45C0, + 0x43C0, 0x449F, 0x44A0, 0x44A1, 0x021F, 0x45A2, 0x01C9, 0x1BA7, 0x01C9, 0x1B2B, + 0x022A, 0x4497, 0x45C3, 0x1BA3, 0x2323, 0x45AC, 0x1442, 0x231C, 0x4594, 0x0215, + 0x231D, 0x143F, 0x1522, 0x44F0, 0x455E, 0x4557, 0x38E1, 0x440A, 0x38E2, 0x43E1, + 0x44D2, 0x1456, 0x01F5, 0x20BD, 0x38C8, 0x455F, 0x440B, 0x20B6, 0x20B7, 0x20B8, + 0x4406, 0x20BA, 0x20BB, 0x4401, 0x44F1, 0x12FC, 0x12FC, 0x12FC, 0x12FC, 0x12FC, + 0x440C, 0x231E, 0x12FD, 0x4584, 0x4585, 0x12FE, 0x4588, 0x44C3, 0x4589, 0x44C4, + 0x44C2, 0x1300, 0x45A0, 0x450A, 0x0297, 0x0298, 0x02B2, 0x0293, 0x0301, 0x0302, + 0x0347, 0x02D1, 0x0460, 0x0415, 0x042E, 0x1477, 0x0402, 0x063F, 0x0512, 0x0486, + 0x0513, 0x0520, 0x051C, 0x0521, 0x0533, 0x0516, 0x0528, 0x035E, 0x057F, 0x053E, + 0x05EA, 0x0584, 0x0640, 0x0651, 0x0527, 0x063D, 0x0689, 0x0720, 0x06EF, 0x06DC, + 0x1490, 0x066A, 0x07F5, 0x076A, 0x082B, 0x086C, 0x09A1, 0x148B, 0x1476, 0x0721, + 0x04AD, 0x1495, 0x1489, 0x0059, 0x148A, 0x148E, 0x148F, 0x4400, 0x231F, 0x1528, + 0x081C, 0x148D, 0x1492, 0x0234, 0x45C1, 0x236A, 0x0058, 0x14AB, 0x14E0, 0x1488, + 0x005A, 0x01F5, 0x14E4, 0x01A2, 0x0056, 0x01DF, 0x0198, 0x0054, 0x149D, 0x0055, + 0x0053, 0x1473, 0x1494, 0x391B, 0x391D, 0x3937, 0x391C, 0x391A, 0x393D, 0x391E, + 0x391F, 0x392F, 0x3922, 0x3931, 0x3921, 0x392B, 0x3920, 0x3933, 0x3923, 0x3928, + 0x392E, 0x3932, 0x3929, 0x3927, 0x05BE, 0x0303, 0x02B3, 0x0487, 0x0641, 0x0388, + 0x05D7, 0x0405, 0x0377, 0x053F, 0x0647, 0x0655, 0x394B, 0x394C, 0x058E, 0x0582, + 0x393E, 0x0543, 0x3939, 0x394E, 0x04AE, 0x394F, 0x3938, 0x05EF, 0x393A, 0x03A0, + 0x06DF, 0x0409, 0x0304, 0x394A, 0x039C, 0x0378, 0x046E, 0x3949, 0x3948, 0x0488, + 0x3930, 0x05CB, 0x394D, 0x3947, 0x3926, 0x066D, 0x3936, 0x00FE, 0x0309, 0x029F, + 0x0358, 0x034C, 0x0354, 0x035D, 0x0523, 0x0406, 0x0102, 0x0100, 0x3950, 0x3A0E, + 0x01DF, 0x0648, 0x06F2, 0x3A0C, 0x3A0D, 0x3A1F, 0x3A1E, 0x3A13, 0x3A11, 0x3A12, + 0x3A1D, 0x3A1C, 0x3A20, 0x3A16, 0x3A17, 0x3A21, 0x3A10, 0x01C9, 0x3A0F, 0x3A1B, + 0x39D6, 0x3A15, 0x3943, 0x01DF, 0x393C, 0x393B, 0x00F1, 0x393F, 0x3940, 0x3941, + 0x01C9, 0x3945, 0x3944, 0x3942, 0x3946, 0x39D4, 0x39D3, 0x39C3, 0x39C4, 0x39C1, + 0x39C2, 0x39D2, 0x39C8, 0x01A2, 0x39D1, 0x39C6, 0x39D5, 0x00FF, 0x39C7, 0x0101, + 0x39D7, 0x39D8, 0x45C4, 0x39DA, 0x39DB, 0x39DD, 0x14E6, 0x14E5, 0x39DF, 0x39E1, + 0x39E0, 0x39E3, 0x39E2, 0x1534, 0x14D0, 0x39E6, 0x14E3, 0x39E8, 0x1B0D, 0x148C, + 0x39EB, 0x39EC, 0x1B13, 0x1527, 0x39EE, 0x39F1, 0x39F0, 0x39F3, 0x39F2, 0x14E2, + 0x1B31, 0x1A89, 0x14A6, 0x14E1, 0x45A5, 0x147D, 0x1AA1, 0x45B7, 0x0209, 0x01A2, + 0x1460, 0x0057, 0x1A7D, 0x01F5, 0x01F5, 0x01C9, 0x01DF, 0x00F4, 0x0048, 0x14D1, + 0x45A3, 0x05A0, 0x05B5, 0x05A2, 0x0047, 0x059C, 0x05B2, 0x1B07, 0x45AD, 0x45A7, + 0x45AB, 0x45A4, 0x0661, 0x0657, 0x05E2, 0x39CB, 0x031D, 0x3A19, 0x0662, 0x0658, + 0x0364, 0x3A1A, 0x033D, 0x39CF, 0x0629, 0x3A14, 0x0328, 0x0344, 0x036F, 0x0343, + 0x39FA, 0x0209, 0x00F5, 0x39C9, 0x0639, 0x0259, 0x39CD, 0x39CE, 0x026C, 0x3A18, + 0x01A2, 0x031A, 0x00F6, 0x0273, 0x0241, 0x00F7, 0x0607, 0x39F8, 0x39F7, 0x0330, + 0x39F9, 0x39FC, 0x39FB, 0x39FE, 0x39FD, 0x0314, 0x39FF, 0x3A02, 0x3A01, 0x0325, + 0x3A03, 0x3A0A, 0x3A05, 0x3A09, 0x050B, 0x01F5, 0x047B, 0x3A08, 0x0209, 0x04EF, + 0x39D0, 0x01A2, 0x39CA, 0x39CC, 0x0505, 0x3A07, 0x00F0, 0x39C5, 0x3A0B, 0x04C5, + 0x0481, 0x047A, 0x0482, 0x04CB, 0x04A2, 0x0494, 0x04A4, 0x0496, 0x04A6, 0x0498, + 0x04A5, 0x0497, 0x062C, 0x0573, 0x04F6, 0x04CC, 0x05E4, 0x0615, 0x0637, 0x04E1, + 0x04DC, 0x05D4, 0x0638, 0x04DE, 0x0C30, 0x0C31, 0x060A, 0x0617, 0x04F5, 0x0616, + 0x0C36, 0x34DF, 0x34DD, 0x04DB, 0x0C42, 0x34E4, 0x34DE, 0x34E1, 0x34E2, 0x34E6, + 0x34E5, 0x34E8, 0x34E7, 0x0508, 0x34E9, 0x34E3, 0x34EB, 0x0C3F, 0x0C40, 0x0C41, + 0x0677, 0x0C43, 0x0681, 0x01A2, 0x00FB, 0x00FC, 0x067B, 0x0678, 0x01DF, 0x34EA, + 0x0C44, 0x0697, 0x34EC, 0x0685, 0x0696, 0x033E, 0x06D5, 0x0C2F, 0x0C34, 0x0C35, + 0x06CE, 0x0341, 0x06D8, 0x06B9, 0x0C3A, 0x0C33, 0x068F, 0x05C3, 0x0686, 0x0684, + 0x0254, 0x0242, 0x026F, 0x026D, 0x026E, 0x027F, 0x0283, 0x0258, 0x0257, 0x067D, + 0x0246, 0x0322, 0x0243, 0x068E, 0x0247, 0x06AD, 0x0274, 0x1533, 0x0272, 0x06CB, + 0x05CF, 0x1FA4, 0x1A83, 0x34ED, 0x34EE, 0x34EF, 0x0248, 0x0271, 0x0284, 0x0244, + 0x34F4, 0x0336, 0x04EC, 0x0333, 0x0315, 0x04C3, 0x1FA6, 0x04C2, 0x04ED, 0x1B25, + 0x43FF, 0x04EE, 0x1B99, 0x45A9, 0x04C4, 0x050A, 0x45A6, 0x1B97, 0x4359, 0x06D9, + 0x05C4, 0x4363, 0x4361, 0x4366, 0x03B0, 0x06CF, 0x067A, 0x06AA, 0x0266, 0x05A9, + 0x0672, 0x030E, 0x05BA, 0x145C, 0x0635, 0x0613, 0x1451, 0x1C85, 0x06BC, 0x06B0, + 0x06BB, 0x06AF, 0x06B8, 0x06AC, 0x045B, 0x0449, 0x1450, 0x06C4, 0x06C5, 0x435A, + 0x4358, 0x435E, 0x435C, 0x4364, 0x06A8, 0x4367, 0x4362, 0x4371, 0x4369, 0x436B, + 0x436E, 0x4360, 0x4374, 0x34E0, 0x4378, 0x06B5, 0x07AD, 0x07B5, 0x07B1, 0x34F1, + 0x34F2, 0x34F3, 0x0794, 0x34F5, 0x34F6, 0x07AC, 0x07B9, 0x0172, 0x4376, 0x437A, + 0x438E, 0x0168, 0x01C9, 0x0770, 0x459A, 0x459D, 0x077F, 0x0771, 0x0198, 0x01F5, + 0x016B, 0x077B, 0x0780, 0x0169, 0x0887, 0x077E, 0x077D, 0x0151, 0x0158, 0x079E, + 0x014E, 0x014F, 0x0150, 0x0153, 0x0152, 0x0796, 0x0154, 0x0157, 0x0156, 0x015A, + 0x0798, 0x079B, 0x0155, 0x016C, 0x016D, 0x016E, 0x015E, 0x015D, 0x015C, 0x0163, + 0x0174, 0x0166, 0x0161, 0x0164, 0x0165, 0x0160, 0x016A, 0x0162, 0x0159, 0x079C, + 0x0167, 0x19B9, 0x0809, 0x0806, 0x1BA8, 0x0807, 0x0804, 0x015B, 0x18C5, 0x19BF, + 0x080B, 0x150C, 0x152E, 0x0805, 0x080F, 0x150B, 0x0843, 0x083F, 0x0845, 0x0841, + 0x0844, 0x0840, 0x0846, 0x0842, 0x0852, 0x0811, 0x0854, 0x0813, 0x0853, 0x0808, + 0x0855, 0x0812, 0x1843, 0x1847, 0x0888, 0x1848, 0x0871, 0x1FAE, 0x1849, 0x0879, + 0x080E, 0x1FA7, 0x0810, 0x1851, 0x086E, 0x0876, 0x184F, 0x1855, 0x0877, 0x0873, + 0x0776, 0x0777, 0x07D0, 0x0740, 0x07A5, 0x07A3, 0x1A25, 0x088F, 0x0847, 0x0890, + 0x080A, 0x0880, 0x087E, 0x1863, 0x1FA3, 0x1865, 0x1864, 0x1862, 0x2338, 0x18DD, + 0x18E3, 0x233A, 0x07B3, 0x18BF, 0x18CB, 0x1FBA, 0x18E9, 0x1FB4, 0x1FB3, 0x07B2, + 0x07A2, 0x079F, 0x233B, 0x079A, 0x0799, 0x0795, 0x0797, 0x079D, 0x07BB, 0x1BD4, + 0x07B8, 0x07B0, 0x07B6, 0x1BD3, 0x07BA, 0x07A1, 0x1955, 0x195B, 0x1961, 0x1BBD, + 0x196D, 0x1A2B, 0x1979, 0x194F, 0x0215, 0x145B, 0x198B, 0x1991, 0x197F, 0x1985, + 0x1973, 0x19A9, 0x1A07, 0x2334, 0x2335, 0x2336, 0x2337, 0x2330, 0x2331, 0x2332, + 0x2333, 0x232C, 0x232D, 0x19FB, 0x232E, 0x199D, 0x19A3, 0x1A01, 0x1BCF, 0x232F, + 0x07A9, 0x07A6, 0x2308, 0x07A4, 0x07A8, 0x07A7, 0x0781, 0x2309, 0x07BC, 0x07BD, + 0x230A, 0x07BE, 0x230B, 0x2304, 0x01F5, 0x2305, 0x2306, 0x2307, 0x0209, 0x0215, + 0x021F, 0x1466, 0x2300, 0x0234, 0x2301, 0x2302, 0x022A, 0x2303, 0x22FC, 0x22FD, + 0x22FE, 0x22FF, 0x2318, 0x22EA, 0x22EB, 0x22E4, 0x234B, 0x234C, 0x2344, 0x2340, + 0x234E, 0x115F, 0x1171, 0x1172, 0x116B, 0x116C, 0x116D, 0x116E, 0x0884, 0x0881, + 0x1166, 0x087F, 0x0883, 0x0882, 0x0814, 0x0815, 0x0897, 0x0898, 0x1167, 0x1168, + 0x1FB8, 0x1169, 0x1FB7, 0x1162, 0x1FBB, 0x1163, 0x1164, 0x1165, 0x113F, 0x1140, + 0x2A10, 0x2A11, 0x2A20, 0x2A21, 0x2A23, 0x2A19, 0x021F, 0x3A5E, 0x3A5D, 0x3A60, + 0x3A5F, 0x3A62, 0x3A61, 0x3A64, 0x3A63, 0x10F3, 0x10F4, 0x3A67, 0x10ED, 0x3A69, + 0x3A68, 0x3A6B, 0x3A6A, 0x3A6D, 0x10EE, 0x3A6F, 0x01C9, 0x01DF, 0x0198, 0x01A2, + 0x3A72, 0x3A75, 0x10EF, 0x10E6, 0x3A76, 0x3A79, 0x3A78, 0x10E7, 0x3A7A, 0x3A7D, + 0x3A7C, 0x3A7F, 0x3A7E, 0x11DB, 0x3A80, 0x0FE2, 0x0005, 0x0FFF, 0x0F3A, 0x01A2, + 0x0EE9, 0x0103, 0x0209, 0x0105, 0x0104, 0x0EC9, 0x0ECA, 0x0ECB, 0x0EE5, 0x0EA1, + 0x0EA2, 0x0EA3, 0x0D01, 0x0D02, 0x0D03, 0x0D17, 0x0EDB, 0x0F23, 0x0F73, 0x0DF0, + 0x0CED, 0x399B, 0x399C, 0x39A7, 0x0D09, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, + 0x39A4, 0x39A5, 0x39A6, 0x0CAE, 0x39A8, 0x39A9, 0x39AA, 0x398D, 0x398C, 0x399E, + 0x399D, 0x398B, 0x3990, 0x0F81, 0x3992, 0x0F82, 0x0F30, 0x398F, 0x3995, 0x3991, + 0x0F33, 0x2104, 0x2106, 0x2108, 0x20FA, 0x20FC, 0x398E, 0x20FE, 0x2100, 0x20F2, + 0x20F4, 0x20F6, 0x20F8, 0x20EA, 0x20EC, 0x20EE, 0x20F0, 0x126A, 0x3994, 0x0CE6, + 0x0E36, 0x0DE3, 0x0DE4, 0x0DE6, 0x0DF9, 0x0DF8, 0x0DD3, 0x0E1B, 0x0E38, 0x0DF2, + 0x0DF4, 0x0DF7, 0x0D6F, 0x0E1D, 0x0E1E, 0x0E37, 0x39AE, 0x0CA0, 0x39BE, 0x1DD8, + 0x0DED, 0x0DEE, 0x0E4D, 0x0E5D, 0x0DCC, 0x0DEC, 0x0DC8, 0x0DEA, 0x0E01, 0x0D66, + 0x0D3E, 0x39BB, 0x39BC, 0x39BD, 0x3A34, 0x39BF, 0x39C0, 0x3A32, 0x3A33, 0x3A36, + 0x01A2, 0x01F5, 0x0109, 0x3A37, 0x3996, 0x0D3F, 0x3993, 0x0D74, 0x3998, 0x3999, + 0x0D61, 0x0D38, 0x0D39, 0x0DFC, 0x0DFD, 0x1DD7, 0x1D82, 0x1D90, 0x1DE3, 0x1DE4, + 0x1DC9, 0x1DCA, 0x399A, 0x1DE1, 0x1DE2, 0x1DE6, 0x0E24, 0x0CA3, 0x1DCD, 0x0E67, + 0x0E16, 0x0DD2, 0x0F79, 0x0F57, 0x0E9A, 0x3997, 0x0CB3, 0x1D9F, 0x1DA2, 0x1DA5, + 0x1D8F, 0x3A4E, 0x1D96, 0x1D9A, 0x3A4D, 0x1D9B, 0x1D81, 0x1D83, 0x1D86, 0x1D8A, + 0x1D76, 0x3A4C, 0x1D78, 0x1D7A, 0x1D7E, 0x3A4B, 0x1DC6, 0x3A5C, 0x3A5B, 0x3A4F, + 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A59, 0x3A58, 0x0F7B, + 0x3A5A, 0x0F4F, 0x01F5, 0x0F19, 0x0FEB, 0x0CB4, 0x010F, 0x0CF3, 0x0F6C, 0x01A2, + 0x01DF, 0x0110, 0x01C9, 0x0F78, 0x3A57, 0x0F80, 0x010E, 0x0F6E, 0x0B28, 0x0B3D, + 0x0B44, 0x02D0, 0x0B2C, 0x46F1, 0x0357, 0x47F1, 0x47F6, 0x4810, 0x03BD, 0x0389, + 0x03BD, 0x03BD, 0x03AD, 0x03B2, 0x47C5, 0x47C7, 0x47CA, 0x47E4, 0x47A5, 0x47A8, + 0x47AD, 0x479A, 0x479E, 0x479F, 0x48A0, 0x48AD, 0x486A, 0x0578, 0x48CA, 0x489E, + 0x2B0B, 0x2B0C, 0x2B2A, 0x2B04, 0x2B06, 0x2B08, 0x2B09, 0x2AFF, 0x2B00, 0x2B01, + 0x2B02, 0x2AFB, 0x2AFC, 0x02AE, 0x2AFD, 0x2AFE, 0x0372, 0x0346, 0x0485, 0x037C, + 0x0BE5, 0x04E6, 0x0BEE, 0x0BEB, 0x2ACE, 0x0BF1, 0x2AD0, 0x2AD2, 0x0767, 0x2AD4, + 0x081B, 0x0769, 0x2AC8, 0x2AC9, 0x2ACB, 0x2ACC, 0x2AC3, 0x2AC4, 0x032A, 0x02EF, + 0x2AC5, 0x2AC6, 0x2ABA, 0x03E2, 0x037B, 0x2ABC, 0x2ABF, 0x2AC1, 0x01C8, 0x2AE4, + 0x01C2, 0x01C0, 0x01C4, 0x01DD, 0x2A94, 0x2A97, 0x2A9A, 0x0208, 0x2A85, 0x2A8E, + 0x0214, 0x01F4, 0x01BF, 0x0229, 0x03DD, 0x2A79, 0x03F9, 0x03F7, 0x2BDE, 0x03F6, + 0x2BD5, 0x2B97, 0x0BF5, 0x0C0C, 0x0C0F, 0x0BFF, 0x0C02, 0x0C0A, 0x0C06, 0x0458, + 0x0BF4, 0x0BF8, 0x0BFC, 0x0BE4, 0x0BE9, 0x0BED, 0x0BF0, 0x0369, 0x05AA, 0x05AB, + 0x0367, 0x036A, 0x036B, 0x0447, 0x0368, 0x0C01, 0x0C04, 0x19B1, 0x02DB, 0x0BB8, + 0x0069, 0x02DA, 0x0BCF, 0x0068, 0x01A1, 0x0215, 0x19AE, 0x19AF, 0x006C, 0x19B0, + 0x0BBA, 0x006A, 0x0C90, 0x0C83, 0x0C91, 0x0FDE, 0x0C8C, 0x0C85, 0x19AA, 0x19AB, + 0x19AC, 0x18D7, 0x0FCB, 0x1895, 0x189B, 0x18A1, 0x1D9E, 0x1D7C, 0x1D85, 0x1D88, + 0x1D8B, 0x1D89, 0x1D95, 0x1DC5, 0x101C, 0x1DEA, 0x1DEB, 0x0DA9, 0x0DA8, 0x1AD1, + 0x0D89, 0x0DB2, 0x0DB1, 0x0D90, 0x0F0B, 0x0F0C, 0x0F08, 0x0EFE, 0x01F5, 0x0209, + 0x021F, 0x0198, 0x01A2, 0x1FB9, 0x1FB5, 0x1FB6, 0x19D7, 0x1A4F, 0x1A43, 0x1A49, + 0x1A31, 0x1A37, 0x1AC5, 0x1A3D, 0x1A71, 0x1ABF, 0x1F9F, 0x1FA0, 0x1ACB, 0x1FA1, + 0x1FA2, 0x1F9B, 0x1F9C, 0x1F9E, 0x1F99, 0x1F93, 0x1F94, 0x1F96, 0x1FB0, 0x1FB2, + 0x1FAB, 0x1FAD, 0x1FA8, 0x1FA5, 0x1A0D, 0x1A13, 0x19EF, 0x19F5, 0x150D, 0x1507, + 0x1508, 0x150A, 0x1503, 0x1504, 0x1FAA, 0x1BC7, 0x1BA5, 0x1BCA, 0x1BCB, 0x1BCC, + 0x1BCD, 0x1BC4, 0x1BC5, 0x1BC6, 0x1BC9, 0x45D7, 0x45D8, 0x45D2, 0x45D3, 0x45D4, + 0x45D5, 0x1BB0, 0x1BB1, 0x1BB3, 0x1BA0, 0x1BAD, 0x1BAF, 0x1BA9, 0x1BAA, 0x1BAB, + 0x1BAC, 0x459B, 0x459C, 0x4596, 0x4597, 0x1B19, 0x1AEF, 0x1AF5, 0x1FA9, 0x1AFB, + 0x1B01, 0x1AD7, 0x1FB1, 0x1ADD, 0x1AE3, 0x1AE9, 0x02A2, 0x089B, 0x06FF, 0x0700, + 0x0524, 0x0701, 0x20E1, 0x20E3, 0x20E5, 0x20E7, 0x20D9, 0x20DB, 0x20DD, 0x20DF, + 0x20D1, 0x20D3, 0x20D5, 0x20D7, 0x20C9, 0x20CB, 0x20CD, 0x20CF, 0x0594, 0x05C7, + 0x063E, 0x0646, 0x0591, 0x058C, 0x0592, 0x0593, 0x051B, 0x0579, 0x057C, 0x0590, + 0x0519, 0x0517, 0x0518, 0x051A, 0x06A0, 0x06A1, 0x06C6, 0x06A4, 0x06A5, 0x069E, + 0x4792, 0x47F5, 0x47B1, 0x47E9, 0x470F, 0x4845, 0x46CD, 0x4609, 0x4608, 0x47A4, + 0x47C1, 0x47C6, 0x4869, 0x45E8, 0x46F8, 0x472C, 0x4760, 0x4839, 0x1B9F, 0x46CC, + 0x1505, 0x1509, 0x47EF, 0x482C, 0x48AF, 0x4687, 0x4742, 0x478E, 0x47E3, 0x45F2, + 0x4899, 0x4875, 0x488F, 0x4893, 0x4718, 0x1C8D, 0x1C86, 0x1C87, 0x1C88, 0x1459, + 0x145A, 0x1457, 0x1458, 0x1452, 0x1453, 0x1454, 0x1BA2, 0x1455, 0x144E, 0x144F, + 0x1467, 0x0043, 0x0044, 0x151F, 0x1520, 0x1521, 0x145E, 0x143B, 0x151B, 0x1436, + 0x1531, 0x440F, 0x4402, 0x4403, 0x43EA, 0x43EB, 0x43ED, 0x43E6, 0x43E7, 0x43E8, + 0x43E9, 0x43E2, 0x43E3, 0x43BE, 0x43BF, 0x439A, 0x4482, 0x4483, 0x1506, 0x4458, + 0x4459, 0x4452, 0x4453, 0x4454, 0x4455, 0x446E, 0x446F, 0x446B, 0x4468, 0x4469, + 0x4465, 0x443A, 0x443B, 0x443C, 0x443D, 0x4436, 0x4437, 0x4438, 0x4439, 0x4432, + 0x1FAF, 0x4433, 0x4434, 0x4435, 0x444E, 0x444F, 0x1FAC, 0x4503, 0x44D8, 0x44D9, + 0x44D3, 0x44D4, 0x44D5, 0x44EE, 0x44EF, 0x44EA, 0x44EB, 0x44EC, 0x44ED, 0x44E6, + 0x44E7, 0x44E8, 0x44E9, 0x44E2, 0x44E3, 0x44BE, 0x44BF, 0x449A, 0x449B, 0x44AC, + 0x4582, 0x4583, 0x4560, 0x4561, 0x455A, 0x455B, 0x455C, 0x455D, 0x4556, 0x4538, + 0x4539, 0x4532, 0x4533, 0x451A, 0x451C, 0x451D, 0x4518, 0x4519, 0x4512, 0x2608, + 0x2630, 0x25BF, 0x25D5, 0x2701, 0x01F5, 0x0209, 0x0198, 0x01A2, 0x13A8, 0x13AA, + 0x26E9, 0x26EA, 0x26E7, 0x26E3, 0x26E4, 0x26DD, 0x26DE, 0x26DF, 0x26E0, 0x26F9, + 0x26FA, 0x26FB, 0x26FC, 0x26F5, 0x26F6, 0x26F7, 0x26F8, 0x26F1, 0x26F2, 0x26ED, + 0x26EF, 0x26F0, 0x26C9, 0x26CA, 0x26CB, 0x1F95, 0x26CC, 0x26C5, 0x26C6, 0x26C7, + 0x26C8, 0x26C1, 0x26C2, 0x26C0, 0x26D3, 0x26CD, 0x26CE, 0x09ED, 0x09EC, 0x0A28, + 0x09F2, 0x0A3B, 0x14E7, 0x0940, 0x13A6, 0x13A7, 0x13A1, 0x09CF, 0x09CC, 0x0A18, + 0x0A17, 0x0702, 0x06F8, 0x03A2, 0x03A1, 0x02E9, 0x0371, 0x04B9, 0x0596, 0x0597, + 0x05F6, 0x030D, 0x0472, 0x048E, 0x0526, 0x0525, 0x050F, 0x04E5, 0x1F9A, 0x0462, + 0x0461, 0x0438, 0x045F, 0x045E, 0x0435, 0x0434, 0x0437, 0x0436, 0x0599, 0x0598, + 0x066C, 0x066B, 0x0558, 0x0557, 0x057E, 0x057D, 0x054A, 0x0549, 0x0556, 0x0555, + 0x0542, 0x0541, 0x0548, 0x0547, 0x070D, 0x070C, 0x070F, 0x070E, 0x05E8, 0x05DC, + 0x070A, 0x0723, 0x0722, 0x03C9, 0x03C8, 0x13ED, 0x13EE, 0x0265, 0x02DC, 0x028F, + 0x0264, 0x028B, 0x0260, 0x028D, 0x028E, 0x0263, 0x0373, 0x05BD, 0x13F2, 0x13F1, + 0x13F7, 0x13F8, 0x13EF, 0x13F4, 0x13F0, 0x13F3, 0x13DD, 0x13DE, 0x13DA, 0x13DB, + 0x13DC, 0x13D7, 0x13D8, 0x13D9, 0x13E3, 0x13F6, 0x13E7, 0x13E8, 0x13E5, 0x13E6, + 0x13E2, 0x13E4, 0x13DF, 0x13E0, 0x13E1, 0x1049, 0x104A, 0x048C, 0x1047, 0x1048, + 0x1043, 0x1044, 0x0401, 0x1058, 0x1059, 0x105A, 0x105B, 0x1054, 0x1055, 0x1056, + 0x1057, 0x1050, 0x1F97, 0x1F9D, 0x1051, 0x1052, 0x1F98, 0x1053, 0x104C, 0x104D, + 0x104E, 0x104F, 0x1064, 0x0397, 0x046C, 0x1061, 0x0576, 0x0568, 0x0393, 0x0387, + 0x042C, 0x0423, 0x02BC, 0x02BB, 0x0530, 0x052F, 0x043B, 0x05F8, 0x0419, 0x06A3, + 0x071C, 0x064B, 0x0470, 0x071E, 0x071D, 0x05BB, 0x05A8, 0x02B5, 0x02B4, 0x04B4, + 0x04B3, 0x02D5, 0x02D4, 0x332E, 0x332F, 0x332A, 0x332B, 0x3328, 0x3329, 0x3322, + 0x3323, 0x3324, 0x3325, 0x333E, 0x333F, 0x3340, 0x3341, 0x333A, 0x333B, 0x333C, + 0x333D, 0x3336, 0x3337, 0x3338, 0x3339, 0x3332, 0x3333, 0x3334, 0x3335, 0x330E, + 0x330F, 0x3310, 0x3311, 0x330A, 0x330B, 0x330C, 0x330D, 0x3306, 0x3307, 0x3308, + 0x3309, 0x3302, 0x3303, 0x3304, 0x3305, 0x331E, 0x331F, 0x3320, 0x3321, 0x331A, + 0x331B, 0x331C, 0x331D, 0x3316, 0x3317, 0x3318, 0x3319, 0x3312, 0x3313, 0x3314, + 0x3315, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32EA, 0x32EB, 0x32EC, 0x32ED, 0x32E6, + 0x32E7, 0x32F2, 0x32F3, 0x32D1, 0x32C8, 0x32C9, 0x32C2, 0x32C3, 0x32C4, 0x32C5, + 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32DA, 0x32DB, 0x32DC, 0x32DD, 0x32D6, 0x32D7, + 0x32D8, 0x32D9, 0x32D2, 0x32D3, 0x32D4, 0x32D5, 0x336C, 0x336A, 0x336D, 0x336E, + 0x3367, 0x3368, 0x336B, 0x3369, 0x3363, 0x3364, 0x01F5, 0x0209, 0x0198, 0x01A2, + 0x12BA, 0x12BC, 0x3373, 0x3374, 0x12EE, 0x12CB, 0x12B1, 0x12B2, 0x12B3, 0x12B4, + 0x12AC, 0x12B0, 0x335B, 0x335C, 0x335D, 0x335E, 0x3357, 0x3358, 0x3359, 0x335A, + 0x3353, 0x3354, 0x12CA, 0x12D1, 0x12AA, 0x12E8, 0x12EA, 0x12EB, 0x12EC, 0x12E3, + 0x12E4, 0x12E5, 0x12E6, 0x12DF, 0x12E0, 0x12E1, 0x12E2, 0x12D7, 0x12D9, 0x12DC, + 0x12DE, 0x12F9, 0x12F7, 0x12F8, 0x334E, 0x12F3, 0x12F4, 0x12B8, 0x12B9, 0x12AD, + 0x12AE, 0x12AF, 0x12B5, 0x12D0, 0x12D4, 0x12D5, 0x12D6, 0x12CC, 0x12CD, 0x2628, + 0x2629, 0x261E, 0x261F, 0x2621, 0x261A, 0x261B, 0x25EF, 0x25F0, 0x25E6, 0x25E7, + 0x25E8, 0x25E9, 0x25E3, 0x25E4, 0x25E5, 0x2603, 0x2604, 0x2605, 0x2606, 0x25FC, + 0x25FF, 0x2600, 0x2602, 0x01B2, 0x25F8, 0x25F9, 0x25F3, 0x020F, 0x0230, 0x25F5, + 0x01B3, 0x023A, 0x01B5, 0x01B4, 0x01B7, 0x01B6, 0x01B9, 0x01B8, 0x25F7, 0x01BA, + 0x25CD, 0x25CE, 0x0024, 0x0019, 0x0027, 0x0026, 0x0029, 0x0028, 0x002B, 0x002A, + 0x001A, 0x25CF, 0x001C, 0x001B, 0x25D0, 0x25C9, 0x25CA, 0x25CB, 0x25CC, 0x25C5, + 0x25C6, 0x25C4, 0x25D8, 0x25D1, 0x25D2, 0x25AB, 0x25AD, 0x25AE, 0x25AF, 0x25AA, + 0x25A4, 0x25A6, 0x259F, 0x25BE, 0x25BB, 0x25B4, 0x25B5, 0x269C, 0x2695, 0x2697, + 0x2698, 0x26AD, 0x26AE, 0x2677, 0x2673, 0x2674, 0x266D, 0x266E, 0x268E, 0x268B, + 0x2686, 0x2687, 0x267E, 0x267F, 0x2682, 0x2683, 0x2658, 0x2659, 0x265A, 0x265B, + 0x2654, 0x2655, 0x2656, 0x2657, 0x2650, 0x2651, 0x2631, 0x2632, 0x262A, 0x262B, + 0x262C, 0x262D, 0x2648, 0x2649, 0x264A, 0x264B, 0x2644, 0x2645, 0x2646, 0x2647, + 0x2640, 0x2641, 0x2642, 0x2643, 0x263C, 0x263D, 0x263E, 0x263F, 0x312E, 0x312F, + 0x3130, 0x3131, 0x312A, 0x312B, 0x312C, 0x312D, 0x3126, 0x3127, 0x3128, 0x3129, + 0x3124, 0x3125, 0x313E, 0x313F, 0x3140, 0x3141, 0x313A, 0x313B, 0x313C, 0x313D, + 0x3136, 0x3137, 0x3139, 0x3132, 0x3118, 0x3119, 0x3112, 0x3113, 0x3114, 0x3115, + 0x30EE, 0x30EF, 0x30F0, 0x01B5, 0x30EA, 0x30EB, 0x3188, 0x01B9, 0x3184, 0x3185, + 0x01B2, 0x01D1, 0x01E5, 0x01D0, 0x020F, 0x01FB, 0x0225, 0x021B, 0x023A, 0x319E, + 0x019E, 0x01B3, 0x319F, 0x31A0, 0x31A1, 0x319A, 0x319B, 0x319C, 0x319D, 0x3196, + 0x3197, 0x3178, 0x3179, 0x3172, 0x3173, 0x3174, 0x3175, 0x314E, 0x314F, 0x3150, + 0x3151, 0x314A, 0x314B, 0x314C, 0x314D, 0x3146, 0x3147, 0x3148, 0x3149, 0x3142, + 0x3143, 0x3144, 0x3145, 0x315E, 0x315F, 0x3160, 0x3161, 0x315A, 0x315B, 0x315C, + 0x315D, 0x3156, 0x45BA, 0x3157, 0x322D, 0x3228, 0x3229, 0x3222, 0x3223, 0x323F, + 0x3238, 0x3239, 0x3232, 0x3233, 0x3234, 0x3235, 0x320E, 0x320F, 0x3210, 0x3211, + 0x320A, 0x320B, 0x320C, 0x320D, 0x3206, 0x3207, 0x31E8, 0x31E9, 0x31E2, 0x31E3, + 0x31E4, 0x31E5, 0x31FE, 0x31FF, 0x31FA, 0x45BB, 0x31FB, 0x31F8, 0x31F9, 0x31F2, + 0x31F3, 0x31F4, 0x31F5, 0x31CE, 0x31CF, 0x180E, 0x31D0, 0x31D1, 0x180F, 0x1812, + 0x1811, 0x31CA, 0x1813, 0x1816, 0x1815, 0x1818, 0x1817, 0x31CB, 0x31CC, 0x31C6, + 0x31C7, 0x2EC5, 0x2EC6, 0x2EE0, 0x2EE1, 0x2EDA, 0x2EDB, 0x2ED7, 0x2FBC, 0x2F98, + 0x2F99, 0x2F92, 0x2F93, 0x2F94, 0x2F95, 0x2F6E, 0x2F6F, 0x2F6B, 0x2F4C, 0x3028, + 0x3029, 0x3022, 0x3023, 0x303F, 0x3038, 0x3039, 0x3032, 0x3033, 0x3034, 0x3035, + 0x300E, 0x183C, 0x300F, 0x3010, 0x3011, 0x300A, 0x300B, 0x3007, 0x3008, 0x3009, + 0x3002, 0x3003, 0x3004, 0x3005, 0x301E, 0x301F, 0x3020, 0x3021, 0x301A, 0x301B, + 0x301C, 0x301D, 0x3016, 0x3017, 0x2FE8, 0x2FE9, 0x2FE2, 0x2FE3, 0x2FE4, 0x2FE5, + 0x2FFE, 0x2FFF, 0x3000, 0x3001, 0x2FFA, 0x2FFB, 0x2FFC, 0x2FFD, 0x2FF6, 0x2FF7, + 0x2FF8, 0x2FF9, 0x2FF2, 0x2FF3, 0x2FF4, 0x2FF5, 0x2FCE, 0x2FCF, 0x2FD0, 0x2FD1, + 0x2FCA, 0x2FCB, 0x2FCC, 0x2FCD, 0x2FC6, 0x2FC7, 0x2FC8, 0x2FC9, 0x2FC2, 0x2FC3, + 0x2FC4, 0x2FC5, 0x2FDE, 0x2FDF, 0x2FD8, 0x2FD9, 0x2FD2, 0x2FD3, 0x2FD4, 0x2FD5, + 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30A6, 0x30A7, + 0x05E3, 0x05D3, 0x062E, 0x060C, 0x062F, 0x060D, 0x0570, 0x0562, 0x0571, 0x0563, + 0x072D, 0x072E, 0x064C, 0x064D, 0x05D9, 0x036C, 0x044A, 0x044B, 0x02EE, 0x02ED, + 0x05DA, 0x05DB, 0x0559, 0x0724, 0x0725, 0x02EB, 0x0674, 0x068C, 0x0477, 0x06BF, + 0x05F3, 0x0644, 0x0653, 0x066E, 0x041B, 0x05CA, 0x05CC, 0x05F7, 0x057A, 0x0595, + 0x05C0, 0x05C5, 0x03BE, 0x0418, 0x043A, 0x045D, 0x072C, 0x02AF, 0x0361, 0x039F, + 0x0716, 0x071F, 0x0726, 0x072B, 0x06E3, 0x06E4, 0x06EB, 0x06F4, 0x0834, 0x0838, + 0x07E9, 0x0836, 0x0789, 0x0788, 0x0791, 0x0790, 0x089F, 0x089E, 0x067F, 0x0694, + 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, + 0x0424, 0x044C, 0x047E, 0x049C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, + 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x06BE, 0x05AC, + 0x045C, 0x07C5, 0x07E7, 0x07F0, 0x076E, 0x0783, 0x078F, 0x0827, 0x0819, 0x077A, + 0x0779, 0x02BD, 0x0749, 0x0763, 0x0779, 0x07C2, 0x0869, 0x05F9, 0x0268, 0x06B2, + 0x06D2, 0x085E, 0x0863, 0x07C5, 0x07F4, 0x07FA, 0x02C6, 0x02EF, 0x032A, 0x036D, + 0x06BE, 0x1DEE, 0x1DED, 0x1DF0, 0x1DEF, 0x1DF2, 0x1DF1, 0x1DF4, 0x1DF3, 0x1DF6, + 0x1DF5, 0x1DF8, 0x1DF7, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, 0x0688, 0x069C, + 0x0554, 0x0578, 0x05BC, 0x05E9, 0x05AC, 0x05DD, 0x04E6, 0x0538, 0x03E2, 0x1E0A, + 0x1E09, 0x1E0C, 0x1E0B, 0x040E, 0x0867, 0x086B, 0x089A, 0x0832, 0x083D, 0x085E, + 0x0863, 0x0816, 0x081B, 0x082A, 0x07C5, 0x07F4, 0x07FA, 0x07FE, 0x0802, 0x07FC, + 0x0800, 0x01A2, 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, + 0x022A, 0x080C, 0x0819, 0x07D8, 0x07ED, 0x07F2, 0x07F8, 0x0779, 0x078D, 0x07AA, + 0x07C2, 0x0749, 0x0763, 0x0310, 0x0819, 0x0867, 0x086B, 0x1596, 0x1595, 0x0827, + 0x1597, 0x159A, 0x1599, 0x159C, 0x159B, 0x159E, 0x159D, 0x15A0, 0x159F, 0x15A2, + 0x15A1, 0x15A4, 0x15A3, 0x082F, 0x082F, 0x083B, 0x0800, 0x080C, 0x0819, 0x07D8, + 0x07ED, 0x07F2, 0x07F8, 0x0779, 0x078D, 0x0765, 0x0769, 0x0861, 0x0827, 0x0885, + 0x0779, 0x07C2, 0x2A2D, 0x2A2F, 0x0865, 0x2A33, 0x0869, 0x019D, 0x01B1, 0x01CF, + 0x01E4, 0x021A, 0x0224, 0x022F, 0x0239, 0x01CF, 0x01E4, 0x01FA, 0x020E, 0x15BD, + 0x15BC, 0x15BF, 0x15BE, 0x15C1, 0x15C0, 0x15C3, 0x15C2, 0x15C5, 0x15C4, 0x15C7, + 0x15C6, 0x022F, 0x0239, 0x019D, 0x01B1, 0x021A, 0x0224, 0x022F, 0x0239, 0x01CF, + 0x01E4, 0x01FA, 0x020E, 0x022F, 0x0239, 0x019D, 0x01B1, 0x01FA, 0x020E, 0x15DB, + 0x0621, 0x05FF, 0x06D6, 0x04BA, 0x03D5, 0x06FC, 0x03E2, 0x040E, 0x067F, 0x0694, + 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x0538, 0x0551, 0x056A, 0x0424, + 0x044C, 0x047E, 0x049C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, 0x042D, + 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x0554, + 0x05BC, 0x05E9, 0x04AB, 0x0510, 0x053D, 0x0412, 0x042D, 0x0395, 0x03B2, 0x03E2, + 0x040E, 0x02C6, 0x02EF, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, + 0x0688, 0x069C, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, + 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x0291, 0x02D0, + 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, + 0x0538, 0x0551, 0x056A, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x067F, 0x0694, 0x06B2, + 0x06D2, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, 0x0554, + 0x0578, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, 0x0412, 0x042D, + 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x063C, 0x0669, 0x0688, 0x069C, 0x05BC, + 0x05E9, 0x0485, 0x01D0, 0x01B2, 0x01FB, 0x01E5, 0x021B, 0x020F, 0x0230, 0x0225, + 0x01B3, 0x023A, 0x01D0, 0x01B2, 0x01FB, 0x01E5, 0x021B, 0x020F, 0x0230, 0x0225, + 0x01B3, 0x023A, 0x01D0, 0x01B2, 0x01FB, 0x0510, 0x021B, 0x020F, 0x0230, 0x03FB, + 0x01B3, 0x023A, 0x0412, 0x042D, 0x045C, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, + 0x03B2, 0x03E2, 0x040E, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x0267, 0x02A8, + 0x04E6, 0x0538, 0x0551, 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, + 0x03E2, 0x040E, 0x2A52, 0x02C6, 0x02EF, 0x2A58, 0x032A, 0x036D, 0x0346, 0x0372, + 0x0395, 0x2A64, 0x0291, 0x02AE, 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, + 0x05DD, 0x061A, 0x065F, 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x0291, + 0x02AE, 0x0300, 0x067F, 0x0694, 0x06B2, 0x2A4F, 0x06D2, 0x06BE, 0x0267, 0x02A8, + 0x063C, 0x0669, 0x0688, 0x069C, 0x0554, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, + 0x053D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, 0x0669, 0x0688, 0x069C, 0x0554, + 0x0578, 0x05BC, 0x05E9, 0x0485, 0x04AB, 0x0510, 0x053D, 0x04E6, 0x0538, 0x0551, + 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x02C6, + 0x02EF, 0x032A, 0x036D, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, + 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x03FB, + 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, + 0x0300, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x0485, 0x04AB, 0x0510, 0x053D, 0x03FB, + 0x0412, 0x042D, 0x045C, 0x0346, 0x0372, 0x0395, 0x03BD, 0x0291, 0x02AE, 0x02D0, + 0x0300, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x063C, + 0x0669, 0x0688, 0x069C, 0x0554, 0x0578, 0x05BC, 0x05E9, 0x0389, 0x03B2, 0x03E2, + 0x040E, 0x02C6, 0x02EF, 0x032A, 0x036D, 0x06BE, 0x06DB, 0x2A13, 0x0267, 0x02A8, + 0x063C, 0x0669, 0x0688, 0x069C, 0x067F, 0x0694, 0x06B2, 0x06D2, 0x05AC, 0x05DD, + 0x061A, 0x065F, 0x04E6, 0x0538, 0x0551, 0x056A, 0x0424, 0x044C, 0x047E, 0x049C, + 0x0192, 0x0193, 0x0194, 0x0195, 0x0234, 0x018F, 0x0190, 0x0191, 0x0209, 0x0215, + 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0196, 0x0197, 0x4355, 0x4356, + 0x4357, 0x4351, 0x4352, 0x4353, 0x4354, 0x434D, 0x434E, 0x434F, 0x4350, 0x4349, + 0x434A, 0x434B, 0x434C, 0x4335, 0x4336, 0x4337, 0x4338, 0x4331, 0x4332, 0x4333, + 0x4334, 0x432D, 0x432E, 0x432F, 0x4330, 0x4329, 0x432A, 0x432B, 0x432C, 0x4345, + 0x4346, 0x4347, 0x4348, 0x4341, 0x4342, 0x4343, 0x4344, 0x433D, 0x433E, 0x433F, + 0x4340, 0x4339, 0x433A, 0x433B, 0x433C, 0x4195, 0x4196, 0x4197, 0x4198, 0x4191, + 0x4192, 0x4193, 0x4194, 0x418D, 0x418E, 0x418F, 0x4190, 0x4189, 0x418A, 0x418B, + 0x418C, 0x41A5, 0x41A6, 0x41A7, 0x41A8, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x419D, + 0x419E, 0x419F, 0x41A0, 0x4199, 0x419A, 0x419B, 0x419C, 0x4175, 0x4176, 0x4177, + 0x4178, 0x4171, 0x4172, 0x4173, 0x4174, 0x416D, 0x416E, 0x416F, 0x4170, 0x4169, + 0x416A, 0x416B, 0x416C, 0x4185, 0x4186, 0x4187, 0x4188, 0x4181, 0x4182, 0x2D71, + 0x2D72, 0x4183, 0x4184, 0x417D, 0x417E, 0x2D6F, 0x2D70, 0x417F, 0x4180, 0x4179, + 0x417A, 0x2D75, 0x2D76, 0x417B, 0x417C, 0x4155, 0x4156, 0x4157, 0x4158, 0x2D73, + 0x2D74, 0x4151, 0x4152, 0x4153, 0x4154, 0x414D, 0x414E, 0x414F, 0x4150, 0x2D98, + 0x2D9D, 0x2D97, 0x2D9E, 0x2D93, 0x2D94, 0x2D83, 0x2D84, 0x2D89, 0x2D8A, 0x2D99, + 0x2D9A, 0x2D7B, 0x2D8E, 0x2D9C, 0x2D8D, 0x2D79, 0x2D78, 0x2D7A, 0x2D77, 0x2D7D, + 0x2D60, 0x2D7E, 0x2D61, 0x2C78, 0x2D6D, 0x2D87, 0x2D88, 0x4149, 0x2D7C, 0x2D64, + 0x2D65, 0x414A, 0x414B, 0x414C, 0x4165, 0x4166, 0x4167, 0x4168, 0x4161, 0x4162, + 0x4163, 0x4164, 0x415D, 0x415E, 0x415F, 0x4160, 0x4159, 0x415A, 0x415B, 0x2DB2, + 0x2DB1, 0x415C, 0x4135, 0x4136, 0x4137, 0x2DB8, 0x4138, 0x2DBD, 0x4131, 0x4132, + 0x2DBE, 0x4133, 0x4134, 0x2D7F, 0x2D80, 0x2D81, 0x2D82, 0x2DC4, 0x2DC3, 0x2D85, + 0x2D86, 0x2DC8, 0x2DC7, 0x2DCA, 0x2DC9, 0x2DCC, 0x2DCB, 0x2DCE, 0x2DCD, 0x412D, + 0x412E, 0x412F, 0x4130, 0x4129, 0x412A, 0x412B, 0x412C, 0x4145, 0x4146, 0x4147, + 0x4148, 0x2D9B, 0x4141, 0x4142, 0x4143, 0x4144, 0x413D, 0x413E, 0x413F, 0x4140, + 0x4139, 0x16B6, 0x16B5, 0x16B8, 0x16B7, 0x16BA, 0x16B9, 0x16BC, 0x16BB, 0x413A, + 0x413B, 0x16C0, 0x16BF, 0x413C, 0x4215, 0x4216, 0x4217, 0x4218, 0x4211, 0x4212, + 0x4213, 0x4214, 0x420D, 0x420E, 0x420F, 0x4210, 0x4209, 0x420A, 0x420B, 0x420C, + 0x4225, 0x4226, 0x4227, 0x4228, 0x4221, 0x4222, 0x4223, 0x4224, 0x421D, 0x421E, + 0x421F, 0x4220, 0x4219, 0x421A, 0x421B, 0x421C, 0x41F5, 0x41F6, 0x41F7, 0x41F8, + 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41ED, 0x41EE, 0x41EF, 0x41F0, 0x41E9, 0x41EA, + 0x41EB, 0x41EC, 0x4205, 0x4206, 0x4207, 0x4208, 0x4201, 0x4202, 0x4203, 0x4204, + 0x41FD, 0x41FE, 0x41FF, 0x4200, 0x41F9, 0x41FA, 0x41FB, 0x41FC, 0x41D5, 0x41D6, + 0x41D7, 0x41D8, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41CD, 0x41CE, 0x41CF, 0x41D0, + 0x41C9, 0x41CA, 0x41CB, 0x2E4D, 0x2E4E, 0x2E44, 0x2E43, 0x41CC, 0x41E5, 0x2E48, + 0x2E47, 0x41E6, 0x41E7, 0x41E8, 0x41E1, 0x2E49, 0x2E4A, 0x41E2, 0x41E3, 0x41E4, + 0x41DD, 0x41DE, 0x41DF, 0x16DF, 0x16E0, 0x2E4B, 0x2E4C, 0x16F9, 0x16FA, 0x16FB, + 0x16FC, 0x16F5, 0x16F6, 0x2E60, 0x2E5F, 0x2E62, 0x2E61, 0x16F7, 0x16F8, 0x2E66, + 0x2E65, 0x16F0, 0x16EF, 0x16ED, 0x16EE, 0x16F4, 0x16F3, 0x16F1, 0x16F2, 0x2E70, + 0x2E6F, 0x2E72, 0x2E71, 0x2E74, 0x2E73, 0x2E76, 0x2E75, 0x2E78, 0x2E77, 0x2E7A, + 0x2E79, 0x2E7C, 0x2E7B, 0x16DE, 0x2E7D, 0x16DD, 0x16E8, 0x16E2, 0x16E3, 0x16E1, + 0x16E4, 0x16FD, 0x16FE, 0x16FF, 0x1700, 0x16E9, 0x16EA, 0x16EB, 0x16EC, 0x1708, + 0x1702, 0x16E7, 0x1701, 0x1703, 0x16E6, 0x1704, 0x16E5, 0x170D, 0x41E0, 0x41D9, + 0x41DA, 0x0215, 0x021F, 0x16DC, 0x170E, 0x41DB, 0x41DC, 0x41B5, 0x41B6, 0x41B7, + 0x41B8, 0x41B1, 0x41B2, 0x01C9, 0x01DF, 0x0198, 0x01A2, 0x41B3, 0x01F5, 0x41B4, + 0x0209, 0x0234, 0x022A, 0x41AD, 0x41AE, 0x41AF, 0x41B0, 0x41A9, 0x41AA, 0x41AB, + 0x41AC, 0x41C5, 0x41C6, 0x41C7, 0x41C8, 0x41C1, 0x41C2, 0x1705, 0x1706, 0x1707, + 0x41C3, 0x1709, 0x170A, 0x170B, 0x170C, 0x41C4, 0x41BD, 0x41BE, 0x41BF, 0x41C0, + 0x41B9, 0x41BA, 0x41BB, 0x41BC, 0x4295, 0x4296, 0x4297, 0x4298, 0x4291, 0x4292, + 0x4293, 0x4294, 0x428D, 0x428E, 0x428F, 0x4290, 0x4289, 0x428A, 0x428B, 0x428C, + 0x42A5, 0x42A6, 0x42A7, 0x42A8, 0x42A1, 0x42A2, 0x42A3, 0x42A4, 0x429D, 0x429E, + 0x429F, 0x42A0, 0x4299, 0x429A, 0x429B, 0x429C, 0x4275, 0x4276, 0x4277, 0x4278, + 0x4271, 0x4272, 0x4273, 0x4274, 0x426D, 0x426E, 0x426F, 0x4270, 0x4269, 0x426A, + 0x426B, 0x426C, 0x4285, 0x4286, 0x4287, 0x4288, 0x4281, 0x4282, 0x4283, 0x4284, + 0x427D, 0x427E, 0x427F, 0x4280, 0x4279, 0x427A, 0x427B, 0x427C, 0x4255, 0x4256, + 0x4257, 0x4258, 0x4251, 0x4252, 0x4253, 0x4254, 0x424D, 0x424E, 0x424F, 0x4250, + 0x4249, 0x424A, 0x424B, 0x424C, 0x4265, 0x4266, 0x4267, 0x4268, 0x4261, 0x4262, + 0x4263, 0x4264, 0x425D, 0x425E, 0x425F, 0x4260, 0x4259, 0x425A, 0x425B, 0x425C, + 0x4235, 0x4236, 0x4237, 0x4238, 0x4231, 0x4232, 0x4233, 0x4234, 0x422D, 0x422E, + 0x422F, 0x4230, 0x4229, 0x422A, 0x422B, 0x422C, 0x4245, 0x4246, 0x4247, 0x4248, + 0x4241, 0x4242, 0x4243, 0x4244, 0x423D, 0x423E, 0x423F, 0x4240, 0x4239, 0x423A, + 0x423B, 0x423C, 0x4315, 0x4316, 0x4317, 0x4318, 0x4311, 0x4312, 0x4313, 0x1710, + 0x170F, 0x1714, 0x1711, 0x4314, 0x1716, 0x171A, 0x1719, 0x171C, 0x171B, 0x171E, + 0x171D, 0x1720, 0x171F, 0x1722, 0x1721, 0x430D, 0x430E, 0x430F, 0x4310, 0x4309, + 0x430A, 0x430B, 0x430C, 0x172C, 0x172B, 0x4325, 0x4326, 0x1730, 0x172F, 0x1732, + 0x1731, 0x4327, 0x4328, 0x4321, 0x4322, 0x4323, 0x4324, 0x431D, 0x431E, 0x431F, + 0x4320, 0x4319, 0x431A, 0x431B, 0x431C, 0x42F5, 0x42F6, 0x42F7, 0x42F8, 0x42F1, + 0x42F2, 0x42F3, 0x42F4, 0x42ED, 0x42EE, 0x42EF, 0x42F0, 0x42E9, 0x42EA, 0x42EB, + 0x42EC, 0x4305, 0x4306, 0x4307, 0x4308, 0x4301, 0x4302, 0x4303, 0x4304, 0x42FD, + 0x42FE, 0x42FF, 0x4300, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42D5, 0x42D6, 0x42D7, + 0x42D8, 0x42D1, 0x42D2, 0x42D3, 0x42D4, 0x42CD, 0x42CE, 0x42CF, 0x42D0, 0x42C9, + 0x42CA, 0x42CB, 0x42CC, 0x42E5, 0x42E6, 0x42E7, 0x42E8, 0x42E1, 0x42E2, 0x42E3, + 0x42E4, 0x42DD, 0x42DE, 0x42DF, 0x42E0, 0x42D9, 0x42DA, 0x42DB, 0x42DC, 0x42B5, + 0x42B6, 0x42B7, 0x42B8, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42AD, 0x42AE, 0x42AF, + 0x42B0, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42C5, 0x42C6, 0x42C7, 0x42C8, 0x1745, + 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42BD, 0x42BE, 0x42BF, 0x42C0, 0x42B9, 0x42BA, + 0x42BB, 0x42BC, 0x3F95, 0x1753, 0x1752, 0x1755, 0x1754, 0x1757, 0x1756, 0x1759, + 0x1758, 0x175B, 0x175A, 0x175D, 0x175C, 0x175F, 0x175E, 0x1761, 0x1760, 0x1763, + 0x1762, 0x3F96, 0x1764, 0x1767, 0x1766, 0x1769, 0x1768, 0x176B, 0x176A, 0x176D, + 0x176C, 0x176F, 0x176E, 0x1771, 0x1770, 0x3F97, 0x3F98, 0x3F91, 0x3F92, 0x3F93, + 0x3F94, 0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F89, 0x3F8A, 0x3F8B, 0x3F8C, 0x3FA5, + 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA1, 0x3FA2, 0x3FA3, 0x1772, 0x3FA4, 0x3F9D, 0x3F9E, + 0x3F9F, 0x3FA0, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C, 0x3F75, 0x01A2, 0x0198, 0x01DF, + 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x3F76, 0x3F77, 0x3F78, + 0x3F71, 0x3F72, 0x3F73, 0x3F74, 0x3F6D, 0x3F6E, 0x3F6F, 0x3F70, 0x3F69, 0x3F6A, + 0x3F6B, 0x3F6C, 0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F81, 0x3F82, 0x3F83, 0x3F84, + 0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C, 0x3F55, 0x3F56, + 0x3F57, 0x3F58, 0x3F51, 0x3F52, 0x3F53, 0x3F54, 0x3F4D, 0x1776, 0x3F4E, 0x3F4F, + 0x3F50, 0x3F49, 0x3F4A, 0x3F4B, 0x3F4C, 0x3F65, 0x3F66, 0x3F67, 0x3F68, 0x3F61, + 0x3F62, 0x1787, 0x1786, 0x1789, 0x1788, 0x178B, 0x178A, 0x178D, 0x3F63, 0x178F, + 0x178E, 0x1791, 0x1790, 0x1793, 0x1792, 0x1795, 0x3F64, 0x1797, 0x1796, 0x3F5D, + 0x1798, 0x179B, 0x179A, 0x177E, 0x179C, 0x177F, 0x177D, 0x3F5E, 0x179D, 0x3F5F, + 0x3F60, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C, 0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F31, + 0x3F32, 0x3F33, 0x3F34, 0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, 0x3F29, 0x3F2A, 0x01A2, + 0x0198, 0x01DF, 0x01C9, 0x0209, 0x01F5, 0x021F, 0x0215, 0x0234, 0x022A, 0x3F2B, + 0x3F2C, 0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F41, 0x3F42, 0x3F43, 0x3F44, 0x3F3D, + 0x3F3E, 0x3F3F, 0x3F40, 0x3F39, 0x3F3A, 0x3F3B, 0x3F3C, 0x4015, 0x4016, 0x4017, + 0x4018, 0x4011, 0x4012, 0x4013, 0x4014, 0x400D, 0x400E, 0x400F, 0x4010, 0x4009, + 0x400A, 0x400B, 0x400C, 0x4025, 0x4026, 0x4027, 0x4028, 0x4021, 0x4022, 0x4023, + 0x4024, 0x401D, 0x401E, 0x401F, 0x4020, 0x4019, 0x401A, 0x401B, 0x401C, 0x3FF5, + 0x3FF6, 0x3FF7, 0x3FF8, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4, 0x3FED, 0x3FEE, 0x3FEF, + 0x3FF0, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC, 0x4005, 0x4006, 0x4007, 0x4008, 0x4001, + 0x4002, 0x4003, 0x4004, 0x3FFD, 0x3FFE, 0x3FFF, 0x4000, 0x3FF9, 0x3FFA, 0x3FFB, + 0x3FFC, 0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD1, 0x3FD2, 0x3FD3, 0x3FD4, 0x3FCD, + 0x3FCE, 0x3FCF, 0x3FD0, 0x3FC9, 0x3FCA, 0x3FCB, 0x3FCC, 0x3FE5, 0x3FE6, 0x3FE7, + 0x3FE8, 0x3FE1, 0x08A2, 0x08A3, 0x08A4, 0x08A5, 0x08A6, 0x3FE2, 0x08A8, 0x08A9, + 0x08AA, 0x3FE3, 0x3FE4, 0x08AF, 0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x08B4, 0x08B5, + 0x08B6, 0x08B7, 0x08B8, 0x08BA, 0x08BD, 0x08BE, 0x08BF, 0x08C0, 0x08C1, 0x08C2, + 0x08C7, 0x08C8, 0x08C9, 0x08CA, 0x3FD9, 0x3FDA, 0x3FDB, 0x3FDC, 0x3FB5, 0x3FB6, + 0x3FB7, 0x3FB8, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4, 0x3FAD, 0x3FAE, 0x3FAF, 0x3FB0, + 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC, 0x0913, 0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC1, + 0x3FC2, 0x3FC3, 0x3FC4, 0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, 0x3FB9, 0x3FBA, 0x3FBB, + 0x3FBC, 0x4095, 0x4096, 0x4097, 0x4098, 0x4091, 0x4092, 0x4093, 0x4094, 0x408D, + 0x408E, 0x408F, 0x4090, 0x4089, 0x408A, 0x408B, 0x408C, 0x40A5, 0x40A6, 0x40A7, + 0x40A8, 0x40A1, 0x40A2, 0x40A3, 0x40A4, 0x409D, 0x409E, 0x409F, 0x40A0, 0x4099, + 0x409A, 0x409B, 0x409C, 0x4075, 0x4076, 0x4077, 0x4078, 0x4071, 0x4072, 0x4073, + 0x4074, 0x406D, 0x406E, 0x406F, 0x4070, 0x4069, 0x406A, 0x406B, 0x406C, 0x4085, + 0x4086, 0x4087, 0x4088, 0x4081, 0x4082, 0x4083, 0x4084, 0x407D, 0x407E, 0x407F, + 0x4080, 0x4079, 0x407A, 0x407B, 0x407C, 0x4055, 0x4056, 0x4057, 0x4058, 0x4051, + 0x4052, 0x4053, 0x4054, 0x0B39, 0x404D, 0x404E, 0x0B4B, 0x0B48, 0x0B54, 0x0B4E, + 0x0B5A, 0x404F, 0x0B60, 0x0B5D, 0x0B66, 0x4050, 0x0B6C, 0x0B69, 0x4049, 0x404A, + 0x404B, 0x404C, 0x4065, 0x4066, 0x4067, 0x4068, 0x4061, 0x4062, 0x4063, 0x4064, + 0x405D, 0x405E, 0x405F, 0x4060, 0x4059, 0x405A, 0x405B, 0x405C, 0x10AE, 0x10AD, + 0x10B0, 0x10AF, 0x10B2, 0x4035, 0x10B4, 0x10B3, 0x10B6, 0x4036, 0x4037, 0x10B7, + 0x4038, 0x4031, 0x4032, 0x4033, 0x10BF, 0x10BE, 0x10C1, 0x10C0, 0x10C3, 0x10C2, + 0x10C5, 0x10C4, 0x10C7, 0x10C6, 0x10C9, 0x10C8, 0x10CB, 0x10CA, 0x10CD, 0x10CC, + 0x4034, 0x402D, 0x402E, 0x402F, 0x4030, 0x4029, 0x402A, 0x402B, 0x402C, 0x4045, + 0x4046, 0x4047, 0x4048, 0x10DB, 0x4041, 0x4042, 0x4043, 0x4044, 0x403D, 0x403E, + 0x403F, 0x4040, 0x4039, 0x403A, 0x403B, 0x403C, 0x4115, 0x4116, 0x4117, 0x4118, + 0x4111, 0x4112, 0x4113, 0x4114, 0x410D, 0x410E, 0x410F, 0x4110, 0x4109, 0x410A, + 0x410B, 0x410C, 0x4125, 0x4126, 0x4127, 0x4128, 0x4121, 0x4122, 0x4123, 0x4124, + 0x411D, 0x411E, 0x411F, 0x4120, 0x4119, 0x411A, 0x411B, 0x411C, 0x40F5, 0x40F6, + 0x40F7, 0x40F8, 0x40F1, 0x40F2, 0x40F3, 0x40F4, 0x40ED, 0x40EE, 0x40EF, 0x40F0, + 0x40E9, 0x40EA, 0x40EB, 0x40EC, 0x4105, 0x4106, 0x4107, 0x4108, 0x4101, 0x4102, + 0x4103, 0x4104, 0x40FD, 0x40FE, 0x40FF, 0x4100, 0x40F9, 0x40FA, 0x40FB, 0x40FC, + 0x40D5, 0x40D6, 0x40D7, 0x40D8, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40CD, 0x40CE, + 0x40CF, 0x40D0, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40E5, 0x40E6, 0x40E7, 0x40E8, + 0x40E1, 0x40E2, 0x128F, 0x128E, 0x1291, 0x1290, 0x1293, 0x1292, 0x40E3, 0x1294, + 0x1296, 0x1295, 0x1298, 0x1297, 0x129A, 0x1299, 0x40E4, 0x129B, 0x40DD, 0x40DE, + 0x40DF, 0x40E0, 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40B5, 0x40B6, 0x40B7, 0x40B8, + 0x40B1, 0x12A7, 0x40B2, 0x40B3, 0x40B4, 0x40AD, 0x40AE, 0x40AF, 0x40B0, 0x40A9, + 0x40AA, 0x40AB, 0x40AC, 0x40C5, 0x40C6, 0x40C7, 0x40C8, 0x40C1, 0x40C2, 0x40C3, + 0x40C4, 0x40BD, 0x40BE, 0x40BF, 0x40C0, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x48AB, + 0x490A, 0x490B, 0x48AC, 0x4909, 0x4975, 0x48A7, 0x48A9, 0x48A1, 0x48A2, 0x48A3, + 0x48A5, 0x489A, 0x4974, 0x489D, 0x4908, 0x48BA, 0x497B, 0x48B6, 0x48B7, 0x48B8, + 0x48B9, 0x4979, 0x48B3, 0x490D, 0x48B5, 0x4976, 0x490C, 0x4977, 0x4978, 0x021F, + 0x022A, 0x0234, 0x018E, 0x01F5, 0x0209, 0x0215, 0x018A, 0x018B, 0x018C, 0x018D, + 0x0186, 0x0187, 0x0188, 0x0189, 0x01F5, 0x0209, 0x0215, 0x01A2, 0x0234, 0x0234, + 0x01C9, 0x01DF, 0x022A, 0x022A, 0x0234, 0x0234, 0x0215, 0x021F, 0x021F, 0x021F, + 0x0182, 0x0183, 0x0184, 0x0185, 0x01A2, 0x01C9, 0x0180, 0x0181, 0x0209, 0x0209, + 0x01C9, 0x01DF, 0x01C9, 0x01DF, 0x01F5, 0x01F5, 0x01A2, 0x01C9, 0x01DF, 0x01DF, + 0x0215, 0x021F, 0x022A, 0x0234, 0x01DF, 0x01DF, 0x01F5, 0x0209, 0x01DF, 0x01F5, + 0x0209, 0x01C9, 0x01F5, 0x01F5, 0x01F5, 0x01F5, 0x01F5, 0x0209, 0x01DF, 0x01DF, + 0x01A2, 0x01C9, 0x01DF, 0x01DF, 0x01F5, 0x0209, 0x017E, 0x017F, 0x021F, 0x022A, + 0x0234, 0x01F5, 0x01DF, 0x01F5, 0x0209, 0x0215, 0x0215, 0x021F, 0x022A, 0x0234, + 0x01C9, 0x01DF, 0x01F5, 0x0209, 0x022A, 0x0234, 0x01A2, 0x01C9, 0x01F5, 0x0209, + 0x0215, 0x021F, 0x0234, 0x01A2, 0x01C9, 0x01DF, 0x0209, 0x0215, 0x021F, 0x022A, + 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4, 0x3ECD, 0x3ECE, 0x3ECF, 0x3ED0, 0x3EC9, 0x3ECA, + 0x3ECB, 0x3ECC, 0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4, + 0x3EDD, 0x3EDE, 0x3EDF, 0x3EE0, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC, 0x3ED5, 0x3ED6, + 0x3ED7, 0x3ED8, 0x3EB1, 0x3EB2, 0x3EB3, 0x3EB4, 0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, + 0x3EA9, 0x3EAA, 0x3EAB, 0x3EAC, 0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EC1, 0x3EC2, + 0x3EC3, 0x3EC4, 0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EB9, 0x3EBA, 0x3EBB, 0x3EBC, + 0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3E91, 0x3E92, 0x3E93, 0x3E94, 0x3E8D, 0x3E8E, + 0x3E8F, 0x3E90, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C, 0x3E85, 0x3E86, 0x3E87, 0x3E88, + 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4, 0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, 0x3E99, 0x3E9A, + 0x3E9B, 0x3E9C, 0x3E95, 0x3E96, 0x3E97, 0x3E98, 0x3E71, 0x3E72, 0x3E73, 0x3E74, + 0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E69, 0x3E6A, 0x3E6B, 0x3E6C, 0x3E65, 0x3E66, + 0x3E67, 0x3E68, 0x3E81, 0x3E82, 0x3E83, 0x3E84, 0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, + 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C, 0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3F25, 0x3F26, + 0x3F27, 0x3F28, 0x3F11, 0x3F12, 0x3F13, 0x3F14, 0x3F0D, 0x3F1E, 0x3F1F, 0x3F20, + 0x3F19, 0x464C, 0x270E, 0x270D, 0x2710, 0x270F, 0x2712, 0x2711, 0x2714, 0x2713, + 0x2716, 0x2715, 0x2718, 0x2717, 0x271A, 0x2719, 0x271C, 0x271B, 0x271E, 0x271D, + 0x2720, 0x271F, 0x2722, 0x2721, 0x2724, 0x2723, 0x2726, 0x2725, 0x2728, 0x2727, + 0x272A, 0x2756, 0x272C, 0x272B, 0x272E, 0x272D, 0x2730, 0x272F, 0x2732, 0x2731, + 0x2734, 0x2733, 0x2736, 0x2735, 0x2738, 0x2737, 0x273A, 0x2739, 0x273C, 0x273B, + 0x273E, 0x276F, 0x2740, 0x273F, 0x2742, 0x274F, 0x2744, 0x2778, 0x278A, 0x2745, + 0x275B, 0x275A, 0x274A, 0x2749, 0x274C, 0x274B, 0x1BFE, 0x274D, 0x2729, 0x276B, + 0x2750, 0x1BD5, 0x2751, 0x1BD9, 0x1BDA, 0x2758, 0x276C, 0x1BDC, 0x1BDB, 0x1BDE, + 0x1BDD, 0x1BE0, 0x1BE6, 0x1BE2, 0x2764, 0x275F, 0x1BDF, 0x1BE3, 0x277C, 0x2762, + 0x276A, 0x1BE1, 0x1BE5, 0x2760, 0x275E, 0x1BD6, 0x275D, 0x275C, 0x2769, 0x1BED, + 0x1BEE, 0x2747, 0x277A, 0x2741, 0x276D, 0x1BEF, 0x1BF6, 0x276E, 0x2789, 0x1BEC, + 0x1BF2, 0x1BE7, 0x1BF7, 0x278B, 0x1BD8, 0x1BE9, 0x2757, 0x2768, 0x1BE4, 0x2761, + 0x2763, 0x2766, 0x1BE8, 0x1BEA, 0x2767, 0x278C, 0x2785, 0x2743, 0x2784, 0x273D, + 0x1BFD, 0x1BFC, 0x2790, 0x278F, 0x278E, 0x2793, 0x2792, 0x278D, 0x2791, 0x279A, + 0x2787, 0x2788, 0x27A9, 0x2799, 0x279C, 0x279B, 0x279F, 0x27A2, 0x27A0, 0x1BD7, + 0x1BFF, 0x27A3, 0x27A4, 0x279E, 0x279D, 0x27AA, 0x27A6, 0x27A1, 0x27A5, 0x27AB, + 0x27AC, 0x27A7, 0x1BEB, 0x277B, 0x1C02, 0x1C00, 0x2782, 0x1C03, 0x1C04, 0x2781, + 0x27C5, 0x27C6, 0x2746, 0x1C16, 0x1C18, 0x1BFA, 0x1C17, 0x1C15, 0x27BE, 0x1BF0, + 0x27C0, 0x27BF, 0x27C2, 0x27C1, 0x27C4, 0x27C3, 0x27BD, 0x27C7, 0x27C8, 0x1C29, + 0x1C28, 0x1C01, 0x1C2B, 0x2779, 0x27D2, 0x1C24, 0x27CE, 0x1C2A, 0x277E, 0x27D1, + 0x27D4, 0x27D3, 0x1C27, 0x1C22, 0x27CF, 0x27D0, 0x27CD, 0x27F1, 0x2759, 0x277D, + 0x27D5, 0x2765, 0x2755, 0x274E, 0x340C, 0x2752, 0x2753, 0x2754, 0x27D6, 0x27E5, + 0x27D7, 0x27D8, 0x27EA, 0x27E9, 0x27EC, 0x27EB, 0x27F2, 0x277F, 0x27F3, 0x27F4, + 0x27ED, 0x27EE, 0x27EF, 0x27F0, 0x2783, 0x27F5, 0x27F9, 0x27FA, 0x27FB, 0x27FC, + 0x27F7, 0x27F8, 0x2771, 0x27F6, 0x2774, 0x1C1B, 0x2809, 0x280A, 0x1BFB, 0x2780, + 0x280B, 0x280C, 0x1BF5, 0x3406, 0x3405, 0x3408, 0x3407, 0x340A, 0x3409, 0x1C1C, + 0x340B, 0x340E, 0x340D, 0x3410, 0x340F, 0x3412, 0x3411, 0x3414, 0x3413, 0x3417, + 0x3400, 0x3418, 0x3416, 0x33FE, 0x3419, 0x3415, 0x33FF, 0x3402, 0x3401, 0x3404, + 0x3403, 0x341B, 0x341A, 0x341C, 0x3421, 0x341E, 0x341D, 0x3420, 0x341F, 0x3428, + 0x3422, 0x3434, 0x3426, 0x3427, 0x3429, 0x3430, 0x3435, 0x3431, 0x342E, 0x3423, + 0x342F, 0x3425, 0x3436, 0x342C, 0x3424, 0x3432, 0x342A, 0x342B, 0x342D, 0x2C6A, + 0x3433, 0x2C64, 0x2C65, 0x2C70, 0x2C7A, 0x2D23, 0x2C71, 0x2C79, 0x01C9, 0x01A2, + 0x01DF, 0x2D1C, 0x2C6B, 0x2C8C, 0x2CAA, 0x2CA5, 0x2C91, 0x47D2, 0x0198, 0x2C86, + 0x2CA4, 0x2CB7, 0x2C80, 0x2C7F, 0x2CD2, 0x2CCC, 0x2C8D, 0x2CC5, 0x2CD3, 0x2CBB, + 0x2CA9, 0x2CBC, 0x2CB0, 0x2C7B, 0x2CAB, 0x47D3, 0x2C87, 0x2C08, 0x2CC0, 0x1BF8, + 0x2CF5, 0x2CF6, 0x1BF1, 0x47D4, 0x286E, 0x286D, 0x2C9F, 0x1BF4, 0x2CB6, 0x2776, + 0x2770, 0x2773, 0x2CB1, 0x287A, 0x2CEF, 0x2D15, 0x287B, 0x2879, 0x287C, 0x2D59, + 0x2AB7, 0x2AB9, 0x2D53, 0x1BF3, 0x2D20, 0x2772, 0x2AAD, 0x2AAE, 0x1BF9, 0x2786, + 0x2777, 0x1C14, 0x2AAF, 0x288C, 0x2C72, 0x288B, 0x1C23, 0x1C21, 0x2AA9, 0x2D5D, + 0x1C1E, 0x1C1F, 0x2AB2, 0x1C1D, 0x1C25, 0x2C85, 0x1C26, 0x1C20, 0x1C11, 0x2A70, + 0x2C6C, 0x2C68, 0x2ADA, 0x2C66, 0x2A7F, 0x2A82, 0x2CAE, 0x2CB3, 0x2A8B, 0x1C13, + 0x2A7C, 0x2AB5, 0x1C08, 0x1C07, 0x2CB4, 0x2CA6, 0x2CBD, 0x2CC2, 0x2D4D, 0x2CA1, + 0x2CAD, 0x2CA7, 0x2CB8, 0x2D49, 0x2D26, 0x2D4E, 0x2D33, 0x1C19, 0x2CB9, 0x2CBE, + 0x1C06, 0x1C05, 0x2AEB, 0x2D38, 0x1C0B, 0x2C97, 0x1C0C, 0x1C0D, 0x1C10, 0x1C0F, + 0x1C0E, 0x1C1A, 0x1C0A, 0x1C09, 0x1C12, 0x2A88, 0x2AE8, 0x2AEA, 0x2AED, 0x2AEC, + 0x2D56, 0x2AEE, 0x2AEF, 0x2AF0, 0x2AE0, 0x2AF3, 0x2AE2, 0x2AF5, 0x2B0A, 0x2AE5, + 0x2AE6, 0x2AE7, 0x2C1D, 0x2AE1, 0x2ADB, 0x2AE3, 0x2CCB, 0x2C1E, 0x2C1F, 0x2C20, + 0x2CD7, 0x2CD8, 0x2CDD, 0x2CE0, 0x2CE3, 0x2C1A, 0x2C1B, 0x2C19, 0x2CEE, 0x2AD7, + 0x2AD8, 0x2ADF, 0x2CF7, 0x2CFD, 0x2CFE, 0x2CFF, 0x2D05, 0x2D06, 0x2D07, 0x2ADC, + 0x2ADD, 0x2D0F, 0x2D16, 0x2D19, 0x2C16, 0x2AC7, 0x2C15, 0x2C1C, 0x2E7E, 0x2EA9, + 0x2E82, 0x2E80, 0x2E85, 0x2E83, 0x2E88, 0x2E86, 0x2E8A, 0x2E89, 0x2E90, 0x2E8C, + 0x2E98, 0x2E99, 0x2E9A, 0x2E9B, 0x2E95, 0x2E97, 0x2B68, 0x2B65, 0x2E92, 0x2E94, + 0x2EAC, 0x2EAE, 0x2E9E, 0x2EA7, 0x2EA2, 0x2EA4, 0x2EB1, 0x2EAF, 0x2EB3, 0x2EB2, + 0x2EB6, 0x293A, 0x2EBB, 0x2EBA, 0x2EC1, 0x2AD9, 0x2E8E, 0x2C17, 0x2935, 0x2E96, + 0x293C, 0x2C18, 0x2A6E, 0x2E9D, 0x2BC1, 0x2A71, 0x2BC5, 0x2A74, 0x2A77, 0x2BC8, + 0x2A7D, 0x2A7A, 0x2BD0, 0x2BCD, 0x2BD6, 0x2BD3, 0x2BDC, 0x2BD9, 0x2A80, 0x2AB0, + 0x2A86, 0x2A83, 0x36E7, 0x2C13, 0x2ADE, 0x2A8C, 0x2A89, 0x36E8, 0x2ABD, 0x2A95, + 0x2C10, 0x2C12, 0x2A9B, 0x2A8F, 0x2B35, 0x2B32, 0x2B3B, 0x2B38, 0x2B41, 0x2B3E, + 0x2B47, 0x2B44, 0x2B4D, 0x2B4A, 0x2B53, 0x2B50, 0x2B59, 0x2B56, 0x2B5F, 0x2B5C, + 0x01C9, 0x2E84, 0x2C00, 0x2AA1, 0x36EA, 0x1880, 0x2ABB, 0x2B2F, 0x2C05, 0x2A92, + 0x2A98, 0x2EB4, 0x187F, 0x01A2, 0x2AA4, 0x2AB8, 0x2ACA, 0x36E3, 0x1878, 0x2B6B, + 0x2AB6, 0x2AC0, 0x1877, 0x2EA8, 0x021F, 0x2EBE, 0x2ACD, 0x1875, 0x187A, 0x2AE9, + 0x36E5, 0x0198, 0x2C23, 0x2AF1, 0x2C25, 0x2B05, 0x2B07, 0x2AF7, 0x2B7C, 0x2B7E, + 0x2B91, 0x2B8C, 0x2B8E, 0x2BA0, 0x2B03, 0x2B82, 0x2B9C, 0x2C6E, 0x2C8A, 0x47E1, + 0x1894, 0x47DF, 0x47E2, 0x47E0, 0x2C8F, 0x2C8E, 0x2C7D, 0x36EB, 0x2C83, 0x2C89, + 0x2C94, 0x2C81, 0x2AB4, 0x2C0D, 0x2EB7, 0x2E7F, 0x2E8B, 0x2E93, 0x2EAB, 0x2E9C, + 0x2EA5, 0x2EA6, 0x2EA3, 0x2EC0, 0x2EBF, 0x2EBC, 0x2EAA, 0x2EAD, 0x2EB0, 0x2C75, + 0x2E87, 0x2EB5, 0x2EBD, 0x2E81, 0x2E9F, 0x2EB8, 0x2E91, 0x2E8D, 0x2BF7, 0x2EA1, + 0x2EA0, 0x2BF2, 0x2EB9, 0x2E8F, 0x2EC2, 0x2C73, 0x2CF2, 0x36EF, 0x2CF9, 0x2CF3, + 0x2D03, 0x2A9E, 0x2CFB, 0x187D, 0x2D0B, 0x2D0A, 0x1884, 0x2D11, 0x2D17, 0x293B, + 0x2D02, 0x2D01, 0x2AA8, 0x2CFA, 0x2939, 0x1882, 0x187C, 0x1876, 0x36E9, 0x36ED, + 0x1C3C, 0x1C3D, 0x1C2D, 0x2B2C, 0x187E, 0x2C30, 0x2C14, 0x1C3A, 0x2D13, 0x2953, + 0x2B62, 0x2BF0, 0x2D3E, 0x294E, 0x2AD5, 0x2AC2, 0x2955, 0x2ACF, 0x2AD1, 0x2AD3, + 0x2D42, 0x2D1A, 0x2D46, 0x2D4A, 0x2CAC, 0x2C93, 0x2CD9, 0x2CB2, 0x2BFA, 0x2AAA, + 0x2CF0, 0x2D09, 0x2CE4, 0x2D08, 0x2D3A, 0x2D1D, 0x2D10, 0x1C3B, 0x2CF8, 0x2D00, + 0x2952, 0x187B, 0x1879, 0x022A, 0x1870, 0x2954, 0x1C41, 0x1881, 0x186A, 0x186C, + 0x36E4, 0x36E6, 0x186B, 0x1883, 0x36D5, 0x36EE, 0x36D4, 0x36EC, 0x36D3, 0x36D6, + 0x345D, 0x3473, 0x3457, 0x01F5, 0x345E, 0x47DC, 0x36D7, 0x0B5B, 0x0209, 0x0215, + 0x47D6, 0x47DB, 0x47D8, 0x0B61, 0x47DA, 0x01DF, 0x36D8, 0x3460, 0x36DC, 0x3461, + 0x345C, 0x36DA, 0x345B, 0x0B5E, 0x36F0, 0x1869, 0x3462, 0x36F1, 0x0B49, 0x022A, + 0x36DE, 0x47DD, 0x01C9, 0x01DF, 0x345A, 0x3459, 0x3469, 0x3464, 0x3465, 0x3468, + 0x3458, 0x345F, 0x346F, 0x3466, 0x36DD, 0x346D, 0x0198, 0x01A2, 0x0203, 0x186D, + 0x0215, 0x0B6A, 0x0B6D, 0x0209, 0x0215, 0x021F, 0x01C9, 0x0234, 0x3463, 0x17BA, + 0x17CD, 0x348B, 0x17B9, 0x17D2, 0x0198, 0x0234, 0x0215, 0x0209, 0x17D4, 0x17D0, + 0x17D1, 0x021F, 0x17CF, 0x17CE, 0x17B8, 0x343F, 0x0140, 0x17C9, 0x344A, 0x343D, + 0x01F5, 0x17C8, 0x0142, 0x17C6, 0x17C7, 0x17CA, 0x17D5, 0x343C, 0x17CB, 0x17CC, + 0x01C9, 0x01DF, 0x0143, 0x0144, 0x17BB, 0x01A2, 0x17D7, 0x17D8, 0x0145, 0x17E0, + 0x17E2, 0x343B, 0x17D6, 0x346A, 0x346E, 0x17DC, 0x17E4, 0x3467, 0x17D3, 0x17E7, + 0x346C, 0x17DA, 0x3477, 0x0146, 0x3449, 0x346B, 0x3476, 0x3475, 0x347C, 0x01C9, + 0x022A, 0x17E1, 0x347D, 0x347E, 0x3445, 0x3444, 0x3446, 0x1867, 0x1866, 0x347F, + 0x3482, 0x3481, 0x3486, 0x3480, 0x3488, 0x348A, 0x1874, 0x348C, 0x3487, 0x3489, + 0x3485, 0x1DC8, 0x348E, 0x348D, 0x01DF, 0x1DAA, 0x1871, 0x186F, 0x3483, 0x3484, + 0x1873, 0x0B1C, 0x186E, 0x0B6E, 0x0B58, 0x0B13, 0x0B1F, 0x0B19, 0x01EC, 0x188B, + 0x1890, 0x1DAE, 0x188A, 0x17E3, 0x17DF, 0x1889, 0x1872, 0x17E6, 0x1DAB, 0x0B70, + 0x17E5, 0x0B25, 0x47DE, 0x0B79, 0x1DA9, 0x0B52, 0x0B82, 0x0B86, 0x0B1A, 0x188D, + 0x188E, 0x188F, 0x0B71, 0x1891, 0x0B8C, 0x47D7, 0x022A, 0x1DBB, 0x0215, 0x0209, + 0x01F5, 0x17BC, 0x17BD, 0x17BE, 0x021F, 0x17BF, 0x17C0, 0x0234, 0x17C1, 0x17C2, + 0x17C3, 0x17C4, 0x17C5, 0x0B38, 0x0B17, 0x47D9, 0x0B4A, 0x0B53, 0x0B5C, 0x0B5F, + 0x0B14, 0x0B47, 0x0B62, 0x0B65, 0x0B68, 0x0B6B, 0x0B59, 0x0B8A, 0x0B56, 0x0B7A, + 0x0141, 0x0B7D, 0x17D9, 0x0B3B, 0x0B80, 0x0B26, 0x0B84, 0x0B77, 0x0B87, 0x0B74, + 0x0B89, 0x0B88, 0x0B8E, 0x0B8D, 0x47D5, 0x0B83, 0x3470, 0x3471, 0x3472, 0x1DDC, + 0x3474, 0x1DD4, 0x1DE0, 0x1DE5, 0x3478, 0x3479, 0x347A, 0x347B, 0x1D9D, 0x1DDF, + 0x1DDE, 0x1DE7, 0x120C, 0x1210, 0x120D, 0x120E, 0x1DB1, 0x1DB4, 0x1DB5, 0x1DC7, + 0x1DBE, 0x1DC1, 0x1DC2, 0x1DC3, 0x1DE8, 0x1DCF, 0x1DCC, 0x0198, 0x01A2, 0x2B34, + 0x2B31, 0x2B74, 0x2B40, 0x2B2E, 0x021F, 0x2B75, 0x2B6F, 0x2B2B, 0x2B70, 0x2B71, + 0x2B43, 0x2B76, 0x2B3D, 0x2B49, 0x2B4F, 0x1DDB, 0x2B55, 0x1DDD, 0x2B67, 0x2B3A, + 0x2B37, 0x2B52, 0x2B72, 0x2B5B, 0x2B46, 0x2B4C, 0x2B73, 0x2B6A, 0x2B6D, 0x2B58, + 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x021F, 0x2AF8, 0x2AF9, 0x2AFA, 0x0234, 0x01F5, + 0x2AF4, 0x11FD, 0x0209, 0x2AF2, 0x2AF6, 0x0215, 0x1211, 0x11FF, 0x11FE, 0x123A, + 0x120F, 0x1215, 0x1201, 0x11FC, 0x022A, 0x1212, 0x1213, 0x1214, 0x1DD6, 0x1216, + 0x1217, 0x1218, 0x2B61, 0x1D94, 0x1243, 0x1238, 0x1DCB, 0x1239, 0x2B6E, 0x1DDA, + 0x1237, 0x1208, 0x1264, 0x1265, 0x1236, 0x1263, 0x1DA6, 0x123D, 0x1DD9, 0x2B5E, + 0x11FB, 0x2B64, 0x1221, 0x1D77, 0x1D79, 0x1D7B, 0x1DB2, 0x1D8D, 0x1D97, 0x1DAC, + 0x1D84, 0x1DB6, 0x1DB7, 0x1DBC, 0x1106, 0x1107, 0x1108, 0x1109, 0x1155, 0x1156, + 0x1157, 0x1158, 0x125E, 0x125F, 0x1260, 0x1261, 0x215C, 0x126B, 0x126C, 0x126D, + 0x1204, 0x1205, 0x120A, 0x1209, 0x120B, 0x1200, 0x123C, 0x1202, 0x215A, 0x2164, + 0x1206, 0x1207, 0x2162, 0x20E4, 0x2166, 0x2168, 0x20CA, 0x0B16, 0x20CE, 0x20D0, + 0x20CC, 0x0B22, 0x20D2, 0x0B2B, 0x0B2E, 0x0B31, 0x0B34, 0x0B37, 0x0B3A, 0x0B40, + 0x0B43, 0x0B46, 0x20DA, 0x20DC, 0x20E6, 0x20E8, 0x20E2, 0x20D4, 0x20D6, 0x20D8, + 0x0B64, 0x0B67, 0x20DE, 0x20E0, 0x2102, 0x0B73, 0x0B76, 0x0B7C, 0x210C, 0x210E, + 0x2110, 0x2136, 0x2114, 0x2134, 0x2118, 0x2138, 0x213A, 0x213C, 0x210A, 0x2140, + 0x2116, 0x2144, 0x213E, 0x2148, 0x0B11, 0x2132, 0x2130, 0x2142, 0x0B1D, 0x0B20, + 0x0B23, 0x0B29, 0x212E, 0x0B2F, 0x0B32, 0x0B35, 0x212C, 0x0B3E, 0x0B41, 0x212A, + 0x214A, 0x214C, 0x214E, 0x2150, 0x2112, 0x2154, 0x2156, 0x2158, 0x211A, 0x211C, + 0x211E, 0x2120, 0x2122, 0x2124, 0x2126, 0x2128, 0x216A, 0x216C, 0x216E, 0x2170, + 0x2172, 0x2174, 0x2152, 0x215E, 0x2169, 0x216B, 0x216D, 0x216F, 0x2171, 0x2173, + 0x2146, 0x2160, 0x4644, 0x4645, 0x4647, 0x464E, 0x463F, 0x4640, 0x4640, 0x4642, + 0x4639, 0x463B, 0x463C, 0x463D, 0x4661, 0x4662, 0x4663, 0x4627, 0x461F, 0x4620, + 0x4621, 0x4622, 0x48CF, 0x4619, 0x461A, 0x461D, 0x4611, 0x4612, 0x4613, 0x4614, + 0x4638, 0x4634, 0x4636, 0x4637, 0x22E0, 0x22DC, 0x4916, 0x22DF, 0x462F, 0x22DD, + 0x22DE, 0x4630, 0x22E7, 0x4631, 0x4915, 0x4748, 0x22E8, 0x22E1, 0x22E2, 0x22E3, + 0x462C, 0x22E5, 0x462D, 0x4629, 0x22F0, 0x22F9, 0x462A, 0x22E9, 0x22F4, 0x22F7, + 0x22F6, 0x22E6, 0x22F8, 0x22F5, 0x22FA, 0x22FB, 0x462A, 0x462A, 0x48CB, 0x4912, + 0x45F6, 0x45F7, 0x45EF, 0x45F0, 0x45F3, 0x45F1, 0x45E6, 0x45EA, 0x45EB, 0x45ED, + 0x45DE, 0x45DC, 0x230F, 0x45DF, 0x2310, 0x490E, 0x2312, 0x230D, 0x230E, 0x4970, + 0x230C, 0x460B, 0x2316, 0x2317, 0x2314, 0x2311, 0x460C, 0x2313, 0x48CE, 0x114D, + 0x4603, 0x45E4, 0x4604, 0x1154, 0x4605, 0x45F9, 0x115A, 0x45FF, 0x4911, 0x4602, + 0x115E, 0x45F8, 0x1160, 0x1161, 0x2319, 0x2315, 0x45FD, 0x490F, 0x48CC, 0x492F, + 0x231A, 0x231B, 0x4713, 0x48E1, 0x4715, 0x470C, 0x470D, 0x470E, 0x4711, 0x4709, + 0x4705, 0x470B, 0x48E0, 0x4700, 0x1178, 0x4706, 0x4708, 0x492E, 0x117C, 0x4721, + 0x117D, 0x117E, 0x4723, 0x471F, 0x4725, 0x491C, 0x4932, 0x471E, 0x4933, 0x471A, + 0x471C, 0x471D, 0x4931, 0x4930, 0x118A, 0x118B, 0x4716, 0x3DD9, 0x3DDA, 0x118F, + 0x1190, 0x1191, 0x3DD3, 0x3DD4, 0x3DD5, 0x3DD6, 0x3DCF, 0x3DD0, 0x3DD1, 0x3DD2, + 0x3DCB, 0x3DCC, 0x3DCD, 0x3DCE, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DE3, 0x3DE4, + 0x3DE5, 0x3DE6, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DDB, 0x3DDC, 0x3DDD, 0x3DDE, + 0x3E57, 0x3E58, 0x3E59, 0x3E5A, 0x3E53, 0x3E54, 0x3E55, 0x3E56, 0x3E4F, 0x3E50, + 0x3E51, 0x3E52, 0x3E4B, 0x3E4C, 0x3E4D, 0x3E4E, 0x3E63, 0x3E64, 0x3E5F, 0x3E60, + 0x3E61, 0x3E62, 0x3E5B, 0x3E5C, 0x3E5D, 0x3E5E, 0x3B37, 0x3B38, 0x3B39, 0x35B6, + 0x35B5, 0x35B8, 0x35B7, 0x35BA, 0x35B9, 0x35BC, 0x35BB, 0x35BE, 0x35BD, 0x35C0, + 0x35BF, 0x35C2, 0x35C1, 0x35C4, 0x35C3, 0x35C6, 0x35C5, 0x35C8, 0x35C7, 0x35CA, + 0x35C9, 0x35CC, 0x35CB, 0x35CE, 0x35CD, 0x35D0, 0x35CF, 0x35D2, 0x35D1, 0x35D4, + 0x35D3, 0x35D6, 0x35D5, 0x35D8, 0x35D7, 0x3B3A, 0x3B33, 0x35DC, 0x35DB, 0x233D, + 0x233E, 0x233F, 0x235C, 0x235F, 0x2343, 0x235E, 0x235D, 0x35E6, 0x35E5, 0x35E8, + 0x35E7, 0x35EA, 0x35E9, 0x35EC, 0x35EB, 0x35EE, 0x35ED, 0x35F0, 0x35EF, 0x35F2, + 0x35F1, 0x35F4, 0x35F3, 0x234D, 0x2350, 0x234F, 0x2352, 0x2351, 0x235A, 0x2359, + 0x233C, 0x2341, 0x2342, 0x3607, 0x3608, 0x3605, 0x3606, 0x360C, 0x2346, 0x2345, + 0x361E, 0x2347, 0x361D, 0x2364, 0x2360, 0x2370, 0x22EF, 0x2375, 0x2361, 0x2362, + 0x22F2, 0x22ED, 0x22EE, 0x22EC, 0x22C8, 0x3619, 0x22F3, 0x361F, 0x235B, 0x35D9, + 0x35DA, 0x22C9, 0x361A, 0x35DD, 0x35DE, 0x35DF, 0x35E0, 0x35E1, 0x35E2, 0x35E3, + 0x35E4, 0x2395, 0x2396, 0x2397, 0x22F1, 0x2399, 0x239A, 0x3CF3, 0x3CF7, 0x3BAB, + 0x3D26, 0x3BB9, 0x3BB8, 0x3BBA, 0x3BB7, 0x3BB3, 0x3BB4, 0x362E, 0x3BB1, 0x3617, + 0x3618, 0x3632, 0x3631, 0x3630, 0x3ADE, 0x3616, 0x3635, 0x3615, 0x3D1F, 0x3ADD, + 0x361B, 0x3ADB, 0x361C, 0x3638, 0x3636, 0x3639, 0x3637, 0x363C, 0x3628, 0x363D, + 0x3BC7, 0x362A, 0x3BAE, 0x363E, 0x363F, 0x3BC8, 0x363B, 0x363A, 0x362F, 0x362D, + 0x3BAC, 0x362C, 0x3AE1, 0x3624, 0x3AE2, 0x3633, 0x3634, 0x3BAD, 0x3629, 0x3BB5, + 0x3626, 0x3627, 0x3BB2, 0x3BC3, 0x3BC4, 0x3620, 0x362B, 0x3622, 0x3623, 0x3BC9, + 0x3625, 0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, 0x3B92, 0x3B93, + 0x3B94, 0x3B95, 0x3B96, 0x35F7, 0x35F8, 0x35F9, 0x35FA, 0x3603, 0x3604, 0x3601, + 0x35FE, 0x3D1E, 0x35FD, 0x35FF, 0x3602, 0x3600, 0x3B9A, 0x3D1D, 0x3D1C, 0x3BA7, + 0x3D1B, 0x3609, 0x360A, 0x360B, 0x35F6, 0x360D, 0x360E, 0x360F, 0x3610, 0x3611, + 0x3612, 0x3613, 0x3614, 0x35F5, 0x3621, 0x3B97, 0x3B98, 0x3B99, 0x3BCA, 0x35FB, + 0x35FC, 0x3BBD, 0x3BBE, 0x3BBC, 0x3BC1, 0x3BBB, 0x3BC2, 0x3D21, 0x3D20, 0x3D22, + 0x3BC6, 0x3BBF, 0x3BC0, 0x3BC5, 0x3DB8, 0x3B4C, 0x3B4B, 0x3B4E, 0x3B4D, 0x3B50, + 0x3B4F, 0x3B52, 0x3B51, 0x3B54, 0x3B53, 0x3B56, 0x3B55, 0x3B58, 0x3B57, 0x3B5A, + 0x3B59, 0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, 0x3BA2, 0x3B64, + 0x3B63, 0x3BA5, 0x3BA6, 0x3B68, 0x3B67, 0x3B6A, 0x3B69, 0x3B6C, 0x3B6B, 0x3B6E, + 0x3B6D, 0x3B70, 0x3B6F, 0x3B72, 0x3B71, 0x3B74, 0x3B73, 0x3B76, 0x3B75, 0x3B78, + 0x3B77, 0x3B7A, 0x3B79, 0x3B7C, 0x3B7B, 0x3B7E, 0x3B7D, 0x3B80, 0x3B7F, 0x3B82, + 0x3B81, 0x3B84, 0x3B83, 0x3B86, 0x3B85, 0x3B88, 0x3B87, 0x3B8A, 0x3B89, 0x3BA3, + 0x3BA4, 0x3BA9, 0x3BAA, 0x3BA8, 0x3378, 0x3377, 0x337A, 0x3379, 0x337D, 0x337B, + 0x337E, 0x337C, 0x3380, 0x337F, 0x3382, 0x3381, 0x3384, 0x3383, 0x3386, 0x3385, + 0x3389, 0x3387, 0x3388, 0x338A, 0x338C, 0x338B, 0x338E, 0x338D, 0x3390, 0x338F, + 0x3392, 0x3391, 0x3394, 0x3393, 0x3396, 0x3395, 0x3398, 0x3397, 0x339A, 0x3399, + 0x339B, 0x339C, 0x339E, 0x339D, 0x33A0, 0x339F, 0x33A2, 0x33A1, 0x33A4, 0x33A3, + 0x33A6, 0x33A5, 0x33A8, 0x33A7, 0x33AA, 0x33A9, 0x33AC, 0x33AB, 0x33AE, 0x33AD, + 0x33B0, 0x33AF, 0x33B2, 0x33B1, 0x33B4, 0x33B3, 0x33B5, 0x3BD1, 0x3BD2, 0x33BA, + 0x33B7, 0x3BCD, 0x3BD6, 0x33BB, 0x3BCE, 0x3BD4, 0x3BD0, 0x3BDA, 0x33B9, 0x3BDC, + 0x3BDB, 0x3BDE, 0x3BDD, 0x01A2, 0x3BD3, 0x3BE2, 0x33BC, 0x3BE4, 0x3BE6, 0x3BE3, + 0x3BCF, 0x3BE8, 0x3BEA, 0x3BE7, 0x3BE9, 0x01C9, 0x1176, 0x1175, 0x33B8, 0x1177, + 0x117A, 0x1179, 0x1174, 0x117B, 0x01F5, 0x0209, 0x118E, 0x3BD7, 0x3BD8, 0x3BD9, + 0x0215, 0x021F, 0x10F8, 0x3BFE, 0x3BFD, 0x10F9, 0x10F7, 0x1102, 0x3C01, 0x10FD, + 0x10FF, 0x10FE, 0x1101, 0x1100, 0x10FC, 0x10FB, 0x10FA, 0x3D0B, 0x3D0C, 0x3D0E, + 0x33B6, 0x3D0F, 0x3D10, 0x3D0D, 0x3D12, 0x3D13, 0x3D14, 0x3D15, 0x3D16, 0x3D17, + 0x3D18, 0x3D11, 0x3D1A, 0x10F6, 0x10E5, 0x10E9, 0x10EC, 0x10E8, 0x1103, 0x1104, + 0x1105, 0x3D23, 0x3D24, 0x3D25, 0x3D19, 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, + 0x3D2C, 0x3D2D, 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34, 0x3D35, 0x3D36, 0x3D37, + 0x3D38, 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C, 0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, + 0x3D42, 0x3D43, 0x3D44, 0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, + 0x3D4C, 0x1114, 0x1145, 0x1138, 0x113C, 0x1151, 0x1184, 0x10EA, 0x10EB, 0x1147, + 0x1113, 0x1149, 0x10F0, 0x114A, 0x1148, 0x1170, 0x1119, 0x113E, 0x11D3, 0x11D4, + 0x11D9, 0x11DA, 0x11D7, 0x110C, 0x110D, 0x110E, 0x110B, 0x1111, 0x11DD, 0x11DE, + 0x11DF, 0x1112, 0x11DC, 0x11D8, 0x3CAC, 0x1116, 0x11E8, 0x111E, 0x11E7, 0x110F, + 0x1115, 0x111A, 0x11F3, 0x11F2, 0x11E1, 0x112D, 0x11E0, 0x11E2, 0x11F9, 0x11F8, + 0x121D, 0x1182, 0x1187, 0x1186, 0x122A, 0x1188, 0x121F, 0x1220, 0x121E, 0x1226, + 0x1222, 0x1224, 0x1244, 0x1245, 0x1246, 0x3C8C, 0x3C8B, 0x3C8E, 0x3C8D, 0x3C90, + 0x3C8F, 0x3C92, 0x3C91, 0x3C94, 0x3C93, 0x3C96, 0x3C95, 0x3C98, 0x3C97, 0x3C9A, + 0x3C99, 0x123F, 0x1240, 0x1241, 0x1242, 0x3CA0, 0x3C9F, 0x123B, 0x3CA1, 0x3CA4, + 0x3CA3, 0x3CA6, 0x3CA5, 0x3CA8, 0x3CA7, 0x3CAA, 0x3CA9, 0x2BB5, 0x3CAB, 0x3CAE, + 0x3CAD, 0x3CB0, 0x3CAF, 0x3CB2, 0x3CB1, 0x3CB4, 0x3CB3, 0x3CB6, 0x3CB5, 0x3CB8, + 0x3CB7, 0x3CBA, 0x3CB9, 0x3CBC, 0x3CBB, 0x3CBE, 0x3CBD, 0x3CC0, 0x3CBF, 0x3CC2, + 0x3CC1, 0x3CC4, 0x3CC3, 0x3CC6, 0x3CC5, 0x3CC8, 0x3CC7, 0x3CCA, 0x3CC9, 0x3CCC, + 0x3CCB, 0x1262, 0x1268, 0x3CD0, 0x3CCF, 0x3CCD, 0x3CCE, 0x3CD4, 0x3CD3, 0x3CD6, + 0x3CD5, 0x1266, 0x1269, 0x3CD1, 0x3CD2, 0x3CDC, 0x3CDB, 0x3CDE, 0x3CDD, 0x3CE0, + 0x3CDF, 0x3CE2, 0x3CE1, 0x3CE4, 0x3CE3, 0x3CE6, 0x3CE5, 0x3CE8, 0x3CE7, 0x3CEA, + 0x3CE9, 0x1223, 0x118D, 0x3CFD, 0x1271, 0x1270, 0x1185, 0x1267, 0x3CFC, 0x118C, + 0x126F, 0x1227, 0x1228, 0x1229, 0x122C, 0x122B, 0x3CDA, 0x122D, 0x0063, 0x0234, + 0x0062, 0x0065, 0x1181, 0x005F, 0x1183, 0x0061, 0x3CFE, 0x125A, 0x2BAF, 0x2BB0, + 0x2BB1, 0x3CD9, 0x2BB3, 0x3CEB, 0x3CEC, 0x2BB6, 0x2BB2, 0x3CEF, 0x3CF0, 0x3CED, + 0x3CEE, 0x3D03, 0x3CF4, 0x3CF5, 0x3CF6, 0x2BAD, 0x2BAE, 0x3CF1, 0x3CF2, 0x3CFB, + 0x3CFF, 0x3CF9, 0x3CFA, 0x2BAB, 0x3D00, 0x3D01, 0x3D02, 0x3D04, 0x2BAC, 0x3D05, + 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x125C, 0x2C39, 0x2C3B, 0x005D, 0x005C, + 0x2C3A, 0x005E, 0x0060, 0x0066, 0x3CF8, 0x022A, 0x01DF, 0x3CD7, 0x3CD8, 0x125B, + 0x0064, 0x125D, 0x124E, 0x124F, 0x1250, 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, + 0x1256, 0x1259, 0x1258, 0x2C3F, 0x1257, 0x2C38, 0x2BB4, 0x3D4E, 0x3D4D, 0x3D75, + 0x3D9B, 0x3D52, 0x3D51, 0x3D4F, 0x3D50, 0x3D56, 0x3D55, 0x3D58, 0x3D57, 0x3D5A, + 0x3D59, 0x3D53, 0x3D54, 0x3D5E, 0x3D5D, 0x3D60, 0x3D5F, 0x3D62, 0x3D61, 0x3D64, + 0x3D63, 0x3D66, 0x3D65, 0x3D68, 0x3D67, 0x3D6A, 0x3D69, 0x3D6C, 0x3D6B, 0x3D6E, + 0x3D6D, 0x3D70, 0x3D6F, 0x3D72, 0x3D71, 0x3D74, 0x3D73, 0x3D76, 0x3D86, 0x3D78, + 0x3D77, 0x3D7A, 0x3D79, 0x3D7C, 0x3D7B, 0x3D7E, 0x3D7D, 0x3D80, 0x3D7F, 0x3D82, + 0x3D81, 0x3D84, 0x3D83, 0x3D5C, 0x3D85, 0x3D88, 0x3D87, 0x3D8A, 0x3D89, 0x3D8C, + 0x3D8B, 0x3D8E, 0x3D8D, 0x3D90, 0x3D8F, 0x3D92, 0x3D91, 0x3DB3, 0x3D93, 0x3D96, + 0x3DA4, 0x3D98, 0x3D97, 0x3D9A, 0x3D99, 0x3D9C, 0x3D94, 0x3D9E, 0x3D5B, 0x3DA0, + 0x3D9F, 0x3D2F, 0x3D2E, 0x3DA2, 0x3DA1, 0x3D9D, 0x3DA3, 0x3DA6, 0x3DA5, 0x3DA8, + 0x3DA7, 0x3DAA, 0x3DA9, 0x3DAD, 0x3DAB, 0x3DAE, 0x3DC8, 0x3DB1, 0x3DAF, 0x3DB2, + 0x3DAC, 0x3DB5, 0x3DC4, 0x3DB6, 0x3DB0, 0x3DBA, 0x3DB7, 0x3DC9, 0x3DB4, 0x3DBC, + 0x3DBB, 0x3DBE, 0x3DBD, 0x3DC0, 0x3DBF, 0x3DC2, 0x3DC1, 0x3D95, 0x3DC3, 0x3DC6, + 0x3DC5, 0x3DCA, 0x3DC7, 0x4919, 0x4918, 0x466C, 0x3DD7, 0x3DEF, 0x3E1A, 0x48D0, + 0x466F, 0x4671, 0x48D1, 0x3DD8, 0x4673, 0x4675, 0x491A, 0x4677, 0x4676, 0x491B, + 0x4679, 0x4626, 0x4625, 0x467C, 0x46A1, 0x467E, 0x48D2, 0x4684, 0x4682, 0x491D, + 0x4683, 0x491E, 0x4686, 0x4688, 0x4689, 0x469E, 0x4928, 0x3DF7, 0x3DEB, 0x3DEE, + 0x3DED, 0x3DF0, 0x3DEC, 0x3DF2, 0x3DF1, 0x3E03, 0x3DF3, 0x3DF6, 0x3DF5, 0x3DF8, + 0x3DF4, 0x3DFA, 0x3DF9, 0x3DFF, 0x3DFB, 0x3DFE, 0x3DFD, 0x3E00, 0x3DFC, 0x3E02, + 0x3E01, 0x3E07, 0x4921, 0x3E06, 0x3E05, 0x3E08, 0x3E04, 0x3E0A, 0x3E09, 0x3E0C, + 0x3E0B, 0x3E0E, 0x3E0D, 0x3E10, 0x3E0F, 0x3E12, 0x3E11, 0x3E14, 0x3E24, 0x3E16, + 0x3E15, 0x3E18, 0x3E17, 0x3E2F, 0x3E19, 0x3E1C, 0x3E1B, 0x3E1E, 0x3E1D, 0x3E20, + 0x3E1F, 0x3E22, 0x3E21, 0x3DB9, 0x3E23, 0x3E26, 0x3E25, 0x3E28, 0x3E27, 0x3E2A, + 0x3E29, 0x3E2C, 0x3E2B, 0x3E2E, 0x3E2D, 0x3E30, 0x3E40, 0x3E32, 0x3E31, 0x3E34, + 0x3E33, 0x3E36, 0x3E35, 0x3E38, 0x3E37, 0x3E3A, 0x3E39, 0x3E3C, 0x3E3B, 0x3E3E, + 0x3E3D, 0x3E13, 0x3E3F, 0x3E42, 0x3E41, 0x3E44, 0x3E43, 0x3E46, 0x3E45, 0x3E48, + 0x3E47, 0x3E4A, 0x3E49, 0x468E, 0x48D3, 0x468A, 0x468D, 0x4691, 0x4692, 0x48D4, + 0x491F, 0x48D5, 0x4695, 0x468F, 0x4690, 0x46AA, 0x497A, 0x4696, 0x4697, 0x4921, + 0x47F2, 0x46A0, 0x46A0, 0x48D6, 0x46C7, 0x4952, 0x46A2, 0x48ED, 0x48D7, 0x46A6, + 0x46A9, 0x46AC, 0x46A4, 0x472D, 0x4729, 0x472B, 0x472A, 0x472F, 0x472E, 0x4728, + 0x4934, 0x4736, 0x4735, 0x473A, 0x48E3, 0x4935, 0x4739, 0x4740, 0x493A, 0x4937, + 0x4936, 0x4746, 0x4741, 0x4744, 0x4745, 0x4747, 0x48E4, 0x4749, 0x474A, 0x4910, + 0x474C, 0x4938, 0x474F, 0x476C, 0x4752, 0x4759, 0x4757, 0x493B, 0x475A, 0x4733, + 0x475C, 0x493D, 0x493C, 0x4765, 0x4763, 0x4766, 0x48E5, 0x48E6, 0x475D, 0x476D, + 0x48E9, 0x4770, 0x476F, 0x48E7, 0x4773, 0x493E, 0x4775, 0x493F, 0x4624, 0x4920, + 0x477A, 0x4940, 0x477C, 0x4942, 0x4941, 0x4777, 0x48E8, 0x4944, 0x4787, 0x4784, + 0x4943, 0x4786, 0x48EC, 0x4946, 0x4787, 0x48EB, 0x478E, 0x4789, 0x478A, 0x494C, + 0x48F3, 0x4948, 0x47AB, 0x48EE, 0x4791, 0x4799, 0x4949, 0x494B, 0x494A, 0x47A3, + 0x47A0, 0x47A5, 0x48EF, 0x47A7, 0x47A6, 0x47BF, 0x4945, 0x494D, 0x494D, 0x478C, + 0x48E6, 0x47AF, 0x47AE, 0x48F0, 0x494E, 0x48F2, 0x47B5, 0x47B7, 0x47B9, 0x4951, + 0x47BA, 0x48F1, 0x494F, 0x47C4, 0x47C2, 0x48F4, 0x47C8, 0x4652, 0x4953, 0x4955, + 0x48F5, 0x4956, 0x47CC, 0x47D1, 0x47CE, 0x4957, 0x47E4, 0x47E6, 0x4958, 0x47E8, + 0x4959, 0x48F6, 0x4929, 0x47ED, 0x495A, 0x47EE, 0x48F8, 0x47EC, 0x4670, 0x492A, + 0x495B, 0x47F2, 0x47F8, 0x4860, 0x47F3, 0x480B, 0x48F9, 0x47F9, 0x47F7, 0x48FB, + 0x495C, 0x47FC, 0x47FB, 0x47FA, 0x47FE, 0x47FF, 0x47FD, 0x4805, 0x4810, 0x4806, + 0x4800, 0x4804, 0x4618, 0x4808, 0x4803, 0x480A, 0x4809, 0x495F, 0x495D, 0x48FA, + 0x495E, 0x4813, 0x4812, 0x4963, 0x4815, 0x492B, 0x4816, 0x48FC, 0x48FE, 0x4962, + 0x4961, 0x481D, 0x487E, 0x481F, 0x481E, 0x4822, 0x4820, 0x4824, 0x4821, 0x4827, + 0x4823, 0x4826, 0x4825, 0x48FD, 0x4828, 0x482B, 0x482A, 0x482E, 0x48FF, 0x4964, + 0x482F, 0x4833, 0x4832, 0x4836, 0x4900, 0x4965, 0x4855, 0x4901, 0x4966, 0x483D, + 0x4902, 0x484A, 0x4843, 0x4967, 0x484C, 0x484E, 0x484D, 0x4854, 0x4853, 0x4913, + 0x4969, 0x496D, 0x4856, 0x4914, 0x4858, 0x485D, 0x485A, 0x48CD, 0x4960, 0x486B, + 0x4868, 0x496A, 0x496B, 0x4876, 0x486E, 0x487A, 0x4879, 0x487D, 0x4878, 0x486D, + 0x496C, 0x4903, 0x487F, 0x496E, 0x4881, 0x488C, 0x4904, 0x4891, 0x468B, 0x4971, + 0x496F, 0x4906, 0x4905, 0x4972, 0x4896, 0x4973, 0x4907, 0x4898, 0x4898, 0x3B34, + 0x3B35, 0x3B36, 0x3B2F, 0x3B30, 0x3B31, 0x3B32, 0x3B2B, 0x3B2C, 0x3B2D, 0x3B2E, + 0x3B47, 0x3B48, 0x3B49, 0x3B4A, 0x3B43, 0x3B44, 0x3B45, 0x3B46, 0x3B3F, 0x3B40, + 0x3B41, 0x3B42, 0x3B3B, 0x3B3C, 0x3B3D, 0x3B3E, 0x3B17, 0x3B18, 0x3B19, 0x3B1A, + 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B0F, 0x3B10, 0x3B11, 0x3B12, 0x3B0B, 0x3B0C, + 0x3B0D, 0x3B0E, 0x3B27, 0x3B28, 0x3B29, 0x2BA7, 0x3B2A, 0x3B23, 0x3B24, 0x3B25, + 0x3B26, 0x3B1F, 0x3B20, 0x3B21, 0x3B22, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3AF7, + 0x3AF8, 0x3AF9, 0x3AFA, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AEF, 0x3AF0, 0x3AF1, + 0x2BA8, 0x3AF2, 0x3AEB, 0x3AEC, 0x3AED, 0x3AEE, 0x3B07, 0x3B08, 0x3B09, 0x3B0A, + 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3AFF, 0x3B00, 0x3B01, 0x3B02, 0x3AFB, 0x3AFC, + 0x3AFD, 0x3AFE, 0x3AD7, 0x3AD8, 0x3AD9, 0x466B, 0x466D, 0x3EE6, 0x3EE5, 0x3EE8, + 0x3EE7, 0x466A, 0x3EE9, 0x3F0A, 0x4673, 0x3EEE, 0x3EED, 0x3EF0, 0x3EEF, 0x3EF2, + 0x3EF1, 0x3EF4, 0x3EF3, 0x3EF6, 0x3EF5, 0x3EF8, 0x3EF7, 0x3EFA, 0x3EF9, 0x3EFC, + 0x3EFB, 0x3EFE, 0x3EFD, 0x3F00, 0x3EFF, 0x3F02, 0x3F09, 0x3F04, 0x3F03, 0x3F06, + 0x3F05, 0x3F08, 0x3F07, 0x3F21, 0x3F1A, 0x3F0C, 0x3ADA, 0x3F10, 0x3F0B, 0x3AD3, + 0x3F0E, 0x3AD4, 0x3AD5, 0x3F0F, 0x3AD6, 0x3F16, 0x3F15, 0x3F18, 0x3F17, 0x3F1C, + 0x46D4, 0x46CB, 0x3F1B, 0x46CA, 0x3F1D, 0x3ACF, 0x3AD0, 0x3F22, 0x46C6, 0x3F24, + 0x3F23, 0x3AD1, 0x3AD2, 0x3ACB, 0x3ACC, 0x4699, 0x3ACD, 0x3ACE, 0x3AE7, 0x3AE8, + 0x3AE9, 0x3AEA, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3ADF, 0x3AE0, 0x3ADC, 0x3BB6, + 0x3BAF, 0x46C4, 0x3BB0, 0x46C3, 0x3B65, 0x3B66, 0x46CF, 0x3B5F, 0x46D3, 0x3B60, + 0x3B61, 0x3B62, 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3C37, 0x3C38, 0x3C39, 0x3C3A, + 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C2F, 0x3C30, 0x3C31, 0x3C32, 0x3C2B, 0x3C2C, + 0x3C2D, 0x3C2E, 0x3C47, 0x3C48, 0x3C49, 0x3C4A, 0x3C43, 0x3C44, 0x3C45, 0x3C46, + 0x3C3F, 0x3C40, 0x3C41, 0x3C42, 0x46D2, 0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C17, + 0x3C18, 0x3C19, 0x3C1A, 0x3C13, 0x3C14, 0x3C15, 0x3C16, 0x3C0F, 0x3C10, 0x3C11, + 0x3C12, 0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, 0x3C27, 0x3C28, 0x3C29, 0x3C2A, 0x3C23, + 0x46D0, 0x3C24, 0x3C25, 0x3C26, 0x3C1F, 0x3C20, 0x3C21, 0x3C22, 0x3C1B, 0x3C1C, + 0x3C1D, 0x3C1E, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA, 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, + 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2, 0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3C07, 0x3C08, + 0x3C09, 0x3C0A, 0x3C03, 0x3C04, 0x3C05, 0x3C06, 0x3BFF, 0x3C00, 0x3C02, 0x3BFB, + 0x3BFC, 0x3BD5, 0x3BCB, 0x3BCC, 0x3BE5, 0x3BDF, 0x3BE0, 0x3BE1, 0x3CA2, 0x3C9B, + 0x3C9C, 0x3C9D, 0x3C9E, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, 0x3C73, 0x3C74, 0x3C75, + 0x3C76, 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C6B, 0x3C6C, 0x3C6D, 0x3C6E, 0x3C87, + 0x3C88, 0x3C89, 0x3C8A, 0x3C83, 0x3C84, 0x3C85, 0x3C86, 0x3C7F, 0x3C80, 0x3C81, + 0x3C82, 0x3C7B, 0x3C7C, 0x3C7D, 0x3C7E, 0x3C57, 0x3C58, 0x3C59, 0x3C5A, 0x3C53, + 0x3C54, 0x3C55, 0x3C56, 0x3C4F, 0x3C50, 0x3C51, 0x3C52, 0x3C4B, 0x2BB8, 0x2BB7, + 0x2BBA, 0x2BB9, 0x2BBC, 0x2BBB, 0x3C4C, 0x2BBD, 0x3C4D, 0x3C4E, 0x2C33, 0x2C50, + 0x2C35, 0x2C34, 0x2C37, 0x2C36, 0x3C67, 0x3C68, 0x3C69, 0x3C6A, 0x2C3D, 0x2C3C, + 0x2C57, 0x2C3E, 0x2C41, 0x2C40, 0x2C43, 0x2C42, 0x2C45, 0x2C44, 0x2C47, 0x2C46, + 0x2C49, 0x2C48, 0x2C4B, 0x2C4A, 0x2C4D, 0x2C4C, 0x2C51, 0x2C4E, 0x2C60, 0x2C55, + 0x2C53, 0x2C52, 0x2BA9, 0x2C56, 0x2C54, 0x2BAA, 0x2C59, 0x2C58, 0x2C5B, 0x2C5A, + 0x2C5D, 0x2C5C, 0x2C5F, 0x2C5E, 0x2C61, 0x2C62, 0x2C63, 0x3C63, 0x3C64, 0x3C65, + 0x3C66, 0x2C4F, 0x460D, 0x47B6, 0x46CE, 0x48D9, 0x465A, 0x48D8, 0x46B1, 0x46B0, + 0x46B2, 0x46B7, 0x46B8, 0x46B9, 0x46B8, 0x46BC, 0x46BD, 0x4922, 0x46BF, 0x46C0, + 0x46C2, 0x4694, 0x4894, 0x47B4, 0x47D0, 0x46F3, 0x464F, 0x479B, 0x48C4, 0x4925, + 0x46C1, 0x464A, 0x4649, 0x46D6, 0x46DB, 0x4926, 0x46DD, 0x46DA, 0x46D8, 0x48DA, + 0x46DF, 0x46E1, 0x46E3, 0x46E0, 0x48DB, 0x46E5, 0x46E7, 0x4927, 0x46EC, 0x46F6, + 0x46EE, 0x48DE, 0x46F1, 0x48DD, 0x48DC, 0x4600, 0x4601, 0x46F7, 0x46F2, 0x47EB, + 0x48F7, 0x46F8, 0x46F9, 0x46FA, 0x46FE, 0x46FC, 0x492C, 0x48DF, 0x4703, 0x467B, + 0x4954, 0x465F, 0x4660, 0x467A, 0x4655, 0x483B, 0x4668, 0x469B, 0x4674, 0x4727, + 0x485E, 0x4653, 0x4650, 0x478F, 0x45F4, 0x483C, 0x4646, 0x48E2, 0x4717, 0x4837, + 0x4884, 0x465E, 0x4651, 0x482D, 0x48BF, 0x4654, 0x460D, 0x48C0, 0x48C7, 0x46B1, + 0x4605, 0x4864, 0x461D, 0x0E3A, 0x4682, 0x486C, 0x48C9, 0x4680, 0x4659, 0x464B, + 0x45FE, 0x489F, 0x46BB, 0x4648, 0x45F6, 0x45F3, 0x45E7, 0x461A, 0x45EA, 0x4643, + 0x47C3, 0x4846, 0x461F, 0x488A, 0x45FA, 0x46BD, 0x4656, 0x4625, 0x4649, 0x48C6, + 0x3C5F, 0x3C60, 0x3C61, 0x3C62, 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, 0x0210, 0x021C, + 0x0226, 0x0231, 0x01B3, 0x01D1, 0x01E6, 0x01FC, 0x0D05, 0x0D15, 0x0D16, 0x01E8, + 0x0D18, 0x0D3B, 0x0D3D, 0x0D63, 0x0D72, 0x0D71, 0x01E9, 0x0D73, 0x01EA, 0x0D64, + 0x01EB, 0x0DDD, 0x0F8A, 0x0FFE, 0x0FA7, 0x0FA6, 0x0FA9, 0x4917, 0x0FFD, 0x0FFC, + 0x0E77, 0x0E87, 0x0E88, 0x01D9, 0x0DDF, 0x01DA, 0x0E05, 0x0E04, 0x01E6, 0x01E7, + 0x01D5, 0x01D6, 0x4758, 0x0FA8, 0x01D7, 0x01D8, 0x01D2, 0x476B, 0x01D3, 0x01D4, + 0x0E56, 0x0030, 0x0035, 0x0032, 0x0C8E, 0x0DEF, 0x0DCE, 0x0C8F, 0x0CF0, 0x0CBC, + 0x0C95, 0x473E, 0x3EEB, 0x3EEC, 0x0D00, 0x0CEF, 0x3EEA, 0x0CC0, 0x0CBE, 0x0F74, + 0x4734, 0x0ED7, 0x0F18, 0x0F1B, 0x0ED3, 0x0FEF, 0x0009, 0x0E76, 0x472D, 0x0FEE, + 0x0E57, 0x0011, 0x0034, 0x002E, 0x0D65, 0x0033, 0x002D, 0x0D0B, 0x0031, 0x3F01, + 0x0EDA, 0x002F, 0x0DCD, 0x0036, 0x0F4D, 0x012B, 0x4708, 0x0EE8, 0x0DD9, 0x0D0C, + 0x0DDB, 0x0127, 0x0C8D, 0x0CBF, 0x0CC1, 0x0128, 0x0C96, 0x0D04, 0x0CBD, 0x0129, + 0x0EC7, 0x012A, 0x0123, 0x0124, 0x0DDA, 0x0F1F, 0x0F21, 0x0F49, 0x0125, 0x0126, + 0x021F, 0x022A, 0x0234, 0x0122, 0x1C36, 0x1C37, 0x1C38, 0x1C39, 0x1C32, 0x1C33, + 0x1C34, 0x1C35, 0x1C2E, 0x1C2F, 0x1C30, 0x1C31, 0x1C2C, 0x0204, 0x0205, 0x0210, + 0x01FF, 0x0200, 0x0201, 0x0202, 0x01EF, 0x01FC, 0x01FD, 0x01FE, 0x01ED, 0x01EE, + 0x01DF, 0x01F5, 0x0209, 0x02CE, 0x0234, 0x01A2, 0x1892, 0x1893, 0x0EEA, 0x01F5, + 0x188C, 0x1885, 0x1886, 0x0EEB, 0x0EEC, 0x1887, 0x1888, 0x36DF, 0x0EE6, 0x0E55, + 0x0663, 0x0E26, 0x0687, 0x0E3B, 0x36E0, 0x36E1, 0x36E2, 0x36DB, 0x0EE7, 0x36D9, + 0x1868, 0x2936, 0x2937, 0x2938, 0x2931, 0x2932, 0x2933, 0x2934, 0x292D, 0x292E, + 0x4751, 0x292F, 0x2930, 0x2945, 0x4795, 0x4797, 0x4796, 0x4798, 0x2941, 0x2942, + 0x2943, 0x2944, 0x293D, 0x293E, 0x293F, 0x2940, 0x2919, 0x291A, 0x291B, 0x291C, + 0x2915, 0x2916, 0x2917, 0x2918, 0x2911, 0x2912, 0x2913, 0x4847, 0x4851, 0x4852, + 0x4862, 0x4864, 0x488E, 0x4897, 0x489B, 0x46AF, 0x4939, 0x47F4, 0x2914, 0x290D, + 0x45DA, 0x290E, 0x290F, 0x2910, 0x45F5, 0x2929, 0x4619, 0x292A, 0x4643, 0x463E, + 0x4642, 0x292B, 0x4657, 0x465B, 0x4664, 0x4667, 0x292C, 0x2925, 0x2926, 0x2927, + 0x2928, 0x2921, 0x2922, 0x2923, 0x2924, 0x291D, 0x291E, 0x291F, 0x2920, 0x2962, + 0x2963, 0x295E, 0x295F, 0x2960, 0x2961, 0x295A, 0x295B, 0x295C, 0x295D, 0x2956, + 0x2957, 0x2958, 0x2959, 0x1C46, 0x1C47, 0x1C48, 0x1C49, 0x1C42, 0x1C43, 0x1C44, + 0x1C45, 0x1C3E, 0x1C3F, 0x1C40, 0x294F, 0x2950, 0x2951, 0x294A, 0x294B, 0x294C, + 0x294D, 0x2946, 0x2947, 0x2948, 0x0E20, 0x0E3E, 0x0E3C, 0x2949, 0x0E54, 0x17DD, + 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x17DB, 0x17DE, 0x2CE7, 0x2CEA, 0x2CED, + 0x2CC1, 0x0E75, 0x2CC6, 0x2CCA, 0x0E73, 0x2D0E, 0x2D0D, 0x2C92, 0x2C98, 0x2C99, + 0x2C9E, 0x0E85, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, 0x3443, 0x3440, + 0x3441, 0x3442, 0x343E, 0x3437, 0x3438, 0x3439, 0x343A, 0x3453, 0x3454, 0x3455, + 0x3456, 0x344F, 0x3450, 0x3451, 0x3452, 0x344B, 0x344C, 0x344D, 0x344E, 0x3447, + 0x3448, 0x2D47, 0x2D4B, 0x2D4F, 0x2D50, 0x2D36, 0x2D3B, 0x2D3F, 0x2D43, 0x2D2A, + 0x2D2E, 0x2D30, 0x2D34, 0x2D1E, 0x2D21, 0x2D24, 0x2D28, 0x2CA3, 0x2D55, 0x2D58, + 0x2D5B, 0x2C76, 0x2C88, 0x2C9A, 0x2D51, 0x2D54, 0x2D57, 0x2D5A, 0x2D5E, 0x2CE5, + 0x2CE8, 0x2CEB, 0x2CF1, 0x2CDA, 0x2CDB, 0x2CDE, 0x2CE1, 0x2CCF, 0x2CD0, 0x2CD4, + 0x2CD5, 0x2CC3, 0x2CC7, 0x2CC8, 0x2CCD, 0x2D12, 0x47C9, 0x2C95, 0x2C9B, 0x2C9C, + 0x2CA0, 0x2D45, 0x47C3, 0x2D39, 0x2D3D, 0x2D41, 0x2D27, 0x2D2C, 0x2D2D, 0x2D32, + 0x2775, 0x2748, 0x2805, 0x2806, 0x0E60, 0x2807, 0x2808, 0x2801, 0x0E86, 0x0E9E, + 0x0E9F, 0x0EA0, 0x2802, 0x2803, 0x2804, 0x27FD, 0x27FE, 0x27FF, 0x2800, 0x27D9, + 0x27DA, 0x27DB, 0x27DC, 0x27E6, 0x27E7, 0x27E8, 0x27E1, 0x27E2, 0x27E3, 0x27E4, + 0x27DD, 0x27DE, 0x27DF, 0x27E0, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27B5, 0x27B6, + 0x27B7, 0x27B8, 0x27B1, 0x27B2, 0x27B3, 0x480C, 0x4844, 0x27B4, 0x27AD, 0x27AE, + 0x27AF, 0x27B0, 0x27C9, 0x1000, 0x1001, 0x0D87, 0x27CA, 0x4840, 0x27CB, 0x0007, + 0x27CC, 0x2795, 0x2796, 0x2797, 0x2798, 0x2794, 0x27A8, 0x2875, 0x2876, 0x2877, + 0x2878, 0x2871, 0x2872, 0x2873, 0x2874, 0x286F, 0x2870, 0x2889, 0x288A, 0x2885, + 0x2886, 0x2887, 0x2888, 0x2881, 0x4827, 0x2882, 0x2883, 0x2884, 0x287D, 0x287E, + 0x4838, 0x287F, 0x2880, 0x2859, 0x285A, 0x285B, 0x285C, 0x2855, 0x2856, 0x2857, + 0x2858, 0x2851, 0x2852, 0x2853, 0x2854, 0x284D, 0x284E, 0x47E4, 0x284F, 0x2850, + 0x2869, 0x286A, 0x286B, 0x286C, 0x2865, 0x2866, 0x2867, 0x2868, 0x2861, 0x2862, + 0x2863, 0x2864, 0x285D, 0x285E, 0x285F, 0x2860, 0x2839, 0x283A, 0x283B, 0x283C, + 0x2835, 0x2836, 0x2837, 0x2838, 0x2831, 0x2832, 0x46C9, 0x2833, 0x2834, 0x282D, + 0x282E, 0x282F, 0x2830, 0x2849, 0x284A, 0x284B, 0x284C, 0x2845, 0x2846, 0x2847, + 0x2848, 0x2841, 0x2842, 0x2843, 0x2844, 0x283D, 0x283E, 0x283F, 0x2840, 0x2819, + 0x281A, 0x281B, 0x281C, 0x2815, 0x2816, 0x2817, 0x2818, 0x2811, 0x2812, 0x2813, + 0x2814, 0x280D, 0x280E, 0x280F, 0x2810, 0x2829, 0x282A, 0x282B, 0x282C, 0x2825, + 0x2826, 0x2827, 0x2828, 0x2821, 0x2822, 0x2823, 0x2824, 0x281D, 0x281E, 0x281F, + 0x2820, 0x28F9, 0x28FA, 0x28FB, 0x28FC, 0x28F5, 0x28F6, 0x28F7, 0x28F8, 0x28F1, + 0x28F2, 0x28F3, 0x28F4, 0x28ED, 0x28EE, 0x28EF, 0x28F0, 0x2909, 0x290A, 0x290B, + 0x290C, 0x2905, 0x2906, 0x2907, 0x2908, 0x2901, 0x2902, 0x2903, 0x2904, 0x28FD, + 0x484A, 0x4852, 0x4887, 0x28FE, 0x2B5A, 0x2B5D, 0x28FF, 0x2900, 0x28D9, 0x28DA, + 0x4870, 0x2B66, 0x28DB, 0x28DC, 0x28D5, 0x4877, 0x4894, 0x28D6, 0x4897, 0x28D7, + 0x28D8, 0x2BD4, 0x2BD7, 0x2BDA, 0x28D1, 0x28D2, 0x28D3, 0x28D4, 0x47A9, 0x4898, + 0x48BB, 0x28CD, 0x28CE, 0x28CF, 0x28D0, 0x4789, 0x28E9, 0x28EA, 0x28EB, 0x477D, + 0x2A78, 0x4895, 0x28EC, 0x4788, 0x489B, 0x48A7, 0x48BE, 0x4924, 0x28E5, 0x2BD1, + 0x2A72, 0x2A6F, 0x47B2, 0x2B2D, 0x2BC9, 0x47AD, 0x2A7E, 0x2A7B, 0x4784, 0x2BCE, + 0x2A75, 0x47BE, 0x2BDD, 0x2BC6, 0x28E6, 0x28E7, 0x28E8, 0x28E1, 0x28E2, 0x28E3, + 0x28E4, 0x28DD, 0x28DE, 0x28DF, 0x2B57, 0x28E0, 0x28B9, 0x28BA, 0x28BB, 0x28BC, + 0x28B5, 0x28B6, 0x28B7, 0x28B8, 0x28B1, 0x485D, 0x28B2, 0x28B3, 0x28B4, 0x28AD, + 0x28AE, 0x28AF, 0x28B0, 0x28C9, 0x28CA, 0x28CB, 0x28CC, 0x28C5, 0x28C6, 0x28C7, + 0x28C8, 0x28C1, 0x28C2, 0x28C3, 0x28C4, 0x28BD, 0x28BE, 0x28BF, 0x28C0, 0x2899, + 0x289A, 0x289B, 0x4923, 0x289C, 0x2B54, 0x2B60, 0x2895, 0x4947, 0x4950, 0x2B63, + 0x2896, 0x48BD, 0x2897, 0x2898, 0x2891, 0x48EB, 0x2B69, 0x2892, 0x4657, 0x2893, + 0x46EF, 0x2CDC, 0x48C3, 0x460A, 0x4761, 0x4781, 0x4794, 0x2CE9, 0x479C, 0x2CFC, + 0x2D0C, 0x47A0, 0x2D18, 0x2D14, 0x2894, 0x48C1, 0x288D, 0x48C2, 0x288E, 0x288F, + 0x2890, 0x28A9, 0x28AA, 0x28AB, 0x28AC, 0x28A5, 0x28A6, 0x28A7, 0x28A8, 0x28A1, + 0x28A2, 0x28A3, 0x28A4, 0x2BC2, 0x289D, 0x289E, 0x289F, 0x28A0, 0x0139, 0x2AA2, + 0x013A, 0x013B, 0x2AA5, 0x2A9F, 0x013C, 0x4776, 0x2AB1, 0x2A8A, 0x2A8D, 0x022A, + 0x4846, 0x4845, 0x4843, 0x2A90, 0x4847, 0x2A96, 0x2A99, 0x2A9C, 0x483C, 0x483F, + 0x2ABE, 0x2A93, 0x0234, 0x0137, 0x0138, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, + 0x01A2, 0x01C9, 0x01DF, 0x33BD, 0x013D, 0x013E, 0x013F, 0x33D6, 0x33D8, 0x33DA, + 0x33DC, 0x33CE, 0x33D0, 0x33D2, 0x33D4, 0x33C6, 0x33C8, 0x33CA, 0x33CC, 0x33BE, + 0x33C0, 0x33C2, 0x33C4, 0x33F6, 0x33F8, 0x33FA, 0x33FC, 0x33EE, 0x33F0, 0x33F2, + 0x33F4, 0x33E6, 0x33E8, 0x33EA, 0x33EC, 0x33DE, 0x33E0, 0x33E2, 0x33E4, 0x33D7, + 0x33D9, 0x33DB, 0x33DD, 0x33CF, 0x33D1, 0x33D3, 0x33D5, 0x33C7, 0x33C9, 0x33CB, + 0x33CD, 0x33BF, 0x33C1, 0x33C3, 0x33C5, 0x33F7, 0x33F9, 0x33FB, 0x33FD, 0x33EF, + 0x33F1, 0x33F3, 0x33F5, 0x33E7, 0x33E9, 0x33EB, 0x33ED, 0x33DF, 0x33E1, 0x33E3, + 0x33E5, 0x06E7, 0x029D, 0x048A, 0x029B, 0x03C4, 0x0433, 0x0432, 0x06E8, 0x058B, + 0x0294, 0x05ED, 0x03C5, 0x0466, 0x0465, 0x0468, 0x0540, 0x05C2, 0x06E6, 0x034E, + 0x0588, 0x0529, 0x0351, 0x0671, 0x03C7, 0x03C6, 0x054D, 0x02A1, 0x0670, 0x068B, + 0x068A, 0x0AC5, 0x0AC7, 0x0AC9, 0x0ACB, 0x0ABD, 0x0ABF, 0x0AC1, 0x0AC3, 0x0AB5, + 0x0AB7, 0x0AB9, 0x0ABB, 0x0AAD, 0x0AAF, 0x0AB1, 0x0AB3, 0x0AE5, 0x0AE7, 0x0AE9, + 0x0FA0, 0x0FEA, 0x0FE9, 0x0ADD, 0x0F6F, 0x0FEC, 0x0F71, 0x0C7B, 0x0ADF, 0x0F9E, + 0x0FE7, 0x0AE1, 0x0AE3, 0x0AD5, 0x0AD7, 0x0AD9, 0x0ADB, 0x0ACD, 0x0ACF, 0x0AD1, + 0x0AD3, 0x0AE6, 0x0AE8, 0x0AEA, 0x0ADE, 0x0AE0, 0x0AE2, 0x0AE4, 0x0AD6, 0x0AD8, + 0x0ADA, 0x0ADC, 0x0ACE, 0x0AD0, 0x0AD2, 0x0AD4, 0x0AA5, 0x0ED4, 0x0AA7, 0x0AA9, + 0x0AAB, 0x0A9D, 0x0A9F, 0x0AA1, 0x0AA3, 0x0A95, 0x0A97, 0x0A99, 0x0A9B, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA6, 0x0AA8, 0x0AAA, 0x0AAC, 0x0A9E, 0x0AA0, 0x0AA2, + 0x0AA4, 0x0A96, 0x0A98, 0x0A9A, 0x0EDD, 0x0EDE, 0x0EDF, 0x0F6A, 0x0EE3, 0x0F70, + 0x0F50, 0x0F34, 0x0F56, 0x0F5A, 0x0F7C, 0x0F7D, 0x0F7E, 0x0A9C, 0x0FE8, 0x0F83, + 0x0E96, 0x0FE0, 0x0FF3, 0x0FF4, 0x0EBC, 0x0FF8, 0x0A8E, 0x0FFA, 0x0F53, 0x0E94, + 0x0F6D, 0x0ED6, 0x0FF5, 0x0C73, 0x0ED5, 0x0FF9, 0x0CE9, 0x0CE2, 0x0CE4, 0x0EE2, + 0x0E5B, 0x0F9F, 0x0EBD, 0x0D2E, 0x0A90, 0x0E68, 0x0A92, 0x0DDE, 0x0F1D, 0x000D, + 0x0E66, 0x0A94, 0x0DC4, 0x0E12, 0x0E14, 0x0E15, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E30, + 0x0C74, 0x0C75, 0x0C76, 0x0C77, 0x0CAA, 0x0CAB, 0x0CAC, 0x0CAD, 0x0AC6, 0x0AC8, + 0x0ACA, 0x0ACC, 0x0ABE, 0x0AC0, 0x0AC2, 0x0AC4, 0x0E7B, 0x0AB6, 0x0AB8, 0x0ABA, + 0x0ABC, 0x0E7C, 0x0E92, 0x0E93, 0x0AAE, 0x0AB0, 0x0AB2, 0x0CE7, 0x0AB4, 0x08E3, + 0x0904, 0x0903, 0x08E4, 0x0CB0, 0x0CB1, 0x08B9, 0x0C7C, 0x0E48, 0x0918, 0x0917, + 0x091A, 0x0919, 0x0083, 0x08F0, 0x08EF, 0x08F8, 0x08F7, 0x0DC3, 0x0D2F, 0x0D59, + 0x0D5A, 0x0D6A, 0x0D6B, 0x0DBF, 0x0DC1, 0x08FA, 0x08F9, 0x08F2, 0x08F1, 0x08F6, + 0x08F5, 0x08E8, 0x08E7, 0x08EA, 0x08E9, 0x08E0, 0x08DF, 0x08E6, 0x08E5, 0x090E, + 0x090D, 0x0916, 0x0915, 0x090A, 0x0909, 0x090C, 0x090B, 0x0900, 0x08FF, 0x0906, + 0x0905, 0x08FC, 0x08FB, 0x08FE, 0x08FD, 0x08D8, 0x08D7, 0x08DA, 0x08D9, 0x08D4, + 0x08D3, 0x08D6, 0x08D5, 0x08D0, 0x08CF, 0x08D2, 0x08D1, 0x08CC, 0x08CB, 0x08CE, + 0x08CD, 0x08C6, 0x08C5, 0x08DE, 0x08DD, 0x08BC, 0x08BB, 0x08C4, 0x08C3, 0x0914, + 0x08AD, 0x08AC, 0x08DC, 0x08DB, 0x0912, 0x0911, 0x08B1, 0x08B0, 0x08B3, 0x08B2, + 0x08AB, 0x08AE, 0x08A7, 0x1765, 0x10E3, 0x10E4, 0x10B9, 0x10D2, 0x10DF, 0x10E0, + 0x10E1, 0x10E2, 0x174E, 0x174F, 0x1750, 0x1751, 0x174A, 0x174B, 0x174C, 0x174D, + 0x1746, 0x1747, 0x1748, 0x1749, 0x1742, 0x1743, 0x1744, 0x10DC, 0x0E99, 0x0DE9, + 0x10DD, 0x10DE, 0x0CE3, 0x0CF4, 0x0CE5, 0x10D7, 0x0CE8, 0x0CEA, 0x0CEB, 0x0CEC, + 0x0D35, 0x0D30, 0x0D5F, 0x0D5E, 0x0DC2, 0x0DC0, 0x0DD0, 0x0DD4, 0x0E6E, 0x0E95, + 0x0EC1, 0x0DD5, 0x0E50, 0x0E6C, 0x0E6D, 0x0EC2, 0x0DF5, 0x0E7F, 0x0E81, 0x0DC5, + 0x10D8, 0x0DC6, 0x0DE8, 0x10D9, 0x0E13, 0x0E4F, 0x0E4A, 0x0E4B, 0x0E19, 0x0E2F, + 0x0E1C, 0x0E69, 0x0DE5, 0x0E80, 0x0DFA, 0x0DC7, 0x0DFB, 0x0DF3, 0x0E33, 0x0E35, + 0x10DA, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10CE, 0x10CF, 0x10D0, 0x10D1, 0x0B8B, + 0x0B78, 0x0B81, 0x0B85, 0x0B7E, 0x0B27, 0x0B3C, 0x0B51, 0x10BA, 0x10BB, 0x10BC, + 0x10BD, 0x10B5, 0x10B8, 0x10B1, 0x0B3F, 0x0B42, 0x0B45, 0x0B2D, 0x0B30, 0x0B33, + 0x0B36, 0x0B1E, 0x0B21, 0x0B24, 0x0B2A, 0x0B12, 0x0B15, 0x0B18, 0x0B1B, 0x0B6F, + 0x0B72, 0x0B75, 0x0B7B, 0x0B63, 0x0B57, 0x1799, 0x1782, 0x1783, 0x1784, 0x1785, + 0x177B, 0x177C, 0x1780, 0x1781, 0x1777, 0x1778, 0x1779, 0x177A, 0x1773, 0x1774, + 0x1775, 0x1794, 0x178C, 0x12A8, 0x12A9, 0x12A3, 0x12A4, 0x12A5, 0x12A6, 0x12A0, + 0x12A1, 0x12A2, 0x129C, 0x129D, 0x129E, 0x129F, 0x127D, 0x127E, 0x127F, 0x1279, + 0x127A, 0x127B, 0x127C, 0x1276, 0x1277, 0x1278, 0x1272, 0x1273, 0x1274, 0x1275, + 0x296B, 0x128B, 0x128C, 0x128D, 0x1287, 0x1288, 0x1289, 0x128A, 0x1284, 0x1285, + 0x1286, 0x1280, 0x297B, 0x1281, 0x1282, 0x1283, 0x11EB, 0x11FA, 0x1203, 0x1225, + 0x1189, 0x1192, 0x119B, 0x11CC, 0x299F, 0x1133, 0x1159, 0x116A, 0x1173, 0x2994, + 0x2995, 0x10F5, 0x110A, 0x2998, 0x111B, 0x1124, 0x299B, 0x121A, 0x2996, 0x121B, + 0x121C, 0x122E, 0x0D75, 0x0E27, 0x0E28, 0x0E3F, 0x0E40, 0x0DFF, 0x0E00, 0x0E21, + 0x0E03, 0x0E02, 0x0DDC, 0x0D6E, 0x0E3D, 0x0E51, 0x0E52, 0x0E70, 0x123E, 0x0E83, + 0x0D60, 0x0DD6, 0x126E, 0x0DD7, 0x1219, 0x022A, 0x0E82, 0x0E71, 0x0234, 0x0111, + 0x0112, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x17AA, + 0x17AB, 0x17AC, 0x17AD, 0x17A6, 0x17A7, 0x17A8, 0x0DE7, 0x17A9, 0x17A2, 0x17A3, + 0x0DCB, 0x0DCA, 0x17A4, 0x0E49, 0x17A5, 0x179E, 0x179F, 0x17A0, 0x17A1, 0x0CA2, + 0x17B6, 0x17B7, 0x17B2, 0x17B3, 0x17B4, 0x17B5, 0x17AE, 0x17AF, 0x17B0, 0x17B1, + 0x16DB, 0x16A3, 0x16A4, 0x16DA, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, + 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x16D1, 0x16D2, 0x16D3, 0x16D4, 0x16CD, 0x16CE, + 0x16CF, 0x16D0, 0x16C9, 0x16CA, 0x16CB, 0x16CC, 0x16C5, 0x16C6, 0x16C7, 0x16C8, + 0x16D9, 0x16D5, 0x16D6, 0x16D7, 0x16D8, 0x16B1, 0x16B2, 0x16B3, 0x16B4, 0x16AD, + 0x16AE, 0x16AF, 0x16B0, 0x16A9, 0x16AA, 0x16AB, 0x16AC, 0x16A5, 0x16A6, 0x16A7, + 0x16A8, 0x16C1, 0x16C2, 0x16C3, 0x16C4, 0x16BD, 0x16BE, 0x2DC5, 0x2DC6, 0x2DBF, + 0x2DC0, 0x2DC1, 0x2DC2, 0x2DDB, 0x2DDC, 0x2DDD, 0x2DDE, 0x2DD7, 0x2DD8, 0x2DD9, + 0x2DDA, 0x2DD3, 0x2DD4, 0x2DD5, 0x2DD6, 0x2DCF, 0x2DD0, 0x2DD1, 0x2DD2, 0x2DAB, + 0x2DAC, 0x2DAD, 0x2DAE, 0x2DA7, 0x2DA8, 0x2DA9, 0x2DAA, 0x2DA3, 0x2DA4, 0x2DA5, + 0x2DA6, 0x2D9F, 0x0CFA, 0x0D37, 0x0F2B, 0x2DA0, 0x0DD1, 0x0E1A, 0x0DF6, 0x0E34, + 0x0FF2, 0x0F32, 0x2DA1, 0x0FF1, 0x2DA2, 0x2DBB, 0x2DBC, 0x2DB7, 0x2DB9, 0x2DBA, + 0x2DB3, 0x2DB4, 0x2DB5, 0x2DB6, 0x2DAF, 0x2DB0, 0x2D8B, 0x0E4C, 0x2D8C, 0x2D95, + 0x0E5A, 0x0E4E, 0x2D96, 0x0ED8, 0x0E31, 0x0E53, 0x2D8F, 0x0E5F, 0x2D90, 0x2D91, + 0x2D92, 0x0E5E, 0x2D6A, 0x2D6B, 0x2D6C, 0x0E23, 0x0EC8, 0x0D3C, 0x0E74, 0x2D6E, + 0x2D66, 0x0E22, 0x0DA2, 0x2D67, 0x2D68, 0x2D69, 0x2D62, 0x2D63, 0x0F5F, 0x2E45, + 0x0FC0, 0x2E46, 0x0E25, 0x2E3F, 0x0CA4, 0x2E40, 0x2E41, 0x2E42, 0x2E5B, 0x2E5C, + 0x2E5D, 0x2E5E, 0x2E57, 0x2E58, 0x2E59, 0x2E5A, 0x0ED9, 0x2E53, 0x2E54, 0x2E55, + 0x2E56, 0x2E4F, 0x2E50, 0x2E51, 0x2E52, 0x0E47, 0x2E2B, 0x2E2C, 0x2E2D, 0x2E2E, + 0x2E27, 0x2E28, 0x2E29, 0x2E2A, 0x2E23, 0x2E24, 0x2E25, 0x2E26, 0x0CF5, 0x2E1F, + 0x2E20, 0x2E21, 0x2E22, 0x2E3B, 0x2E3C, 0x2E3D, 0x2E3E, 0x2E37, 0x2E38, 0x0CF6, + 0x2E39, 0x2E3A, 0x2E33, 0x2E34, 0x0CF2, 0x2E35, 0x2E36, 0x2E2F, 0x2E30, 0x2E31, + 0x2E32, 0x2E0B, 0x2E0C, 0x2E0D, 0x2E0E, 0x2E07, 0x2E08, 0x2E09, 0x2E0A, 0x2E03, + 0x2E04, 0x2E05, 0x2E06, 0x2DFF, 0x2E00, 0x2E01, 0x2E02, 0x2E1B, 0x2E1C, 0x2E1D, + 0x2E1E, 0x2E17, 0x2E18, 0x2E19, 0x2E1A, 0x2E13, 0x2E14, 0x2E15, 0x2E16, 0x2E0F, + 0x2E10, 0x2E11, 0x2E12, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DE7, 0x2DE8, 0x2DE9, + 0x2DEA, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6, 0x2DDF, 0x2DE0, 0x2DE1, 0x2DE2, 0x2DFB, + 0x2DFC, 0x2DFD, 0x2DFE, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA, 0x2DF3, 0x2DF4, 0x2DF5, + 0x2DF6, 0x2DEF, 0x2DF0, 0x2DF1, 0x2DF2, 0x1712, 0x1713, 0x1715, 0x1717, 0x173F, + 0x1740, 0x1741, 0x173B, 0x173C, 0x173D, 0x173E, 0x1737, 0x1738, 0x1739, 0x173A, + 0x1733, 0x1734, 0x1735, 0x1736, 0x2E6B, 0x2E6C, 0x2E6D, 0x2E6E, 0x2E67, 0x2E68, + 0x2E69, 0x0D36, 0x2E6A, 0x2E63, 0x2E64, 0x1718, 0x172D, 0x172E, 0x1727, 0x1728, + 0x0D33, 0x1729, 0x0F2E, 0x0483, 0x04A7, 0x172A, 0x0F2C, 0x0F29, 0x0F31, 0x0F1E, + 0x0F58, 0x0F4E, 0x0F20, 0x050C, 0x0F2F, 0x0F51, 0x0F4C, 0x0F52, 0x0FA1, 0x1723, + 0x0F4B, 0x1724, 0x0F7A, 0x0FA2, 0x1725, 0x1726, 0x1616, 0x1617, 0x1618, 0x0F2A, + 0x0F4A, 0x0FF6, 0x0F7F, 0x0457, 0x1619, 0x1612, 0x042B, 0x1613, 0x1614, 0x1615, + 0x160E, 0x160F, 0x0286, 0x1610, 0x0F76, 0x02AD, 0x0345, 0x02F8, 0x0392, 0x0370, + 0x0EE1, 0x0EE0, 0x0EC3, 0x0FF7, 0x0E6F, 0x03BC, 0x0411, 0x0F1C, 0x0F6B, 0x0F59, + 0x0F1A, 0x03F4, 0x1611, 0x0EBE, 0x0D34, 0x0D5D, 0x0F72, 0x0FA3, 0x15FB, 0x15FC, + 0x0E6A, 0x0FBF, 0x0FBE, 0x15FD, 0x0E6B, 0x0E72, 0x05A5, 0x0E65, 0x0E5C, 0x0E84, + 0x0E7E, 0x0E7A, 0x0537, 0x054F, 0x0567, 0x15FE, 0x15F7, 0x15F8, 0x15F9, 0x0659, + 0x15FA, 0x15F3, 0x15F4, 0x15F5, 0x15F6, 0x15EF, 0x15F0, 0x15F1, 0x0F26, 0x0F55, + 0x0CFB, 0x0F48, 0x0F22, 0x0F5C, 0x0F28, 0x0F84, 0x0F38, 0x0FA5, 0x0FA4, 0x0FE1, + 0x0F54, 0x0F9D, 0x0F75, 0x0F69, 0x05D6, 0x0618, 0x0FF0, 0x0FE6, 0x0FDF, 0x0FFB, + 0x0F37, 0x067E, 0x0690, 0x0F27, 0x06D0, 0x06B1, 0x0FED, 0x0F36, 0x0F25, 0x0F39, + 0x15F2, 0x160A, 0x160B, 0x160C, 0x160D, 0x1606, 0x1607, 0x1608, 0x1609, 0x1602, + 0x1603, 0x1604, 0x1605, 0x15FF, 0x1600, 0x1601, 0x022A, 0x0234, 0x01F5, 0x0209, + 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x1636, 0x1637, 0x1638, 0x1639, + 0x1632, 0x1633, 0x1634, 0x1635, 0x162E, 0x162F, 0x1630, 0x1631, 0x162A, 0x162B, + 0x162C, 0x162D, 0x1646, 0x1647, 0x1648, 0x1642, 0x1643, 0x1644, 0x1645, 0x163E, + 0x163F, 0x1640, 0x1641, 0x163A, 0x163B, 0x163C, 0x163D, 0x166D, 0x166B, 0x164D, + 0x164E, 0x166C, 0x1667, 0x1668, 0x1669, 0x166A, 0x1626, 0x1627, 0x1628, 0x1629, + 0x1622, 0x1623, 0x1624, 0x1625, 0x161E, 0x161F, 0x1620, 0x1621, 0x161A, 0x161B, + 0x161C, 0x161D, 0x1655, 0x1656, 0x1657, 0x1652, 0x1653, 0x1654, 0x164F, 0x1650, + 0x1651, 0x1649, 0x164A, 0x164B, 0x164C, 0x1664, 0x1665, 0x1666, 0x1660, 0x1661, + 0x1662, 0x1663, 0x165C, 0x165D, 0x165E, 0x165F, 0x1658, 0x1659, 0x165A, 0x165B, + 0x1676, 0x1678, 0x16A2, 0x16A0, 0x16A1, 0x166E, 0x1693, 0x1694, 0x1695, 0x1696, + 0x1690, 0x1691, 0x1692, 0x168C, 0x168D, 0x168E, 0x168F, 0x1688, 0x1689, 0x168A, + 0x168B, 0x169F, 0x169D, 0x169E, 0x169A, 0x169B, 0x169C, 0x1697, 0x1698, 0x1699, + 0x1677, 0x1679, 0x1672, 0x1673, 0x1674, 0x1675, 0x166F, 0x1670, 0x1671, 0x1684, + 0x1685, 0x1686, 0x1687, 0x1680, 0x1681, 0x1682, 0x1683, 0x167C, 0x167D, 0x167E, + 0x167F, 0x167A, 0x167B, 0x0215, 0x021F, 0x022A, 0x0234, 0x01C9, 0x01DF, 0x01F5, + 0x0209, 0x011C, 0x011D, 0x0198, 0x01A2, 0x0118, 0x0119, 0x011A, 0x011B, 0x0114, + 0x0115, 0x0116, 0x0117, 0x021F, 0x022A, 0x0234, 0x0113, 0x01DF, 0x01F5, 0x0209, + 0x0215, 0x01A2, 0x01C9, 0x1835, 0x1836, 0x1837, 0x1838, 0x1831, 0x1832, 0x1833, + 0x1834, 0x182D, 0x182E, 0x182F, 0x1830, 0x1829, 0x182A, 0x182B, 0x182C, 0x183F, + 0x1840, 0x1841, 0x1842, 0x1839, 0x183A, 0x183B, 0x1814, 0x183E, 0x1810, 0x183D, + 0x1825, 0x1826, 0x1827, 0x1828, 0x1821, 0x1822, 0x1823, 0x1824, 0x181D, 0x181E, + 0x181F, 0x1820, 0x1819, 0x181A, 0x181B, 0x181C, 0x36D2, 0x36CE, 0x36CF, 0x36D0, + 0x36D1, 0x36CA, 0x36CB, 0x36CC, 0x36CD, 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, + 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, 0x36C6, 0x36C7, 0x36C8, 0x36C9, 0x36C2, + 0x36C3, 0x36C4, 0x36C5, 0x36BE, 0x36BF, 0x36C0, 0x36C1, 0x36BA, 0x36BB, 0x36BC, + 0x36BD, 0x1591, 0x1592, 0x1593, 0x1594, 0x158E, 0x158F, 0x1590, 0x158B, 0x1589, + 0x158A, 0x158C, 0x158D, 0x1585, 0x1586, 0x1587, 0x1588, 0x1571, 0x1572, 0x1573, + 0x1574, 0x156D, 0x156E, 0x156F, 0x1570, 0x1569, 0x156A, 0x156B, 0x156C, 0x1568, + 0x1581, 0x1582, 0x1583, 0x1584, 0x157D, 0x157E, 0x157F, 0x1580, 0x1579, 0x157A, + 0x157B, 0x157C, 0x1575, 0x1576, 0x1577, 0x1578, 0x15B1, 0x15B2, 0x15B3, 0x15B4, + 0x15AD, 0x15AE, 0x15AF, 0x15B0, 0x15A9, 0x15AA, 0x15AB, 0x15AC, 0x15A5, 0x15A6, + 0x15A7, 0x15A8, 0x15B5, 0x15B6, 0x15B7, 0x15B8, 0x01E5, 0x1598, 0x1E0D, 0x1E0E, + 0x1E0F, 0x0225, 0x021B, 0x0225, 0x01D0, 0x01E5, 0x01FB, 0x002C, 0x01BB, 0x01BC, + 0x01D1, 0x1DEC, 0x1E05, 0x1E06, 0x1E07, 0x1E08, 0x1E01, 0x1E02, 0x1E03, 0x1E04, + 0x1DFD, 0x1DFE, 0x1DFF, 0x1E00, 0x1DF9, 0x1DFA, 0x1DFB, 0x1DFC, 0x012E, 0x012F, + 0x0130, 0x0131, 0x022A, 0x0234, 0x012C, 0x012D, 0x01F5, 0x0209, 0x0215, 0x021F, + 0x01A2, 0x01C9, 0x01DF, 0x0136, 0x0132, 0x0133, 0x0134, 0x2A12, 0x2A18, 0x0135, + 0x15B9, 0x15EB, 0x2A1D, 0x2A22, 0x2A1C, 0x15EC, 0x2A0D, 0x2A1E, 0x2A0E, 0x15ED, + 0x15EE, 0x022A, 0x29EB, 0x29E4, 0x29E5, 0x0234, 0x15BA, 0x01F5, 0x0209, 0x0215, + 0x29E8, 0x021F, 0x0198, 0x29EA, 0x29E9, 0x01A2, 0x29F4, 0x01C9, 0x29ED, 0x29EC, + 0x29F1, 0x01DF, 0x15E4, 0x15E5, 0x29FC, 0x15E6, 0x29EE, 0x15E7, 0x15E0, 0x15E1, + 0x15E2, 0x15E3, 0x15DC, 0x15DD, 0x2A27, 0x15DE, 0x15DF, 0x15D8, 0x15D9, 0x15DA, + 0x29F3, 0x01B6, 0x01B7, 0x01B8, 0x019E, 0x01B4, 0x15E8, 0x15E9, 0x15EA, 0x0230, + 0x01BA, 0x01BB, 0x01BC, 0x15BB, 0x15D4, 0x15D5, 0x15D6, 0x15D7, 0x15D0, 0x29F0, + 0x01F5, 0x29F2, 0x15D1, 0x15D2, 0x15D3, 0x15CC, 0x15CD, 0x15CE, 0x15CF, 0x15C8, + 0x15C9, 0x15CA, 0x15CB, 0x0070, 0x0071, 0x0072, 0x0073, 0x0234, 0x006D, 0x006E, + 0x006F, 0x0209, 0x0215, 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0080, + 0x0081, 0x0082, 0x007C, 0x007D, 0x007E, 0x007F, 0x0078, 0x0079, 0x007A, 0x007B, + 0x0074, 0x0075, 0x0076, 0x0077, 0x020D, 0x0219, 0x0223, 0x022E, 0x01A6, 0x01CD, + 0x01E3, 0x01F9, 0x0021, 0x0022, 0x0023, 0x0025, 0x001D, 0x001E, 0x001F, 0x0020, + 0x01AE, 0x01AF, 0x01B0, 0x01CE, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x0238, 0x01A7, + 0x01A8, 0x01A9, 0x259E, 0x259A, 0x259B, 0x259C, 0x259D, 0x2596, 0x2597, 0x2598, + 0x2599, 0x2582, 0x2583, 0x2584, 0x2585, 0x257E, 0x257F, 0x2580, 0x2581, 0x257A, + 0x257B, 0x257C, 0x257D, 0x2576, 0x2577, 0x2578, 0x2579, 0x2592, 0x2593, 0x2594, + 0x2595, 0x258E, 0x258F, 0x2590, 0x2591, 0x258A, 0x258B, 0x258C, 0x258D, 0x2586, + 0x2587, 0x2588, 0x2589, 0x2562, 0x2563, 0x2564, 0x2565, 0x255E, 0x255F, 0x2560, + 0x2561, 0x255A, 0x255B, 0x255C, 0x255D, 0x2556, 0x2557, 0x2558, 0x2559, 0x2572, + 0x2573, 0x2574, 0x2575, 0x256E, 0x256F, 0x2570, 0x2571, 0x256A, 0x256B, 0x256C, + 0x256D, 0x2566, 0x2567, 0x2568, 0x2569, 0x2548, 0x2549, 0x254C, 0x254E, 0x2540, + 0x2542, 0x2544, 0x2545, 0x2538, 0x253A, 0x253C, 0x253E, 0x2530, 0x2532, 0x2534, + 0x2535, 0x0086, 0x0087, 0x0088, 0x0089, 0x01A2, 0x0209, 0x2550, 0x2552, 0x2554, + 0x2508, 0x250A, 0x250C, 0x250E, 0x2500, 0x2502, 0x2503, 0x2504, 0x24F8, 0x24FA, + 0x24FC, 0x24FE, 0x24F0, 0x24F1, 0x24F4, 0x24F6, 0x2527, 0x252A, 0x252B, 0x252C, + 0x2520, 0x2522, 0x2524, 0x2526, 0x2518, 0x251A, 0x251C, 0x251E, 0x2510, 0x2511, + 0x2514, 0x2516, 0x254A, 0x254B, 0x254D, 0x254F, 0x2541, 0x2543, 0x2546, 0x2547, + 0x2539, 0x253B, 0x253D, 0x253F, 0x2531, 0x2533, 0x2536, 0x2537, 0x2551, 0x2553, + 0x2555, 0x2509, 0x250B, 0x250D, 0x250F, 0x2501, 0x2505, 0x2506, 0x2507, 0x24F9, + 0x24FB, 0x24FD, 0x24FF, 0x24F2, 0x24F3, 0x24F5, 0x24F7, 0x2529, 0x252D, 0x252E, + 0x252F, 0x2521, 0x2523, 0x2525, 0x2528, 0x2519, 0x251B, 0x251D, 0x251F, 0x2512, + 0x2513, 0x2515, 0x2517, 0x0232, 0x023B, 0x0206, 0x0211, 0x021D, 0x0227, 0x019F, + 0x395D, 0x395E, 0x395F, 0x3960, 0x3959, 0x395A, 0x395B, 0x395C, 0x3955, 0x3956, + 0x3957, 0x3958, 0x3951, 0x3952, 0x3953, 0x3954, 0x396D, 0x01A2, 0x00F8, 0x3969, + 0x396A, 0x396B, 0x396C, 0x3965, 0x3966, 0x3967, 0x3968, 0x3961, 0x3962, 0x3963, + 0x3964, 0x011E, 0x011F, 0x0120, 0x0121, 0x01A2, 0x01C9, 0x01DF, 0x01F5, 0x0233, + 0x023C, 0x0207, 0x0212, 0x021E, 0x0228, 0x01A0, 0x01BE, 0x01DC, 0x01F1, 0x185E, + 0x185F, 0x1860, 0x1861, 0x185A, 0x185B, 0x185C, 0x185D, 0x1856, 0x1857, 0x1858, + 0x1859, 0x1852, 0x1853, 0x1854, 0x02CF, 0x02F9, 0x0484, 0x03FA, 0x0699, 0x069A, + 0x069B, 0x0664, 0x0665, 0x0666, 0x0667, 0x03F5, 0x02C5, 0x02E7, 0x047D, 0x03E1, + 0x0691, 0x0692, 0x0693, 0x065A, 0x065B, 0x065C, 0x065D, 0x03DC, 0x03DE, 0x03E0, + 0x184E, 0x1850, 0x040E, 0x184B, 0x184C, 0x184D, 0x0300, 0x184A, 0x1844, 0x1845, + 0x1846, 0x01C5, 0x0213, 0x01C7, 0x01DE, 0x01F3, 0x01C6, 0x02D0, 0x032A, 0x06DB, + 0x0425, 0x0276, 0x06DB, 0x0886, 0x0819, 0x03E2, 0x3A65, 0x3A66, 0x3A7B, 0x3A74, + 0x3A77, 0x3A70, 0x3A71, 0x3A73, 0x3A6C, 0x3A6E, 0x0578, 0x053D, 0x0554, 0x0578, + 0x04AB, 0x03FB, 0x03FB, 0x045C, 0x044C, 0x397A, 0x397B, 0x397C, 0x397D, 0x3976, + 0x3977, 0x3978, 0x3979, 0x3972, 0x3973, 0x3974, 0x3975, 0x396E, 0x396F, 0x3970, + 0x3971, 0x398A, 0x01A2, 0x00F9, 0x00FA, 0x3986, 0x3987, 0x3988, 0x3989, 0x3982, + 0x3983, 0x3984, 0x3985, 0x397E, 0x397F, 0x3980, 0x3981, 0x3A44, 0x3A45, 0x3A46, + 0x3A47, 0x3A40, 0x3A41, 0x3A42, 0x3A43, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A38, + 0x3A39, 0x3A3A, 0x3A3B, 0x010A, 0x010B, 0x010C, 0x010D, 0x01A2, 0x01C9, 0x01DF, + 0x01F5, 0x3A48, 0x3A49, 0x3A4A, 0x3A2E, 0x3A2F, 0x3A30, 0x3A31, 0x3A2A, 0x3A2B, + 0x3A2C, 0x3A2D, 0x3A26, 0x3A27, 0x3A28, 0x3A29, 0x3A22, 0x3A23, 0x3A24, 0x3A25, + 0x0106, 0x0107, 0x0108, 0x01C9, 0x01DF, 0x006B, 0x0067, 0x3A35, 0x39B7, 0x39B8, + 0x39B9, 0x39BA, 0x39B3, 0x39B4, 0x39B5, 0x39B6, 0x39AF, 0x39B0, 0x39B1, 0x39B2, + 0x39AB, 0x39AC, 0x39AD, 0x05D2, 0x05E5, 0x05D5, 0x05B6, 0x05A3, 0x05E0, 0x05D0, + 0x05AF, 0x059F, 0x05B3, 0x0565, 0x0574, 0x0566, 0x056E, 0x0560, 0x0572, 0x0564, + 0x053A, 0x0535, 0x053B, 0x0536, 0x0500, 0x04D6, 0x04FF, 0x04D5, 0x03F3, 0x03DA, + 0x03EA, 0x03D2, 0x03B8, 0x03AC, 0x03BB, 0x03AF, 0x03BA, 0x03AE, 0x03B6, 0x03AA, + 0x0391, 0x0385, 0x03B7, 0x03AB, 0x0454, 0x0443, 0x0480, 0x0479, 0x0453, 0x0442, + 0x0455, 0x0444, 0x042A, 0x0421, 0x0452, 0x0441, 0x0426, 0x041D, 0x0429, 0x0420, + 0x02F5, 0x02E3, 0x02F7, 0x02E5, 0x02CD, 0x02C3, 0x02F2, 0x02E0, 0x02AB, 0x02A5, + 0x02AC, 0x02A6, 0x0285, 0x025A, 0x02AA, 0x02A4, 0x0339, 0x0327, 0x0321, 0x033C, + 0x0320, 0x02F3, 0x02E1, 0x02F6, 0x02E4, 0x0634, 0x0612, 0x0633, 0x0611, 0x0631, + 0x060F, 0x0632, 0x0610, 0x0636, 0x0614, 0x062D, 0x060B, 0x0507, 0x04DD, 0x0509, + 0x04DF, 0x0215, 0x021F, 0x022A, 0x0673, 0x04E0, 0x0501, 0x04D7, 0x03EF, 0x03D6, + 0x03F2, 0x03D9, 0x0332, 0x0316, 0x0342, 0x0326, 0x0331, 0x0317, 0x0506, 0x0249, + 0x0282, 0x067C, 0x0682, 0x088C, 0x0894, 0x088A, 0x0892, 0x086F, 0x087B, 0x3924, + 0x3925, 0x0848, 0x07CF, 0x0742, 0x3934, 0x3935, 0x392C, 0x392D, 0x392A, 0x3A04, + 0x3A06, 0x3A00, 0x07B4, 0x07AF, 0x07B7, 0x07A0, 0x0793, 0x07DB, 0x07DF, 0x07DD, + 0x07E1, 0x07DA, 0x07DE, 0x07DC, 0x07E0, 0x07C8, 0x07CC, 0x07CA, 0x07CE, 0x07C7, + 0x07CB, 0x07C9, 0x07CD, 0x074C, 0x0754, 0x0750, 0x0758, 0x074B, 0x0753, 0x074E, + 0x0756, 0x0731, 0x0739, 0x0735, 0x073D, 0x0730, 0x0738, 0x0733, 0x073B, 0x077C, + 0x00F2, 0x00F3, 0x0774, 0x0773, 0x0772, 0x0775, 0x0829, 0x0858, 0x085A, 0x0857, + 0x0856, 0x0824, 0x0825, 0x084A, 0x084E, 0x0849, 0x084F, 0x084D, 0x084C, 0x0899, + 0x39E5, 0x39E4, 0x39E7, 0x39DC, 0x46B5, 0x46DC, 0x39DE, 0x39D9, 0x39F5, 0x4751, + 0x39F4, 0x46BD, 0x473C, 0x46C3, 0x46BA, 0x4759, 0x39F6, 0x46D9, 0x0782, 0x39ED, + 0x39EF, 0x39E9, 0x39EA, 0x07E4, 0x07E6, 0x07E3, 0x07E2, 0x07D2, 0x07D6, 0x07D1, + 0x07D7, 0x07D5, 0x07D4, 0x0889, 0x0891, 0x088D, 0x0895, 0x088E, 0x0896, 0x088B, + 0x0893, 0x0870, 0x0878, 0x0874, 0x087C, 0x0875, 0x087D, 0x0872, 0x087A, 0x075F, + 0x07C6, 0x075D, 0x075E, 0x075C, 0x075B, 0x0741, 0x0745, 0x0746, 0x0744, 0x0747, + 0x0743, 0x0748, 0x074D, 0x0755, 0x0751, 0x0759, 0x0752, 0x075A, 0x074F, 0x0757, + 0x0732, 0x073A, 0x0736, 0x073E, 0x0737, 0x073F, 0x0734, 0x073C, 0x07AE, 0x20BE, + 0x20BF, 0x20C0, 0x20B9, 0x20BC, 0x20B5, 0x34F0, 0x0C3B, 0x0C3C, 0x0C3D, 0x0C3E, + 0x0C37, 0x0C38, 0x0C39, 0x0C32, 0x1C54, 0x1C55, 0x1C56, 0x022A, 0x00FD, 0x01C9, + 0x015F, 0x0179, 0x017A, 0x017B, 0x017C, 0x0175, 0x0176, 0x0177, 0x0178, 0x0170, + 0x0171, 0x0173, 0x016F, 0x014A, 0x014B, 0x014C, 0x014D, 0x0234, 0x0147, 0x0148, + 0x0149, 0x0209, 0x0215, 0x021F, 0x022A, 0x01A2, 0x01C9, 0x01DF, 0x1C4B, 0x1C4C, + 0x017D, 0x438F, 0x12FB, 0x12FC, 0x12FC, 0x4384, 0x4387, 0x438A, 0x438C, 0x437B, + 0x437E, 0x4380, 0x4382, 0x436F, 0x4370, 0x4372, 0x4373, 0x4368, 0x436A, 0x436C, + 0x436D, 0x4365, 0x435B, 0x435D, 0x435F, 0x438B, 0x438D, 0x4390, 0x4391, 0x4385, + 0x4386, 0x4388, 0x4389, 0x437D, 0x437F, 0x4381, 0x4383, 0x4375, 0x4377, 0x4379, + 0x437C, 0x3831, 0x3832, 0x3833, 0x3834, 0x382D, 0x382E, 0x382F, 0x3830, 0x3829, + 0x382A, 0x382B, 0x382C, 0x3825, 0x3826, 0x3827, 0x3828, 0x3841, 0x3842, 0x3843, + 0x3844, 0x383D, 0x383E, 0x383F, 0x3840, 0x3839, 0x383A, 0x383B, 0x383C, 0x3835, + 0x3836, 0x3837, 0x3838, 0x3811, 0x3812, 0x3813, 0x3814, 0x380D, 0x380E, 0x380F, + 0x3810, 0x3809, 0x380A, 0x380B, 0x380C, 0x3805, 0x3806, 0x3807, 0x3808, 0x3821, + 0x3822, 0x3823, 0x381D, 0x381E, 0x381F, 0x3818, 0x37F1, 0x37F2, 0x37F3, 0x37F4, + 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37E9, 0x37EA, 0x37EB, 0x37EC, 0x37E5, 0x37E6, + 0x37E7, 0x3804, 0x37FD, 0x37FE, 0x3800, 0x37F9, 0x37FA, 0x37FB, 0x37FC, 0x37F5, + 0x37F6, 0x37F7, 0x37D4, 0x37C8, 0x37E1, 0x37E2, 0x37E3, 0x37E4, 0x37DD, 0x37DE, + 0x37DF, 0x37E0, 0x37D9, 0x37DA, 0x37DB, 0x37DC, 0x37D5, 0x37D6, 0x37D7, 0x37D8, + 0x38B1, 0x38B2, 0x38B3, 0x38B4, 0x38AD, 0x38AE, 0x38AF, 0x38B0, 0x38A9, 0x38AA, + 0x38AB, 0x38AC, 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38C1, 0x38C2, 0x38C3, 0x38B8, + 0x3891, 0x3892, 0x3893, 0x3894, 0x388D, 0x388E, 0x388F, 0x3890, 0x3889, 0x388A, + 0x388B, 0x388C, 0x3885, 0x3886, 0x3887, 0x3868, 0x3881, 0x3882, 0x3883, 0x3884, + 0x387D, 0x387E, 0x387F, 0x3880, 0x3879, 0x387A, 0x387B, 0x387C, 0x3875, 0x3876, + 0x3877, 0x3878, 0x3851, 0x3852, 0x3853, 0x3854, 0x384D, 0x384E, 0x384F, 0x3850, + 0x3849, 0x384A, 0x384B, 0x384C, 0x3845, 0x3846, 0x3847, 0x3848, 0x3861, 0x3862, + 0x3863, 0x3864, 0x385D, 0x385E, 0x385F, 0x3860, 0x3859, 0x385A, 0x385B, 0x385C, + 0x3855, 0x3856, 0x3857, 0x3858, 0x3916, 0x3917, 0x3918, 0x3919, 0x3912, 0x3913, + 0x3914, 0x3915, 0x3908, 0x3909, 0x390A, 0x390B, 0x3904, 0x3905, 0x3906, 0x3907, + 0x3900, 0x3901, 0x3902, 0x3903, 0x38FC, 0x38FD, 0x38FE, 0x069D, 0x06E0, 0x0296, + 0x0544, 0x0586, 0x05BF, 0x05C8, 0x042F, 0x04B5, 0x02B6, 0x390F, 0x38F1, 0x38F2, + 0x38F3, 0x38EF, 0x38E8, 0x38F9, 0x38FA, 0x38FB, 0x38F5, 0x38F6, 0x38F7, 0x38F8, + 0x38D1, 0x38D2, 0x38D3, 0x38D4, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38C9, 0x38CA, + 0x38CB, 0x38CC, 0x38C5, 0x38C6, 0x38C7, 0x38D8, 0x1F85, 0x1F90, 0x1F91, 0x1F92, + 0x1F8C, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F66, 0x1F67, 0x1F68, 0x1F69, 0x1F62, + 0x1F63, 0x1F64, 0x1F65, 0x1F5E, 0x1F5F, 0x1F60, 0x1F61, 0x1F7A, 0x1F7B, 0x1F7C, + 0x1F7D, 0x1F76, 0x1F77, 0x1F78, 0x1F79, 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1F6E, + 0x1F6F, 0x1F70, 0x1F71, 0x1D15, 0x1D16, 0x1D17, 0x1D18, 0x1D11, 0x1D12, 0x1D13, + 0x1D14, 0x1D0D, 0x1D0E, 0x1D0F, 0x1D10, 0x1D09, 0x1D0A, 0x1D0B, 0x1D0C, 0x1D1D, + 0x1D1E, 0x1D1F, 0x1D19, 0x1D1A, 0x1D1B, 0x1D1C, 0x35A1, 0x35A2, 0x35A3, 0x35A4, + 0x359D, 0x359E, 0x359F, 0x35A0, 0x3599, 0x359A, 0x359B, 0x359C, 0x3595, 0x3596, + 0x3597, 0x3598, 0x35B1, 0x35B3, 0x35B4, 0x35AD, 0x357F, 0x3581, 0x3583, 0x3575, + 0x3577, 0x3579, 0x357B, 0x356D, 0x356F, 0x3571, 0x3573, 0x3565, 0x3567, 0x3569, + 0x356B, 0x3591, 0x3592, 0x3593, 0x358E, 0x358F, 0x3588, 0x353D, 0x353F, 0x3541, + 0x3537, 0x3539, 0x357C, 0x355D, 0x355F, 0x3561, 0x3563, 0x3555, 0x3557, 0x3559, + 0x355B, 0x354D, 0x354F, 0x3551, 0x3553, 0x3545, 0x3547, 0x3549, 0x354B, 0x354E, + 0x3550, 0x3552, 0x3554, 0x3546, 0x3548, 0x354A, 0x354C, 0x353E, 0x3540, 0x3542, + 0x3544, 0x3536, 0x3538, 0x353A, 0x353C, 0x356E, 0x3570, 0x3572, 0x356C, 0x3564, + 0x3556, 0x3558, 0x355A, 0x355C, 0x219D, 0x219F, 0x21A1, 0x2197, 0x2199, 0x1FF3, + 0x1FF4, 0x1FF5, 0x1FEE, 0x21AB, 0x21AE, 0x21B0, 0x21B2, 0x21B4, 0x21A6, 0x21A8, + 0x21AA, 0x21AC, 0x219E, 0x21A0, 0x21A2, 0x1FC7, 0x1FC9, 0x21B8, 0x1FE1, 0x1FE3, + 0x218E, 0x2190, 0x2188, 0x2180, 0x2182, 0x364C, 0x364D, 0x364F, 0x3649, 0x364B, + 0x3646, 0x3647, 0x3641, 0x1D3A, 0x1D3B, 0x1D3C, 0x1D36, 0x1D37, 0x1D37, 0x1D32, + 0x0DBD, 0x0E64, 0x0E46, 0x0FE5, 0x0ED1, 0x0F16, 0x0FBD, 0x0D57, 0x0C9E, 0x0CA8, + 0x36AD, 0x36A6, 0x36A7, 0x1809, 0x180A, 0x180B, 0x1800, 0x1802, 0x1804, 0x1805, + 0x17FC, 0x3689, 0x366A, 0x366B, 0x366C, 0x366D, 0x3666, 0x3667, 0x3668, 0x2038, + 0x203B, 0x2088, 0x208B, 0x203E, 0x208A, 0x208D, 0x2078, 0x207A, 0x0EBA, 0x0D9E, + 0x022A, 0x0234, 0x01F5, 0x0209, 0x0215, 0x021F, 0x0198, 0x01A2, 0x01C9, 0x01DF, + 0x2476, 0x2477, 0x2478, 0x2479, 0x2472, 0x2473, 0x2474, 0x2475, 0x246E, 0x246F, + 0x2470, 0x2471, 0x246A, 0x246B, 0x246C, 0x246D, 0x247E, 0x247F, 0x247A, 0x247B, + 0x247C, 0x247D, 0x2456, 0x2457, 0x2458, 0x2459, 0x2452, 0x2453, 0x2454, 0x2455, + 0x244E, 0x244F, 0x2450, 0x2451, 0x244A, 0x244B, 0x244C, 0x244D, 0x2466, 0x2467, + 0x2468, 0x2469, 0x2462, 0x2463, 0x2464, 0x2465, 0x245E, 0x245F, 0x2460, 0x2461, + 0x245A, 0x245B, 0x245C, 0x245D, 0x20A1, 0x20AA, 0x2062, 0x2063, 0x20A8, 0x20A9, + 0x209C, 0x209E, 0x2061, 0x20A3, 0x2446, 0x2447, 0x2448, 0x2449, 0x2442, 0x0291, + 0x2443, 0x2444, 0x2445, 0x0346, 0x0372, 0x0395, 0x243E, 0x243F, 0x2440, 0x2441, + 0x243A, 0x243B, 0x243C, 0x243D, 0x2094, 0x2096, 0x2097, 0x2099, 0x203A, 0x2081, + 0x204B, 0x206E, 0x2030, 0x06BE, 0x06DB, 0x0267, 0x02A8, 0x02C6, 0x02EF, 0x032A, + 0x036D, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x0424, 0x044C, 0x047E, 0x049C, 0x04E6, + 0x0538, 0x0551, 0x2032, 0x05AC, 0x05DD, 0x061A, 0x065F, 0x067F, 0x0694, 0x06B2, + 0x06D2, 0x0291, 0x02AE, 0x02D0, 0x0300, 0x0346, 0x0372, 0x0395, 0x03BD, 0x03FB, + 0x0412, 0x042D, 0x045C, 0x0485, 0x04AB, 0x0510, 0x053D, 0x0554, 0x0578, 0x05BC, + 0x05E9, 0x063C, 0x0669, 0x0688, 0x069C, 0x202C, 0x06DB, 0x0267, 0x02A8, 0x02C6, + 0x02EF, 0x032A, 0x202D, 0x0389, 0x03B2, 0x03E2, 0x040E, 0x202E, 0x202F, 0x205F, + 0x2060, 0x2095, 0x2098, 0x209B, 0x20A5, 0x2057, 0x204C, 0x20A2, 0x20A4, 0x20A6, + 0x20A7, 0x209A, 0x209D, 0x209F, 0x20A0, 0x02D0, 0x0300, 0x1E61, 0x1E62, 0x1E5D, + 0x1E5E, 0x1E5F, 0x1E60, 0x1E59, 0x1E5A, 0x1E5B, 0x1E5C, 0x1E55, 0x1E56, 0x1E57, + 0x1E58, 0x1E67, 0x1E63, 0x1E64, 0x1E65, 0x1E66, 0x0215, 0x021F, 0x022A, 0x0234, + 0x01C9, 0x01DF, 0x01F5, 0x0209, 0x0198, 0x01A2, 0x1E51, 0x1E46, 0x01DF, 0x00E9, + 0x00EA, 0x00EB, 0x00EC, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E1, 0x00E2, 0x00E3, + 0x00E4, 0x34D8, 0x34D9, 0x34DA, 0x34DB, 0x34D4, 0x34D5, 0x34D6, 0x34D7, 0x34D0, + 0x34D1, 0x34D2, 0x34D3, 0x34CC, 0x34CD, 0x34CE, 0x1CB4, 0x1CB5, 0x1CB6, 0x1CAD, + 0x1CAF, 0x1CB0, 0x1CB1, 0x1CA9, 0x1CAA, 0x1CAB, 0x1CAC, 0x1CA5, 0x1CA7, 0x1CA8, + 0x1CC3, 0x34BA, 0x34AF, 0x34C8, 0x34C9, 0x34CA, 0x34CB, 0x34C4, 0x34C5, 0x34C6, + 0x34C7, 0x34C0, 0x34C1, 0x34C2, 0x34C3, 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x349B, + 0x349C, 0x349D, 0x349E, 0x3497, 0x3498, 0x3499, 0x349A, 0x3493, 0x3494, 0x3495, + 0x3496, 0x348F, 0x3490, 0x3491, 0x3492, 0x34AB, 0x1F5C, 0x34A8, 0x34A9, 0x34A2, + 0x0B07, 0x0B08, 0x0B09, 0x0B05, 0x0AFE, 0x1F30, 0x1F35, 0x1F3A, 0x1F3F, 0x1F1C, + 0x1F2B, 0x1F08, 0x0F3B, 0x1F51, 0x1F52, 0x1F53, 0x1F4C, 0x0F5D, 0x1F48, 0x1EF9, + 0x1EE5, 0x1EEA, 0x1EEF, 0x1ECC, 0x1ED1, 0x1ED6, 0x0F88, 0x1EDB, 0x1EB8, 0x3526, + 0x3527, 0x2421, 0x2422, 0x2423, 0x241C, 0x241D, 0x241E, 0x241F, 0x2418, 0x2419, + 0x241A, 0x241B, 0x2414, 0x2415, 0x2416, 0x2417, 0x23F0, 0x23F1, 0x23F2, 0x23F3, + 0x0C81, 0x23EC, 0x23ED, 0x23EE, 0x23EF, 0x23E8, 0x23E9, 0x23EA, 0x23EB, 0x23E4, + 0x23E5, 0x23E6, 0x23E7, 0x2400, 0x23F9, 0x23FA, 0x23FB, 0x23F4, 0x23D1, 0x23D2, + 0x23D3, 0x23CC, 0x23CD, 0x23CE, 0x23CF, 0x23C8, 0x23CB, 0x23C4, 0x23C5, 0x3AA2, + 0x3ABB, 0x3AB9, 0x3AB2, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A89, 0x3A8A, 0x3A8B, 0x24CE, + 0x24C4, 0x24DD, 0x24DE, 0x24DF, 0x24D7, 0x24D9, 0x24DA, 0x24DB, 0x24D3, 0x24C5, + 0x24D4, 0x24D6, 0x24CF, 0x24D0, 0x24D1, 0x24D2, 0x24A4, 0x24A5, 0x24A6, 0x24A8, + 0x24A2, 0x24A3, 0x24E1, 0x24E3, 0x249D, 0x249E, 0x249F, 0x24A0, 0x249A, 0x249B, + 0x249C, 0x24E5, 0x24B6, 0x24B9, 0x24E8, 0x248E, 0x2487, 0x3743, 0x373F, 0x371C, + 0x371D, 0x371E, 0x371A, 0x248F, 0x372B, 0x1D07, 0x1CFD, 0x3723, 0x36FE, 0x36FF, + 0x3700, 0x36FA, 0x36FB, 0x36FC, 0x36FD, 0x36F6, 0x36F7, 0x36F8, 0x36F2, 0x36F3, + 0x36F4, 0x3704, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37B2, 0x37B3, 0x37B4, 0x37B5, + 0x37AE, 0x37AF, 0x37B0, 0x37AB, 0x37AC, 0x1CE2, 0x1CE3, 0x1CE4, 0x1CDD, 0x1CD9, + 0x37BD, 0x3796, 0x3797, 0x3798, 0x3799, 0x3792, 0x3793, 0x3794, 0x3795, 0x378E, + 0x378F, 0x3790, 0x378B, 0x378C, 0x37A6, 0x379D, 0x3776, 0x3777, 0x3778, 0x3779, + 0x3772, 0x3773, 0x3774, 0x3775, 0x376E, 0x376F, 0x3770, 0x376B, 0x376C, 0x376D, + 0x3786, 0x3787, 0x3788, 0x3783, 0x3784, 0x377D, 0x3756, 0x3757, 0x3758, 0x3753, + 0x3754, 0x374D, 0x3766, 0x3767, 0x3768, 0x3769, 0x3762, 0x3763, 0x3764, 0x3765, + 0x375E, 0x375F, 0x3760, 0x3761, 0x375A, 0x375B, 0x375C, 0x00CE, 0x00CF, 0x00D0, + 0x00D1, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00C2, + 0x00C3, 0x00C4, 0x1E3E, 0x1E3F, 0x1E40, 0x1E39, 0x1E3B, 0x1E3C, 0x1E35, 0x0209, + 0x00B7, 0x00B8, 0x00B9, 0x0209, 0x0209, 0x00B4, 0x00B5, 0x00B6, 0x00B0, 0x00B1, + 0x00B2, 0x2229, 0x222A, 0x222B, 0x2224, 0x2225, 0x2226, 0x2227, 0x2220, 0x2221, + 0x2222, 0x2223, 0x221C, 0x2231, 0x2232, 0x2233, 0x4849, 0x222D, 0x222E, 0x222F, + 0x2208, 0x2219, 0x4885, 0x02AE, 0x0291, 0x0300, 0x02D0, 0x0372, 0x0346, 0x03BD, + 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, 0x0485, 0x053D, 0x0510, 0x0578, + 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, 0x06BE, 0x02A8, + 0x0267, 0x02EF, 0x02C6, 0x036D, 0x032A, 0x03B2, 0x0389, 0x040E, 0x03E2, 0x044C, + 0x0424, 0x049C, 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, 0x05AC, 0x065F, + 0x061A, 0x0694, 0x067F, 0x06D2, 0x06B2, 0x02AE, 0x0291, 0x0300, 0x02D0, 0x0372, + 0x0346, 0x03BD, 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, 0x0485, 0x053D, + 0x0510, 0x0578, 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, + 0x06BE, 0x02A8, 0x0267, 0x02EF, 0x02C6, 0x036D, 0x032A, 0x0865, 0x0389, 0x040E, + 0x03E2, 0x044C, 0x0424, 0x049C, 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, + 0x05AC, 0x065F, 0x061A, 0x0694, 0x067F, 0x06D2, 0x06B2, 0x02AE, 0x0291, 0x0300, + 0x02D0, 0x0372, 0x0346, 0x03BD, 0x0395, 0x0412, 0x03FB, 0x045C, 0x042D, 0x04AB, + 0x0485, 0x053D, 0x0510, 0x0578, 0x0554, 0x05E9, 0x05BC, 0x0669, 0x063C, 0x069C, + 0x0688, 0x221A, 0x221B, 0x2214, 0x2215, 0x2216, 0x2217, 0x2210, 0x2211, 0x2212, + 0x2213, 0x220C, 0x220D, 0x220E, 0x220F, 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21E4, + 0x21E5, 0x21E6, 0x21E7, 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21DC, 0x21DD, 0x21DE, + 0x21DF, 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21F4, 0x21F5, 0x21F6, 0x21F7, 0x21F0, + 0x21F1, 0x21F2, 0x21F3, 0x21EC, 0x21ED, 0x21EE, 0x21EF, 0x21C8, 0x21C9, 0x21CA, + 0x21CB, 0x21C4, 0x21C5, 0x21C6, 0x21C7, 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21BD, + 0x21BE, 0x21BF, 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21D4, 0x21D5, 0x21D6, 0x21D7, + 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x022B, 0x21CC, 0x21CD, 0x21CE, 0x21CF, 0x22A8, + 0x22A9, 0x22AA, 0x22AB, 0x22A4, 0x22A5, 0x22A6, 0x22A7, 0x22A0, 0x22A1, 0x22A2, + 0x22A3, 0x229C, 0x229D, 0x229E, 0x229F, 0x22B8, 0x22B9, 0x0578, 0x0554, 0x05E9, + 0x05BC, 0x0669, 0x063C, 0x069C, 0x0688, 0x06DB, 0x06BE, 0x02A8, 0x0267, 0x02EF, + 0x02C6, 0x036D, 0x032A, 0x03B2, 0x0389, 0x22BA, 0x22BB, 0x044C, 0x0424, 0x049C, + 0x047E, 0x0538, 0x04E6, 0x056A, 0x0551, 0x05DD, 0x05AC, 0x065F, 0x061A, 0x22B4, + 0x22B5, 0x22B6, 0x22B1, 0x22B2, 0x0FCE, 0x0FCC, 0x22B3, 0x22AC, 0x22AD, 0x0FC7, + 0x22AE, 0x22AF, 0x2288, 0x0FD6, 0x0FD5, 0x2289, 0x228A, 0x228B, 0x042D, 0x2284, + 0x2285, 0x100D, 0x100C, 0x100A, 0x0FDD, 0x2286, 0x2287, 0x0C84, 0x1006, 0x1005, + 0x2280, 0x0C7E, 0x0C8A, 0x0C93, 0x0C86, 0x0C92, 0x2281, 0x0C94, 0x2282, 0x0C97, + 0x2283, 0x0C95, 0x0C88, 0x1004, 0x0C79, 0x0C87, 0x1003, 0x227C, 0x227D, 0x227E, + 0x227F, 0x0412, 0x2298, 0x2299, 0x229A, 0x229B, 0x2294, 0x2295, 0x2296, 0x2297, + 0x2290, 0x03FB, 0x2291, 0x2292, 0x2D1B, 0x2293, 0x228C, 0x228D, 0x228E, 0x2D31, + 0x2D37, 0x07BF, 0x07F4, 0x0FCA, 0x228F, 0x0865, 0x0869, 0x0885, 0x07FA, 0x2268, + 0x2262, 0x100B, 0x2279, 0x0FC3, 0x227A, 0x227B, 0x2274, 0x2275, 0x2276, 0x2277, 0x2270, 0x2271, 0x2272, 0x2273, 0x226C, 0x226D, 0x0769, }; diff --git a/vendor/nunicode/src/libnu/gen/_ducet_switch.c b/vendor/nunicode/src/libnu/gen/_ducet_switch.c index 005ac1f25956..ec7027e252e1 100644 --- a/vendor/nunicode/src/libnu/gen/_ducet_switch.c +++ b/vendor/nunicode/src/libnu/gen/_ducet_switch.c @@ -47,25 +47,25 @@ const size_t _NU_DUCET_CODEPOINTS = 20027; /* complementary codepoints number */ #define state_001B11 -24 const int16_t _NU_DUCET_ROOTS_G[] = { - 0, -34, 0, 0, -33, -32, -31, -30, -29, -28, 2, -26, - -15, 0, 0, 3, 0, 0, -14, -13, -12, 8, 1, 8, + 0, -34, 0, 0, -33, -32, -31, -30, -29, -28, 2, -26, + -15, 0, 0, 3, 0, 0, -14, -13, -12, 8, 1, 8, -10, 0, -7, -6, 5, 20, 4, -4, -2, 0, }; const size_t _NU_DUCET_ROOTS_G_SIZE = sizeof(_NU_DUCET_ROOTS_G) / sizeof(*_NU_DUCET_ROOTS_G); /* codepoints */ const uint32_t _NU_DUCET_ROOTS_VALUES_C[] = { - 0x00004C, 0x001B0D, 0x000648, 0x000EC0, 0x00064A, 0x000E44, 0x001B0B, 0x000EC1, - 0x000EC3, 0x001B05, 0x000E41, 0x000E43, 0x00006C, 0x000627, 0x0019B5, 0x001025, - 0x001B07, 0x00AAB9, 0x000E40, 0x0019B7, 0x000E42, 0x00AABC, 0x001B09, 0x0019BA, - 0x000EC2, 0x0019B6, 0x000B92, 0x000418, 0x00AABB, 0x000438, 0x00AAB5, 0x00AAB6, + 0x00004C, 0x001B0D, 0x000648, 0x000EC0, 0x00064A, 0x000E44, 0x001B0B, 0x000EC1, + 0x000EC3, 0x001B05, 0x000E41, 0x000E43, 0x00006C, 0x000627, 0x0019B5, 0x001025, + 0x001B07, 0x00AAB9, 0x000E40, 0x0019B7, 0x000E42, 0x00AABC, 0x001B09, 0x0019BA, + 0x000EC2, 0x0019B6, 0x000B92, 0x000418, 0x00AABB, 0x000438, 0x00AAB5, 0x00AAB6, 0x001B11, 0x000EC4, }; /* indexes */ const uint16_t _NU_DUCET_ROOTS_VALUES_I[] = { - 0x0157, 0x00FC, 0x02A2, 0x0071, 0x02AC, 0x00C2, 0x003B, 0x0072, 0x0070, 0x01C6, - 0x00C5, 0x00C3, 0x02C8, 0x0187, 0x02ED, 0x00D9, 0x01E2, 0x0346, 0x00C6, 0x02E8, - 0x00C4, 0x018A, 0x02E9, 0x02E1, 0x006F, 0x02AE, 0x017D, 0x01F4, 0x029B, 0x033A, + 0x0157, 0x00FC, 0x02A2, 0x0071, 0x02AC, 0x00C2, 0x003B, 0x0072, 0x0070, 0x01C6, + 0x00C5, 0x00C3, 0x02C8, 0x0187, 0x02ED, 0x00D9, 0x01E2, 0x0346, 0x00C6, 0x02E8, + 0x00C4, 0x018A, 0x02E9, 0x02E1, 0x006F, 0x02AE, 0x017D, 0x01F4, 0x029B, 0x033A, 0x00AB, 0x00A1, 0x0018, 0x006D, }; /* MPH lookup for root codepoints + binary search on balanced tree @@ -88,8 +88,8 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { if (weight == state_00004C) { switch (u) { - case 0x000387: return 0x000456; - case 0x0000B7: return 0x000456; + case 0x000387: return 0x000456; + case 0x0000B7: return 0x000456; } *w = 1; @@ -98,7 +98,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_00004C) { if (weight == state_00064A) { switch (u) { - case 0x000654: return 0x000C71; + case 0x000654: return 0x000C71; } *w = 1; @@ -107,50 +107,50 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_00064A) { if (weight == state_0019B7) { switch (u) { - case 0x0019A2: return 0x001F15; - case 0x001999: return 0x001EE8; - case 0x001981: return 0x001E70; - case 0x00198E: return 0x001EB1; - case 0x001988: return 0x001E93; - case 0x001994: return 0x001ECF; - case 0x0019A6: return 0x001F29; - case 0x00198A: return 0x001E9D; - case 0x001984: return 0x001E7F; - case 0x00199D: return 0x001EFC; - case 0x001991: return 0x001EC0; - case 0x0019A3: return 0x001F1A; - case 0x001980: return 0x001E6B; - case 0x00198D: return 0x001EAC; - case 0x001995: return 0x001ED4; - case 0x0019A7: return 0x001F2E; - case 0x00199A: return 0x001EED; - case 0x0019AA: return 0x001F3D; - case 0x00199E: return 0x001F01; - case 0x001992: return 0x001EC5; - case 0x001987: return 0x001E8E; - case 0x001996: return 0x001ED9; - case 0x0019A0: return 0x001F0B; - case 0x00199B: return 0x001EF2; - case 0x001983: return 0x001E7A; - case 0x0019AB: return 0x001F42; - case 0x0019A4: return 0x001F1F; - case 0x00199F: return 0x001F06; - case 0x001993: return 0x001ECA; - case 0x00198C: return 0x001EA7; - case 0x001986: return 0x001E89; - case 0x0019A8: return 0x001F33; - case 0x001997: return 0x001EDE; - case 0x0019A1: return 0x001F10; - case 0x00199C: return 0x001EF7; - case 0x001998: return 0x001EE3; - case 0x001982: return 0x001E75; - case 0x00198F: return 0x001EB6; - case 0x001989: return 0x001E98; - case 0x0019A5: return 0x001F24; - case 0x00198B: return 0x001EA2; - case 0x001985: return 0x001E84; - case 0x0019A9: return 0x001F38; - case 0x001990: return 0x001EBB; + case 0x0019A2: return 0x001F15; + case 0x001999: return 0x001EE8; + case 0x001981: return 0x001E70; + case 0x00198E: return 0x001EB1; + case 0x001988: return 0x001E93; + case 0x001994: return 0x001ECF; + case 0x0019A6: return 0x001F29; + case 0x00198A: return 0x001E9D; + case 0x001984: return 0x001E7F; + case 0x00199D: return 0x001EFC; + case 0x001991: return 0x001EC0; + case 0x0019A3: return 0x001F1A; + case 0x001980: return 0x001E6B; + case 0x00198D: return 0x001EAC; + case 0x001995: return 0x001ED4; + case 0x0019A7: return 0x001F2E; + case 0x00199A: return 0x001EED; + case 0x0019AA: return 0x001F3D; + case 0x00199E: return 0x001F01; + case 0x001992: return 0x001EC5; + case 0x001987: return 0x001E8E; + case 0x001996: return 0x001ED9; + case 0x0019A0: return 0x001F0B; + case 0x00199B: return 0x001EF2; + case 0x001983: return 0x001E7A; + case 0x0019AB: return 0x001F42; + case 0x0019A4: return 0x001F1F; + case 0x00199F: return 0x001F06; + case 0x001993: return 0x001ECA; + case 0x00198C: return 0x001EA7; + case 0x001986: return 0x001E89; + case 0x0019A8: return 0x001F33; + case 0x001997: return 0x001EDE; + case 0x0019A1: return 0x001F10; + case 0x00199C: return 0x001EF7; + case 0x001998: return 0x001EE3; + case 0x001982: return 0x001E75; + case 0x00198F: return 0x001EB6; + case 0x001989: return 0x001E98; + case 0x0019A5: return 0x001F24; + case 0x00198B: return 0x001EA2; + case 0x001985: return 0x001E84; + case 0x0019A9: return 0x001F38; + case 0x001990: return 0x001EBB; } *w = 1; @@ -159,50 +159,50 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_0019B7) { if (weight == state_0019B5) { switch (u) { - case 0x0019A8: return 0x001F31; - case 0x00199F: return 0x001F04; - case 0x001993: return 0x001EC8; - case 0x0019AA: return 0x001F3B; - case 0x0019A7: return 0x001F2C; - case 0x001982: return 0x001E73; - case 0x00198F: return 0x001EB4; - case 0x001997: return 0x001EDC; - case 0x00199C: return 0x001EF5; - case 0x0019A0: return 0x001F09; - case 0x00198B: return 0x001EA0; - case 0x0019A9: return 0x001F36; - case 0x001990: return 0x001EB9; - case 0x0019A4: return 0x001F1D; - case 0x001985: return 0x001E82; - case 0x001994: return 0x001ECD; - case 0x0019AB: return 0x001F40; - case 0x001981: return 0x001E6E; - case 0x0019A1: return 0x001F0E; - case 0x00198E: return 0x001EAF; - case 0x001998: return 0x001EE1; - case 0x00199D: return 0x001EFA; - case 0x001991: return 0x001EBE; - case 0x0019A5: return 0x001F22; - case 0x00198A: return 0x001E9B; - case 0x001984: return 0x001E7D; - case 0x001995: return 0x001ED2; - case 0x001989: return 0x001E96; - case 0x00199A: return 0x001EEB; - case 0x001980: return 0x001E69; - case 0x00198D: return 0x001EAA; - case 0x001999: return 0x001EE6; - case 0x00199E: return 0x001EFF; - case 0x0019A2: return 0x001F13; - case 0x001987: return 0x001E8C; - case 0x001992: return 0x001EC3; - case 0x001988: return 0x001E91; - case 0x0019A6: return 0x001F27; - case 0x001983: return 0x001E78; - case 0x001996: return 0x001ED7; - case 0x00199B: return 0x001EF0; - case 0x0019A3: return 0x001F18; - case 0x00198C: return 0x001EA5; - case 0x001986: return 0x001E87; + case 0x0019A8: return 0x001F31; + case 0x00199F: return 0x001F04; + case 0x001993: return 0x001EC8; + case 0x0019AA: return 0x001F3B; + case 0x0019A7: return 0x001F2C; + case 0x001982: return 0x001E73; + case 0x00198F: return 0x001EB4; + case 0x001997: return 0x001EDC; + case 0x00199C: return 0x001EF5; + case 0x0019A0: return 0x001F09; + case 0x00198B: return 0x001EA0; + case 0x0019A9: return 0x001F36; + case 0x001990: return 0x001EB9; + case 0x0019A4: return 0x001F1D; + case 0x001985: return 0x001E82; + case 0x001994: return 0x001ECD; + case 0x0019AB: return 0x001F40; + case 0x001981: return 0x001E6E; + case 0x0019A1: return 0x001F0E; + case 0x00198E: return 0x001EAF; + case 0x001998: return 0x001EE1; + case 0x00199D: return 0x001EFA; + case 0x001991: return 0x001EBE; + case 0x0019A5: return 0x001F22; + case 0x00198A: return 0x001E9B; + case 0x001984: return 0x001E7D; + case 0x001995: return 0x001ED2; + case 0x001989: return 0x001E96; + case 0x00199A: return 0x001EEB; + case 0x001980: return 0x001E69; + case 0x00198D: return 0x001EAA; + case 0x001999: return 0x001EE6; + case 0x00199E: return 0x001EFF; + case 0x0019A2: return 0x001F13; + case 0x001987: return 0x001E8C; + case 0x001992: return 0x001EC3; + case 0x001988: return 0x001E91; + case 0x0019A6: return 0x001F27; + case 0x001983: return 0x001E78; + case 0x001996: return 0x001ED7; + case 0x00199B: return 0x001EF0; + case 0x0019A3: return 0x001F18; + case 0x00198C: return 0x001EA5; + case 0x001986: return 0x001E87; } *w = 1; @@ -211,7 +211,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_0019B5) { if (weight == state_000438) { switch (u) { - case 0x000306: return 0x000987; + case 0x000306: return 0x000987; } *w = 1; @@ -220,54 +220,54 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000438) { if (weight == state_00AAB9) { switch (u) { - case 0x00AA92: return 0x001AE6; - case 0x00AAA5: return 0x001B58; - case 0x00AAAC: return 0x001B82; - case 0x00AA8F: return 0x001AD4; - case 0x00AA82: return 0x001A86; - case 0x00AA9C: return 0x001B22; - case 0x00AAA1: return 0x001B40; - case 0x00AA97: return 0x001B04; - case 0x00AAAD: return 0x001B88; - case 0x00AA86: return 0x001A9E; - case 0x00AA93: return 0x001AEC; - case 0x00AA9D: return 0x001B28; - case 0x00AA8A: return 0x001AB6; - case 0x00AAA6: return 0x001B5E; - case 0x00AA94: return 0x001AF2; - case 0x00AA8E: return 0x001ACE; - case 0x00AAAE: return 0x001B8E; - case 0x00AA81: return 0x001A80; - case 0x00AAA2: return 0x001B46; - case 0x00AA90: return 0x001ADA; - case 0x00AA9E: return 0x001B2E; - case 0x00AAAA: return 0x001B76; - case 0x00AA85: return 0x001A98; - case 0x00AA9A: return 0x001B16; - case 0x00AAA7: return 0x001B64; - case 0x00AA95: return 0x001AF8; - case 0x00AA89: return 0x001AB0; - case 0x00AA8D: return 0x001AC8; - case 0x00AA80: return 0x001A7A; - case 0x00AA98: return 0x001B0A; - case 0x00AAA3: return 0x001B4C; - case 0x00AA91: return 0x001AE0; - case 0x00AAA8: return 0x001B6A; - case 0x00AAAF: return 0x001B94; - case 0x00AA84: return 0x001A92; - case 0x00AA8C: return 0x001AC2; - case 0x00AA9F: return 0x001B34; - case 0x00AAA4: return 0x001B52; - case 0x00AAAB: return 0x001B7C; - case 0x00AA88: return 0x001AAA; - case 0x00AA83: return 0x001A8C; - case 0x00AA99: return 0x001B10; - case 0x00AA9B: return 0x001B1C; - case 0x00AAA0: return 0x001B3A; - case 0x00AA96: return 0x001AFE; - case 0x00AAA9: return 0x001B70; - case 0x00AA87: return 0x001AA4; - case 0x00AA8B: return 0x001ABC; + case 0x00AA92: return 0x001AE6; + case 0x00AAA5: return 0x001B58; + case 0x00AAAC: return 0x001B82; + case 0x00AA8F: return 0x001AD4; + case 0x00AA82: return 0x001A86; + case 0x00AA9C: return 0x001B22; + case 0x00AAA1: return 0x001B40; + case 0x00AA97: return 0x001B04; + case 0x00AAAD: return 0x001B88; + case 0x00AA86: return 0x001A9E; + case 0x00AA93: return 0x001AEC; + case 0x00AA9D: return 0x001B28; + case 0x00AA8A: return 0x001AB6; + case 0x00AAA6: return 0x001B5E; + case 0x00AA94: return 0x001AF2; + case 0x00AA8E: return 0x001ACE; + case 0x00AAAE: return 0x001B8E; + case 0x00AA81: return 0x001A80; + case 0x00AAA2: return 0x001B46; + case 0x00AA90: return 0x001ADA; + case 0x00AA9E: return 0x001B2E; + case 0x00AAAA: return 0x001B76; + case 0x00AA85: return 0x001A98; + case 0x00AA9A: return 0x001B16; + case 0x00AAA7: return 0x001B64; + case 0x00AA95: return 0x001AF8; + case 0x00AA89: return 0x001AB0; + case 0x00AA8D: return 0x001AC8; + case 0x00AA80: return 0x001A7A; + case 0x00AA98: return 0x001B0A; + case 0x00AAA3: return 0x001B4C; + case 0x00AA91: return 0x001AE0; + case 0x00AAA8: return 0x001B6A; + case 0x00AAAF: return 0x001B94; + case 0x00AA84: return 0x001A92; + case 0x00AA8C: return 0x001AC2; + case 0x00AA9F: return 0x001B34; + case 0x00AAA4: return 0x001B52; + case 0x00AAAB: return 0x001B7C; + case 0x00AA88: return 0x001AAA; + case 0x00AA83: return 0x001A8C; + case 0x00AA99: return 0x001B10; + case 0x00AA9B: return 0x001B1C; + case 0x00AAA0: return 0x001B3A; + case 0x00AA96: return 0x001AFE; + case 0x00AAA9: return 0x001B70; + case 0x00AA87: return 0x001AA4; + case 0x00AA8B: return 0x001ABC; } *w = 1; @@ -278,7 +278,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_0019B5 */ if (weight == state_001B09) { switch (u) { - case 0x001B35: return 0x001FCC; + case 0x001B35: return 0x001FCC; } *w = 1; @@ -289,8 +289,8 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_0019B7 */ if (weight == state_00006C) { switch (u) { - case 0x0000B7: return 0x000445; - case 0x000387: return 0x000445; + case 0x0000B7: return 0x000445; + case 0x000387: return 0x000445; } *w = 1; @@ -299,50 +299,50 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_00006C) { if (weight == state_0019BA) { switch (u) { - case 0x00198F: return 0x001EB7; - case 0x0019A2: return 0x001F16; - case 0x001995: return 0x001ED5; - case 0x00199C: return 0x001EF8; - case 0x001980: return 0x001E6C; - case 0x001991: return 0x001EC1; - case 0x0019A7: return 0x001F2F; - case 0x001984: return 0x001E80; - case 0x00199D: return 0x001EFD; - case 0x00198A: return 0x001E9E; - case 0x0019A3: return 0x001F1B; - case 0x001983: return 0x001E7B; - case 0x00198E: return 0x001EB2; - case 0x001996: return 0x001EDA; - case 0x0019A4: return 0x001F20; - case 0x001987: return 0x001E8F; - case 0x00199E: return 0x001F02; - case 0x001992: return 0x001EC6; - case 0x0019A0: return 0x001F0C; - case 0x00199A: return 0x001EEE; - case 0x001982: return 0x001E76; - case 0x00198D: return 0x001EAD; - case 0x0019AA: return 0x001F3E; - case 0x001997: return 0x001EDF; - case 0x0019A5: return 0x001F25; - case 0x001986: return 0x001E8A; - case 0x0019A8: return 0x001F34; - case 0x001989: return 0x001E99; - case 0x001993: return 0x001ECB; - case 0x00198C: return 0x001EA8; - case 0x0019A1: return 0x001F11; - case 0x001998: return 0x001EE4; - case 0x00199F: return 0x001F07; - case 0x001994: return 0x001ED0; - case 0x00199B: return 0x001EF3; - case 0x001981: return 0x001E71; - case 0x0019A9: return 0x001F39; - case 0x0019AB: return 0x001F43; - case 0x001988: return 0x001E94; - case 0x001990: return 0x001EBC; - case 0x00198B: return 0x001EA3; - case 0x0019A6: return 0x001F2A; - case 0x001999: return 0x001EE9; - case 0x001985: return 0x001E85; + case 0x00198F: return 0x001EB7; + case 0x0019A2: return 0x001F16; + case 0x001995: return 0x001ED5; + case 0x00199C: return 0x001EF8; + case 0x001980: return 0x001E6C; + case 0x001991: return 0x001EC1; + case 0x0019A7: return 0x001F2F; + case 0x001984: return 0x001E80; + case 0x00199D: return 0x001EFD; + case 0x00198A: return 0x001E9E; + case 0x0019A3: return 0x001F1B; + case 0x001983: return 0x001E7B; + case 0x00198E: return 0x001EB2; + case 0x001996: return 0x001EDA; + case 0x0019A4: return 0x001F20; + case 0x001987: return 0x001E8F; + case 0x00199E: return 0x001F02; + case 0x001992: return 0x001EC6; + case 0x0019A0: return 0x001F0C; + case 0x00199A: return 0x001EEE; + case 0x001982: return 0x001E76; + case 0x00198D: return 0x001EAD; + case 0x0019AA: return 0x001F3E; + case 0x001997: return 0x001EDF; + case 0x0019A5: return 0x001F25; + case 0x001986: return 0x001E8A; + case 0x0019A8: return 0x001F34; + case 0x001989: return 0x001E99; + case 0x001993: return 0x001ECB; + case 0x00198C: return 0x001EA8; + case 0x0019A1: return 0x001F11; + case 0x001998: return 0x001EE4; + case 0x00199F: return 0x001F07; + case 0x001994: return 0x001ED0; + case 0x00199B: return 0x001EF3; + case 0x001981: return 0x001E71; + case 0x0019A9: return 0x001F39; + case 0x0019AB: return 0x001F43; + case 0x001988: return 0x001E94; + case 0x001990: return 0x001EBC; + case 0x00198B: return 0x001EA3; + case 0x0019A6: return 0x001F2A; + case 0x001999: return 0x001EE9; + case 0x001985: return 0x001E85; } *w = 1; @@ -352,50 +352,50 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_00006C */ if (weight == state_0019B6) { switch (u) { - case 0x001995: return 0x001ED3; - case 0x0019A3: return 0x001F19; - case 0x00199A: return 0x001EEC; - case 0x001980: return 0x001E6A; - case 0x00198D: return 0x001EAB; - case 0x001989: return 0x001E97; - case 0x0019AA: return 0x001F3C; - case 0x0019A7: return 0x001F2D; - case 0x00199E: return 0x001F00; - case 0x001990: return 0x001EBA; - case 0x001985: return 0x001E83; - case 0x001994: return 0x001ECE; - case 0x0019A2: return 0x001F14; - case 0x001981: return 0x001E6F; - case 0x00198E: return 0x001EB0; - case 0x0019A6: return 0x001F28; - case 0x00199D: return 0x001EFB; - case 0x00198A: return 0x001E9C; - case 0x001986: return 0x001E88; - case 0x001993: return 0x001EC9; - case 0x0019A1: return 0x001F0F; - case 0x001982: return 0x001E74; - case 0x00198F: return 0x001EB5; - case 0x001997: return 0x001EDD; - case 0x0019A5: return 0x001F23; - case 0x00199C: return 0x001EF6; - case 0x00198B: return 0x001EA1; - case 0x001987: return 0x001E8D; - case 0x0019A9: return 0x001F37; - case 0x001992: return 0x001EC4; - case 0x0019A0: return 0x001F0A; - case 0x001999: return 0x001EE7; - case 0x001983: return 0x001E79; - case 0x001996: return 0x001ED8; - case 0x0019A4: return 0x001F1E; - case 0x00199B: return 0x001EF1; - case 0x00198C: return 0x001EA6; - case 0x001988: return 0x001E92; - case 0x0019AB: return 0x001F41; - case 0x0019A8: return 0x001F32; - case 0x00199F: return 0x001F05; - case 0x001991: return 0x001EBF; - case 0x001998: return 0x001EE2; - case 0x001984: return 0x001E7E; + case 0x001995: return 0x001ED3; + case 0x0019A3: return 0x001F19; + case 0x00199A: return 0x001EEC; + case 0x001980: return 0x001E6A; + case 0x00198D: return 0x001EAB; + case 0x001989: return 0x001E97; + case 0x0019AA: return 0x001F3C; + case 0x0019A7: return 0x001F2D; + case 0x00199E: return 0x001F00; + case 0x001990: return 0x001EBA; + case 0x001985: return 0x001E83; + case 0x001994: return 0x001ECE; + case 0x0019A2: return 0x001F14; + case 0x001981: return 0x001E6F; + case 0x00198E: return 0x001EB0; + case 0x0019A6: return 0x001F28; + case 0x00199D: return 0x001EFB; + case 0x00198A: return 0x001E9C; + case 0x001986: return 0x001E88; + case 0x001993: return 0x001EC9; + case 0x0019A1: return 0x001F0F; + case 0x001982: return 0x001E74; + case 0x00198F: return 0x001EB5; + case 0x001997: return 0x001EDD; + case 0x0019A5: return 0x001F23; + case 0x00199C: return 0x001EF6; + case 0x00198B: return 0x001EA1; + case 0x001987: return 0x001E8D; + case 0x0019A9: return 0x001F37; + case 0x001992: return 0x001EC4; + case 0x0019A0: return 0x001F0A; + case 0x001999: return 0x001EE7; + case 0x001983: return 0x001E79; + case 0x001996: return 0x001ED8; + case 0x0019A4: return 0x001F1E; + case 0x00199B: return 0x001EF1; + case 0x00198C: return 0x001EA6; + case 0x001988: return 0x001E92; + case 0x0019AB: return 0x001F41; + case 0x0019A8: return 0x001F32; + case 0x00199F: return 0x001F05; + case 0x001991: return 0x001EBF; + case 0x001998: return 0x001EE2; + case 0x001984: return 0x001E7E; } *w = 1; @@ -407,7 +407,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_00064A */ if (weight == state_001B05) { switch (u) { - case 0x001B35: return 0x001FC8; + case 0x001B35: return 0x001FC8; } *w = 1; @@ -416,7 +416,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_001B05) { if (weight == state_000418) { switch (u) { - case 0x000306: return 0x000988; + case 0x000306: return 0x000988; } *w = 1; @@ -425,54 +425,54 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000418) { if (weight == state_00AABB) { switch (u) { - case 0x00AAA0: return 0x001B3B; - case 0x00AA8D: return 0x001AC9; - case 0x00AA81: return 0x001A81; - case 0x00AA99: return 0x001B11; - case 0x00AA90: return 0x001ADB; - case 0x00AAAF: return 0x001B95; - case 0x00AA9D: return 0x001B29; - case 0x00AA85: return 0x001A99; - case 0x00AA8A: return 0x001AB7; - case 0x00AAAB: return 0x001B7D; - case 0x00AA89: return 0x001AB1; - case 0x00AAA7: return 0x001B65; - case 0x00AA8E: return 0x001ACF; - case 0x00AA82: return 0x001A87; - case 0x00AA98: return 0x001B0B; - case 0x00AA97: return 0x001B05; - case 0x00AAAE: return 0x001B8F; - case 0x00AAA3: return 0x001B4D; - case 0x00AA86: return 0x001A9F; - case 0x00AA8B: return 0x001ABD; - case 0x00AA93: return 0x001AED; - case 0x00AAAA: return 0x001B77; - case 0x00AAA6: return 0x001B5F; - case 0x00AA8F: return 0x001AD5; - case 0x00AA83: return 0x001A8D; - case 0x00AA9C: return 0x001B23; - case 0x00AA96: return 0x001AFF; - case 0x00AAAD: return 0x001B89; - case 0x00AAA2: return 0x001B47; - case 0x00AA87: return 0x001AA5; - case 0x00AAA9: return 0x001B71; - case 0x00AA8C: return 0x001AC3; - case 0x00AA92: return 0x001AE7; - case 0x00AA9F: return 0x001B35; - case 0x00AAA5: return 0x001B59; - case 0x00AA9B: return 0x001B1D; - case 0x00AA95: return 0x001AF9; - case 0x00AAA1: return 0x001B41; - case 0x00AA80: return 0x001A7B; - case 0x00AAA8: return 0x001B6B; - case 0x00AA91: return 0x001AE1; - case 0x00AA9E: return 0x001B2F; - case 0x00AA84: return 0x001A93; - case 0x00AAA4: return 0x001B53; - case 0x00AAAC: return 0x001B83; - case 0x00AA9A: return 0x001B17; - case 0x00AA94: return 0x001AF3; - case 0x00AA88: return 0x001AAB; + case 0x00AAA0: return 0x001B3B; + case 0x00AA8D: return 0x001AC9; + case 0x00AA81: return 0x001A81; + case 0x00AA99: return 0x001B11; + case 0x00AA90: return 0x001ADB; + case 0x00AAAF: return 0x001B95; + case 0x00AA9D: return 0x001B29; + case 0x00AA85: return 0x001A99; + case 0x00AA8A: return 0x001AB7; + case 0x00AAAB: return 0x001B7D; + case 0x00AA89: return 0x001AB1; + case 0x00AAA7: return 0x001B65; + case 0x00AA8E: return 0x001ACF; + case 0x00AA82: return 0x001A87; + case 0x00AA98: return 0x001B0B; + case 0x00AA97: return 0x001B05; + case 0x00AAAE: return 0x001B8F; + case 0x00AAA3: return 0x001B4D; + case 0x00AA86: return 0x001A9F; + case 0x00AA8B: return 0x001ABD; + case 0x00AA93: return 0x001AED; + case 0x00AAAA: return 0x001B77; + case 0x00AAA6: return 0x001B5F; + case 0x00AA8F: return 0x001AD5; + case 0x00AA83: return 0x001A8D; + case 0x00AA9C: return 0x001B23; + case 0x00AA96: return 0x001AFF; + case 0x00AAAD: return 0x001B89; + case 0x00AAA2: return 0x001B47; + case 0x00AA87: return 0x001AA5; + case 0x00AAA9: return 0x001B71; + case 0x00AA8C: return 0x001AC3; + case 0x00AA92: return 0x001AE7; + case 0x00AA9F: return 0x001B35; + case 0x00AAA5: return 0x001B59; + case 0x00AA9B: return 0x001B1D; + case 0x00AA95: return 0x001AF9; + case 0x00AAA1: return 0x001B41; + case 0x00AA80: return 0x001A7B; + case 0x00AAA8: return 0x001B6B; + case 0x00AA91: return 0x001AE1; + case 0x00AA9E: return 0x001B2F; + case 0x00AA84: return 0x001A93; + case 0x00AAA4: return 0x001B53; + case 0x00AAAC: return 0x001B83; + case 0x00AA9A: return 0x001B17; + case 0x00AA94: return 0x001AF3; + case 0x00AA88: return 0x001AAB; } *w = 1; @@ -481,7 +481,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_00AABB) { if (weight == state_000648) { switch (u) { - case 0x000654: return 0x000C68; + case 0x000654: return 0x000C68; } *w = 1; @@ -492,7 +492,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000418 */ if (weight == state_001B07) { switch (u) { - case 0x001B35: return 0x001FCA; + case 0x001B35: return 0x001FCA; } *w = 1; @@ -503,9 +503,9 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_001B05 */ if (weight == state_000627) { switch (u) { - case 0x000653: return 0x000C5E; - case 0x000655: return 0x000C6B; - case 0x000654: return 0x000C61; + case 0x000653: return 0x000C5E; + case 0x000655: return 0x000C6B; + case 0x000654: return 0x000C61; } *w = 1; @@ -514,54 +514,54 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000627) { if (weight == state_00AABC) { switch (u) { - case 0x00AA95: return 0x001AFA; - case 0x00AAA1: return 0x001B42; - case 0x00AA84: return 0x001A94; - case 0x00AA98: return 0x001B0C; - case 0x00AA91: return 0x001AE2; - case 0x00AAAC: return 0x001B84; - case 0x00AA9E: return 0x001B30; - case 0x00AA88: return 0x001AAC; - case 0x00AAA6: return 0x001B60; - case 0x00AA8D: return 0x001ACA; - case 0x00AA9A: return 0x001B18; - case 0x00AA96: return 0x001B00; - case 0x00AAA2: return 0x001B48; - case 0x00AA83: return 0x001A8E; - case 0x00AA99: return 0x001B12; - case 0x00AA92: return 0x001AE8; - case 0x00AAAD: return 0x001B8A; - case 0x00AA9F: return 0x001B36; - case 0x00AA87: return 0x001AA6; - case 0x00AAA7: return 0x001B66; - case 0x00AA8C: return 0x001AC4; - case 0x00AA9B: return 0x001B1E; - case 0x00AA97: return 0x001B06; - case 0x00AAA3: return 0x001B4E; - case 0x00AA82: return 0x001A88; - case 0x00AA93: return 0x001AEE; - case 0x00AAAE: return 0x001B90; - case 0x00AA86: return 0x001AA0; - case 0x00AAA8: return 0x001B6C; - case 0x00AA8B: return 0x001ABE; - case 0x00AAAA: return 0x001B78; - case 0x00AA9C: return 0x001B24; - case 0x00AAA4: return 0x001B54; - case 0x00AA8F: return 0x001AD6; - case 0x00AA81: return 0x001A82; - case 0x00AA94: return 0x001AF4; - case 0x00AAAF: return 0x001B96; - case 0x00AAA0: return 0x001B3C; - case 0x00AA85: return 0x001A9A; - case 0x00AAA9: return 0x001B72; - case 0x00AA8A: return 0x001AB8; - case 0x00AA90: return 0x001ADC; - case 0x00AAAB: return 0x001B7E; - case 0x00AA9D: return 0x001B2A; - case 0x00AA89: return 0x001AB2; - case 0x00AAA5: return 0x001B5A; - case 0x00AA8E: return 0x001AD0; - case 0x00AA80: return 0x001A7C; + case 0x00AA95: return 0x001AFA; + case 0x00AAA1: return 0x001B42; + case 0x00AA84: return 0x001A94; + case 0x00AA98: return 0x001B0C; + case 0x00AA91: return 0x001AE2; + case 0x00AAAC: return 0x001B84; + case 0x00AA9E: return 0x001B30; + case 0x00AA88: return 0x001AAC; + case 0x00AAA6: return 0x001B60; + case 0x00AA8D: return 0x001ACA; + case 0x00AA9A: return 0x001B18; + case 0x00AA96: return 0x001B00; + case 0x00AAA2: return 0x001B48; + case 0x00AA83: return 0x001A8E; + case 0x00AA99: return 0x001B12; + case 0x00AA92: return 0x001AE8; + case 0x00AAAD: return 0x001B8A; + case 0x00AA9F: return 0x001B36; + case 0x00AA87: return 0x001AA6; + case 0x00AAA7: return 0x001B66; + case 0x00AA8C: return 0x001AC4; + case 0x00AA9B: return 0x001B1E; + case 0x00AA97: return 0x001B06; + case 0x00AAA3: return 0x001B4E; + case 0x00AA82: return 0x001A88; + case 0x00AA93: return 0x001AEE; + case 0x00AAAE: return 0x001B90; + case 0x00AA86: return 0x001AA0; + case 0x00AAA8: return 0x001B6C; + case 0x00AA8B: return 0x001ABE; + case 0x00AAAA: return 0x001B78; + case 0x00AA9C: return 0x001B24; + case 0x00AAA4: return 0x001B54; + case 0x00AA8F: return 0x001AD6; + case 0x00AA81: return 0x001A82; + case 0x00AA94: return 0x001AF4; + case 0x00AAAF: return 0x001B96; + case 0x00AAA0: return 0x001B3C; + case 0x00AA85: return 0x001A9A; + case 0x00AAA9: return 0x001B72; + case 0x00AA8A: return 0x001AB8; + case 0x00AA90: return 0x001ADC; + case 0x00AAAB: return 0x001B7E; + case 0x00AA9D: return 0x001B2A; + case 0x00AA89: return 0x001AB2; + case 0x00AAA5: return 0x001B5A; + case 0x00AA8E: return 0x001AD0; + case 0x00AA80: return 0x001A7C; } *w = 1; @@ -571,7 +571,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000627 */ if (weight == state_000B92) { switch (u) { - case 0x000BD7: return 0x0013E2; + case 0x000BD7: return 0x0013E2; } *w = 1; @@ -584,54 +584,54 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_00004C */ if (weight == state_00AAB6) { switch (u) { - case 0x00AA9D: return 0x001B27; - case 0x00AA87: return 0x001AA3; - case 0x00AA8A: return 0x001AB5; - case 0x00AAA9: return 0x001B6F; - case 0x00AAAD: return 0x001B87; - case 0x00AA92: return 0x001AE5; - case 0x00AAA0: return 0x001B39; - case 0x00AA99: return 0x001B0F; - case 0x00AA83: return 0x001A8B; - case 0x00AA96: return 0x001AFD; - case 0x00AA8F: return 0x001AD3; - case 0x00AAA4: return 0x001B51; - case 0x00AA9C: return 0x001B21; - case 0x00AA88: return 0x001AA9; - case 0x00AA8B: return 0x001ABB; - case 0x00AAA8: return 0x001B69; - case 0x00AAAC: return 0x001B81; - case 0x00AA91: return 0x001ADF; - case 0x00AA98: return 0x001B09; - case 0x00AA84: return 0x001A91; - case 0x00AA95: return 0x001AF7; - case 0x00AAA3: return 0x001B4B; - case 0x00AA80: return 0x001A79; - case 0x00AA9B: return 0x001B1B; - case 0x00AA89: return 0x001AAF; - case 0x00AA8C: return 0x001AC1; - case 0x00AAA7: return 0x001B63; - case 0x00AAAB: return 0x001B7B; - case 0x00AA90: return 0x001AD9; - case 0x00AA9F: return 0x001B33; - case 0x00AA85: return 0x001A97; - case 0x00AAAF: return 0x001B93; - case 0x00AA94: return 0x001AF1; - case 0x00AAA2: return 0x001B45; - case 0x00AA81: return 0x001A7F; - case 0x00AA9A: return 0x001B15; - case 0x00AA8D: return 0x001AC7; - case 0x00AAA6: return 0x001B5D; - case 0x00AAAA: return 0x001B75; - case 0x00AA9E: return 0x001B2D; - case 0x00AA86: return 0x001A9D; - case 0x00AAAE: return 0x001B8D; - case 0x00AA93: return 0x001AEB; - case 0x00AAA1: return 0x001B3F; - case 0x00AA82: return 0x001A85; - case 0x00AA97: return 0x001B03; - case 0x00AA8E: return 0x001ACD; - case 0x00AAA5: return 0x001B57; + case 0x00AA9D: return 0x001B27; + case 0x00AA87: return 0x001AA3; + case 0x00AA8A: return 0x001AB5; + case 0x00AAA9: return 0x001B6F; + case 0x00AAAD: return 0x001B87; + case 0x00AA92: return 0x001AE5; + case 0x00AAA0: return 0x001B39; + case 0x00AA99: return 0x001B0F; + case 0x00AA83: return 0x001A8B; + case 0x00AA96: return 0x001AFD; + case 0x00AA8F: return 0x001AD3; + case 0x00AAA4: return 0x001B51; + case 0x00AA9C: return 0x001B21; + case 0x00AA88: return 0x001AA9; + case 0x00AA8B: return 0x001ABB; + case 0x00AAA8: return 0x001B69; + case 0x00AAAC: return 0x001B81; + case 0x00AA91: return 0x001ADF; + case 0x00AA98: return 0x001B09; + case 0x00AA84: return 0x001A91; + case 0x00AA95: return 0x001AF7; + case 0x00AAA3: return 0x001B4B; + case 0x00AA80: return 0x001A79; + case 0x00AA9B: return 0x001B1B; + case 0x00AA89: return 0x001AAF; + case 0x00AA8C: return 0x001AC1; + case 0x00AAA7: return 0x001B63; + case 0x00AAAB: return 0x001B7B; + case 0x00AA90: return 0x001AD9; + case 0x00AA9F: return 0x001B33; + case 0x00AA85: return 0x001A97; + case 0x00AAAF: return 0x001B93; + case 0x00AA94: return 0x001AF1; + case 0x00AAA2: return 0x001B45; + case 0x00AA81: return 0x001A7F; + case 0x00AA9A: return 0x001B15; + case 0x00AA8D: return 0x001AC7; + case 0x00AAA6: return 0x001B5D; + case 0x00AAAA: return 0x001B75; + case 0x00AA9E: return 0x001B2D; + case 0x00AA86: return 0x001A9D; + case 0x00AAAE: return 0x001B8D; + case 0x00AA93: return 0x001AEB; + case 0x00AAA1: return 0x001B3F; + case 0x00AA82: return 0x001A85; + case 0x00AA97: return 0x001B03; + case 0x00AA8E: return 0x001ACD; + case 0x00AAA5: return 0x001B57; } *w = 1; @@ -640,52 +640,52 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_00AAB6) { if (weight == state_000E42) { switch (u) { - case 0x000E1C: return 0x00193A; - case 0x000E16: return 0x001916; - case 0x000E24: return 0x00196A; - case 0x000E07: return 0x0018BC; - case 0x000E0C: return 0x0018DA; - case 0x000E12: return 0x0018FE; - case 0x000E1F: return 0x00194C; - case 0x000E2D: return 0x0019A0; - case 0x000E21: return 0x001958; - case 0x000E1B: return 0x001934; - case 0x000E15: return 0x001910; - case 0x000E25: return 0x001970; - case 0x000E2A: return 0x00198E; - case 0x000E23: return 0x001964; - case 0x000E11: return 0x0018F8; - case 0x000E1E: return 0x001946; - case 0x000E2E: return 0x0019A6; - case 0x000E04: return 0x0018AA; - case 0x000E1A: return 0x00192E; - case 0x000E14: return 0x00190A; - case 0x000E08: return 0x0018C2; - case 0x000E0D: return 0x0018E0; - case 0x000E01: return 0x001898; - case 0x000E19: return 0x001928; - case 0x000E28: return 0x001982; - case 0x000E10: return 0x0018F2; - case 0x000E26: return 0x001976; - case 0x000E1D: return 0x001940; - case 0x000E2B: return 0x001994; - case 0x000E05: return 0x0018B0; - case 0x000E0A: return 0x0018CE; - case 0x000E09: return 0x0018C8; - case 0x000E0E: return 0x0018E6; - case 0x000E02: return 0x00189E; - case 0x000E18: return 0x001922; - case 0x000E17: return 0x00191C; - case 0x000E27: return 0x00197C; - case 0x000E2C: return 0x00199A; - case 0x000E06: return 0x0018B6; - case 0x000E0B: return 0x0018D4; - case 0x000E13: return 0x001904; - case 0x000E29: return 0x001988; - case 0x000E20: return 0x001952; - case 0x000E22: return 0x00195E; - case 0x000E0F: return 0x0018EC; - case 0x000E03: return 0x0018A4; + case 0x000E1C: return 0x00193A; + case 0x000E16: return 0x001916; + case 0x000E24: return 0x00196A; + case 0x000E07: return 0x0018BC; + case 0x000E0C: return 0x0018DA; + case 0x000E12: return 0x0018FE; + case 0x000E1F: return 0x00194C; + case 0x000E2D: return 0x0019A0; + case 0x000E21: return 0x001958; + case 0x000E1B: return 0x001934; + case 0x000E15: return 0x001910; + case 0x000E25: return 0x001970; + case 0x000E2A: return 0x00198E; + case 0x000E23: return 0x001964; + case 0x000E11: return 0x0018F8; + case 0x000E1E: return 0x001946; + case 0x000E2E: return 0x0019A6; + case 0x000E04: return 0x0018AA; + case 0x000E1A: return 0x00192E; + case 0x000E14: return 0x00190A; + case 0x000E08: return 0x0018C2; + case 0x000E0D: return 0x0018E0; + case 0x000E01: return 0x001898; + case 0x000E19: return 0x001928; + case 0x000E28: return 0x001982; + case 0x000E10: return 0x0018F2; + case 0x000E26: return 0x001976; + case 0x000E1D: return 0x001940; + case 0x000E2B: return 0x001994; + case 0x000E05: return 0x0018B0; + case 0x000E0A: return 0x0018CE; + case 0x000E09: return 0x0018C8; + case 0x000E0E: return 0x0018E6; + case 0x000E02: return 0x00189E; + case 0x000E18: return 0x001922; + case 0x000E17: return 0x00191C; + case 0x000E27: return 0x00197C; + case 0x000E2C: return 0x00199A; + case 0x000E06: return 0x0018B6; + case 0x000E0B: return 0x0018D4; + case 0x000E13: return 0x001904; + case 0x000E29: return 0x001988; + case 0x000E20: return 0x001952; + case 0x000E22: return 0x00195E; + case 0x000E0F: return 0x0018EC; + case 0x000E03: return 0x0018A4; } *w = 1; @@ -694,52 +694,52 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000E42) { if (weight == state_000E40) { switch (u) { - case 0x000E04: return 0x0018A8; - case 0x000E27: return 0x00197A; - case 0x000E11: return 0x0018F6; - case 0x000E2C: return 0x001998; - case 0x000E1E: return 0x001944; - case 0x000E18: return 0x001920; - case 0x000E0D: return 0x0018DE; - case 0x000E01: return 0x001896; - case 0x000E1A: return 0x00192C; - case 0x000E14: return 0x001908; - case 0x000E05: return 0x0018AE; - case 0x000E0A: return 0x0018CC; - case 0x000E20: return 0x001950; - case 0x000E10: return 0x0018F0; - case 0x000E29: return 0x001986; - case 0x000E1D: return 0x00193E; - case 0x000E0E: return 0x0018E4; - case 0x000E24: return 0x001968; - case 0x000E17: return 0x00191A; - case 0x000E02: return 0x00189C; - case 0x000E2D: return 0x00199E; - case 0x000E21: return 0x001956; - case 0x000E13: return 0x001902; - case 0x000E22: return 0x00195C; - case 0x000E06: return 0x0018B4; - case 0x000E0B: return 0x0018D2; - case 0x000E25: return 0x00196E; - case 0x000E2A: return 0x00198C; - case 0x000E1C: return 0x001938; - case 0x000E16: return 0x001914; - case 0x000E0F: return 0x0018EA; - case 0x000E03: return 0x0018A2; - case 0x000E2E: return 0x0019A4; - case 0x000E08: return 0x0018C0; - case 0x000E12: return 0x0018FC; - case 0x000E1F: return 0x00194A; - case 0x000E07: return 0x0018BA; - case 0x000E0C: return 0x0018D8; - case 0x000E26: return 0x001974; - case 0x000E2B: return 0x001992; - case 0x000E1B: return 0x001932; - case 0x000E19: return 0x001926; - case 0x000E23: return 0x001962; - case 0x000E28: return 0x001980; - case 0x000E09: return 0x0018C6; - case 0x000E15: return 0x00190E; + case 0x000E04: return 0x0018A8; + case 0x000E27: return 0x00197A; + case 0x000E11: return 0x0018F6; + case 0x000E2C: return 0x001998; + case 0x000E1E: return 0x001944; + case 0x000E18: return 0x001920; + case 0x000E0D: return 0x0018DE; + case 0x000E01: return 0x001896; + case 0x000E1A: return 0x00192C; + case 0x000E14: return 0x001908; + case 0x000E05: return 0x0018AE; + case 0x000E0A: return 0x0018CC; + case 0x000E20: return 0x001950; + case 0x000E10: return 0x0018F0; + case 0x000E29: return 0x001986; + case 0x000E1D: return 0x00193E; + case 0x000E0E: return 0x0018E4; + case 0x000E24: return 0x001968; + case 0x000E17: return 0x00191A; + case 0x000E02: return 0x00189C; + case 0x000E2D: return 0x00199E; + case 0x000E21: return 0x001956; + case 0x000E13: return 0x001902; + case 0x000E22: return 0x00195C; + case 0x000E06: return 0x0018B4; + case 0x000E0B: return 0x0018D2; + case 0x000E25: return 0x00196E; + case 0x000E2A: return 0x00198C; + case 0x000E1C: return 0x001938; + case 0x000E16: return 0x001914; + case 0x000E0F: return 0x0018EA; + case 0x000E03: return 0x0018A2; + case 0x000E2E: return 0x0019A4; + case 0x000E08: return 0x0018C0; + case 0x000E12: return 0x0018FC; + case 0x000E1F: return 0x00194A; + case 0x000E07: return 0x0018BA; + case 0x000E0C: return 0x0018D8; + case 0x000E26: return 0x001974; + case 0x000E2B: return 0x001992; + case 0x000E1B: return 0x001932; + case 0x000E19: return 0x001926; + case 0x000E23: return 0x001962; + case 0x000E28: return 0x001980; + case 0x000E09: return 0x0018C6; + case 0x000E15: return 0x00190E; } *w = 1; @@ -748,7 +748,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000E40) { if (weight == state_001025) { switch (u) { - case 0x00102E: return 0x001DE0; + case 0x00102E: return 0x001DE0; } *w = 1; @@ -757,7 +757,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_001025) { if (weight == state_001B0D) { switch (u) { - case 0x001B35: return 0x001FD0; + case 0x001B35: return 0x001FD0; } *w = 1; @@ -768,52 +768,52 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000E40 */ if (weight == state_000E41) { switch (u) { - case 0x000E2C: return 0x001999; - case 0x000E26: return 0x001975; - case 0x000E14: return 0x001909; - case 0x000E01: return 0x001897; - case 0x000E0E: return 0x0018E5; - case 0x000E08: return 0x0018C1; - case 0x000E1D: return 0x00193F; - case 0x000E11: return 0x0018F7; - case 0x000E0A: return 0x0018CD; - case 0x000E04: return 0x0018A9; - case 0x000E29: return 0x001987; - case 0x000E2B: return 0x001993; - case 0x000E25: return 0x00196F; - case 0x000E15: return 0x00190F; - case 0x000E1A: return 0x00192D; - case 0x000E0D: return 0x0018DF; - case 0x000E21: return 0x001957; - case 0x000E2E: return 0x0019A5; - case 0x000E1E: return 0x001945; - case 0x000E23: return 0x001963; - case 0x000E07: return 0x0018BB; - case 0x000E2A: return 0x00198D; - case 0x000E24: return 0x001969; - case 0x000E12: return 0x0018FD; - case 0x000E03: return 0x0018A3; - case 0x000E20: return 0x001951; - case 0x000E16: return 0x001915; - case 0x000E28: return 0x001981; - case 0x000E2D: return 0x00199F; - case 0x000E1B: return 0x001933; - case 0x000E0C: return 0x0018D9; - case 0x000E06: return 0x0018B5; - case 0x000E1F: return 0x00194B; - case 0x000E13: return 0x001903; - case 0x000E18: return 0x001921; - case 0x000E02: return 0x00189D; - case 0x000E0F: return 0x0018EB; - case 0x000E27: return 0x00197B; - case 0x000E17: return 0x00191B; - case 0x000E1C: return 0x001939; - case 0x000E0B: return 0x0018D3; - case 0x000E09: return 0x0018C7; - case 0x000E22: return 0x00195D; - case 0x000E10: return 0x0018F1; - case 0x000E19: return 0x001927; - case 0x000E05: return 0x0018AF; + case 0x000E2C: return 0x001999; + case 0x000E26: return 0x001975; + case 0x000E14: return 0x001909; + case 0x000E01: return 0x001897; + case 0x000E0E: return 0x0018E5; + case 0x000E08: return 0x0018C1; + case 0x000E1D: return 0x00193F; + case 0x000E11: return 0x0018F7; + case 0x000E0A: return 0x0018CD; + case 0x000E04: return 0x0018A9; + case 0x000E29: return 0x001987; + case 0x000E2B: return 0x001993; + case 0x000E25: return 0x00196F; + case 0x000E15: return 0x00190F; + case 0x000E1A: return 0x00192D; + case 0x000E0D: return 0x0018DF; + case 0x000E21: return 0x001957; + case 0x000E2E: return 0x0019A5; + case 0x000E1E: return 0x001945; + case 0x000E23: return 0x001963; + case 0x000E07: return 0x0018BB; + case 0x000E2A: return 0x00198D; + case 0x000E24: return 0x001969; + case 0x000E12: return 0x0018FD; + case 0x000E03: return 0x0018A3; + case 0x000E20: return 0x001951; + case 0x000E16: return 0x001915; + case 0x000E28: return 0x001981; + case 0x000E2D: return 0x00199F; + case 0x000E1B: return 0x001933; + case 0x000E0C: return 0x0018D9; + case 0x000E06: return 0x0018B5; + case 0x000E1F: return 0x00194B; + case 0x000E13: return 0x001903; + case 0x000E18: return 0x001921; + case 0x000E02: return 0x00189D; + case 0x000E0F: return 0x0018EB; + case 0x000E27: return 0x00197B; + case 0x000E17: return 0x00191B; + case 0x000E1C: return 0x001939; + case 0x000E0B: return 0x0018D3; + case 0x000E09: return 0x0018C7; + case 0x000E22: return 0x00195D; + case 0x000E10: return 0x0018F1; + case 0x000E19: return 0x001927; + case 0x000E05: return 0x0018AF; } *w = 1; @@ -824,52 +824,52 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000E42 */ if (weight == state_000E44) { switch (u) { - case 0x000E1E: return 0x001948; - case 0x000E10: return 0x0018F4; - case 0x000E08: return 0x0018C4; - case 0x000E01: return 0x00189A; - case 0x000E28: return 0x001984; - case 0x000E0E: return 0x0018E8; - case 0x000E14: return 0x00190C; - case 0x000E2B: return 0x001996; - case 0x000E27: return 0x00197E; - case 0x000E29: return 0x00198A; - case 0x000E0A: return 0x0018D0; - case 0x000E18: return 0x001924; - case 0x000E22: return 0x001960; - case 0x000E1D: return 0x001942; - case 0x000E13: return 0x001906; - case 0x000E09: return 0x0018CA; - case 0x000E06: return 0x0018B8; - case 0x000E17: return 0x00191E; - case 0x000E1C: return 0x00193C; - case 0x000E2C: return 0x00199C; - case 0x000E02: return 0x0018A0; - case 0x000E0F: return 0x0018EE; - case 0x000E12: return 0x001900; - case 0x000E24: return 0x00196C; - case 0x000E0B: return 0x0018D6; - case 0x000E07: return 0x0018BE; - case 0x000E16: return 0x001918; - case 0x000E20: return 0x001954; - case 0x000E23: return 0x001966; - case 0x000E1B: return 0x001936; - case 0x000E2D: return 0x0019A2; - case 0x000E03: return 0x0018A6; - case 0x000E1F: return 0x00194E; - case 0x000E25: return 0x001972; - case 0x000E0C: return 0x0018DC; - case 0x000E04: return 0x0018AC; - case 0x000E11: return 0x0018FA; - case 0x000E21: return 0x00195A; - case 0x000E2E: return 0x0019A8; - case 0x000E0D: return 0x0018E2; - case 0x000E15: return 0x001912; - case 0x000E1A: return 0x001930; - case 0x000E2A: return 0x001990; - case 0x000E26: return 0x001978; - case 0x000E05: return 0x0018B2; - case 0x000E19: return 0x00192A; + case 0x000E1E: return 0x001948; + case 0x000E10: return 0x0018F4; + case 0x000E08: return 0x0018C4; + case 0x000E01: return 0x00189A; + case 0x000E28: return 0x001984; + case 0x000E0E: return 0x0018E8; + case 0x000E14: return 0x00190C; + case 0x000E2B: return 0x001996; + case 0x000E27: return 0x00197E; + case 0x000E29: return 0x00198A; + case 0x000E0A: return 0x0018D0; + case 0x000E18: return 0x001924; + case 0x000E22: return 0x001960; + case 0x000E1D: return 0x001942; + case 0x000E13: return 0x001906; + case 0x000E09: return 0x0018CA; + case 0x000E06: return 0x0018B8; + case 0x000E17: return 0x00191E; + case 0x000E1C: return 0x00193C; + case 0x000E2C: return 0x00199C; + case 0x000E02: return 0x0018A0; + case 0x000E0F: return 0x0018EE; + case 0x000E12: return 0x001900; + case 0x000E24: return 0x00196C; + case 0x000E0B: return 0x0018D6; + case 0x000E07: return 0x0018BE; + case 0x000E16: return 0x001918; + case 0x000E20: return 0x001954; + case 0x000E23: return 0x001966; + case 0x000E1B: return 0x001936; + case 0x000E2D: return 0x0019A2; + case 0x000E03: return 0x0018A6; + case 0x000E1F: return 0x00194E; + case 0x000E25: return 0x001972; + case 0x000E0C: return 0x0018DC; + case 0x000E04: return 0x0018AC; + case 0x000E11: return 0x0018FA; + case 0x000E21: return 0x00195A; + case 0x000E2E: return 0x0019A8; + case 0x000E0D: return 0x0018E2; + case 0x000E15: return 0x001912; + case 0x000E1A: return 0x001930; + case 0x000E2A: return 0x001990; + case 0x000E26: return 0x001978; + case 0x000E05: return 0x0018B2; + case 0x000E19: return 0x00192A; } *w = 1; @@ -878,52 +878,52 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000E44) { if (weight == state_000E43) { switch (u) { - case 0x000E02: return 0x00189F; - case 0x000E22: return 0x00195F; - case 0x000E13: return 0x001905; - case 0x000E25: return 0x001971; - case 0x000E2A: return 0x00198F; - case 0x000E06: return 0x0018B7; - case 0x000E0B: return 0x0018D5; - case 0x000E28: return 0x001983; - case 0x000E1C: return 0x00193B; - case 0x000E2E: return 0x0019A7; - case 0x000E20: return 0x001953; - case 0x000E0F: return 0x0018ED; - case 0x000E01: return 0x001899; - case 0x000E14: return 0x00190B; - case 0x000E24: return 0x00196B; - case 0x000E05: return 0x0018B1; - case 0x000E0A: return 0x0018CF; - case 0x000E10: return 0x0018F3; - case 0x000E1D: return 0x001941; - case 0x000E2D: return 0x0019A1; - case 0x000E09: return 0x0018C9; - case 0x000E0E: return 0x0018E7; - case 0x000E15: return 0x001911; - case 0x000E27: return 0x00197D; - case 0x000E2C: return 0x00199B; - case 0x000E04: return 0x0018AB; - case 0x000E18: return 0x001923; - case 0x000E11: return 0x0018F9; - case 0x000E1E: return 0x001947; - case 0x000E08: return 0x0018C3; - case 0x000E23: return 0x001965; - case 0x000E0D: return 0x0018E1; - case 0x000E1A: return 0x00192F; - case 0x000E16: return 0x001917; - case 0x000E26: return 0x001977; - case 0x000E2B: return 0x001995; - case 0x000E03: return 0x0018A5; - case 0x000E19: return 0x001929; - case 0x000E29: return 0x001989; - case 0x000E12: return 0x0018FF; - case 0x000E1F: return 0x00194D; - case 0x000E07: return 0x0018BD; - case 0x000E0C: return 0x0018DB; - case 0x000E1B: return 0x001935; - case 0x000E17: return 0x00191D; - case 0x000E21: return 0x001959; + case 0x000E02: return 0x00189F; + case 0x000E22: return 0x00195F; + case 0x000E13: return 0x001905; + case 0x000E25: return 0x001971; + case 0x000E2A: return 0x00198F; + case 0x000E06: return 0x0018B7; + case 0x000E0B: return 0x0018D5; + case 0x000E28: return 0x001983; + case 0x000E1C: return 0x00193B; + case 0x000E2E: return 0x0019A7; + case 0x000E20: return 0x001953; + case 0x000E0F: return 0x0018ED; + case 0x000E01: return 0x001899; + case 0x000E14: return 0x00190B; + case 0x000E24: return 0x00196B; + case 0x000E05: return 0x0018B1; + case 0x000E0A: return 0x0018CF; + case 0x000E10: return 0x0018F3; + case 0x000E1D: return 0x001941; + case 0x000E2D: return 0x0019A1; + case 0x000E09: return 0x0018C9; + case 0x000E0E: return 0x0018E7; + case 0x000E15: return 0x001911; + case 0x000E27: return 0x00197D; + case 0x000E2C: return 0x00199B; + case 0x000E04: return 0x0018AB; + case 0x000E18: return 0x001923; + case 0x000E11: return 0x0018F9; + case 0x000E1E: return 0x001947; + case 0x000E08: return 0x0018C3; + case 0x000E23: return 0x001965; + case 0x000E0D: return 0x0018E1; + case 0x000E1A: return 0x00192F; + case 0x000E16: return 0x001917; + case 0x000E26: return 0x001977; + case 0x000E2B: return 0x001995; + case 0x000E03: return 0x0018A5; + case 0x000E19: return 0x001929; + case 0x000E29: return 0x001989; + case 0x000E12: return 0x0018FF; + case 0x000E1F: return 0x00194D; + case 0x000E07: return 0x0018BD; + case 0x000E0C: return 0x0018DB; + case 0x000E1B: return 0x001935; + case 0x000E17: return 0x00191D; + case 0x000E21: return 0x001959; } *w = 1; @@ -933,54 +933,54 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000E44 */ if (weight == state_00AAB5) { switch (u) { - case 0x00AAA8: return 0x001B68; - case 0x00AA9F: return 0x001B32; - case 0x00AA93: return 0x001AEA; - case 0x00AAAA: return 0x001B74; - case 0x00AAA7: return 0x001B62; - case 0x00AA82: return 0x001A84; - case 0x00AA8F: return 0x001AD2; - case 0x00AA97: return 0x001B02; - case 0x00AAAE: return 0x001B8C; - case 0x00AA9C: return 0x001B20; - case 0x00AAA0: return 0x001B38; - case 0x00AA8B: return 0x001ABA; - case 0x00AAA9: return 0x001B6E; - case 0x00AA90: return 0x001AD8; - case 0x00AAA4: return 0x001B50; - case 0x00AA85: return 0x001A96; - case 0x00AA94: return 0x001AF0; - case 0x00AAAB: return 0x001B7A; - case 0x00AA81: return 0x001A7E; - case 0x00AAA1: return 0x001B3E; - case 0x00AA8E: return 0x001ACC; - case 0x00AA98: return 0x001B08; - case 0x00AAAF: return 0x001B92; - case 0x00AA9D: return 0x001B26; - case 0x00AA91: return 0x001ADE; - case 0x00AAA5: return 0x001B56; - case 0x00AA8A: return 0x001AB4; - case 0x00AA84: return 0x001A90; - case 0x00AA95: return 0x001AF6; - case 0x00AA89: return 0x001AAE; - case 0x00AAAC: return 0x001B80; - case 0x00AA9A: return 0x001B14; - case 0x00AA80: return 0x001A78; - case 0x00AA8D: return 0x001AC6; - case 0x00AA99: return 0x001B0E; - case 0x00AA9E: return 0x001B2C; - case 0x00AAA2: return 0x001B44; - case 0x00AA87: return 0x001AA2; - case 0x00AA92: return 0x001AE4; - case 0x00AA88: return 0x001AA8; - case 0x00AAA6: return 0x001B5C; - case 0x00AA83: return 0x001A8A; - case 0x00AA96: return 0x001AFC; - case 0x00AAAD: return 0x001B86; - case 0x00AA9B: return 0x001B1A; - case 0x00AAA3: return 0x001B4A; - case 0x00AA8C: return 0x001AC0; - case 0x00AA86: return 0x001A9C; + case 0x00AAA8: return 0x001B68; + case 0x00AA9F: return 0x001B32; + case 0x00AA93: return 0x001AEA; + case 0x00AAAA: return 0x001B74; + case 0x00AAA7: return 0x001B62; + case 0x00AA82: return 0x001A84; + case 0x00AA8F: return 0x001AD2; + case 0x00AA97: return 0x001B02; + case 0x00AAAE: return 0x001B8C; + case 0x00AA9C: return 0x001B20; + case 0x00AAA0: return 0x001B38; + case 0x00AA8B: return 0x001ABA; + case 0x00AAA9: return 0x001B6E; + case 0x00AA90: return 0x001AD8; + case 0x00AAA4: return 0x001B50; + case 0x00AA85: return 0x001A96; + case 0x00AA94: return 0x001AF0; + case 0x00AAAB: return 0x001B7A; + case 0x00AA81: return 0x001A7E; + case 0x00AAA1: return 0x001B3E; + case 0x00AA8E: return 0x001ACC; + case 0x00AA98: return 0x001B08; + case 0x00AAAF: return 0x001B92; + case 0x00AA9D: return 0x001B26; + case 0x00AA91: return 0x001ADE; + case 0x00AAA5: return 0x001B56; + case 0x00AA8A: return 0x001AB4; + case 0x00AA84: return 0x001A90; + case 0x00AA95: return 0x001AF6; + case 0x00AA89: return 0x001AAE; + case 0x00AAAC: return 0x001B80; + case 0x00AA9A: return 0x001B14; + case 0x00AA80: return 0x001A78; + case 0x00AA8D: return 0x001AC6; + case 0x00AA99: return 0x001B0E; + case 0x00AA9E: return 0x001B2C; + case 0x00AAA2: return 0x001B44; + case 0x00AA87: return 0x001AA2; + case 0x00AA92: return 0x001AE4; + case 0x00AA88: return 0x001AA8; + case 0x00AAA6: return 0x001B5C; + case 0x00AA83: return 0x001A8A; + case 0x00AA96: return 0x001AFC; + case 0x00AAAD: return 0x001B86; + case 0x00AA9B: return 0x001B1A; + case 0x00AAA3: return 0x001B4A; + case 0x00AA8C: return 0x001AC0; + case 0x00AA86: return 0x001A9C; } *w = 1; @@ -992,37 +992,37 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_00AAB6 */ if (weight == state_000EC2) { switch (u) { - case 0x000E82: return 0x0019C2; - case 0x000E9B: return 0x001A16; - case 0x000EDD: return 0x001A5E; - case 0x000EAD: return 0x001A64; - case 0x000E9F: return 0x001A2E; - case 0x000EAA: return 0x0019DA; - case 0x000E81: return 0x0019BC; - case 0x000E9C: return 0x001A1C; - case 0x000E94: return 0x0019F2; - case 0x000EDC: return 0x001A58; - case 0x000EAE: return 0x001A6A; - case 0x000EA1: return 0x001A34; - case 0x000E84: return 0x0019C8; - case 0x000EA5: return 0x001A46; - case 0x000EAB: return 0x001A52; - case 0x000E95: return 0x0019F8; - case 0x000EA2: return 0x001A3A; - case 0x000E99: return 0x001A0A; - case 0x000E8A: return 0x0019E0; - case 0x000EDF: return 0x0019E6; - case 0x000E88: return 0x0019D4; - case 0x000E9D: return 0x001A22; - case 0x000E87: return 0x0019CE; - case 0x000E96: return 0x0019FE; - case 0x000E8D: return 0x0019EC; - case 0x000E9A: return 0x001A10; - case 0x000EA3: return 0x001A40; - case 0x000EDE: return 0x0019B6; - case 0x000E9E: return 0x001A28; - case 0x000EA7: return 0x001A4C; - case 0x000E97: return 0x001A04; + case 0x000E82: return 0x0019C2; + case 0x000E9B: return 0x001A16; + case 0x000EDD: return 0x001A5E; + case 0x000EAD: return 0x001A64; + case 0x000E9F: return 0x001A2E; + case 0x000EAA: return 0x0019DA; + case 0x000E81: return 0x0019BC; + case 0x000E9C: return 0x001A1C; + case 0x000E94: return 0x0019F2; + case 0x000EDC: return 0x001A58; + case 0x000EAE: return 0x001A6A; + case 0x000EA1: return 0x001A34; + case 0x000E84: return 0x0019C8; + case 0x000EA5: return 0x001A46; + case 0x000EAB: return 0x001A52; + case 0x000E95: return 0x0019F8; + case 0x000EA2: return 0x001A3A; + case 0x000E99: return 0x001A0A; + case 0x000E8A: return 0x0019E0; + case 0x000EDF: return 0x0019E6; + case 0x000E88: return 0x0019D4; + case 0x000E9D: return 0x001A22; + case 0x000E87: return 0x0019CE; + case 0x000E96: return 0x0019FE; + case 0x000E8D: return 0x0019EC; + case 0x000E9A: return 0x001A10; + case 0x000EA3: return 0x001A40; + case 0x000EDE: return 0x0019B6; + case 0x000E9E: return 0x001A28; + case 0x000EA7: return 0x001A4C; + case 0x000E97: return 0x001A04; } *w = 1; @@ -1031,37 +1031,37 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000EC2) { if (weight == state_000EC0) { switch (u) { - case 0x000E84: return 0x0019C6; - case 0x000E9D: return 0x001A20; - case 0x000E8A: return 0x0019DE; - case 0x000EAB: return 0x001A50; - case 0x000E88: return 0x0019D2; - case 0x000E99: return 0x001A08; - case 0x000E96: return 0x0019FC; - case 0x000EA2: return 0x001A38; - case 0x000E87: return 0x0019CC; - case 0x000E9E: return 0x001A26; - case 0x000EDE: return 0x0019B4; - case 0x000E9A: return 0x001A0E; - case 0x000EA7: return 0x001A4A; - case 0x000E82: return 0x0019C0; - case 0x000E8D: return 0x0019EA; - case 0x000E97: return 0x001A02; - case 0x000EA3: return 0x001A3E; - case 0x000EAD: return 0x001A62; - case 0x000EDD: return 0x001A5C; - case 0x000E9F: return 0x001A2C; - case 0x000E94: return 0x0019F0; - case 0x000E9B: return 0x001A14; - case 0x000EAE: return 0x001A68; - case 0x000E81: return 0x0019BA; - case 0x000EAA: return 0x0019D8; - case 0x000EA5: return 0x001A44; - case 0x000EDC: return 0x001A56; - case 0x000E95: return 0x0019F6; - case 0x000E9C: return 0x001A1A; - case 0x000EA1: return 0x001A32; - case 0x000EDF: return 0x0019E4; + case 0x000E84: return 0x0019C6; + case 0x000E9D: return 0x001A20; + case 0x000E8A: return 0x0019DE; + case 0x000EAB: return 0x001A50; + case 0x000E88: return 0x0019D2; + case 0x000E99: return 0x001A08; + case 0x000E96: return 0x0019FC; + case 0x000EA2: return 0x001A38; + case 0x000E87: return 0x0019CC; + case 0x000E9E: return 0x001A26; + case 0x000EDE: return 0x0019B4; + case 0x000E9A: return 0x001A0E; + case 0x000EA7: return 0x001A4A; + case 0x000E82: return 0x0019C0; + case 0x000E8D: return 0x0019EA; + case 0x000E97: return 0x001A02; + case 0x000EA3: return 0x001A3E; + case 0x000EAD: return 0x001A62; + case 0x000EDD: return 0x001A5C; + case 0x000E9F: return 0x001A2C; + case 0x000E94: return 0x0019F0; + case 0x000E9B: return 0x001A14; + case 0x000EAE: return 0x001A68; + case 0x000E81: return 0x0019BA; + case 0x000EAA: return 0x0019D8; + case 0x000EA5: return 0x001A44; + case 0x000EDC: return 0x001A56; + case 0x000E95: return 0x0019F6; + case 0x000E9C: return 0x001A1A; + case 0x000EA1: return 0x001A32; + case 0x000EDF: return 0x0019E4; } *w = 1; @@ -1070,37 +1070,37 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_000EC0) { if (weight == state_000EC1) { switch (u) { - case 0x000EAD: return 0x001A63; - case 0x000E97: return 0x001A03; - case 0x000EA1: return 0x001A33; - case 0x000E9C: return 0x001A1B; - case 0x000E82: return 0x0019C1; - case 0x000EDE: return 0x0019B5; - case 0x000EA5: return 0x001A45; - case 0x000E87: return 0x0019CD; - case 0x000E96: return 0x0019FD; - case 0x000E9B: return 0x001A15; - case 0x000E99: return 0x001A09; - case 0x000E88: return 0x0019D3; - case 0x000EAB: return 0x001A51; - case 0x000E9F: return 0x001A2D; - case 0x000E84: return 0x0019C7; - case 0x000EDF: return 0x0019E5; - case 0x000EA3: return 0x001A3F; - case 0x000E8D: return 0x0019EB; - case 0x000E95: return 0x0019F7; - case 0x000EDC: return 0x001A57; - case 0x000EA7: return 0x001A4B; - case 0x000E9A: return 0x001A0F; - case 0x000EAA: return 0x0019D9; - case 0x000E9E: return 0x001A27; - case 0x000EA2: return 0x001A39; - case 0x000E81: return 0x0019BB; - case 0x000EAE: return 0x001A69; - case 0x000E94: return 0x0019F1; - case 0x000E8A: return 0x0019DF; - case 0x000EDD: return 0x001A5D; - case 0x000E9D: return 0x001A21; + case 0x000EAD: return 0x001A63; + case 0x000E97: return 0x001A03; + case 0x000EA1: return 0x001A33; + case 0x000E9C: return 0x001A1B; + case 0x000E82: return 0x0019C1; + case 0x000EDE: return 0x0019B5; + case 0x000EA5: return 0x001A45; + case 0x000E87: return 0x0019CD; + case 0x000E96: return 0x0019FD; + case 0x000E9B: return 0x001A15; + case 0x000E99: return 0x001A09; + case 0x000E88: return 0x0019D3; + case 0x000EAB: return 0x001A51; + case 0x000E9F: return 0x001A2D; + case 0x000E84: return 0x0019C7; + case 0x000EDF: return 0x0019E5; + case 0x000EA3: return 0x001A3F; + case 0x000E8D: return 0x0019EB; + case 0x000E95: return 0x0019F7; + case 0x000EDC: return 0x001A57; + case 0x000EA7: return 0x001A4B; + case 0x000E9A: return 0x001A0F; + case 0x000EAA: return 0x0019D9; + case 0x000E9E: return 0x001A27; + case 0x000EA2: return 0x001A39; + case 0x000E81: return 0x0019BB; + case 0x000EAE: return 0x001A69; + case 0x000E94: return 0x0019F1; + case 0x000E8A: return 0x0019DF; + case 0x000EDD: return 0x001A5D; + case 0x000E9D: return 0x001A21; } *w = 1; @@ -1110,37 +1110,37 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000EC0 */ if (weight == state_000EC3) { switch (u) { - case 0x000E96: return 0x0019FF; - case 0x000EAE: return 0x001A6B; - case 0x000E9C: return 0x001A1D; - case 0x000EA1: return 0x001A35; - case 0x000EDE: return 0x0019B7; - case 0x000EA5: return 0x001A47; - case 0x000E84: return 0x0019C9; - case 0x000E95: return 0x0019F9; - case 0x000EAD: return 0x001A65; - case 0x000E9B: return 0x001A17; - case 0x000E99: return 0x001A0B; - case 0x000EDF: return 0x0019E7; - case 0x000E9F: return 0x001A2F; - case 0x000E94: return 0x0019F3; - case 0x000E88: return 0x0019D5; - case 0x000EDC: return 0x001A59; - case 0x000E81: return 0x0019BD; - case 0x000E9A: return 0x001A11; - case 0x000E8D: return 0x0019ED; - case 0x000E9E: return 0x001A29; - case 0x000EA3: return 0x001A41; - case 0x000EA7: return 0x001A4D; - case 0x000EAB: return 0x001A53; - case 0x000E82: return 0x0019C3; - case 0x000E97: return 0x001A05; - case 0x000E9D: return 0x001A23; - case 0x000EA2: return 0x001A3B; - case 0x000E87: return 0x0019CF; - case 0x000E8A: return 0x0019E1; - case 0x000EDD: return 0x001A5F; - case 0x000EAA: return 0x0019DB; + case 0x000E96: return 0x0019FF; + case 0x000EAE: return 0x001A6B; + case 0x000E9C: return 0x001A1D; + case 0x000EA1: return 0x001A35; + case 0x000EDE: return 0x0019B7; + case 0x000EA5: return 0x001A47; + case 0x000E84: return 0x0019C9; + case 0x000E95: return 0x0019F9; + case 0x000EAD: return 0x001A65; + case 0x000E9B: return 0x001A17; + case 0x000E99: return 0x001A0B; + case 0x000EDF: return 0x0019E7; + case 0x000E9F: return 0x001A2F; + case 0x000E94: return 0x0019F3; + case 0x000E88: return 0x0019D5; + case 0x000EDC: return 0x001A59; + case 0x000E81: return 0x0019BD; + case 0x000E9A: return 0x001A11; + case 0x000E8D: return 0x0019ED; + case 0x000E9E: return 0x001A29; + case 0x000EA3: return 0x001A41; + case 0x000EA7: return 0x001A4D; + case 0x000EAB: return 0x001A53; + case 0x000E82: return 0x0019C3; + case 0x000E97: return 0x001A05; + case 0x000E9D: return 0x001A23; + case 0x000EA2: return 0x001A3B; + case 0x000E87: return 0x0019CF; + case 0x000E8A: return 0x0019E1; + case 0x000EDD: return 0x001A5F; + case 0x000EAA: return 0x0019DB; } *w = 1; @@ -1151,7 +1151,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_000EC2 */ if (weight == state_001B0B) { switch (u) { - case 0x001B35: return 0x001FCE; + case 0x001B35: return 0x001FCE; } *w = 1; @@ -1160,37 +1160,37 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else if (weight < state_001B0B) { if (weight == state_000EC4) { switch (u) { - case 0x000EDD: return 0x001A60; - case 0x000E9F: return 0x001A30; - case 0x000EAA: return 0x0019DC; - case 0x000EA7: return 0x001A4E; - case 0x000E82: return 0x0019C4; - case 0x000E97: return 0x001A06; - case 0x000EDC: return 0x001A5A; - case 0x000EAE: return 0x001A6C; - case 0x000E9C: return 0x001A1E; - case 0x000E94: return 0x0019F4; - case 0x000EAB: return 0x001A54; - case 0x000E81: return 0x0019BE; - case 0x000EA1: return 0x001A36; - case 0x000EDF: return 0x0019E8; - case 0x000E9D: return 0x001A24; - case 0x000EA5: return 0x001A48; - case 0x000E8A: return 0x0019E2; - case 0x000E84: return 0x0019CA; - case 0x000E95: return 0x0019FA; - case 0x000E9A: return 0x001A12; - case 0x000E8D: return 0x0019EE; - case 0x000E99: return 0x001A0C; - case 0x000E9E: return 0x001A2A; - case 0x000EA2: return 0x001A3C; - case 0x000E87: return 0x0019D0; - case 0x000EDE: return 0x0019B8; - case 0x000E88: return 0x0019D6; - case 0x000E96: return 0x001A00; - case 0x000EAD: return 0x001A66; - case 0x000E9B: return 0x001A18; - case 0x000EA3: return 0x001A42; + case 0x000EDD: return 0x001A60; + case 0x000E9F: return 0x001A30; + case 0x000EAA: return 0x0019DC; + case 0x000EA7: return 0x001A4E; + case 0x000E82: return 0x0019C4; + case 0x000E97: return 0x001A06; + case 0x000EDC: return 0x001A5A; + case 0x000EAE: return 0x001A6C; + case 0x000E9C: return 0x001A1E; + case 0x000E94: return 0x0019F4; + case 0x000EAB: return 0x001A54; + case 0x000E81: return 0x0019BE; + case 0x000EA1: return 0x001A36; + case 0x000EDF: return 0x0019E8; + case 0x000E9D: return 0x001A24; + case 0x000EA5: return 0x001A48; + case 0x000E8A: return 0x0019E2; + case 0x000E84: return 0x0019CA; + case 0x000E95: return 0x0019FA; + case 0x000E9A: return 0x001A12; + case 0x000E8D: return 0x0019EE; + case 0x000E99: return 0x001A0C; + case 0x000E9E: return 0x001A2A; + case 0x000EA2: return 0x001A3C; + case 0x000E87: return 0x0019D0; + case 0x000EDE: return 0x0019B8; + case 0x000E88: return 0x0019D6; + case 0x000E96: return 0x001A00; + case 0x000EAD: return 0x001A66; + case 0x000E9B: return 0x001A18; + case 0x000EA3: return 0x001A42; } *w = 1; @@ -1200,7 +1200,7 @@ int32_t _nu_ducet_weight_switch(uint32_t u, int32_t *w, void *context) { else { /* weight > state_001B0B */ if (weight == state_001B11) { switch (u) { - case 0x001B35: return 0x001FD4; + case 0x001B35: return 0x001FD4; } *w = 1; diff --git a/vendor/nunicode/src/libnu/gen/_tolower.c b/vendor/nunicode/src/libnu/gen/_tolower.c index 933dccf895a4..7a8dc6f9c2a3 100644 --- a/vendor/nunicode/src/libnu/gen/_tolower.c +++ b/vendor/nunicode/src/libnu/gen/_tolower.c @@ -10,417 +10,417 @@ #include const int16_t NU_TOLOWER_G[] = { - 0, 1, 0, 1, -1279, 1, 0, 1, 1, 0, 1, -1277, - 1, -1271, 1, -1269, 1, 0, 1, 0, -1267, 0, 1, 0, - 1, 1, 1, 1, 0, 1, -1265, 1, 0, -1256, 0, -1254, - -1238, -1236, -1220, 1, -1194, 1, 0, 1, -1160, -1153, -1147, -1143, - 0, 1, -1135, -1133, -1131, 1, 0, 1, 1, 1, 5, 1, - 1, 1, 9, 1, -1129, 3, -1117, 2, -1116, 1, -1115, 1, - -1112, 1, -1111, 1, -1110, 1, -1108, 1, -1106, 1, -1103, 1, - -1101, 1, -1090, 1, 0, 1, 0, 5, 0, 32, 0, 32, - 0, 1, 0, 1, 0, 1, 0, 1, -1052, 1, -1049, 1, - -1019, 1, -1016, 1, -1013, 3, -1012, 4, -1010, 1, -1007, 1, - -1005, -1000, -999, -998, -997, -996, -995, -994, 0, 3, 0, 2, - 0, 1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 4, 0, 1, 0, 5, - 0, 1, 0, 4, -992, 1, -991, 4, -990, 1, -989, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, -985, -984, -982, 1, 0, -981, -980, -979, - 0, 1, 0, 1, 0, 1, 0, 1, -978, 2, -977, 1, - -976, 1, -975, 1, -974, 1, -973, 1, -972, 2, -971, 1, - -970, 3, -969, 2, -968, 1, -966, 1, -964, 1, -963, 1, - -962, 2, -961, 1, 0, -949, 0, -904, 0, -902, 0, -900, - 0, -898, 0, -896, 0, -894, 0, -893, 0, -892, 0, -891, - 0, -890, 0, -889, 0, -888, 0, -887, 0, -881, 0, -879, - 0, -878, 0, -877, 0, -876, 0, -875, -874, 1, -873, 1, - 0, 1, -872, 1, -871, 2, -870, 14, 0, 24, -869, 24, - -866, 1, -865, 1, -864, 1, -863, 4, 14, 1, 25, 1, - 29, 1, 49, 1, -862, 2, -861, 1, -860, 2, -859, 2, - 0, -858, 0, -856, 0, -854, 0, -853, 0, 0, 0, 0, - 0, 0, 0, 0, -852, -849, -848, -847, -846, -845, 0, 0, - 1, -844, -843, -842, -841, -840, -839, -838, -837, -836, -834, -832, - -831, -830, -828, -826, -824, -822, -821, -820, -819, -818, -817, -816, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -815, -814, -813, -812, -811, -810, -809, -808, - -807, -804, -798, -797, -796, -795, -793, -790, -788, -785, -783, -782, - -778, -777, -776, -775, 9, 42, 45, 46, 76, 76, 94, 97, - -774, 104, 125, 126, -773, -772, -770, -768, 185, 186, 191, -767, - 197, 208, 224, 236, 5, 6, 56, 56, 60, 60, 71, 81, - -766, -765, -764, -763, -762, -761, -760, -759, 31, 74, 80, 85, - 88, 92, 92, 92, -758, -757, -756, -754, -753, -752, -751, -750, - 0, 0, 0, 0, 0, 0, 0, 0, -749, -748, -747, 0, - -746, -745, -744, -743, 1, 1, 1, 4, 2, -742, 16, 18, - 0, -741, 0, 0, 0, -740, -739, 0, 0, -738, -737, -734, - -731, -730, 0, -728, 0, 0, 0, 0, 0, -725, 0, 0, - -724, -723, 0, 0, 0, 0, 0, 0, -722, 0, -721, -720, - -719, -718, -717, -716, -715, -714, -713, -712, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -711, 0, -710, - 0, -709, 0, -708, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -707, 0, 0, 0, -706, -705, -704, -703, - 1, -702, -701, 1, -700, 1, 1, -699, 1, 1, 1, -698, - 0, -697, 0, -696, 0, -695, 0, -694, 0, -693, 0, -692, - 0, -691, 0, -690, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -689, -688, -687, -686, - -685, -684, -683, -682, -681, 3, -680, 2, -679, 2, -678, -677, - -676, -675, -674, -673, 1, -672, -671, -670, -669, -668, -667, -666, - -665, -664, -663, -662, -661, -660, -659, -658, -657, -656, -655, -654, - -653, 8, -652, 8, -651, 40, -650, -649, -648, 4, -647, 64, - -646, 72, -645, 72, -644, 56, -643, 56, -642, 65, -641, 65, - 8, -640, -639, -638, 0, 0, 8, -637, -636, -635, -634, -633, - 0, -632, 0, -631, -630, -629, -628, -627, -626, -625, -624, -623, - -622, 64, -621, 64, -620, 64, -619, 64, -618, -617, 0, -616, - 0, -615, -614, -613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -612, 0, -611, - 0, -610, 0, -609, 0, -608, 0, -607, 0, -606, 0, -605, - 0, -604, 0, -603, 0, -602, 0, -601, 0, -600, 0, -599, - 0, -598, 0, -597, 0, 1, 0, -596, 0, -595, 0, -594, - -593, 1, 0, -591, 0, 1, -589, -587, 0, 2, 0, -585, - 0, 4, 0, 14, 0, 19, 0, 20, 0, 16, 0, 17, - 0, -584, 0, -583, 0, -582, 0, -581, 0, -580, 0, -578, - 0, -571, 0, -569, -568, -567, -566, -565, 0, 4, -563, 4, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, -562, 0, -561, 0, 0, -560, -559, 0, - 0, -558, 0, -557, 0, -556, 0, -554, 0, -553, 0, -552, - 0, -551, 0, -550, 0, -549, 0, -548, 0, -546, 0, -544, - 0, -543, 0, -542, 0, 0, 0, 0, 0, -541, 0, -540, - 0, -539, 0, -538, 0, -537, 0, -536, 0, -535, 0, -534, - -533, -532, -531, -530, -529, -528, -527, -526, -525, -524, -523, -522, - -521, -520, -519, -518, -517, -516, -515, -514, -513, -511, -509, -507, - -505, -503, -501, -499, -498, -497, -495, -493, 0, 32, -491, 32, - 0, -489, 0, -487, 0, -485, 0, -484, 0, -481, 0, -479, - -478, 40, -477, 40, -476, 41, -474, 41, -472, 33, -471, 33, - -470, 51, -468, 53, 0, -466, 0, -464, 0, -463, 0, -462, - 0, -461, 0, -459, 0, -457, 0, -456, 0, -455, 0, -453, - 0, -452, 0, -451, 0, -450, 0, -449, 0, -447, 0, -444, - 0, 34, 0, 33, 0, 33, 0, 79, 0, 92, 0, 92, - 0, 126, 0, 167, -439, 4, -438, 4, -437, 8, -436, 8, - -432, 26, -428, 38, -421, 40, -419, 40, 47, 8, 73, 423, - 73, 76, 89, 105, 132, 241, 305, 306, 317, 318, 324, 324, - 244, 9, 459, 8, -416, 142, -415, 44, -412, -410, 0, -409, - 0, -405, -403, -395, 1, 64, 9, 65, 1, 64, 4, 64, - -393, 81, 128, 65, -390, 81, -389, 80, 1, 64, 1, 64, - 145, 76, 159, 83, 213, 84, 379, 87, 377, 107, 377, 109, - -388, -387, -386, -385, 0, 0, 0, -383, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 64, 2, 64, -375, 80, -371, 64, - -369, 80, -359, 80, 0, -357, -355, 80, -353, 14, -343, 32, - 0, -339, 0, 37, -335, 112, -330, 197, -327, 193, -320, 200, - -315, 174, 288, 34, 0, 0, -308, -303, 236, 201, 358, -285, - 544, 1, -254, 2, 544, 33, 548, 32, 32, 32, 32, 32, - 0, 17, -252, -250, 14, 1, 0, 17, 4, 1, 37, 6, - 9, 2, -232, 8, 21, 40, 32, -231, 39, 40, 41, -230, + 0, 1, 0, 1, -1279, 1, 0, 1, 1, 0, 1, -1277, + 1, -1271, 1, -1269, 1, 0, 1, 0, -1267, 0, 1, 0, + 1, 1, 1, 1, 0, 1, -1265, 1, 0, -1256, 0, -1254, + -1238, -1236, -1220, 1, -1194, 1, 0, 1, -1160, -1153, -1147, -1143, + 0, 1, -1135, -1133, -1131, 1, 0, 1, 1, 1, 5, 1, + 1, 1, 9, 1, -1129, 3, -1117, 2, -1116, 1, -1115, 1, + -1112, 1, -1111, 1, -1110, 1, -1108, 1, -1106, 1, -1103, 1, + -1101, 1, -1090, 1, 0, 1, 0, 5, 0, 32, 0, 32, + 0, 1, 0, 1, 0, 1, 0, 1, -1052, 1, -1049, 1, + -1019, 1, -1016, 1, -1013, 3, -1012, 4, -1010, 1, -1007, 1, + -1005, -1000, -999, -998, -997, -996, -995, -994, 0, 3, 0, 2, + 0, 1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 4, 0, 1, 0, 5, + 0, 1, 0, 4, -992, 1, -991, 4, -990, 1, -989, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, -985, -984, -982, 1, 0, -981, -980, -979, + 0, 1, 0, 1, 0, 1, 0, 1, -978, 2, -977, 1, + -976, 1, -975, 1, -974, 1, -973, 1, -972, 2, -971, 1, + -970, 3, -969, 2, -968, 1, -966, 1, -964, 1, -963, 1, + -962, 2, -961, 1, 0, -949, 0, -904, 0, -902, 0, -900, + 0, -898, 0, -896, 0, -894, 0, -893, 0, -892, 0, -891, + 0, -890, 0, -889, 0, -888, 0, -887, 0, -881, 0, -879, + 0, -878, 0, -877, 0, -876, 0, -875, -874, 1, -873, 1, + 0, 1, -872, 1, -871, 2, -870, 14, 0, 24, -869, 24, + -866, 1, -865, 1, -864, 1, -863, 4, 14, 1, 25, 1, + 29, 1, 49, 1, -862, 2, -861, 1, -860, 2, -859, 2, + 0, -858, 0, -856, 0, -854, 0, -853, 0, 0, 0, 0, + 0, 0, 0, 0, -852, -849, -848, -847, -846, -845, 0, 0, + 1, -844, -843, -842, -841, -840, -839, -838, -837, -836, -834, -832, + -831, -830, -828, -826, -824, -822, -821, -820, -819, -818, -817, -816, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -815, -814, -813, -812, -811, -810, -809, -808, + -807, -804, -798, -797, -796, -795, -793, -790, -788, -785, -783, -782, + -778, -777, -776, -775, 9, 42, 45, 46, 76, 76, 94, 97, + -774, 104, 125, 126, -773, -772, -770, -768, 185, 186, 191, -767, + 197, 208, 224, 236, 5, 6, 56, 56, 60, 60, 71, 81, + -766, -765, -764, -763, -762, -761, -760, -759, 31, 74, 80, 85, + 88, 92, 92, 92, -758, -757, -756, -754, -753, -752, -751, -750, + 0, 0, 0, 0, 0, 0, 0, 0, -749, -748, -747, 0, + -746, -745, -744, -743, 1, 1, 1, 4, 2, -742, 16, 18, + 0, -741, 0, 0, 0, -740, -739, 0, 0, -738, -737, -734, + -731, -730, 0, -728, 0, 0, 0, 0, 0, -725, 0, 0, + -724, -723, 0, 0, 0, 0, 0, 0, -722, 0, -721, -720, + -719, -718, -717, -716, -715, -714, -713, -712, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -711, 0, -710, + 0, -709, 0, -708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -707, 0, 0, 0, -706, -705, -704, -703, + 1, -702, -701, 1, -700, 1, 1, -699, 1, 1, 1, -698, + 0, -697, 0, -696, 0, -695, 0, -694, 0, -693, 0, -692, + 0, -691, 0, -690, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -689, -688, -687, -686, + -685, -684, -683, -682, -681, 3, -680, 2, -679, 2, -678, -677, + -676, -675, -674, -673, 1, -672, -671, -670, -669, -668, -667, -666, + -665, -664, -663, -662, -661, -660, -659, -658, -657, -656, -655, -654, + -653, 8, -652, 8, -651, 40, -650, -649, -648, 4, -647, 64, + -646, 72, -645, 72, -644, 56, -643, 56, -642, 65, -641, 65, + 8, -640, -639, -638, 0, 0, 8, -637, -636, -635, -634, -633, + 0, -632, 0, -631, -630, -629, -628, -627, -626, -625, -624, -623, + -622, 64, -621, 64, -620, 64, -619, 64, -618, -617, 0, -616, + 0, -615, -614, -613, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -612, 0, -611, + 0, -610, 0, -609, 0, -608, 0, -607, 0, -606, 0, -605, + 0, -604, 0, -603, 0, -602, 0, -601, 0, -600, 0, -599, + 0, -598, 0, -597, 0, 1, 0, -596, 0, -595, 0, -594, + -593, 1, 0, -591, 0, 1, -589, -587, 0, 2, 0, -585, + 0, 4, 0, 14, 0, 19, 0, 20, 0, 16, 0, 17, + 0, -584, 0, -583, 0, -582, 0, -581, 0, -580, 0, -578, + 0, -571, 0, -569, -568, -567, -566, -565, 0, 4, -563, 4, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, -562, 0, -561, 0, 0, -560, -559, 0, + 0, -558, 0, -557, 0, -556, 0, -554, 0, -553, 0, -552, + 0, -551, 0, -550, 0, -549, 0, -548, 0, -546, 0, -544, + 0, -543, 0, -542, 0, 0, 0, 0, 0, -541, 0, -540, + 0, -539, 0, -538, 0, -537, 0, -536, 0, -535, 0, -534, + -533, -532, -531, -530, -529, -528, -527, -526, -525, -524, -523, -522, + -521, -520, -519, -518, -517, -516, -515, -514, -513, -511, -509, -507, + -505, -503, -501, -499, -498, -497, -495, -493, 0, 32, -491, 32, + 0, -489, 0, -487, 0, -485, 0, -484, 0, -481, 0, -479, + -478, 40, -477, 40, -476, 41, -474, 41, -472, 33, -471, 33, + -470, 51, -468, 53, 0, -466, 0, -464, 0, -463, 0, -462, + 0, -461, 0, -459, 0, -457, 0, -456, 0, -455, 0, -453, + 0, -452, 0, -451, 0, -450, 0, -449, 0, -447, 0, -444, + 0, 34, 0, 33, 0, 33, 0, 79, 0, 92, 0, 92, + 0, 126, 0, 167, -439, 4, -438, 4, -437, 8, -436, 8, + -432, 26, -428, 38, -421, 40, -419, 40, 47, 8, 73, 423, + 73, 76, 89, 105, 132, 241, 305, 306, 317, 318, 324, 324, + 244, 9, 459, 8, -416, 142, -415, 44, -412, -410, 0, -409, + 0, -405, -403, -395, 1, 64, 9, 65, 1, 64, 4, 64, + -393, 81, 128, 65, -390, 81, -389, 80, 1, 64, 1, 64, + 145, 76, 159, 83, 213, 84, 379, 87, 377, 107, 377, 109, + -388, -387, -386, -385, 0, 0, 0, -383, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 64, 2, 64, -375, 80, -371, 64, + -369, 80, -359, 80, 0, -357, -355, 80, -353, 14, -343, 32, + 0, -339, 0, 37, -335, 112, -330, 197, -327, 193, -320, 200, + -315, 174, 288, 34, 0, 0, -308, -303, 236, 201, 358, -285, + 544, 1, -254, 2, 544, 33, 548, 32, 32, 32, 32, 32, + 0, 17, -252, -250, 14, 1, 0, 17, 4, 1, 37, 6, + 9, 2, -232, 8, 21, 40, 32, -231, 39, 40, 41, -230, -228, 86, -226, 1, -152, 227, -143, 6, }; const size_t NU_TOLOWER_G_SIZE = sizeof(NU_TOLOWER_G) / sizeof(*NU_TOLOWER_G); /* codepoints */ const uint32_t NU_TOLOWER_VALUES_C[] = { - 0x01E908, 0x001E92, 0x001E90, 0x01E90A, 0x000533, 0x001E94, 0x00054A, 0x000548, - 0x01E912, 0x00054C, 0x00004D, 0x000055, 0x00050C, 0x00054E, 0x00050E, 0x001E9E, - 0x000520, 0x001EA2, 0x01E91A, 0x000522, 0x001EA0, 0x001EA4, 0x000508, 0x001EA6, - 0x000512, 0x000510, 0x000056, 0x000057, 0x001E8C, 0x00004C, 0x001E8E, 0x000516, - 0x01E90C, 0x001EB0, 0x000532, 0x001EB2, 0x000059, 0x001EB4, 0x000058, 0x001EB6, - 0x000541, 0x001EB8, 0x000543, 0x001EBA, 0x000518, 0x001EBC, 0x00051A, 0x001EBE, - 0x001EC4, 0x001EC0, 0x00005A, 0x001EC2, 0x01E91B, 0x000054, 0x01E910, 0x001EC6, - 0x001ECC, 0x000555, 0x000553, 0x001ECA, 0x01E914, 0x001EC8, 0x01E916, 0x001ECE, - 0x000551, 0x001ED2, 0x001ED0, 0x000514, 0x01E91D, 0x000534, 0x001ED4, 0x001ED6, - 0x00051E, 0x001ED8, 0x01041B, 0x001EDA, 0x00004A, 0x001EDC, 0x00004B, 0x001EDE, - 0x01E919, 0x001EE0, 0x01E91E, 0x001EE2, 0x000535, 0x001EE4, 0x01E91F, 0x001EE6, - 0x00FF28, 0x001EE8, 0x000053, 0x00FF2A, 0x00FF2C, 0x00FF2D, 0x00FF2E, 0x00FF2F, - 0x000531, 0x01E920, 0x000536, 0x001EF2, 0x001EF0, 0x001EF4, 0x000537, 0x001EF6, - 0x01041A, 0x001EF8, 0x00FF38, 0x001EFA, 0x010419, 0x001EFC, 0x010418, 0x001EFE, - 0x000048, 0x000049, 0x00004E, 0x00004F, 0x010423, 0x01E91C, 0x00FF24, 0x00FF26, - 0x000052, 0x0118A2, 0x0118A0, 0x01041D, 0x000051, 0x0118A4, 0x000050, 0x0118A6, - 0x01E90E, 0x0118A8, 0x000047, 0x0118AA, 0x0118AE, 0x0118AC, 0x00054B, 0x01E903, - 0x0118B2, 0x0118B0, 0x01041E, 0x01041F, 0x001F39, 0x0118B4, 0x001F2D, 0x0118B6, - 0x000526, 0x0118B8, 0x00FF32, 0x0118BA, 0x0118BE, 0x0118BC, 0x000046, 0x001F2F, - 0x001F08, 0x001F28, 0x001F2C, 0x001F0A, 0x001F0C, 0x001F0D, 0x001F0E, 0x001F0F, - 0x010422, 0x01E921, 0x010402, 0x00051C, 0x001F3C, 0x000045, 0x001F3F, 0x00053B, - 0x000044, 0x010421, 0x001F18, 0x001F3A, 0x001F3E, 0x010420, 0x001F38, 0x001F3B, - 0x010424, 0x010425, 0x010426, 0x00053A, 0x010401, 0x01041C, 0x010400, 0x010427, - 0x001F49, 0x001F48, 0x001F4B, 0x001F4A, 0x0104B5, 0x001F4C, 0x000547, 0x001FBB, - 0x0000C4, 0x0000C0, 0x000545, 0x0000C2, 0x0000DC, 0x0000CB, 0x0000DE, 0x0000C6, - 0x001F59, 0x0000C8, 0x001F5B, 0x0000CA, 0x001F5D, 0x0000CC, 0x001F5F, 0x0000CE, - 0x0000C9, 0x0000D0, 0x0000CF, 0x0000D2, 0x001F6D, 0x0000D4, 0x0000D8, 0x0000D6, - 0x0000DA, 0x001F68, 0x001F6B, 0x001F6A, 0x001F69, 0x001F6C, 0x001F6F, 0x001F6E, - 0x0104B1, 0x001F29, 0x0104B7, 0x001F2B, 0x00FF3A, 0x0004AC, 0x0004A8, 0x001F3D, - 0x01040A, 0x0104B0, 0x01040B, 0x0104B2, 0x001F2A, 0x0104B4, 0x010409, 0x0104B6, - 0x0104BA, 0x0104B8, 0x001F8A, 0x01E902, 0x0104BE, 0x0104B3, 0x0104BC, 0x000191, - 0x000042, 0x0004B8, 0x000043, 0x000181, 0x0000CD, 0x00FF25, 0x000041, 0x01E90B, - 0x001FBC, 0x000100, 0x01040F, 0x000102, 0x001F9C, 0x000104, 0x001F9E, 0x000106, - 0x001FD8, 0x000108, 0x001FDA, 0x00010A, 0x001F98, 0x00010C, 0x001F9A, 0x00010E, - 0x001FA9, 0x000110, 0x0024BB, 0x000112, 0x001F8B, 0x000114, 0x01040E, 0x000116, - 0x01040C, 0x001FAD, 0x001FAB, 0x00011A, 0x000190, 0x000118, 0x001FAF, 0x00FF23, - 0x001FB8, 0x000122, 0x000120, 0x001FBA, 0x001F1A, 0x01040D, 0x000124, 0x000126, - 0x001FF8, 0x000128, 0x001FFA, 0x00012A, 0x001FFC, 0x00012C, 0x001F1C, 0x00012E, - 0x001F89, 0x000132, 0x001F8E, 0x001F1D, 0x000130, 0x000134, 0x001F8F, 0x000136, - 0x001FE8, 0x001FEC, 0x001F1B, 0x00FF22, 0x00011C, 0x001F2E, 0x00011E, 0x00FF35, - 0x0010B0, 0x0010B1, 0x0010B6, 0x0010B7, 0x001F8D, 0x00FF30, 0x00FF37, 0x00FF36, - 0x001FD9, 0x00FF31, 0x001FDB, 0x00014A, 0x00FF34, 0x00014C, 0x00FF33, 0x00014E, - 0x000154, 0x000150, 0x000496, 0x000152, 0x001FEA, 0x001F8C, 0x001FE9, 0x000156, - 0x00015C, 0x001FA8, 0x001FAA, 0x00015A, 0x001FAC, 0x000158, 0x001FAE, 0x00015E, - 0x001FEB, 0x000160, 0x002C2D, 0x000162, 0x002C2E, 0x000164, 0x002C29, 0x000166, - 0x00016A, 0x000168, 0x001FFB, 0x001FF9, 0x0010B2, 0x00016C, 0x0010B3, 0x00016E, - 0x002C2B, 0x000170, 0x002C25, 0x000172, 0x0010A3, 0x000174, 0x002C27, 0x000176, - 0x0010C1, 0x000178, 0x0010C3, 0x0010C2, 0x0010C0, 0x0010C7, 0x001FCC, 0x000193, - 0x001FC8, 0x001FC9, 0x001FCA, 0x001FCB, 0x002C1D, 0x002C1F, 0x00018F, 0x000186, - 0x002C1B, 0x000187, 0x00052C, 0x00018A, 0x00018E, 0x0010C5, 0x0010C4, 0x00018B, - 0x0001B7, 0x0001B1, 0x002CED, 0x000182, 0x00052E, 0x000184, 0x000194, 0x000196, - 0x000528, 0x00052A, 0x0001B2, 0x002CEB, 0x0001B5, 0x0010B4, 0x01E90D, 0x01E90F, - 0x0010A2, 0x0001A0, 0x01E915, 0x0001A2, 0x01E917, 0x0001A4, 0x0001B3, 0x0001A6, - 0x0001A9, 0x0010A1, 0x0010B5, 0x01E911, 0x000189, 0x0010A0, 0x0001AF, 0x01E913, - 0x0010A4, 0x0010A5, 0x0010A6, 0x001F9D, 0x001F9F, 0x001F99, 0x001F9B, 0x0010A7, - 0x000198, 0x0001B8, 0x0001BC, 0x002CAC, 0x00019C, 0x00019D, 0x002CAE, 0x00019F, - 0x002CA8, 0x002CAA, 0x002CA4, 0x002CA6, 0x002CA0, 0x0001C4, 0x002CA2, 0x002CBC, - 0x002CBE, 0x0001C8, 0x002CB8, 0x0001CA, 0x002CBA, 0x002CB4, 0x002CB6, 0x002CB0, - 0x0001D1, 0x002CB2, 0x0001D3, 0x010CAD, 0x0001D5, 0x010CAF, 0x010CA9, 0x010CAB, - 0x0001D9, 0x010CA5, 0x0001DB, 0x010CA7, 0x010CA1, 0x010CA3, 0x002C9C, 0x0001DE, - 0x002C9E, 0x0001E2, 0x0001E0, 0x002C98, 0x002C9A, 0x0001E4, 0x002C94, 0x0001E6, - 0x002C96, 0x0001E8, 0x010CB1, 0x0001EA, 0x010C8C, 0x0001EC, 0x010C8D, 0x0001EE, - 0x010C8E, 0x010C8F, 0x010C88, 0x0001F2, 0x010C89, 0x0001F4, 0x010C8A, 0x0001F6, - 0x010C8B, 0x0001F8, 0x010C84, 0x0001FA, 0x010C85, 0x0001FC, 0x010C86, 0x0001FE, - 0x010C87, 0x010C80, 0x010C81, 0x010C82, 0x010C83, 0x010C9C, 0x010C9D, 0x010C9E, - 0x010C9F, 0x010C98, 0x010C99, 0x010C9A, 0x010C9B, 0x010C94, 0x010C95, 0x010C96, - 0x010C97, 0x010C90, 0x010C91, 0x010C92, 0x010C93, 0x00A68C, 0x00A68E, 0x00A688, - 0x00A68A, 0x00A684, 0x00A686, 0x00A680, 0x00A682, 0x00A698, 0x00A69A, 0x00A694, - 0x000222, 0x00A696, 0x000226, 0x00A690, 0x00A692, 0x00A76C, 0x00A76E, 0x00A768, - 0x00A76A, 0x00A764, 0x000224, 0x00A766, 0x00A760, 0x00A762, 0x00A77D, 0x00A77E, - 0x00A779, 0x00A77B, 0x000245, 0x000232, 0x00A740, 0x000241, 0x00A742, 0x000243, - 0x00A75C, 0x00022A, 0x00A75E, 0x00023A, 0x000228, 0x00022C, 0x00022E, 0x00023E, - 0x000244, 0x00A758, 0x000246, 0x00A75A, 0x00A754, 0x00A756, 0x00A750, 0x00A752, - 0x000220, 0x000248, 0x00A73C, 0x00024A, 0x00023D, 0x00024C, 0x00A738, 0x00024E, - 0x00023B, 0x00A734, 0x00A736, 0x000230, 0x00020C, 0x00020E, 0x000208, 0x00020A, - 0x000204, 0x000206, 0x000200, 0x000202, 0x00021C, 0x00021E, 0x000218, 0x00021A, - 0x000214, 0x000216, 0x000210, 0x000212, 0x00A7AC, 0x00A7AD, 0x00A7AE, 0x00A7A8, - 0x00A7AA, 0x00A7AB, 0x0013ED, 0x0013EF, 0x0013E9, 0x0013EB, 0x0013E4, 0x0013E5, - 0x0013E6, 0x0013E7, 0x0013E0, 0x0013E1, 0x0013E2, 0x0013E3, 0x00A7B4, 0x00A7B6, - 0x00A7B0, 0x00A7B1, 0x00A7B2, 0x00A7B3, 0x0013F4, 0x0013F0, 0x0013F1, 0x0013F2, - 0x0013CD, 0x0013CF, 0x0013C9, 0x0013CB, 0x0013C5, 0x0013C7, 0x0013C1, 0x0013C3, - 0x0013DC, 0x0013DD, 0x0013DF, 0x0013D9, 0x0013DB, 0x0013D4, 0x0013D5, 0x0013D6, - 0x0013D7, 0x0013D0, 0x0013D1, 0x0013D2, 0x0013D3, 0x0013AC, 0x0013AD, 0x0013AE, - 0x0013AF, 0x0013A8, 0x0013A9, 0x0013AA, 0x0013AB, 0x0013A4, 0x0013A5, 0x0013A6, - 0x0013A0, 0x0013A1, 0x0013A2, 0x0013A3, 0x0013BC, 0x0013BD, 0x0013BF, 0x0013B9, - 0x0013BB, 0x0013B4, 0x0013B5, 0x0013B6, 0x0013B7, 0x0013B0, 0x0013B1, 0x0013B2, - 0x0013B3, 0x0003EC, 0x0003EE, 0x0003E8, 0x0003EA, 0x0003E4, 0x0003E6, 0x0003E0, - 0x0003E2, 0x00216C, 0x002168, 0x00216B, 0x002165, 0x002166, 0x002160, 0x002161, - 0x002162, 0x002163, 0x0003CF, 0x0003DC, 0x0003DE, 0x0003D8, 0x0003DA, 0x0003A8, - 0x0003A9, 0x0003AA, 0x0003AB, 0x0003A4, 0x0003A5, 0x0003A6, 0x0003A7, 0x0003A0, - 0x0003A1, 0x0003A3, 0x00212A, 0x00212B, 0x002126, 0x002164, 0x002167, 0x00038C, - 0x002169, 0x00038E, 0x00038F, 0x00216A, 0x00216D, 0x000388, 0x00216F, 0x00216E, - 0x000389, 0x00038A, 0x0010CD, 0x000386, 0x002132, 0x00039E, 0x000394, 0x000395, - 0x000396, 0x000397, 0x000391, 0x000392, 0x000393, 0x0010AC, 0x0010AD, 0x0010AE, - 0x0010AF, 0x0010A8, 0x002183, 0x0010A9, 0x0010AA, 0x0010AB, 0x0010BC, 0x0010BD, - 0x0010BE, 0x0010BF, 0x0010B8, 0x0010B9, 0x0010BA, 0x0010BB, 0x010408, 0x010404, - 0x00A640, 0x010405, 0x00A642, 0x010406, 0x010407, 0x010403, 0x010414, 0x010415, - 0x010416, 0x010417, 0x00A646, 0x00A65A, 0x00A65C, 0x010410, 0x010411, 0x00A65E, - 0x010412, 0x00A650, 0x00A652, 0x010413, 0x00A654, 0x0024CC, 0x00A656, 0x00A644, - 0x0024CD, 0x00A658, 0x0024CE, 0x0024CF, 0x0024C8, 0x0024C9, 0x00A64A, 0x00A648, - 0x00A660, 0x00A64C, 0x00A662, 0x0024CA, 0x00A664, 0x00A64E, 0x0024CB, 0x0024C4, - 0x0024C5, 0x0024C6, 0x0024C7, 0x0024C0, 0x0024C1, 0x0024C2, 0x0024C3, 0x0104CC, - 0x0104CD, 0x0104CE, 0x0104CF, 0x0104C8, 0x0104C9, 0x0104CA, 0x00A666, 0x0104CB, - 0x00A668, 0x0104C4, 0x00A66A, 0x0104C5, 0x00A66C, 0x0104C6, 0x0104C7, 0x0104C0, - 0x002C01, 0x0104C1, 0x002C03, 0x0104C2, 0x0104C3, 0x0024BC, 0x0024BD, 0x0024BE, - 0x0024BF, 0x0024B8, 0x0024B9, 0x0024BA, 0x0024B6, 0x0024B7, 0x0104D0, 0x0104D1, - 0x0104D2, 0x002C15, 0x002C13, 0x0104D3, 0x001E6C, 0x001E6E, 0x002C17, 0x001E68, - 0x002C11, 0x001E6A, 0x0104BD, 0x0104BF, 0x0104B9, 0x0104BB, 0x0000C5, 0x0000C7, - 0x0000C1, 0x0000C3, 0x002C23, 0x002C21, 0x0000DD, 0x0000D9, 0x0000DB, 0x0000D5, - 0x0000D1, 0x0000D3, 0x001E5C, 0x001E5E, 0x001E58, 0x001E5A, 0x001E54, 0x00FF27, - 0x001E56, 0x000372, 0x000370, 0x00FF2B, 0x000376, 0x00FF29, 0x001E50, 0x001E52, - 0x001E2C, 0x001E2E, 0x001E28, 0x001E2A, 0x001E24, 0x001E26, 0x00037F, 0x001E20, - 0x002C00, 0x001E22, 0x002C02, 0x001E3C, 0x002C6D, 0x001E3E, 0x002C6E, 0x001E38, - 0x002C6F, 0x002C69, 0x002C06, 0x002C1A, 0x002C1C, 0x00039D, 0x00039C, 0x002C1E, - 0x002C70, 0x002C10, 0x002C12, 0x002C72, 0x002C14, 0x002C75, 0x002C16, 0x002C04, - 0x000399, 0x002C18, 0x00039B, 0x00039A, 0x000398, 0x00039F, 0x002C0A, 0x002C08, - 0x002C20, 0x002C0C, 0x002C22, 0x002C62, 0x002C24, 0x002C0E, 0x002C60, 0x002C63, - 0x010CA0, 0x010CA8, 0x010CA2, 0x010CAA, 0x002C64, 0x010CA4, 0x002C67, 0x010CA6, - 0x010CB0, 0x002C7F, 0x010CB2, 0x001F0B, 0x001E3A, 0x001F09, 0x002C26, 0x000197, - 0x002C28, 0x010CAC, 0x002C2A, 0x002CDC, 0x002C2C, 0x010CAE, 0x002C6B, 0x002C7E, - 0x0118AD, 0x0118AF, 0x0118A9, 0x0118AB, 0x002CD8, 0x0118A5, 0x002CDA, 0x0118A7, - 0x0118A1, 0x0118A3, 0x0118BD, 0x0118BF, 0x0118B9, 0x0118BB, 0x0118B5, 0x0118B7, - 0x0118B1, 0x0118B3, 0x001EEC, 0x00017D, 0x001EEE, 0x000179, 0x002C07, 0x001EEA, - 0x00017B, 0x002C19, 0x002C05, 0x002CD4, 0x000145, 0x000147, 0x000141, 0x000143, - 0x002CDE, 0x001EAC, 0x00013D, 0x001EAE, 0x00013F, 0x001EA8, 0x000139, 0x001EAA, - 0x002C80, 0x002C88, 0x002C82, 0x002C8A, 0x00013B, 0x002C84, 0x00042D, 0x002C86, - 0x002C90, 0x00042F, 0x002C92, 0x000429, 0x00042B, 0x0003F4, 0x0003F7, 0x000425, - 0x0003F9, 0x002C8C, 0x000427, 0x0003FA, 0x0003FD, 0x002C8E, 0x0003FF, 0x0003FE, - 0x00053E, 0x000400, 0x00053F, 0x000402, 0x002CC0, 0x000404, 0x002CC2, 0x000406, - 0x000539, 0x000408, 0x000538, 0x00040A, 0x002CC4, 0x00040C, 0x002CC6, 0x00040E, - 0x002CCA, 0x000410, 0x000413, 0x000412, 0x000411, 0x000414, 0x000417, 0x000416, - 0x000421, 0x00041A, 0x000418, 0x000423, 0x000415, 0x00041C, 0x002C0B, 0x00041E, - 0x00A722, 0x000420, 0x00A726, 0x000422, 0x002CCC, 0x000424, 0x002CCE, 0x000426, - 0x002CE0, 0x00042A, 0x00A724, 0x002CE2, 0x000428, 0x00042C, 0x002CC8, 0x00042E, - 0x002CD2, 0x002CD0, 0x000549, 0x00A732, 0x00054D, 0x0004D6, 0x00054F, 0x002CD6, - 0x0013C0, 0x00A72A, 0x002CF2, 0x00A73A, 0x00A728, 0x00A72C, 0x00A72E, 0x00A73E, - 0x00A744, 0x00040D, 0x00A746, 0x00048A, 0x0013C4, 0x0013CC, 0x0013C6, 0x0013CE, - 0x01E901, 0x00A748, 0x01E900, 0x00A74A, 0x00040F, 0x00A74C, 0x000409, 0x00A74E, - 0x01E906, 0x00040B, 0x01E907, 0x000405, 0x00049C, 0x000407, 0x000401, 0x000403, - 0x01E904, 0x01E905, 0x00041D, 0x00041F, 0x000419, 0x000498, 0x0013A7, 0x00049E, - 0x0013E8, 0x000460, 0x0013EA, 0x000462, 0x0013EC, 0x000464, 0x0013EE, 0x000466, - 0x00041B, 0x000468, 0x0001F7, 0x00046A, 0x0004E8, 0x00046C, 0x0001F1, 0x00046E, - 0x000474, 0x0013BA, 0x0013B8, 0x000472, 0x0013BE, 0x000470, 0x0004E4, 0x000476, - 0x00053C, 0x00053D, 0x0001CD, 0x00047A, 0x000478, 0x00047C, 0x0013C2, 0x00047E, - 0x0004E6, 0x00FF39, 0x0004AA, 0x00A78B, 0x0004D2, 0x00A78D, 0x0004AE, 0x0001CF, - 0x0013D8, 0x001E00, 0x0013DA, 0x001E02, 0x001E06, 0x001E04, 0x00048C, 0x00048E, - 0x0004B0, 0x001E0A, 0x001E08, 0x0004B2, 0x0004B4, 0x001E0C, 0x0004B6, 0x001E0E, - 0x00A790, 0x001E10, 0x00A792, 0x001E12, 0x000492, 0x001E14, 0x00A79A, 0x001E16, - 0x001E1A, 0x001E18, 0x000480, 0x0004A2, 0x0004A6, 0x001E1C, 0x0004A0, 0x001E1E, - 0x0013C8, 0x0001CB, 0x0013CA, 0x0004BA, 0x0004A4, 0x0004BC, 0x0013DE, 0x00FF21, - 0x000490, 0x000494, 0x002C09, 0x0013F3, 0x002C0D, 0x0013F5, 0x002C0F, 0x001F88, - 0x00A780, 0x001E30, 0x00A782, 0x001E32, 0x001E36, 0x001E34, 0x00A796, 0x0004BE, - 0x0004C1, 0x001F19, 0x0004C3, 0x0001C5, 0x0004C5, 0x00A784, 0x0004C7, 0x00A786, - 0x0004C9, 0x001E40, 0x0004CB, 0x001E42, 0x0004CD, 0x001E44, 0x001E48, 0x001E46, - 0x001E4A, 0x0004D0, 0x0004D4, 0x0004FE, 0x00A79C, 0x0001C7, 0x00A79E, 0x01E918, - 0x00A798, 0x0004D8, 0x01E909, 0x0004DA, 0x001E4C, 0x0004DC, 0x001E4E, 0x0004DE, - 0x00A7A0, 0x0004E0, 0x00A7A2, 0x0004E2, 0x00A7A4, 0x0004F8, 0x00A7A6, 0x0004FA, - 0x001E62, 0x001E60, 0x00049A, 0x0004EA, 0x001E66, 0x0004EC, 0x001E64, 0x0004EE, - 0x001F4D, 0x0004F0, 0x0001D7, 0x0004F2, 0x0001AC, 0x0004F4, 0x0001AE, 0x0004F6, - 0x001E74, 0x001E70, 0x001FB9, 0x001E72, 0x0004C0, 0x0004FC, 0x0001A7, 0x001E76, - 0x000540, 0x001E78, 0x000542, 0x001E7A, 0x000500, 0x001E7C, 0x000502, 0x001E7E, - 0x000524, 0x001E80, 0x000546, 0x001E82, 0x000504, 0x001E84, 0x000506, 0x001E86, - 0x00050A, 0x000550, 0x000552, 0x001E8A, 0x000554, 0x001E88, 0x000556, 0x000544, + 0x01E908, 0x001E92, 0x001E90, 0x01E90A, 0x000533, 0x001E94, 0x00054A, 0x000548, + 0x01E912, 0x00054C, 0x00004D, 0x000055, 0x00050C, 0x00054E, 0x00050E, 0x001E9E, + 0x000520, 0x001EA2, 0x01E91A, 0x000522, 0x001EA0, 0x001EA4, 0x000508, 0x001EA6, + 0x000512, 0x000510, 0x000056, 0x000057, 0x001E8C, 0x00004C, 0x001E8E, 0x000516, + 0x01E90C, 0x001EB0, 0x000532, 0x001EB2, 0x000059, 0x001EB4, 0x000058, 0x001EB6, + 0x000541, 0x001EB8, 0x000543, 0x001EBA, 0x000518, 0x001EBC, 0x00051A, 0x001EBE, + 0x001EC4, 0x001EC0, 0x00005A, 0x001EC2, 0x01E91B, 0x000054, 0x01E910, 0x001EC6, + 0x001ECC, 0x000555, 0x000553, 0x001ECA, 0x01E914, 0x001EC8, 0x01E916, 0x001ECE, + 0x000551, 0x001ED2, 0x001ED0, 0x000514, 0x01E91D, 0x000534, 0x001ED4, 0x001ED6, + 0x00051E, 0x001ED8, 0x01041B, 0x001EDA, 0x00004A, 0x001EDC, 0x00004B, 0x001EDE, + 0x01E919, 0x001EE0, 0x01E91E, 0x001EE2, 0x000535, 0x001EE4, 0x01E91F, 0x001EE6, + 0x00FF28, 0x001EE8, 0x000053, 0x00FF2A, 0x00FF2C, 0x00FF2D, 0x00FF2E, 0x00FF2F, + 0x000531, 0x01E920, 0x000536, 0x001EF2, 0x001EF0, 0x001EF4, 0x000537, 0x001EF6, + 0x01041A, 0x001EF8, 0x00FF38, 0x001EFA, 0x010419, 0x001EFC, 0x010418, 0x001EFE, + 0x000048, 0x000049, 0x00004E, 0x00004F, 0x010423, 0x01E91C, 0x00FF24, 0x00FF26, + 0x000052, 0x0118A2, 0x0118A0, 0x01041D, 0x000051, 0x0118A4, 0x000050, 0x0118A6, + 0x01E90E, 0x0118A8, 0x000047, 0x0118AA, 0x0118AE, 0x0118AC, 0x00054B, 0x01E903, + 0x0118B2, 0x0118B0, 0x01041E, 0x01041F, 0x001F39, 0x0118B4, 0x001F2D, 0x0118B6, + 0x000526, 0x0118B8, 0x00FF32, 0x0118BA, 0x0118BE, 0x0118BC, 0x000046, 0x001F2F, + 0x001F08, 0x001F28, 0x001F2C, 0x001F0A, 0x001F0C, 0x001F0D, 0x001F0E, 0x001F0F, + 0x010422, 0x01E921, 0x010402, 0x00051C, 0x001F3C, 0x000045, 0x001F3F, 0x00053B, + 0x000044, 0x010421, 0x001F18, 0x001F3A, 0x001F3E, 0x010420, 0x001F38, 0x001F3B, + 0x010424, 0x010425, 0x010426, 0x00053A, 0x010401, 0x01041C, 0x010400, 0x010427, + 0x001F49, 0x001F48, 0x001F4B, 0x001F4A, 0x0104B5, 0x001F4C, 0x000547, 0x001FBB, + 0x0000C4, 0x0000C0, 0x000545, 0x0000C2, 0x0000DC, 0x0000CB, 0x0000DE, 0x0000C6, + 0x001F59, 0x0000C8, 0x001F5B, 0x0000CA, 0x001F5D, 0x0000CC, 0x001F5F, 0x0000CE, + 0x0000C9, 0x0000D0, 0x0000CF, 0x0000D2, 0x001F6D, 0x0000D4, 0x0000D8, 0x0000D6, + 0x0000DA, 0x001F68, 0x001F6B, 0x001F6A, 0x001F69, 0x001F6C, 0x001F6F, 0x001F6E, + 0x0104B1, 0x001F29, 0x0104B7, 0x001F2B, 0x00FF3A, 0x0004AC, 0x0004A8, 0x001F3D, + 0x01040A, 0x0104B0, 0x01040B, 0x0104B2, 0x001F2A, 0x0104B4, 0x010409, 0x0104B6, + 0x0104BA, 0x0104B8, 0x001F8A, 0x01E902, 0x0104BE, 0x0104B3, 0x0104BC, 0x000191, + 0x000042, 0x0004B8, 0x000043, 0x000181, 0x0000CD, 0x00FF25, 0x000041, 0x01E90B, + 0x001FBC, 0x000100, 0x01040F, 0x000102, 0x001F9C, 0x000104, 0x001F9E, 0x000106, + 0x001FD8, 0x000108, 0x001FDA, 0x00010A, 0x001F98, 0x00010C, 0x001F9A, 0x00010E, + 0x001FA9, 0x000110, 0x0024BB, 0x000112, 0x001F8B, 0x000114, 0x01040E, 0x000116, + 0x01040C, 0x001FAD, 0x001FAB, 0x00011A, 0x000190, 0x000118, 0x001FAF, 0x00FF23, + 0x001FB8, 0x000122, 0x000120, 0x001FBA, 0x001F1A, 0x01040D, 0x000124, 0x000126, + 0x001FF8, 0x000128, 0x001FFA, 0x00012A, 0x001FFC, 0x00012C, 0x001F1C, 0x00012E, + 0x001F89, 0x000132, 0x001F8E, 0x001F1D, 0x000130, 0x000134, 0x001F8F, 0x000136, + 0x001FE8, 0x001FEC, 0x001F1B, 0x00FF22, 0x00011C, 0x001F2E, 0x00011E, 0x00FF35, + 0x0010B0, 0x0010B1, 0x0010B6, 0x0010B7, 0x001F8D, 0x00FF30, 0x00FF37, 0x00FF36, + 0x001FD9, 0x00FF31, 0x001FDB, 0x00014A, 0x00FF34, 0x00014C, 0x00FF33, 0x00014E, + 0x000154, 0x000150, 0x000496, 0x000152, 0x001FEA, 0x001F8C, 0x001FE9, 0x000156, + 0x00015C, 0x001FA8, 0x001FAA, 0x00015A, 0x001FAC, 0x000158, 0x001FAE, 0x00015E, + 0x001FEB, 0x000160, 0x002C2D, 0x000162, 0x002C2E, 0x000164, 0x002C29, 0x000166, + 0x00016A, 0x000168, 0x001FFB, 0x001FF9, 0x0010B2, 0x00016C, 0x0010B3, 0x00016E, + 0x002C2B, 0x000170, 0x002C25, 0x000172, 0x0010A3, 0x000174, 0x002C27, 0x000176, + 0x0010C1, 0x000178, 0x0010C3, 0x0010C2, 0x0010C0, 0x0010C7, 0x001FCC, 0x000193, + 0x001FC8, 0x001FC9, 0x001FCA, 0x001FCB, 0x002C1D, 0x002C1F, 0x00018F, 0x000186, + 0x002C1B, 0x000187, 0x00052C, 0x00018A, 0x00018E, 0x0010C5, 0x0010C4, 0x00018B, + 0x0001B7, 0x0001B1, 0x002CED, 0x000182, 0x00052E, 0x000184, 0x000194, 0x000196, + 0x000528, 0x00052A, 0x0001B2, 0x002CEB, 0x0001B5, 0x0010B4, 0x01E90D, 0x01E90F, + 0x0010A2, 0x0001A0, 0x01E915, 0x0001A2, 0x01E917, 0x0001A4, 0x0001B3, 0x0001A6, + 0x0001A9, 0x0010A1, 0x0010B5, 0x01E911, 0x000189, 0x0010A0, 0x0001AF, 0x01E913, + 0x0010A4, 0x0010A5, 0x0010A6, 0x001F9D, 0x001F9F, 0x001F99, 0x001F9B, 0x0010A7, + 0x000198, 0x0001B8, 0x0001BC, 0x002CAC, 0x00019C, 0x00019D, 0x002CAE, 0x00019F, + 0x002CA8, 0x002CAA, 0x002CA4, 0x002CA6, 0x002CA0, 0x0001C4, 0x002CA2, 0x002CBC, + 0x002CBE, 0x0001C8, 0x002CB8, 0x0001CA, 0x002CBA, 0x002CB4, 0x002CB6, 0x002CB0, + 0x0001D1, 0x002CB2, 0x0001D3, 0x010CAD, 0x0001D5, 0x010CAF, 0x010CA9, 0x010CAB, + 0x0001D9, 0x010CA5, 0x0001DB, 0x010CA7, 0x010CA1, 0x010CA3, 0x002C9C, 0x0001DE, + 0x002C9E, 0x0001E2, 0x0001E0, 0x002C98, 0x002C9A, 0x0001E4, 0x002C94, 0x0001E6, + 0x002C96, 0x0001E8, 0x010CB1, 0x0001EA, 0x010C8C, 0x0001EC, 0x010C8D, 0x0001EE, + 0x010C8E, 0x010C8F, 0x010C88, 0x0001F2, 0x010C89, 0x0001F4, 0x010C8A, 0x0001F6, + 0x010C8B, 0x0001F8, 0x010C84, 0x0001FA, 0x010C85, 0x0001FC, 0x010C86, 0x0001FE, + 0x010C87, 0x010C80, 0x010C81, 0x010C82, 0x010C83, 0x010C9C, 0x010C9D, 0x010C9E, + 0x010C9F, 0x010C98, 0x010C99, 0x010C9A, 0x010C9B, 0x010C94, 0x010C95, 0x010C96, + 0x010C97, 0x010C90, 0x010C91, 0x010C92, 0x010C93, 0x00A68C, 0x00A68E, 0x00A688, + 0x00A68A, 0x00A684, 0x00A686, 0x00A680, 0x00A682, 0x00A698, 0x00A69A, 0x00A694, + 0x000222, 0x00A696, 0x000226, 0x00A690, 0x00A692, 0x00A76C, 0x00A76E, 0x00A768, + 0x00A76A, 0x00A764, 0x000224, 0x00A766, 0x00A760, 0x00A762, 0x00A77D, 0x00A77E, + 0x00A779, 0x00A77B, 0x000245, 0x000232, 0x00A740, 0x000241, 0x00A742, 0x000243, + 0x00A75C, 0x00022A, 0x00A75E, 0x00023A, 0x000228, 0x00022C, 0x00022E, 0x00023E, + 0x000244, 0x00A758, 0x000246, 0x00A75A, 0x00A754, 0x00A756, 0x00A750, 0x00A752, + 0x000220, 0x000248, 0x00A73C, 0x00024A, 0x00023D, 0x00024C, 0x00A738, 0x00024E, + 0x00023B, 0x00A734, 0x00A736, 0x000230, 0x00020C, 0x00020E, 0x000208, 0x00020A, + 0x000204, 0x000206, 0x000200, 0x000202, 0x00021C, 0x00021E, 0x000218, 0x00021A, + 0x000214, 0x000216, 0x000210, 0x000212, 0x00A7AC, 0x00A7AD, 0x00A7AE, 0x00A7A8, + 0x00A7AA, 0x00A7AB, 0x0013ED, 0x0013EF, 0x0013E9, 0x0013EB, 0x0013E4, 0x0013E5, + 0x0013E6, 0x0013E7, 0x0013E0, 0x0013E1, 0x0013E2, 0x0013E3, 0x00A7B4, 0x00A7B6, + 0x00A7B0, 0x00A7B1, 0x00A7B2, 0x00A7B3, 0x0013F4, 0x0013F0, 0x0013F1, 0x0013F2, + 0x0013CD, 0x0013CF, 0x0013C9, 0x0013CB, 0x0013C5, 0x0013C7, 0x0013C1, 0x0013C3, + 0x0013DC, 0x0013DD, 0x0013DF, 0x0013D9, 0x0013DB, 0x0013D4, 0x0013D5, 0x0013D6, + 0x0013D7, 0x0013D0, 0x0013D1, 0x0013D2, 0x0013D3, 0x0013AC, 0x0013AD, 0x0013AE, + 0x0013AF, 0x0013A8, 0x0013A9, 0x0013AA, 0x0013AB, 0x0013A4, 0x0013A5, 0x0013A6, + 0x0013A0, 0x0013A1, 0x0013A2, 0x0013A3, 0x0013BC, 0x0013BD, 0x0013BF, 0x0013B9, + 0x0013BB, 0x0013B4, 0x0013B5, 0x0013B6, 0x0013B7, 0x0013B0, 0x0013B1, 0x0013B2, + 0x0013B3, 0x0003EC, 0x0003EE, 0x0003E8, 0x0003EA, 0x0003E4, 0x0003E6, 0x0003E0, + 0x0003E2, 0x00216C, 0x002168, 0x00216B, 0x002165, 0x002166, 0x002160, 0x002161, + 0x002162, 0x002163, 0x0003CF, 0x0003DC, 0x0003DE, 0x0003D8, 0x0003DA, 0x0003A8, + 0x0003A9, 0x0003AA, 0x0003AB, 0x0003A4, 0x0003A5, 0x0003A6, 0x0003A7, 0x0003A0, + 0x0003A1, 0x0003A3, 0x00212A, 0x00212B, 0x002126, 0x002164, 0x002167, 0x00038C, + 0x002169, 0x00038E, 0x00038F, 0x00216A, 0x00216D, 0x000388, 0x00216F, 0x00216E, + 0x000389, 0x00038A, 0x0010CD, 0x000386, 0x002132, 0x00039E, 0x000394, 0x000395, + 0x000396, 0x000397, 0x000391, 0x000392, 0x000393, 0x0010AC, 0x0010AD, 0x0010AE, + 0x0010AF, 0x0010A8, 0x002183, 0x0010A9, 0x0010AA, 0x0010AB, 0x0010BC, 0x0010BD, + 0x0010BE, 0x0010BF, 0x0010B8, 0x0010B9, 0x0010BA, 0x0010BB, 0x010408, 0x010404, + 0x00A640, 0x010405, 0x00A642, 0x010406, 0x010407, 0x010403, 0x010414, 0x010415, + 0x010416, 0x010417, 0x00A646, 0x00A65A, 0x00A65C, 0x010410, 0x010411, 0x00A65E, + 0x010412, 0x00A650, 0x00A652, 0x010413, 0x00A654, 0x0024CC, 0x00A656, 0x00A644, + 0x0024CD, 0x00A658, 0x0024CE, 0x0024CF, 0x0024C8, 0x0024C9, 0x00A64A, 0x00A648, + 0x00A660, 0x00A64C, 0x00A662, 0x0024CA, 0x00A664, 0x00A64E, 0x0024CB, 0x0024C4, + 0x0024C5, 0x0024C6, 0x0024C7, 0x0024C0, 0x0024C1, 0x0024C2, 0x0024C3, 0x0104CC, + 0x0104CD, 0x0104CE, 0x0104CF, 0x0104C8, 0x0104C9, 0x0104CA, 0x00A666, 0x0104CB, + 0x00A668, 0x0104C4, 0x00A66A, 0x0104C5, 0x00A66C, 0x0104C6, 0x0104C7, 0x0104C0, + 0x002C01, 0x0104C1, 0x002C03, 0x0104C2, 0x0104C3, 0x0024BC, 0x0024BD, 0x0024BE, + 0x0024BF, 0x0024B8, 0x0024B9, 0x0024BA, 0x0024B6, 0x0024B7, 0x0104D0, 0x0104D1, + 0x0104D2, 0x002C15, 0x002C13, 0x0104D3, 0x001E6C, 0x001E6E, 0x002C17, 0x001E68, + 0x002C11, 0x001E6A, 0x0104BD, 0x0104BF, 0x0104B9, 0x0104BB, 0x0000C5, 0x0000C7, + 0x0000C1, 0x0000C3, 0x002C23, 0x002C21, 0x0000DD, 0x0000D9, 0x0000DB, 0x0000D5, + 0x0000D1, 0x0000D3, 0x001E5C, 0x001E5E, 0x001E58, 0x001E5A, 0x001E54, 0x00FF27, + 0x001E56, 0x000372, 0x000370, 0x00FF2B, 0x000376, 0x00FF29, 0x001E50, 0x001E52, + 0x001E2C, 0x001E2E, 0x001E28, 0x001E2A, 0x001E24, 0x001E26, 0x00037F, 0x001E20, + 0x002C00, 0x001E22, 0x002C02, 0x001E3C, 0x002C6D, 0x001E3E, 0x002C6E, 0x001E38, + 0x002C6F, 0x002C69, 0x002C06, 0x002C1A, 0x002C1C, 0x00039D, 0x00039C, 0x002C1E, + 0x002C70, 0x002C10, 0x002C12, 0x002C72, 0x002C14, 0x002C75, 0x002C16, 0x002C04, + 0x000399, 0x002C18, 0x00039B, 0x00039A, 0x000398, 0x00039F, 0x002C0A, 0x002C08, + 0x002C20, 0x002C0C, 0x002C22, 0x002C62, 0x002C24, 0x002C0E, 0x002C60, 0x002C63, + 0x010CA0, 0x010CA8, 0x010CA2, 0x010CAA, 0x002C64, 0x010CA4, 0x002C67, 0x010CA6, + 0x010CB0, 0x002C7F, 0x010CB2, 0x001F0B, 0x001E3A, 0x001F09, 0x002C26, 0x000197, + 0x002C28, 0x010CAC, 0x002C2A, 0x002CDC, 0x002C2C, 0x010CAE, 0x002C6B, 0x002C7E, + 0x0118AD, 0x0118AF, 0x0118A9, 0x0118AB, 0x002CD8, 0x0118A5, 0x002CDA, 0x0118A7, + 0x0118A1, 0x0118A3, 0x0118BD, 0x0118BF, 0x0118B9, 0x0118BB, 0x0118B5, 0x0118B7, + 0x0118B1, 0x0118B3, 0x001EEC, 0x00017D, 0x001EEE, 0x000179, 0x002C07, 0x001EEA, + 0x00017B, 0x002C19, 0x002C05, 0x002CD4, 0x000145, 0x000147, 0x000141, 0x000143, + 0x002CDE, 0x001EAC, 0x00013D, 0x001EAE, 0x00013F, 0x001EA8, 0x000139, 0x001EAA, + 0x002C80, 0x002C88, 0x002C82, 0x002C8A, 0x00013B, 0x002C84, 0x00042D, 0x002C86, + 0x002C90, 0x00042F, 0x002C92, 0x000429, 0x00042B, 0x0003F4, 0x0003F7, 0x000425, + 0x0003F9, 0x002C8C, 0x000427, 0x0003FA, 0x0003FD, 0x002C8E, 0x0003FF, 0x0003FE, + 0x00053E, 0x000400, 0x00053F, 0x000402, 0x002CC0, 0x000404, 0x002CC2, 0x000406, + 0x000539, 0x000408, 0x000538, 0x00040A, 0x002CC4, 0x00040C, 0x002CC6, 0x00040E, + 0x002CCA, 0x000410, 0x000413, 0x000412, 0x000411, 0x000414, 0x000417, 0x000416, + 0x000421, 0x00041A, 0x000418, 0x000423, 0x000415, 0x00041C, 0x002C0B, 0x00041E, + 0x00A722, 0x000420, 0x00A726, 0x000422, 0x002CCC, 0x000424, 0x002CCE, 0x000426, + 0x002CE0, 0x00042A, 0x00A724, 0x002CE2, 0x000428, 0x00042C, 0x002CC8, 0x00042E, + 0x002CD2, 0x002CD0, 0x000549, 0x00A732, 0x00054D, 0x0004D6, 0x00054F, 0x002CD6, + 0x0013C0, 0x00A72A, 0x002CF2, 0x00A73A, 0x00A728, 0x00A72C, 0x00A72E, 0x00A73E, + 0x00A744, 0x00040D, 0x00A746, 0x00048A, 0x0013C4, 0x0013CC, 0x0013C6, 0x0013CE, + 0x01E901, 0x00A748, 0x01E900, 0x00A74A, 0x00040F, 0x00A74C, 0x000409, 0x00A74E, + 0x01E906, 0x00040B, 0x01E907, 0x000405, 0x00049C, 0x000407, 0x000401, 0x000403, + 0x01E904, 0x01E905, 0x00041D, 0x00041F, 0x000419, 0x000498, 0x0013A7, 0x00049E, + 0x0013E8, 0x000460, 0x0013EA, 0x000462, 0x0013EC, 0x000464, 0x0013EE, 0x000466, + 0x00041B, 0x000468, 0x0001F7, 0x00046A, 0x0004E8, 0x00046C, 0x0001F1, 0x00046E, + 0x000474, 0x0013BA, 0x0013B8, 0x000472, 0x0013BE, 0x000470, 0x0004E4, 0x000476, + 0x00053C, 0x00053D, 0x0001CD, 0x00047A, 0x000478, 0x00047C, 0x0013C2, 0x00047E, + 0x0004E6, 0x00FF39, 0x0004AA, 0x00A78B, 0x0004D2, 0x00A78D, 0x0004AE, 0x0001CF, + 0x0013D8, 0x001E00, 0x0013DA, 0x001E02, 0x001E06, 0x001E04, 0x00048C, 0x00048E, + 0x0004B0, 0x001E0A, 0x001E08, 0x0004B2, 0x0004B4, 0x001E0C, 0x0004B6, 0x001E0E, + 0x00A790, 0x001E10, 0x00A792, 0x001E12, 0x000492, 0x001E14, 0x00A79A, 0x001E16, + 0x001E1A, 0x001E18, 0x000480, 0x0004A2, 0x0004A6, 0x001E1C, 0x0004A0, 0x001E1E, + 0x0013C8, 0x0001CB, 0x0013CA, 0x0004BA, 0x0004A4, 0x0004BC, 0x0013DE, 0x00FF21, + 0x000490, 0x000494, 0x002C09, 0x0013F3, 0x002C0D, 0x0013F5, 0x002C0F, 0x001F88, + 0x00A780, 0x001E30, 0x00A782, 0x001E32, 0x001E36, 0x001E34, 0x00A796, 0x0004BE, + 0x0004C1, 0x001F19, 0x0004C3, 0x0001C5, 0x0004C5, 0x00A784, 0x0004C7, 0x00A786, + 0x0004C9, 0x001E40, 0x0004CB, 0x001E42, 0x0004CD, 0x001E44, 0x001E48, 0x001E46, + 0x001E4A, 0x0004D0, 0x0004D4, 0x0004FE, 0x00A79C, 0x0001C7, 0x00A79E, 0x01E918, + 0x00A798, 0x0004D8, 0x01E909, 0x0004DA, 0x001E4C, 0x0004DC, 0x001E4E, 0x0004DE, + 0x00A7A0, 0x0004E0, 0x00A7A2, 0x0004E2, 0x00A7A4, 0x0004F8, 0x00A7A6, 0x0004FA, + 0x001E62, 0x001E60, 0x00049A, 0x0004EA, 0x001E66, 0x0004EC, 0x001E64, 0x0004EE, + 0x001F4D, 0x0004F0, 0x0001D7, 0x0004F2, 0x0001AC, 0x0004F4, 0x0001AE, 0x0004F6, + 0x001E74, 0x001E70, 0x001FB9, 0x001E72, 0x0004C0, 0x0004FC, 0x0001A7, 0x001E76, + 0x000540, 0x001E78, 0x000542, 0x001E7A, 0x000500, 0x001E7C, 0x000502, 0x001E7E, + 0x000524, 0x001E80, 0x000546, 0x001E82, 0x000504, 0x001E84, 0x000506, 0x001E86, + 0x00050A, 0x000550, 0x000552, 0x001E8A, 0x000554, 0x001E88, 0x000556, 0x000544, }; /* indexes */ const uint16_t NU_TOLOWER_VALUES_I[] = { - 0x0BC6, 0x0C3E, 0x0B9A, 0x0BD0, 0x04FB, 0x0C4C, 0x0540, 0x053A, 0x0BF8, 0x0546, - 0x0019, 0x0029, 0x04BF, 0x054C, 0x04C2, 0x0C50, 0x04DD, 0x0C57, 0x0C20, 0x04E0, - 0x0C53, 0x0C5B, 0x04B9, 0x0C5F, 0x04C8, 0x04C5, 0x002B, 0x002D, 0x0B92, 0x0017, - 0x0B96, 0x04CE, 0x0BDA, 0x0C73, 0x04F8, 0x0C77, 0x0031, 0x0C7B, 0x002F, 0x0C7F, - 0x0525, 0x0C83, 0x052B, 0x0C87, 0x04D1, 0x0C8B, 0x04D4, 0x0C8F, 0x0C9B, 0x0C93, - 0x0033, 0x0C97, 0x0C25, 0x0027, 0x0BEE, 0x0C9F, 0x0CAB, 0x0561, 0x055B, 0x0CA7, - 0x0C02, 0x0CA3, 0x0C0C, 0x0CAF, 0x0555, 0x0CB7, 0x0CB3, 0x04CB, 0x0C2F, 0x04FE, - 0x0CBB, 0x0CBF, 0x04DA, 0x0CC3, 0x05EE, 0x0CC7, 0x0013, 0x0CCB, 0x0015, 0x0CCF, - 0x0C1B, 0x0CD3, 0x0C34, 0x0CD7, 0x0501, 0x0CDB, 0x0C39, 0x0CDF, 0x12D2, 0x0CE3, - 0x0025, 0x12DA, 0x12E2, 0x12E6, 0x12EA, 0x12EE, 0x04F5, 0x0C42, 0x0504, 0x0CF7, - 0x0CF3, 0x0CFB, 0x0507, 0x0CFF, 0x05E9, 0x0D03, 0x1312, 0x0D07, 0x05E4, 0x0D0B, - 0x05DF, 0x0D0F, 0x000F, 0x0011, 0x001B, 0x001D, 0x0616, 0x0C2A, 0x12C2, 0x12CA, - 0x0023, 0x088C, 0x0882, 0x05F8, 0x0021, 0x0896, 0x001F, 0x08A0, 0x0BE4, 0x08AA, - 0x000D, 0x08B4, 0x08C8, 0x08BE, 0x0543, 0x0BAD, 0x08DC, 0x08D2, 0x05FD, 0x0602, - 0x0D6F, 0x08E6, 0x0D5F, 0x08F0, 0x04E6, 0x08FA, 0x12FA, 0x0904, 0x0918, 0x090E, - 0x000B, 0x0D67, 0x0D13, 0x0D4B, 0x0D5B, 0x0D1B, 0x0D23, 0x0D27, 0x0D2B, 0x0D2F, - 0x0611, 0x0C47, 0x0571, 0x04D7, 0x0D7B, 0x0009, 0x0D87, 0x0513, 0x0007, 0x060C, - 0x0D33, 0x0D73, 0x0D83, 0x0607, 0x0D6B, 0x0D77, 0x061B, 0x0620, 0x0625, 0x0510, - 0x056C, 0x05F3, 0x0567, 0x062A, 0x0D8F, 0x0D8B, 0x0D97, 0x0D93, 0x0648, 0x0D9B, - 0x0537, 0x0E3F, 0x0041, 0x0035, 0x0531, 0x003B, 0x0086, 0x0056, 0x008C, 0x0047, - 0x0DA3, 0x004D, 0x0DA7, 0x0053, 0x0DAB, 0x0059, 0x0DAF, 0x005F, 0x0050, 0x0065, - 0x0062, 0x006B, 0x0DC7, 0x0071, 0x007A, 0x0077, 0x0080, 0x0DB3, 0x0DBF, 0x0DBB, - 0x0DB7, 0x0DC3, 0x0DCF, 0x0DCB, 0x0634, 0x0D4F, 0x0652, 0x0D57, 0x131A, 0x042F, - 0x0429, 0x0D7F, 0x0599, 0x062F, 0x059E, 0x0639, 0x0D53, 0x0643, 0x0594, 0x064D, - 0x0661, 0x0657, 0x132A, 0x0BA8, 0x0675, 0x063E, 0x066B, 0x016C, 0x0003, 0x0441, - 0x0005, 0x014B, 0x005C, 0x12C6, 0x0001, 0x0BD5, 0x1382, 0x008F, 0x05B2, 0x0092, - 0x1352, 0x0095, 0x135A, 0x0098, 0x0E5B, 0x009B, 0x0E63, 0x009E, 0x1342, 0x00A1, - 0x134A, 0x00A4, 0x1366, 0x00A7, 0x0EF7, 0x00AA, 0x132E, 0x00AD, 0x05AD, 0x00B0, - 0x05A3, 0x1376, 0x136E, 0x00B6, 0x0169, 0x00B3, 0x137E, 0x12BE, 0x0E33, 0x00C2, - 0x00BF, 0x0E3B, 0x0D3B, 0x05A8, 0x00C5, 0x00C8, 0x0E7F, 0x00CB, 0x0E87, 0x00CE, - 0x138A, 0x00D1, 0x0D43, 0x00D4, 0x1326, 0x00D9, 0x133A, 0x0D47, 0x131E, 0x00DC, - 0x133E, 0x00DF, 0x0E6B, 0x0E7B, 0x0D3F, 0x12BA, 0x00B9, 0x0D63, 0x00BC, 0x1306, - 0x0723, 0x0727, 0x073B, 0x073F, 0x1336, 0x12F2, 0x130E, 0x130A, 0x0E5F, 0x12F6, - 0x0E67, 0x00FA, 0x1302, 0x00FD, 0x12FE, 0x0100, 0x0109, 0x0103, 0x040E, 0x0106, - 0x0E73, 0x1332, 0x0E6F, 0x010C, 0x0115, 0x1362, 0x136A, 0x0112, 0x1372, 0x010F, - 0x137A, 0x0118, 0x0E77, 0x011B, 0x0FFF, 0x011E, 0x1003, 0x0121, 0x0FEF, 0x0124, - 0x012A, 0x0127, 0x0E8B, 0x0E83, 0x072B, 0x012D, 0x072F, 0x0130, 0x0FF7, 0x0133, - 0x0FDF, 0x0136, 0x06EF, 0x0139, 0x0FE7, 0x013C, 0x0767, 0x013F, 0x076F, 0x076B, - 0x0763, 0x077B, 0x1386, 0x016F, 0x0E47, 0x0E4B, 0x0E4F, 0x0E53, 0x0FBF, 0x0FC7, - 0x0166, 0x0154, 0x0FB7, 0x0157, 0x04EF, 0x015D, 0x0163, 0x0777, 0x0773, 0x0160, - 0x01AE, 0x01A2, 0x1107, 0x014E, 0x04F2, 0x0151, 0x0172, 0x0175, 0x04E9, 0x04EC, - 0x01A5, 0x1103, 0x01AB, 0x0733, 0x0BDF, 0x0BE9, 0x06EB, 0x0187, 0x0C07, 0x018A, - 0x0C11, 0x018D, 0x01A8, 0x0190, 0x0196, 0x06E7, 0x0737, 0x0BF3, 0x015A, 0x06E3, - 0x019F, 0x0BFD, 0x06F3, 0x06F7, 0x06FB, 0x1356, 0x135E, 0x1346, 0x134E, 0x06FF, - 0x017B, 0x01B1, 0x01B4, 0x1093, 0x017E, 0x0181, 0x1097, 0x0184, 0x108B, 0x108F, - 0x1083, 0x1087, 0x107B, 0x01B7, 0x107F, 0x10B3, 0x10B7, 0x01C0, 0x10AB, 0x01C3, - 0x10AF, 0x10A3, 0x10A7, 0x109B, 0x01CF, 0x109F, 0x01D2, 0x0860, 0x01D5, 0x086A, - 0x084C, 0x0856, 0x01DB, 0x0838, 0x01DE, 0x0842, 0x0824, 0x082E, 0x1073, 0x01E1, - 0x1077, 0x01E7, 0x01E4, 0x106B, 0x106F, 0x01EA, 0x1063, 0x01ED, 0x1067, 0x01F0, - 0x0874, 0x01F3, 0x07BB, 0x01F6, 0x07C0, 0x01F9, 0x07C5, 0x07CA, 0x07A7, 0x01FF, - 0x07AC, 0x0202, 0x07B1, 0x0205, 0x07B6, 0x020B, 0x0793, 0x020E, 0x0798, 0x0211, - 0x079D, 0x0214, 0x07A2, 0x077F, 0x0784, 0x0789, 0x078E, 0x080B, 0x0810, 0x0815, - 0x081A, 0x07F7, 0x07FC, 0x0801, 0x0806, 0x07E3, 0x07E8, 0x07ED, 0x07F2, 0x07CF, - 0x07D4, 0x07D9, 0x07DE, 0x1183, 0x1187, 0x117B, 0x117F, 0x1173, 0x1177, 0x116B, - 0x116F, 0x119B, 0x119F, 0x1193, 0x024A, 0x1197, 0x0250, 0x118B, 0x118F, 0x1233, - 0x1237, 0x122B, 0x122F, 0x1223, 0x024D, 0x1227, 0x121B, 0x121F, 0x1243, 0x1247, - 0x123B, 0x123F, 0x027C, 0x0262, 0x11DB, 0x0273, 0x11DF, 0x0276, 0x1213, 0x0256, - 0x1217, 0x0265, 0x0253, 0x0259, 0x025C, 0x026F, 0x0279, 0x120B, 0x027F, 0x120F, - 0x1203, 0x1207, 0x11FB, 0x11FF, 0x0247, 0x0282, 0x11D3, 0x0285, 0x026C, 0x0288, - 0x11CB, 0x028B, 0x0269, 0x11C3, 0x11C7, 0x025F, 0x0229, 0x022C, 0x0223, 0x0226, - 0x021D, 0x0220, 0x0217, 0x021A, 0x0241, 0x0244, 0x023B, 0x023E, 0x0235, 0x0238, - 0x022F, 0x0232, 0x1298, 0x129B, 0x129E, 0x128E, 0x1292, 0x1295, 0x0A56, 0x0A5E, - 0x0A46, 0x0A4E, 0x0A32, 0x0A36, 0x0A3A, 0x0A3E, 0x0A22, 0x0A26, 0x0A2A, 0x0A2E, - 0x12AE, 0x12B2, 0x12A1, 0x12A4, 0x12A7, 0x12AA, 0x0A72, 0x0A62, 0x0A66, 0x0A6A, - 0x09D6, 0x09DE, 0x09C6, 0x09CE, 0x09B6, 0x09BE, 0x09A6, 0x09AE, 0x0A12, 0x0A16, - 0x0A1E, 0x0A06, 0x0A0E, 0x09F2, 0x09F6, 0x09FA, 0x09FE, 0x09E2, 0x09E6, 0x09EA, - 0x09EE, 0x0952, 0x0956, 0x095A, 0x095E, 0x0942, 0x0946, 0x094A, 0x094E, 0x0932, - 0x0936, 0x093A, 0x0922, 0x0926, 0x092A, 0x092E, 0x0992, 0x0996, 0x099E, 0x0986, - 0x098E, 0x0972, 0x0976, 0x097A, 0x097E, 0x0962, 0x0966, 0x096A, 0x096E, 0x031E, - 0x0321, 0x0318, 0x031B, 0x0312, 0x0315, 0x030C, 0x030F, 0x0ECF, 0x0EBF, 0x0ECB, - 0x0EB3, 0x0EB7, 0x0E9F, 0x0EA3, 0x0EA7, 0x0EAB, 0x02FD, 0x0306, 0x0309, 0x0300, - 0x0303, 0x02F1, 0x02F4, 0x02F7, 0x02FA, 0x02E5, 0x02E8, 0x02EB, 0x02EE, 0x02DC, - 0x02DF, 0x02E2, 0x0E96, 0x0E98, 0x0E93, 0x0EAF, 0x0EBB, 0x02A6, 0x0EC3, 0x02A9, - 0x02AC, 0x0EC7, 0x0ED3, 0x029D, 0x0EDB, 0x0ED7, 0x02A0, 0x02A3, 0x087E, 0x029A, - 0x0E9B, 0x02D6, 0x02B8, 0x02BB, 0x02BE, 0x02C1, 0x02AF, 0x02B2, 0x02B5, 0x0713, - 0x0717, 0x071B, 0x071F, 0x0703, 0x0EDF, 0x0707, 0x070B, 0x070F, 0x0753, 0x0757, - 0x075B, 0x075F, 0x0743, 0x0747, 0x074B, 0x074F, 0x058F, 0x057B, 0x110F, 0x0580, - 0x1113, 0x0585, 0x058A, 0x0576, 0x05CB, 0x05D0, 0x05D5, 0x05DA, 0x111B, 0x1143, - 0x1147, 0x05B7, 0x05BC, 0x114B, 0x05C1, 0x112F, 0x1133, 0x05C6, 0x1137, 0x0F3B, - 0x113B, 0x1117, 0x0F3F, 0x113F, 0x0F43, 0x0F47, 0x0F2B, 0x0F2F, 0x1123, 0x111F, - 0x114F, 0x1127, 0x1153, 0x0F33, 0x1157, 0x112B, 0x0F37, 0x0F1B, 0x0F1F, 0x0F23, - 0x0F27, 0x0F0B, 0x0F0F, 0x0F13, 0x0F17, 0x06BB, 0x06C0, 0x06C5, 0x06CA, 0x06A7, - 0x06AC, 0x06B1, 0x115B, 0x06B6, 0x115F, 0x0693, 0x1163, 0x0698, 0x1167, 0x069D, - 0x06A2, 0x067F, 0x0F4F, 0x0684, 0x0F57, 0x0689, 0x068E, 0x0EFB, 0x0EFF, 0x0F03, - 0x0F07, 0x0EEB, 0x0EEF, 0x0EF3, 0x0EE3, 0x0EE7, 0x06CF, 0x06D4, 0x06D9, 0x0F9F, - 0x0F97, 0x06DE, 0x0B52, 0x0B56, 0x0FA7, 0x0B4A, 0x0F8F, 0x0B4E, 0x0670, 0x067A, - 0x065C, 0x0666, 0x0044, 0x004A, 0x0038, 0x003E, 0x0FD7, 0x0FCF, 0x0089, 0x007D, - 0x0083, 0x0074, 0x0068, 0x006E, 0x0B32, 0x0B36, 0x0B2A, 0x0B2E, 0x0B22, 0x12CE, - 0x0B26, 0x0291, 0x028E, 0x12DE, 0x0294, 0x12D6, 0x0B1A, 0x0B1E, 0x0AD2, 0x0AD6, - 0x0ACA, 0x0ACE, 0x0AC2, 0x0AC6, 0x0297, 0x0ABA, 0x0F4B, 0x0ABE, 0x0F53, 0x0AF2, - 0x1021, 0x0AF6, 0x1024, 0x0AEA, 0x1027, 0x1019, 0x0F63, 0x0FB3, 0x0FBB, 0x02D3, - 0x02D0, 0x0FC3, 0x102A, 0x0F8B, 0x0F93, 0x102D, 0x0F9B, 0x1031, 0x0FA3, 0x0F5B, - 0x02C7, 0x0FAB, 0x02CD, 0x02CA, 0x02C4, 0x02D9, 0x0F73, 0x0F6B, 0x0FCB, 0x0F7B, - 0x0FD3, 0x100B, 0x0FDB, 0x0F83, 0x1007, 0x100E, 0x081F, 0x0847, 0x0829, 0x0851, - 0x1012, 0x0833, 0x1015, 0x083D, 0x086F, 0x1038, 0x0879, 0x0D1F, 0x0AEE, 0x0D17, - 0x0FE3, 0x0178, 0x0FEB, 0x085B, 0x0FF3, 0x10F3, 0x0FFB, 0x0865, 0x101D, 0x1035, - 0x08C3, 0x08CD, 0x08AF, 0x08B9, 0x10EB, 0x089B, 0x10EF, 0x08A5, 0x0887, 0x0891, - 0x0913, 0x091D, 0x08FF, 0x0909, 0x08EB, 0x08F5, 0x08D7, 0x08E1, 0x0CEB, 0x0148, - 0x0CEF, 0x0142, 0x0F67, 0x0CE7, 0x0145, 0x0FAF, 0x0F5F, 0x10E3, 0x00F4, 0x00F7, - 0x00EE, 0x00F1, 0x10F7, 0x0C6B, 0x00E8, 0x0C6F, 0x00EB, 0x0C63, 0x00E2, 0x0C67, - 0x103B, 0x104B, 0x103F, 0x104F, 0x00E5, 0x1043, 0x03C0, 0x1047, 0x105B, 0x03C6, - 0x105F, 0x03B4, 0x03BA, 0x0324, 0x0327, 0x03A8, 0x032A, 0x1053, 0x03AE, 0x032D, - 0x0330, 0x1057, 0x0336, 0x0333, 0x051C, 0x0339, 0x051F, 0x033F, 0x10BB, 0x0345, - 0x10BF, 0x034B, 0x050D, 0x0351, 0x050A, 0x0357, 0x10C3, 0x035D, 0x10C7, 0x0363, - 0x10CF, 0x0369, 0x0372, 0x036F, 0x036C, 0x0375, 0x037E, 0x037B, 0x039C, 0x0387, - 0x0381, 0x03A2, 0x0378, 0x038D, 0x0F77, 0x0393, 0x11A3, 0x0399, 0x11AB, 0x039F, - 0x10D3, 0x03A5, 0x10D7, 0x03AB, 0x10FB, 0x03B7, 0x11A7, 0x10FF, 0x03B1, 0x03BD, - 0x10CB, 0x03C3, 0x10DF, 0x10DB, 0x053D, 0x11BF, 0x0549, 0x046E, 0x054F, 0x10E7, - 0x09A2, 0x11B3, 0x110B, 0x11CF, 0x11AF, 0x11B7, 0x11BB, 0x11D7, 0x11E3, 0x0360, - 0x11E7, 0x03FC, 0x09B2, 0x09D2, 0x09BA, 0x09DA, 0x0BA3, 0x11EB, 0x0B9E, 0x11EF, - 0x0366, 0x11F3, 0x0354, 0x11F7, 0x0BBC, 0x035A, 0x0BC1, 0x0348, 0x0417, 0x034E, - 0x033C, 0x0342, 0x0BB2, 0x0BB7, 0x0390, 0x0396, 0x0384, 0x0411, 0x093E, 0x041A, - 0x0A42, 0x03C9, 0x0A4A, 0x03CC, 0x0A52, 0x03CF, 0x0A5A, 0x03D2, 0x038A, 0x03D5, - 0x0208, 0x03D8, 0x0489, 0x03DB, 0x01FC, 0x03DE, 0x03E7, 0x098A, 0x0982, 0x03E4, - 0x099A, 0x03E1, 0x0483, 0x03EA, 0x0516, 0x0519, 0x01C9, 0x03F0, 0x03ED, 0x03F3, - 0x09AA, 0x03F6, 0x0486, 0x1316, 0x042C, 0x125B, 0x0468, 0x125F, 0x0432, 0x01CC, - 0x0A02, 0x0A7A, 0x0A0A, 0x0A7E, 0x0A86, 0x0A82, 0x03FF, 0x0402, 0x0435, 0x0A8E, - 0x0A8A, 0x0438, 0x043B, 0x0A92, 0x043E, 0x0A96, 0x1262, 0x0A9A, 0x1266, 0x0A9E, - 0x0408, 0x0AA2, 0x1272, 0x0AA6, 0x0AAE, 0x0AAA, 0x03F9, 0x0420, 0x0426, 0x0AB2, - 0x041D, 0x0AB6, 0x09C2, 0x01C6, 0x09CA, 0x0444, 0x0423, 0x0447, 0x0A1A, 0x12B6, - 0x0405, 0x040B, 0x0F6F, 0x0A6E, 0x0F7F, 0x0A76, 0x0F87, 0x1322, 0x124B, 0x0ADA, - 0x124F, 0x0ADE, 0x0AE6, 0x0AE2, 0x126A, 0x044A, 0x0450, 0x0D37, 0x0453, 0x01BA, - 0x0456, 0x1253, 0x0459, 0x1257, 0x045C, 0x0AFA, 0x045F, 0x0AFE, 0x0462, 0x0B02, - 0x0B0A, 0x0B06, 0x0B0E, 0x0465, 0x046B, 0x04AA, 0x1276, 0x01BD, 0x127A, 0x0C16, - 0x126E, 0x0471, 0x0BCB, 0x0474, 0x0B12, 0x0477, 0x0B16, 0x047A, 0x127E, 0x047D, - 0x1282, 0x0480, 0x1286, 0x04A1, 0x128A, 0x04A4, 0x0B3E, 0x0B3A, 0x0414, 0x048C, - 0x0B46, 0x048F, 0x0B42, 0x0492, 0x0D9F, 0x0495, 0x01D8, 0x0498, 0x0199, 0x049B, - 0x019C, 0x049E, 0x0B62, 0x0B5A, 0x0E37, 0x0B5E, 0x044D, 0x04A7, 0x0193, 0x0B66, - 0x0522, 0x0B6A, 0x0528, 0x0B6E, 0x04AD, 0x0B72, 0x04B0, 0x0B76, 0x04E3, 0x0B7A, - 0x0534, 0x0B7E, 0x04B3, 0x0B82, 0x04B6, 0x0B86, 0x04BC, 0x0552, 0x0558, 0x0B8E, + 0x0BC6, 0x0C3E, 0x0B9A, 0x0BD0, 0x04FB, 0x0C4C, 0x0540, 0x053A, 0x0BF8, 0x0546, + 0x0019, 0x0029, 0x04BF, 0x054C, 0x04C2, 0x0C50, 0x04DD, 0x0C57, 0x0C20, 0x04E0, + 0x0C53, 0x0C5B, 0x04B9, 0x0C5F, 0x04C8, 0x04C5, 0x002B, 0x002D, 0x0B92, 0x0017, + 0x0B96, 0x04CE, 0x0BDA, 0x0C73, 0x04F8, 0x0C77, 0x0031, 0x0C7B, 0x002F, 0x0C7F, + 0x0525, 0x0C83, 0x052B, 0x0C87, 0x04D1, 0x0C8B, 0x04D4, 0x0C8F, 0x0C9B, 0x0C93, + 0x0033, 0x0C97, 0x0C25, 0x0027, 0x0BEE, 0x0C9F, 0x0CAB, 0x0561, 0x055B, 0x0CA7, + 0x0C02, 0x0CA3, 0x0C0C, 0x0CAF, 0x0555, 0x0CB7, 0x0CB3, 0x04CB, 0x0C2F, 0x04FE, + 0x0CBB, 0x0CBF, 0x04DA, 0x0CC3, 0x05EE, 0x0CC7, 0x0013, 0x0CCB, 0x0015, 0x0CCF, + 0x0C1B, 0x0CD3, 0x0C34, 0x0CD7, 0x0501, 0x0CDB, 0x0C39, 0x0CDF, 0x12D2, 0x0CE3, + 0x0025, 0x12DA, 0x12E2, 0x12E6, 0x12EA, 0x12EE, 0x04F5, 0x0C42, 0x0504, 0x0CF7, + 0x0CF3, 0x0CFB, 0x0507, 0x0CFF, 0x05E9, 0x0D03, 0x1312, 0x0D07, 0x05E4, 0x0D0B, + 0x05DF, 0x0D0F, 0x000F, 0x0011, 0x001B, 0x001D, 0x0616, 0x0C2A, 0x12C2, 0x12CA, + 0x0023, 0x088C, 0x0882, 0x05F8, 0x0021, 0x0896, 0x001F, 0x08A0, 0x0BE4, 0x08AA, + 0x000D, 0x08B4, 0x08C8, 0x08BE, 0x0543, 0x0BAD, 0x08DC, 0x08D2, 0x05FD, 0x0602, + 0x0D6F, 0x08E6, 0x0D5F, 0x08F0, 0x04E6, 0x08FA, 0x12FA, 0x0904, 0x0918, 0x090E, + 0x000B, 0x0D67, 0x0D13, 0x0D4B, 0x0D5B, 0x0D1B, 0x0D23, 0x0D27, 0x0D2B, 0x0D2F, + 0x0611, 0x0C47, 0x0571, 0x04D7, 0x0D7B, 0x0009, 0x0D87, 0x0513, 0x0007, 0x060C, + 0x0D33, 0x0D73, 0x0D83, 0x0607, 0x0D6B, 0x0D77, 0x061B, 0x0620, 0x0625, 0x0510, + 0x056C, 0x05F3, 0x0567, 0x062A, 0x0D8F, 0x0D8B, 0x0D97, 0x0D93, 0x0648, 0x0D9B, + 0x0537, 0x0E3F, 0x0041, 0x0035, 0x0531, 0x003B, 0x0086, 0x0056, 0x008C, 0x0047, + 0x0DA3, 0x004D, 0x0DA7, 0x0053, 0x0DAB, 0x0059, 0x0DAF, 0x005F, 0x0050, 0x0065, + 0x0062, 0x006B, 0x0DC7, 0x0071, 0x007A, 0x0077, 0x0080, 0x0DB3, 0x0DBF, 0x0DBB, + 0x0DB7, 0x0DC3, 0x0DCF, 0x0DCB, 0x0634, 0x0D4F, 0x0652, 0x0D57, 0x131A, 0x042F, + 0x0429, 0x0D7F, 0x0599, 0x062F, 0x059E, 0x0639, 0x0D53, 0x0643, 0x0594, 0x064D, + 0x0661, 0x0657, 0x132A, 0x0BA8, 0x0675, 0x063E, 0x066B, 0x016C, 0x0003, 0x0441, + 0x0005, 0x014B, 0x005C, 0x12C6, 0x0001, 0x0BD5, 0x1382, 0x008F, 0x05B2, 0x0092, + 0x1352, 0x0095, 0x135A, 0x0098, 0x0E5B, 0x009B, 0x0E63, 0x009E, 0x1342, 0x00A1, + 0x134A, 0x00A4, 0x1366, 0x00A7, 0x0EF7, 0x00AA, 0x132E, 0x00AD, 0x05AD, 0x00B0, + 0x05A3, 0x1376, 0x136E, 0x00B6, 0x0169, 0x00B3, 0x137E, 0x12BE, 0x0E33, 0x00C2, + 0x00BF, 0x0E3B, 0x0D3B, 0x05A8, 0x00C5, 0x00C8, 0x0E7F, 0x00CB, 0x0E87, 0x00CE, + 0x138A, 0x00D1, 0x0D43, 0x00D4, 0x1326, 0x00D9, 0x133A, 0x0D47, 0x131E, 0x00DC, + 0x133E, 0x00DF, 0x0E6B, 0x0E7B, 0x0D3F, 0x12BA, 0x00B9, 0x0D63, 0x00BC, 0x1306, + 0x0723, 0x0727, 0x073B, 0x073F, 0x1336, 0x12F2, 0x130E, 0x130A, 0x0E5F, 0x12F6, + 0x0E67, 0x00FA, 0x1302, 0x00FD, 0x12FE, 0x0100, 0x0109, 0x0103, 0x040E, 0x0106, + 0x0E73, 0x1332, 0x0E6F, 0x010C, 0x0115, 0x1362, 0x136A, 0x0112, 0x1372, 0x010F, + 0x137A, 0x0118, 0x0E77, 0x011B, 0x0FFF, 0x011E, 0x1003, 0x0121, 0x0FEF, 0x0124, + 0x012A, 0x0127, 0x0E8B, 0x0E83, 0x072B, 0x012D, 0x072F, 0x0130, 0x0FF7, 0x0133, + 0x0FDF, 0x0136, 0x06EF, 0x0139, 0x0FE7, 0x013C, 0x0767, 0x013F, 0x076F, 0x076B, + 0x0763, 0x077B, 0x1386, 0x016F, 0x0E47, 0x0E4B, 0x0E4F, 0x0E53, 0x0FBF, 0x0FC7, + 0x0166, 0x0154, 0x0FB7, 0x0157, 0x04EF, 0x015D, 0x0163, 0x0777, 0x0773, 0x0160, + 0x01AE, 0x01A2, 0x1107, 0x014E, 0x04F2, 0x0151, 0x0172, 0x0175, 0x04E9, 0x04EC, + 0x01A5, 0x1103, 0x01AB, 0x0733, 0x0BDF, 0x0BE9, 0x06EB, 0x0187, 0x0C07, 0x018A, + 0x0C11, 0x018D, 0x01A8, 0x0190, 0x0196, 0x06E7, 0x0737, 0x0BF3, 0x015A, 0x06E3, + 0x019F, 0x0BFD, 0x06F3, 0x06F7, 0x06FB, 0x1356, 0x135E, 0x1346, 0x134E, 0x06FF, + 0x017B, 0x01B1, 0x01B4, 0x1093, 0x017E, 0x0181, 0x1097, 0x0184, 0x108B, 0x108F, + 0x1083, 0x1087, 0x107B, 0x01B7, 0x107F, 0x10B3, 0x10B7, 0x01C0, 0x10AB, 0x01C3, + 0x10AF, 0x10A3, 0x10A7, 0x109B, 0x01CF, 0x109F, 0x01D2, 0x0860, 0x01D5, 0x086A, + 0x084C, 0x0856, 0x01DB, 0x0838, 0x01DE, 0x0842, 0x0824, 0x082E, 0x1073, 0x01E1, + 0x1077, 0x01E7, 0x01E4, 0x106B, 0x106F, 0x01EA, 0x1063, 0x01ED, 0x1067, 0x01F0, + 0x0874, 0x01F3, 0x07BB, 0x01F6, 0x07C0, 0x01F9, 0x07C5, 0x07CA, 0x07A7, 0x01FF, + 0x07AC, 0x0202, 0x07B1, 0x0205, 0x07B6, 0x020B, 0x0793, 0x020E, 0x0798, 0x0211, + 0x079D, 0x0214, 0x07A2, 0x077F, 0x0784, 0x0789, 0x078E, 0x080B, 0x0810, 0x0815, + 0x081A, 0x07F7, 0x07FC, 0x0801, 0x0806, 0x07E3, 0x07E8, 0x07ED, 0x07F2, 0x07CF, + 0x07D4, 0x07D9, 0x07DE, 0x1183, 0x1187, 0x117B, 0x117F, 0x1173, 0x1177, 0x116B, + 0x116F, 0x119B, 0x119F, 0x1193, 0x024A, 0x1197, 0x0250, 0x118B, 0x118F, 0x1233, + 0x1237, 0x122B, 0x122F, 0x1223, 0x024D, 0x1227, 0x121B, 0x121F, 0x1243, 0x1247, + 0x123B, 0x123F, 0x027C, 0x0262, 0x11DB, 0x0273, 0x11DF, 0x0276, 0x1213, 0x0256, + 0x1217, 0x0265, 0x0253, 0x0259, 0x025C, 0x026F, 0x0279, 0x120B, 0x027F, 0x120F, + 0x1203, 0x1207, 0x11FB, 0x11FF, 0x0247, 0x0282, 0x11D3, 0x0285, 0x026C, 0x0288, + 0x11CB, 0x028B, 0x0269, 0x11C3, 0x11C7, 0x025F, 0x0229, 0x022C, 0x0223, 0x0226, + 0x021D, 0x0220, 0x0217, 0x021A, 0x0241, 0x0244, 0x023B, 0x023E, 0x0235, 0x0238, + 0x022F, 0x0232, 0x1298, 0x129B, 0x129E, 0x128E, 0x1292, 0x1295, 0x0A56, 0x0A5E, + 0x0A46, 0x0A4E, 0x0A32, 0x0A36, 0x0A3A, 0x0A3E, 0x0A22, 0x0A26, 0x0A2A, 0x0A2E, + 0x12AE, 0x12B2, 0x12A1, 0x12A4, 0x12A7, 0x12AA, 0x0A72, 0x0A62, 0x0A66, 0x0A6A, + 0x09D6, 0x09DE, 0x09C6, 0x09CE, 0x09B6, 0x09BE, 0x09A6, 0x09AE, 0x0A12, 0x0A16, + 0x0A1E, 0x0A06, 0x0A0E, 0x09F2, 0x09F6, 0x09FA, 0x09FE, 0x09E2, 0x09E6, 0x09EA, + 0x09EE, 0x0952, 0x0956, 0x095A, 0x095E, 0x0942, 0x0946, 0x094A, 0x094E, 0x0932, + 0x0936, 0x093A, 0x0922, 0x0926, 0x092A, 0x092E, 0x0992, 0x0996, 0x099E, 0x0986, + 0x098E, 0x0972, 0x0976, 0x097A, 0x097E, 0x0962, 0x0966, 0x096A, 0x096E, 0x031E, + 0x0321, 0x0318, 0x031B, 0x0312, 0x0315, 0x030C, 0x030F, 0x0ECF, 0x0EBF, 0x0ECB, + 0x0EB3, 0x0EB7, 0x0E9F, 0x0EA3, 0x0EA7, 0x0EAB, 0x02FD, 0x0306, 0x0309, 0x0300, + 0x0303, 0x02F1, 0x02F4, 0x02F7, 0x02FA, 0x02E5, 0x02E8, 0x02EB, 0x02EE, 0x02DC, + 0x02DF, 0x02E2, 0x0E96, 0x0E98, 0x0E93, 0x0EAF, 0x0EBB, 0x02A6, 0x0EC3, 0x02A9, + 0x02AC, 0x0EC7, 0x0ED3, 0x029D, 0x0EDB, 0x0ED7, 0x02A0, 0x02A3, 0x087E, 0x029A, + 0x0E9B, 0x02D6, 0x02B8, 0x02BB, 0x02BE, 0x02C1, 0x02AF, 0x02B2, 0x02B5, 0x0713, + 0x0717, 0x071B, 0x071F, 0x0703, 0x0EDF, 0x0707, 0x070B, 0x070F, 0x0753, 0x0757, + 0x075B, 0x075F, 0x0743, 0x0747, 0x074B, 0x074F, 0x058F, 0x057B, 0x110F, 0x0580, + 0x1113, 0x0585, 0x058A, 0x0576, 0x05CB, 0x05D0, 0x05D5, 0x05DA, 0x111B, 0x1143, + 0x1147, 0x05B7, 0x05BC, 0x114B, 0x05C1, 0x112F, 0x1133, 0x05C6, 0x1137, 0x0F3B, + 0x113B, 0x1117, 0x0F3F, 0x113F, 0x0F43, 0x0F47, 0x0F2B, 0x0F2F, 0x1123, 0x111F, + 0x114F, 0x1127, 0x1153, 0x0F33, 0x1157, 0x112B, 0x0F37, 0x0F1B, 0x0F1F, 0x0F23, + 0x0F27, 0x0F0B, 0x0F0F, 0x0F13, 0x0F17, 0x06BB, 0x06C0, 0x06C5, 0x06CA, 0x06A7, + 0x06AC, 0x06B1, 0x115B, 0x06B6, 0x115F, 0x0693, 0x1163, 0x0698, 0x1167, 0x069D, + 0x06A2, 0x067F, 0x0F4F, 0x0684, 0x0F57, 0x0689, 0x068E, 0x0EFB, 0x0EFF, 0x0F03, + 0x0F07, 0x0EEB, 0x0EEF, 0x0EF3, 0x0EE3, 0x0EE7, 0x06CF, 0x06D4, 0x06D9, 0x0F9F, + 0x0F97, 0x06DE, 0x0B52, 0x0B56, 0x0FA7, 0x0B4A, 0x0F8F, 0x0B4E, 0x0670, 0x067A, + 0x065C, 0x0666, 0x0044, 0x004A, 0x0038, 0x003E, 0x0FD7, 0x0FCF, 0x0089, 0x007D, + 0x0083, 0x0074, 0x0068, 0x006E, 0x0B32, 0x0B36, 0x0B2A, 0x0B2E, 0x0B22, 0x12CE, + 0x0B26, 0x0291, 0x028E, 0x12DE, 0x0294, 0x12D6, 0x0B1A, 0x0B1E, 0x0AD2, 0x0AD6, + 0x0ACA, 0x0ACE, 0x0AC2, 0x0AC6, 0x0297, 0x0ABA, 0x0F4B, 0x0ABE, 0x0F53, 0x0AF2, + 0x1021, 0x0AF6, 0x1024, 0x0AEA, 0x1027, 0x1019, 0x0F63, 0x0FB3, 0x0FBB, 0x02D3, + 0x02D0, 0x0FC3, 0x102A, 0x0F8B, 0x0F93, 0x102D, 0x0F9B, 0x1031, 0x0FA3, 0x0F5B, + 0x02C7, 0x0FAB, 0x02CD, 0x02CA, 0x02C4, 0x02D9, 0x0F73, 0x0F6B, 0x0FCB, 0x0F7B, + 0x0FD3, 0x100B, 0x0FDB, 0x0F83, 0x1007, 0x100E, 0x081F, 0x0847, 0x0829, 0x0851, + 0x1012, 0x0833, 0x1015, 0x083D, 0x086F, 0x1038, 0x0879, 0x0D1F, 0x0AEE, 0x0D17, + 0x0FE3, 0x0178, 0x0FEB, 0x085B, 0x0FF3, 0x10F3, 0x0FFB, 0x0865, 0x101D, 0x1035, + 0x08C3, 0x08CD, 0x08AF, 0x08B9, 0x10EB, 0x089B, 0x10EF, 0x08A5, 0x0887, 0x0891, + 0x0913, 0x091D, 0x08FF, 0x0909, 0x08EB, 0x08F5, 0x08D7, 0x08E1, 0x0CEB, 0x0148, + 0x0CEF, 0x0142, 0x0F67, 0x0CE7, 0x0145, 0x0FAF, 0x0F5F, 0x10E3, 0x00F4, 0x00F7, + 0x00EE, 0x00F1, 0x10F7, 0x0C6B, 0x00E8, 0x0C6F, 0x00EB, 0x0C63, 0x00E2, 0x0C67, + 0x103B, 0x104B, 0x103F, 0x104F, 0x00E5, 0x1043, 0x03C0, 0x1047, 0x105B, 0x03C6, + 0x105F, 0x03B4, 0x03BA, 0x0324, 0x0327, 0x03A8, 0x032A, 0x1053, 0x03AE, 0x032D, + 0x0330, 0x1057, 0x0336, 0x0333, 0x051C, 0x0339, 0x051F, 0x033F, 0x10BB, 0x0345, + 0x10BF, 0x034B, 0x050D, 0x0351, 0x050A, 0x0357, 0x10C3, 0x035D, 0x10C7, 0x0363, + 0x10CF, 0x0369, 0x0372, 0x036F, 0x036C, 0x0375, 0x037E, 0x037B, 0x039C, 0x0387, + 0x0381, 0x03A2, 0x0378, 0x038D, 0x0F77, 0x0393, 0x11A3, 0x0399, 0x11AB, 0x039F, + 0x10D3, 0x03A5, 0x10D7, 0x03AB, 0x10FB, 0x03B7, 0x11A7, 0x10FF, 0x03B1, 0x03BD, + 0x10CB, 0x03C3, 0x10DF, 0x10DB, 0x053D, 0x11BF, 0x0549, 0x046E, 0x054F, 0x10E7, + 0x09A2, 0x11B3, 0x110B, 0x11CF, 0x11AF, 0x11B7, 0x11BB, 0x11D7, 0x11E3, 0x0360, + 0x11E7, 0x03FC, 0x09B2, 0x09D2, 0x09BA, 0x09DA, 0x0BA3, 0x11EB, 0x0B9E, 0x11EF, + 0x0366, 0x11F3, 0x0354, 0x11F7, 0x0BBC, 0x035A, 0x0BC1, 0x0348, 0x0417, 0x034E, + 0x033C, 0x0342, 0x0BB2, 0x0BB7, 0x0390, 0x0396, 0x0384, 0x0411, 0x093E, 0x041A, + 0x0A42, 0x03C9, 0x0A4A, 0x03CC, 0x0A52, 0x03CF, 0x0A5A, 0x03D2, 0x038A, 0x03D5, + 0x0208, 0x03D8, 0x0489, 0x03DB, 0x01FC, 0x03DE, 0x03E7, 0x098A, 0x0982, 0x03E4, + 0x099A, 0x03E1, 0x0483, 0x03EA, 0x0516, 0x0519, 0x01C9, 0x03F0, 0x03ED, 0x03F3, + 0x09AA, 0x03F6, 0x0486, 0x1316, 0x042C, 0x125B, 0x0468, 0x125F, 0x0432, 0x01CC, + 0x0A02, 0x0A7A, 0x0A0A, 0x0A7E, 0x0A86, 0x0A82, 0x03FF, 0x0402, 0x0435, 0x0A8E, + 0x0A8A, 0x0438, 0x043B, 0x0A92, 0x043E, 0x0A96, 0x1262, 0x0A9A, 0x1266, 0x0A9E, + 0x0408, 0x0AA2, 0x1272, 0x0AA6, 0x0AAE, 0x0AAA, 0x03F9, 0x0420, 0x0426, 0x0AB2, + 0x041D, 0x0AB6, 0x09C2, 0x01C6, 0x09CA, 0x0444, 0x0423, 0x0447, 0x0A1A, 0x12B6, + 0x0405, 0x040B, 0x0F6F, 0x0A6E, 0x0F7F, 0x0A76, 0x0F87, 0x1322, 0x124B, 0x0ADA, + 0x124F, 0x0ADE, 0x0AE6, 0x0AE2, 0x126A, 0x044A, 0x0450, 0x0D37, 0x0453, 0x01BA, + 0x0456, 0x1253, 0x0459, 0x1257, 0x045C, 0x0AFA, 0x045F, 0x0AFE, 0x0462, 0x0B02, + 0x0B0A, 0x0B06, 0x0B0E, 0x0465, 0x046B, 0x04AA, 0x1276, 0x01BD, 0x127A, 0x0C16, + 0x126E, 0x0471, 0x0BCB, 0x0474, 0x0B12, 0x0477, 0x0B16, 0x047A, 0x127E, 0x047D, + 0x1282, 0x0480, 0x1286, 0x04A1, 0x128A, 0x04A4, 0x0B3E, 0x0B3A, 0x0414, 0x048C, + 0x0B46, 0x048F, 0x0B42, 0x0492, 0x0D9F, 0x0495, 0x01D8, 0x0498, 0x0199, 0x049B, + 0x019C, 0x049E, 0x0B62, 0x0B5A, 0x0E37, 0x0B5E, 0x044D, 0x04A7, 0x0193, 0x0B66, + 0x0522, 0x0B6A, 0x0528, 0x0B6E, 0x04AD, 0x0B72, 0x04B0, 0x0B76, 0x04E3, 0x0B7A, + 0x0534, 0x0B7E, 0x04B3, 0x0B82, 0x04B6, 0x0B86, 0x04BC, 0x0552, 0x0558, 0x0B8E, 0x055E, 0x0B8A, 0x0564, 0x052E, }; const uint8_t NU_TOLOWER_COMBINED[] = { diff --git a/vendor/nunicode/src/libnu/gen/_tounaccent.c b/vendor/nunicode/src/libnu/gen/_tounaccent.c index 8d6583e3d514..2e31fae6b697 100644 --- a/vendor/nunicode/src/libnu/gen/_tounaccent.c +++ b/vendor/nunicode/src/libnu/gen/_tounaccent.c @@ -10,275 +10,275 @@ #include const int16_t NU_TOUNACCENT_G[] = { - -845, -844, -843, -842, -841, -840, -839, -838, -837, -836, -834, -833, - -832, -831, -830, -829, -828, 0, -827, 0, -826, 0, -825, 0, - -824, -823, -822, -821, 0, 0, -820, -819, -818, -817, -816, -815, - 0, 0, -814, -813, -812, -811, -810, -809, -808, -807, -806, -805, - -804, -803, -802, -801, 0, 0, -800, -799, -798, -797, -796, -795, - -794, 1, 1, 1, -793, -792, 1, 1, 1, 1, 1, 1, - 1, -791, -790, 11, 2, 1, 1, 5, -789, -788, -787, 2, - -786, -785, -784, -783, 1, 30, 2, 32, 32, 2, 24, 18, - -782, -781, 48, 48, 52, 49, 20, 49, 1, 4, -780, 5, - 6, 10, 17, 30, 16, 66, -779, 68, 68, 65, 20, 69, - 65, 24, 65, 79, 65, -778, -777, -776, -775, -774, -773, -772, - -771, -770, -769, -768, -767, -766, -765, -764, -763, -762, -761, -760, - -759, -758, -757, -756, -755, -754, -753, -752, -751, -750, -749, -748, - -747, -746, -745, -744, -743, -742, -741, -740, -739, -738, -737, -736, - -735, -734, -733, -732, -731, -730, -729, -728, 0, 0, -727, -726, - 0, 0, 0, 0, -725, -724, -723, -722, -721, -720, -719, -718, - -717, -716, -715, -714, -713, -712, -711, -710, -709, -708, -707, -706, - -705, -704, -703, -702, -701, -700, -699, -698, -697, -696, -695, -694, - -693, -692, -691, -690, -689, -688, -687, -686, -685, -684, -683, -682, - -681, -680, -679, -678, -677, -676, -675, -674, -673, -672, -671, -670, - 1, 1, 4, 1, 1, 1, -669, -668, 1, 1, -667, -666, - 1, 1, 1, 1, 1, 1, 1, -665, -664, -663, -662, -661, - -660, -659, -658, -657, -656, 2, 21, -655, 9, 1, 1, 1, - -654, 16, 1, 1, 1, 5, 2, 1, 1, -653, -652, -651, - 1, 1, -650, -649, 2, 1, 4, 8, 1, 1, -648, -647, - 1, 6, 4, 18, -646, -645, -644, -643, -642, 10, 18, 16, - 9, 1, 1, 5, 9, -641, -640, -639, 88, -638, 88, 88, - 88, -637, -636, -635, 0, 0, 0, 0, 0, -634, -633, -632, - -631, -630, 0, 0, 0, -629, -628, 0, 0, 0, 64, -627, - -626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -625, -624, -623, -622, 0, -621, 0, -620, 6, - 11, 0, 0, 0, 0, -619, -618, 0, 0, -617, -616, -615, - 0, 0, 0, 0, 0, -614, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -613, 0, -612, 6, 0, 0, - 0, 0, -611, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -610, -609, -608, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -607, 0, -606, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -605, 0, -604, 0, 0, -603, 0, - 0, -602, 0, 0, 0, 0, 0, 0, 0, -601, -600, 0, - 0, -599, -598, 0, 0, -597, -596, 0, 0, 0, 0, 0, - -595, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, -593, - -592, -591, 0, 0, 0, 0, 0, 0, -590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -589, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -588, 2, -379, -336, -297, -295, -293, -290, -289, -277, 6, -152, - -148, -145, 1, -136, -132, 1, 1, 5, 5, 16, 16, 13, - 16, 1, 4, 2, 7, 8, 8, 20, 22, 1, 1, 1, - 1, -97, -73, -72, -58, -57, 32, 32, 37, -54, -53, -52, - -50, 8, -48, -47, 2, 2, 1, 9, 56, 1, 4, 2, - 14, 16, 16, -46, 1, 39, 71, 80, -41, 0, -39, -34, - 82, 84, 80, 80, 88, 96, 12, 12, 64, 64, 64, 68, - 73, 64, 66, 81, 85, 1, 2, 2, 5, 9, 1, -32, - -31, 17, 23, 17, 34, 30, 33, 35, -30, 27, 20, 24, - -29, 49, -28, 0, -27, 9, 15, 20, 181, 254, 253, 249, - 252, -26, -25, -24, -23, 2, 6, -22, 15, 224, 229, 259, - 261, -21, -20, -19, 258, 260, 262, 260, 265, 267, -18, -17, - 200, 256, 256, 280, 256, -16, 280, 280, 284, 5, 5, 1, - 5, -15, -14, 12, 12, -13, 18, 4, 42, -12, 0, -11, - -10, 33, 36, 32, 42, 41, 260, 44, 261, 38, 266, 73, - 268, 273, 257, 261, 286, 274, -9, 288, 261, 298, 256, 16, - 339, 336, -6, -4, 291, 338, 365, 365, 365, 330, 293, 295, + -845, -844, -843, -842, -841, -840, -839, -838, -837, -836, -834, -833, + -832, -831, -830, -829, -828, 0, -827, 0, -826, 0, -825, 0, + -824, -823, -822, -821, 0, 0, -820, -819, -818, -817, -816, -815, + 0, 0, -814, -813, -812, -811, -810, -809, -808, -807, -806, -805, + -804, -803, -802, -801, 0, 0, -800, -799, -798, -797, -796, -795, + -794, 1, 1, 1, -793, -792, 1, 1, 1, 1, 1, 1, + 1, -791, -790, 11, 2, 1, 1, 5, -789, -788, -787, 2, + -786, -785, -784, -783, 1, 30, 2, 32, 32, 2, 24, 18, + -782, -781, 48, 48, 52, 49, 20, 49, 1, 4, -780, 5, + 6, 10, 17, 30, 16, 66, -779, 68, 68, 65, 20, 69, + 65, 24, 65, 79, 65, -778, -777, -776, -775, -774, -773, -772, + -771, -770, -769, -768, -767, -766, -765, -764, -763, -762, -761, -760, + -759, -758, -757, -756, -755, -754, -753, -752, -751, -750, -749, -748, + -747, -746, -745, -744, -743, -742, -741, -740, -739, -738, -737, -736, + -735, -734, -733, -732, -731, -730, -729, -728, 0, 0, -727, -726, + 0, 0, 0, 0, -725, -724, -723, -722, -721, -720, -719, -718, + -717, -716, -715, -714, -713, -712, -711, -710, -709, -708, -707, -706, + -705, -704, -703, -702, -701, -700, -699, -698, -697, -696, -695, -694, + -693, -692, -691, -690, -689, -688, -687, -686, -685, -684, -683, -682, + -681, -680, -679, -678, -677, -676, -675, -674, -673, -672, -671, -670, + 1, 1, 4, 1, 1, 1, -669, -668, 1, 1, -667, -666, + 1, 1, 1, 1, 1, 1, 1, -665, -664, -663, -662, -661, + -660, -659, -658, -657, -656, 2, 21, -655, 9, 1, 1, 1, + -654, 16, 1, 1, 1, 5, 2, 1, 1, -653, -652, -651, + 1, 1, -650, -649, 2, 1, 4, 8, 1, 1, -648, -647, + 1, 6, 4, 18, -646, -645, -644, -643, -642, 10, 18, 16, + 9, 1, 1, 5, 9, -641, -640, -639, 88, -638, 88, 88, + 88, -637, -636, -635, 0, 0, 0, 0, 0, -634, -633, -632, + -631, -630, 0, 0, 0, -629, -628, 0, 0, 0, 64, -627, + -626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -625, -624, -623, -622, 0, -621, 0, -620, 6, + 11, 0, 0, 0, 0, -619, -618, 0, 0, -617, -616, -615, + 0, 0, 0, 0, 0, -614, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -613, 0, -612, 6, 0, 0, + 0, 0, -611, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -610, -609, -608, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -607, 0, -606, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -605, 0, -604, 0, 0, -603, 0, + 0, -602, 0, 0, 0, 0, 0, 0, 0, -601, -600, 0, + 0, -599, -598, 0, 0, -597, -596, 0, 0, 0, 0, 0, + -595, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, -593, + -592, -591, 0, 0, 0, 0, 0, 0, -590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -589, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -588, 2, -379, -336, -297, -295, -293, -290, -289, -277, 6, -152, + -148, -145, 1, -136, -132, 1, 1, 5, 5, 16, 16, 13, + 16, 1, 4, 2, 7, 8, 8, 20, 22, 1, 1, 1, + 1, -97, -73, -72, -58, -57, 32, 32, 37, -54, -53, -52, + -50, 8, -48, -47, 2, 2, 1, 9, 56, 1, 4, 2, + 14, 16, 16, -46, 1, 39, 71, 80, -41, 0, -39, -34, + 82, 84, 80, 80, 88, 96, 12, 12, 64, 64, 64, 68, + 73, 64, 66, 81, 85, 1, 2, 2, 5, 9, 1, -32, + -31, 17, 23, 17, 34, 30, 33, 35, -30, 27, 20, 24, + -29, 49, -28, 0, -27, 9, 15, 20, 181, 254, 253, 249, + 252, -26, -25, -24, -23, 2, 6, -22, 15, 224, 229, 259, + 261, -21, -20, -19, 258, 260, 262, 260, 265, 267, -18, -17, + 200, 256, 256, 280, 256, -16, 280, 280, 284, 5, 5, 1, + 5, -15, -14, 12, 12, -13, 18, 4, 42, -12, 0, -11, + -10, 33, 36, 32, 42, 41, 260, 44, 261, 38, 266, 73, + 268, 273, 257, 261, 286, 274, -9, 288, 261, 298, 256, 16, + 339, 336, -6, -4, 291, 338, 365, 365, 365, 330, 293, 295, 308, 335, -3, -2, -1, }; const size_t NU_TOUNACCENT_G_SIZE = sizeof(NU_TOUNACCENT_G) / sizeof(*NU_TOUNACCENT_G); /* codepoints */ const uint32_t NU_TOUNACCENT_VALUES_C[] = { - 0x001F24, 0x001F25, 0x001F26, 0x001F39, 0x000169, 0x001F3A, 0x00016B, 0x00016A, - 0x001F32, 0x001F1C, 0x001F1D, 0x000144, 0x001F1B, 0x000143, 0x00015C, 0x000154, - 0x001FE5, 0x001FE6, 0x00012A, 0x00012B, 0x000124, 0x000122, 0x00013D, 0x00013E, - 0x001FF2, 0x001FF3, 0x001FC4, 0x001FC6, 0x00010D, 0x000109, 0x000101, 0x000102, - 0x000125, 0x0001EA, 0x000168, 0x00016C, 0x00012D, 0x000126, 0x0001EB, 0x00012C, - 0x001FB8, 0x00012F, 0x00012E, 0x000129, 0x000128, 0x00022D, 0x001F89, 0x001F8A, - 0x000160, 0x001F84, 0x000161, 0x001F85, 0x001F86, 0x001F87, 0x000164, 0x000385, - 0x001F83, 0x001F9C, 0x000386, 0x000389, 0x000388, 0x00038F, 0x00038A, 0x00038E, - 0x00038C, 0x0003CE, 0x00015A, 0x00015B, 0x000390, 0x000159, 0x000165, 0x001F9D, - 0x001F9E, 0x00016E, 0x00016F, 0x001F0A, 0x001F04, 0x001F06, 0x000156, 0x001F08, - 0x000150, 0x001F21, 0x001F22, 0x001F0D, 0x0003AB, 0x000155, 0x00017C, 0x000157, - 0x0003AC, 0x00016D, 0x001F0E, 0x0003AD, 0x001F31, 0x001F0C, 0x00017E, 0x001F20, - 0x001F9F, 0x0003AF, 0x0003AE, 0x000163, 0x0003B0, 0x000174, 0x001F38, 0x000179, - 0x001F37, 0x001F0F, 0x000178, 0x0003AA, 0x001F33, 0x001E23, 0x001E22, 0x001E25, - 0x001E24, 0x001E27, 0x001E26, 0x001E29, 0x000171, 0x001E2B, 0x001E2A, 0x000173, - 0x00017D, 0x000175, 0x00017B, 0x001E68, 0x001E69, 0x000177, 0x001E6B, 0x00017A, - 0x001F30, 0x001F36, 0x001E6F, 0x0001D1, 0x001E38, 0x001E3B, 0x001E3A, 0x0001D2, - 0x001E39, 0x001E3F, 0x001E3E, 0x001E55, 0x001E40, 0x001E43, 0x001E41, 0x001E4C, - 0x00021F, 0x001E47, 0x001E42, 0x000218, 0x001E4D, 0x001E4B, 0x001E4A, 0x000219, - 0x001E4F, 0x001E5E, 0x001E4E, 0x001F3D, 0x001F3C, 0x001E5B, 0x001F3E, 0x001E56, - 0x0000E4, 0x0000E5, 0x0000ED, 0x001E59, 0x001E58, 0x0000E7, 0x001E5A, 0x001E5D, - 0x001E5C, 0x0000E8, 0x0000EB, 0x001E61, 0x0000E9, 0x0000EC, 0x001E62, 0x0000EE, - 0x001E60, 0x001E74, 0x001F34, 0x001F27, 0x001F23, 0x001E63, 0x001F3B, 0x001E7C, - 0x001F3F, 0x001E67, 0x001E7D, 0x001E76, 0x001E75, 0x001E73, 0x001E72, 0x001E7E, - 0x0000F4, 0x001E77, 0x0000C3, 0x0000C2, 0x0000C1, 0x0000F5, 0x0000F6, 0x0000C5, - 0x0000F9, 0x0000C8, 0x0000FB, 0x000419, 0x0000CE, 0x001E83, 0x001E81, 0x001E86, - 0x0000D1, 0x0000CF, 0x0000D3, 0x0000D2, 0x0000D5, 0x0000D4, 0x0000DD, 0x0000D6, - 0x0000D9, 0x0000D8, 0x0000DB, 0x0000DA, 0x001E94, 0x001E93, 0x0000DC, 0x001E95, - 0x001E97, 0x001E84, 0x001E96, 0x0000F1, 0x001E8D, 0x001E98, 0x001E90, 0x001E82, - 0x001E85, 0x0000E3, 0x0000F2, 0x001E80, 0x0000CC, 0x0000CD, 0x0000FA, 0x001EB5, - 0x0000E0, 0x0000F3, 0x001E87, 0x0000E2, 0x001EBD, 0x001EB4, 0x001EBB, 0x0000EF, - 0x0000FD, 0x0000F8, 0x0000FC, 0x0000FF, 0x001EB7, 0x001EB3, 0x0000EA, 0x0000E1, - 0x001EB0, 0x001EB2, 0x000103, 0x001E88, 0x001E89, 0x001EA2, 0x001E8F, 0x001EB6, - 0x001E8C, 0x000450, 0x001E8E, 0x000400, 0x000401, 0x002209, 0x000403, 0x000457, - 0x000107, 0x000100, 0x000407, 0x000108, 0x00021B, 0x00011C, 0x00010E, 0x000106, - 0x00011D, 0x000118, 0x000104, 0x00010F, 0x00011E, 0x00011F, 0x000112, 0x000113, - 0x000214, 0x000215, 0x000136, 0x000476, 0x000216, 0x000123, 0x000217, 0x000105, - 0x000210, 0x00010A, 0x00010B, 0x001EA1, 0x000439, 0x001EA3, 0x000121, 0x001FE2, - 0x001FE1, 0x001EA7, 0x001FE3, 0x001FE8, 0x001FE0, 0x001FEA, 0x001FEB, 0x001FE7, - 0x000137, 0x000130, 0x001EA0, 0x001FEC, 0x001FE9, 0x00010C, 0x00013C, 0x000176, - 0x001FED, 0x001FEE, 0x000146, 0x001EBA, 0x001EBC, 0x001FF9, 0x001EBF, 0x001EB8, - 0x001FF8, 0x001FFC, 0x001EBE, 0x00011A, 0x000119, 0x000141, 0x000142, 0x000211, - 0x000110, 0x000111, 0x000116, 0x001F1A, 0x000114, 0x000147, 0x000170, 0x000117, - 0x00015D, 0x00011B, 0x00015F, 0x001F11, 0x000115, 0x000158, 0x000172, 0x00015E, - 0x001F10, 0x001F13, 0x001F12, 0x001F14, 0x001F15, 0x00014C, 0x001FFB, 0x00014D, - 0x001F19, 0x000148, 0x001FFA, 0x00014F, 0x001F01, 0x001F03, 0x00014E, 0x000145, - 0x001F35, 0x001F02, 0x000162, 0x0004C1, 0x001F05, 0x001F00, 0x0004C2, 0x001FE4, - 0x001F0B, 0x001F07, 0x000212, 0x001FCC, 0x001FCF, 0x001F18, 0x001FCE, 0x001FCD, - 0x000135, 0x002281, 0x002285, 0x002284, 0x0004D0, 0x0004D3, 0x0004D2, 0x002288, - 0x0004D1, 0x0004D7, 0x0004D6, 0x001F09, 0x0001EC, 0x0004DB, 0x0004DA, 0x0004DD, - 0x0004DC, 0x0004DF, 0x0004DE, 0x002280, 0x0004E5, 0x0004E3, 0x0004E2, 0x002289, - 0x0004E7, 0x000151, 0x0004E6, 0x0004EE, 0x0004ED, 0x0004EB, 0x0004EA, 0x0004E4, - 0x0001E7, 0x0004EF, 0x0001A0, 0x0004F1, 0x0004F0, 0x0022AE, 0x0004F2, 0x0004F5, - 0x0004F4, 0x0001AF, 0x0022AD, 0x0022AC, 0x0004F8, 0x0004F3, 0x0004F9, 0x001F65, - 0x001F64, 0x0004EC, 0x001F66, 0x001F69, 0x001F68, 0x0001ED, 0x0001E6, 0x001F6D, - 0x001F6C, 0x001F6F, 0x001F6E, 0x0001E9, 0x0001E8, 0x0022AF, 0x0001EE, 0x0001EF, - 0x000120, 0x0001F9, 0x000127, 0x00013A, 0x0001D4, 0x000139, 0x00013B, 0x0001E0, - 0x001FC8, 0x0001D9, 0x000134, 0x0001DB, 0x001F95, 0x001F94, 0x001F8B, 0x001F8D, - 0x0001D5, 0x0001D0, 0x0001D3, 0x0001D6, 0x0001DC, 0x001F88, 0x0001D7, 0x0001DA, - 0x001F8F, 0x0001D8, 0x001F8E, 0x0001DF, 0x0001DE, 0x001F93, 0x001F91, 0x0022EA, - 0x0001E1, 0x001F92, 0x001F90, 0x001F99, 0x001F98, 0x001F9B, 0x001F9A, 0x001FBB, - 0x0001CD, 0x001F96, 0x001F97, 0x0022EB, 0x001F81, 0x001F82, 0x0001CE, 0x0001CF, - 0x001F80, 0x001FB6, 0x001FB7, 0x0001FA, 0x001FA5, 0x001FA6, 0x0001F4, 0x0001F5, - 0x0001F0, 0x0001F8, 0x0001FB, 0x0001FF, 0x0001FE, 0x001FB3, 0x001FB1, 0x001F8C, - 0x001FB4, 0x001FB2, 0x000203, 0x000202, 0x000201, 0x000200, 0x00020E, 0x00020F, - 0x000205, 0x001FB0, 0x00020B, 0x000209, 0x001FDF, 0x001FCB, 0x00020A, 0x000208, - 0x001FCA, 0x000213, 0x001FA7, 0x001FD9, 0x000204, 0x001FDB, 0x000206, 0x000207, - 0x001FDA, 0x00020D, 0x00020C, 0x001FD2, 0x00021A, 0x001FD3, 0x001FD1, 0x00021E, - 0x001FD0, 0x001FC2, 0x001FD6, 0x001FC3, 0x001FC1, 0x000227, 0x000228, 0x000226, - 0x001FC9, 0x001FD7, 0x00022B, 0x000229, 0x001FA8, 0x00022C, 0x00022A, 0x001FA4, - 0x000231, 0x000230, 0x000233, 0x000232, 0x001FB9, 0x001FAA, 0x001FAB, 0x001FAE, - 0x001FA9, 0x001FBC, 0x001FAF, 0x001FF6, 0x001FA1, 0x001FA2, 0x00022E, 0x00022F, - 0x001FF7, 0x001FC7, 0x001FA3, 0x001FA0, 0x001FAC, 0x001FD8, 0x001FF4, 0x001FAD, - 0x001FBA, 0x001FDD, 0x001FDE, 0x0001A1, 0x0001B0, 0x00212B, 0x00226D, 0x00226E, - 0x00226F, 0x002260, 0x002262, 0x002278, 0x002279, 0x002274, 0x002275, 0x002270, - 0x002271, 0x002249, 0x002244, 0x002247, 0x002241, 0x002224, 0x002226, 0x0021CD, - 0x0021CE, 0x0021CF, 0x00220C, 0x000477, 0x002204, 0x0021AE, 0x00045C, 0x00045D, - 0x00045E, 0x0022EC, 0x0022ED, 0x000451, 0x000453, 0x0022E0, 0x0022E1, 0x0022E2, - 0x0022E3, 0x0003CC, 0x0003CD, 0x0003CA, 0x0003CB, 0x00219A, 0x00219B, 0x00040C, - 0x00040D, 0x00040E, 0x001E6C, 0x001E6D, 0x001E6E, 0x001E6A, 0x001E64, 0x001E65, - 0x001E66, 0x001E7F, 0x001E78, 0x001E79, 0x001E7A, 0x001E7B, 0x001E70, 0x001E71, - 0x001E48, 0x001E49, 0x001E44, 0x001E45, 0x001E46, 0x001E5F, 0x001E54, 0x001E57, - 0x001E50, 0x001E51, 0x001E52, 0x001E53, 0x001E2C, 0x001E2D, 0x001E2E, 0x001E2F, - 0x001E28, 0x001E20, 0x001E21, 0x001E3C, 0x001E3D, 0x001E34, 0x001E35, 0x001E36, - 0x001E37, 0x001E30, 0x001E31, 0x001E32, 0x001E33, 0x001E0C, 0x001E0D, 0x001E0E, - 0x001E0F, 0x001E08, 0x001E09, 0x001E0A, 0x001E0B, 0x001E04, 0x001E05, 0x001E06, - 0x001E07, 0x001E00, 0x001E01, 0x001E02, 0x001E03, 0x001E1C, 0x001E1D, 0x001E1E, - 0x001E1F, 0x001E18, 0x001E19, 0x001E1A, 0x001E1B, 0x001E14, 0x001E15, 0x001E16, - 0x001E17, 0x001E10, 0x001E11, 0x001E12, 0x001E13, 0x001EEC, 0x001EED, 0x001EEE, - 0x001EEF, 0x001EE8, 0x001EE9, 0x001EEA, 0x001EEB, 0x001EE4, 0x001EE5, 0x001EE6, - 0x001EE7, 0x001EE0, 0x001EE1, 0x001EE2, 0x001EE3, 0x001EF8, 0x001EF9, 0x001EF4, - 0x001EF5, 0x001EF6, 0x001EF7, 0x001EF0, 0x001EF1, 0x001EF2, 0x001EF3, 0x001ECC, - 0x001ECD, 0x001ECE, 0x001ECF, 0x001EC8, 0x001EC9, 0x001ECA, 0x001ECB, 0x001EC4, - 0x001EC5, 0x001EC6, 0x001EC7, 0x001EC0, 0x001EC1, 0x001EC2, 0x001EC3, 0x001EDC, - 0x001EDD, 0x001EDE, 0x001EDF, 0x001ED8, 0x001ED9, 0x001EDA, 0x001EDB, 0x001ED4, - 0x001ED5, 0x001ED6, 0x001ED7, 0x001ED0, 0x001ED1, 0x001ED2, 0x001ED3, 0x001EAC, - 0x001EAD, 0x001EAE, 0x001EAF, 0x001EA8, 0x001EA9, 0x001EAA, 0x001EAB, 0x001EA4, - 0x001EA5, 0x001EA6, 0x001EB9, 0x001EB1, 0x001E8A, 0x001E8B, 0x0000C9, 0x0000CA, - 0x0000CB, 0x0000C4, 0x001E99, 0x0000C7, 0x0000C0, 0x001E91, 0x001E92, 0x001F6A, - 0x001F6B, 0x001F67, 0x001F60, 0x001F61, 0x001F62, 0x001F63, 0x001F7C, 0x001F7D, - 0x001F78, 0x001F79, 0x001F7A, 0x001F7B, 0x001F74, 0x001F75, 0x001F76, 0x001F77, - 0x001F70, 0x001F71, 0x001F72, 0x001F73, 0x001F4C, 0x001F4D, 0x001F48, 0x001F49, - 0x001F4A, 0x001F4B, 0x001F44, 0x001F45, 0x001F40, 0x001F41, 0x001F42, 0x001F43, - 0x001F5D, 0x001F5F, 0x001F59, 0x001F5B, 0x001F54, 0x001F55, 0x001F56, 0x001F57, - 0x001F50, 0x001F51, 0x002ADC, 0x001F52, 0x001F53, 0x001F2C, 0x001F2D, 0x001F2E, + 0x001F24, 0x001F25, 0x001F26, 0x001F39, 0x000169, 0x001F3A, 0x00016B, 0x00016A, + 0x001F32, 0x001F1C, 0x001F1D, 0x000144, 0x001F1B, 0x000143, 0x00015C, 0x000154, + 0x001FE5, 0x001FE6, 0x00012A, 0x00012B, 0x000124, 0x000122, 0x00013D, 0x00013E, + 0x001FF2, 0x001FF3, 0x001FC4, 0x001FC6, 0x00010D, 0x000109, 0x000101, 0x000102, + 0x000125, 0x0001EA, 0x000168, 0x00016C, 0x00012D, 0x000126, 0x0001EB, 0x00012C, + 0x001FB8, 0x00012F, 0x00012E, 0x000129, 0x000128, 0x00022D, 0x001F89, 0x001F8A, + 0x000160, 0x001F84, 0x000161, 0x001F85, 0x001F86, 0x001F87, 0x000164, 0x000385, + 0x001F83, 0x001F9C, 0x000386, 0x000389, 0x000388, 0x00038F, 0x00038A, 0x00038E, + 0x00038C, 0x0003CE, 0x00015A, 0x00015B, 0x000390, 0x000159, 0x000165, 0x001F9D, + 0x001F9E, 0x00016E, 0x00016F, 0x001F0A, 0x001F04, 0x001F06, 0x000156, 0x001F08, + 0x000150, 0x001F21, 0x001F22, 0x001F0D, 0x0003AB, 0x000155, 0x00017C, 0x000157, + 0x0003AC, 0x00016D, 0x001F0E, 0x0003AD, 0x001F31, 0x001F0C, 0x00017E, 0x001F20, + 0x001F9F, 0x0003AF, 0x0003AE, 0x000163, 0x0003B0, 0x000174, 0x001F38, 0x000179, + 0x001F37, 0x001F0F, 0x000178, 0x0003AA, 0x001F33, 0x001E23, 0x001E22, 0x001E25, + 0x001E24, 0x001E27, 0x001E26, 0x001E29, 0x000171, 0x001E2B, 0x001E2A, 0x000173, + 0x00017D, 0x000175, 0x00017B, 0x001E68, 0x001E69, 0x000177, 0x001E6B, 0x00017A, + 0x001F30, 0x001F36, 0x001E6F, 0x0001D1, 0x001E38, 0x001E3B, 0x001E3A, 0x0001D2, + 0x001E39, 0x001E3F, 0x001E3E, 0x001E55, 0x001E40, 0x001E43, 0x001E41, 0x001E4C, + 0x00021F, 0x001E47, 0x001E42, 0x000218, 0x001E4D, 0x001E4B, 0x001E4A, 0x000219, + 0x001E4F, 0x001E5E, 0x001E4E, 0x001F3D, 0x001F3C, 0x001E5B, 0x001F3E, 0x001E56, + 0x0000E4, 0x0000E5, 0x0000ED, 0x001E59, 0x001E58, 0x0000E7, 0x001E5A, 0x001E5D, + 0x001E5C, 0x0000E8, 0x0000EB, 0x001E61, 0x0000E9, 0x0000EC, 0x001E62, 0x0000EE, + 0x001E60, 0x001E74, 0x001F34, 0x001F27, 0x001F23, 0x001E63, 0x001F3B, 0x001E7C, + 0x001F3F, 0x001E67, 0x001E7D, 0x001E76, 0x001E75, 0x001E73, 0x001E72, 0x001E7E, + 0x0000F4, 0x001E77, 0x0000C3, 0x0000C2, 0x0000C1, 0x0000F5, 0x0000F6, 0x0000C5, + 0x0000F9, 0x0000C8, 0x0000FB, 0x000419, 0x0000CE, 0x001E83, 0x001E81, 0x001E86, + 0x0000D1, 0x0000CF, 0x0000D3, 0x0000D2, 0x0000D5, 0x0000D4, 0x0000DD, 0x0000D6, + 0x0000D9, 0x0000D8, 0x0000DB, 0x0000DA, 0x001E94, 0x001E93, 0x0000DC, 0x001E95, + 0x001E97, 0x001E84, 0x001E96, 0x0000F1, 0x001E8D, 0x001E98, 0x001E90, 0x001E82, + 0x001E85, 0x0000E3, 0x0000F2, 0x001E80, 0x0000CC, 0x0000CD, 0x0000FA, 0x001EB5, + 0x0000E0, 0x0000F3, 0x001E87, 0x0000E2, 0x001EBD, 0x001EB4, 0x001EBB, 0x0000EF, + 0x0000FD, 0x0000F8, 0x0000FC, 0x0000FF, 0x001EB7, 0x001EB3, 0x0000EA, 0x0000E1, + 0x001EB0, 0x001EB2, 0x000103, 0x001E88, 0x001E89, 0x001EA2, 0x001E8F, 0x001EB6, + 0x001E8C, 0x000450, 0x001E8E, 0x000400, 0x000401, 0x002209, 0x000403, 0x000457, + 0x000107, 0x000100, 0x000407, 0x000108, 0x00021B, 0x00011C, 0x00010E, 0x000106, + 0x00011D, 0x000118, 0x000104, 0x00010F, 0x00011E, 0x00011F, 0x000112, 0x000113, + 0x000214, 0x000215, 0x000136, 0x000476, 0x000216, 0x000123, 0x000217, 0x000105, + 0x000210, 0x00010A, 0x00010B, 0x001EA1, 0x000439, 0x001EA3, 0x000121, 0x001FE2, + 0x001FE1, 0x001EA7, 0x001FE3, 0x001FE8, 0x001FE0, 0x001FEA, 0x001FEB, 0x001FE7, + 0x000137, 0x000130, 0x001EA0, 0x001FEC, 0x001FE9, 0x00010C, 0x00013C, 0x000176, + 0x001FED, 0x001FEE, 0x000146, 0x001EBA, 0x001EBC, 0x001FF9, 0x001EBF, 0x001EB8, + 0x001FF8, 0x001FFC, 0x001EBE, 0x00011A, 0x000119, 0x000141, 0x000142, 0x000211, + 0x000110, 0x000111, 0x000116, 0x001F1A, 0x000114, 0x000147, 0x000170, 0x000117, + 0x00015D, 0x00011B, 0x00015F, 0x001F11, 0x000115, 0x000158, 0x000172, 0x00015E, + 0x001F10, 0x001F13, 0x001F12, 0x001F14, 0x001F15, 0x00014C, 0x001FFB, 0x00014D, + 0x001F19, 0x000148, 0x001FFA, 0x00014F, 0x001F01, 0x001F03, 0x00014E, 0x000145, + 0x001F35, 0x001F02, 0x000162, 0x0004C1, 0x001F05, 0x001F00, 0x0004C2, 0x001FE4, + 0x001F0B, 0x001F07, 0x000212, 0x001FCC, 0x001FCF, 0x001F18, 0x001FCE, 0x001FCD, + 0x000135, 0x002281, 0x002285, 0x002284, 0x0004D0, 0x0004D3, 0x0004D2, 0x002288, + 0x0004D1, 0x0004D7, 0x0004D6, 0x001F09, 0x0001EC, 0x0004DB, 0x0004DA, 0x0004DD, + 0x0004DC, 0x0004DF, 0x0004DE, 0x002280, 0x0004E5, 0x0004E3, 0x0004E2, 0x002289, + 0x0004E7, 0x000151, 0x0004E6, 0x0004EE, 0x0004ED, 0x0004EB, 0x0004EA, 0x0004E4, + 0x0001E7, 0x0004EF, 0x0001A0, 0x0004F1, 0x0004F0, 0x0022AE, 0x0004F2, 0x0004F5, + 0x0004F4, 0x0001AF, 0x0022AD, 0x0022AC, 0x0004F8, 0x0004F3, 0x0004F9, 0x001F65, + 0x001F64, 0x0004EC, 0x001F66, 0x001F69, 0x001F68, 0x0001ED, 0x0001E6, 0x001F6D, + 0x001F6C, 0x001F6F, 0x001F6E, 0x0001E9, 0x0001E8, 0x0022AF, 0x0001EE, 0x0001EF, + 0x000120, 0x0001F9, 0x000127, 0x00013A, 0x0001D4, 0x000139, 0x00013B, 0x0001E0, + 0x001FC8, 0x0001D9, 0x000134, 0x0001DB, 0x001F95, 0x001F94, 0x001F8B, 0x001F8D, + 0x0001D5, 0x0001D0, 0x0001D3, 0x0001D6, 0x0001DC, 0x001F88, 0x0001D7, 0x0001DA, + 0x001F8F, 0x0001D8, 0x001F8E, 0x0001DF, 0x0001DE, 0x001F93, 0x001F91, 0x0022EA, + 0x0001E1, 0x001F92, 0x001F90, 0x001F99, 0x001F98, 0x001F9B, 0x001F9A, 0x001FBB, + 0x0001CD, 0x001F96, 0x001F97, 0x0022EB, 0x001F81, 0x001F82, 0x0001CE, 0x0001CF, + 0x001F80, 0x001FB6, 0x001FB7, 0x0001FA, 0x001FA5, 0x001FA6, 0x0001F4, 0x0001F5, + 0x0001F0, 0x0001F8, 0x0001FB, 0x0001FF, 0x0001FE, 0x001FB3, 0x001FB1, 0x001F8C, + 0x001FB4, 0x001FB2, 0x000203, 0x000202, 0x000201, 0x000200, 0x00020E, 0x00020F, + 0x000205, 0x001FB0, 0x00020B, 0x000209, 0x001FDF, 0x001FCB, 0x00020A, 0x000208, + 0x001FCA, 0x000213, 0x001FA7, 0x001FD9, 0x000204, 0x001FDB, 0x000206, 0x000207, + 0x001FDA, 0x00020D, 0x00020C, 0x001FD2, 0x00021A, 0x001FD3, 0x001FD1, 0x00021E, + 0x001FD0, 0x001FC2, 0x001FD6, 0x001FC3, 0x001FC1, 0x000227, 0x000228, 0x000226, + 0x001FC9, 0x001FD7, 0x00022B, 0x000229, 0x001FA8, 0x00022C, 0x00022A, 0x001FA4, + 0x000231, 0x000230, 0x000233, 0x000232, 0x001FB9, 0x001FAA, 0x001FAB, 0x001FAE, + 0x001FA9, 0x001FBC, 0x001FAF, 0x001FF6, 0x001FA1, 0x001FA2, 0x00022E, 0x00022F, + 0x001FF7, 0x001FC7, 0x001FA3, 0x001FA0, 0x001FAC, 0x001FD8, 0x001FF4, 0x001FAD, + 0x001FBA, 0x001FDD, 0x001FDE, 0x0001A1, 0x0001B0, 0x00212B, 0x00226D, 0x00226E, + 0x00226F, 0x002260, 0x002262, 0x002278, 0x002279, 0x002274, 0x002275, 0x002270, + 0x002271, 0x002249, 0x002244, 0x002247, 0x002241, 0x002224, 0x002226, 0x0021CD, + 0x0021CE, 0x0021CF, 0x00220C, 0x000477, 0x002204, 0x0021AE, 0x00045C, 0x00045D, + 0x00045E, 0x0022EC, 0x0022ED, 0x000451, 0x000453, 0x0022E0, 0x0022E1, 0x0022E2, + 0x0022E3, 0x0003CC, 0x0003CD, 0x0003CA, 0x0003CB, 0x00219A, 0x00219B, 0x00040C, + 0x00040D, 0x00040E, 0x001E6C, 0x001E6D, 0x001E6E, 0x001E6A, 0x001E64, 0x001E65, + 0x001E66, 0x001E7F, 0x001E78, 0x001E79, 0x001E7A, 0x001E7B, 0x001E70, 0x001E71, + 0x001E48, 0x001E49, 0x001E44, 0x001E45, 0x001E46, 0x001E5F, 0x001E54, 0x001E57, + 0x001E50, 0x001E51, 0x001E52, 0x001E53, 0x001E2C, 0x001E2D, 0x001E2E, 0x001E2F, + 0x001E28, 0x001E20, 0x001E21, 0x001E3C, 0x001E3D, 0x001E34, 0x001E35, 0x001E36, + 0x001E37, 0x001E30, 0x001E31, 0x001E32, 0x001E33, 0x001E0C, 0x001E0D, 0x001E0E, + 0x001E0F, 0x001E08, 0x001E09, 0x001E0A, 0x001E0B, 0x001E04, 0x001E05, 0x001E06, + 0x001E07, 0x001E00, 0x001E01, 0x001E02, 0x001E03, 0x001E1C, 0x001E1D, 0x001E1E, + 0x001E1F, 0x001E18, 0x001E19, 0x001E1A, 0x001E1B, 0x001E14, 0x001E15, 0x001E16, + 0x001E17, 0x001E10, 0x001E11, 0x001E12, 0x001E13, 0x001EEC, 0x001EED, 0x001EEE, + 0x001EEF, 0x001EE8, 0x001EE9, 0x001EEA, 0x001EEB, 0x001EE4, 0x001EE5, 0x001EE6, + 0x001EE7, 0x001EE0, 0x001EE1, 0x001EE2, 0x001EE3, 0x001EF8, 0x001EF9, 0x001EF4, + 0x001EF5, 0x001EF6, 0x001EF7, 0x001EF0, 0x001EF1, 0x001EF2, 0x001EF3, 0x001ECC, + 0x001ECD, 0x001ECE, 0x001ECF, 0x001EC8, 0x001EC9, 0x001ECA, 0x001ECB, 0x001EC4, + 0x001EC5, 0x001EC6, 0x001EC7, 0x001EC0, 0x001EC1, 0x001EC2, 0x001EC3, 0x001EDC, + 0x001EDD, 0x001EDE, 0x001EDF, 0x001ED8, 0x001ED9, 0x001EDA, 0x001EDB, 0x001ED4, + 0x001ED5, 0x001ED6, 0x001ED7, 0x001ED0, 0x001ED1, 0x001ED2, 0x001ED3, 0x001EAC, + 0x001EAD, 0x001EAE, 0x001EAF, 0x001EA8, 0x001EA9, 0x001EAA, 0x001EAB, 0x001EA4, + 0x001EA5, 0x001EA6, 0x001EB9, 0x001EB1, 0x001E8A, 0x001E8B, 0x0000C9, 0x0000CA, + 0x0000CB, 0x0000C4, 0x001E99, 0x0000C7, 0x0000C0, 0x001E91, 0x001E92, 0x001F6A, + 0x001F6B, 0x001F67, 0x001F60, 0x001F61, 0x001F62, 0x001F63, 0x001F7C, 0x001F7D, + 0x001F78, 0x001F79, 0x001F7A, 0x001F7B, 0x001F74, 0x001F75, 0x001F76, 0x001F77, + 0x001F70, 0x001F71, 0x001F72, 0x001F73, 0x001F4C, 0x001F4D, 0x001F48, 0x001F49, + 0x001F4A, 0x001F4B, 0x001F44, 0x001F45, 0x001F40, 0x001F41, 0x001F42, 0x001F43, + 0x001F5D, 0x001F5F, 0x001F59, 0x001F5B, 0x001F54, 0x001F55, 0x001F56, 0x001F57, + 0x001F50, 0x001F51, 0x002ADC, 0x001F52, 0x001F53, 0x001F2C, 0x001F2D, 0x001F2E, 0x001F2F, 0x001F28, 0x001F29, 0x001F2A, 0x001F2B, }; /* indexes */ const uint16_t NU_TOUNACCENT_VALUES_I[] = { - 0x0526, 0x0529, 0x052C, 0x0565, 0x0127, 0x0568, 0x012B, 0x0129, 0x0550, 0x0514, - 0x0517, 0x00EB, 0x0511, 0x00E9, 0x0111, 0x0101, 0x0736, 0x0739, 0x00C3, 0x00C5, - 0x00B7, 0x00B3, 0x00E1, 0x00E3, 0x0754, 0x0757, 0x06D9, 0x06DC, 0x0089, 0x0081, - 0x0071, 0x0073, 0x00B9, 0x018B, 0x0125, 0x012D, 0x00C9, 0x00BB, 0x018D, 0x00C7, - 0x06C1, 0x00CD, 0x00CB, 0x00C1, 0x00BF, 0x01F5, 0x0637, 0x063A, 0x0119, 0x0628, - 0x011B, 0x062B, 0x062E, 0x0631, 0x0121, 0x0203, 0x0625, 0x0670, 0x0206, 0x020C, - 0x0209, 0x0218, 0x020F, 0x0215, 0x0212, 0x023F, 0x010D, 0x010F, 0x021B, 0x010B, - 0x0123, 0x0673, 0x0676, 0x0131, 0x0133, 0x04E4, 0x04D2, 0x04D8, 0x0105, 0x04DE, - 0x00FD, 0x051D, 0x0520, 0x04ED, 0x0221, 0x0103, 0x014D, 0x0107, 0x0224, 0x012F, - 0x04F0, 0x0227, 0x054D, 0x04EA, 0x0151, 0x051A, 0x0679, 0x022D, 0x022A, 0x011F, - 0x0230, 0x013D, 0x0562, 0x0147, 0x055F, 0x04F3, 0x0145, 0x021E, 0x0553, 0x0324, - 0x0322, 0x0328, 0x0326, 0x032C, 0x032A, 0x0330, 0x0137, 0x0334, 0x0332, 0x013B, - 0x014F, 0x013F, 0x014B, 0x03AE, 0x03B0, 0x0143, 0x03B4, 0x0149, 0x054A, 0x055C, - 0x03BC, 0x0163, 0x034E, 0x0354, 0x0352, 0x0165, 0x0350, 0x035C, 0x035A, 0x0388, - 0x035E, 0x0364, 0x0360, 0x0376, 0x01E5, 0x036C, 0x0362, 0x01DB, 0x0378, 0x0374, - 0x0372, 0x01DD, 0x037C, 0x039A, 0x037A, 0x0571, 0x056E, 0x0394, 0x0574, 0x038A, - 0x003F, 0x0041, 0x004F, 0x0390, 0x038E, 0x0043, 0x0392, 0x0398, 0x0396, 0x0045, - 0x004B, 0x03A0, 0x0047, 0x004D, 0x03A2, 0x0051, 0x039E, 0x03C6, 0x0556, 0x052F, - 0x0523, 0x03A4, 0x056B, 0x03D6, 0x0577, 0x03AC, 0x03D8, 0x03CA, 0x03C8, 0x03C4, - 0x03C2, 0x03DA, 0x005B, 0x03CC, 0x0007, 0x0005, 0x0003, 0x005D, 0x005F, 0x000B, - 0x0063, 0x000F, 0x0067, 0x0257, 0x001B, 0x03E4, 0x03E0, 0x03EA, 0x001F, 0x001D, - 0x0023, 0x0021, 0x0027, 0x0025, 0x0035, 0x0029, 0x002D, 0x002B, 0x0031, 0x002F, - 0x0406, 0x0404, 0x0033, 0x0408, 0x040C, 0x03E6, 0x040A, 0x0055, 0x03F8, 0x040E, - 0x03FE, 0x03E2, 0x03E8, 0x003D, 0x0057, 0x03DE, 0x0017, 0x0019, 0x0065, 0x043C, - 0x0037, 0x0059, 0x03EC, 0x003B, 0x044C, 0x043A, 0x0448, 0x0053, 0x006B, 0x0061, - 0x0069, 0x006D, 0x0440, 0x0438, 0x0049, 0x0039, 0x0432, 0x0436, 0x0075, 0x03EE, - 0x03F0, 0x0416, 0x03FC, 0x043E, 0x03F6, 0x025D, 0x03FA, 0x0242, 0x0245, 0x0790, - 0x0248, 0x0266, 0x007D, 0x006F, 0x024B, 0x007F, 0x01E1, 0x00A7, 0x008B, 0x007B, - 0x00A9, 0x009F, 0x0077, 0x008D, 0x00AB, 0x00AD, 0x0093, 0x0095, 0x01D3, 0x01D5, - 0x00D5, 0x0272, 0x01D7, 0x00B5, 0x01D9, 0x0079, 0x01CB, 0x0083, 0x0085, 0x0414, - 0x025A, 0x0418, 0x00B1, 0x072D, 0x072A, 0x0420, 0x0730, 0x073F, 0x0727, 0x0745, - 0x0748, 0x073C, 0x00D7, 0x00CF, 0x0412, 0x074B, 0x0742, 0x0087, 0x00DF, 0x0141, - 0x074E, 0x0751, 0x00EF, 0x0446, 0x044A, 0x0766, 0x0450, 0x0442, 0x0763, 0x076F, - 0x044E, 0x00A3, 0x00A1, 0x00E5, 0x00E7, 0x01CD, 0x008F, 0x0091, 0x009B, 0x050E, - 0x0097, 0x00F1, 0x0135, 0x009D, 0x0113, 0x00A5, 0x0117, 0x04F9, 0x0099, 0x0109, - 0x0139, 0x0115, 0x04F6, 0x04FF, 0x04FC, 0x0502, 0x0505, 0x00F5, 0x076C, 0x00F7, - 0x050B, 0x00F3, 0x0769, 0x00FB, 0x04C9, 0x04CF, 0x00F9, 0x00ED, 0x0559, 0x04CC, - 0x011D, 0x0278, 0x04D5, 0x04C6, 0x027B, 0x0733, 0x04E7, 0x04DB, 0x01CF, 0x06EE, - 0x06F9, 0x0508, 0x06F5, 0x06F1, 0x00D3, 0x07DA, 0x07E2, 0x07DE, 0x027E, 0x0287, - 0x0284, 0x07E6, 0x0281, 0x028D, 0x028A, 0x04E1, 0x018F, 0x0293, 0x0290, 0x0299, - 0x0296, 0x029F, 0x029C, 0x07D6, 0x02AB, 0x02A5, 0x02A2, 0x07EA, 0x02B1, 0x00FF, - 0x02AE, 0x02C0, 0x02BD, 0x02B7, 0x02B4, 0x02A8, 0x0185, 0x02C3, 0x0153, 0x02C9, - 0x02C6, 0x07F6, 0x02CC, 0x02D5, 0x02D2, 0x0157, 0x07F2, 0x07EE, 0x02D8, 0x02CF, - 0x02DB, 0x05D1, 0x05CE, 0x02BA, 0x05D4, 0x05DD, 0x05DA, 0x0191, 0x0183, 0x05E9, - 0x05E6, 0x05EF, 0x05EC, 0x0189, 0x0187, 0x07FA, 0x0193, 0x0196, 0x00AF, 0x01A1, - 0x00BD, 0x00DB, 0x0169, 0x00D9, 0x00DD, 0x017F, 0x06E2, 0x0173, 0x00D1, 0x0177, - 0x065B, 0x0658, 0x063D, 0x0643, 0x016B, 0x0161, 0x0167, 0x016D, 0x0179, 0x0634, - 0x016F, 0x0175, 0x0649, 0x0171, 0x0646, 0x017D, 0x017B, 0x0655, 0x064F, 0x080E, - 0x0181, 0x0652, 0x064C, 0x0667, 0x0664, 0x066D, 0x066A, 0x06CA, 0x015B, 0x065E, - 0x0661, 0x0812, 0x061F, 0x0622, 0x015D, 0x015F, 0x061C, 0x06BB, 0x06BE, 0x01A3, - 0x068B, 0x068E, 0x019B, 0x019D, 0x0199, 0x019F, 0x01A5, 0x01A9, 0x01A7, 0x06B5, - 0x06AF, 0x0640, 0x06B8, 0x06B2, 0x01B1, 0x01AF, 0x01AD, 0x01AB, 0x01C7, 0x01C9, - 0x01B5, 0x06AC, 0x01C1, 0x01BD, 0x0723, 0x06EB, 0x01BF, 0x01BB, 0x06E8, 0x01D1, - 0x0691, 0x0712, 0x01B3, 0x0718, 0x01B7, 0x01B9, 0x0715, 0x01C5, 0x01C3, 0x0703, - 0x01DF, 0x0706, 0x0700, 0x01E3, 0x06FD, 0x06D3, 0x0709, 0x06D6, 0x06D0, 0x01E9, - 0x01EB, 0x01E7, 0x06E5, 0x070C, 0x01F1, 0x01ED, 0x0694, 0x01F3, 0x01EF, 0x0688, - 0x01FD, 0x01FB, 0x0201, 0x01FF, 0x06C4, 0x069A, 0x069D, 0x06A6, 0x0697, 0x06CD, - 0x06A9, 0x075D, 0x067F, 0x0682, 0x01F7, 0x01F9, 0x0760, 0x06DF, 0x0685, 0x067C, - 0x06A0, 0x070F, 0x075A, 0x06A3, 0x06C7, 0x071B, 0x071F, 0x0155, 0x0159, 0x0772, - 0x07B6, 0x07BA, 0x07BC, 0x07B0, 0x07B2, 0x07CE, 0x07D2, 0x07C6, 0x07CA, 0x07BE, - 0x07C2, 0x07AC, 0x07A4, 0x07A8, 0x07A0, 0x0798, 0x079C, 0x0780, 0x0784, 0x0788, - 0x0794, 0x0275, 0x078C, 0x077C, 0x0269, 0x026C, 0x026F, 0x0816, 0x081A, 0x0260, - 0x0263, 0x07FE, 0x0802, 0x0806, 0x080A, 0x0239, 0x023C, 0x0233, 0x0236, 0x0774, - 0x0778, 0x024E, 0x0251, 0x0254, 0x03B6, 0x03B8, 0x03BA, 0x03B2, 0x03A6, 0x03A8, - 0x03AA, 0x03DC, 0x03CE, 0x03D0, 0x03D2, 0x03D4, 0x03BE, 0x03C0, 0x036E, 0x0370, - 0x0366, 0x0368, 0x036A, 0x039C, 0x0386, 0x038C, 0x037E, 0x0380, 0x0382, 0x0384, - 0x0336, 0x0338, 0x033A, 0x033C, 0x032E, 0x031E, 0x0320, 0x0356, 0x0358, 0x0346, - 0x0348, 0x034A, 0x034C, 0x033E, 0x0340, 0x0342, 0x0344, 0x02F6, 0x02F8, 0x02FA, - 0x02FC, 0x02EE, 0x02F0, 0x02F2, 0x02F4, 0x02E6, 0x02E8, 0x02EA, 0x02EC, 0x02DE, - 0x02E0, 0x02E2, 0x02E4, 0x0316, 0x0318, 0x031A, 0x031C, 0x030E, 0x0310, 0x0312, - 0x0314, 0x0306, 0x0308, 0x030A, 0x030C, 0x02FE, 0x0300, 0x0302, 0x0304, 0x04AA, - 0x04AC, 0x04AE, 0x04B0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x049A, 0x049C, 0x049E, - 0x04A0, 0x0492, 0x0494, 0x0496, 0x0498, 0x04C2, 0x04C4, 0x04BA, 0x04BC, 0x04BE, - 0x04C0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x046A, 0x046C, 0x046E, 0x0470, 0x0462, - 0x0464, 0x0466, 0x0468, 0x045A, 0x045C, 0x045E, 0x0460, 0x0452, 0x0454, 0x0456, - 0x0458, 0x048A, 0x048C, 0x048E, 0x0490, 0x0482, 0x0484, 0x0486, 0x0488, 0x047A, - 0x047C, 0x047E, 0x0480, 0x0472, 0x0474, 0x0476, 0x0478, 0x042A, 0x042C, 0x042E, - 0x0430, 0x0422, 0x0424, 0x0426, 0x0428, 0x041A, 0x041C, 0x041E, 0x0444, 0x0434, - 0x03F2, 0x03F4, 0x0011, 0x0013, 0x0015, 0x0009, 0x0410, 0x000D, 0x0001, 0x0400, - 0x0402, 0x05E0, 0x05E3, 0x05D7, 0x05C2, 0x05C5, 0x05C8, 0x05CB, 0x0616, 0x0619, - 0x060A, 0x060D, 0x0610, 0x0613, 0x05FE, 0x0601, 0x0604, 0x0607, 0x05F2, 0x05F5, - 0x05F8, 0x05FB, 0x0598, 0x059B, 0x058C, 0x058F, 0x0592, 0x0595, 0x0586, 0x0589, - 0x057A, 0x057D, 0x0580, 0x0583, 0x05BC, 0x05BF, 0x05B6, 0x05B9, 0x05AA, 0x05AD, - 0x05B0, 0x05B3, 0x059E, 0x05A1, 0x081E, 0x05A4, 0x05A7, 0x053E, 0x0541, 0x0544, + 0x0526, 0x0529, 0x052C, 0x0565, 0x0127, 0x0568, 0x012B, 0x0129, 0x0550, 0x0514, + 0x0517, 0x00EB, 0x0511, 0x00E9, 0x0111, 0x0101, 0x0736, 0x0739, 0x00C3, 0x00C5, + 0x00B7, 0x00B3, 0x00E1, 0x00E3, 0x0754, 0x0757, 0x06D9, 0x06DC, 0x0089, 0x0081, + 0x0071, 0x0073, 0x00B9, 0x018B, 0x0125, 0x012D, 0x00C9, 0x00BB, 0x018D, 0x00C7, + 0x06C1, 0x00CD, 0x00CB, 0x00C1, 0x00BF, 0x01F5, 0x0637, 0x063A, 0x0119, 0x0628, + 0x011B, 0x062B, 0x062E, 0x0631, 0x0121, 0x0203, 0x0625, 0x0670, 0x0206, 0x020C, + 0x0209, 0x0218, 0x020F, 0x0215, 0x0212, 0x023F, 0x010D, 0x010F, 0x021B, 0x010B, + 0x0123, 0x0673, 0x0676, 0x0131, 0x0133, 0x04E4, 0x04D2, 0x04D8, 0x0105, 0x04DE, + 0x00FD, 0x051D, 0x0520, 0x04ED, 0x0221, 0x0103, 0x014D, 0x0107, 0x0224, 0x012F, + 0x04F0, 0x0227, 0x054D, 0x04EA, 0x0151, 0x051A, 0x0679, 0x022D, 0x022A, 0x011F, + 0x0230, 0x013D, 0x0562, 0x0147, 0x055F, 0x04F3, 0x0145, 0x021E, 0x0553, 0x0324, + 0x0322, 0x0328, 0x0326, 0x032C, 0x032A, 0x0330, 0x0137, 0x0334, 0x0332, 0x013B, + 0x014F, 0x013F, 0x014B, 0x03AE, 0x03B0, 0x0143, 0x03B4, 0x0149, 0x054A, 0x055C, + 0x03BC, 0x0163, 0x034E, 0x0354, 0x0352, 0x0165, 0x0350, 0x035C, 0x035A, 0x0388, + 0x035E, 0x0364, 0x0360, 0x0376, 0x01E5, 0x036C, 0x0362, 0x01DB, 0x0378, 0x0374, + 0x0372, 0x01DD, 0x037C, 0x039A, 0x037A, 0x0571, 0x056E, 0x0394, 0x0574, 0x038A, + 0x003F, 0x0041, 0x004F, 0x0390, 0x038E, 0x0043, 0x0392, 0x0398, 0x0396, 0x0045, + 0x004B, 0x03A0, 0x0047, 0x004D, 0x03A2, 0x0051, 0x039E, 0x03C6, 0x0556, 0x052F, + 0x0523, 0x03A4, 0x056B, 0x03D6, 0x0577, 0x03AC, 0x03D8, 0x03CA, 0x03C8, 0x03C4, + 0x03C2, 0x03DA, 0x005B, 0x03CC, 0x0007, 0x0005, 0x0003, 0x005D, 0x005F, 0x000B, + 0x0063, 0x000F, 0x0067, 0x0257, 0x001B, 0x03E4, 0x03E0, 0x03EA, 0x001F, 0x001D, + 0x0023, 0x0021, 0x0027, 0x0025, 0x0035, 0x0029, 0x002D, 0x002B, 0x0031, 0x002F, + 0x0406, 0x0404, 0x0033, 0x0408, 0x040C, 0x03E6, 0x040A, 0x0055, 0x03F8, 0x040E, + 0x03FE, 0x03E2, 0x03E8, 0x003D, 0x0057, 0x03DE, 0x0017, 0x0019, 0x0065, 0x043C, + 0x0037, 0x0059, 0x03EC, 0x003B, 0x044C, 0x043A, 0x0448, 0x0053, 0x006B, 0x0061, + 0x0069, 0x006D, 0x0440, 0x0438, 0x0049, 0x0039, 0x0432, 0x0436, 0x0075, 0x03EE, + 0x03F0, 0x0416, 0x03FC, 0x043E, 0x03F6, 0x025D, 0x03FA, 0x0242, 0x0245, 0x0790, + 0x0248, 0x0266, 0x007D, 0x006F, 0x024B, 0x007F, 0x01E1, 0x00A7, 0x008B, 0x007B, + 0x00A9, 0x009F, 0x0077, 0x008D, 0x00AB, 0x00AD, 0x0093, 0x0095, 0x01D3, 0x01D5, + 0x00D5, 0x0272, 0x01D7, 0x00B5, 0x01D9, 0x0079, 0x01CB, 0x0083, 0x0085, 0x0414, + 0x025A, 0x0418, 0x00B1, 0x072D, 0x072A, 0x0420, 0x0730, 0x073F, 0x0727, 0x0745, + 0x0748, 0x073C, 0x00D7, 0x00CF, 0x0412, 0x074B, 0x0742, 0x0087, 0x00DF, 0x0141, + 0x074E, 0x0751, 0x00EF, 0x0446, 0x044A, 0x0766, 0x0450, 0x0442, 0x0763, 0x076F, + 0x044E, 0x00A3, 0x00A1, 0x00E5, 0x00E7, 0x01CD, 0x008F, 0x0091, 0x009B, 0x050E, + 0x0097, 0x00F1, 0x0135, 0x009D, 0x0113, 0x00A5, 0x0117, 0x04F9, 0x0099, 0x0109, + 0x0139, 0x0115, 0x04F6, 0x04FF, 0x04FC, 0x0502, 0x0505, 0x00F5, 0x076C, 0x00F7, + 0x050B, 0x00F3, 0x0769, 0x00FB, 0x04C9, 0x04CF, 0x00F9, 0x00ED, 0x0559, 0x04CC, + 0x011D, 0x0278, 0x04D5, 0x04C6, 0x027B, 0x0733, 0x04E7, 0x04DB, 0x01CF, 0x06EE, + 0x06F9, 0x0508, 0x06F5, 0x06F1, 0x00D3, 0x07DA, 0x07E2, 0x07DE, 0x027E, 0x0287, + 0x0284, 0x07E6, 0x0281, 0x028D, 0x028A, 0x04E1, 0x018F, 0x0293, 0x0290, 0x0299, + 0x0296, 0x029F, 0x029C, 0x07D6, 0x02AB, 0x02A5, 0x02A2, 0x07EA, 0x02B1, 0x00FF, + 0x02AE, 0x02C0, 0x02BD, 0x02B7, 0x02B4, 0x02A8, 0x0185, 0x02C3, 0x0153, 0x02C9, + 0x02C6, 0x07F6, 0x02CC, 0x02D5, 0x02D2, 0x0157, 0x07F2, 0x07EE, 0x02D8, 0x02CF, + 0x02DB, 0x05D1, 0x05CE, 0x02BA, 0x05D4, 0x05DD, 0x05DA, 0x0191, 0x0183, 0x05E9, + 0x05E6, 0x05EF, 0x05EC, 0x0189, 0x0187, 0x07FA, 0x0193, 0x0196, 0x00AF, 0x01A1, + 0x00BD, 0x00DB, 0x0169, 0x00D9, 0x00DD, 0x017F, 0x06E2, 0x0173, 0x00D1, 0x0177, + 0x065B, 0x0658, 0x063D, 0x0643, 0x016B, 0x0161, 0x0167, 0x016D, 0x0179, 0x0634, + 0x016F, 0x0175, 0x0649, 0x0171, 0x0646, 0x017D, 0x017B, 0x0655, 0x064F, 0x080E, + 0x0181, 0x0652, 0x064C, 0x0667, 0x0664, 0x066D, 0x066A, 0x06CA, 0x015B, 0x065E, + 0x0661, 0x0812, 0x061F, 0x0622, 0x015D, 0x015F, 0x061C, 0x06BB, 0x06BE, 0x01A3, + 0x068B, 0x068E, 0x019B, 0x019D, 0x0199, 0x019F, 0x01A5, 0x01A9, 0x01A7, 0x06B5, + 0x06AF, 0x0640, 0x06B8, 0x06B2, 0x01B1, 0x01AF, 0x01AD, 0x01AB, 0x01C7, 0x01C9, + 0x01B5, 0x06AC, 0x01C1, 0x01BD, 0x0723, 0x06EB, 0x01BF, 0x01BB, 0x06E8, 0x01D1, + 0x0691, 0x0712, 0x01B3, 0x0718, 0x01B7, 0x01B9, 0x0715, 0x01C5, 0x01C3, 0x0703, + 0x01DF, 0x0706, 0x0700, 0x01E3, 0x06FD, 0x06D3, 0x0709, 0x06D6, 0x06D0, 0x01E9, + 0x01EB, 0x01E7, 0x06E5, 0x070C, 0x01F1, 0x01ED, 0x0694, 0x01F3, 0x01EF, 0x0688, + 0x01FD, 0x01FB, 0x0201, 0x01FF, 0x06C4, 0x069A, 0x069D, 0x06A6, 0x0697, 0x06CD, + 0x06A9, 0x075D, 0x067F, 0x0682, 0x01F7, 0x01F9, 0x0760, 0x06DF, 0x0685, 0x067C, + 0x06A0, 0x070F, 0x075A, 0x06A3, 0x06C7, 0x071B, 0x071F, 0x0155, 0x0159, 0x0772, + 0x07B6, 0x07BA, 0x07BC, 0x07B0, 0x07B2, 0x07CE, 0x07D2, 0x07C6, 0x07CA, 0x07BE, + 0x07C2, 0x07AC, 0x07A4, 0x07A8, 0x07A0, 0x0798, 0x079C, 0x0780, 0x0784, 0x0788, + 0x0794, 0x0275, 0x078C, 0x077C, 0x0269, 0x026C, 0x026F, 0x0816, 0x081A, 0x0260, + 0x0263, 0x07FE, 0x0802, 0x0806, 0x080A, 0x0239, 0x023C, 0x0233, 0x0236, 0x0774, + 0x0778, 0x024E, 0x0251, 0x0254, 0x03B6, 0x03B8, 0x03BA, 0x03B2, 0x03A6, 0x03A8, + 0x03AA, 0x03DC, 0x03CE, 0x03D0, 0x03D2, 0x03D4, 0x03BE, 0x03C0, 0x036E, 0x0370, + 0x0366, 0x0368, 0x036A, 0x039C, 0x0386, 0x038C, 0x037E, 0x0380, 0x0382, 0x0384, + 0x0336, 0x0338, 0x033A, 0x033C, 0x032E, 0x031E, 0x0320, 0x0356, 0x0358, 0x0346, + 0x0348, 0x034A, 0x034C, 0x033E, 0x0340, 0x0342, 0x0344, 0x02F6, 0x02F8, 0x02FA, + 0x02FC, 0x02EE, 0x02F0, 0x02F2, 0x02F4, 0x02E6, 0x02E8, 0x02EA, 0x02EC, 0x02DE, + 0x02E0, 0x02E2, 0x02E4, 0x0316, 0x0318, 0x031A, 0x031C, 0x030E, 0x0310, 0x0312, + 0x0314, 0x0306, 0x0308, 0x030A, 0x030C, 0x02FE, 0x0300, 0x0302, 0x0304, 0x04AA, + 0x04AC, 0x04AE, 0x04B0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x049A, 0x049C, 0x049E, + 0x04A0, 0x0492, 0x0494, 0x0496, 0x0498, 0x04C2, 0x04C4, 0x04BA, 0x04BC, 0x04BE, + 0x04C0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x046A, 0x046C, 0x046E, 0x0470, 0x0462, + 0x0464, 0x0466, 0x0468, 0x045A, 0x045C, 0x045E, 0x0460, 0x0452, 0x0454, 0x0456, + 0x0458, 0x048A, 0x048C, 0x048E, 0x0490, 0x0482, 0x0484, 0x0486, 0x0488, 0x047A, + 0x047C, 0x047E, 0x0480, 0x0472, 0x0474, 0x0476, 0x0478, 0x042A, 0x042C, 0x042E, + 0x0430, 0x0422, 0x0424, 0x0426, 0x0428, 0x041A, 0x041C, 0x041E, 0x0444, 0x0434, + 0x03F2, 0x03F4, 0x0011, 0x0013, 0x0015, 0x0009, 0x0410, 0x000D, 0x0001, 0x0400, + 0x0402, 0x05E0, 0x05E3, 0x05D7, 0x05C2, 0x05C5, 0x05C8, 0x05CB, 0x0616, 0x0619, + 0x060A, 0x060D, 0x0610, 0x0613, 0x05FE, 0x0601, 0x0604, 0x0607, 0x05F2, 0x05F5, + 0x05F8, 0x05FB, 0x0598, 0x059B, 0x058C, 0x058F, 0x0592, 0x0595, 0x0586, 0x0589, + 0x057A, 0x057D, 0x0580, 0x0583, 0x05BC, 0x05BF, 0x05B6, 0x05B9, 0x05AA, 0x05AD, + 0x05B0, 0x05B3, 0x059E, 0x05A1, 0x081E, 0x05A4, 0x05A7, 0x053E, 0x0541, 0x0544, 0x0547, 0x0532, 0x0535, 0x0538, 0x053B, }; const uint8_t NU_TOUNACCENT_COMBINED[] = { diff --git a/vendor/nunicode/src/libnu/gen/_toupper.c b/vendor/nunicode/src/libnu/gen/_toupper.c index d4f68a3b4977..22d82c931438 100644 --- a/vendor/nunicode/src/libnu/gen/_toupper.c +++ b/vendor/nunicode/src/libnu/gen/_toupper.c @@ -10,445 +10,445 @@ #include const int16_t NU_TOUPPER_G[] = { - 1, -1396, 1, -1395, 1, -1394, 1, -1393, 1, -1392, 1, -1391, - 1, -1390, 1, -1389, 1, 1, 1, 5, 8, 1, 4, 9, - -1388, 0, -1387, 0, -1386, 0, -1385, 0, -1384, 0, -1383, 0, - -1382, 0, -1381, 0, -1380, 0, -1379, 0, -1377, 0, -1376, 0, - -1375, 0, -1374, 0, 0, -1373, 0, 0, -1372, 1, -1371, 1, - -1370, 1, -1369, 1, 7, 10, -1368, 12, 2, -1367, 2, -1366, - -1365, 0, -1364, 0, -1363, 0, -1362, 0, 2, -1361, 1, -1360, - 1, -1359, 1, -1358, -1357, -1355, -1354, 0, -1353, 0, 17, 0, - -1352, -1351, 19, 0, 0, -1350, 0, 0, 1, -1349, -1348, 1, - -1347, -1346, 3, -1345, -1343, -1342, -1341, 4, -1340, -1339, -1338, 2, - 0, 0, 0, -1337, 0, 2, 0, -1336, -1335, -1334, 8, -1333, - 1, 8, 1, 9, 1, 1, 1, 7, 28, 31, 1, 33, - -1332, -1331, -1330, 1, 0, 0, -1329, 0, 0, -1327, 0, -1325, - 0, -1324, 0, -1322, 0, -1320, 0, -1319, 1, -1316, 1, 1, - -1314, -1312, -1310, -1308, -1306, 1, 1, -1304, 1, -1302, 1, 1, - -1300, 1, -1298, 1, 1, 1, -1296, 1, -1295, -1292, 1, -1290, - 1, -1288, 1, -1286, 1, 0, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 2, 0, 2, 0, 2, 0, 1, 0, - -1284, 0, -1282, 0, -1280, 0, -1276, 0, -1275, 0, -1274, 0, - -1272, 0, -1271, 0, -1270, 0, -1269, 0, -1267, 0, -1265, 0, - -1264, 0, -1263, 0, 0, -1262, 0, 0, 0, -1261, 0, -1260, - -1259, 0, -1258, 0, -1257, 0, -1256, 0, -1255, 0, -1254, 0, - -1253, 0, -1252, 0, -1250, 0, -1248, 0, -1247, 0, -1246, 0, - -1245, 0, -1242, 0, -1241, 0, -1240, 0, 0, -1239, 0, -1238, - 0, -1237, 0, -1236, -1235, 0, -1234, -1233, -1231, 0, -1230, 0, - 48, -1229, 49, -1227, 63, -1223, 64, -1220, -1219, 64, -1218, -1216, - 68, 70, -1214, 69, 64, -1126, 64, -1115, 32, 1, 32, 1, - 32, 1, 32, 1, 32, 1, 32, 1, -1114, -1111, -1110, -1109, - -906, -893, -891, -887, -884, -883, -881, -872, -870, -868, -862, -860, - 32, 32, 32, 32, 33, -859, 33, 40, -858, -857, -853, -850, - -848, -846, 35, -839, -837, -836, -833, -830, -828, -826, 17, -825, - -824, -823, -822, -820, -819, -818, -817, -816, -812, -810, -808, -804, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, -800, 32, -799, - -798, -797, 33, -796, 32, -794, 35, -792, 32, -790, 32, -788, - 40, -786, 40, -784, 40, -783, 40, -782, 33, -781, 33, -780, - 33, -778, 33, -776, -774, 0, -772, 0, -770, 0, -768, 0, - -766, 0, -761, 0, -760, 0, -758, 0, -756, 0, -754, 0, - -748, 0, -747, 0, -746, 0, -745, 0, -743, 0, -742, 0, - -741, 0, -736, 0, -734, 0, 1, 0, -732, 0, 4, 0, - -730, 0, -720, 0, -717, 0, -706, 0, 1, 0, -703, 0, - -701, 0, -689, 0, -671, 0, -669, 0, -668, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -667, -666, -665, -641, - 5, -640, 5, -639, -638, -635, -634, 11, -615, -613, -612, -610, - -608, 2, -607, 6, 2, 1, 1, 5, -606, -605, -604, -603, - 0, -602, -601, -597, 0, 0, 0, 0, -594, -592, -588, 0, - -587, -584, -581, -580, -578, -577, -576, -575, -574, -573, -572, -571, - -570, -569, -568, 1, -567, -564, -563, -562, -561, -560, -558, -556, - 1, 1, 1, 1, -555, -554, 9, 10, -553, -552, -551, -550, - -549, -548, -547, -546, -545, -544, -543, -542, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -541, 1, 16, 1, - -540, -539, -538, -537, -536, -534, -532, -530, -528, -526, -525, -524, - 1, 1, 1, 4, 1, -523, 16, 19, 12, 1, 16, -522, - 16, -521, 64, -520, -519, 0, -518, 0, -517, -516, 17, -515, - -514, 30, 28, -513, -512, 32, -510, 41, 0, -508, -506, 47, - -504, -503, -502, -497, 0, 0, -496, 0, 12, 0, -494, -490, - -489, 0, 0, 0, 44, 0, 53, 0, 67, 0, 69, 0, - 31, 0, 32, 0, 39, 0, 43, 0, 0, 0, 0, 0, - 0, 0, 0, -488, 0, 0, 0, 0, -486, 0, -484, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, -480, 0, - -476, 0, -475, 0, 0, 0, -474, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -473, -472, -471, -470, - -469, -468, -467, -466, -465, -463, -461, -455, -451, -449, -439, -428, - -424, -423, -422, -384, -383, -382, -381, -380, -379, -377, 4, -376, - -375, -374, -373, -372, -371, -370, -369, -363, 2, -361, -352, -351, - -350, 0, 0, 0, -349, -348, 0, -347, -346, -345, 2, 5, - -344, -343, -342, -341, -340, -339, -338, -337, -335, -323, -322, -312, - -311, -308, -307, -306, -305, 1, 0, 0, 0, 0, 0, 0, - -304, 0, 0, 0, 4, 3, 8, 0, 1, -303, -302, 1, - 4, 0, -301, 0, 1, -300, -299, 23, 2, -298, -297, -296, - 4, -294, -293, -291, 1, -289, 5, -287, 36, -285, 53, 1, - 8, 12, 9, 40, 1, 40, 1, 40, 11, -279, 64, -264, - 64, -263, 64, -262, 4, 45, 4, 44, 76, -261, 11, 41, - -260, 0, -259, 0, 0, 0, 0, 0, 66, 69, 68, 79, - 180, 4, 186, 189, 70, -258, -257, 81, 93, -256, 100, -255, - 5, 67, 65, -254, 5, 67, 4, 131, 68, -253, 78, -252, - 68, -251, 115, -250, 81, -249, 98, -248, 101, -247, 101, -246, - 0, 0, 0, 0, -245, 0, -244, 0, 3, 167, 2, 169, - 1, -243, 1, -242, 1, 0, 1, 0, -241, 0, -240, 0, - 136, -239, 139, -238, -237, 0, 15, -236, -235, 0, -234, 0, - -233, 0, -232, 0, 158, -231, 157, -230, 136, -229, 142, -228, - -227, -226, -225, -223, 0, 0, -221, -215, 183, -214, -168, 199, - 141, -167, -163, -161, -156, 0, -155, 0, -154, 0, -153, 0, - 1, 0, 1, 0, 1, 1, 1, -152, 1, 1, -151, 1, - -150, 0, -148, 0, -147, 0, -145, -144, -143, -142, -141, -140, - 2, 0, -139, 0, 2, 0, 1, 0, 1, 0, 1, 0, - -138, -137, 9, 0, -136, 0, 1, 0, 48, -135, 54, -134, - 6, -133, 1, -132, 1, -131, 1, 23, -130, -129, 16, 0, - 1, 39, 1, -128, 1, -127, 81, 46, 22, -126, 83, -125, - 89, -124, 98, -123, -122, 0, -121, 0, -120, 0, -119, 0, - 1, -117, 1, -115, 1, -112, 1, -111, -110, 0, -109, 0, - -108, 0, -107, 0, -106, 0, -105, 0, -104, 0, -103, 0, - 39, 0, 43, 0, 8, 0, 35, 0, 32, 0, 32, 0, - 32, 0, 37, 0, 77, 0, 82, 0, 7, 0, 8, 0, - 1, 0, 20, 0, 38, 0, 40, 0, -102, 0, -101, 0, - -100, 0, -99, 0, -98, 0, -97, 0, -96, 0, -95, 0, - 5, 0, 10, 0, 75, 0, 79, 0, 5, 0, 11, 0, - -94, 0, 83, 0, -93, 0, -92, 0, -91, 0, -90, 0, - -89, 0, -88, 0, -87, 0, -86, 0, -85, 0, -84, 0, - -83, 0, -82, 0, 1, 0, 1, 0, 1, 0, 1, 0, - 1, -81, 1, -80, 1, -79, 1, -78, 1, -77, 1, -76, - 1, -75, 1, -74, 1, 0, 1, 0, 2, 0, 1, 0, - -73, 0, -72, 0, -71, 0, -70, 0, -69, 0, -68, 0, - -67, 0, -66, 0, 1, 0, 1, 0, 2, 0, 1, 0, - 1, -65, 1, -64, 16, -62, 162, -60, 0, 0, -58, -57, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -55, -53, -52, -51, -50, -49, -47, -45, - -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, 0, - -29, -27, -26, -25, -24, -23, -22, -21, 14, 37, 64, 67, - 72, -20, 75, -18, -16, 0, -14, 0, -12, 0, -11, 0, - -10, 0, -9, 0, 0, 0, -8, 0, -7, -6, -5, -4, + 1, -1396, 1, -1395, 1, -1394, 1, -1393, 1, -1392, 1, -1391, + 1, -1390, 1, -1389, 1, 1, 1, 5, 8, 1, 4, 9, + -1388, 0, -1387, 0, -1386, 0, -1385, 0, -1384, 0, -1383, 0, + -1382, 0, -1381, 0, -1380, 0, -1379, 0, -1377, 0, -1376, 0, + -1375, 0, -1374, 0, 0, -1373, 0, 0, -1372, 1, -1371, 1, + -1370, 1, -1369, 1, 7, 10, -1368, 12, 2, -1367, 2, -1366, + -1365, 0, -1364, 0, -1363, 0, -1362, 0, 2, -1361, 1, -1360, + 1, -1359, 1, -1358, -1357, -1355, -1354, 0, -1353, 0, 17, 0, + -1352, -1351, 19, 0, 0, -1350, 0, 0, 1, -1349, -1348, 1, + -1347, -1346, 3, -1345, -1343, -1342, -1341, 4, -1340, -1339, -1338, 2, + 0, 0, 0, -1337, 0, 2, 0, -1336, -1335, -1334, 8, -1333, + 1, 8, 1, 9, 1, 1, 1, 7, 28, 31, 1, 33, + -1332, -1331, -1330, 1, 0, 0, -1329, 0, 0, -1327, 0, -1325, + 0, -1324, 0, -1322, 0, -1320, 0, -1319, 1, -1316, 1, 1, + -1314, -1312, -1310, -1308, -1306, 1, 1, -1304, 1, -1302, 1, 1, + -1300, 1, -1298, 1, 1, 1, -1296, 1, -1295, -1292, 1, -1290, + 1, -1288, 1, -1286, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 2, 0, 2, 0, 2, 0, 1, 0, + -1284, 0, -1282, 0, -1280, 0, -1276, 0, -1275, 0, -1274, 0, + -1272, 0, -1271, 0, -1270, 0, -1269, 0, -1267, 0, -1265, 0, + -1264, 0, -1263, 0, 0, -1262, 0, 0, 0, -1261, 0, -1260, + -1259, 0, -1258, 0, -1257, 0, -1256, 0, -1255, 0, -1254, 0, + -1253, 0, -1252, 0, -1250, 0, -1248, 0, -1247, 0, -1246, 0, + -1245, 0, -1242, 0, -1241, 0, -1240, 0, 0, -1239, 0, -1238, + 0, -1237, 0, -1236, -1235, 0, -1234, -1233, -1231, 0, -1230, 0, + 48, -1229, 49, -1227, 63, -1223, 64, -1220, -1219, 64, -1218, -1216, + 68, 70, -1214, 69, 64, -1126, 64, -1115, 32, 1, 32, 1, + 32, 1, 32, 1, 32, 1, 32, 1, -1114, -1111, -1110, -1109, + -906, -893, -891, -887, -884, -883, -881, -872, -870, -868, -862, -860, + 32, 32, 32, 32, 33, -859, 33, 40, -858, -857, -853, -850, + -848, -846, 35, -839, -837, -836, -833, -830, -828, -826, 17, -825, + -824, -823, -822, -820, -819, -818, -817, -816, -812, -810, -808, -804, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, -800, 32, -799, + -798, -797, 33, -796, 32, -794, 35, -792, 32, -790, 32, -788, + 40, -786, 40, -784, 40, -783, 40, -782, 33, -781, 33, -780, + 33, -778, 33, -776, -774, 0, -772, 0, -770, 0, -768, 0, + -766, 0, -761, 0, -760, 0, -758, 0, -756, 0, -754, 0, + -748, 0, -747, 0, -746, 0, -745, 0, -743, 0, -742, 0, + -741, 0, -736, 0, -734, 0, 1, 0, -732, 0, 4, 0, + -730, 0, -720, 0, -717, 0, -706, 0, 1, 0, -703, 0, + -701, 0, -689, 0, -671, 0, -669, 0, -668, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -667, -666, -665, -641, + 5, -640, 5, -639, -638, -635, -634, 11, -615, -613, -612, -610, + -608, 2, -607, 6, 2, 1, 1, 5, -606, -605, -604, -603, + 0, -602, -601, -597, 0, 0, 0, 0, -594, -592, -588, 0, + -587, -584, -581, -580, -578, -577, -576, -575, -574, -573, -572, -571, + -570, -569, -568, 1, -567, -564, -563, -562, -561, -560, -558, -556, + 1, 1, 1, 1, -555, -554, 9, 10, -553, -552, -551, -550, + -549, -548, -547, -546, -545, -544, -543, -542, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, -541, 1, 16, 1, + -540, -539, -538, -537, -536, -534, -532, -530, -528, -526, -525, -524, + 1, 1, 1, 4, 1, -523, 16, 19, 12, 1, 16, -522, + 16, -521, 64, -520, -519, 0, -518, 0, -517, -516, 17, -515, + -514, 30, 28, -513, -512, 32, -510, 41, 0, -508, -506, 47, + -504, -503, -502, -497, 0, 0, -496, 0, 12, 0, -494, -490, + -489, 0, 0, 0, 44, 0, 53, 0, 67, 0, 69, 0, + 31, 0, 32, 0, 39, 0, 43, 0, 0, 0, 0, 0, + 0, 0, 0, -488, 0, 0, 0, 0, -486, 0, -484, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, -480, 0, + -476, 0, -475, 0, 0, 0, -474, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -473, -472, -471, -470, + -469, -468, -467, -466, -465, -463, -461, -455, -451, -449, -439, -428, + -424, -423, -422, -384, -383, -382, -381, -380, -379, -377, 4, -376, + -375, -374, -373, -372, -371, -370, -369, -363, 2, -361, -352, -351, + -350, 0, 0, 0, -349, -348, 0, -347, -346, -345, 2, 5, + -344, -343, -342, -341, -340, -339, -338, -337, -335, -323, -322, -312, + -311, -308, -307, -306, -305, 1, 0, 0, 0, 0, 0, 0, + -304, 0, 0, 0, 4, 3, 8, 0, 1, -303, -302, 1, + 4, 0, -301, 0, 1, -300, -299, 23, 2, -298, -297, -296, + 4, -294, -293, -291, 1, -289, 5, -287, 36, -285, 53, 1, + 8, 12, 9, 40, 1, 40, 1, 40, 11, -279, 64, -264, + 64, -263, 64, -262, 4, 45, 4, 44, 76, -261, 11, 41, + -260, 0, -259, 0, 0, 0, 0, 0, 66, 69, 68, 79, + 180, 4, 186, 189, 70, -258, -257, 81, 93, -256, 100, -255, + 5, 67, 65, -254, 5, 67, 4, 131, 68, -253, 78, -252, + 68, -251, 115, -250, 81, -249, 98, -248, 101, -247, 101, -246, + 0, 0, 0, 0, -245, 0, -244, 0, 3, 167, 2, 169, + 1, -243, 1, -242, 1, 0, 1, 0, -241, 0, -240, 0, + 136, -239, 139, -238, -237, 0, 15, -236, -235, 0, -234, 0, + -233, 0, -232, 0, 158, -231, 157, -230, 136, -229, 142, -228, + -227, -226, -225, -223, 0, 0, -221, -215, 183, -214, -168, 199, + 141, -167, -163, -161, -156, 0, -155, 0, -154, 0, -153, 0, + 1, 0, 1, 0, 1, 1, 1, -152, 1, 1, -151, 1, + -150, 0, -148, 0, -147, 0, -145, -144, -143, -142, -141, -140, + 2, 0, -139, 0, 2, 0, 1, 0, 1, 0, 1, 0, + -138, -137, 9, 0, -136, 0, 1, 0, 48, -135, 54, -134, + 6, -133, 1, -132, 1, -131, 1, 23, -130, -129, 16, 0, + 1, 39, 1, -128, 1, -127, 81, 46, 22, -126, 83, -125, + 89, -124, 98, -123, -122, 0, -121, 0, -120, 0, -119, 0, + 1, -117, 1, -115, 1, -112, 1, -111, -110, 0, -109, 0, + -108, 0, -107, 0, -106, 0, -105, 0, -104, 0, -103, 0, + 39, 0, 43, 0, 8, 0, 35, 0, 32, 0, 32, 0, + 32, 0, 37, 0, 77, 0, 82, 0, 7, 0, 8, 0, + 1, 0, 20, 0, 38, 0, 40, 0, -102, 0, -101, 0, + -100, 0, -99, 0, -98, 0, -97, 0, -96, 0, -95, 0, + 5, 0, 10, 0, 75, 0, 79, 0, 5, 0, 11, 0, + -94, 0, 83, 0, -93, 0, -92, 0, -91, 0, -90, 0, + -89, 0, -88, 0, -87, 0, -86, 0, -85, 0, -84, 0, + -83, 0, -82, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, -81, 1, -80, 1, -79, 1, -78, 1, -77, 1, -76, + 1, -75, 1, -74, 1, 0, 1, 0, 2, 0, 1, 0, + -73, 0, -72, 0, -71, 0, -70, 0, -69, 0, -68, 0, + -67, 0, -66, 0, 1, 0, 1, 0, 2, 0, 1, 0, + 1, -65, 1, -64, 16, -62, 162, -60, 0, 0, -58, -57, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -55, -53, -52, -51, -50, -49, -47, -45, + -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, 0, + -29, -27, -26, -25, -24, -23, -22, -21, 14, 37, 64, 67, + 72, -20, 75, -18, -16, 0, -14, 0, -12, 0, -11, 0, + -10, 0, -9, 0, 0, 0, -8, 0, -7, -6, -5, -4, 68, -3, -2, -1, }; const size_t NU_TOUPPER_G_SIZE = sizeof(NU_TOUPPER_G) / sizeof(*NU_TOUPPER_G); /* codepoints */ const uint32_t NU_TOUPPER_VALUES_C[] = { - 0x0104F4, 0x0104F5, 0x0104F6, 0x0104F0, 0x0104F1, 0x0104F2, 0x0104F3, 0x000481, - 0x00049D, 0x00049F, 0x000499, 0x00049B, 0x000581, 0x000495, 0x000583, 0x000497, - 0x000585, 0x0104DC, 0x000587, 0x0104DE, 0x000568, 0x000569, 0x00056A, 0x00056B, - 0x000564, 0x000565, 0x000566, 0x00052D, 0x000567, 0x000561, 0x000562, 0x000563, - 0x00057C, 0x00057D, 0x00057E, 0x00057F, 0x000578, 0x000579, 0x00057A, 0x00057B, - 0x00FB01, 0x00FB05, 0x00FB03, 0x00FB02, 0x000574, 0x00FB00, 0x000575, 0x00FB06, - 0x000576, 0x000577, 0x000570, 0x000571, 0x000572, 0x00FB04, 0x000573, 0x002184, - 0x0024E8, 0x0024E9, 0x00FB13, 0x0024E4, 0x00FB15, 0x0024E6, 0x00FB17, 0x0024E0, - 0x0024E2, 0x001E61, 0x001E63, 0x001E7D, 0x001E7F, 0x001E79, 0x001E7B, 0x001E75, - 0x001E77, 0x0024DC, 0x0024DE, 0x0024D8, 0x0024DA, 0x0024D4, 0x0024D6, 0x0024D0, - 0x0024D2, 0x001E51, 0x001E53, 0x001E2D, 0x001E2F, 0x001E29, 0x001E2B, 0x001E25, - 0x001E27, 0x001E21, 0x001E23, 0x001E3D, 0x001E3F, 0x001E3B, 0x001E09, 0x001E0B, - 0x001E05, 0x001E07, 0x001E01, 0x001E03, 0x001E1D, 0x001E1F, 0x001EF9, 0x001EFB, - 0x001EF5, 0x001EF7, 0x001EF1, 0x001EF3, 0x001ECD, 0x001ECF, 0x000584, 0x000586, - 0x000071, 0x000073, 0x000580, 0x000072, 0x000582, 0x000070, 0x001EC1, 0x001EC3, - 0x001EDD, 0x001EDF, 0x00FF4C, 0x00FF4E, 0x00FF48, 0x00FF4A, 0x00FF46, 0x000268, - 0x000266, 0x001EAB, 0x00FF5A, 0x00FF54, 0x00FF56, 0x00FF50, 0x00FF52, 0x001EBB, - 0x000272, 0x001EB7, 0x001E89, 0x000240, 0x001E85, 0x000242, 0x001E87, 0x00025C, - 0x001E81, 0x002C30, 0x001E83, 0x000259, 0x00214E, 0x00025B, 0x001E99, 0x000250, - 0x000229, 0x00022B, 0x000225, 0x000227, 0x002C3D, 0x002C3C, 0x002C3F, 0x002C3E, - 0x001F64, 0x002C68, 0x001F65, 0x002C6C, 0x0000B5, 0x00217C, 0x001F66, 0x001F61, - 0x002C4C, 0x00217E, 0x002C6A, 0x00217F, 0x002C4D, 0x002C5D, 0x002C4F, 0x002C4E, - 0x002C51, 0x002C50, 0x002C53, 0x002C52, 0x002C55, 0x002C54, 0x002C57, 0x002C56, - 0x002C59, 0x002C58, 0x002C5B, 0x002C5A, 0x002175, 0x002C5C, 0x002177, 0x002C5E, - 0x002179, 0x002171, 0x00217B, 0x00217A, 0x00217D, 0x002174, 0x002176, 0x002178, - 0x0000E9, 0x0000E1, 0x0000EB, 0x0000E3, 0x0000ED, 0x0000E5, 0x0000EF, 0x0000E7, - 0x002C61, 0x0000F1, 0x002C73, 0x0000F3, 0x0000F5, 0x001F62, 0x001F7C, 0x002C76, - 0x002C66, 0x002C65, 0x0000F9, 0x0000FB, 0x001F7D, 0x0000FD, 0x001F78, 0x0000FF, - 0x001F79, 0x001F7A, 0x001F7B, 0x001F74, 0x001F76, 0x001F70, 0x001F72, 0x000209, - 0x00020B, 0x000205, 0x000207, 0x001F44, 0x000203, 0x001F40, 0x001F42, 0x000219, - 0x00021B, 0x001F54, 0x001F56, 0x00A681, 0x00A683, 0x001F24, 0x001F26, 0x001F20, - 0x001F22, 0x01E92C, 0x01E92E, 0x01E928, 0x01E92A, 0x001F30, 0x01E93C, 0x01E93E, - 0x01E939, 0x01E93A, 0x00A74D, 0x00A74F, 0x0118CE, 0x0118C4, 0x0118C6, 0x0118C0, - 0x002C89, 0x002C81, 0x002C8B, 0x002C83, 0x002C8D, 0x002C85, 0x002C8F, 0x002C87, - 0x000111, 0x002C91, 0x000113, 0x002C93, 0x002C95, 0x000117, 0x0118C2, 0x000115, - 0x000119, 0x00011B, 0x002C99, 0x002C9B, 0x0118D6, 0x002C9D, 0x0118D0, 0x002C9F, - 0x0118D2, 0x000161, 0x001FF4, 0x000163, 0x00A729, 0x001FF6, 0x002CC7, 0x00028C, - 0x00A725, 0x001FF2, 0x000289, 0x00028A, 0x00A73D, 0x00A739, 0x001FC6, 0x00A733, - 0x001FD7, 0x001FD0, 0x001FD1, 0x001FD2, 0x002CD5, 0x000175, 0x001FD3, 0x001FAC, - 0x00017E, 0x00017C, 0x00017A, 0x00017F, 0x001C85, 0x002CD9, 0x001C87, 0x001C88, - 0x000171, 0x001FAD, 0x001FAE, 0x000173, 0x002CE1, 0x000165, 0x002CE3, 0x000167, - 0x000177, 0x000169, 0x002CEC, 0x00016B, 0x002CEE, 0x00016D, 0x001FAF, 0x00016F, - 0x001FA8, 0x001FA9, 0x001FAA, 0x001FAB, 0x001FA4, 0x001FA5, 0x001FA6, 0x001FA7, - 0x001FA2, 0x001FA3, 0x001FBC, 0x001FBE, 0x00037B, 0x000377, 0x001FB4, 0x000371, - 0x002D20, 0x002D21, 0x002D22, 0x002D23, 0x002D25, 0x002D04, 0x002D27, 0x002D06, - 0x001FB6, 0x002D08, 0x001FB0, 0x002D0A, 0x002D24, 0x002D0C, 0x002D2D, 0x002D0E, - 0x001FB1, 0x001FB2, 0x001FB3, 0x001F8C, 0x001F8D, 0x001F8E, 0x001F8F, 0x001F88, - 0x001F8A, 0x010CED, 0x001F8B, 0x001F84, 0x001F85, 0x001F86, 0x001F87, 0x001F80, - 0x002D11, 0x000180, 0x000183, 0x002D13, 0x000195, 0x002D05, 0x000185, 0x002D07, - 0x002D17, 0x002D09, 0x000199, 0x002D0B, 0x000188, 0x002D0D, 0x00018C, 0x002D0F, - 0x010CC5, 0x010CC4, 0x010CC7, 0x010CC6, 0x010CC9, 0x010CC8, 0x010CCB, 0x010CCA, - 0x010CCD, 0x010CCC, 0x010CCF, 0x010CCE, 0x010CD1, 0x010CD0, 0x010CD3, 0x010CD2, - 0x0001A1, 0x002D01, 0x0001A3, 0x002D03, 0x0001A5, 0x001F81, 0x001F82, 0x001F83, - 0x010CD5, 0x0001A8, 0x010CD4, 0x001F9C, 0x010CE1, 0x010CF1, 0x010CE3, 0x010CE2, - 0x010CE0, 0x0001B9, 0x010CE7, 0x010CEB, 0x0001B6, 0x002D15, 0x001F9D, 0x010CEA, - 0x002D1E, 0x002D1C, 0x002D1A, 0x002D1F, 0x0001BD, 0x010CF0, 0x0001BF, 0x010CF2, - 0x001F9E, 0x010CE5, 0x001F9F, 0x010CE4, 0x0001C5, 0x010CE9, 0x001F98, 0x0001C6, - 0x0001C9, 0x0001C8, 0x0001CB, 0x010CEF, 0x001F99, 0x0001CC, 0x001F9A, 0x0001CE, - 0x001F9B, 0x001F94, 0x001F95, 0x001F96, 0x001F97, 0x001F90, 0x001F91, 0x001F92, - 0x001F93, 0x00A7A9, 0x00A7A5, 0x00A7A7, 0x0001DD, 0x0001DC, 0x0001DF, 0x00A7A1, - 0x0001E1, 0x00A7A3, 0x0001E3, 0x00A7B5, 0x0001E5, 0x00A7B7, 0x0001E7, 0x00A78C, - 0x00A797, 0x0003F8, 0x0001EB, 0x0001E9, 0x0001ED, 0x00A791, 0x0001EF, 0x0003F5, - 0x0003F0, 0x0001F0, 0x0001F3, 0x0001F2, 0x0001F5, 0x0003F1, 0x0003F2, 0x0003F3, - 0x0001F9, 0x0003CD, 0x0001FB, 0x0003CE, 0x0001FD, 0x0003C9, 0x0001FF, 0x0003CB, - 0x0003C4, 0x0003C7, 0x0003C0, 0x0003C2, 0x0003C3, 0x0003DD, 0x0003DF, 0x010CEC, - 0x010CEE, 0x010CE8, 0x010CE6, 0x002C48, 0x002C49, 0x002C4A, 0x000201, 0x002C4B, - 0x000211, 0x002C44, 0x000213, 0x002C45, 0x000215, 0x002C46, 0x000217, 0x002C47, - 0x002C40, 0x002C41, 0x002C42, 0x002C43, 0x0003BF, 0x010CC0, 0x010CC1, 0x010CC2, - 0x010CC3, 0x010CDC, 0x010CDD, 0x010CDE, 0x010CDF, 0x010CD8, 0x010CD9, 0x010CDA, - 0x010CDB, 0x010CD6, 0x010CD7, 0x002C38, 0x00022D, 0x002C39, 0x00022F, 0x002C3A, - 0x002C3B, 0x002C34, 0x002C35, 0x002C36, 0x001D79, 0x001D7D, 0x002C37, 0x002C31, - 0x002C32, 0x002C33, 0x00006C, 0x00006D, 0x00006E, 0x00006F, 0x000068, 0x000069, - 0x00006A, 0x00006B, 0x00026C, 0x000064, 0x000065, 0x000247, 0x00AB53, 0x000066, - 0x000249, 0x00024B, 0x000067, 0x000061, 0x00024D, 0x00026A, 0x00024F, 0x000062, - 0x000251, 0x000063, 0x000253, 0x000252, 0x000078, 0x000254, 0x000257, 0x000256, - 0x000079, 0x00007A, 0x000074, 0x000075, 0x000076, 0x000077, 0x00AB79, 0x00AB7B, - 0x000261, 0x00AB74, 0x000263, 0x00AB75, 0x00AB76, 0x0118C1, 0x00AB77, 0x0118CF, - 0x000269, 0x0118C5, 0x00026B, 0x0118C7, 0x00AB7A, 0x00AB7C, 0x00026F, 0x00AB70, - 0x00AB7D, 0x00AB7F, 0x00AB78, 0x00AB7E, 0x000275, 0x000265, 0x00A643, 0x000260, - 0x000271, 0x00AB71, 0x00AB72, 0x00A641, 0x00027D, 0x00AB73, 0x001C84, 0x001C86, - 0x001C80, 0x000280, 0x000283, 0x000287, 0x00ABB1, 0x00AB90, 0x00ABB3, 0x00AB92, - 0x00023F, 0x00AB94, 0x00028B, 0x00AB96, 0x00ABB0, 0x00AB98, 0x00ABB9, 0x00AB9A, - 0x00020D, 0x00020F, 0x00A665, 0x000292, 0x00A667, 0x00029D, 0x00021D, 0x00021F, - 0x001C81, 0x001C82, 0x001C83, 0x002CF3, 0x002CCD, 0x00029E, 0x002CCF, 0x000288, - 0x00AB8C, 0x00AB8D, 0x00AB8E, 0x00AB8F, 0x00ABA1, 0x00AB91, 0x00A66D, 0x00AB93, - 0x00A647, 0x00AB95, 0x0118CD, 0x00AB97, 0x0118C3, 0x00AB99, 0x000223, 0x00AB9B, - 0x002CC9, 0x0118C9, 0x00A64B, 0x0118CB, 0x0118D9, 0x00A645, 0x0118D3, 0x0118DB, - 0x0118D1, 0x0118D4, 0x0118DA, 0x000233, 0x002CCB, 0x001E15, 0x002CC5, 0x000231, - 0x0118DD, 0x002CC1, 0x0118DF, 0x001E0D, 0x0118D5, 0x00A649, 0x001E0F, 0x00A657, - 0x0118C8, 0x0118CC, 0x00A669, 0x0118CA, 0x002CC3, 0x00A64D, 0x00A663, 0x002CDD, - 0x001E13, 0x00A64F, 0x001E17, 0x00A661, 0x0118D8, 0x001E11, 0x00A66B, 0x0118D7, - 0x0118DC, 0x002CDF, 0x0118DE, 0x002CDB, 0x00A653, 0x002CD7, 0x00A655, 0x002CD1, - 0x00A65D, 0x00A659, 0x00A651, 0x00A65B, 0x002CD3, 0x002CAD, 0x002CAF, 0x00A65F, - 0x002CA9, 0x002CAB, 0x002CA5, 0x002CA7, 0x00A687, 0x001E19, 0x001E37, 0x00A685, - 0x00A689, 0x002CA1, 0x00A68B, 0x002CA3, 0x00A68D, 0x002CBD, 0x00A68F, 0x002CBF, - 0x002CB9, 0x001E1B, 0x001E35, 0x00023C, 0x001E41, 0x002CBB, 0x001E43, 0x002CB5, - 0x001E45, 0x002CB7, 0x001E47, 0x002CB1, 0x001E49, 0x002CB3, 0x001E4B, 0x0000EC, - 0x001E4D, 0x0000EE, 0x001E4F, 0x0000E8, 0x0000EA, 0x0000E4, 0x0000E6, 0x0000E0, - 0x001E55, 0x0000E2, 0x001E57, 0x0000FC, 0x001E59, 0x0000FE, 0x001E5B, 0x0000F8, - 0x001E5D, 0x0000FA, 0x001E5F, 0x0000F4, 0x0000F6, 0x002C97, 0x0000F0, 0x0000F2, - 0x001E65, 0x0000DF, 0x001E67, 0x00ABAC, 0x001E69, 0x001E6B, 0x001E39, 0x00ABAD, - 0x001E6D, 0x00ABAE, 0x001E6F, 0x00ABAF, 0x001E71, 0x001E73, 0x00A697, 0x00ABA8, - 0x00ABA9, 0x00ABAA, 0x00ABAB, 0x00ABA4, 0x001E33, 0x00ABA5, 0x00ABA6, 0x00ABA7, - 0x00ABA0, 0x00ABA2, 0x001E31, 0x00ABA3, 0x001ED1, 0x00ABBC, 0x001EDB, 0x00A693, - 0x00ABBD, 0x000345, 0x001ED5, 0x00ABBE, 0x00ABBF, 0x001E8B, 0x00ABB8, 0x001EBD, - 0x001E8D, 0x001E8F, 0x00A691, 0x001EBF, 0x001E91, 0x00ABBA, 0x001E93, 0x00ABBB, - 0x001E95, 0x00ABB4, 0x001E97, 0x001E96, 0x00ABB5, 0x001E98, 0x001E9B, 0x001E9A, - 0x00ABB6, 0x00ABB7, 0x00ABB2, 0x00AB88, 0x001EA1, 0x00AB89, 0x001EEF, 0x00A695, - 0x001EA5, 0x001EA3, 0x001EA7, 0x00AB8A, 0x00A699, 0x00AB8B, 0x00A69B, 0x00AB84, - 0x001EAD, 0x00A741, 0x001EAF, 0x00A743, 0x001EB1, 0x00A761, 0x001EB3, 0x00A74B, - 0x00AB85, 0x000373, 0x00AB86, 0x00AB87, 0x001EB9, 0x001EA9, 0x00AB80, 0x001ED9, - 0x001EB5, 0x00037C, 0x00AB81, 0x001EED, 0x00AB82, 0x001ED7, 0x001EE1, 0x00037D, - 0x001EC5, 0x001EE5, 0x001EC7, 0x001EE7, 0x001EC9, 0x00A75D, 0x001ECB, 0x001EEB, - 0x001EE9, 0x00AB83, 0x00A723, 0x00A76D, 0x00A765, 0x00A727, 0x001ED3, 0x0024E5, - 0x00A72D, 0x000390, 0x001EFD, 0x00A76F, 0x001EFF, 0x00A77C, 0x00A72F, 0x00A72B, - 0x0013FD, 0x0003D9, 0x0013FC, 0x00A737, 0x0013F9, 0x0013F8, 0x0013FB, 0x0013FA, - 0x0003E5, 0x00A77F, 0x00A73B, 0x00A73F, 0x0003E7, 0x00A735, 0x00A763, 0x001EE3, - 0x0003AC, 0x00A745, 0x00A749, 0x00A747, 0x0003AD, 0x0003BD, 0x0003AF, 0x0003AE, - 0x0003B1, 0x0003B0, 0x0003B3, 0x0003B2, 0x0003B5, 0x0003B4, 0x0003B7, 0x0003B6, - 0x0003B9, 0x0003B8, 0x0003BB, 0x0003BA, 0x00A75F, 0x0003BC, 0x001F06, 0x0003BE, - 0x00A759, 0x0003D1, 0x00A75B, 0x0003D0, 0x00A755, 0x0003D5, 0x0003ED, 0x00A757, - 0x0003EF, 0x0003E9, 0x00A767, 0x0003DB, 0x00A751, 0x01E925, 0x01E927, 0x0003E3, - 0x0003C1, 0x001F11, 0x01E923, 0x001F13, 0x0003E1, 0x00A769, 0x00A76B, 0x0003D6, - 0x0003C6, 0x0003C5, 0x001F15, 0x0003D7, 0x010429, 0x01042B, 0x01E936, 0x00A753, - 0x01042D, 0x0003C8, 0x01042F, 0x0003CC, 0x01043A, 0x010430, 0x00A77A, 0x010432, - 0x010438, 0x010434, 0x0003CA, 0x010436, 0x01E943, 0x001F35, 0x001F37, 0x01E941, - 0x01043B, 0x01043F, 0x001F33, 0x01043D, 0x0003EB, 0x010440, 0x010443, 0x0003FB, - 0x001F10, 0x001F14, 0x010445, 0x001F12, 0x001F25, 0x001F03, 0x001F27, 0x001F21, - 0x010448, 0x001F01, 0x01044C, 0x001F02, 0x00A783, 0x01E93D, 0x001F45, 0x00A793, - 0x00A787, 0x00A781, 0x01E92D, 0x001F00, 0x001F53, 0x01E922, 0x01E93F, 0x001F51, - 0x001F55, 0x01E926, 0x001F57, 0x01E929, 0x00A799, 0x01E938, 0x00A785, 0x01E92F, - 0x0024D1, 0x000438, 0x0024D3, 0x01E92B, 0x0024D5, 0x01E933, 0x0024D7, 0x00A79B, - 0x0024D9, 0x01E931, 0x0024DB, 0x01E932, 0x0024DD, 0x00043A, 0x0024DF, 0x00043B, - 0x0024E1, 0x01E93B, 0x0024E3, 0x01E930, 0x001F31, 0x001F32, 0x001F23, 0x01E937, - 0x000431, 0x001F36, 0x000433, 0x000434, 0x000435, 0x01E934, 0x000437, 0x000436, - 0x000439, 0x000430, 0x000432, 0x01E935, 0x00FF45, 0x00043C, 0x00FF4F, 0x0024E7, - 0x00A79D, 0x000440, 0x00FF49, 0x000442, 0x00A79F, 0x000444, 0x000447, 0x000446, - 0x000449, 0x001F89, 0x0104DD, 0x0104DF, 0x00044D, 0x0104D9, 0x00044F, 0x0104D8, - 0x000451, 0x000450, 0x000453, 0x01E924, 0x00AB9C, 0x00AB9D, 0x00AB9E, 0x00FF4D, - 0x000459, 0x00AB9F, 0x002D00, 0x00045A, 0x00045D, 0x00045C, 0x00045F, 0x001FA1, - 0x000461, 0x001FA0, 0x000463, 0x001F60, 0x000465, 0x002D02, 0x000467, 0x0104F7, - 0x00FF41, 0x00046B, 0x00FF43, 0x000469, 0x00046D, 0x00046F, 0x00FF47, 0x001F07, - 0x000471, 0x001FB7, 0x000473, 0x001F34, 0x000475, 0x001F04, 0x000477, 0x00FF58, - 0x000479, 0x00FF57, 0x00047B, 0x001F05, 0x00FF55, 0x001FC2, 0x00047F, 0x00047D, - 0x00FF59, 0x001FC4, 0x001FC7, 0x001FC3, 0x001FE0, 0x00FF4B, 0x001F41, 0x001F43, - 0x001FE4, 0x0104DB, 0x001FE6, 0x00FF53, 0x00048D, 0x00FF42, 0x00048F, 0x00FF51, - 0x001F63, 0x01E942, 0x00FF44, 0x001FD6, 0x0104E1, 0x01E940, 0x0104E3, 0x001FCC, - 0x0104E5, 0x0104EC, 0x0104E7, 0x0104EF, 0x0104E9, 0x0104ED, 0x0104EB, 0x0104EA, - 0x001FE5, 0x0104E8, 0x001FE7, 0x0104EE, 0x001FE1, 0x0004A1, 0x001F67, 0x001FE3, - 0x001F71, 0x001F73, 0x001FE2, 0x0004A3, 0x0104F9, 0x001FF3, 0x0104FB, 0x001FF7, - 0x0004B1, 0x001F52, 0x0004B3, 0x0104DA, 0x0004B5, 0x001F50, 0x0004B7, 0x001F75, - 0x0004B9, 0x001FFC, 0x0004BB, 0x001F77, 0x0004BD, 0x002D1D, 0x0004BF, 0x002D18, - 0x0004CC, 0x002D19, 0x002D1B, 0x002D14, 0x0004CE, 0x0004C4, 0x002D16, 0x0004C6, - 0x0004CF, 0x0004C8, 0x002D10, 0x0004CA, 0x002D12, 0x00014D, 0x00014F, 0x00048B, - 0x000148, 0x000149, 0x00014B, 0x000144, 0x000146, 0x000140, 0x000142, 0x00015D, - 0x00015F, 0x000159, 0x000491, 0x000493, 0x00015B, 0x000155, 0x000157, 0x000151, - 0x0004E1, 0x000153, 0x0004E3, 0x00012D, 0x00012F, 0x000129, 0x00012B, 0x000125, - 0x000127, 0x000121, 0x000123, 0x00013C, 0x00013E, 0x00013A, 0x000135, 0x000137, - 0x000131, 0x0004F3, 0x000133, 0x0004F1, 0x00010D, 0x00010F, 0x000109, 0x00010B, - 0x0004E9, 0x000105, 0x000107, 0x000101, 0x0004FD, 0x0004FF, 0x0004ED, 0x000103, - 0x000501, 0x00011D, 0x000503, 0x00011F, 0x000505, 0x00044C, 0x000507, 0x00044E, - 0x000509, 0x000448, 0x00050B, 0x00044A, 0x00050D, 0x00050F, 0x00044B, 0x000445, - 0x000511, 0x000441, 0x000513, 0x000443, 0x000515, 0x00045E, 0x000517, 0x000458, - 0x000519, 0x00045B, 0x00051B, 0x000454, 0x00051D, 0x000455, 0x00051F, 0x000456, - 0x000521, 0x000457, 0x000523, 0x000452, 0x000525, 0x000527, 0x0001D8, 0x0001DA, - 0x000529, 0x0001D4, 0x00052B, 0x0001D6, 0x0001D0, 0x00056D, 0x0001D2, 0x00056C, - 0x0001AD, 0x00043D, 0x00043E, 0x00043F, 0x002170, 0x002172, 0x002173, 0x0001B4, - 0x0001B0, 0x01044D, 0x01044E, 0x01044F, 0x010449, 0x01044A, 0x01044B, 0x00052F, - 0x010444, 0x010446, 0x010447, 0x010441, 0x010442, 0x00019E, 0x00019A, 0x0004EF, - 0x0004EB, 0x0004E5, 0x000192, 0x00056E, 0x0004E7, 0x01042C, 0x01042E, 0x010428, - 0x01042A, 0x0004F9, 0x0004FB, 0x0004F5, 0x0004F7, 0x01043C, 0x01043E, 0x010439, - 0x010435, 0x010437, 0x010431, 0x010433, 0x0004C2, 0x0004DD, 0x0004DF, 0x0004D9, - 0x0004DB, 0x00056F, 0x0004D5, 0x0004D7, 0x0004D1, 0x0004D3, 0x0004AD, 0x0004AF, - 0x0004A9, 0x0004AB, 0x0004A5, 0x0004A7, 0x0104E4, 0x0104E6, 0x0104E0, 0x0104E2, + 0x0104F4, 0x0104F5, 0x0104F6, 0x0104F0, 0x0104F1, 0x0104F2, 0x0104F3, 0x000481, + 0x00049D, 0x00049F, 0x000499, 0x00049B, 0x000581, 0x000495, 0x000583, 0x000497, + 0x000585, 0x0104DC, 0x000587, 0x0104DE, 0x000568, 0x000569, 0x00056A, 0x00056B, + 0x000564, 0x000565, 0x000566, 0x00052D, 0x000567, 0x000561, 0x000562, 0x000563, + 0x00057C, 0x00057D, 0x00057E, 0x00057F, 0x000578, 0x000579, 0x00057A, 0x00057B, + 0x00FB01, 0x00FB05, 0x00FB03, 0x00FB02, 0x000574, 0x00FB00, 0x000575, 0x00FB06, + 0x000576, 0x000577, 0x000570, 0x000571, 0x000572, 0x00FB04, 0x000573, 0x002184, + 0x0024E8, 0x0024E9, 0x00FB13, 0x0024E4, 0x00FB15, 0x0024E6, 0x00FB17, 0x0024E0, + 0x0024E2, 0x001E61, 0x001E63, 0x001E7D, 0x001E7F, 0x001E79, 0x001E7B, 0x001E75, + 0x001E77, 0x0024DC, 0x0024DE, 0x0024D8, 0x0024DA, 0x0024D4, 0x0024D6, 0x0024D0, + 0x0024D2, 0x001E51, 0x001E53, 0x001E2D, 0x001E2F, 0x001E29, 0x001E2B, 0x001E25, + 0x001E27, 0x001E21, 0x001E23, 0x001E3D, 0x001E3F, 0x001E3B, 0x001E09, 0x001E0B, + 0x001E05, 0x001E07, 0x001E01, 0x001E03, 0x001E1D, 0x001E1F, 0x001EF9, 0x001EFB, + 0x001EF5, 0x001EF7, 0x001EF1, 0x001EF3, 0x001ECD, 0x001ECF, 0x000584, 0x000586, + 0x000071, 0x000073, 0x000580, 0x000072, 0x000582, 0x000070, 0x001EC1, 0x001EC3, + 0x001EDD, 0x001EDF, 0x00FF4C, 0x00FF4E, 0x00FF48, 0x00FF4A, 0x00FF46, 0x000268, + 0x000266, 0x001EAB, 0x00FF5A, 0x00FF54, 0x00FF56, 0x00FF50, 0x00FF52, 0x001EBB, + 0x000272, 0x001EB7, 0x001E89, 0x000240, 0x001E85, 0x000242, 0x001E87, 0x00025C, + 0x001E81, 0x002C30, 0x001E83, 0x000259, 0x00214E, 0x00025B, 0x001E99, 0x000250, + 0x000229, 0x00022B, 0x000225, 0x000227, 0x002C3D, 0x002C3C, 0x002C3F, 0x002C3E, + 0x001F64, 0x002C68, 0x001F65, 0x002C6C, 0x0000B5, 0x00217C, 0x001F66, 0x001F61, + 0x002C4C, 0x00217E, 0x002C6A, 0x00217F, 0x002C4D, 0x002C5D, 0x002C4F, 0x002C4E, + 0x002C51, 0x002C50, 0x002C53, 0x002C52, 0x002C55, 0x002C54, 0x002C57, 0x002C56, + 0x002C59, 0x002C58, 0x002C5B, 0x002C5A, 0x002175, 0x002C5C, 0x002177, 0x002C5E, + 0x002179, 0x002171, 0x00217B, 0x00217A, 0x00217D, 0x002174, 0x002176, 0x002178, + 0x0000E9, 0x0000E1, 0x0000EB, 0x0000E3, 0x0000ED, 0x0000E5, 0x0000EF, 0x0000E7, + 0x002C61, 0x0000F1, 0x002C73, 0x0000F3, 0x0000F5, 0x001F62, 0x001F7C, 0x002C76, + 0x002C66, 0x002C65, 0x0000F9, 0x0000FB, 0x001F7D, 0x0000FD, 0x001F78, 0x0000FF, + 0x001F79, 0x001F7A, 0x001F7B, 0x001F74, 0x001F76, 0x001F70, 0x001F72, 0x000209, + 0x00020B, 0x000205, 0x000207, 0x001F44, 0x000203, 0x001F40, 0x001F42, 0x000219, + 0x00021B, 0x001F54, 0x001F56, 0x00A681, 0x00A683, 0x001F24, 0x001F26, 0x001F20, + 0x001F22, 0x01E92C, 0x01E92E, 0x01E928, 0x01E92A, 0x001F30, 0x01E93C, 0x01E93E, + 0x01E939, 0x01E93A, 0x00A74D, 0x00A74F, 0x0118CE, 0x0118C4, 0x0118C6, 0x0118C0, + 0x002C89, 0x002C81, 0x002C8B, 0x002C83, 0x002C8D, 0x002C85, 0x002C8F, 0x002C87, + 0x000111, 0x002C91, 0x000113, 0x002C93, 0x002C95, 0x000117, 0x0118C2, 0x000115, + 0x000119, 0x00011B, 0x002C99, 0x002C9B, 0x0118D6, 0x002C9D, 0x0118D0, 0x002C9F, + 0x0118D2, 0x000161, 0x001FF4, 0x000163, 0x00A729, 0x001FF6, 0x002CC7, 0x00028C, + 0x00A725, 0x001FF2, 0x000289, 0x00028A, 0x00A73D, 0x00A739, 0x001FC6, 0x00A733, + 0x001FD7, 0x001FD0, 0x001FD1, 0x001FD2, 0x002CD5, 0x000175, 0x001FD3, 0x001FAC, + 0x00017E, 0x00017C, 0x00017A, 0x00017F, 0x001C85, 0x002CD9, 0x001C87, 0x001C88, + 0x000171, 0x001FAD, 0x001FAE, 0x000173, 0x002CE1, 0x000165, 0x002CE3, 0x000167, + 0x000177, 0x000169, 0x002CEC, 0x00016B, 0x002CEE, 0x00016D, 0x001FAF, 0x00016F, + 0x001FA8, 0x001FA9, 0x001FAA, 0x001FAB, 0x001FA4, 0x001FA5, 0x001FA6, 0x001FA7, + 0x001FA2, 0x001FA3, 0x001FBC, 0x001FBE, 0x00037B, 0x000377, 0x001FB4, 0x000371, + 0x002D20, 0x002D21, 0x002D22, 0x002D23, 0x002D25, 0x002D04, 0x002D27, 0x002D06, + 0x001FB6, 0x002D08, 0x001FB0, 0x002D0A, 0x002D24, 0x002D0C, 0x002D2D, 0x002D0E, + 0x001FB1, 0x001FB2, 0x001FB3, 0x001F8C, 0x001F8D, 0x001F8E, 0x001F8F, 0x001F88, + 0x001F8A, 0x010CED, 0x001F8B, 0x001F84, 0x001F85, 0x001F86, 0x001F87, 0x001F80, + 0x002D11, 0x000180, 0x000183, 0x002D13, 0x000195, 0x002D05, 0x000185, 0x002D07, + 0x002D17, 0x002D09, 0x000199, 0x002D0B, 0x000188, 0x002D0D, 0x00018C, 0x002D0F, + 0x010CC5, 0x010CC4, 0x010CC7, 0x010CC6, 0x010CC9, 0x010CC8, 0x010CCB, 0x010CCA, + 0x010CCD, 0x010CCC, 0x010CCF, 0x010CCE, 0x010CD1, 0x010CD0, 0x010CD3, 0x010CD2, + 0x0001A1, 0x002D01, 0x0001A3, 0x002D03, 0x0001A5, 0x001F81, 0x001F82, 0x001F83, + 0x010CD5, 0x0001A8, 0x010CD4, 0x001F9C, 0x010CE1, 0x010CF1, 0x010CE3, 0x010CE2, + 0x010CE0, 0x0001B9, 0x010CE7, 0x010CEB, 0x0001B6, 0x002D15, 0x001F9D, 0x010CEA, + 0x002D1E, 0x002D1C, 0x002D1A, 0x002D1F, 0x0001BD, 0x010CF0, 0x0001BF, 0x010CF2, + 0x001F9E, 0x010CE5, 0x001F9F, 0x010CE4, 0x0001C5, 0x010CE9, 0x001F98, 0x0001C6, + 0x0001C9, 0x0001C8, 0x0001CB, 0x010CEF, 0x001F99, 0x0001CC, 0x001F9A, 0x0001CE, + 0x001F9B, 0x001F94, 0x001F95, 0x001F96, 0x001F97, 0x001F90, 0x001F91, 0x001F92, + 0x001F93, 0x00A7A9, 0x00A7A5, 0x00A7A7, 0x0001DD, 0x0001DC, 0x0001DF, 0x00A7A1, + 0x0001E1, 0x00A7A3, 0x0001E3, 0x00A7B5, 0x0001E5, 0x00A7B7, 0x0001E7, 0x00A78C, + 0x00A797, 0x0003F8, 0x0001EB, 0x0001E9, 0x0001ED, 0x00A791, 0x0001EF, 0x0003F5, + 0x0003F0, 0x0001F0, 0x0001F3, 0x0001F2, 0x0001F5, 0x0003F1, 0x0003F2, 0x0003F3, + 0x0001F9, 0x0003CD, 0x0001FB, 0x0003CE, 0x0001FD, 0x0003C9, 0x0001FF, 0x0003CB, + 0x0003C4, 0x0003C7, 0x0003C0, 0x0003C2, 0x0003C3, 0x0003DD, 0x0003DF, 0x010CEC, + 0x010CEE, 0x010CE8, 0x010CE6, 0x002C48, 0x002C49, 0x002C4A, 0x000201, 0x002C4B, + 0x000211, 0x002C44, 0x000213, 0x002C45, 0x000215, 0x002C46, 0x000217, 0x002C47, + 0x002C40, 0x002C41, 0x002C42, 0x002C43, 0x0003BF, 0x010CC0, 0x010CC1, 0x010CC2, + 0x010CC3, 0x010CDC, 0x010CDD, 0x010CDE, 0x010CDF, 0x010CD8, 0x010CD9, 0x010CDA, + 0x010CDB, 0x010CD6, 0x010CD7, 0x002C38, 0x00022D, 0x002C39, 0x00022F, 0x002C3A, + 0x002C3B, 0x002C34, 0x002C35, 0x002C36, 0x001D79, 0x001D7D, 0x002C37, 0x002C31, + 0x002C32, 0x002C33, 0x00006C, 0x00006D, 0x00006E, 0x00006F, 0x000068, 0x000069, + 0x00006A, 0x00006B, 0x00026C, 0x000064, 0x000065, 0x000247, 0x00AB53, 0x000066, + 0x000249, 0x00024B, 0x000067, 0x000061, 0x00024D, 0x00026A, 0x00024F, 0x000062, + 0x000251, 0x000063, 0x000253, 0x000252, 0x000078, 0x000254, 0x000257, 0x000256, + 0x000079, 0x00007A, 0x000074, 0x000075, 0x000076, 0x000077, 0x00AB79, 0x00AB7B, + 0x000261, 0x00AB74, 0x000263, 0x00AB75, 0x00AB76, 0x0118C1, 0x00AB77, 0x0118CF, + 0x000269, 0x0118C5, 0x00026B, 0x0118C7, 0x00AB7A, 0x00AB7C, 0x00026F, 0x00AB70, + 0x00AB7D, 0x00AB7F, 0x00AB78, 0x00AB7E, 0x000275, 0x000265, 0x00A643, 0x000260, + 0x000271, 0x00AB71, 0x00AB72, 0x00A641, 0x00027D, 0x00AB73, 0x001C84, 0x001C86, + 0x001C80, 0x000280, 0x000283, 0x000287, 0x00ABB1, 0x00AB90, 0x00ABB3, 0x00AB92, + 0x00023F, 0x00AB94, 0x00028B, 0x00AB96, 0x00ABB0, 0x00AB98, 0x00ABB9, 0x00AB9A, + 0x00020D, 0x00020F, 0x00A665, 0x000292, 0x00A667, 0x00029D, 0x00021D, 0x00021F, + 0x001C81, 0x001C82, 0x001C83, 0x002CF3, 0x002CCD, 0x00029E, 0x002CCF, 0x000288, + 0x00AB8C, 0x00AB8D, 0x00AB8E, 0x00AB8F, 0x00ABA1, 0x00AB91, 0x00A66D, 0x00AB93, + 0x00A647, 0x00AB95, 0x0118CD, 0x00AB97, 0x0118C3, 0x00AB99, 0x000223, 0x00AB9B, + 0x002CC9, 0x0118C9, 0x00A64B, 0x0118CB, 0x0118D9, 0x00A645, 0x0118D3, 0x0118DB, + 0x0118D1, 0x0118D4, 0x0118DA, 0x000233, 0x002CCB, 0x001E15, 0x002CC5, 0x000231, + 0x0118DD, 0x002CC1, 0x0118DF, 0x001E0D, 0x0118D5, 0x00A649, 0x001E0F, 0x00A657, + 0x0118C8, 0x0118CC, 0x00A669, 0x0118CA, 0x002CC3, 0x00A64D, 0x00A663, 0x002CDD, + 0x001E13, 0x00A64F, 0x001E17, 0x00A661, 0x0118D8, 0x001E11, 0x00A66B, 0x0118D7, + 0x0118DC, 0x002CDF, 0x0118DE, 0x002CDB, 0x00A653, 0x002CD7, 0x00A655, 0x002CD1, + 0x00A65D, 0x00A659, 0x00A651, 0x00A65B, 0x002CD3, 0x002CAD, 0x002CAF, 0x00A65F, + 0x002CA9, 0x002CAB, 0x002CA5, 0x002CA7, 0x00A687, 0x001E19, 0x001E37, 0x00A685, + 0x00A689, 0x002CA1, 0x00A68B, 0x002CA3, 0x00A68D, 0x002CBD, 0x00A68F, 0x002CBF, + 0x002CB9, 0x001E1B, 0x001E35, 0x00023C, 0x001E41, 0x002CBB, 0x001E43, 0x002CB5, + 0x001E45, 0x002CB7, 0x001E47, 0x002CB1, 0x001E49, 0x002CB3, 0x001E4B, 0x0000EC, + 0x001E4D, 0x0000EE, 0x001E4F, 0x0000E8, 0x0000EA, 0x0000E4, 0x0000E6, 0x0000E0, + 0x001E55, 0x0000E2, 0x001E57, 0x0000FC, 0x001E59, 0x0000FE, 0x001E5B, 0x0000F8, + 0x001E5D, 0x0000FA, 0x001E5F, 0x0000F4, 0x0000F6, 0x002C97, 0x0000F0, 0x0000F2, + 0x001E65, 0x0000DF, 0x001E67, 0x00ABAC, 0x001E69, 0x001E6B, 0x001E39, 0x00ABAD, + 0x001E6D, 0x00ABAE, 0x001E6F, 0x00ABAF, 0x001E71, 0x001E73, 0x00A697, 0x00ABA8, + 0x00ABA9, 0x00ABAA, 0x00ABAB, 0x00ABA4, 0x001E33, 0x00ABA5, 0x00ABA6, 0x00ABA7, + 0x00ABA0, 0x00ABA2, 0x001E31, 0x00ABA3, 0x001ED1, 0x00ABBC, 0x001EDB, 0x00A693, + 0x00ABBD, 0x000345, 0x001ED5, 0x00ABBE, 0x00ABBF, 0x001E8B, 0x00ABB8, 0x001EBD, + 0x001E8D, 0x001E8F, 0x00A691, 0x001EBF, 0x001E91, 0x00ABBA, 0x001E93, 0x00ABBB, + 0x001E95, 0x00ABB4, 0x001E97, 0x001E96, 0x00ABB5, 0x001E98, 0x001E9B, 0x001E9A, + 0x00ABB6, 0x00ABB7, 0x00ABB2, 0x00AB88, 0x001EA1, 0x00AB89, 0x001EEF, 0x00A695, + 0x001EA5, 0x001EA3, 0x001EA7, 0x00AB8A, 0x00A699, 0x00AB8B, 0x00A69B, 0x00AB84, + 0x001EAD, 0x00A741, 0x001EAF, 0x00A743, 0x001EB1, 0x00A761, 0x001EB3, 0x00A74B, + 0x00AB85, 0x000373, 0x00AB86, 0x00AB87, 0x001EB9, 0x001EA9, 0x00AB80, 0x001ED9, + 0x001EB5, 0x00037C, 0x00AB81, 0x001EED, 0x00AB82, 0x001ED7, 0x001EE1, 0x00037D, + 0x001EC5, 0x001EE5, 0x001EC7, 0x001EE7, 0x001EC9, 0x00A75D, 0x001ECB, 0x001EEB, + 0x001EE9, 0x00AB83, 0x00A723, 0x00A76D, 0x00A765, 0x00A727, 0x001ED3, 0x0024E5, + 0x00A72D, 0x000390, 0x001EFD, 0x00A76F, 0x001EFF, 0x00A77C, 0x00A72F, 0x00A72B, + 0x0013FD, 0x0003D9, 0x0013FC, 0x00A737, 0x0013F9, 0x0013F8, 0x0013FB, 0x0013FA, + 0x0003E5, 0x00A77F, 0x00A73B, 0x00A73F, 0x0003E7, 0x00A735, 0x00A763, 0x001EE3, + 0x0003AC, 0x00A745, 0x00A749, 0x00A747, 0x0003AD, 0x0003BD, 0x0003AF, 0x0003AE, + 0x0003B1, 0x0003B0, 0x0003B3, 0x0003B2, 0x0003B5, 0x0003B4, 0x0003B7, 0x0003B6, + 0x0003B9, 0x0003B8, 0x0003BB, 0x0003BA, 0x00A75F, 0x0003BC, 0x001F06, 0x0003BE, + 0x00A759, 0x0003D1, 0x00A75B, 0x0003D0, 0x00A755, 0x0003D5, 0x0003ED, 0x00A757, + 0x0003EF, 0x0003E9, 0x00A767, 0x0003DB, 0x00A751, 0x01E925, 0x01E927, 0x0003E3, + 0x0003C1, 0x001F11, 0x01E923, 0x001F13, 0x0003E1, 0x00A769, 0x00A76B, 0x0003D6, + 0x0003C6, 0x0003C5, 0x001F15, 0x0003D7, 0x010429, 0x01042B, 0x01E936, 0x00A753, + 0x01042D, 0x0003C8, 0x01042F, 0x0003CC, 0x01043A, 0x010430, 0x00A77A, 0x010432, + 0x010438, 0x010434, 0x0003CA, 0x010436, 0x01E943, 0x001F35, 0x001F37, 0x01E941, + 0x01043B, 0x01043F, 0x001F33, 0x01043D, 0x0003EB, 0x010440, 0x010443, 0x0003FB, + 0x001F10, 0x001F14, 0x010445, 0x001F12, 0x001F25, 0x001F03, 0x001F27, 0x001F21, + 0x010448, 0x001F01, 0x01044C, 0x001F02, 0x00A783, 0x01E93D, 0x001F45, 0x00A793, + 0x00A787, 0x00A781, 0x01E92D, 0x001F00, 0x001F53, 0x01E922, 0x01E93F, 0x001F51, + 0x001F55, 0x01E926, 0x001F57, 0x01E929, 0x00A799, 0x01E938, 0x00A785, 0x01E92F, + 0x0024D1, 0x000438, 0x0024D3, 0x01E92B, 0x0024D5, 0x01E933, 0x0024D7, 0x00A79B, + 0x0024D9, 0x01E931, 0x0024DB, 0x01E932, 0x0024DD, 0x00043A, 0x0024DF, 0x00043B, + 0x0024E1, 0x01E93B, 0x0024E3, 0x01E930, 0x001F31, 0x001F32, 0x001F23, 0x01E937, + 0x000431, 0x001F36, 0x000433, 0x000434, 0x000435, 0x01E934, 0x000437, 0x000436, + 0x000439, 0x000430, 0x000432, 0x01E935, 0x00FF45, 0x00043C, 0x00FF4F, 0x0024E7, + 0x00A79D, 0x000440, 0x00FF49, 0x000442, 0x00A79F, 0x000444, 0x000447, 0x000446, + 0x000449, 0x001F89, 0x0104DD, 0x0104DF, 0x00044D, 0x0104D9, 0x00044F, 0x0104D8, + 0x000451, 0x000450, 0x000453, 0x01E924, 0x00AB9C, 0x00AB9D, 0x00AB9E, 0x00FF4D, + 0x000459, 0x00AB9F, 0x002D00, 0x00045A, 0x00045D, 0x00045C, 0x00045F, 0x001FA1, + 0x000461, 0x001FA0, 0x000463, 0x001F60, 0x000465, 0x002D02, 0x000467, 0x0104F7, + 0x00FF41, 0x00046B, 0x00FF43, 0x000469, 0x00046D, 0x00046F, 0x00FF47, 0x001F07, + 0x000471, 0x001FB7, 0x000473, 0x001F34, 0x000475, 0x001F04, 0x000477, 0x00FF58, + 0x000479, 0x00FF57, 0x00047B, 0x001F05, 0x00FF55, 0x001FC2, 0x00047F, 0x00047D, + 0x00FF59, 0x001FC4, 0x001FC7, 0x001FC3, 0x001FE0, 0x00FF4B, 0x001F41, 0x001F43, + 0x001FE4, 0x0104DB, 0x001FE6, 0x00FF53, 0x00048D, 0x00FF42, 0x00048F, 0x00FF51, + 0x001F63, 0x01E942, 0x00FF44, 0x001FD6, 0x0104E1, 0x01E940, 0x0104E3, 0x001FCC, + 0x0104E5, 0x0104EC, 0x0104E7, 0x0104EF, 0x0104E9, 0x0104ED, 0x0104EB, 0x0104EA, + 0x001FE5, 0x0104E8, 0x001FE7, 0x0104EE, 0x001FE1, 0x0004A1, 0x001F67, 0x001FE3, + 0x001F71, 0x001F73, 0x001FE2, 0x0004A3, 0x0104F9, 0x001FF3, 0x0104FB, 0x001FF7, + 0x0004B1, 0x001F52, 0x0004B3, 0x0104DA, 0x0004B5, 0x001F50, 0x0004B7, 0x001F75, + 0x0004B9, 0x001FFC, 0x0004BB, 0x001F77, 0x0004BD, 0x002D1D, 0x0004BF, 0x002D18, + 0x0004CC, 0x002D19, 0x002D1B, 0x002D14, 0x0004CE, 0x0004C4, 0x002D16, 0x0004C6, + 0x0004CF, 0x0004C8, 0x002D10, 0x0004CA, 0x002D12, 0x00014D, 0x00014F, 0x00048B, + 0x000148, 0x000149, 0x00014B, 0x000144, 0x000146, 0x000140, 0x000142, 0x00015D, + 0x00015F, 0x000159, 0x000491, 0x000493, 0x00015B, 0x000155, 0x000157, 0x000151, + 0x0004E1, 0x000153, 0x0004E3, 0x00012D, 0x00012F, 0x000129, 0x00012B, 0x000125, + 0x000127, 0x000121, 0x000123, 0x00013C, 0x00013E, 0x00013A, 0x000135, 0x000137, + 0x000131, 0x0004F3, 0x000133, 0x0004F1, 0x00010D, 0x00010F, 0x000109, 0x00010B, + 0x0004E9, 0x000105, 0x000107, 0x000101, 0x0004FD, 0x0004FF, 0x0004ED, 0x000103, + 0x000501, 0x00011D, 0x000503, 0x00011F, 0x000505, 0x00044C, 0x000507, 0x00044E, + 0x000509, 0x000448, 0x00050B, 0x00044A, 0x00050D, 0x00050F, 0x00044B, 0x000445, + 0x000511, 0x000441, 0x000513, 0x000443, 0x000515, 0x00045E, 0x000517, 0x000458, + 0x000519, 0x00045B, 0x00051B, 0x000454, 0x00051D, 0x000455, 0x00051F, 0x000456, + 0x000521, 0x000457, 0x000523, 0x000452, 0x000525, 0x000527, 0x0001D8, 0x0001DA, + 0x000529, 0x0001D4, 0x00052B, 0x0001D6, 0x0001D0, 0x00056D, 0x0001D2, 0x00056C, + 0x0001AD, 0x00043D, 0x00043E, 0x00043F, 0x002170, 0x002172, 0x002173, 0x0001B4, + 0x0001B0, 0x01044D, 0x01044E, 0x01044F, 0x010449, 0x01044A, 0x01044B, 0x00052F, + 0x010444, 0x010446, 0x010447, 0x010441, 0x010442, 0x00019E, 0x00019A, 0x0004EF, + 0x0004EB, 0x0004E5, 0x000192, 0x00056E, 0x0004E7, 0x01042C, 0x01042E, 0x010428, + 0x01042A, 0x0004F9, 0x0004FB, 0x0004F5, 0x0004F7, 0x01043C, 0x01043E, 0x010439, + 0x010435, 0x010437, 0x010431, 0x010433, 0x0004C2, 0x0004DD, 0x0004DF, 0x0004D9, + 0x0004DB, 0x00056F, 0x0004D5, 0x0004D7, 0x0004D1, 0x0004D3, 0x0004AD, 0x0004AF, + 0x0004A9, 0x0004AB, 0x0004A5, 0x0004A7, 0x0104E4, 0x0104E6, 0x0104E0, 0x0104E2, 0x00FB14, 0x00FB16, 0x0104F8, 0x0104FA, }; /* indexes */ const uint16_t NU_TOUPPER_VALUES_I[] = { - 0x0714, 0x0719, 0x071E, 0x0700, 0x0705, 0x070A, 0x070F, 0x0452, 0x0470, 0x0473, - 0x046A, 0x046D, 0x05AE, 0x0464, 0x05B4, 0x0467, 0x05BA, 0x069C, 0x137B, 0x06A6, - 0x0563, 0x0566, 0x0569, 0x056C, 0x0557, 0x055A, 0x055D, 0x0548, 0x0560, 0x054E, - 0x0551, 0x0554, 0x059F, 0x05A2, 0x05A5, 0x05A8, 0x0593, 0x0596, 0x0599, 0x059C, - 0x156D, 0x157B, 0x1573, 0x1570, 0x0587, 0x156A, 0x058A, 0x157E, 0x058D, 0x0590, - 0x057B, 0x057E, 0x0581, 0x1577, 0x0584, 0x0D78, 0x0DDC, 0x0DE0, 0x1581, 0x0DCC, - 0x158B, 0x0DD4, 0x1595, 0x0DBC, 0x0DC4, 0x09D7, 0x09DB, 0x0A0F, 0x0A13, 0x0A07, - 0x0A0B, 0x09FF, 0x0A03, 0x0DAC, 0x0DB4, 0x0D9C, 0x0DA4, 0x0D8C, 0x0D94, 0x0D7C, - 0x0D84, 0x09B7, 0x09BB, 0x096F, 0x0973, 0x0967, 0x096B, 0x095F, 0x0963, 0x0957, - 0x095B, 0x098F, 0x0993, 0x098B, 0x0927, 0x092B, 0x091F, 0x0923, 0x0917, 0x091B, - 0x094F, 0x0953, 0x0BA1, 0x0BA5, 0x0B99, 0x0B9D, 0x0B91, 0x0B95, 0x0B49, 0x0B4D, - 0x05B7, 0x05BD, 0x0021, 0x0025, 0x05AB, 0x0023, 0x05B1, 0x001F, 0x0B31, 0x0B35, - 0x0B69, 0x0B6D, 0x1326, 0x132E, 0x1316, 0x131E, 0x130E, 0x0288, 0x0284, 0x0B05, - 0x135E, 0x1346, 0x134E, 0x1336, 0x133E, 0x0B25, 0x02A1, 0x0B1D, 0x0A27, 0x023E, - 0x0A1F, 0x0242, 0x0A23, 0x0272, 0x0A17, 0x0DE4, 0x0A1B, 0x026C, 0x0D34, 0x026F, - 0x138C, 0x0254, 0x0225, 0x0228, 0x021F, 0x0222, 0x0E18, 0x0E14, 0x0E20, 0x0E1C, - 0x0C61, 0x0EAA, 0x0C65, 0x0EB2, 0x0035, 0x0D68, 0x0C69, 0x0C55, 0x0E54, 0x0D70, - 0x0EAE, 0x0D74, 0x0E58, 0x0E98, 0x0E60, 0x0E5C, 0x0E68, 0x0E64, 0x0E70, 0x0E6C, - 0x0E78, 0x0E74, 0x0E80, 0x0E7C, 0x0E88, 0x0E84, 0x0E90, 0x0E8C, 0x0D4C, 0x0E94, - 0x0D54, 0x0E9C, 0x0D5C, 0x0D3C, 0x0D64, 0x0D60, 0x0D6C, 0x0D48, 0x0D50, 0x0D58, - 0x0053, 0x003B, 0x0059, 0x0041, 0x005F, 0x0047, 0x0065, 0x004D, 0x0EA0, 0x006B, - 0x0EB6, 0x0071, 0x0077, 0x0C59, 0x0CA1, 0x0EBA, 0x0EA7, 0x0EA4, 0x0080, 0x0086, - 0x0CA5, 0x008C, 0x0C91, 0x0092, 0x0C95, 0x0C99, 0x0C9D, 0x0C81, 0x0C89, 0x0C71, - 0x0C79, 0x01F8, 0x01FB, 0x01F2, 0x01F5, 0x0C39, 0x01EF, 0x0C29, 0x0C31, 0x0210, - 0x0213, 0x13A0, 0x13A7, 0x108E, 0x1092, 0x0BF9, 0x0C01, 0x0BE9, 0x0BF1, 0x0A6D, - 0x0A77, 0x0A59, 0x0A63, 0x0C09, 0x0AC1, 0x0ACB, 0x0AB2, 0x0AB7, 0x1116, 0x111A, - 0x0881, 0x084F, 0x0859, 0x083B, 0x0ECE, 0x0EBE, 0x0ED2, 0x0EC2, 0x0ED6, 0x0EC6, - 0x0EDA, 0x0ECA, 0x00AD, 0x0EDE, 0x00B0, 0x0EE2, 0x0EE6, 0x00B6, 0x0845, 0x00B3, - 0x00B9, 0x00BC, 0x0EEE, 0x0EF2, 0x08A9, 0x0EF6, 0x088B, 0x0EFA, 0x0895, 0x0121, - 0x1554, 0x0124, 0x10D2, 0x1559, 0x0F4A, 0x02C1, 0x10CA, 0x1549, 0x02B8, 0x02BB, - 0x10F6, 0x10EE, 0x14FF, 0x10E2, 0x1523, 0x0D1C, 0x0D20, 0x1510, 0x0F66, 0x013F, - 0x1517, 0x14B6, 0x014B, 0x0148, 0x0145, 0x014E, 0x0902, 0x0F6E, 0x0908, 0x090B, - 0x0139, 0x14BC, 0x14C2, 0x013C, 0x0F7E, 0x0127, 0x0F82, 0x012A, 0x0142, 0x012D, - 0x0F86, 0x0130, 0x0F8A, 0x0133, 0x14C8, 0x0136, 0x149E, 0x14A4, 0x14AA, 0x14B0, - 0x1486, 0x148C, 0x1492, 0x1498, 0x147A, 0x1480, 0x14EA, 0x0D15, 0x02DB, 0x02D8, - 0x14D9, 0x02D2, 0x1012, 0x1016, 0x101A, 0x101E, 0x1026, 0x0FA2, 0x102A, 0x0FAA, - 0x14DE, 0x0FB2, 0x0D09, 0x0FBA, 0x1022, 0x0FC2, 0x102E, 0x0FCA, 0x0D0D, 0x14CE, - 0x14D4, 0x13F6, 0x13FC, 0x1402, 0x1408, 0x13DE, 0x13EA, 0x081D, 0x13F0, 0x13C6, - 0x13CC, 0x13D2, 0x13D8, 0x13AE, 0x0FD6, 0x0150, 0x0153, 0x0FDE, 0x0162, 0x0FA6, - 0x0156, 0x0FAE, 0x0FEE, 0x0FB6, 0x0165, 0x0FBE, 0x0159, 0x0FC6, 0x015C, 0x0FCE, - 0x0755, 0x0750, 0x075F, 0x075A, 0x0769, 0x0764, 0x0773, 0x076E, 0x077D, 0x0778, - 0x0787, 0x0782, 0x0791, 0x078C, 0x079B, 0x0796, 0x016E, 0x0F96, 0x0171, 0x0F9E, - 0x0174, 0x13B4, 0x13BA, 0x13C0, 0x07A5, 0x0177, 0x07A0, 0x1456, 0x07E1, 0x0831, - 0x07EB, 0x07E6, 0x07DC, 0x0186, 0x07FF, 0x0813, 0x0183, 0x0FE6, 0x145C, 0x080E, - 0x100A, 0x1002, 0x0FFA, 0x100E, 0x0189, 0x082C, 0x018C, 0x0836, 0x1462, 0x07F5, - 0x1468, 0x07F0, 0x018F, 0x0809, 0x143E, 0x0192, 0x0198, 0x0195, 0x019B, 0x0827, - 0x1444, 0x019E, 0x144A, 0x01A1, 0x1450, 0x1426, 0x142C, 0x1432, 0x1438, 0x140E, - 0x1414, 0x141A, 0x1420, 0x11AA, 0x11A2, 0x11A6, 0x01B9, 0x01B6, 0x01BC, 0x119A, - 0x01BF, 0x119E, 0x01C2, 0x11AE, 0x01C5, 0x11B2, 0x01C8, 0x117A, 0x1186, 0x038C, - 0x01CE, 0x01CB, 0x01D1, 0x117E, 0x01D4, 0x0389, 0x037D, 0x1369, 0x01DA, 0x01D7, - 0x01DD, 0x0380, 0x0383, 0x0386, 0x01E0, 0x0344, 0x01E3, 0x0347, 0x01E6, 0x0338, - 0x01E9, 0x033E, 0x0329, 0x0332, 0x031D, 0x0323, 0x0326, 0x035F, 0x0362, 0x0818, - 0x0822, 0x0804, 0x07FA, 0x0E44, 0x0E48, 0x0E4C, 0x01EC, 0x0E50, 0x0204, 0x0E34, - 0x0207, 0x0E38, 0x020A, 0x0E3C, 0x020D, 0x0E40, 0x0E24, 0x0E28, 0x0E2C, 0x0E30, - 0x031A, 0x073C, 0x0741, 0x0746, 0x074B, 0x07C8, 0x07CD, 0x07D2, 0x07D7, 0x07B4, - 0x07B9, 0x07BE, 0x07C3, 0x07AA, 0x07AF, 0x0E04, 0x022B, 0x0E08, 0x022E, 0x0E0C, - 0x0E10, 0x0DF4, 0x0DF8, 0x0DFC, 0x090F, 0x0913, 0x0E00, 0x0DE8, 0x0DEC, 0x0DF0, - 0x0017, 0x0019, 0x001B, 0x001D, 0x000F, 0x0011, 0x0013, 0x0015, 0x0296, 0x0007, - 0x0009, 0x0245, 0x11B6, 0x000B, 0x0248, 0x024B, 0x000D, 0x0001, 0x024E, 0x028E, - 0x0251, 0x0003, 0x0258, 0x0005, 0x0260, 0x025C, 0x002F, 0x0263, 0x0269, 0x0266, - 0x0031, 0x0033, 0x0027, 0x0029, 0x002B, 0x002D, 0x11DE, 0x11E6, 0x0279, 0x11CA, - 0x027D, 0x11CE, 0x11D2, 0x0840, 0x11D6, 0x0886, 0x028B, 0x0854, 0x0292, 0x085E, - 0x11E2, 0x11EA, 0x029A, 0x11BA, 0x11EE, 0x11F6, 0x11DA, 0x11F2, 0x02A4, 0x0280, - 0x1036, 0x0276, 0x029D, 0x11BE, 0x11C2, 0x1032, 0x02A7, 0x11C6, 0x08FF, 0x0905, - 0x08F3, 0x02AB, 0x02AE, 0x02B1, 0x12BE, 0x123A, 0x12C6, 0x1242, 0x023A, 0x124A, - 0x02BE, 0x1252, 0x12BA, 0x125A, 0x12DE, 0x1262, 0x01FE, 0x0201, 0x107A, 0x02C4, - 0x107E, 0x02C7, 0x0216, 0x0219, 0x08F6, 0x08F9, 0x08FC, 0x0F8E, 0x0F56, 0x02CB, - 0x0F5A, 0x02B5, 0x122A, 0x122E, 0x1232, 0x1236, 0x127E, 0x123E, 0x108A, 0x1246, - 0x103E, 0x124E, 0x087C, 0x1256, 0x084A, 0x125E, 0x021C, 0x1266, 0x0F4E, 0x0868, - 0x1046, 0x0872, 0x08B8, 0x103A, 0x089A, 0x08C2, 0x0890, 0x089F, 0x08BD, 0x0234, - 0x0F52, 0x093F, 0x0F46, 0x0231, 0x08CC, 0x0F3E, 0x08D6, 0x092F, 0x08A4, 0x1042, - 0x0933, 0x105E, 0x0863, 0x0877, 0x1082, 0x086D, 0x0F42, 0x104A, 0x1076, 0x0F76, - 0x093B, 0x104E, 0x0943, 0x1072, 0x08B3, 0x0937, 0x1086, 0x08AE, 0x08C7, 0x0F7A, - 0x08D1, 0x0F72, 0x1056, 0x0F6A, 0x105A, 0x0F5E, 0x106A, 0x1062, 0x1052, 0x1066, - 0x0F62, 0x0F16, 0x0F1A, 0x106E, 0x0F0E, 0x0F12, 0x0F06, 0x0F0A, 0x109A, 0x0947, - 0x0983, 0x1096, 0x109E, 0x0EFE, 0x10A2, 0x0F02, 0x10A6, 0x0F36, 0x10AA, 0x0F3A, - 0x0F2E, 0x094B, 0x097F, 0x0237, 0x0997, 0x0F32, 0x099B, 0x0F26, 0x099F, 0x0F2A, - 0x09A3, 0x0F1E, 0x09A7, 0x0F22, 0x09AB, 0x005C, 0x09AF, 0x0062, 0x09B3, 0x0050, - 0x0056, 0x0044, 0x004A, 0x0038, 0x09BF, 0x003E, 0x09C3, 0x0089, 0x09C7, 0x008F, - 0x09CB, 0x007D, 0x09CF, 0x0083, 0x09D3, 0x0074, 0x007A, 0x0EEA, 0x0068, 0x006E, - 0x09DF, 0x1362, 0x09E3, 0x12AA, 0x09E7, 0x09EB, 0x0987, 0x12AE, 0x09EF, 0x12B2, - 0x09F3, 0x12B6, 0x09F7, 0x09FB, 0x10BA, 0x129A, 0x129E, 0x12A2, 0x12A6, 0x128A, - 0x097B, 0x128E, 0x1292, 0x1296, 0x127A, 0x1282, 0x0977, 0x1286, 0x0B51, 0x12EA, - 0x0B65, 0x10B2, 0x12EE, 0x02CF, 0x0B59, 0x12F2, 0x12F6, 0x0A2B, 0x12DA, 0x0B29, - 0x0A2F, 0x0A33, 0x10AE, 0x0B2D, 0x0A37, 0x12E2, 0x0A81, 0x12E6, 0x0AE9, 0x12CA, - 0x1384, 0x1380, 0x12CE, 0x1388, 0x0AED, 0x1390, 0x12D2, 0x12D6, 0x12C2, 0x121A, - 0x0AF1, 0x121E, 0x0B8D, 0x10B6, 0x0AF9, 0x0AF5, 0x0AFD, 0x1222, 0x10BE, 0x1226, - 0x10C2, 0x120A, 0x0B09, 0x10FE, 0x0B0D, 0x1102, 0x0B11, 0x113E, 0x0B15, 0x1112, - 0x120E, 0x02D5, 0x1212, 0x1216, 0x0B21, 0x0B01, 0x11FA, 0x0B61, 0x0B19, 0x02DE, - 0x11FE, 0x0B89, 0x1202, 0x0B5D, 0x0B71, 0x02E1, 0x0B39, 0x0B79, 0x0B3D, 0x0B7D, - 0x0B41, 0x1136, 0x0B45, 0x0B85, 0x0B81, 0x1206, 0x10C6, 0x1156, 0x1146, 0x10CE, - 0x0B55, 0x0DD0, 0x10DA, 0x136D, 0x0BA9, 0x115A, 0x0BAD, 0x1162, 0x10DE, 0x10D6, - 0x08EF, 0x0359, 0x08EB, 0x10EA, 0x08DF, 0x08DB, 0x08E7, 0x08E3, 0x036B, 0x1166, - 0x10F2, 0x10FA, 0x036E, 0x10E6, 0x1142, 0x0B75, 0x02E4, 0x1106, 0x110E, 0x110A, - 0x02E7, 0x0314, 0x02ED, 0x02EA, 0x02F0, 0x1374, 0x02F6, 0x02F3, 0x02FC, 0x02F9, - 0x0302, 0x02FF, 0x0308, 0x0305, 0x030E, 0x030B, 0x113A, 0x0311, 0x0BC9, 0x0317, - 0x112E, 0x034D, 0x1132, 0x034A, 0x1126, 0x0350, 0x0377, 0x112A, 0x037A, 0x0371, - 0x114A, 0x035C, 0x111E, 0x0A4A, 0x0A54, 0x0368, 0x0320, 0x0BD5, 0x0A40, 0x0BDD, - 0x0365, 0x114E, 0x1152, 0x0353, 0x032F, 0x032C, 0x0BE5, 0x0356, 0x05C5, 0x05CF, - 0x0AA3, 0x1122, 0x05D9, 0x0335, 0x05E3, 0x0341, 0x061A, 0x05E8, 0x115E, 0x05F2, - 0x0610, 0x05FC, 0x033B, 0x0606, 0x0AE4, 0x0C1D, 0x0C25, 0x0ADA, 0x061F, 0x0633, - 0x0C15, 0x0629, 0x0374, 0x0638, 0x0647, 0x038F, 0x0BD1, 0x0BE1, 0x0651, 0x0BD9, - 0x0BFD, 0x0BBD, 0x0C05, 0x0BED, 0x0660, 0x0BB5, 0x0674, 0x0BB9, 0x116E, 0x0AC6, - 0x0C3D, 0x1182, 0x1176, 0x116A, 0x0A72, 0x0BB1, 0x0C45, 0x0A3B, 0x0AD0, 0x0C41, - 0x0C49, 0x0A4F, 0x0C4D, 0x0A5E, 0x118A, 0x0AAD, 0x1172, 0x0A7C, 0x0D80, 0x03AA, - 0x0D88, 0x0A68, 0x0D90, 0x0A94, 0x0D98, 0x118E, 0x0DA0, 0x0A8A, 0x0DA8, 0x0A8F, - 0x0DB0, 0x03B0, 0x0DB8, 0x03B3, 0x0DC0, 0x0ABC, 0x0DC8, 0x0A85, 0x0C0D, 0x0C11, - 0x0BF5, 0x0AA8, 0x0395, 0x0C21, 0x039B, 0x039E, 0x03A1, 0x0A99, 0x03A7, 0x03A4, - 0x03AD, 0x0392, 0x0398, 0x0A9E, 0x130A, 0x03B6, 0x1332, 0x0DD8, 0x1192, 0x03C2, - 0x131A, 0x03C8, 0x1196, 0x03CE, 0x03D7, 0x03D4, 0x03DD, 0x13E4, 0x06A1, 0x06AB, - 0x03E9, 0x068D, 0x03EF, 0x0688, 0x03F5, 0x03F2, 0x03FB, 0x0A45, 0x126A, 0x126E, - 0x1272, 0x132A, 0x040D, 0x1276, 0x0F92, 0x0410, 0x0419, 0x0416, 0x041F, 0x1474, - 0x0422, 0x146E, 0x0425, 0x0C51, 0x0428, 0x0F9A, 0x042B, 0x0723, 0x12FA, 0x0431, - 0x1302, 0x042E, 0x0434, 0x0437, 0x1312, 0x0BCD, 0x043A, 0x14E3, 0x043D, 0x0C19, - 0x0440, 0x0BC1, 0x0443, 0x1356, 0x0446, 0x1352, 0x0449, 0x0BC5, 0x134A, 0x14EF, - 0x044F, 0x044C, 0x135A, 0x14FA, 0x1504, 0x14F5, 0x0D24, 0x1322, 0x0C2D, 0x0C35, - 0x1538, 0x0697, 0x153D, 0x1342, 0x0458, 0x12FE, 0x045B, 0x133A, 0x0C5D, 0x0ADF, - 0x1306, 0x151E, 0x06B5, 0x0AD5, 0x06BF, 0x150B, 0x06C9, 0x06EC, 0x06D3, 0x06FB, - 0x06DD, 0x06F1, 0x06E7, 0x06E2, 0x0D2C, 0x06D8, 0x1542, 0x06F6, 0x0D28, 0x0476, - 0x0C6D, 0x1531, 0x0C75, 0x0C7D, 0x152A, 0x0479, 0x072D, 0x154F, 0x0737, 0x155E, - 0x048E, 0x1399, 0x0491, 0x0692, 0x0494, 0x1394, 0x0497, 0x0C85, 0x049A, 0x1565, - 0x049D, 0x0C8D, 0x04A0, 0x1006, 0x04A3, 0x0FF2, 0x04B5, 0x0FF6, 0x0FFE, 0x0FE2, - 0x04B8, 0x04A9, 0x0FEA, 0x04AC, 0x04BB, 0x04AF, 0x0FD2, 0x04B2, 0x0FDA, 0x0103, - 0x0106, 0x0455, 0x00FD, 0x1365, 0x0100, 0x00F7, 0x00FA, 0x00F1, 0x00F4, 0x011B, - 0x011E, 0x0115, 0x045E, 0x0461, 0x0118, 0x010F, 0x0112, 0x0109, 0x04D6, 0x010C, - 0x04D9, 0x00D7, 0x00DA, 0x00D1, 0x00D4, 0x00CB, 0x00CE, 0x00C5, 0x00C8, 0x00EB, - 0x00EE, 0x00E8, 0x00E2, 0x00E5, 0x00DD, 0x04F1, 0x00DF, 0x04EE, 0x00A7, 0x00AA, - 0x00A1, 0x00A4, 0x04E2, 0x009B, 0x009E, 0x0095, 0x0500, 0x0503, 0x04E8, 0x0098, - 0x0506, 0x00BF, 0x0509, 0x00C2, 0x050C, 0x03E6, 0x050F, 0x03EC, 0x0512, 0x03DA, - 0x0515, 0x03E0, 0x0518, 0x051B, 0x03E3, 0x03D1, 0x051E, 0x03C5, 0x0521, 0x03CB, - 0x0524, 0x041C, 0x0527, 0x040A, 0x052A, 0x0413, 0x052D, 0x03FE, 0x0530, 0x0401, - 0x0533, 0x0404, 0x0536, 0x0407, 0x0539, 0x03F8, 0x053C, 0x053F, 0x01B0, 0x01B3, - 0x0542, 0x01AA, 0x0545, 0x01AD, 0x01A4, 0x0572, 0x01A7, 0x056F, 0x017A, 0x03B9, - 0x03BC, 0x03BF, 0x0D38, 0x0D40, 0x0D44, 0x0180, 0x017D, 0x0679, 0x067E, 0x0683, - 0x0665, 0x066A, 0x066F, 0x054B, 0x064C, 0x0656, 0x065B, 0x063D, 0x0642, 0x016B, - 0x0168, 0x04EB, 0x04E5, 0x04DC, 0x015F, 0x0575, 0x04DF, 0x05D4, 0x05DE, 0x05C0, - 0x05CA, 0x04FA, 0x04FD, 0x04F4, 0x04F7, 0x0624, 0x062E, 0x0615, 0x0601, 0x060B, - 0x05ED, 0x05F7, 0x04A6, 0x04D0, 0x04D3, 0x04CA, 0x04CD, 0x0578, 0x04C4, 0x04C7, - 0x04BE, 0x04C1, 0x0488, 0x048B, 0x0482, 0x0485, 0x047C, 0x047F, 0x06C4, 0x06CE, + 0x0714, 0x0719, 0x071E, 0x0700, 0x0705, 0x070A, 0x070F, 0x0452, 0x0470, 0x0473, + 0x046A, 0x046D, 0x05AE, 0x0464, 0x05B4, 0x0467, 0x05BA, 0x069C, 0x137B, 0x06A6, + 0x0563, 0x0566, 0x0569, 0x056C, 0x0557, 0x055A, 0x055D, 0x0548, 0x0560, 0x054E, + 0x0551, 0x0554, 0x059F, 0x05A2, 0x05A5, 0x05A8, 0x0593, 0x0596, 0x0599, 0x059C, + 0x156D, 0x157B, 0x1573, 0x1570, 0x0587, 0x156A, 0x058A, 0x157E, 0x058D, 0x0590, + 0x057B, 0x057E, 0x0581, 0x1577, 0x0584, 0x0D78, 0x0DDC, 0x0DE0, 0x1581, 0x0DCC, + 0x158B, 0x0DD4, 0x1595, 0x0DBC, 0x0DC4, 0x09D7, 0x09DB, 0x0A0F, 0x0A13, 0x0A07, + 0x0A0B, 0x09FF, 0x0A03, 0x0DAC, 0x0DB4, 0x0D9C, 0x0DA4, 0x0D8C, 0x0D94, 0x0D7C, + 0x0D84, 0x09B7, 0x09BB, 0x096F, 0x0973, 0x0967, 0x096B, 0x095F, 0x0963, 0x0957, + 0x095B, 0x098F, 0x0993, 0x098B, 0x0927, 0x092B, 0x091F, 0x0923, 0x0917, 0x091B, + 0x094F, 0x0953, 0x0BA1, 0x0BA5, 0x0B99, 0x0B9D, 0x0B91, 0x0B95, 0x0B49, 0x0B4D, + 0x05B7, 0x05BD, 0x0021, 0x0025, 0x05AB, 0x0023, 0x05B1, 0x001F, 0x0B31, 0x0B35, + 0x0B69, 0x0B6D, 0x1326, 0x132E, 0x1316, 0x131E, 0x130E, 0x0288, 0x0284, 0x0B05, + 0x135E, 0x1346, 0x134E, 0x1336, 0x133E, 0x0B25, 0x02A1, 0x0B1D, 0x0A27, 0x023E, + 0x0A1F, 0x0242, 0x0A23, 0x0272, 0x0A17, 0x0DE4, 0x0A1B, 0x026C, 0x0D34, 0x026F, + 0x138C, 0x0254, 0x0225, 0x0228, 0x021F, 0x0222, 0x0E18, 0x0E14, 0x0E20, 0x0E1C, + 0x0C61, 0x0EAA, 0x0C65, 0x0EB2, 0x0035, 0x0D68, 0x0C69, 0x0C55, 0x0E54, 0x0D70, + 0x0EAE, 0x0D74, 0x0E58, 0x0E98, 0x0E60, 0x0E5C, 0x0E68, 0x0E64, 0x0E70, 0x0E6C, + 0x0E78, 0x0E74, 0x0E80, 0x0E7C, 0x0E88, 0x0E84, 0x0E90, 0x0E8C, 0x0D4C, 0x0E94, + 0x0D54, 0x0E9C, 0x0D5C, 0x0D3C, 0x0D64, 0x0D60, 0x0D6C, 0x0D48, 0x0D50, 0x0D58, + 0x0053, 0x003B, 0x0059, 0x0041, 0x005F, 0x0047, 0x0065, 0x004D, 0x0EA0, 0x006B, + 0x0EB6, 0x0071, 0x0077, 0x0C59, 0x0CA1, 0x0EBA, 0x0EA7, 0x0EA4, 0x0080, 0x0086, + 0x0CA5, 0x008C, 0x0C91, 0x0092, 0x0C95, 0x0C99, 0x0C9D, 0x0C81, 0x0C89, 0x0C71, + 0x0C79, 0x01F8, 0x01FB, 0x01F2, 0x01F5, 0x0C39, 0x01EF, 0x0C29, 0x0C31, 0x0210, + 0x0213, 0x13A0, 0x13A7, 0x108E, 0x1092, 0x0BF9, 0x0C01, 0x0BE9, 0x0BF1, 0x0A6D, + 0x0A77, 0x0A59, 0x0A63, 0x0C09, 0x0AC1, 0x0ACB, 0x0AB2, 0x0AB7, 0x1116, 0x111A, + 0x0881, 0x084F, 0x0859, 0x083B, 0x0ECE, 0x0EBE, 0x0ED2, 0x0EC2, 0x0ED6, 0x0EC6, + 0x0EDA, 0x0ECA, 0x00AD, 0x0EDE, 0x00B0, 0x0EE2, 0x0EE6, 0x00B6, 0x0845, 0x00B3, + 0x00B9, 0x00BC, 0x0EEE, 0x0EF2, 0x08A9, 0x0EF6, 0x088B, 0x0EFA, 0x0895, 0x0121, + 0x1554, 0x0124, 0x10D2, 0x1559, 0x0F4A, 0x02C1, 0x10CA, 0x1549, 0x02B8, 0x02BB, + 0x10F6, 0x10EE, 0x14FF, 0x10E2, 0x1523, 0x0D1C, 0x0D20, 0x1510, 0x0F66, 0x013F, + 0x1517, 0x14B6, 0x014B, 0x0148, 0x0145, 0x014E, 0x0902, 0x0F6E, 0x0908, 0x090B, + 0x0139, 0x14BC, 0x14C2, 0x013C, 0x0F7E, 0x0127, 0x0F82, 0x012A, 0x0142, 0x012D, + 0x0F86, 0x0130, 0x0F8A, 0x0133, 0x14C8, 0x0136, 0x149E, 0x14A4, 0x14AA, 0x14B0, + 0x1486, 0x148C, 0x1492, 0x1498, 0x147A, 0x1480, 0x14EA, 0x0D15, 0x02DB, 0x02D8, + 0x14D9, 0x02D2, 0x1012, 0x1016, 0x101A, 0x101E, 0x1026, 0x0FA2, 0x102A, 0x0FAA, + 0x14DE, 0x0FB2, 0x0D09, 0x0FBA, 0x1022, 0x0FC2, 0x102E, 0x0FCA, 0x0D0D, 0x14CE, + 0x14D4, 0x13F6, 0x13FC, 0x1402, 0x1408, 0x13DE, 0x13EA, 0x081D, 0x13F0, 0x13C6, + 0x13CC, 0x13D2, 0x13D8, 0x13AE, 0x0FD6, 0x0150, 0x0153, 0x0FDE, 0x0162, 0x0FA6, + 0x0156, 0x0FAE, 0x0FEE, 0x0FB6, 0x0165, 0x0FBE, 0x0159, 0x0FC6, 0x015C, 0x0FCE, + 0x0755, 0x0750, 0x075F, 0x075A, 0x0769, 0x0764, 0x0773, 0x076E, 0x077D, 0x0778, + 0x0787, 0x0782, 0x0791, 0x078C, 0x079B, 0x0796, 0x016E, 0x0F96, 0x0171, 0x0F9E, + 0x0174, 0x13B4, 0x13BA, 0x13C0, 0x07A5, 0x0177, 0x07A0, 0x1456, 0x07E1, 0x0831, + 0x07EB, 0x07E6, 0x07DC, 0x0186, 0x07FF, 0x0813, 0x0183, 0x0FE6, 0x145C, 0x080E, + 0x100A, 0x1002, 0x0FFA, 0x100E, 0x0189, 0x082C, 0x018C, 0x0836, 0x1462, 0x07F5, + 0x1468, 0x07F0, 0x018F, 0x0809, 0x143E, 0x0192, 0x0198, 0x0195, 0x019B, 0x0827, + 0x1444, 0x019E, 0x144A, 0x01A1, 0x1450, 0x1426, 0x142C, 0x1432, 0x1438, 0x140E, + 0x1414, 0x141A, 0x1420, 0x11AA, 0x11A2, 0x11A6, 0x01B9, 0x01B6, 0x01BC, 0x119A, + 0x01BF, 0x119E, 0x01C2, 0x11AE, 0x01C5, 0x11B2, 0x01C8, 0x117A, 0x1186, 0x038C, + 0x01CE, 0x01CB, 0x01D1, 0x117E, 0x01D4, 0x0389, 0x037D, 0x1369, 0x01DA, 0x01D7, + 0x01DD, 0x0380, 0x0383, 0x0386, 0x01E0, 0x0344, 0x01E3, 0x0347, 0x01E6, 0x0338, + 0x01E9, 0x033E, 0x0329, 0x0332, 0x031D, 0x0323, 0x0326, 0x035F, 0x0362, 0x0818, + 0x0822, 0x0804, 0x07FA, 0x0E44, 0x0E48, 0x0E4C, 0x01EC, 0x0E50, 0x0204, 0x0E34, + 0x0207, 0x0E38, 0x020A, 0x0E3C, 0x020D, 0x0E40, 0x0E24, 0x0E28, 0x0E2C, 0x0E30, + 0x031A, 0x073C, 0x0741, 0x0746, 0x074B, 0x07C8, 0x07CD, 0x07D2, 0x07D7, 0x07B4, + 0x07B9, 0x07BE, 0x07C3, 0x07AA, 0x07AF, 0x0E04, 0x022B, 0x0E08, 0x022E, 0x0E0C, + 0x0E10, 0x0DF4, 0x0DF8, 0x0DFC, 0x090F, 0x0913, 0x0E00, 0x0DE8, 0x0DEC, 0x0DF0, + 0x0017, 0x0019, 0x001B, 0x001D, 0x000F, 0x0011, 0x0013, 0x0015, 0x0296, 0x0007, + 0x0009, 0x0245, 0x11B6, 0x000B, 0x0248, 0x024B, 0x000D, 0x0001, 0x024E, 0x028E, + 0x0251, 0x0003, 0x0258, 0x0005, 0x0260, 0x025C, 0x002F, 0x0263, 0x0269, 0x0266, + 0x0031, 0x0033, 0x0027, 0x0029, 0x002B, 0x002D, 0x11DE, 0x11E6, 0x0279, 0x11CA, + 0x027D, 0x11CE, 0x11D2, 0x0840, 0x11D6, 0x0886, 0x028B, 0x0854, 0x0292, 0x085E, + 0x11E2, 0x11EA, 0x029A, 0x11BA, 0x11EE, 0x11F6, 0x11DA, 0x11F2, 0x02A4, 0x0280, + 0x1036, 0x0276, 0x029D, 0x11BE, 0x11C2, 0x1032, 0x02A7, 0x11C6, 0x08FF, 0x0905, + 0x08F3, 0x02AB, 0x02AE, 0x02B1, 0x12BE, 0x123A, 0x12C6, 0x1242, 0x023A, 0x124A, + 0x02BE, 0x1252, 0x12BA, 0x125A, 0x12DE, 0x1262, 0x01FE, 0x0201, 0x107A, 0x02C4, + 0x107E, 0x02C7, 0x0216, 0x0219, 0x08F6, 0x08F9, 0x08FC, 0x0F8E, 0x0F56, 0x02CB, + 0x0F5A, 0x02B5, 0x122A, 0x122E, 0x1232, 0x1236, 0x127E, 0x123E, 0x108A, 0x1246, + 0x103E, 0x124E, 0x087C, 0x1256, 0x084A, 0x125E, 0x021C, 0x1266, 0x0F4E, 0x0868, + 0x1046, 0x0872, 0x08B8, 0x103A, 0x089A, 0x08C2, 0x0890, 0x089F, 0x08BD, 0x0234, + 0x0F52, 0x093F, 0x0F46, 0x0231, 0x08CC, 0x0F3E, 0x08D6, 0x092F, 0x08A4, 0x1042, + 0x0933, 0x105E, 0x0863, 0x0877, 0x1082, 0x086D, 0x0F42, 0x104A, 0x1076, 0x0F76, + 0x093B, 0x104E, 0x0943, 0x1072, 0x08B3, 0x0937, 0x1086, 0x08AE, 0x08C7, 0x0F7A, + 0x08D1, 0x0F72, 0x1056, 0x0F6A, 0x105A, 0x0F5E, 0x106A, 0x1062, 0x1052, 0x1066, + 0x0F62, 0x0F16, 0x0F1A, 0x106E, 0x0F0E, 0x0F12, 0x0F06, 0x0F0A, 0x109A, 0x0947, + 0x0983, 0x1096, 0x109E, 0x0EFE, 0x10A2, 0x0F02, 0x10A6, 0x0F36, 0x10AA, 0x0F3A, + 0x0F2E, 0x094B, 0x097F, 0x0237, 0x0997, 0x0F32, 0x099B, 0x0F26, 0x099F, 0x0F2A, + 0x09A3, 0x0F1E, 0x09A7, 0x0F22, 0x09AB, 0x005C, 0x09AF, 0x0062, 0x09B3, 0x0050, + 0x0056, 0x0044, 0x004A, 0x0038, 0x09BF, 0x003E, 0x09C3, 0x0089, 0x09C7, 0x008F, + 0x09CB, 0x007D, 0x09CF, 0x0083, 0x09D3, 0x0074, 0x007A, 0x0EEA, 0x0068, 0x006E, + 0x09DF, 0x1362, 0x09E3, 0x12AA, 0x09E7, 0x09EB, 0x0987, 0x12AE, 0x09EF, 0x12B2, + 0x09F3, 0x12B6, 0x09F7, 0x09FB, 0x10BA, 0x129A, 0x129E, 0x12A2, 0x12A6, 0x128A, + 0x097B, 0x128E, 0x1292, 0x1296, 0x127A, 0x1282, 0x0977, 0x1286, 0x0B51, 0x12EA, + 0x0B65, 0x10B2, 0x12EE, 0x02CF, 0x0B59, 0x12F2, 0x12F6, 0x0A2B, 0x12DA, 0x0B29, + 0x0A2F, 0x0A33, 0x10AE, 0x0B2D, 0x0A37, 0x12E2, 0x0A81, 0x12E6, 0x0AE9, 0x12CA, + 0x1384, 0x1380, 0x12CE, 0x1388, 0x0AED, 0x1390, 0x12D2, 0x12D6, 0x12C2, 0x121A, + 0x0AF1, 0x121E, 0x0B8D, 0x10B6, 0x0AF9, 0x0AF5, 0x0AFD, 0x1222, 0x10BE, 0x1226, + 0x10C2, 0x120A, 0x0B09, 0x10FE, 0x0B0D, 0x1102, 0x0B11, 0x113E, 0x0B15, 0x1112, + 0x120E, 0x02D5, 0x1212, 0x1216, 0x0B21, 0x0B01, 0x11FA, 0x0B61, 0x0B19, 0x02DE, + 0x11FE, 0x0B89, 0x1202, 0x0B5D, 0x0B71, 0x02E1, 0x0B39, 0x0B79, 0x0B3D, 0x0B7D, + 0x0B41, 0x1136, 0x0B45, 0x0B85, 0x0B81, 0x1206, 0x10C6, 0x1156, 0x1146, 0x10CE, + 0x0B55, 0x0DD0, 0x10DA, 0x136D, 0x0BA9, 0x115A, 0x0BAD, 0x1162, 0x10DE, 0x10D6, + 0x08EF, 0x0359, 0x08EB, 0x10EA, 0x08DF, 0x08DB, 0x08E7, 0x08E3, 0x036B, 0x1166, + 0x10F2, 0x10FA, 0x036E, 0x10E6, 0x1142, 0x0B75, 0x02E4, 0x1106, 0x110E, 0x110A, + 0x02E7, 0x0314, 0x02ED, 0x02EA, 0x02F0, 0x1374, 0x02F6, 0x02F3, 0x02FC, 0x02F9, + 0x0302, 0x02FF, 0x0308, 0x0305, 0x030E, 0x030B, 0x113A, 0x0311, 0x0BC9, 0x0317, + 0x112E, 0x034D, 0x1132, 0x034A, 0x1126, 0x0350, 0x0377, 0x112A, 0x037A, 0x0371, + 0x114A, 0x035C, 0x111E, 0x0A4A, 0x0A54, 0x0368, 0x0320, 0x0BD5, 0x0A40, 0x0BDD, + 0x0365, 0x114E, 0x1152, 0x0353, 0x032F, 0x032C, 0x0BE5, 0x0356, 0x05C5, 0x05CF, + 0x0AA3, 0x1122, 0x05D9, 0x0335, 0x05E3, 0x0341, 0x061A, 0x05E8, 0x115E, 0x05F2, + 0x0610, 0x05FC, 0x033B, 0x0606, 0x0AE4, 0x0C1D, 0x0C25, 0x0ADA, 0x061F, 0x0633, + 0x0C15, 0x0629, 0x0374, 0x0638, 0x0647, 0x038F, 0x0BD1, 0x0BE1, 0x0651, 0x0BD9, + 0x0BFD, 0x0BBD, 0x0C05, 0x0BED, 0x0660, 0x0BB5, 0x0674, 0x0BB9, 0x116E, 0x0AC6, + 0x0C3D, 0x1182, 0x1176, 0x116A, 0x0A72, 0x0BB1, 0x0C45, 0x0A3B, 0x0AD0, 0x0C41, + 0x0C49, 0x0A4F, 0x0C4D, 0x0A5E, 0x118A, 0x0AAD, 0x1172, 0x0A7C, 0x0D80, 0x03AA, + 0x0D88, 0x0A68, 0x0D90, 0x0A94, 0x0D98, 0x118E, 0x0DA0, 0x0A8A, 0x0DA8, 0x0A8F, + 0x0DB0, 0x03B0, 0x0DB8, 0x03B3, 0x0DC0, 0x0ABC, 0x0DC8, 0x0A85, 0x0C0D, 0x0C11, + 0x0BF5, 0x0AA8, 0x0395, 0x0C21, 0x039B, 0x039E, 0x03A1, 0x0A99, 0x03A7, 0x03A4, + 0x03AD, 0x0392, 0x0398, 0x0A9E, 0x130A, 0x03B6, 0x1332, 0x0DD8, 0x1192, 0x03C2, + 0x131A, 0x03C8, 0x1196, 0x03CE, 0x03D7, 0x03D4, 0x03DD, 0x13E4, 0x06A1, 0x06AB, + 0x03E9, 0x068D, 0x03EF, 0x0688, 0x03F5, 0x03F2, 0x03FB, 0x0A45, 0x126A, 0x126E, + 0x1272, 0x132A, 0x040D, 0x1276, 0x0F92, 0x0410, 0x0419, 0x0416, 0x041F, 0x1474, + 0x0422, 0x146E, 0x0425, 0x0C51, 0x0428, 0x0F9A, 0x042B, 0x0723, 0x12FA, 0x0431, + 0x1302, 0x042E, 0x0434, 0x0437, 0x1312, 0x0BCD, 0x043A, 0x14E3, 0x043D, 0x0C19, + 0x0440, 0x0BC1, 0x0443, 0x1356, 0x0446, 0x1352, 0x0449, 0x0BC5, 0x134A, 0x14EF, + 0x044F, 0x044C, 0x135A, 0x14FA, 0x1504, 0x14F5, 0x0D24, 0x1322, 0x0C2D, 0x0C35, + 0x1538, 0x0697, 0x153D, 0x1342, 0x0458, 0x12FE, 0x045B, 0x133A, 0x0C5D, 0x0ADF, + 0x1306, 0x151E, 0x06B5, 0x0AD5, 0x06BF, 0x150B, 0x06C9, 0x06EC, 0x06D3, 0x06FB, + 0x06DD, 0x06F1, 0x06E7, 0x06E2, 0x0D2C, 0x06D8, 0x1542, 0x06F6, 0x0D28, 0x0476, + 0x0C6D, 0x1531, 0x0C75, 0x0C7D, 0x152A, 0x0479, 0x072D, 0x154F, 0x0737, 0x155E, + 0x048E, 0x1399, 0x0491, 0x0692, 0x0494, 0x1394, 0x0497, 0x0C85, 0x049A, 0x1565, + 0x049D, 0x0C8D, 0x04A0, 0x1006, 0x04A3, 0x0FF2, 0x04B5, 0x0FF6, 0x0FFE, 0x0FE2, + 0x04B8, 0x04A9, 0x0FEA, 0x04AC, 0x04BB, 0x04AF, 0x0FD2, 0x04B2, 0x0FDA, 0x0103, + 0x0106, 0x0455, 0x00FD, 0x1365, 0x0100, 0x00F7, 0x00FA, 0x00F1, 0x00F4, 0x011B, + 0x011E, 0x0115, 0x045E, 0x0461, 0x0118, 0x010F, 0x0112, 0x0109, 0x04D6, 0x010C, + 0x04D9, 0x00D7, 0x00DA, 0x00D1, 0x00D4, 0x00CB, 0x00CE, 0x00C5, 0x00C8, 0x00EB, + 0x00EE, 0x00E8, 0x00E2, 0x00E5, 0x00DD, 0x04F1, 0x00DF, 0x04EE, 0x00A7, 0x00AA, + 0x00A1, 0x00A4, 0x04E2, 0x009B, 0x009E, 0x0095, 0x0500, 0x0503, 0x04E8, 0x0098, + 0x0506, 0x00BF, 0x0509, 0x00C2, 0x050C, 0x03E6, 0x050F, 0x03EC, 0x0512, 0x03DA, + 0x0515, 0x03E0, 0x0518, 0x051B, 0x03E3, 0x03D1, 0x051E, 0x03C5, 0x0521, 0x03CB, + 0x0524, 0x041C, 0x0527, 0x040A, 0x052A, 0x0413, 0x052D, 0x03FE, 0x0530, 0x0401, + 0x0533, 0x0404, 0x0536, 0x0407, 0x0539, 0x03F8, 0x053C, 0x053F, 0x01B0, 0x01B3, + 0x0542, 0x01AA, 0x0545, 0x01AD, 0x01A4, 0x0572, 0x01A7, 0x056F, 0x017A, 0x03B9, + 0x03BC, 0x03BF, 0x0D38, 0x0D40, 0x0D44, 0x0180, 0x017D, 0x0679, 0x067E, 0x0683, + 0x0665, 0x066A, 0x066F, 0x054B, 0x064C, 0x0656, 0x065B, 0x063D, 0x0642, 0x016B, + 0x0168, 0x04EB, 0x04E5, 0x04DC, 0x015F, 0x0575, 0x04DF, 0x05D4, 0x05DE, 0x05C0, + 0x05CA, 0x04FA, 0x04FD, 0x04F4, 0x04F7, 0x0624, 0x062E, 0x0615, 0x0601, 0x060B, + 0x05ED, 0x05F7, 0x04A6, 0x04D0, 0x04D3, 0x04CA, 0x04CD, 0x0578, 0x04C4, 0x04C7, + 0x04BE, 0x04C1, 0x0488, 0x048B, 0x0482, 0x0485, 0x047C, 0x047F, 0x06C4, 0x06CE, 0x06B0, 0x06BA, 0x1586, 0x1590, 0x0728, 0x0732, }; const uint8_t NU_TOUPPER_COMBINED[] = { diff --git a/vendor/vulkan.cmake b/vendor/vulkan.cmake index ba3c53bbb6fe..f8be9376168e 100644 --- a/vendor/vulkan.cmake +++ b/vendor/vulkan.cmake @@ -78,6 +78,6 @@ export(TARGETS MachineIndependent OSDependent GenericCodeGen - + APPEND FILE MapboxCoreTargets.cmake ) From c9d4e761982fed3a623c8feec5b68ba49525267b Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 14 Feb 2025 13:12:14 +0100 Subject: [PATCH 072/339] Update automated update config rennovate & pre-commit.ci (#3216) --- .github/renovate.json | 2 +- .pre-commit-config.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 51d5f307f209..8b5aa8911a85 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,3 +1,3 @@ { - "enabledManagers": ["gradle-wrapper", "bazel"] + "enabledManagers": ["gradle-wrapper", "bazel", "bazel-module, bazelisk"] } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 656b1323d49e..966a3fd70372 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,3 +38,4 @@ repos: ci: # sometimes fails https://github.com/keith/pre-commit-buildifier/issues/13 skip: [buildifier] + autoupdate_schedule: monthly From 5c39cc6dbbbcd6e225844cc057c5c22dadba3f91 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 14 Feb 2025 13:20:13 +0100 Subject: [PATCH 073/339] Fix Rennovate config (#3218) --- .github/renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 8b5aa8911a85..a7917913c3fa 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,3 +1,3 @@ { - "enabledManagers": ["gradle-wrapper", "bazel", "bazel-module, bazelisk"] + "enabledManagers": ["gradle-wrapper", "bazel", "bazel-module", "bazelisk"] } From 9b5d442ffaeef73aaf04e74a873d9e6d080e9123 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 13:23:38 +0100 Subject: [PATCH 074/339] chore(deps): update dependency gradle to v8.12.1 (#3178) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- benchmark/android/gradle/wrapper/gradle-wrapper.properties | 2 +- .../MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties | 2 +- platform/android/gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.properties b/benchmark/android/gradle/wrapper/gradle-wrapper.properties index e0fd02028bca..d9fbee2e1d61 100644 --- a/benchmark/android/gradle/wrapper/gradle-wrapper.properties +++ b/benchmark/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties index cea7a793a84b..e18bc253b857 100644 --- a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/platform/android/gradle/wrapper/gradle-wrapper.properties b/platform/android/gradle/wrapper/gradle-wrapper.properties index cea7a793a84b..e18bc253b857 100644 --- a/platform/android/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradle/wrapper/gradle-wrapper.properties b/render-test/android/gradle/wrapper/gradle-wrapper.properties index e0fd02028bca..d9fbee2e1d61 100644 --- a/render-test/android/gradle/wrapper/gradle-wrapper.properties +++ b/render-test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/test/android/gradle/wrapper/gradle-wrapper.properties b/test/android/gradle/wrapper/gradle-wrapper.properties index e0fd02028bca..d9fbee2e1d61 100644 --- a/test/android/gradle/wrapper/gradle-wrapper.properties +++ b/test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 0ab633f2dd624013f9f16c3ba17d2fbe2016194a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:25:10 +0000 Subject: [PATCH 075/339] chore(deps): update dependency aspect_rules_js to v2.1.3 (#3220) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index e71dc40ae567..47e4186f24bd 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,7 +6,7 @@ bazel_dep(name = "platforms", version = "0.0.10") bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rules_apple") bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rules_swift") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") -bazel_dep(name = "aspect_rules_js", version = "2.1.0") +bazel_dep(name = "aspect_rules_js", version = "2.1.3") bazel_dep(name = "rules_nodejs", version = "6.3.2") bazel_dep(name = "libuv", version = "1.48.0") From 66f5367ebe7c20a0517b22ff9d5eabab1ab22827 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 13:54:58 +0100 Subject: [PATCH 076/339] chore(deps): update cxx.rs digest to fb8fdc0 (#3219) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 47e4186f24bd..01649c9a1437 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -65,7 +65,7 @@ bazel_dep(name = "rules_rust", version = "0.56.0") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", - commit = "d54e44698c3fa5833a861cb3ae502533b92f2f57", + commit = "fb8fdc0b20ddca8df80f6638bc773dc4824a8092", remote = "https://github.com/dtolnay/cxx.git", ) From 4d96d7a4e49726c97b240de654738551a7856ac9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 19:45:24 +0100 Subject: [PATCH 077/339] chore(deps): update dependency platforms to v0.0.11 (#3224) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 01649c9a1437..49e051066ba5 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,7 +2,7 @@ module(name = "maplibre") bazel_dep(name = "apple_support", version = "1.17.1", repo_name = "build_bazel_apple_support") bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "platforms", version = "0.0.10") +bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rules_apple") bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rules_swift") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") From d3fe4d69e5c6977567a62f26ae992568da847b7c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 19:45:41 +0100 Subject: [PATCH 078/339] chore(deps): update dependency rules_nodejs to v6.3.3 (#3225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 49e051066ba5..7ae78044fedd 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -7,7 +7,7 @@ bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rul bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rules_swift") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") bazel_dep(name = "aspect_rules_js", version = "2.1.3") -bazel_dep(name = "rules_nodejs", version = "6.3.2") +bazel_dep(name = "rules_nodejs", version = "6.3.3") bazel_dep(name = "libuv", version = "1.48.0") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) From 940952097881a4c7f2f72e16e7b16e32f277ceae Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 14 Feb 2025 23:01:03 +0100 Subject: [PATCH 079/339] Remove alternate repo names Bazel (#3222) --- .bazelrc | 5 +++-- MODULE.bazel | 7 +++---- platform/darwin/BUILD.bazel | 2 +- platform/ios/BUILD.bazel | 8 ++++---- platform/ios/app-swift/BUILD.bazel | 6 +++--- platform/ios/bazel/provisioning.bzl | 2 +- platform/ios/benchmark/assets/BUILD.bazel | 2 +- platform/ios/iosapp-UITests/BUILD.bazel | 4 ++-- platform/ios/test/BUILD.bazel | 6 +++--- platform/ios/test/common/BUILD.bazel | 2 +- platform/ios/test/core/BUILD.bazel | 4 ++-- platform/macos/BUILD.bazel | 2 +- platform/macos/app/BUILD.bazel | 2 +- render-test/ios/BUILD.bazel | 6 +++--- 14 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.bazelrc b/.bazelrc index 402ac2662c78..fceb98abceac 100644 --- a/.bazelrc +++ b/.bazelrc @@ -2,8 +2,9 @@ startup --host_jvm_args=-DBAZEL_TRACK_SOURCE_DIRECTORIES=1 common --enable_platform_specific_config -# TODO: remove once bazel flips this flag -common --incompatible_disallow_empty_glob + +# TODO: remove once issues with yanked versions are resolved +common --allow_yanked_versions=rules_cc@0.1.0 coverage --experimental_ui_max_stdouterr_bytes=10485760 diff --git a/MODULE.bazel b/MODULE.bazel index 7ae78044fedd..6cc313b82faa 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,10 +1,9 @@ module(name = "maplibre") -bazel_dep(name = "apple_support", version = "1.17.1", repo_name = "build_bazel_apple_support") bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") -bazel_dep(name = "rules_apple", version = "3.16.1", repo_name = "build_bazel_rules_apple") -bazel_dep(name = "rules_swift", version = "2.2.3", repo_name = "build_bazel_rules_swift") +bazel_dep(name = "rules_apple", version = "3.19.0") +bazel_dep(name = "rules_swift", version = "2.5.0") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") bazel_dep(name = "aspect_rules_js", version = "2.1.3") bazel_dep(name = "rules_nodejs", version = "6.3.3") @@ -28,7 +27,7 @@ pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") # bazel run -- @pnpm --dir /home/runner/work/rules_js/rules_js install use_repo(pnpm, "pnpm") -provisioning_profile_repository = use_extension("@build_bazel_rules_apple//apple:apple.bzl", "provisioning_profile_repository_extension") +provisioning_profile_repository = use_extension("@rules_apple//apple:apple.bzl", "provisioning_profile_repository_extension") provisioning_profile_repository.setup() http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index b9d87fa55927..d9e86bb5eeb2 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -1,6 +1,6 @@ load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_library", "js_run_binary") load( - "@build_bazel_rules_swift//swift:swift.bzl", + "@rules_swift//swift:swift.bzl", "swift_library", ) load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS", "WARNING_FLAGS") diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index 1b9eb34bac6b..c7ce3e9b9d72 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -1,9 +1,9 @@ load("@aspect_rules_js//js:defs.bzl", "js_library") -load("@build_bazel_rules_apple//apple:apple.bzl", "apple_static_xcframework", "apple_xcframework") -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application", "ios_framework") -load("@build_bazel_rules_apple//apple:resources.bzl", "apple_resource_bundle") -load("@build_bazel_rules_apple//apple:versioning.bzl", "apple_bundle_version") load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") +load("@rules_apple//apple:apple.bzl", "apple_static_xcframework", "apple_xcframework") +load("@rules_apple//apple:ios.bzl", "ios_application", "ios_framework") +load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") +load("@rules_apple//apple:versioning.bzl", "apple_bundle_version") load( "@rules_xcodeproj//xcodeproj:defs.bzl", "top_level_target", diff --git a/platform/ios/app-swift/BUILD.bazel b/platform/ios/app-swift/BUILD.bazel index 61fbbe8e0ee4..0fd4e3da0a66 100644 --- a/platform/ios/app-swift/BUILD.bazel +++ b/platform/ios/app-swift/BUILD.bazel @@ -1,9 +1,9 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application") +load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") +load("@rules_apple//apple:ios.bzl", "ios_application") load( - "@build_bazel_rules_swift//swift:swift.bzl", + "@rules_swift//swift:swift.bzl", "swift_library", ) -load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") load("//platform/ios/bazel:provisioning.bzl", "configure_device_profiles") configure_device_profiles() diff --git a/platform/ios/bazel/provisioning.bzl b/platform/ios/bazel/provisioning.bzl index 2205f7327758..c4b787947919 100644 --- a/platform/ios/bazel/provisioning.bzl +++ b/platform/ios/bazel/provisioning.bzl @@ -1,5 +1,5 @@ -load("@build_bazel_rules_apple//apple:apple.bzl", "local_provisioning_profile") load("@darwin_config//:config.bzl", "APPLE_MOBILE_PROVISIONING_PROFILE_NAME", "APPLE_MOBILE_PROVISIONING_PROFILE_TEAM_ID") +load("@rules_apple//apple:apple.bzl", "local_provisioning_profile") load("@rules_xcodeproj//xcodeproj:defs.bzl", "xcode_provisioning_profile") def configure_device_profiles(): diff --git a/platform/ios/benchmark/assets/BUILD.bazel b/platform/ios/benchmark/assets/BUILD.bazel index cf1a684cd7d8..81e4a978d47e 100644 --- a/platform/ios/benchmark/assets/BUILD.bazel +++ b/platform/ios/benchmark/assets/BUILD.bazel @@ -1,4 +1,4 @@ -load("@build_bazel_rules_apple//apple:resources.bzl", "apple_resource_group") +load("@rules_apple//apple:resources.bzl", "apple_resource_group") apple_resource_group( name = "benchmark_assets", diff --git a/platform/ios/iosapp-UITests/BUILD.bazel b/platform/ios/iosapp-UITests/BUILD.bazel index eee82f4a6f05..7366b2826f2b 100644 --- a/platform/ios/iosapp-UITests/BUILD.bazel +++ b/platform/ios/iosapp-UITests/BUILD.bazel @@ -1,6 +1,6 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_ui_test") +load("@rules_apple//apple:ios.bzl", "ios_ui_test") load( - "@build_bazel_rules_swift//swift:swift.bzl", + "@rules_swift//swift:swift.bzl", "swift_library", ) load("//platform/ios/bazel:provisioning.bzl", "configure_device_profiles") diff --git a/platform/ios/test/BUILD.bazel b/platform/ios/test/BUILD.bazel index 2263751c3bc4..c29e6622883d 100644 --- a/platform/ios/test/BUILD.bazel +++ b/platform/ios/test/BUILD.bazel @@ -1,6 +1,6 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") +load("@rules_apple//apple:ios.bzl", "ios_unit_test") load( - "@build_bazel_rules_swift//swift:swift.bzl", + "@rules_swift//swift:swift.bzl", "swift_library", ) load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS", "WARNING_FLAGS") @@ -51,7 +51,7 @@ ios_unit_test( name = "ios_test", timeout = "long", minimum_os_version = "12.0", - runner = "@build_bazel_rules_apple//apple/testing/default_runner:ios_xctestrun_ordered_runner", + runner = "@rules_apple//apple/testing/default_runner:ios_xctestrun_ordered_runner", visibility = [ "@rules_xcodeproj//xcodeproj:generated", ], diff --git a/platform/ios/test/common/BUILD.bazel b/platform/ios/test/common/BUILD.bazel index 63032ff29f65..ce3d306129e7 100644 --- a/platform/ios/test/common/BUILD.bazel +++ b/platform/ios/test/common/BUILD.bazel @@ -1,5 +1,5 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application") load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") +load("@rules_apple//apple:ios.bzl", "ios_application") cc_library( name = "ios_test_runner_lib", diff --git a/platform/ios/test/core/BUILD.bazel b/platform/ios/test/core/BUILD.bazel index 9e29a5ae12b7..dec6adacd344 100644 --- a/platform/ios/test/core/BUILD.bazel +++ b/platform/ios/test/core/BUILD.bazel @@ -1,6 +1,6 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application", "ios_unit_test") -load("@build_bazel_rules_apple//apple:resources.bzl", "apple_resource_bundle") load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") +load("@rules_apple//apple:ios.bzl", "ios_application", "ios_unit_test") +load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/platform/macos/BUILD.bazel b/platform/macos/BUILD.bazel index 7ef54ff48b2a..af9bebb9c70e 100644 --- a/platform/macos/BUILD.bazel +++ b/platform/macos/BUILD.bazel @@ -1,5 +1,5 @@ load("@aspect_rules_js//js:defs.bzl", "js_library") -load("@build_bazel_rules_apple//apple:macos.bzl", "macos_command_line_application") +load("@rules_apple//apple:macos.bzl", "macos_command_line_application") load( "@rules_xcodeproj//xcodeproj:defs.bzl", "top_level_target", diff --git a/platform/macos/app/BUILD.bazel b/platform/macos/app/BUILD.bazel index 459065e4a9c7..e8b7216fbcf5 100644 --- a/platform/macos/app/BUILD.bazel +++ b/platform/macos/app/BUILD.bazel @@ -1,4 +1,4 @@ -load("@build_bazel_rules_apple//apple:macos.bzl", "macos_application") +load("@rules_apple//apple:macos.bzl", "macos_application") objc_library( name = "macos_app_lib", diff --git a/render-test/ios/BUILD.bazel b/render-test/ios/BUILD.bazel index 8bcec3e6ade2..d538780bbe0b 100644 --- a/render-test/ios/BUILD.bazel +++ b/render-test/ios/BUILD.bazel @@ -1,5 +1,5 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") -load("@build_bazel_rules_apple//apple:resources.bzl", "apple_resource_bundle") +load("@rules_apple//apple:ios.bzl", "ios_unit_test") +load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") apple_resource_bundle( @@ -53,7 +53,7 @@ ios_unit_test( name = "RenderTest", minimum_os_version = "13.0", provisioning_profile = "//platform/ios:xcode_profile", - runner = "@build_bazel_rules_apple//apple/testing/default_runner:ios_xctestrun_ordered_runner", + runner = "@rules_apple//apple/testing/default_runner:ios_xctestrun_ordered_runner", test_host = "//platform/ios/test/common:RenderTestApp", visibility = [ "//visibility:public", From 4bb60dceb8c53c5f977fd212ed858df95bc5f89a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 15 Feb 2025 17:46:32 +0100 Subject: [PATCH 080/339] chore(deps): update dependency rules_rust to v0.57.1 (#3227) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 6cc313b82faa..835b2c9f0a05 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -60,7 +60,7 @@ darwin_config( name = "darwin_config", ) -bazel_dep(name = "rules_rust", version = "0.56.0") +bazel_dep(name = "rules_rust", version = "0.57.1") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", From 53a6ca5a994e4225b594628cc02ffb277dcff0e7 Mon Sep 17 00:00:00 2001 From: yousifd Date: Mon, 17 Feb 2025 22:54:17 +0300 Subject: [PATCH 081/339] reset depth stencil state for render pass (#3230) --- include/mbgl/mtl/render_pass.hpp | 7 +++++++ src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp | 4 ++++ src/mbgl/mtl/render_pass.cpp | 11 +++++++++++ 3 files changed, 22 insertions(+) diff --git a/include/mbgl/mtl/render_pass.hpp b/include/mbgl/mtl/render_pass.hpp index 35ae8ffd2f3e..d2ffc3e2b1fa 100644 --- a/include/mbgl/mtl/render_pass.hpp +++ b/include/mbgl/mtl/render_pass.hpp @@ -42,6 +42,13 @@ class RenderPass final : public gfx::RenderPass { void endEncoding(); + /// Resets the states and bindings of the render pass to deal + /// with situations where they are changed by calling the + /// underlying rendering API directly. Currently this happens + /// when a user changes one of these states or bindings + /// in a custom layer + void resetState(); + void addDebugSignpost(const char* name) override; void bindVertex(const BufferResource&, std::size_t offset, std::size_t index, std::size_t size = 0); diff --git a/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp b/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp index 23f758afa731..1caa8eb9ed7e 100644 --- a/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp +++ b/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp @@ -8,6 +8,7 @@ #if MLN_RENDER_BACKEND_METAL #include +#include #endif #include @@ -23,6 +24,9 @@ void DrawableCustomLayerHostTweaker::execute([[maybe_unused]] gfx::Drawable& dra paintParameters.colorModeForRenderPass()); #if MLN_RENDER_BACKEND_METAL + const auto& mtlRenderPass = static_cast(paintParameters.renderPass.get()); + mtlRenderPass->resetState(); + style::mtl::CustomLayerRenderParameters parameters(paintParameters); #else style::CustomLayerRenderParameters parameters(paintParameters); diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index c5ade2802e51..dd3dd4aa6708 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -72,6 +72,17 @@ void RenderPass::endEncoding() { } } +void RenderPass::resetState() { + currentDepthStencilState.reset(); + currentStencilReferenceValue = 0; + for (int i = 0; i < maxBinds; ++i) { + vertexBinds[i].reset(); + fragmentBinds[i].reset(); + fragmentTextureBindings[i].reset(); + fragmentSamplerStates[i].reset(); + } +} + namespace { constexpr auto missing = ""; NS::String* toNSString(const char* str) { From 3a02c9dcdbc911b90a63ab51fff9bf735ff63c98 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 21 Feb 2025 23:07:25 +0100 Subject: [PATCH 082/339] Add documentation page for iOS dev apps (#3244) --- docs/mdbook/src/SUMMARY.md | 1 + docs/mdbook/src/ios/dev-apps.md | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 docs/mdbook/src/ios/dev-apps.md diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index 6c69a2c20f59..c0b86f33d791 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -16,6 +16,7 @@ - [Tests](ios/ios-tests.md) - [Documentation](ios/ios-documentation.md) - [Release](ios/release.md) + - [Development Apps](ios/dev-apps.md) - [Design](./design/README.md) - [Ten Thousand Foot View](design/ten-thousand-foot-view.md) diff --git a/docs/mdbook/src/ios/dev-apps.md b/docs/mdbook/src/ios/dev-apps.md new file mode 100644 index 000000000000..1ae8158851d6 --- /dev/null +++ b/docs/mdbook/src/ios/dev-apps.md @@ -0,0 +1,37 @@ +# Development Apps + +There are two iOS apps available in the repo that you can use for MapLibre Native development. One Objective-C based app and a Swift based app. + +## Objective-C App + +This app is available as "App" in the [generated Xcode project](./README.md). + +The source code lives in `platform/ios/app`. + +You can also build and run it from the command line with: + +``` +bazel run --//:renderer=metal //platform/ios:App +``` + +

+ Objective-C app screenshot +

+ +## Swift App + +The Swift App is mainly used to demo usage patterns in the [example documentation](./ios-documentation.md#examples). + +This app is available as "MapLibreApp" in the [generated Xcode project](./README.md). + +The source code lives in `platform/ios/swift-app`. + +

+ Swift app screenshot +

+ +You can also build and run it from the command line with: + +``` +bazel run --//:renderer=metal //platform/ios/app-swift:MapLibreApp +``` From 3acfd02c993b2b6c69ad1bf13c8e92976923b14e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 21 Feb 2025 23:07:40 +0100 Subject: [PATCH 083/339] Remove unused files reachability.h, reachability.m (#3243) --- .pre-commit-config.yaml | 2 +- platform/darwin/BUILD.bazel | 2 - .../include/mbgl/storage/reachability.h | 93 ---- platform/darwin/src/reachability.m | 473 ------------------ 4 files changed, 1 insertion(+), 569 deletions(-) delete mode 100644 platform/darwin/include/mbgl/storage/reachability.h delete mode 100644 platform/darwin/src/reachability.m diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 966a3fd70372..9b82f5aa00ee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,7 +13,7 @@ repos: hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' - exclude: '(vendor/.*|darwin/include/mbgl/storage/reachability.h)' + exclude: 'vendor/.*' - repo: https://github.com/keith/pre-commit-buildifier rev: 7.3.1 hooks: diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index d9e86bb5eeb2..9c59e9f555a6 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -204,7 +204,6 @@ objc_library( ], hdrs = [ "include/mbgl/interface/native_apple_interface.h", - "include/mbgl/storage/reachability.h", "include/mbgl/util/image+MLNAdditions.hpp", ], copts = WARNING_FLAGS["ios"] + MAPLIBRE_FLAGS + [ @@ -243,7 +242,6 @@ objc_library( }), hdrs = [ "include/mbgl/interface/native_apple_interface.h", - "include/mbgl/storage/reachability.h", "include/mbgl/util/image+MLNAdditions.hpp", ], copts = CPP_FLAGS + MAPLIBRE_FLAGS + [ diff --git a/platform/darwin/include/mbgl/storage/reachability.h b/platform/darwin/include/mbgl/storage/reachability.h deleted file mode 100644 index bfcf78059c9b..000000000000 --- a/platform/darwin/include/mbgl/storage/reachability.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - Copyright (c) 2011, Tony Million. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import - - -/** - * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X. - * - * @see http://nshipster.com/ns_enum-ns_options/ - **/ -#ifndef NS_ENUM -#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type -#endif - -extern NSString *const kMLNReachabilityChangedNotification; - -typedef NS_ENUM(NSInteger, NetworkStatus) { - // Apple NetworkStatus Compatible Names. - NotReachable = 0, - ReachableViaWiFi = 2, - ReachableViaWWAN = 1 -}; - -@class MLNReachability; - -typedef void (^NetworkReachable)(MLNReachability * reachability); -typedef void (^NetworkUnreachable)(MLNReachability * reachability); - - -@interface MLNReachability : NSObject - -@property (nonatomic, copy) NetworkReachable reachableBlock; -@property (nonatomic, copy) NetworkUnreachable unreachableBlock; - -@property (nonatomic, assign) BOOL reachableOnWWAN; - - -+(instancetype)reachabilityWithHostname:(NSString*)hostname; -// This is identical to the function above, but is here to maintain -// compatibility with Apples original code. (see .m) -+(instancetype)reachabilityWithHostName:(NSString*)hostname; -+(instancetype)reachabilityForInternetConnection; -+(instancetype)reachabilityWithAddress:(void *)hostAddress; -+(instancetype)reachabilityForLocalWiFi; - --(BOOL)startNotifier; --(void)stopNotifier; - --(BOOL)isReachable; --(BOOL)isReachableViaWWAN; --(BOOL)isReachableViaWiFi; - -// WWAN may be available, but not active until a connection has been established. -// WiFi may require a connection for VPN on Demand. --(BOOL)isConnectionRequired; // Identical DDG variant. --(BOOL)connectionRequired; // Apple's routine. -// Dynamic, on demand connection? --(BOOL)isConnectionOnDemand; -// Is user intervention required? --(BOOL)isInterventionRequired; - --(NetworkStatus)currentReachabilityStatus; --(SCNetworkReachabilityFlags)reachabilityFlags; --(NSString*)currentReachabilityString; --(NSString*)currentReachabilityFlags; - -@end diff --git a/platform/darwin/src/reachability.m b/platform/darwin/src/reachability.m deleted file mode 100644 index 08a4111d8dc6..000000000000 --- a/platform/darwin/src/reachability.m +++ /dev/null @@ -1,473 +0,0 @@ -/* - Copyright (c) 2011, Tony Million. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -#import -#import -#import -#import -#import -#import - - -NSString *const kMLNReachabilityChangedNotification = @"kMLNReachabilityChangedNotification"; - - -@interface MLNReachability () - -@property (nonatomic, assign) SCNetworkReachabilityRef reachabilityRef; -@property (nonatomic, strong) dispatch_queue_t reachabilitySerialQueue; -@property (nonatomic, strong) id reachabilityObject; - --(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags; --(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags; - -@end - - -static NSString *reachabilityFlags(SCNetworkReachabilityFlags flags) -{ - return [NSString stringWithFormat:@"%c%c %c%c%c%c%c%c%c", -#if TARGET_OS_IPHONE - (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', -#else - 'X', -#endif - (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', - (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', - (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', - (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', - (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-']; -} - -// Start listening for reachability notifications on the current run loop -static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) -{ -#pragma unused (target) - - MLNReachability *reachability = ((__bridge MLNReachability*)info); - - // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool, - // but what the heck eh? - @autoreleasepool - { - [reachability reachabilityChanged:flags]; - } -} - - -@implementation MLNReachability - -// MARK: - Class Constructor Methods - -+(instancetype)reachabilityWithHostName:(NSString*)hostname -{ - return [MLNReachability reachabilityWithHostname:hostname]; -} - -+(instancetype)reachabilityWithHostname:(NSString*)hostname -{ - SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]); - if (ref) - { - id reachability = [[self alloc] initWithReachabilityRef:ref]; - - CFRelease(ref); - - return reachability; - } - - return nil; -} - -+(instancetype)reachabilityWithAddress:(void *)hostAddress -{ - SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress); - if (ref) - { - id reachability = [[self alloc] initWithReachabilityRef:ref]; - - CFRelease(ref); - - return reachability; - } - - return nil; -} - -+(instancetype)reachabilityForInternetConnection -{ - struct sockaddr_in zeroAddress; - bzero(&zeroAddress, sizeof(zeroAddress)); - zeroAddress.sin_len = sizeof(zeroAddress); - zeroAddress.sin_family = AF_INET; - - return [self reachabilityWithAddress:&zeroAddress]; -} - -+(instancetype)reachabilityForLocalWiFi -{ - struct sockaddr_in localWifiAddress; - bzero(&localWifiAddress, sizeof(localWifiAddress)); - localWifiAddress.sin_len = sizeof(localWifiAddress); - localWifiAddress.sin_family = AF_INET; - // IN_LINKLOCALNETNUM is defined in as 169.254.0.0 - localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); - - return [self reachabilityWithAddress:&localWifiAddress]; -} - - -// Initialization methods - --(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref -{ - self = [super init]; - if (self != nil) - { - _reachableOnWWAN = YES; - _reachabilityRef = CFRetain(ref); - - // We need to create a serial queue. - // We allocate this once for the lifetime of the notifier. - - _reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL); - } - - return self; -} - --(void)dealloc -{ - [self stopNotifier]; - - if(_reachabilityRef) - { - CFRelease(_reachabilityRef); - _reachabilityRef = nil; - } - - _reachableBlock = nil; - _unreachableBlock = nil; - _reachabilitySerialQueue = nil; -} - -// MARK: - Notifier Methods - -// Notifier -// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD -// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS. -// INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want) - --(BOOL)startNotifier -{ - // allow start notifier to be called multiple times - if(self.reachabilityObject && (self.reachabilityObject == self)) - { - return YES; - } - - - SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL }; - context.info = (__bridge void *)self; - - if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context)) - { - // Set it as our reachability queue, which will retain the queue - if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue)) - { - // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves - // woah - self.reachabilityObject = self; - return YES; - } - else - { -#ifdef DEBUG - NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError())); -#endif - - // UH OH - FAILURE - stop any callbacks! - SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); - } - } - else - { -#ifdef DEBUG - NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError())); -#endif - } - - // if we get here we fail at the internet - self.reachabilityObject = nil; - return NO; -} - --(void)stopNotifier -{ - // First stop, any callbacks! - SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); - - // Unregister target from the GCD serial dispatch queue. - SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL); - - self.reachabilityObject = nil; -} - -// MARK: - reachability tests - -// This is for the case where you flick the airplane mode; -// you end up getting something like this: -// Reachability: WR ct----- -// Reachability: -- ------- -// Reachability: WR ct----- -// Reachability: -- ------- -// We treat this as 4 UNREACHABLE triggers - really apple should do better than this - -#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection) - --(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags -{ - BOOL connectionUP = YES; - - if(!(flags & kSCNetworkReachabilityFlagsReachable)) - connectionUP = NO; - - if( (flags & testcase) == testcase ) - connectionUP = NO; - -#if TARGET_OS_IPHONE - if(flags & kSCNetworkReachabilityFlagsIsWWAN) - { - // We're on 3G. - if(!self.reachableOnWWAN) - { - // We don't want to connect when on 3G. - connectionUP = NO; - } - } -#endif - - return connectionUP; -} - --(BOOL)isReachable -{ - SCNetworkReachabilityFlags flags; - - if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - return NO; - - return [self isReachableWithFlags:flags]; -} - --(BOOL)isReachableViaWWAN -{ -#if TARGET_OS_IPHONE - - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - // Check we're REACHABLE - if(flags & kSCNetworkReachabilityFlagsReachable) - { - // Now, check we're on WWAN - if(flags & kSCNetworkReachabilityFlagsIsWWAN) - { - return YES; - } - } - } -#endif - - return NO; -} - --(BOOL)isReachableViaWiFi -{ - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - // Check we're reachable - if((flags & kSCNetworkReachabilityFlagsReachable)) - { -#if TARGET_OS_IPHONE - // Check we're NOT on WWAN - if((flags & kSCNetworkReachabilityFlagsIsWWAN)) - { - return NO; - } -#endif - return YES; - } - } - - return NO; -} - - -// WWAN may be available, but not active until a connection has been established. -// WiFi may require a connection for VPN on Demand. --(BOOL)isConnectionRequired -{ - return [self connectionRequired]; -} - --(BOOL)connectionRequired -{ - SCNetworkReachabilityFlags flags; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return (flags & kSCNetworkReachabilityFlagsConnectionRequired); - } - - return NO; -} - -// Dynamic, on demand connection? --(BOOL)isConnectionOnDemand -{ - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && - (flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand))); - } - - return NO; -} - -// Is user intervention required? --(BOOL)isInterventionRequired -{ - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && - (flags & kSCNetworkReachabilityFlagsInterventionRequired)); - } - - return NO; -} - - -// MARK: - reachability status stuff - --(NetworkStatus)currentReachabilityStatus -{ - if([self isReachable]) - { - if([self isReachableViaWiFi]) - return ReachableViaWiFi; - -#if TARGET_OS_IPHONE - return ReachableViaWWAN; -#endif - } - - return NotReachable; -} - --(SCNetworkReachabilityFlags)reachabilityFlags -{ - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return flags; - } - - return 0; -} - --(NSString*)currentReachabilityString -{ - NetworkStatus temp = [self currentReachabilityStatus]; - - if(temp == ReachableViaWWAN) - { - // Updated for the fact that we have CDMA phones now! - return NSLocalizedString(@"Cellular", @""); - } - if (temp == ReachableViaWiFi) - { - return NSLocalizedString(@"WiFi", @""); - } - - return NSLocalizedString(@"No Connection", @""); -} - --(NSString*)currentReachabilityFlags -{ - return reachabilityFlags([self reachabilityFlags]); -} - -// MARK: - Callback function calls this method - --(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags -{ - if([self isReachableWithFlags:flags]) - { - if(self.reachableBlock) - { - self.reachableBlock(self); - } - } - else - { - if(self.unreachableBlock) - { - self.unreachableBlock(self); - } - } - - // this makes sure the change notification happens on the MAIN THREAD - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:kMLNReachabilityChangedNotification - object:self]; - }); -} - -// MARK: - Debug Description - -- (NSString *) description -{ - NSString *description = [NSString stringWithFormat:@"<%@: %#x (%@)>", - NSStringFromClass([self class]), (unsigned int) self, [self currentReachabilityFlags]]; - return description; -} - -@end From 8e1753c6f62c8d1345955f40147df65bab40d781 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 00:39:41 +0100 Subject: [PATCH 084/339] chore(deps): update cxx.rs digest to 94e8e46 (#3237) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 835b2c9f0a05..663b54e130ab 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -64,7 +64,7 @@ bazel_dep(name = "rules_rust", version = "0.57.1") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", - commit = "fb8fdc0b20ddca8df80f6638bc773dc4824a8092", + commit = "94e8e46066b560fb9dc8964f047f68d066786916", remote = "https://github.com/dtolnay/cxx.git", ) From 5b2e3b92c3895f06508a441f014c5763c81ae333 Mon Sep 17 00:00:00 2001 From: yousifd Date: Mon, 24 Feb 2025 19:11:26 +0300 Subject: [PATCH 085/339] Reduce texture sampler state changes in Metal (#3236) --- src/mbgl/mtl/texture2d.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mbgl/mtl/texture2d.cpp b/src/mbgl/mtl/texture2d.cpp index 816ed9a085d7..d847326ae092 100644 --- a/src/mbgl/mtl/texture2d.cpp +++ b/src/mbgl/mtl/texture2d.cpp @@ -21,6 +21,11 @@ Texture2D::~Texture2D() { } gfx::Texture2D& Texture2D::setSamplerConfiguration(const SamplerState& samplerState_) noexcept { + if (samplerState.filter == samplerState_.filter && samplerState.wrapU == samplerState_.wrapU && + samplerState.wrapV == samplerState_.wrapV) { + return *this; + } + samplerState = samplerState_; samplerStateDirty = true; return *this; @@ -216,6 +221,8 @@ void Texture2D::updateSamplerConfiguration() noexcept { ? MTL::SamplerAddressModeClampToEdge : MTL::SamplerAddressModeRepeat); metalSamplerState = context.createMetalSamplerState(samplerDescriptor); + + samplerStateDirty = false; } void Texture2D::bind(RenderPass& renderPass, int32_t location) noexcept { From 50db49d5bd5647ce7d206e37fb179cba11e4c73d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:45:53 +0100 Subject: [PATCH 086/339] chore(deps): update dependency gradle to v8.13 (#3253) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- benchmark/android/gradlew | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- platform/android/MapLibrePlugin/gradlew | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradlew | 2 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- test/android/gradlew | 2 +- 13 files changed, 9 insertions(+), 9 deletions(-) diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.jar b/benchmark/android/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34744 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 delta 34727 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�{ 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 a%EQ2*fnt2>pW(< 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 delta 34727 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�{ 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 a%EQ2*fnt2>pW(< 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 delta 34727 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�{ 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 a%EQ2*fnt2>pW(< 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 delta 34727 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�{ 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 a%EQ2*fnt2> Date: Tue, 25 Feb 2025 20:49:06 +0200 Subject: [PATCH 087/339] Fix texture view cleanup (#3254) --- .../textureview/VulkanTextureViewRenderThread.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java index 3b8a0715ba03..6b11c1569b40 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java @@ -15,6 +15,16 @@ public VulkanTextureViewRenderThread(@NonNull TextureView textureView, @NonNull super(textureView, mapRenderer); } + void cleanup() { + if (surface == null) { + return; + } + + mapRenderer.onSurfaceDestroyed(); + surface.release(); + surface = null; + } + // Thread implementation @Override @@ -121,6 +131,7 @@ public void run() { // Signal we're done synchronized (lock) { + cleanup(); this.exited = true; lock.notifyAll(); } From 2af1bb7f3681ca098e7e3de739b65b6249f27f56 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 26 Feb 2025 12:53:08 +0100 Subject: [PATCH 088/339] Add .git and other directories to .bazelignore (#3255) --- .bazelignore | 8 ++++++++ .gitignore | 13 ++----------- platform/node/.gitignore | 1 + 3 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 platform/node/.gitignore diff --git a/.bazelignore b/.bazelignore index 4c373e4d17f6..01f1586e6b72 100644 --- a/.bazelignore +++ b/.bazelignore @@ -2,3 +2,11 @@ bazel-bin bazel-out bazel-testlogs node_modules +.git +.cache +.idea +.vscode +build +/build-* +node_modules +.cxx diff --git a/.gitignore b/.gitignore index aa5f392d3294..8e5e2b2abb40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,10 @@ -/mapbox-gl-native-android/MapLibreAndroid/mapbox-gl-native -/mapbox-gl-native-android/MapLibreAndroidTestApp/mapbox-gl-native /platform/android/MapLibreAndroidTestApp/src/main/res/values/developer-config.xml /platform/android/gradle/configuration.gradle /platform/android/arm64-v8a /platform/android/armeabi-v7a -/platform/android/MapLibreAndroid/.cxx /platform/android/MapLibreAndroid/build /platform/android/MapLibrePlugin/build -/platform/android/MapLibreAndroidTestApp/.cxx /platform/android/MapLibreAndroidTestApp/build /platform/android/buildSrc/build /platform/android/x86 @@ -16,7 +12,6 @@ /cmake-build-debug /platform/android/build /platform/android/MapLibreAndroid/src/main/assets/sdk_versions/com.mapbox.mapboxsdk -/platform/ios/platform/ios/Mapbox.playground/build/ /platform/windows/vendor/mesa3d/ *.code-workspace @@ -35,14 +30,11 @@ compile_commands.json /platform/android/signing-key.text /platform/android/.java-version *.hprof -/platform/ios/platform/ios/benchmark/assets/tiles/tiles -/platform/ios/platform/ios/benchmark/assets/glyphs/Roboto Regular,Noto Sans Regular -/platform/ios/platform/ios/benchmark/assets/glyphs/Roboto Medium,Noto Sans Regular -/platform/ios/platform/ios/benchmark/assets/glyphs/Roboto Condensed Italic,Noto Sans Italic -/platform/ios/platform/ios/benchmark/assets/glyphs/Noto Sans Regular /platform/android/key.json /platform/android/site node_modules +.cxx + # Node binaries. /lib @@ -59,5 +51,4 @@ __generated__ cache.sqlite cache.sqlite-journal out.png -/test/android/app/.cxx /test/android/app/build diff --git a/platform/node/.gitignore b/platform/node/.gitignore new file mode 100644 index 000000000000..502167fa0b8e --- /dev/null +++ b/platform/node/.gitignore @@ -0,0 +1 @@ +/lib From 299c86818e9001d9f4fc03fd742570af479aed8a Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 26 Feb 2025 15:22:47 +0100 Subject: [PATCH 089/339] Fix .bazelignore (#3257) --- .bazelignore | 9 +++------ .github/changed-files.yml | 10 ++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.bazelignore b/.bazelignore index 01f1586e6b72..1b520c31717c 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,12 +1,9 @@ -bazel-bin +.git +node_modules bazel-out +bazel-bin bazel-testlogs -node_modules -.git .cache .idea .vscode -build -/build-* -node_modules .cxx diff --git a/.github/changed-files.yml b/.github/changed-files.yml index 56c53e855bc7..42e3c6348041 100644 --- a/.github/changed-files.yml +++ b/.github/changed-files.yml @@ -9,10 +9,11 @@ linux: - 'vendor/**' - 'CMakeLists.txt' - 'metrics/linux-gcc8-release-style.json' - - 'WORKSPACE' + - 'MODULE.bazel' - 'BUILD.bazel' - '.bazelrc' - '.bazelversion' + - '.bazelignore' - '!**/*.md' windows: - '.github/workflows/windows-ci.yml' @@ -26,10 +27,6 @@ windows: - 'metrics/**' - 'vendor/**' - '.gitmodules' - - 'WORKSPACE' - - 'BUILD.bazel' - - '.bazelrc' - - '.bazelversion' - '!**/*.md' ios: - 'platform/ios/**' @@ -46,10 +43,11 @@ ios: - 'test/**' - 'vendor/**' - '.gitmodules' - - 'WORKSPACE' + - 'MODULE.bazel' - 'BUILD.bazel' - '.bazelrc' - '.bazelversion' + - '.bazelignore' - 'pnpm-lock.yaml' - '!**/*.md' android: From f5f6e7faa2b6bbae107c83c55b7d3a0bcff729b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 01:52:00 +0100 Subject: [PATCH 090/339] Bump the github-actions group across 1 directory with 2 updates (#3249) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/gh-pages-android-api.yml | 2 +- .github/workflows/gh-pages-android-examples.yml | 2 +- .github/workflows/gh-pages-cpp-api.yml | 2 +- .github/workflows/gh-pages-docc.yml | 2 +- .github/workflows/gh-pages-mdbook.yml | 2 +- .github/workflows/qt-ci.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/gh-pages-android-api.yml b/.github/workflows/gh-pages-android-api.yml index 5f327f21091d..f42cc88350d0 100644 --- a/.github/workflows/gh-pages-android-api.yml +++ b/.github/workflows/gh-pages-android-api.yml @@ -26,7 +26,7 @@ jobs: run: ./gradlew dokkaGenerate - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: branch: gh-pages folder: platform/android/MapLibreAndroid/build/dokka/html diff --git a/.github/workflows/gh-pages-android-examples.yml b/.github/workflows/gh-pages-android-examples.yml index 090401df1a60..047d7be2b06b 100644 --- a/.github/workflows/gh-pages-android-examples.yml +++ b/.github/workflows/gh-pages-android-examples.yml @@ -23,7 +23,7 @@ jobs: run: make mkdocs-build - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: branch: gh-pages folder: platform/android/site diff --git a/.github/workflows/gh-pages-cpp-api.yml b/.github/workflows/gh-pages-cpp-api.yml index 1095e1fbad3a..bfcfcd904898 100644 --- a/.github/workflows/gh-pages-cpp-api.yml +++ b/.github/workflows/gh-pages-cpp-api.yml @@ -20,7 +20,7 @@ jobs: run: doxygen - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: branch: gh-pages folder: docs/doxygen/html diff --git a/.github/workflows/gh-pages-docc.yml b/.github/workflows/gh-pages-docc.yml index d02221794f3f..e6273d821bcc 100644 --- a/.github/workflows/gh-pages-docc.yml +++ b/.github/workflows/gh-pages-docc.yml @@ -67,7 +67,7 @@ jobs: rm docs.zip - name: Deploy DocC documentation (main) 🚀 - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: branch: gh-pages folder: build/docs diff --git a/.github/workflows/gh-pages-mdbook.yml b/.github/workflows/gh-pages-mdbook.yml index 66c09929b5c6..3e6ea8c4eb1a 100644 --- a/.github/workflows/gh-pages-mdbook.yml +++ b/.github/workflows/gh-pages-mdbook.yml @@ -43,7 +43,7 @@ jobs: name: book path: artifacts/book - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: branch: gh-pages folder: artifacts/book diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index e889c5cd685a..7a6f1d234e3b 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -182,7 +182,7 @@ jobs: arch: ${{ matrix.compiler_type }} - name: Setup ninja - uses: seanmiddleditch/gha-setup-ninja@v5 + uses: seanmiddleditch/gha-setup-ninja@v6 - name: Download Qt uses: jurplel/install-qt-action@v4 From ce4dcb7a9b762afab5fb3f2a99dbb5f28f269f2e Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 27 Feb 2025 13:42:13 +0200 Subject: [PATCH 091/339] Add iOS/macOS observer hooks (#3245) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bart Louwers --- platform/darwin/bazel/files.bzl | 1 + platform/darwin/src/MLNTileOperation.h | 13 ++ platform/ios/MapLibre.docc/MapLibre.md | 1 + platform/ios/MapLibre.docc/ObserverExample.md | 113 +++++++++++++ .../Sources/MapLibreNavigationView.swift | 3 + .../app-swift/Sources/ObserverExample.swift | 112 +++++++++++++ platform/ios/app/MBXViewController.mm | 91 +++++++++++ platform/ios/sdk-files.json | 1 + platform/ios/src/MLNMapView+Impl.h | 15 ++ platform/ios/src/MLNMapView+Impl.mm | 86 ++++++++++ platform/ios/src/MLNMapView.mm | 106 ++++++++++++ platform/ios/src/MLNMapViewDelegate.h | 152 ++++++++++++++++++ platform/ios/src/MLNMapView_Private.h | 24 +++ .../MLNMapViewDelegateIntegrationTests.swift | 20 +++ platform/macos/sdk-files.json | 1 + platform/macos/src/MLNMapView+Impl.h | 15 ++ platform/macos/src/MLNMapView+Impl.mm | 86 ++++++++++ platform/macos/src/MLNMapView.mm | 107 ++++++++++++ platform/macos/src/MLNMapViewDelegate.h | 45 ++++++ platform/macos/src/MLNMapView_Private.h | 24 +++ 20 files changed, 1016 insertions(+) create mode 100644 platform/darwin/src/MLNTileOperation.h create mode 100644 platform/ios/MapLibre.docc/ObserverExample.md create mode 100644 platform/ios/app-swift/Sources/ObserverExample.swift diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index fb76746c4977..facd90f72a8e 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -93,6 +93,7 @@ MLN_DARWIN_OBJC_HEADERS = [ "src/MLNStyle.h", "src/MLNStyleLayer.h", "src/MLNStyleValue.h", + "src/MLNTileOperation.h", "src/MLNTilePyramidOfflineRegion.h", "src/MLNTileServerOptions.h", "src/MLNTileSource.h", diff --git a/platform/darwin/src/MLNTileOperation.h b/platform/darwin/src/MLNTileOperation.h new file mode 100644 index 000000000000..f155f1e12db7 --- /dev/null +++ b/platform/darwin/src/MLNTileOperation.h @@ -0,0 +1,13 @@ +#import + +typedef NS_ENUM(NSInteger, MLNTileOperation) { + MLNTileOperationRequestedFromCache, ///< A read request from the cache + MLNTileOperationRequestedFromNetwork, ///< A read request from the online source + MLNTileOperationLoadFromNetwork, ///< Tile data from the network has been retrieved + MLNTileOperationLoadFromCache, ///< Tile data from the cache has been retrieved + MLNTileOperationStartParse, ///< Background processing of tile data has been initiated + MLNTileOperationEndParse, ///< Background processing of tile data has been completed + MLNTileOperationError, ///< An error occurred while loading the tile + MLNTileOperationCancelled, ///< Loading of a tile was cancelled + MLNTileOperationNullOp, ///< No operation has taken place +}; diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index 72a119db1caf..051fc8dff279 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -51,6 +51,7 @@ Powerful, free and open-source mapping toolkit with full control over data sourc ### Advanced +- - ### Other Articles diff --git a/platform/ios/MapLibre.docc/ObserverExample.md b/platform/ios/MapLibre.docc/ObserverExample.md new file mode 100644 index 000000000000..0df88adf3954 --- /dev/null +++ b/platform/ios/MapLibre.docc/ObserverExample.md @@ -0,0 +1,113 @@ +# Observe Low-Level Events + +Learn about the ``MLNMapViewDelegate`` methods for observing map events. + +> Warning: These methods are not thread-safe. + +You can observe certain low-level events as they happen. Use these methods to collect metrics or investigate issues during map rendering. This feature is intended primarily for power users. We are always interested in improving observability, so if you have a special use case, feel free to [open an issue or pull request](https://github.com/maplibre/maplibre-native) to extend the types of observability methods. + +## Shader Events + +Observe shader compilation with ``MLNMapViewDelegate/mapView:shaderWillCompile:backend:defines:`` and ``MLNMapViewDelegate/mapView:shaderDidCompile:backend:defines:``. + + + +```swift +func mapView(_: MLNMapView, shaderWillCompile id: Int, backend: Int, defines: String) { + print("A new shader is being compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") + } + + func mapView(_: MLNMapView, shaderDidCompile id: Int, backend: Int, defines: String) { + print("A shader has been compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") + } +``` + +See also: ``MLNMapViewDelegate/mapView:shaderDidFailCompile:backend:defines:``. + +## Glyph Loading + +Observe glyph loading events with ``MLNMapViewDelegate/mapView:glyphsWillLoad:range:`` and ``MLNMapViewDelegate/mapView:glyphsDidLoad:range:``. + + + +```swift +func mapView(_: MLNMapView, glyphsWillLoad fontStack: [String], range: NSRange) { + print("Glyphs are being requested for the font stack \(fontStack), ranging from \(range.location) to \(range.location + range.length)") + } + + func mapView(_: MLNMapView, glyphsDidLoad fontStack: [String], range: NSRange) { + print("Glyphs have been loaded for the font stack \(fontStack), ranging from \(range.location) to \(range.location + range.length)") + } +``` + +See also: ``MLNMapViewDelegate/mapView:glyphsDidError:range:``. + +## Tile Events + +Monitor tile-related actions using the delegate method ``MLNMapViewDelegate/mapView:tileDidTriggerAction:x:y:z:wrap:overscaledZ:sourceID:`` with the ``MLNTileOperation`` type. + + + +```swift +func mapView(_: MLNMapView, tileDidTriggerAction operation: MLNTileOperation, + x: Int, + y: Int, + z: Int, + wrap: Int, + overscaledZ: Int, + sourceID: String) + { + let tileStr = String(format: "(x: %ld, y: %ld, z: %ld, wrap: %ld, overscaledZ: %ld, sourceID: %@)", + x, y, z, wrap, overscaledZ, sourceID) + + switch operation { + case MLNTileOperation.requestedFromCache: + print("Requesting tile \(tileStr) from cache") + + case MLNTileOperation.requestedFromNetwork: + print("Requesting tile \(tileStr) from network") + + case MLNTileOperation.loadFromCache: + print("Loading tile \(tileStr), requested from the cache") + + case MLNTileOperation.loadFromNetwork: + print("Loading tile \(tileStr), requested from the network") + + case MLNTileOperation.startParse: + print("Parsing tile \(tileStr)") + + case MLNTileOperation.endParse: + print("Completed parsing tile \(tileStr)") + + case MLNTileOperation.error: + print("An error occured during proccessing for tile \(tileStr)") + + case MLNTileOperation.cancelled: + print("Pending work on tile \(tileStr)") + + case MLNTileOperation.nullOp: + print("An unknown tile operation was emitted for tile \(tileStr)") + + @unknown default: + assertionFailure() + } + } +``` + +## Sprite Loading + +Observe sprite loading events with ``MLNMapViewDelegate/mapView:spriteWillLoad:url:`` and ``MLNMapViewDelegate/mapView:spriteDidLoad:url:``. + + + +```swift +func mapView(_: MLNMapView, spriteWillLoad id: String, url: String) { + print("The sprite \(id) has been requested from \(url)") + } + + func mapView(_: MLNMapView, spriteDidLoad id: String, url: String) { + print("The sprite \(id) has been loaded from \(url)") + } +``` + +See also: ``MLNMapViewDelegate/mapView:spriteDidError:url:``. diff --git a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift index e08aa876e201..a815f6a2c337 100644 --- a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift +++ b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift @@ -34,6 +34,9 @@ struct MapLibreNavigationView: View { NavigationLink("AddMarkerExample") { AddMarkerSymbolExampleUIViewControllerRepresentable() } + NavigationLink("ObserverExample") { + ObserverExampleViewExampleUIViewControllerRepresentable() + } Group { NavigationLink("AnimatedLineExample") { AnimatedLineExampleUIViewControllerRepresentable() diff --git a/platform/ios/app-swift/Sources/ObserverExample.swift b/platform/ios/app-swift/Sources/ObserverExample.swift new file mode 100644 index 000000000000..74938ac0e2d8 --- /dev/null +++ b/platform/ios/app-swift/Sources/ObserverExample.swift @@ -0,0 +1,112 @@ +import MapLibre +import SwiftUI +import UIKit + +class ObserverExampleView: UIViewController, MLNMapViewDelegate { + var mapView: MLNMapView! + + override func viewDidLoad() { + super.viewDidLoad() + + mapView = MLNMapView(frame: view.bounds, styleURL: AMERICANA_STYLE) + mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + mapView.setCenter( + CLLocationCoordinate2D(latitude: 45.5076, longitude: -122.6736), + zoomLevel: 11, + animated: false + ) + view.addSubview(mapView) + + mapView.delegate = self + } + + // #-example-code(ObserverExampleShaders) + func mapView(_: MLNMapView, shaderWillCompile id: Int, backend: Int, defines: String) { + print("A new shader is being compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") + } + + func mapView(_: MLNMapView, shaderDidCompile id: Int, backend: Int, defines: String) { + print("A shader has been compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") + } + + // #-end-example-code + + // #-example-code(ObserverExampleGlyphs) + func mapView(_: MLNMapView, glyphsWillLoad fontStack: [String], range: NSRange) { + print("Glyphs are being requested for the font stack \(fontStack), ranging from \(range.location) to \(range.location + range.length)") + } + + func mapView(_: MLNMapView, glyphsDidLoad fontStack: [String], range: NSRange) { + print("Glyphs have been loaded for the font stack \(fontStack), ranging from \(range.location) to \(range.location + range.length)") + } + + // #-end-example-code + + // #-example-code(ObserverExampleTiles) + func mapView(_: MLNMapView, tileDidTriggerAction operation: MLNTileOperation, + x: Int, + y: Int, + z: Int, + wrap: Int, + overscaledZ: Int, + sourceID: String) + { + let tileStr = String(format: "(x: %ld, y: %ld, z: %ld, wrap: %ld, overscaledZ: %ld, sourceID: %@)", + x, y, z, wrap, overscaledZ, sourceID) + + switch operation { + case MLNTileOperation.requestedFromCache: + print("Requesting tile \(tileStr) from cache") + + case MLNTileOperation.requestedFromNetwork: + print("Requesting tile \(tileStr) from network") + + case MLNTileOperation.loadFromCache: + print("Loading tile \(tileStr), requested from the cache") + + case MLNTileOperation.loadFromNetwork: + print("Loading tile \(tileStr), requested from the network") + + case MLNTileOperation.startParse: + print("Parsing tile \(tileStr)") + + case MLNTileOperation.endParse: + print("Completed parsing tile \(tileStr)") + + case MLNTileOperation.error: + print("An error occured during proccessing for tile \(tileStr)") + + case MLNTileOperation.cancelled: + print("Pending work on tile \(tileStr)") + + case MLNTileOperation.nullOp: + print("An unknown tile operation was emitted for tile \(tileStr)") + + @unknown default: + assertionFailure() + } + } + + // #-end-example-code + + // #-example-code(ObserverExampleSprites) + func mapView(_: MLNMapView, spriteWillLoad id: String, url: String) { + print("The sprite \(id) has been requested from \(url)") + } + + func mapView(_: MLNMapView, spriteDidLoad id: String, url: String) { + print("The sprite \(id) has been loaded from \(url)") + } + // #-end-example-code +} + +struct ObserverExampleViewExampleUIViewControllerRepresentable: UIViewControllerRepresentable { + typealias UIViewControllerType = ObserverExampleView + + func makeUIViewController(context _: Context) -> ObserverExampleView { + ObserverExampleView() + } + + func updateUIViewController(_: ObserverExampleView, context _: Context) {} +} diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index e15ec5457d39..46a446ef0846 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -2274,6 +2274,97 @@ - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id *)fontStack + range:(NSRange)range +{ + NSLog(@"Glyphs are being requested for the font stack %@, ranging from %ld to %ld", fontStack, range.location, range.location + range.length); +} + +- (void)mapView:(MLNMapView *)mapView + glyphsDidLoad:(NSArray *)fontStack + range:(NSRange)range +{ + NSLog(@"Glyphs have been loaded for the font stack %@, ranging from %ld to %ld", fontStack, range.location, range.location + range.length); +} + +- (void)mapView:(MLNMapView *)mapView + tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(NSString *)sourceID +{ + NSString* tileStr = [NSString stringWithFormat:@"(x: %ld, y: %ld, z: %ld, wrap: %ld, overscaledZ: %ld, sourceID: %@)", + x, y, z, wrap, overscaledZ, sourceID]; + + switch (operation) { + case MLNTileOperationRequestedFromCache: + NSLog(@"Requesting tile %@ from cache", tileStr); + break; + + case MLNTileOperationRequestedFromNetwork: + NSLog(@"Requesting tile %@ from network", tileStr); + break; + + case MLNTileOperationLoadFromCache: + NSLog(@"Loading tile %@, requested from the cache", tileStr); + break; + + case MLNTileOperationLoadFromNetwork: + NSLog(@"Loading tile %@, requested from the network", tileStr); + break; + + case MLNTileOperationStartParse: + NSLog(@"Parsing tile %@", tileStr); + break; + + case MLNTileOperationEndParse: + NSLog(@"Completed parsing tile %@", tileStr); + break; + + case MLNTileOperationError: + NSLog(@"An error occured during proccessing for tile %@", tileStr); + break; + + case MLNTileOperationCancelled: + NSLog(@"Pending work on tile %@", tileStr); + break; + + case MLNTileOperationNullOp: + NSLog(@"An unknown tile operation was emitted for tile %@", tileStr); + break; + } +} + +- (void)mapView:(MLNMapView *)mapView spriteWillLoad:(NSString *)id url:(NSString *)url +{ + NSLog(@"The sprite %@ has been requested from %@", id, url); +} + +- (void)mapView:(MLNMapView *)mapView spriteDidLoad:(NSString *)id url:(NSString *)url +{ + NSLog(@"The sprite %@ has been loaded from %@", id, url); +} + - (MLNAnnotationView *)mapView:(MLNMapView *)mapView viewForAnnotation:(id)annotation { if (annotation == mapView.userLocation) diff --git a/platform/ios/sdk-files.json b/platform/ios/sdk-files.json index 0a65d0a50fd3..57464ddd8d1a 100644 --- a/platform/ios/sdk-files.json +++ b/platform/ios/sdk-files.json @@ -183,6 +183,7 @@ "MLNMapCamera.h": "platform/darwin/src/MLNMapCamera.h", "MLNForegroundStyleLayer.h": "platform/darwin/src/MLNForegroundStyleLayer.h", "MLNOfflineRegion.h": "platform/darwin/src/MLNOfflineRegion.h", + "MLNTileOperation.h": "platform/darwin/src/MLNTileOperation.h", "MLNMapViewDelegate.h": "platform/ios/src/MLNMapViewDelegate.h", "MLNDistanceFormatter.h": "platform/darwin/src/MLNDistanceFormatter.h", "MLNCustomStyleLayer.h": "platform/darwin/src/MLNCustomStyleLayer.h", diff --git a/platform/ios/src/MLNMapView+Impl.h b/platform/ios/src/MLNMapView+Impl.h index ff413367e2a1..ab4c3459f5c4 100644 --- a/platform/ios/src/MLNMapView+Impl.h +++ b/platform/ios/src/MLNMapView+Impl.h @@ -72,6 +72,21 @@ class MLNMapViewImpl : public mbgl::MapObserver { void onDidBecomeIdle() override; void onStyleImageMissing(const std::string& imageIdentifier) override; bool onCanRemoveUnusedStyleImage(const std::string& imageIdentifier) override; + void onRegisterShaders(mbgl::gfx::ShaderRegistry&) override; + void onPreCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onPostCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onShaderCompileFailed(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onGlyphsLoaded(const mbgl::FontStack&, const mbgl::GlyphRange&) override; + void onGlyphsError(const mbgl::FontStack&, const mbgl::GlyphRange&, std::exception_ptr) override; + void onGlyphsRequested(const mbgl::FontStack&, const mbgl::GlyphRange&) override; + void onTileAction(mbgl::TileOperation, const mbgl::OverscaledTileID&, + const std::string&) override; + void onSpriteLoaded(const std::optional&) override; + void onSpriteError(const std::optional&, std::exception_ptr) override; + void onSpriteRequested(const std::optional&) override; protected: /// Cocoa map view that this adapter bridges to. diff --git a/platform/ios/src/MLNMapView+Impl.mm b/platform/ios/src/MLNMapView+Impl.mm index 901a542f7142..35ad18139670 100644 --- a/platform/ios/src/MLNMapView+Impl.mm +++ b/platform/ios/src/MLNMapView+Impl.mm @@ -116,3 +116,89 @@ NSString *imageName = [NSString stringWithUTF8String:imageIdentifier.c_str()]; return [mapView shouldRemoveStyleImage:imageName]; } + +void MLNMapViewImpl::onRegisterShaders(mbgl::gfx::ShaderRegistry& shaders) { + +} + +void MLNMapViewImpl::onPreCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderWillCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onPostCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderDidCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onShaderCompileFailed(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderDidFailCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onGlyphsLoaded(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsDidLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onGlyphsError(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range, std::exception_ptr error) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsDidError:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onGlyphsRequested(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsWillLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onTileAction(mbgl::TileOperation operation, const mbgl::OverscaledTileID& tile, const std::string& sourceID) { + [mapView tileDidTriggerAction:MLNTileOperation(static_cast(operation)) + x:tile.canonical.x + y:tile.canonical.x + z:tile.canonical.z + wrap:tile.wrap + overscaledZ:tile.overscaledZ + sourceID:[NSString stringWithUTF8String:sourceID.c_str()]]; +} + +void MLNMapViewImpl::onSpriteLoaded(const std::optional& spriteID) { + if (!spriteID.has_value()) { + [mapView spriteDidLoad:nil url:nil]; + return; + } + + [mapView spriteDidLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} + +void MLNMapViewImpl::onSpriteError(const std::optional& spriteID, std::exception_ptr error) { + if (!spriteID.has_value()) { + [mapView spriteDidError:nil url:nil]; + return; + } + + [mapView spriteDidError:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} + +void MLNMapViewImpl::onSpriteRequested(const std::optional& spriteID) { + if (!spriteID.has_value()) { + [mapView spriteWillLoad:nil url:nil]; + return; + } + + [mapView spriteWillLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 16162ce1097a..e5329c80915b 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -6924,6 +6924,112 @@ - (BOOL)shouldRemoveStyleImage:(NSString *)imageName { return YES; } +- (void)shaderWillCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderWillCompile:backend:defines:)]) { + [self.delegate mapView:self shaderWillCompile:id backend:backend defines:defines]; + } +} + +- (void)shaderDidCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderDidCompile:backend:defines:)]) { + [self.delegate mapView:self shaderDidCompile:id backend:backend defines:defines]; + } +} + +- (void)shaderDidFailCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderDidFailCompile:backend:defines:)]) { + [self.delegate mapView:self shaderDidFailCompile:id backend:backend defines:defines]; + } +} + +- (void)glyphsWillLoad:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsWillLoad:range:)]) { + [self.delegate mapView:self glyphsWillLoad:fontStack range:range]; + } +} + +- (void)glyphsDidLoad:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidLoad:range:)]) { + [self.delegate mapView:self glyphsDidLoad:fontStack range:range]; + } +} + +- (void)glyphsDidError:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidError:range:)]) { + [self.delegate mapView:self glyphsDidError:fontStack range:range]; + } +} + +- (void)tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(nonnull NSString *)sourceID { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:tileDidTriggerAction:x:y:z:wrap:overscaledZ:sourceID:)]) { + [self.delegate mapView:self tileDidTriggerAction:operation x:x y:y z:z wrap:wrap overscaledZ:overscaledZ sourceID:sourceID]; + } +} + +- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteWillLoad:url:)]) { + [self.delegate mapView:self spriteWillLoad:id url:url]; + } +} + +- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteDidLoad:url:)]) { + [self.delegate mapView:self spriteDidLoad:id url:url]; + } +} + +- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteDidError:url:)]) { + [self.delegate mapView:self spriteDidError:id url:url]; + } +} + - (void)updateUserLocationAnnotationView { [self updateUserLocationAnnotationViewAnimatedWithDuration:0]; diff --git a/platform/ios/src/MLNMapViewDelegate.h b/platform/ios/src/MLNMapViewDelegate.h index 346dbc5fd936..32ecf8909a11 100644 --- a/platform/ios/src/MLNMapViewDelegate.h +++ b/platform/ios/src/MLNMapViewDelegate.h @@ -1,5 +1,6 @@ #import +#import #import "MLNCameraChangeReason.h" #import "Mapbox.h" @@ -325,6 +326,157 @@ NS_ASSUME_NONNULL_BEGIN */ - (BOOL)mapView:(MLNMapView *)mapView shouldRemoveStyleImage:(NSString *)imageName; +// MARK: - Shader Compilation + +/** + Called when a shader is about to be compiled. + + @param mapView The ``MLNMapView`` instance invoking this delegate method. + @param id The unique identifier for the shader being compiled. + @param backend An integer representing the backend type used for shader compilation. + @param defines A string containing the shader program configuration definitions. + + > Warning: This method is not thread-safe. + */ +- (void)mapView:(MLNMapView *)mapView + shaderWillCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; + +/** +Called when a shader was successfully compiled. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param id The unique identifier for the shader that was compiled. +@param backend An integer representing the backend type used for shader compilation. +@param defines A string containing the shader program configuration definitions. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + shaderDidCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; + +/** +Called when a shader failed to compile. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param id The unique identifier for the shader that failed to compile. +@param backend An integer representing the backend type used for shader compilation. +@param defines A string containing the shader program configuration definitions. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + shaderDidFailCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; + +// MARK: - Glyph Requests + +/** +Called when glyphs for the specified font stack are about to be loaded. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param fontStack An array of strings identifying the requested font stack. +@param range The range of glyphs that are being requested. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + glyphsWillLoad:(NSArray *)fontStack + range:(NSRange)range; + +/** +Called when glyphs for the specified font stack have been successfully loaded. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param fontStack An array of strings identifying the requested font stack. +@param range The range of glyphs that were successfully loaded. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + glyphsDidLoad:(NSArray *)fontStack + range:(NSRange)range; + +/** +Called when an error occurred while loading glyphs for the specified font stack. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param fontStack An array of strings identifying the requested font stack. +@param range The range of glyphs for which loading failed. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + glyphsDidError:(NSArray *)fontStack + range:(NSRange)range; + +// MARK: - Tile Requests + +/** +Called when a tile-related action is triggered. + +This method notifies the delegate of various stages of tile processing, such as requesting from +cache or network, parsing, or encountering errors. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param operation The type of tile operation triggered. See ``MLNTileOperation``. +@param x The x-coordinate of the tile. +@param y The y-coordinate of the tile. +@param z The z (zoom) level of the tile. +@param wrap The wrap value for the tile. +@param overscaledZ The overscaled zoom level of the tile. +@param sourceID A string identifier for the tile source. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView + tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(NSString *)sourceID; + +// MARK: - Sprite Requests + +/** +Called when a sprite is about to be loaded. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param id The unique identifier for the sprite being loaded. +@param url The URL from which the sprite is being requested. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView spriteWillLoad:(NSString *)id url:(NSString *)url; + +/** +Called when a sprite has been successfully loaded. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param id The unique identifier for the sprite that was loaded. +@param url The URL from which the sprite was loaded. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView spriteDidLoad:(NSString *)id url:(NSString *)url; + +/** +Called when an error occurs while loading a sprite. + +@param mapView The ``MLNMapView`` instance invoking this delegate method. +@param id The unique identifier for the sprite for which loading failed. +@param url The URL from which the sprite was being requested. + +> Warning: This method is not thread-safe. +*/ +- (void)mapView:(MLNMapView *)mapView spriteDidError:(NSString *)id url:(NSString *)url; + // MARK: Tracking User Location /** diff --git a/platform/ios/src/MLNMapView_Private.h b/platform/ios/src/MLNMapView_Private.h index 6c7088d3cf2d..632fe4938845 100644 --- a/platform/ios/src/MLNMapView_Private.h +++ b/platform/ios/src/MLNMapView_Private.h @@ -1,5 +1,6 @@ #import "MLNAnnotationContainerView.h" #import "MLNMapView.h" +#import "MLNTileOperation.h" #import "MLNUserLocationAnnotationView.h" #include @@ -48,6 +49,29 @@ FOUNDATION_EXTERN MLN_EXPORT MLNExceptionName const _Nonnull MLNUnderlyingMapUna - (void)didFailToLoadImage:(nonnull NSString *)imageName; - (BOOL)shouldRemoveStyleImage:(nonnull NSString *)imageName; +- (void)shaderWillCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)shaderDidCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)shaderDidFailCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)glyphsWillLoad:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)glyphsDidLoad:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)glyphsDidError:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(nonnull NSString *)sourceID; +- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url; +- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url; +- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url; + - (CLLocationDistance)metersPerPointAtLatitude:(CLLocationDegrees)latitude zoomLevel:(double)zoomLevel; diff --git a/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift b/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift index f96b7dcfc304..fcb33adef15b 100644 --- a/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift +++ b/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift @@ -103,4 +103,24 @@ extension MLNMapViewDelegateIntegrationTests: MLNMapViewDelegate { func mapView(_: MLNMapView, didChangeLocationManagerAuthorization _: MLNLocationManager) {} func mapView(styleForDefaultUserLocationAnnotationView _: MLNMapView) -> MLNUserLocationAnnotationViewStyle { MLNUserLocationAnnotationViewStyle() } + + func mapView(_: MLNMapView, shaderWillCompile _: Int, backend _: Int, defines _: String) {} + func mapView(_: MLNMapView, shaderDidCompile _: Int, backend _: Int, defines _: String) {} + func mapView(_: MLNMapView, shaderDidFailCompile _: Int, backend _: Int, defines _: String) {} + + func mapView(_: MLNMapView, glyphsWillLoad _: [String], range _: NSRange) {} + func mapView(_: MLNMapView, glyphsDidLoad _: [String], range _: NSRange) {} + func mapView(_: MLNMapView, glyphsDidError _: [String], range _: NSRange) {} + + func mapView(_: MLNMapView, tileDidTriggerAction _: MLNTileOperation, + x _: Int, + y _: Int, + z _: Int, + wrap _: Int, + overscaledZ _: Int, + sourceID _: String) {} + + func mapView(_: MLNMapView, spriteWillLoad _: String, url _: String) {} + func mapView(_: MLNMapView, spriteDidLoad _: String, url _: String) {} + func mapView(_: MLNMapView, spriteDidError _: String, url _: String) {} } diff --git a/platform/macos/sdk-files.json b/platform/macos/sdk-files.json index 91329e6ddf08..4dd33d2fd4b1 100644 --- a/platform/macos/sdk-files.json +++ b/platform/macos/sdk-files.json @@ -124,6 +124,7 @@ "MLNOfflineRegion.h": "platform/darwin/src/MLNOfflineRegion.h", "MLNTilePyramidOfflineRegion.h": "platform/darwin/src/MLNTilePyramidOfflineRegion.h", "NSValue+MLNAdditions.h": "platform/darwin/src/NSValue+MLNAdditions.h", + "MLNTileOperation.h": "platform/darwin/src/MLNTileOperation.h", "MLNMapViewDelegate.h": "platform/macos/src/MLNMapViewDelegate.h", "MLNCluster.h": "platform/darwin/src/MLNCluster.h", "MLNFeature.h": "platform/darwin/src/MLNFeature.h", diff --git a/platform/macos/src/MLNMapView+Impl.h b/platform/macos/src/MLNMapView+Impl.h index bb66a2966fb3..16a61fca4a6c 100644 --- a/platform/macos/src/MLNMapView+Impl.h +++ b/platform/macos/src/MLNMapView+Impl.h @@ -38,6 +38,21 @@ class MLNMapViewImpl : public mbgl::MapObserver { void onSourceChanged(mbgl::style::Source& source) override; void onDidBecomeIdle() override; bool onCanRemoveUnusedStyleImage(const std::string& imageIdentifier) override; + void onRegisterShaders(mbgl::gfx::ShaderRegistry&) override; + void onPreCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onPostCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onShaderCompileFailed(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, + const std::string&) override; + void onGlyphsLoaded(const mbgl::FontStack&, const mbgl::GlyphRange&) override; + void onGlyphsError(const mbgl::FontStack&, const mbgl::GlyphRange&, std::exception_ptr) override; + void onGlyphsRequested(const mbgl::FontStack&, const mbgl::GlyphRange&) override; + void onTileAction(mbgl::TileOperation, const mbgl::OverscaledTileID&, + const std::string&) override; + void onSpriteLoaded(const std::optional&) override; + void onSpriteError(const std::optional&, std::exception_ptr) override; + void onSpriteRequested(const std::optional&) override; protected: /// Cocoa map view that this adapter bridges to. diff --git a/platform/macos/src/MLNMapView+Impl.mm b/platform/macos/src/MLNMapView+Impl.mm index 423864f99e83..90ba411ada56 100644 --- a/platform/macos/src/MLNMapView+Impl.mm +++ b/platform/macos/src/MLNMapView+Impl.mm @@ -112,3 +112,89 @@ NSString *imageName = [NSString stringWithUTF8String:imageIdentifier.c_str()]; return [mapView shouldRemoveStyleImage:imageName]; } + +void MLNMapViewImpl::onRegisterShaders(mbgl::gfx::ShaderRegistry& shaders) { + +} + +void MLNMapViewImpl::onPreCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderWillCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onPostCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderDidCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onShaderCompileFailed(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) { + NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()]; + [mapView shaderDidFailCompile:static_cast(shaderID) backend:static_cast(backend) defines:definesCopy]; +} + +void MLNMapViewImpl::onGlyphsLoaded(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsDidLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onGlyphsError(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range, std::exception_ptr error) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsDidError:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onGlyphsRequested(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) { + NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init]; + std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) { + [fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]]; + }); + + [mapView glyphsWillLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)]; +} + +void MLNMapViewImpl::onTileAction(mbgl::TileOperation operation, const mbgl::OverscaledTileID& tile, const std::string& sourceID) { + [mapView tileDidTriggerAction:MLNTileOperation(static_cast(operation)) + x:tile.canonical.x + y:tile.canonical.x + z:tile.canonical.z + wrap:tile.wrap + overscaledZ:tile.overscaledZ + sourceID:[NSString stringWithUTF8String:sourceID.c_str()]]; +} + +void MLNMapViewImpl::onSpriteLoaded(const std::optional& spriteID) { + if (!spriteID.has_value()) { + [mapView spriteDidLoad:nil url:nil]; + return; + } + + [mapView spriteDidLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} + +void MLNMapViewImpl::onSpriteError(const std::optional& spriteID, std::exception_ptr error) { + if (!spriteID.has_value()) { + [mapView spriteDidError:nil url:nil]; + return; + } + + [mapView spriteDidError:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} + +void MLNMapViewImpl::onSpriteRequested(const std::optional& spriteID) { + if (!spriteID.has_value()) { + [mapView spriteWillLoad:nil url:nil]; + return; + } + + [mapView spriteWillLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()] + url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]]; +} diff --git a/platform/macos/src/MLNMapView.mm b/platform/macos/src/MLNMapView.mm index cc4e25b5f589..7a5281c9cd0b 100644 --- a/platform/macos/src/MLNMapView.mm +++ b/platform/macos/src/MLNMapView.mm @@ -1000,6 +1000,113 @@ - (BOOL)shouldRemoveStyleImage:(NSString *)imageName { return YES; } +- (void)shaderWillCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderWillCompile:backend:defines:)]) { + [self.delegate mapView:self shaderWillCompile:id backend:backend defines:defines]; + } +} + +- (void)shaderDidCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderDidCompile:backend:defines:)]) { + [self.delegate mapView:self shaderDidCompile:id backend:backend defines:defines]; + } +} + +- (void)shaderDidFailCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:shaderDidFailCompile:backend:defines:)]) { + [self.delegate mapView:self shaderDidFailCompile:id backend:backend defines:defines]; + } +} + +- (void)glyphsWillLoad:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsWillLoad:range:)]) { + [self.delegate mapView:self glyphsWillLoad:fontStack range:range]; + } +} + +- (void)glyphsDidLoad:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidLoad:range:)]) { + [self.delegate mapView:self glyphsDidLoad:fontStack range:range]; + } +} + +- (void)glyphsDidError:(nonnull NSArray*)fontStack range:(NSRange)range { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidError:range:)]) { + [self.delegate mapView:self glyphsDidError:fontStack range:range]; + } +} + +- (void)tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(nonnull NSString *)sourceID { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:tileDidTriggerAction:x:y:z:wrap:overscaledZ:sourceID:)]) { + [self.delegate mapView:self tileDidTriggerAction:operation x:x y:y z:z wrap:wrap overscaledZ:overscaledZ sourceID:sourceID]; + } +} + +- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteWillLoad:url:)]) { + [self.delegate mapView:self spriteWillLoad:id url:url]; + } +} + +- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteDidLoad:url:)]) { + [self.delegate mapView:self spriteDidLoad:id url:url]; + } +} + +- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url { + if (!_mbglMap) { + return; + } + + if ([self.delegate respondsToSelector:@selector(mapView:spriteDidError:url:)]) { + [self.delegate mapView:self spriteDidError:id url:url]; + } +} + + // MARK: Printing - (void)print:(__unused id)sender { diff --git a/platform/macos/src/MLNMapViewDelegate.h b/platform/macos/src/MLNMapViewDelegate.h index 90f36bf64a42..53057845b483 100644 --- a/platform/macos/src/MLNMapViewDelegate.h +++ b/platform/macos/src/MLNMapViewDelegate.h @@ -1,5 +1,6 @@ #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -227,6 +228,50 @@ NS_ASSUME_NONNULL_BEGIN */ - (BOOL)mapView:(MLNMapView *)mapView shouldRemoveStyleImage:(NSString *)imageName; +// MARK: Shader Compilation + +- (void)mapView:(MLNMapView *)mapView + shaderWillCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; +- (void)mapView:(MLNMapView *)mapView + shaderDidCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; +- (void)mapView:(MLNMapView *)mapView + shaderDidFailCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(NSString *)defines; + +// MARK: Glyph Requests + +- (void)mapView:(MLNMapView *)mapView + glyphsWillLoad:(NSArray *)fontStack + range:(NSRange)range; +- (void)mapView:(MLNMapView *)mapView + glyphsDidLoad:(NSArray *)fontStack + range:(NSRange)range; +- (void)mapView:(MLNMapView *)mapView + glyphsDidError:(NSArray *)fontStack + range:(NSRange)range; + +// MARK: Tile Requests + +- (void)mapView:(MLNMapView *)mapView + tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(NSString *)sourceID; + +// MARK: Sprite Requests + +- (void)mapView:(MLNMapView *)mapView spriteWillLoad:(NSString *)id url:(NSString *)url; +- (void)mapView:(MLNMapView *)mapView spriteDidLoad:(NSString *)id url:(NSString *)url; +- (void)mapView:(MLNMapView *)mapView spriteDidError:(NSString *)id url:(NSString *)url; + // MARK: Managing the Appearance of Annotations /** diff --git a/platform/macos/src/MLNMapView_Private.h b/platform/macos/src/MLNMapView_Private.h index e496e84f3e9c..12c04213da8d 100644 --- a/platform/macos/src/MLNMapView_Private.h +++ b/platform/macos/src/MLNMapView_Private.h @@ -1,4 +1,5 @@ #import "MLNMapView.h" +#import "MLNTileOperation.h" #include @@ -47,6 +48,29 @@ class Renderer; - (void)sourceDidChange:(nonnull MLNSource *)source; - (BOOL)shouldRemoveStyleImage:(nonnull NSString *)imageName; +- (void)shaderWillCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)shaderDidCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)shaderDidFailCompile:(NSInteger)id + backend:(NSInteger)backend + defines:(nonnull NSString *)defines; +- (void)glyphsWillLoad:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)glyphsDidLoad:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)glyphsDidError:(nonnull NSArray *)fontStack range:(NSRange)range; +- (void)tileDidTriggerAction:(MLNTileOperation)operation + x:(NSInteger)x + y:(NSInteger)y + z:(NSInteger)z + wrap:(NSInteger)wrap + overscaledZ:(NSInteger)overscaledZ + sourceID:(nonnull NSString *)sourceID; +- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url; +- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url; +- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url; + /// Asynchronously render a frame of the map. - (void)setNeedsRerender; From 7562931a4345ddeb0ecb5bf01e03470ff3da506f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 27 Feb 2025 20:40:15 +0100 Subject: [PATCH 092/339] Prepare release MapLibre Android 11.8.2 (#3258) --- platform/android/CHANGELOG.md | 11 +++++++++++ platform/android/MapLibreAndroid/gradle.properties | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index e0693297045e..2f11d79b7ff9 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -6,6 +6,17 @@ ### 🐞 Bug fixes +## 11.8.2 + +### ✨ Features and improvements + +- Eliminate copies in deferred cleanup ([#3035](https://github.com/maplibre/maplibre-native/pull/3035)). +- (Custom Layer Support) Reset depth stencil state for render pass ([#3230](https://github.com/maplibre/maplibre-native/pull/3230)). + +### 🐞 Bug fixes + +- Fix texture view cleanup ([#3254](https://github.com/maplibre/maplibre-native/pull/3254)). Possible fix for [issue](https://github.com/maplibre/maplibre-native/issues/3241) reported by Lyft. + ## 11.8.1 > [!NOTE] diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 3b41409ee096..aaea8d549ae9 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.8.1 +VERSION_NAME=11.8.2 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 From b09235b41e649a263b8d78ff378fbe2dd226d05c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 28 Feb 2025 14:25:36 +0100 Subject: [PATCH 093/339] Allow configuring iOS build with CMake (#3234) --- .github/workflows/ios-ci.yml | 19 +- .github/workflows/node-ci.yml | 13 +- CMakeLists.txt | 13 +- CMakePresets.json | 59 ++++ docs/mdbook/src/ios/README.md | 18 +- docs/mdbook/src/platforms.md | 7 +- include/mbgl/mtl/index_buffer_resource.hpp | 2 +- include/mbgl/mtl/vertex_buffer_resource.hpp | 2 +- platform/darwin/BUILD.bazel | 25 +- platform/darwin/{src => core}/async_task.cpp | 0 platform/darwin/{src => core}/collator.mm | 0 .../darwin/{src => core}/http_file_source.mm | 5 +- platform/darwin/{src => core}/image.mm | 0 .../{src => core}/local_glyph_rasterizer.mm | 0 .../darwin/{src => core}/logging_nslog.mm | 0 .../{src => core}/native_apple_interface.m | 0 platform/darwin/{src => core}/nsthread.mm | 0 .../darwin/{src => core}/number_format.mm | 0 platform/darwin/{src => core}/run_loop.cpp | 0 .../darwin/{src => core}/string_nsstring.mm | 0 platform/darwin/{src => core}/timer.cpp | 0 platform/darwin/darwin.cmake | 167 ++++++++++ platform/darwin/loop-files.json | 10 - platform/darwin/src/NSBundle+MLNAdditions.mm | 2 +- .../src/mbgl/storage/pmtiles_file_source.cpp | 2 +- platform/ios/BUILD.bazel | 6 +- platform/ios/app/CMakeLists.txt | 62 ++++ platform/ios/app/MBXViewController.mm | 2 +- platform/ios/bazel/files.bzl | 2 +- platform/ios/core-files.json | 35 -- platform/ios/ios.cmake | 128 +++++++ platform/ios/scripts/generate-file-lists.js | 157 --------- platform/ios/sdk-files.json | 315 ------------------ platform/ios/vendor/SMCalloutView/LICENSE | 176 ++++++++++ platform/ios/vendor/calloutview.cmake | 21 ++ .../macos/Mapbox-macOS-SDK-symbols.podspec | 30 -- platform/macos/Mapbox-macOS-SDK.podspec | 30 -- platform/macos/core-files.json | 34 -- platform/macos/macos.cmake | 76 +---- platform/macos/sdk-files.json | 216 ------------ src/mbgl/mtl/context.cpp | 1 - src/mbgl/mtl/drawable.cpp | 8 +- src/mbgl/mtl/layer_group.cpp | 1 - src/mbgl/mtl/tile_layer_group.cpp | 1 - src/mbgl/mtl/upload_pass.cpp | 5 - 45 files changed, 696 insertions(+), 954 deletions(-) create mode 100644 CMakePresets.json rename platform/darwin/{src => core}/async_task.cpp (100%) rename platform/darwin/{src => core}/collator.mm (100%) rename platform/darwin/{src => core}/http_file_source.mm (99%) rename platform/darwin/{src => core}/image.mm (100%) rename platform/darwin/{src => core}/local_glyph_rasterizer.mm (100%) rename platform/darwin/{src => core}/logging_nslog.mm (100%) rename platform/darwin/{src => core}/native_apple_interface.m (100%) rename platform/darwin/{src => core}/nsthread.mm (100%) rename platform/darwin/{src => core}/number_format.mm (100%) rename platform/darwin/{src => core}/run_loop.cpp (100%) rename platform/darwin/{src => core}/string_nsstring.mm (100%) rename platform/darwin/{src => core}/timer.cpp (100%) create mode 100644 platform/darwin/darwin.cmake delete mode 100644 platform/darwin/loop-files.json create mode 100644 platform/ios/app/CMakeLists.txt delete mode 100644 platform/ios/core-files.json create mode 100644 platform/ios/ios.cmake delete mode 100755 platform/ios/scripts/generate-file-lists.js delete mode 100644 platform/ios/sdk-files.json create mode 100644 platform/ios/vendor/SMCalloutView/LICENSE create mode 100644 platform/ios/vendor/calloutview.cmake delete mode 100644 platform/macos/Mapbox-macOS-SDK-symbols.podspec delete mode 100644 platform/macos/Mapbox-macOS-SDK.podspec delete mode 100644 platform/macos/core-files.json delete mode 100644 platform/macos/sdk-files.json diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 190ba797a6ce..e251c68824fa 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -332,13 +332,30 @@ jobs: run: | VERSION=${{ env.version }} COCOAPODS_TRUNK_TOKEN=${{ secrets.COCOAPODS_PASSWORD }} pod trunk push MapLibre.podspec + ios-build-cmake: + needs: pre_job + runs-on: macos-latest + if: needs.pre_job.outputs.should_skip != 'true' + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: Configure build with CMake + run: cmake --preset ios + + - name: Build mbgl-core + run: cmake --build build-ios --target mbgl-core ios-sdk-static app + ios-ci-result: runs-on: ubuntu-latest if: needs.pre_job.outputs.should_skip != 'true' && always() needs: - pre_job - ios-build + - ios-build-cmake steps: - name: Mark result as failed - if: needs.ios-build.result != 'success' + if: needs.ios-build.result != 'success' || needs.ios-build-cmake.result != 'success' run: exit 1 diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 980eb50c50f4..44d3f639fb98 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -167,7 +167,7 @@ jobs: if: ${{contains(runner.name, 'GitHub Actions')}} uses: jwlawson/actions-setup-cmake@v2 with: - cmake-version: '3.29.2' + cmake-version: '3.31' - name: cmake version run: | @@ -204,16 +204,7 @@ jobs: - name: Configure maplibre-native (MacOS) if: runner.os == 'MacOS' run: | - cmake . -B build \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DMLN_WITH_NODE=ON \ - -DMLN_WITH_OPENGL=OFF \ - -DMLN_WITH_METAL=ON \ - -DMLN_LEGACY_RENDERER=OFF \ - -DMLN_DRAWABLE_RENDERER=ON \ - -DMLN_WITH_WERROR=OFF + cmake --preset macos-node -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} - name: Configure maplibre-native (Linux) if: runner.os == 'Linux' diff --git a/CMakeLists.txt b/CMakeLists.txt index a2e863fa5116..812c66458f25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ target_compile_options( $<$:-fsanitize=float-divide-by-zero, -fsanitize-blacklist=${UBSAN_BLACKLIST}> $<$:-fembed-bitcode> - $<$,$,$>>>:-fno-rtti> + $<$,$>,$,$>>>:-fno-rtti> $<$,$>>:-Wall> $<$,$>>:-Wshadow> $<$,$>>:-Wextra> @@ -1268,6 +1268,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/raster.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/widevector.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/mtl/custom_layer_render_parameters.cpp ) find_library(METAL_FRAMEWORK Metal) @@ -1372,12 +1373,12 @@ endif() if(MLN_DRAWABLE_RENDERER) list(APPEND SRC_FILES - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_drawable_layer_factory.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp ) endif() @@ -1579,7 +1580,11 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL Android) elseif(CMAKE_SYSTEM_NAME STREQUAL Linux) include(${PROJECT_SOURCE_DIR}/platform/linux/linux.cmake) elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) + include(${PROJECT_SOURCE_DIR}/platform/darwin/darwin.cmake) include(${PROJECT_SOURCE_DIR}/platform/macos/macos.cmake) +elseif(CMAKE_SYSTEM_NAME STREQUAL iOS) + include(${PROJECT_SOURCE_DIR}/platform/darwin/darwin.cmake) + include(${PROJECT_SOURCE_DIR}/platform/ios/ios.cmake) elseif(WIN32) include(${PROJECT_SOURCE_DIR}/platform/windows/windows.cmake) else() diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000000..f6be192d26db --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,59 @@ +{ + "version": 10, + "cmakeMinimumRequired": { + "major": 3, + "minor": 21, + "patch": 0 + }, + "configurePresets": [ + { + "name": "ios", + "displayName": "iOS", + "generator": "Xcode", + "description": "Create Xcode project for iOS", + "binaryDir": "${sourceDir}/build-ios", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "iOS", + "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "MLN_WITH_METAL": "ON", + "MLN_WITH_OPENGL": "OFF", + "MLN_DRAWABLE_RENDERER": "ON" + } + }, + { + "name": "macos", + "displayName": "macOS", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build-macos", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Darwin", + "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "MLN_WITH_METAL": "ON", + "MLN_WITH_OPENGL": "OFF", + "MLN_DRAWABLE_RENDERER": "ON" + } + }, + { + "name": "macos-vulkan", + "displayName": "macOS", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build-macos-vulkan", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Darwin", + "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "MLN_WITH_VULKAN": "ON", + "MLN_WITH_OPENGL": "OFF", + "MLN_DRAWABLE_RENDERER": "ON" + } + }, + { + "name": "macos-node", + "inherits": "macos", + "binaryDir": "${sourceDir}/build", + "cacheVariables": { + "MLN_WITH_NODE": "ON", + "MLN_WITH_WERROR": "OFF" + } + } + ] +} diff --git a/docs/mdbook/src/ios/README.md b/docs/mdbook/src/ios/README.md index a8671a1fec42..eb42e12efebb 100644 --- a/docs/mdbook/src/ios/README.md +++ b/docs/mdbook/src/ios/README.md @@ -73,6 +73,20 @@ bazel run //platform/ios:App --//:renderer=metal You can also build targets from the command line. For example, if you want to build your own XCFramework, see the 'Build XCFramework' step in the [iOS CI workflow](../../.github/workflows/ios-ci.yml). -## Swift App +## CMake -There is also an example app built with Swift instead of Objective-C. The target is called `MapLibreApp` and the source code lives in `platform/ios/app-swift`. +It is also possible to generate an Xcode project using CMake. As of February 2025, targets `mbgl-core`, `ios-sdk-static` and `app` (Objective-C development app) are supported. + +``` +cmake --preset ios -DDEVELOPMENT_TEAM_ID=YOUR_TEAM_ID +xed build-ios/MapLibre\ Native.xcodeproj +``` + +## Distribution + +MapLibre iOS is distributed as an XCFramework via the [maplibre/maplibre-gl-native-distribution](https://github.com/maplibre/maplibre-gl-native-distribution) repository. See [Release MapLibre iOS](./release.md) for the release process. Refer to the [`ios-ci.yml`](https://github.com/maplibre/maplibre-native/blob/main/.github/workflows/ios-ci.yml) workflow for an up-to-date recipe for building an XCFramework. As of February 2025 we use: + +``` +bazel build --compilation_mode=opt --features=dead_strip,thin_lto --objc_enable_binary_stripping \ + --apple_generate_dsym --output_groups=+dsyms --//:renderer=metal //platform/ios:MapLibre.dynamic --embed_label=maplibre_ios_"$(cat VERSION)" +``` diff --git a/docs/mdbook/src/platforms.md b/docs/mdbook/src/platforms.md index 20a83499e4c8..4608c5855746 100644 --- a/docs/mdbook/src/platforms.md +++ b/docs/mdbook/src/platforms.md @@ -48,9 +48,12 @@ In 2023 we co-opted Bazel as a build tool (generator), mostly due to it having b | Platform | CMake | Bazel | |---|---|---| | Android | ✅ (via Gradle) | ❌ | -| iOS | ❌ | ✅ | +| iOS | ✅[^3] | ✅ | | Linux | ✅ | ✅ | -| Windows | ✅ | ❌ | +| Windows | ✅ | ✅ | | macOS | ✅ | ✅ | | Node.js | ✅ | ❌ | | Qt | ✅ | ❌ | + + +[^3]: Some targets are supported, see [here](ios/README.md#cmake). diff --git a/include/mbgl/mtl/index_buffer_resource.hpp b/include/mbgl/mtl/index_buffer_resource.hpp index cdbe2997e47f..703a561aa2af 100644 --- a/include/mbgl/mtl/index_buffer_resource.hpp +++ b/include/mbgl/mtl/index_buffer_resource.hpp @@ -8,7 +8,7 @@ namespace mtl { class IndexBufferResource : public gfx::IndexBufferResource { public: - IndexBufferResource() noexcept = default; + IndexBufferResource() noexcept = delete; IndexBufferResource(BufferResource&&) noexcept; IndexBufferResource(IndexBufferResource&& other) noexcept : buffer(std::move(other.buffer)) {} diff --git a/include/mbgl/mtl/vertex_buffer_resource.hpp b/include/mbgl/mtl/vertex_buffer_resource.hpp index aa9f2c16ea71..a52d718e7575 100644 --- a/include/mbgl/mtl/vertex_buffer_resource.hpp +++ b/include/mbgl/mtl/vertex_buffer_resource.hpp @@ -10,7 +10,7 @@ namespace mtl { class VertexBufferResource : public gfx::VertexBufferResource { public: - VertexBufferResource() noexcept = default; + VertexBufferResource() noexcept = delete; VertexBufferResource(BufferResource&&) noexcept; VertexBufferResource(VertexBufferResource&& other) noexcept : buffer(std::move(other.buffer)) {} diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index 9c59e9f555a6..540614772e7e 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -200,7 +200,7 @@ cc_library( objc_library( name = "darwin-objc", srcs = [ - "src/native_apple_interface.m", + "core/native_apple_interface.m", ], hdrs = [ "include/mbgl/interface/native_apple_interface.h", @@ -227,15 +227,15 @@ objc_library( objc_library( name = "darwin-objcpp", srcs = [ + "core/collator.mm", + "core/http_file_source.mm", + "core/image.mm", + "core/local_glyph_rasterizer.mm", + "core/logging_nslog.mm", + "core/nsthread.mm", + "core/number_format.mm", + "core/string_nsstring.mm", "src/CFHandle.hpp", - "src/collator.mm", - "src/http_file_source.mm", - "src/image.mm", - "src/local_glyph_rasterizer.mm", - "src/logging_nslog.mm", - "src/nsthread.mm", - "src/number_format.mm", - "src/string_nsstring.mm", ] + select({ "//:metal_renderer": [], "//conditions:default": ["src/headless_backend_eagl.mm"], @@ -252,6 +252,7 @@ objc_library( ], includes = [ "include", + "src", ], sdk_frameworks = [ "CoreText", @@ -269,9 +270,9 @@ objc_library( objc_library( name = "darwin-loop", srcs = [ - "src/async_task.cpp", - "src/run_loop.cpp", - "src/timer.cpp", + "core/async_task.cpp", + "core/run_loop.cpp", + "core/timer.cpp", ] + select({ "//:metal_renderer": [], "//conditions:default": ["src/gl_functions.cpp"], diff --git a/platform/darwin/src/async_task.cpp b/platform/darwin/core/async_task.cpp similarity index 100% rename from platform/darwin/src/async_task.cpp rename to platform/darwin/core/async_task.cpp diff --git a/platform/darwin/src/collator.mm b/platform/darwin/core/collator.mm similarity index 100% rename from platform/darwin/src/collator.mm rename to platform/darwin/core/collator.mm diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/core/http_file_source.mm similarity index 99% rename from platform/darwin/src/http_file_source.mm rename to platform/darwin/core/http_file_source.mm index 09117872b93d..4956df8bc873 100644 --- a/platform/darwin/src/http_file_source.mm +++ b/platform/darwin/core/http_file_source.mm @@ -86,7 +86,6 @@ void cancel() { public: Impl(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) { - @autoreleasepool { NSURLSessionConfiguration *sessionConfig = MLNNativeNetworkManager.sharedManager.sessionConfiguration; session = [NSURLSession sessionWithConfiguration:sessionConfig]; @@ -95,8 +94,6 @@ void cancel() { } else { userAgent = sessionConfig.HTTPAdditionalHeaders[@"User-Agent"]; } - - } } void setResourceOptions(ResourceOptions options); @@ -280,7 +277,7 @@ BOOL isValidMapboxEndpoint(NSURL *url) { [MLNNativeNetworkManager.sharedManager startDownloadEvent:url.relativePath type:@"tile"]; } - __block NSURLSession *session; + __block NSURLSession *session = nil; // Use the delegate's session if there is one, otherwise use the one that // was created when this class was constructed. diff --git a/platform/darwin/src/image.mm b/platform/darwin/core/image.mm similarity index 100% rename from platform/darwin/src/image.mm rename to platform/darwin/core/image.mm diff --git a/platform/darwin/src/local_glyph_rasterizer.mm b/platform/darwin/core/local_glyph_rasterizer.mm similarity index 100% rename from platform/darwin/src/local_glyph_rasterizer.mm rename to platform/darwin/core/local_glyph_rasterizer.mm diff --git a/platform/darwin/src/logging_nslog.mm b/platform/darwin/core/logging_nslog.mm similarity index 100% rename from platform/darwin/src/logging_nslog.mm rename to platform/darwin/core/logging_nslog.mm diff --git a/platform/darwin/src/native_apple_interface.m b/platform/darwin/core/native_apple_interface.m similarity index 100% rename from platform/darwin/src/native_apple_interface.m rename to platform/darwin/core/native_apple_interface.m diff --git a/platform/darwin/src/nsthread.mm b/platform/darwin/core/nsthread.mm similarity index 100% rename from platform/darwin/src/nsthread.mm rename to platform/darwin/core/nsthread.mm diff --git a/platform/darwin/src/number_format.mm b/platform/darwin/core/number_format.mm similarity index 100% rename from platform/darwin/src/number_format.mm rename to platform/darwin/core/number_format.mm diff --git a/platform/darwin/src/run_loop.cpp b/platform/darwin/core/run_loop.cpp similarity index 100% rename from platform/darwin/src/run_loop.cpp rename to platform/darwin/core/run_loop.cpp diff --git a/platform/darwin/src/string_nsstring.mm b/platform/darwin/core/string_nsstring.mm similarity index 100% rename from platform/darwin/src/string_nsstring.mm rename to platform/darwin/core/string_nsstring.mm diff --git a/platform/darwin/src/timer.cpp b/platform/darwin/core/timer.cpp similarity index 100% rename from platform/darwin/src/timer.cpp rename to platform/darwin/core/timer.cpp diff --git a/platform/darwin/darwin.cmake b/platform/darwin/darwin.cmake new file mode 100644 index 000000000000..158ed0a35135 --- /dev/null +++ b/platform/darwin/darwin.cmake @@ -0,0 +1,167 @@ +enable_language(OBJC OBJCXX Swift) + +target_link_libraries( + mbgl-core + PRIVATE + "-framework CoreGraphics" + "-framework CoreLocation" + "-framework CoreImage" + "-framework SystemConfiguration" + mbgl-vendor-icu + sqlite3 + z +) + +target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/darwin/core/async_task.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/core/collator.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/http_file_source.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/image.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/local_glyph_rasterizer.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/logging_nslog.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/native_apple_interface.m + ${PROJECT_SOURCE_DIR}/platform/darwin/core/nsthread.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/number_format.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/run_loop.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/core/string_nsstring.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/core/timer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/map/map_snapshotter.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/platform/time.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/asset_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/mbtiles_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/database_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_manager.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_request.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_request.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/main_resource_loader.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/png_writer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/thread_local.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/utf.cpp +) + +target_include_directories( + mbgl-core + PUBLIC + ${PROJECT_SOURCE_DIR}/platform/darwin/include + ${PROJECT_SOURCE_DIR}/platform/default/include + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/darwin/src ${PROJECT_SOURCE_DIR}/platform/macos/src +) + +if(MLN_WITH_METAL) + target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/mtl/headless_backend.cpp + ) +endif() + +include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) + +set(CMAKE_OBJC_FLAGS "-fobjc-arc") +set(CMAKE_OBJCXX_FLAGS "-fobjc-arc") + +set(MLN_GENERATED_DARWIN_CODE_DIR + ${CMAKE_BINARY_DIR}/generated-darwin-code/src +) + +set(MLN_GENERATED_DARWIN_STYLE_SOURCE + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNLight.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNBackgroundStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNCircleStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillExtrusionStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHeatmapStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHillshadeStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNLineStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNRasterStyleLayer.mm" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNSymbolStyleLayer.mm" +) + +set(MLN_GENERATED_DARWIN_STYLE_PUBLIC_HEADERS + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNBackgroundStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillExtrusionStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHeatmapStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNLight.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNLineStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNSymbolStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNCircleStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHillshadeStyleLayer.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNRasterStyleLayer.h" +) + +set(MLN_GENERATED_DARWIN_STYLE_HEADERS + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNRasterStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNBackgroundStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillExtrusionStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHeatmapStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNLineStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNSymbolStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNCircleStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNFillStyleLayer_Private.h" + "${MLN_GENERATED_DARWIN_CODE_DIR}/MLNHillshadeStyleLayer_Private.h" + ${MLN_GENERATED_DARWIN_STYLE_PUBLIC_HEADERS} +) + +find_program(BAZEL bazel REQUIRED) + +add_custom_command( + OUTPUT ${MLN_GENERATED_DARWIN_STYLE_SOURCE} ${MLN_GENERATED_DARWIN_STYLE_HEADERS} + COMMAND ${CMAKE_COMMAND} -E rm -Rf + "${PROJECT_SOURCE_DIR}/bazel-bin/platform/darwin/src" + COMMAND ${BAZEL} build //platform/darwin:generated_code + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${PROJECT_SOURCE_DIR}/bazel-bin/platform/darwin/src" + ${MLN_GENERATED_DARWIN_CODE_DIR} + COMMENT "Generating Darwin style source and header files" + VERBATIM +) + +add_custom_target(mbgl-darwin-style-code + DEPENDS ${MLN_GENERATED_DARWIN_STYLE_SOURCE} ${MLN_GENERATED_DARWIN_STYLE_HEADERS} +) + +add_library( + custom-layer-examples + EXCLUDE_FROM_ALL + "${CMAKE_CURRENT_LIST_DIR}/app/ExampleCustomDrawableStyleLayer.mm" + "${CMAKE_CURRENT_LIST_DIR}/app/CustomStyleLayerExample.m" +) + +target_link_libraries( + custom-layer-examples + PUBLIC ios-sdk-static + PRIVATE mbgl-compiler-options mbgl-core +) + +if(MLN_WITH_METAL) + target_compile_definitions( + custom-layer-examples + PRIVATE MLN_RENDER_BACKEND_METAL=1 + ) +endif() + +target_include_directories( + custom-layer-examples + PUBLIC + "${CMAKE_CURRENT_LIST_DIR}/app" + PRIVATE + "${PROJECT_SOURCE_DIR}/src" # FIXME: should not use private headers +) diff --git a/platform/darwin/loop-files.json b/platform/darwin/loop-files.json deleted file mode 100644 index 9f99f39766f6..000000000000 --- a/platform/darwin/loop-files.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "//": "This file can be edited manually and is the canonical source.", - "sources": [ - "platform/darwin/src/async_task.cpp", - "platform/darwin/src/run_loop.cpp", - "platform/darwin/src/timer.cpp" - ], - "public_headers": {}, - "private_headers": {} -} diff --git a/platform/darwin/src/NSBundle+MLNAdditions.mm b/platform/darwin/src/NSBundle+MLNAdditions.mm index d8c71c325933..67887d0be0f5 100644 --- a/platform/darwin/src/NSBundle+MLNAdditions.mm +++ b/platform/darwin/src/NSBundle+MLNAdditions.mm @@ -18,7 +18,7 @@ + (instancetype)mgl_frameworkBundle { bundle = [self bundleWithPath:bundlePath]; } else { [NSException raise:MLNBundleNotFoundException - format:@"The MapLibre framework bundle could not be found. If using the MapLibre Native for iOS as a static framework, make sure that MapLibre bundle is copied into the root of the app bundle."]; + format:@"The MapLibre framework bundle could not be found. If using MapLibre iOS as a static framework, make sure that MapLibre bundle is copied into the root of the app bundle."]; } } #endif diff --git a/platform/default/src/mbgl/storage/pmtiles_file_source.cpp b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp index 7cd00be039e6..e5811375dfd0 100644 --- a/platform/default/src/mbgl/storage/pmtiles_file_source.cpp +++ b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp @@ -119,7 +119,7 @@ class PMTilesFileSource::Impl { req, tileID, header.root_dir_offset, - header.root_dir_bytes, + static_cast(header.root_dir_bytes), 0, [=, this](std::pair tileAddress, std::unique_ptr tileError) { if (tileError) { diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index c7ce3e9b9d72..a87208953e69 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -18,7 +18,7 @@ load( "MLN_IOS_PUBLIC_OBJCPP_SOURCE", "MLN_IOS_PUBLIC_OBJC_SOURCE", "MLN_IOS_SDK_HEADERS", - "MLN_PUBLIC_IOS_APP_SOPURCE", + "MLN_PUBLIC_IOS_APP_SOURCE", ) load("//platform/ios/bazel:macros.bzl", "info_plist") load("//platform/ios/bazel:provisioning.bzl", "configure_device_profiles") @@ -60,7 +60,7 @@ filegroup( filegroup( name = "ios_app_srcs", - srcs = MLN_PUBLIC_IOS_APP_SOPURCE, + srcs = MLN_PUBLIC_IOS_APP_SOURCE, visibility = ["//visibility:public"], ) @@ -350,7 +350,7 @@ exports_files( MLN_IOS_PUBLIC_OBJCPP_METAL_SOURCE + MLN_IOS_PUBLIC_OBJCPP_OPENGL_SOURCE + MLN_IOS_PUBLIC_OBJC_SOURCE + - MLN_PUBLIC_IOS_APP_SOPURCE, + MLN_PUBLIC_IOS_APP_SOURCE, ) js_library( diff --git a/platform/ios/app/CMakeLists.txt b/platform/ios/app/CMakeLists.txt new file mode 100644 index 000000000000..38bb9f98eaae --- /dev/null +++ b/platform/ios/app/CMakeLists.txt @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 3.20) +project(app LANGUAGES C CXX OBJC OBJCXX) + +set(CMAKE_OSX_ARCHITECTURES "arm64") +set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0") + +file(GLOB APP_SOURCES CONFIGURE_DEPENDS + "*.m" "*.mm" +) + +set(APP_RESOURCES + Assets.xcassets + Base.lproj + LaunchScreen.storyboard + Main.storyboard + Settings.bundle +) + +add_executable(app + ${APP_SOURCES} + ${APP_RESOURCES} +) + +target_include_directories( + app PRIVATE + "${PROJECT_SOURCE_DIR}" +) + +set_target_properties(app PROPERTIES + MACOSX_BUNDLE YES + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_LIST_DIR}/Info.plist" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.maplibre.app" + XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES" + XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${DEVELOPMENT_TEAM_ID}" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer" + XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES" +) + +add_custom_command(TARGET app POST_BUILD + COMMAND plutil -insert CFBundleShortVersionString -string "1.0.0" "$/Info.plist" + COMMENT "Injecting CFBundleShortVersionString..." +) + +add_custom_command(TARGET app POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "$/Mapbox.bundle" + "$/Mapbox.bundle" + COMMAND ls "$" +) + +target_link_libraries( + app + custom-layer-examples # ios-sdk-static transitive dependency +) + +foreach(resource_file ${APP_RESOURCES}) + set_source_files_properties( + ${resource_file} + PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) +endforeach() diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index 46a446ef0846..0adaddeb6c35 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -13,7 +13,7 @@ #import "MBXState.h" #import "MLNSettings.h" -#import "platform/ios/src/MLNMapView_Private.h" +#import "MLNMapView_Private.h" #import "CustomStyleLayerExample.h" diff --git a/platform/ios/bazel/files.bzl b/platform/ios/bazel/files.bzl index 28c055caca45..4667a1da83ed 100644 --- a/platform/ios/bazel/files.bzl +++ b/platform/ios/bazel/files.bzl @@ -78,7 +78,7 @@ MLN_IOS_PUBLIC_OBJCPP_METAL_SOURCE = [ "src/MLNMapView+Metal.mm", ] -MLN_PUBLIC_IOS_APP_SOPURCE = [ +MLN_PUBLIC_IOS_APP_SOURCE = [ "app/MBXAnnotationView.m", "app/MBXAppDelegate.m", "app/MBXCustomCalloutView.h", diff --git a/platform/ios/core-files.json b/platform/ios/core-files.json deleted file mode 100644 index 91ca4395b999..000000000000 --- a/platform/ios/core-files.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "//": "This file can be edited manually and is the canonical source.", - "sources": [ - "platform/darwin/src/collator.mm", - "platform/darwin/src/gl_functions.cpp", - "platform/darwin/src/headless_backend_eagl.mm", - "platform/darwin/src/image.mm", - "platform/darwin/src/local_glyph_rasterizer.mm", - "platform/darwin/src/logging_nslog.mm", - "platform/darwin/src/number_format.mm", - "platform/darwin/src/nsthread.mm", - "platform/darwin/src/reachability.m", - "platform/darwin/src/string_nsstring.mm", - "platform/default/src/mbgl/gfx/headless_backend.cpp", - "platform/default/src/mbgl/gfx/headless_frontend.cpp", - "platform/default/src/mbgl/gl/headless_backend.cpp", - "platform/default/src/mbgl/map/map_snapshotter.cpp", - "platform/default/src/mbgl/text/bidi.cpp", - "platform/default/src/mbgl/util/compression.cpp", - "platform/default/src/mbgl/util/png_writer.cpp", - "platform/default/src/mbgl/util/thread_local.cpp", - "platform/default/src/mbgl/util/utf.cpp" - ], - "public_headers": { - "mbgl/storage/reachability.h": "platform/darwin/include/mbgl/storage/reachability.h", - "mbgl/util/image+MLNAdditions.hpp": "platform/darwin/include/mbgl/util/image+MLNAdditions.hpp", - "mbgl/gfx/headless_backend.hpp": "platform/default/include/mbgl/gfx/headless_backend.hpp", - "mbgl/gfx/headless_frontend.hpp": "platform/default/include/mbgl/gfx/headless_frontend.hpp", - "mbgl/gl/headless_backend.hpp": "platform/default/include/mbgl/gl/headless_backend.hpp", - "mbgl/map/map_snapshotter.hpp": "platform/default/include/mbgl/map/map_snapshotter.hpp" - }, - "private_headers": { - "CFHandle.hpp": "platform/darwin/src/CFHandle.hpp" - } -} diff --git a/platform/ios/ios.cmake b/platform/ios/ios.cmake new file mode 100644 index 000000000000..0be447426e5c --- /dev/null +++ b/platform/ios/ios.cmake @@ -0,0 +1,128 @@ +target_include_directories( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/ios/src +) + +file(GLOB_RECURSE IOS_SDK_SOURCE_FILES + "${PROJECT_SOURCE_DIR}/platform/darwin/src/*.m" + "${PROJECT_SOURCE_DIR}/platform/darwin/src/*.mm" + "${CMAKE_CURRENT_LIST_DIR}/src/*.m" + "${CMAKE_CURRENT_LIST_DIR}/src/*.mm" +) + +file(GLOB_RECURSE IOS_SDK_RESOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/resources/*" +) + + +if(NOT MLN_WITH_OPENGL) + list(FILTER IOS_SDK_SOURCE_FILES EXCLUDE REGEX ".*(OpenGL|gl).*") +elseif(NOT MLN_WITH_METAL) + list(FILTER IOS_SDK_SOURCE_FILES EXCLUDE REGEX ".*Metal.*") +endif() + +set(FRAMEWORK_BUNDLE_DIR ${CMAKE_CURRENT_BINARY_DIR}/Mapbox.bundle) + +find_program(ACTOOL_EXECUTABLE actool + HINTS + /Applications/Xcode.app/Contents/Developer/usr/bin + DOC "Xcode Asset Catalog Compiler (actool)" +) +if(NOT ACTOOL_EXECUTABLE) + message(FATAL_ERROR "Could not find actool. Ensure Xcode is installed.") +endif() + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Mapbox.bundle/Assets.car + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/Mapbox.bundle + COMMAND ${ACTOOL_EXECUTABLE} + --compile ${FRAMEWORK_BUNDLE_DIR} + --platform iphoneos + --minimum-deployment-target 12.0 + ${CMAKE_CURRENT_LIST_DIR}/resources/Images.xcassets + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_LIST_DIR}/framework/Info-static.plist + ${CMAKE_CURRENT_BINARY_DIR}/Mapbox.bundle/Info.plist + DEPENDS ${CMAKE_CURRENT_LIST_DIR}/resources/Images.xcassets + COMMENT "Compiling Images.xcassets into Mapbox.bundle/Assets.car" +) + +list(APPEND IOS_SDK_RESOURCE_FILES ${FRAMEWORK_BUNDLE_DIR}) + +add_custom_target(create-framework-bundle + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Mapbox.bundle/Assets.car +) + +add_library( + ios-sdk-static + STATIC ${IOS_SDK_SOURCE_FILES} ${MLN_GENERATED_DARWIN_STYLE_SOURCE} + ${IOS_SDK_RESOURCE_FILES} +) + +set_source_files_properties( + ${FRAMEWORK_BUNDLE_DIR} + PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + GENERATED TRUE +) + +add_dependencies(ios-sdk-static create-framework-bundle) + +set_target_properties(ios-sdk-static PROPERTIES + FRAMEWORK TRUE + # This makes the .framework contain a static library instead of a dynamic one: + XCODE_ATTRIBUTE_MACH_O_TYPE "staticlib" + + # Provide a unique bundle identifier + MACOSX_FRAMEWORK_IDENTIFIER "org.maplibre.ios" + + # FIXME: versioning + MACOSX_FRAMEWORK_BUNDLE_VERSION "1.0" + MACOSX_FRAMEWORK_SHORT_VERSION_STRING "1.0" +) + +if(MLN_WITH_METAL) + message(STATUS "Configuring Metal renderer backend") + target_compile_definitions( + ios-sdk-static + PRIVATE MLN_RENDER_BACKEND_METAL=1 + ) +endif() + +target_include_directories( + ios-sdk-static + PUBLIC ${MLN_GENERATED_DARWIN_CODE_DIR} ${CMAKE_CURRENT_LIST_DIR}/src ${PROJECT_SOURCE_DIR}/platform/darwin/src + PRIVATE ${PROJECT_SOURCE_DIR}/src +) + +include("${CMAKE_CURRENT_LIST_DIR}/vendor/calloutview.cmake") + +target_link_libraries( + ios-sdk-static + PUBLIC mbgl-core + PRIVATE mbgl-compiler-options mbgl-vendor-calloutview mbgl-vendor-metal-cpp mbgl-vendor-polylabel + "-framework CoreText" + "-framework CoreImage" + "-framework CoreGraphics" + "-framework QuartzCore" + "-framework UIKit" + "-framework MetalKit" + "-framework ImageIO" +) + +target_link_options(ios-sdk-static INTERFACE -ObjC) + +add_dependencies(ios-sdk-static mbgl-darwin-style-code) + +add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/app") + +set(DEVELOPMENT_TEAM_ID "" CACHE STRING "Apple Development Team ID") + +if(NOT DEVELOPMENT_TEAM_ID) + message(STATUS "No Apple Developer Team ID set (-DDEVELOPMENT_TEAM_ID=YOUR_TEAM_ID). Configuring build without signing.") + set(CMAKE_OSX_SYSROOT iphonesimulator) + set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO") + set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO") + set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") +endif() diff --git a/platform/ios/scripts/generate-file-lists.js b/platform/ios/scripts/generate-file-lists.js deleted file mode 100755 index afd41952e525..000000000000 --- a/platform/ios/scripts/generate-file-lists.js +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env node - -const child_process = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const xcode = require('xcode'); - -require('../../../scripts/style-code'); - -const classifier = /^(?:(?:(?:platform|vendor)\/(?:(?!include|src).)*\/|(?:test|benchmark)\/)?(?:(include|src)\/)?)?(.+\.h(?:pp|xx)?)$/; - -function generateFileList(filename, roots, regex, patterns) { - writeFileList( - filename, - [].concat.apply([], roots.map(function(root) { - return child_process - .execSync(`git -C ${root} ls-files ${patterns.map((p) => '"' + p + '"').join(' ')}`) - .toString() - .trim() - .split('\n') - .map(file => path.join(root, file)) - }))) -} - -function writeFileList(filename, files) { - const json = { - "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", - sources: [], - public_headers: {}, - private_headers: {} - }; - files.sort(); - for (const file of files) { - const match = file.match(classifier); - if (!match) { - json.sources.push(file); - } else if (match[1] === 'src') { - json.private_headers[match[2]] = file; - } else { - if (match[1] !== 'include') { - console.warn(`* ${file} is not in include or src directory. Treating as public header.`); - } - json.public_headers[match[2]] = file; - } - } - writeIfModified(filename, JSON.stringify(json, null, 4) + '\n'); -} - -function generateXcodeSourceList(project, target, name) { - const projectPath = path.dirname(project); - let objects = xcode.project(path.join(project, 'project.pbxproj')).parseSync().hash.project.objects; - - // Build reverse lookup table for file => group - let objToGroup = {}; - Object.keys(objects.PBXGroup) - .filter(name => !/_comment$/.test(name)) - .forEach(name => objects.PBXGroup[name].children - .forEach(child => objToGroup[child.value] = name)); - - // Retrieve the target - const targetObj = Object.keys(objects.PBXNativeTarget) - .filter(name => !/_comment$/.test(name)) - .map(name => objects.PBXNativeTarget[name]) - .filter(project => project.name == target)[0]; - - // Retrieve the sources associated with the target. - const sourcesObjs = targetObj.buildPhases - .map(phase => objects.PBXSourcesBuildPhase[phase.value] || objects.PBXHeadersBuildPhase[phase.value]) - .filter(phase => phase); - - const json = { - "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", - sources: [], - public_headers: {}, - private_headers: {} - }; - - sourcesObjs - .forEach(sourcesObj => sourcesObj.files - .map(file => objects.PBXBuildFile[file.value]) - .forEach(buildFile => { - // const isPublic = buildFile.settings && buildFile.settings.ATTRIBUTES && buildFile.settings.ATTRIBUTES.indexOf('Public') >= 0 || false; - const fileRef = buildFile.fileRef; - // Look up the full path, and fully qualified group name for every source reference - let fileObj = objects.PBXFileReference[fileRef]; - - // Ascend the group tree to find the full path. - let fullPath = [ fileObj.path.replace(/^"(.+)"$/, '$1') ]; - for (let ref = fileRef, obj = fileObj; obj.sourceTree != 'SOURCE_ROOT' && ref in objToGroup;) { - ref = objToGroup[ref]; - obj = objects.PBXGroup[ref]; - if (obj.path) { - fullPath.unshift(obj.path.replace(/^"(.+)"$/, '$1')); - } - } - fullPath.unshift(projectPath); - - const fullPathName = path.join.apply(path, fullPath); - - if (sourcesObj.isa === 'PBXHeadersBuildPhase') { - const isPublic = buildFile.settings && buildFile.settings.ATTRIBUTES && buildFile.settings.ATTRIBUTES.indexOf('Public') >= 0 || false; - json[isPublic ? 'public_headers' : 'private_headers'][path.basename(fullPathName)] = fullPathName; - } else { - json.sources.push(fullPathName); - } - }) - ); - - json.public_headers['Mapbox/Mapbox.h'] = json.public_headers['Mapbox.h']; - delete json.public_headers['Mapbox.h']; - - writeIfModified(`${projectPath}/${name || target}-files.json`, JSON.stringify(json, null, 4) + '\n'); -} - -generateFileList('src/core-files.json', [ '.' ], /^(?:src|include)\/(?:mbgl\/)?(.+)\/[^\/]+$/, - [ 'include/*.hpp', 'include/*.h', 'src/*.hpp', 'src/*.cpp', 'src/*.h', 'src/*.c' ]); - -generateFileList('benchmark/benchmark-files.json', [ '.' ], /^benchmark\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, - [ 'benchmark/*.hpp', 'benchmark/*.cpp', 'benchmark/*.host', 'benchmark/*.c' ]); - -generateFileList('test/test-files.json', [ '.' ], /^test\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, - [ 'test/*.hpp', 'test/*.cpp', 'test/*.h', 'test/*.c' ]); - -generateXcodeSourceList('platform/macos/macos.xcodeproj', 'dynamic', 'sdk'); - -generateXcodeSourceList('platform/ios/ios.xcodeproj', 'dynamic', 'sdk'); - -const vendorRegex = /^(?:(?:src|include)\/)?(?:(.+)\/)?[^\/]+$/ -generateFileList('vendor/boost-files.json', [ 'vendor/boost' ], vendorRegex, [ "include/**/*.hpp", "include/**/*.h" ]); -generateFileList('vendor/cheap-ruler-cpp-files.json', [ 'vendor/cheap-ruler-cpp' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/earcut.hpp-files.json', [ 'vendor/earcut.hpp' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/eternal-files.json', [ 'vendor/eternal' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/expected-files.json', [ 'vendor/expected' ], vendorRegex, [ "include/expected.hpp" ]); -generateFileList('vendor/geojson-vt-cpp-files.json', [ 'vendor/geojson-vt-cpp' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/icu-files.json', [ 'vendor/icu' ], vendorRegex, [ "include/**/*.h", "src/*.h", "src/*.cpp" ]); -generateFileList('vendor/mapbox-base-files.json', - [ 'vendor/mapbox-base/extras/kdbush.hpp', - 'vendor/mapbox-base/extras/filesystem', - 'vendor/mapbox-base/extras/rapidjson', - 'vendor/mapbox-base/mapbox/pixelmatch-cpp', - 'vendor/mapbox-base/mapbox/geometry.hpp', - 'vendor/mapbox-base/mapbox/variant', - 'vendor/mapbox-base/mapbox/optional', - 'vendor/mapbox-base/mapbox/supercluster.hpp', - 'vendor/mapbox-base/mapbox/geojson.hpp', - 'vendor/mapbox-base/mapbox/jni.hpp', - 'vendor/mapbox-base/mapbox/weak', - 'vendor/mapbox-base/mapbox/typewrapper', - 'vendor/mapbox-base/mapbox/value'], - vendorRegex, [ "include/*.hpp", "include/**/*.hpp", "include/**/*.h", ":!:include/jni/string_conversion.hpp" ]); -generateFileList('vendor/polylabel-files.json', [ 'vendor/polylabel' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/protozero-files.json', [ 'vendor/protozero' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/shelf-pack-cpp-files.json', [ 'vendor/shelf-pack-cpp' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/sqlite-files.json', [ 'vendor/sqlite' ], vendorRegex, [ "include/*.h", "src/*.c" ]); -generateFileList('vendor/unique_resource-files.json', [ 'vendor/unique_resource' ], vendorRegex, [ "unique_resource.hpp" ]); -generateFileList('vendor/vector-tile-files.json', [ 'vendor/vector-tile' ], vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/wagyu-files.json', [ 'vendor/wagyu' ], vendorRegex, [ "include/**/*.hpp" ]); diff --git a/platform/ios/sdk-files.json b/platform/ios/sdk-files.json deleted file mode 100644 index 57464ddd8d1a..000000000000 --- a/platform/ios/sdk-files.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", - "sources": [ - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDate.m", - "platform/darwin/src/MLNBackgroundStyleLayer.mm", - "platform/darwin/src/NSComparisonPredicate+MLNAdditions.mm", - "platform/darwin/src/NSURL+MLNAdditions.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEvent.m", - "platform/ios/src/MLNUserLocationAnnotationView.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventsConfiguration.m", - "platform/ios/src/MLNFaux3DUserLocationAnnotationView.m", - "platform/darwin/src/MLNFeature.mm", - "platform/ios/src/UIImage+MLNAdditions.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEMetricsManager.m", - "platform/ios/src/MLNMapView+Impl.mm", - "platform/ios/src/MLNAnnotationContainerView.m", - "platform/ios/src/MLNCompactCalloutView.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDependencyManager.m", - "platform/darwin/src/MLNPointAnnotation.mm", - "platform/ios/src/MLNMapView+OpenGL.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEConstants.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEPinningConfigurationProvider.m", - "platform/ios/src/MLNAnnotationView.mm", - "platform/darwin/src/MLNCircleStyleLayer.mm", - "platform/ios/src/UIViewController+MLNAdditions.m", - "platform/darwin/src/NSValue+MLNStyleAttributeAdditions.mm", - "platform/darwin/src/MLNVectorStyleLayer.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUniqueIdentifier.m", - "platform/darwin/src/MLNShapeSource.mm", - "platform/ios/src/UIDevice+MLNAdditions.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMECertPin.m", - "platform/darwin/src/NSArray+MLNAdditions.mm", - "platform/ios/src/UIView+MLNAdditions.m", - "platform/ios/src/NSOrthography+MLNAdditions.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDispatchManager.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMETimerManager.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/CLLocation+MMEMobileEvents.m", - "platform/darwin/src/MLNRasterStyleLayer.mm", - "platform/darwin/src/MLNForegroundStyleLayer.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventLogReportViewController.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEConfigurator.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/NSData+MMEGZIP.m", - "platform/darwin/src/MLNAttributionInfo.mm", - "platform/darwin/src/NSBundle+MLNAdditions.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUINavigation.m", - "platform/ios/src/MLNUserLocationHeadingArrowLayer.m", - "platform/ios/src/MLNUserLocation.m", - "platform/darwin/src/MLNMapSnapshotter.mm", - "platform/darwin/src/MLNVectorTileSource.mm", - "platform/darwin/src/MLNRasterTileSource.mm", - "platform/ios/vendor/SMCalloutView/SMCalloutView.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/MMECategoryLoader.m", - "platform/darwin/src/MLNSource.mm", - "platform/darwin/src/MLNLight.mm", - "platform/darwin/src/MLNClockDirectionFormatter.m", - "platform/darwin/src/MLNShapeCollection.mm", - "platform/darwin/src/MLNHillshadeStyleLayer.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/UIKit+MMEMobileEvents.m", - "platform/darwin/src/MLNSymbolStyleLayer.mm", - "platform/darwin/src/MLNLoggingConfiguration.mm", - "platform/darwin/src/MLNStyleValue.mm", - "platform/darwin/src/MLNOfflinePack.mm", - "platform/darwin/src/MLNComputedShapeSource.mm", - "platform/darwin/src/MLNDistanceFormatter.m", - "platform/ios/src/MLNMapboxEvents.m", - "platform/darwin/src/MLNSDKMetricsManager.m", - "platform/ios/src/MLNCompassButton.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEAPIClient.m", - "platform/ios/src/MLNMapView.mm", - "platform/ios/src/MLNAnnotationImage.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMELocationManager.m", - "platform/darwin/src/MLNShape.mm", - "platform/darwin/src/MLNCompassDirectionFormatter.m", - "platform/darwin/src/MLNNetworkConfiguration.mm", - "platform/darwin/src/MLNStyleLayer.mm", - "platform/darwin/src/MLNStyleLayerManager.mm", - "platform/darwin/src/NSValue+MLNAdditions.m", - "platform/darwin/src/MLNImageSource.mm", - "platform/darwin/src/NSString+MLNAdditions.m", - "platform/darwin/src/NSDictionary+MLNAdditions.mm", - "platform/darwin/src/MLNCoordinateFormatter.m", - "platform/darwin/src/MLNShapeOfflineRegion.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEMetrics.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUIApplicationWrapper.m", - "platform/darwin/src/MLNStyle.mm", - "platform/darwin/src/NSCoder+MLNAdditions.mm", - "platform/darwin/src/MLNAttributedExpression.m", - "platform/darwin/src/MLNGeometry.mm", - "platform/darwin/src/MLNFoundation.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMECommonEventData.m", - "platform/darwin/src/NSExpression+MLNAdditions.mm", - "platform/darwin/src/MLNMultiPoint.mm", - "platform/darwin/src/MLNTypes.m", - "platform/darwin/src/MLNFillExtrusionStyleLayer.mm", - "platform/darwin/src/MLNTileSource.mm", - "platform/ios/src/MLNScaleBar.mm", - "platform/darwin/src/MLNMapCamera.mm", - "platform/darwin/src/MLNRasterDEMSource.mm", - "platform/darwin/src/MLNPolygon.mm", - "platform/darwin/src/NSPredicate+MLNAdditions.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Reachability/MMEReachability.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMENSURLSessionWrapper.m", - "platform/ios/src/MLNUserLocationHeadingBeamLayer.m", - "platform/darwin/src/MLNHeatmapStyleLayer.mm", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventLogger.m", - "platform/darwin/src/NSDate+MLNAdditions.mm", - "platform/darwin/src/MLNLocationManager.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/CLLocationManager+MMEMobileEvents.m", - "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventsManager.m", - "platform/darwin/src/MLNFillStyleLayer.mm", - "platform/darwin/src/MLNOfflineStorage.mm", - "platform/darwin/src/MLNTilePyramidOfflineRegion.mm", - "platform/darwin/src/MLNPointCollection.mm", - "platform/darwin/src/MLNLineStyleLayer.mm", - "platform/ios/src/MLNMapAccessibilityElement.mm", - "platform/darwin/src/MLNCustomStyleLayer.mm", - "platform/darwin/src/MLNSettings.mm", - "platform/darwin/src/NSCompoundPredicate+MLNAdditions.mm", - "platform/ios/src/MLNTelemetryConfig.m", - "platform/darwin/src/MLNPolyline.mm", - "platform/ios/src/UIColor+MLNAdditions.mm", - "platform/darwin/src/MLNRendererConfiguration.mm" - ], - "public_headers": { - "MLNFoundation.h": "platform/darwin/src/MLNFoundation.h", - "MLNShapeOfflineRegion.h": "platform/darwin/src/MLNShapeOfflineRegion.h", - "MLNFillStyleLayer.h": "platform/darwin/src/MLNFillStyleLayer.h", - "MLNAnnotationImage.h": "platform/ios/src/MLNAnnotationImage.h", - "MLNHillshadeStyleLayer.h": "platform/darwin/src/MLNHillshadeStyleLayer.h", - "MLNCluster.h": "platform/darwin/src/MLNCluster.h", - "MLNClockDirectionFormatter.h": "platform/darwin/src/MLNClockDirectionFormatter.h", - "MLNSymbolStyleLayer.h": "platform/darwin/src/MLNSymbolStyleLayer.h", - "MLNAttributionInfo.h": "platform/darwin/src/MLNAttributionInfo.h", - "MLNPolyline.h": "platform/darwin/src/MLNPolyline.h", - "MLNStyleLayer.h": "platform/darwin/src/MLNStyleLayer.h", - "MLNCameraChangeReason.h": "platform/ios/src/MLNCameraChangeReason.h", - "MLNCalloutView.h": "platform/ios/src/MLNCalloutView.h", - "NSExpression+MLNAdditions.h": "platform/darwin/src/NSExpression+MLNAdditions.h", - "MLNShape.h": "platform/darwin/src/MLNShape.h", - "MLNBackgroundStyleLayer.h": "platform/darwin/src/MLNBackgroundStyleLayer.h", - "MLNStyle.h": "platform/darwin/src/MLNStyle.h", - "MLNUserLocationAnnotationView.h": "platform/ios/src/MLNUserLocationAnnotationView.h", - "MLNAnnotation.h": "platform/darwin/src/MLNAnnotation.h", - "MLNCompassButton.h": "platform/ios/src/MLNCompassButton.h", - "MLNLight.h": "platform/darwin/src/MLNLight.h", - "MLNPointCollection.h": "platform/darwin/src/MLNPointCollection.h", - "MLNAnnotationView.h": "platform/ios/src/MLNAnnotationView.h", - "MLNFillExtrusionStyleLayer.h": "platform/darwin/src/MLNFillExtrusionStyleLayer.h", - "MLNRasterStyleLayer.h": "platform/darwin/src/MLNRasterStyleLayer.h", - "MLNSettings.h": "platform/darwin/src/MLNSettings.h", - "NSValue+MLNAdditions.h": "platform/darwin/src/NSValue+MLNAdditions.h", - "MLNVectorStyleLayer.h": "platform/darwin/src/MLNVectorStyleLayer.h", - "MLNNetworkConfiguration.h": "platform/darwin/src/MLNNetworkConfiguration.h", - "MLNComputedShapeSource.h": "platform/darwin/src/MLNComputedShapeSource.h", - "MLNSDKMetricsManager.h": "platform/darwin/src/MLNSDKMetricsManager.h", - "MLNLoggingConfiguration.h": "platform/darwin/src/MLNLoggingConfiguration.h", - "MLNLocationManager.h": "platform/darwin/src/MLNLocationManager.h", - "MLNRasterDEMSource.h": "platform/darwin/src/MLNRasterDEMSource.h", - "MLNLineStyleLayer.h": "platform/darwin/src/MLNLineStyleLayer.h", - "MLNImageSource.h": "platform/darwin/src/MLNImageSource.h", - "MLNOfflinePack.h": "platform/darwin/src/MLNOfflinePack.h", - "MLNUserLocation.h": "platform/ios/src/MLNUserLocation.h", - "MLNMapView+IBAdditions.h": "platform/ios/src/MLNMapView+IBAdditions.h", - "MLNShapeCollection.h": "platform/darwin/src/MLNShapeCollection.h", - "MLNShapeSource.h": "platform/darwin/src/MLNShapeSource.h", - "NSPredicate+MLNAdditions.h": "platform/darwin/src/NSPredicate+MLNAdditions.h", - "MLNMapSnapshotter.h": "platform/darwin/src/MLNMapSnapshotter.h", - "MLNCoordinateFormatter.h": "platform/darwin/src/MLNCoordinateFormatter.h", - "MLNStyleValue.h": "platform/darwin/src/MLNStyleValue.h", - "MLNOverlay.h": "platform/darwin/src/MLNOverlay.h", - "MLNCompassDirectionFormatter.h": "platform/darwin/src/MLNCompassDirectionFormatter.h", - "MLNTypes.h": "platform/darwin/src/MLNTypes.h", - "MLNGeometry.h": "platform/darwin/src/MLNGeometry.h", - "MLNSource.h": "platform/darwin/src/MLNSource.h", - "MLNRasterTileSource.h": "platform/darwin/src/MLNRasterTileSource.h", - "MLNPolygon.h": "platform/darwin/src/MLNPolygon.h", - "MLNPointAnnotation.h": "platform/darwin/src/MLNPointAnnotation.h", - "MLNHeatmapStyleLayer.h": "platform/darwin/src/MLNHeatmapStyleLayer.h", - "MLNCircleStyleLayer.h": "platform/darwin/src/MLNCircleStyleLayer.h", - "MLNMultiPoint.h": "platform/darwin/src/MLNMultiPoint.h", - "MLNAttributedExpression.h": "platform/darwin/src/MLNAttributedExpression.h", - "MLNFeature.h": "platform/darwin/src/MLNFeature.h", - "MLNMapCamera.h": "platform/darwin/src/MLNMapCamera.h", - "MLNForegroundStyleLayer.h": "platform/darwin/src/MLNForegroundStyleLayer.h", - "MLNOfflineRegion.h": "platform/darwin/src/MLNOfflineRegion.h", - "MLNTileOperation.h": "platform/darwin/src/MLNTileOperation.h", - "MLNMapViewDelegate.h": "platform/ios/src/MLNMapViewDelegate.h", - "MLNDistanceFormatter.h": "platform/darwin/src/MLNDistanceFormatter.h", - "MLNCustomStyleLayer.h": "platform/darwin/src/MLNCustomStyleLayer.h", - "MLNTileSource.h": "platform/darwin/src/MLNTileSource.h", - "MLNTilePyramidOfflineRegion.h": "platform/darwin/src/MLNTilePyramidOfflineRegion.h", - "MLNVectorTileSource.h": "platform/darwin/src/MLNVectorTileSource.h", - "MLNOfflineStorage.h": "platform/darwin/src/MLNOfflineStorage.h", - "MLNScaleBar.h": "platform/ios/src/MLNScaleBar.h", - "MLNMapView.h": "platform/ios/src/MLNMapView.h", - "Mapbox/Mapbox.h": "platform/ios/src/Mapbox.h" - }, - "private_headers": { - "MLNFillStyleLayer_Private.h": "platform/darwin/src/MLNFillStyleLayer_Private.h", - "MLNOfflinePack_Private.h": "platform/darwin/src/MLNOfflinePack_Private.h", - "MLNCompassButton_Private.h": "platform/ios/src/MLNCompassButton_Private.h", - "MLNSource_Private.h": "platform/darwin/src/MLNSource_Private.h", - "MLNAnnotationView_Private.h": "platform/ios/src/MLNAnnotationView_Private.h", - "MLNValueEvaluator.h": "platform/darwin/src/MLNValueEvaluator.h", - "NSBundle+MLNAdditions.h": "platform/darwin/src/NSBundle+MLNAdditions.h", - "MLNBackgroundStyleLayer_Private.h": "platform/darwin/src/MLNBackgroundStyleLayer_Private.h", - "MLNHillshadeStyleLayer_Private.h": "platform/darwin/src/MLNHillshadeStyleLayer_Private.h", - "NSCoder+MLNAdditions.h": "platform/darwin/src/NSCoder+MLNAdditions.h", - "MLNComputedShapeSource_Private.h": "platform/darwin/src/MLNComputedShapeSource_Private.h", - "MLNPolyline_Private.h": "platform/darwin/src/MLNPolyline_Private.h", - "MLNShapeSource_Private.h": "platform/darwin/src/MLNShapeSource_Private.h", - "NSData+MMEGZIP.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/NSData+MMEGZIP.h", - "NSValue+MLNStyleAttributeAdditions.h": "platform/darwin/src/NSValue+MLNStyleAttributeAdditions.h", - "MLNLineStyleLayer_Private.h": "platform/darwin/src/MLNLineStyleLayer_Private.h", - "MLNRasterStyleLayer_Private.h": "platform/darwin/src/MLNRasterStyleLayer_Private.h", - "MLNOfflineStorage_Private.h": "platform/darwin/src/MLNOfflineStorage_Private.h", - "MLNAnnotationContainerView_Private.h": "platform/ios/src/MLNAnnotationContainerView_Private.h", - "MLNStyle_Private.h": "platform/darwin/src/MLNStyle_Private.h", - "MMECategoryLoader.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/MMECategoryLoader.h", - "MLNHeatmapStyleLayer_Private.h": "platform/darwin/src/MLNHeatmapStyleLayer_Private.h", - "NSPredicate+MLNPrivateAdditions.h": "platform/darwin/src/NSPredicate+MLNPrivateAdditions.h", - "MLNSDKMetricsManager_Private.h": "platform/darwin/src/MLNSDKMetricsManager_Private.h", - "MLNNetworkConfiguration_Private.h": "platform/darwin/src/MLNNetworkConfiguration_Private.h", - "NSDate+MLNAdditions.h": "platform/darwin/src/NSDate+MLNAdditions.h", - "MLNCompactCalloutView.h": "platform/ios/src/MLNCompactCalloutView.h", - "MLNStyleLayerManager.h": "platform/darwin/src/MLNStyleLayerManager.h", - "MLNUserLocation_Private.h": "platform/ios/src/MLNUserLocation_Private.h", - "MLNUserLocationHeadingArrowLayer.h": "platform/ios/src/MLNUserLocationHeadingArrowLayer.h", - "MLNSettings_Private.h": "platform/darwin/src/MLNSettings_Private.h", - "UIViewController+MLNAdditions.h": "platform/ios/src/UIViewController+MLNAdditions.h", - "MLNVectorTileSource_Private.h": "platform/darwin/src/MLNVectorTileSource_Private.h", - "MLNCircleStyleLayer_Private.h": "platform/darwin/src/MLNCircleStyleLayer_Private.h", - "NSArray+MLNAdditions.h": "platform/darwin/src/NSArray+MLNAdditions.h", - "MLNShape_Private.h": "platform/darwin/src/MLNShape_Private.h", - "MLNPolygon_Private.h": "platform/darwin/src/MLNPolygon_Private.h", - "MLNStyleLayer_Private.h": "platform/darwin/src/MLNStyleLayer_Private.h", - "UIView+MLNAdditions.h": "platform/ios/src/UIView+MLNAdditions.h", - "MLNLocationManager_Private.h": "platform/darwin/src/MLNLocationManager_Private.h", - "MLNMapView+OpenGL.h": "platform/ios/src/MLNMapView+OpenGL.h", - "MLNLoggingConfiguration_Private.h": "platform/darwin/src/MLNLoggingConfiguration_Private.h", - "NSComparisonPredicate+MLNAdditions.h": "platform/darwin/src/NSComparisonPredicate+MLNAdditions.h", - "MLNMapAccessibilityElement.h": "platform/ios/src/MLNMapAccessibilityElement.h", - "MMEDate.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDate.h", - "NSString+MLNAdditions.h": "platform/darwin/src/NSString+MLNAdditions.h", - "UIDevice+MLNAdditions.h": "platform/ios/src/UIDevice+MLNAdditions.h", - "MLNMapSnapshotter_Private.h": "platform/darwin/src/MLNMapSnapshotter_Private.h", - "MLNRendererFrontend.h": "platform/darwin/src/MLNRendererFrontend.h", - "MLNStyleValue_Private.h": "platform/darwin/src/MLNStyleValue_Private.h", - "MLNFillExtrusionStyleLayer_Private.h": "platform/darwin/src/MLNFillExtrusionStyleLayer_Private.h", - "NSException+MLNAdditions.h": "platform/darwin/src/NSException+MLNAdditions.h", - "MLNSymbolStyleLayer_Private.h": "platform/darwin/src/MLNSymbolStyleLayer_Private.h", - "MLNTilePyramidOfflineRegion_Private.h": "platform/darwin/src/MLNTilePyramidOfflineRegion_Private.h", - "MLNUserLocationHeadingIndicator.h": "platform/ios/src/MLNUserLocationHeadingIndicator.h", - "NSDictionary+MLNAdditions.h": "platform/darwin/src/NSDictionary+MLNAdditions.h", - "UIKit+MMEMobileEvents.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/UIKit+MMEMobileEvents.h", - "MLNFoundation_Private.h": "platform/darwin/src/MLNFoundation_Private.h", - "MLNUserLocationHeadingBeamLayer.h": "platform/ios/src/MLNUserLocationHeadingBeamLayer.h", - "MMECertPin.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMECertPin.h", - "MLNMapView_Private.h": "platform/ios/src/MLNMapView_Private.h", - "MLNMapboxEvents.h": "platform/ios/src/MLNMapboxEvents.h", - "NSURL+MLNAdditions.h": "platform/darwin/src/NSURL+MLNAdditions.h", - "MLNMultiPoint_Private.h": "platform/darwin/src/MLNMultiPoint_Private.h", - "UIColor+MLNAdditions.h": "platform/ios/src/UIColor+MLNAdditions.h", - "MLNAttributionInfo_Private.h": "platform/darwin/src/MLNAttributionInfo_Private.h", - "MBXSKUToken.h": "platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h", - "SMCalloutView.h": "platform/ios/vendor/SMCalloutView/SMCalloutView.h", - "MLNOfflineRegion_Private.h": "platform/darwin/src/MLNOfflineRegion_Private.h", - "MMEPinningConfigurationProvider.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEPinningConfigurationProvider.h", - "MLNPointCollection_Private.h": "platform/darwin/src/MLNPointCollection_Private.h", - "UIImage+MLNAdditions.h": "platform/ios/src/UIImage+MLNAdditions.h", - "NSOrthography+MLNAdditions.h": "platform/ios/src/NSOrthography+MLNAdditions.h", - "MLNLight_Private.h": "platform/darwin/src/MLNLight_Private.h", - "MLNAnnotationContainerView.h": "platform/ios/src/MLNAnnotationContainerView.h", - "MLNAnnotationImage_Private.h": "platform/ios/src/MLNAnnotationImage_Private.h", - "MLNConversion.h": "platform/darwin/src/MLNConversion.h", - "MLNShapeOfflineRegion_Private.h": "platform/darwin/src/MLNShapeOfflineRegion_Private.h", - "MLNTelemetryConfig.h": "platform/ios/src/MLNTelemetryConfig.h", - "MLNGeometry_Private.h": "platform/darwin/src/MLNGeometry_Private.h", - "NSCompoundPredicate+MLNAdditions.h": "platform/darwin/src/NSCompoundPredicate+MLNAdditions.h", - "NSExpression+MLNPrivateAdditions.h": "platform/darwin/src/NSExpression+MLNPrivateAdditions.h", - "MLNCustomStyleLayer_Private.h": "platform/darwin/src/MLNCustomStyleLayer_Private.h", - "MLNTileSource_Private.h": "platform/darwin/src/MLNTileSource_Private.h", - "MLNFaux3DUserLocationAnnotationView.h": "platform/ios/src/MLNFaux3DUserLocationAnnotationView.h", - "MLNUserLocationAnnotationView_Private.h": "platform/ios/src/MLNUserLocationAnnotationView_Private.h", - "MLNRasterTileSource_Private.h": "platform/darwin/src/MLNRasterTileSource_Private.h", - "MLNFeature_Private.h": "platform/darwin/src/MLNFeature_Private.h", - "MLNRendererConfiguration.h": "platform/darwin/src/MLNRendererConfiguration.h", - "MMEReachability.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Reachability/MMEReachability.h", - "MMENamespacedDependencies.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMENamespacedDependencies.h", - "MapboxMobileEvents.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MapboxMobileEvents.h", - "MMEAPIClient.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEAPIClient.h", - "MMECommonEventData.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMECommonEventData.h", - "MMEConstants.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEConstants.h", - "MMEDependencyManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDependencyManager.h", - "MMEEvent.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEvent.h", - "CLLocation+MMEMobileEvents.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/CLLocation+MMEMobileEvents.h", - "MMEEventLogger.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventLogger.h", - "MMEEventLogReportViewController.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventLogReportViewController.h", - "MMEEventsConfiguration.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventsConfiguration.h", - "MMEConfigurator.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEConfigurator.h", - "MMELocationManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMELocationManager.h", - "MMEMetrics.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEMetrics.h", - "MMEMetricsManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEMetricsManager.h", - "MMENSURLSessionWrapper.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMENSURLSessionWrapper.h", - "MLNMapView+Impl.h": "platform/ios/src/MLNMapView+Impl.h", - "MMETimerManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMETimerManager.h", - "MMETypes.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMETypes.h", - "CLLocationManager+MMEMobileEvents.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/Categories/CLLocationManager+MMEMobileEvents.h", - "MMEUIApplicationWrapper.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUIApplicationWrapper.h", - "MMEUINavigation.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUINavigation.h", - "MMEUniqueIdentifier.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEUniqueIdentifier.h", - "MMEDispatchManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDispatchManager.h", - "MMEEventsManager.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEEventsManager.h" - } -} diff --git a/platform/ios/vendor/SMCalloutView/LICENSE b/platform/ios/vendor/SMCalloutView/LICENSE new file mode 100644 index 000000000000..d9a10c0d8e86 --- /dev/null +++ b/platform/ios/vendor/SMCalloutView/LICENSE @@ -0,0 +1,176 @@ + 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 diff --git a/platform/ios/vendor/calloutview.cmake b/platform/ios/vendor/calloutview.cmake new file mode 100644 index 000000000000..6b490ba1fa5d --- /dev/null +++ b/platform/ios/vendor/calloutview.cmake @@ -0,0 +1,21 @@ +if(TARGET mbgl-vendor-calloutview) + return() +endif() + +add_library( + mbgl-vendor-calloutview ${CMAKE_CURRENT_LIST_DIR}/SMCalloutView/SMCalloutView.m +) + +target_include_directories( + mbgl-vendor-calloutview SYSTEM + INTERFACE ${CMAKE_CURRENT_LIST_DIR}/SMCalloutView +) + +set_target_properties( + mbgl-vendor-calloutview + PROPERTIES + INTERFACE_MAPLIBRE_NAME "Boost C++ Libraries" + INTERFACE_MAPLIBRE_URL "https://github.com/nfarina/calloutview" + INTERFACE_MAPLIBRE_AUTHOR "Nick Farina" + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/SMCalloutView/LICENSE +) diff --git a/platform/macos/Mapbox-macOS-SDK-symbols.podspec b/platform/macos/Mapbox-macOS-SDK-symbols.podspec deleted file mode 100644 index 8329235d482d..000000000000 --- a/platform/macos/Mapbox-macOS-SDK-symbols.podspec +++ /dev/null @@ -1,30 +0,0 @@ -Pod::Spec.new do |m| - - version = '0.16.0' - - m.name = 'Mapbox-macOS-SDK-symbols' - m.version = "#{version}-symbols" - - m.summary = 'Open-source, interactive, fully customizable vector maps.' - m.description = 'Interactive, fully customizable vector maps with tight platform integration and high-performance OpenGL rendering.' - m.homepage = 'https://mapbox.github.io/mapbox-gl-native/macos/' - m.license = { :type => 'BSD', :file => 'LICENSE.md' } - m.author = { 'Mapbox' => 'mobile@mapbox.com' } - m.screenshot = "https://mapbox.github.io/mapbox-gl-native/macos/#{version}/img/screenshot.jpg" - m.social_media_url = 'https://twitter.com/mapbox' - m.documentation_url = 'https://mapbox.github.io/mapbox-gl-native/macos/' - - m.source = { - :http => "https://github.com/mapbox/mapbox-gl-native-ios/releases/download/macos-v#{version}/mapbox-macos-sdk-#{m.version.to_s}.zip", - :flatten => true - } - - m.platform = :osx - m.osx.deployment_target = '10.11' - - m.requires_arc = true - - m.vendored_frameworks = 'Mapbox.framework' - m.module_name = 'Mapbox' - -end diff --git a/platform/macos/Mapbox-macOS-SDK.podspec b/platform/macos/Mapbox-macOS-SDK.podspec deleted file mode 100644 index 36c43543ed04..000000000000 --- a/platform/macos/Mapbox-macOS-SDK.podspec +++ /dev/null @@ -1,30 +0,0 @@ -Pod::Spec.new do |m| - - version = '0.16.0' - - m.name = 'Mapbox-macOS-SDK' - m.version = version - - m.summary = 'Open-source, interactive, fully customizable vector maps.' - m.description = 'Interactive, fully customizable vector maps with tight platform integration and high-performance OpenGL rendering.' - m.homepage = 'https://mapbox.github.io/mapbox-gl-native/macos/' - m.license = { :type => 'BSD', :file => 'LICENSE.md' } - m.author = { 'Mapbox' => 'mobile@mapbox.com' } - m.screenshot = "https://mapbox.github.io/mapbox-gl-native/macos/#{version}/img/screenshot.jpg" - m.social_media_url = 'https://twitter.com/mapbox' - m.documentation_url = 'https://mapbox.github.io/mapbox-gl-native/macos/' - - m.source = { - :http => "https://github.com/mapbox/mapbox-gl-native-ios/releases/download/macos-v#{version}/mapbox-macos-sdk-#{m.version.to_s}.zip", - :flatten => true - } - - m.platform = :osx - m.osx.deployment_target = '10.11' - - m.requires_arc = true - - m.vendored_frameworks = 'Mapbox.framework' - m.module_name = 'Mapbox' - -end diff --git a/platform/macos/core-files.json b/platform/macos/core-files.json deleted file mode 100644 index 02cb1be8692f..000000000000 --- a/platform/macos/core-files.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "//": "This file can be edited manually and is the canonical source.", - "sources": [ - "platform/darwin/src/collator.mm", - "platform/darwin/src/gl_functions.cpp", - "platform/darwin/src/image.mm", - "platform/darwin/src/local_glyph_rasterizer.mm", - "platform/darwin/src/logging_nslog.mm", - "platform/darwin/src/nsthread.mm", - "platform/darwin/src/number_format.mm", - "platform/darwin/src/reachability.m", - "platform/darwin/src/string_nsstring.mm", - "platform/default/src/mbgl/gfx/headless_backend.cpp", - "platform/default/src/mbgl/gfx/headless_frontend.cpp", - "platform/default/src/mbgl/gl/headless_backend.cpp", - "platform/default/src/mbgl/map/map_snapshotter.cpp", - "platform/default/src/mbgl/text/bidi.cpp", - "platform/default/src/mbgl/util/compression.cpp", - "platform/default/src/mbgl/util/png_writer.cpp", - "platform/default/src/mbgl/util/thread_local.cpp", - "platform/default/src/mbgl/util/utf.cpp" - ], - "public_headers": { - "mbgl/storage/reachability.h": "platform/darwin/include/mbgl/storage/reachability.h", - "mbgl/util/image+MLNAdditions.hpp": "platform/darwin/include/mbgl/util/image+MLNAdditions.hpp", - "mbgl/gfx/headless_backend.hpp": "platform/default/include/mbgl/gfx/headless_backend.hpp", - "mbgl/gfx/headless_frontend.hpp": "platform/default/include/mbgl/gfx/headless_frontend.hpp", - "mbgl/gl/headless_backend.hpp": "platform/default/include/mbgl/gl/headless_backend.hpp", - "mbgl/map/map_snapshotter.hpp": "platform/default/include/mbgl/map/map_snapshotter.hpp" - }, - "private_headers": { - "CFHandle.hpp": "platform/darwin/src/CFHandle.hpp" - } -} diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index 1dad9549a2fe..91031077681e 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -11,6 +11,13 @@ set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[vari set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) +target_link_libraries( + mbgl-core + PRIVATE + "-framework AppKit" +) + + if(MLN_WITH_OPENGL) find_package(OpenGL REQUIRED) @@ -30,16 +37,6 @@ if(MLN_WITH_OPENGL) ) endif() -if(MLN_WITH_METAL) - find_package(OpenGL REQUIRED) - - target_sources( - mbgl-core - PRIVATE - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/mtl/headless_backend.cpp - ) -endif() - if(MLN_WITH_VULKAN) find_package(Vulkan REQUIRED) @@ -60,49 +57,6 @@ if(MLN_WITH_VULKAN) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) endif() -target_sources( - mbgl-core - PRIVATE - ${PROJECT_SOURCE_DIR}/platform/darwin/src/async_task.cpp - ${PROJECT_SOURCE_DIR}/platform/darwin/src/collator.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/http_file_source.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/image.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/local_glyph_rasterizer.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/logging_nslog.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/native_apple_interface.m - ${PROJECT_SOURCE_DIR}/platform/darwin/src/nsthread.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/number_format.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/run_loop.cpp - ${PROJECT_SOURCE_DIR}/platform/darwin/src/string_nsstring.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/src/timer.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/map/map_snapshotter.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/platform/time.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/asset_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/mbtiles_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/database_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_manager.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_request.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_request.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/main_resource_loader.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/$,pmtiles_file_source.cpp,pmtiles_file_source_stub.cpp> - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/png_writer.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/thread_local.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/utf.cpp -) - target_compile_options(mbgl-core PRIVATE -fobjc-arc) # FIXME: Should not be needed, but now needed by node because of the headless frontend. @@ -114,21 +68,7 @@ target_include_directories( target_include_directories( mbgl-core PRIVATE - ${PROJECT_SOURCE_DIR}/platform/darwin/include ${PROJECT_SOURCE_DIR}/platform/darwin/src ${PROJECT_SOURCE_DIR}/platform/macos/src -) - -include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) - -target_link_libraries( - mbgl-core - PRIVATE - "-framework AppKit" - "-framework CoreGraphics" - "-framework CoreLocation" - "-framework SystemConfiguration" - mbgl-vendor-icu - sqlite3 - z + ${PROJECT_SOURCE_DIR}/platform/macos/src ) add_subdirectory(${PROJECT_SOURCE_DIR}/bin) diff --git a/platform/macos/sdk-files.json b/platform/macos/sdk-files.json deleted file mode 100644 index 4dd33d2fd4b1..000000000000 --- a/platform/macos/sdk-files.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", - "sources": [ - "platform/darwin/src/MLNImageSource.mm", - "platform/darwin/src/MLNMapSnapshotter.mm", - "platform/macos/src/NSImage+MLNAdditions.mm", - "platform/darwin/src/MLNHillshadeStyleLayer.mm", - "platform/darwin/src/MLNPointAnnotation.mm", - "platform/darwin/src/MLNSDKMetricsManager.m", - "platform/darwin/src/NSBundle+MLNAdditions.mm", - "platform/macos/src/MLNMapView.mm", - "platform/macos/src/MLNMapView+OpenGL.mm", - "platform/darwin/src/NSArray+MLNAdditions.mm", - "platform/darwin/src/MLNOfflinePack.mm", - "platform/darwin/src/NSDate+MLNAdditions.mm", - "platform/darwin/src/MLNLoggingConfiguration.mm", - "platform/darwin/src/MLNNetworkConfiguration.mm", - "platform/darwin/src/MLNLight.mm", - "platform/macos/src/MLNAnnotationImage.m", - "platform/darwin/src/NSExpression+MLNAdditions.mm", - "platform/darwin/src/MLNFeature.mm", - "platform/darwin/src/MLNCustomStyleLayer.mm", - "platform/macos/src/NSColor+MLNAdditions.mm", - "platform/macos/src/MLNAttributionButton.mm", - "platform/darwin/src/MLNFillStyleLayer.mm", - "platform/darwin/src/MLNShape.mm", - "platform/darwin/src/MLNRasterTileSource.mm", - "platform/darwin/src/MLNFoundation.mm", - "platform/darwin/src/NSString+MLNAdditions.m", - "platform/darwin/src/NSCoder+MLNAdditions.mm", - "platform/darwin/src/MLNStyleLayerManager.mm", - "platform/darwin/src/MLNStyle.mm", - "platform/darwin/src/MLNGeometry.mm", - "platform/darwin/src/MLNHeatmapStyleLayer.mm", - "platform/darwin/src/MLNCircleStyleLayer.mm", - "platform/darwin/src/MLNForegroundStyleLayer.mm", - "platform/darwin/src/NSDictionary+MLNAdditions.mm", - "platform/darwin/src/MLNBackgroundStyleLayer.mm", - "platform/darwin/src/MLNTileSource.mm", - "platform/macos/src/MLNMapView+IBAdditions.mm", - "platform/darwin/src/NSValue+MLNAdditions.m", - "platform/darwin/src/MLNStyleLayer.mm", - "platform/darwin/src/MLNClockDirectionFormatter.m", - "platform/darwin/src/MLNComputedShapeSource.mm", - "platform/macos/src/MLNOpenGLLayer.mm", - "platform/darwin/src/MLNMultiPoint.mm", - "platform/darwin/src/MLNTypes.m", - "platform/darwin/src/MLNPointCollection.mm", - "platform/darwin/src/MLNCoordinateFormatter.m", - "platform/darwin/src/MLNSource.mm", - "platform/darwin/src/MLNMapCamera.mm", - "platform/darwin/src/MLNVectorStyleLayer.mm", - "platform/darwin/src/MLNAttributedExpression.m", - "platform/darwin/src/NSValue+MLNStyleAttributeAdditions.mm", - "platform/darwin/src/MLNPolygon.mm", - "platform/darwin/src/MLNDistanceFormatter.m", - "platform/macos/src/NSProcessInfo+MLNAdditions.m", - "platform/darwin/src/MLNFillExtrusionStyleLayer.mm", - "platform/darwin/src/MLNOfflineStorage.mm", - "platform/darwin/src/NSURL+MLNAdditions.m", - "platform/darwin/src/NSCompoundPredicate+MLNAdditions.mm", - "platform/darwin/src/MLNTilePyramidOfflineRegion.mm", - "platform/darwin/src/MLNSettings.mm", - "platform/darwin/src/MLNAttributionInfo.mm", - "platform/darwin/src/MLNPolyline.mm", - "platform/darwin/src/MLNShapeSource.mm", - "platform/macos/src/MLNCompassCell.m", - "platform/darwin/src/MLNRasterStyleLayer.mm", - "platform/darwin/src/MLNShapeCollection.mm", - "platform/darwin/src/MLNShapeOfflineRegion.mm", - "platform/darwin/src/NSComparisonPredicate+MLNAdditions.mm", - "platform/macos/src/MLNMapView+Impl.mm", - "platform/darwin/src/MLNCompassDirectionFormatter.m", - "platform/darwin/src/MLNRasterDEMSource.mm", - "platform/darwin/src/MLNLineStyleLayer.mm", - "platform/darwin/src/MLNSymbolStyleLayer.mm", - "platform/darwin/src/NSPredicate+MLNAdditions.mm", - "platform/darwin/src/MLNVectorTileSource.mm", - "platform/darwin/src/MLNStyleValue.mm", - "platform/darwin/src/MLNRendererConfiguration.mm" - ], - "public_headers": { - "MLNFoundation.h": "platform/darwin/src/MLNFoundation.h", - "MLNComputedShapeSource.h": "platform/darwin/src/MLNComputedShapeSource.h", - "MLNRasterStyleLayer.h": "platform/darwin/src/MLNRasterStyleLayer.h", - "NSExpression+MLNAdditions.h": "platform/darwin/src/NSExpression+MLNAdditions.h", - "MLNAttributedExpression.h": "platform/darwin/src/MLNAttributedExpression.h", - "MLNAnnotation.h": "platform/darwin/src/MLNAnnotation.h", - "MLNHillshadeStyleLayer.h": "platform/darwin/src/MLNHillshadeStyleLayer.h", - "MLNMapSnapshotter.h": "platform/darwin/src/MLNMapSnapshotter.h", - "MLNCircleStyleLayer.h": "platform/darwin/src/MLNCircleStyleLayer.h", - "MLNAttributionInfo.h": "platform/darwin/src/MLNAttributionInfo.h", - "MLNFillExtrusionStyleLayer.h": "platform/darwin/src/MLNFillExtrusionStyleLayer.h", - "MLNAnnotationImage.h": "platform/macos/src/MLNAnnotationImage.h", - "MLNMapView.h": "platform/macos/src/MLNMapView.h", - "MLNOfflineStorage.h": "platform/darwin/src/MLNOfflineStorage.h", - "MLNStyleValue.h": "platform/darwin/src/MLNStyleValue.h", - "MLNSDKMetricsManager.h": "platform/darwin/src/MLNSDKMetricsManager.h", - "MLNMultiPoint.h": "platform/darwin/src/MLNMultiPoint.h", - "MLNShapeCollection.h": "platform/darwin/src/MLNShapeCollection.h", - "MLNPointAnnotation.h": "platform/darwin/src/MLNPointAnnotation.h", - "MLNOfflinePack.h": "platform/darwin/src/MLNOfflinePack.h", - "MLNLoggingConfiguration.h": "platform/darwin/src/MLNLoggingConfiguration.h", - "NSPredicate+MLNAdditions.h": "platform/darwin/src/NSPredicate+MLNAdditions.h", - "MLNVectorTileSource.h": "platform/darwin/src/MLNVectorTileSource.h", - "MLNRasterDEMSource.h": "platform/darwin/src/MLNRasterDEMSource.h", - "MLNTypes.h": "platform/darwin/src/MLNTypes.h", - "MLNBackgroundStyleLayer.h": "platform/darwin/src/MLNBackgroundStyleLayer.h", - "MLNPointCollection.h": "platform/darwin/src/MLNPointCollection.h", - "MLNShape.h": "platform/darwin/src/MLNShape.h", - "MLNCustomStyleLayer.h": "platform/darwin/src/MLNCustomStyleLayer.h", - "MLNSource.h": "platform/darwin/src/MLNSource.h", - "MLNPolygon.h": "platform/darwin/src/MLNPolygon.h", - "MLNClockDirectionFormatter.h": "platform/darwin/src/MLNClockDirectionFormatter.h", - "MLNFillStyleLayer.h": "platform/darwin/src/MLNFillStyleLayer.h", - "MLNCoordinateFormatter.h": "platform/darwin/src/MLNCoordinateFormatter.h", - "MLNShapeOfflineRegion.h": "platform/darwin/src/MLNShapeOfflineRegion.h", - "MLNNetworkConfiguration.h": "platform/darwin/src/MLNNetworkConfiguration.h", - "MLNOverlay.h": "platform/darwin/src/MLNOverlay.h", - "MLNPolyline.h": "platform/darwin/src/MLNPolyline.h", - "MLNLineStyleLayer.h": "platform/darwin/src/MLNLineStyleLayer.h", - "MLNDistanceFormatter.h": "platform/darwin/src/MLNDistanceFormatter.h", - "MLNHeatmapStyleLayer.h": "platform/darwin/src/MLNHeatmapStyleLayer.h", - "MLNOfflineRegion.h": "platform/darwin/src/MLNOfflineRegion.h", - "MLNTilePyramidOfflineRegion.h": "platform/darwin/src/MLNTilePyramidOfflineRegion.h", - "NSValue+MLNAdditions.h": "platform/darwin/src/NSValue+MLNAdditions.h", - "MLNTileOperation.h": "platform/darwin/src/MLNTileOperation.h", - "MLNMapViewDelegate.h": "platform/macos/src/MLNMapViewDelegate.h", - "MLNCluster.h": "platform/darwin/src/MLNCluster.h", - "MLNFeature.h": "platform/darwin/src/MLNFeature.h", - "MLNStyleLayer.h": "platform/darwin/src/MLNStyleLayer.h", - "MLNGeometry.h": "platform/darwin/src/MLNGeometry.h", - "MLNSettings.h": "platform/darwin/src/MLNSettings.h", - "MLNTileSource.h": "platform/darwin/src/MLNTileSource.h", - "MLNForegroundStyleLayer.h": "platform/darwin/src/MLNForegroundStyleLayer.h", - "MLNMapCamera.h": "platform/darwin/src/MLNMapCamera.h", - "MLNImageSource.h": "platform/darwin/src/MLNImageSource.h", - "MLNSymbolStyleLayer.h": "platform/darwin/src/MLNSymbolStyleLayer.h", - "MLNMapView+IBAdditions.h": "platform/macos/src/MLNMapView+IBAdditions.h", - "MLNCompassDirectionFormatter.h": "platform/darwin/src/MLNCompassDirectionFormatter.h", - "MLNRasterTileSource.h": "platform/darwin/src/MLNRasterTileSource.h", - "MLNVectorStyleLayer.h": "platform/darwin/src/MLNVectorStyleLayer.h", - "MLNShapeSource.h": "platform/darwin/src/MLNShapeSource.h", - "MLNLight.h": "platform/darwin/src/MLNLight.h", - "MLNStyle.h": "platform/darwin/src/MLNStyle.h", - "Mapbox/Mapbox.h": "platform/macos/src/Mapbox.h" - }, - "private_headers": { - "MLNOfflineRegion_Private.h": "platform/darwin/src/MLNOfflineRegion_Private.h", - "MLNRasterTileSource_Private.h": "platform/darwin/src/MLNRasterTileSource_Private.h", - "MLNBackgroundStyleLayer_Private.h": "platform/darwin/src/MLNBackgroundStyleLayer_Private.h", - "MLNConversion.h": "platform/darwin/src/MLNConversion.h", - "MLNFillExtrusionStyleLayer_Private.h": "platform/darwin/src/MLNFillExtrusionStyleLayer_Private.h", - "MLNStyleValue_Private.h": "platform/darwin/src/MLNStyleValue_Private.h", - "MLNMapView_Private.h": "platform/macos/src/MLNMapView_Private.h", - "MLNRasterStyleLayer_Private.h": "platform/darwin/src/MLNRasterStyleLayer_Private.h", - "MLNHeatmapStyleLayer_Private.h": "platform/darwin/src/MLNHeatmapStyleLayer_Private.h", - "MLNAttributionButton.h": "platform/macos/src/MLNAttributionButton.h", - "NSArray+MLNAdditions.h": "platform/darwin/src/NSArray+MLNAdditions.h", - "NSComparisonPredicate+MLNAdditions.h": "platform/darwin/src/NSComparisonPredicate+MLNAdditions.h", - "MLNStyleLayerManager.h": "platform/darwin/src/MLNStyleLayerManager.h", - "MLNStyleLayer_Private.h": "platform/darwin/src/MLNStyleLayer_Private.h", - "MLNShapeOfflineRegion_Private.h": "platform/darwin/src/MLNShapeOfflineRegion_Private.h", - "MLNAttributionInfo_Private.h": "platform/darwin/src/MLNAttributionInfo_Private.h", - "NSBundle+MLNAdditions.h": "platform/darwin/src/NSBundle+MLNAdditions.h", - "NSURL+MLNAdditions.h": "platform/darwin/src/NSURL+MLNAdditions.h", - "MLNAnnotationImage_Private.h": "platform/macos/src/MLNAnnotationImage_Private.h", - "MLNLoggingConfiguration_Private.h": "platform/darwin/src/MLNLoggingConfiguration_Private.h", - "NSPredicate+MLNPrivateAdditions.h": "platform/darwin/src/NSPredicate+MLNPrivateAdditions.h", - "NSString+MLNAdditions.h": "platform/darwin/src/NSString+MLNAdditions.h", - "MLNCircleStyleLayer_Private.h": "platform/darwin/src/MLNCircleStyleLayer_Private.h", - "MLNVectorTileSource_Private.h": "platform/darwin/src/MLNVectorTileSource_Private.h", - "MLNGeometry_Private.h": "platform/darwin/src/MLNGeometry_Private.h", - "MLNSettings_Private.h": "platform/darwin/src/MLNSettings_Private.h", - "MLNComputedShapeSource_Private.h": "platform/darwin/src/MLNComputedShapeSource_Private.h", - "NSException+MLNAdditions.h": "platform/darwin/src/NSException+MLNAdditions.h", - "MLNTileSource_Private.h": "platform/darwin/src/MLNTileSource_Private.h", - "NSExpression+MLNPrivateAdditions.h": "platform/darwin/src/NSExpression+MLNPrivateAdditions.h", - "MLNSDKMetricsManager_Private.h": "platform/darwin/src/MLNSDKMetricsManager_Private.h", - "MLNNetworkConfiguration_Private.h": "platform/darwin/src/MLNNetworkConfiguration_Private.h", - "NSCompoundPredicate+MLNAdditions.h": "platform/darwin/src/NSCompoundPredicate+MLNAdditions.h", - "MLNSymbolStyleLayer_Private.h": "platform/darwin/src/MLNSymbolStyleLayer_Private.h", - "MLNMapView+OpenGL.h": "platform/macos/src/MLNMapView+OpenGL.h", - "NSProcessInfo+MLNAdditions.h": "platform/macos/src/NSProcessInfo+MLNAdditions.h", - "MLNRendererFrontend.h": "platform/darwin/src/MLNRendererFrontend.h", - "NSValue+MLNStyleAttributeAdditions.h": "platform/darwin/src/NSValue+MLNStyleAttributeAdditions.h", - "NSImage+MLNAdditions.h": "platform/macos/src/NSImage+MLNAdditions.h", - "MLNLight_Private.h": "platform/darwin/src/MLNLight_Private.h", - "MLNMapView+Impl.h": "platform/macos/src/MLNMapView+Impl.h", - "NSCoder+MLNAdditions.h": "platform/darwin/src/NSCoder+MLNAdditions.h", - "MLNOfflineStorage_Private.h": "platform/darwin/src/MLNOfflineStorage_Private.h", - "MLNLineStyleLayer_Private.h": "platform/darwin/src/MLNLineStyleLayer_Private.h", - "MLNHillshadeStyleLayer_Private.h": "platform/darwin/src/MLNHillshadeStyleLayer_Private.h", - "MLNValueEvaluator.h": "platform/darwin/src/MLNValueEvaluator.h", - "MLNOfflinePack_Private.h": "platform/darwin/src/MLNOfflinePack_Private.h", - "MLNFoundation_Private.h": "platform/darwin/src/MLNFoundation_Private.h", - "MLNCompassCell.h": "platform/macos/src/MLNCompassCell.h", - "MLNShapeSource_Private.h": "platform/darwin/src/MLNShapeSource_Private.h", - "MLNStyle_Private.h": "platform/darwin/src/MLNStyle_Private.h", - "MLNSource_Private.h": "platform/darwin/src/MLNSource_Private.h", - "MLNOpenGLLayer.h": "platform/macos/src/MLNOpenGLLayer.h", - "MLNPointCollection_Private.h": "platform/darwin/src/MLNPointCollection_Private.h", - "NSDate+MLNAdditions.h": "platform/darwin/src/NSDate+MLNAdditions.h", - "NSColor+MLNAdditions.h": "platform/macos/src/NSColor+MLNAdditions.h", - "MLNMultiPoint_Private.h": "platform/darwin/src/MLNMultiPoint_Private.h", - "MLNCustomStyleLayer_Private.h": "platform/darwin/src/MLNCustomStyleLayer_Private.h", - "MLNPolygon_Private.h": "platform/darwin/src/MLNPolygon_Private.h", - "MLNShape_Private.h": "platform/darwin/src/MLNShape_Private.h", - "MLNTilePyramidOfflineRegion_Private.h": "platform/darwin/src/MLNTilePyramidOfflineRegion_Private.h", - "MLNFeature_Private.h": "platform/darwin/src/MLNFeature_Private.h", - "MLNPolyline_Private.h": "platform/darwin/src/MLNPolyline_Private.h", - "MLNFillStyleLayer_Private.h": "platform/darwin/src/MLNFillStyleLayer_Private.h", - "NSDictionary+MLNAdditions.h": "platform/darwin/src/NSDictionary+MLNAdditions.h", - "MLNRendererConfiguration.h": "platform/darwin/src/MLNRendererConfiguration.h" - } -} diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index afa1756b0ada..eb57ffd12b9f 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -366,7 +366,6 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, vertDesc->layouts()->setObject(layoutDesc.get(), ShaderClass::attributes[0].index); // Create a render pipeline state, telling Metal how to render the primitives - const auto& renderPassDescriptor = mtlRenderPass.getDescriptor(); const std::size_t hash = mbgl::util::hash(ShaderClass::attributes[0].index, 0, MTL::VertexFormatShort2, diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index 27ca784a525a..e41d8c79c957 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -252,7 +252,8 @@ void Drawable::draw(PaintParameters& parameters) const { const auto stencilMode = enableStencil ? parameters.stencilModeForClipping(tileID->toUnwrapped()) : gfx::StencilMode::disabled(); impl->depthStencilState = context.makeDepthStencilState(depthMode, stencilMode, renderable); - impl->previousStencilMode = *newStencilMode; + // FIXME: https://github.com/maplibre/maplibre-native/issues/3248 + if (newStencilMode) impl->previousStencilMode = *newStencilMode; } renderPass.setDepthStencilState(impl->depthStencilState); renderPass.setStencilReference(impl->previousStencilMode.ref); @@ -387,8 +388,6 @@ void Drawable::setVertexAttrId(const size_t id) { } void Drawable::bindAttributes(RenderPass& renderPass) const noexcept { - const auto& encoder = renderPass.getMetalEncoder(); - NS::UInteger attributeIndex = 0; for (const auto& binding : impl->attributeBindings) { const auto* buffer = static_cast(binding ? binding->vertexBufferResource @@ -402,8 +401,6 @@ void Drawable::bindAttributes(RenderPass& renderPass) const noexcept { } void Drawable::bindInstanceAttributes(RenderPass& renderPass) const noexcept { - const auto& encoder = renderPass.getMetalEncoder(); - NS::UInteger attributeIndex = 0; for (const auto& binding : impl->instanceBindings) { if (binding.has_value()) { @@ -520,7 +517,6 @@ void Drawable::upload(gfx::UploadPass& uploadPass_) { assert(false); return; } - const auto& shaderMTL = static_cast(*shader); auto& uploadPass = static_cast(uploadPass_); auto& contextBase = uploadPass.getContext(); diff --git a/src/mbgl/mtl/layer_group.cpp b/src/mbgl/mtl/layer_group.cpp index 406624e685e0..e3016cbf6c65 100644 --- a/src/mbgl/mtl/layer_group.cpp +++ b/src/mbgl/mtl/layer_group.cpp @@ -43,7 +43,6 @@ void LayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { const auto debugGroup = parameters.encoder->createDebugGroup(getName() + "-render"); #endif - auto& context = static_cast(parameters.context); auto& renderPass = static_cast(*parameters.renderPass); bool bindUBOs = false; diff --git a/src/mbgl/mtl/tile_layer_group.cpp b/src/mbgl/mtl/tile_layer_group.cpp index 2993a919ba23..82eb2ff6cb32 100644 --- a/src/mbgl/mtl/tile_layer_group.cpp +++ b/src/mbgl/mtl/tile_layer_group.cpp @@ -111,7 +111,6 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { } }; - const auto depthMode = parameters.depthModeFor3D(); if (stencil3d) { stencilMode3d = parameters.stencilModeFor3D(); encoder->setStencilReferenceValue(stencilMode3d.ref); diff --git a/src/mbgl/mtl/upload_pass.cpp b/src/mbgl/mtl/upload_pass.cpp index a4719310129c..e31af6e5be48 100644 --- a/src/mbgl/mtl/upload_pass.cpp +++ b/src/mbgl/mtl/upload_pass.cpp @@ -165,11 +165,6 @@ gfx::AttributeBindingArray UploadPass::buildAttributeBindings( gfx::AttributeBindingArray bindings; bindings.resize(defaults.allocatedSize()); - constexpr std::size_t align = 16; - constexpr std::uint8_t padding = 0; - - uint32_t vertexStride = 0; - // For each attribute in the program, with the corresponding default and optional override... const auto resolveAttr = [&](const size_t id, auto& default_, auto& override_) -> void { auto& effectiveAttr = override_ ? *override_ : default_; From 7339fb91fd4a726fd312cc88a94cc949b03f8824 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Fri, 28 Feb 2025 23:49:20 +0200 Subject: [PATCH 094/339] Custom drawable layer v3 (#3210) --- CMakeLists.txt | 7 + MODULE.bazel | 8 + bazel/core.bzl | 6 + include/mbgl/gfx/context.hpp | 2 + include/mbgl/gfx/uniform_buffer.hpp | 3 + include/mbgl/gl/uniform_buffer_gl.hpp | 2 + include/mbgl/mtl/context.hpp | 3 + include/mbgl/mtl/index_buffer_resource.hpp | 1 - include/mbgl/mtl/uniform_buffer.hpp | 4 +- include/mbgl/mtl/vertex_buffer_resource.hpp | 1 - include/mbgl/shaders/custom_geometry_ubo.hpp | 16 + .../shaders/gl/drawable_custom_geometry.hpp | 39 + .../gl/drawable_location_indicator.hpp | 20 +- .../drawable_location_indicator_textured.hpp | 27 +- include/mbgl/shaders/gl/shader_info.hpp | 21 + include/mbgl/shaders/mtl/custom_geometry.hpp | 70 + .../mbgl/shaders/mtl/location_indicator.hpp | 107 + include/mbgl/shaders/shader_defines.hpp | 175 +- include/mbgl/shaders/shader_manifest.hpp | 1 + include/mbgl/shaders/shader_source.hpp | 1 + include/mbgl/shaders/vulkan/background.hpp | 15 +- include/mbgl/shaders/vulkan/circle.hpp | 10 +- include/mbgl/shaders/vulkan/clipping_mask.hpp | 1 + include/mbgl/shaders/vulkan/collision.hpp | 15 +- .../mbgl/shaders/vulkan/custom_geometry.hpp | 57 + .../shaders/vulkan/custom_symbol_icon.hpp | 12 +- include/mbgl/shaders/vulkan/debug.hpp | 12 +- include/mbgl/shaders/vulkan/fill.hpp | 30 +- .../mbgl/shaders/vulkan/fill_extrusion.hpp | 15 +- include/mbgl/shaders/vulkan/heatmap.hpp | 10 +- .../mbgl/shaders/vulkan/heatmap_texture.hpp | 12 +- include/mbgl/shaders/vulkan/hillshade.hpp | 10 +- .../mbgl/shaders/vulkan/hillshade_prepare.hpp | 10 +- include/mbgl/shaders/vulkan/line.hpp | 25 +- .../shaders/vulkan/location_indicator.hpp | 15 +- include/mbgl/shaders/vulkan/raster.hpp | 10 +- include/mbgl/shaders/vulkan/shader_group.hpp | 8 +- include/mbgl/shaders/vulkan/symbol.hpp | 20 +- include/mbgl/shaders/vulkan/widevector.hpp | 41 +- .../style/layers/custom_drawable_layer.hpp | 78 +- include/mbgl/vulkan/context.hpp | 3 + include/mbgl/vulkan/tile_layer_group.hpp | 4 +- include/mbgl/vulkan/uniform_buffer.hpp | 2 + .../app/ExampleCustomDrawableStyleLayer.mm | 48 +- .../src/mbgl/layermanager/layer_manager.cpp | 3 - platform/glfw/BUILD.bazel | 14 +- platform/glfw/CMakeLists.txt | 15 +- platform/glfw/assets/sphere.obj | 1851 +++++++++++++++++ .../example_custom_drawable_style_layer.cpp | 606 ++++++ .../example_custom_drawable_style_layer.hpp | 43 + platform/glfw/glfw_metal_backend.mm | 2 +- platform/glfw/glfw_view.cpp | 26 +- platform/glfw/glfw_view.hpp | 1 + .../drawable.custom_geometry.fragment.glsl | 11 + shaders/drawable.custom_geometry.vertex.glsl | 14 + .../drawable.location_indicator.fragment.glsl | 8 + .../drawable.location_indicator.vertex.glsl | 10 + ....location_indicator_textured.fragment.glsl | 11 + ...le.location_indicator_textured.vertex.glsl | 14 + shaders/manifest.json | 15 +- src/mbgl/gfx/drawable.cpp | 4 +- src/mbgl/gl/context.cpp | 4 + src/mbgl/gl/context.hpp | 2 + src/mbgl/gl/layer_group_gl.cpp | 19 +- src/mbgl/gl/renderer_backend.cpp | 3 + src/mbgl/mtl/context.cpp | 12 +- src/mbgl/mtl/drawable.cpp | 1 - src/mbgl/mtl/layer_group.cpp | 14 +- src/mbgl/mtl/renderer_backend.cpp | 17 +- src/mbgl/mtl/tile_layer_group.cpp | 14 +- src/mbgl/mtl/uniform_buffer.cpp | 6 +- src/mbgl/mtl/upload_pass.cpp | 39 +- .../render_location_indicator_layer.cpp | 45 +- .../render_location_indicator_layer.hpp | 10 +- src/mbgl/shaders/gl/shader_info.cpp | 38 + src/mbgl/shaders/mtl/custom_geometry.cpp | 17 + src/mbgl/shaders/mtl/location_indicator.cpp | 25 + src/mbgl/shaders/vulkan/custom_geometry.cpp | 20 + .../shaders/vulkan/location_indicator.cpp | 8 +- .../style/layers/custom_drawable_layer.cpp | 374 +++- src/mbgl/vulkan/context.cpp | 5 + src/mbgl/vulkan/drawable.cpp | 27 +- src/mbgl/vulkan/drawable_impl.hpp | 4 +- src/mbgl/vulkan/layer_group.cpp | 8 +- src/mbgl/vulkan/renderer_backend.cpp | 2 + src/mbgl/vulkan/tile_layer_group.cpp | 8 +- src/mbgl/vulkan/uniform_buffer.cpp | 5 + test/api/custom_drawable_layer.test.cpp | 18 +- test/util/hash.test.cpp | 7 + vendor/tinyobjloader.cmake | 19 + 90 files changed, 3932 insertions(+), 464 deletions(-) create mode 100644 include/mbgl/shaders/custom_geometry_ubo.hpp create mode 100644 include/mbgl/shaders/gl/drawable_custom_geometry.hpp create mode 100644 include/mbgl/shaders/mtl/custom_geometry.hpp create mode 100644 include/mbgl/shaders/mtl/location_indicator.hpp create mode 100644 include/mbgl/shaders/vulkan/custom_geometry.hpp create mode 100644 platform/glfw/assets/sphere.obj create mode 100644 platform/glfw/example_custom_drawable_style_layer.cpp create mode 100644 platform/glfw/example_custom_drawable_style_layer.hpp create mode 100644 shaders/drawable.custom_geometry.fragment.glsl create mode 100644 shaders/drawable.custom_geometry.vertex.glsl create mode 100644 shaders/drawable.location_indicator.fragment.glsl create mode 100644 shaders/drawable.location_indicator.vertex.glsl create mode 100644 shaders/drawable.location_indicator_textured.fragment.glsl create mode 100644 shaders/drawable.location_indicator_textured.vertex.glsl create mode 100644 src/mbgl/shaders/mtl/custom_geometry.cpp create mode 100644 src/mbgl/shaders/mtl/location_indicator.cpp create mode 100644 src/mbgl/shaders/vulkan/custom_geometry.cpp create mode 100644 vendor/tinyobjloader.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 812c66458f25..ca99779658a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1035,6 +1035,7 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_circle.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_box.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_circle.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_custom_geometry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_debug.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill.hpp @@ -1217,6 +1218,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/clipping_mask.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/common.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/custom_geometry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/debug.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill.hpp @@ -1226,6 +1228,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/hillshade.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/hillshade_prepare.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/line.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/location_indicator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/raster.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/shader_group.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/shader_program.hpp @@ -1256,6 +1259,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/circle.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/collision.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/clipping_mask.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/custom_geometry.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/custom_symbol_icon.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/debug.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/fill.cpp @@ -1265,6 +1269,7 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade_prepare.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/line.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/location_indicator.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/raster.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/widevector.cpp @@ -1314,6 +1319,7 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/clipping_mask.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/collision.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/common.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/custom_geometry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/fill.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/fill_extrusion.hpp @@ -1354,6 +1360,7 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/circle.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/clipping_mask.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/collision.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/custom_geometry.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/custom_symbol_icon.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/debug.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/fill.cpp diff --git a/MODULE.bazel b/MODULE.bazel index 663b54e130ab..bb68cc766b90 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -54,6 +54,14 @@ http_archive( urls = ["https://github.com/glfw/glfw/releases/download/3.4/glfw-3.4.zip"], ) +new_git_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository") + +new_git_repository( + name = "tinyobjloader", + remote = "https://github.com/tinyobjloader/tinyobjloader.git", + branch = "release", +) + darwin_config = use_repo_rule("//platform/darwin:bazel/darwin_config_repository_rule.bzl", "darwin_config") darwin_config( diff --git a/bazel/core.bzl b/bazel/core.bzl index 75a30b5b1526..d5ffae905f0e 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -67,6 +67,7 @@ MLN_GENERATED_OPENGL_SHADER_HEADERS = [ "include/mbgl/shaders/gl/drawable_circle.hpp", "include/mbgl/shaders/gl/drawable_collision_box.hpp", "include/mbgl/shaders/gl/drawable_collision_circle.hpp", + "include/mbgl/shaders/gl/drawable_custom_geometry.hpp", "include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp", "include/mbgl/shaders/gl/drawable_debug.hpp", "include/mbgl/shaders/gl/drawable_fill.hpp", @@ -1010,6 +1011,7 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/shaders/background_layer_ubo.hpp", "include/mbgl/shaders/circle_layer_ubo.hpp", "include/mbgl/shaders/collision_layer_ubo.hpp", + "include/mbgl/shaders/custom_geometry_ubo.hpp", "include/mbgl/shaders/custom_drawable_layer_ubo.hpp", "include/mbgl/shaders/debug_layer_ubo.hpp", "include/mbgl/shaders/fill_layer_ubo.hpp", @@ -1081,6 +1083,7 @@ MLN_DRAWABLES_MTL_SOURCE = [ "src/mbgl/shaders/mtl/circle.cpp", "src/mbgl/shaders/mtl/collision.cpp", "src/mbgl/shaders/mtl/clipping_mask.cpp", + "src/mbgl/shaders/mtl/custom_geometry.cpp", "src/mbgl/shaders/mtl/custom_symbol_icon.cpp", "src/mbgl/shaders/mtl/debug.cpp", "src/mbgl/shaders/mtl/fill.cpp", @@ -1090,6 +1093,7 @@ MLN_DRAWABLES_MTL_SOURCE = [ "src/mbgl/shaders/mtl/hillshade.cpp", "src/mbgl/shaders/mtl/hillshade_prepare.cpp", "src/mbgl/shaders/mtl/line.cpp", + "src/mbgl/shaders/mtl/location_indicator.cpp", "src/mbgl/shaders/mtl/raster.cpp", "src/mbgl/shaders/mtl/symbol.cpp", "src/mbgl/shaders/mtl/widevector.cpp", @@ -1120,6 +1124,7 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/shaders/mtl/clipping_mask.hpp", "include/mbgl/shaders/mtl/collision.hpp", "include/mbgl/shaders/mtl/common.hpp", + "include/mbgl/shaders/mtl/custom_geometry.hpp", "include/mbgl/shaders/mtl/custom_symbol_icon.hpp", "include/mbgl/shaders/mtl/debug.hpp", "include/mbgl/shaders/mtl/fill.hpp", @@ -1129,6 +1134,7 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/shaders/mtl/hillshade.hpp", "include/mbgl/shaders/mtl/hillshade_prepare.hpp", "include/mbgl/shaders/mtl/line.hpp", + "include/mbgl/shaders/mtl/location_indicator.hpp", "include/mbgl/shaders/mtl/raster.hpp", "include/mbgl/shaders/mtl/shader_group.hpp", "include/mbgl/shaders/mtl/shader_program.hpp", diff --git a/include/mbgl/gfx/context.hpp b/include/mbgl/gfx/context.hpp index abfdd383e959..e55b141db22c 100644 --- a/include/mbgl/gfx/context.hpp +++ b/include/mbgl/gfx/context.hpp @@ -130,6 +130,8 @@ class Context { bool persistent = false, bool ssbo = false) = 0; + virtual UniqueUniformBufferArray createLayerUniformBufferArray() = 0; + /// Get the generic shader with the specified name virtual gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) = 0; diff --git a/include/mbgl/gfx/uniform_buffer.hpp b/include/mbgl/gfx/uniform_buffer.hpp index 390459c57489..ea803a319a80 100644 --- a/include/mbgl/gfx/uniform_buffer.hpp +++ b/include/mbgl/gfx/uniform_buffer.hpp @@ -12,6 +12,7 @@ namespace gfx { class Context; class UniformBuffer; class UniformBufferArray; +class RenderPass; using UniformBufferPtr = std::shared_ptr; using UniqueUniformBuffer = std::unique_ptr; @@ -75,6 +76,8 @@ class UniformBufferArray { createOrUpdate(id, data, sizeof(T), context, persistent); } + virtual void bind(gfx::RenderPass& renderPass) = 0; + UniformBufferArray& operator=(UniformBufferArray&&); UniformBufferArray& operator=(const UniformBufferArray&); diff --git a/include/mbgl/gl/uniform_buffer_gl.hpp b/include/mbgl/gl/uniform_buffer_gl.hpp index b186715e9c53..3a205cfbeb81 100644 --- a/include/mbgl/gl/uniform_buffer_gl.hpp +++ b/include/mbgl/gl/uniform_buffer_gl.hpp @@ -62,6 +62,8 @@ class UniformBufferArrayGL final : public gfx::UniformBufferArray { void bind() const; void unbind() const; + void bind(gfx::RenderPass&) override { bind(); } + private: std::unique_ptr copy(const gfx::UniformBuffer& uniformBuffers) override { return std::make_unique(static_cast(uniformBuffers).clone()); diff --git a/include/mbgl/mtl/context.hpp b/include/mbgl/mtl/context.hpp index 41c354b4ddee..46c6e2c08e0e 100644 --- a/include/mbgl/mtl/context.hpp +++ b/include/mbgl/mtl/context.hpp @@ -41,6 +41,7 @@ class VertexBufferResource; using UniqueShaderProgram = std::unique_ptr; using UniqueVertexBufferResource = std::unique_ptr; +using UniqueUniformBufferArray = std::unique_ptr; class Context final : public gfx::Context { public: @@ -88,6 +89,8 @@ class Context final : public gfx::Context { bool persistent = false, bool ssbo = false) override; + UniqueUniformBufferArray createLayerUniformBufferArray() override; + gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; TileLayerGroupPtr createTileLayerGroup(int32_t layerIndex, std::size_t initialCapacity, std::string name) override; diff --git a/include/mbgl/mtl/index_buffer_resource.hpp b/include/mbgl/mtl/index_buffer_resource.hpp index 703a561aa2af..248d9fdd5eb4 100644 --- a/include/mbgl/mtl/index_buffer_resource.hpp +++ b/include/mbgl/mtl/index_buffer_resource.hpp @@ -8,7 +8,6 @@ namespace mtl { class IndexBufferResource : public gfx::IndexBufferResource { public: - IndexBufferResource() noexcept = delete; IndexBufferResource(BufferResource&&) noexcept; IndexBufferResource(IndexBufferResource&& other) noexcept : buffer(std::move(other.buffer)) {} diff --git a/include/mbgl/mtl/uniform_buffer.hpp b/include/mbgl/mtl/uniform_buffer.hpp index 9352bfedc476..0e0f95f9ebb8 100644 --- a/include/mbgl/mtl/uniform_buffer.hpp +++ b/include/mbgl/mtl/uniform_buffer.hpp @@ -42,8 +42,8 @@ class UniformBufferArray final : public gfx::UniformBufferArray { return *this; } - void bind(RenderPass& renderPass) const noexcept; - void unbind(RenderPass&) const noexcept {} + void bindMtl(RenderPass&) const noexcept; + void bind(gfx::RenderPass& renderPass) override; private: gfx::UniqueUniformBuffer copy(const gfx::UniformBuffer& buffer) override { diff --git a/include/mbgl/mtl/vertex_buffer_resource.hpp b/include/mbgl/mtl/vertex_buffer_resource.hpp index a52d718e7575..62d5f47f0b86 100644 --- a/include/mbgl/mtl/vertex_buffer_resource.hpp +++ b/include/mbgl/mtl/vertex_buffer_resource.hpp @@ -10,7 +10,6 @@ namespace mtl { class VertexBufferResource : public gfx::VertexBufferResource { public: - VertexBufferResource() noexcept = delete; VertexBufferResource(BufferResource&&) noexcept; VertexBufferResource(VertexBufferResource&& other) noexcept : buffer(std::move(other.buffer)) {} diff --git a/include/mbgl/shaders/custom_geometry_ubo.hpp b/include/mbgl/shaders/custom_geometry_ubo.hpp new file mode 100644 index 000000000000..50a9f052d130 --- /dev/null +++ b/include/mbgl/shaders/custom_geometry_ubo.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace mbgl { +namespace shaders { + +struct alignas(16) CustomGeometryDrawableUBO { + /* 0 */ std::array matrix; + /* 64 */ Color color; + /* 80 */ +}; +static_assert(sizeof(CustomGeometryDrawableUBO) == 5 * 16); + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_custom_geometry.hpp b/include/mbgl/shaders/gl/drawable_custom_geometry.hpp new file mode 100644 index 000000000000..cd4ad682051d --- /dev/null +++ b/include/mbgl/shaders/gl/drawable_custom_geometry.hpp @@ -0,0 +1,39 @@ +// Generated code, do not modify this file! +#pragma once +#include + +namespace mbgl { +namespace shaders { + +template <> +struct ShaderSource { + static constexpr const char* name = "CustomGeometryShader"; + static constexpr const char* vertex = R"(layout (std140) uniform CustomGeometryDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec3 a_pos; +layout(location = 1) in vec2 a_uv; + +out vec2 frag_uv; + +void main() { + frag_uv = a_uv; + gl_Position = u_matrix * vec4(a_pos, 1.0); +})"; + static constexpr const char* fragment = R"(layout (std140) uniform CustomGeometryDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +in vec2 frag_uv; +uniform sampler2D u_image; + +void main() { + fragColor = texture(u_image, frag_uv) * u_color; +})"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_location_indicator.hpp b/include/mbgl/shaders/gl/drawable_location_indicator.hpp index af1c0d5c465e..5d0b261f9c55 100644 --- a/include/mbgl/shaders/gl/drawable_location_indicator.hpp +++ b/include/mbgl/shaders/gl/drawable_location_indicator.hpp @@ -8,8 +8,24 @@ namespace shaders { template <> struct ShaderSource { static constexpr const char* name = "LocationIndicatorShader"; - static constexpr const char* vertex = R"()"; - static constexpr const char* fragment = R"()"; + static constexpr const char* vertex = R"(layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec2 a_pos; + +void main() { + gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); +})"; + static constexpr const char* fragment = R"(layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +void main() { + fragColor = u_color; +})"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp b/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp index cc26f8711afd..2993936c4ba0 100644 --- a/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp +++ b/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp @@ -8,8 +8,31 @@ namespace shaders { template <> struct ShaderSource { static constexpr const char* name = "LocationIndicatorTexturedShader"; - static constexpr const char* vertex = R"()"; - static constexpr const char* fragment = R"()"; + static constexpr const char* vertex = R"(layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec2 a_pos; +layout(location = 1) in vec2 a_uv; + +out vec2 frag_uv; + +void main() { + frag_uv = a_uv; + gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); +})"; + static constexpr const char* fragment = R"(layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +in vec2 frag_uv; +uniform sampler2D u_image; + +void main() { + fragColor = texture(u_image, frag_uv); +})"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/shader_info.hpp b/include/mbgl/shaders/gl/shader_info.hpp index 6447924f3273..7d9228a2dd3f 100644 --- a/include/mbgl/shaders/gl/shader_info.hpp +++ b/include/mbgl/shaders/gl/shader_info.hpp @@ -65,6 +65,13 @@ struct ShaderInfo { static const std::vector textures; }; +template <> +struct ShaderInfo { + static const std::vector attributes; + static const std::vector uniformBlocks; + static const std::vector textures; +}; + template <> struct ShaderInfo { static const std::vector attributes; @@ -184,6 +191,20 @@ struct ShaderInfo { static const std::vector textures; }; +template <> +struct ShaderInfo { + static const std::vector attributes; + static const std::vector uniformBlocks; + static const std::vector textures; +}; + +template <> +struct ShaderInfo { + static const std::vector attributes; + static const std::vector uniformBlocks; + static const std::vector textures; +}; + template <> struct ShaderInfo { static const std::vector attributes; diff --git a/include/mbgl/shaders/mtl/custom_geometry.hpp b/include/mbgl/shaders/mtl/custom_geometry.hpp new file mode 100644 index 000000000000..c1947359743a --- /dev/null +++ b/include/mbgl/shaders/mtl/custom_geometry.hpp @@ -0,0 +1,70 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace shaders { + +constexpr auto customGeometryShaderPrelude = R"( + +enum { + idCustomGeometryDrawableUBO = drawableReservedUBOCount, + customGeometryUBOCount +}; + +struct alignas(16) CustomGeometryDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float4 color; + /* 80 */ +}; +static_assert(sizeof(CustomGeometryDrawableUBO) == 5 * 16, "wrong size"); + +)"; + +template <> +struct ShaderSource { + static constexpr auto name = "CustomGeometryShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto prelude = customGeometryShaderPrelude; + static constexpr auto source = R"( + +struct VertexStage { + float3 position [[attribute(customGeometryUBOCount + 0)]]; + float2 uv [[attribute(customGeometryUBOCount + 1)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float2 uv; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const CustomGeometryDrawableUBO& drawable [[buffer(idCustomGeometryDrawableUBO)]]) { + + return { + .position = drawable.matrix * float4(vertx.position, 1.0), + .uv = vertx.uv + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const CustomGeometryDrawableUBO& drawable [[buffer(idCustomGeometryDrawableUBO)]], + texture2d colorTexture [[texture(0)]]) { + constexpr sampler sampler2d(coord::normalized, filter::linear); + const float4 color = colorTexture.sample(sampler2d, in.uv) * drawable.color; + + return half4(color); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/location_indicator.hpp b/include/mbgl/shaders/mtl/location_indicator.hpp new file mode 100644 index 000000000000..93d8d5ff891e --- /dev/null +++ b/include/mbgl/shaders/mtl/location_indicator.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace shaders { + +constexpr auto locationIndicatorShaderPrelude = R"( + +enum { + idLocationIndicatorUBO = drawableReservedUBOCount, + locationIndicatorUBOCount +}; + +struct alignas(16) LocationIndicatorDrawableUBO { + /* 0 */ float4x4 matrix; + /* 64 */ float4 color; + /* 80 */ +}; +static_assert(sizeof(LocationIndicatorDrawableUBO) == 5 * 16, "wrong size"); + +)"; + +template <> +struct ShaderSource { + static constexpr auto name = "LocationIndicatorShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static constexpr std::array textures{}; + + static constexpr auto prelude = locationIndicatorShaderPrelude; + static constexpr auto source = R"( + +struct VertexStage { + float2 position [[attribute(locationIndicatorUBOCount + 0)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const LocationIndicatorDrawableUBO& drawable [[buffer(idLocationIndicatorUBO)]]) { + + return { + .position = drawable.matrix * float4(vertx.position, 1.0) + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const LocationIndicatorDrawableUBO& drawable [[buffer(idLocationIndicatorUBO)]]) { + return half4(drawable.color); +} +)"; +}; + +template <> +struct ShaderSource { + static constexpr auto name = "LocationIndicatorTexturedShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto prelude = locationIndicatorShaderPrelude; + static constexpr auto source = R"( + +struct VertexStage { + float2 position [[attribute(locationIndicatorUBOCount + 0)]]; + float2 uv [[attribute(locationIndicatorUBOCount + 1)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float2 uv; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const LocationIndicatorDrawableUBO& drawable [[buffer(idLocationIndicatorUBO)]]) { + + return { + .position = drawable.matrix * float4(vertx.position, 1.0), + .uv = vertx.uv + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const LocationIndicatorDrawableUBO& drawable [[buffer(idLocationIndicatorUBO)]], + texture2d colorTexture [[texture(0)]]) { + + constexpr sampler sampler2d(coord::normalized, filter::linear); + const float4 color = colorTexture.sample(sampler2d, in.uv); + + return half4(color); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/shader_defines.hpp b/include/mbgl/shaders/shader_defines.hpp index 557921146e25..daee8ca31a6b 100644 --- a/include/mbgl/shaders/shader_defines.hpp +++ b/include/mbgl/shaders/shader_defines.hpp @@ -30,6 +30,11 @@ enum { collisionDrawableUBOCount }; +enum { + idCustomGeometryDrawableUBO = drawableReservedUBOCount, + customGeometryDrawableUBOCount +}; + enum { idCustomSymbolDrawableUBO = idDrawableReservedVertexOnlyUBO, customSymbolDrawableUBOCount = drawableReservedUBOCount @@ -101,26 +106,27 @@ enum { wideVectorDrawableUBOCount }; -static constexpr auto layerSSBOStartId = globalUBOCount; -static constexpr auto layerUBOStartId = std::max({static_cast(backgroundDrawableUBOCount), - static_cast(circleDrawableUBOCount), - static_cast(clippingMaskDrawableUBOCount), - static_cast(collisionDrawableUBOCount), - static_cast(customSymbolDrawableUBOCount), - static_cast(debugDrawableUBOCount), - static_cast(fillDrawableUBOCount), - static_cast(fillExtrusionDrawableUBOCount), - static_cast(heatmapDrawableUBOCount), - static_cast(heatmapTextureDrawableUBOCount), - static_cast(hillshadeDrawableUBOCount), - static_cast(hillshadePrepareDrawableUBOCount), - static_cast(lineDrawableUBOCount), - static_cast(locationIndicatorDrawableUBOCount), - static_cast(rasterDrawableUBOCount), - static_cast(symbolDrawableUBOCount), - static_cast(wideVectorDrawableUBOCount)}); - -static constexpr auto maxUBOCountPerDrawable = layerUBOStartId - globalUBOCount; +static constexpr uint32_t layerSSBOStartId = globalUBOCount; +static constexpr uint32_t layerUBOStartId = std::max({static_cast(backgroundDrawableUBOCount), + static_cast(circleDrawableUBOCount), + static_cast(clippingMaskDrawableUBOCount), + static_cast(collisionDrawableUBOCount), + static_cast(customGeometryDrawableUBOCount), + static_cast(customSymbolDrawableUBOCount), + static_cast(debugDrawableUBOCount), + static_cast(fillDrawableUBOCount), + static_cast(fillExtrusionDrawableUBOCount), + static_cast(heatmapDrawableUBOCount), + static_cast(heatmapTextureDrawableUBOCount), + static_cast(hillshadeDrawableUBOCount), + static_cast(hillshadePrepareDrawableUBOCount), + static_cast(lineDrawableUBOCount), + static_cast(locationIndicatorDrawableUBOCount), + static_cast(rasterDrawableUBOCount), + static_cast(symbolDrawableUBOCount), + static_cast(wideVectorDrawableUBOCount)}); + +static constexpr uint32_t maxUBOCountPerDrawable = layerUBOStartId - globalUBOCount; // layer UBOs @@ -148,6 +154,10 @@ enum { collisionUBOCount = getLayerStartValue(collisionDrawableUBOCount) }; +enum { + customGeometryUBOCount = getLayerStartValue(customGeometryDrawableUBOCount) +}; + enum { customSymbolUBOCount = getLayerStartValue(customSymbolDrawableUBOCount) }; @@ -211,26 +221,26 @@ enum { #undef getLayerStartValue -static constexpr auto maxUBOCountPerShader = std::max({static_cast(backgroundUBOCount), - static_cast(circleUBOCount), - static_cast(clippingMaskUBOCount), - static_cast(collisionUBOCount), - static_cast(customSymbolUBOCount), - static_cast(debugUBOCount), - static_cast(fillUBOCount), - static_cast(fillExtrusionUBOCount), - static_cast(heatmapUBOCount), - static_cast(heatmapTextureUBOCount), - static_cast(hillshadeUBOCount), - static_cast(hillshadePrepareUBOCount), - static_cast(lineUBOCount), - static_cast(locationIndicatorUBOCount), - static_cast(rasterUBOCount), - static_cast(symbolUBOCount), - static_cast(wideVectorUBOCount)}); - -static constexpr auto maxSSBOCountPerLayer = maxUBOCountPerDrawable; -static constexpr auto maxUBOCountPerLayer = maxUBOCountPerShader - layerUBOStartId; +static constexpr uint32_t maxUBOCountPerShader = std::max({static_cast(backgroundUBOCount), + static_cast(circleUBOCount), + static_cast(clippingMaskUBOCount), + static_cast(collisionUBOCount), + static_cast(customSymbolUBOCount), + static_cast(debugUBOCount), + static_cast(fillUBOCount), + static_cast(fillExtrusionUBOCount), + static_cast(heatmapUBOCount), + static_cast(heatmapTextureUBOCount), + static_cast(hillshadeUBOCount), + static_cast(hillshadePrepareUBOCount), + static_cast(lineUBOCount), + static_cast(locationIndicatorUBOCount), + static_cast(rasterUBOCount), + static_cast(symbolUBOCount), + static_cast(wideVectorUBOCount)}); + +static constexpr uint32_t maxSSBOCountPerLayer = maxUBOCountPerDrawable; +static constexpr uint32_t maxUBOCountPerLayer = maxUBOCountPerShader - layerUBOStartId; // Texture defines enum { @@ -251,8 +261,8 @@ enum { }; enum { - idCommonTexture, - commonTextureCount + idCustomGeometryTexture, + customGeometryTextureCount }; enum { @@ -286,6 +296,11 @@ enum { hillshadeTextureCount }; +enum { + idLocationIndicatorTexture, + locationIndicatorTextureCount +}; + enum { idLineImageTexture, lineTextureCount @@ -303,20 +318,21 @@ enum { symbolTextureCount }; -static constexpr auto maxTextureCountPerShader = std::max({static_cast(backgroundTextureCount), - static_cast(circleTextureCount), - static_cast(clippingMaskTextureCount), - static_cast(collisionTextureCount), - static_cast(commonTextureCount), - static_cast(customSymbolTextureCount), - static_cast(debugTextureCount), - static_cast(fillTextureCount), - static_cast(fillExtrusionTextureCount), - static_cast(heatmapTextureCount), - static_cast(hillshadeTextureCount), - static_cast(lineTextureCount), - static_cast(rasterTextureCount), - static_cast(symbolTextureCount)}); +static constexpr uint32_t maxTextureCountPerShader = std::max({static_cast(backgroundTextureCount), + static_cast(circleTextureCount), + static_cast(clippingMaskTextureCount), + static_cast(collisionTextureCount), + static_cast(customGeometryTextureCount), + static_cast(customSymbolTextureCount), + static_cast(debugTextureCount), + static_cast(fillTextureCount), + static_cast(fillExtrusionTextureCount), + static_cast(heatmapTextureCount), + static_cast(hillshadeTextureCount), + static_cast(lineTextureCount), + static_cast(locationIndicatorTextureCount), + static_cast(rasterTextureCount), + static_cast(symbolTextureCount)}); // Vertex attribute defines enum { @@ -354,9 +370,9 @@ enum { }; enum { - idCommonPosVertexAttribute, - idCommonTexVertexAttribute, - commonVertexAttributeCount + idCustomGeometryPosVertexAttribute, + idCustomGeometryTexVertexAttribute, + customGeometryVertexAttributeCount }; enum { @@ -431,6 +447,12 @@ enum { lineVertexAttributeCount }; +enum { + idLocationIndicatorPosVertexAttribute, + idLocationIndicatorTexVertexAttribute, + locationIndicatorVertexAttributeCount +}; + enum { idRasterPosVertexAttribute, idRasterTexturePosVertexAttribute, @@ -471,23 +493,24 @@ enum { wideVectorInstanceAttributeCount }; -static constexpr auto maxVertexAttributeCountPerShader = std::max({ - static_cast(backgroundVertexAttributeCount), - static_cast(circleVertexAttributeCount), - static_cast(clippingMaskVertexAttributeCount), - static_cast(collisionVertexAttributeCount), - static_cast(commonVertexAttributeCount), - static_cast(customSymbolVertexAttributeCount), - static_cast(debugVertexAttributeCount), - static_cast(fillVertexAttributeCount), - static_cast(fillExtrusionVertexAttributeCount), - static_cast(heatmapVertexAttributeCount), - static_cast(hillshadeVertexAttributeCount), - static_cast(lineVertexAttributeCount), - static_cast(rasterVertexAttributeCount), - static_cast(symbolVertexAttributeCount), - static_cast(wideVectorAttributeCount), - static_cast(wideVectorInstanceAttributeCount), +static constexpr uint32_t maxVertexAttributeCountPerShader = std::max({ + static_cast(backgroundVertexAttributeCount), + static_cast(circleVertexAttributeCount), + static_cast(clippingMaskVertexAttributeCount), + static_cast(collisionVertexAttributeCount), + static_cast(customGeometryVertexAttributeCount), + static_cast(customSymbolVertexAttributeCount), + static_cast(debugVertexAttributeCount), + static_cast(fillVertexAttributeCount), + static_cast(fillExtrusionVertexAttributeCount), + static_cast(heatmapVertexAttributeCount), + static_cast(hillshadeVertexAttributeCount), + static_cast(lineVertexAttributeCount), + static_cast(locationIndicatorVertexAttributeCount), + static_cast(rasterVertexAttributeCount), + static_cast(symbolVertexAttributeCount), + static_cast(wideVectorAttributeCount), + static_cast(wideVectorInstanceAttributeCount), }); } // namespace shaders diff --git a/include/mbgl/shaders/shader_manifest.hpp b/include/mbgl/shaders/shader_manifest.hpp index 79b6e38ea5c8..1f537fae29fc 100644 --- a/include/mbgl/shaders/shader_manifest.hpp +++ b/include/mbgl/shaders/shader_manifest.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/include/mbgl/shaders/shader_source.hpp b/include/mbgl/shaders/shader_source.hpp index 167b95647f94..4ae34388e05f 100644 --- a/include/mbgl/shaders/shader_source.hpp +++ b/include/mbgl/shaders/shader_source.hpp @@ -14,6 +14,7 @@ enum class BuiltIn { CircleShader, CollisionBoxShader, CollisionCircleShader, + CustomGeometryShader, CustomSymbolIconShader, DebugShader, FillShader, diff --git a/include/mbgl/shaders/vulkan/background.hpp b/include/mbgl/shaders/vulkan/background.hpp index 2fa7df3478d4..e4fb28b4df9b 100644 --- a/include/mbgl/shaders/vulkan/background.hpp +++ b/include/mbgl/shaders/vulkan/background.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define BACKGROUND_SHADER_COMMON \ - R"( +constexpr auto backgroundShaderPrelude = R"( #define idBackgroundDrawableUBO idDrawableReservedVertexOnlyUBO #define idBackgroundPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = BACKGROUND_SHADER_COMMON R"( + static constexpr auto prelude = backgroundShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -48,7 +48,7 @@ void main() { } )"; - static constexpr auto fragment = BACKGROUND_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) out vec4 out_color; layout(set = LAYER_SET_INDEX, binding = idBackgroundPropsUBO) uniform BackgroundPropsUBO { @@ -79,7 +79,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = BACKGROUND_SHADER_COMMON R"( + static constexpr auto prelude = backgroundShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(push_constant) uniform Constants { @@ -135,7 +136,7 @@ void main() { } )"; - static constexpr auto fragment = BACKGROUND_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; diff --git a/include/mbgl/shaders/vulkan/circle.hpp b/include/mbgl/shaders/vulkan/circle.hpp index 9b5e900330e2..88633221d6f3 100644 --- a/include/mbgl/shaders/vulkan/circle.hpp +++ b/include/mbgl/shaders/vulkan/circle.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define CIRCLE_SHADER_PRELUDE \ - R"( +constexpr auto circleShaderPrelude = R"( #define idCircleDrawableUBO idDrawableReservedVertexOnlyUBO #define idCircleEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = CIRCLE_SHADER_PRELUDE R"( + static constexpr auto prelude = circleShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -204,7 +204,7 @@ void main() { } )"; - static constexpr auto fragment = CIRCLE_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_extrude; layout(location = 1) in float frag_antialiasblur; diff --git a/include/mbgl/shaders/vulkan/clipping_mask.hpp b/include/mbgl/shaders/vulkan/clipping_mask.hpp index 3b3dd7e4408b..676e95d9f98b 100644 --- a/include/mbgl/shaders/vulkan/clipping_mask.hpp +++ b/include/mbgl/shaders/vulkan/clipping_mask.hpp @@ -20,6 +20,7 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; + static constexpr auto prelude = ""; static constexpr auto vertex = R"( layout(location = 0) in ivec2 position; diff --git a/include/mbgl/shaders/vulkan/collision.hpp b/include/mbgl/shaders/vulkan/collision.hpp index b5bdda8387c5..aece0c81d3ce 100644 --- a/include/mbgl/shaders/vulkan/collision.hpp +++ b/include/mbgl/shaders/vulkan/collision.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define COLLISION_SHADER_COMMON \ - R"( +constexpr auto collisionShaderPrelude = R"( #define idCollisionDrawableUBO idDrawableReservedVertexOnlyUBO #define idCollisionTilePropsUBO drawableReservedUBOCount -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = COLLISION_SHADER_COMMON R"( + static constexpr auto prelude = collisionShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_anchor_position; @@ -61,7 +61,7 @@ void main() { } )"; - static constexpr auto fragment = COLLISION_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in float frag_placed; layout(location = 1) in float frag_notUsed; @@ -98,7 +98,8 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = COLLISION_SHADER_COMMON R"( + static constexpr auto prelude = collisionShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_anchor_position; @@ -143,7 +144,7 @@ void main() { } )"; - static constexpr auto fragment = COLLISION_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in float frag_placed; layout(location = 1) in float frag_notUsed; diff --git a/include/mbgl/shaders/vulkan/custom_geometry.hpp b/include/mbgl/shaders/vulkan/custom_geometry.hpp new file mode 100644 index 000000000000..17cc135b0bb6 --- /dev/null +++ b/include/mbgl/shaders/vulkan/custom_geometry.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace shaders { + +constexpr auto customGeometryShaderPrelude = R"(#define idCustomGeometryDrawableUBO drawableReservedUBOCount)"; + +template <> +struct ShaderSource { + static constexpr const char* name = "CustomGeometryShader"; + + static const std::array attributes; + static constexpr std::array instanceAttributes{}; + static const std::array textures; + + static constexpr auto prelude = customGeometryShaderPrelude; + static constexpr auto vertex = R"( +layout(location = 0) in vec3 in_position; +layout(location = 1) in vec2 in_texcoord; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCustomGeometryDrawableUBO) uniform CustomDrawableDrawableUBO { + mat4 matrix; + vec4 color; +} drawable; + +layout(location = 0) out vec2 frag_uv; + +void main() { + frag_uv = in_texcoord; + + gl_Position = drawable.matrix * vec4(in_position, 1.0); + applySurfaceTransform(); +} +)"; + + static constexpr auto fragment = R"( +layout(location = 0) in vec2 frag_uv; +layout(location = 0) out vec4 out_color; + +layout(set = DRAWABLE_UBO_SET_INDEX, binding = idCustomGeometryDrawableUBO) uniform CustomDrawableDrawableUBO { + mat4 matrix; + vec4 color; +} drawable; + +layout(set = DRAWABLE_IMAGE_SET_INDEX, binding = 0) uniform sampler2D image_sampler; + +void main() { + out_color = texture(image_sampler, frag_uv) * drawable.color; +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp b/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp index f294035d436a..69a4fb9331d4 100644 --- a/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp +++ b/include/mbgl/shaders/vulkan/custom_symbol_icon.hpp @@ -6,12 +6,7 @@ namespace mbgl { namespace shaders { -#define CUSTOM_SYMBOL_ICON_SHADER_PRELUDE \ - R"( - -#define idCustomSymbolDrawableUBO idDrawableReservedVertexOnlyUBO - -)" +constexpr auto customSymbolIconShaderPrelude = R"(#define idCustomSymbolDrawableUBO idDrawableReservedVertexOnlyUBO)"; template <> struct ShaderSource { @@ -21,7 +16,8 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( + static constexpr auto prelude = customSymbolIconShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in vec2 in_position; layout(location = 1) in vec2 in_tex; @@ -85,7 +81,7 @@ void main() { } )"; - static constexpr auto fragment = CUSTOM_SYMBOL_ICON_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_tex; layout(location = 0) out vec4 out_color; diff --git a/include/mbgl/shaders/vulkan/debug.hpp b/include/mbgl/shaders/vulkan/debug.hpp index 9c36febd7778..0725a0524ca9 100644 --- a/include/mbgl/shaders/vulkan/debug.hpp +++ b/include/mbgl/shaders/vulkan/debug.hpp @@ -6,12 +6,7 @@ namespace mbgl { namespace shaders { -#define DEBUG_SHADER_PRELUDE \ - R"( - -#define idDebugUBO drawableReservedUBOCount - -)" +constexpr auto debugShaderPrelude = R"(#define idDebugUBO drawableReservedUBOCount)"; template <> struct ShaderSource { @@ -21,7 +16,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = DEBUG_SHADER_PRELUDE R"( + static constexpr auto prelude = debugShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -47,7 +43,7 @@ void main() { } )"; - static constexpr auto fragment = DEBUG_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_uv; layout(location = 0) out vec4 out_color; diff --git a/include/mbgl/shaders/vulkan/fill.hpp b/include/mbgl/shaders/vulkan/fill.hpp index d54c8c278448..2241d74b250d 100644 --- a/include/mbgl/shaders/vulkan/fill.hpp +++ b/include/mbgl/shaders/vulkan/fill.hpp @@ -6,14 +6,13 @@ namespace mbgl { namespace shaders { -#define FILL_SHADER_COMMON \ - R"( +constexpr auto fillShaderPrelude = R"( #define idFillDrawableUBO idDrawableReservedVertexOnlyUBO #define idFillTilePropsUBO drawableReservedUBOCount #define idFillEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -23,7 +22,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -77,7 +77,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_SHADER_COMMON R"( + static constexpr auto fragment = R"( #if !defined(HAS_UNIFORM_u_color) layout(location = 0) in vec4 frag_color; @@ -125,7 +125,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -183,7 +184,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_SHADER_COMMON R"( + static constexpr auto fragment = R"( #if !defined(HAS_UNIFORM_u_outline_color) layout(location = 0) in vec4 frag_color; @@ -240,7 +241,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -352,7 +354,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; @@ -451,7 +453,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -566,7 +569,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_pos_a; layout(location = 1) in vec2 frag_pos_b; @@ -669,7 +672,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_SHADER_COMMON R"( + static constexpr auto prelude = fillShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -735,7 +739,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in float frag_width2; layout(location = 1) in vec2 frag_normal; diff --git a/include/mbgl/shaders/vulkan/fill_extrusion.hpp b/include/mbgl/shaders/vulkan/fill_extrusion.hpp index 0e6b166d5d68..8a04b99aa8be 100644 --- a/include/mbgl/shaders/vulkan/fill_extrusion.hpp +++ b/include/mbgl/shaders/vulkan/fill_extrusion.hpp @@ -6,14 +6,13 @@ namespace mbgl { namespace shaders { -#define FILL_EXTRUSION_SHADER_COMMON \ - R"( +constexpr auto fillExtrusionShaderPrelude = R"( #define idFillExtrusionDrawableUBO idDrawableReservedVertexOnlyUBO #define idFillExtrusionTilePropsUBO drawableReservedUBOCount #define idFillExtrusionPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -23,7 +22,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto prelude = fillExtrusionShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec4 in_normal_ed; @@ -151,7 +151,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in vec4 frag_color; layout(location = 0) out vec4 out_color; @@ -170,7 +170,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto prelude = fillExtrusionShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec4 in_normal_ed; @@ -336,7 +337,7 @@ void main() { } )"; - static constexpr auto fragment = FILL_EXTRUSION_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in mediump vec4 frag_lighting; layout(location = 1) in mediump vec2 frag_pos_a; diff --git a/include/mbgl/shaders/vulkan/heatmap.hpp b/include/mbgl/shaders/vulkan/heatmap.hpp index 19418a03b0a0..f2235e52b735 100644 --- a/include/mbgl/shaders/vulkan/heatmap.hpp +++ b/include/mbgl/shaders/vulkan/heatmap.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define HEATMAP_SHADER_PRELUDE \ - R"( +constexpr auto heatmapShaderPrelude = R"( #define idHeatmapDrawableUBO idDrawableReservedVertexOnlyUBO #define idHeatmapEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = HEATMAP_SHADER_PRELUDE R"( + static constexpr auto prelude = heatmapShaderPrelude; + static constexpr auto vertex = R"( // Effective "0" in the kernel density texture to adjust the kernel size to; // this empirically chosen number minimizes artifacts on overlapping kernels @@ -117,7 +117,7 @@ void main() { } )"; - static constexpr auto fragment = HEATMAP_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( // Gaussian kernel coefficient: 1 / sqrt(2 * PI) #define GAUSS_COEF 0.3989422804014327 diff --git a/include/mbgl/shaders/vulkan/heatmap_texture.hpp b/include/mbgl/shaders/vulkan/heatmap_texture.hpp index 60c1439e1d62..1ac432dfd1d9 100644 --- a/include/mbgl/shaders/vulkan/heatmap_texture.hpp +++ b/include/mbgl/shaders/vulkan/heatmap_texture.hpp @@ -6,12 +6,7 @@ namespace mbgl { namespace shaders { -#define HEATMAP_TEXTURE_SHADER_PRELUDE \ - R"( - -#define idHeatmapTexturePropsUBO layerUBOStartId - -)" +constexpr auto heatmapTextureShaderPrelude = R"(#define idHeatmapTexturePropsUBO layerUBOStartId)"; template <> struct ShaderSource { @@ -21,7 +16,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = HEATMAP_TEXTURE_SHADER_PRELUDE R"( + static constexpr auto prelude = heatmapTextureShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; @@ -44,7 +40,7 @@ void main() { } )"; - static constexpr auto fragment = HEATMAP_TEXTURE_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_position; layout(location = 0) out vec4 out_color; diff --git a/include/mbgl/shaders/vulkan/hillshade.hpp b/include/mbgl/shaders/vulkan/hillshade.hpp index 9a7709a933a4..9306762608df 100644 --- a/include/mbgl/shaders/vulkan/hillshade.hpp +++ b/include/mbgl/shaders/vulkan/hillshade.hpp @@ -6,14 +6,13 @@ namespace mbgl { namespace shaders { -#define HILLSHADE_SHADER_PRELUDE \ - R"( +constexpr auto hillshadeShaderPrelude = R"( #define idHillshadeDrawableUBO idDrawableReservedVertexOnlyUBO #define idHillshadeTilePropsUBO idDrawableReservedFragmentOnlyUBO #define idHillshadeEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -23,7 +22,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = HILLSHADE_SHADER_PRELUDE R"( + static constexpr auto prelude = hillshadeShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_texture_position; @@ -53,7 +53,7 @@ void main() { } )"; - static constexpr auto fragment = HILLSHADE_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_position; layout(location = 0) out vec4 out_color; diff --git a/include/mbgl/shaders/vulkan/hillshade_prepare.hpp b/include/mbgl/shaders/vulkan/hillshade_prepare.hpp index 4b079a075967..a2aa699b421f 100644 --- a/include/mbgl/shaders/vulkan/hillshade_prepare.hpp +++ b/include/mbgl/shaders/vulkan/hillshade_prepare.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define HILLSHADE_PREPARE_SHADER_PRELUDE \ - R"( +constexpr auto hillshadePrepareShaderPrelude = R"( #define idHillshadePrepareDrawableUBO idDrawableReservedVertexOnlyUBO #define idHillshadePrepareTilePropsUBO drawableReservedUBOCount -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = HILLSHADE_PREPARE_SHADER_PRELUDE R"( + static constexpr auto prelude = hillshadePrepareShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_texture_position; @@ -51,7 +51,7 @@ void main() { } )"; - static constexpr auto fragment = HILLSHADE_PREPARE_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_position; layout(location = 0) out vec4 out_color; diff --git a/include/mbgl/shaders/vulkan/line.hpp b/include/mbgl/shaders/vulkan/line.hpp index 852d1eb48e1f..480b4d05da3d 100644 --- a/include/mbgl/shaders/vulkan/line.hpp +++ b/include/mbgl/shaders/vulkan/line.hpp @@ -6,14 +6,13 @@ namespace mbgl { namespace shaders { -#define LINE_SHADER_COMMON \ - R"( +constexpr auto lineShadePrelude = R"( #define idLineDrawableUBO idDrawableReservedVertexOnlyUBO #define idLineTilePropsUBO idDrawableReservedFragmentOnlyUBO #define idLineEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -23,7 +22,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -182,7 +182,7 @@ void main() { } )"; - static constexpr auto fragment = LINE_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -261,7 +261,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -410,7 +411,7 @@ void main() { } )"; - static constexpr auto fragment = LINE_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -486,7 +487,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -660,7 +662,7 @@ void main() { } )"; - static constexpr auto fragment = LINE_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; @@ -802,7 +804,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LINE_SHADER_COMMON R"( + static constexpr auto prelude = lineShadePrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_pos_normal; layout(location = 1) in uvec4 in_data; @@ -987,7 +990,7 @@ void main() { } )"; - static constexpr auto fragment = LINE_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in lowp vec2 frag_normal; layout(location = 1) in lowp vec2 frag_width2; diff --git a/include/mbgl/shaders/vulkan/location_indicator.hpp b/include/mbgl/shaders/vulkan/location_indicator.hpp index a1181fdc9b2f..f1f3067370a2 100644 --- a/include/mbgl/shaders/vulkan/location_indicator.hpp +++ b/include/mbgl/shaders/vulkan/location_indicator.hpp @@ -6,12 +6,7 @@ namespace mbgl { namespace shaders { -#define LOCATION_INDICATOR_SHADER_PRELUDE \ - R"( - -#define idLocationIndicatorDrawableUBO drawableReservedUBOCount - -)" +constexpr auto locationIndicatorShaderPrelude = R"(#define idLocationIndicatorDrawableUBO drawableReservedUBOCount)"; template <> struct ShaderSource { @@ -21,7 +16,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LOCATION_INDICATOR_SHADER_PRELUDE R"( + static constexpr auto prelude = locationIndicatorShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in vec2 in_position; layout(set = DRAWABLE_UBO_SET_INDEX, binding = idLocationIndicatorDrawableUBO) uniform LocationIndicatorDrawableUBO { @@ -35,7 +31,7 @@ void main() { } )"; - static constexpr auto fragment = LOCATION_INDICATOR_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) out vec4 out_color; layout(set = DRAWABLE_UBO_SET_INDEX, binding = idLocationIndicatorDrawableUBO) uniform LocationIndicatorDrawableUBO { @@ -57,7 +53,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = LOCATION_INDICATOR_SHADER_PRELUDE R"( + static constexpr auto prelude = locationIndicatorShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in vec2 in_position; layout(location = 1) in vec2 in_texcoord; diff --git a/include/mbgl/shaders/vulkan/raster.hpp b/include/mbgl/shaders/vulkan/raster.hpp index 6727ec0dc31d..9affa974eb2f 100644 --- a/include/mbgl/shaders/vulkan/raster.hpp +++ b/include/mbgl/shaders/vulkan/raster.hpp @@ -3,13 +3,12 @@ #include #include -#define RASTER_SHADER_PRELUDE \ - R"( +constexpr auto rasterShaderPrelude = R"( #define idRasterDrawableUBO idDrawableReservedVertexOnlyUBO #define idRasterEvaluatedPropsUBO layerUBOStartId -)" +)"; namespace mbgl { namespace shaders { @@ -22,7 +21,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = RASTER_SHADER_PRELUDE R"( + static constexpr auto prelude = rasterShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec2 in_position; layout(location = 1) in ivec2 in_texture_position; @@ -73,7 +73,7 @@ void main() { } )"; - static constexpr auto fragment = RASTER_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( layout(location = 0) in vec2 frag_position0; layout(location = 1) in vec2 frag_position1; diff --git a/include/mbgl/shaders/vulkan/shader_group.hpp b/include/mbgl/shaders/vulkan/shader_group.hpp index 67d56d9bc3a5..475336502a23 100644 --- a/include/mbgl/shaders/vulkan/shader_group.hpp +++ b/include/mbgl/shaders/vulkan/shader_group.hpp @@ -47,6 +47,7 @@ class ShaderGroup final : public ShaderGroupBase { std::string_view /*firstAttribName*/) override { using ShaderSource = shaders::ShaderSource; constexpr auto& name = ShaderSource::name; + constexpr auto& prelude = ShaderSource::prelude; constexpr auto& vert = ShaderSource::vertex; constexpr auto& frag = ShaderSource::fragment; @@ -60,8 +61,13 @@ class ShaderGroup final : public ShaderGroupBase { DefinesMap additionalDefines; addAdditionalDefines(propertiesAsUniforms, additionalDefines); + const std::string preludeSource(prelude); + const std::string vertexSource = preludeSource + vert; + const std::string fragmentSource = preludeSource + frag; + auto& context = static_cast(gfxContext); - shader = context.createProgram(ShaderID, shaderName, vert, frag, programParameters, additionalDefines); + shader = context.createProgram( + ShaderID, shaderName, vertexSource, fragmentSource, programParameters, additionalDefines); assert(shader); if (!shader || !registerShader(shader, shaderName)) { assert(false); diff --git a/include/mbgl/shaders/vulkan/symbol.hpp b/include/mbgl/shaders/vulkan/symbol.hpp index 09edcf28abcc..75be0c266ca7 100644 --- a/include/mbgl/shaders/vulkan/symbol.hpp +++ b/include/mbgl/shaders/vulkan/symbol.hpp @@ -6,14 +6,13 @@ namespace mbgl { namespace shaders { -#define SYMBOL_SHADER_COMMON \ - R"( +constexpr auto symbolShaderPrelude = R"( #define idSymbolDrawableUBO idDrawableReservedVertexOnlyUBO #define idSymbolTilePropsUBO idDrawableReservedFragmentOnlyUBO #define idSymbolEvaluatedPropsUBO layerUBOStartId -)" +)"; template <> struct ShaderSource { @@ -23,7 +22,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec4 in_pos_offset; layout(location = 1) in uvec4 in_data; @@ -144,7 +144,7 @@ void main() { } )"; - static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_opacity; @@ -210,7 +210,8 @@ struct ShaderSource { static constexpr std::array instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto vertex = R"( layout(location = 0) in ivec4 in_pos_offset; layout(location = 1) in uvec4 in_data; @@ -386,7 +387,7 @@ void main() { } )"; - static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_fade_opacity; @@ -504,7 +505,8 @@ struct ShaderSource instanceAttributes{}; static const std::array textures; - static constexpr auto vertex = SYMBOL_SHADER_COMMON R"( + static constexpr auto prelude = symbolShaderPrelude; + static constexpr auto vertex = R"( #define SDF 1.0 #define ICON 0.0 @@ -687,7 +689,7 @@ void main() { } )"; - static constexpr auto fragment = SYMBOL_SHADER_COMMON R"( + static constexpr auto fragment = R"( layout(location = 0) in mediump vec2 frag_tex; layout(location = 1) in mediump float frag_fade_opacity; diff --git a/include/mbgl/shaders/vulkan/widevector.hpp b/include/mbgl/shaders/vulkan/widevector.hpp index 7f26c1d58ea8..b0e34b7599ca 100644 --- a/include/mbgl/shaders/vulkan/widevector.hpp +++ b/include/mbgl/shaders/vulkan/widevector.hpp @@ -6,13 +6,12 @@ namespace mbgl { namespace shaders { -#define WIDEVECTOR_SHADER_PRELUDE \ - R"( +constexpr auto wideVectorShaderPrelude = R"( #define idWideVectorUniformsUBO idDrawableReservedVertexOnlyUBO #define idWideVectorUniformWideVecUBO drawableReservedUBOCount -)" +)"; template <> struct ShaderSource { @@ -22,7 +21,8 @@ struct ShaderSource { static const std::array instanceAttributes; static const std::array textures; - static constexpr auto vertex = WIDEVECTOR_SHADER_PRELUDE R"( + static constexpr auto prelude = wideVectorShaderPrelude; + static constexpr auto vertex = R"( /** Expressions are used to change values like width and opacity over zoom levels. **/ #define WKSExpStops 8 @@ -58,7 +58,7 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = idWideVectorUniformWideVecUBO) un float offset; float edge; float texRepeat; - vec4 texOffset; + vec2 texOffset; float miterLimit; int join; int cap; @@ -66,6 +66,17 @@ layout(set = DRAWABLE_UBO_SET_INDEX, binding = idWideVectorUniformWideVecUBO) un float interClipLimit; } wideVec; +// Instance info for the wide vector (new) vertex shader +typedef struct +{ + // Center of the point on the line + vec3 center; + // Color + vec4 color; + // Used to track loops and such + int prev,next; // set to -1 for non-loops +} VertexTriWideVecInstance; + struct IntersectInfo { bool valid; vec2 interPt; @@ -110,16 +121,28 @@ IntersectInfo intersectWideLines(vec2 p0,vec2 p1,vec2 p2, vec2 n0,vec2 n1) return intersectLines(p0 + n0, p1 + n0, p1 + n1, p2 + n1); } +// Used to track what info we have about a center point +struct CenterInfo { + /// Screen coordinates of the line segment endpoint + vec2 screenPos; + /// Length of the segment (in screen coordinates) + float len; + /// Normalized direction of the segment + vec2 nDir; + /// Normalized plane normal, perpendicular to the segment + vec2 norm; +}; + vec3 viewPos(const mat4 &mat, vec3 vec) { const vec4 p = mat * vec4(vec, 1.0); return p.xyz; // / p.w; ? } -float2 screenPos_MVP(const Uniforms &u, float3 viewPos) { - const float4 p4 = float4(viewPos, 1.0); +vec2 screenPos_MVP(const Uniforms &u, vec3 viewPos) { + const vec4 p4 = vec4(viewPos, 1.0); // Use the MVP matrix - const float4 s = u.mvpMatrix * p4; + const vec4 s = u.mvpMatrix * p4; return s.xy / s.w; } @@ -156,7 +179,7 @@ void main() { } )"; - static constexpr auto fragment = WIDEVECTOR_SHADER_PRELUDE R"( + static constexpr auto fragment = R"( // TODO )"; }; diff --git a/include/mbgl/style/layers/custom_drawable_layer.hpp b/include/mbgl/style/layers/custom_drawable_layer.hpp index 7ba5481e88f3..ec7c602a71fa 100644 --- a/include/mbgl/style/layers/custom_drawable_layer.hpp +++ b/include/mbgl/style/layers/custom_drawable_layer.hpp @@ -35,17 +35,17 @@ class CustomDrawableLayerHost::Interface { public: enum class LineShaderType { Classic, - MetalWideVector + WideVector }; struct LineOptions { gfx::PolylineGeneratorOptions geometry; + float blur = 0.f; float opacity = 1.f; float gapWidth = 0.f; float offset = 0.f; float width = 1.f; - LineShaderType shaderType = LineShaderType::Classic; Color color; }; @@ -58,12 +58,30 @@ class CustomDrawableLayerHost::Interface { Size size; gfx::Texture2DPtr texture; std::array anchor{0.5f, 0.5f}; - std::array, 2> textureCoordinates{{{0, 0}, {1, 1}}}; float angleDegrees{.0f}; bool scaleWithMap{false}; bool pitchWithMap{false}; }; + struct GeometryVertex { + std::array position; + std::array texcoords; + }; + + struct GeometryOptions { + mat4 matrix = matrix::identity4(); + Color color = Color::white(); + gfx::Texture2DPtr texture; + }; + + template + using TweakerCallback = std::function; + + using LineTweakerCallback = TweakerCallback; + using FillTweakerCallback = TweakerCallback; + using SymbolTweakerCallback = TweakerCallback; + using GeometryTweakerCallback = TweakerCallback; + public: /// @brief Construct a new Interface object (internal core use only) Interface(RenderLayer& layer, @@ -109,37 +127,59 @@ class CustomDrawableLayerHost::Interface { */ void setSymbolOptions(const SymbolOptions& options); + /** + * @brief Set the geometry options + * + * @param options + */ + void setGeometryOptions(const GeometryOptions& options); + + void setLineTweakerCallback(LineTweakerCallback&& callback) { lineTweakerCallback = callback; } + void setFillTweakerCallback(FillTweakerCallback&& callback) { fillTweakerCallback = callback; } + void setSymbolTweakerCallback(SymbolTweakerCallback&& callback) { symbolTweakerCallback = callback; } + void setGeometryTweakerCallback(GeometryTweakerCallback&& callback) { geometryTweakerCallback = callback; } + /** * @brief Add a polyline * * @param coordinates in tile range - * @return true if the polyline was added + * @param shaderType + * @return a valid util::SimpleIdentity if the polyline was added */ - bool addPolyline(const GeometryCoordinates& coordinates); + util::SimpleIdentity addPolyline(const GeometryCoordinates& coordinates, + LineShaderType shaderType = LineShaderType::Classic); /** * @brief Add a polyline * * @param coordinates Geographic coordinates - * @return true if the polyline was added + * @param shaderType + * @return a valid util::SimpleIdentity if the poline was added */ - bool addPolyline(const LineString& coordinates); + util::SimpleIdentity addPolyline(const LineString& coordinates, + LineShaderType shaderType = LineShaderType::Classic); /** * @brief Add a multipolygon area fill * * @param geometry a collection of rings with optional holes - * @return true if the fill was added + * @return a valid util::SimpleIdentity if the fill was added */ - bool addFill(const GeometryCollection& geometry); + util::SimpleIdentity addFill(const GeometryCollection& geometry); /** * @brief Add a symbol * * @param point - * @return true if the symbol was added + * @param textureCoordinates (optional mapping) + * @return a valid util::SimpleIdentity if the symbol was added */ - bool addSymbol(const GeometryCoordinate& point); + util::SimpleIdentity addSymbol(const GeometryCoordinate& point, + const std::array, 2>& textureCoordinates = {{{0, 0}, {1, 1}}}); + + util::SimpleIdentity addGeometry(std::shared_ptr> vertices, + std::shared_ptr> indices, + bool is3D); /** * @brief Finish the current drawable building session @@ -147,6 +187,8 @@ class CustomDrawableLayerHost::Interface { */ void finish(); + void removeDrawable(const util::SimpleIdentity& id); + public: RenderLayer& layer; LayerGroupBasePtr& layerGroup; @@ -162,13 +204,15 @@ class CustomDrawableLayerHost::Interface { gfx::ShaderPtr lineShaderWideVector() const; gfx::ShaderPtr fillShaderDefault() const; gfx::ShaderPtr symbolShaderDefault() const; + gfx::ShaderPtr geometryShaderDefault() const; enum class BuilderType { None, LineClassic, LineWideVector, Fill, - Symbol + Symbol, + Geometry }; std::unique_ptr createBuilder(const std::string& name, gfx::ShaderPtr shader) const; @@ -177,13 +221,15 @@ class CustomDrawableLayerHost::Interface { std::unique_ptr builder; std::optional tileID; - gfx::ShaderPtr lineShader; - gfx::ShaderPtr fillShader; - gfx::ShaderPtr symbolShader; - LineOptions lineOptions; FillOptions fillOptions; SymbolOptions symbolOptions; + GeometryOptions geometryOptions; + + LineTweakerCallback lineTweakerCallback; + FillTweakerCallback fillTweakerCallback; + SymbolTweakerCallback symbolTweakerCallback; + GeometryTweakerCallback geometryTweakerCallback; BuilderType builderType{BuilderType::None}; }; diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index da4a6cd94a12..b9fb8c608fe2 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -43,6 +43,7 @@ class Texture2D; using UniqueShaderProgram = std::unique_ptr; using UniqueVertexBufferResource = std::unique_ptr; +using UniqueUniformBufferArray = std::unique_ptr; class Context final : public gfx::Context { public: @@ -79,6 +80,8 @@ class Context final : public gfx::Context { bool persistent, bool ssbo = false) override; + UniqueUniformBufferArray createLayerUniformBufferArray() override; + gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; TileLayerGroupPtr createTileLayerGroup(int32_t layerIndex, std::size_t initialCapacity, std::string name) override; diff --git a/include/mbgl/vulkan/tile_layer_group.hpp b/include/mbgl/vulkan/tile_layer_group.hpp index 079d3af85cfd..d3bde6e925fe 100644 --- a/include/mbgl/vulkan/tile_layer_group.hpp +++ b/include/mbgl/vulkan/tile_layer_group.hpp @@ -24,8 +24,8 @@ class TileLayerGroup : public mbgl::TileLayerGroup { void upload(gfx::UploadPass&) override; void render(RenderOrchestrator&, PaintParameters&) override; - const gfx::UniformBufferArray& getUniformBuffers() const override { return uniformBuffers; }; - gfx::UniformBufferArray& mutableUniformBuffers() override { return uniformBuffers; }; + const gfx::UniformBufferArray& getUniformBuffers() const override { return uniformBuffers; } + gfx::UniformBufferArray& mutableUniformBuffers() override { return uniformBuffers; } protected: UniformBufferArray uniformBuffers; diff --git a/include/mbgl/vulkan/uniform_buffer.hpp b/include/mbgl/vulkan/uniform_buffer.hpp index d2a1be8d94c7..38c867e4682b 100644 --- a/include/mbgl/vulkan/uniform_buffer.hpp +++ b/include/mbgl/vulkan/uniform_buffer.hpp @@ -66,6 +66,8 @@ class UniformBufferArray final : public gfx::UniformBufferArray { void createOrUpdate( const size_t id, const void* data, std::size_t size, gfx::Context& context, bool persistent = false) override; + void bind(gfx::RenderPass& renderPass) override; + void bindDescriptorSets(CommandEncoder& encoder); void freeDescriptorSets() { descriptorSet.reset(); } diff --git a/platform/darwin/app/ExampleCustomDrawableStyleLayer.mm b/platform/darwin/app/ExampleCustomDrawableStyleLayer.mm index 453566aeb35f..1a9b9a67573c 100644 --- a/platform/darwin/app/ExampleCustomDrawableStyleLayer.mm +++ b/platform/darwin/app/ExampleCustomDrawableStyleLayer.mm @@ -58,12 +58,12 @@ void update(Interface& interface) override { constexpr auto numLines = 6; Interface::LineOptions options[numLines] { - {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, /*shaderType=*/{}, /*color=*/Color::red() }, - {/*geometry=*/{}, /*blur=*/4.0f, /*opacity=*/1.0f, /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, /*shaderType=*/{}, /*color=*/Color::blue() }, - {/*geometry=*/{}, /*blur=*/16.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, /*shaderType=*/{}, /*color=*/Color(1.f, 0.5f, 0, 0.5f) }, - {/*geometry=*/{}, /*blur=*/2.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, /*shaderType=*/{}, /*color=*/Color(1.f, 1.f, 0, 0.3f) }, - {/*geometry=*/{}, /*blur=*/0.5f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, /*shaderType=*/{}, /*color=*/Color::black() }, - {/*geometry=*/{}, /*blur=*/24.0f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, /*shaderType=*/{}, /*color=*/Color(1.f, 0, 1.f, 0.2f) }, + {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, /*color=*/Color::red() }, + {/*geometry=*/{}, /*blur=*/4.0f, /*opacity=*/1.0f, /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, /*color=*/Color::blue() }, + {/*geometry=*/{}, /*blur=*/16.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, /*color=*/Color(1.f, 0.5f, 0, 0.5f) }, + {/*geometry=*/{}, /*blur=*/2.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, /*color=*/Color(1.f, 1.f, 0, 0.3f) }, + {/*geometry=*/{}, /*blur=*/0.5f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, /*color=*/Color::black() }, + {/*geometry=*/{}, /*blur=*/24.0f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, /*color=*/Color(1.f, 0, 1.f, 0.2f) }, }; for(auto& opt: options) { opt.geometry.beginCap = style::LineCapType::Butt; @@ -86,7 +86,7 @@ void update(Interface& interface) override { interface.setLineOptions(options[index]); // add polyline - interface.addPolyline(polyline); + interface.addPolyline(polyline, Interface::LineShaderType::Classic); } } @@ -99,12 +99,12 @@ void update(Interface& interface) override { constexpr auto numLines = 6; Interface::LineOptions options[numLines] { - {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color::red() }, - {/*geometry=*/{}, /*blur=*/4.0f, /*opacity=*/1.0f, /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color::blue() }, - {/*geometry=*/{}, /*blur=*/16.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color(1.f, 0.5f, 0, 0.5f) }, - {/*geometry=*/{}, /*blur=*/2.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color(1.f, 1.f, 0, 0.3f) }, - {/*geometry=*/{}, /*blur=*/0.5f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color::black() }, - {/*geometry=*/{}, /*blur=*/24.0f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/Color(1.f, 0, 1.f, 0.2f) }, + {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, /*color=*/Color::red() }, + {/*geometry=*/{}, /*blur=*/4.0f, /*opacity=*/1.0f, /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, /*color=*/Color::blue() }, + {/*geometry=*/{}, /*blur=*/16.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, /*color=*/Color(1.f, 0.5f, 0, 0.5f) }, + {/*geometry=*/{}, /*blur=*/2.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, /*color=*/Color(1.f, 1.f, 0, 0.3f) }, + {/*geometry=*/{}, /*blur=*/0.5f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, /*color=*/Color::black() }, + {/*geometry=*/{}, /*blur=*/24.0f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, /*color=*/Color(1.f, 0, 1.f, 0.2f) }, }; for(auto& opt: options) { opt.geometry.beginCap = style::LineCapType::Butt; @@ -128,13 +128,13 @@ void update(Interface& interface) override { interface.setLineOptions(options[index]); // add polyline - interface.addPolyline(polyline); + interface.addPolyline(polyline, Interface::LineShaderType::WideVector); // add clone for(auto &p : polyline) { p.y += 0.05f * extent / numLines; } - interface.addPolyline(polyline); + interface.addPolyline(polyline, Interface::LineShaderType::WideVector); for(auto &p : polyline) { p.y -= 0.05f * extent / numLines; } @@ -193,9 +193,9 @@ void update(Interface& interface) override { options.texture = interface.context.createTexture2D(); options.texture->setImage(image); options.texture->setSamplerConfiguration({gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); - options.textureCoordinates = {{{0.0f, 0.08f}, {1.0f, 0.9f}}}; - const float xspan = options.textureCoordinates[1][0] - options.textureCoordinates[0][0]; - const float yspan = options.textureCoordinates[1][1] - options.textureCoordinates[0][1]; + const std::array, 2> textureCoordinates = {{{0.0f, 0.08f}, {1.0f, 0.9f}}}; + const float xspan = textureCoordinates[1][0] - textureCoordinates[0][0]; + const float yspan = textureCoordinates[1][1] - textureCoordinates[0][1]; assert(xspan > 0.0f && yspan > 0.0f); options.size = {static_cast(image->size.width * xspan), static_cast(image->size.height * yspan)}; options.anchor = {0.5f, 0.95f}; @@ -205,7 +205,7 @@ void update(Interface& interface) override { interface.setSymbolOptions(options); // add symbol - interface.addSymbol(position); + interface.addSymbol(position, textureCoordinates); } // add polylines using wide vectors using geographic coordinates @@ -213,7 +213,7 @@ void update(Interface& interface) override { using namespace mbgl; // add polyline with geographic coordinates - Interface::LineOptions options = {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/12.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/{.0f, .0f, .0f, .5f} }; + Interface::LineOptions options = {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/12.0f, /*color=*/{.0f, .0f, .0f, .5f} }; options.geometry.beginCap = style::LineCapType::Square; options.geometry.endCap = style::LineCapType::Square; options.geometry.joinType = style::LineJoinType::Bevel; @@ -235,7 +235,7 @@ void update(Interface& interface) override { // New York {-74.04454331829972, 40.6892168305434}, }; - interface.addPolyline(polyline_geo); + interface.addPolyline(polyline_geo, Interface::LineShaderType::WideVector); } // add polylines using wide vectors in tile coordinates @@ -246,7 +246,7 @@ void update(Interface& interface) override { interface.setTileID({11, 327, 790}); Interface::LineOptions options - {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/7.0f, /*shaderType=*/Interface::LineShaderType::MetalWideVector, /*color=*/{1.0f, 0, 0, .5f} }; + {/*geometry=*/{}, /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/7.0f, /*color=*/{1.0f, 0, 0, .5f} }; options.geometry.beginCap = style::LineCapType::Round; options.geometry.endCap = style::LineCapType::Round; options.geometry.joinType = style::LineJoinType::Round; @@ -271,8 +271,8 @@ void update(Interface& interface) override { options.geometry.type = FeatureType::Polygon; interface.setLineOptions(options); - interface.addPolyline(polyline_tile[0]); - interface.addPolyline(polyline_tile[1]); + interface.addPolyline(polyline_tile[0], Interface::LineShaderType::WideVector); + interface.addPolyline(polyline_tile[1], Interface::LineShaderType::WideVector); } diff --git a/platform/default/src/mbgl/layermanager/layer_manager.cpp b/platform/default/src/mbgl/layermanager/layer_manager.cpp index 982accce96ac..fbbeb429682c 100644 --- a/platform/default/src/mbgl/layermanager/layer_manager.cpp +++ b/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -70,12 +70,9 @@ LayerManagerDefault::LayerManagerDefault() { addLayerType(std::make_unique()); #endif #endif -#if defined(MLN_RENDER_BACKEND_OPENGL) || MLN_RENDER_BACKEND_VULKAN #if !defined(MBGL_LAYER_LOCATION_INDICATOR_DISABLE_ALL) addLayerType(std::make_unique()); #endif -#endif - #if MLN_DRAWABLE_RENDERER #if !defined(MLN_LAYER_CUSTOM_DRAWABLE_DISABLE_ALL) addLayerType(std::make_unique()); diff --git a/platform/glfw/BUILD.bazel b/platform/glfw/BUILD.bazel index e7fb784c0589..8e025fd4433c 100644 --- a/platform/glfw/BUILD.bazel +++ b/platform/glfw/BUILD.bazel @@ -16,13 +16,6 @@ objc_library( ], ) -filegroup( - name = "mapbox_puck_assets", - srcs = glob([ - "assets/*.png", - ]), -) - cc_binary( name = "glfw_app", srcs = glob( @@ -43,11 +36,9 @@ cc_binary( ], }), copts = CPP_FLAGS + MAPLIBRE_FLAGS, - data = [ - ":mapbox_puck_assets", - ], + data = glob(["assets/*"]), defines = [ - r"MAPBOX_PUCK_ASSETS_PATH=\"./platform/glfw/assets/\"", + r"MLN_ASSETS_PATH=\"assets/\"", ], linkopts = [ "-lglfw", @@ -64,6 +55,7 @@ cc_binary( deps = [ "//:maplibre_lib", "@glfw", + "@tinyobjloader", ] + select({ "@platforms//os:macos": ["metal_backend"], "@platforms//os:linux": ["//platform/linux:impl"], diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index 21f044c9d34a..387479b94b08 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -22,11 +22,20 @@ add_executable( ${PROJECT_SOURCE_DIR}/platform/glfw/settings_json.cpp ${PROJECT_SOURCE_DIR}/platform/glfw/test_writer.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/map/map_snapshotter.cpp + ${PROJECT_SOURCE_DIR}/platform/glfw/example_custom_drawable_style_layer.cpp +) + + +include(${PROJECT_SOURCE_DIR}/vendor/tinyobjloader.cmake) + +target_link_libraries( + mbgl-glfw + PRIVATE tinyobjloader ) set_property( SOURCE ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_view.cpp - PROPERTY COMPILE_DEFINITIONS MAPBOX_PUCK_ASSETS_PATH=\"${PROJECT_SOURCE_DIR}/platform/glfw/assets/\" + PROPERTY COMPILE_DEFINITIONS MLN_ASSETS_PATH=\"${PROJECT_SOURCE_DIR}/platform/glfw/assets/\" ) if(MLN_WITH_OPENGL) @@ -87,10 +96,12 @@ target_include_directories( PRIVATE ${PROJECT_SOURCE_DIR}/src ) +include(${PROJECT_SOURCE_DIR}/vendor/tinyobjloader.cmake) + # Use target_link_directories when we move away from CMake 3.10. target_link_libraries( mbgl-glfw - PRIVATE $<$:-L${GLFW_LIBRARY_DIRS}> + PRIVATE $<$:-L${GLFW_LIBRARY_DIRS}> tinyobjloader ) if(WIN32) diff --git a/platform/glfw/assets/sphere.obj b/platform/glfw/assets/sphere.obj new file mode 100644 index 000000000000..d876cd13b741 --- /dev/null +++ b/platform/glfw/assets/sphere.obj @@ -0,0 +1,1851 @@ +#### +# +# OBJ File Generated by Meshlab +# +#### +# Object sphere.obj +# +# Vertices: 362 +# Faces: 720 +# +#### +mtllib ./sphere.obj.mtl + +vn -6.205741 0.000000 0.000000 +v -20.000000 0.000000 0.000003 +vn -6.102607 -0.975688 0.603007 +v -19.660480 -3.121540 1.929214 +vn -6.102607 0.975688 -0.603006 +v -19.660480 3.121540 -1.929208 +vn -6.066922 -1.133715 -0.615069 +v -19.562960 -3.719220 -1.859610 +vn -6.066921 0.043121 1.289095 +v -19.562960 0.000000 4.158220 +vn -6.066921 -0.043121 -1.289095 +v -19.562960 0.000000 -4.158220 +vn -6.066923 1.133714 0.615069 +v -19.562960 3.719220 1.859614 +vn -5.831218 -2.132169 0.027703 +v -18.784100 -6.866620 0.085786 +vn -5.831220 -0.978313 1.894677 +v -18.784100 -3.147580 6.103320 +vn -5.831217 0.978316 -1.894682 +v -18.784100 3.147580 -6.103320 +vn -5.831218 2.132169 -0.027704 +v -18.784100 6.866620 -0.085781 +vn -5.787061 -1.162111 -1.880331 +v -18.683439 -3.751860 -6.070620 +vn -5.787063 1.162107 1.880332 +v -18.683439 3.751860 6.070620 +vn -5.788622 -1.911468 1.181353 +v -18.653400 -6.137100 3.792940 +vn -5.788622 1.911468 -1.181355 +v -18.653400 6.137100 -3.792940 +vn -5.665953 -2.237497 -1.166955 +v -18.270901 -7.275940 -3.637960 +vn -5.665956 0.043120 2.523154 +v -18.270901 0.000000 8.134740 +vn -5.665954 -0.043116 -2.523156 +v -18.270901 0.000000 -8.134740 +vn -5.665953 2.237495 1.166955 +v -18.270901 7.275940 3.637980 +vn -5.377474 -3.043252 0.615451 +v -17.320360 -9.806680 1.958150 +vn -5.377474 -1.911461 2.446727 +v -17.320360 -6.137100 7.895660 +vn -5.377477 1.911459 -2.446728 +v -17.320360 6.137100 -7.895640 +vn -5.377474 3.043252 -0.615450 +v -17.320360 9.806680 -1.958144 +vn -5.291559 -3.208326 -0.513324 +v -17.039619 -10.336121 -1.678082 +vn -5.291550 -0.975674 3.099188 +v -17.039619 -3.121540 9.995380 +vn -5.291561 0.975679 -3.099177 +v -17.039619 3.121540 -9.995359 +vn -5.291553 3.208333 0.513325 +v -17.039619 10.336121 1.678088 +vn -5.284099 -2.778008 1.716898 +v -17.013020 -8.944281 5.527860 +vn -5.284098 2.778005 -1.716901 +v -17.013020 8.944281 -5.527860 +vn -5.269775 -2.237496 -2.386267 +v -16.919821 -7.275940 -7.796180 +vn -5.269774 -1.133705 -3.068446 +v -16.919821 -3.719220 -9.994360 +vn -5.269769 1.133709 3.068451 +v -16.919821 3.719220 9.994360 +vn -5.269765 2.237492 2.386282 +v -16.919821 7.275940 7.796200 +vn -5.020554 -3.262545 -1.631274 +v -16.180340 -10.514621 -5.257300 +vn -5.020547 -0.000003 3.647644 +v -16.180340 0.000000 11.755700 +vn -5.020551 0.000001 -3.647639 +v -16.180340 0.000000 -11.755700 +vn -5.020547 3.262553 1.631270 +v -16.180340 10.514621 5.257320 +vn -4.733833 -3.999146 0.384269 +v -15.247080 -12.884160 1.235034 +vn -4.733829 -2.132165 3.405105 +v -15.247080 -6.866620 10.971621 +vn -4.733835 2.132167 -3.405095 +v -15.247080 6.866620 -10.971621 +vn -4.733832 3.999147 -0.384260 +v -15.247080 12.884160 -1.235030 +vn -4.712213 -3.742752 1.531091 +v -15.163440 -12.074600 4.926900 +vn -4.712214 -3.043260 2.662891 +v -15.163440 -9.806680 8.596479 +vn -4.712215 3.043257 -2.662890 +v -15.163440 9.806680 -8.596479 +vn -4.712214 3.742751 -1.531091 +v -15.163440 12.074600 -4.926900 +vn -4.701271 -2.132166 -3.449915 +v -15.146240 -6.866620 -11.110420 +vn -4.701271 2.132169 3.449924 +v -15.146219 6.866620 11.110420 +vn -4.582682 -3.208333 -2.695006 +v -14.771700 -10.336121 -8.658040 +vn -4.582676 -0.975675 -4.074869 +v -14.771700 -3.121540 -13.116899 +vn -4.582672 0.975681 4.074869 +v -14.771700 3.121540 13.116899 +vn -4.582674 3.208334 2.695017 +v -14.771700 10.336121 8.658040 +vn -4.546713 -4.141646 -0.803292 +v -14.733720 -13.293780 -2.488660 +vn -4.546714 1.133709 -4.063646 +v -14.733720 3.719220 -13.003281 +vn -4.546717 -1.133710 4.063653 +v -14.733700 -3.719220 13.003281 +vn -4.546715 4.141654 0.803293 +v -14.733700 13.293780 2.488660 +vn -4.150531 -4.141654 -2.022615 +v -13.382620 -13.293780 -6.646880 +vn -4.150539 -0.043111 4.608945 +v -13.382620 0.000000 14.862880 +vn -4.150537 0.043119 -4.608949 +v -13.382620 0.000000 -14.862880 +vn -4.150532 4.141650 2.022617 +v -13.382620 13.293780 6.646880 +vn -4.055620 -3.999146 2.471599 +v -13.061080 -12.884160 7.962840 +vn -4.055616 3.999146 -2.471603 +v -13.061080 12.884160 -7.962840 +vn -3.988708 -3.043260 -3.658711 +v -12.861500 -9.806680 -11.764820 +vn -3.988709 -1.911464 -4.358202 +v -12.861500 -6.137100 -14.032741 +vn -3.988713 1.911459 4.358198 +v -12.861500 6.137100 14.032741 +vn -3.988712 3.043259 3.658705 +v -12.861500 9.806680 11.764820 +vn -3.979237 -4.588192 1.292931 +v -12.798981 -14.794980 4.158640 +vn -3.979234 -3.208329 3.525591 +v -12.798981 -10.336121 11.373240 +vn -3.979229 3.208333 -3.525590 +v -12.798981 10.336121 -11.373240 +vn -3.979236 4.588191 -1.292931 +v -12.798981 14.794980 -4.158640 +vn -3.897928 -4.823828 0.089688 +v -12.643120 -15.491940 0.388778 +vn -3.897935 -2.237500 4.274450 +v -12.643120 -7.275940 13.682539 +vn -3.897929 2.237500 -4.274455 +v -12.643120 7.275940 -13.682539 +vn -3.897932 4.823824 -0.089683 +v -12.643120 15.491940 -0.388774 +vn -3.603886 -3.999147 -3.093352 +v -11.609221 -12.884160 -9.961160 +vn -3.603896 -0.978311 -4.960329 +v -11.609221 -3.147580 -15.978700 +vn -3.603892 0.978312 4.960337 +v -11.609200 3.147580 15.978700 +vn -3.603884 3.999150 3.093360 +v -11.609200 12.884160 9.961160 +vn -3.576594 -4.922777 -1.162109 +v -11.547001 -15.893080 -3.751840 +vn -3.576597 -1.162109 4.922763 +v -11.547001 -3.751860 15.893101 +vn -3.576598 1.162111 -4.922771 +v -11.547001 3.751860 -15.893080 +vn -3.576598 4.922772 1.162108 +v -11.547001 15.893080 3.751860 +vn -3.265750 -2.778012 -4.494916 +v -10.514621 -8.944281 -14.472140 +vn -3.265750 2.778012 4.494916 +v -10.514621 8.944281 14.472140 +vn -3.206206 -4.823825 2.218588 +v -10.457020 -15.491940 7.116920 +vn -3.206207 -4.141645 3.322369 +v -10.457020 -13.293780 10.673639 +vn -3.206215 4.141646 -3.322370 +v -10.457020 13.293780 -10.673619 +vn -3.206212 4.823822 -2.218587 +v -10.457020 15.491940 -7.116920 +vn -3.102865 -5.278914 1.008183 +v -10.000000 -17.013020 3.249200 +vn -3.102872 -3.262539 4.270739 +v -10.000000 -10.514621 13.763820 +vn -3.102872 3.262543 -4.270734 +v -10.000000 10.514621 -13.763820 +vn -3.102865 5.278914 -1.008183 +v -10.000000 17.013020 -3.249200 +vn -3.100777 -4.823829 -2.363698 +v -9.999980 -15.491940 -7.745960 +vn -3.100783 -0.043106 5.371634 +v -9.999980 0.000000 17.320520 +vn -3.100778 0.043124 -5.371637 +v -9.999980 0.000000 -17.320520 +vn -3.100774 4.823819 2.363712 +v -9.999980 15.491940 7.745980 +vn -2.912313 -3.742750 -4.008451 +v -9.371520 -12.074600 -12.898780 +vn -2.912314 -1.911463 -5.140248 +v -9.371520 -6.137100 -16.568359 +vn -2.912310 1.911454 5.140251 +v -9.371520 6.137100 16.568359 +vn -2.912309 3.742757 4.008443 +v -9.371520 12.074600 12.898780 +vn -2.860714 -5.497847 -0.247332 +v -9.105940 -17.790541 -0.760526 +vn -2.860710 -2.237500 5.028033 +v -9.105940 -7.275940 16.252460 +vn -2.860715 2.237494 -5.028032 +v -9.105940 7.275940 -16.252460 +vn -2.860714 5.497847 0.247331 +v -9.105940 17.790541 0.760528 +vn -2.459307 -4.588188 -3.384936 +v -7.910220 -14.794980 -10.887460 +vn -2.459298 -0.975682 -5.617589 +v -7.910220 -3.121540 -18.102060 +vn -2.459301 0.975697 5.617588 +v -7.910200 3.121540 18.102060 +vn -2.459302 4.588187 3.384946 +v -7.910200 14.794980 10.887460 +vn -2.459745 -5.497846 -1.481394 +v -7.813880 -17.790541 -4.737060 +vn -2.459738 -1.133721 5.579926 +v -7.813880 -3.719220 18.030819 +vn -2.459745 1.133713 -5.579923 +v -7.813880 3.719220 -18.030819 +vn -2.459742 5.497849 1.481392 +v -7.813880 17.790541 4.737060 +vn -2.247059 -3.043255 -4.924094 +v -7.214600 -9.806680 -15.867539 +vn -2.247056 3.043255 4.924094 +v -7.214600 9.806680 15.867539 +vn -2.210456 -4.922780 3.042432 +v -7.136440 -15.893080 9.822460 +vn -2.210456 4.922773 -3.042428 +v -7.136440 15.893101 -9.822460 +vn -2.168987 -5.497849 1.881584 +v -6.919820 -17.790541 5.967620 +vn -2.168983 -4.141646 4.075955 +v -6.919820 -13.293780 13.243560 +vn -2.168988 4.141642 -4.075958 +v -6.919820 13.293780 -13.243560 +vn -2.168987 5.497852 -1.881576 +v -6.919820 17.790541 -5.967620 +vn -2.123378 -5.794199 0.689931 +v -6.861480 -18.653400 2.229440 +vn -2.123379 -3.208327 4.873949 +v -6.861480 -10.336121 15.687079 +vn -2.123379 3.208327 -4.873949 +v -6.861480 10.336121 -15.687079 +vn -2.123378 5.794199 -0.689931 +v -6.861480 18.653400 -2.229440 +vn -1.917679 -5.278916 -2.639454 +v -6.180340 -17.013020 -8.506500 +vn -1.917677 0.000003 5.902004 +v -6.180340 0.000000 19.021141 +vn -1.917681 0.000000 -5.902011 +v -6.180340 0.000000 -19.021120 +vn -1.917676 5.278914 2.639459 +v -6.180340 17.013020 8.506500 +vn -1.828302 -3.999146 -4.383397 +v -5.886200 -12.884160 -14.119181 +vn -1.828295 -2.132165 -5.537262 +v -5.886200 -6.866620 -17.838219 +vn -1.828292 2.132160 5.537266 +v -5.886180 6.866620 17.838219 +vn -1.828299 3.999151 4.383395 +v -5.886180 12.884160 14.119181 +vn -1.775610 -5.921519 -0.576930 +v -5.723020 -19.073259 -1.859520 +vn -1.775602 -2.132165 5.554380 +v -5.723020 -6.866620 17.891239 +vn -1.775602 2.132168 -5.554380 +v -5.723020 6.866620 -17.891239 +vn -1.775610 5.921519 0.576930 +v -5.723020 19.073259 1.859522 +vn -1.289836 -4.823826 -3.679434 +v -4.276700 -15.491940 -11.904181 +vn -1.289831 -1.133712 -5.960054 +v -4.276700 -3.719220 -19.180120 +vn -1.289828 1.133722 5.960055 +v -4.276680 3.719220 19.180120 +vn -1.289829 4.823826 3.679436 +v -4.276680 15.491940 11.904181 +vn -1.312324 -5.794198 -1.806254 +v -4.240640 -18.653400 -5.836720 +vn -1.312322 0.975686 -5.990263 +v -4.240640 3.121540 -19.294380 +vn -1.312324 5.794198 1.806254 +v -4.240640 18.653400 5.836720 +vn -1.312312 -0.975697 5.990266 +v -4.240620 -3.121540 19.294380 +vn -1.146988 -3.208326 -5.191195 +v -3.669580 -10.336121 -16.724201 +vn -1.146991 3.208326 5.191194 +v -3.669580 10.336121 16.724201 +vn -1.119240 -5.497846 2.644273 +v -3.537200 -17.790541 8.425240 +vn -1.119236 -4.823829 3.734861 +v -3.537200 -15.491940 12.144460 +vn -1.119230 4.823828 -3.734865 +v -3.537200 15.491940 -12.144460 +vn -1.119233 5.497850 -2.644270 +v -3.537200 17.790541 -8.425240 +vn -1.097389 -5.921518 1.510425 +v -3.537020 -19.073259 4.868300 +vn -1.097379 -3.999141 4.620892 +v -3.537020 -12.884160 14.882480 +vn -1.097379 3.999141 -4.620892 +v -3.537020 12.884160 -14.882480 +vn -1.097388 5.921518 -1.510425 +v -3.537020 19.073259 -4.868300 +vn -1.076410 -6.105439 0.349746 +v -3.489980 -19.660480 1.133962 +vn -1.076405 -3.043250 5.304465 +v -3.489980 -9.806680 17.077740 +vn -1.076405 3.043250 -5.304465 +v -3.489980 9.806680 -17.077740 +vn -1.076410 6.105439 -0.349746 +v -3.489980 19.660480 -1.133962 +vn -0.641046 -4.141644 -4.572416 +v -2.186100 -13.293780 -14.781639 +vn -0.641045 -2.237492 -5.749249 +v -2.186100 -7.275940 -18.500860 +vn -0.641048 2.237491 5.749248 +v -2.186100 7.275940 18.500860 +vn -0.641046 4.141648 4.572411 +v -2.186100 13.293780 14.781639 +vn -0.665257 -6.105438 -0.915650 +v -2.156920 -19.660480 -2.968760 +vn -0.665248 -1.911462 5.870365 +v -2.156920 -6.137100 18.912521 +vn -0.665246 1.911463 -5.870364 +v -2.156920 6.137100 -18.912521 +vn -0.665257 6.105438 0.915650 +v -2.156920 19.660480 2.968760 +vn -0.648790 -5.497851 -2.797124 +v -2.090580 -17.790541 -8.895280 +vn -0.648783 0.043113 6.168337 +v -2.090580 0.000000 19.890440 +vn -0.648790 -0.043113 -6.168336 +v -2.090580 0.000000 -19.890440 +vn -0.648786 5.497847 2.797131 +v -2.090580 17.790541 8.895280 +vn -0.000000 -3.262544 -5.278922 +v -0.000002 -10.514621 -17.013020 +vn 0.000001 -1.162108 -6.084874 +v -0.000001 -3.751860 -19.644939 +vn 0.000001 -4.922774 -3.760647 +v -0.000001 -15.893101 -12.141239 +vn -0.000000 0.978324 -6.131309 +v -0.000001 3.147580 -19.750759 +vn -0.000000 -5.921519 -1.866988 +v -0.000001 -19.073259 -6.017540 +vn -0.000000 -6.211829 0.000001 +v 0.000000 -20.000000 0.000000 +vn 0.000000 2.778005 -5.556029 +v 0.000000 8.944281 -17.888540 +vn -0.000000 3.742743 -4.954723 +v 0.000000 12.074600 -15.943780 +vn -0.000000 4.588188 -4.184014 +v 0.000000 14.794980 -13.457660 +vn -0.000000 5.278917 -3.262545 +v 0.000000 17.013020 -10.514621 +vn -0.000000 5.794196 -2.232656 +v 0.000000 18.653400 -7.214600 +vn -0.000000 6.105440 -1.131802 +v 0.000000 19.660480 -3.669580 +vn 0.000000 6.211829 -0.000001 +v 0.000000 20.000000 0.000000 +vn 0.000000 -6.105439 1.131802 +v 0.000000 -19.660480 3.669580 +vn 0.000000 5.921519 1.866987 +v 0.000001 19.073259 6.017540 +vn 0.000000 -5.794197 2.232656 +v 0.000001 -18.653400 7.214600 +vn 0.000000 -5.278917 3.262545 +v 0.000001 -17.013020 10.514621 +vn 0.000000 4.922778 3.760653 +v 0.000001 15.893080 12.141239 +vn 0.000000 -4.588188 4.184014 +v 0.000001 -14.794980 13.457660 +vn 0.000000 -3.742743 4.954723 +v 0.000001 -12.074600 15.943780 +vn 0.000000 3.262544 5.278922 +v 0.000002 10.514621 17.013020 +vn 0.000000 -2.778005 5.556029 +v 0.000002 -8.944281 17.888540 +vn -0.000001 1.162109 6.084874 +v 0.000002 3.751860 19.644939 +vn -0.000001 -0.978324 6.131309 +v 0.000002 -3.147580 19.750759 +vn 0.648790 -5.497850 -2.797125 +v 2.090580 -17.790541 -8.895280 +vn 0.648790 0.043113 6.168336 +v 2.090580 0.000000 19.890440 +vn 0.648782 -0.043114 -6.168337 +v 2.090580 0.000000 -19.890440 +vn 0.648786 5.497846 2.797131 +v 2.090580 17.790541 8.895280 +vn 0.665257 -6.105438 -0.915650 +v 2.156920 -19.660480 -2.968760 +vn 0.665246 -1.911463 5.870364 +v 2.156920 -6.137100 18.912521 +vn 0.665246 1.911463 -5.870364 +v 2.156920 6.137100 -18.912521 +vn 0.665257 6.105439 0.915650 +v 2.156920 19.660480 2.968760 +vn 0.641049 -4.141644 -4.572415 +v 2.186100 -13.293780 -14.781639 +vn 0.641048 -2.237491 -5.749248 +v 2.186100 -7.275940 -18.500860 +vn 0.641045 2.237492 5.749248 +v 2.186100 7.275940 18.500860 +vn 0.641043 4.141648 4.572411 +v 2.186100 13.293780 14.781639 +vn 1.076410 -6.105439 0.349746 +v 3.489980 -19.660480 1.133962 +vn 1.076406 -3.043250 5.304465 +v 3.489980 -9.806680 17.077740 +vn 1.076406 3.043250 -5.304465 +v 3.489980 9.806680 -17.077740 +vn 1.076410 6.105439 -0.349746 +v 3.489980 19.660480 -1.133962 +vn 1.097389 -5.921517 1.510426 +v 3.537020 -19.073259 4.868300 +vn 1.097379 -3.999141 4.620892 +v 3.537020 -12.884160 14.882480 +vn 1.097379 3.999141 -4.620892 +v 3.537020 12.884160 -14.882480 +vn 1.097389 5.921517 -1.510425 +v 3.537020 19.073259 -4.868300 +vn 1.119240 -5.497847 2.644273 +v 3.537200 -17.790541 8.425240 +vn 1.119236 -4.823828 3.734861 +v 3.537200 -15.491940 12.144460 +vn 1.119236 4.823828 -3.734861 +v 3.537200 15.491940 -12.144460 +vn 1.119240 5.497846 -2.644273 +v 3.537200 17.790541 -8.425240 +vn 1.146991 -3.208326 -5.191194 +v 3.669580 -10.336121 -16.724201 +vn 1.146989 3.208326 5.191195 +v 3.669580 10.336121 16.724201 +vn 1.312324 -5.794198 -1.806254 +v 4.240640 -18.653400 -5.836720 +vn 1.312322 -0.975686 5.990263 +v 4.240640 -3.121540 19.294380 +vn 1.312315 0.975697 -5.990263 +v 4.240640 3.121540 -19.294380 +vn 1.312324 5.794198 1.806254 +v 4.240640 18.653400 5.836720 +vn 1.289837 -4.823825 -3.679435 +v 4.276680 -15.491940 -11.904181 +vn 1.289828 -1.133722 -5.960055 +v 4.276680 -3.719220 -19.180120 +vn 1.289827 4.823828 3.679435 +v 4.276680 15.491940 11.904181 +vn 1.289831 1.133712 5.960054 +v 4.276700 3.719220 19.180120 +vn 1.775610 -5.921519 -0.576930 +v 5.723020 -19.073259 -1.859522 +vn 1.775602 -2.132168 5.554380 +v 5.723020 -6.866620 17.891239 +vn 1.775602 2.132168 -5.554380 +v 5.723020 6.866620 -17.891239 +vn 1.775610 5.921520 0.576930 +v 5.723020 19.073259 1.859522 +vn 1.828299 -3.999151 -4.383395 +v 5.886180 -12.884160 -14.119181 +vn 1.828292 -2.132160 -5.537266 +v 5.886180 -6.866620 -17.838219 +vn 1.828295 2.132165 5.537262 +v 5.886200 6.866620 17.838219 +vn 1.828302 3.999149 4.383393 +v 5.886200 12.884160 14.119181 +vn 1.917680 -5.278913 -2.639458 +v 6.180340 -17.013020 -8.506500 +vn 1.917681 -0.000000 5.902011 +v 6.180340 0.000000 19.021120 +vn 1.917678 -0.000005 -5.902003 +v 6.180340 0.000000 -19.021141 +vn 1.917680 5.278913 2.639458 +v 6.180340 17.013020 8.506500 +vn 2.123378 -5.794199 0.689931 +v 6.861480 -18.653400 2.229440 +vn 2.123379 -3.208327 4.873949 +v 6.861480 -10.336121 15.687079 +vn 2.123379 3.208327 -4.873949 +v 6.861480 10.336121 -15.687079 +vn 2.123378 5.794199 -0.689931 +v 6.861480 18.653400 -2.229440 +vn 2.168987 -5.497849 1.881584 +v 6.919820 -17.790541 5.967620 +vn 2.168988 -4.141646 4.075952 +v 6.919820 -13.293780 13.243560 +vn 2.168983 4.141646 -4.075955 +v 6.919820 13.293780 -13.243560 +vn 2.168987 5.497849 -1.881584 +v 6.919820 17.790541 -5.967620 +vn 2.210459 -4.922777 3.042433 +v 7.136440 -15.893080 9.822460 +vn 2.210456 4.922780 -3.042432 +v 7.136440 15.893080 -9.822460 +vn 2.247056 -3.043255 -4.924094 +v 7.214600 -9.806680 -15.867539 +vn 2.247059 3.043255 4.924094 +v 7.214600 9.806680 15.867539 +vn 2.459745 -5.497846 -1.481394 +v 7.813880 -17.790541 -4.737060 +vn 2.459745 -1.133713 5.579923 +v 7.813880 -3.719220 18.030819 +vn 2.459748 1.133721 -5.579921 +v 7.813880 3.719220 -18.030819 +vn 2.459746 5.497846 1.481394 +v 7.813880 17.790541 4.737060 +vn 2.459304 -4.588189 -3.384941 +v 7.910200 -14.794980 -10.887460 +vn 2.459301 -0.975697 -5.617588 +v 7.910200 -3.121540 -18.102060 +vn 2.459306 4.588190 3.384939 +v 7.910200 14.794980 10.887460 +vn 2.459298 0.975682 5.617588 +v 7.910220 3.121540 18.102060 +vn 2.860714 -5.497846 -0.247332 +v 9.105940 -17.790541 -0.760528 +vn 2.860714 -2.237494 5.028032 +v 9.105940 -7.275940 16.252460 +vn 2.860714 2.237494 -5.028032 +v 9.105940 7.275940 -16.252460 +vn 2.860714 5.497846 0.247332 +v 9.105940 17.790541 0.760526 +vn 2.912310 -3.742757 -4.008443 +v 9.371520 -12.074600 -12.898780 +vn 2.912311 -1.911454 -5.140251 +v 9.371520 -6.137100 -16.568359 +vn 2.912314 1.911463 5.140248 +v 9.371520 6.137100 16.568359 +vn 2.912314 3.742756 4.008442 +v 9.371520 12.074600 12.898780 +vn 3.100777 -4.823822 -2.363706 +v 9.999980 -15.491940 -7.745960 +vn 3.100778 -0.043124 5.371636 +v 9.999980 0.000000 17.320520 +vn 3.100786 0.043113 -5.371632 +v 9.999980 0.000000 -17.320520 +vn 3.100777 4.823822 2.363706 +v 9.999980 15.491940 7.745960 +vn 3.102865 -5.278914 1.008183 +v 10.000000 -17.013020 3.249200 +vn 3.102872 -3.262543 4.270734 +v 10.000000 -10.514621 13.763820 +vn 3.102872 3.262539 -4.270739 +v 10.000000 10.514621 -13.763820 +vn 3.102865 5.278914 -1.008183 +v 10.000000 17.013020 -3.249200 +vn 3.206206 -4.823822 2.218591 +v 10.457020 -15.491940 7.116920 +vn 3.206209 -4.141650 3.322369 +v 10.457020 -13.293780 10.673619 +vn 3.206207 4.141645 -3.322369 +v 10.457020 13.293780 -10.673639 +vn 3.206206 4.823825 -2.218588 +v 10.457020 15.491940 -7.116920 +vn 3.265750 -2.778012 -4.494917 +v 10.514621 -8.944281 -14.472140 +vn 3.265750 2.778012 4.494917 +v 10.514621 8.944281 14.472140 +vn 3.576598 -4.922773 -1.162107 +v 11.547001 -15.893080 -3.751840 +vn 3.576598 -1.162111 4.922771 +v 11.547001 -3.751860 15.893080 +vn 3.576598 1.162111 -4.922771 +v 11.547001 3.751860 -15.893080 +vn 3.576594 4.922777 1.162109 +v 11.547001 15.893080 3.751840 +vn 3.603882 -3.999153 -3.093357 +v 11.609200 -12.884160 -9.961160 +vn 3.603892 -0.978311 -4.960337 +v 11.609200 -3.147580 -15.978700 +vn 3.603882 3.999153 3.093357 +v 11.609200 12.884160 9.961160 +vn 3.603896 0.978311 4.960329 +v 11.609221 3.147580 15.978700 +vn 3.897932 -4.823824 0.089683 +v 12.643120 -15.491940 0.388776 +vn 3.897929 -2.237500 4.274455 +v 12.643120 -7.275940 13.682539 +vn 3.897929 2.237500 -4.274455 +v 12.643120 7.275940 -13.682539 +vn 3.897928 4.823828 -0.089688 +v 12.643120 15.491940 -0.388778 +vn 3.979237 -4.588191 1.292931 +v 12.798981 -14.794980 4.158640 +vn 3.979229 -3.208333 3.525590 +v 12.798981 -10.336121 11.373240 +vn 3.979234 3.208329 -3.525591 +v 12.798981 10.336121 -11.373240 +vn 3.979236 4.588192 -1.292931 +v 12.798981 14.794980 -4.158640 +vn 3.988712 -3.043259 -3.658705 +v 12.861500 -9.806680 -11.764820 +vn 3.988713 -1.911459 -4.358198 +v 12.861500 -6.137100 -14.032741 +vn 3.988709 1.911464 4.358202 +v 12.861500 6.137100 14.032741 +vn 3.988707 3.043265 3.658707 +v 12.861500 9.806680 11.764820 +vn 4.055616 -3.999147 2.471603 +v 13.061080 -12.884160 7.962840 +vn 4.055620 3.999146 -2.471599 +v 13.061080 12.884160 -7.962840 +vn 4.150528 -4.141654 -2.022616 +v 13.382620 -13.293780 -6.646880 +vn 4.150537 -0.043119 4.608949 +v 13.382620 0.000000 14.862880 +vn 4.150534 0.043112 -4.608950 +v 13.382620 0.000000 -14.862880 +vn 4.150528 4.141652 2.022621 +v 13.382620 13.293780 6.646880 +vn 4.546714 -4.141654 -0.803294 +v 14.733700 -13.293780 -2.488660 +vn 4.546714 -1.133709 4.063646 +v 14.733720 -3.719220 13.003281 +vn 4.546710 1.133709 -4.063651 +v 14.733720 3.719220 -13.003281 +vn 4.546713 4.141646 0.803292 +v 14.733720 13.293780 2.488660 +vn 4.582676 -3.208331 -2.695015 +v 14.771700 -10.336121 -8.658040 +vn 4.582672 -0.975681 -4.074869 +v 14.771700 -3.121540 -13.116899 +vn 4.582676 0.975675 4.074869 +v 14.771700 3.121540 13.116899 +vn 4.582677 3.208337 2.695007 +v 14.771700 10.336121 8.658040 +vn 4.701273 -2.132169 -3.449920 +v 15.146219 -6.866620 -11.110420 +vn 4.701271 2.132166 3.449915 +v 15.146240 6.866620 11.110420 +vn 4.712214 -3.742751 1.531091 +v 15.163440 -12.074600 4.926900 +vn 4.712215 -3.043257 2.662890 +v 15.163440 -9.806680 8.596479 +vn 4.712215 3.043257 -2.662890 +v 15.163440 9.806680 -8.596479 +vn 4.712214 3.742752 -1.531091 +v 15.163440 12.074600 -4.926900 +vn 4.733832 -3.999147 0.384260 +v 15.247080 -12.884160 1.235030 +vn 4.733835 -2.132167 3.405095 +v 15.247080 -6.866620 10.971621 +vn 4.733833 2.132171 -3.405096 +v 15.247080 6.866620 -10.971621 +vn 4.733833 3.999146 -0.384269 +v 15.247080 12.884160 -1.235032 +vn 5.020549 -3.262548 -1.631272 +v 16.180340 -10.514621 -5.257320 +vn 5.020551 -0.000001 3.647639 +v 16.180340 0.000000 11.755700 +vn 5.020550 -0.000004 -3.647642 +v 16.180340 0.000000 -11.755700 +vn 5.020554 3.262545 1.631274 +v 16.180340 10.514621 5.257300 +vn 5.269771 -2.237493 -2.386276 +v 16.919821 -7.275940 -7.796180 +vn 5.269769 -1.133713 -3.068449 +v 16.919821 -3.719220 -9.994360 +vn 5.269774 1.133705 3.068446 +v 16.919821 3.719220 9.994360 +vn 5.269775 2.237495 2.386266 +v 16.919821 7.275940 7.796180 +vn 5.284098 -2.778005 1.716901 +v 17.013020 -8.944281 5.527860 +vn 5.284098 2.778004 -1.716901 +v 17.013020 8.944281 -5.527860 +vn 5.291554 -3.208332 -0.513326 +v 17.039619 -10.336121 -1.678086 +vn 5.291560 -0.975679 3.099177 +v 17.039619 -3.121540 9.995359 +vn 5.291556 0.975677 -3.099179 +v 17.039619 3.121540 -9.995380 +vn 5.291559 3.208326 0.513325 +v 17.039619 10.336121 1.678084 +vn 5.377473 -3.043252 0.615450 +v 17.320360 -9.806680 1.958146 +vn 5.377477 -1.911459 2.446728 +v 17.320360 -6.137100 7.895640 +vn 5.377478 1.911463 -2.446725 +v 17.320360 6.137100 -7.895640 +vn 5.377474 3.043252 -0.615451 +v 17.320360 9.806680 -1.958148 +vn 5.665954 -2.237496 -1.166954 +v 18.270901 -7.275940 -3.637960 +vn 5.665954 0.043116 2.523156 +v 18.270901 0.000000 8.134740 +vn 5.665956 -0.043120 -2.523154 +v 18.270901 0.000000 -8.134740 +vn 5.665953 2.237498 1.166955 +v 18.270901 7.275940 3.637960 +vn 5.788622 -1.911468 1.181355 +v 18.653400 -6.137100 3.792940 +vn 5.788622 1.911468 -1.181355 +v 18.653400 6.137100 -3.792940 +vn 5.787062 -1.162111 -1.880332 +v 18.683439 -3.751860 -6.070620 +vn 5.787062 1.162111 1.880332 +v 18.683439 3.751860 6.070620 +vn 5.831218 -2.132169 0.027703 +v 18.784100 -6.866620 0.085783 +vn 5.831217 -0.978316 1.894682 +v 18.784100 -3.147580 6.103320 +vn 5.831219 0.978316 -1.894679 +v 18.784100 3.147580 -6.103320 +vn 5.831218 2.132169 -0.027703 +v 18.784100 6.866620 -0.085784 +vn 6.066922 -1.133715 -0.615069 +v 19.562960 -3.719220 -1.859612 +vn 6.066921 0.043121 1.289095 +v 19.562960 0.000000 4.158220 +vn 6.066921 -0.043121 -1.289095 +v 19.562960 0.000000 -4.158220 +vn 6.066922 1.133715 0.615069 +v 19.562960 3.719220 1.859612 +vn 6.102607 -0.975688 0.603006 +v 19.660480 -3.121540 1.929210 +vn 6.102607 0.975688 -0.603007 +v 19.660480 3.121540 -1.929212 +vn 6.205740 -0.000000 -0.000000 +v 20.000000 0.000000 -0.000001 +# 362 vertices, 0 vertices normals + + +usemtl material_0 +vt 0.750000 0.941264 +vt 0.650000 1.000000 +vt 0.550000 0.941264 +f 181/1/181 182/2/182 209/3/209 +vt 0.650000 0.902721 +vt 0.550000 0.882528 +f 213/4/213 209/3/209 243/5/243 +vt 0.750000 0.882528 +f 181/1/181 213/4/213 180/6/180 +f 181/1/181 209/3/209 213/4/213 +vt 0.613262 0.848966 +vt 0.550000 0.823792 +f 247/7/247 243/5/243 275/8/275 +vt 0.686738 0.848966 +f 217/9/217 213/4/213 247/7/247 +vt 0.750000 0.823792 +f 180/6/180 217/9/217 179/10/179 +f 213/4/213 243/5/243 247/7/247 +f 180/6/180 213/4/213 217/9/217 +vt 0.595108 0.782047 +vt 0.550000 0.765056 +f 279/11/279 275/8/275 297/12/297 +vt 0.650000 0.792348 +f 249/13/249 247/7/247 279/11/279 +vt 0.704892 0.782047 +f 217/9/217 249/13/249 216/14/216 +vt 0.750000 0.765056 +f 179/10/179 216/14/216 178/15/178 +f 247/7/247 275/8/275 279/11/279 +f 217/9/217 247/7/247 249/13/249 +f 179/10/179 217/9/217 216/14/216 +vt 0.587136 0.722813 +vt 0.550000 0.706319 +f 303/16/303 297/12/297 321/17/321 +vt 0.626631 0.731436 +f 278/18/278 279/11/279 303/16/303 +vt 0.673369 0.731436 +f 246/19/246 249/13/249 278/18/278 +vt 0.712864 0.722813 +f 216/14/216 246/19/246 212/20/212 +vt 0.750000 0.706319 +f 178/15/178 212/20/212 177/21/177 +f 279/11/279 297/12/297 303/16/303 +f 249/13/249 279/11/279 278/18/278 +f 216/14/216 249/13/249 246/19/246 +f 178/15/178 216/14/216 212/20/212 +vt 0.582083 0.663125 +vt 0.550000 0.647584 +f 320/22/320 321/17/321 335/23/335 +vt 0.615623 0.672879 +f 296/24/296 303/16/303 320/22/320 +vt 0.650000 0.676208 +f 274/25/274 278/18/278 296/24/296 +vt 0.684377 0.672879 +f 246/19/246 274/25/274 242/26/242 +vt 0.717917 0.663125 +f 212/20/212 242/26/242 208/27/208 +vt 0.750000 0.647584 +f 177/21/177 208/27/208 176/28/176 +f 303/16/303 321/17/321 320/22/320 +f 278/18/278 303/16/303 296/24/296 +f 246/19/246 278/18/278 274/25/274 +f 212/20/212 246/19/246 242/26/242 +f 177/21/177 212/20/212 208/27/208 +vt 0.450000 1.000000 +vt 0.350000 0.941264 +f 209/3/209 182/29/182 201/30/201 +vt 0.450000 0.902721 +vt 0.350000 0.882528 +f 231/31/231 201/30/201 223/32/223 +f 209/3/209 231/31/231 243/5/243 +f 209/3/209 201/30/201 231/31/231 +vt 0.413262 0.848966 +vt 0.350000 0.823792 +f 255/33/255 223/32/223 239/34/239 +vt 0.486738 0.848966 +f 263/35/263 231/31/231 255/33/255 +f 243/5/243 263/35/263 275/8/275 +f 231/31/231 223/32/223 255/33/255 +f 243/5/243 231/31/231 263/35/263 +vt 0.395108 0.782047 +vt 0.350000 0.765056 +f 271/36/271 239/34/239 258/37/258 +vt 0.450000 0.792348 +f 285/38/285 255/33/255 271/36/271 +vt 0.504893 0.782047 +f 263/35/263 285/38/285 293/39/293 +f 275/8/275 293/39/293 297/12/297 +f 255/33/255 239/34/239 271/36/271 +f 263/35/263 255/33/255 285/38/285 +f 275/8/275 263/35/263 293/39/293 +vt 0.387136 0.722813 +vt 0.350000 0.706320 +f 288/40/288 258/37/258 267/41/267 +vt 0.426631 0.731436 +f 307/42/307 271/36/271 288/40/288 +vt 0.473369 0.731436 +f 311/43/311 285/38/285 307/42/307 +vt 0.512864 0.722813 +f 293/39/293 311/43/311 325/44/325 +f 297/12/297 325/44/325 321/17/321 +f 271/36/271 258/37/258 288/40/288 +f 285/38/285 271/36/271 307/42/307 +f 293/39/293 285/38/285 311/43/311 +f 297/12/297 293/39/293 325/44/325 +vt 0.382083 0.663125 +vt 0.350000 0.647584 +f 301/45/301 267/41/267 281/46/281 +vt 0.415623 0.672879 +f 315/47/315 288/40/288 301/45/301 +vt 0.450000 0.676208 +f 329/48/329 307/42/307 315/47/315 +vt 0.484377 0.672879 +f 311/43/311 329/48/329 339/49/339 +vt 0.517917 0.663125 +f 325/44/325 339/49/339 343/50/343 +f 321/17/321 343/50/343 335/23/335 +f 288/40/288 267/41/267 301/45/301 +f 307/42/307 288/40/288 315/47/315 +f 311/43/311 307/42/307 329/48/329 +f 325/44/325 311/43/311 339/49/339 +f 321/17/321 325/44/325 343/50/343 +vt 0.250000 1.000000 +vt 0.150000 0.941264 +f 201/30/201 182/51/182 165/52/165 +vt 0.250000 0.902721 +vt 0.150000 0.882528 +f 184/53/184 165/52/165 142/54/142 +f 201/30/201 184/53/184 223/32/223 +f 201/30/201 165/52/165 184/53/184 +vt 0.213262 0.848966 +vt 0.150000 0.823792 +f 169/55/169 142/54/142 127/56/127 +vt 0.286738 0.848966 +f 197/57/197 184/53/184 169/55/169 +f 223/32/223 197/57/197 239/34/239 +f 184/53/184 142/54/142 169/55/169 +f 223/32/223 184/53/184 197/57/197 +vt 0.195108 0.782047 +vt 0.150000 0.765056 +f 139/58/139 127/56/127 107/59/107 +vt 0.250000 0.792348 +f 187/60/187 169/55/169 139/58/139 +vt 0.304892 0.782047 +f 197/57/197 187/60/187 226/61/226 +f 239/34/239 226/61/226 258/37/258 +f 169/55/169 127/56/127 139/58/139 +f 197/57/197 169/55/169 187/60/187 +f 239/34/239 197/57/197 226/61/226 +vt 0.187136 0.722813 +vt 0.150000 0.706320 +f 131/62/131 107/59/107 99/63/99 +vt 0.226632 0.731436 +f 161/64/161 139/58/139 131/62/131 +vt 0.273369 0.731436 +f 205/65/205 187/60/187 161/64/161 +vt 0.312864 0.722813 +f 226/61/226 205/65/205 235/66/235 +f 258/37/258 235/66/235 267/41/267 +f 139/58/139 107/59/107 131/62/131 +f 187/60/187 139/58/139 161/64/161 +f 226/61/226 187/60/187 205/65/205 +f 258/37/258 226/61/226 235/66/235 +vt 0.182083 0.663125 +vt 0.150000 0.647584 +f 113/67/113 99/63/99 83/68/83 +vt 0.215623 0.672879 +f 145/69/145 131/62/131 113/67/113 +vt 0.250000 0.676208 +f 190/70/190 161/64/161 145/69/145 +vt 0.284377 0.672879 +f 205/65/205 190/70/190 219/71/219 +vt 0.317917 0.663125 +f 235/66/235 219/71/219 251/72/251 +f 267/41/267 251/72/251 281/46/281 +f 131/62/131 99/63/99 113/67/113 +f 161/64/161 131/62/131 145/69/145 +f 205/65/205 161/64/161 190/70/190 +f 235/66/235 205/65/205 219/71/219 +f 267/41/267 235/66/235 251/72/251 +vt 0.050000 1.000000 +vt -0.050000 0.941264 +f 182/73/182 157/74/157 165/52/165 +vt 1.050000 0.902721 +vt 0.950000 0.941264 +vt 0.950000 0.882528 +f 135/75/135 157/76/157 123/77/123 +vt 0.050000 0.902721 +f 165/52/165 135/78/135 142/54/142 +f 165/52/165 157/74/157 135/78/135 +vt 1.013260 0.848966 +vt 0.950000 0.823792 +f 103/79/103 123/77/123 91/80/91 +vt 0.013262 0.848966 +vt 0.086738 0.848966 +f 135/78/135 103/81/103 111/82/111 +f 142/54/142 111/82/111 127/56/127 +f 135/75/135 123/77/123 103/79/103 +f 142/54/142 135/78/135 111/82/111 +vt 0.995108 0.782047 +vt 0.950000 0.765056 +f 73/83/73 91/80/91 69/84/69 +vt 0.050000 0.792348 +vt -0.004892 0.782047 +f 81/85/81 103/81/103 73/86/73 +vt 0.104893 0.782047 +f 111/82/111 81/85/81 95/87/95 +f 127/56/127 95/87/95 107/59/107 +f 103/79/103 91/80/91 73/83/73 +f 111/82/111 103/81/103 81/85/81 +f 127/56/127 111/82/111 95/87/95 +vt 0.987136 0.722813 +vt 0.950000 0.706319 +f 41/88/41 69/84/69 45/89/45 +vt 0.026631 0.731436 +vt -0.012864 0.722813 +f 55/90/55 73/86/73 41/91/41 +vt 0.073368 0.731436 +f 81/85/81 55/90/55 59/92/59 +vt 0.112864 0.722813 +f 95/87/95 59/92/59 77/93/77 +f 107/59/107 77/93/77 99/63/99 +f 73/83/73 69/84/69 41/88/41 +f 81/85/81 73/86/73 55/90/55 +f 95/87/95 81/85/81 59/92/59 +f 107/59/107 95/87/95 77/93/77 +vt 0.982083 0.663125 +vt 0.950000 0.647584 +f 23/94/23 45/89/45 29/95/29 +vt 1.015620 0.672879 +f 27/96/27 41/88/41 23/94/23 +vt 0.050000 0.676208 +vt 0.015623 0.672879 +f 37/97/37 55/90/55 27/98/27 +vt 0.084377 0.672879 +f 59/92/59 37/97/37 51/99/51 +vt 0.117917 0.663125 +f 77/93/77 51/99/51 65/100/65 +f 99/63/99 65/100/65 83/68/83 +f 41/88/41 45/89/45 23/94/23 +f 55/90/55 41/91/41 27/98/27 +f 59/92/59 55/90/55 37/97/37 +f 77/93/77 59/92/59 51/99/51 +f 99/63/99 77/93/77 65/100/65 +vt 0.850000 1.000000 +f 182/101/182 181/1/181 157/76/157 +vt 0.850000 0.902721 +f 153/102/153 181/1/181 180/6/180 +f 157/76/157 153/102/153 123/77/123 +f 157/76/157 181/1/181 153/102/153 +vt 0.813262 0.848966 +f 149/103/149 180/6/180 179/10/179 +vt 0.886738 0.848966 +f 153/102/153 149/103/149 119/104/119 +f 123/77/123 119/104/119 91/80/91 +f 153/102/153 180/6/180 149/103/149 +f 123/77/123 153/102/153 119/104/119 +vt 0.795108 0.782047 +f 148/105/148 179/10/179 178/15/178 +vt 0.850000 0.792348 +f 115/106/115 149/103/149 148/105/148 +vt 0.904892 0.782047 +f 119/104/119 115/106/115 87/107/87 +f 91/80/91 87/107/87 69/84/69 +f 149/103/149 179/10/179 148/105/148 +f 119/104/119 149/103/149 115/106/115 +f 91/80/91 119/104/119 87/107/87 +vt 0.787136 0.722813 +f 152/108/152 178/15/178 177/21/177 +vt 0.826631 0.731436 +f 118/109/118 148/105/148 152/108/152 +vt 0.873369 0.731436 +f 115/106/115 118/109/118 86/110/86 +vt 0.912864 0.722813 +f 87/107/87 86/110/86 61/111/61 +f 69/84/69 61/111/61 45/89/45 +f 148/105/148 178/15/178 152/108/152 +f 115/106/115 148/105/148 118/109/118 +f 87/107/87 115/106/115 86/110/86 +f 69/84/69 87/107/87 61/111/61 +vt 0.782083 0.663125 +f 156/112/156 177/21/177 176/28/176 +vt 0.815623 0.672879 +f 122/113/122 152/108/152 156/112/156 +vt 0.850000 0.676208 +f 90/114/90 118/109/118 122/113/122 +vt 0.884377 0.672879 +f 86/110/86 90/114/90 68/115/68 +vt 0.917917 0.663125 +f 61/111/61 68/115/68 44/116/44 +f 45/89/45 44/116/44 29/95/29 +f 152/108/152 177/21/177 156/112/156 +f 118/109/118 152/108/152 122/113/122 +f 86/110/86 118/109/118 90/114/90 +f 61/111/61 86/110/86 68/115/68 +f 45/89/45 61/111/61 44/116/44 +vt 0.650000 0.058736 +vt 0.450000 0.058736 +vt 0.550000 0.000000 +f 198/117/198 206/118/206 175/119/175 +vt 0.650000 0.117472 +vt 0.550000 0.097279 +f 220/120/220 228/121/228 198/117/198 +vt 0.450000 0.117472 +f 228/121/228 240/122/240 206/118/206 +f 198/117/198 228/121/228 206/118/206 +vt 0.650000 0.176208 +vt 0.586738 0.151034 +f 236/123/236 252/124/252 220/120/220 +vt 0.513262 0.151034 +f 252/124/252 260/125/260 228/121/228 +vt 0.450000 0.176208 +f 260/125/260 272/126/272 240/122/240 +f 220/120/220 252/124/252 228/121/228 +f 260/125/260 240/122/240 228/121/228 +vt 0.650000 0.234944 +vt 0.604892 0.217953 +f 256/127/256 268/128/268 236/123/236 +vt 0.550000 0.207652 +f 268/128/268 282/129/282 252/124/252 +vt 0.495108 0.217953 +f 282/129/282 290/130/290 260/125/260 +vt 0.450000 0.234944 +f 290/130/290 294/131/294 272/126/272 +f 236/123/236 268/128/268 252/124/252 +f 252/124/252 282/129/282 260/125/260 +f 290/130/290 272/126/272 260/125/260 +vt 0.650000 0.293680 +vt 0.612864 0.277187 +f 264/132/264 286/133/286 256/127/256 +vt 0.573369 0.268564 +f 286/133/286 304/134/304 268/128/268 +vt 0.526631 0.268564 +f 304/134/304 308/135/308 282/129/282 +vt 0.487136 0.277187 +f 308/135/308 322/136/322 290/130/290 +vt 0.450000 0.293681 +f 322/136/322 318/137/318 294/131/294 +f 256/127/256 286/133/286 268/128/268 +f 268/128/268 304/134/304 282/129/282 +f 308/135/308 290/130/290 282/129/282 +f 322/136/322 294/131/294 290/130/290 +vt 0.650000 0.352416 +vt 0.617917 0.336875 +f 280/138/280 298/139/298 264/132/264 +vt 0.584377 0.327121 +f 298/139/298 312/140/312 286/133/286 +vt 0.550000 0.323792 +f 312/140/312 326/141/326 304/134/304 +vt 0.515623 0.327121 +f 326/141/326 336/142/336 308/135/308 +vt 0.482083 0.336875 +f 336/142/336 340/143/340 322/136/322 +vt 0.450000 0.352416 +f 340/143/340 334/144/334 318/137/318 +f 264/132/264 298/139/298 286/133/286 +f 286/133/286 312/140/312 304/134/304 +f 304/134/304 326/141/326 308/135/308 +f 336/142/336 322/136/322 308/135/308 +f 340/143/340 318/137/318 322/136/322 +vt 0.250000 0.058736 +vt 0.350000 0.000000 +f 206/118/206 183/145/183 175/146/175 +vt 0.350000 0.097279 +f 240/122/240 210/147/210 206/118/206 +vt 0.250000 0.117472 +f 210/147/210 185/148/185 183/145/183 +f 206/118/206 210/147/210 183/145/183 +vt 0.386738 0.151034 +f 272/126/272 244/149/244 240/122/240 +vt 0.313262 0.151034 +f 244/149/244 214/150/214 210/147/210 +vt 0.250000 0.176208 +f 214/150/214 186/151/186 185/148/185 +f 240/122/240 244/149/244 210/147/210 +f 214/150/214 185/148/185 210/147/210 +vt 0.404892 0.217953 +f 294/131/294 276/152/276 272/126/272 +vt 0.350000 0.207652 +f 276/152/276 248/153/248 244/149/244 +vt 0.295108 0.217953 +f 248/153/248 215/154/215 214/150/214 +vt 0.250000 0.234944 +f 215/154/215 188/155/188 186/151/186 +f 272/126/272 276/152/276 244/149/244 +f 244/149/244 248/153/248 214/150/214 +f 215/154/215 186/151/186 214/150/214 +vt 0.412864 0.277187 +f 318/137/318 302/156/302 294/131/294 +vt 0.373369 0.268564 +f 302/156/302 277/157/277 276/152/276 +vt 0.326631 0.268564 +f 277/157/277 245/158/245 248/153/248 +vt 0.287136 0.277187 +f 245/158/245 211/159/211 215/154/215 +vt 0.250000 0.293681 +f 211/159/211 189/160/189 188/155/188 +f 294/131/294 302/156/302 276/152/276 +f 276/152/276 277/157/277 248/153/248 +f 245/158/245 215/154/215 248/153/248 +f 211/159/211 188/155/188 215/154/215 +vt 0.417917 0.336875 +f 334/144/334 319/161/319 318/137/318 +vt 0.384377 0.327121 +f 319/161/319 295/162/295 302/156/302 +vt 0.350000 0.323792 +f 295/162/295 273/163/273 277/157/277 +vt 0.315623 0.327121 +f 273/163/273 241/164/241 245/158/245 +vt 0.282083 0.336875 +f 241/164/241 207/165/207 211/159/211 +vt 0.250000 0.352416 +f 207/165/207 191/166/191 189/160/189 +f 318/137/318 319/161/319 302/156/302 +f 302/156/302 295/162/295 277/157/277 +f 277/157/277 273/163/273 245/158/245 +f 241/164/241 211/159/211 245/158/245 +f 207/165/207 189/160/189 211/159/211 +vt 0.050000 0.058736 +vt 0.150000 0.000000 +f 183/145/183 154/167/154 175/168/175 +vt 0.150000 0.097279 +f 185/148/185 150/169/150 183/145/183 +vt 0.050000 0.117472 +f 150/169/150 120/170/120 154/167/154 +f 150/169/150 154/167/154 183/145/183 +vt 0.186738 0.151034 +f 186/151/186 146/171/146 185/148/185 +vt 0.113262 0.151034 +f 146/171/146 116/172/116 150/169/150 +vt 0.050000 0.176208 +f 116/172/116 88/173/88 120/170/120 +f 185/148/185 146/171/146 150/169/150 +f 116/172/116 120/170/120 150/169/150 +vt 0.204892 0.217953 +f 188/155/188 147/174/147 186/151/186 +vt 0.150000 0.207652 +f 147/174/147 114/175/114 146/171/146 +vt 0.095108 0.217953 +f 114/175/114 84/176/84 116/172/116 +vt 0.050000 0.234944 +f 84/176/84 66/177/66 88/173/88 +f 186/151/186 147/174/147 146/171/146 +f 114/175/114 116/172/116 146/171/146 +f 84/176/84 88/173/88 116/172/116 +vt 0.212864 0.277187 +f 189/160/189 151/178/151 188/155/188 +vt 0.173369 0.268564 +f 151/178/151 117/179/117 147/174/147 +vt 0.126632 0.268564 +f 117/179/117 85/180/85 114/175/114 +vt 0.087136 0.277187 +f 85/180/85 60/181/60 84/176/84 +vt 0.050000 0.293681 +f 60/181/60 42/182/42 66/177/66 +f 188/155/188 151/178/151 147/174/147 +f 147/174/147 117/179/117 114/175/114 +f 85/180/85 84/176/84 114/175/114 +f 60/181/60 66/177/66 84/176/84 +vt 0.217917 0.336875 +f 191/166/191 155/183/155 189/160/189 +vt 0.184377 0.327121 +f 155/183/155 121/184/121 151/178/151 +vt 0.150000 0.323792 +f 121/184/121 89/185/89 117/179/117 +vt 0.115623 0.327121 +f 89/185/89 67/186/67 85/180/85 +vt 0.082083 0.336875 +f 67/186/67 43/187/43 60/181/60 +vt 0.050000 0.352416 +f 43/187/43 28/188/28 42/182/42 +f 189/160/189 155/183/155 151/178/151 +f 151/178/151 121/184/121 117/179/117 +f 89/185/89 85/180/85 117/179/117 +f 67/186/67 60/181/60 85/180/85 +f 43/187/43 42/182/42 60/181/60 +vt 1.050000 0.058736 +vt 0.850000 0.058736 +vt 0.950000 0.000000 +f 154/189/154 162/190/162 175/191/175 +vt -0.050000 0.097279 +f 120/170/120 132/192/132 154/167/154 +vt 0.950000 0.097279 +vt 0.850000 0.117472 +f 132/193/132 140/194/140 162/190/162 +f 132/193/132 162/190/162 154/189/154 +vt -0.013262 0.151034 +f 88/173/88 100/195/100 120/170/120 +vt 0.986738 0.151034 +vt 0.913262 0.151034 +f 100/196/100 108/197/108 132/193/132 +vt 0.850000 0.176208 +f 108/197/108 124/198/124 140/194/140 +f 120/170/120 100/195/100 132/192/132 +f 108/197/108 140/194/140 132/193/132 +vt 0.004893 0.217953 +f 66/177/66 70/199/70 88/173/88 +vt 1.004890 0.217953 +vt 0.950000 0.207652 +f 70/200/70 78/201/78 100/196/100 +vt 0.895108 0.217953 +f 78/201/78 92/202/92 108/197/108 +vt 0.850000 0.234944 +f 92/202/92 104/203/104 124/198/124 +f 88/173/88 70/199/70 100/195/100 +f 78/201/78 108/197/108 100/196/100 +f 92/202/92 124/198/124 108/197/108 +vt 0.012864 0.277187 +f 42/182/42 38/204/38 66/177/66 +vt 1.012860 0.277187 +vt 0.973369 0.268564 +f 38/205/38 52/206/52 70/200/70 +vt 0.926631 0.268564 +f 52/206/52 56/207/56 78/201/78 +vt 0.887136 0.277187 +f 56/207/56 74/208/74 92/202/92 +vt 0.850000 0.293680 +f 74/208/74 96/209/96 104/203/104 +f 66/177/66 38/204/38 70/199/70 +f 70/200/70 52/206/52 78/201/78 +f 56/207/56 92/202/92 78/201/78 +f 74/208/74 104/203/104 92/202/92 +vt 0.017917 0.336875 +f 28/188/28 20/210/20 42/182/42 +vt -0.015623 0.327121 +f 20/210/20 24/211/24 38/204/38 +vt 0.984377 0.327121 +vt 0.950000 0.323792 +f 24/212/24 34/213/34 52/206/52 +vt 0.915623 0.327121 +f 34/213/34 48/214/48 56/207/56 +vt 0.882083 0.336875 +f 48/214/48 62/215/62 74/208/74 +vt 0.850000 0.352416 +f 62/215/62 82/216/82 96/209/96 +f 42/182/42 20/210/20 38/204/38 +f 38/205/38 24/212/24 52/206/52 +f 34/213/34 56/207/56 52/206/52 +f 48/214/48 74/208/74 56/207/56 +f 62/215/62 96/209/96 74/208/74 +vt 0.750000 0.000000 +f 162/190/162 198/117/198 175/217/175 +vt 0.750000 0.097279 +f 140/194/140 174/218/174 162/190/162 +f 174/218/174 220/120/220 198/117/198 +f 174/218/174 198/117/198 162/190/162 +vt 0.786738 0.151034 +f 124/198/124 166/219/166 140/194/140 +vt 0.713262 0.151034 +f 166/219/166 194/220/194 174/218/174 +f 194/220/194 236/123/236 220/120/220 +f 140/194/140 166/219/166 174/218/174 +f 194/220/194 220/120/220 174/218/174 +vt 0.804893 0.217953 +f 104/203/104 136/221/136 124/198/124 +vt 0.750000 0.207652 +f 136/221/136 172/222/172 166/219/166 +vt 0.695108 0.217953 +f 172/222/172 224/223/224 194/220/194 +f 224/223/224 256/127/256 236/123/236 +f 124/198/124 136/221/136 166/219/166 +f 172/222/172 194/220/194 166/219/166 +f 224/223/224 236/123/236 194/220/194 +vt 0.812864 0.277187 +f 96/209/96 128/224/128 104/203/104 +vt 0.773368 0.268564 +f 128/224/128 158/225/158 136/221/136 +vt 0.726632 0.268564 +f 158/225/158 202/226/202 172/222/172 +vt 0.687136 0.277187 +f 202/226/202 232/227/232 224/223/224 +f 232/227/232 264/132/264 256/127/256 +f 104/203/104 128/224/128 136/221/136 +f 136/221/136 158/225/158 172/222/172 +f 202/226/202 224/223/224 172/222/172 +f 232/227/232 256/127/256 224/223/224 +vt 0.817917 0.336875 +f 82/216/82 112/228/112 96/209/96 +vt 0.784377 0.327121 +f 112/228/112 144/229/144 128/224/128 +vt 0.750000 0.323792 +f 144/229/144 170/230/170 158/225/158 +vt 0.715623 0.327121 +f 170/230/170 218/231/218 202/226/202 +vt 0.682083 0.336875 +f 218/231/218 250/232/250 232/227/232 +f 250/232/250 280/138/280 264/132/264 +f 96/209/96 112/228/112 128/224/128 +f 128/224/128 144/229/144 158/225/158 +f 158/225/158 170/230/170 202/226/202 +f 218/231/218 232/227/232 202/226/202 +f 250/232/250 264/132/264 232/227/232 +vt 0.731927 0.599277 +f 176/28/176 208/27/208 200/233/200 +vt 0.700727 0.611555 +f 208/27/208 242/26/242 230/234/230 +vt 0.715567 0.549885 +f 200/233/200 230/234/230 222/235/222 +f 208/27/208 230/234/230 200/233/200 +vt 0.668719 0.618520 +f 242/26/242 274/25/274 262/236/262 +vt 0.684916 0.559540 +f 230/234/230 262/236/262 254/237/254 +vt 0.700000 0.500000 +f 222/235/222 254/237/254 238/238/238 +f 242/26/242 262/236/262 230/234/230 +f 230/234/230 254/237/254 222/235/222 +vt 0.631281 0.618520 +f 274/25/274 296/24/296 292/239/292 +vt 0.650000 0.560069 +f 262/236/262 292/239/292 284/240/284 +vt 0.666667 0.500000 +f 254/237/254 284/240/284 270/241/270 +vt 0.684433 0.450115 +f 238/238/238 270/241/270 257/242/257 +f 262/236/262 274/25/274 292/239/292 +f 262/236/262 284/240/284 254/237/254 +f 238/238/238 254/237/254 270/241/270 +vt 0.599273 0.611555 +f 296/24/296 320/22/320 324/243/324 +vt 0.615084 0.559540 +f 292/239/292 324/243/324 310/244/310 +vt 0.633333 0.500000 +f 284/240/284 310/244/310 306/245/306 +vt 0.650000 0.449696 +f 270/241/270 306/245/306 287/246/287 +vt 0.668073 0.400723 +f 257/242/257 287/246/287 265/247/265 +f 292/239/292 296/24/296 324/243/324 +f 284/240/284 292/239/292 310/244/310 +f 270/241/270 284/240/284 306/245/306 +f 257/242/257 270/241/270 287/246/287 +vt 0.568073 0.599277 +f 320/22/320 335/23/335 342/248/342 +vt 0.584433 0.549885 +f 324/243/324 342/248/342 338/249/338 +vt 0.600000 0.500000 +f 310/244/310 338/249/338 328/250/328 +vt 0.615567 0.450115 +f 306/245/306 328/250/328 313/251/313 +vt 0.631927 0.400723 +f 287/246/287 313/251/313 299/252/299 +f 265/247/265 299/252/299 280/138/280 +f 324/243/324 320/22/320 342/248/342 +f 310/244/310 324/243/324 338/249/338 +f 306/245/306 310/244/310 328/250/328 +f 306/245/306 313/251/313 287/246/287 +f 265/247/265 287/246/287 299/252/299 +vt 0.531927 0.599277 +f 335/23/335 343/50/343 349/253/349 +vt 0.500727 0.611555 +f 343/50/343 339/49/339 355/254/355 +vt 0.515567 0.549885 +f 349/253/349 355/254/355 361/255/361 +f 343/50/343 355/254/355 349/253/349 +vt 0.468719 0.618520 +f 339/49/339 329/48/329 347/256/347 +vt 0.484916 0.559540 +f 355/254/355 347/256/347 359/257/359 +vt 0.500000 0.500000 +f 361/255/361 359/257/359 362/258/362 +f 339/49/339 347/256/347 355/254/355 +f 355/254/355 359/257/359 361/255/361 +vt 0.431281 0.618520 +f 329/48/329 315/47/315 333/259/333 +vt 0.450000 0.560069 +f 347/256/347 333/259/333 351/260/351 +vt 0.466667 0.500000 +f 359/257/359 351/260/351 357/261/357 +vt 0.484433 0.450115 +f 362/258/362 357/261/357 360/262/360 +f 347/256/347 329/48/329 333/259/333 +f 347/256/347 351/260/351 359/257/359 +f 362/258/362 359/257/359 357/261/357 +vt 0.399273 0.611555 +f 315/47/315 301/45/301 317/263/317 +vt 0.415084 0.559540 +f 333/259/333 317/263/317 332/264/332 +vt 0.433333 0.500000 +f 351/260/351 332/264/332 345/265/345 +vt 0.450000 0.449696 +f 357/261/357 345/265/345 353/266/353 +vt 0.468073 0.400723 +f 360/262/360 353/266/353 348/267/348 +f 333/259/333 315/47/315 317/263/317 +f 351/260/351 333/259/333 332/264/332 +f 357/261/357 351/260/351 345/265/345 +f 360/262/360 357/261/357 353/266/353 +vt 0.368073 0.599277 +f 301/45/301 281/46/281 300/268/300 +vt 0.384433 0.549885 +f 317/263/317 300/268/300 314/269/314 +vt 0.400000 0.500000 +f 332/264/332 314/269/314 327/270/327 +vt 0.415568 0.450115 +f 345/265/345 327/270/327 337/271/337 +vt 0.431927 0.400723 +f 353/266/353 337/271/337 341/272/341 +f 348/267/348 341/272/341 334/144/334 +f 317/263/317 301/45/301 300/268/300 +f 332/264/332 317/263/317 314/269/314 +f 345/265/345 332/264/332 327/270/327 +f 345/265/345 337/271/337 353/266/353 +f 348/267/348 353/266/353 341/272/341 +vt 0.331927 0.599277 +f 281/46/281 251/72/251 266/273/266 +vt 0.300727 0.611555 +f 251/72/251 219/71/219 234/274/234 +vt 0.315568 0.549885 +f 266/273/266 234/274/234 259/275/259 +f 251/72/251 234/274/234 266/273/266 +vt 0.268719 0.618520 +f 219/71/219 190/70/190 204/276/204 +vt 0.284916 0.559540 +f 234/274/234 204/276/204 227/277/227 +vt 0.300000 0.500000 +f 259/275/259 227/277/227 237/278/237 +f 219/71/219 204/276/204 234/274/234 +f 234/274/234 227/277/227 259/275/259 +vt 0.231281 0.618520 +f 190/70/190 145/69/145 160/279/160 +vt 0.250000 0.560069 +f 204/276/204 160/279/160 192/280/192 +vt 0.266667 0.500000 +f 227/277/227 192/280/192 195/281/195 +vt 0.284433 0.450115 +f 237/278/237 195/281/195 221/282/221 +f 204/276/204 190/70/190 160/279/160 +f 204/276/204 192/280/192 227/277/227 +f 237/278/237 227/277/227 195/281/195 +vt 0.199273 0.611555 +f 145/69/145 113/67/113 130/283/130 +vt 0.215084 0.559540 +f 160/279/160 130/283/130 138/284/138 +vt 0.233333 0.500000 +f 192/280/192 138/284/138 167/285/167 +vt 0.250000 0.449696 +f 195/281/195 167/285/167 193/286/193 +vt 0.268073 0.400723 +f 221/282/221 193/286/193 199/287/199 +f 160/279/160 145/69/145 130/283/130 +f 192/280/192 160/279/160 138/284/138 +f 195/281/195 192/280/192 167/285/167 +f 221/282/221 195/281/195 193/286/193 +vt 0.168073 0.599277 +f 113/67/113 83/68/83 98/288/98 +vt 0.184433 0.549885 +f 130/283/130 98/288/98 106/289/106 +vt 0.200000 0.500000 +f 138/284/138 106/289/106 125/290/125 +vt 0.215568 0.450115 +f 167/285/167 125/290/125 143/291/143 +vt 0.231927 0.400723 +f 193/286/193 143/291/143 163/292/163 +f 199/287/199 163/292/163 191/166/191 +f 130/283/130 113/67/113 98/288/98 +f 138/284/138 130/283/130 106/289/106 +f 138/284/138 125/290/125 167/285/167 +f 167/285/167 143/291/143 193/286/193 +f 199/287/199 193/286/193 163/292/163 +vt 0.131927 0.599277 +f 83/68/83 65/100/65 64/293/64 +vt 0.100727 0.611555 +f 65/100/65 51/99/51 47/294/47 +vt 0.115567 0.549885 +f 64/293/64 47/294/47 50/295/50 +f 65/100/65 47/294/47 64/293/64 +vt 0.068719 0.618520 +f 51/99/51 37/97/37 33/296/33 +vt 0.084916 0.559540 +f 47/294/47 33/296/33 32/297/32 +vt 0.100000 0.500000 +f 50/295/50 32/297/32 35/298/35 +f 51/99/51 33/296/33 47/294/47 +f 47/294/47 32/297/32 50/295/50 +vt 0.031281 0.618520 +f 37/97/37 27/98/27 19/299/19 +vt 0.050000 0.560069 +f 33/296/33 19/299/19 13/300/13 +vt 0.066667 0.500000 +f 32/297/32 13/300/13 17/301/17 +vt 0.084433 0.450115 +f 35/298/35 17/301/17 25/302/25 +f 37/97/37 19/299/19 33/296/33 +f 33/296/33 13/300/13 32/297/32 +f 32/297/32 17/301/17 35/298/35 +vt 0.999273 0.611555 +f 27/96/27 23/94/23 11/303/11 +vt -0.000727 0.611555 +vt 0.015084 0.559540 +f 19/299/19 11/304/11 7/305/7 +vt 0.033333 0.500000 +f 13/300/13 7/305/7 5/306/5 +vt 0.050000 0.449696 +f 17/301/17 5/306/5 9/307/9 +vt 0.068073 0.400723 +f 25/302/25 9/307/9 21/308/21 +f 19/299/19 27/98/27 11/304/11 +f 13/300/13 19/299/19 7/305/7 +f 13/300/13 5/306/5 17/301/17 +f 25/302/25 17/301/17 9/307/9 +vt 0.968073 0.599277 +f 23/94/23 29/95/29 15/309/15 +vt 0.984433 0.549885 +f 11/303/11 15/309/15 3/310/3 +vt 1.015080 0.559540 +vt 1.000000 0.500000 +f 7/311/7 3/310/3 1/312/1 +vt 0.000000 0.500000 +vt 0.015568 0.450115 +f 5/306/5 1/313/1 2/314/2 +vt 0.031927 0.400723 +f 9/307/9 2/314/2 14/315/14 +f 21/308/21 14/315/14 28/188/28 +f 11/303/11 23/94/23 15/309/15 +f 7/311/7 11/303/11 3/310/3 +f 7/305/7 1/313/1 5/306/5 +f 5/306/5 2/314/2 9/307/9 +f 9/307/9 14/315/14 21/308/21 +vt 0.931927 0.599277 +f 29/95/29 44/116/44 22/316/22 +vt 0.900727 0.611555 +f 44/116/44 68/115/68 40/317/40 +vt 0.915568 0.549885 +f 22/316/22 40/317/40 26/318/26 +f 44/116/44 40/317/40 22/316/22 +vt 0.868719 0.618520 +f 68/115/68 90/114/90 72/319/72 +vt 0.884916 0.559540 +f 40/317/40 72/319/72 53/320/53 +vt 0.900000 0.500000 +f 26/318/26 53/320/53 36/321/36 +f 68/115/68 72/319/72 40/317/40 +f 40/317/40 53/320/53 26/318/26 +vt 0.831281 0.618520 +f 90/114/90 122/113/122 102/322/102 +vt 0.850000 0.560069 +f 72/319/72 102/322/102 80/323/80 +vt 0.866667 0.500000 +f 53/320/53 80/323/80 58/324/58 +vt 0.884433 0.450115 +f 36/321/36 58/324/58 49/325/49 +f 90/114/90 102/322/102 72/319/72 +f 72/319/72 80/323/80 53/320/53 +f 53/320/53 58/324/58 36/321/36 +vt 0.799273 0.611555 +f 122/113/122 156/112/156 134/326/134 +vt 0.815084 0.559540 +f 102/322/102 134/326/134 110/327/110 +vt 0.833333 0.500000 +f 80/323/80 110/327/110 94/328/94 +vt 0.850000 0.449696 +f 58/324/58 94/328/94 75/329/75 +vt 0.868073 0.400723 +f 49/325/49 75/329/75 63/330/63 +f 102/322/102 122/113/122 134/326/134 +f 80/323/80 102/322/102 110/327/110 +f 80/323/80 94/328/94 58/324/58 +f 49/325/49 58/324/58 75/329/75 +vt 0.768073 0.599277 +f 156/112/156 176/28/176 164/331/164 +vt 0.784433 0.549885 +f 134/326/134 164/331/164 141/332/141 +vt 0.800000 0.500000 +f 110/327/110 141/332/141 126/333/126 +vt 0.815568 0.450115 +f 94/328/94 126/333/126 105/334/105 +vt 0.831927 0.400723 +f 75/329/75 105/334/105 97/335/97 +f 63/330/63 97/335/97 82/216/82 +f 134/326/134 156/112/156 164/331/164 +f 110/327/110 134/326/134 141/332/141 +f 110/327/110 126/333/126 94/328/94 +f 94/328/94 105/334/105 75/329/75 +f 75/329/75 97/335/97 63/330/63 +f 348/267/348 334/144/334 340/143/340 +vt 0.499273 0.388445 +f 352/336/352 340/143/340 336/142/336 +f 360/262/360 348/267/348 352/336/352 +f 352/336/352 348/267/348 340/143/340 +vt 0.531281 0.381480 +f 344/337/344 336/142/336 326/141/326 +vt 0.515084 0.440460 +f 356/338/356 352/336/352 344/337/344 +f 362/258/362 360/262/360 356/338/356 +f 344/337/344 352/336/352 336/142/336 +f 356/338/356 360/262/360 352/336/352 +vt 0.568719 0.381480 +f 312/140/312 330/339/330 326/141/326 +vt 0.550000 0.439931 +f 330/339/330 350/340/350 344/337/344 +vt 0.533333 0.500000 +f 358/341/358 356/338/356 350/340/350 +f 358/341/358 361/255/361 362/258/362 +f 330/339/330 344/337/344 326/141/326 +f 350/340/350 356/338/356 344/337/344 +f 358/341/358 362/258/362 356/338/356 +vt 0.600727 0.388445 +f 298/139/298 316/342/316 312/140/312 +vt 0.584916 0.440460 +f 316/342/316 331/343/331 330/339/330 +vt 0.566667 0.500000 +f 331/343/331 346/344/346 350/340/350 +vt 0.550000 0.550304 +f 346/344/346 354/345/354 358/341/358 +f 354/345/354 349/253/349 361/255/361 +f 316/342/316 330/339/330 312/140/312 +f 331/343/331 350/340/350 330/339/330 +f 346/344/346 358/341/358 350/340/350 +f 354/345/354 361/255/361 358/341/358 +f 280/138/280 299/252/299 298/139/298 +f 299/252/299 313/251/313 316/342/316 +f 313/251/313 328/250/328 331/343/331 +f 328/250/328 338/249/338 346/344/346 +f 342/248/342 354/345/354 338/249/338 +f 342/248/342 335/23/335 349/253/349 +f 299/252/299 316/342/316 298/139/298 +f 313/251/313 331/343/331 316/342/316 +f 328/250/328 346/344/346 331/343/331 +f 338/249/338 354/345/354 346/344/346 +f 342/248/342 349/253/349 354/345/354 +f 199/287/199 191/166/191 207/165/207 +vt 0.299273 0.388445 +f 229/346/229 207/165/207 241/164/241 +f 221/282/221 199/287/199 229/346/229 +f 229/346/229 199/287/199 207/165/207 +vt 0.331281 0.381480 +f 261/347/261 241/164/241 273/163/273 +vt 0.315084 0.440460 +f 253/348/253 229/346/229 261/347/261 +f 237/278/237 221/282/221 253/348/253 +f 261/347/261 229/346/229 241/164/241 +f 253/348/253 221/282/221 229/346/229 +vt 0.368719 0.381480 +f 295/162/295 291/349/291 273/163/273 +vt 0.350000 0.439931 +f 291/349/291 283/350/283 261/347/261 +vt 0.333333 0.500000 +f 269/351/269 253/348/253 283/350/283 +f 269/351/269 259/275/259 237/278/237 +f 291/349/291 261/347/261 273/163/273 +f 283/350/283 253/348/253 261/347/261 +f 269/351/269 237/278/237 253/348/253 +vt 0.400727 0.388445 +f 319/161/319 323/352/323 295/162/295 +vt 0.384916 0.440460 +f 323/352/323 309/353/309 291/349/291 +vt 0.366667 0.500000 +f 309/353/309 305/354/305 283/350/283 +vt 0.350000 0.550304 +f 305/354/305 289/355/289 269/351/269 +f 289/355/289 266/273/266 259/275/259 +f 323/352/323 291/349/291 295/162/295 +f 309/353/309 283/350/283 291/349/291 +f 305/354/305 269/351/269 283/350/283 +f 289/355/289 259/275/259 269/351/269 +f 334/144/334 341/272/341 319/161/319 +f 341/272/341 337/271/337 323/352/323 +f 337/271/337 327/270/327 309/353/309 +f 327/270/327 314/269/314 305/354/305 +f 300/268/300 289/355/289 314/269/314 +f 300/268/300 281/46/281 266/273/266 +f 341/272/341 323/352/323 319/161/319 +f 337/271/337 309/353/309 323/352/323 +f 327/270/327 305/354/305 309/353/309 +f 314/269/314 289/355/289 305/354/305 +f 300/268/300 266/273/266 289/355/289 +f 21/308/21 28/188/28 43/187/43 +vt 0.099273 0.388445 +f 39/356/39 43/187/43 67/186/67 +f 25/302/25 21/308/21 39/356/39 +f 39/356/39 21/308/21 43/187/43 +vt 0.131281 0.381480 +f 71/357/71 67/186/67 89/185/89 +vt 0.115084 0.440460 +f 54/358/54 39/356/39 71/357/71 +f 35/298/35 25/302/25 54/358/54 +f 71/357/71 39/356/39 67/186/67 +f 54/358/54 25/302/25 39/356/39 +vt 0.168719 0.381480 +f 121/184/121 101/359/101 89/185/89 +vt 0.150000 0.439931 +f 79/360/79 71/357/71 101/359/101 +vt 0.133333 0.500000 +f 57/361/57 54/358/54 79/360/79 +f 50/295/50 35/298/35 57/361/57 +f 101/359/101 71/357/71 89/185/89 +f 79/360/79 54/358/54 71/357/71 +f 57/361/57 35/298/35 54/358/54 +vt 0.200727 0.388445 +f 155/183/155 133/362/133 121/184/121 +vt 0.184916 0.440460 +f 133/362/133 109/363/109 101/359/101 +vt 0.166667 0.500000 +f 109/363/109 93/364/93 79/360/79 +vt 0.150000 0.550304 +f 76/365/76 57/361/57 93/364/93 +f 76/365/76 64/293/64 50/295/50 +f 133/362/133 101/359/101 121/184/121 +f 109/363/109 79/360/79 101/359/101 +f 93/364/93 57/361/57 79/360/79 +f 76/365/76 50/295/50 57/361/57 +f 191/166/191 163/292/163 155/183/155 +f 163/292/163 143/291/143 133/362/133 +f 143/291/143 125/290/125 109/363/109 +f 106/289/106 93/364/93 125/290/125 +f 98/288/98 76/365/76 106/289/106 +f 83/68/83 64/293/64 98/288/98 +f 163/292/163 133/362/133 155/183/155 +f 143/291/143 109/363/109 133/362/133 +f 125/290/125 93/364/93 109/363/109 +f 106/289/106 76/365/76 93/364/93 +f 98/288/98 64/293/64 76/365/76 +f 63/330/63 82/216/82 62/215/62 +vt 0.899273 0.388445 +f 46/366/46 62/215/62 48/214/48 +f 49/325/49 63/330/63 46/366/46 +f 46/366/46 63/330/63 62/215/62 +vt 0.931281 0.381480 +f 30/367/30 48/214/48 34/213/34 +vt 0.915084 0.440460 +f 31/368/31 46/366/46 30/367/30 +f 36/321/36 49/325/49 31/368/31 +f 30/367/30 46/366/46 48/214/48 +f 31/368/31 49/325/49 46/366/46 +vt 0.968719 0.381480 +f 24/212/24 16/369/16 34/213/34 +vt 0.950000 0.439931 +f 12/370/12 30/367/30 16/369/16 +vt 0.933333 0.500000 +f 18/371/18 31/368/31 12/370/12 +f 26/318/26 36/321/36 18/371/18 +f 16/369/16 30/367/30 34/213/34 +f 12/370/12 31/368/31 30/367/30 +f 18/371/18 36/321/36 31/368/31 +vt 0.000727 0.388445 +f 20/210/20 8/372/8 24/211/24 +vt 1.000730 0.388445 +vt 0.984916 0.440460 +f 8/373/8 4/374/4 16/369/16 +vt 0.966667 0.500000 +f 4/374/4 6/375/6 12/370/12 +vt 0.950000 0.550304 +f 10/376/10 18/371/18 6/375/6 +f 10/376/10 22/316/22 26/318/26 +f 8/373/8 16/369/16 24/212/24 +f 4/374/4 12/370/12 16/369/16 +f 6/375/6 18/371/18 12/370/12 +f 10/376/10 26/318/26 18/371/18 +f 28/188/28 14/315/14 20/210/20 +f 14/315/14 2/314/2 8/372/8 +vt -0.015084 0.440460 +f 2/314/2 1/313/1 4/377/4 +f 3/310/3 6/375/6 1/312/1 +f 15/309/15 10/376/10 3/310/3 +f 29/95/29 22/316/22 15/309/15 +f 14/315/14 8/372/8 20/210/20 +f 2/314/2 4/377/4 8/372/8 +f 1/312/1 6/375/6 4/374/4 +f 3/310/3 10/376/10 6/375/6 +f 15/309/15 22/316/22 10/376/10 +f 265/247/265 280/138/280 250/232/250 +vt 0.699273 0.388445 +f 233/378/233 250/232/250 218/231/218 +f 257/242/257 265/247/265 233/378/233 +f 233/378/233 265/247/265 250/232/250 +vt 0.731281 0.381480 +f 203/379/203 218/231/218 170/230/170 +vt 0.715084 0.440460 +f 225/380/225 233/378/233 203/379/203 +f 238/238/238 257/242/257 225/380/225 +f 203/379/203 233/378/233 218/231/218 +f 225/380/225 257/242/257 233/378/233 +vt 0.768719 0.381480 +f 144/229/144 159/381/159 170/230/170 +vt 0.750000 0.439931 +f 159/381/159 171/382/171 203/379/203 +vt 0.733333 0.500000 +f 196/383/196 225/380/225 171/382/171 +f 196/383/196 222/235/222 238/238/238 +f 159/381/159 203/379/203 170/230/170 +f 171/382/171 225/380/225 203/379/203 +f 196/383/196 238/238/238 225/380/225 +vt 0.800727 0.388445 +f 112/228/112 129/384/129 144/229/144 +vt 0.784917 0.440460 +f 129/384/129 137/385/137 159/381/159 +vt 0.766667 0.500000 +f 137/385/137 168/386/168 171/382/171 +vt 0.750000 0.550304 +f 168/386/168 173/387/173 196/383/196 +f 173/387/173 200/233/200 222/235/222 +f 129/384/129 159/381/159 144/229/144 +f 137/385/137 171/382/171 159/381/159 +f 168/386/168 196/383/196 171/382/171 +f 173/387/173 222/235/222 196/383/196 +f 82/216/82 97/335/97 112/228/112 +f 97/335/97 105/334/105 129/384/129 +f 105/334/105 126/333/126 137/385/137 +f 141/332/141 168/386/168 126/333/126 +f 164/331/164 173/387/173 141/332/141 +f 164/331/164 176/28/176 200/233/200 +f 97/335/97 129/384/129 112/228/112 +f 105/334/105 137/385/137 129/384/129 +f 126/333/126 168/386/168 137/385/137 +f 141/332/141 173/387/173 168/386/168 +f 164/331/164 200/233/200 173/387/173 +# 720 faces, 387 coords texture + +# End of File diff --git a/platform/glfw/example_custom_drawable_style_layer.cpp b/platform/glfw/example_custom_drawable_style_layer.cpp new file mode 100644 index 000000000000..0ea02911553d --- /dev/null +++ b/platform/glfw/example_custom_drawable_style_layer.cpp @@ -0,0 +1,606 @@ +#include "example_custom_drawable_style_layer.hpp" + +#if MLN_DRAWABLE_RENDERER + +#include +#include +#include +#include +#include + +#include +#include +#include + +#define TINYOBJLOADER_IMPLEMENTATION +#include "tiny_obj_loader.h" + +ExampleCustomDrawableStyleLayerHost::ExampleCustomDrawableStyleLayerHost(const std::string& assetsPath_) + : assetsPath(assetsPath_) {} + +ExampleCustomDrawableStyleLayerHost::~ExampleCustomDrawableStyleLayerHost() {} + +void ExampleCustomDrawableStyleLayerHost::initialize() {} + +void ExampleCustomDrawableStyleLayerHost::deinitialize() {} + +void ExampleCustomDrawableStyleLayerHost::update(Interface& interface) { + // if we have built our drawable(s) already, either update or skip + if (interface.getDrawableCount() == 0) { + createDrawables(interface); + return; + } +} + +mbgl::Point ExampleCustomDrawableStyleLayerHost::project(const mbgl::LatLng& c, const mbgl::TransformState& s) { + mbgl::LatLng unwrappedLatLng = c.wrapped(); + unwrappedLatLng.unwrapForShortestPath(s.getLatLng(mbgl::LatLng::Wrapped)); + return mbgl::Projection::project(unwrappedLatLng, s.getScale()); +} + +void ExampleCustomDrawableStyleLayerHost::createDrawables(Interface& interface) { + constexpr float extent = mbgl::util::EXTENT; + + // add classic polylines + { + using namespace mbgl; + + // set tile + interface.setTileID({11, 327, 792}); + + constexpr auto numLines = 6; + Interface::LineOptions options[numLines]{ + {/*geometry=*/{}, + /*blur=*/0.0f, + /*opacity=*/1.0f, + /*gapWidth=*/0.0f, + /*offset=*/0.0f, + /*width=*/8.0f, + /*color=*/Color::red()}, + + {/*geometry=*/{}, + /*blur=*/4.0f, + /*opacity=*/1.0f, + /*gapWidth=*/2.0f, + /*offset=*/-1.0f, + /*width=*/4.0f, + /*color=*/Color::blue()}, + + {/*geometry=*/{}, + /*blur=*/16.0f, + /*opacity=*/1.0f, + /*gapWidth=*/1.0f, + /*offset=*/2.0f, + /*width=*/16.0f, + /*color=*/Color(1.f, 0.5f, 0, 0.5f)}, + + {/*geometry=*/{}, + /*blur=*/2.0f, + /*opacity=*/1.0f, + /*gapWidth=*/1.0f, + /*offset=*/-2.0f, + /*width=*/2.0f, + /*color=*/Color(1.f, 1.f, 0, 0.3f)}, + + {/*geometry=*/{}, + /*blur=*/0.5f, + /*opacity=*/0.5f, + /*gapWidth=*/1.0f, + /*offset=*/0.5f, + /*width=*/0.5f, + /*color=*/Color::black()}, + + {/*geometry=*/{}, + /*blur=*/24.0f, + /*opacity=*/0.5f, + /*gapWidth=*/1.0f, + /*offset=*/-5.0f, + /*width=*/24.0f, + /*color=*/Color(1.f, 0, 1.f, 0.2f)}, + }; + + for (auto& opt : options) { + opt.geometry.beginCap = style::LineCapType::Butt; + opt.geometry.endCap = style::LineCapType::Butt; + opt.geometry.joinType = style::LineJoinType::Miter; + } + + constexpr auto numPoints = 10; + GeometryCoordinates polyline; + for (auto ipoint{0}; ipoint < numPoints; ++ipoint) { + polyline.emplace_back( + static_cast(ipoint * extent / numPoints), + static_cast(std::sin(ipoint * 2 * M_PI / numPoints) * extent / numLines / 2.f)); + } + + for (auto index{0}; index < numLines; ++index) { + for (auto& p : polyline) { + p.y += extent / numLines; + } + + // set property values + interface.setLineOptions(options[index]); + + // add polyline + interface.addPolyline(polyline, Interface::LineShaderType::Classic); + } + } + + // add wide vector polylines with tile coordinates + { + using namespace mbgl; + + // set tile + interface.setTileID({11, 327, 792}); + + constexpr auto numLines = 6; + Interface::LineOptions options[numLines]{ + {/*geometry=*/{}, + /*blur=*/0.0f, + /*opacity=*/1.0f, + /*gapWidth=*/0.0f, + /*offset=*/0.0f, + /*width=*/8.0f, + /*color=*/Color::red()}, + + {/*geometry=*/{}, + /*blur=*/4.0f, + /*opacity=*/1.0f, + /*gapWidth=*/2.0f, + /*offset=*/-1.0f, + /*width=*/4.0f, + /*color=*/Color::blue()}, + + {/*geometry=*/{}, + /*blur=*/16.0f, + /*opacity=*/1.0f, + /*gapWidth=*/1.0f, + /*offset=*/2.0f, + /*width=*/16.0f, + /*color=*/Color(1.f, 0.5f, 0, 0.5f)}, + + {/*geometry=*/{}, + /*blur=*/2.0f, + /*opacity=*/1.0f, + /*gapWidth=*/1.0f, + /*offset=*/-2.0f, + /*width=*/2.0f, + /*color=*/Color(1.f, 1.f, 0, 0.3f)}, + + {/*geometry=*/{}, + /*blur=*/0.5f, + /*opacity=*/0.5f, + /*gapWidth=*/1.0f, + /*offset=*/0.5f, + /*width=*/0.5f, + /*color=*/Color::black()}, + + {/*geometry=*/{}, + /*blur=*/24.0f, + /*opacity=*/0.5f, + /*gapWidth=*/1.0f, + /*offset=*/-5.0f, + /*width=*/24.0f, + /*color=*/Color(1.f, 0, 1.f, 0.2f)}, + }; + + for (auto& opt : options) { + opt.geometry.beginCap = style::LineCapType::Butt; + opt.geometry.endCap = style::LineCapType::Butt; + opt.geometry.joinType = style::LineJoinType::Miter; + } + + constexpr auto numPoints = 10; + GeometryCoordinates polyline; + for (auto ipoint{0}; ipoint < numPoints; ++ipoint) { + polyline.emplace_back( + static_cast(ipoint * extent / numPoints), + static_cast(std::sin(ipoint * 2 * M_PI / numPoints) * extent / numLines / 2.f)); + } + + for (auto index{0}; index < numLines; ++index) { + for (auto& p : polyline) { + if (0 == index) p.y += 0.25f * extent / numLines; + p.y += extent / numLines; + } + + // set property values + interface.setLineOptions(options[index]); + + // add polyline + interface.addPolyline(polyline, Interface::LineShaderType::WideVector); + + // add clone + for (auto& p : polyline) { + p.y += 0.05f * extent / numLines; + } + interface.addPolyline(polyline, Interface::LineShaderType::WideVector); + for (auto& p : polyline) { + p.y -= 0.05f * extent / numLines; + } + } + } + + // add fill polygon + { + using namespace mbgl; + + // set tile + interface.setTileID({11, 327, 790}); + + GeometryCollection geometry{ + { + // ring 1 + {static_cast(extent * 0.1f), static_cast(extent * 0.2f)}, + {static_cast(extent * 0.5f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.7f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.5f), static_cast(extent * 1.0f)}, + {static_cast(extent * 0.0f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.1f), static_cast(extent * 0.2f)}, + }, + { + // ring 2 + {static_cast(extent * 0.1f), static_cast(extent * 0.25f)}, + {static_cast(extent * 0.15f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.25f), static_cast(extent * 0.45f)}, + {static_cast(extent * 0.1f), static_cast(extent * 0.25f)}, + }, + }; + + // set properties + interface.setFillOptions({/*color=*/Color::green(), /*opacity=*/0.5f}); + + // add fill + interface.addFill(geometry); + } + + // add symbol + { + using namespace mbgl; + + // set tile + interface.setTileID({11, 327, 789}); + + GeometryCoordinate position{static_cast(extent * 0.0f), static_cast(extent * 0.5f)}; + + // load image + std::shared_ptr image = std::make_shared( + mbgl::decodeImage(mbgl::util::read_file(assetsPath + "puck_hat.png"))); + + // set symbol options + Interface::SymbolOptions options; + options.texture = interface.context.createTexture2D(); + options.texture->setImage(image); + options.texture->setSamplerConfiguration( + {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Repeat, gfx::TextureWrapType::Repeat}); + + const std::array, 2> textureCoordinates = {{{0.0f, 0.0f}, {10.0f, 10.0f}}}; + options.size = {static_cast(image->size.width), static_cast(image->size.height)}; + + options.anchor = {0.5f, 0.95f}; + options.angleDegrees = 45.0f; + options.scaleWithMap = true; + options.pitchWithMap = false; + interface.setSymbolOptions(options); + + // add symbol + interface.addSymbol(position, textureCoordinates); + } + + { + using namespace mbgl; + + GeometryCoordinate position{static_cast(extent * 1.0f), static_cast(extent * 0.5f)}; + + // load image + std::shared_ptr image = std::make_shared( + mbgl::decodeImage(mbgl::util::read_file(assetsPath + "puck_hat.png"))); + + // set symbol options + Interface::SymbolOptions options; + options.texture = interface.context.createTexture2D(); + options.texture->setImage(image); + options.texture->setSamplerConfiguration( + {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + + options.size = {static_cast(image->size.width), static_cast(image->size.height)}; + + options.anchor = {0.5f, 0.95f}; + options.angleDegrees = 45.0f; + options.scaleWithMap = true; + options.pitchWithMap = false; + interface.setSymbolOptions(options); + + // add symbol + interface.addSymbol(position); + } + + // add polylines using wide vectors using geographic coordinates + { + using namespace mbgl; + + // add polyline with geographic coordinates + Interface::LineOptions options = {/*geometry=*/{}, + /*blur=*/0.0f, + /*opacity=*/1.0f, + /*gapWidth=*/0.0f, + /*offset=*/0.0f, + /*width=*/12.0f, + /*color=*/{.0f, .0f, .0f, .5f}}; + + options.geometry.beginCap = style::LineCapType::Square; + options.geometry.endCap = style::LineCapType::Square; + options.geometry.joinType = style::LineJoinType::Bevel; + options.geometry.type = FeatureType::LineString; + interface.setLineOptions(options); + + LineString polyline_geo{ + // San Francisco + {-122.38186800073211, 37.77466003457463}, + {-122.3869373450997, 37.774352128895615}, + {-122.38680767979824, 37.773294612880306}, + {-122.38476465260224, 37.773350946288765}, + {-122.38146223043374, 37.77194168964067}, + {-122.6813560305925, 37.666084247570964}, + {-122.26765538866474, 37.65037232584494}, + {-122.42528413673159, 38.020443518012584}, + // Seattle + {-122.34927775216809, 47.62050663596438}, + // New York + {-74.04454331829972, 40.6892168305434}, + }; + interface.addPolyline(polyline_geo, Interface::LineShaderType::WideVector); + } + + // add polylines using wide vectors in tile coordinates + { + using namespace mbgl; + + // set tile + interface.setTileID({11, 327, 790}); + + Interface::LineOptions options{/*geometry=*/{}, + /*blur=*/0.0f, + /*opacity=*/1.0f, + /*gapWidth=*/0.0f, + /*offset=*/0.0f, + /*width=*/7.0f, + /*color=*/{1.0f, 0, 0, .5f}}; + + options.geometry.beginCap = style::LineCapType::Round; + options.geometry.endCap = style::LineCapType::Round; + options.geometry.joinType = style::LineJoinType::Round; + + // add polyline with tile coordinates + GeometryCollection polyline_tile{ + { + // ring 1 + {static_cast(extent * 0.1f), static_cast(extent * 0.2f)}, + {static_cast(extent * 0.5f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.7f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.5f), static_cast(extent * 1.0f)}, + {static_cast(extent * 0.0f), static_cast(extent * 0.5f)}, + }, + { + // ring 2 + {static_cast(extent * 0.1f), static_cast(extent * 0.25f)}, + {static_cast(extent * 0.15f), static_cast(extent * 0.5f)}, + {static_cast(extent * 0.25f), static_cast(extent * 0.45f)}, + }, + }; + + options.geometry.type = FeatureType::Polygon; + interface.setLineOptions(options); + interface.addPolyline(polyline_tile[0], Interface::LineShaderType::WideVector); + interface.addPolyline(polyline_tile[1], Interface::LineShaderType::WideVector); + } + + generateGeometry(interface); + loadGeometry(interface); + + // finish + interface.finish(); +} + +void ExampleCustomDrawableStyleLayerHost::generateGeometry(Interface& interface) { + constexpr float itemScale = 10.0f; + const mbgl::LatLng location{37.78, -122.47}; + + Interface::GeometryOptions options; + + // load image + std::shared_ptr image = std::make_shared( + mbgl::decodeImage(mbgl::util::read_file(assetsPath + "puck.png"))); + + options.texture = interface.context.createTexture2D(); + options.texture->setImage(image); + options.texture->setSamplerConfiguration( + {mbgl::gfx::TextureFilterType::Linear, mbgl::gfx::TextureWrapType::Clamp, mbgl::gfx::TextureWrapType::Clamp}); + + const std::shared_ptr sharedVertices = std::make_shared(); + VertexVector& vertices = *sharedVertices; + + const std::shared_ptr sharedIndices = std::make_shared(); + TriangleIndexVector& indices = *sharedIndices; + + const unsigned long numVtxCircumference = 72; + const float bearingStep = 360.0f / static_cast(numVtxCircumference - 1); + + vertices.emplace_back(Interface::GeometryVertex{{0.0f, 0.0f, 0.0f}, {0.5f, 0.5f}}); + + for (unsigned long i = 1; i <= numVtxCircumference; ++i) { + const float rad = mbgl::util::deg2radf((i - 1) * bearingStep); + + Interface::GeometryVertex vertex; + vertex.position = {sinf(rad) / 2.0f, cosf(rad) / 2.0f, 0.0f}; + vertex.texcoords = {0.5f + vertex.position[0], 0.5f - vertex.position[1]}; + + vertices.emplace_back(std::move(vertex)); + } + + for (uint16_t i = 1; i < vertices.elements() - 1; ++i) { + indices.emplace_back(0, i, static_cast(i + 1)); + } + indices.emplace_back(0, static_cast(vertices.elements() - 1), 1); + + interface.setGeometryOptions(options); + + interface.setGeometryTweakerCallback([=, frameCount = 0]([[maybe_unused]] mbgl::gfx::Drawable& drawable, + const mbgl::PaintParameters& params, + Interface::GeometryOptions& currentOptions) mutable { + frameCount++; + + const mbgl::Point& center = project(location, params.state); + + const float scale = itemScale * static_cast(std::pow(2.f, params.state.getZoom())) * + params.pixelsToGLUnits[0]; + + mbgl::mat4 matrix = mbgl::matrix::identity4(); + mbgl::matrix::translate(matrix, matrix, center.x, center.y, 0.0); + mbgl::matrix::rotate_z(matrix, matrix, frameCount * 0.05f); + mbgl::matrix::scale(matrix, matrix, scale, scale, 1.0f); + mbgl::matrix::multiply(currentOptions.matrix, params.transformParams.nearClippedProjMatrix, matrix); + + if (frameCount % 100 == 0) { + if (currentOptions.color.g > 0.0f) { + currentOptions.color = mbgl::Color::red(); + } else { + currentOptions.color = mbgl::Color::white(); + } + } + }); + + interface.addGeometry(sharedVertices, sharedIndices, false); +} + +void ExampleCustomDrawableStyleLayerHost::loadGeometry(Interface& interface) { + constexpr float itemScale = 0.1f; + constexpr std::array itemRotation = {90.0f, 0.0f, 0.0f}; + const mbgl::LatLng location{37.76, -122.47}; + + Interface::GeometryOptions options; + + interface.setGeometryTweakerCallback([=]([[maybe_unused]] mbgl::gfx::Drawable& drawable, + const mbgl::PaintParameters& params, + Interface::GeometryOptions& currentOptions) mutable { + const mbgl::Point& center = project(location, params.state); + + const float scale = itemScale * static_cast(std::pow(2.f, params.state.getZoom())) * + params.pixelsToGLUnits[0]; + + mbgl::mat4 matrix = mbgl::matrix::identity4(); + mbgl::matrix::translate(matrix, matrix, center.x, center.y, 0.0); + mbgl::matrix::rotate_x(matrix, matrix, mbgl::util::deg2radf(itemRotation[0])); + mbgl::matrix::rotate_y(matrix, matrix, mbgl::util::deg2radf(itemRotation[1])); + mbgl::matrix::rotate_z(matrix, matrix, mbgl::util::deg2radf(itemRotation[2])); + mbgl::matrix::scale(matrix, matrix, scale, scale, scale); + mbgl::matrix::multiply(currentOptions.matrix, params.transformParams.nearClippedProjMatrix, matrix); + }); + + const std::shared_ptr sharedVertices = std::make_shared(); + const std::shared_ptr sharedIndices = std::make_shared(); + + // importObj(interface, "../../_deps/tinyobjloader-src/models/cube.obj", *sharedVertices, *sharedIndices, options); + importObj(interface, assetsPath + "sphere.obj", *sharedVertices, *sharedIndices, options); + + interface.setGeometryOptions(options); + interface.addGeometry(sharedVertices, sharedIndices, true); +} + +void ExampleCustomDrawableStyleLayerHost::importObj(Interface& interface, + const std::string& filename, + VertexVector& vertices, + TriangleIndexVector& indices, + Interface::GeometryOptions& options) { + tinyobj::ObjReaderConfig readerConfig; + + readerConfig.triangulate = true; + readerConfig.vertex_color = false; + + tinyobj::ObjReader reader; + + if (!reader.ParseFromFile(filename, readerConfig)) { + if (!reader.Error().empty()) { + mbgl::Log::Error(mbgl::Event::General, reader.Error()); + } + + assert(false); + throw std::runtime_error(std::string("Cannot read obj file ") + filename); + } + + if (!reader.Warning().empty()) { + mbgl::Log::Error(mbgl::Event::General, reader.Warning()); + } + + const tinyobj::attrib_t& attributes = reader.GetAttrib(); + const std::vector& shapes = reader.GetShapes(); + + if (attributes.texcoords.empty()) { + options.color = mbgl::Color::green(); + } else { + // TODO parse material + + options.texture = createCheckerboardTexture(interface, 32, 32, 40, {255, 255, 255, 255}, {0, 0, 0, 255}); + } + + for (const auto& shape : shapes) { + const auto shapeIndexStart = static_cast(indices.elements()); + + for (uint16_t face = 0; face < shape.mesh.indices.size(); face += 3) { + for (size_t i = 0; i < 3; ++i) { + const tinyobj::index_t index = shape.mesh.indices[face + i]; + + Interface::GeometryVertex vertex = {}; + + std::copy(attributes.vertices.begin() + vertex.position.size() * index.vertex_index, + attributes.vertices.begin() + vertex.position.size() * (index.vertex_index + 1), + vertex.position.begin()); + + if (!attributes.texcoords.empty()) { + std::copy(attributes.texcoords.begin() + vertex.texcoords.size() * index.texcoord_index, + attributes.texcoords.begin() + vertex.texcoords.size() * (index.texcoord_index + 1), + vertex.texcoords.begin()); + } + + vertices.emplace_back(std::move(vertex)); + } + + indices.emplace_back(shapeIndexStart + face, shapeIndexStart + face + 1, shapeIndexStart + face + 2); + } + } +} + +mbgl::gfx::Texture2DPtr ExampleCustomDrawableStyleLayerHost::createCheckerboardTexture( + Interface& interface, + uint16_t wb, + uint16_t hb, + uint16_t blockSize, + const std::array& color1, + const std::array& color2) { + std::shared_ptr image = std::make_shared( + mbgl::Size(wb * blockSize, hb * blockSize)); + + constexpr uint8_t pixelSize = sizeof(uint8_t) * 4; + + for (uint16_t row = 0; row < hb; ++row) { + for (uint16_t blockRow = 0; blockRow < blockSize; ++blockRow) { + for (uint16_t col = 0; col < wb; ++col) { + for (uint16_t blockCol = 0; blockCol < blockSize; ++blockCol) { + auto index = (row * blockSize + blockRow) * image->stride() + + (col * blockSize + blockCol) * pixelSize; + + memcpy(image->data.get() + index, (row + col) % 2 == 0 ? color1.data() : color2.data(), pixelSize); + } + } + } + } + + auto texture = interface.context.createTexture2D(); + texture->setSamplerConfiguration( + {mbgl::gfx::TextureFilterType::Linear, mbgl::gfx::TextureWrapType::Clamp, mbgl::gfx::TextureWrapType::Clamp}); + texture->setImage(std::move(image)); + + return texture; +} + +#endif diff --git a/platform/glfw/example_custom_drawable_style_layer.hpp b/platform/glfw/example_custom_drawable_style_layer.hpp new file mode 100644 index 000000000000..b511e13b27e0 --- /dev/null +++ b/platform/glfw/example_custom_drawable_style_layer.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include + +#if MLN_DRAWABLE_RENDERER + +class ExampleCustomDrawableStyleLayerHost : public mbgl::style::CustomDrawableLayerHost { +public: + using VertexVector = mbgl::gfx::VertexVector; + using TriangleIndexVector = mbgl::gfx::IndexVector; + + ExampleCustomDrawableStyleLayerHost(const std::string& assetsPath); + ~ExampleCustomDrawableStyleLayerHost(); + + void initialize() override; + void deinitialize() override; + + void update(Interface& interface) override; + +protected: + static mbgl::Point project(const mbgl::LatLng& c, const mbgl::TransformState& s); + + void createDrawables(Interface& interface); + void generateGeometry(Interface& interface); + void loadGeometry(Interface& interface); + void importObj(Interface& interface, + const std::string& filename, + VertexVector& vertices, + TriangleIndexVector& indices, + Interface::GeometryOptions& options); + + mbgl::gfx::Texture2DPtr createCheckerboardTexture(Interface& interface, + uint16_t wb, + uint16_t hb, + uint16_t blockSize, + const std::array& color1, + const std::array& color2); + +protected: + const std::string assetsPath; +}; + +#endif diff --git a/platform/glfw/glfw_metal_backend.mm b/platform/glfw/glfw_metal_backend.mm index 25092c2e4617..6ef1d6970929 100644 --- a/platform/glfw/glfw_metal_backend.mm +++ b/platform/glfw/glfw_metal_backend.mm @@ -6,7 +6,7 @@ #include #include -GLFWMetalBackend::GLFWMetalBackend(GLFWwindow* window_, const bool capFrameRate) +GLFWMetalBackend::GLFWMetalBackend(GLFWwindow* window_, [[maybe_unused]] const bool capFrameRate) : window(glfwGetCocoaWindow(window_)), rendererBackend(window) diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 79ce2c764011..7d688718d5c5 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -28,6 +28,10 @@ #include #include +#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) && MLN_DRAWABLE_RENDERER +#include "example_custom_drawable_style_layer.hpp" +#endif + #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4244) @@ -66,7 +70,7 @@ using namespace std::numbers; #ifdef ENABLE_LOCATION_INDICATOR namespace { -const std::string mbglPuckAssetsPath{MAPBOX_PUCK_ASSETS_PATH}; +const std::string mbglPuckAssetsPath{MLN_ASSETS_PATH}; mbgl::Color premultiply(mbgl::Color c) { c.r *= c.a; @@ -366,6 +370,9 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, case GLFW_KEY_C: view->clearAnnotations(); break; + case GLFW_KEY_V: + view->toggleCustomDrawableStyle(); + break; case GLFW_KEY_I: view->resetDatabaseCallback(); break; @@ -823,6 +830,23 @@ void GLFWView::popAnnotation() { annotationIDs.pop_back(); } +void GLFWView::toggleCustomDrawableStyle() { +#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) && MLN_DRAWABLE_RENDERER + auto &style = map->getStyle(); + + const std::string identifier = "ExampleCustomDrawableStyleLayer"; + const auto &existingLayer = style.getLayer(identifier); + + if (!existingLayer) { + style.addLayer(std::make_unique( + identifier, std::make_unique(MLN_ASSETS_PATH))); + } else { + style.removeLayer(identifier); + } + +#endif +} + void GLFWView::makeSnapshot(bool withOverlay) { MLN_TRACE_FUNC(); diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp index 2ee15e7435f5..ffea1020a26d 100644 --- a/platform/glfw/glfw_view.hpp +++ b/platform/glfw/glfw_view.hpp @@ -113,6 +113,7 @@ class GLFWView : public mbgl::MapObserver { void clearAnnotations(); void popAnnotation(); + void toggleCustomDrawableStyle(); void makeSnapshot(bool withOverlay = false); mbgl::AnnotationIDs annotationIDs; diff --git a/shaders/drawable.custom_geometry.fragment.glsl b/shaders/drawable.custom_geometry.fragment.glsl new file mode 100644 index 000000000000..42c8156a118a --- /dev/null +++ b/shaders/drawable.custom_geometry.fragment.glsl @@ -0,0 +1,11 @@ +layout (std140) uniform CustomGeometryDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +in vec2 frag_uv; +uniform sampler2D u_image; + +void main() { + fragColor = texture(u_image, frag_uv) * u_color; +} diff --git a/shaders/drawable.custom_geometry.vertex.glsl b/shaders/drawable.custom_geometry.vertex.glsl new file mode 100644 index 000000000000..c731979708f9 --- /dev/null +++ b/shaders/drawable.custom_geometry.vertex.glsl @@ -0,0 +1,14 @@ +layout (std140) uniform CustomGeometryDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec3 a_pos; +layout(location = 1) in vec2 a_uv; + +out vec2 frag_uv; + +void main() { + frag_uv = a_uv; + gl_Position = u_matrix * vec4(a_pos, 1.0); +} diff --git a/shaders/drawable.location_indicator.fragment.glsl b/shaders/drawable.location_indicator.fragment.glsl new file mode 100644 index 000000000000..0956f100e3d1 --- /dev/null +++ b/shaders/drawable.location_indicator.fragment.glsl @@ -0,0 +1,8 @@ +layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +void main() { + fragColor = u_color; +} diff --git a/shaders/drawable.location_indicator.vertex.glsl b/shaders/drawable.location_indicator.vertex.glsl new file mode 100644 index 000000000000..045634b387de --- /dev/null +++ b/shaders/drawable.location_indicator.vertex.glsl @@ -0,0 +1,10 @@ +layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec2 a_pos; + +void main() { + gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); +} diff --git a/shaders/drawable.location_indicator_textured.fragment.glsl b/shaders/drawable.location_indicator_textured.fragment.glsl new file mode 100644 index 000000000000..4ca7698a3609 --- /dev/null +++ b/shaders/drawable.location_indicator_textured.fragment.glsl @@ -0,0 +1,11 @@ +layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +in vec2 frag_uv; +uniform sampler2D u_image; + +void main() { + fragColor = texture(u_image, frag_uv); +} diff --git a/shaders/drawable.location_indicator_textured.vertex.glsl b/shaders/drawable.location_indicator_textured.vertex.glsl new file mode 100644 index 000000000000..e577f419d63e --- /dev/null +++ b/shaders/drawable.location_indicator_textured.vertex.glsl @@ -0,0 +1,14 @@ +layout (std140) uniform LocationIndicatorDrawableUBO { + mat4 u_matrix; + vec4 u_color; +}; + +layout(location = 0) in vec2 a_pos; +layout(location = 1) in vec2 a_uv; + +out vec2 frag_uv; + +void main() { + frag_uv = a_uv; + gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); +} diff --git a/shaders/manifest.json b/shaders/manifest.json index 49829a196b06..8d4345588aed 100644 --- a/shaders/manifest.json +++ b/shaders/manifest.json @@ -34,6 +34,13 @@ "glsl_frag": "drawable.collision_circle.fragment.glsl", "uses_ubos": true }, + { + "name": "CustomGeometryShader", + "header": "drawable_custom_geometry", + "glsl_vert": "drawable.custom_geometry.vertex.glsl", + "glsl_frag": "drawable.custom_geometry.fragment.glsl", + "uses_ubos": true + }, { "name": "CustomSymbolIconShader", "header": "drawable_custom_symbol_icon", @@ -149,15 +156,15 @@ { "name": "LocationIndicatorShader", "header": "drawable_location_indicator", - "glsl_vert": "_empty.glsl", - "glsl_frag": "_empty.glsl", + "glsl_vert": "drawable.location_indicator.vertex.glsl", + "glsl_frag": "drawable.location_indicator.fragment.glsl", "uses_ubos": true }, { "name": "LocationIndicatorTexturedShader", "header": "drawable_location_indicator_textured", - "glsl_vert": "_empty.glsl", - "glsl_frag": "_empty.glsl", + "glsl_vert": "drawable.location_indicator_textured.vertex.glsl", + "glsl_frag": "drawable.location_indicator_textured.fragment.glsl", "uses_ubos": true }, { diff --git a/src/mbgl/gfx/drawable.cpp b/src/mbgl/gfx/drawable.cpp index 34fea6d9211f..82d053f08ead 100644 --- a/src/mbgl/gfx/drawable.cpp +++ b/src/mbgl/gfx/drawable.cpp @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include namespace mbgl { namespace gfx { @@ -24,7 +24,7 @@ struct Drawable::Impl { Drawable::Drawable(std::string name_) : name(name_), - renderPass(RenderPass::Opaque), + renderPass(mbgl::RenderPass::Opaque), depthType(DepthMaskType::ReadOnly), impl(std::make_unique()) {} diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index d8a8dcac2b72..5ad750c8a835 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -620,6 +620,10 @@ gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, return std::make_shared(data, size, *uboAllocator); } +gfx::UniqueUniformBufferArray Context::createLayerUniformBufferArray() { + return std::make_unique(); +} + gfx::ShaderProgramBasePtr Context::getGenericShader(gfx::ShaderRegistry& shaders, const std::string& name) { MLN_TRACE_FUNC(); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 0c34475a9a92..9f9eed740eaa 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -125,6 +125,8 @@ class Context final : public gfx::Context { bool persistent = false, bool ssbo = false) override; + gfx::UniqueUniformBufferArray createLayerUniformBufferArray() override; + gfx::ShaderProgramBasePtr getGenericShader(gfx::ShaderRegistry&, const std::string& name) override; TileLayerGroupPtr createTileLayerGroup(int32_t layerIndex, std::size_t initialCapacity, std::string name) override; diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index 7f931d8a1c36..6dab46f05a2b 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -115,6 +115,11 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) const auto debugGroupTile = parameters.encoder->createDebugGroup(labelPtr); #endif + if (!bindUBOs) { + uniformBuffers.bind(); + bindUBOs = true; + } + for (const auto& tweaker : drawable.getTweakers()) { tweaker->execute(drawable, parameters); } @@ -126,11 +131,6 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) context.setStencilMode(drawable.getEnableStencil() ? stencilMode3d : gfx::StencilMode::disabled()); } - if (!bindUBOs) { - uniformBuffers.bind(); - bindUBOs = true; - } - drawable.draw(parameters); }); @@ -176,16 +176,15 @@ void LayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) { #if !defined(NDEBUG) const auto debugGroup = parameters.encoder->createDebugGroup(drawable.getName().c_str()); #endif - - for (const auto& tweaker : drawable.getTweakers()) { - tweaker->execute(drawable, parameters); - } - if (!bindUBOs) { uniformBuffers.bind(); bindUBOs = true; } + for (const auto& tweaker : drawable.getTweakers()) { + tweaker->execute(drawable, parameters); + } + drawable.draw(parameters); }); diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp index fa8badc2d6e9..f43f4ccb50d2 100644 --- a/src/mbgl/gl/renderer_backend.cpp +++ b/src/mbgl/gl/renderer_backend.cpp @@ -125,6 +125,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::CircleShader, shaders::BuiltIn::CollisionBoxShader, shaders::BuiltIn::CollisionCircleShader, + shaders::BuiltIn::CustomGeometryShader, shaders::BuiltIn::CustomSymbolIconShader, shaders::BuiltIn::DebugShader, shaders::BuiltIn::FillShader, @@ -142,6 +143,8 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LineGradientShader, shaders::BuiltIn::LinePatternShader, shaders::BuiltIn::LineSDFShader, + shaders::BuiltIn::LocationIndicatorShader, + shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, shaders::BuiltIn::SymbolSDFIconShader, diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index eb57ffd12b9f..23624fcb3bdf 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -204,6 +204,10 @@ gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t createBuffer(data, size, gfx::BufferUsageType::StaticDraw, /*isIndexBuffer=*/false, persistent)); } +UniqueUniformBufferArray Context::createLayerUniformBufferArray() { + return std::make_unique(); +} + gfx::ShaderProgramBasePtr Context::getGenericShader(gfx::ShaderRegistry& shaders, const std::string& name) { const auto shaderGroup = shaders.getShaderGroup(name); auto shader = shaderGroup ? shaderGroup->getOrCreateShader(*this, {}) : gfx::ShaderProgramBasePtr{}; @@ -226,7 +230,7 @@ RenderTargetPtr Context::createRenderTarget(const Size size, const gfx::TextureC return std::make_shared(*this, size, type); } -void Context::resetState(gfx::DepthMode depthMode, gfx::ColorMode colorMode) {} +void Context::resetState(gfx::DepthMode, gfx::ColorMode) {} bool Context::emplaceOrUpdateUniformBuffer(gfx::UniformBufferPtr& buffer, const void* data, @@ -459,7 +463,7 @@ std::unique_ptr Context::createTextureResource(Size, return nullptr; } -std::unique_ptr Context::createRenderbufferResource(gfx::RenderbufferPixelType, Size size) { +std::unique_ptr Context::createRenderbufferResource(gfx::RenderbufferPixelType, Size) { return std::make_unique(); } @@ -475,7 +479,7 @@ gfx::VertexAttributeArrayPtr Context::createVertexAttributeArray() const { #if !defined(NDEBUG) void Context::visualizeStencilBuffer() {} -void Context::visualizeDepthBuffer(float depthRangeSize) {} +void Context::visualizeDepthBuffer(float) {} #endif // !defined(NDEBUG) void Context::clearStencilBuffer(int32_t) { @@ -625,7 +629,7 @@ MTLDepthStencilStatePtr Context::makeDepthStencilState(const gfx::DepthMode& dep void Context::bindGlobalUniformBuffers(gfx::RenderPass& renderPass) const noexcept { auto& mtlRenderPass = static_cast(renderPass); - globalUniformBuffers.bind(mtlRenderPass); + globalUniformBuffers.bindMtl(mtlRenderPass); } } // namespace mtl diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index e41d8c79c957..84c760373b98 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -316,7 +316,6 @@ void Drawable::draw(PaintParameters& parameters) const { } } - impl->uniformBuffers.unbind(renderPass); unbindTextures(renderPass); unbindAttributes(renderPass); } diff --git a/src/mbgl/mtl/layer_group.cpp b/src/mbgl/mtl/layer_group.cpp index e3016cbf6c65..f13552770a48 100644 --- a/src/mbgl/mtl/layer_group.cpp +++ b/src/mbgl/mtl/layer_group.cpp @@ -51,21 +51,17 @@ void LayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { return; } - for (const auto& tweaker : drawable.getTweakers()) { - tweaker->execute(drawable, parameters); - } - if (!bindUBOs) { - uniformBuffers.bind(renderPass); + uniformBuffers.bindMtl(renderPass); bindUBOs = true; } + for (const auto& tweaker : drawable.getTweakers()) { + tweaker->execute(drawable, parameters); + } + drawable.draw(parameters); }); - - if (bindUBOs) { - uniformBuffers.unbind(renderPass); - } } } // namespace mtl diff --git a/src/mbgl/mtl/renderer_backend.cpp b/src/mbgl/mtl/renderer_backend.cpp index 6e8748e912a5..3fc14b25a375 100644 --- a/src/mbgl/mtl/renderer_backend.cpp +++ b/src/mbgl/mtl/renderer_backend.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -57,21 +59,21 @@ PremultipliedImage RendererBackend::readFramebuffer(const Size& size) { return PremultipliedImage(size); } -void RendererBackend::assumeFramebufferBinding(const mtl::FramebufferID fbo) {} +void RendererBackend::assumeFramebufferBinding(const mtl::FramebufferID) {} -void RendererBackend::assumeViewport(int32_t x, int32_t y, const Size& size) {} +void RendererBackend::assumeViewport(int32_t, int32_t, const Size&) {} -void RendererBackend::assumeScissorTest(bool enabled) {} +void RendererBackend::assumeScissorTest(bool) {} bool RendererBackend::implicitFramebufferBound() { return false; } -void RendererBackend::setFramebufferBinding(const mtl::FramebufferID fbo) {} +void RendererBackend::setFramebufferBinding(const mtl::FramebufferID) {} -void RendererBackend::setViewport(int32_t x, int32_t y, const Size& size) {} +void RendererBackend::setViewport(int32_t, int32_t, const Size&) {} -void RendererBackend::setScissorTest(bool enabled) {} +void RendererBackend::setScissorTest(bool) {} /// @brief Register a list of types with a shader registry instance /// @tparam ...ShaderID Pack of BuiltIn:: shader IDs @@ -105,6 +107,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::ClippingMaskProgram, shaders::BuiltIn::CollisionBoxShader, shaders::BuiltIn::CollisionCircleShader, + shaders::BuiltIn::CustomGeometryShader, shaders::BuiltIn::CustomSymbolIconShader, shaders::BuiltIn::DebugShader, shaders::BuiltIn::FillShader, @@ -122,6 +125,8 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LineGradientShader, shaders::BuiltIn::LineSDFShader, shaders::BuiltIn::LinePatternShader, + shaders::BuiltIn::LocationIndicatorShader, + shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, shaders::BuiltIn::SymbolSDFIconShader, diff --git a/src/mbgl/mtl/tile_layer_group.cpp b/src/mbgl/mtl/tile_layer_group.cpp index 82eb2ff6cb32..6716adda9763 100644 --- a/src/mbgl/mtl/tile_layer_group.cpp +++ b/src/mbgl/mtl/tile_layer_group.cpp @@ -125,6 +125,11 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { return; } + if (!bindUBOs) { + uniformBuffers.bindMtl(renderPass); + bindUBOs = true; + } + for (const auto& tweaker : drawable.getTweakers()) { tweaker->execute(drawable, parameters); } @@ -137,17 +142,8 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { renderPass.setDepthStencilState(state); } - if (!bindUBOs) { - uniformBuffers.bind(renderPass); - bindUBOs = true; - } - drawable.draw(parameters); }); - - if (bindUBOs) { - uniformBuffers.unbind(renderPass); - } } } // namespace mtl diff --git a/src/mbgl/mtl/uniform_buffer.cpp b/src/mbgl/mtl/uniform_buffer.cpp index f800323225a4..29446412653b 100644 --- a/src/mbgl/mtl/uniform_buffer.cpp +++ b/src/mbgl/mtl/uniform_buffer.cpp @@ -39,7 +39,7 @@ void UniformBuffer::update(const void* data, std::size_t dataSize) { buffer.update(data, dataSize, /*offset=*/0); } -void UniformBufferArray::bind(RenderPass& renderPass) const noexcept { +void UniformBufferArray::bindMtl(RenderPass& renderPass) const noexcept { for (size_t id = 0; id < allocatedSize(); id++) { const auto& uniformBuffer = get(id); if (!uniformBuffer) continue; @@ -54,5 +54,9 @@ void UniformBufferArray::bind(RenderPass& renderPass) const noexcept { } } +void UniformBufferArray::bind(gfx::RenderPass& renderPass) { + bindMtl(static_cast(renderPass)); +} + } // namespace mtl } // namespace mbgl diff --git a/src/mbgl/mtl/upload_pass.cpp b/src/mbgl/mtl/upload_pass.cpp index e31af6e5be48..fefbc41637eb 100644 --- a/src/mbgl/mtl/upload_pass.cpp +++ b/src/mbgl/mtl/upload_pass.cpp @@ -81,30 +81,27 @@ void UploadPass::updateIndexBufferResource(gfx::IndexBufferResource& resource, c static_cast(resource).get().update(data, size, /*offset=*/0); } -std::unique_ptr UploadPass::createTextureResource(const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { +std::unique_ptr UploadPass::createTextureResource(const Size, + const void*, + gfx::TexturePixelType, + gfx::TextureChannelDataType) { assert(false); throw std::runtime_error("UploadPass::createTextureResource not implemented on Metal!"); } -void UploadPass::updateTextureResource(gfx::TextureResource& resource, - const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { +void UploadPass::updateTextureResource( + gfx::TextureResource&, const Size, const void*, gfx::TexturePixelType, gfx::TextureChannelDataType) { assert(false); throw std::runtime_error("UploadPass::updateTextureResource not implemented on Metal!"); } -void UploadPass::updateTextureResourceSub(gfx::TextureResource& resource, - const uint16_t xOffset, - const uint16_t yOffset, - const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { +void UploadPass::updateTextureResourceSub(gfx::TextureResource&, + const uint16_t, + const uint16_t, + const Size, + const void*, + gfx::TexturePixelType, + gfx::TextureChannelDataType) { assert(false); throw std::runtime_error("UploadPass::updateTextureResourceSub not implemented on Metal!"); } @@ -151,10 +148,10 @@ const gfx::UniqueVertexBufferResource& UploadPass::getBuffer(const gfx::VertexVe } gfx::AttributeBindingArray UploadPass::buildAttributeBindings( - const std::size_t vertexCount, - const gfx::AttributeDataType vertexType, - const std::size_t vertexAttributeIndex, - const std::vector& vertexData, + [[maybe_unused]] const std::size_t vertexCount, + [[maybe_unused]] const gfx::AttributeDataType vertexType, + [[maybe_unused]] const std::size_t vertexAttributeIndex, + [[maybe_unused]] const std::vector& vertexData, const gfx::VertexAttributeArray& defaults, const gfx::VertexAttributeArray& overrides, const gfx::BufferUsageType usage, @@ -166,7 +163,7 @@ gfx::AttributeBindingArray UploadPass::buildAttributeBindings( bindings.resize(defaults.allocatedSize()); // For each attribute in the program, with the corresponding default and optional override... - const auto resolveAttr = [&](const size_t id, auto& default_, auto& override_) -> void { + const auto resolveAttr = [&]([[maybe_unused]] const size_t id, auto& default_, auto& override_) -> void { auto& effectiveAttr = override_ ? *override_ : default_; const auto& defaultAttr = static_cast(default_); const auto index = static_cast(defaultAttr.getIndex()); diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index bc8e551883cc..e123a18282db 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -42,7 +42,7 @@ #endif -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR #include #include @@ -145,7 +145,7 @@ class RenderLocationIndicatorImpl { friend vec2 operator-(const vec2& v1, const vec2& v2) { return {v1.x - v2.x, v1.y - v2.y}; } }; -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR struct Shader { virtual ~Shader() { release(); } void release() { @@ -420,7 +420,7 @@ void main() { #endif -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR struct TextureInfo { std::shared_ptr texture; std::optional> image; @@ -485,7 +485,7 @@ void main() { } void release() { -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR if (!simpleShader.program) return; for (const auto& t : textures) t.second->release(); buffer.release(); @@ -515,7 +515,7 @@ void main() { params.puckShadowScale != oldParams.puckShadowScale) bearingChanged = true; // changes puck geometry but not necessarily the location if (params.errorRadiusMeters != oldParams.errorRadiusMeters) radiusChanged = true; -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR bearingChanged |= setTextureFromImageID(params.puckImagePath, texPuck, params); bearingChanged |= setTextureFromImageID(params.puckShadowImagePath, texShadow, params); bearingChanged |= setTextureFromImageID(params.puckHatImagePath, texPuckHat, params); @@ -551,7 +551,7 @@ void main() { if (!dirtyFeature) return; dirtyFeature = false; featureEnvelope->clear(); -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR if (!texPuck || !texPuck->isValid()) return; #else if (!puckDrawableInfo.textureInfo.texture) return; @@ -593,7 +593,7 @@ void main() { } void updateRadius(const mbgl::LocationIndicatorRenderParameters& params) { -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR auto& circle = circleDrawableInfo.geometry; circleDrawableInfo.dirty = true; #endif @@ -711,7 +711,7 @@ void main() { params.perspectiveCompensation; // Compensation factor for the perspective deformation // ^ clamping this to 0.8 to avoid growing the puck too much close to the camera. -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR const double shadowRadius = ((texShadow) ? texShadow->width / texShadow->pixelRatio : 0.0) * params.puckShadowScale * M_SQRT2 * 0.5 * horizontalScaleFactor; // Technically it's not the radius, but @@ -756,7 +756,7 @@ void main() { } } -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR void drawRadius(const mbgl::LocationIndicatorRenderParameters& params) { if (!(params.errorRadiusMeters > 0.0) || (params.errorRadiusColor.a == 0.0 && params.errorRadiusBorderColor.a == 0.0)) @@ -818,7 +818,7 @@ void main() { return s.screenCoordinateToLatLng(flippedPoint, wrapMode); } -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR bool setTextureFromImageID(const std::string& imagePath, std::shared_ptr& texture, const mbgl::LocationIndicatorRenderParameters& params) { @@ -879,7 +879,7 @@ void main() { bool initialized = false; bool dirtyFeature = true; -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR public: struct QuadDrawableInfo { @@ -1015,7 +1015,7 @@ void RenderLocationIndicatorLayer::populateDynamicRenderFeatureIndex(DynamicFeat if (!renderImpl->featureEnvelope->empty()) index.insert(renderImpl->feature, renderImpl->featureEnvelope); } -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR void RenderLocationIndicatorLayer::render(PaintParameters& paintParameters) { auto& glContext = static_cast(paintParameters.context); @@ -1035,7 +1035,7 @@ void RenderLocationIndicatorLayer::render(PaintParameters& paintParameters) { } #endif -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, gfx::Context& context, @@ -1092,8 +1092,11 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, const auto createQuadGeometry = [&](gfx::Drawable& drawable, const auto& geometry) { auto vertexAttrs = context.createVertexAttributeArray(); + drawable.setVertices({}, 4, gfx::AttributeDataType::Float2); + vertexAttrs->set(shaders::idLocationIndicatorPosVertexAttribute, 0, gfx::AttributeDataType::Float2, 4); + if (const auto& attr = vertexAttrs->set( - shaders::idCommonTexVertexAttribute, 0, gfx::AttributeDataType::Float2)) { + shaders::idLocationIndicatorTexVertexAttribute, 0, gfx::AttributeDataType::Float2, 4)) { const std::array texCoords = { {{0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}}}; @@ -1125,7 +1128,9 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, drawable->setName(name); drawable->setRenderPass(drawPasses); - drawable->setDepthType(gfx::DepthMaskType::ReadWrite); + drawable->setDepthType(gfx::DepthMaskType::ReadOnly); + drawable->setEnableDepth(false); + drawable->setEnableStencil(false); drawable->setColorMode(drawPasses == RenderPass::Translucent ? gfx::ColorMode::alphaBlended() : gfx::ColorMode::unblended()); @@ -1146,7 +1151,9 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, drawable->setName(name); drawable->setRenderPass(drawPasses); - drawable->setDepthType(gfx::DepthMaskType::ReadWrite); + drawable->setDepthType(gfx::DepthMaskType::ReadOnly); + drawable->setEnableDepth(false); + drawable->setEnableStencil(false); drawable->setColorMode(drawPasses == RenderPass::Translucent ? gfx::ColorMode::alphaBlended() : gfx::ColorMode::unblended()); @@ -1240,7 +1247,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, } auto& circleVertexAttrs = circleDrawable.getVertexAttributes(); - if (const auto& attr = circleVertexAttrs->set(shaders::idCommonPosVertexAttribute)) { + if (const auto& attr = circleVertexAttrs->set(shaders::idLocationIndicatorPosVertexAttribute)) { attr->setSharedRawData( verts, 0, 0, sizeof(RenderLocationIndicatorImpl::vec2), gfx::AttributeDataType::Float2); } @@ -1254,7 +1261,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, auto vertexAttrs = drawable.getVertexAttributes(); if (const auto& attr = vertexAttrs->set( - shaders::idCommonPosVertexAttribute, 0, gfx::AttributeDataType::Float2)) { + shaders::idLocationIndicatorPosVertexAttribute, 0, gfx::AttributeDataType::Float2)) { auto geoDataPtr = reinterpret_cast(info.geometry.data()); auto geoDataSize = info.geometry.size() * sizeof(RenderLocationIndicatorImpl::vec2); @@ -1281,7 +1288,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders, info.textureInfo.image.reset(); } - drawable.setTexture(info.textureInfo.texture, shaders::idCommonTexture); + drawable.setTexture(info.textureInfo.texture, shaders::idLocationIndicatorTexture); info.textureInfo.dirty = false; } }; diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.hpp b/src/mbgl/renderer/layers/render_location_indicator_layer.hpp index fffeae0b3f99..35eab959117c 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.hpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.hpp @@ -5,6 +5,10 @@ #include #include +#if !MLN_RENDER_BACKEND_OPENGL +#define MLN_DRAWABLE_LOCATION_INDICATOR +#endif + namespace mbgl { class RenderLocationIndicatorImpl; class RenderLocationIndicatorLayer final : public RenderLayer { @@ -21,7 +25,7 @@ class RenderLocationIndicatorLayer final : public RenderLayer { explicit RenderLocationIndicatorLayer(Immutable); ~RenderLocationIndicatorLayer() override; -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR void update(gfx::ShaderRegistry &, gfx::Context &, const TransformState &, @@ -38,7 +42,7 @@ class RenderLocationIndicatorLayer final : public RenderLayer { void markContextDestroyed() override; void prepare(const LayerPrepareParameters &) override; -#if MLN_RENDER_BACKEND_OPENGL +#ifndef MLN_DRAWABLE_LOCATION_INDICATOR void render(PaintParameters &) override; #endif @@ -49,7 +53,7 @@ class RenderLocationIndicatorLayer final : public RenderLayer { std::unique_ptr renderImpl; style::LocationIndicatorPaintProperties::Unevaluated unevaluated; -#if !MLN_RENDER_BACKEND_OPENGL +#ifdef MLN_DRAWABLE_LOCATION_INDICATOR // Drawable shaders gfx::ShaderProgramBasePtr quadShader; gfx::ShaderProgramBasePtr circleShader; diff --git a/src/mbgl/shaders/gl/shader_info.cpp b/src/mbgl/shaders/gl/shader_info.cpp index c51b8da8b0e6..7e9e28a5cb77 100644 --- a/src/mbgl/shaders/gl/shader_info.cpp +++ b/src/mbgl/shaders/gl/shader_info.cpp @@ -95,6 +95,20 @@ const std::vector CollisionCircleShaderInfo::attributes = { }; const std::vector CollisionCircleShaderInfo::textures = {}; +// Custom Geometry +using CustomGeometryInfo = ShaderInfo; + +const std::vector CustomGeometryInfo::uniformBlocks = { + UniformBlockInfo{"CustomGeometryDrawableUBO", idCustomGeometryDrawableUBO}, +}; +const std::vector CustomGeometryInfo::attributes = { + AttributeInfo{"a_pos", idCustomGeometryPosVertexAttribute}, + AttributeInfo{"a_uv", idCustomGeometryTexVertexAttribute}, +}; +const std::vector CustomGeometryInfo::textures = { + TextureInfo{"u_image", idCustomGeometryTexture}, +}; + // Custom Symbol Icon using CustomSymbolIconShaderInfo = ShaderInfo; @@ -322,6 +336,30 @@ const std::vector LineShaderInfo::attributes = { }; const std::vector LineShaderInfo::textures = {}; +// Location Indicator +using LocationIndicatorInfo = ShaderInfo; + +const std::vector LocationIndicatorInfo::uniformBlocks = { + UniformBlockInfo{"LocationIndicatorDrawableUBO", idLocationIndicatorDrawableUBO}, +}; +const std::vector LocationIndicatorInfo::attributes = { + AttributeInfo{"a_pos", idLocationIndicatorPosVertexAttribute}, +}; +const std::vector LocationIndicatorInfo::textures = {}; + +using LocationIndicatorTexturedInfo = ShaderInfo; + +const std::vector LocationIndicatorTexturedInfo::uniformBlocks = { + UniformBlockInfo{"LocationIndicatorDrawableUBO", idLocationIndicatorDrawableUBO}, +}; +const std::vector LocationIndicatorTexturedInfo::attributes = { + AttributeInfo{"a_pos", idLocationIndicatorPosVertexAttribute}, + AttributeInfo{"a_uv", idLocationIndicatorTexVertexAttribute}, +}; +const std::vector LocationIndicatorTexturedInfo::textures = { + TextureInfo{"u_image", idLocationIndicatorTexture}, +}; + // Line Gradient using LineGradientShaderInfo = ShaderInfo; diff --git a/src/mbgl/shaders/mtl/custom_geometry.cpp b/src/mbgl/shaders/mtl/custom_geometry.cpp new file mode 100644 index 000000000000..45cfe5b074bd --- /dev/null +++ b/src/mbgl/shaders/mtl/custom_geometry.cpp @@ -0,0 +1,17 @@ +#include +#include + +namespace mbgl { +namespace shaders { + +using CustomGeometryShaderSource = ShaderSource; + +const std::array CustomGeometryShaderSource::attributes = { + AttributeInfo{customGeometryUBOCount + 0, gfx::AttributeDataType::Float3, idCustomGeometryPosVertexAttribute}, + AttributeInfo{customGeometryUBOCount + 1, gfx::AttributeDataType::Float2, idCustomGeometryTexVertexAttribute}, +}; + +const std::array CustomGeometryShaderSource::textures = {TextureInfo{0, idCustomGeometryTexture}}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/mtl/location_indicator.cpp b/src/mbgl/shaders/mtl/location_indicator.cpp new file mode 100644 index 000000000000..fcdd06d4eee0 --- /dev/null +++ b/src/mbgl/shaders/mtl/location_indicator.cpp @@ -0,0 +1,25 @@ +#include +#include + +namespace mbgl { +namespace shaders { + +using LocationIndicatorShaderSource = ShaderSource; + +const std::array LocationIndicatorShaderSource::attributes = {AttributeInfo{ + locationIndicatorUBOCount + 0, gfx::AttributeDataType::Float2, idLocationIndicatorPosVertexAttribute}}; + +using LocationIndicatorTexturedShaderSource = + ShaderSource; + +const std::array LocationIndicatorTexturedShaderSource::attributes = { + AttributeInfo{locationIndicatorUBOCount + 0, gfx::AttributeDataType::Float2, idLocationIndicatorPosVertexAttribute}, + AttributeInfo{locationIndicatorUBOCount + 1, gfx::AttributeDataType::Float2, idLocationIndicatorTexVertexAttribute}, +}; + +const std::array LocationIndicatorTexturedShaderSource::textures = { + TextureInfo{0, idLocationIndicatorTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/custom_geometry.cpp b/src/mbgl/shaders/vulkan/custom_geometry.cpp new file mode 100644 index 000000000000..d224402fe6ce --- /dev/null +++ b/src/mbgl/shaders/vulkan/custom_geometry.cpp @@ -0,0 +1,20 @@ +#include +#include +#include + +namespace mbgl { +namespace shaders { + +using CustomGeometryShaderSource = ShaderSource; + +const std::array CustomGeometryShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Float3, idCustomGeometryPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Float2, idCustomGeometryTexVertexAttribute}, +}; + +const std::array CustomGeometryShaderSource::textures = { + TextureInfo{0, idCustomGeometryTexture}, +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/shaders/vulkan/location_indicator.cpp b/src/mbgl/shaders/vulkan/location_indicator.cpp index 2eb9f8e87b4e..31c1aaee77c5 100644 --- a/src/mbgl/shaders/vulkan/location_indicator.cpp +++ b/src/mbgl/shaders/vulkan/location_indicator.cpp @@ -11,7 +11,7 @@ namespace shaders { using LocationIndicatorShaderSource = ShaderSource; const std::array LocationIndicatorShaderSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, + AttributeInfo{0, gfx::AttributeDataType::Float2, idLocationIndicatorPosVertexAttribute}, }; const std::array LocationIndicatorShaderSource::textures = {}; @@ -22,11 +22,11 @@ using LocationIndicatorShaderTexturedSource = ShaderSource; const std::array LocationIndicatorShaderTexturedSource::attributes = { - AttributeInfo{0, gfx::AttributeDataType::Float2, idCommonPosVertexAttribute}, - AttributeInfo{1, gfx::AttributeDataType::Float2, idCommonTexVertexAttribute}, + AttributeInfo{0, gfx::AttributeDataType::Float2, idLocationIndicatorPosVertexAttribute}, + AttributeInfo{1, gfx::AttributeDataType::Float2, idLocationIndicatorTexVertexAttribute}, }; const std::array LocationIndicatorShaderTexturedSource::textures = { - TextureInfo{0, idCommonTexture}, + TextureInfo{0, idLocationIndicatorTexture}, }; } // namespace shaders diff --git a/src/mbgl/style/layers/custom_drawable_layer.cpp b/src/mbgl/style/layers/custom_drawable_layer.cpp index 004b441f7b93..3df0ee2c4931 100644 --- a/src/mbgl/style/layers/custom_drawable_layer.cpp +++ b/src/mbgl/style/layers/custom_drawable_layer.cpp @@ -26,9 +26,11 @@ #include #include #include +#include #include #include #include +#include #include @@ -89,8 +91,11 @@ const LayerTypeInfo* CustomDrawableLayer::Impl::staticTypeInfo() noexcept { class LineDrawableTweaker : public gfx::DrawableTweaker { public: - LineDrawableTweaker(const shaders::LineEvaluatedPropsUBO& properties) - : propsUBO(properties) {} + LineDrawableTweaker(const CustomDrawableLayerHost::Interface::LineOptions& options_, + CustomDrawableLayerHost::Interface::LineTweakerCallback&& callback_) + : options(options_), + callback(callback_) {} + ~LineDrawableTweaker() override = default; void init(gfx::Drawable&) override {} @@ -100,14 +105,55 @@ class LineDrawableTweaker : public gfx::DrawableTweaker { return; } + if (callback) { + callback(drawable, parameters, options); + } + +#if MLN_UBO_CONSOLIDATION + if (!layerUniforms) { + layerUniforms = parameters.context.createLayerUniformBufferArray(); + } +#endif + const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); const auto zoom = parameters.state.getZoom(); - mat4 tileMatrix; - parameters.state.matrixFor(/*out*/ tileMatrix, tileID); const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); + const shaders::LineEvaluatedPropsUBO propsUBO = {options.color, + options.blur, + options.opacity, + options.gapWidth, + options.offset, + options.width, + /*floorwidth=*/0.0f, + LineExpressionMask::None, + 0}; + + // We would need to set up `idLineExpressionUBO` if the expression mask isn't empty + assert(propsUBO.expressionMask == LineExpressionMask::None); + + if (!expressionUniformBuffer) { + const LineExpressionUBO exprUBO = { + /* .color = */ nullptr, + /* .blur = */ nullptr, + /* .opacity = */ nullptr, + /* .gapwidth = */ nullptr, + /* .offset = */ nullptr, + /* .width = */ nullptr, + /* .floorWidth = */ nullptr, + }; + + expressionUniformBuffer = parameters.context.createUniformBuffer(&exprUBO, sizeof(exprUBO)); +#if MLN_UBO_CONSOLIDATION + layerUniforms->set(idLineExpressionUBO, expressionUniformBuffer); +#else + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.set(idLineExpressionUBO, expressionUniformBuffer); +#endif + } + #if MLN_UBO_CONSOLIDATION shaders::LineDrawableUnionUBO drawableUBO; drawableUBO.lineDrawableUBO = { @@ -125,33 +171,45 @@ class LineDrawableTweaker : public gfx::DrawableTweaker { /* .width_t = */ 0.f, /* .pad1 = */ 0 }; - auto& drawableUniforms = drawable.mutableUniformBuffers(); - drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, parameters.context, true); - drawableUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &propsUBO, parameters.context); - // We would need to set up `idLineExpressionUBO` if the expression mask isn't empty - assert(propsUBO.expressionMask == LineExpressionMask::None); +#if MLN_UBO_CONSOLIDATION + if (!drawableUniformBuffer) { + drawableUniformBuffer = parameters.context.createUniformBuffer( + &drawableUBO, sizeof(drawableUBO), false, true); + + layerUniforms->set(idLineDrawableUBO, drawableUniformBuffer); + drawable.setUBOIndex(0); + } else { + drawableUniformBuffer->update(&drawableUBO, sizeof(drawableUBO)); + } - const LineExpressionUBO exprUBO = { - /* .color = */ nullptr, - /* .blur = */ nullptr, - /* .opacity = */ nullptr, - /* .gapwidth = */ nullptr, - /* .offset = */ nullptr, - /* .width = */ nullptr, - /* .floorWidth = */ nullptr, - }; - drawableUniforms.createOrUpdate(idLineExpressionUBO, &exprUBO, parameters.context); + layerUniforms->createOrUpdate(idLineEvaluatedPropsUBO, &propsUBO, sizeof(propsUBO), parameters.context); + layerUniforms->bind(*parameters.renderPass); +#else + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idLineDrawableUBO, &drawableUBO, parameters.context); + drawableUniforms.createOrUpdate(idLineEvaluatedPropsUBO, &propsUBO, parameters.context); +#endif }; private: - shaders::LineEvaluatedPropsUBO propsUBO; + CustomDrawableLayerHost::Interface::LineOptions options; + CustomDrawableLayerHost::Interface::LineTweakerCallback callback; + +#if MLN_UBO_CONSOLIDATION + gfx::UniqueUniformBufferArray layerUniforms; + gfx::UniformBufferPtr drawableUniformBuffer; +#endif + + gfx::UniformBufferPtr expressionUniformBuffer; }; class WideVectorDrawableTweaker : public gfx::DrawableTweaker { public: - WideVectorDrawableTweaker(const CustomDrawableLayerHost::Interface::LineOptions& options_) - : options(options_) {} + WideVectorDrawableTweaker(const CustomDrawableLayerHost::Interface::LineOptions& options_, + CustomDrawableLayerHost::Interface::LineTweakerCallback&& callback_) + : options(options_), + callback(callback_) {} void init(gfx::Drawable&) override {} @@ -160,6 +218,10 @@ class WideVectorDrawableTweaker : public gfx::DrawableTweaker { return; } + if (callback) { + callback(drawable, parameters, options); + } + const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); mat4 tileMatrix; @@ -211,13 +273,16 @@ class WideVectorDrawableTweaker : public gfx::DrawableTweaker { private: CustomDrawableLayerHost::Interface::LineOptions options; + CustomDrawableLayerHost::Interface::LineTweakerCallback callback; }; class FillDrawableTweaker : public gfx::DrawableTweaker { public: - FillDrawableTweaker(const Color& color_, float opacity_) - : color(color_), - opacity(opacity_) {} + FillDrawableTweaker(const CustomDrawableLayerHost::Interface::FillOptions& options_, + CustomDrawableLayerHost::Interface::FillTweakerCallback&& callback_) + : options(options_), + callback(callback_) {} + ~FillDrawableTweaker() override = default; void init(gfx::Drawable&) override {} @@ -227,15 +292,29 @@ class FillDrawableTweaker : public gfx::DrawableTweaker { return; } - const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - mat4 tileMatrix; - parameters.state.matrixFor(/*out*/ tileMatrix, tileID); + if (callback) { + callback(drawable, parameters, options); + } + +#if MLN_UBO_CONSOLIDATION + if (!layerUniforms) { + layerUniforms = parameters.context.createLayerUniformBufferArray(); + } +#endif + const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); + const shaders::FillEvaluatedPropsUBO propsUBO = {/* .color = */ options.color, + /* .outline_color = */ Color::white(), + /* .opacity = */ options.opacity, + /* .fade = */ 0.f, + /* .from_scale = */ 0.f, + /* .to_scale = */ 0.f}; + #if MLN_UBO_CONSOLIDATION - shaders::FillDrawableUnionUBO drawableUBO; + FillDrawableUnionUBO drawableUBO; drawableUBO.fillDrawableUBO = { #else const shaders::FillDrawableUBO drawableUBO = { @@ -248,26 +327,42 @@ class FillDrawableTweaker : public gfx::DrawableTweaker { /* .pad2 = */ 0 }; - const shaders::FillEvaluatedPropsUBO propsUBO = {/* .color = */ color, - /* .outline_color = */ Color::white(), - /* .opacity = */ opacity, - /* .fade = */ 0.f, - /* .from_scale = */ 0.f, - /* .to_scale = */ 0.f}; +#if MLN_UBO_CONSOLIDATION + if (!drawableUniformBuffer) { + drawableUniformBuffer = parameters.context.createUniformBuffer( + &drawableUBO, sizeof(drawableUBO), false, true); + + layerUniforms->set(idFillDrawableUBO, drawableUniformBuffer); + drawable.setUBOIndex(0); + } else { + drawableUniformBuffer->update(&drawableUBO, sizeof(drawableUBO)); + } + + layerUniforms->createOrUpdate(idFillEvaluatedPropsUBO, &propsUBO, sizeof(propsUBO), parameters.context); + layerUniforms->bind(*parameters.renderPass); +#else auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idFillDrawableUBO, &drawableUBO, parameters.context); drawableUniforms.createOrUpdate(idFillEvaluatedPropsUBO, &propsUBO, parameters.context); +#endif }; private: - Color color; - float opacity; + CustomDrawableLayerHost::Interface::FillOptions options; + CustomDrawableLayerHost::Interface::FillTweakerCallback callback; + +#if MLN_UBO_CONSOLIDATION + gfx::UniqueUniformBufferArray layerUniforms; + gfx::UniformBufferPtr drawableUniformBuffer; +#endif }; class SymbolDrawableTweaker : public gfx::DrawableTweaker { public: - SymbolDrawableTweaker(const CustomDrawableLayerHost::Interface::SymbolOptions& options_) - : options(options_) {} + SymbolDrawableTweaker(const CustomDrawableLayerHost::Interface::SymbolOptions& options_, + CustomDrawableLayerHost::Interface::SymbolTweakerCallback&& callback_) + : options(options_), + callback(callback_) {} ~SymbolDrawableTweaker() override = default; void init(gfx::Drawable&) override {} @@ -277,9 +372,11 @@ class SymbolDrawableTweaker : public gfx::DrawableTweaker { return; } + if (callback) { + callback(drawable, parameters, options); + } + const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - mat4 tileMatrix; - parameters.state.matrixFor(/*out*/ tileMatrix, tileID); const auto matrix = LayerTweaker::getTileMatrix( tileID, parameters, {{0, 0}}, style::TranslateAnchorType::Viewport, false, false, drawable, false); @@ -312,6 +409,38 @@ class SymbolDrawableTweaker : public gfx::DrawableTweaker { private: CustomDrawableLayerHost::Interface::SymbolOptions options; + CustomDrawableLayerHost::Interface::SymbolTweakerCallback callback; +}; + +class GeometryDrawableTweaker : public gfx::DrawableTweaker { +public: + GeometryDrawableTweaker(const CustomDrawableLayerHost::Interface::GeometryOptions& options_, + CustomDrawableLayerHost::Interface::GeometryTweakerCallback&& callback_) + : options(options_), + callback(callback_) {} + ~GeometryDrawableTweaker() override = default; + + void init(gfx::Drawable&) override {} + + void execute(gfx::Drawable& drawable, PaintParameters& parameters) override { + if (!drawable.getTileID().has_value()) { + return; + } + + if (callback) { + callback(drawable, parameters, options); + } + + CustomGeometryDrawableUBO drawableUBO = {/* .matrix = */ util::cast(options.matrix), + /* .color = */ options.color}; + + auto& drawableUniforms = drawable.mutableUniformBuffers(); + drawableUniforms.createOrUpdate(idCustomGeometryDrawableUBO, &drawableUBO, parameters.context); + }; + +private: + CustomDrawableLayerHost::Interface::GeometryOptions options; + CustomDrawableLayerHost::Interface::GeometryTweakerCallback callback; }; CustomDrawableLayerHost::Interface::Interface(RenderLayer& layer_, @@ -364,6 +493,11 @@ void CustomDrawableLayerHost::Interface::setSymbolOptions(const SymbolOptions& o symbolOptions = options; } +void CustomDrawableLayerHost::Interface::setGeometryOptions(const GeometryOptions& options) { + finish(); + geometryOptions = options; +} + bool CustomDrawableLayerHost::Interface::updateBuilder(BuilderType type, const std::string& name, gfx::ShaderPtr shader) { @@ -378,17 +512,22 @@ bool CustomDrawableLayerHost::Interface::updateBuilder(BuilderType type, return true; }; -bool CustomDrawableLayerHost::Interface::addPolyline(const LineString& coordinates) { - switch (lineOptions.shaderType) { +util::SimpleIdentity CustomDrawableLayerHost::Interface::addPolyline(const LineString& coordinates, + LineShaderType shaderType) { +#if !MLN_RENDER_BACKEND_METAL + shaderType = LineShaderType::Classic; +#endif + + switch (shaderType) { case LineShaderType::Classic: { // TODO: build classic polyline with Geo coordinates - return false; + return util::SimpleIdentity::Empty; } break; - case LineShaderType::MetalWideVector: { + case LineShaderType::WideVector: { // build wide vector polyline with Geo coordinates if (!updateBuilder(BuilderType::LineWideVector, "custom-lines-widevector", lineShaderWideVector())) - return false; + return util::SimpleIdentity::Empty; // geographic coordinates require tile {0, 0, 0} setTileID({0, 0, 0}); @@ -397,32 +536,42 @@ bool CustomDrawableLayerHost::Interface::addPolyline(const LineString& c } break; } - return true; + return builder->getCurrentDrawable(true)->getID(); } -bool CustomDrawableLayerHost::Interface::addPolyline(const GeometryCoordinates& coordinates) { - switch (lineOptions.shaderType) { +util::SimpleIdentity CustomDrawableLayerHost::Interface::addPolyline(const GeometryCoordinates& coordinates, + LineShaderType shaderType) { +#if !MLN_RENDER_BACKEND_METAL + shaderType = LineShaderType::Classic; +#endif + + switch (shaderType) { case LineShaderType::Classic: { // build classic polyline with Tile coordinates - if (!updateBuilder(BuilderType::LineClassic, "custom-lines", lineShaderDefault())) return false; + if (!updateBuilder(BuilderType::LineClassic, "custom-lines", lineShaderDefault())) { + return util::SimpleIdentity::Empty; + } + builder->addPolyline(coordinates, lineOptions.geometry); } break; - case LineShaderType::MetalWideVector: { + case LineShaderType::WideVector: { // build wide vector polyline if (!updateBuilder(BuilderType::LineWideVector, "custom-lines-widevector", lineShaderWideVector())) - return false; + return util::SimpleIdentity::Empty; builder->addWideVectorPolylineLocal(coordinates, lineOptions.geometry); } break; } - return true; + return builder->getCurrentDrawable(true)->getID(); } -bool CustomDrawableLayerHost::Interface::addFill(const GeometryCollection& geometry) { +util::SimpleIdentity CustomDrawableLayerHost::Interface::addFill(const GeometryCollection& geometry) { // build fill - if (!updateBuilder(BuilderType::Fill, "custom-fill", fillShaderDefault())) return false; + if (!updateBuilder(BuilderType::Fill, "custom-fill", fillShaderDefault())) { + return util::SimpleIdentity::Empty; + } // provision buffers for fill vertices, indexes and segments using VertexVector = gfx::VertexVector; @@ -451,15 +600,20 @@ bool CustomDrawableLayerHost::Interface::addFill(const GeometryCollection& geome builder->setRawVertices({}, vertices.elements(), gfx::AttributeDataType::Short2); builder->setSegments(gfx::Triangles(), sharedTriangles, triangleSegments.data(), triangleSegments.size()); + const auto& id = builder->getCurrentDrawable(true)->getID(); + // flush current builder drawable builder->flush(context); - return true; + return id; } -bool CustomDrawableLayerHost::Interface::addSymbol(const GeometryCoordinate& point) { +util::SimpleIdentity CustomDrawableLayerHost::Interface::addSymbol( + const GeometryCoordinate& point, const std::array, 2>& textureCoordinates) { // build symbol - if (!updateBuilder(BuilderType::Symbol, "custom-symbol", symbolShaderDefault())) return false; + if (!updateBuilder(BuilderType::Symbol, "custom-symbol", symbolShaderDefault())) { + return util::SimpleIdentity::Empty; + } // temporary: buffers struct CustomSymbolIcon { @@ -477,7 +631,7 @@ bool CustomDrawableLayerHost::Interface::addSymbol(const GeometryCoordinate& poi for (int x = 0; x <= 1; ++x) { vertices.emplace_back( CustomSymbolIcon{{static_cast(point.x * 2 + x), static_cast(point.y * 2 + y)}, - {symbolOptions.textureCoordinates[x][0], symbolOptions.textureCoordinates[y][1]}}); + {textureCoordinates[x][0], textureCoordinates[y][1]}}); } } @@ -517,13 +671,83 @@ bool CustomDrawableLayerHost::Interface::addSymbol(const GeometryCoordinate& poi } // create symbol tweaker - auto tweaker = std::make_shared(symbolOptions); + auto tweaker = std::make_shared(symbolOptions, std::move(symbolTweakerCallback)); builder->addTweaker(tweaker); + const auto& id = builder->getCurrentDrawable(true)->getID(); + // flush current builder drawable builder->flush(context); - return true; + return id; +} + +util::SimpleIdentity CustomDrawableLayerHost::Interface::addGeometry( + std::shared_ptr> vertices, + std::shared_ptr> indices, + bool is3D) { + if (!vertices || !indices) { + return util::SimpleIdentity::Empty; + } + + if (!updateBuilder(BuilderType::Geometry, "custom-geometry", geometryShaderDefault())) { + return util::SimpleIdentity::Empty; + } + + // geographic coordinates require tile {0, 0, 0} + setTileID({0, 0, 0}); + + SegmentVector triangleSegments; + triangleSegments.emplace_back(Segment{0, 0, vertices->elements(), indices->elements()}); + + // add to builder + auto attrs = context.createVertexAttributeArray(); + if (const auto& attr = attrs->set(idCustomGeometryPosVertexAttribute)) { + attr->setSharedRawData(vertices, + offsetof(GeometryVertex, position), + /*vertexOffset=*/0, + sizeof(GeometryVertex), + gfx::AttributeDataType::Float3); + } + + if (const auto& attr = attrs->set(idCustomGeometryTexVertexAttribute)) { + attr->setSharedRawData(vertices, + offsetof(GeometryVertex, texcoords), + /*vertexOffset=*/0, + sizeof(GeometryVertex), + gfx::AttributeDataType::Float2); + } + + builder->setVertexAttributes(std::move(attrs)); + builder->setRawVertices({}, vertices->elements(), gfx::AttributeDataType::Float3); + builder->setSegments(gfx::Triangles(), indices, triangleSegments.data(), triangleSegments.size()); + + builder->setEnableDepth(true); + + if (is3D) { + builder->setDepthType(gfx::DepthMaskType::ReadWrite); + builder->setIs3D(true); + } + + // white texture + if (!geometryOptions.texture) { + auto image = std::make_shared(mbgl::Size(2, 2)); + image->fill(255); + + geometryOptions.texture = context.createTexture2D(); + geometryOptions.texture->setImage(std::move(image)); + } + + builder->setTexture(geometryOptions.texture, shaders::idCustomGeometryTexture); + + builder->addTweaker(std::make_shared(geometryOptions, std::move(geometryTweakerCallback))); + + const auto& id = builder->getCurrentDrawable(true)->getID(); + + // flush current builder drawable + builder->flush(context); + + return id; } void CustomDrawableLayerHost::Interface::finish() { @@ -552,16 +776,7 @@ void CustomDrawableLayerHost::Interface::finish() { // finish building classic lines // create line tweaker - const shaders::LineEvaluatedPropsUBO linePropertiesUBO = {lineOptions.color, - lineOptions.blur, - lineOptions.opacity, - lineOptions.gapWidth, - lineOptions.offset, - lineOptions.width, - /*floorwidth=*/0, - LineExpressionMask::None, - 0}; - auto tweaker = std::make_shared(linePropertiesUBO); + auto tweaker = std::make_shared(lineOptions, std::move(lineTweakerCallback)); // finish drawables finish_(tweaker); @@ -570,7 +785,7 @@ void CustomDrawableLayerHost::Interface::finish() { // finish building wide vector lines // create line tweaker - auto tweaker = std::make_shared(lineOptions); + auto tweaker = std::make_shared(lineOptions, std::move(lineTweakerCallback)); // finish drawables finish_(tweaker); @@ -579,7 +794,7 @@ void CustomDrawableLayerHost::Interface::finish() { // finish building fills // create fill tweaker - auto tweaker = std::make_shared(fillOptions.color, fillOptions.opacity); + auto tweaker = std::make_shared(fillOptions, std::move(fillTweakerCallback)); // finish drawables finish_(tweaker); @@ -588,12 +803,21 @@ void CustomDrawableLayerHost::Interface::finish() { // finish building symbols finish_(nullptr); break; + + case BuilderType::Geometry: + finish_(nullptr); + break; default: break; } } } +void CustomDrawableLayerHost::Interface::removeDrawable(const util::SimpleIdentity& id) { + TileLayerGroup* tileLayerGroup = static_cast(layerGroup.get()); + tileLayerGroup->removeDrawablesIf([&](gfx::Drawable& drawable) { return drawable.getID() == id; }); +} + gfx::ShaderPtr CustomDrawableLayerHost::Interface::lineShaderDefault() const { gfx::ShaderGroupPtr shaderGroup = shaders.getShaderGroup("LineShader"); assert(shaderGroup); @@ -630,6 +854,10 @@ gfx::ShaderPtr CustomDrawableLayerHost::Interface::symbolShaderDefault() const { return context.getGenericShader(shaders, "CustomSymbolIconShader"); } +gfx::ShaderPtr CustomDrawableLayerHost::Interface::geometryShaderDefault() const { + return context.getGenericShader(shaders, "CustomGeometryShader"); +} + std::unique_ptr CustomDrawableLayerHost::Interface::createBuilder(const std::string& name, gfx::ShaderPtr shader) const { std::unique_ptr builder_ = context.createDrawableBuilder(name); diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 678ca378da44..ed795052dfad 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -366,6 +366,11 @@ gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, std::size_t data, size, ssbo ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, persistent)); } +UniqueUniformBufferArray Context::createLayerUniformBufferArray() { + return std::make_unique( + DescriptorSetType::Layer, shaders::globalUBOCount, shaders::maxSSBOCountPerLayer, shaders::maxUBOCountPerLayer); +} + gfx::ShaderProgramBasePtr Context::getGenericShader(gfx::ShaderRegistry& shaders, const std::string& name) { const auto shaderGroup = shaders.getShaderGroup(name); auto shader = shaderGroup ? shaderGroup->getOrCreateShader(*this, {}) : gfx::ShaderProgramBasePtr{}; diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index 06f52581e52f..257cea6b64f5 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -260,23 +260,30 @@ void Drawable::draw(PaintParameters& parameters) const { sizeof(uboIndex), &uboIndex); - if (is3D) { - impl->pipelineInfo.setDepthMode(impl->depthFor3D); - impl->pipelineInfo.setStencilMode(impl->stencilFor3D); - } else { - if (enableDepth) { + if (enableDepth) { + if (impl->depthFor3D.has_value()) { + impl->pipelineInfo.setDepthMode(impl->depthFor3D.value()); + } else if (is3D) { + impl->pipelineInfo.setDepthMode(parameters.depthModeFor3D()); + } else { const auto& depthMode = parameters.depthModeForSublayer(getSubLayerIndex(), getDepthType()); impl->pipelineInfo.setDepthMode(depthMode); - } else { - impl->pipelineInfo.setDepthMode(gfx::DepthMode::disabled()); } + } else { + impl->pipelineInfo.setDepthMode(gfx::DepthMode::disabled()); + } - if (enableStencil) { + if (enableStencil) { + if (impl->stencilFor3D.has_value()) { + impl->pipelineInfo.setStencilMode(impl->stencilFor3D.value()); + } else if (is3D) { + impl->pipelineInfo.setStencilMode(parameters.stencilModeFor3D()); + } else { const auto& stencilMode = parameters.stencilModeForClipping(tileID->toUnwrapped()); impl->pipelineInfo.setStencilMode(stencilMode); - } else { - impl->pipelineInfo.setStencilMode(gfx::StencilMode::disabled()); } + } else { + impl->pipelineInfo.setStencilMode(gfx::StencilMode::disabled()); } impl->pipelineInfo.setRenderable(renderPass_.getDescriptor().renderable); diff --git a/src/mbgl/vulkan/drawable_impl.hpp b/src/mbgl/vulkan/drawable_impl.hpp index a159fa6adc06..b74b5d5f6ce9 100644 --- a/src/mbgl/vulkan/drawable_impl.hpp +++ b/src/mbgl/vulkan/drawable_impl.hpp @@ -44,8 +44,8 @@ class Drawable::Impl final { std::optional renderPassDescriptor; - gfx::DepthMode depthFor3D = gfx::DepthMode::disabled(); - gfx::StencilMode stencilFor3D = gfx::StencilMode::disabled(); + std::optional depthFor3D; + std::optional stencilFor3D; PipelineInfo pipelineInfo; diff --git a/src/mbgl/vulkan/layer_group.cpp b/src/mbgl/vulkan/layer_group.cpp index 9d9d57fba071..3bcf1b0a9b79 100644 --- a/src/mbgl/vulkan/layer_group.cpp +++ b/src/mbgl/vulkan/layer_group.cpp @@ -56,15 +56,15 @@ void LayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { return; } - for (const auto& tweaker : drawable.getTweakers()) { - tweaker->execute(drawable, parameters); - } - if (!bindUBOs) { uniformBuffers.bindDescriptorSets(encoder); bindUBOs = true; } + for (const auto& tweaker : drawable.getTweakers()) { + tweaker->execute(drawable, parameters); + } + drawable.draw(parameters); }); } diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index 277d332ebbcb..e20826c3d080 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -669,6 +670,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::ClippingMaskProgram, shaders::BuiltIn::CollisionBoxShader, shaders::BuiltIn::CollisionCircleShader, + shaders::BuiltIn::CustomGeometryShader, shaders::BuiltIn::CustomSymbolIconShader, shaders::BuiltIn::DebugShader, shaders::BuiltIn::FillShader, diff --git a/src/mbgl/vulkan/tile_layer_group.cpp b/src/mbgl/vulkan/tile_layer_group.cpp index f1326b13b6f3..c33c716ba187 100644 --- a/src/mbgl/vulkan/tile_layer_group.cpp +++ b/src/mbgl/vulkan/tile_layer_group.cpp @@ -92,15 +92,15 @@ void TileLayerGroup::render(RenderOrchestrator&, PaintParameters& parameters) { return; } - for (const auto& tweaker : drawable.getTweakers()) { - tweaker->execute(drawable, parameters); - } - if (!bindUBOs) { uniformBuffers.bindDescriptorSets(encoder); bindUBOs = true; } + for (const auto& tweaker : drawable.getTweakers()) { + tweaker->execute(drawable, parameters); + } + if (features3d) { auto& drawableImpl = static_cast(drawable); diff --git a/src/mbgl/vulkan/uniform_buffer.cpp b/src/mbgl/vulkan/uniform_buffer.cpp index 839622a0dc36..615fc4130f6f 100644 --- a/src/mbgl/vulkan/uniform_buffer.cpp +++ b/src/mbgl/vulkan/uniform_buffer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -68,6 +69,10 @@ void UniformBufferArray::createOrUpdate( gfx::UniformBufferArray::createOrUpdate(id, data, size, context, persistent); } +void UniformBufferArray::bind(gfx::RenderPass& renderPass) { + bindDescriptorSets(static_cast(renderPass).getEncoder()); +} + void UniformBufferArray::bindDescriptorSets(CommandEncoder& encoder) { if (!descriptorSet) { descriptorSet = std::make_unique(encoder.getContext(), descriptorSetType); diff --git a/test/api/custom_drawable_layer.test.cpp b/test/api/custom_drawable_layer.test.cpp index c3e6bd6e57a4..5c20485c21e2 100644 --- a/test/api/custom_drawable_layer.test.cpp +++ b/test/api/custom_drawable_layer.test.cpp @@ -48,7 +48,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, - /*shaderType*/ {}, /*color=*/Color::red(), }, { @@ -58,7 +57,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, - {}, /*color=*/Color::blue(), }, { @@ -68,7 +66,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, - {}, /*color=*/Color(1.f, 0.5f, 0, 0.5f), }, { @@ -78,7 +75,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, - {}, /*color=*/Color(1.f, 1.f, 0, 0.3f), }, { @@ -88,7 +84,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, - {}, /*color=*/Color::black(), }, { @@ -98,7 +93,6 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, - {}, /*color=*/Color(1.f, 0, 1.f, 0.2f), }, }; @@ -125,7 +119,7 @@ class LineTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost { interface.setLineOptions(options[index]); // add polyline - interface.addPolyline(polyline); + interface.addPolyline(polyline, Interface::LineShaderType::Classic); } } @@ -219,10 +213,10 @@ class SymbolIconTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost options.texture->setImage(image); options.texture->setSamplerConfiguration( {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); - options.textureCoordinates = {{{0.0f, 0.08f}, {1.0f, 0.9f}}}; - const float xspan = options.textureCoordinates[1][0] - options.textureCoordinates[0][0]; - const float yspan = options.textureCoordinates[1][1] - options.textureCoordinates[0][1]; - assert(xspan > 0.0f && yspan > 0.0f); + constexpr std::array, 2> textureCoordinates = {{{0.0f, 0.08f}, {1.0f, 0.9f}}}; + constexpr float xspan = textureCoordinates[1][0] - textureCoordinates[0][0]; + constexpr float yspan = textureCoordinates[1][1] - textureCoordinates[0][1]; + static_assert(xspan > 0.0f && yspan > 0.0f); options.size = {static_cast(image->size.width * 0.2f * xspan), static_cast(image->size.height * 0.2f * yspan)}; options.anchor = {0.5f, 0.95f}; @@ -232,7 +226,7 @@ class SymbolIconTestDrawableLayer : public mbgl::style::CustomDrawableLayerHost interface.setSymbolOptions(options); // add symbol - interface.addSymbol(position); + interface.addSymbol(position, textureCoordinates); } // finish diff --git a/test/util/hash.test.cpp b/test/util/hash.test.cpp index d2563a7f7434..7d8c32ad8ebf 100644 --- a/test/util/hash.test.cpp +++ b/test/util/hash.test.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -22,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -128,6 +131,8 @@ TEST(OrderIndependentHash, Shaders) { BuiltIn::CircleShader, BuiltIn::CollisionBoxShader, BuiltIn::CollisionCircleShader, + BuiltIn::CustomGeometryShader, + BuiltIn::CustomSymbolIconShader, BuiltIn::DebugShader, BuiltIn::FillShader, BuiltIn::FillOutlineShader, @@ -144,6 +149,8 @@ TEST(OrderIndependentHash, Shaders) { BuiltIn::LineGradientShader, BuiltIn::LinePatternShader, BuiltIn::LineSDFShader, + BuiltIn::LocationIndicatorShader, + BuiltIn::LocationIndicatorTexturedShader, BuiltIn::RasterShader, BuiltIn::SymbolIconShader, BuiltIn::SymbolSDFIconShader, diff --git a/vendor/tinyobjloader.cmake b/vendor/tinyobjloader.cmake new file mode 100644 index 000000000000..b8b50348f186 --- /dev/null +++ b/vendor/tinyobjloader.cmake @@ -0,0 +1,19 @@ +include(FetchContent) + +FetchContent_Declare( + tinyobjloader + GIT_REPOSITORY "https://github.com/tinyobjloader/tinyobjloader.git" + GIT_TAG release + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE +) + +FetchContent_MakeAvailable(tinyobjloader) + +set_target_properties( + tinyobjloader + PROPERTIES + INTERFACE_MAPLIBRE_NAME "tinyobjloader" + INTERFACE_MAPLIBRE_URL "https://github.com/tinyobjloader/tinyobjloader.git" + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/tinyobjloader/LICENSE +) From feb4b1b5e23e66ffce64b8b8fc9ec7a708abae4b Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 1 Mar 2025 14:42:36 +0100 Subject: [PATCH 095/339] Release MapLibre iOS 6.12.0 (#3263) --- platform/ios/CHANGELOG.md | 12 ++++++++++++ platform/ios/VERSION | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index b834ae9b8810..1a3b259c8f8f 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -2,6 +2,18 @@ MapLibre welcomes participation and contributions from everyone. Please read [`MapLibre iOS Developer Guide`](https://maplibre.org/maplibre-native/docs/book/ios/index.html) to get started. +## main + +## 6.12.0 + +- Eliminate copies in deferred cleanup ([#3035](https://github.com/maplibre/maplibre-native/pull/3035)). +- (Drawable Custom Layers) Reset depth stencil state for render pass ([#3230](https://github.com/maplibre/maplibre-native/pull/3230)). +- Add documentation page for iOS dev apps ([#3244](https://github.com/maplibre/maplibre-native/pull/3244)). +- Remove unused files reachability.h, reachability.m ([#3243](https://github.com/maplibre/maplibre-native/pull/3243)). +- Reduce texture sampler state changes in Metal ([#3236](https://github.com/maplibre/maplibre-native/pull/3236)). +- Add iOS/macOS observer hooks ([#3245](https://github.com/maplibre/maplibre-native/pull/3245)). +- Custom drawable layer v3 ([#3210](https://github.com/maplibre/maplibre-native/pull/3210)). + ## 6.11.0 - Add NSString initializer MLNVectorTileSource ([#3163](https://github.com/maplibre/maplibre-native/pull/3163)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 1de66e5ff864..d4e6cb42939b 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.11.0 +6.12.0 From 691384b4c88baad730c3e1425308e5d76b4145c4 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 3 Mar 2025 00:14:26 +0100 Subject: [PATCH 096/339] Modify .bazelignore to allow reading git hash (#3264) --- .bazelignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.bazelignore b/.bazelignore index 1b520c31717c..bbb6d1890679 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,4 +1,10 @@ -.git +# ignore .git, but make sure we can get commit hash +!.git/HEAD +!.git/refs +!.git/refs/heads +!.git/packed-refs +.git/* + node_modules bazel-out bazel-bin From 75aa3943c6466789a0e6bb7fc60e2c836b7f903a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:44:00 +0100 Subject: [PATCH 097/339] chore(deps): update cxx.rs digest to 0bb4ad8 (#3260) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index bb68cc766b90..bea625ff5244 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -72,7 +72,7 @@ bazel_dep(name = "rules_rust", version = "0.57.1") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", - commit = "94e8e46066b560fb9dc8964f047f68d066786916", + commit = "0bb4ad82075cb304020df928efb784cee9375467", remote = "https://github.com/dtolnay/cxx.git", ) From cdf3df419d7b634653018fbd189f0f002fe9d3a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:44:17 +0100 Subject: [PATCH 098/339] chore(deps): update dependency rules_apple to v3.19.1 (#3261) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index bea625ff5244..e9815777bebd 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,7 +2,7 @@ module(name = "maplibre") bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") -bazel_dep(name = "rules_apple", version = "3.19.0") +bazel_dep(name = "rules_apple", version = "3.19.1") bazel_dep(name = "rules_swift", version = "2.5.0") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") bazel_dep(name = "aspect_rules_js", version = "2.1.3") From 687994d461f02da175204192aa62f8ae5cfd88b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:44:44 +0100 Subject: [PATCH 099/339] chore(deps): update dependency rules_rust to v0.58.0 (#3262) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index e9815777bebd..5677414e21d8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -68,7 +68,7 @@ darwin_config( name = "darwin_config", ) -bazel_dep(name = "rules_rust", version = "0.57.1") +bazel_dep(name = "rules_rust", version = "0.58.0") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", From ff5384d331f68f342fdbc89928ec7f2160a7a0bc Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 3 Mar 2025 22:28:20 +0100 Subject: [PATCH 100/339] Delete .github/workflows/macos-release.yml (#3271) --- .github/workflows/macos-release.yml | 79 ----------------------------- 1 file changed, 79 deletions(-) delete mode 100644 .github/workflows/macos-release.yml diff --git a/.github/workflows/macos-release.yml b/.github/workflows/macos-release.yml deleted file mode 100644 index a6c5c29d8e1b..000000000000 --- a/.github/workflows/macos-release.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: macos-release - -on: - workflow_dispatch: - -jobs: - build: - runs-on: macos-12 - env: - BUILDTYPE: Release - SYMBOLS: NO - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - CILAUNCH: true - defaults: - run: - working-directory: platform/ios - shell: bash - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install macos dependencies - run: | - brew list cmake || brew install cmake - brew list ccache || brew install ccache - brew list pkg-config || brew install pkg-config - brew list glfw || brew install glfw - - - name: Cache node modules - uses: actions/cache@v4 - env: - cache-name: cache-node-modules - with: - path: ~/.npm - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- - - - name: npm install - run: npm install - - - name: Prepare ccache - run: ccache --clear - - - name: Cache ccache - uses: actions/cache@v4 - env: - cache-name: ccache-v1 - with: - path: ~/.ccache' - key: ${{ env.cache-name }}-${{ runner.os }}-${{ github.job }}-${{ github.ref }}-${{ github.sha }}-${{ github.head_ref }} - restore-keys: | - ${{ env.cache-name }}-${{ runner.os }}-${{ github.job }}-${{ github.ref }}-${{ github.sha }} - ${{ env.cache-name }}-${{ runner.os }}-${{ github.job }}-${{ github.ref }} - ${{ env.cache-name }}-${{ runner.os }}-${{ github.job }} - - - name: Clear ccache statistics - run: | - ccache --zero-stats - ccache --max-size=2G - ccache --show-stats - - - name: Install packaging dependencies - run: | - ./platform/ios/scripts/install-packaging-dependencies.sh - - - name: Build package - run: make xpackage - - - name: Deploy package - run: make xdeploy - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 477a67f2093b91f314f03e502a136c5096ba6586 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Tue, 4 Mar 2025 09:32:24 -0800 Subject: [PATCH 101/339] Warn on rejected line geometry (#3088) --- src/mbgl/renderer/buckets/line_bucket.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/mbgl/renderer/buckets/line_bucket.cpp b/src/mbgl/renderer/buckets/line_bucket.cpp index f8c0198a728e..ccfbdba82557 100644 --- a/src/mbgl/renderer/buckets/line_bucket.cpp +++ b/src/mbgl/renderer/buckets/line_bucket.cpp @@ -86,7 +86,19 @@ void LineBucket::addGeometry(const GeometryCoordinates& coordinates, }(); // Ignore invalid geometry. - if (len < (options.type == FeatureType::Polygon ? 3 : 2)) { + const std::size_t minLen = (options.type == FeatureType::Polygon ? 3 : 2); + if (len < minLen) { + // Warn once, but only if the source geometry is invalid, not if de-duplication made it invalid. + // This happens, e.g., when attempting to use a GeoJSON `MultiPoint` + // or `MLNPointCollectionFeature` as the source for a line layer. + // Unfortunately, we cannot show the layer or source name from here. + if (coordinates.size() < minLen) { + static bool warned = false; // not thread-safe, there's a small chance of warning more than once + if (!warned) { + warned = true; + Log::Warning(Event::General, "Invalid geometry in line layer"); + } + } return; } From d409f831c6166024df4c1fe048516667451602d8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 21:17:26 +0000 Subject: [PATCH 102/339] [pre-commit.ci] pre-commit autoupdate (#3074) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9b82f5aa00ee..b95acf3a8c9e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,22 +9,22 @@ repos: # FIXME: these autogenerate files contain trailing whitespace. Need to fix generator. exclude: 'platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java' - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v19.1.4 + rev: v19.1.7 hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' exclude: 'vendor/.*' - repo: https://github.com/keith/pre-commit-buildifier - rev: 7.3.1 + rev: 8.0.1 hooks: - id: buildifier - repo: https://github.com/Mateusz-Grzelinski/actionlint-py - rev: v1.7.4.20 + rev: v1.7.7.23 hooks: - id: actionlint additional_dependencies: [shellcheck-py] - repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.55.3" + rev: "0.55.5" hooks: - id: swiftformat args: [--swiftversion, "5.8"] From f2a3b7b68163ed1277513a1e0602116cdc2b5df2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 4 Mar 2025 22:19:07 +0100 Subject: [PATCH 103/339] Add activity search to Android test app (#3275) --- .../activity/FeatureOverviewActivity.kt | 59 +++++++++++++++++- .../android/testapp/adapter/FeatureAdapter.kt | 17 +++-- .../main/res/drawable-anydpi/ic_search.xml | 11 ++++ .../src/main/res/drawable-hdpi/ic_search.png | Bin 0 -> 515 bytes .../src/main/res/drawable-mdpi/ic_search.png | Bin 0 -> 350 bytes .../src/main/res/drawable-xhdpi/ic_search.png | Bin 0 -> 638 bytes .../main/res/drawable-xxhdpi/ic_search.png | Bin 0 -> 1110 bytes .../main/res/menu/menu_feature_overview.xml | 10 +++ .../src/main/res/values/strings.xml | 1 + 9 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-mdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/menu/menu_feature_overview.xml diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt index 855d6ba20ddf..1a008eaf7e33 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/FeatureOverviewActivity.kt @@ -6,9 +6,11 @@ import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.res.Resources.NotFoundException import android.os.Bundle +import android.view.Menu import android.view.View import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SearchView import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -35,6 +37,7 @@ import java.util.* class FeatureOverviewActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private var sectionAdapter: FeatureSectionAdapter? = null + private var featureAdapter: FeatureAdapter? = null private var features: List? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -50,7 +53,7 @@ class FeatureOverviewActivity : AppCompatActivity() { override fun onItemClicked(recyclerView: RecyclerView?, position: Int, view: View?) { if (sectionAdapter!!.isSectionHeaderPosition(position).not()) { val itemPosition = sectionAdapter!!.getConvertedPosition(position) - val feature = features!![itemPosition] + val feature = featureAdapter!!.getItem(itemPosition) startFeature(feature) } } @@ -86,6 +89,7 @@ class FeatureOverviewActivity : AppCompatActivity() { if (featuresList.isNullOrEmpty()) { return } + featureAdapter = FeatureAdapter(features!!) val sections: MutableList = ArrayList() var currentCat = "" for (i in features!!.indices) { @@ -95,12 +99,11 @@ class FeatureOverviewActivity : AppCompatActivity() { currentCat = category } } - sectionAdapter = FeatureSectionAdapter( this, R.layout.section_main_layout, R.id.section_text, - FeatureAdapter(features!!) + featureAdapter!! ) sectionAdapter!!.setSections(sections.toTypedArray()) recyclerView.adapter = sectionAdapter @@ -163,6 +166,56 @@ class FeatureOverviewActivity : AppCompatActivity() { } } + // Add SearchView to the app bar + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_feature_overview, menu) + val searchItem = menu.findItem(R.id.action_search) + val searchView = searchItem.actionView as SearchView + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + return false // No action on submit + } + + override fun onQueryTextChange(newText: String?): Boolean { + filterFeatures(newText) + return true + } + }) + return true + } + + // Filter the features based on the search query + private fun filterFeatures(query: String?) { + val filteredFeatures = if (query.isNullOrEmpty()) { + features // Show full list if query is empty + } else { + features?.filter { it.getLabel().contains(query, ignoreCase = true) } + } + updateAdapter(filteredFeatures) + } + + // Update the adapter with filtered features + private fun updateAdapter(filteredFeatures: List?) { + if (filteredFeatures.isNullOrEmpty()) { + featureAdapter?.update(emptyList()) + sectionAdapter?.setSections(emptyArray()) + sectionAdapter?.notifyDataSetChanged() + return + } + val sections: MutableList = ArrayList() + var currentCat = "" + for (i in filteredFeatures.indices) { + val category = filteredFeatures[i].category + if (currentCat != category) { + sections.add(FeatureSectionAdapter.Section(i, category)) + currentCat = category + } + } + featureAdapter?.update(filteredFeatures) + sectionAdapter?.setSections(sections.toTypedArray()) + sectionAdapter?.notifyDataSetChanged() + } + companion object { private const val KEY_STATE_FEATURES = "featureList" } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt index 9cca2b386373..542fa6cd8d1a 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/adapter/FeatureAdapter.kt @@ -12,12 +12,11 @@ import org.maplibre.android.testapp.utils.FontCache /** * Adapter used for FeatureOverviewActivity. * - * * Adapts a Feature to a visual representation to be shown in a RecyclerView. - * */ -class FeatureAdapter(private val features: List) : +class FeatureAdapter(private var features: List) : RecyclerView.Adapter() { + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { var labelView: TextView var descriptionView: TextView @@ -32,8 +31,7 @@ class FeatureAdapter(private val features: List) : } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = - LayoutInflater.from(parent.context).inflate(R.layout.item_main_feature, parent, false) + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_main_feature, parent, false) return ViewHolder(view) } @@ -45,4 +43,13 @@ class FeatureAdapter(private val features: List) : override fun getItemCount(): Int { return features.size } + + fun update(newFeatures: List) { + features = newFeatures + notifyDataSetChanged() + } + + fun getItem(position: Int): Feature { + return features[position] + } } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml new file mode 100644 index 000000000000..6796805c38bd --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-anydpi/ic_search.xml @@ -0,0 +1,11 @@ + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-hdpi/ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..d98549d7303fb6021e62837d7dff64139b756190 GIT binary patch literal 515 zcmV+e0{s1nP)A=|$1|7L~jx)I5Skv4mh71+qMst zpeg4UAzxYCkLOR$=LVbEQi5(dzYN-8&gDi6Dr$M9g766+s{zNHUxIF>g0Sv8YQP!i z7lA!^8uw$Y3Fix;-%t)c&S!yTevNyv{AZjmgj|$blpK0olLY!Mbsy(TL8tDV^Nff= z{KP#t6svJ326pf3w~d4i={E0T&jfmzqPh=NQyp?^%SFk;vO>hD=Mj%t8o4^)z#C7T z6!I@pdPv|4k68(FQOZGy3BG8;34cxEjIKf7ozAZW5lX@zxTbN$8Cup{e`RVxoT25r z;hM$~XK4AJxTbN$8FK2HYZ^zKiNri}Ze{!nXIfgCFWmKN>}bg!83>luvbtN^tR5g83=<-6R{idgCQl8%w+yd zs??uPNs?qzmgT-EiW7}@8qZ{hIF5&Mtv6Ygtr4`&@;u+jJHiQ2#4=llS2I9jycmMzZ07*qoM6N<$g8Filo&W#< literal 0 HcmV?d00001 diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xhdpi/ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..72ce491f3d0ec9d550442bb5b4c0934b44163ca6 GIT binary patch literal 638 zcmV-^0)hRBP) z9JI+l=Q49LlT1w&6ciNXl2WO(*lxEwtyb$&e}8(W-`}!sqtWP;%jE@*n>dw9Wlagb zMw9-_qE1bB*N&(Sf<3SduH>(&8-^0Tq8~ljThw_+$-Z&s zsYwb8P*FG3ctru0VuB8Bn?Y#o9R2C?40Ya6fDV#>rY0>~!HcL*{XV3|8!eo$al1`g zlyDW3@<5F@qJhkKe^gMw2k(0$ivoQ5?ITp6P=5Q+@_vU16!jUjh2*@8VC&SRMTb`f zD{xPZH|%{L1&sX;lj$~UA0wD8+e%lcONwTHp8lxuj%NJ@tME=uQtUMZzV4{;j(tgS z*6e_zZWwGGvs$gTNnH>W{EWd}A#>CcYa7nI8+$@+P!#Z%Nw`GLw*~dK+r-Vf8}lW} zG{*$Tb|EH{)_Ata_82E9O5lh|B{kPJ)4Z;g+GU)e*q4-&xnUxM%yygT1Izoai2Z1c zteCNbNC`g3J|YR*|M!CqDc##+0j`K_S7ID2Sr*_d+h<}NtZiZnm{>cF#2+iML+!uC z+9sxe+^s}xJ6Unm{#&eVVhYIJ?$oyu^?E%&t6*5$^pe+^a=`n!z}hBvGha|pP>@f4 Y0goZJ46}a}O8@`>07*qoM6N<$g5b?A`Tzg` literal 0 HcmV?d00001 diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png b/platform/android/MapLibreAndroidTestApp/src/main/res/drawable-xxhdpi/ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..96d063da4e0a41775e991d7b9cc7d8db6284866d GIT binary patch literal 1110 zcmV-c1gZOpP)Juk-M3({6BzWOCS*V@OixcA&_4GCNX$4YW+7(KI~Mx+P%f7bsgKNp0o~F; zCL#2DU43PZ5me4M9axe=|3B1eCMcCk69|4q2b6|*64bxzuyXn)CtRuKp_X<4inxSu zD0ojhZ5yLCv>DY-oCE{<9y5UdG&?(c0j49`whP5Zqj6FDP{HpfZRi|W!XIehGKgo| zW+$MkUTdGGaQv>eafVv0c0>a<0^daPE@_+Hfa<%U{hM-juY~GY(qIjB)P65;haKZ% zOT5I@-Z}{CmCTLl0t$Xf%T^55wZb4WrqI)9~FCmv|k-uoP}DiW-+w1l!*Pb$#2Bgy3TZmuu`J zUmkPzC87zE^hASCLgs|8$4oiBszvaNutDdgLBz+bX8(HJRN%^Up+UgC*_oin8_`}u zySKQUPHUee=<|sTSHMhEk_lF+Dh4(OEwQ?Irj2B5U{GIqJAuDvv~3K0%i6O-*(Wrv z4Rb@M(;4emNx}A0#?&9dI15*;ej7?0U(dwqmL>!2=7;hy&sjLv^t;@+M}z5@w#^fq zla@6xT1mN{xC`4~-1e*_u727mSFl1@DVi8fQtm6M-+dtxv{J~*x7H~!IzT1yUmJ42 zx^?|8fN&$3>nhqJE=fU_Zfetpw + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml index 885a1a2ed8ce..af6620dd9159 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ Benchmark World Tour Benchmark Writes out avg. fps and 1% fps after world tour with .flyTo() + Search From 73e939e9ddc7055b69be7baf78152b87a4116014 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:24:06 +0100 Subject: [PATCH 104/339] chore(deps): update dependency aspect_rules_js to v2.2.0 (#3242) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 5677414e21d8..84093198ab62 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,7 +5,7 @@ bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_apple", version = "3.19.1") bazel_dep(name = "rules_swift", version = "2.5.0") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") -bazel_dep(name = "aspect_rules_js", version = "2.1.3") +bazel_dep(name = "aspect_rules_js", version = "2.2.0") bazel_dep(name = "rules_nodejs", version = "6.3.3") bazel_dep(name = "libuv", version = "1.48.0") From 422ee451237195350af592a8f5a7f253364d273e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 4 Mar 2025 23:27:27 +0100 Subject: [PATCH 105/339] Make Renovate less noisy (#3276) --- .github/renovate.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index a7917913c3fa..d2fd9721a67b 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,3 +1,10 @@ { - "enabledManagers": ["gradle-wrapper", "bazel", "bazel-module", "bazelisk"] + "enabledManagers": ["gradle-wrapper", "bazel", "bazel-module", "bazelisk"], + "packageRules": [ + { + "matchManagers": ["bazel", "bazel-module"], + "groupName": "bazel" + } + ], + "schedule": "* * 1,15 * *" } From e6ce2775898140c5e77ebbbf358a3852e853e767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladan=20Kudl=C3=A1=C4=8D?= Date: Wed, 5 Mar 2025 02:01:02 +0100 Subject: [PATCH 106/339] Replace deprecated Node Buffer constructor (#3126) --- platform/node/test/js/map.test.js | 8 ++++---- test/fixtures/sprites/convert_sprite.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/node/test/js/map.test.js b/platform/node/test/js/map.test.js index 60948721d9d7..3d1f291246ae 100644 --- a/platform/node/test/js/map.test.js +++ b/platform/node/test/js/map.test.js @@ -199,7 +199,7 @@ test('Map', function(t) { var map = new mbgl.Map(options); t.throws(function() { - map.addImage('foo', new Buffer(''), { + map.addImage('foo', Buffer.from(''), { width: 401, height: 400, pixelRatio: 1 @@ -214,7 +214,7 @@ test('Map', function(t) { var map = new mbgl.Map(options); t.throws(function() { - map.addImage('foo', new Buffer(''), { + map.addImage('foo', Buffer.from(''), { width: 1025, height: 1025, pixelRatio: 1 @@ -230,7 +230,7 @@ test('Map', function(t) { var map = new mbgl.Map(options); t.throws(function() { - map.addImage('foo', new Buffer(' '), { + map.addImage('foo', Buffer.from(' '), { width: 401, height: 400, pixelRatio: 1 @@ -245,7 +245,7 @@ test('Map', function(t) { var map = new mbgl.Map(options); t.doesNotThrow(function() { - map.addImage('foo', new Buffer(' '), { + map.addImage('foo', Buffer.from(' '), { width: 1, height: 1, pixelRatio: 1 diff --git a/test/fixtures/sprites/convert_sprite.js b/test/fixtures/sprites/convert_sprite.js index ba4ff5c29f06..bf279f95de20 100644 --- a/test/fixtures/sprites/convert_sprite.js +++ b/test/fixtures/sprites/convert_sprite.js @@ -7,7 +7,7 @@ var zlib = require('zlib'); var PNG = require('png-js'); var png = PNG.load('styles/sprites/bright.png'); png.decodePixels(function(data) { - var result = new Buffer(8 + data.length); + var result = Buffer.alloc(8 + data.length); result.writeUInt32BE(png.width, 0); result.writeUInt32BE(png.height, 4); data.copy(result, 8); From 46e821a7919a58a1062b33018c372d7bd5f5eb37 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 5 Mar 2025 14:15:08 +0100 Subject: [PATCH 107/339] Fix import, release MapLibre iOS 6.12.1 (#3279) --- platform/ios/CHANGELOG.md | 5 +++++ platform/ios/VERSION | 2 +- platform/ios/src/MLNMapViewDelegate.h | 2 +- platform/macos/src/MLNMapViewDelegate.h | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 1a3b259c8f8f..abf5aae4d2bb 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,11 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.12.1 + +- Use double quotes for MLNTileOperation.h import ([#3277](https://github.com/maplibre/maplibre-native/issues/3277)). +- Warn on rejected line geometry ([#3088](https://github.com/maplibre/maplibre-native/pull/3088)). + ## 6.12.0 - Eliminate copies in deferred cleanup ([#3035](https://github.com/maplibre/maplibre-native/pull/3035)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index d4e6cb42939b..ff61e1868921 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.12.0 +6.12.1 diff --git a/platform/ios/src/MLNMapViewDelegate.h b/platform/ios/src/MLNMapViewDelegate.h index 32ecf8909a11..cae97926f2b5 100644 --- a/platform/ios/src/MLNMapViewDelegate.h +++ b/platform/ios/src/MLNMapViewDelegate.h @@ -1,7 +1,7 @@ #import -#import #import "MLNCameraChangeReason.h" +#import "MLNTileOperation.h" #import "Mapbox.h" NS_ASSUME_NONNULL_BEGIN diff --git a/platform/macos/src/MLNMapViewDelegate.h b/platform/macos/src/MLNMapViewDelegate.h index 53057845b483..cd2b36ef4327 100644 --- a/platform/macos/src/MLNMapViewDelegate.h +++ b/platform/macos/src/MLNMapViewDelegate.h @@ -1,6 +1,6 @@ #import #import -#import +#import "MLNTileOperation.h" NS_ASSUME_NONNULL_BEGIN From 70f3c91a475b5f2d3b90cbf4fbf16c5be9374814 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 5 Mar 2025 15:58:27 +0100 Subject: [PATCH 108/339] Add Vector Tile Source example Android Docs & Example app (#3278) --- .../src/main/AndroidManifest.xml | 25 ++++-- .../activity/sources/VectorTileActivity.kt | 85 +++++++++++++++++++ .../main/res/layout/activity_vector_tile.xml | 14 +++ .../src/main/res/values/descriptions.xml | 1 + .../src/main/res/values/strings.xml | 1 + .../src/main/res/values/titles.xml | 1 + platform/android/docs/data/MVT.md | 16 ++++ 7 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/sources/VectorTileActivity.kt create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_vector_tile.xml create mode 100644 platform/android/docs/data/MVT.md diff --git a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml index 171af89c832f..85aaf0875fe9 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + + + + + android:label="@string/activity_observer_activity"> @@ -1259,13 +1271,11 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity" /> - + android:exported="true" + android:label="@string/activity_map_options_xml"> @@ -1273,7 +1283,6 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity" /> - diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/sources/VectorTileActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/sources/VectorTileActivity.kt new file mode 100644 index 000000000000..c19e7e0c5bbd --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/sources/VectorTileActivity.kt @@ -0,0 +1,85 @@ +package org.maplibre.android.testapp.activity.sources + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import org.maplibre.android.camera.CameraUpdateFactory +import org.maplibre.android.geometry.LatLngBounds +import org.maplibre.android.maps.MapView +import org.maplibre.android.style.layers.LineLayer +import org.maplibre.android.style.layers.PropertyFactory.lineColor +import org.maplibre.android.style.layers.PropertyFactory.lineWidth +import org.maplibre.android.style.sources.TileSet +import org.maplibre.android.style.sources.VectorSource +import org.maplibre.android.testapp.R +import org.maplibre.android.testapp.styles.TestStyles + + +class VectorTileActivity : AppCompatActivity() { + private lateinit var mapView: MapView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_vector_tile) + mapView = findViewById(R.id.mapView) + + mapView.getMapAsync { + it.animateCamera( + CameraUpdateFactory.newLatLngBounds( + // z: 12, x: 2177, y: 1436 is one of the available tiles: + // https://github.com/maplibre/demotiles/tree/gh-pages/tiles-omt/12/2177 + LatLngBounds.from(12, 2177, 1436), + 0 + ) + ) + it.setStyle(TestStyles.PROTOMAPS_GRAYSCALE) { style -> + // --8<-- [start:addTileSet] + val tileset = TileSet( + "openmaptiles", + "https://demotiles.maplibre.org/tiles-omt/{z}/{x}/{y}.pbf" + ) + val openmaptiles = VectorSource("openmaptiles", tileset) + style.addSource(openmaptiles) + val roadLayer = LineLayer("road", "openmaptiles").apply { + setSourceLayer("transportation") + setProperties( + lineColor("red"), + lineWidth(2.0f) + ) + } + // --8<-- [end:addTileSet] + + style.addLayer(roadLayer) + } + } + } + + override fun onStart() { + super.onStart() + mapView.onStart() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onStop() { + super.onStop() + mapView.onStop() + } + + override fun onLowMemory() { + super.onLowMemory() + mapView.onLowMemory() + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_vector_tile.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_vector_tile.xml new file mode 100644 index 000000000000..858b80c4940c --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_vector_tile.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml index ac42003f1fe1..fcfdcb84277f 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml @@ -80,6 +80,7 @@ Blend an overlay on a map Example Custom Geometry Source Load a map without providing a style URI or JSON + Load MVT data Suzhou using Droid Sans for Chinese glyphs Example raster-dem source and hillshade layer Use HeatmapLayer to visualise earthquakes diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml index af6620dd9159..75bf61e83a48 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/strings.xml @@ -8,4 +8,5 @@ World Tour Benchmark Writes out avg. fps and 1% fps after world tour with .flyTo() Search + Data Sources diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml index dfe67710e515..6a0953d4399f 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml @@ -76,6 +76,7 @@ Map overlay Grid Source No Style URI/JSON + Vector Tile source Local CJK glyph generation Hillshade Heatmap layer diff --git a/platform/android/docs/data/MVT.md b/platform/android/docs/data/MVT.md new file mode 100644 index 000000000000..85d358f5c835 --- /dev/null +++ b/platform/android/docs/data/MVT.md @@ -0,0 +1,16 @@ +# Vector Tiles + +{{ activity_source_note("VectorTileActivity.kt") }} + +You can specify where to load MVTs (which sometimes have `.pbf` extension) by creating a `TileSet` object with template parameters (for example `{z}` which will be replaced with the zoom level). + +MapLibre has [a repo](https://github.com/maplibre/demotiles/tree/gh-pages/tiles-omt) with some example vector tiles with the OpenMapTiles schema around Innsbruck, Austria. In the example we load these MVTs and create a line layer for the road network. + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/sources/VectorTileActivity.kt:addTileSet" +``` + +
+ ![Screenshot of road overlay from vector tile source]({{ s3_url("vectortilesource.png") }}){ width="400" } + {{ openmaptiles_caption() }} +
From 3e529c0995a801fb305fb4d67a89840e49b0392e Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 6 Mar 2025 05:58:46 -0500 Subject: [PATCH 109/339] Minor rust improvements (#3282) --- .github/workflows/rust-ci.yaml | 11 +++++++++-- .gitignore | 5 +++++ include/mbgl/util/tile_server_options.hpp | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust-ci.yaml b/.github/workflows/rust-ci.yaml index f750de407d5a..dcc6ce627e59 100644 --- a/.github/workflows/rust-ci.yaml +++ b/.github/workflows/rust-ci.yaml @@ -9,13 +9,20 @@ on: defaults: run: - shell: bash working-directory: rustutils/ jobs: test: name: Rust tests - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: true + matrix: + include: + - os: macos-latest # M-series CPU + - os: macos-13 # x64 CPU + - os: windows-latest + - os: ubuntu-latest steps: - uses: taiki-e/install-action@v2 with: { tool: just } diff --git a/.gitignore b/.gitignore index 8e5e2b2abb40..a15a2d842691 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,8 @@ cache.sqlite cache.sqlite-journal out.png /test/android/app/build + +# Rust +**/target/ +**/*.rs.bk +**/*.profraw diff --git a/include/mbgl/util/tile_server_options.hpp b/include/mbgl/util/tile_server_options.hpp index 8fc1b943f6a4..2182f34d9f2b 100644 --- a/include/mbgl/util/tile_server_options.hpp +++ b/include/mbgl/util/tile_server_options.hpp @@ -265,7 +265,7 @@ class TileServerOptions final { TileServerOptions& withDefaultStyles(std::vector styles); /** - * @brief Sets the default style by name. The style name must exists in + * @brief Sets the default style by name. The style name must exist in * defaultStyles collection * * @param defaultStyle The style name From a188663a872249a09dc630b762da19c2a9f24471 Mon Sep 17 00:00:00 2001 From: Ian Wagner Date: Thu, 6 Mar 2025 23:42:48 +0900 Subject: [PATCH 110/339] Strip punctuation from attribution (#3287) --- platform/darwin/src/MLNAttributionInfo.mm | 8 ++++++-- platform/darwin/test/MLNAttributionInfoTests.m | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/darwin/src/MLNAttributionInfo.mm b/platform/darwin/src/MLNAttributionInfo.mm index 42b4dc9356bc..0de8e407a4ed 100644 --- a/platform/darwin/src/MLNAttributionInfo.mm +++ b/platform/darwin/src/MLNAttributionInfo.mm @@ -104,9 +104,13 @@ @implementation MLNAttributionInfo [attributedString removeAttribute:NSStrokeWidthAttributeName range:range]; } - // Omit whitespace-only strings. + // Clean up strings by stripping punctuation and whitespace (often present for the web). + NSMutableCharacterSet *charset = [NSMutableCharacterSet whitespaceAndNewlineCharacterSet]; + [charset formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; NSAttributedString *title = [[attributedString attributedSubstringFromRange:range] - mgl_attributedStringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + mgl_attributedStringByTrimmingCharactersInSet:charset]; + + // Omit strings that are empty after cleaning. if (!title.length) { return; } diff --git a/platform/darwin/test/MLNAttributionInfoTests.m b/platform/darwin/test/MLNAttributionInfoTests.m index 340dce49bc1c..612716f251b5 100644 --- a/platform/darwin/test/MLNAttributionInfoTests.m +++ b/platform/darwin/test/MLNAttributionInfoTests.m @@ -20,7 +20,7 @@ - (void)tearDown { - (void)testParsing { static NSString * const htmlStrings[] = { @"
© Mapbox " - @"©️ OpenStreetMap " + @"©️ OpenStreetMap, " @"CC BY-SA " @"Improve this map", }; From aa0fa213e360d3832f953b134e001bf1385af339 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 6 Mar 2025 12:44:25 -0500 Subject: [PATCH 111/339] Minor pre-commit-config change (#3251) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 79 +++++++++++-------- platform/android/resources/dot-arrow.svg | 22 +++--- platform/default/resources/default_marker.svg | 20 ++--- 3 files changed, 68 insertions(+), 53 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b95acf3a8c9e..c0c2fbd80a6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,41 +1,56 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks + repos: -- repo: https://github.com/pre-commit/pre-commit-hooks + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: check-yaml - args: [--allow-multiple-documents, --unsafe] - - id: end-of-file-fixer - - id: trailing-whitespace - # FIXME: these autogenerate files contain trailing whitespace. Need to fix generator. - exclude: 'platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java' -- repo: https://github.com/pre-commit/mirrors-clang-format - rev: v19.1.7 - hooks: - - id: clang-format - files: '.*\.(hpp|cpp|h)' - exclude: 'vendor/.*' -- repo: https://github.com/keith/pre-commit-buildifier - rev: 8.0.1 - hooks: - - id: buildifier -- repo: https://github.com/Mateusz-Grzelinski/actionlint-py - rev: v1.7.7.23 - hooks: - - id: actionlint - additional_dependencies: [shellcheck-py] -- repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.55.5" - hooks: - - id: swiftformat - args: [--swiftversion, "5.8"] -- repo: local + - id: check-added-large-files + - id: check-toml + - id: check-yaml + args: [ --allow-multiple-documents, --unsafe ] + - id: end-of-file-fixer + - id: mixed-line-ending + args: [ --fix=lf ] + # these are generated by Gradle + exclude: 'gradlew\.bat$' + - id: trailing-whitespace + # FIXME: these autogenerate files contain trailing whitespace. Need to fix generator. + exclude: 'platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$' + + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v19.1.7 hooks: - - id: rustfmt + - id: clang-format + files: '.*\.(hpp|cpp|h)' + exclude: 'vendor/.*' + + - repo: https://github.com/keith/pre-commit-buildifier + rev: 8.0.1 + hooks: + - id: buildifier + + - repo: https://github.com/Mateusz-Grzelinski/actionlint-py + rev: v1.7.7.23 + hooks: + - id: actionlint + additional_dependencies: [ shellcheck-py ] + + - repo: https://github.com/nicklockwood/SwiftFormat + rev: "0.55.5" + hooks: + - id: swiftformat + args: [ --swiftversion, "5.8" ] + + - repo: local + hooks: + - id: rustfmt name: rustfmt - entry: bash -c 'cd rustutils && cargo fmt' -- + entry: sh -c 'cd rustutils && cargo fmt --all' language: rust - types: [rust] + types: [ rust ] + ci: # sometimes fails https://github.com/keith/pre-commit-buildifier/issues/13 - skip: [buildifier] + skip: [ buildifier ] autoupdate_schedule: monthly diff --git a/platform/android/resources/dot-arrow.svg b/platform/android/resources/dot-arrow.svg index 4c2841a54b7c..676c210f05ee 100644 --- a/platform/android/resources/dot-arrow.svg +++ b/platform/android/resources/dot-arrow.svg @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/platform/default/resources/default_marker.svg b/platform/default/resources/default_marker.svg index 08ae2d76d6ad..aab418c4209f 100644 --- a/platform/default/resources/default_marker.svg +++ b/platform/default/resources/default_marker.svg @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + From 18245efec56cb8f6c4969701ea6882473e66170d Mon Sep 17 00:00:00 2001 From: Ian Wagner Date: Fri, 7 Mar 2025 03:00:53 +0900 Subject: [PATCH 112/339] Document how to run XCTest unit tests for iOS (#3286) --- docs/mdbook/src/ios/ios-tests.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/mdbook/src/ios/ios-tests.md b/docs/mdbook/src/ios/ios-tests.md index 05c929c0ac0e..a9d7435c7b1b 100644 --- a/docs/mdbook/src/ios/ios-tests.md +++ b/docs/mdbook/src/ios/ios-tests.md @@ -1,5 +1,14 @@ # iOS Tests +## iOS Unit Tests + +To run the iOS unit tests via XCTest, run tests for the `ios_test` target in Xcode +or use the following bazel command: + +``` +bazel test //platform/ios/test:ios_test --test_output=errors --//:renderer=metal +``` + ## Render Tests To run the render tests, run the `RenderTest` target from iOS. From b3fc9a768831a5baada61ea523ab6db824241f7b Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 6 Mar 2025 20:09:48 -0500 Subject: [PATCH 113/339] Allow Rust to build core as a static lib (#3283) --- CMakeLists.txt | 2 ++ cmake/mbgl-core-deps.cmake | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 cmake/mbgl-core-deps.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index ca99779658a3..681ec3808955 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1601,3 +1601,5 @@ endif() add_subdirectory(${PROJECT_SOURCE_DIR}/test) add_subdirectory(${PROJECT_SOURCE_DIR}/benchmark) add_subdirectory(${PROJECT_SOURCE_DIR}/render-test) + +include(cmake/mbgl-core-deps.cmake) diff --git a/cmake/mbgl-core-deps.cmake b/cmake/mbgl-core-deps.cmake new file mode 100644 index 000000000000..3a51ab5bd161 --- /dev/null +++ b/cmake/mbgl-core-deps.cmake @@ -0,0 +1,33 @@ +# this file defines a target that will generate a mbgl-core-deps.txt which includes the linker +# flags that would need to be passed to an executable or library that links with +# the static mbgl-core library + +set(DUMMY_FILE "${CMAKE_BINARY_DIR}/dummy.cpp") +add_custom_command( + OUTPUT ${DUMMY_FILE} + COMMAND ${CMAKE_COMMAND} -E echo "int main() {}" > ${DUMMY_FILE} + COMMENT "Generating dummy.cpp" + VERBATIM +) + +# https://stackoverflow.com/questions/34165365/retrieve-all-link-flags-in-cmake +set(CMAKE_ECHO_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES}) +set(CMAKE_ECHO_FLAGS ${CMAKE_CXX_FLAGS}) +set(CMAKE_ECHO_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS}) +set(CMAKE_ECHO_IMPLICIT_LINK_DIRECTORIES ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}) +set( + CMAKE_ECHO_LINK_EXECUTABLE + " -E echo \" \" > " +) + +add_executable(mbgl-core-deps EXCLUDE_FROM_ALL "${DUMMY_FILE}") +target_link_libraries(mbgl-core-deps mbgl-core) +add_custom_target(generate_dummy DEPENDS ${DUMMY_FILE}) +add_dependencies(mbgl-core-deps generate_dummy) + +set_target_properties( + mbgl-core-deps + PROPERTIES + LINKER_LANGUAGE ECHO + SUFFIX ".txt" +) From e7f66f98ab8025e21d31b91a92c549d8b200fed5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 21:09:57 +0100 Subject: [PATCH 114/339] Bump mozilla-actions/sccache-action from 0.0.7 to 0.0.8 in the github-actions group (#3290) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/windows-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index ac8a9c2eb8c6..dfa76d88cd14 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -118,7 +118,7 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - uses: mozilla-actions/sccache-action@v0.0.7 + - uses: mozilla-actions/sccache-action@v0.0.8 - name: Initialize sccache run: | From 296ce07394e77faa882bef31a267d62748e8d783 Mon Sep 17 00:00:00 2001 From: cjbd Date: Mon, 17 Mar 2025 16:24:42 +0800 Subject: [PATCH 115/339] fix glfw platform feature state demo (#3313) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- platform/glfw/glfw_view.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 7d688718d5c5..4c11ccf27348 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -482,9 +482,7 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, auto &style = view->map->getStyle(); if (!style.getSource("states")) { - std::string url = - "https://maplibre.org/maplibre-gl-js-docs/assets/" - "us_states.geojson"; + std::string url = "https://maplibre.org/maplibre-gl-js/docs/assets/us_states.geojson"; auto source = std::make_unique("states"); source->setURL(url); style.addSource(std::move(source)); From 00956faefb6256e4ff6d065b306b4b949b8f54d5 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 17 Mar 2025 19:00:07 +0100 Subject: [PATCH 116/339] Revert #3035 which was causing memory growth issue (#3315) --- .clang-tidy | 3 +- .gitmodules | 4 - BUILD.bazel | 1 - CMakeLists.txt | 8 +- include/mbgl/actor/scheduler.hpp | 24 ++---- include/mbgl/renderer/renderer_observer.hpp | 13 +-- include/mbgl/storage/database_file_source.hpp | 46 +++++----- include/mbgl/storage/file_source.hpp | 7 +- include/mbgl/storage/online_file_source.hpp | 2 +- include/mbgl/util/run_loop.hpp | 10 +-- platform/android/CHANGELOG.md | 6 +- .../android/MapLibreAndroid/gradle.properties | 2 +- .../MapLibreAndroid/src/cpp/CMakeLists.txt | 1 - .../src/cpp/android_renderer_frontend.cpp | 9 +- .../src/cpp/asset_manager_file_source.cpp | 5 +- .../src/cpp/asset_manager_file_source.hpp | 2 +- .../MapLibreAndroid/src/cpp/file_source.cpp | 6 +- .../MapLibreAndroid/src/cpp/file_source.hpp | 2 +- .../src/cpp/http_file_source.cpp | 19 ++--- .../MapLibreAndroid/src/cpp/map_renderer.cpp | 2 +- .../MapLibreAndroid/src/cpp/map_renderer.hpp | 4 +- .../src/cpp/map_renderer_runnable.cpp | 2 +- .../src/cpp/map_renderer_runnable.hpp | 4 +- platform/android/android.cmake | 2 - platform/android/src/run_loop.cpp | 2 +- platform/android/src/run_loop_impl.hpp | 4 +- platform/darwin/core/http_file_source.mm | 6 +- .../mbgl/storage/file_source_request.hpp | 6 +- .../default/src/mbgl/map/map_snapshotter.cpp | 8 +- .../src/mbgl/storage/asset_file_source.cpp | 3 +- .../src/mbgl/storage/database_file_source.cpp | 83 +++++++++---------- .../src/mbgl/storage/file_source_request.cpp | 4 +- .../src/mbgl/storage/http_file_source.cpp | 11 ++- .../src/mbgl/storage/local_file_source.cpp | 5 +- .../src/mbgl/storage/main_resource_loader.cpp | 7 +- .../src/mbgl/storage/mbtiles_file_source.cpp | 29 ++++--- .../src/mbgl/storage/online_file_source.cpp | 17 ++-- .../src/mbgl/storage/pmtiles_file_source.cpp | 3 +- platform/default/src/mbgl/util/run_loop.cpp | 6 +- platform/node/CMakeLists.txt | 3 - platform/node/src/node_map.cpp | 2 +- platform/node/src/node_map.hpp | 2 +- platform/node/src/node_request.cpp | 4 +- platform/node/src/node_request.hpp | 4 +- platform/qt/src/mbgl/http_file_source.cpp | 5 +- platform/qt/src/mbgl/http_request.cpp | 6 +- platform/qt/src/mbgl/http_request.hpp | 4 +- platform/qt/src/mbgl/run_loop.cpp | 2 +- platform/qt/src/mbgl/run_loop_impl.hpp | 3 +- platform/qt/src/utils/scheduler.cpp | 8 +- platform/qt/src/utils/scheduler.hpp | 6 +- render-test/file_source.cpp | 3 +- render-test/file_source.hpp | 2 +- src/mbgl/actor/scheduler.cpp | 10 +-- src/mbgl/map/map_impl.cpp | 12 +-- src/mbgl/map/map_impl.hpp | 4 +- src/mbgl/renderer/image_manager.cpp | 8 +- src/mbgl/renderer/image_manager_observer.hpp | 2 +- src/mbgl/renderer/render_orchestrator.cpp | 6 +- src/mbgl/renderer/render_orchestrator.hpp | 2 +- src/mbgl/storage/asset_file_source.hpp | 2 +- src/mbgl/storage/http_file_source.hpp | 2 +- src/mbgl/storage/local_file_source.hpp | 2 +- src/mbgl/storage/main_resource_loader.hpp | 2 +- src/mbgl/storage/mbtiles_file_source.hpp | 2 +- src/mbgl/storage/pmtiles_file_source.hpp | 2 +- src/mbgl/tile/geometry_tile_worker.cpp | 13 ++- src/mbgl/tile/tile_cache.cpp | 45 +++++++--- src/mbgl/util/stopwatch.hpp | 6 +- src/mbgl/util/thread_pool.cpp | 6 +- src/mbgl/util/thread_pool.hpp | 16 ++-- test/actor/actor.test.cpp | 6 +- test/renderer/image_manager.test.cpp | 2 +- test/src/mbgl/test/fake_file_source.hpp | 14 ++-- test/src/mbgl/test/stub_file_source.cpp | 5 +- test/src/mbgl/test/stub_file_source.hpp | 6 +- test/storage/sync_file_source.test.cpp | 2 +- vendor/BUILD.bazel | 9 -- vendor/nontype_functional | 1 - vendor/nontype_functional.cmake | 21 ----- 80 files changed, 293 insertions(+), 347 deletions(-) delete mode 160000 vendor/nontype_functional delete mode 100644 vendor/nontype_functional.cmake diff --git a/.clang-tidy b/.clang-tidy index ed4cbadaec71..1b2bae9a6b0a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -113,8 +113,7 @@ Checks: [ -performance-enum-size, -misc-include-cleaner, -readability-redundant-inline-specifier, - -readability-avoid-nested-conditional-operator, - -cppcoreguidelines-pro-type-static-cast-downcast # no RTTI + -readability-avoid-nested-conditional-operator ] WarningsAsErrors: '*' HeaderFilterRegex: '.*' diff --git a/.gitmodules b/.gitmodules index 0f420a3ae15e..72537dd37ef9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -58,7 +58,3 @@ [submodule "vendor/PMTiles"] path = vendor/PMTiles url = https://github.com/protomaps/PMTiles.git -[submodule "vendor/nontype_functional"] - path = vendor/nontype_functional - url = https://github.com/zhihaoy/nontype_functional.git - branch = compat diff --git a/BUILD.bazel b/BUILD.bazel index df44344f58e9..9b387f5a613b 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -127,7 +127,6 @@ cc_library( "//vendor:earcut.hpp", "//vendor:eternal", "//vendor:mapbox-base", - "//vendor:nontype_functional", "//vendor:parsedate", "//vendor:pmtiles", "//vendor:polylabel", diff --git a/CMakeLists.txt b/CMakeLists.txt index 681ec3808955..5b5916de3510 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1456,8 +1456,6 @@ include(${PROJECT_SOURCE_DIR}/vendor/csscolorparser.cmake) include(${PROJECT_SOURCE_DIR}/vendor/earcut.hpp.cmake) include(${PROJECT_SOURCE_DIR}/vendor/eternal.cmake) include(${PROJECT_SOURCE_DIR}/vendor/mapbox-base.cmake) -include(${PROJECT_SOURCE_DIR}/vendor/metal-cpp.cmake) -include(${PROJECT_SOURCE_DIR}/vendor/nontype_functional.cmake) include(${PROJECT_SOURCE_DIR}/vendor/parsedate.cmake) include(${PROJECT_SOURCE_DIR}/vendor/pmtiles.cmake) include(${PROJECT_SOURCE_DIR}/vendor/polylabel.cmake) @@ -1467,6 +1465,7 @@ include(${PROJECT_SOURCE_DIR}/vendor/unique_resource.cmake) include(${PROJECT_SOURCE_DIR}/vendor/unordered_dense.cmake) include(${PROJECT_SOURCE_DIR}/vendor/vector-tile.cmake) include(${PROJECT_SOURCE_DIR}/vendor/wagyu.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/metal-cpp.cmake) if(MLN_USE_RUST) include(${PROJECT_SOURCE_DIR}/rustutils/rustutils.cmake) @@ -1484,7 +1483,6 @@ target_link_libraries( mbgl-vendor-boost mbgl-vendor-earcut.hpp mbgl-vendor-eternal - $<$:mbgl-vendor-metal-cpp> mbgl-vendor-parsedate mbgl-vendor-pmtiles mbgl-vendor-polylabel @@ -1501,7 +1499,6 @@ target_link_libraries( Mapbox::Base::geojson.hpp Mapbox::Base::geometry.hpp Mapbox::Base::variant - mbgl-vendor-nontype_functional $<$:TracyClient> unordered_dense ) @@ -1525,8 +1522,6 @@ set(EXPORT_TARGETS mbgl-vendor-boost mbgl-vendor-earcut.hpp mbgl-vendor-eternal - mbgl-vendor-metal-cpp - mbgl-vendor-nontype_functional mbgl-vendor-parsedate mbgl-vendor-pmtiles mbgl-vendor-polylabel @@ -1534,6 +1529,7 @@ set(EXPORT_TARGETS mbgl-vendor-unique_resource mbgl-vendor-vector-tile mbgl-vendor-wagyu + mbgl-vendor-metal-cpp unordered_dense ) diff --git a/include/mbgl/actor/scheduler.hpp b/include/mbgl/actor/scheduler.hpp index 009262870268..8b2f81f22b8a 100644 --- a/include/mbgl/actor/scheduler.hpp +++ b/include/mbgl/actor/scheduler.hpp @@ -4,8 +4,6 @@ #include -#include - #include #include #include @@ -38,18 +36,16 @@ class Mailbox; */ class Scheduler { public: - using Task = std23::move_only_function; - virtual ~Scheduler() = default; /// Enqueues a function for execution. - virtual void schedule(Task&&) = 0; - virtual void schedule(const util::SimpleIdentity, Task&&) = 0; + virtual void schedule(std::function&&) = 0; + virtual void schedule(const util::SimpleIdentity, std::function&&) = 0; /// Makes a weak pointer to this Scheduler. virtual mapbox::base::WeakPtr makeWeakPtr() = 0; /// Enqueues a function for execution on the render thread owned by the given tag. - virtual void runOnRenderThread(const util::SimpleIdentity, Task&&) {} + virtual void runOnRenderThread(const util::SimpleIdentity, std::function&&) {} /// Run render thread jobs for the given tag /// @param tag Tag of owner /// @param closeQueue Runs all render jobs and then removes the internal queue. @@ -61,9 +57,9 @@ class Scheduler { /// the given closure to this scheduler, the consequent calls of the /// returned closure are ignored. /// - /// If this scheduler is already deleted by the time the returned closure + /// If this scheduler is already deleted by the time the returnded closure /// is first invoked, the call is ignored. - Scheduler::Task bindOnce(Task&&); + std::function bindOnce(std::function); /// Enqueues the given |task| for execution into this scheduler's task queue /// and then enqueues the |reply| with the captured task result to the @@ -107,12 +103,10 @@ class Scheduler { [[nodiscard]] static std::shared_ptr GetSequenced(); /// Set a function to be called when an exception occurs on a thread controlled by the scheduler - void setExceptionHandler(std23::move_only_function handler_) { - handler = std::move(handler_); - } + void setExceptionHandler(std::function handler_) { handler = std::move(handler_); } protected: - std23::move_only_function handler; + std::function handler; private: template @@ -142,8 +136,8 @@ class TaggedScheduler { /// @brief Get the wrapped scheduler const std::shared_ptr& get() const noexcept { return scheduler; } - void schedule(Scheduler::Task&& fn) { scheduler->schedule(tag, std::move(fn)); } - void runOnRenderThread(Scheduler::Task&& fn) { scheduler->runOnRenderThread(tag, std::move(fn)); } + void schedule(std::function&& fn) { scheduler->schedule(tag, std::move(fn)); } + void runOnRenderThread(std::function&& fn) { scheduler->runOnRenderThread(tag, std::move(fn)); } void runRenderJobs(bool closeQueue = false) { scheduler->runRenderJobs(tag, closeQueue); } void waitForEmpty() const noexcept { scheduler->waitForEmpty(tag); } diff --git a/include/mbgl/renderer/renderer_observer.hpp b/include/mbgl/renderer/renderer_observer.hpp index 693451d9a380..5df817afa43e 100644 --- a/include/mbgl/renderer/renderer_observer.hpp +++ b/include/mbgl/renderer/renderer_observer.hpp @@ -1,15 +1,15 @@ #pragma once -#include -#include -#include -#include #include -#include #include +#include +#include +#include +#include #include #include +#include #include namespace mbgl { @@ -55,7 +55,8 @@ class RendererObserver { virtual void onDidFinishRenderingMap() {} /// Style is missing an image - virtual void onStyleImageMissing(const std::string&, Scheduler::Task&& done) { done(); } + using StyleImageMissingCallback = std::function; + virtual void onStyleImageMissing(const std::string&, const StyleImageMissingCallback& done) { done(); } virtual void onRemoveUnusedStyleImages(const std::vector&) {} // Entry point for custom shader registration diff --git a/include/mbgl/storage/database_file_source.hpp b/include/mbgl/storage/database_file_source.hpp index 020f9ff7f44d..3c3bcbeea3e0 100644 --- a/include/mbgl/storage/database_file_source.hpp +++ b/include/mbgl/storage/database_file_source.hpp @@ -16,8 +16,8 @@ class DatabaseFileSource : public FileSource { ~DatabaseFileSource() override; /// FileSource overrides - std::unique_ptr request(const Resource&, std::function) override; - void forward(const Resource&, const Response&, Scheduler::Task&& callback) override; + std::unique_ptr request(const Resource&, Callback) override; + void forward(const Resource&, const Response&, std::function callback) override; bool canRequest(const Resource&) const override; void setProperty(const std::string&, const mapbox::base::Value&) override; void pause() override; @@ -29,7 +29,7 @@ class DatabaseFileSource : public FileSource { * Sets path of a database to be used by DatabaseFileSource and invokes * provided callback when a database path is set. */ - virtual void setDatabasePath(const std::string&, std23::move_only_function&& callback); + virtual void setDatabasePath(const std::string&, std::function callback); /** * Delete existing database and re-initialize. @@ -38,7 +38,7 @@ class DatabaseFileSource : public FileSource { * will be executed on the database thread; it is the responsibility of the * SDK bindings to re-execute a user-provided callback on the main thread. */ - virtual void resetDatabase(std23::move_only_function&&); + virtual void resetDatabase(std::function); /** * Packs the existing database file into a minimal amount of disk space. @@ -50,7 +50,7 @@ class DatabaseFileSource : public FileSource { * will be executed on the database thread; it is the responsibility of the * SDK bindings to re-execute a user-provided callback on the main thread. */ - virtual void packDatabase(std23::move_only_function&& callback); + virtual void packDatabase(std::function callback); /** * Sets whether packing the database file occurs automatically after an @@ -87,7 +87,7 @@ class DatabaseFileSource : public FileSource { * Resources overlapping with offline regions will not be affected * by this call. */ - virtual void invalidateAmbientCache(std23::move_only_function&&); + virtual void invalidateAmbientCache(std::function); /** * Erase resources from the ambient cache, freeing storage space. @@ -100,7 +100,7 @@ class DatabaseFileSource : public FileSource { * Resources overlapping with offline regions will not be affected * by this call. */ - virtual void clearAmbientCache(std23::move_only_function&&); + virtual void clearAmbientCache(std::function); /** * Sets the maximum size in bytes for the ambient cache. @@ -122,8 +122,7 @@ class DatabaseFileSource : public FileSource { * This method should always be called before using the database, * otherwise the default maximum size will be used. */ - virtual void setMaximumAmbientCacheSize(uint64_t size, - std23::move_only_function&& callback); + virtual void setMaximumAmbientCacheSize(uint64_t size, std::function callback); // Offline @@ -135,7 +134,7 @@ class DatabaseFileSource : public FileSource { * responsibility of the SDK bindings to re-execute a user-provided callback * on the main thread. */ - virtual void listOfflineRegions(std23::move_only_function)>&&); + virtual void listOfflineRegions(std::function)>); /** * Retrieve given region in the offline database. @@ -145,9 +144,8 @@ class DatabaseFileSource : public FileSource { * responsibility of the SDK bindings to re-execute a user-provided callback * on the main thread. */ - virtual void getOfflineRegion( - int64_t regionID, - std23::move_only_function, std::exception_ptr>)>&&); + virtual void getOfflineRegion(int64_t regionID, + std::function, std::exception_ptr>)>); /** * Create an offline region in the database. @@ -163,19 +161,18 @@ class DatabaseFileSource : public FileSource { */ virtual void createOfflineRegion(const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata, - std23::move_only_function)>&&); + std::function)>); /** * Update an offline region metadata in the database. */ - virtual void updateOfflineMetadata( - int64_t regionID, - const OfflineRegionMetadata& metadata, - std23::move_only_function)>&&); + virtual void updateOfflineMetadata(int64_t regionID, + const OfflineRegionMetadata& metadata, + std::function)>); /** * Register an observer to be notified when the state of the region changes. */ - virtual void setOfflineRegionObserver(const OfflineRegion&, std::unique_ptr&&); + virtual void setOfflineRegionObserver(const OfflineRegion&, std::unique_ptr); /** * Pause or resume downloading of regional resources. @@ -188,9 +185,8 @@ class DatabaseFileSource : public FileSource { * be executed on the database thread; it is the responsibility of the SDK * bindings to re-execute a user-provided callback on the main thread. */ - virtual void getOfflineRegionStatus( - const OfflineRegion&, - std23::move_only_function)>&&) const; + virtual void getOfflineRegionStatus(const OfflineRegion&, + std::function)>) const; /** * Merge offline regions from a secondary database into the main offline database. @@ -213,7 +209,7 @@ class DatabaseFileSource : public FileSource { * does not contain all the tiles or resources required by the region definition. */ virtual void mergeOfflineRegions(const std::string& sideDatabasePath, - std23::move_only_function)>&&); + std::function)>); /** * Remove an offline region from the database and perform any resources @@ -235,7 +231,7 @@ class DatabaseFileSource : public FileSource { * will be executed on the database thread; it is the responsibility of the * SDK bindings to re-execute a user-provided callback on the main thread. */ - virtual void deleteOfflineRegion(const OfflineRegion&, std23::move_only_function&&); + virtual void deleteOfflineRegion(const OfflineRegion&, std::function); /** * Invalidate all the tiles from an offline region forcing Mapbox GL to @@ -243,7 +239,7 @@ class DatabaseFileSource : public FileSource { * than deleting the offline region and downloading it again because if the * data on the cache matches the server, no new data gets transmitted. */ - virtual void invalidateOfflineRegion(const OfflineRegion&, std23::move_only_function&&); + virtual void invalidateOfflineRegion(const OfflineRegion&, std::function); /** * Changing or bypassing this limit without permission from Mapbox is diff --git a/include/mbgl/storage/file_source.hpp b/include/mbgl/storage/file_source.hpp index c5756470b16a..6a70154df417 100644 --- a/include/mbgl/storage/file_source.hpp +++ b/include/mbgl/storage/file_source.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -39,19 +38,21 @@ class FileSource { FileSource& operator=(const FileSource&) = delete; virtual ~FileSource() = default; + using Callback = std::function; + /// Request a resource. The callback will be called asynchronously, in the /// same thread as the request was made. This thread must have an active /// RunLoop. The request may be cancelled before completion by releasing the /// returned AsyncRequest. If the request is cancelled before the callback /// is executed, the callback will not be executed. - virtual std::unique_ptr request(const Resource&, std::function) = 0; + virtual std::unique_ptr request(const Resource&, Callback) = 0; /// Allows to forward response from one source to another. /// Optionally, callback can be provided to receive notification for forward /// operation. // // NOLINTNEXTLINE(performance-unnecessary-value-param) - virtual void forward(const Resource&, const Response&, Scheduler::Task&&) {} + virtual void forward(const Resource&, const Response&, std::function) {} /// When a file source supports consulting a local cache only, it must /// return true. Cache-only requests are requests that aren't as urgent, but diff --git a/include/mbgl/storage/online_file_source.hpp b/include/mbgl/storage/online_file_source.hpp index 228fe0f8e985..797e40700475 100644 --- a/include/mbgl/storage/online_file_source.hpp +++ b/include/mbgl/storage/online_file_source.hpp @@ -19,7 +19,7 @@ class OnlineFileSource : public FileSource { private: // FileSource overrides - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void pause() override; void resume() override; diff --git a/include/mbgl/util/run_loop.hpp b/include/mbgl/util/run_loop.hpp index 1a91d5eba1c1..755f4aeb7fdf 100644 --- a/include/mbgl/util/run_loop.hpp +++ b/include/mbgl/util/run_loop.hpp @@ -54,10 +54,10 @@ class RunLoop : public Scheduler, private util::noncopyable { /// loop. It will be called from any thread and is up to the platform /// to, after receiving the callback, call RunLoop::runOnce() from the /// same thread as the Map object lives. - void setPlatformCallback(Scheduler::Task&& callback) { platformCallback = std::move(callback); } + void setPlatformCallback(std::function callback) { platformCallback = std::move(callback); } // So far only needed by the libcurl backend. - void addWatch(int fd, Event, std23::move_only_function&& callback); + void addWatch(int fd, Event, std::function&& callback); void removeWatch(int fd); // Invoke fn(args...) on this RunLoop. @@ -80,8 +80,8 @@ class RunLoop : public Scheduler, private util::noncopyable { return std::make_unique(task); } - void schedule(Scheduler::Task&& fn) override { invoke(std::move(fn)); } - void schedule(const util::SimpleIdentity, Scheduler::Task&& fn) override { schedule(std::move(fn)); } + void schedule(std::function&& fn) override { invoke(std::move(fn)); } + void schedule(const util::SimpleIdentity, std::function&& fn) override { schedule(std::move(fn)); } ::mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } void waitForEmpty(const util::SimpleIdentity = util::SimpleIdentity::Empty) override; @@ -131,7 +131,7 @@ class RunLoop : public Scheduler, private util::noncopyable { } } - Scheduler::Task platformCallback; + std::function platformCallback; Queue defaultQueue; Queue highPriorityQueue; diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 2f11d79b7ff9..4f0bff5bc5a7 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,11 +1,11 @@ # Changelog MapLibre Native for Android -## main - -### ✨ Features and improvements +## 11.8.3 ### 🐞 Bug fixes +- Revert "Eliminate copies in deferred cleanup" ([#3035](https://github.com/maplibre/maplibre-native/pull/3035)) which was causing a memory growth issue. + ## 11.8.2 ### ✨ Features and improvements diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index aaea8d549ae9..77f71b463ab9 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.8.2 +VERSION_NAME=11.8.3 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 diff --git a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt index 80a4beb20607..05902547e94e 100644 --- a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt +++ b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt @@ -241,7 +241,6 @@ target_link_libraries(maplibre $<$:-fuse-ld=gold> Mapbox::Base::jni.hpp mbgl-core - mbgl-vendor-nontype_functional mbgl-vendor-unique_resource) install(TARGETS maplibre LIBRARY DESTINATION lib) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 0dba1aacb4fa..0f5ddb662354 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -1,16 +1,17 @@ #include "android_renderer_frontend.hpp" -#include "android_renderer_backend.hpp" +#include #include #include #include -#include #include #include #include #include #include +#include "android_renderer_backend.hpp" + namespace mbgl { namespace android { @@ -44,8 +45,8 @@ class ForwardingRendererObserver : public RendererObserver { void onDidFinishRenderingMap() override { delegate.invoke(&RendererObserver::onDidFinishRenderingMap); } - void onStyleImageMissing(const std::string& id, Scheduler::Task&& done) override { - delegate.invoke(&RendererObserver::onStyleImageMissing, id, std::move(done)); + void onStyleImageMissing(const std::string& id, const StyleImageMissingCallback& done) override { + delegate.invoke(&RendererObserver::onStyleImageMissing, id, done); } void onRemoveUnusedStyleImages(const std::vector& ids) override { diff --git a/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.cpp b/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.cpp index ac51833f87aa..d7b5b6e96472 100644 --- a/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.cpp @@ -70,8 +70,7 @@ AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, AssetManagerFileSource::~AssetManagerFileSource() = default; -std::unique_ptr AssetManagerFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr AssetManagerFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&Impl::request, resource.url, req->actor()); @@ -80,7 +79,7 @@ std::unique_ptr AssetManagerFileSource::request(const Resource& re } bool AssetManagerFileSource::canRequest(const Resource& resource) const { - return resource.url.starts_with(mbgl::util::ASSET_PROTOCOL); + return 0 == resource.url.rfind(mbgl::util::ASSET_PROTOCOL, 0); } void AssetManagerFileSource::setResourceOptions(ResourceOptions options) { diff --git a/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.hpp b/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.hpp index b2b79b6e7896..166fc03980fc 100644 --- a/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/asset_manager_file_source.hpp @@ -23,7 +23,7 @@ class AssetManagerFileSource : public FileSource { const ClientOptions); ~AssetManagerFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void setResourceOptions(ResourceOptions options) override; diff --git a/platform/android/MapLibreAndroid/src/cpp/file_source.cpp b/platform/android/MapLibreAndroid/src/cpp/file_source.cpp index 4ccdaf839404..6ad4ee95d6dc 100644 --- a/platform/android/MapLibreAndroid/src/cpp/file_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/file_source.cpp @@ -30,13 +30,13 @@ FileSource::FileSource(jni::JNIEnv& _env, mbgl::FileSourceManager::get()->registerFileSourceFactory( mbgl::FileSourceType::Asset, - [](const mbgl::ResourceOptions& resourceOptions_, const mbgl::ClientOptions& clientOptions_) { + [](const mbgl::ResourceOptions& resourceOptions, const mbgl::ClientOptions& clientOptions) { auto env{android::AttachEnv()}; std::unique_ptr assetFileSource; if (android::MapLibre::hasInstance(*env)) { auto assetManager = android::MapLibre::getAssetManager(*env); assetFileSource = std::make_unique( - *env, assetManager, resourceOptions_.clone(), clientOptions_.clone()); + *env, assetManager, resourceOptions.clone(), clientOptions.clone()); } return assetFileSource; }); @@ -161,7 +161,7 @@ void FileSource::setResourceCachePath(jni::JNIEnv& env, pathChangeCallback = {}; }); - databaseSource->setDatabasePath(newPath + DATABASE_FILE, std::move(pathChangeCallback)); + databaseSource->setDatabasePath(newPath + DATABASE_FILE, pathChangeCallback); } void FileSource::resume(jni::JNIEnv&) { diff --git a/platform/android/MapLibreAndroid/src/cpp/file_source.hpp b/platform/android/MapLibreAndroid/src/cpp/file_source.hpp index 5637e306d697..421ef2e4602c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/file_source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/file_source.hpp @@ -93,7 +93,7 @@ class FileSource { mbgl::ResourceOptions resourceOptions; mbgl::ClientOptions clientOptions; std::unique_ptr> resourceTransform; - std23::move_only_function pathChangeCallback; + std::function pathChangeCallback; std::shared_ptr databaseSource; std::shared_ptr onlineSource; std::shared_ptr resourceLoader; diff --git a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp index 5526cb933dad..13bc72a8b86c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/http_file_source.cpp @@ -39,8 +39,8 @@ class HTTPRequest : public AsyncRequest { public: static constexpr auto Name() { return "org/maplibre/android/http/NativeHttpRequest"; }; - HTTPRequest(jni::JNIEnv&, const Resource&, std::function); - ~HTTPRequest() override; + HTTPRequest(jni::JNIEnv&, const Resource&, FileSource::Callback); + ~HTTPRequest(); void onFailure(jni::JNIEnv&, int type, const jni::String& message); void onResponse(jni::JNIEnv&, @@ -57,7 +57,7 @@ class HTTPRequest : public AsyncRequest { private: Resource resource; - std::function callback; + FileSource::Callback callback; Response response; util::AsyncTask async{[this] { @@ -88,9 +88,9 @@ void RegisterNativeHTTPRequest(jni::JNIEnv& env) { } // namespace android -HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, std::function callback_) +HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, FileSource::Callback callback_) : resource(resource_), - callback(std::move(callback_)) { + callback(callback_) { std::string dataRangeStr; std::string etagStr; std::string modifiedStr; @@ -152,7 +152,7 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, } if (cacheControl) { - const auto cc = http::CacheControl::parse(jni::Make(env, cacheControl)); + const auto cc = http::CacheControl::parse(jni::Make(env, cacheControl).c_str()); response.expires = cc.toTimePoint(); response.mustRevalidate = cc.mustRevalidate; } @@ -164,7 +164,7 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, if (code == 200 || code == 206) { if (body) { auto data = std::make_shared(body.Length(env), char()); - jni::GetArrayRegion(env, *body, 0, data->size(), reinterpret_cast(data->data())); + jni::GetArrayRegion(env, *body, 0, data->size(), reinterpret_cast(&(*data)[0])); response.data = data; } else { response.data = std::make_shared(); @@ -221,9 +221,8 @@ HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const Cli HTTPFileSource::~HTTPFileSource() = default; -std::unique_ptr HTTPFileSource::request(const Resource& resource, - std::function callback) { - return std::make_unique(*impl->env, resource, std::move(callback)); +std::unique_ptr HTTPFileSource::request(const Resource& resource, Callback callback) { + return std::make_unique(*impl->env, resource, callback); } void HTTPFileSource::setResourceOptions(ResourceOptions options) { diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index 763a40c608ac..fc235a67f4c4 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -63,7 +63,7 @@ ActorRef MapRenderer::actor() const { return *rendererRef; } -void MapRenderer::schedule(Task&& scheduled) { +void MapRenderer::schedule(std::function&& scheduled) { MLN_TRACE_FUNC(); try { // Create a runnable diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp index 1e6a1ec740b5..9fc962c0d353 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp @@ -72,8 +72,8 @@ class MapRenderer : public Scheduler { // From Scheduler. Schedules by using callbacks to the // JVM to process the mailbox on the right thread. - void schedule(Task&& scheduled) override; - void schedule(const util::SimpleIdentity, Task&& fn) override { schedule(std::move(fn)); }; + void schedule(std::function&& scheduled) override; + void schedule(const util::SimpleIdentity, std::function&& fn) override { schedule(std::move(fn)); }; mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.cpp index f7a2d24d92ef..805bcac8f9fc 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.cpp @@ -5,7 +5,7 @@ namespace mbgl { namespace android { -MapRendererRunnable::MapRendererRunnable(jni::JNIEnv& env, Scheduler::Task&& function_) +MapRendererRunnable::MapRendererRunnable(jni::JNIEnv& env, std::function function_) : function(std::move(function_)) { // Create the Java peer and hold on to a global reference // Not using a weak reference here as this might oerflow diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.hpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.hpp index d96c3c7f0539..392e8a002d07 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer_runnable.hpp @@ -23,7 +23,7 @@ class MapRendererRunnable { static void registerNative(jni::JNIEnv&); - MapRendererRunnable(jni::JNIEnv&, Scheduler::Task&&); + MapRendererRunnable(jni::JNIEnv&, std::function); // Only for jni registration, unused MapRendererRunnable(jni::JNIEnv&) { assert(false); } @@ -37,7 +37,7 @@ class MapRendererRunnable { private: jni::Global> javaPeer; - Scheduler::Task function; + std::function function; }; } // namespace android diff --git a/platform/android/android.cmake b/platform/android/android.cmake index a2b2e2d8ed13..4eb24f3711f1 100644 --- a/platform/android/android.cmake +++ b/platform/android/android.cmake @@ -8,7 +8,6 @@ target_compile_definitions( ) include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) -include(${PROJECT_SOURCE_DIR}/vendor/nontype_functional.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) # cmake-format: off @@ -108,7 +107,6 @@ target_link_libraries( jnigraphics log mbgl-vendor-icu - mbgl-vendor-nontype_functional mbgl-vendor-sqlite z ) diff --git a/platform/android/src/run_loop.cpp b/platform/android/src/run_loop.cpp index f3b80a4ee191..71d5b759ee24 100644 --- a/platform/android/src/run_loop.cpp +++ b/platform/android/src/run_loop.cpp @@ -290,7 +290,7 @@ void RunLoop::stop() { }); } -void RunLoop::addWatch(int fd, Event event, std23::move_only_function&& cb) { +void RunLoop::addWatch(int fd, Event event, std::function&& cb) { MBGL_VERIFY_THREAD(tid); if (event == Event::Read) { diff --git a/platform/android/src/run_loop_impl.hpp b/platform/android/src/run_loop_impl.hpp index 034f4672d800..4f0eff4103a8 100644 --- a/platform/android/src/run_loop_impl.hpp +++ b/platform/android/src/run_loop_impl.hpp @@ -16,6 +16,8 @@ struct ALooper; namespace mbgl { namespace util { +using WatchCallback = std::function; + template class Thread; class Alarm; @@ -47,7 +49,7 @@ class RunLoop::Impl { std::atomic running; std::atomic_flag coalesce = ATOMIC_FLAG_INIT; - std::unordered_map> readPoll; + std::unordered_map readPoll; private: friend RunLoop; diff --git a/platform/darwin/core/http_file_source.mm b/platform/darwin/core/http_file_source.mm index 4956df8bc873..62ced8e7d1f3 100644 --- a/platform/darwin/core/http_file_source.mm +++ b/platform/darwin/core/http_file_source.mm @@ -55,9 +55,9 @@ void cancel() { class HTTPRequest : public AsyncRequest { public: - HTTPRequest(std::function callback_) + HTTPRequest(FileSource::Callback callback_) : shared(std::make_shared(response, async)), - callback(std::move(callback_)) { + callback(callback_) { } ~HTTPRequest() override { @@ -71,7 +71,7 @@ void cancel() { NSURLSessionDataTask* task = nil; private: - std::function callback; + FileSource::Callback callback; Response response; util::AsyncTask async { [this] { diff --git a/platform/default/include/mbgl/storage/file_source_request.hpp b/platform/default/include/mbgl/storage/file_source_request.hpp index 11fc0d5f987d..79ad53ff2899 100644 --- a/platform/default/include/mbgl/storage/file_source_request.hpp +++ b/platform/default/include/mbgl/storage/file_source_request.hpp @@ -13,7 +13,7 @@ class Mailbox; class FileSourceRequest final : public AsyncRequest { public: - FileSourceRequest(std::function callback); + FileSourceRequest(FileSource::Callback&& callback); ~FileSourceRequest() final; void onCancel(std::function&& callback); @@ -22,8 +22,8 @@ class FileSourceRequest final : public AsyncRequest { ActorRef actor(); private: - std::function responseCallback; - std23::move_only_function cancelCallback; + FileSource::Callback responseCallback = nullptr; + std::function cancelCallback = nullptr; std::shared_ptr mailbox; }; diff --git a/platform/default/src/mbgl/map/map_snapshotter.cpp b/platform/default/src/mbgl/map/map_snapshotter.cpp index f1c3145efa2f..e42fe0719c42 100644 --- a/platform/default/src/mbgl/map/map_snapshotter.cpp +++ b/platform/default/src/mbgl/map/map_snapshotter.cpp @@ -46,8 +46,8 @@ class ForwardingRendererObserver final : public RendererObserver { delegate.invoke(f, mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); } - void onStyleImageMissing(const std::string& image, Scheduler::Task&& cb) override { - delegate.invoke(&RendererObserver::onStyleImageMissing, image, std::move(cb)); + void onStyleImageMissing(const std::string& image, const StyleImageMissingCallback& cb) override { + delegate.invoke(&RendererObserver::onStyleImageMissing, image, cb); } private: @@ -95,8 +95,8 @@ class SnapshotterRenderer final : public RendererObserver { mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); } - void onStyleImageMissing(const std::string& id, Scheduler::Task&& done) override { - rendererObserver->onStyleImageMissing(id, std::move(done)); + void onStyleImageMissing(const std::string& id, const StyleImageMissingCallback& done) override { + rendererObserver->onStyleImageMissing(id, done); } void setObserver(std::shared_ptr observer) { diff --git a/platform/default/src/mbgl/storage/asset_file_source.cpp b/platform/default/src/mbgl/storage/asset_file_source.cpp index 5785e1a7fb37..a43c0be96790 100644 --- a/platform/default/src/mbgl/storage/asset_file_source.cpp +++ b/platform/default/src/mbgl/storage/asset_file_source.cpp @@ -77,8 +77,7 @@ AssetFileSource::AssetFileSource(const ResourceOptions& resourceOptions, const C AssetFileSource::~AssetFileSource() = default; -std::unique_ptr AssetFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr AssetFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&Impl::request, resource.url, req->actor()); diff --git a/platform/default/src/mbgl/storage/database_file_source.cpp b/platform/default/src/mbgl/storage/database_file_source.cpp index a88c95948c02..fa674c55512b 100644 --- a/platform/default/src/mbgl/storage/database_file_source.cpp +++ b/platform/default/src/mbgl/storage/database_file_source.cpp @@ -38,73 +38,68 @@ class DatabaseFileSourceThread { req.invoke(&FileSourceRequest::setResponse, *offlineResponse); } - void setDatabasePath(const std::string& path, std23::move_only_function&& callback) { + void setDatabasePath(const std::string& path, const std::function& callback) { db->changePath(path); if (callback) { callback(); } } - void forward(const Resource& resource, const Response& response, Scheduler::Task&& callback) { + void forward(const Resource& resource, const Response& response, const std::function& callback) { db->put(resource, response); if (callback) { callback(); } } - void resetDatabase(std23::move_only_function&& callback) { - callback(db->resetDatabase()); - } + void resetDatabase(const std::function& callback) { callback(db->resetDatabase()); } - void packDatabase(std23::move_only_function&& callback) { callback(db->pack()); } + void packDatabase(const std::function& callback) { callback(db->pack()); } void runPackDatabaseAutomatically(bool autopack) { db->runPackDatabaseAutomatically(autopack); } void put(const Resource& resource, const Response& response) { db->put(resource, response); } - void invalidateAmbientCache(std23::move_only_function&& callback) { + void invalidateAmbientCache(const std::function& callback) { callback(db->invalidateAmbientCache()); } - void clearAmbientCache(std23::move_only_function&& callback) { + void clearAmbientCache(const std::function& callback) { callback(db->clearAmbientCache()); } - void setMaximumAmbientCacheSize(uint64_t size, std23::move_only_function&& callback) { + void setMaximumAmbientCacheSize(uint64_t size, const std::function& callback) { callback(db->setMaximumAmbientCacheSize(size)); } - void listRegions(std23::move_only_function)>&& callback) { + void listRegions(const std::function)>& callback) { callback(db->listRegions()); } - void getRegion( - const int64_t regionID, - std23::move_only_function, std::exception_ptr>)>&& callback) { + void getRegion(const int64_t regionID, + const std::function, std::exception_ptr>)>& callback) { callback(db->getRegion(regionID)); } void createRegion(const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata, - std23::move_only_function)>&& callback) { + const std::function)>& callback) { callback(db->createRegion(definition, metadata)); } void mergeOfflineRegions(const std::string& sideDatabasePath, - std23::move_only_function)>&& callback) { + const std::function)>& callback) { callback(db->mergeDatabase(sideDatabasePath)); } - void updateMetadata( - const int64_t regionID, - const OfflineRegionMetadata& metadata, - std23::move_only_function)>&& callback) { + void updateMetadata(const int64_t regionID, + const OfflineRegionMetadata& metadata, + const std::function)>& callback) { callback(db->updateMetadata(regionID, metadata)); } - void getRegionStatus( - int64_t regionID, - std23::move_only_function)>&& callback) { + void getRegionStatus(int64_t regionID, + const std::function)>& callback) { if (auto download = getDownload(regionID)) { callback(download.value()->getStatus()); } else { @@ -112,12 +107,12 @@ class DatabaseFileSourceThread { } } - void deleteRegion(OfflineRegion region, std23::move_only_function&& callback) { + void deleteRegion(OfflineRegion region, const std::function& callback) { downloads.erase(region.getID()); callback(db->deleteRegion(std::move(region))); } - void invalidateRegion(int64_t regionID, std23::move_only_function&& callback) { + void invalidateRegion(int64_t regionID, const std::function& callback) { callback(db->invalidateRegion(regionID)); } @@ -216,17 +211,16 @@ DatabaseFileSource::DatabaseFileSource(const ResourceOptions& resourceOptions, c DatabaseFileSource::~DatabaseFileSource() = default; -std::unique_ptr DatabaseFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr DatabaseFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&DatabaseFileSourceThread::request, resource, req->actor()); return req; } -void DatabaseFileSource::forward(const Resource& res, const Response& response, Scheduler::Task&& callback) { +void DatabaseFileSource::forward(const Resource& res, const Response& response, std::function callback) { if (res.storagePolicy == Resource::StoragePolicy::Volatile) return; - Scheduler::Task wrapper; + std::function wrapper; if (callback) { wrapper = Scheduler::GetCurrent()->bindOnce(std::move(callback)); } @@ -239,15 +233,15 @@ bool DatabaseFileSource::canRequest(const Resource& resource) const { resource.url.rfind(mbgl::util::FILE_PROTOCOL, 0) == std::string::npos; } -void DatabaseFileSource::setDatabasePath(const std::string& path, std23::move_only_function&& callback) { +void DatabaseFileSource::setDatabasePath(const std::string& path, std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::setDatabasePath, path, std::move(callback)); } -void DatabaseFileSource::resetDatabase(std23::move_only_function&& callback) { +void DatabaseFileSource::resetDatabase(std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::resetDatabase, std::move(callback)); } -void DatabaseFileSource::packDatabase(std23::move_only_function&& callback) { +void DatabaseFileSource::packDatabase(std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::packDatabase, std::move(callback)); } @@ -259,62 +253,59 @@ void DatabaseFileSource::put(const Resource& resource, const Response& response) impl->actor().invoke(&DatabaseFileSourceThread::put, resource, response); } -void DatabaseFileSource::invalidateAmbientCache(std23::move_only_function&& callback) { +void DatabaseFileSource::invalidateAmbientCache(std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::invalidateAmbientCache, std::move(callback)); } -void DatabaseFileSource::clearAmbientCache(std23::move_only_function&& callback) { +void DatabaseFileSource::clearAmbientCache(std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::clearAmbientCache, std::move(callback)); } -void DatabaseFileSource::setMaximumAmbientCacheSize(uint64_t size, - std23::move_only_function&& callback) { +void DatabaseFileSource::setMaximumAmbientCacheSize(uint64_t size, std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::setMaximumAmbientCacheSize, size, std::move(callback)); } void DatabaseFileSource::listOfflineRegions( - std23::move_only_function)>&& callback) { + std::function)> callback) { impl->actor().invoke(&DatabaseFileSourceThread::listRegions, std::move(callback)); } void DatabaseFileSource::getOfflineRegion( - const int64_t regionID, - std23::move_only_function, std::exception_ptr>)>&& callback) { + const int64_t regionID, std::function, std::exception_ptr>)> callback) { impl->actor().invoke(&DatabaseFileSourceThread::getRegion, regionID, std::move(callback)); } void DatabaseFileSource::createOfflineRegion( const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata, - std23::move_only_function)>&& callback) { + std::function)> callback) { impl->actor().invoke(&DatabaseFileSourceThread::createRegion, definition, metadata, std::move(callback)); } void DatabaseFileSource::mergeOfflineRegions( - const std::string& sideDatabasePath, - std23::move_only_function)>&& callback) { + const std::string& sideDatabasePath, std::function)> callback) { impl->actor().invoke(&DatabaseFileSourceThread::mergeOfflineRegions, sideDatabasePath, std::move(callback)); } void DatabaseFileSource::updateOfflineMetadata( const int64_t regionID, const OfflineRegionMetadata& metadata, - std23::move_only_function)>&& callback) { + std::function)> callback) { impl->actor().invoke(&DatabaseFileSourceThread::updateMetadata, regionID, metadata, std::move(callback)); } void DatabaseFileSource::deleteOfflineRegion(const OfflineRegion& region, - std23::move_only_function&& callback) { + std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::deleteRegion, region, std::move(callback)); } void DatabaseFileSource::invalidateOfflineRegion(const OfflineRegion& region, - std23::move_only_function&& callback) { + std::function callback) { impl->actor().invoke(&DatabaseFileSourceThread::invalidateRegion, region.getID(), std::move(callback)); } void DatabaseFileSource::setOfflineRegionObserver(const OfflineRegion& region, - std::unique_ptr&& observer) { + std::unique_ptr observer) { impl->actor().invoke(&DatabaseFileSourceThread::setRegionObserver, region.getID(), std::move(observer)); } @@ -324,7 +315,7 @@ void DatabaseFileSource::setOfflineRegionDownloadState(const OfflineRegion& regi void DatabaseFileSource::getOfflineRegionStatus( const OfflineRegion& region, - std23::move_only_function)>&& callback) const { + std::function)> callback) const { impl->actor().invoke(&DatabaseFileSourceThread::getRegionStatus, region.getID(), std::move(callback)); } diff --git a/platform/default/src/mbgl/storage/file_source_request.cpp b/platform/default/src/mbgl/storage/file_source_request.cpp index e13f88c51258..c8d5ae46a1f4 100644 --- a/platform/default/src/mbgl/storage/file_source_request.cpp +++ b/platform/default/src/mbgl/storage/file_source_request.cpp @@ -5,8 +5,8 @@ namespace mbgl { -FileSourceRequest::FileSourceRequest(std::function callback) - : responseCallback(std::move(callback)), +FileSourceRequest::FileSourceRequest(FileSource::Callback&& callback) + : responseCallback(callback), mailbox(std::make_shared(*Scheduler::GetCurrent())) {} FileSourceRequest::~FileSourceRequest() { diff --git a/platform/default/src/mbgl/storage/http_file_source.cpp b/platform/default/src/mbgl/storage/http_file_source.cpp index 977ae24cb901..6bb4ff9220a3 100644 --- a/platform/default/src/mbgl/storage/http_file_source.cpp +++ b/platform/default/src/mbgl/storage/http_file_source.cpp @@ -79,7 +79,7 @@ class HTTPFileSource::Impl { class HTTPRequest : public AsyncRequest { public: - HTTPRequest(HTTPFileSource::Impl *, Resource, std::function); + HTTPRequest(HTTPFileSource::Impl *, Resource, FileSource::Callback); ~HTTPRequest() override; void handleResult(CURLcode code); @@ -90,7 +90,7 @@ class HTTPRequest : public AsyncRequest { HTTPFileSource::Impl *context = nullptr; Resource resource; - std::function callback; + FileSource::Callback callback; // Will store the current response. std::shared_ptr data; @@ -264,7 +264,7 @@ ClientOptions HTTPFileSource::Impl::getClientOptions() { return clientOptions.clone(); } -HTTPRequest::HTTPRequest(HTTPFileSource::Impl *context_, Resource resource_, std::function callback_) +HTTPRequest::HTTPRequest(HTTPFileSource::Impl *context_, Resource resource_, FileSource::Callback callback_) : context(context_), resource(std::move(resource_)), callback(std::move(callback_)), @@ -458,9 +458,8 @@ HTTPFileSource::HTTPFileSource(const ResourceOptions &resourceOptions, const Cli HTTPFileSource::~HTTPFileSource() = default; -std::unique_ptr HTTPFileSource::request(const Resource &resource, - std::function callback) { - return std::make_unique(impl.get(), resource, std::move(callback)); +std::unique_ptr HTTPFileSource::request(const Resource &resource, Callback callback) { + return std::make_unique(impl.get(), resource, callback); } void HTTPFileSource::setResourceOptions(ResourceOptions options) { diff --git a/platform/default/src/mbgl/storage/local_file_source.cpp b/platform/default/src/mbgl/storage/local_file_source.cpp index c20498c174f9..3fef8ee78622 100644 --- a/platform/default/src/mbgl/storage/local_file_source.cpp +++ b/platform/default/src/mbgl/storage/local_file_source.cpp @@ -13,7 +13,7 @@ namespace { bool acceptsURL(const std::string& url) { - return url.starts_with(mbgl::util::FILE_PROTOCOL); + return 0 == url.rfind(mbgl::util::FILE_PROTOCOL, 0); } } // namespace @@ -75,8 +75,7 @@ LocalFileSource::LocalFileSource(const ResourceOptions& resourceOptions, const C LocalFileSource::~LocalFileSource() = default; -std::unique_ptr LocalFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr LocalFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&Impl::request, resource, req->actor()); diff --git a/platform/default/src/mbgl/storage/main_resource_loader.cpp b/platform/default/src/mbgl/storage/main_resource_loader.cpp index 6915a8fe60cf..2f523f1e8d2e 100644 --- a/platform/default/src/mbgl/storage/main_resource_loader.cpp +++ b/platform/default/src/mbgl/storage/main_resource_loader.cpp @@ -55,7 +55,7 @@ class MainResourceLoaderThread { " Action: " << "Requesting," << " URL: " << res.url.c_str() << " Size: " << (response.data != nullptr ? response.data->size() : 0) << "B," - << " Time"); + << " Time") } callback(response); }); @@ -169,7 +169,7 @@ class MainResourceLoader::Impl { resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {} - std::unique_ptr request(const Resource& resource, std::function callback) { + std::unique_ptr request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); req->onCancel([actorRef = thread->actor(), req = req.get()]() { @@ -258,8 +258,7 @@ bool MainResourceLoader::supportsCacheOnlyRequests() const { return impl->supportsCacheOnlyRequests(); } -std::unique_ptr MainResourceLoader::request(const Resource& resource, - std::function callback) { +std::unique_ptr MainResourceLoader::request(const Resource& resource, Callback callback) { return impl->request(resource, std::move(callback)); } diff --git a/platform/default/src/mbgl/storage/mbtiles_file_source.cpp b/platform/default/src/mbgl/storage/mbtiles_file_source.cpp index 167123fb7e7c..29b9be2de1d3 100644 --- a/platform/default/src/mbgl/storage/mbtiles_file_source.cpp +++ b/platform/default/src/mbgl/storage/mbtiles_file_source.cpp @@ -29,7 +29,7 @@ namespace { bool acceptsURL(const std::string &url) { - return url.starts_with(mbgl::util::MBTILES_PROTOCOL); + return 0 == url.rfind(mbgl::util::MBTILES_PROTOCOL, 0); } std::string url_to_path(const std::string &url) { @@ -107,7 +107,7 @@ class MBTilesFileSource::Impl { auto format_ptr = values.find("format"); std::string format = format_ptr == values.end() ? "png" : format_ptr->second; - if (format != "pbf" && !values.contains("scale")) { + if (format != "pbf" && values.count("scale") == 0) { values["scale"] = "1"; } @@ -184,19 +184,19 @@ class MBTilesFileSource::Impl { // Load data for specific tile void request_tile(const Resource &resource, ActorRef req) { - const std::string base_path = url_to_path(resource.url); - const std::string path = db_path(base_path); + std::string base_path = url_to_path(resource.url); + std::string path = db_path(base_path); auto &db = get_db(path); - const int iy = resource.tileData->y; - const int iz = static_cast(resource.tileData->z); + int iy = resource.tileData->y; + int iz = resource.tileData->z; - const auto x = std::to_string(resource.tileData->x); - const auto y = std::to_string((int)(pow(2, iz) - 1) - iy); - const auto z = std::to_string(iz); + auto x = std::to_string(resource.tileData->x); + auto y = std::to_string((int)(pow(2, iz) - 1) - iy); + auto z = std::to_string(iz); - const std::string sql = "SELECT tile_data FROM tiles where zoom_level = " + z + " AND tile_column = " + x + - " AND tile_row = " + y; + std::string sql = "SELECT tile_data FROM tiles where zoom_level = " + z + " AND tile_column = " + x + + " AND tile_row = " + y; mapbox::sqlite::Statement stmt(db, sql.c_str()); Response response; @@ -255,7 +255,7 @@ class MBTilesFileSource::Impl { auto ptr = db_cache.find(path); if (ptr != db_cache.end()) { return ptr->second; - } + }; auto ptr2 = db_cache.insert(std::pair( path, mapbox::sqlite::Database::open(path, mapbox::sqlite::ReadOnly))); @@ -275,8 +275,7 @@ MBTilesFileSource::MBTilesFileSource(const ResourceOptions &resourceOptions, con resourceOptions.clone(), clientOptions.clone())) {} -std::unique_ptr MBTilesFileSource::request(const Resource &resource, - std::function callback) { +std::unique_ptr MBTilesFileSource::request(const Resource &resource, FileSource::Callback callback) { auto req = std::make_unique(std::move(callback)); // assume if there is a tile request, that the mbtiles file has been validated @@ -297,7 +296,7 @@ std::unique_ptr MBTilesFileSource::request(const Resource &resourc // file must exist auto path = url_to_path(resource.url); - struct stat buffer{}; + struct stat buffer; int result = stat(path.c_str(), &buffer); if (result == -1 && errno == ENOENT) { Response response; diff --git a/platform/default/src/mbgl/storage/online_file_source.cpp b/platform/default/src/mbgl/storage/online_file_source.cpp index 7c9515c0d5c7..077fc915fc75 100644 --- a/platform/default/src/mbgl/storage/online_file_source.cpp +++ b/platform/default/src/mbgl/storage/online_file_source.cpp @@ -37,7 +37,9 @@ constexpr const char* ONLINE_STATUS_KEY = "online-status"; class OnlineFileSourceThread; struct OnlineFileRequest { - OnlineFileRequest(Resource resource_, std::function&& callback_, OnlineFileSourceThread& impl_); + using Callback = std::function; + + OnlineFileRequest(Resource resource_, Callback callback_, OnlineFileSourceThread& impl_); ~OnlineFileRequest(); void networkIsReachableAgain(); @@ -54,7 +56,7 @@ struct OnlineFileRequest { Resource resource; std::unique_ptr request; util::Timer timer; - std::function callback; + Callback callback; std::function cancelCallback = nullptr; std::shared_ptr mailbox; @@ -301,7 +303,7 @@ class OnlineFileSourceThread { std::set activeRequests; bool online = true; - uint32_t maximumConcurrentRequests = util::DEFAULT_MAXIMUM_CONCURRENT_REQUESTS; + uint32_t maximumConcurrentRequests; HTTPFileSource httpFileSource; util::AsyncTask reachability{std::bind(&OnlineFileSourceThread::networkIsReachableAgain, this)}; std::map> tasks; @@ -318,7 +320,7 @@ class OnlineFileSource::Impl { resourceOptions.clone(), clientOptions.clone())) {} - std::unique_ptr request(std::function callback, Resource res) { + std::unique_ptr request(Callback callback, Resource res) { auto req = std::make_unique(std::move(callback)); req->onCancel( [actorRef = thread->actor(), req = req.get()]() { actorRef.invoke(&OnlineFileSourceThread::cancel, req); }); @@ -427,9 +429,7 @@ class OnlineFileSource::Impl { const std::unique_ptr> thread; }; -OnlineFileRequest::OnlineFileRequest(Resource resource_, - std::function&& callback_, - OnlineFileSourceThread& impl_) +OnlineFileRequest::OnlineFileRequest(Resource resource_, Callback callback_, OnlineFileSourceThread& impl_) : impl(impl_), resource(std::move(resource_)), callback(std::move(callback_)) { @@ -616,8 +616,7 @@ OnlineFileSource::OnlineFileSource(const ResourceOptions& resourceOptions, const OnlineFileSource::~OnlineFileSource() = default; -std::unique_ptr OnlineFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr OnlineFileSource::request(const Resource& resource, Callback callback) { Resource res = resource; const TileServerOptions options = impl->getResourceOptions().tileServerOptions(); diff --git a/platform/default/src/mbgl/storage/pmtiles_file_source.cpp b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp index e5811375dfd0..daa9e8ba2f1a 100644 --- a/platform/default/src/mbgl/storage/pmtiles_file_source.cpp +++ b/platform/default/src/mbgl/storage/pmtiles_file_source.cpp @@ -547,8 +547,7 @@ PMTilesFileSource::PMTilesFileSource(const ResourceOptions& resourceOptions, con resourceOptions.clone(), clientOptions.clone())) {} -std::unique_ptr PMTilesFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr PMTilesFileSource::request(const Resource& resource, FileSource::Callback callback) { auto req = std::make_unique(std::move(callback)); // assume if there is a tile request, that the pmtiles file has been validated diff --git a/platform/default/src/mbgl/util/run_loop.cpp b/platform/default/src/mbgl/util/run_loop.cpp index c444737260c6..0076299c655d 100644 --- a/platform/default/src/mbgl/util/run_loop.cpp +++ b/platform/default/src/mbgl/util/run_loop.cpp @@ -48,8 +48,8 @@ struct Watch { uv_poll_t poll; int fd; - std23::move_only_function eventCallback; - std23::move_only_function closeCallback; + std::function eventCallback; + std::function closeCallback; }; RunLoop* RunLoop::Get() { @@ -171,7 +171,7 @@ void RunLoop::waitForEmpty([[maybe_unused]] const mbgl::util::SimpleIdentity tag } } -void RunLoop::addWatch(int fd, Event event, std23::move_only_function&& callback) { +void RunLoop::addWatch(int fd, Event event, std::function&& callback) { MBGL_VERIFY_THREAD(tid); Watch* watch = nullptr; diff --git a/platform/node/CMakeLists.txt b/platform/node/CMakeLists.txt index 4626784688b8..c7eedf18702f 100644 --- a/platform/node/CMakeLists.txt +++ b/platform/node/CMakeLists.txt @@ -37,7 +37,6 @@ target_include_directories( ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/platform/default/include ${PROJECT_SOURCE_DIR}/src - ${PROJECT_SOURCE_DIR}/vendor/nontype_functional/include PRIVATE ${LIBUV_INCLUDE_DIRS} ) @@ -45,7 +44,6 @@ target_link_libraries( mbgl-node-loop PUBLIC Mapbox::Base - INTERFACE mbgl-vendor-nontype_functional ) target_sources( @@ -70,7 +68,6 @@ target_link_libraries( mbgl-node INTERFACE mbgl-node-loop INTERFACE Mapbox::Map - INTERFACE mbgl-vendor-nontype_functional ) # FIXME: Node bindings only run fully on Linux now because it requires libuv RunLoop (which is the default on Linux). Also, Sanitizer will diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index c4295c587b28..b67ed90a19da 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -1537,7 +1537,7 @@ NodeMap::~NodeMap() { } std::unique_ptr NodeFileSource::request(const mbgl::Resource& resource, - std::function callback_) { + mbgl::FileSource::Callback callback_) { assert(nodeMap); Nan::HandleScope scope; diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index 5b9df1bda356..9f170d32750c 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -103,7 +103,7 @@ struct NodeFileSource : public mbgl::FileSource { NodeFileSource(NodeMap* nodeMap_) : nodeMap(nodeMap_) {} ~NodeFileSource() override = default; - std::unique_ptr request(const mbgl::Resource&, std::function) final; + std::unique_ptr request(const mbgl::Resource&, mbgl::FileSource::Callback) final; bool canRequest(const mbgl::Resource&) const override; void setResourceOptions(mbgl::ResourceOptions) override; mbgl::ResourceOptions getResourceOptions() override; diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp index 685432628620..916c7edc2ed5 100644 --- a/platform/node/src/node_request.cpp +++ b/platform/node/src/node_request.cpp @@ -7,7 +7,7 @@ namespace node_mbgl { -NodeRequest::NodeRequest(std::function callback_, NodeAsyncRequest* asyncRequest_) +NodeRequest::NodeRequest(mbgl::FileSource::Callback callback_, NodeAsyncRequest* asyncRequest_) : callback(std::move(callback_)), asyncRequest(asyncRequest_) { asyncRequest->request = this; @@ -42,7 +42,7 @@ void NodeRequest::Init(v8::Local target) { void NodeRequest::New(const Nan::FunctionCallbackInfo& info) { auto target = reinterpret_cast(info[0].As()->Value()); - auto callback = reinterpret_cast*>(info[1].As()->Value()); + auto callback = reinterpret_cast(info[1].As()->Value()); auto asyncRequest = reinterpret_cast(info[2].As()->Value()); auto request = new NodeRequest(*callback, asyncRequest); diff --git a/platform/node/src/node_request.hpp b/platform/node/src/node_request.hpp index f87253646e85..fa8f8752e0dd 100644 --- a/platform/node/src/node_request.hpp +++ b/platform/node/src/node_request.hpp @@ -22,7 +22,7 @@ struct NodeAsyncRequest : public mbgl::AsyncRequest { class NodeRequest : public Nan::ObjectWrap { public: - NodeRequest(std::function, NodeAsyncRequest*); + NodeRequest(mbgl::FileSource::Callback, NodeAsyncRequest*); ~NodeRequest() override; static Nan::Persistent constructor; @@ -34,7 +34,7 @@ class NodeRequest : public Nan::ObjectWrap { void unrefRequest(); - std::function callback; + mbgl::FileSource::Callback callback; NodeAsyncRequest* asyncRequest; Nan::AsyncResource* asyncResource = new Nan::AsyncResource("mbgl:execute"); }; diff --git a/platform/qt/src/mbgl/http_file_source.cpp b/platform/qt/src/mbgl/http_file_source.cpp index 54c8a17fc047..b5885940c153 100644 --- a/platform/qt/src/mbgl/http_file_source.cpp +++ b/platform/qt/src/mbgl/http_file_source.cpp @@ -106,9 +106,8 @@ HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const Cli HTTPFileSource::~HTTPFileSource() = default; -std::unique_ptr HTTPFileSource::request(const Resource& resource, - std::function callback) { - return std::make_unique(impl.get(), resource, std::move(callback)); +std::unique_ptr HTTPFileSource::request(const Resource& resource, Callback callback) { + return std::make_unique(impl.get(), resource, callback); } void HTTPFileSource::setResourceOptions(ResourceOptions options) { diff --git a/platform/qt/src/mbgl/http_request.cpp b/platform/qt/src/mbgl/http_request.cpp index da2e7e01ee14..973760a419a8 100644 --- a/platform/qt/src/mbgl/http_request.cpp +++ b/platform/qt/src/mbgl/http_request.cpp @@ -13,12 +13,10 @@ namespace mbgl { -HTTPRequest::HTTPRequest(HTTPFileSource::Impl* context, - const Resource& resource, - std::function callback) +HTTPRequest::HTTPRequest(HTTPFileSource::Impl* context, const Resource& resource, FileSource::Callback callback) : m_context(context), m_resource(resource), - m_callback(std::move(callback)) { + m_callback(callback) { m_context->request(this); } diff --git a/platform/qt/src/mbgl/http_request.hpp b/platform/qt/src/mbgl/http_request.hpp index e74a7ecfad73..5486b686cafa 100644 --- a/platform/qt/src/mbgl/http_request.hpp +++ b/platform/qt/src/mbgl/http_request.hpp @@ -14,7 +14,7 @@ class Response; class HTTPRequest : public AsyncRequest { public: - HTTPRequest(HTTPFileSource::Impl*, const Resource&, std::function); + HTTPRequest(HTTPFileSource::Impl*, const Resource&, FileSource::Callback); virtual ~HTTPRequest(); QUrl requestUrl() const; @@ -25,7 +25,7 @@ class HTTPRequest : public AsyncRequest { private: HTTPFileSource::Impl* m_context; Resource m_resource; - std::function m_callback; + FileSource::Callback m_callback; bool m_handled = false; }; diff --git a/platform/qt/src/mbgl/run_loop.cpp b/platform/qt/src/mbgl/run_loop.cpp index 9831602ecd35..ea1828dea076 100644 --- a/platform/qt/src/mbgl/run_loop.cpp +++ b/platform/qt/src/mbgl/run_loop.cpp @@ -107,7 +107,7 @@ void RunLoop::waitForEmpty([[maybe_unused]] const mbgl::util::SimpleIdentity tag } } -void RunLoop::addWatch(int fd, Event event, std23::move_only_function&& cb) { +void RunLoop::addWatch(int fd, Event event, std::function&& cb) { MBGL_VERIFY_THREAD(tid); if (event == Event::Read || event == Event::ReadWrite) { diff --git a/platform/qt/src/mbgl/run_loop_impl.hpp b/platform/qt/src/mbgl/run_loop_impl.hpp index b5fc3ef48ff7..c1fe8578e31b 100644 --- a/platform/qt/src/mbgl/run_loop_impl.hpp +++ b/platform/qt/src/mbgl/run_loop_impl.hpp @@ -13,7 +13,8 @@ namespace mbgl { namespace util { -using WatchPair = std::pair, std23::move_only_function>; +using WatchCallback = std::function; +using WatchPair = std::pair, WatchCallback>; class RunLoop::Impl : public QObject { Q_OBJECT diff --git a/platform/qt/src/utils/scheduler.cpp b/platform/qt/src/utils/scheduler.cpp index af99ed7335fc..7ab5364c5629 100644 --- a/platform/qt/src/utils/scheduler.cpp +++ b/platform/qt/src/utils/scheduler.cpp @@ -13,11 +13,7 @@ Scheduler::~Scheduler() { MBGL_VERIFY_THREAD(tid); } -void Scheduler::schedule(Task&& function) { - this->Scheduler::schedule(mbgl::util::SimpleIdentity::Empty, std::move(function)); -} - -void Scheduler::schedule(mbgl::util::SimpleIdentity, Task&& function) { +void Scheduler::schedule(std::function&& function) { const std::lock_guard lock(m_taskQueueMutex); m_taskQueue.push(std::move(function)); @@ -27,7 +23,7 @@ void Scheduler::schedule(mbgl::util::SimpleIdentity, Task&& function) { } void Scheduler::processEvents() { - std::queue taskQueue; + std::queue> taskQueue; { const std::unique_lock lock(m_taskQueueMutex); std::swap(taskQueue, m_taskQueue); diff --git a/platform/qt/src/utils/scheduler.hpp b/platform/qt/src/utils/scheduler.hpp index 15020a9f4cb2..99b26b7b757e 100644 --- a/platform/qt/src/utils/scheduler.hpp +++ b/platform/qt/src/utils/scheduler.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include @@ -21,8 +20,7 @@ class Scheduler : public QObject, public mbgl::Scheduler { ~Scheduler() override; // mbgl::Scheduler implementation. - void schedule(Task&&) final; - void schedule(mbgl::util::SimpleIdentity, Task&&) final; + void schedule(std::function&& function) final; void waitForEmpty(const mbgl::util::SimpleIdentity tag = mbgl::util::SimpleIdentity::Empty) override; @@ -39,7 +37,7 @@ class Scheduler : public QObject, public mbgl::Scheduler { std::mutex m_taskQueueMutex; std::condition_variable cvEmpty; std::atomic pendingItems; - std::queue m_taskQueue; + std::queue> m_taskQueue; mapbox::base::WeakPtrFactory weakFactory{this}; // Do not add members here, see `WeakPtrFactory` }; diff --git a/render-test/file_source.cpp b/render-test/file_source.cpp index 081b63cf899c..30b1f679e1ff 100644 --- a/render-test/file_source.cpp +++ b/render-test/file_source.cpp @@ -32,8 +32,7 @@ ProxyFileSource::ProxyFileSource(std::shared_ptr defaultResourceLoad ProxyFileSource::~ProxyFileSource() = default; -std::unique_ptr ProxyFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr ProxyFileSource::request(const Resource& resource, Callback callback) { auto transformed = resource; // If offline, force always loading the resource from the cache diff --git a/render-test/file_source.hpp b/render-test/file_source.hpp index baa916100ffc..c06d223079db 100644 --- a/render-test/file_source.hpp +++ b/render-test/file_source.hpp @@ -12,7 +12,7 @@ class ProxyFileSource : public FileSource { ProxyFileSource(std::shared_ptr, const ResourceOptions&, const ClientOptions&); ~ProxyFileSource(); - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override { return true; } /** diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp index a55c06e9dfd3..68a55cbef9c6 100644 --- a/src/mbgl/actor/scheduler.cpp +++ b/src/mbgl/actor/scheduler.cpp @@ -5,7 +5,7 @@ namespace mbgl { -Scheduler::Task Scheduler::bindOnce(Scheduler::Task&& fn) { +std::function Scheduler::bindOnce(std::function fn) { assert(fn); return [scheduler = makeWeakPtr(), scheduled = std::move(fn)]() mutable { if (!scheduled) return; // Repeated call. @@ -59,11 +59,11 @@ std::shared_ptr Scheduler::GetSequenced() { if (auto scheduler = weaks[lastUsedIndex].lock()) { return scheduler; + } else { + auto result = std::make_shared(); + weaks[lastUsedIndex] = result; + return result; } - - auto result = std::make_shared(); - weaks[lastUsedIndex] = result; - return result; } } // namespace mbgl diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 3bf43a3ed2c4..6b5a6454f182 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -64,7 +64,7 @@ Map::Impl::~Impl() { // Explicitly reset the RendererFrontend first to ensure it releases // All shared resources (AnnotationManager) rendererFrontend.reset(); -} +}; // MARK: - Map::Impl StyleObserver @@ -212,10 +212,12 @@ void Map::Impl::onWillStartRenderingMap() { void Map::Impl::onDidFinishRenderingMap() { if (mode == MapMode::Continuous && loading) { observer.onDidFinishRenderingMap(MapObserver::RenderMode::Full); - loading = false; - observer.onDidFinishLoadingMap(); + if (loading) { + loading = false; + observer.onDidFinishLoadingMap(); + } } -} +}; void Map::Impl::jumpTo(const CameraOptions& camera) { cameraMutated = true; @@ -223,7 +225,7 @@ void Map::Impl::jumpTo(const CameraOptions& camera) { onUpdate(); } -void Map::Impl::onStyleImageMissing(const std::string& id, Scheduler::Task&& done) { +void Map::Impl::onStyleImageMissing(const std::string& id, const std::function& done) { if (!style->getImage(id)) observer.onStyleImageMissing(id); done(); diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index c1cee52636f9..d093b30f227b 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -52,7 +52,7 @@ class Map::Impl final : public style::Observer, public RendererObserver { void onDidFinishRenderingFrame(RenderMode, bool, bool, double, double) final; void onWillStartRenderingMap() final; void onDidFinishRenderingMap() final; - void onStyleImageMissing(const std::string&, Scheduler::Task&&) final; + void onStyleImageMissing(const std::string&, const std::function&) final; void onRemoveUnusedStyleImages(const std::vector&) final; void onRegisterShaders(gfx::ShaderRegistry&) final; @@ -88,7 +88,7 @@ class Map::Impl final : public style::Observer, public RendererObserver { uint8_t prefetchZoomDelta = util::DEFAULT_PREFETCH_ZOOM_DELTA; bool loading = false; - bool rendererFullyLoaded{false}; + bool rendererFullyLoaded; std::unique_ptr stillImageRequest; }; diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index 2ed998d8c272..c2b7bca9358b 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -231,7 +231,7 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR if (!missingDependencies.empty()) { ImageRequestor* requestorPtr = &requestor; - assert(!missingImageRequestors.contains(requestorPtr)); + assert(!missingImageRequestors.count(requestorPtr)); missingImageRequestors.emplace(requestorPtr, pair); for (const auto& dependency : missingDependencies) { @@ -260,7 +260,7 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR requestor.addPendingRequest(missingImage); } - Scheduler::Task removePendingRequests = [this, missingImage] { + auto removePendingRequests = [this, missingImage] { std::lock_guard readWriteLock(rwLock); auto existingRequest = requestedImages.find(missingImage); if (existingRequest == requestedImages.end()) { @@ -271,8 +271,8 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR req->removePendingRequest(missingImage); } }; - Scheduler::Task bindRemove = Scheduler::GetCurrent()->bindOnce(std::move(removePendingRequests)); - observer->onStyleImageMissing(missingImage, std::move(bindRemove)); + observer->onStyleImageMissing(missingImage, + Scheduler::GetCurrent()->bindOnce(std::move(removePendingRequests))); } } else { // Associate requestor with an image that was provided by the client. diff --git a/src/mbgl/renderer/image_manager_observer.hpp b/src/mbgl/renderer/image_manager_observer.hpp index f5f7ba624e14..a057c99f8472 100644 --- a/src/mbgl/renderer/image_manager_observer.hpp +++ b/src/mbgl/renderer/image_manager_observer.hpp @@ -11,7 +11,7 @@ class ImageManagerObserver { public: virtual ~ImageManagerObserver() = default; - virtual void onStyleImageMissing(const std::string&, Scheduler::Task&& done) { done(); } + virtual void onStyleImageMissing(const std::string&, const std::function& done) { done(); } virtual void onRemoveUnusedStyleImages(const std::vector&) {} }; diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 8cd82d1b834c..c9762831a1b2 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -54,7 +54,7 @@ const std::string& LayerRenderItem::getName() const { } #if MLN_DRAWABLE_RENDERER -void LayerRenderItem::updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const {} +void LayerRenderItem::updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const {}; #endif namespace { @@ -1065,10 +1065,10 @@ void RenderOrchestrator::onTileAction(RenderSource&, observer->onTileAction(op, id, sourceID); } -void RenderOrchestrator::onStyleImageMissing(const std::string& id, Scheduler::Task&& done) { +void RenderOrchestrator::onStyleImageMissing(const std::string& id, const std::function& done) { MLN_TRACE_FUNC(); - observer->onStyleImageMissing(id, std::move(done)); + observer->onStyleImageMissing(id, done); } void RenderOrchestrator::onRemoveUnusedStyleImages(const std::vector& unusedImageIDs) { diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 95d4179e0eb4..5065b189ae60 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -186,7 +186,7 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage void onTileAction(RenderSource&, TileOperation, const OverscaledTileID&, const std::string&) override; // ImageManagerObserver implementation - void onStyleImageMissing(const std::string&, Scheduler::Task&&) override; + void onStyleImageMissing(const std::string&, const std::function&) override; void onRemoveUnusedStyleImages(const std::vector&) override; #if MLN_DRAWABLE_RENDERER diff --git a/src/mbgl/storage/asset_file_source.hpp b/src/mbgl/storage/asset_file_source.hpp index 7b1cfb4e670f..8db775592d1a 100644 --- a/src/mbgl/storage/asset_file_source.hpp +++ b/src/mbgl/storage/asset_file_source.hpp @@ -16,7 +16,7 @@ class AssetFileSource : public FileSource { AssetFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~AssetFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void pause() override; void resume() override; diff --git a/src/mbgl/storage/http_file_source.hpp b/src/mbgl/storage/http_file_source.hpp index 1ed2d7db158f..7a1233958968 100644 --- a/src/mbgl/storage/http_file_source.hpp +++ b/src/mbgl/storage/http_file_source.hpp @@ -13,7 +13,7 @@ class HTTPFileSource : public FileSource { HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~HTTPFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource& resource) const override { return resource.hasLoadingMethod(Resource::LoadingMethod::Network); } diff --git a/src/mbgl/storage/local_file_source.hpp b/src/mbgl/storage/local_file_source.hpp index cdaca1367775..79a90de67205 100644 --- a/src/mbgl/storage/local_file_source.hpp +++ b/src/mbgl/storage/local_file_source.hpp @@ -16,7 +16,7 @@ class LocalFileSource : public FileSource { LocalFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~LocalFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void pause() override; void resume() override; diff --git a/src/mbgl/storage/main_resource_loader.hpp b/src/mbgl/storage/main_resource_loader.hpp index 5e3063bfff96..6b6ddc54266c 100644 --- a/src/mbgl/storage/main_resource_loader.hpp +++ b/src/mbgl/storage/main_resource_loader.hpp @@ -14,7 +14,7 @@ class MainResourceLoader final : public FileSource { ~MainResourceLoader() override; bool supportsCacheOnlyRequests() const override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void pause() override; void resume() override; diff --git a/src/mbgl/storage/mbtiles_file_source.hpp b/src/mbgl/storage/mbtiles_file_source.hpp index 658b00ecb9af..876d348c6531 100644 --- a/src/mbgl/storage/mbtiles_file_source.hpp +++ b/src/mbgl/storage/mbtiles_file_source.hpp @@ -13,7 +13,7 @@ class MBTilesFileSource : public FileSource { MBTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~MBTilesFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void setResourceOptions(ResourceOptions) override; diff --git a/src/mbgl/storage/pmtiles_file_source.hpp b/src/mbgl/storage/pmtiles_file_source.hpp index 6d710f2e2a82..47d34139efeb 100644 --- a/src/mbgl/storage/pmtiles_file_source.hpp +++ b/src/mbgl/storage/pmtiles_file_source.hpp @@ -12,7 +12,7 @@ class PMTilesFileSource : public FileSource { PMTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~PMTilesFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; + std::unique_ptr request(const Resource&, Callback) override; bool canRequest(const Resource&) const override; void setResourceOptions(ResourceOptions) override; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 7e90e7c477c1..24a81c4ca708 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -14,13 +14,12 @@ #include #include #include -#include -#include -#include #include #include -#include +#include #include +#include +#include #include #include @@ -373,9 +372,9 @@ void GeometryTileWorker::parse() { return; } - MBGL_TIMING_START(watch); + MBGL_TIMING_START(watch) - mbgl::unordered_map> symbolLayoutMap; + std::unordered_map> symbolLayoutMap; renderData.clear(); layouts.clear(); @@ -496,7 +495,7 @@ void GeometryTileWorker::finalizeLayout() { return; } - MBGL_TIMING_START(watch); + MBGL_TIMING_START(watch) std::optional glyphAtlasImage; ImageAtlas iconAtlas = makeImageAtlas(imageMap, patternMap, versionMap); if (!layouts.empty()) { diff --git a/src/mbgl/tile/tile_cache.cpp b/src/mbgl/tile/tile_cache.cpp index 5302b9abe1a8..5104c3ea6ef3 100644 --- a/src/mbgl/tile/tile_cache.cpp +++ b/src/mbgl/tile/tile_cache.cpp @@ -14,7 +14,7 @@ TileCache::~TileCache() { pendingReleases.clear(); std::unique_lock counterLock{deferredSignalLock}; - deferredSignal.wait(counterLock, [this]() { return deferredDeletionsPending == 0; }); + deferredSignal.wait(counterLock, [&]() { return deferredDeletionsPending == 0; }); } void TileCache::setSize(size_t size_) { @@ -37,6 +37,24 @@ void TileCache::setSize(size_t size_) { assert(orderedKeys.size() <= size); } +namespace { +/// This exists solely to prevent a problem where temporary lambda captures +/// are retained for the duration of the scope instead of being destroyed immediately. +struct CaptureWrapper { + CaptureWrapper(std::vector>&& items_) + : items(items_.size()) { + std::ranges::move(items_, items.begin()); + } + CaptureWrapper(CaptureWrapper&&) = default; + + /// This copy constructor is required to build, but doesn't seem to be called. + CaptureWrapper(const CaptureWrapper& other) + : items(other.items) {} + + std::vector> items; +}; +} // namespace + void TileCache::deferredRelease(std::unique_ptr&& tile) { MLN_TRACE_FUNC(); @@ -58,22 +76,27 @@ void TileCache::deferPendingReleases() { deferredDeletionsPending++; } - // Move elements to a disposable container to be captured by the lambda - decltype(pendingReleases) pending{pendingReleases.size()}; - std::ranges::move(pendingReleases, pending.begin()); + CaptureWrapper wrap{std::move(pendingReleases)}; pendingReleases.clear(); - threadPool.schedule({[items{std::move(pending)}, this]() mutable { + + // The `std::function` must be created in a separate statement from the `schedule` call. + // Creating a `std::function` from a lambda involves a copy, which is why we must use + // `shared_ptr` rather than `unique_ptr` for the capture. As a result, a temporary holds + // a reference until the construction is complete and the lambda is destroyed. + // If this temporary outlives the `schedule` call, and the function is executed immediately + // by a waiting thread and is already complete, that temporary reference ends up being the + // last one and the destruction actually occurs here on this thread. + std::function func{[tile_{CaptureWrapper{std::move(wrap)}}, this]() mutable { MLN_TRACE_ZONE(deferPendingReleases lambda); - MLN_ZONE_VALUE(items.size()); - // Run the deletions - items.clear(); + MLN_ZONE_VALUE(wrap_.releases.size()); + tile_.items.clear(); - // Wake up a waiting destructor std::lock_guard counterLock(deferredSignalLock); deferredDeletionsPending--; deferredSignal.notify_all(); - }}); - pendingReleases.clear(); + }}; + + threadPool.schedule(std::move(func)); } void TileCache::add(const OverscaledTileID& key, std::unique_ptr&& tile) { diff --git a/src/mbgl/util/stopwatch.hpp b/src/mbgl/util/stopwatch.hpp index 693c4266e44c..3e29122c0abc 100644 --- a/src/mbgl/util/stopwatch.hpp +++ b/src/mbgl/util/stopwatch.hpp @@ -21,10 +21,10 @@ namespace util { std::stringstream messageStream; \ messageStream << message; \ watch->report(messageStream.str()); \ - } while (0) + } while (0); #else -#define MBGL_TIMING_START(watch) ((void)0) -#define MBGL_TIMING_FINISH(watch, message) ((void)0) +#define MBGL_TIMING_START(watch) +#define MBGL_TIMING_FINISH(watch, message) #endif #ifndef DISABLE_STOPWATCH diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp index 655e076eed82..bf2ad316df7f 100644 --- a/src/mbgl/util/thread_pool.cpp +++ b/src/mbgl/util/thread_pool.cpp @@ -59,7 +59,7 @@ std::thread ThreadedSchedulerBase::makeSchedulerThread(size_t index) { // 2. Visit a task from each for (auto& q : pending) { - Task tasklet; + std::function tasklet; { std::lock_guard lock(q->lock); if (q->queue.size()) { @@ -105,11 +105,11 @@ std::thread ThreadedSchedulerBase::makeSchedulerThread(size_t index) { }); } -void ThreadedSchedulerBase::schedule(Task&& fn) { +void ThreadedSchedulerBase::schedule(std::function&& fn) { schedule(uniqueID, std::move(fn)); } -void ThreadedSchedulerBase::schedule(const util::SimpleIdentity tag, Task&& fn) { +void ThreadedSchedulerBase::schedule(const util::SimpleIdentity tag, std::function&& fn) { MLN_TRACE_FUNC(); assert(fn); if (!fn) return; diff --git a/src/mbgl/util/thread_pool.hpp b/src/mbgl/util/thread_pool.hpp index afa30b09f5b6..b16146661799 100644 --- a/src/mbgl/util/thread_pool.hpp +++ b/src/mbgl/util/thread_pool.hpp @@ -22,12 +22,12 @@ class ThreadedSchedulerBase : public Scheduler { /// @brief Schedule a generic task not assigned to any particular owner. /// The scheduler itself will own the task. /// @param fn Task to run - void schedule(Task&& fn) override; + void schedule(std::function&& fn) override; /// @brief Schedule a task assigned to the given owner `tag`. /// @param tag Identifier object to indicate ownership of `fn` /// @param fn Task to run - void schedule(const util::SimpleIdentity tag, Task&& fn) override; + void schedule(const util::SimpleIdentity tag, std::function&& fn) override; const util::SimpleIdentity uniqueID; protected: @@ -56,10 +56,10 @@ class ThreadedSchedulerBase : public Scheduler { // Task queues bucketed by tag address struct Queue { - std::atomic runningCount; /* running tasks */ - std::condition_variable cv; /* queue empty condition */ - std::mutex lock; /* lock */ - std::queue queue; /* pending task queue */ + std::atomic runningCount; /* running tasks */ + std::condition_variable cv; /* queue empty condition */ + std::mutex lock; /* lock */ + std::queue> queue; /* pending task queue */ }; mbgl::unordered_map> taggedQueue; }; @@ -90,7 +90,7 @@ class ThreadedScheduler : public ThreadedSchedulerBase { } } - void runOnRenderThread(const util::SimpleIdentity tag, Task&& fn) override { + void runOnRenderThread(const util::SimpleIdentity tag, std::function&& fn) override { std::shared_ptr queue; { std::lock_guard lock(taggedRenderQueueLock); @@ -149,7 +149,7 @@ class ThreadedScheduler : public ThreadedSchedulerBase { std::vector threads; struct RenderQueue { - std::queue queue; + std::queue> queue; std::mutex mutex; }; mbgl::unordered_map> taggedRenderQueue; diff --git a/test/actor/actor.test.cpp b/test/actor/actor.test.cpp index 238218225340..406f788d70a1 100644 --- a/test/actor/actor.test.cpp +++ b/test/actor/actor.test.cpp @@ -94,14 +94,16 @@ TEST(Actor, DestructionBlocksOnSend) { void waitForEmpty(const util::SimpleIdentity) override { assert(false); } - void schedule(Task&&) final { + void schedule(std::function&&) final { promise.set_value(); future.wait(); std::this_thread::sleep_for(1ms); waited = true; } - void schedule(const util::SimpleIdentity, Task&& fn) override final { schedule(std::move(fn)); } + void schedule(const util::SimpleIdentity, std::function&& fn) override final { + schedule(std::move(fn)); + } mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp index 8f92f4720874..282b4982259f 100644 --- a/test/renderer/image_manager.test.cpp +++ b/test/renderer/image_manager.test.cpp @@ -149,7 +149,7 @@ class StubImageManagerObserver : public ImageManagerObserver { int count = 0; std::function imageMissing = [](const std::string&) { }; - void onStyleImageMissing(const std::string& id, Scheduler::Task&& done) override { + void onStyleImageMissing(const std::string& id, const std::function& done) override { count++; imageMissing(id); done(); diff --git a/test/src/mbgl/test/fake_file_source.hpp b/test/src/mbgl/test/fake_file_source.hpp index bfb1937d99c0..95752b0037c6 100644 --- a/test/src/mbgl/test/fake_file_source.hpp +++ b/test/src/mbgl/test/fake_file_source.hpp @@ -27,12 +27,12 @@ class FakeFileSource : public FileSource { class FakeFileRequest : public AsyncRequest { public: Resource resource; - std::function callback; + Callback callback; std::list& list; std::list::iterator link; - FakeFileRequest(Resource resource_, std::function callback_, std::list& list_) + FakeFileRequest(Resource resource_, Callback callback_, std::list& list_) : resource(std::move(resource_)), callback(std::move(callback_)), list(list_), @@ -47,8 +47,8 @@ class FakeFileSource : public FileSource { FakeFileSource() : FakeFileSource(ResourceOptions::Default(), ClientOptions()) {} - std::unique_ptr request(const Resource& resource, std::function callback) override { - return std::make_unique(resource, std::move(callback), requests); + std::unique_ptr request(const Resource& resource, Callback callback) override { + return std::make_unique(resource, callback, requests); } bool canRequest(const Resource&) const override { return true; } @@ -62,7 +62,7 @@ class FakeFileSource : public FileSource { if (requestFound) { // Copy the callback, in case calling it deallocates the AsyncRequest. - auto callback_ = (*it)->callback; + Callback callback_ = (*it)->callback; callback_(response); } @@ -89,8 +89,8 @@ class FakeOnlineFileSource : public FakeFileSource { FakeOnlineFileSource(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) : FakeFileSource(resourceOptions_, clientOptions_) {} - std::unique_ptr request(const Resource& resource, std::function callback) override { - return FakeFileSource::request(resource, std::move(callback)); + std::unique_ptr request(const Resource& resource, Callback callback) override { + return FakeFileSource::request(resource, callback); } bool respond(Resource::Kind kind, const Response& response) { return FakeFileSource::respond(kind, response); } diff --git a/test/src/mbgl/test/stub_file_source.cpp b/test/src/mbgl/test/stub_file_source.cpp index d0b8bfb4f6ad..598b20b666a4 100644 --- a/test/src/mbgl/test/stub_file_source.cpp +++ b/test/src/mbgl/test/stub_file_source.cpp @@ -60,8 +60,7 @@ StubFileSource::StubFileSource(const ResourceOptions& resourceOptions_, StubFileSource::~StubFileSource() = default; -std::unique_ptr StubFileSource::request(const Resource& resource, - std::function callback) { +std::unique_ptr StubFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(*this); if (type == ResponseType::Synchronous) { std::optional res = response(resource); @@ -69,7 +68,7 @@ std::unique_ptr StubFileSource::request(const Resource& resource, callback(*res); } } else { - pending.emplace(req.get(), std::make_tuple(resource, response, std::move(callback))); + pending.emplace(req.get(), std::make_tuple(resource, response, callback)); } return req; } diff --git a/test/src/mbgl/test/stub_file_source.hpp b/test/src/mbgl/test/stub_file_source.hpp index 06c11aeeebf4..1bad4a74d227 100644 --- a/test/src/mbgl/test/stub_file_source.hpp +++ b/test/src/mbgl/test/stub_file_source.hpp @@ -23,8 +23,8 @@ class StubFileSource : public FileSource { StubFileSource(ResponseType = ResponseType::Asynchronous); ~StubFileSource() override; - std::unique_ptr request(const Resource&, std::function) override; - bool canRequest(const Resource&) const noexcept override { return true; } + std::unique_ptr request(const Resource&, Callback) override; + bool canRequest(const Resource&) const override { return true; } void remove(AsyncRequest*); void setProperty(const std::string&, const mapbox::base::Value&) override; mapbox::base::Value getProperty(const std::string&) const override; @@ -57,7 +57,7 @@ class StubFileSource : public FileSource { // The default behavior is to throw if no per-kind callback has been set. std::optional defaultResponse(const Resource&); - std::unordered_map>> pending; + std::unordered_map> pending; ResponseType type; util::Timer timer; std::map properties; diff --git a/test/storage/sync_file_source.test.cpp b/test/storage/sync_file_source.test.cpp index dbc95fb91ca8..8a87ba1412c3 100644 --- a/test/storage/sync_file_source.test.cpp +++ b/test/storage/sync_file_source.test.cpp @@ -18,7 +18,7 @@ using namespace mbgl; class SyncFileSource : public FileSource { public: - std::unique_ptr request(const Resource& resource, std::function callback) override { + std::unique_ptr request(const Resource& resource, FileSource::Callback callback) override { Response response; auto it = assets.find(resource.url); if (it == assets.end()) { diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index fa43bda1372c..78fbf69c6c8a 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -235,12 +235,3 @@ cc_library( strip_include_prefix = "unordered_dense/include/ankerl", visibility = ["//visibility:public"], ) - -cc_library( - name = "nontype_functional", - srcs = [], - hdrs = glob(["nontype_functional/include/std23/*.h"]), - include_prefix = "std23", - strip_include_prefix = "nontype_functional/include/std23", - visibility = ["//visibility:public"], -) diff --git a/vendor/nontype_functional b/vendor/nontype_functional deleted file mode 160000 index 6fae3505138a..000000000000 --- a/vendor/nontype_functional +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6fae3505138a74c0bf2380ca769b4193b891d13e diff --git a/vendor/nontype_functional.cmake b/vendor/nontype_functional.cmake deleted file mode 100644 index 0673e9c1ca34..000000000000 --- a/vendor/nontype_functional.cmake +++ /dev/null @@ -1,21 +0,0 @@ -if(TARGET mbgl-vendor-nontype_functional) - return() -endif() - -add_library( - mbgl-vendor-nontype_functional INTERFACE -) - -target_include_directories( - mbgl-vendor-nontype_functional SYSTEM - INTERFACE ${CMAKE_CURRENT_LIST_DIR}/nontype_functional/include -) - -set_target_properties( - mbgl-vendor-nontype_functional - PROPERTIES - INTERFACE_MAPLIBRE_NAME "nontype_functional" - INTERFACE_MAPLIBRE_URL "https://github.com/zhihaoy/nontype_functional" - INTERFACE_MAPLIBRE_AUTHOR "zhihaoy" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/nontype_functional/LICENSE -) From 92e9a46c1dc27957cc8462baf805742d03db6176 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 11:40:28 +0100 Subject: [PATCH 117/339] chore(deps): update bazel deps (#3311) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 84093198ab62..99b71e803d44 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,11 +2,11 @@ module(name = "maplibre") bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") -bazel_dep(name = "rules_apple", version = "3.19.1") -bazel_dep(name = "rules_swift", version = "2.5.0") +bazel_dep(name = "rules_apple", version = "3.20.1") +bazel_dep(name = "rules_swift", version = "2.7.0") bazel_dep(name = "rules_xcodeproj", version = "2.10.0") bazel_dep(name = "aspect_rules_js", version = "2.2.0") -bazel_dep(name = "rules_nodejs", version = "6.3.3") +bazel_dep(name = "rules_nodejs", version = "6.3.4") bazel_dep(name = "libuv", version = "1.48.0") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) @@ -68,11 +68,11 @@ darwin_config( name = "darwin_config", ) -bazel_dep(name = "rules_rust", version = "0.58.0") +bazel_dep(name = "rules_rust", version = "0.59.1") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", - commit = "0bb4ad82075cb304020df928efb784cee9375467", + commit = "ba6590df60e521dc40b67814dd58116ff37f742f", remote = "https://github.com/dtolnay/cxx.git", ) From 52b9e3270fa0a14adae31c399676c09e6b92d77e Mon Sep 17 00:00:00 2001 From: Tetiana Gubanova <3168855+TatyanaPolunina@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:44:57 +0200 Subject: [PATCH 118/339] Add workaround for android emulator as crash on Android emulation is still presented (#3310) --- include/mbgl/renderer/renderer.hpp | 4 +++ .../MapLibreAndroid/src/cpp/map_renderer.cpp | 29 +++++++++++++++++++ .../renderer/layers/render_heatmap_layer.hpp | 1 + .../renderer/layers/render_symbol_layer.hpp | 6 ++-- src/mbgl/renderer/render_layer.hpp | 6 ++-- src/mbgl/renderer/render_orchestrator.cpp | 7 +++++ src/mbgl/renderer/render_orchestrator.hpp | 8 +++++ src/mbgl/renderer/renderer.cpp | 6 ++++ 8 files changed, 62 insertions(+), 5 deletions(-) diff --git a/include/mbgl/renderer/renderer.hpp b/include/mbgl/renderer/renderer.hpp index 71771b9828ca..4d2e7936376e 100644 --- a/include/mbgl/renderer/renderer.hpp +++ b/include/mbgl/renderer/renderer.hpp @@ -113,6 +113,10 @@ class Renderer { void reduceMemoryUse(); void clearData(); +#if MLN_RENDER_BACKEND_OPENGL + void enableAndroidEmulatorGoldfishMitigation(bool enable); +#endif + private: class Impl; std::unique_ptr impl; diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index fc235a67f4c4..9fd889e05ef6 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -13,6 +13,27 @@ #include "android_renderer_backend.hpp" #include "map_renderer_runnable.hpp" +#if MLN_RENDER_BACKEND_OPENGL +#include + +namespace { +std::string androidSysProp(const char* key) { + assert(strlen(key) < PROP_NAME_MAX); + if (__system_property_find(key) == nullptr) { + return ""; + } + char prop[PROP_VALUE_MAX + 1]; + __system_property_get(key, prop); + return prop; +} + +bool inEmulator() { + return androidSysProp("ro.kernel.qemu") == "1" || androidSysProp("ro.boot.qemu") == "1" || + androidSysProp("ro.hardware.egl") == "emulation"; +} +} // namespace +#endif + namespace mbgl { namespace android { @@ -232,6 +253,14 @@ void MapRenderer::onSurfaceCreated(JNIEnv& env, const jni::Object(backend->getImpl(), pixelRatio, localIdeographFontFamily); rendererRef = std::make_unique>(*renderer, mailboxData.getMailbox()); +#if MLN_RENDER_BACKEND_OPENGL + // If we're running the emulator with the OpenGL backend, we're going to crash eventually, + // unless we enable this mitigation. + if (inEmulator()) { + renderer->enableAndroidEmulatorGoldfishMitigation(true); + } +#endif + backend->setSwapBehavior(swapBehaviorFlush ? gfx::Renderable::SwapBehaviour::Flush : gfx::Renderable::SwapBehaviour::NoFlush); diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.hpp b/src/mbgl/renderer/layers/render_heatmap_layer.hpp index 7f04191925bc..4c74305d7087 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.hpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.hpp @@ -67,6 +67,7 @@ class RenderHeatmapLayer final : public RenderLayer { /// Remove all the drawables for tiles /// @return The number of drawables actually removed. std::size_t removeAllDrawables() override; + #endif // Paint properties diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp index a1e483313abd..380e2dd41531 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.hpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp @@ -98,6 +98,10 @@ class RenderSymbolLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; + + /// Remove all the drawables for tiles + std::size_t removeAllDrawables() override; + #endif // MLN_DRAWABLE_RENDERER protected: @@ -120,8 +124,6 @@ class RenderSymbolLayer final : public RenderLayer { /// Remove all drawables for the tile from the layer group std::size_t removeTile(RenderPass, const OverscaledTileID&) override; - /// Remove all the drawables for tiles - std::size_t removeAllDrawables() override; #endif // MLN_DRAWABLE_RENDERER private: diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index be8d6da94cb3..417d17503258 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -191,6 +191,9 @@ class RenderLayer { /// Returns the current renderability mode of the layer bool isLayerRenderable() const noexcept { return isRenderable; } + + /// Remove all the drawables for tiles + virtual std::size_t removeAllDrawables(); #endif using Dependency = style::expression::Dependency; @@ -247,9 +250,6 @@ class RenderLayer { /// @return The number of drawables actually removed. virtual std::size_t removeTile(RenderPass, const OverscaledTileID&); - /// Remove all the drawables for tiles - virtual std::size_t removeAllDrawables(); - /// Update `renderTileIDs` from `renderTiles` void updateRenderTileIDs(); diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index c9762831a1b2..83cb534b4928 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -983,6 +983,13 @@ void RenderOrchestrator::updateLayers(gfx::ShaderRegistry& shaders, for (const auto& item : items) { auto& renderLayer = item.layer.get(); +#if MLN_RENDER_BACKEND_OPENGL + // Android Emulator: Goldfish is *very* broken. This will prevent a crash + // inside the GL translation layer at the cost of emulator performance. + if (androidGoldfishMitigationEnabled) { + renderLayer.removeAllDrawables(); + } +#endif renderLayer.update(shaders, context, state, updateParameters, renderTree, changes); } addChanges(changes); diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 5065b189ae60..132c75996da7 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -61,6 +61,10 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage const std::optional& localFontFamily_); ~RenderOrchestrator() override; +#if MLN_RENDER_BACKEND_OPENGL + void enableAndroidEmulatorGoldfishMitigation(bool enable) { androidGoldfishMitigationEnabled = enable; } +#endif + void markContextLost() { contextLost = true; }; // TODO: Introduce RenderOrchestratorObserver. void setObserver(RendererObserver*); @@ -220,6 +224,10 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage bool placedSymbolDataCollected = false; bool tileCacheEnabled = true; +#if MLN_RENDER_BACKEND_OPENGL + bool androidGoldfishMitigationEnabled{false}; +#endif + // Vectors with reserved capacity of layerImpls->size() to avoid // reallocation on each frame. std::vector> filteredLayersForSource; diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index 0df78b071998..611144d2aba6 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -152,4 +152,10 @@ void Renderer::clearData() { impl->orchestrator.clearData(); } +#if MLN_RENDER_BACKEND_OPENGL +void Renderer::enableAndroidEmulatorGoldfishMitigation(bool enable) { + impl->orchestrator.enableAndroidEmulatorGoldfishMitigation(enable); +} +#endif + } // namespace mbgl From e069889f7130ff3564a39d29ba3b6821c3f6fea0 Mon Sep 17 00:00:00 2001 From: Tetiana Gubanova <3168855+TatyanaPolunina@users.noreply.github.com> Date: Thu, 20 Mar 2025 19:00:43 +0200 Subject: [PATCH 119/339] Prepare Android v11.8.4 release (#3324) --- platform/android/CHANGELOG.md | 6 ++++++ platform/android/MapLibreAndroid/gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 4f0bff5bc5a7..eddbc3f05f43 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog MapLibre Native for Android +## 11.8.4 + +### 🐞 Bug fixes + +- Add workaround for android emulator as crash on Android emulation is still presented ([#3310](https://github.com/maplibre/maplibre-native/pull/3310)) + ## 11.8.3 ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 77f71b463ab9..eda53af0f1e9 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.8.3 +VERSION_NAME=11.8.4 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 From b7823b27b6d300f84457e0e2cefbd7a7e650b746 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 21 Mar 2025 15:42:43 +0100 Subject: [PATCH 120/339] Apply clang-tidy fixes (mostly use designated initializers) (#3328) --- .clang-tidy | 5 +- include/mbgl/actor/established_actor.hpp | 22 +-- include/mbgl/gfx/shader_group.hpp | 12 +- include/mbgl/gfx/vertex_attribute.hpp | 3 +- include/mbgl/text/glyph.hpp | 5 +- include/mbgl/util/event.hpp | 2 +- include/mbgl/util/immutable.hpp | 2 +- include/mbgl/util/logging.hpp | 2 +- src/mbgl/gfx/color_mode.hpp | 16 +- src/mbgl/gfx/command_encoder.hpp | 1 + src/mbgl/gfx/cull_face_mode.hpp | 8 +- src/mbgl/gfx/depth_mode.hpp | 4 +- src/mbgl/gfx/drawable_atlases_tweaker.cpp | 11 +- src/mbgl/gfx/drawable_builder_impl.cpp | 66 +++---- src/mbgl/gfx/gpu_expression.cpp | 4 +- src/mbgl/gfx/stencil_mode.hpp | 7 +- src/mbgl/gfx/upload_pass.hpp | 1 + src/mbgl/layout/pattern_layout.hpp | 4 +- src/mbgl/programs/symbol_program.hpp | 17 +- .../layers/background_layer_tweaker.cpp | 51 ++--- .../renderer/layers/circle_layer_tweaker.cpp | 46 ++--- .../layers/collision_layer_tweaker.cpp | 6 +- .../layers/fill_extrusion_layer_tweaker.cpp | 62 +++--- .../renderer/layers/fill_layer_tweaker.cpp | 109 +++++------ .../renderer/layers/heatmap_layer_tweaker.cpp | 18 +- .../layers/heatmap_texture_layer_tweaker.cpp | 10 +- .../layers/hillshade_layer_tweaker.cpp | 11 +- .../hillshade_prepare_layer_tweaker.cpp | 8 +- .../renderer/layers/line_layer_tweaker.cpp | 183 +++++++++--------- .../location_indicator_layer_tweaker.cpp | 13 +- .../renderer/layers/raster_layer_tweaker.cpp | 24 +-- .../renderer/layers/symbol_layer_tweaker.cpp | 76 ++++---- .../property_evaluation_parameters.hpp | 5 +- src/mbgl/renderer/render_target.cpp | 7 +- src/mbgl/renderer/tile_layer_group.cpp | 6 +- src/mbgl/style/layers/background_layer.cpp | 15 +- src/mbgl/style/layers/circle_layer.cpp | 15 +- .../style/layers/fill_extrusion_layer.cpp | 15 +- src/mbgl/style/layers/fill_layer.cpp | 15 +- src/mbgl/style/layers/heatmap_layer.cpp | 15 +- src/mbgl/style/layers/hillshade_layer.cpp | 15 +- src/mbgl/style/layers/layer.cpp.ejs | 18 +- src/mbgl/style/layers/line_layer.cpp | 15 +- .../style/layers/location_indicator_layer.cpp | 15 +- src/mbgl/style/layers/raster_layer.cpp | 15 +- src/mbgl/style/layers/symbol_layer.cpp | 18 +- src/mbgl/util/tile_coordinate.hpp | 6 +- 47 files changed, 522 insertions(+), 482 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 1b2bae9a6b0a..03f7c8e0a83b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -113,7 +113,10 @@ Checks: [ -performance-enum-size, -misc-include-cleaner, -readability-redundant-inline-specifier, - -readability-avoid-nested-conditional-operator + -readability-avoid-nested-conditional-operator, + -readability-math-missing-parentheses, + -readability-enum-initial-value, + -boost-use-ranges ] WarningsAsErrors: '*' HeaderFilterRegex: '.*' diff --git a/include/mbgl/actor/established_actor.hpp b/include/mbgl/actor/established_actor.hpp index 1e948e3b5e69..6eb0fd75e3a9 100644 --- a/include/mbgl/actor/established_actor.hpp +++ b/include/mbgl/actor/established_actor.hpp @@ -38,11 +38,9 @@ class EstablishedActor { } // Construct the Object from a parameter pack `args` (i.e. `Object(args...)`) - template || - std::is_constructible_v, Args...>>* = nullptr> + template EstablishedActor(const TaggedScheduler& scheduler, AspiringActor& parent_, Args&&... args) + requires(std::is_constructible_v || std::is_constructible_v, Args...>) : parent(parent_) { emplaceObject(std::forward(args)...); parent.mailbox->open(scheduler); @@ -71,18 +69,18 @@ class EstablishedActor { private: // Enabled for Objects with a constructor taking ActorRef as the first parameter - template , Args...>>* = nullptr> - void emplaceObject(Args&&... args_) { + template + void emplaceObject(Args&&... args_) + requires(std::is_constructible_v, Args...>) + { new (&parent.objectStorage) Object(parent.self(), std::forward(args_)...); } // Enabled for plain Objects - template >* = nullptr> - void emplaceObject(Args&&... args_) { + template + void emplaceObject(Args&&... args_) + requires(std::is_constructible_v) + { new (&parent.objectStorage) Object(std::forward(args_)...); } diff --git a/include/mbgl/gfx/shader_group.hpp b/include/mbgl/gfx/shader_group.hpp index 6b99628f00e4..5b58430158d7 100644 --- a/include/mbgl/gfx/shader_group.hpp +++ b/include/mbgl/gfx/shader_group.hpp @@ -80,8 +80,10 @@ class ShaderGroup { /// @tparam T Derived type, inheriting `gfx::Shader` /// @param shaderName The group name to look up /// @return T or nullptr if not found in the group - template , bool>* = nullptr> - std::shared_ptr get(const std::string& shaderName) noexcept { + template + std::shared_ptr get(const std::string& shaderName) noexcept + requires(is_shader_v) + { auto shader = getShader(shaderName); if (!shader || shader->typeName() != T::Name) { return nullptr; @@ -110,8 +112,10 @@ class ShaderGroup { /// @param to Location to store the shader /// @param shaderName The group name to look up /// @return True if 'to' has a valid program object, false otherwise. - template , bool>* = nullptr> - bool populate(std::shared_ptr& to, const std::string& shaderName) noexcept { + template + bool populate(std::shared_ptr& to, const std::string& shaderName) noexcept + requires(is_shader_v) + { if (to) { return true; } diff --git a/include/mbgl/gfx/vertex_attribute.hpp b/include/mbgl/gfx/vertex_attribute.hpp index 4048c0de26c4..cef74f616fa9 100644 --- a/include/mbgl/gfx/vertex_attribute.hpp +++ b/include/mbgl/gfx/vertex_attribute.hpp @@ -321,8 +321,7 @@ class VertexAttributeArray { /// Indicates whether any values have changed bool isModifiedAfter(std::chrono::duration time) const { - return std::any_of( - attrs.begin(), attrs.end(), [&](const auto& attr) { return attr && attr->isModifiedAfter(time); }); + return std::ranges::any_of(attrs, [&](const auto& attr) { return attr && attr->isModifiedAfter(time); }); } /// Clear the collection diff --git a/include/mbgl/text/glyph.hpp b/include/mbgl/text/glyph.hpp index 36383c0a1ebd..10cee1fba6a1 100644 --- a/include/mbgl/text/glyph.hpp +++ b/include/mbgl/text/glyph.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -113,9 +114,7 @@ class Shaping { float right = 0; WritingModeType writingMode; explicit operator bool() const { - return std::any_of(positionedLines.begin(), positionedLines.end(), [](const auto& line) { - return !line.positionedGlyphs.empty(); - }); + return std::ranges::any_of(positionedLines, [](const auto& line) { return !line.positionedGlyphs.empty(); }); } // The y offset *should* be part of the font metadata. static constexpr int32_t yOffset = -17; diff --git a/include/mbgl/util/event.hpp b/include/mbgl/util/event.hpp index aa4359179fc4..13c5f898026d 100644 --- a/include/mbgl/util/event.hpp +++ b/include/mbgl/util/event.hpp @@ -53,6 +53,6 @@ constexpr Event disabledEvents[] = { Event(-1) // Avoid zero size array }; -constexpr EventPermutation disabledEventPermutations[] = {{EventSeverity::Debug, Event::Shader}}; +constexpr EventPermutation disabledEventPermutations[] = {{.severity = EventSeverity::Debug, .event = Event::Shader}}; } // namespace mbgl diff --git a/include/mbgl/util/immutable.hpp b/include/mbgl/util/immutable.hpp index 0543d61d8bd5..6a2092723094 100644 --- a/include/mbgl/util/immutable.hpp +++ b/include/mbgl/util/immutable.hpp @@ -84,7 +84,7 @@ class Immutable { Immutable(const Immutable&) = default; template - Immutable& operator=(Mutable&& s) noexcept { + Immutable& operator=([[maybe_unused]] Mutable&& s) noexcept { ptr = std::const_pointer_cast(std::move(s.ptr)); return *this; } diff --git a/include/mbgl/util/logging.hpp b/include/mbgl/util/logging.hpp index ab3e7a332ec1..9eb7e09a7a10 100644 --- a/include/mbgl/util/logging.hpp +++ b/include/mbgl/util/logging.hpp @@ -67,7 +67,7 @@ class Log { template static void Record(EventSeverity severity, Event event, Args&&... args) noexcept { if (!includes(severity, disabledEventSeverities) && !includes(event, disabledEvents) && - !includes({severity, event}, disabledEventPermutations)) { + !includes({.severity = severity, .event = event}, disabledEventPermutations)) { record(severity, event, ::std::forward(args)...); } } diff --git a/src/mbgl/gfx/color_mode.hpp b/src/mbgl/gfx/color_mode.hpp index 29f282568970..851af1f2aa3f 100644 --- a/src/mbgl/gfx/color_mode.hpp +++ b/src/mbgl/gfx/color_mode.hpp @@ -48,16 +48,24 @@ class ColorMode { Mask mask; - static ColorMode disabled() { return {Replace{}, {}, {false, false, false, false}}; } + static ColorMode disabled() { + return {.blendFunction = Replace{}, .blendColor = {}, .mask = {.r = false, .g = false, .b = false, .a = false}}; + } - static ColorMode unblended() { return {Replace{}, {}, {true, true, true, true}}; } + static ColorMode unblended() { + return {.blendFunction = Replace{}, .blendColor = {}, .mask = {.r = true, .g = true, .b = true, .a = true}}; + } static ColorMode alphaBlended() { - return {Add{ColorBlendFactorType::One, ColorBlendFactorType::OneMinusSrcAlpha}, {}, {true, true, true, true}}; + return {.blendFunction = Add{ColorBlendFactorType::One, ColorBlendFactorType::OneMinusSrcAlpha}, + .blendColor = {}, + .mask = {.r = true, .g = true, .b = true, .a = true}}; } static ColorMode additive() { - return {Add{ColorBlendFactorType::One, ColorBlendFactorType::One}, {}, {true, true, true, true}}; + return {.blendFunction = Add{ColorBlendFactorType::One, ColorBlendFactorType::One}, + .blendColor = {}, + .mask = {.r = true, .g = true, .b = true, .a = true}}; } std::size_t hash() const { diff --git a/src/mbgl/gfx/command_encoder.hpp b/src/mbgl/gfx/command_encoder.hpp index c632e484314b..e6018907b45d 100644 --- a/src/mbgl/gfx/command_encoder.hpp +++ b/src/mbgl/gfx/command_encoder.hpp @@ -27,6 +27,7 @@ class CommandEncoder { CommandEncoder& operator=(const CommandEncoder&) = delete; DebugGroup createDebugGroup(const char* name) { return {*this, name}; } + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) DebugGroup createDebugGroup(std::string_view name) { return createDebugGroup(name.data()); } virtual std::unique_ptr createUploadPass(const char* name, Renderable&) = 0; diff --git a/src/mbgl/gfx/cull_face_mode.hpp b/src/mbgl/gfx/cull_face_mode.hpp index f71a66225d3e..214289cdea5b 100644 --- a/src/mbgl/gfx/cull_face_mode.hpp +++ b/src/mbgl/gfx/cull_face_mode.hpp @@ -11,9 +11,13 @@ class CullFaceMode { CullFaceSideType side; CullFaceWindingType winding; - static CullFaceMode disabled() { return {false, CullFaceSideType::Back, CullFaceWindingType::CounterClockwise}; } + static CullFaceMode disabled() { + return {.enabled = false, .side = CullFaceSideType::Back, .winding = CullFaceWindingType::CounterClockwise}; + } - static CullFaceMode backCCW() { return {true, CullFaceSideType::Back, CullFaceWindingType::CounterClockwise}; } + static CullFaceMode backCCW() { + return {.enabled = true, .side = CullFaceSideType::Back, .winding = CullFaceWindingType::CounterClockwise}; + } }; } // namespace gfx diff --git a/src/mbgl/gfx/depth_mode.hpp b/src/mbgl/gfx/depth_mode.hpp index d1ece4e06cd0..95723f0605da 100644 --- a/src/mbgl/gfx/depth_mode.hpp +++ b/src/mbgl/gfx/depth_mode.hpp @@ -17,7 +17,9 @@ class DepthMode { #if MLN_RENDER_BACKEND_OPENGL static DepthMode disabled() { return DepthMode{DepthFunctionType::Always, DepthMaskType::ReadOnly, {0.0, 1.0}}; } #else - static DepthMode disabled() { return DepthMode{DepthFunctionType::Always, DepthMaskType::ReadOnly}; } + static DepthMode disabled() { + return DepthMode{.func = DepthFunctionType::Always, .mask = DepthMaskType::ReadOnly}; + } #endif }; diff --git a/src/mbgl/gfx/drawable_atlases_tweaker.cpp b/src/mbgl/gfx/drawable_atlases_tweaker.cpp index 1c03101b3555..96c9b7385595 100644 --- a/src/mbgl/gfx/drawable_atlases_tweaker.cpp +++ b/src/mbgl/gfx/drawable_atlases_tweaker.cpp @@ -12,12 +12,13 @@ void DrawableAtlasesTweaker::setupTextures(gfx::Drawable& drawable, const bool l if (const auto& shader = drawable.getShader()) { if (glyphTextureId) { if (atlases) { - atlases->glyph->setSamplerConfiguration( - {TextureFilterType::Linear, TextureWrapType::Clamp, TextureWrapType::Clamp}); + atlases->glyph->setSamplerConfiguration({.filter = TextureFilterType::Linear, + .wrapU = TextureWrapType::Clamp, + .wrapV = TextureWrapType::Clamp}); atlases->icon->setSamplerConfiguration( - {linearFilterForIcons ? TextureFilterType::Linear : TextureFilterType::Nearest, - TextureWrapType::Clamp, - TextureWrapType::Clamp}); + {.filter = linearFilterForIcons ? TextureFilterType::Linear : TextureFilterType::Nearest, + .wrapU = TextureWrapType::Clamp, + .wrapV = TextureWrapType::Clamp}); } if (iconTextureId && shader->getSamplerLocation(*iconTextureId)) { assert(*glyphTextureId != *iconTextureId); diff --git a/src/mbgl/gfx/drawable_builder_impl.cpp b/src/mbgl/gfx/drawable_builder_impl.cpp index 523b00b82158..781a0a8576f1 100644 --- a/src/mbgl/gfx/drawable_builder_impl.cpp +++ b/src/mbgl/gfx/drawable_builder_impl.cpp @@ -27,25 +27,25 @@ DrawableBuilder::Impl::LineLayoutVertex DrawableBuilder::Impl::layoutVertex( */ static const int8_t extrudeScale = 63; return LineLayoutVertex{ - {{static_cast((p.x * 2) | (round ? 1 : 0)), static_cast((p.y * 2) | (up ? 1 : 0))}}, - {{// add 128 to store a byte in an unsigned byte - static_cast(::round(extrudeScale * e.x) + 128), - static_cast(::round(extrudeScale * e.y) + 128), - - // Encode the -1/0/1 direction value into the first two bits of .z - // of a_data. Combine it with the lower 6 bits of `linesofar` - // (shifted by 2 bites to make room for the direction value). The - // upper 8 bits of `linesofar` are placed in the `w` component. - // `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that we - // can store longer distances while sacrificing precision. - - // Encode the -1/0/1 direction value into .zw coordinates of - // a_data, which is normally covered by linesofar, so we need to - // merge them. The z component's first bit, as well as the sign - // bit is reserved for the direction, so we need to shift the - // linesofar. - static_cast(((dir == 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2)), - static_cast(linesofar >> 6)}}}; + .a1 = {{static_cast((p.x * 2) | (round ? 1 : 0)), static_cast((p.y * 2) | (up ? 1 : 0))}}, + .a2 = {{// add 128 to store a byte in an unsigned byte + static_cast(::round(extrudeScale * e.x) + 128), + static_cast(::round(extrudeScale * e.y) + 128), + + // Encode the -1/0/1 direction value into the first two bits of .z + // of a_data. Combine it with the lower 6 bits of `linesofar` + // (shifted by 2 bites to make room for the direction value). The + // upper 8 bits of `linesofar` are placed in the `w` component. + // `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that we + // can store longer distances while sacrificing precision. + + // Encode the -1/0/1 direction value into .zw coordinates of + // a_data, which is normally covered by linesofar, so we need to + // merge them. The z component's first bit, as well as the sign + // bit is reserved for the direction, so we need to shift the + // linesofar. + static_cast(((dir == 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2)), + static_cast(linesofar >> 6)}}}; } void DrawableBuilder::Impl::addPolyline(gfx::DrawableBuilder& builder, @@ -169,20 +169,20 @@ void DrawableBuilder::Impl::setupForWideVectors(gfx::Context& context, gfx::Draw // vertices if (!wideVectorVertices) { constexpr shaders::VertexTriWideVecB kWideVectorVertices[]{ - {{0}, {0}, (0 << 16) + 0}, - {{0}, {0}, (1 << 16) + 0}, - {{0}, {0}, (2 << 16) + 0}, - {{0}, {0}, (3 << 16) + 0}, - - {{0}, {0}, (4 << 16) + 1}, - {{0}, {0}, (5 << 16) + 1}, - {{0}, {0}, (6 << 16) + 1}, - {{0}, {0}, (7 << 16) + 1}, - - {{0}, {0}, (8 << 16) + 2}, - {{0}, {0}, (9 << 16) + 2}, - {{0}, {0}, (10 << 16) + 2}, - {{0}, {0}, (11 << 16) + 2}, + {.screenPos = {0}, .color = {0}, .index = (0 << 16) + 0}, + {.screenPos = {0}, .color = {0}, .index = (1 << 16) + 0}, + {.screenPos = {0}, .color = {0}, .index = (2 << 16) + 0}, + {.screenPos = {0}, .color = {0}, .index = (3 << 16) + 0}, + + {.screenPos = {0}, .color = {0}, .index = (4 << 16) + 1}, + {.screenPos = {0}, .color = {0}, .index = (5 << 16) + 1}, + {.screenPos = {0}, .color = {0}, .index = (6 << 16) + 1}, + {.screenPos = {0}, .color = {0}, .index = (7 << 16) + 1}, + + {.screenPos = {0}, .color = {0}, .index = (8 << 16) + 2}, + {.screenPos = {0}, .color = {0}, .index = (9 << 16) + 2}, + {.screenPos = {0}, .color = {0}, .index = (10 << 16) + 2}, + {.screenPos = {0}, .color = {0}, .index = (11 << 16) + 2}, }; wideVectorVertices = std::make_shared>(); for (auto& v : kWideVectorVertices) { diff --git a/src/mbgl/gfx/gpu_expression.cpp b/src/mbgl/gfx/gpu_expression.cpp index ae64a8da2cd3..b43afc1e4335 100644 --- a/src/mbgl/gfx/gpu_expression.cpp +++ b/src/mbgl/gfx/gpu_expression.cpp @@ -6,6 +6,8 @@ #include #include +#include + namespace mbgl { namespace gfx { @@ -53,7 +55,7 @@ auto addStop(UniqueGPUExpression& expr, GPUOutputType outType, std::size_t& inde assert(value.is()); if (value.is()) { const auto& color = attributeValue(value.get()); - std::copy(color.begin(), color.end(), &expr->stops.colors[2 * index++]); + std::ranges::copy(color, &expr->stops.colors[2 * index++]); } else { // Evaluation error, cancel expr.reset(); diff --git a/src/mbgl/gfx/stencil_mode.hpp b/src/mbgl/gfx/stencil_mode.hpp index 92d2265e8dc9..599f5e8808c6 100644 --- a/src/mbgl/gfx/stencil_mode.hpp +++ b/src/mbgl/gfx/stencil_mode.hpp @@ -40,7 +40,12 @@ class StencilMode { StencilOpType pass; static StencilMode disabled() { - return StencilMode{Always(), 0, 0, StencilOpType::Keep, StencilOpType::Keep, StencilOpType::Keep}; + return StencilMode{.test = Always(), + .ref = 0, + .mask = 0, + .fail = StencilOpType::Keep, + .depthFail = StencilOpType::Keep, + .pass = StencilOpType::Keep}; } }; diff --git a/src/mbgl/gfx/upload_pass.hpp b/src/mbgl/gfx/upload_pass.hpp index f70b432fed8b..f59fbc956d57 100644 --- a/src/mbgl/gfx/upload_pass.hpp +++ b/src/mbgl/gfx/upload_pass.hpp @@ -44,6 +44,7 @@ class UploadPass { UploadPass& operator=(const UploadPass&) = delete; DebugGroup createDebugGroup(const char* name) { return {*this, name}; } + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) DebugGroup createDebugGroup(std::string_view name) { return createDebugGroup(name.data()); } #if MLN_DRAWABLE_RENDERER diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index df156505304d..af28c1b920bb 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -69,6 +69,7 @@ struct PatternFeatureInserter { const auto& sortKeyProperty = properties.template get(); float sortKey = sortKeyProperty.evaluate(*feature, zoom, canonical, SortKeyPropertyType::defaultValue()); PatternFeature patternFeature{index, std::move(feature), std::move(patternDependencyMap), sortKey}; + // NOLINTNEXTLINE(modernize-use-ranges) C++26 const auto lowerBound = std::lower_bound(features.cbegin(), features.cend(), patternFeature); features.insert(lowerBound, std::move(patternFeature)); } @@ -99,7 +100,8 @@ class PatternLayout : public Layout { const std::string& layerId = layerProperties->baseImpl->id; const auto& evaluated = style::getEvaluated(layerProperties); const auto& patternProperty = evaluated.template get(); - const auto constantPattern = patternProperty.constantOr(Faded{"", ""}); + const auto constantPattern = patternProperty.constantOr( + Faded{.from = "", .to = ""}); // determine if layer group has any layers that use *-pattern // property and add constant pattern dependencies. if (!patternProperty.isConstant()) { diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 6ece031e9102..4aadbbc1bf92 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -131,7 +131,11 @@ class ConstantSymbolSizeBinder final : public SymbolSizeBinder { } const float unused = 0.0f; - return {isZoomConstant, true, unused, size, layoutSize}; + return {.isZoomConstant = isZoomConstant, + .isFeatureConstant = true, + .sizeT = unused, + .size = size, + .layoutSize = layoutSize}; } float layoutSize; @@ -154,7 +158,8 @@ class SourceFunctionSymbolSizeBinder final : public SymbolSizeBinder { ZoomEvaluatedSize evaluateForZoom(float) const noexcept override { const float unused = 0.0f; - return {true, false, unused, unused, unused}; + return { + .isZoomConstant = true, .isFeatureConstant = false, .sizeT = unused, .size = unused, .layoutSize = unused}; } style::PropertyExpression expression; @@ -181,7 +186,11 @@ class CompositeFunctionSymbolSizeBinder final : public SymbolSizeBinder { expression.interpolationFactor(coveringZoomStops, currentZoom), 0.0f, 1.0f); const float unused = 0.0f; - return {false, false, sizeInterpolationT, unused, unused}; + return {.isZoomConstant = false, + .isFeatureConstant = false, + .sizeT = sizeInterpolationT, + .size = unused, + .layoutSize = unused}; } style::PropertyExpression expression; @@ -261,6 +270,7 @@ class SymbolProgram : public SymbolProgramBase { std::unique_ptr> program; + // NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility) SymbolProgram([[maybe_unused]] const ProgramParameters& programParameters) { switch (gfx::Backend::GetType()) { #if MLN_RENDER_BACKEND_OPENGL @@ -441,6 +451,7 @@ using SymbolSDFProgramUniforms = TypeList; template +// NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility) class SymbolSDFProgram : public SymbolProgram(imagePosA->tl()), - /* .pattern_br_a = */ util::cast(imagePosA->br()), - /* .pattern_tl_b = */ util::cast(imagePosB->tl()), - /* .pattern_br_b = */ util::cast(imagePosB->br()), - /* .pattern_size_a = */ imagePosA->displaySize(), - /* .pattern_size_b = */ imagePosB->displaySize(), - /* .scale_a = */ crossfade.fromScale, - /* .scale_b = */ crossfade.toScale, - /* .mix = */ crossfade.t, - /* .opacity = */ evaluated.get()}; + const BackgroundPatternPropsUBO propsUBO = {.pattern_tl_a = util::cast(imagePosA->tl()), + .pattern_br_a = util::cast(imagePosA->br()), + .pattern_tl_b = util::cast(imagePosB->tl()), + .pattern_br_b = util::cast(imagePosB->br()), + .pattern_size_a = imagePosA->displaySize(), + .pattern_size_b = imagePosB->displaySize(), + .scale_a = crossfade.fromScale, + .scale_b = crossfade.toScale, + .mix = crossfade.t, + .opacity = evaluated.get()}; layerUniforms.createOrUpdate(idBackgroundPropsUBO, &propsUBO, context); } else { - const BackgroundPropsUBO propsUBO = {/* .color = */ evaluated.get(), - /* .opacity = */ evaluated.get(), - /* .pad1 = */ 0, - /* .pad2 = */ 0, - /* .pad3 = */ 0}; + const BackgroundPropsUBO propsUBO = {.color = evaluated.get(), + .opacity = evaluated.get(), + .pad1 = 0, + .pad2 = 0, + .pad3 = 0}; layerUniforms.createOrUpdate(idBackgroundPropsUBO, &propsUBO, context); } @@ -98,8 +98,9 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara if (hasPattern) { if (const auto& tex = parameters.patternAtlas.texture()) { - tex->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + tex->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); drawable.setTexture(tex, idBackgroundImageTexture); } @@ -115,13 +116,13 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara #else const BackgroundPatternDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /* .pixel_coord_lower = */ {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /* .tile_units_to_pixels = */ (pixToTile != 0) ? 1.0f / pixToTile : 0.0f, - /* .pad1 = */ 0, - /* .pad2 = */ 0, - /* .pad3 = */ 0 + .matrix = util::cast(matrix), + .pixel_coord_upper = {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + .pixel_coord_lower = {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + .tile_units_to_pixels = (pixToTile != 0) ? 1.0f / pixToTile : 0.0f, + .pad1 = 0, + .pad2 = 0, + .pad3 = 0 }; #if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idBackgroundDrawableUBO, &drawableUBO, context); @@ -133,7 +134,7 @@ void BackgroundLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintPara #else const BackgroundDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix) + util::cast(matrix) }; #if !MLN_UBO_CONSOLIDATION drawableUniforms.createOrUpdate(idBackgroundDrawableUBO, &drawableUBO, context); diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp index e8c674392aaa..80d94fdf047e 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp @@ -42,16 +42,16 @@ void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete // Updated only with evaluated properties if (!evaluatedPropsUniformBuffer || propertiesUpdated) { const CircleEvaluatedPropsUBO evaluatedPropsUBO = { - /* .color = */ constOrDefault(evaluated), - /* .stroke_color = */ constOrDefault(evaluated), - /* .radius = */ constOrDefault(evaluated), - /* .blur = */ constOrDefault(evaluated), - /* .opacity = */ constOrDefault(evaluated), - /* .stroke_width = */ constOrDefault(evaluated), - /* .stroke_opacity = */ constOrDefault(evaluated), - /* .scale_with_map = */ scaleWithMap, - /* .pitch_with_map = */ pitchWithMap, - /* .pad1 = */ 0}; + .color = constOrDefault(evaluated), + .stroke_color = constOrDefault(evaluated), + .radius = constOrDefault(evaluated), + .blur = constOrDefault(evaluated), + .opacity = constOrDefault(evaluated), + .stroke_width = constOrDefault(evaluated), + .stroke_opacity = constOrDefault(evaluated), + .scale_with_map = scaleWithMap, + .pitch_with_map = pitchWithMap, + .pad1 = 0}; context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &evaluatedPropsUBO); propertiesUpdated = false; } @@ -93,19 +93,19 @@ void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete const CircleDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .extrude_scale = */ extrudeScale, - - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .radius_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .stroke_opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0, - /* .pad2 = */ 0, - /* .pad3 = */ 0 + .matrix = util::cast(matrix), + .extrude_scale = extrudeScale, + + .color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .radius_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .blur_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .stroke_color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .stroke_width_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .stroke_opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0, + .pad2 = 0, + .pad3 = 0 }; #if MLN_UBO_CONSOLIDATION drawable.setUBOIndex(i++); diff --git a/src/mbgl/renderer/layers/collision_layer_tweaker.cpp b/src/mbgl/renderer/layers/collision_layer_tweaker.cpp index 76f653d1e703..c853ce801dea 100644 --- a/src/mbgl/renderer/layers/collision_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/collision_layer_tweaker.cpp @@ -61,9 +61,9 @@ void CollisionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam const CollisionDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix)}; const CollisionTilePropsUBO tilePropsUBO = { - /* .extrude_scale = */ extrudeScale, - /* .overscale_factor = */ static_cast(drawable.getTileID()->overscaleFactor()), - /* .pad1 = */ 0}; + .extrude_scale = extrudeScale, + .overscale_factor = static_cast(drawable.getTileID()->overscaleFactor()), + .pad1 = 0}; auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idCollisionDrawableUBO, &drawableUBO, context); diff --git a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp index becf5863dcf5..d474e0c3a222 100644 --- a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp @@ -42,26 +42,26 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP // UBO depends on more than just evaluated properties, so we need to update every time, // but the resulting buffer can be shared across all the drawables from the layer. const FillExtrusionPropsUBO propsUBO = { - /* .color = */ constOrDefault(evaluated), - /* .light_color = */ FillExtrusionProgram::lightColor(parameters.evaluatedLight), - /* .pad1 = */ 0, - /* .light_position = */ FillExtrusionProgram::lightPosition(parameters.evaluatedLight, state), - /* .base = */ constOrDefault(evaluated), - /* .height = */ constOrDefault(evaluated), - /* .light_intensity = */ FillExtrusionProgram::lightIntensity(parameters.evaluatedLight), - /* .vertical_gradient = */ evaluated.get() ? 1.0f : 0.0f, - /* .opacity = */ evaluated.get(), - /* .fade = */ crossfade.t, - /* .from_scale = */ crossfade.fromScale, - /* .to_scale = */ crossfade.toScale, - /* .pad2 = */ 0}; + .color = constOrDefault(evaluated), + .light_color = FillExtrusionProgram::lightColor(parameters.evaluatedLight), + .pad1 = 0, + .light_position = FillExtrusionProgram::lightPosition(parameters.evaluatedLight, state), + .base = constOrDefault(evaluated), + .height = constOrDefault(evaluated), + .light_intensity = FillExtrusionProgram::lightIntensity(parameters.evaluatedLight), + .vertical_gradient = evaluated.get() ? 1.0f : 0.0f, + .opacity = evaluated.get(), + .fade = crossfade.t, + .from_scale = crossfade.fromScale, + .to_scale = crossfade.toScale, + .pad2 = 0}; auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.createOrUpdate(idFillExtrusionPropsUBO, &propsUBO, context); propertiesUpdated = false; const auto zoom = static_cast(parameters.state.getZoom()); - const auto defPattern = mbgl::Faded{"", ""}; + const auto defPattern = mbgl::Faded{.from = "", .to = ""}; const auto fillPatternValue = evaluated.get().constantOr(defPattern); #if MLN_UBO_CONSOLIDATION @@ -117,18 +117,18 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP #else const FillExtrusionDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /* .pixel_coord_lower = */ {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /* .height_factor = */ heightFactor, - /* .tile_ratio = */ tileRatio, - - /* .base_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .height_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0 + .matrix = util::cast(matrix), + .pixel_coord_upper = {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + .pixel_coord_lower = {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + .height_factor = heightFactor, + .tile_ratio = tileRatio, + + .base_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .height_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_from_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_to_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0 }; #if MLN_UBO_CONSOLIDATION @@ -136,11 +136,11 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP #else const FillExtrusionTilePropsUBO tilePropsUBO = { #endif - /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, - /* .pattern_to = */ patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, - /* .texsize = */ {static_cast(textureSize.width), static_cast(textureSize.height)}, - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .pattern_from = patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, + .pattern_to = patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + .texsize = {static_cast(textureSize.width), static_cast(textureSize.height)}, + .pad1 = 0, + .pad2 = 0 }; #if MLN_UBO_CONSOLIDATION diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp index 398c9dc87acb..83979102c049 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp @@ -39,12 +39,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters if (!evaluatedPropsUniformBuffer || propertiesUpdated) { const FillEvaluatedPropsUBO propsUBO = { - /* .color = */ evaluated.get().constantOr(FillColor::defaultValue()), - /* .outline_color = */ evaluated.get().constantOr(FillOutlineColor::defaultValue()), - /* .opacity = */ evaluated.get().constantOr(FillOpacity::defaultValue()), - /* .fade = */ crossfade.t, - /* .from_scale = */ crossfade.fromScale, - /* .to_scale = */ crossfade.toScale, + .color = evaluated.get().constantOr(FillColor::defaultValue()), + .outline_color = evaluated.get().constantOr(FillOutlineColor::defaultValue()), + .opacity = evaluated.get().constantOr(FillOpacity::defaultValue()), + .fade = crossfade.t, + .from_scale = crossfade.fromScale, + .to_scale = crossfade.toScale, }; context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &propsUBO); propertiesUpdated = false; @@ -77,7 +77,8 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters return; } - const auto& fillPatternValue = evaluated.get().constantOr(Faded{"", ""}); + const auto& fillPatternValue = evaluated.get().constantOr( + Faded{.from = "", .to = ""}); const auto patternPosA = tile->getPattern(fillPatternValue.from.id()); const auto patternPosB = tile->getPattern(fillPatternValue.to.id()); binders->setPatternParameters(patternPosA, patternPosB, crossfade); @@ -111,12 +112,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), + .matrix = util::cast(matrix), - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0, + .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -130,12 +131,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillOutlineDrawableUBO drawableUBO = { #endif - /* .matrix=*/util::cast(matrix), + .matrix = util::cast(matrix), - /* .outline_color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .outline_color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0, + .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -149,15 +150,15 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillPatternDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /* .pixel_coord_lower = */ - {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /* .tile_ratio = */ tileRatio, - - /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)) + .matrix = util::cast(matrix), + .pixel_coord_upper = {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + + .pixel_coord_lower = {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + .tile_ratio = tileRatio, + + .pattern_from_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_to_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)) }; #if MLN_UBO_CONSOLIDATION @@ -165,14 +166,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillPatternTilePropsUBO tilePropsUBO = { #endif - /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) - : std::array{0}, - /* .pattern_to = */ - patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, - /* .texsize = */ - {static_cast(textureSize.width), static_cast(textureSize.height)}, - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .pattern_from = patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, + + .pattern_to = patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + + .texsize = {static_cast(textureSize.width), static_cast(textureSize.height)}, + .pad1 = 0, .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -187,15 +186,15 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillOutlinePatternDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .pixel_coord_upper = */ {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, - /* .pixel_coord_lower = */ - {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, - /* .tile_ratio = */ tileRatio, - - /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_to_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)) + .matrix = util::cast(matrix), + .pixel_coord_upper = {static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, + + .pixel_coord_lower = {static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, + .tile_ratio = tileRatio, + + .pattern_from_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_to_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)) }; #if MLN_UBO_CONSOLIDATION @@ -203,14 +202,12 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillOutlinePatternTilePropsUBO tilePropsUBO = { #endif - /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) - : std::array{0}, - /* .pattern_to = */ - patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, - /* .texsize = */ - {static_cast(textureSize.width), static_cast(textureSize.height)}, - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .pattern_from = patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, + + .pattern_to = patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + + .texsize = {static_cast(textureSize.width), static_cast(textureSize.height)}, + .pad1 = 0, .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -225,11 +222,11 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const FillOutlineTriangulatedDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, parameters.state.getZoom()), - /* .pad1 = */ 0, - /* .pad2 = */ 0, - /* .pad3 = */ 0 + .matrix = util::cast(matrix), + .ratio = 1.0f / tileID.pixelsToTileUnits(1.0f, parameters.state.getZoom()), + .pad1 = 0, + .pad2 = 0, + .pad3 = 0 }; #if !MLN_UBO_CONSOLIDATION diff --git a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp index 9172150e8059..ed22ad2f6331 100644 --- a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp @@ -36,10 +36,10 @@ void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamet if (!evaluatedPropsUniformBuffer || propertiesUpdated) { const HeatmapEvaluatedPropsUBO evaluatedPropsUBO = { - /* .weight = */ evaluated.get().constantOr(HeatmapWeight::defaultValue()), - /* .radius = */ evaluated.get().constantOr(HeatmapRadius::defaultValue()), - /* .intensity = */ evaluated.get(), - /* .padding = */ 0}; + .weight = evaluated.get().constantOr(HeatmapWeight::defaultValue()), + .radius = evaluated.get().constantOr(HeatmapRadius::defaultValue()), + .intensity = evaluated.get(), + .padding = 0}; parameters.context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &evaluatedPropsUBO); propertiesUpdated = false; } @@ -75,12 +75,12 @@ void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamet #else const HeatmapDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .extrude_scale = */ tileID.pixelsToTileUnits(1.0f, zoom), + .matrix = util::cast(matrix), + .extrude_scale = tileID.pixelsToTileUnits(1.0f, zoom), - /* .weight_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .radius_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0 + .weight_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .radius_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0 }; #if MLN_UBO_CONSOLIDATION drawable.setUBOIndex(i++); diff --git a/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp b/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp index 889ecfabed3a..fc67f43804a2 100644 --- a/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp @@ -33,11 +33,11 @@ void HeatmapTextureLayerTweaker::execute(LayerGroupBase& layerGroup, const Paint const auto& size = parameters.staticData.backendSize; matrix::ortho(matrix, 0, size.width, size.height, 0, -1, 1); - const HeatmapTexturePropsUBO propsUBO = {/* .matrix = */ util::cast(matrix), - /* .opacity = */ evaluated.get(), - /* .pad1 = */ 0, - /* .pad2 = */ 0, - /* .pad3 = */ 0}; + const HeatmapTexturePropsUBO propsUBO = {.matrix = util::cast(matrix), + .opacity = evaluated.get(), + .pad1 = 0, + .pad2 = 0, + .pad3 = 0}; auto& layerUniforms = layerGroup.mutableUniformBuffers(); layerUniforms.createOrUpdate(idHeatmapTexturePropsUBO, &propsUBO, parameters.context); } diff --git a/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp b/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp index d7c6d2b2334e..4382452b1000 100644 --- a/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp @@ -44,10 +44,9 @@ void HillshadeLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam #endif if (!evaluatedPropsUniformBuffer || propertiesUpdated) { - const HillshadeEvaluatedPropsUBO evaluatedPropsUBO = { - /* .highlight = */ evaluated.get(), - /* .shadow = */ evaluated.get(), - /* .accent = */ evaluated.get()}; + const HillshadeEvaluatedPropsUBO evaluatedPropsUBO = {.highlight = evaluated.get(), + .shadow = evaluated.get(), + .accent = evaluated.get()}; parameters.context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &evaluatedPropsUBO); propertiesUpdated = false; } @@ -83,8 +82,8 @@ void HillshadeLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParam #else const HillshadeTilePropsUBO tilePropsUBO = { #endif - /* .latrange = */ getLatRange(tileID), - /* .light = */ getLight(parameters, evaluated) + .latrange = getLatRange(tileID), + .light = getLight(parameters, evaluated) }; #if MLN_UBO_CONSOLIDATION diff --git a/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp b/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp index 3a9e337d140b..24fa2452b1d7 100644 --- a/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp @@ -52,10 +52,10 @@ void HillshadePrepareLayerTweaker::execute(LayerGroupBase& layerGroup, const Pai const HillshadePrepareDrawableUBO drawableUBO = {/* .matrix = */ util::cast(matrix)}; const HillshadePrepareTilePropsUBO tilePropsUBO = { - /* .unpack = */ getUnpackVector(drawableData.encoding), - /* .dimension = */ {static_cast(drawableData.stride), static_cast(drawableData.stride)}, - /* .zoom = */ static_cast(tileID.canonical.z), - /* .maxzoom = */ static_cast(drawableData.maxzoom)}; + .unpack = getUnpackVector(drawableData.encoding), + .dimension = {static_cast(drawableData.stride), static_cast(drawableData.stride)}, + .zoom = static_cast(tileID.canonical.z), + .maxzoom = static_cast(drawableData.maxzoom)}; auto& drawableUniforms = drawable.mutableUniformBuffers(); drawableUniforms.createOrUpdate(idHillshadePrepareDrawableUBO, &drawableUBO, parameters.context); diff --git a/src/mbgl/renderer/layers/line_layer_tweaker.cpp b/src/mbgl/renderer/layers/line_layer_tweaker.cpp index 93591f92d4ac..8b1fa69c6b11 100644 --- a/src/mbgl/renderer/layers/line_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/line_layer_tweaker.cpp @@ -74,7 +74,8 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const auto& evaluated = static_cast(*evaluatedProperties).evaluated; const auto& crossfade = static_cast(*evaluatedProperties).crossfade; - const auto& linePatternValue = evaluated.get().constantOr(Faded{"", ""}); + const auto& linePatternValue = evaluated.get().constantOr( + Faded{.from = "", .to = ""}); const auto zoom = static_cast(parameters.state.getZoom()); const auto intZoom = parameters.state.getIntegerZoom(); @@ -84,13 +85,13 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const bool enableEval = gfx::Backend::getEnableGPUExpressionEval(); if (!expressionUniformBuffer || (gpuExpressionsUpdated && enableEval)) { LineExpressionUBO exprUBO = { - /* color = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* blur = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* opacity = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* gapwidth = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* offset = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* width = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, - /* floorWidth = */ enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .color = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .blur = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .opacity = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .gapwidth = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .offset = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .width = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, + .floorWidth = enableEval ? gpuExpressions[propertyIndex()].get() : nullptr, }; context.emplaceOrUpdateUniformBuffer(expressionUniformBuffer, &exprUBO); gpuExpressionsUpdated = false; @@ -116,26 +117,28 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters (gpuExpressions[propertyIndex()] ? LineExpressionMask::FloorWidth : LineExpressionMask::None)); const LineEvaluatedPropsUBO propsUBO{ - /*color =*/(expressionMask & LineExpressionMask::Color) ? LineColor::defaultValue() - : evaluate(parameters), - /*blur =*/ - (expressionMask & LineExpressionMask::Blur) ? LineBlur::defaultValue() : evaluate(parameters), - /*opacity =*/ - (expressionMask & LineExpressionMask::Opacity) ? LineOpacity::defaultValue() - : evaluate(parameters), - /*gapwidth =*/ - (expressionMask & LineExpressionMask::GapWidth) ? LineGapWidth::defaultValue() - : evaluate(parameters), - /*offset =*/ - (expressionMask & LineExpressionMask::Offset) ? LineOffset::defaultValue() - : evaluate(parameters), - /*width =*/ - (expressionMask & LineExpressionMask::Width) ? LineWidth::defaultValue() : evaluate(parameters), - /*floorwidth =*/ - (expressionMask & LineExpressionMask::FloorWidth) ? LineFloorWidth::defaultValue() - : evaluate(parameters), - expressionMask, - 0}; + .color = (expressionMask & LineExpressionMask::Color) ? LineColor::defaultValue() + : evaluate(parameters), + + .blur = (expressionMask & LineExpressionMask::Blur) ? LineBlur::defaultValue() + : evaluate(parameters), + + .opacity = (expressionMask & LineExpressionMask::Opacity) ? LineOpacity::defaultValue() + : evaluate(parameters), + + .gapwidth = (expressionMask & LineExpressionMask::GapWidth) ? LineGapWidth::defaultValue() + : evaluate(parameters), + + .offset = (expressionMask & LineExpressionMask::Offset) ? LineOffset::defaultValue() + : evaluate(parameters), + + .width = (expressionMask & LineExpressionMask::Width) ? LineWidth::defaultValue() + : evaluate(parameters), + + .floorwidth = (expressionMask & LineExpressionMask::FloorWidth) ? LineFloorWidth::defaultValue() + : evaluate(parameters), + .expressionMask = expressionMask, + .pad1 = 0}; #else const LineEvaluatedPropsUBO propsUBO{/*color =*/evaluate(parameters), /*blur =*/evaluate(parameters), @@ -201,16 +204,16 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LineDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0 + .matrix = util::cast(matrix), + .ratio = 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + .color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .blur_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .gapwidth_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .offset_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .width_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -225,16 +228,16 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LineGradientDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - - /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .matrix = util::cast(matrix), + .ratio = 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + .blur_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .gapwidth_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .offset_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .width_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0, + .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -252,16 +255,16 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LinePatternDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), - - /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_from_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pattern_to_t = */ std::get<1>(binders->get()->interpolationFactor(zoom)) + .matrix = util::cast(matrix), + .ratio = 1.0f / tileID.pixelsToTileUnits(1.0f, static_cast(zoom)), + + .blur_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .gapwidth_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .offset_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .width_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_from_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pattern_to_t = std::get<1>(binders->get()->interpolationFactor(zoom)) }; #if MLN_UBO_CONSOLIDATION @@ -269,19 +272,17 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LinePatternTilePropsUBO tilePropsUBO = { #endif - /* .pattern_from = */ patternPosA ? util::cast(patternPosA->tlbr()) - : std::array{0}, - /* .pattern_to = */ - patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, - /* .scale = */ - {parameters.pixelRatio, - 1 / tileID.pixelsToTileUnits(1, intZoom), - crossfade.fromScale, - crossfade.toScale}, - /* .texsize = */ - {static_cast(textureSize.width), static_cast(textureSize.height)}, - /* .fade = */ crossfade.t, - /* .pad1 = */ 0 + .pattern_from = patternPosA ? util::cast(patternPosA->tlbr()) : std::array{0}, + + .pattern_to = patternPosB ? util::cast(patternPosB->tlbr()) : std::array{0}, + + .scale = {parameters.pixelRatio, + 1 / tileID.pixelsToTileUnits(1, intZoom), + crossfade.fromScale, + crossfade.toScale}, + + .texsize = {static_cast(textureSize.width), static_cast(textureSize.height)}, + .fade = crossfade.t, .pad1 = 0 }; #if !MLN_UBO_CONSOLIDATION @@ -317,22 +318,22 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LineSDFDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .patternscale_a = */ {1.0f / tileID.pixelsToTileUnits(widthA, intZoom), -posA.height / 2.0f}, - /* .patternscale_b = */ {1.0f / tileID.pixelsToTileUnits(widthB, intZoom), -posB.height / 2.0f}, - /* .tex_y_a = */ posA.y, - /* .tex_y_b = */ posB.y, - /* .ratio = */ 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), - - /* .color_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .blur_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .opacity_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .gapwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .offset_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .width_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .floorwidth_t = */ std::get<0>(binders->get()->interpolationFactor(zoom)), - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .matrix = util::cast(matrix), + .patternscale_a = {1.0f / tileID.pixelsToTileUnits(widthA, intZoom), -posA.height / 2.0f}, + .patternscale_b = {1.0f / tileID.pixelsToTileUnits(widthB, intZoom), -posB.height / 2.0f}, + .tex_y_a = posA.y, + .tex_y_b = posB.y, + .ratio = 1.0f / tileID.pixelsToTileUnits(1.0f, zoom), + + .color_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .blur_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .opacity_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .gapwidth_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .offset_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .width_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .floorwidth_t = std::get<0>(binders->get()->interpolationFactor(zoom)), + .pad1 = 0, + .pad2 = 0 }; #if MLN_UBO_CONSOLIDATION @@ -340,11 +341,9 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters #else const LineSDFTilePropsUBO tilePropsUBO = { #endif - /* .sdfgamma = */ static_cast(dashPatternTexture.getSize().width) / - (std::min(widthA, widthB) * 256.0f * parameters.pixelRatio) / 2.0f, - /* .mix = */ crossfade.t, - /* .pad1 = */ 0, - /* .pad2 = */ 0 + .sdfgamma = static_cast(dashPatternTexture.getSize().width) / + (std::min(widthA, widthB) * 256.0f * parameters.pixelRatio) / 2.0f, + .mix = crossfade.t, .pad1 = 0, .pad2 = 0 }; #if !MLN_UBO_CONSOLIDATION diff --git a/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp b/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp index 8d60a3a45174..cbd9f0913b48 100644 --- a/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp @@ -27,16 +27,15 @@ void LocationIndicatorLayerTweaker::execute(LayerGroupBase& layerGroup, const Pa switch (static_cast(drawable.getType())) { case RenderLocationIndicatorLayer::LocationIndicatorComponentType::Circle: { - LocationIndicatorDrawableUBO drawableUBO = {/* .matrix = */ util::cast(projectionCircle), - /* .color = */ props.evaluated.get()}; + LocationIndicatorDrawableUBO drawableUBO = {.matrix = util::cast(projectionCircle), + .color = props.evaluated.get()}; drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; } case RenderLocationIndicatorLayer::LocationIndicatorComponentType::CircleOutline: { - LocationIndicatorDrawableUBO drawableUBO = { - /* .matrix = */ util::cast(projectionCircle), - /* .color = */ props.evaluated.get()}; + LocationIndicatorDrawableUBO drawableUBO = {.matrix = util::cast(projectionCircle), + .color = props.evaluated.get()}; drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; } @@ -46,8 +45,8 @@ void LocationIndicatorLayerTweaker::execute(LayerGroupBase& layerGroup, const Pa case RenderLocationIndicatorLayer::LocationIndicatorComponentType::Puck: [[fallthrough]]; case RenderLocationIndicatorLayer::LocationIndicatorComponentType::PuckHat: { - const LocationIndicatorDrawableUBO drawableUBO = {/* .matrix = */ util::cast(projectionPuck), - /* .color = */ Color::black()}; + const LocationIndicatorDrawableUBO drawableUBO = {.matrix = util::cast(projectionPuck), + .color = Color::black()}; drawableUniforms.createOrUpdate(idLocationIndicatorDrawableUBO, &drawableUBO, params.context); break; } diff --git a/src/mbgl/renderer/layers/raster_layer_tweaker.cpp b/src/mbgl/renderer/layers/raster_layer_tweaker.cpp index 7a89414e1dba..d508c60bf869 100644 --- a/src/mbgl/renderer/layers/raster_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/raster_layer_tweaker.cpp @@ -51,18 +51,18 @@ void RasterLayerTweaker::execute([[maybe_unused]] LayerGroupBase& layerGroup, if (!evaluatedPropsUniformBuffer || propertiesUpdated) { const RasterEvaluatedPropsUBO propsUBO = { - /* .spin_weigths = */ spinWeights(evaluated.get()), - /* .tl_parent = */ {{0.0f, 0.0f}}, - /* .scale_parent = */ 1.0f, - /* .buffer_scale = */ 1.0f, - /* .fade_t = */ 1.0f, - /* .opacity = */ evaluated.get(), - /* .brightness_low = */ evaluated.get(), - /* .brightness_high = */ evaluated.get(), - /* .saturation_factor = */ saturationFactor(evaluated.get()), - /* .contrast_factor = */ contrastFactor(evaluated.get()), - /* .pad1 = */ 0, - /* .pad2 = */ 0}; + .spin_weights = spinWeights(evaluated.get()), + .tl_parent = {{0.0f, 0.0f}}, + .scale_parent = 1.0f, + .buffer_scale = 1.0f, + .fade_t = 1.0f, + .opacity = evaluated.get(), + .brightness_low = evaluated.get(), + .brightness_high = evaluated.get(), + .saturation_factor = saturationFactor(evaluated.get()), + .contrast_factor = contrastFactor(evaluated.get()), + .pad1 = 0, + .pad2 = 0}; parameters.context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &propsUBO); propertiesUpdated = false; } diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp index 9f737ded608f..2553b8241530 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp @@ -69,19 +69,19 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete const auto zoom = static_cast(state.getZoom()); if (!evaluatedPropsUniformBuffer || propertiesUpdated) { - const SymbolEvaluatedPropsUBO propsUBO = {/* .text_fill_color = */ constOrDefault(evaluated), - /* .text_halo_color = */ constOrDefault(evaluated), - /* .text_opacity = */ constOrDefault(evaluated), - /* .text_halo_width = */ constOrDefault(evaluated), - /* .text_halo_blur = */ constOrDefault(evaluated), - /* .pad1 */ 0, - - /* .icon_fill_color = */ constOrDefault(evaluated), - /* .icon_halo_color = */ constOrDefault(evaluated), - /* .icon_opacity = */ constOrDefault(evaluated), - /* .icon_halo_width = */ constOrDefault(evaluated), - /* .icon_halo_blur = */ constOrDefault(evaluated), - /* .pad2 */ 0}; + const SymbolEvaluatedPropsUBO propsUBO = {.text_fill_color = constOrDefault(evaluated), + .text_halo_color = constOrDefault(evaluated), + .text_opacity = constOrDefault(evaluated), + .text_halo_width = constOrDefault(evaluated), + .text_halo_blur = constOrDefault(evaluated), + .pad1 = 0, + + .icon_fill_color = constOrDefault(evaluated), + .icon_halo_color = constOrDefault(evaluated), + .icon_opacity = constOrDefault(evaluated), + .icon_halo_width = constOrDefault(evaluated), + .icon_halo_blur = constOrDefault(evaluated), + .pad2 = 0}; context.emplaceOrUpdateUniformBuffer(evaluatedPropsUniformBuffer, &propsUBO); propertiesUpdated = false; } @@ -157,27 +157,27 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete #else const SymbolDrawableUBO drawableUBO = { #endif - /* .matrix = */ util::cast(matrix), - /* .label_plane_matrix = */ util::cast(labelPlaneMatrix), - /* .coord_matrix = */ util::cast(glCoordMatrix), - - /* .texsize = */ toArray(getTexSize(drawable, idSymbolImageTexture)), - /* .texsize_icon = */ toArray(getTexSize(drawable, idSymbolImageIconTexture)), - - /* .is_text_prop = */ isText, - /* .rotate_symbol = */ rotateInShader, - /* .pitch_with_map = */ (symbolData.pitchAlignment == style::AlignmentType::Map), - /* .is_size_zoom_constant = */ size.isZoomConstant, - /* .is_size_feature_constant = */ size.isFeatureConstant, - - /* .size_t = */ size.sizeT, - /* .size = */ size.size, - - /* .fill_color_t = */ getInterpFactor(paintProperties, isText, zoom), - /* .halo_color_t = */ getInterpFactor(paintProperties, isText, zoom), - /* .opacity_t = */ getInterpFactor(paintProperties, isText, zoom), - /* .halo_width_t = */ getInterpFactor(paintProperties, isText, zoom), - /* .halo_blur_t = */ getInterpFactor(paintProperties, isText, zoom), + .matrix = util::cast(matrix), + .label_plane_matrix = util::cast(labelPlaneMatrix), + .coord_matrix = util::cast(glCoordMatrix), + + .texsize = toArray(getTexSize(drawable, idSymbolImageTexture)), + .texsize_icon = toArray(getTexSize(drawable, idSymbolImageIconTexture)), + + .is_text_prop = isText, + .rotate_symbol = rotateInShader, + .pitch_with_map = (symbolData.pitchAlignment == style::AlignmentType::Map), + .is_size_zoom_constant = size.isZoomConstant, + .is_size_feature_constant = size.isFeatureConstant, + + .size_t = size.sizeT, + .size = size.size, + + .fill_color_t = getInterpFactor(paintProperties, isText, zoom), + .halo_color_t = getInterpFactor(paintProperties, isText, zoom), + .opacity_t = getInterpFactor(paintProperties, isText, zoom), + .halo_width_t = getInterpFactor(paintProperties, isText, zoom), + .halo_blur_t = getInterpFactor(paintProperties, isText, zoom), }; #if MLN_UBO_CONSOLIDATION @@ -185,10 +185,10 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete #else const SymbolTilePropsUBO tilePropsUBO = { #endif - /* .is_text = */ isText, - /* .is_halo = */ symbolData.isHalo, - /* .gamma_scale= */ gammaScale, - /* .pad1 = */ 0, + .is_text = isText, + .is_halo = symbolData.isHalo, + .gamma_scale = gammaScale, + .pad1 = 0, }; #if MLN_UBO_CONSOLIDATION diff --git a/src/mbgl/renderer/property_evaluation_parameters.hpp b/src/mbgl/renderer/property_evaluation_parameters.hpp index c9aae14dafa5..3fe07ea1c052 100644 --- a/src/mbgl/renderer/property_evaluation_parameters.hpp +++ b/src/mbgl/renderer/property_evaluation_parameters.hpp @@ -33,8 +33,9 @@ class PropertyEvaluationParameters { ? std::min((now - zoomHistory.lastIntegerZoomTime) / d, 1.0f) : 1.0f; - return z > zoomHistory.lastIntegerZoom ? CrossfadeParameters{2.0f, 1.0f, fraction + (1.0f - fraction) * t} - : CrossfadeParameters{0.5f, 1.0f, 1 - (1 - t) * fraction}; + return z > zoomHistory.lastIntegerZoom + ? CrossfadeParameters{.fromScale = 2.0f, .toScale = 1.0f, .t = fraction + (1.0f - fraction) * t} + : CrossfadeParameters{.fromScale = 0.5f, .toScale = 1.0f, .t = 1 - (1 - t) * fraction}; } float z; diff --git a/src/mbgl/renderer/render_target.cpp b/src/mbgl/renderer/render_target.cpp index 01d6765b3145..ef75e44be119 100644 --- a/src/mbgl/renderer/render_target.cpp +++ b/src/mbgl/renderer/render_target.cpp @@ -65,8 +65,11 @@ void RenderTarget::upload(gfx::UploadPass& uploadPass) { } void RenderTarget::render(RenderOrchestrator& orchestrator, const RenderTree& renderTree, PaintParameters& parameters) { - parameters.renderPass = parameters.encoder->createRenderPass( - "render target", {*offscreenTexture, Color{0.0f, 0.0f, 0.0f, 1.0f}, {}, {}}); + parameters.renderPass = parameters.encoder->createRenderPass("render target", + {.renderable = *offscreenTexture, + .clearColor = Color{0.0f, 0.0f, 0.0f, 1.0f}, + .clearDepth = {}, + .clearStencil = {}}); // Run layer tweakers to update any dynamic elements parameters.currentLayer = 0; diff --git a/src/mbgl/renderer/tile_layer_group.cpp b/src/mbgl/renderer/tile_layer_group.cpp index 303a14774d69..c2a049193e89 100644 --- a/src/mbgl/renderer/tile_layer_group.cpp +++ b/src/mbgl/renderer/tile_layer_group.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -40,7 +41,7 @@ std::vector TileLayerGroup::removeDrawables(mbgl::RenderPas return std::move(pair.second); }); drawablesByTile.erase(range.first, range.second); - std::for_each(result.begin(), result.end(), [&](const auto& item) { + std::ranges::for_each(result, [&](const auto& item) { const auto hit = sortedDrawables.find(item.get()); assert(hit != sortedDrawables.end()); if (hit != sortedDrawables.end()) { @@ -56,7 +57,8 @@ void TileLayerGroup::addDrawable(mbgl::RenderPass pass, const OverscaledTileID& LayerGroupBase::addDrawable(drawable); [[maybe_unused]] const auto result = sortedDrawables.insert(drawable.get()); assert(result.second); - drawablesByTile.insert(std::make_pair(TileLayerGroupTileKey{pass, id}, std::move(drawable))); + drawablesByTile.insert( + std::make_pair(TileLayerGroupTileKey{.renderPass = pass, .tileID = id}, std::move(drawable))); } } diff --git a/src/mbgl/style/layers/background_layer.cpp b/src/mbgl/style/layers/background_layer.cpp index 9a228c7a93f7..8f8fb12420fc 100644 --- a/src/mbgl/style/layers/background_layer.cpp +++ b/src/mbgl/style/layers/background_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* BackgroundLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"background", - LayerTypeInfo::Source::NotRequired, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::NotRequired}; + const static LayerTypeInfo typeInfo{.type="background", + .source=LayerTypeInfo::Source::NotRequired, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::NotRequired, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::NotRequired}; return &typeInfo; } - BackgroundLayer::BackgroundLayer(const std::string& layerID) : Layer(makeMutable(layerID, std::string())) { } diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp index 6e1c748e6d03..fd6a979ad504 100644 --- a/src/mbgl/style/layers/circle_layer.cpp +++ b/src/mbgl/style/layers/circle_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* CircleLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"circle", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::Required, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="circle", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::Required, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - CircleLayer::CircleLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/fill_extrusion_layer.cpp b/src/mbgl/style/layers/fill_extrusion_layer.cpp index 2df96887f33d..ccb2df9814a4 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer.cpp +++ b/src/mbgl/style/layers/fill_extrusion_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* FillExtrusionLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"fill-extrusion", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::Required, - LayerTypeInfo::Layout::Required, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="fill-extrusion", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::Required, + .layout=LayerTypeInfo::Layout::Required, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - FillExtrusionLayer::FillExtrusionLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/fill_layer.cpp b/src/mbgl/style/layers/fill_layer.cpp index 3076e179b8e1..9bc0ae55f07c 100644 --- a/src/mbgl/style/layers/fill_layer.cpp +++ b/src/mbgl/style/layers/fill_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* FillLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"fill", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::Required, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="fill", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::Required, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - FillLayer::FillLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/heatmap_layer.cpp b/src/mbgl/style/layers/heatmap_layer.cpp index 342db81aad0a..f0469c1b402c 100644 --- a/src/mbgl/style/layers/heatmap_layer.cpp +++ b/src/mbgl/style/layers/heatmap_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* HeatmapLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"heatmap", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::Required, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="heatmap", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::Required, + .layout=LayerTypeInfo::Layout::NotRequired, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - HeatmapLayer::HeatmapLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/hillshade_layer.cpp b/src/mbgl/style/layers/hillshade_layer.cpp index c4784bd42b88..41097911857a 100644 --- a/src/mbgl/style/layers/hillshade_layer.cpp +++ b/src/mbgl/style/layers/hillshade_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* HillshadeLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"hillshade", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::Required, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::RasterDEM}; + const static LayerTypeInfo typeInfo{.type="hillshade", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::Required, + .layout=LayerTypeInfo::Layout::NotRequired, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::RasterDEM}; return &typeInfo; } - HillshadeLayer::HillshadeLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs index 2e66476084d8..eea2a85d4259 100644 --- a/src/mbgl/style/layers/layer.cpp.ejs +++ b/src/mbgl/style/layers/layer.cpp.ejs @@ -3,6 +3,16 @@ const layoutProperties = locals.layoutProperties; const paintProperties = locals.paintProperties; const allProperties = paintProperties.concat(layoutProperties); + + // Define the mapping from capability keys to struct member names + const memberMap = { + 'Source': 'source', + 'Pass3D': 'pass3d', + 'Layout': 'layout', + 'FadingTiles': 'fadingTiles', + 'CrossTileIndex': 'crossTileIndex', + 'TileKind': 'tileKind' + }; -%> // clang-format off @@ -97,12 +107,14 @@ const split120Line = line => { %> // static const LayerTypeInfo* <%- camelize(type) %>Layer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"<%- type %>", - <%-`${layerCapabilities[type].map(cap => `LayerTypeInfo::${cap}`).join(',\n ')}` %>}; + const static LayerTypeInfo typeInfo{.type="<%- type %>", + <%- layerCapabilities[type].map(cap => { + const key = cap.split('::')[0]; + return `.${memberMap[key]}=LayerTypeInfo::${cap}`; + }).join(',\n ') %>}; return &typeInfo; } - <% if ((type === 'background') || (type === 'location-indicator')) { -%> <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(const std::string& layerID) : Layer(makeMutable(layerID, std::string())) { diff --git a/src/mbgl/style/layers/line_layer.cpp b/src/mbgl/style/layers/line_layer.cpp index 6d90320798af..a18ba5776d77 100644 --- a/src/mbgl/style/layers/line_layer.cpp +++ b/src/mbgl/style/layers/line_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* LineLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"line", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::Required, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="line", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::Required, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - LineLayer::LineLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/location_indicator_layer.cpp b/src/mbgl/style/layers/location_indicator_layer.cpp index cd450c5eb40c..580018130372 100644 --- a/src/mbgl/style/layers/location_indicator_layer.cpp +++ b/src/mbgl/style/layers/location_indicator_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* LocationIndicatorLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"location-indicator", - LayerTypeInfo::Source::NotRequired, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::NotRequired}; + const static LayerTypeInfo typeInfo{.type="location-indicator", + .source=LayerTypeInfo::Source::NotRequired, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::NotRequired, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::NotRequired}; return &typeInfo; } - LocationIndicatorLayer::LocationIndicatorLayer(const std::string& layerID) : Layer(makeMutable(layerID, std::string())) { } diff --git a/src/mbgl/style/layers/raster_layer.cpp b/src/mbgl/style/layers/raster_layer.cpp index a97ad7d2f6a4..0927665369a7 100644 --- a/src/mbgl/style/layers/raster_layer.cpp +++ b/src/mbgl/style/layers/raster_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* RasterLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"raster", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::Raster}; + const static LayerTypeInfo typeInfo{.type="raster", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::NotRequired, + .fadingTiles=LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind=LayerTypeInfo::TileKind::Raster}; return &typeInfo; } - RasterLayer::RasterLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp index 6aec283b0a08..6f7b736c1793 100644 --- a/src/mbgl/style/layers/symbol_layer.cpp +++ b/src/mbgl/style/layers/symbol_layer.cpp @@ -21,17 +21,16 @@ namespace style { // static const LayerTypeInfo* SymbolLayer::Impl::staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"symbol", - LayerTypeInfo::Source::Required, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::Required, - LayerTypeInfo::FadingTiles::Required, - LayerTypeInfo::CrossTileIndex::Required, - LayerTypeInfo::TileKind::Geometry}; + const static LayerTypeInfo typeInfo{.type="symbol", + .source=LayerTypeInfo::Source::Required, + .pass3d=LayerTypeInfo::Pass3D::NotRequired, + .layout=LayerTypeInfo::Layout::Required, + .fadingTiles=LayerTypeInfo::FadingTiles::Required, + .crossTileIndex=LayerTypeInfo::CrossTileIndex::Required, + .tileKind=LayerTypeInfo::TileKind::Geometry}; return &typeInfo; } - SymbolLayer::SymbolLayer(const std::string& layerID, const std::string& sourceID) : Layer(makeMutable(layerID, sourceID)) { } @@ -648,7 +647,6 @@ void SymbolLayer::setTextTransform(const PropertyValue& value baseImpl = std::move(impl_); observer->onLayerChanged(*this); } - PropertyValue> SymbolLayer::getDefaultTextVariableAnchor() { return TextVariableAnchor::defaultValue(); } @@ -664,7 +662,6 @@ void SymbolLayer::setTextVariableAnchor(const PropertyValueonLayerChanged(*this); } - PropertyValue SymbolLayer::getDefaultTextVariableAnchorOffset() { return TextVariableAnchorOffset::defaultValue(); } @@ -680,7 +677,6 @@ void SymbolLayer::setTextVariableAnchorOffset(const PropertyValueonLayerChanged(*this); } - PropertyValue> SymbolLayer::getDefaultTextWritingMode() { return TextWritingMode::defaultValue(); } diff --git a/src/mbgl/util/tile_coordinate.hpp b/src/mbgl/util/tile_coordinate.hpp index d3ac2298548b..0b6ebe2b2853 100644 --- a/src/mbgl/util/tile_coordinate.hpp +++ b/src/mbgl/util/tile_coordinate.hpp @@ -21,7 +21,7 @@ class TileCoordinate { static TileCoordinate fromLatLng(double zoom, const LatLng& latLng) { const double scale = std::pow(2.0, zoom); - return {Projection::project(latLng, scale) / util::tileSize_D, zoom}; + return {.p = Projection::project(latLng, scale) / util::tileSize_D, .z = zoom}; } static TileCoordinate fromScreenCoordinate(const TransformState& state, @@ -32,12 +32,12 @@ class TileCoordinate { TileCoordinate zoomTo(double zoom) const { const double scaleDiff = std::pow(2.0, zoom - z); - return {p * scaleDiff, zoom}; + return {.p = p * scaleDiff, .z = zoom}; } static GeometryCoordinate toGeometryCoordinate(const UnwrappedTileID& tileID, const TileCoordinatePoint& point) { const double scale = std::pow(2.0, tileID.canonical.z); - auto zoomed = TileCoordinate{point, 0}.zoomTo(tileID.canonical.z); + auto zoomed = TileCoordinate{.p = point, .z = 0}.zoomTo(tileID.canonical.z); return {int16_t(util::clamp( static_cast((zoomed.p.x - tileID.canonical.x - tileID.wrap * scale) * util::EXTENT), std::numeric_limits::min(), From 2544cce75374add864cfd87f13df7a263186f981 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 22 Mar 2025 23:24:47 +0100 Subject: [PATCH 121/339] Create `core-release.yml` for MapLibre Native Core releases (#3331) --- .github/scripts/install-linux-deps | 12 ++++ .github/workflows/core-release.yml | 83 ++++++++++++++++++++++++++++ .github/workflows/linux-ci.yml | 25 +-------- .github/workflows/pr-linux-tests.yml | 12 +--- CMakeLists.txt | 2 + CMakePresets.json | 65 +++++++++++++++++++++- platform/glfw/CMakeLists.txt | 3 +- platform/macos/macos.cmake | 2 + vendor/csscolorparser.cmake | 2 +- vendor/icu.cmake | 2 +- vendor/parsedate.cmake | 2 +- 11 files changed, 170 insertions(+), 40 deletions(-) create mode 100755 .github/scripts/install-linux-deps create mode 100644 .github/workflows/core-release.yml diff --git a/.github/scripts/install-linux-deps b/.github/scripts/install-linux-deps new file mode 100755 index 000000000000..298c5c9249a7 --- /dev/null +++ b/.github/scripts/install-linux-deps @@ -0,0 +1,12 @@ +#!/usr/bin/bash + +sudo apt-get update +DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ + libcurl4-openssl-dev \ + libuv1-dev \ + libjpeg-dev \ + libpng-dev \ + libglfw3-dev \ + libwebp-dev \ + libopengl0 \ + mesa-vulkan-drivers diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml new file mode 100644 index 000000000000..3000d4a70953 --- /dev/null +++ b/.github/workflows/core-release.yml @@ -0,0 +1,83 @@ + +name: core-release + +permissions: + contents: write + +on: + workflow_dispatch: + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Create maplibre-native-headers.tar.gz + run: tar czf maplibre-native-headers.tar.gz include + + - name: Create Release + run: | + gh release create core-${{ github.sha }} \ + --draft=false \ + --prerelease=false \ + --latest=false \ + --title "core-${{ github.sha }}" \ + maplibre-native-headers.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-macos: + needs: [create-release] + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build mbgl-core for macOS + run: | + cmake --preset macos-core -DCMAKE_CXX_COMPILER_LAUNCHER="" + cmake --build --preset macos-core + + - name: Rename artifact + run: cp build-macos/libmbgl-core.a libmaplibre-native-core-macos-arm64-metal.a + + - name: Upload macOS artifact + run: gh release upload core-${{ github.sha }} libmaplibre-native-core-macos-arm64-metal.a + env: + GH_TOKEN: ${{ github.token }} + + build-linux: + needs: [create-release] + runs-on: ${{ matrix.runner.os }} + strategy: + matrix: + include: + - renderer: opengl + runner: { os: ubuntu-latest, arch: x64 } + - renderer: vulkan + runner: { os: ubuntu-latest, arch: x64 } + - renderer: opengl + runner: { os: ubuntu-24.04-arm, arch: arm64 } + - renderer: vulkan + runner: { os: ubuntu-24.04-arm, arch: arm64 } + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: .github/scripts/install-linux-deps + + - name: Build mbgl-core for Linux + run: | + cmake --preset linux-${{ matrix.renderer }}-core -DCMAKE_CXX_COMPILER_LAUNCHER="" + cmake --build --preset linux-${{ matrix.renderer }}-core + + - name: Rename artifact + run: cp build-linux-${{ matrix.renderer }}/libmbgl-core.a libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + + - name: Upload Linux artifact + run: gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index d3aa17676126..4b888d5d947d 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -77,17 +77,7 @@ jobs: ninjaVersion: latest - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - libcurl4-openssl-dev \ - libuv1-dev \ - libjpeg-dev \ - libpng-dev \ - libglfw3-dev \ - libwebp-dev \ - libopengl0 \ - mesa-vulkan-drivers + run: .github/scripts/install-linux-deps - if: matrix.renderer == 'drawable' run: echo renderer_flag_cmake=-DMLN_DRAWABLE_RENDERER=ON >> "$GITHUB_ENV" @@ -198,18 +188,7 @@ jobs: fetch-depth: 0 - name: Install dependencies - run: | - sudo apt-get update - DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ - libcurl4-openssl-dev \ - libuv1-dev \ - libjpeg-dev \ - libpng-dev \ - libwebp-dev \ - libglfw3-dev \ - libsqlite3-dev \ - xvfb \ - x11-xserver-utils + run: .github/scripts/install-linux-deps - name: Cache Bazel uses: actions/cache@v4 diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index 659cc74fef1e..c4dc2ee95984 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -149,18 +149,8 @@ jobs: - name: Install scipy run: pip3 install scipy - # not sure which one of these are runtime dependencies - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - libcurl4-openssl-dev \ - libuv1-dev \ - libjpeg-dev \ - libpng-dev \ - libglfw3-dev \ - libwebp-dev \ - libopengl0 + run: .github/scripts/install-linux-deps - name: Run Benchmarks # excluding the API tests because they hang https://github.com/maplibre/maplibre-native/issues/1808 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b5916de3510..0d56e47855ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ option(MLN_WITH_CLANG_TIDY "Build with clang-tidy checks enabled" OFF) option(MLN_WITH_COVERAGE "Enable code coverage collection" OFF) option(MLN_WITH_QT "Build MapLibre Native Qt bindings" OFF) option(MLN_WITH_NODE "Build MapLibre Native Node.js bindings" OFF) +option(MLN_WITH_GLFW "Set up targets for GLFW platform" ON) option(MLN_WITH_SANITIZER "Use [address|thread|undefined] here" OFF) option(MLN_WITH_RTTI "Compile with runtime type information" OFF) option(MLN_WITH_OPENGL "Build with OpenGL renderer" ON) @@ -18,6 +19,7 @@ option(MLN_DRAWABLE_RENDERER "Include the drawable rendering pathway" OFF) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) option(MLN_USE_RUST "Use components in Rust" OFF) +option(MLN_CORE_INCLUDE_DEPS "Include depdendencies in static build of core" OFF) if (MLN_WITH_CLANG_TIDY) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) diff --git a/CMakePresets.json b/CMakePresets.json index f6be192d26db..cdc0275e58b5 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,5 +1,5 @@ { - "version": 10, + "version": 3, "cmakeMinimumRequired": { "major": 3, "minor": 21, @@ -54,6 +54,69 @@ "MLN_WITH_NODE": "ON", "MLN_WITH_WERROR": "OFF" } + }, + { + "name": "macos-core", + "inherits": "macos", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_WITH_GLFW": "OFF" + } + }, + { + "name": "linux-opengl", + "binaryDir": "${sourceDir}/build-linux-opengl", + "generator": "Ninja", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Linux", + "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "MLN_WITH_METAL": "OFF", + "MLN_WITH_OPENGL": "ON", + "MLN_DRAWABLE_RENDERER": "ON", + "CMAKE_C_COMPILER": "clang", + "CMAKE_CXX_COMPILER": "clang++" + } + }, + { + "name": "linux-opengl-core", + "inherits": "linux-opengl", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON" + } + }, + { + "name": "linux-vulkan", + "binaryDir": "${sourceDir}/build-linux-vulkan", + "generator": "Ninja", + "inherits": "linux-opengl", + "cacheVariables": { + "MLN_WITH_OPENGL": "OFF", + "MLN_WITH_VULKAN": "ON" + } + }, + { + "name": "linux-vulkan-core", + "inherits": "linux-vulkan", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON" + } + } + ], + "buildPresets": [ + { + "name": "macos-core", + "configurePreset": "macos-core", + "targets": ["mbgl-core"] + }, + { + "name": "linux-opengl-core", + "configurePreset": "linux-opengl", + "targets": ["mbgl-core"] + }, + { + "name": "linux-vulkan-core", + "configurePreset": "linux-vulkan", + "targets": ["mbgl-core"] } ] } diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index 387479b94b08..887ab8df77a8 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(OpenGL REQUIRED) - if(WIN32) if(MLN_WITH_OSMESA) message(WARNING "mbgl-glfw does not work with -DMLN_WITH_OSMESA=ON. If you want to build this target, don't use this option.") @@ -39,6 +37,7 @@ set_property( ) if(MLN_WITH_OPENGL) + find_package(OpenGL REQUIRED) target_sources( mbgl-glfw PRIVATE ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_gl_backend.cpp diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index 91031077681e..01d98a108f04 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -73,7 +73,9 @@ target_include_directories( add_subdirectory(${PROJECT_SOURCE_DIR}/bin) add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) +if(MLN_WITH_GLFW) add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +endif() if(MLN_WITH_NODE) add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node) endif() diff --git a/vendor/csscolorparser.cmake b/vendor/csscolorparser.cmake index e5f15cc3856c..22d26ccfb80d 100644 --- a/vendor/csscolorparser.cmake +++ b/vendor/csscolorparser.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-csscolorparser) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-csscolorparser OBJECT) else() add_library(mbgl-vendor-csscolorparser STATIC) diff --git a/vendor/icu.cmake b/vendor/icu.cmake index e43dc5ad0351..5f1169e310dd 100644 --- a/vendor/icu.cmake +++ b/vendor/icu.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-icu) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-icu OBJECT) else() add_library(mbgl-vendor-icu STATIC) diff --git a/vendor/parsedate.cmake b/vendor/parsedate.cmake index 9cdedf20eb03..d16d496cac3f 100644 --- a/vendor/parsedate.cmake +++ b/vendor/parsedate.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-parsedate) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-parsedate OBJECT) else() add_library(mbgl-vendor-parsedate STATIC) From c4f33fab328abfa5f3edf8bc5b9badd191587e9b Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Mon, 24 Mar 2025 09:44:01 -0700 Subject: [PATCH 122/339] Add regression test for #3323, bug in layer dependency tracking (#3326) Co-authored-by: Bart Louwers --- .../layers/render_background_layer.cpp | 1 + .../renderer/layers/render_circle_layer.cpp | 1 + .../layers/render_fill_extrusion_layer.cpp | 1 + .../renderer/layers/render_fill_layer.cpp | 1 + .../renderer/layers/render_heatmap_layer.cpp | 1 + .../layers/render_hillshade_layer.cpp | 1 + .../renderer/layers/render_line_layer.cpp | 1 + .../render_location_indicator_layer.cpp | 1 + .../renderer/layers/render_raster_layer.cpp | 1 + .../renderer/layers/render_symbol_layer.cpp | 1 + .../after_update_green/expected.png | Bin 0 -> 913 bytes .../initial_red/expected.png | Bin 0 -> 853 bytes .../style_update_zoom_dependency/style.json | 13 +++++++ test/map/map.test.cpp | 34 ++++++++++++++++-- 14 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png create mode 100644 test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png create mode 100644 test/fixtures/map/style_update_zoom_dependency/style.json diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index c84e23bb50c3..b32271a23bc7 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -50,6 +50,7 @@ RenderBackgroundLayer::~RenderBackgroundLayer() = default; void RenderBackgroundLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index ed03edd4f050..94ecb20ede2e 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -68,6 +68,7 @@ RenderCircleLayer::RenderCircleLayer(Immutable _impl) void RenderCircleLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 98f5f2267431..c70086ca1e05 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -54,6 +54,7 @@ RenderFillExtrusionLayer::~RenderFillExtrusionLayer() = default; void RenderFillExtrusionLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index effd117bc255..213d2aa530c9 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -66,6 +66,7 @@ RenderFillLayer::~RenderFillLayer() = default; void RenderFillLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 03f76378dcf8..28405353e146 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -50,6 +50,7 @@ RenderHeatmapLayer::~RenderHeatmapLayer() = default; void RenderHeatmapLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); updateColorRamp(); } diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index d3b8fdfb28a4..3e55dc4552d0 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -65,6 +65,7 @@ std::array RenderHillshadeLayer::getLight(const PaintParameters& param void RenderHillshadeLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } #if MLN_DRAWABLE_RENDERER diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index c3bec215d079..e93bf879171e 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -63,6 +63,7 @@ RenderLineLayer::~RenderLineLayer() = default; void RenderLineLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); updateColorRamp(); #if MLN_RENDER_BACKEND_METAL diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index e123a18282db..6462e328e935 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -944,6 +944,7 @@ RenderLocationIndicatorLayer::~RenderLocationIndicatorLayer() { void RenderLocationIndicatorLayer::transition(const TransitionParameters& parameters) { unevaluated = impl(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderLocationIndicatorLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 837741d843f6..a097b04bb73e 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -47,6 +47,7 @@ RenderRasterLayer::~RenderRasterLayer() = default; void RenderRasterLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 760450a28f5b..76bd8c38af03 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -364,6 +364,7 @@ void RenderSymbolLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); hasFormatSectionOverrides = SymbolLayerPaintPropertyOverrides::hasOverrides( impl_cast(baseImpl).layout.get()); + styleDependencies = unevaluated.getDependencies(); } void RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png b/test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a4862b278dc0f4fbfa6ab751800faa1eec631a GIT binary patch literal 913 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFd2u~Nskcv5P&lw6bFmNy^ z{+@nK!u~{H!%WtDr44b0kiwU8RrWF4Qa&$WR%7sV L^>bP0l+XkKc@roP literal 0 HcmV?d00001 diff --git a/test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png b/test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf182174f01aa3cca50d9f932add770f449ae7e GIT binary patch literal 853 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJD{8BZ6-kcv5PuPkI_Fc4_j zaJ&9xS&z8Ok;OM|%U#&=n&Ckoqr;3*G#UaUF9dF|7ax;-%+Ab`56mtMp00i_>zopr E0G5LC=l}o! literal 0 HcmV?d00001 diff --git a/test/fixtures/map/style_update_zoom_dependency/style.json b/test/fixtures/map/style_update_zoom_dependency/style.json new file mode 100644 index 000000000000..9446fba90d9b --- /dev/null +++ b/test/fixtures/map/style_update_zoom_dependency/style.json @@ -0,0 +1,13 @@ +{ + "version": 8, + "sources": {}, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#ff0000" + } + } + ] +} diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 82b322599f41..8c44e52dac1b 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -19,8 +19,10 @@ #include #include #include -#include +#include #include +#include +#include #include #include #include @@ -29,8 +31,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -1866,3 +1868,31 @@ TEST(Map, ObserveTileLifecycle) { EXPECT_FALSE(parsing); } } + +TEST(BackgroundLayer, StyleUpdateZoomDependency) { + using namespace mbgl::style::expression::dsl; + + MapTest<> test; + test.map.getStyle().loadJSON(util::read_file("test/fixtures/map/style_update_zoom_dependency/style.json")); + test.map.jumpTo(CameraOptions().withZoom(0.0)); + + // Initial render: background should be red at zoom 0 + test::checkImage("test/fixtures/map/style_update_zoom_dependency/initial_red", + test.frontend.render(test.map).image, + 0.0006, + 0.1); + + // Update background layer to use zoom-dependent color + auto layer = static_cast(test.map.getStyle().getLayer("background")); + layer->setBackgroundColor(PropertyExpression( + interpolate(linear(), zoom(), 0.0, literal(Color::red()), 14.0, literal(Color::green())))); + + test.frontend.render(test.map); + + // Change zoom to 14 and re-render + test.map.jumpTo(CameraOptions().withZoom(14.0)); + test::checkImage("test/fixtures/map/style_update_zoom_dependency/after_update_green", + test.frontend.render(test.map).image, + 0.0006, + 0.1); +} From b40b78329fe84b341a9feab4aa42ccb915e2700e Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 25 Mar 2025 18:03:47 +0200 Subject: [PATCH 123/339] Fix `ErrorSurfaceLostKHR` exception (#3337) --- .../renderer/textureview/VulkanTextureViewRenderThread.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java index 6b11c1569b40..ded021d9fb68 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java @@ -111,7 +111,7 @@ public void run() { if (destroySurface) { mapRenderer.onSurfaceDestroyed(); destroySurface = false; - break; + continue; } // If the surface size has changed inform the map renderer. @@ -121,6 +121,10 @@ public void run() { continue; } + if (surface == null) { + continue; + } + // Time to render a frame mapRenderer.onDrawFrame(); } From 2996d0a95b40b190303999e9e92dbbee6bb1806a Mon Sep 17 00:00:00 2001 From: Tetiana Gubanova <3168855+TatyanaPolunina@users.noreply.github.com> Date: Wed, 26 Mar 2025 20:05:45 +0200 Subject: [PATCH 124/339] Android 11.8.5 release change log update (#3342) --- platform/android/CHANGELOG.md | 7 +++++++ platform/android/MapLibreAndroid/gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index eddbc3f05f43..cabe0244f008 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog MapLibre Native for Android +## 11.8.5 + +### 🐞 Bug fixes + +- Add regression test for [#3323](https://github.com/maplibre/maplibre-native/pull/3323), bug in layer dependency tracking ([#3326](https://github.com/maplibre/maplibre-native/pull/3326)) +- Fix `ErrorSurfaceLostKHR` exception ([#3337](https://github.com/maplibre/maplibre-native/pull/3337)). + ## 11.8.4 ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index eda53af0f1e9..40eb27e5d79e 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.8.4 +VERSION_NAME=11.8.5 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 From 3fc93a0b024e34514dafcbb424db93593ff540be Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Fri, 28 Mar 2025 20:31:29 +0200 Subject: [PATCH 125/339] Made iOS Benchmark app run on Xcode 16 (#3344) --- .../AppIcon.appiconset/Contents.json | 1 - .../AppIcon.appiconset/Icon-76.png | Bin 2841 -> 0 bytes platform/ios/benchmark/Info.plist | 2 ++ platform/ios/benchmark/MBXBenchViewController.mm | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Icon-76.png diff --git a/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Contents.json b/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Contents.json index 41fff61305d6..6e4e5d20d7d2 100644 --- a/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -81,7 +81,6 @@ "size" : "40x40" }, { - "filename" : "Icon-76.png", "idiom" : "ipad", "scale" : "1x", "size" : "76x76" diff --git a/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/platform/ios/benchmark/Assets.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100644 index 0ed2a2673028c7ddd9c6f4a061be9094773bd018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2841 zcmV+!3+D8RP)N97F}fNpV;K|X z=;`hmK+HhE5dn<{m*5DZf}s1&yqbB?Uz(mnlB`A7&o|%uz3=t+`^|f=ZGcE}gDqre zXAiSqk(&JZVb0{7$vKmACg)7fnVd6e16ctyz7Zy|F>j;dO?Y#;!vIP7|1l{7X7oml zxjkVgXE-@slp2m6Yd!HvyGM-VS&^Ut)I}s?FzoM!?KOf!STP5u3u5GOZS;!^o!7tZ z@9%&5>eZ{Ep=UytCUHf=95eSOZ>)5qi zhc8MG4nCuEf4(M#>08w02`hUW+iwiAwX(b5D>zcu!h6D!lA{J9Ojjcyi40SDl!IgJ z5Ek&@q3iJ2%+Ovs4W75KVOK$CJvq2 z$>bBZt1AwBK~Nep(TRC#a<%}ns$E8VY=}9`$z(@o+>tVw1BhFWV6Y6@MMG}JTP6tJ zhTWWgG3u&4Y(ozk*>7K z*A7qvnl4`Mo?)Ycak>vrpX+$g^CZQfv?TlK>DX>whux8z9>OO-cnTJ?F5)c{05ssF zu=HNz$dhqU2(Wx99eU;z!xei%2Wr2a;n2c{-+%bJLoi&5Ma7wAQL$HGu*YNU z;I&GpChu>8mm9o{*Z};LtQrqs&C?7%kd4iKJ2;J&$PL7q{GcrjC^!@VFvEKrs)cYB zr$KzME_(h_*Y%cx_~WshpEUSDo;-UKzB}GaOWVuCJV{02G=;m4B=8UvuHtp&;5EN? zzpsBZho>n0@qdPMJ39J8*w^}StZ-=^-SG@xN^^cMKXtxi z8yA9dQ^hdBh-BUAvdOOLPIdvLWJ?+BTnSgWwL>4Zrgqe9En`pr=uXi{sX}^?YzE0Z zM1a}}uBL)9m;{rNGG|DQ^vvEe(%YUm6Whv#pd3=(Ay#o;Mf1zP;I@?o>cMD{U25q9M$X zie#U*6f8zvFuBR0exu)K2NJ!$fY5v#cHEAaxwI-dY!XlbKsqT*7H|&Pp8VL303_~K z%0`JxyV)J5n$pGqXxHU<8e`q@QkMpWSY4zC3AWKswn;|j*edEf_C_9$jDbTqmL?}d zkDoWS4z%5R#6)L*!5>JR2O7%+ZM)3s<_S_R8A<4@r2&IM0aZ8gq5a2Or)r81kG0$! zJa@JGy$_?6-tb0V-Qw1cosIQ9e42w*`nA=aZr{kM+Z85kx+*5mBpwA6Iw_O%trjp1 zm4iuFsOH1yVEp-wu16Q@?||W|ns70%u6G7u2y#jVjdm;chA#!ae?B&WcCY=8tqZ<>RQ; zVy35`^W9$Q2*7PwMIH+S6|5oVaHP5lsS=P z&in5aI0MCsjw;#!31%%Rl0x}ly`mLxfdi-8&?`GToUn8y`@*XQb%R%5=J0=Bf18@b z4%@opg&uWX;?5eYk~hd2DfEL_3qT~!S*K`Ao&Jx%y!FG2Gm&6E`tla!KxUDw6}SQ( zbS$aEJH1be_v(d$3Tdp0y$t(IvRVpdfiWICcZajpc0#9(YtgS>P@&^GC`Jhk^Ep+%!(v?h@W1IGZ zc6X^euv}01#*7TaLC9QwP% zcj${472VxC^8SU`5>Ide=Z7JDA7E&E^;!?inzyIE0MfFkh(+4ZB}>F0U}>UNmrQGE zKu1{&JapNRq%L&%%m339Z0(ajYh5G+-*)(bUna2}Rw8w`#bP3DKJTY#wiT0LH!%&F zNL-OD5`!6Hu{FQY6PV|$pU3&2yHo}bCRZHc6!92V0SV3%VrmAoScDgFs90viP& zhQ(5Fv8*nVREr#h9Ew^BuqVj^F_1(MS`=rCV76&_R1cb3jD@Ly{6h@9@gQ%D0b9(o zVQl8IAP>yTBa{41^i%v51+0rn7EFzCasb~G- diff --git a/platform/ios/benchmark/Info.plist b/platform/ios/benchmark/Info.plist index 145b9e44a920..c2e11adc6e2b 100644 --- a/platform/ios/benchmark/Info.plist +++ b/platform/ios/benchmark/Info.plist @@ -20,6 +20,8 @@ $(PRODUCT_NAME) CFBundlePackageType APPL + CFBundleShortVersionString + 1.0 CFBundleSignature MBGL CFBundleVersion diff --git a/platform/ios/benchmark/MBXBenchViewController.mm b/platform/ios/benchmark/MBXBenchViewController.mm index f7378ecaf990..1b901616a615 100644 --- a/platform/ios/benchmark/MBXBenchViewController.mm +++ b/platform/ios/benchmark/MBXBenchViewController.mm @@ -205,7 +205,7 @@ - (void)renderFrame 8, 4 * image.size.width, colorSpace, - kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault + kCGImageAlphaPremultipliedLast ); CFRelease(colorSpace); CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); From 15116fafac8d3c838d615c70848d6dd7ddf1eaea Mon Sep 17 00:00:00 2001 From: liyanjin <36877356+grab-liyanjin@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:32:23 +0800 Subject: [PATCH 126/339] Change Java Transfrom class from final to normal (#3332) --- .../main/java/org/maplibre/android/maps/Transform.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Transform.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Transform.java index 4c7cf8910ed0..3efc3c254df7 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Transform.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Transform.java @@ -26,7 +26,7 @@ * Responsible for synchronising {@link CameraPosition} state and notifying camera change listeners. *

*/ -public final class Transform implements MapView.OnCameraDidChangeListener { +public class Transform implements MapView.OnCameraDidChangeListener { private static final String TAG = "Mbgl-Transform"; @@ -73,7 +73,7 @@ void initialise(@NonNull MapLibreMap maplibreMap, @NonNull MapLibreMapOptions op @Nullable @UiThread - public final CameraPosition getCameraPosition() { + public CameraPosition getCameraPosition() { if (cameraPosition == null) { cameraPosition = invalidateCameraPosition(); } @@ -106,7 +106,7 @@ public void run() { * Internal use. */ @UiThread - public final void moveCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, + public void moveCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, @Nullable final MapLibreMap.CancelableCallback callback) { CameraPosition cameraPosition = update.getCameraPosition(maplibreMap); if (isValidCameraPosition(cameraPosition)) { @@ -130,7 +130,7 @@ public void run() { } @UiThread - final void easeCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, int durationMs, + void easeCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, int durationMs, boolean easingInterpolator, @Nullable final MapLibreMap.CancelableCallback callback) { CameraPosition cameraPosition = update.getCameraPosition(maplibreMap); @@ -153,7 +153,7 @@ final void easeCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, int * Internal use. */ @UiThread - public final void animateCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, int durationMs, + public void animateCamera(@NonNull MapLibreMap maplibreMap, CameraUpdate update, int durationMs, @Nullable final MapLibreMap.CancelableCallback callback) { CameraPosition cameraPosition = update.getCameraPosition(maplibreMap); if (isValidCameraPosition(cameraPosition)) { From cb667dfebef8a6910e600e6f4ce6b322f76a222e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 2 Apr 2025 00:33:40 +0200 Subject: [PATCH 127/339] Enabled renovate dependency dashboard (#3350) --- .github/renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index d2fd9721a67b..744b50012a3a 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -6,5 +6,6 @@ "groupName": "bazel" } ], - "schedule": "* * 1,15 * *" + "schedule": "* * 1,15 * *", + "dependencyDashboard": true } From b2d2de4433f825d20557863ad62f602cc0f82b9c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 01:04:26 +0200 Subject: [PATCH 128/339] chore(deps): update bazel (#3347) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 99b71e803d44..740ae9231f48 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -4,8 +4,8 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_apple", version = "3.20.1") bazel_dep(name = "rules_swift", version = "2.7.0") -bazel_dep(name = "rules_xcodeproj", version = "2.10.0") -bazel_dep(name = "aspect_rules_js", version = "2.2.0") +bazel_dep(name = "rules_xcodeproj", version = "2.11.1") +bazel_dep(name = "aspect_rules_js", version = "2.3.3") bazel_dep(name = "rules_nodejs", version = "6.3.4") bazel_dep(name = "libuv", version = "1.48.0") @@ -68,11 +68,11 @@ darwin_config( name = "darwin_config", ) -bazel_dep(name = "rules_rust", version = "0.59.1") +bazel_dep(name = "rules_rust", version = "0.59.2") bazel_dep(name = "cxx.rs", version = "1.0.136") git_override( module_name = "cxx.rs", - commit = "ba6590df60e521dc40b67814dd58116ff37f742f", + commit = "dfb54b4a6b2c60de54431ae97c2014aee96c162c", remote = "https://github.com/dtolnay/cxx.git", ) From b3bffd59b09d756aa8746e44cb1b3a0a98040e41 Mon Sep 17 00:00:00 2001 From: Ramya Ragupathy Date: Wed, 2 Apr 2025 19:04:12 +0530 Subject: [PATCH 129/339] Add logo to sponsor section (#3353) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2ea8f2f7a41b..a11f51793637 100644 --- a/README.md +++ b/README.md @@ -253,6 +253,8 @@ Silver: Logo mapme +Logo maptiler + Backers and Supporters: [![](https://opencollective.com/maplibre/backers.svg?avatarHeight=50&width=600)](https://opencollective.com/maplibre) From 5a368624ec22bd5aa43fe0bab4efbc106767e318 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 2 Apr 2025 18:48:11 +0200 Subject: [PATCH 130/339] Release MapLibre iOS 6.12.2 (#3354) --- platform/ios/CHANGELOG.md | 6 ++++++ platform/ios/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index abf5aae4d2bb..a120e5189f4a 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,12 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.12.2 + +- Strip punctuation from attribution ([#3287](https://github.com/maplibre/maplibre-native/pull/3287)). +- Revert [#3035](https://github.com/maplibre/maplibre-native/pull/3035) which was causing memory growth issue (#3315). +- Apply clang-tidy fixes (mostly use designated initializers) ([#3328](https://github.com/maplibre/maplibre-native/pull/3328)). + ## 6.12.1 - Use double quotes for MLNTileOperation.h import ([#3277](https://github.com/maplibre/maplibre-native/issues/3277)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index ff61e1868921..f867e299309d 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.12.1 +6.12.2 From b022d4878deba41b3be79e802120683950930896 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 2 Apr 2025 21:12:20 +0200 Subject: [PATCH 131/339] Fix rare crash LatLngAnimator (#3352) --- .../android/location/LocationAnimatorCoordinator.java | 7 ++++++- .../android/location/LocationAnimatorCoordinatorTest.kt | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationAnimatorCoordinator.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationAnimatorCoordinator.java index c48a15b519a1..8392a2e7dfe9 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationAnimatorCoordinator.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationAnimatorCoordinator.java @@ -334,7 +334,8 @@ private void updateTiltAnimator(float targetTilt, float previousTiltLevel, createNewCameraAdapterAnimator(ANIMATOR_TILT, new Float[] {previousTiltLevel, targetTilt}, cancelableCallback); } - private void createNewLatLngAnimator(@MapLibreAnimator.Type int animatorType, LatLng previous, LatLng target) { + private void createNewLatLngAnimator(@MapLibreAnimator.Type int animatorType, + @NonNull LatLng previous, @NonNull LatLng target) { createNewLatLngAnimator(animatorType, new LatLng[] {previous, target}); } @@ -430,6 +431,10 @@ private boolean resetCameraLatLngAnimation(@NonNull CameraPosition currentCamera LatLng currentTarget = animator.getTarget(); LatLng previousCameraTarget = currentCameraPosition.target; + if (previousCameraTarget == null) { + return false; + } + createNewLatLngAnimator(ANIMATOR_CAMERA_LATLNG, previousCameraTarget, currentTarget); return immediateAnimation(projection, previousCameraTarget, currentTarget); diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationAnimatorCoordinatorTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationAnimatorCoordinatorTest.kt index 37e40ad674d3..5a0cce63f388 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationAnimatorCoordinatorTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationAnimatorCoordinatorTest.kt @@ -583,6 +583,15 @@ class LocationAnimatorCoordinatorTest { assertFalse(locationAnimatorCoordinator.animatorArray[ANIMATOR_CAMERA_LATLNG].isStarted) } + // regression test for crash https://github.com/maplibre/maplibre-native/issues/3294 + @Test + fun resetAllCameraAnimations_null_target() { + locationAnimatorCoordinator.feedNewLocation(Location(""), CameraPosition.DEFAULT, true) + + val cameraPosition = CameraPosition.Builder().build() + locationAnimatorCoordinator.resetAllCameraAnimations(cameraPosition, false) + } + @Test fun cancelZoomAnimators() { locationAnimatorCoordinator.feedNewZoomLevel( From 2868ee829a45e70f3234f7116ee8194e1111d933 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Wed, 2 Apr 2025 12:51:34 -0700 Subject: [PATCH 132/339] Fix warnings, ignore new CMake build directories (#3356) --- .gitignore | 1 + platform/darwin/core/local_glyph_rasterizer.mm | 4 ++-- src/mbgl/mtl/buffer_resource.cpp | 4 ++-- src/mbgl/mtl/context.cpp | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index a15a2d842691..fbb342503fdc 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ local.properties .cache compile_commands.json /build +/build-* **/.idea **/.clwb /new_offline.db diff --git a/platform/darwin/core/local_glyph_rasterizer.mm b/platform/darwin/core/local_glyph_rasterizer.mm index 340fbb62a8c7..a1e0b56dc9a7 100644 --- a/platform/darwin/core/local_glyph_rasterizer.mm +++ b/platform/darwin/core/local_glyph_rasterizer.mm @@ -266,8 +266,8 @@ CGContextHandle context(CGBitmapContextCreate( CFArrayRef glyphRuns = CTLineGetGlyphRuns(*line); CTRunRef glyphRun = (CTRunRef)CFArrayGetValueAtIndex(glyphRuns, 0); CFRange wholeRunRange = CFRangeMake(0, CTRunGetGlyphCount(glyphRun)); - CGSize advances[wholeRunRange.length]; - CTRunGetAdvances(glyphRun, wholeRunRange, advances); + std::vector advances(wholeRunRange.length); + CTRunGetAdvances(glyphRun, wholeRunRange, advances.data()); metrics.advance = std::round(advances[0].width); // Mimic glyph PBF metrics. diff --git a/src/mbgl/mtl/buffer_resource.cpp b/src/mbgl/mtl/buffer_resource.cpp index 5ac4071670a8..f60528445dd7 100644 --- a/src/mbgl/mtl/buffer_resource.cpp +++ b/src/mbgl/mtl/buffer_resource.cpp @@ -184,7 +184,7 @@ void BufferResource::updateVertexBindOffset(const MTLRenderCommandEncoderPtr& en // The documentation for `setVertexBufferOffset` indicates that it should work for buffers // assigned using `setVertexBytes` but, in practice, it produces a validation failure: // `Set Vertex Buffer Offset Validation index(1) must have an existing buffer.` - if (const auto* mtlBuf = buffer.get()) { + if (buffer.get()) { encoder->setVertexBufferOffset(offset, index); } else { bindVertex(encoder, offset, index, size_); @@ -195,7 +195,7 @@ void BufferResource::updateFragmentBindOffset(const MTLRenderCommandEncoderPtr& std::size_t offset, std::size_t index, std::size_t size_) const noexcept { - if (const auto* mtlBuf = buffer.get()) { + if (buffer.get()) { encoder->setFragmentBufferOffset(offset, index); } else { bindFragment(encoder, offset, index, size_); diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index 23624fcb3bdf..b0ccfb116cd9 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -605,12 +605,12 @@ MTLDepthStencilStatePtr Context::makeDepthStencilState(const gfx::DepthMode& dep // `Draw Errors Validation MTLDepthStencilDescriptor sets depth test but MTLRenderPassDescriptor has a nil // depthAttachment texture` if (auto* depthTarget = rpd->depthAttachment()) { - if (auto* tex = depthTarget->texture()) { + if (depthTarget->texture()) { applyDepthMode(depthMode, depthStencilDescriptor.get()); } } if (auto* stencilTarget = rpd->stencilAttachment()) { - if (auto* tex = stencilTarget->texture()) { + if (stencilTarget->texture()) { auto stencilDescriptor = NS::TransferPtr(MTL::StencilDescriptor::alloc()->init()); if (!stencilDescriptor) { return {}; From 6b5c01b296196d92bfa627554de2eb9bbff657e4 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 4 Apr 2025 22:49:56 +0200 Subject: [PATCH 133/339] Stick to CMake 3.41.1 on CI for now (#3362) --- .github/workflows/pr-bloaty-ios.yml | 2 +- .github/workflows/pr-linux-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index 314df2ce1684..3a8fb672b8b9 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -35,7 +35,7 @@ jobs: - name: Get latest CMake and Ninja uses: lukka/get-cmake@latest with: - cmakeVersion: latest + cmakeVersion: 3.24.1 ninjaVersion: latest - name: Cache Bloaty diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index c4dc2ee95984..62a8474d41f7 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -54,7 +54,7 @@ jobs: - name: Get latest CMake and Ninja uses: lukka/get-cmake@latest with: - cmakeVersion: latest + cmakeVersion: 3.24.1 ninjaVersion: latest - name: Cache Bloaty From f99f69fad8019de7200797ea722987394827a924 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 5 Apr 2025 12:41:29 +0200 Subject: [PATCH 134/339] Fix dead links README.md (#3361) --- CONTRIBUTING.md | 4 +--- README.md | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff9ba2ad12dc..50db189cd02a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ ## Documentation -- For a high-level overview of MapLibre Native, check out the [MapLibre Native Markdown Book](https://maplibre.org/maplibre-native/docs/book/). +The [MapLibre Native Developer Docs](https://maplibre.org/maplibre-native/docs/book/) is the go-to reference for developing MapLibre Native. ## Source code checkout @@ -20,8 +20,6 @@ If you want to contribute code: 1. Pull requests are gladly accepted. If there are any changes that developers using one of the platforms should be aware of, please update the **main** section of the relevant `CHANGELOG.md`. -Please note the special instructions for contributing new source code files, asset files, or user-facing strings to MapLibre Native for [iOS](platform/ios/CONTRIBUTING.md), [Android](platform/android/DEVELOPING.md) or [macOS](platform/macos/README.md). - ## Design Proposals If you would like to change MapLibre Native in a substantial way, we recommend that you write a Design Proposal. Examples for substantial changes could be if you would like to split the mono-repo or if you would like to introduce shaders written in Metal. diff --git a/README.md b/README.md index a11f51793637..113f6b97cf02 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,14 @@ This project originated as a fork of Mapbox GL Native, before their switch to a ## Getting Started -## Android +### Android Add [the latest version](https://central.sonatype.com/artifact/org.maplibre.gl/android-sdk/versions) of MapLibre Native Android as a dependency to your project. ```gradle dependencies { ... - implementation 'org.maplibre.gl:android-sdk:11.5.1' + implementation 'org.maplibre.gl:android-sdk:11.8.5' ... } ``` @@ -115,7 +115,7 @@ class MainActivity : AppCompatActivity() { ``` -For more information, refer to the [Android API Documentation](https://maplibre.org/maplibre-native/android/api/), [Android Examples Documentation](https://maplibre.org/maplibre-native/android/examples/getting-started/) or the [MapLibre Native Android `README.md`](platform/android/README.md). +For more information, refer to the [Android API Documentation](https://maplibre.org/maplibre-native/android/api/) or the [Android Examples Documentation](https://maplibre.org/maplibre-native/android/examples/getting-started/). ## iOS @@ -155,9 +155,10 @@ struct SimpleMap: UIViewRepresentable { } ``` -You can also use [MapLibreSwiftUI](https://github.com/maplibre/swiftui-dsl), a wrapper around MapLibre Native iOS that offers a declarative API like SwiftUI. +> [!TIP] +> You can also use [MapLibreSwiftUI](https://github.com/maplibre/swiftui-dsl), a wrapper around MapLibre Native iOS that offers a declarative API like SwiftUI. -The [iOS Documentation](https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre/) contains many examples and the entire API of the library. You might also want to check out the [MapLibre Native iOS `README.md`](platform/ios/README.md). +The [iOS Documentation](https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre/) contains many examples and the entire API of the library. ## Node.js @@ -187,22 +188,24 @@ git clone --recurse-submodules git@github.com:/maplibre-native.git git remote add origin https://github.com/maplibre/maplibre-native.git ``` -Check out issues labelled as a [good first issue](https://github.com/maplibre/maplibre-native/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). +The go-to reference is the [MapLibre Native Developer Documentation](https://maplibre.org/maplibre-native/docs/book/). + +> [!TIP] +> Check out issues labelled as a [good first issue](https://github.com/maplibre/maplibre-native/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). -## Core +### Core - [`CONTRIBUTING.md`](CONTRIBUTING.md) -- [MapLibre Native Markdown Book](https://maplibre.org/maplibre-native/docs/book/design/ten-thousand-foot-view.html): architectural notes - [GitHub Wiki](https://github.com/maplibre/maplibre-native/wiki): low-friction way to share information with the community - [Core C++ API Documentation](https://maplibre.org/maplibre-native/cpp/api/) (unstable) -## Android +### Android Open `platform/android` with Android Studio. -More information: [`platform/android/DEVELOPING.md`](platform/android/DEVELOPING.md). +More information: [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/android/index.html). -## iOS +### iOS You need to use [Bazel](https://bazel.build/) to generate an Xcode project. Install [`bazelisk`](https://formulae.brew.sh/formula/bazelisk) (a wrapper that installs the required Bazel version). Next, use: @@ -213,7 +216,7 @@ xed platform/ios/MapLibre.xcodeproj To generate and open the Xcode project. -More information: [`platform/ios/CONTRIBUTING.md`](platform/ios/CONTRIBUTING.md). +More information: [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/ios/index.html). ## Other Platforms From bea223602ad1539362871982d122e270d547e878 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 7 Apr 2025 10:40:13 +0200 Subject: [PATCH 135/339] Retry with curl on CI (#3364) --- .github/workflows/android-device-test.yml | 2 +- .github/workflows/pr-bloaty-ios.yml | 2 +- .github/workflows/pr-linux-tests.yml | 2 +- .github/workflows/upload-coverage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 93c516bb6ae3..5fdfb7abe5de 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -76,7 +76,7 @@ jobs: - id: parent_workflow run: | - conclusion=$(curl ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion') + conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion') was_skipped=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "was_skipped=$was_skipped" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index 3a8fb672b8b9..700f423fc3f2 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -21,7 +21,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "ios-build").conclusion') + conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "ios-build").conclusion') should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index 62a8474d41f7..9a916ef2d816 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -24,7 +24,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-build-and-test").conclusion') + conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-build-and-test").conclusion') should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/upload-coverage.yml b/.github/workflows/upload-coverage.yml index 0fe589035d66..5cffd6324871 100644 --- a/.github/workflows/upload-coverage.yml +++ b/.github/workflows/upload-coverage.yml @@ -14,7 +14,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-coverage").conclusion') + conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-coverage").conclusion') should_run=$([[ "$conclusion" = "success" ]] && echo "true" || echo "false") echo "should_run=$should_run" >> "$GITHUB_OUTPUT" From d6938987577a2ccb6e50695dbf119223caef6adb Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 7 Apr 2025 17:49:38 +0200 Subject: [PATCH 136/339] Add MLNDefines.h to make sure Metal backend is available in headers (#3363) --- platform/ios/BUILD.bazel | 14 +++++++++++++- platform/ios/CHANGELOG.md | 4 ++++ platform/ios/VERSION | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index a87208953e69..18f05e9b21a3 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -82,7 +82,17 @@ info_plist( base_info_plist = "app/Info.plist", ) +genrule( + name = "mln_defines", + outs = ["MLNDefines.h"], + cmd = select({ + "//:metal_renderer": "echo '#define MLN_RENDER_BACKEND_METAL 1' > $@", + "//conditions:default": "echo '' > $@", + }), +) + public_hdrs = [ + ":mln_defines", ":ios_public_hdrs", ":ios_sdk_hdrs", "//platform/darwin:darwin_objc_hdrs", @@ -123,8 +133,10 @@ apple_xcframework( data = glob([ "resources/*.lproj/**", "resources/*.xcassets/**", + ]) + [ + "PrivacyInfo.xcprivacy", "resources/metal-cpp-ignores.txt", - ]) + ["PrivacyInfo.xcprivacy"], + ], infoplists = ["info_plist"], ios = { "simulator": [ diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index a120e5189f4a..46b89df380e2 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,10 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.12.3 + +- add MLNDefines.h to make sure Metal backend is available in headers ([#3335](https://github.com/maplibre/maplibre-native/issues/3335)). + ## 6.12.2 - Strip punctuation from attribution ([#3287](https://github.com/maplibre/maplibre-native/pull/3287)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index f867e299309d..ffd41f5c6b29 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.12.2 +6.12.3 From 802586ed520fc4eb978e69d7abfe5c1b9b0740af Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 9 Apr 2025 14:58:10 +0300 Subject: [PATCH 137/339] Sync surface destruction with main thread (#3368) --- .../renderer/textureview/TextureViewRenderThread.java | 8 ++++++++ .../renderer/textureview/GLTextureViewRenderThread.java | 5 +++++ .../textureview/VulkanTextureViewRenderThread.java | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java index f26b8196d329..76c5a0a7d7c1 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java @@ -84,6 +84,14 @@ public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { this.destroySurface = true; this.requestRender = false; lock.notifyAll(); + + while (this.hasNativeSurface) { + try { + lock.wait(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } } return true; } diff --git a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java index ecaa3b15dd35..a8919adc2a72 100644 --- a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/textureview/GLTextureViewRenderThread.java @@ -73,6 +73,8 @@ public void run() { if (destroySurface) { eglHolder.destroySurface(); destroySurface = false; + this.hasNativeSurface = false; + lock.notifyAll(); break; } @@ -89,12 +91,14 @@ public void run() { // Initialize EGL if needed if (eglHolder.eglContext == EGL10.EGL_NO_CONTEXT) { + this.hasNativeSurface = true; initializeEGL = true; break; } // (re-)Initialize EGL Surface if needed if (eglHolder.eglSurface == EGL10.EGL_NO_SURFACE) { + this.hasNativeSurface = true; recreateSurface = true; break; } @@ -195,6 +199,7 @@ public void run() { // Signal we're done synchronized (lock) { + this.hasNativeSurface = false; this.exited = true; lock.notifyAll(); } diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java index ded021d9fb68..a77dcebc5a4e 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/textureview/VulkanTextureViewRenderThread.java @@ -23,6 +23,8 @@ void cleanup() { mapRenderer.onSurfaceDestroyed(); surface.release(); surface = null; + + hasNativeSurface = false; } // Thread implementation @@ -68,6 +70,7 @@ public void run() { if (surface == null) { surface = new Surface(surfaceTexture); + this.hasNativeSurface = true; createSurface = true; } @@ -111,6 +114,10 @@ public void run() { if (destroySurface) { mapRenderer.onSurfaceDestroyed(); destroySurface = false; + synchronized (lock) { + this.hasNativeSurface = false; + lock.notifyAll(); + } continue; } From cb17b10824e278118026b5bf53b45fdc2ac881ff Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 9 Apr 2025 18:39:04 +0200 Subject: [PATCH 138/339] Prevent exception SymbolLocationLayerRenderer with new style (#3369) --- .../android/location/SymbolLocationLayerRenderer.java | 5 +++++ .../maplibre/android/location/LocationLayerControllerTest.kt | 1 + 2 files changed, 6 insertions(+) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java index 2983e322af78..ee193dddf9a1 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java @@ -319,6 +319,11 @@ private void addLocationSource() { } private void refreshSource() { + // prevents exception when other style has been set with an update in flight + // https://github.com/maplibre/maplibre-native/issues/3348 + if (!style.isFullyLoaded()) { + return; + } GeoJsonSource source = style.getSourceAs(LOCATION_SOURCE); if (source != null) { locationSource.setGeoJson(locationFeature); diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationLayerControllerTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationLayerControllerTest.kt index 3deb34b282f8..fdd31bfaa643 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationLayerControllerTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationLayerControllerTest.kt @@ -966,6 +966,7 @@ class LocationLayerControllerTest { val locationSource = Mockito.mock(GeoJsonSource::class.java) Mockito.`when`(style.getSourceAs(LocationComponentConstants.LOCATION_SOURCE)) .thenReturn(locationSource) + Mockito.`when`(style.isFullyLoaded).thenReturn(true) val sourceProvider = buildLayerProvider() Mockito.`when`( sourceProvider.generateSource( From 6644f6708d978af3e84707d12eac97131c58a052 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 10 Apr 2025 00:04:24 +0200 Subject: [PATCH 139/339] Prepare MapLibre Android 11.8.6 release (#3372) --- platform/android/CHANGELOG.md | 14 ++++++++++++++ platform/android/MapLibreAndroid/gradle.properties | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index cabe0244f008..3d2d1222a0dd 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog MapLibre Native for Android +## main + +## 11.8.6 + +### ✨ Features and improvements + +- Change Java Transfrom class from final to normal ([#3332](https://github.com/maplibre/maplibre-native/pull/3332)). + +### 🐞 Bug fixes + +- Fix rare crash LatLngAnimator ([#3352](https://github.com/maplibre/maplibre-native/pull/3352)). +- Sync surface destruction with main thread ([#3368](https://github.com/maplibre/maplibre-native/pull/3368)). +- Prevent exception SymbolLocationLayerRenderer with new style ([#3369](https://github.com/maplibre/maplibre-native/pull/3369)). + ## 11.8.5 ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 40eb27e5d79e..6f36e432f3da 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=11.8.5 +VERSION_NAME=11.8.6 # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 From 2ee04c397cdf79f6d491a0a93e374b1f5bb4677f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:20:33 +0000 Subject: [PATCH 140/339] [pre-commit.ci] pre-commit autoupdate (#3367) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- platform/ios/src/MLNMapView.h | 4 ++-- platform/windows/include/gl_functions_wgl.h | 13 ++++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c0c2fbd80a6e..8005f36d688e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,14 +19,14 @@ repos: exclude: 'platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$' - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v19.1.7 + rev: v20.1.0 hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' exclude: 'vendor/.*' - repo: https://github.com/keith/pre-commit-buildifier - rev: 8.0.1 + rev: 8.0.3 hooks: - id: buildifier diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 395c58efb2d5..beafb9fb0c06 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -548,8 +548,8 @@ MLN_EXPORT `-setUserLocationVerticalAlignment:animated:` method instead. */ @property (nonatomic, assign) MLNAnnotationVerticalAlignment userLocationVerticalAlignment - __attribute__((deprecated("Use ``MLNMapViewDelegate/mapViewUserLocationAnchorPoint:`` instead.") - )); + __attribute__(( + deprecated("Use ``MLNMapViewDelegate/mapViewUserLocationAnchorPoint:`` instead."))); /** Sets the vertical alignment of the user location annotation within the diff --git a/platform/windows/include/gl_functions_wgl.h b/platform/windows/include/gl_functions_wgl.h index 4cd126aaf650..952dbe5b83cb 100644 --- a/platform/windows/include/gl_functions_wgl.h +++ b/platform/windows/include/gl_functions_wgl.h @@ -1756,13 +1756,12 @@ void (*const glGetInternalformativ)(GLenum, GLenum, GLenum, GLsizei, GLint*) = /* OpenGL Windows Extensions */ -BOOL(*const wglChoosePixelFormatARB) -(HDC, const int*, const FLOAT*, UINT, int*, UINT*) = [](HDC hdc, - const int* piAttribIList, - const FLOAT* pfAttribFList, - UINT nMaxFormats, - int* piFormats, - UINT* nNumFormats) { +BOOL (*const wglChoosePixelFormatARB)(HDC, const int*, const FLOAT*, UINT, int*, UINT*) = [](HDC hdc, + const int* piAttribIList, + const FLOAT* pfAttribFList, + UINT nMaxFormats, + int* piFormats, + UINT* nNumFormats) { if (!opengl32) loadWGL(); return ::wgl_wglChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); }; From b862d6f149ab788c430ba5f0462f21d59df6f47e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 11 Apr 2025 13:21:22 +0200 Subject: [PATCH 141/339] Unignore some Android Instrumentation Tests (#3274) --- .gitignore | 1 + platform/android/.gitignore | 1 + .../org/maplibre/android/integration/FragmentBackStackTest.kt | 1 - .../org/maplibre/android/integration/ViewPagerScrollTest.kt | 1 - .../java/org/maplibre/android/maps/VisibleRegionTest.kt | 1 - .../java/org/maplibre/android/offline/OfflineDownloadTest.kt | 1 - .../org/maplibre/android/snapshotter/MapSnapshotterTest.kt | 3 +-- .../maplibre/android/testapp/geometry/LatLngBoundsTest.java | 2 -- 8 files changed, 3 insertions(+), 8 deletions(-) create mode 100644 platform/android/.gitignore diff --git a/.gitignore b/.gitignore index fbb342503fdc..df7a7a0f5248 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ compile_commands.json /platform/android/site node_modules .cxx +.env # Node binaries. /lib diff --git a/platform/android/.gitignore b/platform/android/.gitignore new file mode 100644 index 000000000000..14c4f869cb2a --- /dev/null +++ b/platform/android/.gitignore @@ -0,0 +1 @@ +MapLibreAndroid/src/vulkanDebug diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/FragmentBackStackTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/FragmentBackStackTest.kt index 8288b1f7ee5e..b023f4e82136 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/FragmentBackStackTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/FragmentBackStackTest.kt @@ -20,7 +20,6 @@ class FragmentBackStackTest : BaseIntegrationTest() { var activityRule: ActivityTestRule = ActivityTestRule(FragmentBackStackActivity::class.java) @Test - @Ignore("https://github.com/maplibre/maplibre-native/issues/2469") @LargeTest fun backPressedOnBackStackResumed() { device.waitForIdle() diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/ViewPagerScrollTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/ViewPagerScrollTest.kt index 1fafaca6241c..db51f74a035c 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/ViewPagerScrollTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/ViewPagerScrollTest.kt @@ -13,7 +13,6 @@ import org.junit.runner.RunWith /** * Regression test that validates MapFragment integration with a ViewPager */ -@Ignore("https://github.com/maplibre/maplibre-native/issues/2316") @RunWith(AndroidJUnit4ClassRunner::class) class ViewPagerScrollTest : BaseIntegrationTest() { diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/VisibleRegionTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/VisibleRegionTest.kt index aab867c63b45..e0888e0d6270 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/VisibleRegionTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/VisibleRegionTest.kt @@ -13,7 +13,6 @@ import org.junit.Assert.assertTrue import org.junit.Ignore import org.junit.Test -@Ignore("https://github.com/maplibre/maplibre-native/issues/2468") class VisibleRegionTest : BaseTest() { override fun getActivityClass(): Class<*> { diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/offline/OfflineDownloadTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/offline/OfflineDownloadTest.kt index 5192727c82f6..d742ed86b4c8 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/offline/OfflineDownloadTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/offline/OfflineDownloadTest.kt @@ -17,7 +17,6 @@ import java.util.concurrent.TimeoutException /** * Integration test that validates downloading an offline region from a point geometry at zoomlevel 17 */ -@Ignore("https://github.com/maplibre/maplibre-native/issues/2318") @RunWith(AndroidJUnit4ClassRunner::class) class OfflineDownloadTest : OfflineRegion.OfflineRegionObserver { diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/snapshotter/MapSnapshotterTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/snapshotter/MapSnapshotterTest.kt index 6d1323a7249a..31d1287d8bb4 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/snapshotter/MapSnapshotterTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/snapshotter/MapSnapshotterTest.kt @@ -22,7 +22,6 @@ import java.util.concurrent.TimeoutException /** * Integration test that validates if a snapshotter creation */ -@Ignore("https://github.com/maplibre/maplibre-native/issues/2317") @RunWith(AndroidJUnit4ClassRunner::class) class MapSnapshotterTest { @@ -41,7 +40,7 @@ class MapSnapshotterTest { val options = MapSnapshotter.Options(512, 512) .withPixelRatio(1.0f) .withStyleBuilder( - Style.Builder().fromUri(TestStyles.getPredefinedStyleWithFallback("Satellite Hybrid")) + Style.Builder().fromUri(TestStyles.OPENFREEMAP_BRIGHT) .withLayerAbove(bg, "country-label") ) .withCameraPosition( diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/geometry/LatLngBoundsTest.java b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/geometry/LatLngBoundsTest.java index ac73b61fc667..23ff088ef84c 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/geometry/LatLngBoundsTest.java +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/geometry/LatLngBoundsTest.java @@ -2,7 +2,6 @@ import static org.junit.Assert.assertEquals; -import org.junit.Ignore; import org.maplibre.android.camera.CameraUpdateFactory; import org.maplibre.android.geometry.LatLng; import org.maplibre.android.geometry.LatLngBounds; @@ -16,7 +15,6 @@ /** * Instrumentation test to validate integration of LatLngBounds */ -@Ignore("https://github.com/maplibre/maplibre-native/issues/2319") public class LatLngBoundsTest extends BaseTest { private static final double MAP_BEARING = 50; From 97490cb3c130bf5821ceb158dba2a6e17b25b75c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 11 Apr 2025 17:18:56 +0200 Subject: [PATCH 142/339] Add page to Developer Docs on Render Tests (#3377) --- docs/mdbook/src/SUMMARY.md | 2 + docs/mdbook/src/android/android-tests.md | 11 +- docs/mdbook/src/render-tests.md | 113 + metrics/benchmark/android/results.json | 12730 --------------- metrics/benchmark/ios/results.json | 12748 ---------------- metrics/ignores/platform-all.json | 1 - metrics/integration/README.md | 150 - .../custom_layer_implementations.js | 123 - metrics/integration/dist/.gitkeep | 0 metrics/integration/lib/expression.js | 194 - .../integration/lib/generate-fixture-json.js | 120 - metrics/integration/lib/harness.js | 210 - metrics/integration/lib/json-diff.js | 37 - metrics/integration/lib/localize-urls.js | 102 - metrics/integration/lib/operation-handlers.js | 56 - metrics/integration/lib/query-browser.js | 86 - metrics/integration/lib/query.js | 153 - metrics/integration/lib/render.js | 183 - metrics/integration/lib/server.js | 50 - .../query-tests/result_item.html.tmpl | 10 - metrics/integration/results.html.tmpl | 73 - metrics/integration/rollup.config.test.js | 14 - metrics/integration/testem.js | 169 - metrics/integration/testem_page.html | 14 - platform/android/scripts/metrics.sh | 19 - 25 files changed, 124 insertions(+), 27244 deletions(-) create mode 100644 docs/mdbook/src/render-tests.md delete mode 100644 metrics/benchmark/android/results.json delete mode 100644 metrics/benchmark/ios/results.json delete mode 100644 metrics/integration/README.md delete mode 100644 metrics/integration/custom_layer_implementations.js delete mode 100644 metrics/integration/dist/.gitkeep delete mode 100644 metrics/integration/lib/expression.js delete mode 100644 metrics/integration/lib/generate-fixture-json.js delete mode 100644 metrics/integration/lib/harness.js delete mode 100644 metrics/integration/lib/json-diff.js delete mode 100644 metrics/integration/lib/localize-urls.js delete mode 100644 metrics/integration/lib/operation-handlers.js delete mode 100644 metrics/integration/lib/query-browser.js delete mode 100644 metrics/integration/lib/query.js delete mode 100644 metrics/integration/lib/render.js delete mode 100644 metrics/integration/lib/server.js delete mode 100644 metrics/integration/query-tests/result_item.html.tmpl delete mode 100644 metrics/integration/results.html.tmpl delete mode 100644 metrics/integration/rollup.config.test.js delete mode 100644 metrics/integration/testem.js delete mode 100644 metrics/integration/testem_page.html delete mode 100755 platform/android/scripts/metrics.sh diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index c0b86f33d791..d1426f0814d0 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -6,6 +6,8 @@ - [Release Policy](./release-policy.md) +- [Render Tests](./render-tests.md) + - [Android](./android/README.md) - [Tests](./android/android-tests.md) - [Documentation](./android/android-documentation.md) diff --git a/docs/mdbook/src/android/android-tests.md b/docs/mdbook/src/android/android-tests.md index 6e7e971195a2..8f497a3931ae 100644 --- a/docs/mdbook/src/android/android-tests.md +++ b/docs/mdbook/src/android/android-tests.md @@ -25,8 +25,15 @@ Double click `android-render-test-runner-style.html`. Right click on the opened Alternatively to download (and open) the results from the command line, use: ``` -adb shell "run-as org.maplibre.render_test_runner cat files/metrics/android-render-test-runner-style.html" > android-render-test-runner-style.html -open android-render-test-runner-style.html +filename=android-render-test-runner-style.html +adb shell "run-as org.maplibre.render_test_runner cat files/metrics/$filename" > $filename +open $filename +``` + +For Vulkan use + +``` +filename=android-vulkan-render-test-runner-style.html ``` ### Updating the Render Tests diff --git a/docs/mdbook/src/render-tests.md b/docs/mdbook/src/render-tests.md new file mode 100644 index 000000000000..9db26c814d24 --- /dev/null +++ b/docs/mdbook/src/render-tests.md @@ -0,0 +1,113 @@ +# Render Tests + +> [!NOTE] +> See also [Android Tests](./android/android-tests.md#render-tests) and [iOS Tests](./ios/ios-tests.md#render-tests) for some platform-specific information on the render tests. + +Render tests verify the correctness and consistency of MapLibre Native's rendering. Note that 'render test' is a bit of a misnomer, because there are various types of tests that do not really test rendering behavior that we sometimes call render tests. Examples are [expression tests and query tests](#metricsintergration). In addition, these 'render tests' allow a wide variety of operations and probes (which write out metrics) for things like GPU memory allocations, memory usage, network requests, FPS, so these tests are really quite a bit more versatile than just verifying rendering behavior. + +## Render Test Runner CLI Options + +When using CMake, the render test runner is an executable available as `mbgl-render-test-runner` in the build directory. + +| Option / Argument | Description | Required? | +| :------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------- | +| `-h`, `--help` | Display the help menu and exit. | No | +| `-r`, `--recycle-map` | Toggle reusing the map object between tests. If set, the map object is reused; otherwise, it's reset for each test. | No | +| `-s`, `--shuffle` | Toggle shuffling the order of tests based on the manifest file. | No | +| `-o`, `--online` | Toggle online mode. If set, tests can make network requests. By default (`--online` not specified), tests run in offline mode, forcing resource loading from the cache only. | No | +| `--seed ` | Set the seed for shuffling tests. Only relevant if `--shuffle` is also used. Defaults to `1` if `--shuffle` is used without `--seed`. | No | +| `-p`, `--manifestPath ` | Specifies the path to the test manifest JSON file, which defines test configurations, paths, and potentially filters/ignores. | Yes | +| `-f`, `--filter ` | Provides a regular expression used to filter which tests (based on their path/ID) should be run. Only tests matching the regex will be executed. | No | +| `-u`, `--update default \| platform \| metrics \| rebaseline` | Sets the mode for updating test expectation results:
- `default`: Updates generic render test expectation images/JSON.
- `platform`: Updates platform-specific render test expectation images/JSON.
- `metrics`: Updates expected metrics for the configuration defined by the manifest.
- `rebaseline`: Updates or creates expected metrics for the configuration defined by the manifest. | No | + + +## Source Code Organization + +### `render-test` + +This directory contains the C++ source code for common render test runner, manifest parser and CLI tool. + +- `render-test/android`: standalone Gradle project with a app that runs the render test runner. +- `render-tests/ios`: source code for Objective-C app that encapsulates the render test runner. +property: `background-color`, `line-width`, etc., with a second level of directories below that for individual tests. + +### `metrics` + +The JSON files in this directory are the manifests (to be passed to render test CLI tool). This directory also contains many directories that store metrics used by the tests. Other files/directories include: + +- `cache-style.db`, `cache-metrics.db`: pre-populated cache (SQLite database file) so the tests can run offline. You may need to update this database when you need a new resource available during test executation. +- `binary-size`: binary-size checks. Not used right now, see [#3379](https://github.com/maplibre/maplibre-native/issues/3379). +- `expectations`: expectations for various platforms. E.g. `expectations/platform-android` is referenced by the `android-render-test-runner-metrics.json` manifest under its `expectation_paths` key. +- `ignores`: contains JSON files with as key a test path and as value a reason why a test is ignored. For example: + ``` + { + "expression-tests/collator/accent-equals-de": "Locale-specific behavior changes based on platform." + } + ``` + Manifests can have a key `ignore_paths` with an array of ignore files. For example: + ``` + { + ... + "ignore_paths": [ + "ignores/platform-all.json", + "ignores/platform-linux.json", + "ignores/platform-android.json" + ], + ... + } + ``` + +#### `metrics/intergration` + +- `data`, `geojson`, `glyphs`, `image`, `sprites`, `styles`, `tiles`, `tilesets`, `video`: various data used by the render tests. +- `expression-tests`: tests that verify the behavior of [expressions](https://maplibre.org/maplibre-style-spec/expressions/) of the MapLibre Style Spec. +- `query-tests`: these tests test the behavior of the `queryRenderedFeatures` API which, as the name suggests, allow you to query the rendered features. +- `render-tests`: location of render tests. Each render test contains a `style.json` and an `expected.png` image. This directory tree is generally organized by [style specification](https://maplibre.org/maplibre-style-spec/) properties. + +## Running tests + +To run the entire integration test suite (both render or query tests), from within the maplibre-native directory on Linux run the command: + +``` +./build/mbgl-render-test-runner --manifestPath metrics/linux-clang8-release-style.json +``` + +### Running specific tests + +To run a subset of tests or an individual test, you can pass a specific subdirectory to the `mbgl-render-test-runner` executable. For example, to run all the tests for a given property, e.g. `circle-radius`: + +``` +$ build-macos-vulkan/mbgl-render-test-runner --manifestPath=metrics/macos-xcode11-release-style.json -f 'circle-radius/.*' +* passed query-tests/circle-radius/feature-state +* passed query-tests/circle-radius/zoom-and-property-function +* passed query-tests/circle-radius/property-function +* passed query-tests/circle-radius/outside +* passed query-tests/circle-radius/tile-boundary +* passed query-tests/circle-radius/inside +* passed query-tests/circle-radius/multiple-layers +* passed render-tests/circle-radius/zoom-and-property-function +* passed render-tests/circle-radius/literal +* passed render-tests/circle-radius/property-function +* passed render-tests/circle-radius/default +* passed render-tests/circle-radius/function +* passed render-tests/circle-radius/antimeridian +13 passed (100.0%) +Results at: /Users/bart/src/maplibre-native/metrics/macos-xcode11-release-style.html +``` + +## Writing new tests + +To add a new render test: + +1. Create a new directory `test/integration/render-tests//` + +2. Create a new `style.json` file within that directory, specifying the map to load. Feel free to copy & modify one of the existing `style.json` files from the `render-tests` subdirectories. + +3. Generate an `expected.png` image from the given style with + ``` + $ ./build/mbgl-render-test-runner --update default --manifestPath=... -f '/' + ``` + +4. Manually inspect `expected.png` to verify it looks as expected. + +5. Commit the new `style.json` and `expected.png`. diff --git a/metrics/benchmark/android/results.json b/metrics/benchmark/android/results.json deleted file mode 100644 index b665964ed483..000000000000 --- a/metrics/benchmark/android/results.json +++ /dev/null @@ -1,12730 +0,0 @@ -{ - "context": { - "date": "2020-04-14 05:31:45", - "host_name": "localhost", - "executable": "mbgl-benchmark-runner", - "num_cpus": 8, - "mhz_per_cpu": 1786, - "cpu_scaling_enabled": true, - "caches": [ - ], - "load_avg": [], - "library_build_type": "release" - }, - "benchmarks": [ - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 542, - "real_time": 1.3001846309963122e+06, - "cpu_time": 1.2949752250922513e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 542, - "real_time": 1.3004844464944445e+06, - "cpu_time": 1.2957834280442805e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 542, - "real_time": 1.3011362564575486e+06, - "cpu_time": 1.2965168800738005e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 542, - "real_time": 1.3061507675277004e+06, - "cpu_time": 1.3010303985239856e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 542, - "real_time": 1.3021177693726874e+06, - "cpu_time": 1.2979960701107013e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 542, - "real_time": 1.2973089981549864e+06, - "cpu_time": 1.2937071346863471e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 542, - "real_time": 1.2966989870848884e+06, - "cpu_time": 1.2927301549815484e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 542, - "real_time": 1.3207135387453425e+06, - "cpu_time": 1.3149704298892983e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 542, - "real_time": 1.2962354261992963e+06, - "cpu_time": 1.2923050147601466e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 542, - "real_time": 1.3026234188191602e+06, - "cpu_time": 1.2979141881918814e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_mean", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.3023654239852368e+06, - "cpu_time": 1.2977928924354243e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_median", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.3008103514759964e+06, - "cpu_time": 1.2961501540590404e+06, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_stddev", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.1193604932368562e+03, - "cpu_time": 6.5967345854087107e+03, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 694, - "real_time": 1.0070068847262332e+06, - "cpu_time": 1.0036449265129681e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 694, - "real_time": 1.0080210835734867e+06, - "cpu_time": 1.0043626873198848e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 694, - "real_time": 1.0058978242075139e+06, - "cpu_time": 1.0023086887608076e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 694, - "real_time": 1.0009189121037154e+06, - "cpu_time": 9.9756139337175793e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 694, - "real_time": 1.0046392694524360e+06, - "cpu_time": 1.0009585965417859e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 694, - "real_time": 1.0063067622478218e+06, - "cpu_time": 1.0024510965417884e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 694, - "real_time": 1.0059380504323139e+06, - "cpu_time": 1.0023789438040353e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 694, - "real_time": 1.0072651253602230e+06, - "cpu_time": 1.0032737550432266e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 694, - "real_time": 1.0091842536023057e+06, - "cpu_time": 1.0049742089337171e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 694, - "real_time": 1.0052283213256488e+06, - "cpu_time": 1.0010099005763667e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_mean", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0060406487031698e+06, - "cpu_time": 1.0022924197406338e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_median", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0061224063400679e+06, - "cpu_time": 1.0024150201729119e+06, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_stddev", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.2409074600738109e+03, - "cpu_time": 2.1110759323262982e+03, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 2.4145962613999984e+08, - "cpu_time": 2.4073118172000000e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 2.4176459284000030e+08, - "cpu_time": 2.4093767262000000e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 2.4134377508000058e+08, - "cpu_time": 2.4060890488000000e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 2.4201570016000003e+08, - "cpu_time": 2.4120336746000007e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 2.4185170429999968e+08, - "cpu_time": 2.4110385914000005e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 2.4179851053999981e+08, - "cpu_time": 2.4097665861999986e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 2.4176306262000027e+08, - "cpu_time": 2.4105083212000012e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 2.4068361564000043e+08, - "cpu_time": 2.3996802870000011e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 2.4142470320000032e+08, - "cpu_time": 2.4061873123999989e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 2.4151811259999931e+08, - "cpu_time": 2.4080681369999981e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_mean", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.4156234031200010e+08, - "cpu_time": 2.4080060501999998e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_median", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.4164058760999981e+08, - "cpu_time": 2.4087224315999994e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_stddev", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.7677235269606428e+05, - "cpu_time": 3.5503444737776450e+05, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6289545782973329e+02, - "cpu_time": 4.6181732289355864e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1523787, - "real_time": 4.5449632396131506e+02, - "cpu_time": 4.5338555585525319e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1523787, - "real_time": 4.5320995257214088e+02, - "cpu_time": 4.5209434914459854e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1523787, - "real_time": 4.5241150239502269e+02, - "cpu_time": 4.5127103131868444e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6398372082187365e+02, - "cpu_time": 4.6291432135855388e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6147779971875502e+02, - "cpu_time": 4.6039272221117926e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6375666152817240e+02, - "cpu_time": 4.6255926714166071e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6894036174349617e+02, - "cpu_time": 4.6790408633227617e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1523787, - "real_time": 4.6388924633166397e+02, - "cpu_time": 4.6281701313897076e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1523787, - "real_time": 4.5028539159343001e+02, - "cpu_time": 4.4923642346337510e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_mean", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.5953464184956039e+02, - "cpu_time": 4.5843920928581110e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_median", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.6218662877424424e+02, - "cpu_time": 4.6110502255236895e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_stddev", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.3403026122339110e+00, - "cpu_time": 6.3495331293539063e+00, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 87, - "real_time": 7.7255617126438823e+06, - "cpu_time": 7.6927227011494860e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 87, - "real_time": 7.7729455747123528e+06, - "cpu_time": 7.7342685517242011e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 87, - "real_time": 7.7627079080460016e+06, - "cpu_time": 7.7286379655172415e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 87, - "real_time": 7.9196278160917694e+06, - "cpu_time": 7.8843435287355678e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 87, - "real_time": 7.7557562758622076e+06, - "cpu_time": 7.7213180804595519e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 87, - "real_time": 7.7883945747120818e+06, - "cpu_time": 7.7522587931034444e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 87, - "real_time": 7.7601240919542424e+06, - "cpu_time": 7.7202408275861647e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 87, - "real_time": 7.7709873678159779e+06, - "cpu_time": 7.7359907701149452e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 87, - "real_time": 7.7970038850574791e+06, - "cpu_time": 7.7616804022989208e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 87, - "real_time": 7.7386465977012413e+06, - "cpu_time": 7.7001047471266314e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_mean", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.7791755804597242e+06, - "cpu_time": 7.7431566367816161e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_median", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.7668476379309911e+06, - "cpu_time": 7.7314532586207213e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_stddev", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.3681344922577169e+04, - "cpu_time": 5.3851607872457884e+04, - "time_unit": "ns" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.7789109059999646e+01, - "cpu_time": 1.2383279919999950e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.7669365299999527e+01, - "cpu_time": 1.2096192979999500e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.7649681959999270e+01, - "cpu_time": 1.2155427220000092e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.8088299720000123e+01, - "cpu_time": 1.2519332619999659e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.8967650839999806e+01, - "cpu_time": 1.3346423139999501e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.8681426859999419e+01, - "cpu_time": 1.3242065520000210e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.7962620539999534e+01, - "cpu_time": 1.2508220039999856e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.8580783099999962e+01, - "cpu_time": 1.3037638499999957e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.7099339200000259e+01, - "cpu_time": 1.1909721999999761e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.7582168400000455e+01, - "cpu_time": 1.2317223079999735e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_mean", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8007044497999804e+01, - "cpu_time": 1.2551552501999824e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_median", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7875864799999590e+01, - "cpu_time": 1.2445749979999905e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.7821446263202692e-01, - "cpu_time": 4.9522866168331053e-01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.7812266359999285e+01, - "cpu_time": 1.2484138180000173e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.6877900640000689e+01, - "cpu_time": 1.1853626099999701e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.7142576720000307e+01, - "cpu_time": 1.1985387480000327e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.8307111200000463e+01, - "cpu_time": 1.3047988519999763e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.8410689340000772e+01, - "cpu_time": 1.3018278620000387e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.7142044400000032e+01, - "cpu_time": 1.2079055200000539e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.7082720459999337e+01, - "cpu_time": 1.2094485719999852e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.8113051800000903e+01, - "cpu_time": 1.2685799660000043e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.7325546499999973e+01, - "cpu_time": 1.2312865439999996e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.9690085299999964e+01, - "cpu_time": 1.4412834660000158e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_mean", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.7790399272000172e+01, - "cpu_time": 1.2597445958000096e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_median", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7568906429999632e+01, - "cpu_time": 1.2398501810000084e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.6632878453700413e-01, - "cpu_time": 7.6208322015687346e-01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.9209683580000049e+02, - "cpu_time": 1.7919702895999987e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.9434060685999953e+02, - "cpu_time": 1.8113857171999996e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.9219690039999932e+02, - "cpu_time": 1.7872124648000010e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.9345990884000003e+02, - "cpu_time": 1.7939599508000015e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.9705894149999949e+02, - "cpu_time": 1.8356412954000007e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.9300370464000025e+02, - "cpu_time": 1.7991491454000027e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.9385111929999991e+02, - "cpu_time": 1.7988164899999958e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.9428564330000086e+02, - "cpu_time": 1.8146514178000018e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.9201925141999934e+02, - "cpu_time": 1.7876825022000048e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.8990533869999922e+02, - "cpu_time": 1.7692719141999987e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_mean", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.9322182507599987e+02, - "cpu_time": 1.7989741187400008e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_median", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.9323180674000017e+02, - "cpu_time": 1.7963882203999987e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8964426555379319e+00, - "cpu_time": 1.8155551254807958e+00, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 2.1921255829999950e+02, - "cpu_time": 1.9994558957999973e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 2.1449207554000168e+02, - "cpu_time": 1.9462064330000089e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 2.1199722528000166e+02, - "cpu_time": 1.9200866796000014e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 2.1575958295999953e+02, - "cpu_time": 1.9525256924000018e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 2.1861811448000026e+02, - "cpu_time": 1.9798148667999953e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 2.1376657754000007e+02, - "cpu_time": 1.9455509280000001e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 2.1343052751999949e+02, - "cpu_time": 1.9581755590000060e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 2.1391828381999858e+02, - "cpu_time": 1.9238752218000059e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 2.1505945164000192e+02, - "cpu_time": 1.9482907046000037e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 2.1371326400000041e+02, - "cpu_time": 1.9386298248000003e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_mean", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.1499676610800034e+02, - "cpu_time": 1.9512611805800023e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_median", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.1420517968000013e+02, - "cpu_time": 1.9472485688000063e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_stddev", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.2973853144032863e+00, - "cpu_time": 2.3888220655177914e+00, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 4.1137553576000073e+02, - "cpu_time": 3.7812643261999938e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 4.2504562255999872e+02, - "cpu_time": 3.9164846947999990e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 4.1045170339999908e+02, - "cpu_time": 3.7697201081999992e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 4.4227364824000006e+02, - "cpu_time": 4.1242874302000018e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 4.3198871595999890e+02, - "cpu_time": 3.9778372111999937e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 4.1849166878000005e+02, - "cpu_time": 3.8535378329999958e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 4.2627178411999921e+02, - "cpu_time": 3.9257124251999926e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 3.9992617318000157e+02, - "cpu_time": 3.6759742415999995e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 4.4024515635999933e+02, - "cpu_time": 4.0663793356000036e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 4.2536896216000059e+02, - "cpu_time": 3.9281590353999940e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_mean", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.2314389705199983e+02, - "cpu_time": 3.9019356641399980e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_median", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.2520729235999971e+02, - "cpu_time": 3.9210985599999958e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_stddev", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.3396825747549888e+01, - "cpu_time": 1.3709331259615922e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 4.5561125360000005e+01, - "cpu_time": 3.9987191559998791e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 4.5467226420000770e+01, - "cpu_time": 3.9880224379999163e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 4.7515055780002058e+01, - "cpu_time": 4.2004399760000979e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 4.6160786880000160e+01, - "cpu_time": 4.0670317379999688e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 4.7151598439997997e+01, - "cpu_time": 4.1600275559999318e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 4.7235363019999568e+01, - "cpu_time": 4.1707446860000346e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 4.6668051520000517e+01, - "cpu_time": 4.1006294940000316e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 4.6531860900001902e+01, - "cpu_time": 4.0945122400000855e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 4.6208288980001271e+01, - "cpu_time": 4.0800289080000312e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 4.6779144260001431e+01, - "cpu_time": 4.1233131039998625e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_mean", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.6527850156000575e+01, - "cpu_time": 4.0983469295999839e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_median", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.6599956210001217e+01, - "cpu_time": 4.0975708670000586e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_stddev", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.8664780622797106e-01, - "cpu_time": 6.9542574966267801e-01, - "time_unit": "ms" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 121345, - "real_time": 5.7448817175391005e+03, - "cpu_time": 5.7838302852601209e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 121345, - "real_time": 5.7607109480848530e+03, - "cpu_time": 5.7993797108879498e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 121345, - "real_time": 5.7313321851484588e+03, - "cpu_time": 5.7692626643654030e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 121345, - "real_time": 5.7309784908726488e+03, - "cpu_time": 5.7669271170146594e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 121345, - "real_time": 5.7351900861780787e+03, - "cpu_time": 5.7728665542194085e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 121345, - "real_time": 5.7406290989362487e+03, - "cpu_time": 5.7819066134736040e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 121345, - "real_time": 5.7472770528704114e+03, - "cpu_time": 5.7810616012463306e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 121345, - "real_time": 5.7537566855475652e+03, - "cpu_time": 5.7854090401479598e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 121345, - "real_time": 5.7504858874737783e+03, - "cpu_time": 5.7804537474834488e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 121345, - "real_time": 5.7452123368336697e+03, - "cpu_time": 5.7767376898978355e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_mean", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.7440454489484819e+03, - "cpu_time": 5.7797835023996722e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_median", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.7450470271863860e+03, - "cpu_time": 5.7807576743648897e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_stddev", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.7096276939678692e+00, - "cpu_time": 9.2599538237735182e+00, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 105352, - "real_time": 6.5661522614126479e+03, - "cpu_time": 6.5985449543514542e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 105352, - "real_time": 6.5537263557245642e+03, - "cpu_time": 6.5859618519298010e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 105352, - "real_time": 6.5595680198872815e+03, - "cpu_time": 6.5914043774574639e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 105352, - "real_time": 6.5522584292299034e+03, - "cpu_time": 6.5837948502742538e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 105352, - "real_time": 6.5493210668252941e+03, - "cpu_time": 6.5773600503204489e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 105352, - "real_time": 6.5678592339918459e+03, - "cpu_time": 6.5996440789197650e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 105352, - "real_time": 6.5596813354838241e+03, - "cpu_time": 6.5954876603044668e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 105352, - "real_time": 6.5733316310889923e+03, - "cpu_time": 6.6082716701873233e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 105352, - "real_time": 6.5815775396517010e+03, - "cpu_time": 6.6140604256836532e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 105352, - "real_time": 6.5721897734133081e+03, - "cpu_time": 6.6074754536713626e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_mean", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.5635665646709367e+03, - "cpu_time": 6.5962005373099992e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_median", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.5629167984482365e+03, - "cpu_time": 6.5970163073279600e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_stddev", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0424040178070438e+01, - "cpu_time": 1.1768002344963804e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 85716, - "real_time": 8.1313688579065110e+03, - "cpu_time": 8.1658421764555242e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 85716, - "real_time": 8.0679632972104882e+03, - "cpu_time": 8.1036390755068023e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 85716, - "real_time": 8.0604544192523099e+03, - "cpu_time": 8.0939498108954531e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 85716, - "real_time": 8.0548142586409795e+03, - "cpu_time": 8.0928125205150727e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 85716, - "real_time": 8.0444197233770637e+03, - "cpu_time": 8.0862883474681548e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 85716, - "real_time": 8.0462629031090728e+03, - "cpu_time": 8.0836740631163202e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 85716, - "real_time": 8.0583256452403875e+03, - "cpu_time": 8.0941784382469432e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 85716, - "real_time": 8.0643291333676598e+03, - "cpu_time": 8.0962898408288893e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 85716, - "real_time": 8.0608248866454414e+03, - "cpu_time": 8.0973373815997074e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 85716, - "real_time": 8.0609571258206415e+03, - "cpu_time": 8.0951912710758361e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_mean", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.0649720250570563e+03, - "cpu_time": 8.1009202925708696e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_median", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.0606396529488748e+03, - "cpu_time": 8.0946848546613892e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_stddev", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.4475407834056288e+01, - "cpu_time": 2.3477282730284934e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 73818, - "real_time": 9.4071333008242909e+03, - "cpu_time": 9.4446403857056066e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 73818, - "real_time": 9.3962566718281232e+03, - "cpu_time": 9.4260385270766892e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 73818, - "real_time": 9.4033065919252585e+03, - "cpu_time": 9.4372519980170437e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 73818, - "real_time": 9.4020930666624172e+03, - "cpu_time": 9.4349738816272711e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 73818, - "real_time": 9.4351160284673806e+03, - "cpu_time": 9.4685246823270463e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 73818, - "real_time": 9.3937994120616167e+03, - "cpu_time": 9.4282421361950601e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 73818, - "real_time": 9.3982008861930317e+03, - "cpu_time": 9.4268997802093272e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 73818, - "real_time": 9.4201797259062569e+03, - "cpu_time": 9.4523196917591049e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 73818, - "real_time": 9.3872462543085494e+03, - "cpu_time": 9.4230545259712471e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 73818, - "real_time": 9.4076968353563007e+03, - "cpu_time": 9.4427541793573710e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_mean", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.4051028773533235e+03, - "cpu_time": 9.4384699788245780e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_median", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.4026998292938388e+03, - "cpu_time": 9.4361129398221565e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_stddev", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.3839386585416658e+01, - "cpu_time": 1.4125979451162689e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 63917, - "real_time": 1.1026688517998004e+04, - "cpu_time": 1.1054937919513226e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 63917, - "real_time": 1.0949969147211224e+04, - "cpu_time": 1.0981337922379995e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 63917, - "real_time": 1.0884512242486473e+04, - "cpu_time": 1.0913754619659696e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 63917, - "real_time": 1.0882143701593814e+04, - "cpu_time": 1.0913419966397754e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 63917, - "real_time": 1.0906632695688639e+04, - "cpu_time": 1.0934851479190014e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 63917, - "real_time": 1.0895391366972461e+04, - "cpu_time": 1.0923731386512804e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 63917, - "real_time": 1.0890546349241780e+04, - "cpu_time": 1.0917354709872227e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 63917, - "real_time": 1.0905753712088803e+04, - "cpu_time": 1.0936906847889759e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 63917, - "real_time": 1.0964411174048144e+04, - "cpu_time": 1.0994929659040488e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 63917, - "real_time": 1.0944483892997847e+04, - "cpu_time": 1.0971663767072207e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_mean", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0925053280032722e+04, - "cpu_time": 1.0954288827752820e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_median", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0906193203888723e+04, - "cpu_time": 1.0935879163539888e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_stddev", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.6120941051623120e+01, - "cpu_time": 4.6075511394221756e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 57000, - "real_time": 1.2256375859862057e+04, - "cpu_time": 1.2282299859720570e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 57000, - "real_time": 1.2243010017440165e+04, - "cpu_time": 1.2266948333843318e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 57000, - "real_time": 1.2240518070255173e+04, - "cpu_time": 1.2262581034918727e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 57000, - "real_time": 1.2240515631622640e+04, - "cpu_time": 1.2264830754584742e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 57000, - "real_time": 1.2272946123389056e+04, - "cpu_time": 1.2296355403194819e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 57000, - "real_time": 1.2242509403689071e+04, - "cpu_time": 1.2264894052723401e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 57000, - "real_time": 1.2246247087420526e+04, - "cpu_time": 1.2269385859577884e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 57000, - "real_time": 1.2268978999945270e+04, - "cpu_time": 1.2291604403258771e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 57000, - "real_time": 1.2259552263693669e+04, - "cpu_time": 1.2286032824237593e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 57000, - "real_time": 1.2219163421401678e+04, - "cpu_time": 1.2244095508712984e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_mean", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.2248981687871930e+04, - "cpu_time": 1.2272902803477280e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_median", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.2244628552430342e+04, - "cpu_time": 1.2268167096710600e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_stddev", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.5839692789877489e+01, - "cpu_time": 1.5895485669012178e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50741, - "real_time": 1.3751248950377782e+04, - "cpu_time": 1.3772590705514507e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50741, - "real_time": 1.3743219782950535e+04, - "cpu_time": 1.3765232356545681e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50741, - "real_time": 1.3700657220133739e+04, - "cpu_time": 1.3724722019520756e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50741, - "real_time": 1.3709178435184454e+04, - "cpu_time": 1.3731625963252260e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50741, - "real_time": 1.3744022585377057e+04, - "cpu_time": 1.3764378037636989e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50741, - "real_time": 1.3794113911991533e+04, - "cpu_time": 1.3819972822763162e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50741, - "real_time": 1.3755782759378953e+04, - "cpu_time": 1.3775433456125764e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50741, - "real_time": 1.3730187599666750e+04, - "cpu_time": 1.3753952326466828e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50741, - "real_time": 1.3735805246151494e+04, - "cpu_time": 1.3757268737506263e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50741, - "real_time": 1.3759708381461662e+04, - "cpu_time": 1.3783441812267818e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_mean", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.3742392487267396e+04, - "cpu_time": 1.3764861823760006e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_median", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.3743621184163796e+04, - "cpu_time": 1.3764805197091333e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_stddev", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.6401558742631142e+01, - "cpu_time": 2.6763995195933568e+01, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6685913070015820e+02, - "cpu_time": 1.6651577182392163e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6657928925150179e+02, - "cpu_time": 1.6622950934008037e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6678067790897705e+02, - "cpu_time": 1.6642501849544237e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6578952858295077e+02, - "cpu_time": 1.6544211523061287e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6645692348268460e+02, - "cpu_time": 1.6611223612462064e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6641537873039715e+02, - "cpu_time": 1.6606509441956078e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6559091662153378e+02, - "cpu_time": 1.6522104999815926e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6694034852356899e+02, - "cpu_time": 1.6660461490926798e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6571602219070547e+02, - "cpu_time": 1.6537691678910926e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 4201036, - "real_time": 1.6655568388370284e+02, - "cpu_time": 1.6620855331873975e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_mean", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.6636838998761809e+02, - "cpu_time": 1.6602008804495148e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_median", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.6650630368319372e+02, - "cpu_time": 1.6616039472168021e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_stddev", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.9358969372571571e-01, - "cpu_time": 4.9748474603759235e-01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3490870856258482e+02, - "cpu_time": 2.3439383703171703e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3048002222851323e+02, - "cpu_time": 2.2998899292357092e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2976358, - "real_time": 2.2999472207308034e+02, - "cpu_time": 2.2949184305112723e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2976358, - "real_time": 2.2997218345374213e+02, - "cpu_time": 2.2947225938545557e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3032690590312185e+02, - "cpu_time": 2.2980714954315209e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3131755991719655e+02, - "cpu_time": 2.3082486750584650e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3030076220671108e+02, - "cpu_time": 2.2980115160878799e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2976358, - "real_time": 2.2883322503541245e+02, - "cpu_time": 2.2829875606360315e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3001237855121329e+02, - "cpu_time": 2.2947149670839127e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2976358, - "real_time": 2.3031159423699640e+02, - "cpu_time": 2.2979246515373103e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_mean", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3064580621685724e+02, - "cpu_time": 2.3013428189753830e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_median", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3030617822185377e+02, - "cpu_time": 2.2979680838125955e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_stddev", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.6175387179535594e+00, - "cpu_time": 1.6205656808712656e+00, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6251630391394002e+02, - "cpu_time": 2.6194806743230430e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6217936048222879e+02, - "cpu_time": 2.6163500462335344e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6368816883491763e+02, - "cpu_time": 2.6310687715307478e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6609309855885255e+02, - "cpu_time": 2.6552526912693924e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6643960803291293e+02, - "cpu_time": 2.6589445943915126e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6482690530922611e+02, - "cpu_time": 2.6429109412032091e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6496804697485317e+02, - "cpu_time": 2.6443315108549933e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6411534123769030e+02, - "cpu_time": 2.6356534702855964e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6554126100689751e+02, - "cpu_time": 2.6500485611018559e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2667979, - "real_time": 2.6488980423012299e+02, - "cpu_time": 2.6433788834169553e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_mean", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.6452578985816422e+02, - "cpu_time": 2.6397420144610840e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_median", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.6485835476967452e+02, - "cpu_time": 2.6431449123100822e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_stddev", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4135435450270313e+00, - "cpu_time": 1.4179503527218578e+00, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2494777, - "real_time": 2.7972440743198291e+02, - "cpu_time": 2.7914469429533574e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8249143831294811e+02, - "cpu_time": 2.8188942418499636e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8066159460343459e+02, - "cpu_time": 2.8008645301767524e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8058633296682075e+02, - "cpu_time": 2.8000259822821056e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2494777, - "real_time": 2.7920876735675682e+02, - "cpu_time": 2.7862930354099723e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8051244940929843e+02, - "cpu_time": 2.7991157165551795e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8059913050343789e+02, - "cpu_time": 2.8000617570225916e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8176661160495752e+02, - "cpu_time": 2.8114186879231227e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8014633051370578e+02, - "cpu_time": 2.7952315056616675e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2494777, - "real_time": 2.8036731299032647e+02, - "cpu_time": 2.7971628125481175e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_mean", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.8060643756936690e+02, - "cpu_time": 2.8000515212382828e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_median", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.8054939118805953e+02, - "cpu_time": 2.7995708494186420e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_stddev", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.3760353564678756e-01, - "cpu_time": 9.3137291567814628e-01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8305527550640545e+02, - "cpu_time": 2.8246553246097790e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8106012534525246e+02, - "cpu_time": 2.8048557063807652e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8275762180468195e+02, - "cpu_time": 2.8216400217238407e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8236036076805732e+02, - "cpu_time": 2.8176905571329672e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8135296044833746e+02, - "cpu_time": 2.8078726834199324e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8284045756464303e+02, - "cpu_time": 2.8224664969013213e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8316112006484218e+02, - "cpu_time": 2.8257171745735081e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8180349842037066e+02, - "cpu_time": 2.8113016864895820e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8223784916918646e+02, - "cpu_time": 2.8163808483234726e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2496784, - "real_time": 2.8231711753999213e+02, - "cpu_time": 2.8169815050079433e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_mean", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.8229463866317690e+02, - "cpu_time": 2.8169562004563119e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_median", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.8233873915402472e+02, - "cpu_time": 2.8173360310704550e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_stddev", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.0723872768730334e-01, - "cpu_time": 7.0719276464088598e-01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8727598318804536e+02, - "cpu_time": 2.8670849173369072e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8798993241314054e+02, - "cpu_time": 2.8740112991573613e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8694839281486719e+02, - "cpu_time": 2.8637198834531762e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8822667122104843e+02, - "cpu_time": 2.8763481867203183e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8797363529950314e+02, - "cpu_time": 2.8734419220526274e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8699655963017051e+02, - "cpu_time": 2.8638570313379648e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8793822447432598e+02, - "cpu_time": 2.8727015053253422e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8776554453272610e+02, - "cpu_time": 2.8707101496645834e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8681035575882515e+02, - "cpu_time": 2.8611687673401900e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2441598, - "real_time": 2.8745361193776245e+02, - "cpu_time": 2.8677535327269555e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_mean", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.8753789112704146e+02, - "cpu_time": 2.8690797195115425e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_median", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.8760957823524421e+02, - "cpu_time": 2.8692318411957689e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_stddev", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.0840488020265129e-01, - "cpu_time": 5.1238117867414323e-01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9087074731773259e+02, - "cpu_time": 2.9025082843650137e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9175782412266051e+02, - "cpu_time": 2.9113267506214351e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9315077503177292e+02, - "cpu_time": 2.9252914744840865e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9359678609750262e+02, - "cpu_time": 2.9296832951045241e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9375944326410672e+02, - "cpu_time": 2.9311452865358257e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9282874334719901e+02, - "cpu_time": 2.9220204812062076e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9200081641215098e+02, - "cpu_time": 2.9136856510483898e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9355957735641181e+02, - "cpu_time": 2.9288816480167384e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9182103407782807e+02, - "cpu_time": 2.9113340315753317e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2411772, - "real_time": 2.9255372481310661e+02, - "cpu_time": 2.9187594888735174e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_mean", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.9258994718404722e+02, - "cpu_time": 2.9194636391831074e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_median", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.9269123408015287e+02, - "cpu_time": 2.9203899850398631e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_stddev", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.5921676923539800e-01, - "cpu_time": 9.5671123863179341e-01, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 68204, - "real_time": 1.0116015424485215e+04, - "cpu_time": 1.0171511890908791e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 68204, - "real_time": 1.0124530452475097e+04, - "cpu_time": 1.0186845434271856e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 68204, - "real_time": 1.0077579203392474e+04, - "cpu_time": 1.0143474840275410e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 68204, - "real_time": 1.0092978828081734e+04, - "cpu_time": 1.0155424198378469e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 68204, - "real_time": 1.0047997434435072e+04, - "cpu_time": 1.0107206248884753e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 68204, - "real_time": 1.0051797431239278e+04, - "cpu_time": 1.0105382836899200e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 68204, - "real_time": 1.0057060568132163e+04, - "cpu_time": 1.0109336402788575e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 68204, - "real_time": 1.0057951556984035e+04, - "cpu_time": 1.0114436792526065e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 68204, - "real_time": 1.0110457465843341e+04, - "cpu_time": 1.0172037299818270e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 68204, - "real_time": 1.0117177936670218e+04, - "cpu_time": 1.0177954298927405e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_mean", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0085354630173864e+04, - "cpu_time": 1.0144361024367881e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_median", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0085279015737104e+04, - "cpu_time": 1.0149449519326939e+04, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_stddev", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.0385336836553318e+01, - "cpu_time": 3.2628750625191195e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 40250, - "real_time": 1.7388144372983770e+04, - "cpu_time": 1.7426242906299616e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 40250, - "real_time": 1.7365967205407615e+04, - "cpu_time": 1.7403179105707557e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 40250, - "real_time": 1.7375916273420626e+04, - "cpu_time": 1.7412527453416260e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 40250, - "real_time": 1.7385498334917756e+04, - "cpu_time": 1.7426815080276774e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 40250, - "real_time": 1.7549509863555111e+04, - "cpu_time": 1.7604416223924130e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 40250, - "real_time": 1.7513961863424691e+04, - "cpu_time": 1.7563600745273543e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 40250, - "real_time": 1.7438700223558484e+04, - "cpu_time": 1.7488834559148163e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 40250, - "real_time": 1.7387773565438150e+04, - "cpu_time": 1.7434083602370687e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 40250, - "real_time": 1.7316132720357895e+04, - "cpu_time": 1.7362698807746205e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 40250, - "real_time": 1.7357041664725679e+04, - "cpu_time": 1.7403388323219355e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_mean", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.7407864608778978e+04, - "cpu_time": 1.7452578680738232e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_median", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7386635950177955e+04, - "cpu_time": 1.7426528993288193e+04, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_stddev", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.2523887442508283e+01, - "cpu_time": 7.6693424871049316e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 17586, - "real_time": 4.0107557716601688e+04, - "cpu_time": 4.0103824406254724e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 17586, - "real_time": 4.0019467758547144e+04, - "cpu_time": 4.0012237745658975e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 17586, - "real_time": 3.9881505913795867e+04, - "cpu_time": 3.9868933412666287e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 17586, - "real_time": 3.9576482372856495e+04, - "cpu_time": 3.9568838679010609e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 17586, - "real_time": 3.9553965881952274e+04, - "cpu_time": 3.9541601785707695e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 17586, - "real_time": 3.9674759808775438e+04, - "cpu_time": 3.9664187081236858e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 17586, - "real_time": 3.9866073808920461e+04, - "cpu_time": 3.9861851074939936e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 17586, - "real_time": 3.9677523654762415e+04, - "cpu_time": 3.9670658990107004e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 17586, - "real_time": 3.9727634823814682e+04, - "cpu_time": 3.9722147730725374e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 17586, - "real_time": 3.9759308199516607e+04, - "cpu_time": 3.9752739167688793e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_mean", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.9784427993954305e+04, - "cpu_time": 3.9776702007399632e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_median", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.9743471511665652e+04, - "cpu_time": 3.9737443449207080e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_stddev", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8239546578343538e+02, - "cpu_time": 1.8384097539098224e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 9519, - "real_time": 7.3246144342528307e+04, - "cpu_time": 7.3142953986898065e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 9519, - "real_time": 7.3172687992620849e+04, - "cpu_time": 7.3076238890461333e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 9519, - "real_time": 7.3569472213678077e+04, - "cpu_time": 7.3476595230426261e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 9519, - "real_time": 7.3587849039461158e+04, - "cpu_time": 7.3486626851767665e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 9519, - "real_time": 7.2756297720456903e+04, - "cpu_time": 7.2681063242803764e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 9519, - "real_time": 7.3038745246204548e+04, - "cpu_time": 7.2952434709217632e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 9519, - "real_time": 7.3123430822262308e+04, - "cpu_time": 7.3021104107606792e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 9519, - "real_time": 7.3136718353100194e+04, - "cpu_time": 7.3024447210512706e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 9519, - "real_time": 7.3038921840272684e+04, - "cpu_time": 7.2946082676663078e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 9519, - "real_time": 7.2984062926728860e+04, - "cpu_time": 7.2866183737230545e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_mean", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.3165433049731393e+04, - "cpu_time": 7.3067373064358791e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_median", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.3130074587681243e+04, - "cpu_time": 7.3022775659059742e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_stddev", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.5455414336389532e+02, - "cpu_time": 2.5180363837259975e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 5973, - "real_time": 1.1742591578778955e+05, - "cpu_time": 1.1718778369363770e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 5973, - "real_time": 1.1739638941860697e+05, - "cpu_time": 1.1715435225253610e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 5973, - "real_time": 1.1721581717713499e+05, - "cpu_time": 1.1697904537148227e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 5973, - "real_time": 1.1659965059336927e+05, - "cpu_time": 1.1637682789282962e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 5973, - "real_time": 1.1681554595706826e+05, - "cpu_time": 1.1656492265205804e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 5973, - "real_time": 1.1673057425106014e+05, - "cpu_time": 1.1650868290596591e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 5973, - "real_time": 1.1653727004959708e+05, - "cpu_time": 1.1629167537219817e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 5973, - "real_time": 1.1661373698320921e+05, - "cpu_time": 1.1637502996897091e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 5973, - "real_time": 1.1722691310823489e+05, - "cpu_time": 1.1698187995968644e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 5973, - "real_time": 1.1766265343994051e+05, - "cpu_time": 1.1742932981738268e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_mean", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1702244667660110e+05, - "cpu_time": 1.1678495298867479e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_median", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1701568156710159e+05, - "cpu_time": 1.1677198401177015e+05, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_stddev", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.0836772525973754e+02, - "cpu_time": 4.0730363582813470e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 4102, - "real_time": 1.7118377157410298e+05, - "cpu_time": 1.7076979473317935e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 4102, - "real_time": 1.7110314090649135e+05, - "cpu_time": 1.7068539444111637e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 4102, - "real_time": 1.7072924451480061e+05, - "cpu_time": 1.7026257532993203e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 4102, - "real_time": 1.7067980155934891e+05, - "cpu_time": 1.7022444953666360e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 4102, - "real_time": 1.7052208264346403e+05, - "cpu_time": 1.7005051072688331e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 4102, - "real_time": 1.7020519453860994e+05, - "cpu_time": 1.6974220380395406e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 4102, - "real_time": 1.7000621136087633e+05, - "cpu_time": 1.6953566601562628e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 4102, - "real_time": 1.6988891004243586e+05, - "cpu_time": 1.6941900170673727e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 4102, - "real_time": 1.7000664187899017e+05, - "cpu_time": 1.6955536128710557e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 4102, - "real_time": 1.7075112116237290e+05, - "cpu_time": 1.7028251633390356e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_mean", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.7050761201814929e+05, - "cpu_time": 1.7005274739151017e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_median", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7060094210140649e+05, - "cpu_time": 1.7013748013177345e+05, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_stddev", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.6269078611859823e+02, - "cpu_time": 4.7767310281240026e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2956, - "real_time": 2.3794150101402844e+05, - "cpu_time": 2.3717537415385584e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2956, - "real_time": 2.3752566508778941e+05, - "cpu_time": 2.3676707611674373e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2956, - "real_time": 2.3753875710449065e+05, - "cpu_time": 2.3676865595426928e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2956, - "real_time": 2.3646789546624795e+05, - "cpu_time": 2.3574568640234432e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2956, - "real_time": 2.3762990595215195e+05, - "cpu_time": 2.3693106089398853e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2956, - "real_time": 2.3775872970072448e+05, - "cpu_time": 2.3708914918978498e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2956, - "real_time": 2.3748318944463215e+05, - "cpu_time": 2.3683756664390556e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2956, - "real_time": 2.3686006562745804e+05, - "cpu_time": 2.3619906156944486e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2956, - "real_time": 2.3824163261184693e+05, - "cpu_time": 2.3753614715837428e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2956, - "real_time": 2.3830211874190255e+05, - "cpu_time": 2.3761509167996980e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_mean", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3757494607512729e+05, - "cpu_time": 2.3686648697626809e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_median", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3758433152832132e+05, - "cpu_time": 2.3688431376894709e+05, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_stddev", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.6697865916333626e+02, - "cpu_time": 5.6568087943781063e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 654530, - "real_time": 1.0601422593313093e+03, - "cpu_time": 1.0579644722167814e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 654530, - "real_time": 1.0707576214993933e+03, - "cpu_time": 1.0684489771285746e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 654530, - "real_time": 1.0776526774935662e+03, - "cpu_time": 1.0750927153835942e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 654530, - "real_time": 1.0726161444090137e+03, - "cpu_time": 1.0701974088277070e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 654530, - "real_time": 1.0714690892701074e+03, - "cpu_time": 1.0690936305441317e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 654530, - "real_time": 1.0821053809604316e+03, - "cpu_time": 1.0796459688630864e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 654530, - "real_time": 1.0834033871633246e+03, - "cpu_time": 1.0810210777198861e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 654530, - "real_time": 1.0601217285684359e+03, - "cpu_time": 1.0577653873771819e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 654530, - "real_time": 1.0612466609629441e+03, - "cpu_time": 1.0589107496983529e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 654530, - "real_time": 1.0517695995598815e+03, - "cpu_time": 1.0494299818190038e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_mean", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0691284549218408e+03, - "cpu_time": 1.0667570369578302e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_median", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0711133553847501e+03, - "cpu_time": 1.0687713038363531e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_stddev", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0490518298259946e+01, - "cpu_time": 1.0430614499409142e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 471919, - "real_time": 1.4808514681543302e+03, - "cpu_time": 1.4776110031595197e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 471919, - "real_time": 1.4826185235176761e+03, - "cpu_time": 1.4792197940748549e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 471919, - "real_time": 1.4869866608466575e+03, - "cpu_time": 1.4836473716888106e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 471919, - "real_time": 1.4824966805744766e+03, - "cpu_time": 1.4791940714400566e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 471919, - "real_time": 1.4787079604760411e+03, - "cpu_time": 1.4754793025921194e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 471919, - "real_time": 1.4682475657902226e+03, - "cpu_time": 1.4649540577940347e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 471919, - "real_time": 1.4687766565869747e+03, - "cpu_time": 1.4654571674376139e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 471919, - "real_time": 1.4667286123253796e+03, - "cpu_time": 1.4633483966527531e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 471919, - "real_time": 1.4741385195337605e+03, - "cpu_time": 1.4706532794823020e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 471919, - "real_time": 1.4785174701594067e+03, - "cpu_time": 1.4750826794428895e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_mean", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.4768070117964928e+03, - "cpu_time": 1.4734647123764955e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_median", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.4786127153177240e+03, - "cpu_time": 1.4752809910175042e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_stddev", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.9850146151975565e+00, - "cpu_time": 6.9944200445531521e+00, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 412275, - "real_time": 1.7042048608332227e+03, - "cpu_time": 1.7004607555637294e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 412275, - "real_time": 1.6996070268632593e+03, - "cpu_time": 1.6959840252259366e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 412275, - "real_time": 1.7071908337886518e+03, - "cpu_time": 1.7034976387121997e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 412275, - "real_time": 1.6891407094782726e+03, - "cpu_time": 1.6855207761810711e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 412275, - "real_time": 1.6866212794855992e+03, - "cpu_time": 1.6829165823780422e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 412275, - "real_time": 1.6885297701774882e+03, - "cpu_time": 1.6848509126187855e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 412275, - "real_time": 1.6873446534471759e+03, - "cpu_time": 1.6831611763992000e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 412275, - "real_time": 1.6789348905463523e+03, - "cpu_time": 1.6747086944393045e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 412275, - "real_time": 1.6806034758354451e+03, - "cpu_time": 1.6766671881632460e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 412275, - "real_time": 1.6872851519008580e+03, - "cpu_time": 1.6831473700807351e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_mean", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.6909462652356328e+03, - "cpu_time": 1.6870915119762253e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_median", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.6879372118123324e+03, - "cpu_time": 1.6840060445089925e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_stddev", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.5458653713534680e+00, - "cpu_time": 9.6890343756800110e+00, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 390162, - "real_time": 1.7900094396684799e+03, - "cpu_time": 1.7856070247741718e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 390162, - "real_time": 1.7859512971536492e+03, - "cpu_time": 1.7814605574095579e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 390162, - "real_time": 1.7891485536777554e+03, - "cpu_time": 1.7850538314853607e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 390162, - "real_time": 1.8123680778750588e+03, - "cpu_time": 1.8082269365031502e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 390162, - "real_time": 1.7859482266340608e+03, - "cpu_time": 1.7818015491002295e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 390162, - "real_time": 1.7858888231042381e+03, - "cpu_time": 1.7819809668803202e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 390162, - "real_time": 1.7879798340174823e+03, - "cpu_time": 1.7838988010106548e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 390162, - "real_time": 1.7855063691488299e+03, - "cpu_time": 1.7812989194231238e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 390162, - "real_time": 1.8021901440934696e+03, - "cpu_time": 1.7979351884603011e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 390162, - "real_time": 1.7838043530633536e+03, - "cpu_time": 1.7794715733464261e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_mean", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.7908795118436381e+03, - "cpu_time": 1.7866735348393297e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_median", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7869655655855659e+03, - "cpu_time": 1.7829398839454875e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_stddev", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.1547839792211541e+00, - "cpu_time": 9.1683047569427352e+00, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 387386, - "real_time": 1.8086174771413600e+03, - "cpu_time": 1.8042436897563500e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 387386, - "real_time": 1.8132234050791863e+03, - "cpu_time": 1.8086903088907100e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 387386, - "real_time": 1.8095668170768099e+03, - "cpu_time": 1.8052504117339915e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 387386, - "real_time": 1.8134823509370281e+03, - "cpu_time": 1.8091762892824936e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 387386, - "real_time": 1.8212379925966409e+03, - "cpu_time": 1.8168171952522864e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 387386, - "real_time": 1.8181779542880138e+03, - "cpu_time": 1.8141274465260462e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 387386, - "real_time": 1.8214302530287416e+03, - "cpu_time": 1.8173870790374376e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 387386, - "real_time": 1.8130412276130346e+03, - "cpu_time": 1.8088148771508268e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 387386, - "real_time": 1.8062740470743904e+03, - "cpu_time": 1.8019751643064146e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 387386, - "real_time": 1.8104475871611376e+03, - "cpu_time": 1.8063460450300699e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_mean", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8135499111996342e+03, - "cpu_time": 1.8092828506966628e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_median", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8131323163461104e+03, - "cpu_time": 1.8087525930207685e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_stddev", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.2254893774721669e+00, - "cpu_time": 5.2723308029434515e+00, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 384711, - "real_time": 1.8362752273786327e+03, - "cpu_time": 1.8320967089580893e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 384711, - "real_time": 1.8228173408089092e+03, - "cpu_time": 1.8185523834774808e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 384711, - "real_time": 1.8302074960166140e+03, - "cpu_time": 1.8261369989420452e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 384711, - "real_time": 1.8225645822450979e+03, - "cpu_time": 1.8183727317389437e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 384711, - "real_time": 1.8278171718511228e+03, - "cpu_time": 1.8235118803466005e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 384711, - "real_time": 1.8282072126868939e+03, - "cpu_time": 1.8239237011680343e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 384711, - "real_time": 1.8201795399668190e+03, - "cpu_time": 1.8158843729449593e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 384711, - "real_time": 1.8382179740116940e+03, - "cpu_time": 1.8337054984132637e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 384711, - "real_time": 1.8281471000306728e+03, - "cpu_time": 1.8237642334113698e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 384711, - "real_time": 1.8305783094317555e+03, - "cpu_time": 1.8260633020629020e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_mean", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8285011954428214e+03, - "cpu_time": 1.8242011811463690e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_median", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8281771563587833e+03, - "cpu_time": 1.8238439672897021e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_stddev", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.7692330492041437e+00, - "cpu_time": 5.7317670466682173e+00, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 375325, - "real_time": 1.8666596363153092e+03, - "cpu_time": 1.8619623419701866e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 375325, - "real_time": 1.8702988423362608e+03, - "cpu_time": 1.8657635302736519e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 375325, - "real_time": 1.8684887470857418e+03, - "cpu_time": 1.8638077346301154e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 375325, - "real_time": 1.8683226403780327e+03, - "cpu_time": 1.8640691187636085e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 375325, - "real_time": 1.8685070645440876e+03, - "cpu_time": 1.8643331486043462e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 375325, - "real_time": 1.8693613241859600e+03, - "cpu_time": 1.8651269006859627e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 375325, - "real_time": 1.8710529114771759e+03, - "cpu_time": 1.8663937520816344e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 375325, - "real_time": 1.8691626057413293e+03, - "cpu_time": 1.8647834516754169e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 375325, - "real_time": 1.8706642216745636e+03, - "cpu_time": 1.8665137414238241e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 375325, - "real_time": 1.8726871911013441e+03, - "cpu_time": 1.8684332405250432e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_mean", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8695205184839808e+03, - "cpu_time": 1.8651186960633790e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_median", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8692619649636447e+03, - "cpu_time": 1.8649551761806899e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_stddev", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.7047167558221372e+00, - "cpu_time": 1.7790846591589087e+00, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 87695, - "real_time": 7.8752597519014726e+03, - "cpu_time": 7.9119792805683392e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 87695, - "real_time": 7.8727397571200963e+03, - "cpu_time": 7.9072319176356477e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 87695, - "real_time": 7.8436202179594429e+03, - "cpu_time": 7.8670232169151186e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 87695, - "real_time": 7.8377298362506008e+03, - "cpu_time": 7.8654534692582902e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 87695, - "real_time": 7.8484582359705082e+03, - "cpu_time": 7.8755003590100314e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 87695, - "real_time": 7.8276935973071950e+03, - "cpu_time": 7.8478780204574932e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 87695, - "real_time": 7.8291425399807204e+03, - "cpu_time": 7.8562239353621226e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 87695, - "real_time": 7.8356396718103233e+03, - "cpu_time": 7.8544793086481204e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 87695, - "real_time": 7.7885256973225114e+03, - "cpu_time": 7.8119244882615594e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 87695, - "real_time": 7.7915743199018516e+03, - "cpu_time": 7.8167449455395290e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_mean", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.8350383625524728e+03, - "cpu_time": 7.8614438941656263e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_median", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.8366847540304616e+03, - "cpu_time": 7.8608387023102059e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_stddev", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.8755211107054190e+01, - "cpu_time": 3.2668557821004264e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 80718, - "real_time": 8.6467054434410948e+03, - "cpu_time": 8.6671290417529017e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 80718, - "real_time": 8.6178572806768225e+03, - "cpu_time": 8.6403691123293920e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 80718, - "real_time": 8.6167679945242744e+03, - "cpu_time": 8.6383276963419212e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 80718, - "real_time": 8.6295208132640164e+03, - "cpu_time": 8.6468669567517354e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 80718, - "real_time": 8.6199464427530493e+03, - "cpu_time": 8.6373253548921693e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 80718, - "real_time": 8.5940450576421754e+03, - "cpu_time": 8.6145813081116230e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 80718, - "real_time": 8.5921963377742341e+03, - "cpu_time": 8.6081473649540130e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 80718, - "real_time": 8.5811417405714456e+03, - "cpu_time": 8.5956433262474602e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 80718, - "real_time": 8.5697559526470850e+03, - "cpu_time": 8.5874010999686834e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 80718, - "real_time": 8.5687178076222899e+03, - "cpu_time": 8.5849912410724810e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_mean", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.6036654870916500e+03, - "cpu_time": 8.6220782502422389e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_median", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.6054065260832249e+03, - "cpu_time": 8.6259533315018962e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_stddev", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.6376963834684460e+01, - "cpu_time": 2.7892966126245266e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 68976, - "real_time": 1.0117985603679672e+04, - "cpu_time": 1.0132573402366104e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 68976, - "real_time": 1.0094747376354162e+04, - "cpu_time": 1.0106586189438542e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 68976, - "real_time": 1.0088196865501071e+04, - "cpu_time": 1.0108045233230379e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 68976, - "real_time": 1.0111839408125314e+04, - "cpu_time": 1.0124504320240727e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 68976, - "real_time": 1.0123610371378370e+04, - "cpu_time": 1.0141350281453428e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 68976, - "real_time": 1.0110582043240871e+04, - "cpu_time": 1.0132168087481585e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 68976, - "real_time": 1.0115120925650202e+04, - "cpu_time": 1.0132464683189604e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 68976, - "real_time": 1.0095209363059246e+04, - "cpu_time": 1.0119291173878184e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 68976, - "real_time": 1.0102000289602169e+04, - "cpu_time": 1.0120966466952583e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 68976, - "real_time": 1.0112297566941699e+04, - "cpu_time": 1.0133743215237744e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_mean", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0107158981353279e+04, - "cpu_time": 1.0125169305346890e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_median", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0111210725683093e+04, - "cpu_time": 1.0128336203861156e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_stddev", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.1519551520878654e+01, - "cpu_time": 1.1467764425751714e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 60428, - "real_time": 1.1556894089076050e+04, - "cpu_time": 1.1569219566963711e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 60428, - "real_time": 1.1559418829300470e+04, - "cpu_time": 1.1571875157056527e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 60428, - "real_time": 1.1563293754591767e+04, - "cpu_time": 1.1577655441159115e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 60428, - "real_time": 1.1542952919662954e+04, - "cpu_time": 1.1558569173212703e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 60428, - "real_time": 1.1549693685253078e+04, - "cpu_time": 1.1565616270743261e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 60428, - "real_time": 1.1560092672748036e+04, - "cpu_time": 1.1579011865143964e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 60428, - "real_time": 1.1541311824743265e+04, - "cpu_time": 1.1554437396715275e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 60428, - "real_time": 1.1541749950626196e+04, - "cpu_time": 1.1555894982481634e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 60428, - "real_time": 1.1573966522639774e+04, - "cpu_time": 1.1591943271439577e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 60428, - "real_time": 1.1584716919668272e+04, - "cpu_time": 1.1598720973659021e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_mean", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1557409116830988e+04, - "cpu_time": 1.1572294409857481e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_median", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1558156459188262e+04, - "cpu_time": 1.1570547362010118e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_stddev", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4293900152622475e+01, - "cpu_time": 1.4865060186714933e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 54074, - "real_time": 1.2985221233644030e+04, - "cpu_time": 1.2994369696927270e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 54074, - "real_time": 1.2960793246295987e+04, - "cpu_time": 1.2978301808679544e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 54074, - "real_time": 1.2942135184598306e+04, - "cpu_time": 1.2959876928071277e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 54074, - "real_time": 1.2958893497727267e+04, - "cpu_time": 1.2975765950452404e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 54074, - "real_time": 1.2964238284608758e+04, - "cpu_time": 1.2978882716076505e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 54074, - "real_time": 1.2981766911964402e+04, - "cpu_time": 1.2992995764681105e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 54074, - "real_time": 1.2954823815332469e+04, - "cpu_time": 1.2965339922895315e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 54074, - "real_time": 1.2952960461096436e+04, - "cpu_time": 1.2962501497897205e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 54074, - "real_time": 1.2986036171995973e+04, - "cpu_time": 1.3002857528759105e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 54074, - "real_time": 1.2952949513420208e+04, - "cpu_time": 1.2970192976277913e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_mean", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.2963981832068383e+04, - "cpu_time": 1.2978108479071763e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_median", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.2959843372011626e+04, - "cpu_time": 1.2977033879565972e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_stddev", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.5254387705712531e+01, - "cpu_time": 1.4553948388880013e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 48159, - "real_time": 1.4483863037372124e+04, - "cpu_time": 1.4484137253461824e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 48159, - "real_time": 1.4495634190939330e+04, - "cpu_time": 1.4497175938021877e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 48159, - "real_time": 1.4487601715357432e+04, - "cpu_time": 1.4486215515260632e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 48159, - "real_time": 1.4460181690179961e+04, - "cpu_time": 1.4465255964737185e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 48159, - "real_time": 1.4442972943817651e+04, - "cpu_time": 1.4447666189191757e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 48159, - "real_time": 1.4470616292389006e+04, - "cpu_time": 1.4470088145485743e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 48159, - "real_time": 1.4443808426369707e+04, - "cpu_time": 1.4443328723505614e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 48159, - "real_time": 1.4459121473005473e+04, - "cpu_time": 1.4459653169667461e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 48159, - "real_time": 1.4481726073784585e+04, - "cpu_time": 1.4485255840129645e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 48159, - "real_time": 1.4458295106065618e+04, - "cpu_time": 1.4456939263513046e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_mean", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.4468382094928089e+04, - "cpu_time": 1.4469571600297477e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_median", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.4465398991284481e+04, - "cpu_time": 1.4467672055111465e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_stddev", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8375789575424857e+01, - "cpu_time": 1.8081762892322732e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 44059, - "real_time": 1.5881904173856368e+04, - "cpu_time": 1.5873495744203285e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 44059, - "real_time": 1.5863051362707396e+04, - "cpu_time": 1.5863397421534799e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 44059, - "real_time": 1.5902200254910269e+04, - "cpu_time": 1.5899241403562759e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 44059, - "real_time": 1.5841931591451927e+04, - "cpu_time": 1.5838712816890549e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 44059, - "real_time": 1.5853797612437209e+04, - "cpu_time": 1.5849995483429637e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 44059, - "real_time": 1.5855171066599431e+04, - "cpu_time": 1.5852116570700353e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 44059, - "real_time": 1.5840181347980371e+04, - "cpu_time": 1.5835479152929773e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 44059, - "real_time": 1.5841192287502163e+04, - "cpu_time": 1.5836984293875206e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 44059, - "real_time": 1.5837906988039693e+04, - "cpu_time": 1.5834465466794467e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 44059, - "real_time": 1.5855825053256916e+04, - "cpu_time": 1.5853167707167262e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_mean", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.5857316173874173e+04, - "cpu_time": 1.5853705606108811e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_median", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.5854484339518322e+04, - "cpu_time": 1.5851056027064997e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_stddev", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.0651155217070922e+01, - "cpu_time": 2.0500519366503859e+01, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 737801, - "real_time": 9.5437484633388749e+02, - "cpu_time": 9.5233535329989456e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 737801, - "real_time": 9.3878106698151657e+02, - "cpu_time": 9.3676726380138678e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 737801, - "real_time": 9.4245809913523135e+02, - "cpu_time": 9.4046471474020825e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 737801, - "real_time": 9.3909640539928705e+02, - "cpu_time": 9.3712685669981420e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 737801, - "real_time": 9.4802178771786396e+02, - "cpu_time": 9.4598027652442738e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 737801, - "real_time": 9.3906202621024295e+02, - "cpu_time": 9.3681406097317017e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 737801, - "real_time": 9.5335471217842894e+02, - "cpu_time": 9.5129856153625667e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 737801, - "real_time": 9.4433586292241534e+02, - "cpu_time": 9.4219100001222228e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 737801, - "real_time": 9.4012628201907808e+02, - "cpu_time": 9.3813528851264095e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 737801, - "real_time": 9.3721108808486042e+02, - "cpu_time": 9.3516296941859741e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_mean", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.4368221769828119e+02, - "cpu_time": 9.4162763455186200e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_median", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.4129219057715477e+02, - "cpu_time": 9.3930000162642443e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_stddev", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.2322134653825003e+00, - "cpu_time": 6.2346379796960374e+00, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 666205, - "real_time": 1.0253360857392993e+03, - "cpu_time": 1.0230745221065355e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 666205, - "real_time": 1.0366178833841709e+03, - "cpu_time": 1.0343720911732219e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 666205, - "real_time": 1.0301448052773587e+03, - "cpu_time": 1.0278576113958786e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 666205, - "real_time": 1.0336168987023814e+03, - "cpu_time": 1.0315141510496633e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 666205, - "real_time": 1.0291840619627924e+03, - "cpu_time": 1.0269749716680080e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 666205, - "real_time": 1.0286527570344629e+03, - "cpu_time": 1.0262044806029051e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 666205, - "real_time": 1.0297756441335398e+03, - "cpu_time": 1.0273536569073947e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 666205, - "real_time": 1.0507729993021380e+03, - "cpu_time": 1.0483173917936936e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 666205, - "real_time": 1.0468009501579818e+03, - "cpu_time": 1.0442854466718909e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 666205, - "real_time": 1.0499432847246148e+03, - "cpu_time": 1.0474471851756657e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_mean", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0360845370418742e+03, - "cpu_time": 1.0337401508544858e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_median", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0318808519898701e+03, - "cpu_time": 1.0296858812227708e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_stddev", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.5596994213226960e+00, - "cpu_time": 9.4788514214325552e+00, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 629069, - "real_time": 1.0890307502038256e+03, - "cpu_time": 1.0865090697522651e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 629069, - "real_time": 1.0964275111316404e+03, - "cpu_time": 1.0939709697982246e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 629069, - "real_time": 1.1039351343016644e+03, - "cpu_time": 1.1014911369023951e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 629069, - "real_time": 1.1029886308181094e+03, - "cpu_time": 1.1006133063304328e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 629069, - "real_time": 1.0962129082816707e+03, - "cpu_time": 1.0937730535123294e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 629069, - "real_time": 1.0919331885692529e+03, - "cpu_time": 1.0894910065509036e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 629069, - "real_time": 1.0953143423055531e+03, - "cpu_time": 1.0930030696155720e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 629069, - "real_time": 1.0914031386063748e+03, - "cpu_time": 1.0889296547756539e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 629069, - "real_time": 1.0914509107904380e+03, - "cpu_time": 1.0887938842955932e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 629069, - "real_time": 1.0865822731688015e+03, - "cpu_time": 1.0839245297416462e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_mean", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0945278788177332e+03, - "cpu_time": 1.0920499681275019e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_median", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0936237654374031e+03, - "cpu_time": 1.0912470380832378e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_stddev", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.6417339280694083e+00, - "cpu_time": 5.7120255949250147e+00, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 629853, - "real_time": 1.1084207791340759e+03, - "cpu_time": 1.1060437006730519e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 629853, - "real_time": 1.1198016584822360e+03, - "cpu_time": 1.1172660970098386e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 629853, - "real_time": 1.1152597590230346e+03, - "cpu_time": 1.1127877377739042e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 629853, - "real_time": 1.1103979261827324e+03, - "cpu_time": 1.1079365979045474e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 629853, - "real_time": 1.1099912519272050e+03, - "cpu_time": 1.1076522236141432e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 629853, - "real_time": 1.1114626603347865e+03, - "cpu_time": 1.1091322943606624e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 629853, - "real_time": 1.1002197909670851e+03, - "cpu_time": 1.0978275819913908e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 629853, - "real_time": 1.1111582718508896e+03, - "cpu_time": 1.1086316203939964e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 629853, - "real_time": 1.1098431507034595e+03, - "cpu_time": 1.1072664240704612e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 629853, - "real_time": 1.1038706920504528e+03, - "cpu_time": 1.1013132111778621e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_mean", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1100425940655959e+03, - "cpu_time": 1.1075857488969859e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_median", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1101945890549689e+03, - "cpu_time": 1.1077944107593453e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_stddev", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.4067680535229021e+00, - "cpu_time": 5.3895930963525647e+00, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 630791, - "real_time": 1.1114185681151603e+03, - "cpu_time": 1.1090046449617396e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 630791, - "real_time": 1.1142979734965645e+03, - "cpu_time": 1.1118313546008246e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 630791, - "real_time": 1.1245721102551245e+03, - "cpu_time": 1.1220841546567340e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 630791, - "real_time": 1.1165135282525318e+03, - "cpu_time": 1.1140778181679916e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 630791, - "real_time": 1.1127119188445188e+03, - "cpu_time": 1.1102295625649783e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 630791, - "real_time": 1.1180225462950455e+03, - "cpu_time": 1.1155317371364997e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 630791, - "real_time": 1.1199043597641219e+03, - "cpu_time": 1.1173531423244749e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 630791, - "real_time": 1.1199574518343607e+03, - "cpu_time": 1.1173607613298075e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 630791, - "real_time": 1.1093714526680042e+03, - "cpu_time": 1.1067360250860786e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 630791, - "real_time": 1.1192001344343794e+03, - "cpu_time": 1.1166187501088700e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_mean", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1165970043959812e+03, - "cpu_time": 1.1140827950938001e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_median", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1172680372737887e+03, - "cpu_time": 1.1148047776522458e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_stddev", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.6434323614462762e+00, - "cpu_time": 4.6388640574020794e+00, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 627008, - "real_time": 1.1246577284500447e+03, - "cpu_time": 1.1221897742931737e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 627008, - "real_time": 1.1140395082679895e+03, - "cpu_time": 1.1116575322801416e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 627008, - "real_time": 1.1207971317750207e+03, - "cpu_time": 1.1183423178012947e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 627008, - "real_time": 1.1134971675001152e+03, - "cpu_time": 1.1109773511662099e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 627008, - "real_time": 1.1272718306625909e+03, - "cpu_time": 1.1247892562773595e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 627008, - "real_time": 1.1177053976981642e+03, - "cpu_time": 1.1151386617076621e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 627008, - "real_time": 1.1194815249565429e+03, - "cpu_time": 1.1169901101740350e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 627008, - "real_time": 1.1152265282103674e+03, - "cpu_time": 1.1126340126442335e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 627008, - "real_time": 1.1232264101894605e+03, - "cpu_time": 1.1206390333137931e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 627008, - "real_time": 1.1150596467666101e+03, - "cpu_time": 1.1121732497830269e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_mean", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1190962874476907e+03, - "cpu_time": 1.1165531299440931e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_median", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1185934613273537e+03, - "cpu_time": 1.1160643859408488e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_stddev", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.8073273332765218e+00, - "cpu_time": 4.8452958199263296e+00, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 625845, - "real_time": 1.1345363021193980e+03, - "cpu_time": 1.1319591767929760e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 625845, - "real_time": 1.1303430561879388e+03, - "cpu_time": 1.1277766076266078e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 625845, - "real_time": 1.1220067412859187e+03, - "cpu_time": 1.1195614808777918e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 625845, - "real_time": 1.1338340867144825e+03, - "cpu_time": 1.1312704263835872e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 625845, - "real_time": 1.1275272791188008e+03, - "cpu_time": 1.1252405835309926e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 625845, - "real_time": 1.1411352171865492e+03, - "cpu_time": 1.1388569597902601e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 625845, - "real_time": 1.1314549688822017e+03, - "cpu_time": 1.1291705566075489e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 625845, - "real_time": 1.1414487085461076e+03, - "cpu_time": 1.1389182193674251e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 625845, - "real_time": 1.1366724987818752e+03, - "cpu_time": 1.1342436769487927e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 625845, - "real_time": 1.1307483418416057e+03, - "cpu_time": 1.1282707155925066e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_mean", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1329707200664877e+03, - "cpu_time": 1.1305268403518489e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_median", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1326445277983421e+03, - "cpu_time": 1.1302204914955680e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_stddev", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.9574032449997301e+00, - "cpu_time": 5.9526139723523386e+00, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 108073, - "real_time": 6.5037300898484109e+03, - "cpu_time": 6.4877900770771203e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 108073, - "real_time": 6.5091850230864284e+03, - "cpu_time": 6.4933381603182788e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 108073, - "real_time": 6.4914659998343550e+03, - "cpu_time": 6.4769734346222231e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 108073, - "real_time": 6.4860698601863332e+03, - "cpu_time": 6.4705766842783278e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 108073, - "real_time": 6.4791537201711926e+03, - "cpu_time": 6.4637862648400042e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 108073, - "real_time": 6.5074582828288403e+03, - "cpu_time": 6.4919896828997089e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 108073, - "real_time": 6.4957999777933819e+03, - "cpu_time": 6.4807646683253788e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 108073, - "real_time": 6.4927951569778552e+03, - "cpu_time": 6.4773895792656358e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 108073, - "real_time": 6.4940202178145028e+03, - "cpu_time": 6.4787048013838339e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 108073, - "real_time": 6.5036380409527828e+03, - "cpu_time": 6.4883337188744435e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_mean", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.4963316369494087e+03, - "cpu_time": 6.4809647071884956e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_median", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.4949100978039405e+03, - "cpu_time": 6.4797347348546073e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_stddev", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.6570282443300854e+00, - "cpu_time": 9.5009316897750420e+00, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9529593885777973e+02, - "cpu_time": 4.9419101430120577e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9259132226178201e+02, - "cpu_time": 4.9156986275358696e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9227902633833668e+02, - "cpu_time": 4.9122537581036977e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9274230731377440e+02, - "cpu_time": 4.9167735857019341e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9167757723610578e+02, - "cpu_time": 4.9053659598098710e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9838935004843898e+02, - "cpu_time": 4.9723710081135795e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9016674096146880e+02, - "cpu_time": 4.8899305963746781e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9702283408093234e+02, - "cpu_time": 4.9586434407217502e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9801428641744297e+02, - "cpu_time": 4.9681650331158744e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1422260, - "real_time": 4.9197680030379865e+02, - "cpu_time": 4.9082543487129243e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_mean", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.9401561838198603e+02, - "cpu_time": 4.9289366501202238e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_median", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.9266681478777826e+02, - "cpu_time": 4.9162361066189015e+02, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_stddev", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.9231681238464007e+00, - "cpu_time": 2.9025900193511474e+00, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 185859, - "real_time": 3.7172621772419529e+03, - "cpu_time": 3.7090083450355887e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 185859, - "real_time": 3.7565252583948809e+03, - "cpu_time": 3.7486859823847908e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 185859, - "real_time": 3.7330907085481213e+03, - "cpu_time": 3.7255938695458758e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 185859, - "real_time": 3.7172165028326535e+03, - "cpu_time": 3.7097312209792954e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 185859, - "real_time": 3.6832884498466178e+03, - "cpu_time": 3.6760091682404282e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 185859, - "real_time": 3.6990713013631207e+03, - "cpu_time": 3.6915760388252093e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 185859, - "real_time": 3.6859164527941225e+03, - "cpu_time": 3.6777899213923365e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 185859, - "real_time": 3.7536341204886071e+03, - "cpu_time": 3.7449938178944353e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 185859, - "real_time": 3.7064777923046104e+03, - "cpu_time": 3.6977737855041842e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 185859, - "real_time": 3.7146490296412712e+03, - "cpu_time": 3.7061549776979282e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_mean", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.7167131793455965e+03, - "cpu_time": 3.7087317127500073e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_median", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.7159327662369624e+03, - "cpu_time": 3.7075816613667585e+03, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_stddev", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.5172397489047206e+01, - "cpu_time": 2.5046366021581591e+01, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 290, - "real_time": 2.4288263931033537e+06, - "cpu_time": 2.4200845310345138e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 290, - "real_time": 2.4400219724133546e+06, - "cpu_time": 2.4307246862067273e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 290, - "real_time": 2.4489427724135784e+06, - "cpu_time": 2.4391825103446632e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 290, - "real_time": 2.4475929172412772e+06, - "cpu_time": 2.4381647724139993e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 290, - "real_time": 2.4434587551719109e+06, - "cpu_time": 2.4331576655170247e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 290, - "real_time": 2.4508508172410638e+06, - "cpu_time": 2.4407433620691053e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 290, - "real_time": 2.4537116310339430e+06, - "cpu_time": 2.4441089620691417e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 290, - "real_time": 2.4451590103447824e+06, - "cpu_time": 2.4350751310341116e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 290, - "real_time": 2.4490677724135569e+06, - "cpu_time": 2.4400707862069202e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 290, - "real_time": 2.4524481620691684e+06, - "cpu_time": 2.4435803172411458e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_mean", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.4460080203445992e+06, - "cpu_time": 2.4364892724137357e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_median", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.4482678448274280e+06, - "cpu_time": 2.4386736413793312e+06, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_stddev", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.3259139047717836e+03, - "cpu_time": 7.1862007582043152e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7404, - "real_time": 9.5060681928679245e+04, - "cpu_time": 9.4751265667202810e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7404, - "real_time": 9.5383874392205980e+04, - "cpu_time": 9.5085076039984051e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7404, - "real_time": 9.5432341977304459e+04, - "cpu_time": 9.5117882766075185e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7404, - "real_time": 9.5357227714742592e+04, - "cpu_time": 9.5028864262552612e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7404, - "real_time": 9.4961826310086501e+04, - "cpu_time": 9.4648996083190912e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7404, - "real_time": 9.4874240005415166e+04, - "cpu_time": 9.4573739330085518e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7404, - "real_time": 9.4970316990802065e+04, - "cpu_time": 9.4641854943272119e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7404, - "real_time": 9.4770192733657066e+04, - "cpu_time": 9.4462438141541599e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7404, - "real_time": 9.5171453943825822e+04, - "cpu_time": 9.4844948001069701e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7404, - "real_time": 9.5285300108030657e+04, - "cpu_time": 9.4973959616428125e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_mean", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.5126745610474958e+04, - "cpu_time": 9.4812902485140279e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_median", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.5116067936252541e+04, - "cpu_time": 9.4798106834136270e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_stddev", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.3254305390066853e+02, - "cpu_time": 2.3109477565210992e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 26, - "real_time": 2.7059566000004385e+07, - "cpu_time": 2.6956759999996815e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 26, - "real_time": 2.6928197807688568e+07, - "cpu_time": 2.6841056038462672e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 26, - "real_time": 2.6884499884615183e+07, - "cpu_time": 2.6802009076924641e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 26, - "real_time": 2.6881026307688236e+07, - "cpu_time": 2.6793901576922961e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 26, - "real_time": 2.6920631692309354e+07, - "cpu_time": 2.6839095000000793e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 26, - "real_time": 2.6975549538467303e+07, - "cpu_time": 2.6892356115384839e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 26, - "real_time": 2.6966174576920398e+07, - "cpu_time": 2.6882157961538792e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 26, - "real_time": 2.6891679346162025e+07, - "cpu_time": 2.6807367846157167e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 26, - "real_time": 2.7213310038457796e+07, - "cpu_time": 2.7125418576920662e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 26, - "real_time": 2.6882021923072968e+07, - "cpu_time": 2.6804777576921005e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_mean", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.6960265711538624e+07, - "cpu_time": 2.6874489976923037e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_median", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.6924414749998957e+07, - "cpu_time": 2.6840075519231729e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_stddev", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0520098133676194e+05, - "cpu_time": 1.0197784004857717e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2555, - "real_time": 2.7337786066544143e+05, - "cpu_time": 2.7251163953033579e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2555, - "real_time": 2.7185001487277861e+05, - "cpu_time": 2.7098687671233341e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2555, - "real_time": 2.7153288727983553e+05, - "cpu_time": 2.7067065949119383e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2555, - "real_time": 2.7055484187865036e+05, - "cpu_time": 2.6970764109590201e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2555, - "real_time": 2.7081823483359331e+05, - "cpu_time": 2.6997692133076669e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2555, - "real_time": 2.7317274833664781e+05, - "cpu_time": 2.7226463757336128e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2555, - "real_time": 2.7081890724073572e+05, - "cpu_time": 2.6997028845398535e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2555, - "real_time": 2.7080616712331737e+05, - "cpu_time": 2.6996357495107700e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2555, - "real_time": 2.7076211545981595e+05, - "cpu_time": 2.6992237495108042e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2555, - "real_time": 2.7176007671238721e+05, - "cpu_time": 2.7091833894323051e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_mean", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.7154538544032036e+05, - "cpu_time": 2.7068929530332662e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_median", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.7117589726028556e+05, - "cpu_time": 2.7032379041098023e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_stddev", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0188759489296432e+03, - "cpu_time": 1.0026040590125373e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7850, - "real_time": 8.8296810828028727e+04, - "cpu_time": 8.8070395668776531e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7850, - "real_time": 8.8319647770673604e+04, - "cpu_time": 8.8096575286625492e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7850, - "real_time": 8.8851641019133167e+04, - "cpu_time": 8.8627630828031426e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7850, - "real_time": 8.8358925987235416e+04, - "cpu_time": 8.8126608280258632e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7850, - "real_time": 8.8788855668776901e+04, - "cpu_time": 8.8556289426760835e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7850, - "real_time": 8.8360717324842873e+04, - "cpu_time": 8.8140185732479440e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7850, - "real_time": 8.8230303312096570e+04, - "cpu_time": 8.8005258089173847e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7850, - "real_time": 8.8201886496819352e+04, - "cpu_time": 8.7975505350322856e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7850, - "real_time": 8.8082453121010971e+04, - "cpu_time": 8.7857967515913275e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7850, - "real_time": 8.8579812484069611e+04, - "cpu_time": 8.8340239490439460e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_mean", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.8407105401268724e+04, - "cpu_time": 8.8179665566878190e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_median", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.8339286878954503e+04, - "cpu_time": 8.8111591783442069e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_stddev", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.5303329576813834e+02, - "cpu_time": 2.5102213902425873e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 26, - "real_time": 2.7142408576922279e+07, - "cpu_time": 2.7051780576921549e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 26, - "real_time": 2.7071535153849117e+07, - "cpu_time": 2.6982219769234478e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 26, - "real_time": 2.7119634076921802e+07, - "cpu_time": 2.7030975192308061e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 26, - "real_time": 2.7096741499996405e+07, - "cpu_time": 2.7006717192307405e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 26, - "real_time": 2.7129405730770137e+07, - "cpu_time": 2.7039435230768468e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 26, - "real_time": 2.7228596461537354e+07, - "cpu_time": 2.7139493307690654e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 26, - "real_time": 2.7179644115379300e+07, - "cpu_time": 2.7094505307694852e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 26, - "real_time": 2.7134457846159421e+07, - "cpu_time": 2.7048401692310948e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 26, - "real_time": 2.7090689769229706e+07, - "cpu_time": 2.7004137576922789e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 26, - "real_time": 2.7083414153847888e+07, - "cpu_time": 2.6993705423076510e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_mean", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.7127652738461345e+07, - "cpu_time": 2.7039137126923572e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_median", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.7124519903845973e+07, - "cpu_time": 2.7035205211538266e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_stddev", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.7902860163067970e+04, - "cpu_time": 4.8337976195904528e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2602, - "real_time": 2.7050472674865572e+05, - "cpu_time": 2.6960651152956777e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2602, - "real_time": 2.7051239315912640e+05, - "cpu_time": 2.6960799923133175e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2602, - "real_time": 2.7103534857794276e+05, - "cpu_time": 2.7014218255190889e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2602, - "real_time": 2.7100212067635515e+05, - "cpu_time": 2.7005905265183537e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2602, - "real_time": 2.7068978055345960e+05, - "cpu_time": 2.6978099538814969e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2602, - "real_time": 2.7018566141428793e+05, - "cpu_time": 2.6931370484244940e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2602, - "real_time": 2.7114630092232273e+05, - "cpu_time": 2.7030575096079381e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2602, - "real_time": 2.7048006648726860e+05, - "cpu_time": 2.6961692044581164e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2602, - "real_time": 2.7052914719443093e+05, - "cpu_time": 2.6966698616448540e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2602, - "real_time": 2.7116341506536078e+05, - "cpu_time": 2.7036054496542539e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_mean", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.7072489607992105e+05, - "cpu_time": 2.6984606487317587e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_median", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.7060946387394523e+05, - "cpu_time": 2.6972399077631754e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_stddev", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.3780557825691596e+02, - "cpu_time": 3.4885991851012739e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 219, - "real_time": 3.2047196894975938e+06, - "cpu_time": 3.1954848949775514e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 219, - "real_time": 3.2047784292243281e+06, - "cpu_time": 3.1958807625566502e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 219, - "real_time": 3.2113723242015345e+06, - "cpu_time": 3.2022122054793928e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 219, - "real_time": 3.2079393379003354e+06, - "cpu_time": 3.1986892648405731e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 219, - "real_time": 3.2116831598167783e+06, - "cpu_time": 3.2026153150683856e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 219, - "real_time": 3.2265856529687317e+06, - "cpu_time": 3.2173759132419573e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 219, - "real_time": 3.2077459908677693e+06, - "cpu_time": 3.1985110228309846e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 219, - "real_time": 3.2082803835615343e+06, - "cpu_time": 3.1988684520549891e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 219, - "real_time": 3.2078806027397625e+06, - "cpu_time": 3.1984453607303509e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 219, - "real_time": 3.2094592739723925e+06, - "cpu_time": 3.2000506621007435e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_mean", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.2100444844750762e+06, - "cpu_time": 3.2008133853881578e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_median", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.2081098607309344e+06, - "cpu_time": 3.1987788584477799e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_stddev", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.2538439049905619e+03, - "cpu_time": 6.2541485776948557e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 5563, - "real_time": 1.2612328222180583e+05, - "cpu_time": 1.2584627233509046e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 5563, - "real_time": 1.2737254305232012e+05, - "cpu_time": 1.2696231997123410e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 5563, - "real_time": 1.2610489448140527e+05, - "cpu_time": 1.2582868002877502e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 5563, - "real_time": 1.2590039978430829e+05, - "cpu_time": 1.2562524159627125e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 5563, - "real_time": 1.2625710929354660e+05, - "cpu_time": 1.2596070699260973e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 5563, - "real_time": 1.2618196620526927e+05, - "cpu_time": 1.2588881305048931e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 5563, - "real_time": 1.2628677889628912e+05, - "cpu_time": 1.2599790778357523e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 5563, - "real_time": 1.2605207154411970e+05, - "cpu_time": 1.2576182257775047e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 5563, - "real_time": 1.2614694139852516e+05, - "cpu_time": 1.2585524339386419e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 5563, - "real_time": 1.2612394715079915e+05, - "cpu_time": 1.2583423350711756e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_mean", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.2625499340283887e+05, - "cpu_time": 1.2595612412367776e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_median", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.2613544427466215e+05, - "cpu_time": 1.2585075786447732e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_stddev", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.0700870553944952e+02, - "cpu_time": 3.6807422796844696e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2579, - "real_time": 2.7330228034124989e+05, - "cpu_time": 2.7243128848388221e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2579, - "real_time": 2.7328699263281754e+05, - "cpu_time": 2.7241326560687588e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2579, - "real_time": 2.7222317177207040e+05, - "cpu_time": 2.7135041062430042e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2579, - "real_time": 2.7253296549044090e+05, - "cpu_time": 2.7167864637454011e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2579, - "real_time": 2.7214119930210081e+05, - "cpu_time": 2.7126615509887034e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2579, - "real_time": 2.7280640790998313e+05, - "cpu_time": 2.7185918650635879e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2579, - "real_time": 2.7398891585885728e+05, - "cpu_time": 2.7304922605659073e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2579, - "real_time": 2.9178041488945996e+05, - "cpu_time": 2.9075188561457233e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2579, - "real_time": 2.7210141488946957e+05, - "cpu_time": 2.7124917060878663e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2579, - "real_time": 2.7248847576579766e+05, - "cpu_time": 2.7168193408300995e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_mean", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.7466522388522478e+05, - "cpu_time": 2.7377311690577876e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_median", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.7266968670021207e+05, - "cpu_time": 2.7177056029468437e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_stddev", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.0442045924700069e+03, - "cpu_time": 5.9944414438432686e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 486927, - "real_time": 1.4440539793437802e+03, - "cpu_time": 1.4408161387644636e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 486927, - "real_time": 1.4438156643603329e+03, - "cpu_time": 1.4405921996522839e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 486927, - "real_time": 1.4337294502048692e+03, - "cpu_time": 1.4304689717351298e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 486927, - "real_time": 1.4248211169231527e+03, - "cpu_time": 1.4212959375839416e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 486927, - "real_time": 1.4391327016166438e+03, - "cpu_time": 1.4357325163731480e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 486927, - "real_time": 1.4385572416395073e+03, - "cpu_time": 1.4351230204936858e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 486927, - "real_time": 1.4187934105111010e+03, - "cpu_time": 1.4153248433544122e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 486927, - "real_time": 1.4147223854911986e+03, - "cpu_time": 1.4111700070035029e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 486927, - "real_time": 1.4319135352940450e+03, - "cpu_time": 1.4283104551603240e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 486927, - "real_time": 1.4289923643584236e+03, - "cpu_time": 1.4254711794580542e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_mean", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.4318531849743053e+03, - "cpu_time": 1.4284305269578945e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_median", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.4328214927494571e+03, - "cpu_time": 1.4293897134477268e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_stddev", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0083409496298115e+01, - "cpu_time": 1.0181314317094930e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 808279, - "real_time": 8.6591441197905397e+02, - "cpu_time": 8.6383875246028208e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 808279, - "real_time": 8.6799174171296238e+02, - "cpu_time": 8.6603293293540059e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 808279, - "real_time": 8.6877040229924114e+02, - "cpu_time": 8.6686202412797491e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 808279, - "real_time": 8.6092026020745186e+02, - "cpu_time": 8.5905926913849328e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 808279, - "real_time": 8.5997109785131693e+02, - "cpu_time": 8.5798334362247499e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 808279, - "real_time": 8.6703587870050160e+02, - "cpu_time": 8.6521129585204812e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 808279, - "real_time": 8.6195512440639368e+02, - "cpu_time": 8.6008064542081456e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 808279, - "real_time": 8.6472625170289280e+02, - "cpu_time": 8.6275233056908121e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 808279, - "real_time": 8.6547172572848172e+02, - "cpu_time": 8.6349734683200109e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 808279, - "real_time": 8.6863527692789842e+02, - "cpu_time": 8.6663012895284328e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_mean", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.6513921715161939e+02, - "cpu_time": 8.6319480699114160e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_median", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.6569306885376795e+02, - "cpu_time": 8.6366804964614164e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_stddev", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.2088712412267704e+00, - "cpu_time": 3.1977963293649347e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 31822929, - "real_time": 2.0585853332355370e+01, - "cpu_time": 2.0537737239714421e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 31822929, - "real_time": 1.9968918982909056e+01, - "cpu_time": 1.9919838177056921e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 31822929, - "real_time": 1.9919912431693298e+01, - "cpu_time": 1.9869033111310223e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 31822929, - "real_time": 1.8712225389436711e+01, - "cpu_time": 1.8664506557518500e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 31822929, - "real_time": 2.0333514617716826e+01, - "cpu_time": 2.0279947486920818e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 31822929, - "real_time": 1.8552814638779328e+01, - "cpu_time": 1.8508896368404724e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 31822929, - "real_time": 1.8651837516279656e+01, - "cpu_time": 1.8606296830817374e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 31822929, - "real_time": 1.8715416861844140e+01, - "cpu_time": 1.8671542836300567e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 31822929, - "real_time": 1.9091030527078953e+01, - "cpu_time": 1.9043666313682110e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 31822929, - "real_time": 1.8525927578823730e+01, - "cpu_time": 1.8485277832224678e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_mean", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.9305745187691713e+01, - "cpu_time": 1.9258674275395038e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_median", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8903223694461548e+01, - "cpu_time": 1.8857604574991342e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_stddev", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.0701497821800261e-01, - "cpu_time": 8.0405700311790496e-01, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 285365, - "real_time": 2.4476024389816907e+03, - "cpu_time": 2.4425191596723707e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 285365, - "real_time": 2.4415139242721962e+03, - "cpu_time": 2.4363716818817798e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 285365, - "real_time": 2.4438048499283063e+03, - "cpu_time": 2.4386945350694859e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 285365, - "real_time": 2.4414958561846051e+03, - "cpu_time": 2.4366188215090228e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 285365, - "real_time": 2.4430508822036727e+03, - "cpu_time": 2.4380824487940154e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 285365, - "real_time": 2.4425341825375103e+03, - "cpu_time": 2.4373683668286167e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 285365, - "real_time": 2.4412947243005196e+03, - "cpu_time": 2.4364773150182650e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 285365, - "real_time": 2.4433774008729329e+03, - "cpu_time": 2.4379280079900032e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 285365, - "real_time": 2.4413341474951758e+03, - "cpu_time": 2.4358871480383955e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 285365, - "real_time": 2.4375161214585769e+03, - "cpu_time": 2.4321053247592645e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_mean", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.4423524528235184e+03, - "cpu_time": 2.4372052809561219e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_median", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.4420240534048535e+03, - "cpu_time": 2.4369935941688195e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_stddev", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.5435295723680200e+00, - "cpu_time": 2.6053219827071699e+00, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 213635, - "real_time": 3.2820750860112835e+03, - "cpu_time": 3.2756775668785094e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 213635, - "real_time": 3.2880034732128765e+03, - "cpu_time": 3.2814732838729151e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 213635, - "real_time": 3.2837414328182967e+03, - "cpu_time": 3.2772871205552678e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 213635, - "real_time": 3.2846612774120458e+03, - "cpu_time": 3.2770199639570073e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 213635, - "real_time": 3.2849472464719515e+03, - "cpu_time": 3.2781946778377055e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 213635, - "real_time": 3.2859165820212156e+03, - "cpu_time": 3.2789775785804613e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 213635, - "real_time": 3.2845362089549385e+03, - "cpu_time": 3.2775195543797868e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 213635, - "real_time": 3.2966926018672561e+03, - "cpu_time": 3.2897262667632981e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 213635, - "real_time": 3.2876677651133891e+03, - "cpu_time": 3.2808467479583360e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 213635, - "real_time": 3.2895518196927596e+03, - "cpu_time": 3.2827857092705417e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_mean", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.2867793493576019e+03, - "cpu_time": 3.2799508470053829e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_median", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.2854319142465838e+03, - "cpu_time": 3.2785861282090832e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_stddev", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.1261339916379827e+00, - "cpu_time": 4.0907039672108390e+00, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0184354003526528e+02, - "cpu_time": 4.0103446573604043e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0273380567325955e+02, - "cpu_time": 4.0186661898493185e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0100451809212643e+02, - "cpu_time": 4.0015810567321103e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0172939434832080e+02, - "cpu_time": 4.0087191257487189e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0034406841831549e+02, - "cpu_time": 3.9947771003730401e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0023019251977041e+02, - "cpu_time": 3.9939367788541966e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0002417360119028e+02, - "cpu_time": 3.9911965855149771e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0021043024330709e+02, - "cpu_time": 3.9927132719178854e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1742107, - "real_time": 4.0018567631037956e+02, - "cpu_time": 3.9926354121766173e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1742107, - "real_time": 3.9897680108054681e+02, - "cpu_time": 3.9803351401494467e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_mean", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.0072826003224816e+02, - "cpu_time": 3.9984905318676721e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_median", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.0028713046904295e+02, - "cpu_time": 3.9943569396136184e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_stddev", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0987981630640626e+00, - "cpu_time": 1.1287939698977640e+00, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 12845, - "real_time": 5.4757908213311508e+04, - "cpu_time": 5.4633775632543693e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 12845, - "real_time": 5.4738408875058034e+04, - "cpu_time": 5.4618917244064331e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 12845, - "real_time": 5.4731730634476538e+04, - "cpu_time": 5.4613407240169465e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 12845, - "real_time": 5.4701611911255321e+04, - "cpu_time": 5.4587632308286687e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 12845, - "real_time": 5.4728778824442830e+04, - "cpu_time": 5.4610492798755928e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 12845, - "real_time": 5.4735067730628230e+04, - "cpu_time": 5.4618504165041501e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 12845, - "real_time": 5.4738721136628577e+04, - "cpu_time": 5.4621828026469870e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 12845, - "real_time": 5.4741721525893270e+04, - "cpu_time": 5.4618241339039545e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 12845, - "real_time": 5.4740168625927887e+04, - "cpu_time": 5.4615738731023448e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 12845, - "real_time": 5.4725263293113028e+04, - "cpu_time": 5.4603543090698309e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_mean", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.4733938077073522e+04, - "cpu_time": 5.4614208057609285e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_median", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.4736738302843136e+04, - "cpu_time": 5.4616990035031493e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_stddev", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4413861439112248e+01, - "cpu_time": 1.2177637241461031e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7051339400770459e+01, - "cpu_time": 9.6800707409304408e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7049181874455314e+01, - "cpu_time": 9.6798720279658781e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7247119465500234e+01, - "cpu_time": 9.6996269837346375e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7424334608030179e+01, - "cpu_time": 9.7167446981707513e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7047414320982483e+01, - "cpu_time": 9.6805149220365152e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7159655560495892e+01, - "cpu_time": 9.6912441614907010e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7248057478250985e+01, - "cpu_time": 9.7022516046371962e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7399088197863804e+01, - "cpu_time": 9.7147148723850734e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7606030351131693e+01, - "cpu_time": 9.7359603831945137e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7218452, - "real_time": 9.7119884706565941e+01, - "cpu_time": 9.6880134272551103e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_mean", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.7235210596404713e+01, - "cpu_time": 9.6989013821800839e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_median", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.7203387512998077e+01, - "cpu_time": 9.6954355726126693e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_stddev", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8948153865228193e-01, - "cpu_time": 1.8813477207942525e-01, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 38777, - "real_time": 1.8056393686974145e+04, - "cpu_time": 1.8017544265927365e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 38777, - "real_time": 1.8037358563066398e+04, - "cpu_time": 1.7998593779816569e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 38777, - "real_time": 1.8040905820463031e+04, - "cpu_time": 1.8002878123628179e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 38777, - "real_time": 1.8070220078914881e+04, - "cpu_time": 1.8032907109882268e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 38777, - "real_time": 1.8058904041052494e+04, - "cpu_time": 1.8020927302266195e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 38777, - "real_time": 1.8049484539805540e+04, - "cpu_time": 1.8007770069885428e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 38777, - "real_time": 1.8031940299663824e+04, - "cpu_time": 1.7993712664724855e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 38777, - "real_time": 1.8020085669339089e+04, - "cpu_time": 1.7976543492275225e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 38777, - "real_time": 1.8026096268408575e+04, - "cpu_time": 1.7985587100601504e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 38777, - "real_time": 1.8010962967733809e+04, - "cpu_time": 1.7969601155322489e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_mean", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8040235193542183e+04, - "cpu_time": 1.8000606506433011e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_median", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8039132191764718e+04, - "cpu_time": 1.8000735951722374e+04, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_stddev", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8662417001993898e+01, - "cpu_time": 2.0047575166427105e+01, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 121922, - "real_time": 5.7600531897440414e+03, - "cpu_time": 5.7476974869173000e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 121922, - "real_time": 5.7609789045444204e+03, - "cpu_time": 5.7483495431506581e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 121922, - "real_time": 5.7631853234042464e+03, - "cpu_time": 5.7500235806500250e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 121922, - "real_time": 5.7601484473674327e+03, - "cpu_time": 5.7481867013326992e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 121922, - "real_time": 5.7618495103434943e+03, - "cpu_time": 5.7498760026901127e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 121922, - "real_time": 5.7612544413639853e+03, - "cpu_time": 5.7496769656002380e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 121922, - "real_time": 5.7606503912343269e+03, - "cpu_time": 5.7488477633237071e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 121922, - "real_time": 5.7628965404111141e+03, - "cpu_time": 5.7504546759411587e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 121922, - "real_time": 5.7640952248169933e+03, - "cpu_time": 5.7512971489968932e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 121922, - "real_time": 5.7636697478722763e+03, - "cpu_time": 5.7501017863872185e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_mean", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.7618781721102332e+03, - "cpu_time": 5.7494511654990019e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_median", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.7615519758537403e+03, - "cpu_time": 5.7497764841451753e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_stddev", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4869537406938422e+00, - "cpu_time": 1.1376902223435985e+00, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 951855, - "real_time": 7.4387513644403577e+02, - "cpu_time": 7.4229710932859541e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 951855, - "real_time": 7.4115030440561225e+02, - "cpu_time": 7.3962449322625673e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 951855, - "real_time": 7.4326930257236904e+02, - "cpu_time": 7.4155184770812662e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 951855, - "real_time": 7.4160971366440242e+02, - "cpu_time": 7.4001522815973146e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 951855, - "real_time": 7.4250292639109273e+02, - "cpu_time": 7.4089801282768610e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 951855, - "real_time": 7.4067354901740907e+02, - "cpu_time": 7.3908382894445378e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 951855, - "real_time": 7.3879837160056832e+02, - "cpu_time": 7.3720605659477224e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 951855, - "real_time": 7.4155209564481652e+02, - "cpu_time": 7.3993423368071501e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 951855, - "real_time": 7.3492096380233306e+02, - "cpu_time": 7.3319396336621446e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 951855, - "real_time": 7.3474149108842778e+02, - "cpu_time": 7.3306687888387160e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_mean", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.4030938546310676e+02, - "cpu_time": 7.3868716527204242e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_median", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.4135120002521433e+02, - "cpu_time": 7.3977936345348598e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_stddev", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.2090488656204657e+00, - "cpu_time": 3.2392964609143475e+00, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 122297, - "real_time": 5.7249659680940613e+03, - "cpu_time": 5.7120204992763620e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 122297, - "real_time": 5.6841065847895879e+03, - "cpu_time": 5.6718735537250141e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 122297, - "real_time": 5.6820824059460401e+03, - "cpu_time": 5.6701122758531219e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 122297, - "real_time": 5.6979245607007360e+03, - "cpu_time": 5.6857877625784158e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 122297, - "real_time": 5.7075118768240973e+03, - "cpu_time": 5.6953744327327513e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 122297, - "real_time": 5.7226372846448721e+03, - "cpu_time": 5.7096871550395945e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 122297, - "real_time": 5.7375003556920092e+03, - "cpu_time": 5.7249824198475426e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 122297, - "real_time": 5.7313068350001859e+03, - "cpu_time": 5.7176147493396638e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 122297, - "real_time": 5.7363313245640738e+03, - "cpu_time": 5.7226116176192900e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 122297, - "real_time": 5.7410244650310324e+03, - "cpu_time": 5.7270997898548385e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_mean", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.7165391661286712e+03, - "cpu_time": 5.7037164255866592e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_median", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.7238016263694672e+03, - "cpu_time": 5.7108538271579782e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_stddev", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.2171175211686275e+01, - "cpu_time": 2.1571731350967546e+01, - "time_unit": "ns" - } - ] -} diff --git a/metrics/benchmark/ios/results.json b/metrics/benchmark/ios/results.json deleted file mode 100644 index 723cc46a90bb..000000000000 --- a/metrics/benchmark/ios/results.json +++ /dev/null @@ -1,12748 +0,0 @@ -{ - "context": { - "date": "2020-04-11 13:24:57", - "host_name": "iPhone", - "executable": "mbgl-benchmark-runner", - "num_cpus": 6, - "mhz_per_cpu": 24, - "cpu_scaling_enabled": false, - "caches": [ - { - "type": "Data", - "level": 1, - "size": 49152000, - "num_sharing": 0 - }, - { - "type": "Instruction", - "level": 1, - "size": 49152000, - "num_sharing": 0 - }, - { - "type": "Unified", - "level": 2, - "size": 4194304000, - "num_sharing": 0 - } - ], - "load_avg": [2.17432,1.91211,1.78174], - "library_build_type": "release" - }, - "benchmarks": [ - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1000, - "real_time": 6.1406495800019905e+05, - "cpu_time": 6.2015200000000000e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1000, - "real_time": 6.1378054099986912e+05, - "cpu_time": 6.1684199999999988e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1000, - "real_time": 6.1446008299981256e+05, - "cpu_time": 6.2008999999999977e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1000, - "real_time": 6.1426679099986365e+05, - "cpu_time": 6.2011100000000012e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1000, - "real_time": 6.1398237499997776e+05, - "cpu_time": 6.2011499999999977e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1000, - "real_time": 6.1358420800024760e+05, - "cpu_time": 6.2010700000000000e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1000, - "real_time": 6.1376395799970848e+05, - "cpu_time": 6.2012399999999965e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1000, - "real_time": 6.1470691699969396e+05, - "cpu_time": 6.2011799999999977e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1000, - "real_time": 6.1438700000007881e+05, - "cpu_time": 6.2013000000000047e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1000, - "real_time": 6.1396074999993283e+05, - "cpu_time": 6.2009500000000012e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_mean", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.1409575809993851e+05, - "cpu_time": 6.1978840000000014e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_median", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.1402366650008853e+05, - "cpu_time": 6.2011299999999988e+05, - "time_unit": "ns" - }, - { - "name": "API_queryPixelsForLatLngs_stddev", - "run_name": "API_queryPixelsForLatLngs", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.5331605650305391e+02, - "cpu_time": 1.0354087973944129e+03, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1166, - "real_time": 6.0882239879927004e+05, - "cpu_time": 6.0943310463121801e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1166, - "real_time": 6.0838529159538250e+05, - "cpu_time": 6.0902572898799356e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1166, - "real_time": 6.0830342367082625e+05, - "cpu_time": 6.0902830188679241e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1166, - "real_time": 6.0857654373946949e+05, - "cpu_time": 6.0901200686106342e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1166, - "real_time": 6.0862021183548425e+05, - "cpu_time": 6.0902744425385993e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1166, - "real_time": 6.0864540394482890e+05, - "cpu_time": 6.0901629502572876e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1166, - "real_time": 6.0834094511148171e+05, - "cpu_time": 6.0901543739279627e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1166, - "real_time": 6.0874731989697681e+05, - "cpu_time": 6.0901543739279627e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1166, - "real_time": 6.1021430102919985e+05, - "cpu_time": 6.1760463121784013e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels", - "run_name": "API_queryLatLngsForPixels", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1166, - "real_time": 6.0899374614051054e+05, - "cpu_time": 6.0902915951972641e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_mean", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.0876495857634314e+05, - "cpu_time": 6.0992075471698144e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_median", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.0863280789015652e+05, - "cpu_time": 6.0902658662092674e+05, - "time_unit": "ns" - }, - { - "name": "API_queryLatLngsForPixels_stddev", - "run_name": "API_queryLatLngsForPixels", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.5420030277920273e+02, - "cpu_time": 2.7029473273201606e+03, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.2892201000000568e+08, - "cpu_time": 1.2903577999999996e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.2879868332000114e+08, - "cpu_time": 1.2883736000000006e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.2886471666000034e+08, - "cpu_time": 1.2903625999999996e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.2897350166000251e+08, - "cpu_time": 1.2907260000000007e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.2899611499999993e+08, - "cpu_time": 1.2903673999999994e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.2851501167999232e+08, - "cpu_time": 1.2863643999999994e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.2882231084000522e+08, - "cpu_time": 1.2883765999999994e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.2890212250000332e+08, - "cpu_time": 1.2895132000000018e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.2861169584000891e+08, - "cpu_time": 1.2863630000000000e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.2881145832000583e+08, - "cpu_time": 1.2894247999999978e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_mean", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.2882176258200255e+08, - "cpu_time": 1.2890229400000000e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_median", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.2884351375000282e+08, - "cpu_time": 1.2894689999999997e+08, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesAll/iterations:50_stddev", - "run_name": "API_queryRenderedFeaturesAll/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.5298478870609801e+05, - "cpu_time": 1.6216893140227729e+05, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1205492983880114e+02, - "cpu_time": 2.1379807873659362e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1228802825311743e+02, - "cpu_time": 2.1379524965107800e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1224759590601744e+02, - "cpu_time": 2.1377796079515917e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1217673768723782e+02, - "cpu_time": 2.1378267593768371e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1216908878301939e+02, - "cpu_time": 2.1379399227973724e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1210992663239773e+02, - "cpu_time": 2.1378361896619037e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1224804101548165e+02, - "cpu_time": 2.1378393330902446e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1223303114503838e+02, - "cpu_time": 2.1378519068036078e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1221083099672575e+02, - "cpu_time": 2.1379053450855790e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3181240, - "real_time": 2.1199179942417183e+02, - "cpu_time": 2.1378990582288978e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_mean", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.1217300096820085e+02, - "cpu_time": 2.1378811406872757e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_median", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.1219378434198180e+02, - "cpu_time": 2.1378754825162528e+02, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromLowDensity_stddev", - "run_name": "API_queryRenderedFeaturesLayerFromLowDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.4424487278019359e-02, - "cpu_time": 6.4353746774283406e-03, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 233, - "real_time": 2.9416893776820176e+06, - "cpu_time": 2.9621630901287645e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 233, - "real_time": 2.9507249613716300e+06, - "cpu_time": 2.9622231759656449e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 233, - "real_time": 2.9450495321901264e+06, - "cpu_time": 2.9621845493562389e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 233, - "real_time": 2.9779699570813505e+06, - "cpu_time": 3.0051502145922543e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 233, - "real_time": 2.9381505708154147e+06, - "cpu_time": 2.9621974248926877e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 233, - "real_time": 2.9572841545060938e+06, - "cpu_time": 2.9668154506438109e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 233, - "real_time": 2.9446228540765359e+06, - "cpu_time": 2.9621158798282715e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 233, - "real_time": 2.9594867682400802e+06, - "cpu_time": 2.9622746781115592e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 233, - "real_time": 2.9392628755382565e+06, - "cpu_time": 2.9621416309012286e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 233, - "real_time": 2.9458762489271518e+06, - "cpu_time": 2.9621201716738762e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_mean", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.9500117300428660e+06, - "cpu_time": 2.9669386266094339e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_median", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.9454628905586391e+06, - "cpu_time": 2.9621909871244631e+06, - "time_unit": "ns" - }, - { - "name": "API_queryRenderedFeaturesLayerFromHighDensity_stddev", - "run_name": "API_queryRenderedFeaturesLayerFromHighDensity", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2115590417273055e+04, - "cpu_time": 1.3505151585333102e+04, - "time_unit": "ns" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.5360666660008064e+01, - "cpu_time": 1.2621999999999787e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.5339180000000852e+01, - "cpu_time": 1.2652379999999823e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.5307210840001062e+01, - "cpu_time": 1.2628579999999943e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.5299408339997171e+01, - "cpu_time": 1.2550799999999924e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.5417822500003240e+01, - "cpu_time": 1.2642020000000116e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.5677383319998626e+01, - "cpu_time": 1.2937139999999943e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.5438917499996023e+01, - "cpu_time": 1.2730819999999881e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.5403034999999363e+01, - "cpu_time": 1.2757100000000037e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.5532157500001631e+01, - "cpu_time": 1.2817479999999932e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.5497851680001986e+01, - "cpu_time": 1.2710260000000062e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_mean", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.5427363334000805e+01, - "cpu_time": 1.2704857999999946e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_median", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.5410428750001305e+01, - "cpu_time": 1.2681319999999943e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.1657647021528601e-01, - "cpu_time": 1.1214637238883471e-01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.5826479999996081e+01, - "cpu_time": 1.2889879999999891e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.5619823339993673e+01, - "cpu_time": 1.2963780000000042e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.5380755840005804e+01, - "cpu_time": 1.2677920000000142e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.5321825820001322e+01, - "cpu_time": 1.2678780000000245e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.5356885840001269e+01, - "cpu_time": 1.2599039999999775e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.5479402499995558e+01, - "cpu_time": 1.2707860000000153e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.5487902499999109e+01, - "cpu_time": 1.2690580000000011e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.5562578319995737e+01, - "cpu_time": 1.2835000000000036e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.5273945839999215e+01, - "cpu_time": 1.2559359999999913e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.5333021679998637e+01, - "cpu_time": 1.2607539999999915e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_mean", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.5464262167998644e+01, - "cpu_time": 1.2720974000000016e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_median", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.5430079170000681e+01, - "cpu_time": 1.2684680000000128e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_formatted_labels/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map_formatted_labels/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.6934208080945015e-01, - "cpu_time": 1.3294523920256907e-01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.0691850918000455e+02, - "cpu_time": 1.0004486000000014e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.0782350665999729e+02, - "cpu_time": 1.0100744000000020e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.0686987000000045e+02, - "cpu_time": 1.0014042000000018e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.0636248668000007e+02, - "cpu_time": 9.9622779999999977e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.0912164665999626e+02, - "cpu_time": 1.0247591999999997e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.1308055499999682e+02, - "cpu_time": 1.0611240000000009e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.1306629166000675e+02, - "cpu_time": 1.0618356000000006e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.1314914334000605e+02, - "cpu_time": 1.0630155999999999e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.1608499750000192e+02, - "cpu_time": 1.0911699999999998e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.1595793415999651e+02, - "cpu_time": 1.0888914000000001e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_mean", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.1084349408400067e+02, - "cpu_time": 1.0398950800000007e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_median", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.1109396916000151e+02, - "cpu_time": 1.0429416000000006e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_reuse_map_switch_styles/iterations:50_stddev", - "run_name": "API_renderStill_reuse_map_switch_styles/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.8333601340130459e+00, - "cpu_time": 3.7355857031548929e+00, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 1.1579031665999537e+02, - "cpu_time": 1.0583371999999997e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.2169249166000554e+02, - "cpu_time": 1.1162530000000004e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.2137501250000241e+02, - "cpu_time": 1.1130758000000014e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.2336013915999501e+02, - "cpu_time": 1.1316528000000005e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.2470781749999333e+02, - "cpu_time": 1.1455475999999977e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.2450206833999800e+02, - "cpu_time": 1.1421084000000008e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.2646549334000156e+02, - "cpu_time": 1.1642183999999986e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.2937197250000281e+02, - "cpu_time": 1.1908768000000009e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.2778286250000747e+02, - "cpu_time": 1.1745154000000014e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.2925551832000565e+02, - "cpu_time": 1.1928343999999981e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_mean", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.2443036924800074e+02, - "cpu_time": 1.1429419800000001e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_median", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.2460494291999566e+02, - "cpu_time": 1.1438279999999990e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map/iterations:50_stddev", - "run_name": "API_renderStill_recreate_map/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.1605507827600565e+00, - "cpu_time": 4.1006444340096557e+00, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 2.6836577250000119e+02, - "cpu_time": 2.5068518000000040e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 2.7378597750000154e+02, - "cpu_time": 2.5469285999999954e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 2.7125332499999786e+02, - "cpu_time": 2.5314238000000046e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 2.6220731583999623e+02, - "cpu_time": 2.4417699999999968e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 2.7529173334000006e+02, - "cpu_time": 2.5603068000000007e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 2.7237453249999817e+02, - "cpu_time": 2.5416506000000027e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 2.6328114832000210e+02, - "cpu_time": 2.4602250000000026e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 2.6347094665999975e+02, - "cpu_time": 2.4558205999999925e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 2.6769511415999659e+02, - "cpu_time": 2.5029572000000030e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 2.6384003084000142e+02, - "cpu_time": 2.4589627999999945e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_mean", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.6815658966599949e+02, - "cpu_time": 2.5006897199999997e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_median", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.6803044332999895e+02, - "cpu_time": 2.5049045000000038e+02, - "time_unit": "ms" - }, - { - "name": "API_renderStill_recreate_map_2/iterations:50_stddev", - "run_name": "API_renderStill_recreate_map_2/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.8303384867325132e+00, - "cpu_time": 4.3742962688003617e+00, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 50, - "real_time": 2.0106681660008690e+01, - "cpu_time": 1.7284760000000006e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 50, - "real_time": 1.9222934159997749e+01, - "cpu_time": 1.6586959999999635e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 50, - "real_time": 1.9318882500001564e+01, - "cpu_time": 1.6564379999999801e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 50, - "real_time": 1.9330660839996199e+01, - "cpu_time": 1.6665219999999863e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 50, - "real_time": 1.9400025820004885e+01, - "cpu_time": 1.6653600000000779e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 50, - "real_time": 1.9326311659997373e+01, - "cpu_time": 1.6600479999999607e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 50, - "real_time": 1.9242889179995473e+01, - "cpu_time": 1.6488140000000158e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 50, - "real_time": 1.9364396660002967e+01, - "cpu_time": 1.6611080000000129e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 50, - "real_time": 1.9217018320005081e+01, - "cpu_time": 1.6470199999999977e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 50, - "real_time": 1.9249169160002566e+01, - "cpu_time": 1.6539380000000392e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_mean", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.9377896996001258e+01, - "cpu_time": 1.6646420000000038e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_median", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.9322597079999472e+01, - "cpu_time": 1.6593719999999625e+01, - "time_unit": "ms" - }, - { - "name": "API_renderStill_multiple_sources/iterations:50_stddev", - "run_name": "API_renderStill_multiple_sources/iterations:50", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.6349519024808166e-01, - "cpu_time": 2.3311227833618281e-01, - "time_unit": "ms" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 291600, - "real_time": 2.2286188409259357e+03, - "cpu_time": 2.1266529492453892e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 291600, - "real_time": 2.2649204183832417e+03, - "cpu_time": 2.5382578875171916e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 291600, - "real_time": 2.2639461557441969e+03, - "cpu_time": 2.2295473251027947e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 291600, - "real_time": 2.2643067559260594e+03, - "cpu_time": 2.2637277091906458e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 291600, - "real_time": 2.2624247050854960e+03, - "cpu_time": 2.4010185185188529e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 291600, - "real_time": 2.2646467901839292e+03, - "cpu_time": 2.4010596707825130e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 291600, - "real_time": 2.2639933434061995e+03, - "cpu_time": 2.1608093278463325e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 291600, - "real_time": 2.2640004320596804e+03, - "cpu_time": 2.4695816186558304e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 291600, - "real_time": 2.2608628394437205e+03, - "cpu_time": 2.3324519890258230e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1", - "run_name": "Parse_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 291600, - "real_time": 2.2608854868972958e+03, - "cpu_time": 1.9207475994517013e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_mean", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2598605768055759e+03, - "cpu_time": 2.2843854595337079e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_median", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2639697495751984e+03, - "cpu_time": 2.2980898491082344e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/1_stddev", - "run_name": "Parse_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.1074817512050396e+01, - "cpu_time": 1.8381525216815703e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 259218, - "real_time": 2.5287121498623296e+03, - "cpu_time": 2.6237645533869436e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 259218, - "real_time": 2.5268472324499603e+03, - "cpu_time": 2.6623729833569714e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 259218, - "real_time": 2.5346127466355206e+03, - "cpu_time": 2.3922104174865412e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 259218, - "real_time": 2.5325470030755550e+03, - "cpu_time": 2.5081321513174867e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 259218, - "real_time": 2.5359156539844348e+03, - "cpu_time": 2.5465901287714878e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 259218, - "real_time": 2.5294650334169810e+03, - "cpu_time": 2.4694774282654184e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 259218, - "real_time": 2.5313414463107561e+03, - "cpu_time": 2.8551798100440769e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 259218, - "real_time": 2.5295643010350805e+03, - "cpu_time": 2.7782137042950599e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 259218, - "real_time": 2.5266829269540840e+03, - "cpu_time": 2.4694157041553740e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2", - "run_name": "Parse_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 259218, - "real_time": 2.5304840404305992e+03, - "cpu_time": 2.7780709672941316e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_mean", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.5306172534155298e+03, - "cpu_time": 2.6083427848373494e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_median", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.5300241707328396e+03, - "cpu_time": 2.5851773410792152e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/2_stddev", - "run_name": "Parse_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.0561571991147032e+00, - "cpu_time": 1.5666754550414009e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 225780, - "real_time": 3.0600872355210827e+03, - "cpu_time": 2.9237487820004121e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 225780, - "real_time": 3.0524236689328386e+03, - "cpu_time": 3.2338205332618272e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 225780, - "real_time": 3.0580107094056002e+03, - "cpu_time": 3.0124058818320877e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 225780, - "real_time": 3.0552782883781629e+03, - "cpu_time": 2.8794313048095787e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 225780, - "real_time": 3.0546066570024095e+03, - "cpu_time": 3.2781734431756977e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 225780, - "real_time": 3.0463685974975774e+03, - "cpu_time": 3.2338205332625830e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 225780, - "real_time": 3.0437975815175960e+03, - "cpu_time": 2.8793825848170400e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 225780, - "real_time": 3.0557354462183102e+03, - "cpu_time": 3.1452653025067420e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 225780, - "real_time": 3.0589917263147245e+03, - "cpu_time": 2.9236912038273658e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4", - "run_name": "Parse_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 225780, - "real_time": 3.0522355344814209e+03, - "cpu_time": 3.2338559659851157e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_mean", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.0537535445269723e+03, - "cpu_time": 3.0743595535478448e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_median", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.0549424726902862e+03, - "cpu_time": 3.0788355921694147e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/4_stddev", - "run_name": "Parse_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.2745698881446286e+00, - "cpu_time": 1.6603155475465033e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 205857, - "real_time": 3.5762065561230388e+03, - "cpu_time": 3.8383489509712758e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 205857, - "real_time": 3.6547419618416607e+03, - "cpu_time": 4.1784782640373078e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 205857, - "real_time": 3.6458898555821324e+03, - "cpu_time": 3.6925001335879338e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 205857, - "real_time": 3.6436867145493975e+03, - "cpu_time": 3.6438790033857790e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 205857, - "real_time": 3.6599793059581089e+03, - "cpu_time": 3.5955541953885049e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 205857, - "real_time": 3.6411128598388063e+03, - "cpu_time": 3.3036962551671922e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 205857, - "real_time": 3.6477911170404095e+03, - "cpu_time": 3.6438935766094542e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 205857, - "real_time": 3.6522498724706702e+03, - "cpu_time": 3.3524291134141181e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 205857, - "real_time": 3.7043539691585811e+03, - "cpu_time": 4.0811145601064204e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6", - "run_name": "Parse_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 205857, - "real_time": 3.6953342662783634e+03, - "cpu_time": 4.0812554345968856e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_mean", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.6521346478841174e+03, - "cpu_time": 3.7411149487264875e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_median", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.6500204947555403e+03, - "cpu_time": 3.6681968550986940e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/6_stddev", - "run_name": "Parse_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.4443513767240020e+01, - "cpu_time": 3.0127624018724805e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 100000, - "real_time": 4.2509082089736694e+03, - "cpu_time": 5.0008899999994583e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 100000, - "real_time": 4.2231167591717167e+03, - "cpu_time": 4.9009000000000924e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 100000, - "real_time": 4.2138209999666287e+03, - "cpu_time": 4.5009900000002290e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 100000, - "real_time": 4.2320925996000369e+03, - "cpu_time": 4.2007299999988845e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 100000, - "real_time": 4.2251873697705378e+03, - "cpu_time": 3.5005000000006708e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 100000, - "real_time": 4.2375546100538486e+03, - "cpu_time": 3.7007999999980257e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 100000, - "real_time": 4.2458654706979360e+03, - "cpu_time": 4.1007599999994682e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 100000, - "real_time": 4.2267558798266691e+03, - "cpu_time": 4.0008599999981693e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 100000, - "real_time": 4.2459539508263333e+03, - "cpu_time": 3.9007300000002942e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8", - "run_name": "Parse_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 100000, - "real_time": 4.2456966600957458e+03, - "cpu_time": 4.6979599999997390e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_mean", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.2346952508983131e+03, - "cpu_time": 4.2505119999995031e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_median", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.2348236048269428e+03, - "cpu_time": 4.1507449999991768e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/8_stddev", - "run_name": "Parse_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2354046192881572e+01, - "cpu_time": 5.0807910531960454e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 159064, - "real_time": 4.8100319370055904e+03, - "cpu_time": 5.0301639591607209e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 159064, - "real_time": 4.7986702911879938e+03, - "cpu_time": 4.9047804657258430e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 159064, - "real_time": 4.7981536581957216e+03, - "cpu_time": 4.5901461047128114e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 159064, - "real_time": 4.8054913698048713e+03, - "cpu_time": 5.2190124729656936e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 159064, - "real_time": 4.8268832690227709e+03, - "cpu_time": 4.9675162198858216e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 159064, - "real_time": 4.8054536514018873e+03, - "cpu_time": 5.2819368304578893e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 159064, - "real_time": 4.8016003922216314e+03, - "cpu_time": 5.0303399889351695e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 159064, - "real_time": 4.7709701958348387e+03, - "cpu_time": 5.0932517728717412e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 159064, - "real_time": 4.7671732047922014e+03, - "cpu_time": 5.0931951918716122e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10", - "run_name": "Parse_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 159064, - "real_time": 4.7861405272300344e+03, - "cpu_time": 4.9674596388878363e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_mean", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.7970568496697542e+03, - "cpu_time": 5.0177802645475140e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_median", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.8001353417048131e+03, - "cpu_time": 5.0302519740479447e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/10_stddev", - "run_name": "Parse_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.8002399187302917e+01, - "cpu_time": 1.8934569330642648e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 142828, - "real_time": 5.3154410763255482e+03, - "cpu_time": 5.8822009689977585e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 142828, - "real_time": 5.2701873650788420e+03, - "cpu_time": 4.9718682611257555e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 142828, - "real_time": 5.2813504007216525e+03, - "cpu_time": 5.6020948273440454e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 142828, - "real_time": 5.2286398953814887e+03, - "cpu_time": 5.7423264345928765e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 142828, - "real_time": 5.1955237133169940e+03, - "cpu_time": 4.9718332539831936e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 142828, - "real_time": 5.2015436049213376e+03, - "cpu_time": 4.8317696810145235e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 142828, - "real_time": 5.1656818552720451e+03, - "cpu_time": 4.9717422354172268e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 142828, - "real_time": 5.2433104080904677e+03, - "cpu_time": 5.6021858459131954e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 142828, - "real_time": 5.3134764543312231e+03, - "cpu_time": 5.3923740443060715e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12", - "run_name": "Parse_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 142828, - "real_time": 5.2901784453984874e+03, - "cpu_time": 5.2520584199175591e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_mean", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.2505333218838095e+03, - "cpu_time": 5.3220453972612213e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_median", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.2567488865846553e+03, - "cpu_time": 5.3222162321118149e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CameraFunction/12_stddev", - "run_name": "Parse_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.1897203399281373e+01, - "cpu_time": 3.7498388407624526e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5981707220362065e+01, - "cpu_time": 2.6007623790185814e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5987751776155193e+01, - "cpu_time": 2.6008849730777786e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5995593486554892e+01, - "cpu_time": 2.6008738281633445e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 26918107, - "real_time": 2.6063825104796081e+01, - "cpu_time": 2.6009072629066466e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5958792050266727e+01, - "cpu_time": 2.6009704174219845e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5989384803334001e+01, - "cpu_time": 2.6009072629068580e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5978647012576943e+01, - "cpu_time": 2.6009221227925586e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 26918107, - "real_time": 2.5964869112071380e+01, - "cpu_time": 2.6007846688476604e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 26918107, - "real_time": 2.6022389241562681e+01, - "cpu_time": 2.6007586640473146e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 26918107, - "real_time": 2.6514989817066599e+01, - "cpu_time": 2.6379566735505758e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_mean", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.6045794962474652e+01, - "cpu_time": 2.6045728252733305e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_median", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.5988568289744599e+01, - "cpu_time": 2.6008961179922132e+01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/1_stddev", - "run_name": "Evaluate_CameraFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.6760489815048599e-01, - "cpu_time": 1.1730109787820384e-01, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1337321854324863e+01, - "cpu_time": 6.1025171591754187e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 9997858, - "real_time": 6.0931551538319269e+01, - "cpu_time": 6.1023771291807797e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1058587049349320e+01, - "cpu_time": 6.1024771506056851e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1014761061813338e+01, - "cpu_time": 6.1026171806003241e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1035411285123239e+01, - "cpu_time": 6.1026671913124922e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 9997858, - "real_time": 6.0716105389775123e+01, - "cpu_time": 6.0020356360332777e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1028355573766824e+01, - "cpu_time": 6.1020770649072006e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1037203368957151e+01, - "cpu_time": 6.2021885087787282e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1019562090181502e+01, - "cpu_time": 6.1022771077564421e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 9997858, - "real_time": 6.1002212473888449e+01, - "cpu_time": 6.0021956703122164e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_mean", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.1018107168549911e+01, - "cpu_time": 6.0923429798662575e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_median", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.1023958831974156e+01, - "cpu_time": 6.1024271398932306e+01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/2_stddev", - "run_name": "Evaluate_CameraFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.5028442276985648e-01, - "cpu_time": 5.6823783495727642e-01, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 8749125, - "real_time": 7.8730725415417936e+01, - "cpu_time": 7.8877144857344518e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 8749125, - "real_time": 7.8453350134999710e+01, - "cpu_time": 7.8879430800225236e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 8749125, - "real_time": 7.8665604617616097e+01, - "cpu_time": 7.8877830640206781e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 8749125, - "real_time": 7.8675105567704989e+01, - "cpu_time": 7.7735202091637817e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7936369751288211e+01, - "cpu_time": 7.8878402125925334e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7451306959224851e+01, - "cpu_time": 7.6591316274481528e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7973973625904222e+01, - "cpu_time": 7.8730958810167124e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7642521394975716e+01, - "cpu_time": 7.7733373337331940e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7521833097571047e+01, - "cpu_time": 7.6591887760206575e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 8749125, - "real_time": 7.7538210963963692e+01, - "cpu_time": 7.7736230765937719e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_mean", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.8058900152866642e+01, - "cpu_time": 7.8063177746346454e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_median", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.7955171688596209e+01, - "cpu_time": 7.8233594788052415e+01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/4_stddev", - "run_name": "Evaluate_CameraFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.2483485436722399e-01, - "cpu_time": 9.2839747854080257e-01, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4884236726283447e+01, - "cpu_time": 8.4598234339247497e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4865015351675069e+01, - "cpu_time": 8.5743291789852805e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4740309245551842e+01, - "cpu_time": 8.4597662839217193e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4819581099619157e+01, - "cpu_time": 8.4595491139120170e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4902186627671696e+01, - "cpu_time": 8.4594919639096361e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 8748906, - "real_time": 8.5878913546417962e+01, - "cpu_time": 8.5740205689711189e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4890109003354581e+01, - "cpu_time": 8.5741577289781361e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4772127509470465e+01, - "cpu_time": 8.4596634139167818e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4787791296412692e+01, - "cpu_time": 8.4597548539212426e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 8748906, - "real_time": 8.4817233148952582e+01, - "cpu_time": 8.4595491139120170e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_mean", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.4935750355540947e+01, - "cpu_time": 8.4940105654352692e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_median", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.4842298225647113e+01, - "cpu_time": 8.4597605689214802e+01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/6_stddev", - "run_name": "Evaluate_CameraFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.3579536211194194e-01, - "cpu_time": 5.5314832923102064e-01, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5679224552417821e+01, - "cpu_time": 8.6171858654285757e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5625948505877318e+01, - "cpu_time": 8.4887701864723624e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5667072257581751e+01, - "cpu_time": 8.6172373037128949e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5706299222404283e+01, - "cpu_time": 8.4887830460443567e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5557808852507534e+01, - "cpu_time": 8.6171087080002664e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5283621316990732e+01, - "cpu_time": 8.4886544503309977e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5032120251385024e+01, - "cpu_time": 8.4887959056156177e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7776309, - "real_time": 8.4930309996651218e+01, - "cpu_time": 8.4887187481873113e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5055165631877983e+01, - "cpu_time": 8.6170958484290040e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7776309, - "real_time": 8.5594431754196847e+01, - "cpu_time": 8.4883072419061691e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_mean", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.5413200234189063e+01, - "cpu_time": 8.5400657304127563e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_median", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.5576120303352184e+01, - "cpu_time": 8.4887894758299879e+01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/8_stddev", - "run_name": "Evaluate_CameraFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.0614624491926146e-01, - "cpu_time": 6.6349697598055901e-01, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7776482, - "real_time": 9.2897678538957919e+01, - "cpu_time": 9.2600741569264727e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7776482, - "real_time": 9.2411324298079350e+01, - "cpu_time": 9.2595855040873786e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7776482, - "real_time": 9.2444110203055843e+01, - "cpu_time": 9.2598555490776533e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7776482, - "real_time": 9.2410986741845164e+01, - "cpu_time": 9.2599584233591060e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7776482, - "real_time": 9.2669570893392901e+01, - "cpu_time": 9.1668700576941845e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7776482, - "real_time": 1.0437584437282860e+02, - "cpu_time": 1.0546555627596256e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7776482, - "real_time": 1.0475081045644868e+02, - "cpu_time": 1.0417667011895870e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7776482, - "real_time": 1.0465976658853759e+02, - "cpu_time": 1.0417834182603231e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7776482, - "real_time": 1.0436924871683779e+02, - "cpu_time": 1.0546504190455529e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7776482, - "real_time": 1.0436978983556783e+02, - "cpu_time": 1.0417795604747685e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_mean", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.8535913064555189e+01, - "cpu_time": 9.8552700308443363e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_median", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.8633463627897854e+01, - "cpu_time": 9.8388705844111698e+01, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/10_stddev", - "run_name": "Evaluate_CameraFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.2949034360882958e+00, - "cpu_time": 6.4951189126137221e+00, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0089006771557179e+02, - "cpu_time": 1.0004501035238073e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0084827838975882e+02, - "cpu_time": 1.0146690881759929e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0110178312440257e+02, - "cpu_time": 1.0146733748762088e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0092931488524336e+02, - "cpu_time": 1.0004000920212066e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0131823762320498e+02, - "cpu_time": 1.0146619436755518e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0112960509488012e+02, - "cpu_time": 1.0147291019791786e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0175555263425233e+02, - "cpu_time": 1.0147648244810593e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0146827827545570e+02, - "cpu_time": 1.0147190996786746e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0172293198858539e+02, - "cpu_time": 1.0146790904764967e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 6998390, - "real_time": 1.0159184240947673e+02, - "cpu_time": 1.0146633725757049e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_mean", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.0127558921408318e+02, - "cpu_time": 1.0118410091463883e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_median", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.0122392135904255e+02, - "cpu_time": 1.0146712315261007e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CameraFunction/12_stddev", - "run_name": "Evaluate_CameraFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.4513953449600010e-01, - "cpu_time": 6.0168184303155126e-01, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 212078, - "real_time": 3.6459285782809038e+03, - "cpu_time": 3.4428370693787019e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 212078, - "real_time": 3.6433087921210786e+03, - "cpu_time": 3.4898433595189022e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 212078, - "real_time": 3.6449446995073963e+03, - "cpu_time": 3.5370759814787693e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 212078, - "real_time": 3.6552699807306808e+03, - "cpu_time": 3.8202312356768325e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 212078, - "real_time": 3.6593084522305612e+03, - "cpu_time": 3.3485321438341343e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 212078, - "real_time": 3.6477635352049933e+03, - "cpu_time": 3.5843038881923721e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 212078, - "real_time": 3.5390333980792702e+03, - "cpu_time": 3.3484001169389712e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 212078, - "real_time": 3.5329239570517270e+03, - "cpu_time": 3.9145031544999542e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 212078, - "real_time": 3.5279543709626359e+03, - "cpu_time": 3.5371844321426065e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1", - "run_name": "Parse_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 212078, - "real_time": 3.5233571180038120e+03, - "cpu_time": 3.5370571204923681e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_mean", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.6019792882173060e+03, - "cpu_time": 3.5559968502153606e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_median", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.6441267458142379e+03, - "cpu_time": 3.5370665509855689e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/1_stddev", - "run_name": "Parse_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.1554294602314066e+01, - "cpu_time": 1.8364758436009964e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 116641, - "real_time": 5.9176232113032611e+03, - "cpu_time": 6.8600406375116836e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 116641, - "real_time": 5.8934573181636742e+03, - "cpu_time": 6.5171766360009697e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 116641, - "real_time": 5.9050469819939763e+03, - "cpu_time": 6.0027263140750620e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 116641, - "real_time": 5.9150631084876150e+03, - "cpu_time": 6.0879879287723161e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 116641, - "real_time": 5.9208702769466108e+03, - "cpu_time": 6.6027297434012080e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 116641, - "real_time": 5.9148994692551769e+03, - "cpu_time": 5.6593736336266693e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 116641, - "real_time": 5.9353387396129938e+03, - "cpu_time": 6.0882194082696242e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 116641, - "real_time": 5.9154430516283510e+03, - "cpu_time": 5.7452525269837361e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 116641, - "real_time": 5.9248156222137422e+03, - "cpu_time": 6.8600406375107095e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2", - "run_name": "Parse_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 116641, - "real_time": 5.8992862202407314e+03, - "cpu_time": 5.4022599257557613e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_mean", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.9141843999846133e+03, - "cpu_time": 6.1825807391907738e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_median", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.9152530800579825e+03, - "cpu_time": 6.0881036685209692e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/2_stddev", - "run_name": "Parse_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2270031648269839e+01, - "cpu_time": 5.0886421619791747e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 69983, - "real_time": 1.3199300330133485e+04, - "cpu_time": 1.3720203477988811e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 69983, - "real_time": 1.3216699541883190e+04, - "cpu_time": 1.3005229841533755e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 69983, - "real_time": 1.3195057371385092e+04, - "cpu_time": 1.3148879013476719e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 69983, - "real_time": 1.3213708343430542e+04, - "cpu_time": 1.3577354500381611e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 69983, - "real_time": 1.3261713758462953e+04, - "cpu_time": 1.3291556520866910e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 69983, - "real_time": 1.3213386608747331e+04, - "cpu_time": 1.4148793278369541e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 69983, - "real_time": 1.3172478159099142e+04, - "cpu_time": 1.4006230084448696e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 69983, - "real_time": 1.3110302044095592e+04, - "cpu_time": 1.2863223925801136e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 69983, - "real_time": 1.3120783947335774e+04, - "cpu_time": 1.3434476944399763e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4", - "run_name": "Parse_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 69983, - "real_time": 1.3137140504887928e+04, - "cpu_time": 1.3291227869620618e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_mean", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.3184057060946103e+04, - "cpu_time": 1.3448717545688758e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_median", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.3197178850759290e+04, - "cpu_time": 1.3363016732633336e+04, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/4_stddev", - "run_name": "Parse_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.8267084321889541e+01, - "cpu_time": 4.1770151337654380e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 25921, - "real_time": 2.3540529918738379e+04, - "cpu_time": 2.5466455769453969e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 25921, - "real_time": 2.3543455307551907e+04, - "cpu_time": 2.4694726283705528e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 25921, - "real_time": 2.3475142162166310e+04, - "cpu_time": 2.8552872188574889e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 25921, - "real_time": 2.3477067859743609e+04, - "cpu_time": 2.1994521816291352e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 25921, - "real_time": 2.3466042088262984e+04, - "cpu_time": 2.3536746267505063e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 25921, - "real_time": 2.3493548589430884e+04, - "cpu_time": 2.5080513869069451e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 25921, - "real_time": 2.3548475215769609e+04, - "cpu_time": 2.1608387022097097e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 25921, - "real_time": 2.3480091238532434e+04, - "cpu_time": 2.1608155549555238e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 25921, - "real_time": 2.3481549439149072e+04, - "cpu_time": 2.4308822962075061e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6", - "run_name": "Parse_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 25921, - "real_time": 2.3514818408854058e+04, - "cpu_time": 2.2764862466718478e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_mean", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3502072022819928e+04, - "cpu_time": 2.3961606419504616e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_median", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3487549014289980e+04, - "cpu_time": 2.3922784614790064e+04, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/6_stddev", - "run_name": "Parse_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.1855358296670524e+01, - "cpu_time": 2.1554264201668125e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 13997, - "real_time": 3.7494316998783630e+04, - "cpu_time": 3.9302279059799082e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 13997, - "real_time": 3.7250937844446307e+04, - "cpu_time": 3.5727798814033027e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 13997, - "real_time": 3.7216378509631999e+04, - "cpu_time": 3.9300707294416628e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 13997, - "real_time": 3.7158768308049446e+04, - "cpu_time": 3.4299564192328056e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 13997, - "real_time": 3.7183344289082037e+04, - "cpu_time": 3.7872901335979324e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 13997, - "real_time": 3.7296453026707830e+04, - "cpu_time": 3.7158533971544552e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 13997, - "real_time": 3.7293521538635192e+04, - "cpu_time": 3.1439594198782441e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 13997, - "real_time": 3.7251465601602962e+04, - "cpu_time": 4.3590126455646416e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 13997, - "real_time": 3.7256024720991023e+04, - "cpu_time": 4.2158319639908885e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8", - "run_name": "Parse_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 13997, - "real_time": 3.7189756017988249e+04, - "cpu_time": 3.5729084803892874e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_mean", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.7259096685591867e+04, - "cpu_time": 3.7657890976633134e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_median", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.7251201723024627e+04, - "cpu_time": 3.7515717653761938e+04, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/8_stddev", - "run_name": "Parse_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.4563664162273923e+01, - "cpu_time": 3.6291236016216681e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 11665, - "real_time": 5.3976478523439509e+04, - "cpu_time": 5.5165880840109581e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 11665, - "real_time": 5.3922730388910823e+04, - "cpu_time": 5.2303129018417007e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 11665, - "real_time": 5.4009081094522240e+04, - "cpu_time": 5.9161594513490381e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 11665, - "real_time": 5.3545461379989174e+04, - "cpu_time": 4.2872267466797224e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 11665, - "real_time": 5.3544283326627738e+04, - "cpu_time": 4.7160565795111230e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 11665, - "real_time": 5.3780727136880319e+04, - "cpu_time": 5.2303043291914109e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 11665, - "real_time": 5.3656279382706540e+04, - "cpu_time": 5.4019374196293677e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 11665, - "real_time": 5.4722180884850153e+04, - "cpu_time": 5.4019802829022628e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 11665, - "real_time": 5.4776678355494209e+04, - "cpu_time": 5.8303729104148479e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10", - "run_name": "Parse_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 11665, - "real_time": 5.4587079982797077e+04, - "cpu_time": 5.1448006858152505e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_mean", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.4052098045621780e+04, - "cpu_time": 5.2675739391345684e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_median", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.3949604456175162e+04, - "cpu_time": 5.3161251607355349e+04, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/10_stddev", - "run_name": "Parse_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.7485777456949864e+02, - "cpu_time": 4.8518440931590349e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 10000, - "real_time": 7.5627025700578088e+04, - "cpu_time": 6.6852399999993402e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 10000, - "real_time": 7.6130628900546071e+04, - "cpu_time": 7.7014899999994668e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 10000, - "real_time": 7.6286021504893142e+04, - "cpu_time": 7.4015700000006749e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 10000, - "real_time": 7.5545025798328425e+04, - "cpu_time": 7.4014300000010277e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 10000, - "real_time": 7.5594138099631891e+04, - "cpu_time": 8.0015099999991435e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 10000, - "real_time": 7.6498615700120354e+04, - "cpu_time": 7.9017000000021653e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 10000, - "real_time": 7.6633428100694800e+04, - "cpu_time": 8.9015400000039343e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 10000, - "real_time": 7.5360643997964871e+04, - "cpu_time": 8.0015100000025544e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 10000, - "real_time": 7.4540434199479932e+04, - "cpu_time": 7.5015700000028577e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12", - "run_name": "Parse_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 10000, - "real_time": 7.4178429700714332e+04, - "cpu_time": 7.0016399999974514e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_mean", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 7.5639439170295198e+04, - "cpu_time": 7.6499200000008612e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_median", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 7.5610581900104982e+04, - "cpu_time": 7.6015300000011615e+04, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_CompositeFunction/12_stddev", - "run_name": "Parse_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.0393075157101168e+02, - "cpu_time": 6.1247616731999960e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9435442665791592e+02, - "cpu_time": 1.9551053286152998e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9444942562211824e+02, - "cpu_time": 1.9279318951061737e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9434243575936227e+02, - "cpu_time": 1.9551189031152791e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9503810633552328e+02, - "cpu_time": 1.9550836094161352e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9456350788966185e+02, - "cpu_time": 1.9279916229047248e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9478499838606245e+02, - "cpu_time": 1.9551406223147526e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9446969696557909e+02, - "cpu_time": 1.9552112097130404e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9474499895067649e+02, - "cpu_time": 1.9279237504063710e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9519460918617170e+02, - "cpu_time": 1.9551650564141599e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3683377, - "real_time": 1.9561713802298939e+02, - "cpu_time": 1.9551487670148637e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_mean", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.9475593437760605e+02, - "cpu_time": 1.9469820765020799e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_median", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.9465425342016914e+02, - "cpu_time": 1.9551121158652896e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/1_stddev", - "run_name": "Evaluate_CompositeFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.1630512357299504e-01, - "cpu_time": 1.3134065283147072e+00, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9693768388108361e+02, - "cpu_time": 2.9841739998109580e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9891343022096032e+02, - "cpu_time": 2.9840994114147804e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9966331999592245e+02, - "cpu_time": 2.9841367056128689e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9901502251737770e+02, - "cpu_time": 3.0255042589971112e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9863052969365640e+02, - "cpu_time": 2.9841574246122786e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9732462817684461e+02, - "cpu_time": 2.9427732960279440e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9835111658812713e+02, - "cpu_time": 2.9842651634067573e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9706412115807615e+02, - "cpu_time": 2.9842154378088344e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9724237375089484e+02, - "cpu_time": 2.9841325618130816e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2413244, - "real_time": 2.9962241696240710e+02, - "cpu_time": 2.9778464175191959e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_mean", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.9827646429453500e+02, - "cpu_time": 2.9835304677023817e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_median", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.9849082314089179e+02, - "cpu_time": 2.9841470651125735e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/2_stddev", - "run_name": "Evaluate_CompositeFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0569626586215883e+00, - "cpu_time": 1.9601940193264595e+00, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5635418309423812e+02, - "cpu_time": 3.5498035899545846e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5559054536513975e+02, - "cpu_time": 3.5498138772430900e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5572629435954281e+02, - "cpu_time": 3.5498293081743867e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5678380595707159e+02, - "cpu_time": 3.6012760351970837e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5566103437652436e+02, - "cpu_time": 3.5496852861434945e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5595190795757696e+02, - "cpu_time": 3.5498395954628927e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5561474158076345e+02, - "cpu_time": 3.5497315789391388e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5565141164739401e+02, - "cpu_time": 3.5499733302058644e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5558175796361127e+02, - "cpu_time": 3.6012914661289653e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1944147, - "real_time": 3.5529062822922475e+02, - "cpu_time": 3.5497830153787430e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_mean", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.5582063105310874e+02, - "cpu_time": 3.5601027082828250e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_median", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.5565622301195918e+02, - "cpu_time": 3.5498215927087386e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/4_stddev", - "run_name": "Evaluate_CompositeFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.3791377446511887e-01, - "cpu_time": 2.1704444268100707e+00, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8679658250542798e+02, - "cpu_time": 3.8457680586184068e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8725854164687883e+02, - "cpu_time": 3.9016879619240757e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8707618257933524e+02, - "cpu_time": 3.8457903485648603e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1794531, - "real_time": 4.0498629335448476e+02, - "cpu_time": 4.0471020004670419e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1794531, - "real_time": 4.0059742629135872e+02, - "cpu_time": 3.9340418192829446e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8897396255646652e+02, - "cpu_time": 3.9015709397051950e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1794531, - "real_time": 3.9012372870681907e+02, - "cpu_time": 3.9016043746248755e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8941223862958890e+02, - "cpu_time": 3.9016266645713284e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8909332912038599e+02, - "cpu_time": 3.9016099471114887e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1794531, - "real_time": 3.8896885370052547e+02, - "cpu_time": 3.9015820846784214e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_mean", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.9132871390912715e+02, - "cpu_time": 3.9082384199548642e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_median", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.8903364583842620e+02, - "cpu_time": 3.9016071608681824e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/6_stddev", - "run_name": "Evaluate_CompositeFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.2259729420156358e+00, - "cpu_time": 5.5791825553073711e+00, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9612586527277881e+02, - "cpu_time": 3.9446145474977578e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9647006475239220e+02, - "cpu_time": 3.9445688225771994e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9657711364875655e+02, - "cpu_time": 4.0017478350680733e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9620633713103405e+02, - "cpu_time": 3.9445059508129748e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9588776303981905e+02, - "cpu_time": 3.9446545568020287e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9588766701746283e+02, - "cpu_time": 4.0016963945331753e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9638714089497995e+02, - "cpu_time": 3.9446717036476440e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9680204653314388e+02, - "cpu_time": 3.9445402445029066e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9668228096480669e+02, - "cpu_time": 4.0018107068329476e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1749593, - "real_time": 3.9920427207927355e+02, - "cpu_time": 3.9446259787270850e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_mean", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.9662305513344484e+02, - "cpu_time": 3.9617436741001796e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_median", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.9642860282368611e+02, - "cpu_time": 3.9446402677645574e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/8_stddev", - "run_name": "Evaluate_CompositeFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.5926479610267135e-01, - "cpu_time": 2.7608181303220052e+00, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1533669422230707e+02, - "cpu_time": 4.1416890462540528e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1527153046378589e+02, - "cpu_time": 4.1416470376430760e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1716126806004689e+02, - "cpu_time": 4.2015813241712743e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1706614856027790e+02, - "cpu_time": 4.1416050290307345e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1535999879972280e+02, - "cpu_time": 4.2016833450859866e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1738513915353985e+02, - "cpu_time": 4.1415990278004972e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1608972379340167e+02, - "cpu_time": 4.1416290339523641e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1803384693856077e+02, - "cpu_time": 4.1871183592631417e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1643259388158850e+02, - "cpu_time": 4.2017013487766974e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1666325, - "real_time": 4.1600375557001991e+02, - "cpu_time": 4.1417190524059208e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_mean", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.1641406994432521e+02, - "cpu_time": 4.1641972604383744e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_median", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.1626115883749515e+02, - "cpu_time": 4.1417040493299874e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/10_stddev", - "run_name": "Evaluate_CompositeFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.6616462835802996e-01, - "cpu_time": 2.9411872417882803e+00, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2529356183833812e+02, - "cpu_time": 4.2403185504258755e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2586906918871551e+02, - "cpu_time": 4.2400789371990936e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2260799951830234e+02, - "cpu_time": 4.2401465204162059e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2298167818981165e+02, - "cpu_time": 4.2401158007724445e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2259489267479518e+02, - "cpu_time": 4.2402018157762325e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2316914482036020e+02, - "cpu_time": 4.2401403764880126e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2281768689678620e+02, - "cpu_time": 4.2400912250561788e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2259581364977748e+02, - "cpu_time": 4.1787502388455044e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1627623, - "real_time": 4.2290062993689617e+02, - "cpu_time": 4.2401280886295297e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1627623, - "real_time": 4.3059200932894993e+02, - "cpu_time": 4.3014322112675518e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_mean", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.2414224860427328e+02, - "cpu_time": 4.2401403764876625e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_median", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.2294115406335385e+02, - "cpu_time": 4.2401342325587700e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_CompositeFunction/12_stddev", - "run_name": "Evaluate_CompositeFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.5524818399943294e+00, - "cpu_time": 2.8916509153273191e+00, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 249965, - "real_time": 2.8957300501283885e+03, - "cpu_time": 2.6807993119028870e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 249965, - "real_time": 2.9013126637831651e+03, - "cpu_time": 2.9209009261284887e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 249965, - "real_time": 2.8994618724609873e+03, - "cpu_time": 2.8408897245603416e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 249965, - "real_time": 2.9019501852381522e+03, - "cpu_time": 3.0009881383397524e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 249965, - "real_time": 2.9016500230733204e+03, - "cpu_time": 2.8408577200816144e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 249965, - "real_time": 2.9010104934712053e+03, - "cpu_time": 3.0009601344192747e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 249965, - "real_time": 2.9000614088414659e+03, - "cpu_time": 3.2010561478608024e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 249965, - "real_time": 2.9015971390936993e+03, - "cpu_time": 2.9208769227698976e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 249965, - "real_time": 2.8998604926366911e+03, - "cpu_time": 2.8810753505502180e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1", - "run_name": "Parse_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 249965, - "real_time": 2.9243757966295866e+03, - "cpu_time": 3.0409497329626197e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_mean", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.9027010125356665e+03, - "cpu_time": 2.9329354109575897e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_median", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.9011615786271850e+03, - "cpu_time": 2.9208889244491934e+03, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/1_stddev", - "run_name": "Parse_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.8286574399504207e+00, - "cpu_time": 1.3996721196914342e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 241326, - "real_time": 3.2143269022799100e+03, - "cpu_time": 3.2742555713014476e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 241326, - "real_time": 3.2058532398718626e+03, - "cpu_time": 3.3571475928811547e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 241326, - "real_time": 3.2127377695854811e+03, - "cpu_time": 3.3157015820936567e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 241326, - "real_time": 3.2101999994689440e+03, - "cpu_time": 3.6057117757729761e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 241326, - "real_time": 3.2061002959448874e+03, - "cpu_time": 3.0669426419040137e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 241326, - "real_time": 3.2213685390269811e+03, - "cpu_time": 3.6472282306921693e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 241326, - "real_time": 3.2243291729118018e+03, - "cpu_time": 3.2741892709458352e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 241326, - "real_time": 3.2106367899620004e+03, - "cpu_time": 3.2327349726099401e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 241326, - "real_time": 3.2355019433824641e+03, - "cpu_time": 3.3985148719979816e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2", - "run_name": "Parse_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 241326, - "real_time": 3.2298604376280223e+03, - "cpu_time": 3.4814358999862429e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_mean", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.2170915090062358e+03, - "cpu_time": 3.3653862410185420e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_median", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.2135323359326962e+03, - "cpu_time": 3.3364245874874059e+03, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/2_stddev", - "run_name": "Parse_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0195457884549784e+01, - "cpu_time": 1.7561933807947645e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 212086, - "real_time": 3.8448040180913486e+03, - "cpu_time": 3.9143177767501584e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 212086, - "real_time": 3.8527784338187253e+03, - "cpu_time": 3.7728468640068545e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 212086, - "real_time": 3.8387399719017858e+03, - "cpu_time": 4.1029299435130388e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 212086, - "real_time": 3.8497671095117275e+03, - "cpu_time": 3.7254934319096451e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 212086, - "real_time": 3.8535802602292083e+03, - "cpu_time": 4.0084352573962533e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 212086, - "real_time": 3.8532888029569694e+03, - "cpu_time": 4.1501042030114413e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 212086, - "real_time": 3.8568277741942402e+03, - "cpu_time": 3.5370887281570658e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 212086, - "real_time": 3.8587947814032868e+03, - "cpu_time": 3.4426836283404868e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 212086, - "real_time": 3.8481067544780221e+03, - "cpu_time": 3.7727384174351769e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4", - "run_name": "Parse_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 212086, - "real_time": 3.8485679162717979e+03, - "cpu_time": 3.8197759399487991e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_mean", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.8505255822857116e+03, - "cpu_time": 3.8246414190468922e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_median", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.8512727716652262e+03, - "cpu_time": 3.7963114019778268e+03, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/4_stddev", - "run_name": "Parse_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.8881655020170491e+00, - "cpu_time": 2.2827893473877384e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 139983, - "real_time": 4.3508565324497895e+03, - "cpu_time": 4.7154868805504029e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 139983, - "real_time": 4.3486065875064332e+03, - "cpu_time": 4.8584613845961276e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 139983, - "real_time": 4.3410636650807346e+03, - "cpu_time": 4.4299522084844230e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 139983, - "real_time": 4.3386675382890116e+03, - "cpu_time": 4.5728124129361031e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 139983, - "real_time": 4.3455401013053361e+03, - "cpu_time": 4.8582899352046534e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 139983, - "real_time": 4.3322384717596569e+03, - "cpu_time": 4.5726838258929029e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 139983, - "real_time": 4.3389130255426180e+03, - "cpu_time": 4.5013680232611096e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 139983, - "real_time": 4.3322389933077611e+03, - "cpu_time": 4.7158226356055266e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 139983, - "real_time": 4.3314788938847023e+03, - "cpu_time": 5.1443889615154721e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6", - "run_name": "Parse_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 139983, - "real_time": 4.3493833679217696e+03, - "cpu_time": 4.5728767064564854e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_mean", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.3408987177047820e+03, - "cpu_time": 4.6942142974503204e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_median", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.3399883453116763e+03, - "cpu_time": 4.6441817935034433e+03, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/6_stddev", - "run_name": "Parse_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.4518690589175360e+00, - "cpu_time": 2.1310654950521158e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 145803, - "real_time": 4.8734981243944958e+03, - "cpu_time": 4.8702427247733931e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 145803, - "real_time": 4.8856863447083670e+03, - "cpu_time": 4.4588725883572379e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 145803, - "real_time": 4.8737024130336777e+03, - "cpu_time": 4.3901634397102771e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 145803, - "real_time": 4.8675368068484404e+03, - "cpu_time": 5.0761644136284885e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 145803, - "real_time": 4.8889137461103901e+03, - "cpu_time": 5.2820655267729790e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 145803, - "real_time": 4.8755442207468823e+03, - "cpu_time": 4.8704827747031732e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 145803, - "real_time": 4.8803100485212062e+03, - "cpu_time": 4.8019519488619708e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 145803, - "real_time": 4.8793614468166561e+03, - "cpu_time": 4.5961605728290169e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 145803, - "real_time": 4.8781400169589360e+03, - "cpu_time": 4.8704416232874182e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8", - "run_name": "Parse_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 145803, - "real_time": 4.8746899108804319e+03, - "cpu_time": 4.9388627120147457e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_mean", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.8777383079019482e+03, - "cpu_time": 4.8155408324938699e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_median", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.8768421188529092e+03, - "cpu_time": 4.8703421740304057e+03, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/8_stddev", - "run_name": "Parse_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.2353515296786268e+00, - "cpu_time": 2.7208531280597310e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 139978, - "real_time": 5.3987088975812903e+03, - "cpu_time": 5.0730686250710341e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 139978, - "real_time": 5.4027711784596795e+03, - "cpu_time": 6.0020646101536686e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 139978, - "real_time": 5.4043487837148696e+03, - "cpu_time": 5.8591635828463131e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 139978, - "real_time": 5.4112355228576644e+03, - "cpu_time": 4.5015645315686743e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 139978, - "real_time": 5.3903242798950814e+03, - "cpu_time": 5.0020146022918689e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 139978, - "real_time": 5.4020108377962297e+03, - "cpu_time": 5.4305890925719332e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 139978, - "real_time": 5.4009752171471191e+03, - "cpu_time": 4.7874023060780755e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 139978, - "real_time": 5.3813487190594833e+03, - "cpu_time": 5.5019574504576713e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 139978, - "real_time": 5.3873747089611961e+03, - "cpu_time": 5.6449656374572196e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10", - "run_name": "Parse_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 139978, - "real_time": 5.4034589218263436e+03, - "cpu_time": 5.7874666018928774e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_mean", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.3982557067298967e+03, - "cpu_time": 5.3590257040389342e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_median", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.4014930274716744e+03, - "cpu_time": 5.4662732715148031e+03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/10_stddev", - "run_name": "Parse_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.0793792640979927e+00, - "cpu_time": 4.9729628246235336e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 99971, - "real_time": 5.9147286212412982e+03, - "cpu_time": 6.9034119894739324e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 99971, - "real_time": 5.9339865660751966e+03, - "cpu_time": 5.8028728331246948e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 99971, - "real_time": 5.9133520918943850e+03, - "cpu_time": 4.9024417080962739e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 99971, - "real_time": 5.9109353007236778e+03, - "cpu_time": 5.8027327925087220e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 99971, - "real_time": 5.9191385399288347e+03, - "cpu_time": 7.2035690350189661e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 99971, - "real_time": 5.9253711473983285e+03, - "cpu_time": 6.5030358804021862e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 99971, - "real_time": 5.9137531883374031e+03, - "cpu_time": 6.0029308499448434e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 99971, - "real_time": 5.9068167562917906e+03, - "cpu_time": 6.3030978983895538e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 99971, - "real_time": 5.9468036337471749e+03, - "cpu_time": 5.4024867211475830e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12", - "run_name": "Parse_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 99971, - "real_time": 5.9261844331066086e+03, - "cpu_time": 6.3029078432729139e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_mean", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.9211070278744701e+03, - "cpu_time": 6.1129487551379689e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_median", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.9169335805850669e+03, - "cpu_time": 6.1529193466088782e+03, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_SourceFunction/12_stddev", - "run_name": "Parse_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2186576020356856e+01, - "cpu_time": 6.8420776651951132e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7576459523723940e+02, - "cpu_time": 1.7493862359967119e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7584390139140191e+02, - "cpu_time": 1.7750376489076712e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7620898738262912e+02, - "cpu_time": 1.7493527988795037e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7581417219346477e+02, - "cpu_time": 1.7493039292470883e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7955224922477552e+02, - "cpu_time": 1.8007585081386713e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7916120625693523e+02, - "cpu_time": 1.8007765127400876e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3887895, - "real_time": 1.7933756570073280e+02, - "cpu_time": 1.7896213760916851e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3887895, - "real_time": 1.8111638817401894e+02, - "cpu_time": 1.8008382428023785e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3887895, - "real_time": 1.8126691950274900e+02, - "cpu_time": 1.8265205207446297e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3887895, - "real_time": 1.8080697678307763e+02, - "cpu_time": 1.8008382428023785e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_mean", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.7848729618470244e+02, - "cpu_time": 1.7842434016350808e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_median", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7924938597883403e+02, - "cpu_time": 1.7951899421151785e+02, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/1_stddev", - "run_name": "Evaluate_SourceFunction/1", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.3349400640090123e+00, - "cpu_time": 2.7184628403325810e+00, - "time_unit": "ns", - "label": "1" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1340559783217228e+02, - "cpu_time": 2.1608295778507139e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1260149105093871e+02, - "cpu_time": 2.1008418742493939e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1475853689053432e+02, - "cpu_time": 2.1607635649717673e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1287690728455175e+02, - "cpu_time": 2.1308747336605106e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1334487348489884e+02, - "cpu_time": 2.1308717330751040e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1437806266001738e+02, - "cpu_time": 2.1308507289772575e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1350127899962069e+02, - "cpu_time": 2.1607875696546793e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1372346004717272e+02, - "cpu_time": 2.1309407465397979e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1278403916606280e+02, - "cpu_time": 2.1307517096584971e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3332683, - "real_time": 2.1318319204069340e+02, - "cpu_time": 2.1308657319042905e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_mean", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.1345574394566634e+02, - "cpu_time": 2.1368377970542014e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_median", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.1337523565853559e+02, - "cpu_time": 2.1308732333678077e+02, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/2_stddev", - "run_name": "Evaluate_SourceFunction/2", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 6.8530327854636974e-01, - "cpu_time": 1.8949711923113342e+00, - "time_unit": "ns", - "label": "2" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3042751, - "real_time": 2.3155543815454922e+02, - "cpu_time": 2.3338879849189561e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2885856417425757e+02, - "cpu_time": 2.3010295617354751e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2230086063568996e+02, - "cpu_time": 2.2024148541897128e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2339175962809034e+02, - "cpu_time": 2.2352141203798408e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2331586909351682e+02, - "cpu_time": 2.2352929963704804e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2299236776187649e+02, - "cpu_time": 2.2353061423692938e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2376233973806245e+02, - "cpu_time": 2.2353061423692938e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2410509437021025e+02, - "cpu_time": 2.2353390073653935e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2364079413653127e+02, - "cpu_time": 2.2353850183599329e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3042751, - "real_time": 2.2346915669399866e+02, - "cpu_time": 2.2352962828704636e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_mean", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2473922443867826e+02, - "cpu_time": 2.2484472110928846e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_median", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2355497541526498e+02, - "cpu_time": 2.2353061423692938e+02, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/4_stddev", - "run_name": "Evaluate_SourceFunction/4", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.9896953260537051e+00, - "cpu_time": 3.8575933112361702e+00, - "time_unit": "ns", - "label": "4" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3207325092670737e+02, - "cpu_time": 2.3337998864892401e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3135216963644621e+02, - "cpu_time": 2.3009100251308809e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3171395613965979e+02, - "cpu_time": 2.3337243002772760e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3131706016960828e+02, - "cpu_time": 2.3008212934903761e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3218396007995361e+02, - "cpu_time": 2.3338524682019104e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3297131667558969e+02, - "cpu_time": 2.3338064592033237e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3330347108317127e+02, - "cpu_time": 2.3337637365617792e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3258647013371291e+02, - "cpu_time": 2.3008673024889626e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3376086362834945e+02, - "cpu_time": 2.3337341593484015e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3042883, - "real_time": 2.3246427253363515e+02, - "cpu_time": 2.3338393227737430e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_mean", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3237267910068334e+02, - "cpu_time": 2.3239118953965894e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_median", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3232411630679439e+02, - "cpu_time": 2.3337489479550905e+02, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/6_stddev", - "run_name": "Evaluate_SourceFunction/6", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.1109335263751026e-01, - "cpu_time": 1.5903101340498109e+00, - "time_unit": "ns", - "label": "6" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3553608174605236e+02, - "cpu_time": 2.3322792059134193e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3440562679094540e+02, - "cpu_time": 2.3665503491581774e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3479746693920401e+02, - "cpu_time": 2.3321900474461276e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3572834409406042e+02, - "cpu_time": 2.3665743533609100e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3468574726447298e+02, - "cpu_time": 2.3323512185220062e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3455929655340691e+02, - "cpu_time": 2.3666669410004104e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3430875268676871e+02, - "cpu_time": 2.3323477893501874e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3470512208546424e+02, - "cpu_time": 2.3322860642570572e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3511590840824653e+02, - "cpu_time": 2.3665812117049373e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2916156, - "real_time": 2.3432648424837706e+02, - "cpu_time": 2.3322003349611947e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_mean", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3481688308169987e+02, - "cpu_time": 2.3460027515674429e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_median", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3469543467496860e+02, - "cpu_time": 2.3323495039360969e+02, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/8_stddev", - "run_name": "Evaluate_SourceFunction/8", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.9459952613852509e-01, - "cpu_time": 1.7721548015847186e+00, - "time_unit": "ns", - "label": "8" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4340913622866674e+02, - "cpu_time": 2.4297248221620072e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4364362807072874e+02, - "cpu_time": 2.4297283944619556e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4309550329596428e+02, - "cpu_time": 2.4296890991625230e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4300208765212997e+02, - "cpu_time": 2.4297641174614398e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4310315409077276e+02, - "cpu_time": 2.4297212498620587e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4298083246733526e+02, - "cpu_time": 2.4295962193634574e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4405048338576981e+02, - "cpu_time": 2.4296355146632962e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4290487643960552e+02, - "cpu_time": 2.4296855268621681e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4300307003446352e+02, - "cpu_time": 2.4296462315631416e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2799317, - "real_time": 2.4276423213242384e+02, - "cpu_time": 2.4295997916634059e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_mean", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.4319570037978605e+02, - "cpu_time": 2.4296790967225456e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_median", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.4304928666521386e+02, - "cpu_time": 2.4296873130123453e+02, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/10_stddev", - "run_name": "Evaluate_SourceFunction/10", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.9256369719641815e-01, - "cpu_time": 5.7547412082543086e-03, - "time_unit": "ns", - "label": "10" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3936824220628023e+02, - "cpu_time": 2.4010248077970996e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3926834985158891e+02, - "cpu_time": 2.3666119238327622e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3866535279304043e+02, - "cpu_time": 2.4009527927934698e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3799036919355606e+02, - "cpu_time": 2.3667490952686370e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3835934595294307e+02, - "cpu_time": 2.4009802270805667e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3794814611086119e+02, - "cpu_time": 2.3667662416980733e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3776435079000325e+02, - "cpu_time": 2.4010316663688741e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3835490262710218e+02, - "cpu_time": 2.3667731002698471e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3857716287637552e+02, - "cpu_time": 2.4010591006559707e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2916059, - "real_time": 2.3854024112682373e+02, - "cpu_time": 2.3667148024097659e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_mean", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.3848364635285748e+02, - "cpu_time": 2.3838663758175070e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_median", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.3844979353988339e+02, - "cpu_time": 2.3838629465316586e+02, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Evaluate_SourceFunction/12_stddev", - "run_name": "Evaluate_SourceFunction/12", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.2943675017669345e-01, - "cpu_time": 1.8070746335511356e+00, - "time_unit": "ns", - "label": "12" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 388807, - "real_time": 1.7897161470861313e+03, - "cpu_time": 1.7750066228229973e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 388807, - "real_time": 1.8158352550240950e+03, - "cpu_time": 1.8144863647003963e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 388807, - "real_time": 1.7968975198490043e+03, - "cpu_time": 1.8008292031777842e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 388807, - "real_time": 1.7946150017877519e+03, - "cpu_time": 1.8007700478643717e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 388807, - "real_time": 1.7988982965841478e+03, - "cpu_time": 1.8008163433270422e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 388807, - "real_time": 1.7920181683966623e+03, - "cpu_time": 1.7750760660172955e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 388807, - "real_time": 1.7976132759955913e+03, - "cpu_time": 1.8007288963419978e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 388807, - "real_time": 1.8100849727499028e+03, - "cpu_time": 1.8264948933532285e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 388807, - "real_time": 1.8065461552900008e+03, - "cpu_time": 1.8007906236255587e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter", - "run_name": "Parse_Filter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 388807, - "real_time": 1.8035115545750643e+03, - "cpu_time": 1.8007623319539266e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_mean", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8005736347338348e+03, - "cpu_time": 1.7995761393184598e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_median", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.7982557862898691e+03, - "cpu_time": 1.8007803357449652e+03, - "time_unit": "ns" - }, - { - "name": "Parse_Filter_stddev", - "run_name": "Parse_Filter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.2956188625095475e+00, - "cpu_time": 1.5490475348839450e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7689890231547579e+01, - "cpu_time": 9.7739797559808963e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7322751158099550e+01, - "cpu_time": 9.7739926145502949e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7318277532704997e+01, - "cpu_time": 9.7739411802683136e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7395868335444092e+01, - "cpu_time": 9.6451625927711817e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7286131105465216e+01, - "cpu_time": 9.7743269373941374e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7328210778749792e+01, - "cpu_time": 9.7746612602379813e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7790524621979159e+01, - "cpu_time": 9.7743397959649982e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7362109186282140e+01, - "cpu_time": 9.6461141270178061e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7190125800543541e+01, - "cpu_time": 9.7737611602748004e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter", - "run_name": "Parse_EvaluateFilter", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 7776914, - "real_time": 9.7725471054421007e+01, - "cpu_time": 9.8082864231238204e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_mean", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.7440935980523705e+01, - "cpu_time": 9.7518565847584213e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_median", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.7345159982515952e+01, - "cpu_time": 9.7739861852655949e+01, - "time_unit": "ns" - }, - { - "name": "Parse_EvaluateFilter_stddev", - "run_name": "Parse_EvaluateFilter", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.1134106601597108e-01, - "cpu_time": 5.6986202050903134e-01, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 699874, - "real_time": 9.8536093639683543e+02, - "cpu_time": 9.8611464349281164e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 699874, - "real_time": 9.7991918402473539e+02, - "cpu_time": 9.7177634831426678e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 699874, - "real_time": 9.8153024687280879e+02, - "cpu_time": 9.8602605611857416e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 699874, - "real_time": 9.8125430434615942e+02, - "cpu_time": 9.8604605971933415e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 699874, - "real_time": 9.8099026967733266e+02, - "cpu_time": 9.7178777894301732e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 699874, - "real_time": 9.8131360073372650e+02, - "cpu_time": 9.8606463449148009e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 699874, - "real_time": 9.7919333908681563e+02, - "cpu_time": 9.7172776814106203e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 699874, - "real_time": 9.7996931161856276e+02, - "cpu_time": 9.8608035160607278e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 699874, - "real_time": 9.8654674412849056e+02, - "cpu_time": 9.8605320386256722e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration", - "run_name": "TileMaskGeneration", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 699874, - "real_time": 9.8052649476887495e+02, - "cpu_time": 9.8606177683408941e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_mean", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.8166044316543434e+02, - "cpu_time": 9.8177386215232764e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_median", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.8112228701174604e+02, - "cpu_time": 9.8604963179095068e+02, - "time_unit": "ns" - }, - { - "name": "TileMaskGeneration_stddev", - "run_name": "TileMaskGeneration", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.3940962120772253e+00, - "cpu_time": 6.9075394428124399e+00, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 875, - "real_time": 8.7106719085724244e+05, - "cpu_time": 8.6875085714291339e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 875, - "real_time": 8.6906490399996995e+05, - "cpu_time": 8.6873485714282386e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 875, - "real_time": 8.6843142857157683e+05, - "cpu_time": 8.6876571428573306e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 875, - "real_time": 8.3793890514269669e+05, - "cpu_time": 8.4591085714289092e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 875, - "real_time": 8.2353904799986456e+05, - "cpu_time": 8.2305142857135891e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 875, - "real_time": 8.2735966742880654e+05, - "cpu_time": 8.2299771428578033e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 875, - "real_time": 8.2623695200007723e+05, - "cpu_time": 8.2303428571425937e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 875, - "real_time": 8.2567480914284324e+05, - "cpu_time": 8.2303771428567939e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 875, - "real_time": 8.2788014285688405e+05, - "cpu_time": 8.2303657142866927e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile", - "run_name": "Parse_VectorTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 875, - "real_time": 8.2916281028571702e+05, - "cpu_time": 8.3446171428568044e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_mean", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.4063558582856786e+05, - "cpu_time": 8.4017817142857914e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_median", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.2852147657130065e+05, - "cpu_time": 8.2875657142851967e+05, - "time_unit": "ns" - }, - { - "name": "Parse_VectorTile_stddev", - "run_name": "Parse_VectorTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.0298337893480479e+04, - "cpu_time": 2.1041514018795082e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 11664, - "real_time": 5.6289437585725253e+04, - "cpu_time": 5.6601423182444632e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 11664, - "real_time": 5.6830882801793814e+04, - "cpu_time": 5.6603395061736090e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 11664, - "real_time": 5.6890885802441488e+04, - "cpu_time": 5.6602194787380955e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 11664, - "real_time": 5.6979734653627122e+04, - "cpu_time": 5.6601680384090068e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 11664, - "real_time": 5.6624310528142909e+04, - "cpu_time": 5.6599879972571987e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 11664, - "real_time": 5.6864201131670932e+04, - "cpu_time": 5.7459705075445578e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 11664, - "real_time": 5.6963452331938963e+04, - "cpu_time": 5.7461076817554611e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 11664, - "real_time": 5.6307105967085270e+04, - "cpu_time": 5.6599537037034985e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 11664, - "real_time": 5.6116240912202826e+04, - "cpu_time": 5.5742455418379424e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 11664, - "real_time": 5.6261216906710455e+04, - "cpu_time": 5.6105281207141030e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_mean", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.6612746862133921e+04, - "cpu_time": 5.6637662894377936e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_median", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.6727596664968354e+04, - "cpu_time": 5.6601551783267350e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateRegion_stddev", - "run_name": "OfflineDatabase/InvalidateRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.3566163597487400e+02, - "cpu_time": 5.2137766022595224e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 32, - "real_time": 2.1663286468751151e+07, - "cpu_time": 2.1880781250001036e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 32, - "real_time": 2.1740679687496822e+07, - "cpu_time": 2.1880500000001747e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 32, - "real_time": 2.1728423187497016e+07, - "cpu_time": 2.1568187500001557e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 32, - "real_time": 2.1750402343755580e+07, - "cpu_time": 2.1568187499998003e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 32, - "real_time": 2.1896246093746185e+07, - "cpu_time": 2.1880843750000879e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 32, - "real_time": 2.1934589843752407e+07, - "cpu_time": 2.1881593750002537e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 32, - "real_time": 2.1851378906248443e+07, - "cpu_time": 2.1881062500000324e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 32, - "real_time": 2.2058067718745634e+07, - "cpu_time": 2.2192249999999803e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 32, - "real_time": 2.1875776062501017e+07, - "cpu_time": 2.1880343750002142e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 32, - "real_time": 2.1870460937492453e+07, - "cpu_time": 2.1881156250000089e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_mean", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.1836931124998670e+07, - "cpu_time": 2.1849490625000812e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_median", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.1860919921870448e+07, - "cpu_time": 2.1880812500000957e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/DeleteRegion_stddev", - "run_name": "OfflineDatabase/DeleteRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.1713088983759393e+05, - "cpu_time": 1.7721694472304918e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3181, - "real_time": 2.2451630776479931e+05, - "cpu_time": 2.2326060987111169e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3181, - "real_time": 2.2215606978942771e+05, - "cpu_time": 2.2325872367180811e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3181, - "real_time": 2.2202411442940909e+05, - "cpu_time": 2.2010782772712197e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3181, - "real_time": 2.2278617824590977e+05, - "cpu_time": 2.2325966677142415e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3181, - "real_time": 2.2236500565861957e+05, - "cpu_time": 2.2011380069161922e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3181, - "real_time": 2.2256380352089088e+05, - "cpu_time": 2.2325998113797477e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3181, - "real_time": 2.2303379440440328e+05, - "cpu_time": 2.2325840930525749e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3181, - "real_time": 2.2304652624961344e+05, - "cpu_time": 2.2011600125747343e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3181, - "real_time": 2.2287697768005414e+05, - "cpu_time": 2.2325495127320083e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3181, - "real_time": 2.2209596038981740e+05, - "cpu_time": 2.2326092423766232e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_mean", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2274647381329449e+05, - "cpu_time": 2.2231508959446539e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_median", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2267499088340034e+05, - "cpu_time": 2.2325856648853276e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileRegion_stddev", - "run_name": "OfflineDatabase/InsertTileRegion", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.2998771660244631e+02, - "cpu_time": 1.5199035956493387e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 16664, - "real_time": 4.3916136581875435e+04, - "cpu_time": 4.3815530484877621e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 16664, - "real_time": 4.3769490578509489e+04, - "cpu_time": 4.3815950552087321e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 16664, - "real_time": 4.3738075552085662e+04, - "cpu_time": 4.3814930388863781e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 16664, - "real_time": 4.3651391682656860e+04, - "cpu_time": 4.3816010561695519e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 16664, - "real_time": 4.3820418746983167e+04, - "cpu_time": 4.3815890542485933e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 16664, - "real_time": 4.3750602616426324e+04, - "cpu_time": 4.3816850696108086e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 16664, - "real_time": 4.4059597035512445e+04, - "cpu_time": 4.4414966394624309e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 16664, - "real_time": 4.3709233437352741e+04, - "cpu_time": 4.3815830532884545e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 16664, - "real_time": 4.3726983857424610e+04, - "cpu_time": 4.3815290446465260e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 16664, - "real_time": 4.3678953612590500e+04, - "cpu_time": 4.3216454632739253e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_mean", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.3782088370141733e+04, - "cpu_time": 4.3815770523283165e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_median", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.3744339084255989e+04, - "cpu_time": 4.3815860537685236e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InvalidateAmbientCache_stddev", - "run_name": "OfflineDatabase/InvalidateAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2274596001260632e+02, - "cpu_time": 2.8249237897720980e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 29, - "real_time": 2.1921291689648505e+07, - "cpu_time": 2.1729965517242189e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 29, - "real_time": 2.2212212655161019e+07, - "cpu_time": 2.2074724137931705e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 29, - "real_time": 2.2157607758627221e+07, - "cpu_time": 2.2419896551723626e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 29, - "real_time": 2.2185836206894048e+07, - "cpu_time": 2.2074965517241441e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 29, - "real_time": 2.2202873551734604e+07, - "cpu_time": 2.2074517241380502e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 29, - "real_time": 2.2158416655170653e+07, - "cpu_time": 2.2074310344829299e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 29, - "real_time": 2.2209596275858752e+07, - "cpu_time": 2.2418793103446629e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 29, - "real_time": 2.2175739965514991e+07, - "cpu_time": 2.2074517241380502e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 29, - "real_time": 2.2172038793102946e+07, - "cpu_time": 2.2074793103448775e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 29, - "real_time": 2.2346959758626074e+07, - "cpu_time": 2.2073862068968367e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_mean", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2174257331033885e+07, - "cpu_time": 2.2109034482759304e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_median", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2180788086204521e+07, - "cpu_time": 2.2074620689656109e+07, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ClearAmbientCache_stddev", - "run_name": "OfflineDatabase/ClearAmbientCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0434739293449372e+05, - "cpu_time": 1.9567973272982071e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3181, - "real_time": 2.2206667180127319e+05, - "cpu_time": 2.2011097139262801e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3181, - "real_time": 2.2344109556749169e+05, - "cpu_time": 2.2325840930525749e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3181, - "real_time": 2.2430167400193575e+05, - "cpu_time": 2.2326375353661779e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3181, - "real_time": 2.2410675353659020e+05, - "cpu_time": 2.2640018861990457e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3181, - "real_time": 2.2390229739069976e+05, - "cpu_time": 2.2325558000630201e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3181, - "real_time": 2.2469976674002939e+05, - "cpu_time": 2.2325809493870687e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3181, - "real_time": 2.2456942282306650e+05, - "cpu_time": 2.2639735932094909e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3181, - "real_time": 2.2598268374726639e+05, - "cpu_time": 2.2596164728073811e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3181, - "real_time": 2.2466962684700350e+05, - "cpu_time": 2.2325998113801051e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3181, - "real_time": 2.2465172115676734e+05, - "cpu_time": 2.2325746620560565e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_mean", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2423917136121239e+05, - "cpu_time": 2.2384234517447199e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_median", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2443554841250111e+05, - "cpu_time": 2.2325919522163397e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertTileCache_stddev", - "run_name": "OfflineDatabase/InsertTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0114974198490129e+03, - "cpu_time": 1.9301086457646700e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 292, - "real_time": 2.4615024280813620e+06, - "cpu_time": 2.4662945205478407e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 292, - "real_time": 2.4593778561638081e+06, - "cpu_time": 2.4662705479451614e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 292, - "real_time": 2.4596194349317569e+06, - "cpu_time": 2.4663424657535884e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 292, - "real_time": 2.4612942363017108e+06, - "cpu_time": 2.4661541095889015e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 292, - "real_time": 2.4634397808213551e+06, - "cpu_time": 2.4662431506845672e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 292, - "real_time": 2.4677594178091856e+06, - "cpu_time": 2.4663013698628917e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 292, - "real_time": 2.4666299931508647e+06, - "cpu_time": 2.4661952054795981e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 292, - "real_time": 2.4609707499998314e+06, - "cpu_time": 2.4663390410960629e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 292, - "real_time": 2.4613708630135055e+06, - "cpu_time": 2.4661301369866114e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 292, - "real_time": 2.4613523116451614e+06, - "cpu_time": 2.4661609589043423e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_mean", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.4623317071918542e+06, - "cpu_time": 2.4662431506849565e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_median", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.4613615873293332e+06, - "cpu_time": 2.4662568493148643e+06, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/InsertBigTileCache_stddev", - "run_name": "OfflineDatabase/InsertBigTileCache", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 2.8036381115561207e+03, - "cpu_time": 7.8593221887047335e+01, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 17943, - "real_time": 3.8933681212722055e+04, - "cpu_time": 3.9024522097757683e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 17943, - "real_time": 3.8926301343145940e+04, - "cpu_time": 3.9024466365717468e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 17943, - "real_time": 3.8689444797422009e+04, - "cpu_time": 3.8465195340804341e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 17943, - "real_time": 3.8899327035608614e+04, - "cpu_time": 3.8466644373856121e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 17943, - "real_time": 3.8900643705076771e+04, - "cpu_time": 3.9023463188987371e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 17943, - "real_time": 3.8918533690028307e+04, - "cpu_time": 3.9024020509389462e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 17943, - "real_time": 3.8746474948450246e+04, - "cpu_time": 3.9023407456947156e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 17943, - "real_time": 3.8940968177006347e+04, - "cpu_time": 3.9024187705510085e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 17943, - "real_time": 3.8928375020895866e+04, - "cpu_time": 3.9023017332665695e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile", - "run_name": "OfflineDatabase/GetTile", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 17943, - "real_time": 3.8901621300798441e+04, - "cpu_time": 3.8467480354452928e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_mean", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.8878537123115464e+04, - "cpu_time": 3.8856640472608837e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_median", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.8910077495413381e+04, - "cpu_time": 3.9023435322967263e+04, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTile_stddev", - "run_name": "OfflineDatabase/GetTile", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.6893034845926479e+01, - "cpu_time": 2.6926485795587467e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 3181, - "real_time": 2.2359328827410279e+05, - "cpu_time": 2.2640270355234513e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 3181, - "real_time": 2.2416023514623972e+05, - "cpu_time": 2.2325463690661447e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 3181, - "real_time": 2.2349307073254700e+05, - "cpu_time": 2.2326375353661779e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 3181, - "real_time": 2.2346202703552283e+05, - "cpu_time": 2.2326186733731415e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 3181, - "real_time": 2.2415954102480109e+05, - "cpu_time": 2.2326060987111169e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 3181, - "real_time": 2.2330670386673271e+05, - "cpu_time": 2.2326532536937081e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 3181, - "real_time": 2.3888863564910565e+05, - "cpu_time": 2.3897736560829094e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 3181, - "real_time": 2.2330293146812546e+05, - "cpu_time": 2.2326689720212383e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 3181, - "real_time": 2.2317235146180593e+05, - "cpu_time": 2.2325526563971568e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 3181, - "real_time": 2.2729737755414922e+05, - "cpu_time": 2.2954856963218586e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_mean", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.2548361622131328e+05, - "cpu_time": 2.2577569946556902e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_median", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.2354317950332485e+05, - "cpu_time": 2.2326453945299430e+05, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToFullDatabase_stddev", - "run_name": "OfflineDatabase/AddTilesToFullDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.8642402711076084e+03, - "cpu_time": 5.0899790694479561e+03, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1166375, - "real_time": 6.4678476733461366e+02, - "cpu_time": 6.5171492873215595e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1166375, - "real_time": 6.6067156017567606e+02, - "cpu_time": 6.6031507876968794e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5742728539267989e+02, - "cpu_time": 6.6029364483983090e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5819319172641576e+02, - "cpu_time": 6.5173293323333326e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5639070453315549e+02, - "cpu_time": 6.5938227413997492e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5627996313345227e+02, - "cpu_time": 6.5173722001930469e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5790461901198273e+02, - "cpu_time": 6.6029193012544249e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5689057978769756e+02, - "cpu_time": 6.6026963883829376e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1166375, - "real_time": 6.6000968042013437e+02, - "cpu_time": 6.6026963883829376e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1166375, - "real_time": 6.5664791254956663e+02, - "cpu_time": 6.6030221841167634e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_mean", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 6.5672002640653750e+02, - "cpu_time": 6.5763095059479951e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_median", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 6.5715893259018878e+02, - "cpu_time": 6.6026963883829376e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/AddTilesToDisabledDatabase_stddev", - "run_name": "OfflineDatabase/AddTilesToDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.7940875627281647e+00, - "cpu_time": 4.0828290510028573e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8683754341635029e+02, - "cpu_time": 3.8600474737914425e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8367940863936701e+02, - "cpu_time": 3.8598095761720043e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8336864350785396e+02, - "cpu_time": 3.8597725698757404e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8376817934307314e+02, - "cpu_time": 3.8600104674951791e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8415108402019155e+02, - "cpu_time": 3.8068694259266761e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8421302568750690e+02, - "cpu_time": 3.8598730155370276e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8372529168904811e+02, - "cpu_time": 3.8598783021513810e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8564660097146623e+02, - "cpu_time": 3.8599893210401717e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8708420782748033e+02, - "cpu_time": 3.8599787478126672e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1891570, - "real_time": 3.8674150309000430e+02, - "cpu_time": 3.8597567100344850e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_mean", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.8492154881923415e+02, - "cpu_time": 3.8545985609836777e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_median", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.8418205485384925e+02, - "cpu_time": 3.8598756588442035e+02, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/GetTileFromDisabledDatabase_stddev", - "run_name": "OfflineDatabase/GetTileFromDisabledDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4906152305826106e+00, - "cpu_time": 1.6770620829375176e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 87486877, - "real_time": 9.0431295998872763e+00, - "cpu_time": 9.0313544967434254e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1806554599032903e+00, - "cpu_time": 9.1463088801313983e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1574248329831089e+00, - "cpu_time": 9.1462288681316313e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1268893047764035e+00, - "cpu_time": 9.1464460435595747e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1786341967619531e+00, - "cpu_time": 9.1453715967016329e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1446838821326022e+00, - "cpu_time": 9.1452801544161826e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1588879095555136e+00, - "cpu_time": 9.1457487961304160e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1512620115558381e+00, - "cpu_time": 9.1454287481313408e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 87486877, - "real_time": 9.1513953572725750e+00, - "cpu_time": 9.1458516687015479e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 87486877, - "real_time": 9.0201528167445595e+00, - "cpu_time": 9.0309201458862383e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_mean", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 9.1313115371573126e+00, - "cpu_time": 9.1228939398533395e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_median", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 9.1513286844142065e+00, - "cpu_time": 9.1455887721308784e+00, - "time_unit": "ns" - }, - { - "name": "OfflineDatabase/ResizeDatabase_stddev", - "run_name": "OfflineDatabase/ResizeDatabase", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 5.5023923635958857e-02, - "cpu_time": 4.8361756389597499e-02, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 437415, - "real_time": 1.6241593589605968e+03, - "cpu_time": 1.6234559857345184e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 437415, - "real_time": 1.6304020026750484e+03, - "cpu_time": 1.6234788473187373e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 437415, - "real_time": 1.6339080164145291e+03, - "cpu_time": 1.6463792965492744e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 437415, - "real_time": 1.6320628007727757e+03, - "cpu_time": 1.6234239795159883e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 437415, - "real_time": 1.6241084919354564e+03, - "cpu_time": 1.6234628442096023e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 437415, - "real_time": 1.6191656276079807e+03, - "cpu_time": 1.6234216933575406e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 437415, - "real_time": 1.6149821496748202e+03, - "cpu_time": 1.6234674165267577e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 437415, - "real_time": 1.6149345198501233e+03, - "cpu_time": 1.6005669672964807e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 437415, - "real_time": 1.6151832356005930e+03, - "cpu_time": 1.6234948504281322e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa", - "run_name": "Util_dtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 437415, - "real_time": 1.6143432621194959e+03, - "cpu_time": 1.6004960963843369e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_mean", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.6223249465611420e+03, - "cpu_time": 1.6211647977321368e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_median", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.6216370597717184e+03, - "cpu_time": 1.6234594149720601e+03, - "time_unit": "ns" - }, - { - "name": "Util_dtoa_stddev", - "run_name": "Util_dtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 7.7028561917214189e+00, - "cpu_time": 1.3013031286177243e+01, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 368357, - "real_time": 1.8895745160266918e+03, - "cpu_time": 1.9006507274192563e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 368357, - "real_time": 1.8655819408898312e+03, - "cpu_time": 1.8734678586263240e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 368357, - "real_time": 1.8533498073885121e+03, - "cpu_time": 1.8463962948985775e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 368357, - "real_time": 1.8440660147624033e+03, - "cpu_time": 1.8463854358678275e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 368357, - "real_time": 1.8435893467490152e+03, - "cpu_time": 1.8463012783795166e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 368357, - "real_time": 1.8440989311994790e+03, - "cpu_time": 1.8463284259563911e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 368357, - "real_time": 1.8472927323215085e+03, - "cpu_time": 1.8462659865292715e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 368357, - "real_time": 1.8435186517421669e+03, - "cpu_time": 1.8462632717718923e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 368357, - "real_time": 1.8449393740313424e+03, - "cpu_time": 1.8462415537100842e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa", - "run_name": "Util_standardDtoa", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 368357, - "real_time": 1.8444906490172114e+03, - "cpu_time": 1.8463419997448284e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_mean", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 1.8520501964128161e+03, - "cpu_time": 1.8544642832903969e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_median", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 1.8447150115242766e+03, - "cpu_time": 1.8463352128506097e+03, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoa_stddev", - "run_name": "Util_standardDtoa", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.4886827446272594e+01, - "cpu_time": 1.8335042236627835e+01, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5376022421390968e+02, - "cpu_time": 2.5265482221810669e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5504088979722920e+02, - "cpu_time": 2.5637636548840601e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5410279602385887e+02, - "cpu_time": 2.5265593667506241e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5379237332518051e+02, - "cpu_time": 2.5636262051924291e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5439897819143266e+02, - "cpu_time": 2.5264144873459554e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5361158351708360e+02, - "cpu_time": 2.5264664953376456e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5390343193308175e+02, - "cpu_time": 2.5637116468923699e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5364925847745309e+02, - "cpu_time": 2.5265222181854327e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5366701251987064e+02, - "cpu_time": 2.5264553507676661e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits", - "run_name": "Util_dtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 2691894, - "real_time": 2.5372415927222627e+02, - "cpu_time": 2.5263439050720913e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_mean", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 2.5396507072713263e+02, - "cpu_time": 2.5376411552609338e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_median", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 2.5377629876954512e+02, - "cpu_time": 2.5265352201832496e+02, - "time_unit": "ns" - }, - { - "name": "Util_dtoaLimits_stddev", - "run_name": "Util_dtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.4867509312834991e-01, - "cpu_time": 1.7982798830088964e+00, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 15908, - "real_time": 4.1385432361087333e+04, - "cpu_time": 4.1493713854663598e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 15908, - "real_time": 4.2012488433504630e+04, - "cpu_time": 4.2122642695497030e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 15908, - "real_time": 4.1800260309280406e+04, - "cpu_time": 4.2123962786021337e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 15908, - "real_time": 4.1150631757598050e+04, - "cpu_time": 4.0866356550160112e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 15908, - "real_time": 4.1035016469715381e+04, - "cpu_time": 4.0867739502137621e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 15908, - "real_time": 4.1061826879557972e+04, - "cpu_time": 4.1494405330655922e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 15908, - "real_time": 4.1135725735484331e+04, - "cpu_time": 4.0864659290923766e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 15908, - "real_time": 4.1113674503395232e+04, - "cpu_time": 4.0864282122197437e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 15908, - "real_time": 4.1078665891359313e+04, - "cpu_time": 4.1495725421173083e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits", - "run_name": "Util_standardDtoaLimits", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 15908, - "real_time": 4.1116293688711768e+04, - "cpu_time": 4.0866293688714060e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_mean", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.1289001602969445e+04, - "cpu_time": 4.1305978124214402e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_median", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.1126009712098043e+04, - "cpu_time": 4.1180726678400606e+04, - "time_unit": "ns" - }, - { - "name": "Util_standardDtoaLimits_stddev", - "run_name": "Util_standardDtoaLimits", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 3.4281235318162959e+02, - "cpu_time": 5.1761137010305799e+02, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4149220210157736e+01, - "cpu_time": 4.3728490806580126e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4154104200376359e+01, - "cpu_time": 4.4371339370291942e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4140194418300922e+01, - "cpu_time": 4.4372110942880951e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4168991757798779e+01, - "cpu_time": 4.3728169318001370e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4366621525383152e+01, - "cpu_time": 4.4371467965723440e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4323209893731061e+01, - "cpu_time": 4.4601139406964641e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4194780478607932e+01, - "cpu_time": 4.4370182011401106e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4200452115820752e+01, - "cpu_time": 4.3728747997443129e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4195434193472778e+01, - "cpu_time": 4.4371146477144684e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds", - "run_name": "TileCountBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 15552652, - "real_time": 4.4295393094352718e+01, - "cpu_time": 4.4373396897195981e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_mean", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 4.4218840188800222e+01, - "cpu_time": 4.4201619119362739e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_median", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 4.4195107336040351e+01, - "cpu_time": 4.4371242923718306e+01, - "time_unit": "ns" - }, - { - "name": "TileCountBounds_stddev", - "run_name": "TileCountBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 8.0114675104712277e-02, - "cpu_time": 3.3410083433794802e-01, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 87484, - "real_time": 8.2143582483647606e+03, - "cpu_time": 8.2316423574599066e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 87484, - "real_time": 8.4137723240830965e+03, - "cpu_time": 8.3462918933753754e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 87484, - "real_time": 8.3810392071659062e+03, - "cpu_time": 8.4601755749612294e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 87484, - "real_time": 8.4025879017865554e+03, - "cpu_time": 8.3459946961730511e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 87484, - "real_time": 8.5654143386230717e+03, - "cpu_time": 8.5751108774187433e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 87484, - "real_time": 8.5844735494462984e+03, - "cpu_time": 8.5747793882303868e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 87484, - "real_time": 8.5675337776063316e+03, - "cpu_time": 8.5748479722011543e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 87484, - "real_time": 8.5803370673499703e+03, - "cpu_time": 8.5749165561693208e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 87484, - "real_time": 8.5672199144976003e+03, - "cpu_time": 8.5745850669835636e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon", - "run_name": "TileCountPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 87484, - "real_time": 8.5880432421927162e+03, - "cpu_time": 8.5746650816159090e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_mean", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 8.4864779571116305e+03, - "cpu_time": 8.4833009464588649e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_median", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 8.5663171265603360e+03, - "cpu_time": 8.5746250742997363e+03, - "time_unit": "ns" - }, - { - "name": "TileCountPolygon_stddev", - "run_name": "TileCountPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.2716505206719357e+02, - "cpu_time": 1.2984741372848501e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 218717, - "real_time": 3.1246574706115971e+03, - "cpu_time": 3.1095113777165516e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 218717, - "real_time": 3.1140528262544422e+03, - "cpu_time": 3.1095342383080342e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 218717, - "real_time": 3.1246157500324653e+03, - "cpu_time": 3.1094290795866932e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 218717, - "real_time": 3.1143614396686917e+03, - "cpu_time": 3.1096348249110792e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 218717, - "real_time": 3.1133519570945236e+03, - "cpu_time": 3.1095525267807011e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 218717, - "real_time": 3.1167690440158581e+03, - "cpu_time": 3.1552737098630328e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 218717, - "real_time": 3.1145374662228501e+03, - "cpu_time": 3.1096348249105595e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 218717, - "real_time": 3.1160441758070824e+03, - "cpu_time": 3.1095570988995173e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 218717, - "real_time": 3.1162653520302642e+03, - "cpu_time": 3.1096393970288559e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport", - "run_name": "TileCoverPitchedViewport", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 218717, - "real_time": 3.1157445054573082e+03, - "cpu_time": 3.1096439691476721e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_mean", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.1170399987195087e+03, - "cpu_time": 3.1141411047152701e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_median", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.1158943406321951e+03, - "cpu_time": 3.1095959619050382e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPitchedViewport_stddev", - "run_name": "TileCoverPitchedViewport", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 4.1462639651884956e+00, - "cpu_time": 1.4452692366396629e+01, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0778617009107029e+02, - "cpu_time": 5.0732717972171901e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0814165833170858e+02, - "cpu_time": 5.0731646329258359e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0934112393907725e+02, - "cpu_time": 5.0732575086452266e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0897396765048188e+02, - "cpu_time": 5.1447075129309030e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0850896322118075e+02, - "cpu_time": 5.0731717772126296e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 1399720, - "real_time": 5.0908925856617668e+02, - "cpu_time": 5.0735218472265609e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 1399720, - "real_time": 5.1089634641232107e+02, - "cpu_time": 5.0734504043667408e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 1399720, - "real_time": 5.1003748392523164e+02, - "cpu_time": 5.1448218215066152e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 1399720, - "real_time": 5.1018233360976615e+02, - "cpu_time": 5.0733789615069207e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds", - "run_name": "TileCoverBounds", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 1399720, - "real_time": 5.1013381247678109e+02, - "cpu_time": 5.1447861000775174e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_mean", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 5.0930911182237952e+02, - "cpu_time": 5.0947532363616136e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_median", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 5.0921519125262694e+02, - "cpu_time": 5.0734146829368302e+02, - "time_unit": "ns" - }, - { - "name": "TileCoverBounds_stddev", - "run_name": "TileCoverBounds", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 9.9870504058229093e-01, - "cpu_time": 3.4516289703216145e+00, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 0, - "threads": 1, - "iterations": 199961, - "real_time": 3.4607379689048794e+03, - "cpu_time": 3.4514230274904453e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 1, - "threads": 1, - "iterations": 199961, - "real_time": 3.4350521251639825e+03, - "cpu_time": 3.4513330099372497e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 2, - "threads": 1, - "iterations": 199961, - "real_time": 3.4621895019517224e+03, - "cpu_time": 3.4512930021352608e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 3, - "threads": 1, - "iterations": 199961, - "real_time": 3.4647322877961637e+03, - "cpu_time": 3.4514280284656229e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 4, - "threads": 1, - "iterations": 199961, - "real_time": 3.4574064842632852e+03, - "cpu_time": 3.4512679972593733e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 5, - "threads": 1, - "iterations": 199961, - "real_time": 3.4670421182126829e+03, - "cpu_time": 3.5012877511113034e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 6, - "threads": 1, - "iterations": 199961, - "real_time": 3.4583164517079972e+03, - "cpu_time": 3.4513730177386701e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 7, - "threads": 1, - "iterations": 199961, - "real_time": 3.4715059036496828e+03, - "cpu_time": 3.4514430313911553e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 8, - "threads": 1, - "iterations": 199961, - "real_time": 3.4724452518244866e+03, - "cpu_time": 3.5014377803671978e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon", - "run_name": "TileCoverPolygon", - "run_type": "iteration", - "repetitions": 0, - "repetition_index": 9, - "threads": 1, - "iterations": 199961, - "real_time": 3.4603541440587246e+03, - "cpu_time": 3.4513730177381012e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_mean", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "mean", - "iterations": 10, - "real_time": 3.4609782237533609e+03, - "cpu_time": 3.4613659663634380e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_median", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "median", - "iterations": 10, - "real_time": 3.4614637354283013e+03, - "cpu_time": 3.4513980226145568e+03, - "time_unit": "ns" - }, - { - "name": "TileCoverPolygon_stddev", - "run_name": "TileCoverPolygon", - "run_type": "aggregate", - "repetitions": 0, - "threads": 1, - "aggregate_name": "stddev", - "iterations": 10, - "real_time": 1.0472757908177035e+01, - "cpu_time": 2.1080270670819594e+01, - "time_unit": "ns" - } - ] -} diff --git a/metrics/ignores/platform-all.json b/metrics/ignores/platform-all.json index 1ce8ff95803b..d5df7879b4ef 100644 --- a/metrics/ignores/platform-all.json +++ b/metrics/ignores/platform-all.json @@ -114,7 +114,6 @@ "render-tests/tilejson-bounds/overwrite-bounds": "started failing after https://github.com/mapbox/mapbox-gl-native/pull/16091", "render-tests/video/default": "skip - https://github.com/mapbox/mapbox-gl-native/issues/601", "render-tests/zoomed-fill/negative-zoom": "https://github.com/mapbox/mapbox-gl-native/issues/16019", - "render-tests/zoomed-fill/negative-zoom": "https://github.com/mapbox/mapbox-gl-native/issues/16019", "render-tests/fill-extrusion-translate/default": "https://github.com/mapbox/mapbox-gl-js/pull/9202", "render-tests/fill-extrusion-opacity/literal": "https://github.com/mapbox/mapbox-gl-js/pull/9202", "render-tests/fill-extrusion-opacity/default": "https://github.com/mapbox/mapbox-gl-js/pull/9202", diff --git a/metrics/integration/README.md b/metrics/integration/README.md deleted file mode 100644 index 4cc6be1ec1b7..000000000000 --- a/metrics/integration/README.md +++ /dev/null @@ -1,150 +0,0 @@ -These integration tests verify the correctness and consistency of [MapLibre Native](https://github.com/maplibre/maplibre-native) rendering. - -## Organization - -Tests are contained in a directory tree, generally organized by [style specification](https://maplibre.org/maplibre-style-spec/) -property: `background-color`, `line-width`, etc., with a second level of directories below that for individual tests. For example, the test for specifying a literal `circle-radius` value lives in [`test/integration/render-tests/circle-radius/literal/`](https://github.com/mapbox/mapbox-gl-js/tree/master/test/integration/render-tests/circle-radius/literal). - -Within a leaf directory is a `style.json` file (e.g. [`circle-radius/literal/style.json`](https://github.com/mapbox/mapbox-gl-js/blob/master/test/integration/render-tests/circle-radius/literal/style.json)), which contains the minimal style needed for the given test case. The style can specify the map size, center, bearing, and pitch, and additional test metadata (e.g. output image dimensions). - -The expected output for a given test case is in `expected.png`, e.g. [`circle-radius/literal/expected.png`](https://github.com/mapbox/mapbox-gl-js/blob/master/test/integration/render-tests/circle-radius/literal/expected.png). - -Supporting files -- glyphs, sprites, and tiles -- live in their own respective subdirectories at the top level. The test -harness sets up the environment such that requests for these resources are directed to the correct location. - -The contents of vector tile fixtures can be read using the [`vt2geojson`](https://github.com/mapbox/vt2geojson) tool (see below). - -## Running tests - -To run the entire integration test suite (both render or query tests), from within the maplibre-native directory on Linux run the command: - -``` -./build/mbgl-render-test-runner --manifestPath metrics/linux-clang8-release-style.json -``` - -To run only the render/query tests: - -``` -npm run test-render -``` - -### Running specific tests - -To run a subset of tests or an individual test, you can pass a specific subdirectory to the `test-render` script. For example, to run all the tests for a given property, e.g. `circle-radius`: -``` -$ npm run test-render circle-radius -... -* passed circle-radius/antimeridian -* passed circle-radius/default -* passed circle-radius/function -* passed circle-radius/literal -* passed circle-radius/property-function -* passed circle-radius/zoom-and-property-function -6 passed (100.0%) -Results at: ./test/integration/render-tests/index.html -Done in 2.71s. -``` -Or to run a single test: -``` -$ npm run test-render circle-radius/literal -... -* passed circle-radius/literal -1 passed (100.0%) -Results at: ./test/integration/render-tests/index.html -Done in 2.32s. -``` - -### Viewing test results - -During a test run, the test harness will use GL-JS to create an `actual.png` image from the given `style.json`, and will then use [pixelmatch](https://github.com/mapbox/pixelmatch) to compare that image to `expected.png`, generating a `diff.png` highlighting the mismatching pixels (if any) in red. - -After the test(s) have run, you can view the results graphically by opening the `index.html` file generated by the harness: - -``` -open ./test/integration/render-tests/index.html -``` -or -``` -open ./test/integration/query-tests/index.html -``` - -## Running tests in the browser - -Query tests can be run in the browser, the server for serving up the test page and test fixtures starts when you run -``` -npm run start -``` -OR -``` -npm run start-debug -``` - -If you want to run only the test server run: -``` -npm run watch-query -``` - -Then open the following url in the browser of your choice to start running the tests. -``` -http://localhost:7357/ -``` - -### Running specific tests - -A filter can be specified by using the `filter` query param in the url. E.g, adding -``` -?filter=circle-pitch -``` -to the end of the url will only run the tests that contain `circle-pitch` in the name. - -### Build Notifications - -The terminal window can be very noisy with both the build and the test servers running in the same session. -So the server uses platform notifications to inform when the build has finished. If this behaviour is annoying, it can be disabled by setting the following env-var -``` -DISABLE_BUILD_NOTIFICATIONS=true -``` - - -## Writing new tests - -To add a new render test: -1. Create a new directory `test/integration/render-tests//` - -2. Create a new `style.json` file within that directory, specifying the map to load. Feel free to copy & modify one of the existing `style.json` files from the `render-tests` subdirectories. - -3. Generate an `expected.png` image from the given style by running the new test with the `UPDATE` flag enabled: - ``` - $ UPDATE=1 npm run test-render / - ``` - The test will appear to fail, but you'll now see a new `expected.png` in the test directory. - -4. Manually inspect `expected.png` to verify it looks as expected, and optionally run the test again without the update flag (`npm run test-render /`) to watch it pass (enjoy that dopamine kick!) - -5. Commit the new `style.json` and `expected.png` :rocket: - - -## Reading Vector Tile Fixtures - -Install `vt2geojson`, a command line utility which turns vector tiles into geojson, and `harp`, a simple file server. - -``` -npm install -g vt2geojson harp -``` - -Start a static file server -``` -harp server . -``` - -Read the contents of an entire vector tile - -``` -vt2geojson -z 14 -y 8803 -x 5374 http://localhost:9000/tiles/14-8803-5374.mvt -``` - -Read the contents of a particular layer in a vector tile - -``` -vt2geojson --layer poi_label -z 14 -y 8803 -x 5374 http://localhost:9000/tiles/14-8803-5374.mvt -``` diff --git a/metrics/integration/custom_layer_implementations.js b/metrics/integration/custom_layer_implementations.js deleted file mode 100644 index 1da7b1f7a8f4..000000000000 --- a/metrics/integration/custom_layer_implementations.js +++ /dev/null @@ -1,123 +0,0 @@ -class NullIsland { - constructor() { - this.id = 'null-island'; - this.type = 'custom'; - this.renderingMode = '2d'; - } - - onAdd(map, gl) { - const vertexSource = ` - uniform mat4 u_matrix; - void main() { - gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0); - gl_PointSize = 20.0; - }`; - - const fragmentSource = ` - void main() { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - }`; - - const vertexShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - - this.program = gl.createProgram(); - gl.attachShader(this.program, vertexShader); - gl.attachShader(this.program, fragmentShader); - gl.linkProgram(this.program); - } - - render(gl, matrix) { - gl.useProgram(this.program); - gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix); - gl.drawArrays(gl.POINTS, 0, 1); - } -} - -class Tent3D { - constructor() { - this.id = 'tent-3d'; - this.type = 'custom'; - this.renderingMode = '3d'; - } - - onAdd(map, gl) { - - const vertexSource = ` - - attribute vec3 aPos; - uniform mat4 uMatrix; - - void main() { - gl_Position = uMatrix * vec4(aPos, 1.0); - } - `; - - const fragmentSource = ` - void main() { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - } - `; - - const vertexShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - - this.program = gl.createProgram(); - gl.attachShader(this.program, vertexShader); - gl.attachShader(this.program, fragmentShader); - gl.linkProgram(this.program); - gl.validateProgram(this.program); - - this.program.aPos = gl.getAttribLocation(this.program, "aPos"); - this.program.uMatrix = gl.getUniformLocation(this.program, "uMatrix"); - - const x = 0.5 - 0.015; - const y = 0.5 - 0.01; - const z = 0.01; - const d = 0.01; - - const vertexArray = new Float32Array([ - x, y, 0, - x + d, y, 0, - x, y + d, z, - x + d, y + d, z, - x, y + d + d, 0, - x + d, y + d + d, 0]); - const indexArray = new Uint16Array([ - 0, 1, 2, - 1, 2, 3, - 2, 3, 4, - 3, 4, 5 - ]); - - this.vertexBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW); - this.indexBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArray, gl.STATIC_DRAW); - } - - render(gl, matrix) { - gl.useProgram(this.program); - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - gl.enableVertexAttribArray(this.program.a_pos); - gl.vertexAttribPointer(this.program.aPos, 3, gl.FLOAT, false, 0, 0); - gl.uniformMatrix4fv(this.program.uMatrix, false, matrix); - gl.drawElements(gl.TRIANGLES, 12, gl.UNSIGNED_SHORT, 0); - } -} - -export default { - "tent-3d": Tent3D, - "null-island": NullIsland -}; diff --git a/metrics/integration/dist/.gitkeep b/metrics/integration/dist/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/metrics/integration/lib/expression.js b/metrics/integration/lib/expression.js deleted file mode 100644 index 1d253078c0e4..000000000000 --- a/metrics/integration/lib/expression.js +++ /dev/null @@ -1,194 +0,0 @@ -import path from 'path'; -import * as diff from 'diff'; -import fs from 'fs'; -import harness from './harness'; -import compactStringify from 'json-stringify-pretty-compact'; - -// we have to handle this edge case here because we have test fixtures for this -// edge case, and we don't want UPDATE=1 to mess with them -function stringify(v) { - let s = compactStringify(v); - // http://timelessrepo.com/json-isnt-a-javascript-subset - if (s.indexOf('\u2028') >= 0) { - s = s.replace(/\u2028/g, '\\u2028'); - } - if (s.indexOf('\u2029') >= 0) { - s = s.replace(/\u2029/g, '\\u2029'); - } - return s; -} - -const decimalSigFigs = 6; - -function stripPrecision(x) { - // Intended for test output serialization: - // strips down to 6 decimal sigfigs but stops at decimal point - if (typeof x === 'number') { - if (x === 0) { return x; } - - const multiplier = Math.pow(10, - Math.max(0, - decimalSigFigs - Math.ceil(Math.log10(Math.abs(x))))); - - // We strip precision twice in a row here to avoid cases where - // stripping an already stripped number will modify its value - // due to bad floating point precision luck - // eg `Math.floor(8.16598 * 100000) / 100000` -> 8.16597 - const firstStrip = Math.floor(x * multiplier) / multiplier; - return Math.floor(firstStrip * multiplier) / multiplier; - } else if (typeof x !== 'object') { - return x; - } else if (Array.isArray(x)) { - return x.map(stripPrecision); - } else { - const stripped = {}; - for (const key of Object.keys(x)) { - stripped[key] = stripPrecision(x[key]); - } - return stripped; - } -} - -function deepEqual(a, b) { - if (typeof a !== typeof b) - return false; - if (typeof a === 'number') { - return stripPrecision(a) === stripPrecision(b); - } - if (a === null || b === null || typeof a !== 'object') - return a === b; - - const ka = Object.keys(a); - const kb = Object.keys(b); - - if (ka.length !== kb.length) - return false; - - ka.sort(); - kb.sort(); - - for (let i = 0; i < ka.length; i++) - if (ka[i] !== kb[i] || !deepEqual(a[ka[i]], b[ka[i]])) - return false; - - return true; -} - -/** - * Run the expression suite. - * - * @param {string} implementation - identify the implementation under test; used to - * deal with implementation-specific test exclusions and fudge-factors - * @param {Object} options - * @param {Array} [options.tests] - array of test names to run; tests not in the array will be skipped - * @param {Array} [options.ignores] - array of test names to ignore. - * @param {} runExpressionTest - a function that runs a single expression test fixture - * @returns {undefined} terminates the process when testing is complete - */ -export function run(implementation, options, runExpressionTest) { - const directory = path.join(__dirname, '../expression-tests'); - options.fixtureFilename = 'test.json'; - harness(directory, implementation, options, (fixture, params, done) => { - try { - const result = runExpressionTest(fixture, params); - const dir = path.join(directory, params.id); - - if (process.env.UPDATE) { - fixture.expected = { - compiled: result.compiled, - outputs: stripPrecision(result.outputs), - serialized: result.serialized - }; - - delete fixture.metadata; - - fs.writeFile(path.join(dir, 'test.json'), `${stringify(fixture, null, 2)}\n`, done); - return; - } - - const expected = fixture.expected; - const compileOk = deepEqual(result.compiled, expected.compiled); - const evalOk = compileOk && deepEqual(result.outputs, expected.outputs); - - let recompileOk = true; - let roundTripOk = true; - let serializationOk = true; - if (expected.compiled.result !== 'error') { - serializationOk = compileOk && deepEqual(expected.serialized, result.serialized); - recompileOk = compileOk && deepEqual(result.recompiled, expected.compiled); - roundTripOk = recompileOk && deepEqual(result.roundTripOutputs, expected.outputs); - } - - params.ok = compileOk && evalOk && recompileOk && roundTripOk && serializationOk; - - const diffOutput = { - text: '', - html: '' - }; - - const diffJson = (label, expectedJson, actualJson) => { - let text = ''; - let html = ''; - diff.diffJson(expectedJson, actualJson) - .forEach((hunk) => { - if (hunk.added) { - text += `+ ${hunk.value}`; - html += ` ${hunk.value}`; - } else if (hunk.removed) { - text += `- ${hunk.value}`; - html += ` ${hunk.value}`; - } else { - text += ` ${hunk.value}`; - html += ` ${hunk.value}`; - } - }); - if (text) { - diffOutput.text += `${label}\n${text}`; - diffOutput.html += `

${label}

\n${html}`; - } - }; - - if (!compileOk) { - diffJson('Compiled', expected.compiled, result.compiled); - } - if (compileOk && !serializationOk) { - diffJson('Serialized', expected.serialized, result.serialized); - } - if (compileOk && !recompileOk) { - diffJson('Serialized and re-compiled', expected.compiled, result.recompiled); - } - - const diffOutputs = (testOutputs) => { - return expected.outputs.map((expectedOutput, i) => { - if (!deepEqual(expectedOutput, testOutputs[i])) { - return `f(${JSON.stringify(fixture.inputs[i])})\nExpected: ${JSON.stringify(expectedOutput)}\nActual: ${JSON.stringify(testOutputs[i])}`; - } - return false; - }) - .filter(Boolean) - .join('\n'); - }; - - if (compileOk && !evalOk) { - const differences = `Original\n${diffOutputs(result.outputs)}\n`; - diffOutput.text += differences; - diffOutput.html += differences; - } - if (recompileOk && !roundTripOk) { - const differences = `\nRoundtripped through serialize()\n${diffOutputs(result.roundTripOutputs)}\n`; - diffOutput.text += differences; - diffOutput.html += differences; - } - - params.difference = diffOutput.html; - if (diffOutput.text) { console.log(diffOutput.text); } - - params.expression = compactStringify(fixture.expression); - params.serialized = compactStringify(result.serialized); - - done(); - } catch (e) { - done(e); - } - }); -} diff --git a/metrics/integration/lib/generate-fixture-json.js b/metrics/integration/lib/generate-fixture-json.js deleted file mode 100644 index b4bf77377ffb..000000000000 --- a/metrics/integration/lib/generate-fixture-json.js +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable import/no-commonjs */ -const path = require('path'); -const fs = require('fs'); -const glob = require('glob'); -const localizeURLs = require('./localize-urls'); - -const OUTPUT_FILE = 'fixtures.json'; - -exports.generateFixtureJson = generateFixtureJson; -exports.getAllFixtureGlobs = getAllFixtureGlobs; - -/** - * Analyzes the contents of the specified `path.join(rootDirectory, suiteDirectory)`, and inlines - * the contents into a single json file which can then be imported and built into a bundle - * to be shipped to the browser. - * - * @param {string} rootDirectory - * @param {string} suiteDirectory - * @param {boolean} includeImages - */ -function generateFixtureJson(rootDirectory, suiteDirectory, outputDirectory = 'test/integration/dist', includeImages = false) { - const globs = getAllFixtureGlobs(rootDirectory, suiteDirectory); - const jsonPaths = globs[0]; - const imagePaths = globs[1]; - //Extract the filedata into a flat dictionary - const allFiles = {}; - let allPaths = glob.sync(jsonPaths); - if (includeImages) { - allPaths = allPaths.concat(glob.sync(imagePaths)); - } - - //A Set that stores test names that are malformed so they can be removed later - const malformedTests = {}; - - for (const fixturePath of allPaths) { - const testName = path.dirname(fixturePath); - const fileName = path.basename(fixturePath); - const extension = path.extname(fixturePath); - try { - if (extension === '.json') { - let json = parseJsonFromFile(fixturePath); - - //Special case for style json which needs some preprocessing - if (fileName === 'style.json') { - json = processStyle(testName, json); - } - - allFiles[fixturePath] = json; - } else if (extension === '.png') { - allFiles[fixturePath] = pngToBase64Str(fixturePath); - } else { - throw new Error(`${extension} is incompatible , file path ${fixturePath}`); - } - } catch (e) { - console.log(`Error parsing file: ${fixturePath}`); - malformedTests[testName] = true; - } - } - - // Re-nest by directory path, each directory path defines a testcase. - const result = {}; - for (const fullPath in allFiles) { - const testName = path.dirname(fullPath).replace(rootDirectory, ''); - //Skip if test is malformed - if (malformedTests[testName]) { continue; } - - //Lazily initaialize an object to store each file wihin a particular testName - if (result[testName] == null) { - result[testName] = {}; - } - //Trim extension from filename - const fileName = path.basename(fullPath, path.extname(fullPath)); - result[testName][fileName] = allFiles[fullPath]; - } - - const outputStr = JSON.stringify(result, null, 4); - const outputPath = path.join(outputDirectory, OUTPUT_FILE); - - return new Promise((resolve, reject) => { - fs.writeFile(outputPath, outputStr, {encoding: 'utf8'}, (err) => { - if (err) { reject(err); } - - resolve(); - }); - }); -} - -function getAllFixtureGlobs(rootDirectory, suiteDirectory) { - const basePath = path.join(rootDirectory, suiteDirectory); - const jsonPaths = path.join(basePath, '/**/*.json'); - const imagePaths = path.join(basePath, '/**/*.png'); - - return [jsonPaths, imagePaths]; -} - -function parseJsonFromFile(filePath) { - return JSON.parse(fs.readFileSync(filePath, {encoding: 'utf8'})); -} - -function pngToBase64Str(filePath) { - return fs.readFileSync(filePath).toString('base64'); -} - -function processStyle(testName, style) { - const clone = JSON.parse(JSON.stringify(style)); - // 7357 is testem's default port - localizeURLs(clone, 7357); - - clone.metadata = clone.metadata || {}; - clone.metadata.test = Object.assign({ - testName, - width: 512, - height: 512, - pixelRatio: 1, - recycleMap: false, - allowed: 0.00015 - }, clone.metadata.test); - - return clone; -} diff --git a/metrics/integration/lib/harness.js b/metrics/integration/lib/harness.js deleted file mode 100644 index dff138568b0e..000000000000 --- a/metrics/integration/lib/harness.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable no-process-exit */ - -import path from 'path'; -import fs from 'fs'; -import glob from 'glob'; -import {shuffle} from 'shuffle-seed'; -import {queue} from 'd3'; -import colors from 'chalk'; -import template from 'lodash.template'; -import createServer from './server'; - -export default function (directory, implementation, options, run) { - const q = queue(1); - const server = createServer(); - - const tests = options.tests || []; - const ignores = options.ignores || {}; - - let sequence = glob.sync(`**/${options.fixtureFilename || 'style.json'}`, {cwd: directory}) - .map(fixture => { - const id = path.dirname(fixture); - const style = require(path.join(directory, fixture)); - - server.localizeURLs(style); - - style.metadata = style.metadata || {}; - style.metadata.test = Object.assign({ - id, - ignored: ignores[`${path.basename(directory)}/${id}`], - width: 512, - height: 512, - pixelRatio: 1, - recycleMap: options.recycleMap || false, - allowed: 0.00015 - }, style.metadata.test); - - return style; - }) - .filter(style => { - const test = style.metadata.test; - - if (tests.length !== 0 && !tests.some(t => test.id.indexOf(t) !== -1)) { - return false; - } - - if (implementation === 'native' && process.env.BUILDTYPE !== 'Debug' && test.id.match(/^debug\//)) { - console.log(colors.gray(`* skipped ${test.id}`)); - return false; - } - - if (/^skip/.test(test.ignored)) { - console.log(colors.gray(`* skipped ${test.id} (${test.ignored})`)); - return false; - } - - return true; - }); - - if (options.shuffle) { - console.log(colors.white(`* shuffle seed: `) + colors.bold(`${options.seed}`)); - sequence = shuffle(sequence, options.seed); - } - - q.defer(server.listen); - - sequence.forEach(style => { - q.defer((callback) => { - const test = style.metadata.test; - - try { - run(style, test, handleResult); - } catch (error) { - handleResult(error); - } - - function handleResult (error) { - if (error) { - test.error = error; - } - - if (test.ignored && !test.ok) { - test.color = '#9E9E9E'; - test.status = 'ignored failed'; - console.log(colors.white(`* ignore ${test.id} (${test.ignored})`)); - } else if (test.ignored) { - test.color = '#E8A408'; - test.status = 'ignored passed'; - console.log(colors.yellow(`* ignore ${test.id} (${test.ignored})`)); - } else if (test.error) { - test.color = 'red'; - test.status = 'errored'; - console.log(colors.red(`* errored ${test.id}`)); - } else if (!test.ok) { - test.color = 'red'; - test.status = 'failed'; - console.log(colors.red(`* failed ${test.id}`)); - } else { - test.color = 'green'; - test.status = 'passed'; - console.log(colors.green(`* passed ${test.id}`)); - } - - callback(null, test); - } - }); - }); - - q.defer(server.close); - - q.awaitAll((err, results) => { - if (err) { - console.error(err); - setTimeout(() => { process.exit(-1); }, 0); - return; - } - - const tests = results.slice(1, -1); - - if (process.env.UPDATE) { - console.log(`Updated ${tests.length} tests.`); - process.exit(0); - } - - let passedCount = 0, - ignoreCount = 0, - ignorePassCount = 0, - failedCount = 0, - erroredCount = 0; - - tests.forEach((test) => { - if (test.ignored && !test.ok) { - ignoreCount++; - } else if (test.ignored) { - ignorePassCount++; - } else if (test.error) { - erroredCount++; - } else if (!test.ok) { - failedCount++; - } else { - passedCount++; - } - }); - - const totalCount = passedCount + ignorePassCount + ignoreCount + failedCount + erroredCount; - - if (passedCount > 0) { - console.log(colors.green('%d passed (%s%)'), - passedCount, (100 * passedCount / totalCount).toFixed(1)); - } - - if (ignorePassCount > 0) { - console.log(colors.yellow('%d passed but were ignored (%s%)'), - ignorePassCount, (100 * ignorePassCount / totalCount).toFixed(1)); - } - - if (ignoreCount > 0) { - console.log(colors.white('%d ignored (%s%)'), - ignoreCount, (100 * ignoreCount / totalCount).toFixed(1)); - } - - if (failedCount > 0) { - console.log(colors.red('%d failed (%s%)'), - failedCount, (100 * failedCount / totalCount).toFixed(1)); - } - - if (erroredCount > 0) { - console.log(colors.red('%d errored (%s%)'), - erroredCount, (100 * erroredCount / totalCount).toFixed(1)); - } - - const resultsTemplate = template(fs.readFileSync(path.join(__dirname, '..', 'results.html.tmpl'), 'utf8')); - const itemTemplate = template(fs.readFileSync(path.join(directory, 'result_item.html.tmpl'), 'utf8')); - - const stats = {}; - for (const test of tests) { - stats[test.status] = (stats[test.status] || 0) + 1; - } - - const unsuccessful = tests.filter(test => - test.status === 'failed' || test.status === 'errored'); - - const resultsShell = resultsTemplate({unsuccessful, tests, stats, shuffle: options.shuffle, seed: options.seed}) - .split(''); - - const p = path.join(directory, options.recycleMap ? 'index-recycle-map.html' : 'index.html'); - const out = fs.createWriteStream(p); - - const q = queue(1); - q.defer(write, out, resultsShell[0]); - for (const test of tests) { - q.defer(write, out, itemTemplate({r: test, hasFailedTests: unsuccessful.length > 0})); - } - q.defer(write, out, resultsShell[1]); - q.await(() => { - out.end(); - out.on('close', () => { - console.log(`Results at: ${p}`); - process.exit((failedCount + erroredCount) === 0 ? 0 : 1); - }); - }); - }); -} - -function write(stream, data, cb) { - if (!stream.write(data)) { - stream.once('drain', cb); - } else { - process.nextTick(cb); - } -} diff --git a/metrics/integration/lib/json-diff.js b/metrics/integration/lib/json-diff.js deleted file mode 100644 index 730a5b89989d..000000000000 --- a/metrics/integration/lib/json-diff.js +++ /dev/null @@ -1,37 +0,0 @@ -import diff from 'diff'; - -export function generateDiffLog(expected, actual) { - return diff.diffJson(expected, actual).map((hunk) => { - if (hunk.added) { - return `+ ${hunk.value}`; - } else if (hunk.removed) { - return `- ${hunk.value}`; - } else { - return ` ${hunk.value}`; - } - }).join(''); -} - -export function deepEqual(a, b) { - if (typeof a !== typeof b) - return false; - if (typeof a === 'number') - return Math.abs(a - b) < 1e-10; - if (a === null || typeof a !== 'object') - return a === b; - - const ka = Object.keys(a); - const kb = Object.keys(b); - - if (ka.length !== kb.length) - return false; - - ka.sort(); - kb.sort(); - - for (let i = 0; i < ka.length; i++) - if (ka[i] !== kb[i] || !deepEqual(a[ka[i]], b[ka[i]])) - return false; - - return true; -} diff --git a/metrics/integration/lib/localize-urls.js b/metrics/integration/lib/localize-urls.js deleted file mode 100644 index 040572cf1f91..000000000000 --- a/metrics/integration/lib/localize-urls.js +++ /dev/null @@ -1,102 +0,0 @@ -/* eslint-disable import/no-commonjs */ -const path = require('path'); -const fs = require('fs'); -const colors = require('chalk'); - -module.exports = function localizeURLs(style, port) { - localizeStyleURLs(style, port); - if (style.metadata && style.metadata.test && style.metadata.test.operations) { - style.metadata.test.operations.forEach((op) => { - if (op[0] === 'addSource') { - localizeSourceURLs(op[2], port); - } else if (op[0] === 'setStyle') { - if (typeof op[1] === 'object') { - localizeStyleURLs(op[1], port); - return; - } - - let styleJSON; - try { - const relativePath = op[1].replace(/^local:\/\//, ''); - if (relativePath.startsWith('mapbox-gl-styles')) { - styleJSON = fs.readFileSync(path.join(path.dirname(require.resolve('mapbox-gl-styles')), '..', relativePath)); - } else { - styleJSON = fs.readFileSync(path.join(__dirname, '..', relativePath)); - } - } catch (error) { - console.log(colors.blue(`* ${error}`)); - return; - } - - try { - styleJSON = JSON.parse(styleJSON); - } catch (error) { - console.log(colors.blue(`* Error while parsing ${op[1]}: ${error}`)); - return; - } - - localizeStyleURLs(styleJSON, port); - - op[1] = styleJSON; - op[2] = {diff: false}; - } - }); - } -}; - -function localizeURL(url, port) { - return url.replace(/^local:\/\//, `http://localhost:${port}/`); -} - -function localizeMapboxSpriteURL(url, port) { - return url.replace(/^mapbox:\/\//, `http://localhost:${port}/`); -} - -function localizeMapboxFontsURL(url, port) { - return url.replace(/^mapbox:\/\/fonts/, `http://localhost:${port}/glyphs`); -} - -function localizeMapboxTilesURL(url, port) { - return url.replace(/^mapbox:\/\//, `http://localhost:${port}/tiles/`); -} - -function localizeMapboxTilesetURL(url, port) { - return url.replace(/^mapbox:\/\//, `http://localhost:${port}/tilesets/`); -} - -function localizeSourceURLs(source, port) { - for (const tile in source.tiles) { - source.tiles[tile] = localizeMapboxTilesURL(source.tiles[tile], port); - source.tiles[tile] = localizeURL(source.tiles[tile], port); - } - - if (source.urls) { - source.urls = source.urls.map((url) => localizeMapboxTilesetURL(url, port)); - source.urls = source.urls.map((url) => localizeURL(url, port)); - } - - if (source.url) { - source.url = localizeMapboxTilesetURL(source.url, port); - source.url = localizeURL(source.url, port); - } - - if (source.data && typeof source.data == 'string') { - source.data = localizeURL(source.data, port); - } -} - -function localizeStyleURLs (style, port) { - for (const source in style.sources) { - localizeSourceURLs(style.sources[source], port); - } - - if (style.sprite) { - style.sprite = localizeMapboxSpriteURL(style.sprite, port); - style.sprite = localizeURL(style.sprite, port); - } - - if (style.glyphs) { - style.glyphs = localizeMapboxFontsURL(style.glyphs, port); - style.glyphs = localizeURL(style.glyphs, port); - } -} diff --git a/metrics/integration/lib/operation-handlers.js b/metrics/integration/lib/operation-handlers.js deleted file mode 100644 index d653c8929438..000000000000 --- a/metrics/integration/lib/operation-handlers.js +++ /dev/null @@ -1,56 +0,0 @@ -function handleOperation(map, operations, opIndex, doneCb) { - const operation = operations[opIndex]; - const opName = operation[0]; - //Delegate to special handler if one is available - if (opName in operationHandlers) { - operationHandlers[opName](map, operation.slice(1), () => { - doneCb(opIndex); - }); - } else { - map[opName](...operation.slice(1)); - doneCb(opIndex); - } -} - -export const operationHandlers = { - wait(map, params, doneCb) { - const wait = function() { - if (map.loaded()) { - doneCb(); - } else { - map.once('render', wait); - } - }; - wait(); - }, - idle(map, params, doneCb) { - const idle = function() { - if (!map.isMoving()) { - doneCb(); - } else { - map.once('render', idle); - } - }; - idle(); - } -}; - -export function applyOperations(map, operations, doneCb) { - // No operations specified, end immediately adn invoke doneCb. - if (!operations || operations.length === 0) { - doneCb(); - return; - } - - // Start recursive chain - const scheduleNextOperation = (lastOpIndex) => { - if (lastOpIndex === operations.length - 1) { - // Stop recusive chain when at the end of the operations - doneCb(); - return; - } - - handleOperation(map, operations, ++lastOpIndex, scheduleNextOperation); - }; - scheduleNextOperation(-1); -} diff --git a/metrics/integration/lib/query-browser.js b/metrics/integration/lib/query-browser.js deleted file mode 100644 index 4eb275a70afc..000000000000 --- a/metrics/integration/lib/query-browser.js +++ /dev/null @@ -1,86 +0,0 @@ -/* eslint-env browser */ -/* global tape:readonly, mapboxgl:readonly */ -/* eslint-disable import/no-unresolved */ -// fixtures.json is automatically generated before this file gets built -// refer testem.js#before_tests() -import fixtures from '../dist/fixtures.json'; -import ignores from '../../ignores.json'; -import {applyOperations} from './operation-handlers'; -import {deepEqual, generateDiffLog} from './json-diff'; - -for (const testName in fixtures) { - if (testName in ignores) { - tape.skip(testName, testFunc); - } else { - tape(testName, {timeout: 20000}, testFunc); - } -} - -function testFunc(t) { - // This needs to be read from the `t` object because this function runs async in a closure. - const currentTestName = t.name; - const style = fixtures[currentTestName].style; - const expected = fixtures[currentTestName].expected; - const options = style.metadata.test; - const skipLayerDelete = style.metadata.skipLayerDelete; - - window.devicePixelRatio = options.pixelRatio; - - //1. Create and position the container, floating at the bottom right - const container = document.createElement('div'); - container.style.position = 'fixed'; - container.style.bottom = '10px'; - container.style.right = '10px'; - container.style.width = `${options.width}px`; - container.style.height = `${options.height}px`; - document.body.appendChild(container); - - //2. Initialize the Map - const map = new mapboxgl.Map({ - container, - style, - classes: options.classes, - interactive: false, - attributionControl: false, - preserveDrawingBuffer: true, - axonometric: options.axonometric || false, - skew: options.skew || [0, 0], - fadeDuration: options.fadeDuration || 0, - localIdeographFontFamily: options.localIdeographFontFamily || false, - crossSourceCollisions: typeof options.crossSourceCollisions === "undefined" ? true : options.crossSourceCollisions - }); - map.repaint = true; - map.once('load', () => { - //3. Run the operations on the map - applyOperations(map, options.operations, () => { - - //4. Perform query operation and compare results from expected values - const results = options.queryGeometry ? - map.queryRenderedFeatures(options.queryGeometry, options.queryOptions || {}) : - []; - - const actual = results.map((feature) => { - const featureJson = JSON.parse(JSON.stringify(feature.toJSON())); - if (!skipLayerDelete) delete featureJson.layer; - return featureJson; - }); - - const testMetaData = { - name: t.name, - actual: map.getCanvas().toDataURL() - }; - const success = deepEqual(actual, expected); - if (success) { - t.pass(JSON.stringify(testMetaData)); - } else { - testMetaData['difference'] = generateDiffLog(expected, actual); - t.fail(JSON.stringify(testMetaData)); - } - //Cleanup WebGL context - map.remove(); - delete map.painter.context.gl; - document.body.removeChild(container); - t.end(); - }); - }); -} diff --git a/metrics/integration/lib/query.js b/metrics/integration/lib/query.js deleted file mode 100644 index 5485d39d0780..000000000000 --- a/metrics/integration/lib/query.js +++ /dev/null @@ -1,153 +0,0 @@ -import path from 'path'; -import fs from 'fs'; -import * as diff from 'diff'; -import {PNG} from 'pngjs'; -import harness from './harness'; - -function deepEqual(a, b) { - if (typeof a !== typeof b) - return false; - if (typeof a === 'number') - return Math.abs(a - b) < 1e-10; - if (a === null || typeof a !== 'object') - return a === b; - - const ka = Object.keys(a); - const kb = Object.keys(b); - - if (ka.length !== kb.length) - return false; - - ka.sort(); - kb.sort(); - - for (let i = 0; i < ka.length; i++) - if (ka[i] !== kb[i] || !deepEqual(a[ka[i]], b[ka[i]])) - return false; - - return true; -} - -/** - * Run the query suite. - * - * @param {string} implementation - identify the implementation under test; used to - * deal with implementation-specific test exclusions and fudge-factors - * @param {Object} options - * @param {Array} [options.tests] - array of test names to run; tests not in the - * array will be skipped - * @param {queryFn} query - a function that performs the query - * @returns {undefined} terminates the process when testing is complete - */ -export function run(implementation, options, query) { - const directory = path.join(__dirname, '../query-tests'); - harness(directory, implementation, options, (style, params, done) => { - query(style, params, (err, data, results) => { - if (err) return done(err); - - const dir = path.join(directory, params.id); - - if (process.env.UPDATE) { - fs.writeFile(path.join(dir, 'expected.json'), JSON.stringify(results, null, 2), done); - return; - } - - const expected = require(path.join(dir, 'expected.json')); - - params.ok = deepEqual(results, expected); - - if (!params.ok) { - const msg = diff.diffJson(expected, results) - .map((hunk) => { - if (hunk.added) { - return `+ ${hunk.value}`; - } else if (hunk.removed) { - return `- ${hunk.value}`; - } else { - return ` ${hunk.value}`; - } - }) - .join(''); - - params.difference = msg; - console.log(msg); - } - - const width = params.width * params.pixelRatio; - const height = params.height * params.pixelRatio; - - const color = [255, 0, 0, 255]; - - function scaleByPixelRatio(x) { - return x * params.pixelRatio; - } - - if (!Array.isArray(params.queryGeometry[0])) { - const p = params.queryGeometry.map(scaleByPixelRatio); - const d = 30; - drawAxisAlignedLine([p[0] - d, p[1]], [p[0] + d, p[1]], data, width, height, color); - drawAxisAlignedLine([p[0], p[1] - d], [p[0], p[1] + d], data, width, height, color); - } else { - const a = params.queryGeometry[0].map(scaleByPixelRatio); - const b = params.queryGeometry[1].map(scaleByPixelRatio); - drawAxisAlignedLine([a[0], a[1]], [a[0], b[1]], data, width, height, color); - drawAxisAlignedLine([a[0], b[1]], [b[0], b[1]], data, width, height, color); - drawAxisAlignedLine([b[0], b[1]], [b[0], a[1]], data, width, height, color); - drawAxisAlignedLine([b[0], a[1]], [a[0], a[1]], data, width, height, color); - } - - const actualJSON = path.join(dir, 'actual.json'); - fs.writeFile(actualJSON, JSON.stringify(results, null, 2), () => {}); - - const actualPNG = path.join(dir, 'actual.png'); - - const png = new PNG({ - width: params.width * params.pixelRatio, - height: params.height * params.pixelRatio - }); - - png.data = data; - - png.pack() - .pipe(fs.createWriteStream(actualPNG)) - .on('finish', () => { - params.actual = fs.readFileSync(actualPNG).toString('base64'); - done(); - }); - }); - }); -} - -function drawAxisAlignedLine(a, b, pixels, width, height, color) { - const fromX = clamp(Math.min(a[0], b[0]), 0, width); - const toX = clamp(Math.max(a[0], b[0]), 0, width); - const fromY = clamp(Math.min(a[1], b[1]), 0, height); - const toY = clamp(Math.max(a[1], b[1]), 0, height); - - let index; - if (fromX === toX) { - for (let y = fromY; y <= toY; y++) { - index = getIndex(fromX, y); - pixels[index + 0] = color[0]; - pixels[index + 1] = color[1]; - pixels[index + 2] = color[2]; - pixels[index + 3] = color[3]; - } - } else { - for (let x = fromX; x <= toX; x++) { - index = getIndex(x, fromY); - pixels[index + 0] = color[0]; - pixels[index + 1] = color[1]; - pixels[index + 2] = color[2]; - pixels[index + 3] = color[3]; - } - } - - function getIndex(x, y) { - return (y * width + x) * 4; - } -} - -function clamp(x, a, b) { - return Math.max(a, Math.min(b, x)); -} diff --git a/metrics/integration/lib/render.js b/metrics/integration/lib/render.js deleted file mode 100644 index e2846a47c0b9..000000000000 --- a/metrics/integration/lib/render.js +++ /dev/null @@ -1,183 +0,0 @@ -import path from 'path'; -import fs from 'fs'; -import {PNG} from 'pngjs'; -import harness from './harness'; -import pixelmatch from 'pixelmatch'; -import * as glob from 'glob'; - -/** - * Run the render test suite, compute differences to expected values (making exceptions based on - * implementation vagaries), print results to standard output, write test artifacts to the - * filesystem (optionally updating expected results), and exit the process with a success or - * failure code. - * - * Caller must supply a `render` function that does the actual rendering and passes the raw image - * result on to the `render` function's callback. - * - * A local server is launched that is capable of serving requests for the source, sprite, - * font, and tile assets needed by the tests, and the URLs within the test styles are - * rewritten to point to that server. - * - * As the tests run, results are printed to standard output, and test artifacts are written - * to the filesystem. If the environment variable `UPDATE` is set, the expected artifacts are - * updated in place based on the test rendering. - * - * If all the tests are successful, this function exits the process with exit code 0. Otherwise - * it exits with 1. If an unexpected error occurs, it exits with -1. - * - * @param {string} implementation - identify the implementation under test; used to - * deal with implementation-specific test exclusions and fudge-factors - * @param {Object} [ignores] - map of test names to disable. A key is the relative - * path to a test directory, e.g. `"render-tests/background-color/default"`. A value is a string - * that by convention links to an issue that explains why the test is currently disabled. By default, - * disabled tests will be run, but not fail the test run if the result does not match the expected - * result. If the value begins with "skip", the test will not be run at all -- use this for tests - * that would crash the test harness entirely if they were run. - * @param {renderFn} render - a function that performs the rendering - * @returns {undefined} terminates the process when testing is complete - */ -export function run(implementation, ignores, render) { - const options = {ignores, tests:[], shuffle:false, recycleMap:false, seed:makeHash()}; - - // https://stackoverflow.com/a/1349426/229714 - function makeHash() { - const array = []; - const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - - for (let i = 0; i < 10; ++i) - array.push(possible.charAt(Math.floor(Math.random() * possible.length))); - - // join array elements without commas. - return array.join(''); - } - - function checkParameter(param) { - const index = options.tests.indexOf(param); - if (index === -1) - return false; - options.tests.splice(index, 1); - return true; - } - - function checkValueParameter(defaultValue, param) { - const index = options.tests.findIndex((elem) => { return String(elem).startsWith(param); }); - if (index === -1) - return defaultValue; - - const split = String(options.tests.splice(index, 1)).split('='); - if (split.length !== 2) - return defaultValue; - - return split[1]; - } - - if (process.argv.length > 2) { - options.tests = process.argv.slice(2).filter((value, index, self) => { return self.indexOf(value) === index; }) || []; - options.shuffle = checkParameter('--shuffle'); - options.recycleMap = checkParameter('--recycle-map'); - options.seed = checkValueParameter(options.seed, '--seed'); - } - - const directory = path.join(__dirname, '../render-tests'); - harness(directory, implementation, options, (style, params, done) => { - render(style, params, (err, data) => { - if (err) return done(err); - - let stats; - const dir = path.join(directory, params.id); - try { - stats = fs.statSync(dir, fs.R_OK | fs.W_OK); - if (!stats.isDirectory()) throw new Error(); - } catch (e) { - fs.mkdirSync(dir); - } - - const expectedPath = path.join(dir, 'expected.png'); - const actualPath = path.join(dir, 'actual.png'); - const diffPath = path.join(dir, 'diff.png'); - - const width = Math.floor(params.width * params.pixelRatio); - const height = Math.floor(params.height * params.pixelRatio); - const actualImg = new PNG({width, height}); - - // PNG data must be unassociated (not premultiplied) - for (let i = 0; i < data.length; i++) { - const a = data[i * 4 + 3] / 255; - if (a !== 0) { - data[i * 4 + 0] /= a; - data[i * 4 + 1] /= a; - data[i * 4 + 2] /= a; - } - } - actualImg.data = data; - - // there may be multiple expected images, covering different platforms - const expectedPaths = glob.sync(path.join(dir, 'expected*.png')); - - if (!process.env.UPDATE && expectedPaths.length === 0) { - throw new Error('No expected*.png files found; did you mean to run tests with UPDATE=true?'); - } - - if (process.env.UPDATE) { - fs.writeFileSync(expectedPath, PNG.sync.write(actualImg)); - - } else { - // if we have multiple expected images, we'll compare against each one and pick the one with - // the least amount of difference; this is useful for covering features that render differently - // depending on platform, i.e. heatmaps use half-float textures for improved rendering where supported - let minDiff = Infinity; - let minDiffImg, minExpectedBuf; - - for (const path of expectedPaths) { - const expectedBuf = fs.readFileSync(path); - const expectedImg = PNG.sync.read(expectedBuf); - const diffImg = new PNG({width, height}); - - const diff = pixelmatch( - actualImg.data, expectedImg.data, diffImg.data, - width, height, {threshold: 0.1285}) / (width * height); - - if (diff < minDiff) { - minDiff = diff; - minDiffImg = diffImg; - minExpectedBuf = expectedBuf; - } - } - - const diffBuf = PNG.sync.write(minDiffImg, {filterType: 4}); - const actualBuf = PNG.sync.write(actualImg, {filterType: 4}); - - fs.writeFileSync(diffPath, diffBuf); - fs.writeFileSync(actualPath, actualBuf); - - params.difference = minDiff; - params.ok = minDiff <= params.allowed; - - params.actual = actualBuf.toString('base64'); - params.expected = minExpectedBuf.toString('base64'); - params.diff = diffBuf.toString('base64'); - } - - done(); - }); - }); -} - -/** - * @callback renderFn - * @param {Object} style - style to render - * @param {Object} options - * @param {number} options.width - render this wide - * @param {number} options.height - render this high - * @param {number} options.pixelRatio - render with this pixel ratio - * @param {boolean} options.shuffle - shuffle tests sequence - * @param {String} options.seed - Shuffle seed - * @param {boolean} options.recycleMap - trigger map object recycling - * @param {renderCallback} callback - callback to call with the results of rendering - */ - -/** - * @callback renderCallback - * @param {?Error} error - * @param {Buffer} [result] - raw RGBA image data - */ diff --git a/metrics/integration/lib/server.js b/metrics/integration/lib/server.js deleted file mode 100644 index b20eea261fc7..000000000000 --- a/metrics/integration/lib/server.js +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable import/no-commonjs */ -const path = require('path'); -const fs = require('fs'); -const st = require('st'); -const {createServer} = require('http'); -const localizeURLs = require('./localize-urls'); - -module.exports = function () { - const port = 2900; - const integrationMount = st({path: path.join(__dirname, '..')}); - const mapboxGLStylesMount = st({path: path.dirname(require.resolve('mapbox-gl-styles')), url: 'mapbox-gl-styles'}); - const mapboxMVTFixturesMount = st({path: path.dirname(require.resolve('@mapbox/mvt-fixtures')), url: 'mvt-fixtures'}); - const server = createServer((req, res) => { - if (req.method === 'POST' && req.url === '/write-file') { - let body = ''; - req.on('data', (data) => { - body += data; - }); - req.on('end', () => { - - //Write data to disk - const {filePath, data} = JSON.parse(body); - fs.writeFile(path.join(process.cwd(), filePath), data, 'base64', () => { - res.writeHead(200, {'Content-Type': 'text/html'}); - res.end('ok'); - }); - }); - } - - return mapboxMVTFixturesMount(req, res, () => { - return mapboxGLStylesMount(req, res, () => { - return integrationMount(req, res); - }); - }); - }); - - return { - listen(callback) { - server.listen(port, callback); - }, - - close(callback) { - server.close(callback); - }, - - localizeURLs(style) { - return localizeURLs(style, port); - } - }; -}; diff --git a/metrics/integration/query-tests/result_item.html.tmpl b/metrics/integration/query-tests/result_item.html.tmpl deleted file mode 100644 index cd3a5d80867e..000000000000 --- a/metrics/integration/query-tests/result_item.html.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -
-

<%- r.status %> <%- r.id %>

- <% if (r.status !== 'errored') { %> - - <% } %> - <% if (r.error) { %>

Error: <%- r.error.message %>

<% } %> - <% if (r.difference) { %> -
<%- r.difference.trim() %>
- <% } %> -
diff --git a/metrics/integration/results.html.tmpl b/metrics/integration/results.html.tmpl deleted file mode 100644 index 37432be176a4..000000000000 --- a/metrics/integration/results.html.tmpl +++ /dev/null @@ -1,73 +0,0 @@ - - -<% if (unsuccessful.length) { %> -

- <%- unsuccessful.length %> tests failed. -<% } else { %> -

- All tests passed! -<% } %> - - - -

- -

<%- Object.keys(stats).map(status => stats[status] + ' ' + status).join(', ') + '.' %>

- -
- <% if (unsuccessful.length) { %> -

Failed tests: - <% for (const r of unsuccessful) { %><%- r.id %> <% } %>

- <% } %> - -

Test sequence: - <% for (const s of tests) { %><%- s.id %> <% } %>

- - <% if (shuffle) { %>

Shuffle seed: <%- seed %>

<% } %> -
- - - -
- -
diff --git a/metrics/integration/rollup.config.test.js b/metrics/integration/rollup.config.test.js deleted file mode 100644 index f8e347cea285..000000000000 --- a/metrics/integration/rollup.config.test.js +++ /dev/null @@ -1,14 +0,0 @@ -import {plugins} from '../../build/rollup_plugins'; - -export default { - input: 'test/integration/lib/query-browser.js', - output: { - name: 'queryTests', - format: 'iife', - sourcemap: 'inline', - indent: false, - file: 'test/integration/dist/query-test.js' - }, - plugins: plugins(false, false), - external: [ 'tape', 'mapboxgl' ] -}; diff --git a/metrics/integration/testem.js b/metrics/integration/testem.js deleted file mode 100644 index ec262ff7b0d8..000000000000 --- a/metrics/integration/testem.js +++ /dev/null @@ -1,169 +0,0 @@ -/* eslint-disable no-global-assign */ -/* eslint-disable import/no-commonjs */ -/* eslint-disable flowtype/require-valid-file-annotation */ -require = require("esm")(module); -const {generateFixtureJson, getAllFixtureGlobs} = require('./lib/generate-fixture-json'); -const createServer = require('./lib/server'); -const buildTape = require('../../build/test/build-tape'); -const runAll = require('npm-run-all'); -const chokidar = require('chokidar'); -const rollup = require('rollup'); -const notifier = require('node-notifier'); -const rollupDevConfig = require('../../rollup.config').default; -const rollupTestConfig = require('./rollup.config.test').default; - -const rootFixturePath = 'test/integration/'; -const suitePath = 'query-tests'; -const fixtureBuildInterval = 2000; - -let beforeHookInvoked = false; -let server; - -let fixtureWatcher; -const rollupWatchers = {}; - -module.exports = { - "test_page": "test/integration/testem_page.html", - "src_files": [ - "dist/mapbox-gl-dev.js", - "test/integration/dist/query-test.js" - ], - "launch_in_dev": [], - "launch_in_ci": [ "Chrome" ], - "browser_args": { - "Chrome": { - "mode": "ci", - "args": [ "--headless", "--disable-gpu", "--remote-debugging-port=9222" ] - } - }, - "proxies": { - "/tiles":{ - "target": "http://localhost:2900" - }, - "/glyphs":{ - "target": "http://localhost:2900" - }, - "/tilesets":{ - "target": "http://localhost:2900" - }, - "/sprites":{ - "target": "http://localhost:2900" - }, - "/data":{ - "target": "http://localhost:2900" - }, - "/write-file":{ - "target": "http://localhost:2900" - } - }, - "before_tests"(config, data, callback) { - if (!beforeHookInvoked) { - server = createServer(); - const buildPromise = config.appMode === 'ci' ? buildArtifactsCi() : buildArtifactsDev(); - buildPromise.then(() => { - server.listen(callback); - }).catch((e) => { - callback(e); - }); - - beforeHookInvoked = true; - } - }, - "after_tests"(config, data, callback) { - if (config.appMode === 'ci') { - server.close(callback); - } - } -}; - -// helper method that builds test artifacts when in CI mode. -// Retuns a promise that resolves when all artifacts are built -function buildArtifactsCi() { - //1. Compile fixture data into a json file, so it can be bundled - generateFixtureJson(rootFixturePath, suitePath); - //2. Build tape - const tapePromise = buildTape(); - //3. Build test artifacts in parallel - const rollupPromise = runAll(['build-query-suite', 'build-dev'], {parallel: true}); - - return Promise.all([tapePromise, rollupPromise]); -} - -// helper method that starts a bunch of build-watchers and returns a promise -// that resolves when all of them have had their first run. -function buildArtifactsDev() { - return buildTape().then(() => { - // A promise that resolves on the first build of fixtures.json - return new Promise((resolve, reject) => { - fixtureWatcher = chokidar.watch(getAllFixtureGlobs(rootFixturePath, suitePath)); - let needsRebuild = false; - fixtureWatcher.on('ready', () => { - generateFixtureJson(rootFixturePath, suitePath); - - //Throttle calls to `generateFixtureJson` to run every 2s - setInterval(() => { - if (needsRebuild) { - generateFixtureJson(rootFixturePath, suitePath); - needsRebuild = false; - } - }, fixtureBuildInterval); - - //Flag needs rebuild when anything changes - fixtureWatcher.on('all', () => { - needsRebuild = true; - }); - // Resolve promise once chokidar has finished first scan of fixtures - resolve(); - }); - - fixtureWatcher.on('error', (e) => reject(e)); - }); - }).then(() => { - //Helper function that starts a rollup watcher - //returns a promise that resolves when the first bundle has finished - function startRollupWatcher(name, config) { - return new Promise((resolve, reject) => { - const watcher = rollup.watch(silenceWarnings(config)); - rollupWatchers[name] = watcher; - - watcher.on('event', (e) => { - if (e.code === 'START') { - notify('Query Tests', `${name} bundle started`); - } - if (e.code === 'END') { - notify('Query Tests', `${name} bundle finished`); - resolve(); - } - if (e.code === 'FATAL') { - reject(e); - } - }); - - }); - } - - return Promise.all([ - startRollupWatcher('mapbox-gl', rollupDevConfig), - startRollupWatcher('query-suite', rollupTestConfig), - ]); - }); -} - -function silenceWarnings(config) { - function addEmptyWarningHandler(configObj) { - configObj["onwarn"] = function() {}; - return configObj; - } - - if (Array.isArray(config)) { - return config.map(addEmptyWarningHandler); - } else { - return addEmptyWarningHandler(config); - } -} - -function notify(title, message) { - if (!process.env.DISABLE_BUILD_NOTIFICATIONS) { - notifier.notify({title, message}); - } -} diff --git a/metrics/integration/testem_page.html b/metrics/integration/testem_page.html deleted file mode 100644 index 9eb4913c0e47..000000000000 --- a/metrics/integration/testem_page.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - Mapbox GL JS Integration Tests - - - - - - - - - - diff --git a/platform/android/scripts/metrics.sh b/platform/android/scripts/metrics.sh deleted file mode 100755 index ee41b99324b4..000000000000 --- a/platform/android/scripts/metrics.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -# Track individual architectures -scripts/check_binary_size.js "MapLibreAndroid/build/intermediates/intermediate-jars/release/jni/armeabi-v7a/libmaplibre.so" "Android arm-v7" -scripts/check_binary_size.js "MapLibreAndroid/build/intermediates/intermediate-jars/release/jni/arm64-v8a/libmaplibre.so" "Android arm-v8" -scripts/check_binary_size.js "MapLibreAndroid/build/intermediates/intermediate-jars/release/jni/x86/libmaplibre.so" "Android x86" -scripts/check_binary_size.js "MapLibreAndroid/build/intermediates/intermediate-jars/release/jni/x86_64/libmaplibre.so" "Android x86_64" - -# Track overall library size -scripts/check_binary_size.js "MapLibreAndroid/build/outputs/aar/MapLibreAndroid-release.aar" "Android AAR" - -if [[ $CIRCLE_BRANCH == main ]]; then - # Build source data for http://mapbox.github.io/mapbox-gl-native/metrics/binary-size/ - # and log binary sizes to metrics warehouse - scripts/publish_binary_size.js -fi From fbfc3c5b125783e7a209eec244c83030cb607309 Mon Sep 17 00:00:00 2001 From: omartijn <44672243+omartijn@users.noreply.github.com> Date: Sun, 13 Apr 2025 00:30:55 +0200 Subject: [PATCH 143/339] Fix std::bad_function_call in event handling (#3388) --- platform/qt/src/mbgl/run_loop.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/qt/src/mbgl/run_loop.cpp b/platform/qt/src/mbgl/run_loop.cpp index ea1828dea076..4850b29693cb 100644 --- a/platform/qt/src/mbgl/run_loop.cpp +++ b/platform/qt/src/mbgl/run_loop.cpp @@ -113,7 +113,7 @@ void RunLoop::addWatch(int fd, Event event, std::function&& cb if (event == Event::Read || event == Event::ReadWrite) { auto notifier = std::make_unique(fd, QSocketNotifier::Read); QObject::connect(notifier.get(), &QSocketNotifier::activated, impl.get(), &RunLoop::Impl::onReadEvent); - impl->readPoll[fd] = WatchPair(std::move(notifier), std::move(cb)); + impl->readPoll[fd] = WatchPair(std::move(notifier), cb); } if (event == Event::Write || event == Event::ReadWrite) { From 88fd774e67f3ab1100ec4b145705d37a61306608 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 15 Apr 2025 19:48:31 +0200 Subject: [PATCH 144/339] Remove legacy renderer from source, build files and CI (#3384) --- .../scripts/windows-ci_configure_wrapper.ps1 | 6 - .github/workflows/android-ci.yml | 6 +- .github/workflows/linux-ci.yml | 14 +- .github/workflows/node-ci.yml | 2 - .github/workflows/node-release.yml | 2 - .github/workflows/windows-ci.yml | 7 - BUILD.bazel | 22 +- CMakeLists.txt | 253 ++++----- CMakePresets.json | 10 +- MODULE.bazel | 4 +- bin/BUILD.bazel | 1 + docs/mdbook/src/profiling/tracy-profiling.md | 2 +- expression-test/BUILD.bazel | 1 + include/mbgl/gfx/context.hpp | 8 - include/mbgl/gfx/gpu_expression.hpp | 4 - include/mbgl/gfx/renderer_backend.hpp | 2 - include/mbgl/gl/renderer_backend.hpp | 2 - include/mbgl/renderer/renderer_frontend.hpp | 6 +- include/mbgl/shaders/line_layer_ubo.hpp | 3 - include/mbgl/style/property_expression.hpp | 5 - platform/BUILD.bazel | 3 +- platform/android/Makefile | 7 +- .../android/MapLibreAndroid/build.gradle.kts | 23 - platform/darwin/BUILD.bazel | 2 +- platform/darwin/src/MLNStyleLayerManager.mm | 4 - platform/default/BUILD.bazel | 1 + .../src/mbgl/layermanager/layer_manager.cpp | 5 - platform/glfw/BUILD.bazel | 1 + .../example_custom_drawable_style_layer.cpp | 26 +- .../example_custom_drawable_style_layer.hpp | 4 - platform/glfw/glfw_view.cpp | 4 +- platform/ios/app/MBXViewController.mm | 10 - platform/ios/test/BUILD.bazel | 1 + platform/ios/test/common/BUILD.bazel | 1 + platform/ios/test/core/BUILD.bazel | 1 + platform/ios/vendor/BUILD.bazel | 1 + platform/linux/BUILD.bazel | 1 + platform/linux/README.md | 2 +- platform/macos/app/BUILD.bazel | 1 + platform/node/DEVELOPING.md | 2 +- render-test/BUILD.bazel | 1 + render-test/android/app/build.gradle.kts | 1 - render-test/ios/BUILD.bazel | 1 + render-test/metadata.hpp | 4 - rustutils/BUILD.bazel | 1 + src/mbgl/geometry/line_atlas.cpp | 24 - src/mbgl/geometry/line_atlas.hpp | 16 +- src/mbgl/gfx/index_vector.hpp | 13 +- src/mbgl/gfx/offscreen_texture.hpp | 4 - src/mbgl/gfx/polyline_generator.cpp | 5 - src/mbgl/gfx/upload_pass.hpp | 8 - src/mbgl/gfx/vertex_vector.hpp | 14 +- src/mbgl/gl/context.cpp | 15 - src/mbgl/gl/context.hpp | 8 - src/mbgl/gl/offscreen_texture.cpp | 32 +- src/mbgl/gl/offscreen_texture.hpp | 5 - src/mbgl/gl/renderer_backend.cpp | 4 - src/mbgl/gl/upload_pass.cpp | 6 - src/mbgl/gl/upload_pass.hpp | 4 - src/mbgl/programs/programs.cpp | 30 - src/mbgl/renderer/bucket.hpp | 6 - src/mbgl/renderer/buckets/circle_bucket.cpp | 11 - src/mbgl/renderer/buckets/circle_bucket.hpp | 5 - src/mbgl/renderer/buckets/debug_bucket.cpp | 15 +- src/mbgl/renderer/buckets/fill_bucket.cpp | 13 - src/mbgl/renderer/buckets/fill_bucket.hpp | 14 - .../buckets/fill_extrusion_bucket.cpp | 11 - .../buckets/fill_extrusion_bucket.hpp | 5 - src/mbgl/renderer/buckets/heatmap_bucket.cpp | 9 - src/mbgl/renderer/buckets/heatmap_bucket.hpp | 5 - .../renderer/buckets/hillshade_bucket.cpp | 17 - .../renderer/buckets/hillshade_bucket.hpp | 7 - src/mbgl/renderer/buckets/line_bucket.cpp | 11 - src/mbgl/renderer/buckets/line_bucket.hpp | 7 - src/mbgl/renderer/buckets/raster_bucket.cpp | 16 - src/mbgl/renderer/buckets/raster_bucket.hpp | 5 - src/mbgl/renderer/buckets/symbol_bucket.cpp | 125 +---- src/mbgl/renderer/buckets/symbol_bucket.hpp | 18 - .../layers/render_background_layer.cpp | 104 ---- .../layers/render_background_layer.hpp | 13 - .../renderer/layers/render_circle_layer.cpp | 111 ---- .../renderer/layers/render_circle_layer.hpp | 19 - .../layers/render_custom_drawable_layer.cpp | 9 - .../layers/render_custom_drawable_layer.hpp | 6 - .../renderer/layers/render_custom_layer.cpp | 43 -- .../renderer/layers/render_custom_layer.hpp | 6 - .../layers/render_fill_extrusion_layer.cpp | 167 ------ .../layers/render_fill_extrusion_layer.hpp | 20 - .../renderer/layers/render_fill_layer.cpp | 179 ------ .../renderer/layers/render_fill_layer.hpp | 19 - .../renderer/layers/render_heatmap_layer.cpp | 130 +---- .../renderer/layers/render_heatmap_layer.hpp | 21 - .../layers/render_hillshade_layer.cpp | 161 +----- .../layers/render_hillshade_layer.hpp | 21 - .../renderer/layers/render_line_layer.cpp | 145 +---- .../renderer/layers/render_line_layer.hpp | 27 - .../renderer/layers/render_raster_layer.cpp | 155 +----- .../renderer/layers/render_raster_layer.hpp | 15 - .../renderer/layers/render_symbol_layer.cpp | 523 +----------------- .../renderer/layers/render_symbol_layer.hpp | 21 - src/mbgl/renderer/paint_property_binder.hpp | 99 ---- src/mbgl/renderer/pattern_atlas.cpp | 23 +- src/mbgl/renderer/pattern_atlas.hpp | 10 - src/mbgl/renderer/render_layer.cpp | 8 - src/mbgl/renderer/render_layer.hpp | 13 - src/mbgl/renderer/render_orchestrator.cpp | 61 +- src/mbgl/renderer/render_orchestrator.hpp | 13 +- src/mbgl/renderer/render_static_data.cpp | 5 - src/mbgl/renderer/render_tile.cpp | 23 - src/mbgl/renderer/render_tile.hpp | 10 - src/mbgl/renderer/render_tree.hpp | 6 - src/mbgl/renderer/renderer_impl.cpp | 143 +---- .../renderer/sources/render_image_source.cpp | 11 - .../renderer/sources/render_image_source.hpp | 2 - .../renderer/sources/render_tile_source.cpp | 22 +- .../renderer/sources/render_tile_source.hpp | 4 - src/mbgl/renderer/tile_render_data.cpp | 14 - src/mbgl/renderer/tile_render_data.hpp | 12 - src/mbgl/style/properties.hpp | 4 - src/mbgl/style/property_expression.cpp | 4 - src/mbgl/tile/geometry_tile.cpp | 20 +- src/mbgl/tile/raster_dem_tile.cpp | 2 - test/BUILD.bazel | 1 + test/android/app/build.gradle.kts | 2 - test/api/custom_drawable_layer.test.cpp | 4 - test/map/map.test.cpp | 6 +- test/renderer/shader_registry.test.cpp | 12 - test/util/offscreen_texture.test.cpp | 10 +- vendor/BUILD.bazel | 1 + vendor/glfw.BUILD | 2 + 130 files changed, 279 insertions(+), 3139 deletions(-) diff --git a/.github/scripts/windows-ci_configure_wrapper.ps1 b/.github/scripts/windows-ci_configure_wrapper.ps1 index 1ed2766e71b0..d91c71c0c950 100644 --- a/.github/scripts/windows-ci_configure_wrapper.ps1 +++ b/.github/scripts/windows-ci_configure_wrapper.ps1 @@ -12,12 +12,6 @@ switch ($env:RENDERER) 'osmesa' { $compile_flags += '-DMLN_WITH_OSMESA=ON'; break; } } -switch ($env:RENDERING_MODE) -{ - 'legacy' { $compile_flags += '-DMLN_LEGACY_RENDERER=ON' ; break; } - 'drawable' { $compile_flags += '-DMLN_DRAWABLE_RENDERER=ON'; break; } -} - Write-Host 'Compile flags: ' $compile_flags & cmake -B build -G Ninja $($compile_flags) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index c121ca7bc01d..e4cf00f5d19d 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -187,9 +187,9 @@ jobs: - name: Build Instrumentation Tests, copy to platform/android run: | - ./gradlew assembleLegacyDebug assembleLegacyDebugAndroidTest -PtestBuildType=debug - cp MapLibreAndroidTestApp/build/outputs/apk/legacy/debug/MapLibreAndroidTestApp-legacy-debug.apk InstrumentationTestApp.apk - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/legacy/debug/MapLibreAndroidTestApp-legacy-debug-androidTest.apk InstrumentationTests.apk + ./gradlew assembleDrawableDebug assembleDrawableDebugAndroidTest -PtestBuildType=debug + cp MapLibreAndroidTestApp/build/outputs/apk/drawable/debug/MapLibreAndroidTestApp-drawable-debug.apk InstrumentationTestApp.apk + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/drawable/debug/MapLibreAndroidTestApp-drawable-debug-androidTest.apk InstrumentationTests.apk - name: Upload android-ui-test uses: actions/upload-artifact@v4 diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 4b888d5d947d..b5e1ddc8ab21 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -53,7 +53,7 @@ jobs: strategy: fail-fast: true matrix: - renderer: [legacy, drawable, vulkan, drawable-rust] + renderer: [vulkan, drawable] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -79,19 +79,13 @@ jobs: - name: Install dependencies run: .github/scripts/install-linux-deps - - if: matrix.renderer == 'drawable' - run: echo renderer_flag_cmake=-DMLN_DRAWABLE_RENDERER=ON >> "$GITHUB_ENV" - - if: matrix.renderer == 'drawable-rust' + - if: matrix.renderer == 'drawable' run: | - echo "renderer_flag_cmake=-DMLN_DRAWABLE_RENDERER=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" - cargo install cxxbridge-cmd - - - if: matrix.renderer == 'legacy' - run: echo renderer_flag_cmake=-DMLN_LEGACY_RENDERER=ON >> "$GITHUB_ENV" + echo "-DMLN_WITH_OPENGL=ON" >> "$GITHUB_ENV" - if: matrix.renderer == 'vulkan' - run: echo renderer_flag_cmake="-DMLN_DRAWABLE_RENDERER=ON -DMLN_LEGACY_RENDERER=OFF -DMLN_WITH_VULKAN=ON -DMLN_WITH_OPENGL=OFF" >> "$GITHUB_ENV" + run: echo renderer_flag_cmake="-DMLN_WITH_VULKAN=ON -DMLN_WITH_OPENGL=OFF" >> "$GITHUB_ENV" - name: Build MapLibre Native Core env: diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 44d3f639fb98..6a08ef5f933f 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -136,7 +136,6 @@ jobs: libcurl4-openssl-dev \ libglfw3-dev \ libuv1-dev \ - g++-12 \ libjpeg-dev \ libpng-dev \ libwebp-dev @@ -214,7 +213,6 @@ jobs: -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER=gcc-12 \ - -DCMAKE_CXX_COMPILER=g++-12 \ -DMLN_WITH_NODE=ON - name: "Create directory '${{ github.workspace }}/platform/windows/vendor/vcpkg/bincache' (Windows)" diff --git a/.github/workflows/node-release.yml b/.github/workflows/node-release.yml index eb3d84bc3e9b..fcc812df6cea 100644 --- a/.github/workflows/node-release.yml +++ b/.github/workflows/node-release.yml @@ -181,8 +181,6 @@ jobs: -DMLN_WITH_NODE=ON \ -DMLN_WITH_OPENGL=OFF \ -DMLN_WITH_METAL=ON \ - -DMLN_LEGACY_RENDERER=OFF \ - -DMLN_DRAWABLE_RENDERER=ON \ -DMLN_WITH_WERROR=OFF - name: Configure maplibre-native (Linux) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index dfa76d88cd14..fd98f40efef4 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -88,12 +88,6 @@ jobs: strategy: matrix: renderer: [opengl, egl, vulkan, osmesa] - rendering_mode: [legacy, drawable] - exclude: - - renderer: egl - rendering_mode: drawable - - renderer: vulkan - rendering_mode: legacy runs-on: windows-2022 steps: - run: | @@ -133,7 +127,6 @@ jobs: CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" RENDERER: "${{ matrix.renderer }}" - RENDERING_MODE: "${{ matrix.rendering_mode }}" timeout-minutes: 60 run: | cmake --version diff --git a/BUILD.bazel b/BUILD.bazel index 9b387f5a613b..a097da5e3263 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,6 +1,7 @@ load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_library", "js_run_binary") load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag") load("@npm//:defs.bzl", "npm_link_all_packages") +load("@rules_cc//cc:defs.bzl", "cc_library") load( "//bazel:core.bzl", "MLN_CORE_HEADERS", @@ -76,32 +77,21 @@ cc_library( srcs = MLN_CORE_SOURCE + MLN_GENERATED_STYLE_SOURCE + select({ ":drawable_renderer": MLN_OPENGL_SOURCE + MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_GL_SOURCE, - ":legacy_renderer": MLN_OPENGL_SOURCE, ":metal_renderer": MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_MTL_SOURCE, "//conditions:default": [], }), hdrs = MLN_CORE_HEADERS + select({ ":drawable_renderer": MLN_OPENGL_HEADERS + MLN_DRAWABLES_HEADERS + MLN_DRAWABLES_GL_HEADERS, - ":legacy_renderer": MLN_OPENGL_HEADERS, ":metal_renderer": MLN_DRAWABLES_HEADERS + MLN_DRAWABLES_MTL_HEADERS, "//conditions:default": [], }), copts = CPP_FLAGS + MAPLIBRE_FLAGS, defines = select({ - ":legacy_renderer": [ - "MLN_RENDER_BACKEND_OPENGL=1", - "MLN_LEGACY_RENDERER=1", - "MLN_DRAWABLE_RENDERER=0", - ], ":drawable_renderer": [ "MLN_RENDER_BACKEND_OPENGL=1", - "MLN_LEGACY_RENDERER=0", - "MLN_DRAWABLE_RENDERER=1", ], ":metal_renderer": [ "MLN_RENDER_BACKEND_METAL=1", - "MLN_LEGACY_RENDERER=0", - "MLN_DRAWABLE_RENDERER=1", ], }) + select({ "@platforms//os:ios": ["GLES_SILENCE_DEPRECATION=1"], @@ -172,21 +162,13 @@ genrule( string_flag( name = "renderer", - build_setting_default = "legacy", + build_setting_default = "drawable", values = [ - "legacy", "drawable", "metal", ], ) -config_setting( - name = "legacy_renderer", - flag_values = { - ":renderer": "legacy", - }, -) - config_setting( name = "drawable_renderer", flag_values = { diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d56e47855ef..994f73a778fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,13 +14,20 @@ option(MLN_WITH_VULKAN "Build with Vulkan renderer" OFF) option(MLN_WITH_OSMESA "Build with OSMesa (Software) renderer" OFF) option(MLN_WITH_PMTILES "Build with PMTiles support" ON) option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) -option(MLN_LEGACY_RENDERER "Include the legacy rendering pathway" ON) -option(MLN_DRAWABLE_RENDERER "Include the drawable rendering pathway" OFF) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) option(MLN_USE_RUST "Use components in Rust" OFF) option(MLN_CORE_INCLUDE_DEPS "Include depdendencies in static build of core" OFF) +if (MLN_LEGACY_RENDERER) + message(FATAL "The legacy renderer is no longer supported") +endif() + +if (MLN_DRAWABLE_RENDERER) + message(FATAL "Do not pass MLN_DRAWABLE_RENDERER, the drawable renderer is now the default") +endif() + + if (MLN_WITH_CLANG_TIDY) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) if(NOT CLANG_TIDY_COMMAND) @@ -64,10 +71,6 @@ add_library( set(UBSAN_BLACKLIST ${PROJECT_SOURCE_DIR}/scripts/ubsan.blacklist) -if (MLN_DRAWABLE_RENDERER) - set(MLN_LEGACY_RENDERER OFF) -endif() - target_compile_options( mbgl-compiler-options INTERFACE @@ -146,82 +149,74 @@ else() add_library(mbgl-core STATIC) endif() -if(MLN_DRAWABLE_RENDERER) - list(APPEND INCLUDE_FILES - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/context.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_data.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_impl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_builder.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_tweaker.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_atlases_tweaker.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/gpu_expression.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_buffer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/vertex_attribute.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/texture2d.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/change_request.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/layer_group.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/render_target.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_program_base.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/util/suppress_copies.hpp - ) - list(APPEND SRC_FILES - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder_impl.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_atlases_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/gpu_expression.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/hillshade_prepare_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/image_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/line_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/symbol_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/collision_drawable_data.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform_buffer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_attribute.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/render_target.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/change_request.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layer_group.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/tile_layer_group.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/background_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/background_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/circle_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/circle_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/line_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/line_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/location_indicator_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/raster_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/raster_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/collision_layer_tweaker.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/collision_layer_tweaker.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/shader_program_base.cpp - ) - - target_compile_definitions( - mbgl-core - PUBLIC - "MLN_DRAWABLE_RENDERER=$" - ) -endif() +list(APPEND INCLUDE_FILES + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/context.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_data.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_impl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_builder.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_tweaker.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_atlases_tweaker.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/gpu_expression.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_buffer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/vertex_attribute.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/texture2d.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/change_request.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/layer_group.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/render_target.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_program_base.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/suppress_copies.hpp +) +list(APPEND SRC_FILES + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_atlases_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/gpu_expression.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/hillshade_prepare_drawable_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/image_drawable_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/line_drawable_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/symbol_drawable_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/collision_drawable_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform_buffer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_attribute.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/render_target.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/change_request.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layer_group.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/tile_layer_group.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/background_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/background_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/circle_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/circle_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/heatmap_texture_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/hillshade_prepare_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/line_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/line_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/location_indicator_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/location_indicator_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/raster_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/raster_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/collision_layer_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/collision_layer_tweaker.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/shader_program_base.cpp +) list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/actor/actor.hpp @@ -1018,8 +1013,6 @@ if(MLN_WITH_OPENGL) mbgl-core PRIVATE MLN_RENDER_BACKEND_OPENGL=1 PUBLIC - "MLN_LEGACY_RENDERER=$" - "MLN_DRAWABLE_RENDERER=$" "MLN_USE_UNORDERED_DENSE=$" ) list(APPEND @@ -1141,50 +1134,48 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/platform/gl_functions.cpp ) - if(MLN_DRAWABLE_RENDERER) - list(APPEND INCLUDE_FILES - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/background_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/circle_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/collision_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/custom_drawable_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/debug_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/heatmap_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/hillshade_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/line_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/location_indicator_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/raster_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_defines.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/symbol_layer_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/widevector_ubo.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_drawable_layer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_drawable_layer_factory.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/shader_program_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/buffer_allocator.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl_builder.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/layer_group_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/uniform_buffer_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/vertex_attribute_gl.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/texture2d.hpp - ) - list(APPEND SRC_FILES - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/shader_info.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/shader_program_gl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/buffer_allocator.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl_builder.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl_impl.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/layer_group_gl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture2d.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_buffer_gl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_attribute_gl.cpp - ) - endif() + list(APPEND INCLUDE_FILES + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/background_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/circle_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/collision_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/custom_drawable_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/debug_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/heatmap_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/heatmap_texture_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/hillshade_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/hillshade_prepare_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/line_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/location_indicator_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/raster_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_defines.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/symbol_layer_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/widevector_ubo.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_drawable_layer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_drawable_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/shader_program_gl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/buffer_allocator.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/drawable_gl_builder.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/layer_group_gl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/uniform_buffer_gl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/vertex_attribute_gl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gl/texture2d.hpp + ) + list(APPEND SRC_FILES + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/shader_info.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/shader_program_gl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/buffer_allocator.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl_builder.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/drawable_gl_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/layer_group_gl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture2d.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_buffer_gl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_attribute_gl.cpp + ) endif() if(MLN_WITH_METAL) @@ -1379,8 +1370,7 @@ if(MLN_WITH_VULKAN) ) endif() -if(MLN_DRAWABLE_RENDERER) - list(APPEND +list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_drawable_layer_factory.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp @@ -1388,8 +1378,7 @@ if(MLN_DRAWABLE_RENDERER) ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp - ) -endif() +) target_sources( mbgl-core PRIVATE diff --git a/CMakePresets.json b/CMakePresets.json index cdc0275e58b5..18103ffa0b74 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -16,8 +16,7 @@ "CMAKE_SYSTEM_NAME": "iOS", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_METAL": "ON", - "MLN_WITH_OPENGL": "OFF", - "MLN_DRAWABLE_RENDERER": "ON" + "MLN_WITH_OPENGL": "OFF" } }, { @@ -29,8 +28,7 @@ "CMAKE_SYSTEM_NAME": "Darwin", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_METAL": "ON", - "MLN_WITH_OPENGL": "OFF", - "MLN_DRAWABLE_RENDERER": "ON" + "MLN_WITH_OPENGL": "OFF" } }, { @@ -42,8 +40,7 @@ "CMAKE_SYSTEM_NAME": "Darwin", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_VULKAN": "ON", - "MLN_WITH_OPENGL": "OFF", - "MLN_DRAWABLE_RENDERER": "ON" + "MLN_WITH_OPENGL": "OFF" } }, { @@ -72,7 +69,6 @@ "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_METAL": "OFF", "MLN_WITH_OPENGL": "ON", - "MLN_DRAWABLE_RENDERER": "ON", "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++" } diff --git a/MODULE.bazel b/MODULE.bazel index 740ae9231f48..36d5814d281b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -8,6 +8,8 @@ bazel_dep(name = "rules_xcodeproj", version = "2.11.1") bazel_dep(name = "aspect_rules_js", version = "2.3.3") bazel_dep(name = "rules_nodejs", version = "6.3.4") bazel_dep(name = "libuv", version = "1.48.0") +bazel_dep(name = "apple_support", version = "1.21.1", repo_name = "build_bazel_apple_support") +bazel_dep(name = "rules_cc", version = "0.1.1") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) node.toolchain(node_version = "20.14.0") @@ -58,8 +60,8 @@ new_git_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:git.bzl" new_git_repository( name = "tinyobjloader", - remote = "https://github.com/tinyobjloader/tinyobjloader.git", branch = "release", + remote = "https://github.com/tinyobjloader/tinyobjloader.git", ) darwin_config = use_repo_rule("//platform/darwin:bazel/darwin_config_repository_rule.bzl", "darwin_config") diff --git a/bin/BUILD.bazel b/bin/BUILD.bazel index d78422448708..a7b8d4b73dd2 100644 --- a/bin/BUILD.bazel +++ b/bin/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_binary") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_binary( diff --git a/docs/mdbook/src/profiling/tracy-profiling.md b/docs/mdbook/src/profiling/tracy-profiling.md index ac34566ec0f9..1726db4ac92c 100644 --- a/docs/mdbook/src/profiling/tracy-profiling.md +++ b/docs/mdbook/src/profiling/tracy-profiling.md @@ -92,7 +92,7 @@ As an example, the glfw sample is used. With CMake, in MapLibre repository root do ~~~bash # generate project -cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=OFF -DMLN_WITH_COVERAGE=OFF -DMLN_DRAWABLE_RENDERER=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DMLN_USE_TRACY=ON +cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=OFF -DMLN_WITH_COVERAGE=OFF -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DMLN_USE_TRACY=ON # build cmake --build build --target mbgl-glfw -j 8 # run diff --git a/expression-test/BUILD.bazel b/expression-test/BUILD.bazel index ed11c7779c09..eb4803c1189a 100644 --- a/expression-test/BUILD.bazel +++ b/expression-test/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/include/mbgl/gfx/context.hpp b/include/mbgl/gfx/context.hpp index e55b141db22c..28016426c54b 100644 --- a/include/mbgl/gfx/context.hpp +++ b/include/mbgl/gfx/context.hpp @@ -11,9 +11,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif #include #include @@ -23,21 +21,18 @@ namespace mbgl { class PaintParameters; class ProgramParameters; -#if MLN_DRAWABLE_RENDERER class TileLayerGroup; class LayerGroup; class RenderTarget; using TileLayerGroupPtr = std::shared_ptr; using LayerGroupPtr = std::shared_ptr; using RenderTargetPtr = std::shared_ptr; -#endif namespace gfx { class OffscreenTexture; class ShaderRegistry; -#if MLN_DRAWABLE_RENDERER class Drawable; class DrawableBuilder; class ShaderProgramBase; @@ -50,7 +45,6 @@ using Texture2DPtr = std::shared_ptr; using UniformBufferPtr = std::shared_ptr; using UniqueDrawableBuilder = std::unique_ptr; using VertexAttributeArrayPtr = std::shared_ptr; -#endif namespace { ContextObserver nullObserver; @@ -114,7 +108,6 @@ class Context { /// Sets dirty state virtual void setDirtyState() = 0; -#if MLN_DRAWABLE_RENDERER /// Create a new vertex attribute array virtual gfx::VertexAttributeArrayPtr createVertexAttributeArray() const = 0; @@ -178,7 +171,6 @@ class Context { /// Unbind the global uniform buffers virtual void unbindGlobalUniformBuffers(gfx::RenderPass&) const noexcept = 0; -#endif protected: virtual std::unique_ptr createTextureResource(Size, TexturePixelType, TextureChannelDataType) = 0; diff --git a/include/mbgl/gfx/gpu_expression.hpp b/include/mbgl/gfx/gpu_expression.hpp index 8a80a83246b5..b7089a60c9ec 100644 --- a/include/mbgl/gfx/gpu_expression.hpp +++ b/include/mbgl/gfx/gpu_expression.hpp @@ -5,8 +5,6 @@ #include -#if MLN_DRAWABLE_RENDERER - namespace mbgl { namespace style { namespace expression { @@ -104,5 +102,3 @@ inline auto GPUExpression::evaluate(const float zoom) const { } // namespace gfx } // namespace mbgl - -#endif diff --git a/include/mbgl/gfx/renderer_backend.hpp b/include/mbgl/gfx/renderer_backend.hpp index 5c6e760573da..5dd24947270a 100644 --- a/include/mbgl/gfx/renderer_backend.hpp +++ b/include/mbgl/gfx/renderer_backend.hpp @@ -50,10 +50,8 @@ class RendererBackend { /// Returns a reference to the default surface that should be rendered on. virtual Renderable& getDefaultRenderable() = 0; -#if MLN_DRAWABLE_RENDERER /// One-time shader initialization virtual void initShaders(gfx::ShaderRegistry&, const ProgramParameters&) = 0; -#endif const mbgl::util::SimpleIdentity uniqueID; protected: diff --git a/include/mbgl/gl/renderer_backend.hpp b/include/mbgl/gl/renderer_backend.hpp index 145c1f78f224..b95988589fbe 100644 --- a/include/mbgl/gl/renderer_backend.hpp +++ b/include/mbgl/gl/renderer_backend.hpp @@ -23,10 +23,8 @@ class RendererBackend : public gfx::RendererBackend { /// Called prior to rendering to update the internally assumed OpenGL state. virtual void updateAssumedState() = 0; -#if MLN_DRAWABLE_RENDERER /// One-time shader initialization void initShaders(gfx::ShaderRegistry&, const ProgramParameters& programParameters) override; -#endif protected: std::unique_ptr createContext() override; diff --git a/include/mbgl/renderer/renderer_frontend.hpp b/include/mbgl/renderer/renderer_frontend.hpp index 108bf0a16962..05cfb69ddce0 100644 --- a/include/mbgl/renderer/renderer_frontend.hpp +++ b/include/mbgl/renderer/renderer_frontend.hpp @@ -1,11 +1,9 @@ #pragma once -#if MLN_DRAWABLE_RENDERER -#include -#endif +#include +#include #include -#include namespace mbgl { diff --git a/include/mbgl/shaders/line_layer_ubo.hpp b/include/mbgl/shaders/line_layer_ubo.hpp index 34a713f40abe..998420d216c7 100644 --- a/include/mbgl/shaders/line_layer_ubo.hpp +++ b/include/mbgl/shaders/line_layer_ubo.hpp @@ -3,10 +3,7 @@ #include #include #include - -#if MLN_DRAWABLE_RENDERER #include -#endif // MLN_DRAWABLE_RENDERER namespace mbgl { namespace shaders { diff --git a/include/mbgl/style/property_expression.hpp b/include/mbgl/style/property_expression.hpp index d91f1c6da57f..843b80a5d1df 100644 --- a/include/mbgl/style/property_expression.hpp +++ b/include/mbgl/style/property_expression.hpp @@ -7,10 +7,7 @@ #include #include #include - -#if MLN_DRAWABLE_RENDERER #include -#endif // MLN_DRAWABLE_RENDERER #include @@ -52,10 +49,8 @@ class PropertyExpressionBase { /// expression. May be removed if a better way of aggregation is found. std::shared_ptr getSharedExpression() const noexcept; -#if MLN_DRAWABLE_RENDERER /// Build a cached GPU representation of the expression, with the same lifetime as this object. gfx::UniqueGPUExpression getGPUExpression(bool intZoom) const; -#endif // MLN_DRAWABLE_RENDERER Dependency getDependencies() const noexcept { return expression ? expression->dependencies : Dependency::None; } diff --git a/platform/BUILD.bazel b/platform/BUILD.bazel index c400cd44e80d..3841ca31eef7 100644 --- a/platform/BUILD.bazel +++ b/platform/BUILD.bazel @@ -1,4 +1,5 @@ load("@aspect_rules_js//js:defs.bzl", "js_binary") +load("@rules_cc//cc:defs.bzl", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS", "WARNING_FLAGS") objc_library( @@ -88,7 +89,6 @@ objc_library( "//platform/ios:ios_public_hdrs", "//platform/ios:ios_sdk_hdrs", ] + select({ - "//:legacy_renderer": [], "//conditions:default": [ "//platform/darwin:darwin_objcpp_custom_drawable_srcs", ], @@ -288,7 +288,6 @@ objc_library( deps = [ ":ios-sdk", ] + select({ - "//:legacy_renderer": [], "//conditions:default": [ ":app_custom_drawable_layer_objcpp_srcs", ], diff --git a/platform/android/Makefile b/platform/android/Makefile index c2d85ff530c2..a667e52fd9b7 100644 --- a/platform/android/Makefile +++ b/platform/android/Makefile @@ -15,10 +15,9 @@ else endif ifeq ($(RENDERER), drawable) -else ifeq ($(RENDERER), legacy) else ifeq ($(RENDERER), vulkan) else - $(error RENDERER must be 'legacy' (OpenGL), 'drawable' (OpenGL) or 'vulkan') + $(error RENDERER must be 'drawable' (OpenGL) or 'vulkan') endif buildtype := $(shell echo "$(BUILDTYPE)" | tr "[A-Z]" "[a-z]") @@ -219,9 +218,9 @@ run-android-ui-test-%: run-android-ui-test-arm-v7-% # Run Java Unit tests on the JVM of the development machine executing this .PHONY: run-android-unit-test run-android-unit-test: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testLegacyDebugUnitTest --info + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testDrawableDebugUnitTest --info run-android-unit-test-%: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testLegacyDebugUnitTest --info --tests "$*" + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testDrawableDebugUnitTest --info --tests "$*" DEBUG_TAR_FILE_NAME := $(if $(findstring drawable,$(RENDERER)),debug-symbols-opengl.tar.gz,debug-symbols-$(RENDERER).tar.gz) diff --git a/platform/android/MapLibreAndroid/build.gradle.kts b/platform/android/MapLibreAndroid/build.gradle.kts index d4be1d2fa0ed..b642cf50e039 100644 --- a/platform/android/MapLibreAndroid/build.gradle.kts +++ b/platform/android/MapLibreAndroid/build.gradle.kts @@ -70,37 +70,17 @@ android { "\"MapLibre Native/${project.property("VERSION_NAME")}\"" ) consumerProguardFiles("proguard-rules.pro") - - externalNativeBuild { - cmake { - arguments("-DMLN_LEGACY_RENDERER=ON", "-DMLN_DRAWABLE_RENDERER=OFF") - } - } } flavorDimensions += "renderer" productFlavors { - create("legacy") { - dimension = "renderer" - externalNativeBuild { - cmake { - arguments("-DMLN_LEGACY_RENDERER=ON", "-DMLN_DRAWABLE_RENDERER=OFF") - } - } - } create("drawable") { dimension = "renderer" - externalNativeBuild { - cmake { - arguments("-DMLN_LEGACY_RENDERER=OFF", "-DMLN_DRAWABLE_RENDERER=ON") - } - } } create("vulkan") { dimension = "renderer" externalNativeBuild { cmake { - arguments("-DMLN_LEGACY_RENDERER=OFF", "-DMLN_DRAWABLE_RENDERER=ON") arguments("-DMLN_WITH_OPENGL=OFF", "-DMLN_WITH_VULKAN=ON") } } @@ -108,9 +88,6 @@ android { } sourceSets { - getByName("legacy") { - java.srcDirs("src/opengl/java/") - } getByName("drawable") { java.srcDirs("src/opengl/java/") } diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index 540614772e7e..6948b827b9e4 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -1,4 +1,5 @@ load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_library", "js_run_binary") +load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library") load( "@rules_swift//swift:swift.bzl", "swift_library", @@ -337,7 +338,6 @@ js_library( ":generated_style_hdrs", ":generated_style_srcs", ] + select({ - "//:legacy_renderer": [], "//conditions:default": [ ":darwin_objcpp_custom_drawable_srcs", ], diff --git a/platform/darwin/src/MLNStyleLayerManager.mm b/platform/darwin/src/MLNStyleLayerManager.mm index cec49b45c9a6..cb6fcbe08813 100644 --- a/platform/darwin/src/MLNStyleLayerManager.mm +++ b/platform/darwin/src/MLNStyleLayerManager.mm @@ -11,9 +11,7 @@ #import "MLNSymbolStyleLayer_Private.h" #import "MLNCustomStyleLayer_Private.h" -#if MLN_DRAWABLE_RENDERER #import "MLNCustomDrawableStyleLayer_Private.h" -#endif #include @@ -71,13 +69,11 @@ addLayerType(std::make_unique()); #endif -#if MLN_DRAWABLE_RENDERER #if defined(MLN_LAYER_CUSTOM_DRAWABLE_DISABLE_RUNTIME) addLayerTypeCoreOnly(std::make_unique()); #elif !defined(MLN_LAYER_CUSTOM_DRAWABLE_DISABLE_ALL) addLayerType(std::make_unique()); #endif -#endif } LayerManagerDarwin::~LayerManagerDarwin() = default; diff --git a/platform/default/BUILD.bazel b/platform/default/BUILD.bazel index 95f94e32ce6e..6a5c82d8d674 100644 --- a/platform/default/BUILD.bazel +++ b/platform/default/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/platform/default/src/mbgl/layermanager/layer_manager.cpp b/platform/default/src/mbgl/layermanager/layer_manager.cpp index fbbeb429682c..bad94e9b79ff 100644 --- a/platform/default/src/mbgl/layermanager/layer_manager.cpp +++ b/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -12,10 +12,7 @@ #include #include #include - -#if MLN_DRAWABLE_RENDERER #include -#endif #include #include @@ -73,11 +70,9 @@ LayerManagerDefault::LayerManagerDefault() { #if !defined(MBGL_LAYER_LOCATION_INDICATOR_DISABLE_ALL) addLayerType(std::make_unique()); #endif -#if MLN_DRAWABLE_RENDERER #if !defined(MLN_LAYER_CUSTOM_DRAWABLE_DISABLE_ALL) addLayerType(std::make_unique()); #endif -#endif } void LayerManagerDefault::addLayerType(std::unique_ptr factory) { diff --git a/platform/glfw/BUILD.bazel b/platform/glfw/BUILD.bazel index 8e025fd4433c..447d349c1add 100644 --- a/platform/glfw/BUILD.bazel +++ b/platform/glfw/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_binary", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") objc_library( diff --git a/platform/glfw/example_custom_drawable_style_layer.cpp b/platform/glfw/example_custom_drawable_style_layer.cpp index 0ea02911553d..19cb3789de0c 100644 --- a/platform/glfw/example_custom_drawable_style_layer.cpp +++ b/platform/glfw/example_custom_drawable_style_layer.cpp @@ -1,7 +1,5 @@ #include "example_custom_drawable_style_layer.hpp" -#if MLN_DRAWABLE_RENDERER - #include #include #include @@ -271,8 +269,9 @@ void ExampleCustomDrawableStyleLayerHost::createDrawables(Interface& interface) Interface::SymbolOptions options; options.texture = interface.context.createTexture2D(); options.texture->setImage(image); - options.texture->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Repeat, gfx::TextureWrapType::Repeat}); + options.texture->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Repeat, + .wrapV = gfx::TextureWrapType::Repeat}); const std::array, 2> textureCoordinates = {{{0.0f, 0.0f}, {10.0f, 10.0f}}}; options.size = {static_cast(image->size.width), static_cast(image->size.height)}; @@ -300,8 +299,9 @@ void ExampleCustomDrawableStyleLayerHost::createDrawables(Interface& interface) Interface::SymbolOptions options; options.texture = interface.context.createTexture2D(); options.texture->setImage(image); - options.texture->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + options.texture->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); options.size = {static_cast(image->size.width), static_cast(image->size.height)}; @@ -414,8 +414,9 @@ void ExampleCustomDrawableStyleLayerHost::generateGeometry(Interface& interface) options.texture = interface.context.createTexture2D(); options.texture->setImage(image); - options.texture->setSamplerConfiguration( - {mbgl::gfx::TextureFilterType::Linear, mbgl::gfx::TextureWrapType::Clamp, mbgl::gfx::TextureWrapType::Clamp}); + options.texture->setSamplerConfiguration({.filter = mbgl::gfx::TextureFilterType::Linear, + .wrapU = mbgl::gfx::TextureWrapType::Clamp, + .wrapV = mbgl::gfx::TextureWrapType::Clamp}); const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; @@ -426,7 +427,7 @@ void ExampleCustomDrawableStyleLayerHost::generateGeometry(Interface& interface) const unsigned long numVtxCircumference = 72; const float bearingStep = 360.0f / static_cast(numVtxCircumference - 1); - vertices.emplace_back(Interface::GeometryVertex{{0.0f, 0.0f, 0.0f}, {0.5f, 0.5f}}); + vertices.emplace_back(Interface::GeometryVertex{.position = {0.0f, 0.0f, 0.0f}, .texcoords = {0.5f, 0.5f}}); for (unsigned long i = 1; i <= numVtxCircumference; ++i) { const float rad = mbgl::util::deg2radf((i - 1) * bearingStep); @@ -596,11 +597,10 @@ mbgl::gfx::Texture2DPtr ExampleCustomDrawableStyleLayerHost::createCheckerboardT } auto texture = interface.context.createTexture2D(); - texture->setSamplerConfiguration( - {mbgl::gfx::TextureFilterType::Linear, mbgl::gfx::TextureWrapType::Clamp, mbgl::gfx::TextureWrapType::Clamp}); + texture->setSamplerConfiguration({.filter = mbgl::gfx::TextureFilterType::Linear, + .wrapU = mbgl::gfx::TextureWrapType::Clamp, + .wrapV = mbgl::gfx::TextureWrapType::Clamp}); texture->setImage(std::move(image)); return texture; } - -#endif diff --git a/platform/glfw/example_custom_drawable_style_layer.hpp b/platform/glfw/example_custom_drawable_style_layer.hpp index b511e13b27e0..9a1e130f26db 100644 --- a/platform/glfw/example_custom_drawable_style_layer.hpp +++ b/platform/glfw/example_custom_drawable_style_layer.hpp @@ -2,8 +2,6 @@ #include -#if MLN_DRAWABLE_RENDERER - class ExampleCustomDrawableStyleLayerHost : public mbgl::style::CustomDrawableLayerHost { public: using VertexVector = mbgl::gfx::VertexVector; @@ -39,5 +37,3 @@ class ExampleCustomDrawableStyleLayerHost : public mbgl::style::CustomDrawableLa protected: const std::string assetsPath; }; - -#endif diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 4c11ccf27348..200fade649f6 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -28,7 +28,7 @@ #include #include -#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) && MLN_DRAWABLE_RENDERER +#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) #include "example_custom_drawable_style_layer.hpp" #endif @@ -829,7 +829,7 @@ void GLFWView::popAnnotation() { } void GLFWView::toggleCustomDrawableStyle() { -#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) && MLN_DRAWABLE_RENDERER +#if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) auto &style = map->getStyle(); const std::string identifier = "ExampleCustomDrawableStyleLayer"; diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index 0adaddeb6c35..71c0004800c4 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -17,9 +17,7 @@ #import "CustomStyleLayerExample.h" -#if MLN_DRAWABLE_RENDERER #import "ExampleCustomDrawableStyleLayer.h" -#endif #import "MBXFrameTimeGraphView.h" #import "MLNMapView_Experimental.h" @@ -105,9 +103,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsRuntimeStylingRows) { MBXSettingsRuntimeStylingDDSPolygon, MBXSettingsRuntimeStylingCustomLatLonGrid, MBXSettingsRuntimeStylingLineGradient, -#if MLN_DRAWABLE_RENDERER MBXSettingsRuntimeStylingCustomDrawableLayer, -#endif MBXSettingsRuntimeStylingAddFoursquarePOIsPMTiles }; @@ -458,9 +454,7 @@ - (void)dismissSettings:(__unused id)sender @"Dynamically Style Polygon", @"Add Custom Lat/Lon Grid", @"Style Route line with gradient", -#if MLN_DRAWABLE_RENDERER @"Add Custom Drawable Layer", -#endif @"Add FourSquare POIs PMTiles Layer" ]]; break; @@ -684,11 +678,9 @@ - (void)performActionForSettingAtIndexPath:(NSIndexPath *)indexPath case MBXSettingsRuntimeStylingLineGradient: [self styleLineGradient]; break; -#if MLN_DRAWABLE_RENDERER case MBXSettingsRuntimeStylingCustomDrawableLayer: [self addCustomDrawableLayer]; break; -#endif case MBXSettingsRuntimeStylingAddFoursquarePOIsPMTiles: [self addFoursquarePOIsPMTilesLayer]; break; @@ -1678,7 +1670,6 @@ - (void)styleLineGradient [self.mapView.style addLayer:routeLayer]; } -#if MLN_DRAWABLE_RENDERER - (void)addCustomDrawableLayer { // Create a CustomLayer that uses the Drawable/Builder toolkit to generate and render geometry @@ -1688,7 +1679,6 @@ - (void)addCustomDrawableLayer [self.mapView.style addLayer:layer]; } } -#endif - (void)removeSource:(NSString*)ident { diff --git a/platform/ios/test/BUILD.bazel b/platform/ios/test/BUILD.bazel index c29e6622883d..d42d8d86eb41 100644 --- a/platform/ios/test/BUILD.bazel +++ b/platform/ios/test/BUILD.bazel @@ -1,4 +1,5 @@ load("@rules_apple//apple:ios.bzl", "ios_unit_test") +load("@rules_cc//cc:defs.bzl", "objc_library") load( "@rules_swift//swift:swift.bzl", "swift_library", diff --git a/platform/ios/test/common/BUILD.bazel b/platform/ios/test/common/BUILD.bazel index ce3d306129e7..1d796ee9f149 100644 --- a/platform/ios/test/common/BUILD.bazel +++ b/platform/ios/test/common/BUILD.bazel @@ -1,5 +1,6 @@ load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") load("@rules_apple//apple:ios.bzl", "ios_application") +load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library") cc_library( name = "ios_test_runner_lib", diff --git a/platform/ios/test/core/BUILD.bazel b/platform/ios/test/core/BUILD.bazel index dec6adacd344..874cb5c59eef 100644 --- a/platform/ios/test/core/BUILD.bazel +++ b/platform/ios/test/core/BUILD.bazel @@ -1,6 +1,7 @@ load("@darwin_config//:config.bzl", "BUNDLE_ID_PREFIX") load("@rules_apple//apple:ios.bzl", "ios_application", "ios_unit_test") load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") +load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/platform/ios/vendor/BUILD.bazel b/platform/ios/vendor/BUILD.bazel index 004cfccd1e14..9631016b645f 100644 --- a/platform/ios/vendor/BUILD.bazel +++ b/platform/ios/vendor/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "objc_library") load("//bazel:flags.bzl", "WARNING_FLAGS") # SMCalloutView diff --git a/platform/linux/BUILD.bazel b/platform/linux/BUILD.bazel index 40b1b8857831..d34b503cb55b 100644 --- a/platform/linux/BUILD.bazel +++ b/platform/linux/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") ICU_FLAGS = [ diff --git a/platform/linux/README.md b/platform/linux/README.md index 129f600a6964..a515d863d9c9 100644 --- a/platform/linux/README.md +++ b/platform/linux/README.md @@ -33,7 +33,7 @@ See instructions in [docker/README.md](../../docker/README.md) to build in a doc ```bash # Run from the root of the project to init the build -cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=OFF -DMLN_WITH_COVERAGE=OFF -DMLN_DRAWABLE_RENDERER=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON +cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=OFF -DMLN_WITH_COVERAGE=OFF -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON # Build mbgl-render using all available CPUs cmake --build build --target mbgl-render -j $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null) diff --git a/platform/macos/app/BUILD.bazel b/platform/macos/app/BUILD.bazel index e8b7216fbcf5..478d110296f1 100644 --- a/platform/macos/app/BUILD.bazel +++ b/platform/macos/app/BUILD.bazel @@ -1,4 +1,5 @@ load("@rules_apple//apple:macos.bzl", "macos_application") +load("@rules_cc//cc:defs.bzl", "objc_library") objc_library( name = "macos_app_lib", diff --git a/platform/node/DEVELOPING.md b/platform/node/DEVELOPING.md index 42d8cd56d579..39d73f26848e 100644 --- a/platform/node/DEVELOPING.md +++ b/platform/node/DEVELOPING.md @@ -51,7 +51,7 @@ To compile the Node.js bindings and install module dependencies, from the reposi #### MacOS ```bash -cmake . -B build -G Ninja -DMLN_WITH_NODE=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Release -DMLN_WITH_OPENGL=OFF -DMLN_WITH_METAL=ON -DMLN_LEGACY_RENDERER=OFF -DMLN_DRAWABLE_RENDERER=ON -DMLN_WITH_WERROR=OFF +cmake . -B build -G Ninja -DMLN_WITH_NODE=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Release -DMLN_WITH_OPENGL=OFF -DMLN_WITH_METAL=ON -DMLN_WITH_WERROR=OFF ``` #### Linux diff --git a/render-test/BUILD.bazel b/render-test/BUILD.bazel index efe77226b882..fbd3bf0213c1 100644 --- a/render-test/BUILD.bazel +++ b/render-test/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/render-test/android/app/build.gradle.kts b/render-test/android/app/build.gradle.kts index 564a28f67b59..b6a7a09c516c 100644 --- a/render-test/android/app/build.gradle.kts +++ b/render-test/android/app/build.gradle.kts @@ -35,7 +35,6 @@ android { externalNativeBuild { cmake { arguments("-DANDROID_STL=c++_static") - arguments("-DMLN_LEGACY_RENDERER=OFF", "-DMLN_DRAWABLE_RENDERER=ON") targets.add("mbgl-render-test-runner") } } diff --git a/render-test/ios/BUILD.bazel b/render-test/ios/BUILD.bazel index d538780bbe0b..d691a16d3acc 100644 --- a/render-test/ios/BUILD.bazel +++ b/render-test/ios/BUILD.bazel @@ -1,5 +1,6 @@ load("@rules_apple//apple:ios.bzl", "ios_unit_test") load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") +load("@rules_cc//cc:defs.bzl", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") apple_resource_bundle( diff --git a/render-test/metadata.hpp b/render-test/metadata.hpp index c444f7c0afd2..4eb48caf7d3b 100644 --- a/render-test/metadata.hpp +++ b/render-test/metadata.hpp @@ -152,11 +152,7 @@ struct TestMetadata { // error message: "Failed to find expectations for..., to prevent // unit test error by missing metric.json, can turn on 'ignoreProbing' // to prevent the unit test fail, and just verify the render result. -#if MLN_LEGACY_RENDERER - bool ignoreProbing = false; -#else bool ignoreProbing = true; -#endif mbgl::Size size{512u, 512u}; float pixelRatio = 1.0f; diff --git a/rustutils/BUILD.bazel b/rustutils/BUILD.bazel index 9c8480dcdd55..0bce0241fd03 100644 --- a/rustutils/BUILD.bazel +++ b/rustutils/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_static_library") genrule( diff --git a/src/mbgl/geometry/line_atlas.cpp b/src/mbgl/geometry/line_atlas.cpp index a953be8159d4..56956808aa86 100644 --- a/src/mbgl/geometry/line_atlas.cpp +++ b/src/mbgl/geometry/line_atlas.cpp @@ -207,7 +207,6 @@ DashPatternTexture::DashPatternTexture(const std::vector& from_, } void DashPatternTexture::upload(gfx::UploadPass& uploadPass) { -#if MLN_DRAWABLE_RENDERER if (std::holds_alternative(texture)) { auto tempTexture = uploadPass.getContext().createTexture2D(); tempTexture->upload(std::get(texture)); @@ -215,41 +214,18 @@ void DashPatternTexture::upload(gfx::UploadPass& uploadPass) { {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Repeat, gfx::TextureWrapType::Clamp}); texture = std::move(tempTexture); } -#else - if (texture.is()) { - texture = uploadPass.createTexture(texture.get()); - } -#endif -} - -#if MLN_LEGACY_RENDERER -gfx::TextureBinding DashPatternTexture::textureBinding() const { - // The texture needs to have been uploaded already. - assert(texture.is()); - return {texture.get().getResource(), - gfx::TextureFilterType::Linear, - gfx::TextureMipMapType::No, - gfx::TextureWrapType::Repeat, - gfx::TextureWrapType::Clamp}; } -#endif -#if MLN_DRAWABLE_RENDERER static const gfx::Texture2DPtr noTexture; const std::shared_ptr& DashPatternTexture::getTexture() const { return (std::holds_alternative(texture)) ? std::get(texture) : noTexture; } -#endif Size DashPatternTexture::getSize() const { -#if MLN_DRAWABLE_RENDERER if (std::holds_alternative(texture)) { return std::get(texture).size; } return std::get(texture)->getSize(); -#else - return texture.match([](const auto& obj) { return obj.size; }); -#endif } LineAtlas::LineAtlas() = default; diff --git a/src/mbgl/geometry/line_atlas.hpp b/src/mbgl/geometry/line_atlas.hpp index d39c802ec103..3ab22442d8ec 100644 --- a/src/mbgl/geometry/line_atlas.hpp +++ b/src/mbgl/geometry/line_atlas.hpp @@ -3,15 +3,9 @@ #include #include #include - -#if MLN_DRAWABLE_RENDERER #include -#include -#else -#include -#include -#endif +#include #include #include #include @@ -51,11 +45,7 @@ class DashPatternTexture { void upload(gfx::UploadPass&); // Binds the atlas texture to the GPU, and uploads data if it is out of date. -#if MLN_DRAWABLE_RENDERER const std::shared_ptr& getTexture() const; -#else - gfx::TextureBinding textureBinding() const; -#endif // Returns the size of the texture image. Size getSize() const; @@ -66,11 +56,7 @@ class DashPatternTexture { private: LinePatternPos from, to; -#if MLN_DRAWABLE_RENDERER std::variant texture; -#else - variant texture; -#endif }; class LineAtlas { diff --git a/src/mbgl/gfx/index_vector.hpp b/src/mbgl/gfx/index_vector.hpp index ed42dac7da0c..07d3c75e3dc8 100644 --- a/src/mbgl/gfx/index_vector.hpp +++ b/src/mbgl/gfx/index_vector.hpp @@ -27,18 +27,13 @@ class IndexVectorBase { : v(other.v) {} // buffer is not copied IndexVectorBase(IndexVectorBase&& other) : v(std::move(other.v)), -#if MLN_DRAWABLE_RENDERER buffer(std::move(other.buffer)), -#endif // MLN_DRAWABLE_RENDERER dirty(other.dirty), - released(other.released) { - } + released(other.released) {} virtual ~IndexVectorBase() = default; -#if MLN_DRAWABLE_RENDERER IndexBufferBase* getBuffer() const { return buffer.get(); } void setBuffer(std::unique_ptr&& value) { buffer = std::move(value); } -#endif // MLN_DRAWABLE_RENDERER bool getDirty() const { return dirty; } void setDirty(bool value = true) { dirty = value; } @@ -73,19 +68,15 @@ class IndexVectorBase { void clear() { dirty = true; v.clear(); -#if MLN_DRAWABLE_RENDERER buffer.reset(); -#endif // MLN_DRAWABLE_RENDERER } /// Indicate that this shared index vector will no longer be updated. void release() { -#if MLN_DRAWABLE_RENDERER // If we've already created a buffer, we don't need the raw data any more. if (buffer) { v.clear(); } -#endif // MLN_DRAWABLE_RENDERER released = true; } @@ -94,9 +85,7 @@ class IndexVectorBase { const std::vector& vector() const { return v; } protected: -#if MLN_DRAWABLE_RENDERER std::unique_ptr buffer; -#endif // MLN_DRAWABLE_RENDERER bool dirty = true; bool released = false; }; diff --git a/src/mbgl/gfx/offscreen_texture.hpp b/src/mbgl/gfx/offscreen_texture.hpp index cfe1bc6a7e87..7b4a10f339df 100644 --- a/src/mbgl/gfx/offscreen_texture.hpp +++ b/src/mbgl/gfx/offscreen_texture.hpp @@ -22,11 +22,7 @@ class OffscreenTexture : public gfx::Renderable { virtual PremultipliedImage readStillImage() = 0; -#if MLN_LEGACY_RENDERER - virtual gfx::Texture& getTexture() = 0; -#else virtual const gfx::Texture2DPtr& getTexture() = 0; -#endif }; } // namespace gfx diff --git a/src/mbgl/gfx/polyline_generator.cpp b/src/mbgl/gfx/polyline_generator.cpp index 78909890e9cc..fc4cb1ccdb22 100644 --- a/src/mbgl/gfx/polyline_generator.cpp +++ b/src/mbgl/gfx/polyline_generator.cpp @@ -3,12 +3,9 @@ #include #include #include - -#if MLN_DRAWABLE_RENDERER #include #include #include -#endif #include #include @@ -637,10 +634,8 @@ void PolylineGenerator::addPieSliceVertex(const GeometryCoordinate& cur } } -#if MLN_DRAWABLE_RENDERER template class PolylineGenerator>; -#endif template class PolylineGenerator>; diff --git a/src/mbgl/gfx/upload_pass.hpp b/src/mbgl/gfx/upload_pass.hpp index f59fbc956d57..71a76909dcca 100644 --- a/src/mbgl/gfx/upload_pass.hpp +++ b/src/mbgl/gfx/upload_pass.hpp @@ -10,9 +10,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif #include #include @@ -21,14 +19,12 @@ namespace mbgl { namespace gfx { -#if MLN_DRAWABLE_RENDERER class Conext; class Texture2D; class VertexAttributeArray; using AttributeBindingArray = std::vector>; using Texture2DPtr = std::shared_ptr; -#endif class UploadPass { protected: @@ -47,10 +43,8 @@ class UploadPass { // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) DebugGroup createDebugGroup(std::string_view name) { return createDebugGroup(name.data()); } -#if MLN_DRAWABLE_RENDERER virtual Context& getContext() = 0; virtual const Context& getContext() const = 0; -#endif public: template @@ -79,7 +73,6 @@ class UploadPass { updateIndexBufferResource(buffer.getResource(), v.data(), v.bytes()); } -#if MLN_DRAWABLE_RENDERER virtual gfx::AttributeBindingArray buildAttributeBindings( const std::size_t vertexCount, const gfx::AttributeDataType vertexType, @@ -90,7 +83,6 @@ class UploadPass { gfx::BufferUsageType, const std::optional> lastUpdate, /*out*/ std::vector>& outBuffers) = 0; -#endif protected: virtual std::unique_ptr createVertexBufferResource(const void* data, diff --git a/src/mbgl/gfx/vertex_vector.hpp b/src/mbgl/gfx/vertex_vector.hpp index abce21736d29..14e176c99af4 100644 --- a/src/mbgl/gfx/vertex_vector.hpp +++ b/src/mbgl/gfx/vertex_vector.hpp @@ -18,23 +18,17 @@ class VertexVectorBase { VertexVectorBase() = default; VertexVectorBase(const VertexVectorBase&) {} // buffer is not copied VertexVectorBase(VertexVectorBase&& other) - : -#if MLN_DRAWABLE_RENDERER - buffer(std::move(other.buffer)), -#endif // MLN_DRAWABLE_RENDERER + : buffer(std::move(other.buffer)), dirty(other.dirty), - released(other.released) { - } + released(other.released) {} virtual ~VertexVectorBase() = default; virtual const void* getRawData() const = 0; virtual std::size_t getRawSize() const = 0; virtual std::size_t getRawCount() const = 0; -#if MLN_DRAWABLE_RENDERER VertexBufferBase* getBuffer() const { return buffer.get(); } void setBuffer(std::unique_ptr&& value) { buffer = std::move(value); } -#endif // MLN_DRAWABLE_RENDERER std::chrono::duration getLastModified() const { return lastModified; } bool isModifiedAfter(std::chrono::duration t) const { return t < lastModified; } @@ -50,9 +44,7 @@ class VertexVectorBase { bool isReleased() const { return released; } protected: -#if MLN_DRAWABLE_RENDERER std::unique_ptr buffer; -#endif // MLN_DRAWABLE_RENDERER bool dirty = true; bool released = false; @@ -113,12 +105,10 @@ class VertexVector final : public VertexVectorBase { /// Indicate that this shared vertex vector instance will no longer be updated. void release() { -#if MLN_DRAWABLE_RENDERER // If we've already created a buffer, we don't need the raw data any more. if (buffer) { v.clear(); } -#endif // MLN_DRAWABLE_RENDERER released = true; } diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 5ad750c8a835..5d81f21ed885 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -19,7 +19,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -27,7 +26,6 @@ #include #include #include -#endif #include #include @@ -95,9 +93,7 @@ constexpr size_t renderBufferByteSize(const gfx::RenderbufferPixelType type, con Context::Context(RendererBackend& backend_) : gfx::Context(/*maximumVertexBindingCount=*/getMaxVertexAttribs()), backend(backend_) { -#if MLN_DRAWABLE_RENDERER uboAllocator = std::make_unique(); -#endif texturePool = std::make_unique(this); } @@ -123,7 +119,6 @@ void Context::beginFrame() { backend.getThreadPool().runRenderJobs(); -#if MLN_DRAWABLE_RENDERER frameInFlightFence = std::make_shared(); // Run allocator defragmentation on this frame interval. @@ -135,19 +130,16 @@ void Context::beginFrame() { } else { frameNum++; } -#endif } void Context::endFrame() { MLN_TRACE_FUNC(); -#if MLN_DRAWABLE_RENDERER if (!frameInFlightFence) { return; } frameInFlightFence->insert(); -#endif } void Context::initializeExtensions(const std::function& getProcAddress) { @@ -524,7 +516,6 @@ void Context::reset() { texturePool->shrink(); } -#if MLN_DRAWABLE_RENDERER void Context::resetState(gfx::DepthMode depthMode, gfx::ColorMode colorMode) { MLN_TRACE_FUNC(); MLN_TRACE_FUNC_GL(); @@ -563,7 +554,6 @@ void Context::unbindGlobalUniformBuffers(gfx::RenderPass&) const noexcept { globalUniformBuffers.unbind(); } -#endif void Context::setDirtyState() { MLN_TRACE_FUNC(); @@ -604,7 +594,6 @@ void Context::setDirtyState() { globalVertexArrayState.setDirty(); } -#if MLN_DRAWABLE_RENDERER gfx::UniqueDrawableBuilder Context::createDrawableBuilder(std::string name) { MLN_TRACE_FUNC(); @@ -676,8 +665,6 @@ gfx::VertexAttributeArrayPtr Context::createVertexAttributeArray() const { return std::make_shared(); } -#endif - void Context::clear(std::optional color, std::optional depth, std::optional stencil) { MLN_TRACE_FUNC(); MLN_TRACE_FUNC_GL(); @@ -785,11 +772,9 @@ void Context::finish() { MBGL_CHECK_ERROR(glFinish()); } -#if MLN_DRAWABLE_RENDERER std::shared_ptr Context::getCurrentFrameFence() const { return frameInFlightFence; } -#endif void Context::draw(const gfx::DrawMode& drawMode, std::size_t indexOffset, std::size_t indexLength) { MLN_TRACE_FUNC(); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 9f9eed740eaa..82ec8d3af2f2 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -16,12 +16,10 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include #include -#endif #include #include @@ -89,9 +87,7 @@ class Context final : public gfx::Context { void finish(); -#if MLN_DRAWABLE_RENDERER std::shared_ptr getCurrentFrameFence() const; -#endif // Actually remove the objects we marked as abandoned with the above methods. // Only call this while the OpenGL context is exclusive to this thread. @@ -118,7 +114,6 @@ class Context final : public gfx::Context { void setCleanupOnDestruction(bool cleanup) { cleanupOnDestruction = cleanup; } -#if MLN_DRAWABLE_RENDERER gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; gfx::UniformBufferPtr createUniformBuffer(const void* data, std::size_t size, @@ -159,7 +154,6 @@ class Context final : public gfx::Context { /// Unbind the global uniform buffers void unbindGlobalUniformBuffers(gfx::RenderPass&) const noexcept override; -#endif void setDirtyState() override; @@ -170,12 +164,10 @@ class Context final : public gfx::Context { bool cleanupOnDestruction = true; std::unique_ptr debugging; -#if MLN_DRAWABLE_RENDERER std::shared_ptr frameInFlightFence; std::unique_ptr uboAllocator; size_t frameNum = 0; UniformBufferArrayGL globalUniformBuffers; -#endif public: State activeTextureUnit; diff --git a/src/mbgl/gl/offscreen_texture.cpp b/src/mbgl/gl/offscreen_texture.cpp index 88f719ce49b0..e0da20dfce1b 100644 --- a/src/mbgl/gl/offscreen_texture.cpp +++ b/src/mbgl/gl/offscreen_texture.cpp @@ -13,35 +13,28 @@ class OffscreenTextureResource final : public gl::RenderableResource { size(size_), type(type_) { assert(!size.isEmpty()); -#if MLN_DRAWABLE_RENDERER texture = context.createTexture2D(); texture->setSize(size); texture->setFormat(gfx::TexturePixelType::RGBA, type); - texture->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); -#endif + texture->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); } ~OffscreenTextureResource() noexcept override = default; void bind() override { if (!framebuffer) { -#if MLN_LEGACY_RENDERER - assert(!texture); - texture = context.createTexture(size, gfx::TexturePixelType::RGBA, type); - framebuffer = context.createFramebuffer(*texture); -#else assert(texture); texture->create(); framebuffer = context.createFramebuffer(*texture); -#endif } else { context.bindFramebuffer = framebuffer->framebuffer; } context.activeTextureUnit = 0; context.scissorTest = false; - context.viewport = {0, 0, size}; + context.viewport = {.x = 0, .y = 0, .size = size}; } PremultipliedImage readStillImage() { @@ -50,26 +43,15 @@ class OffscreenTextureResource final : public gl::RenderableResource { return context.readFramebuffer(size); } -#if MLN_LEGACY_RENDERER - gfx::Texture& getTexture() { - assert(texture); - return *texture; - } -#else gfx::Texture2DPtr& getTexture() { assert(texture); return texture; } -#endif private: gl::Context& context; const Size size; -#if MLN_LEGACY_RENDERER - std::optional texture; -#else gfx::Texture2DPtr texture; -#endif const gfx::TextureChannelDataType type; std::optional framebuffer; }; @@ -90,15 +72,9 @@ PremultipliedImage OffscreenTexture::readStillImage() { return getResource().readStillImage(); } -#if MLN_LEGACY_RENDERER -gfx::Texture& OffscreenTexture::getTexture() { - return getResource().getTexture(); -} -#else const gfx::Texture2DPtr& OffscreenTexture::getTexture() { return getResource().getTexture(); } -#endif } // namespace gl } // namespace mbgl diff --git a/src/mbgl/gl/offscreen_texture.hpp b/src/mbgl/gl/offscreen_texture.hpp index da2f544fd293..13cec4c119e9 100644 --- a/src/mbgl/gl/offscreen_texture.hpp +++ b/src/mbgl/gl/offscreen_texture.hpp @@ -17,12 +17,7 @@ class OffscreenTexture final : public gfx::OffscreenTexture { bool isRenderable() override; PremultipliedImage readStillImage() override; - -#if MLN_LEGACY_RENDERER - gfx::Texture& getTexture() override; -#else const gfx::Texture2DPtr& getTexture() override; -#endif }; } // namespace gl diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp index f43f4ccb50d2..4f04687c6f6a 100644 --- a/src/mbgl/gl/renderer_backend.cpp +++ b/src/mbgl/gl/renderer_backend.cpp @@ -7,9 +7,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif #include @@ -92,7 +90,6 @@ void RendererBackend::setScissorTest(bool enabled) { RendererBackend::~RendererBackend() = default; -#if MLN_DRAWABLE_RENDERER /// @brief Register a list of types with a shader registry instance /// @tparam ...ShaderID Pack of BuiltIn:: shader IDs /// @param registry A shader registry instance @@ -150,7 +147,6 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::SymbolSDFIconShader, shaders::BuiltIn::SymbolTextAndIconShader>(shaders, programParameters); } -#endif } // namespace gl } // namespace mbgl diff --git a/src/mbgl/gl/upload_pass.cpp b/src/mbgl/gl/upload_pass.cpp index 324d196098e4..fae1b550cad4 100644 --- a/src/mbgl/gl/upload_pass.cpp +++ b/src/mbgl/gl/upload_pass.cpp @@ -12,10 +12,8 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include -#endif #include @@ -140,7 +138,6 @@ struct VertexBufferGL : public gfx::VertexBufferBase { std::unique_ptr resource; }; -#if MLN_DRAWABLE_RENDERER namespace { const std::unique_ptr noBuffer; } @@ -315,7 +312,6 @@ gfx::AttributeBindingArray UploadPass::buildAttributeBindings( return bindings; } -#endif void UploadPass::pushDebugGroup(const char* name) { commandEncoder.pushDebugGroup(name); @@ -325,7 +321,6 @@ void UploadPass::popDebugGroup() { commandEncoder.popDebugGroup(); } -#if MLN_DRAWABLE_RENDERER gfx::Context& UploadPass::getContext() { return commandEncoder.context; } @@ -333,7 +328,6 @@ gfx::Context& UploadPass::getContext() { const gfx::Context& UploadPass::getContext() const { return commandEncoder.context; } -#endif } // namespace gl } // namespace mbgl diff --git a/src/mbgl/gl/upload_pass.hpp b/src/mbgl/gl/upload_pass.hpp index 4c6a38c7d852..60d39f098e66 100644 --- a/src/mbgl/gl/upload_pass.hpp +++ b/src/mbgl/gl/upload_pass.hpp @@ -28,10 +28,8 @@ class UploadPass final : public gfx::UploadPass { void popDebugGroup() override; public: -#if MLN_DRAWABLE_RENDERER gfx::Context& getContext() override; const gfx::Context& getContext() const override; -#endif std::unique_ptr createVertexBufferResource(const void* data, std::size_t size, @@ -45,7 +43,6 @@ class UploadPass final : public gfx::UploadPass { bool persistent) override; void updateIndexBufferResource(gfx::IndexBufferResource&, const void* data, std::size_t size) override; -#if MLN_DRAWABLE_RENDERER const gfx::UniqueVertexBufferResource& getBuffer(const gfx::VertexVectorBasePtr&, gfx::BufferUsageType); gfx::AttributeBindingArray buildAttributeBindings( @@ -58,7 +55,6 @@ class UploadPass final : public gfx::UploadPass { gfx::BufferUsageType, const std::optional> lastUpdate, /*out*/ std::vector>& outBuffers) override; -#endif public: std::unique_ptr createTextureResource(Size, diff --git a/src/mbgl/programs/programs.cpp b/src/mbgl/programs/programs.cpp index 18f3dce5ce4a..6b35265df219 100644 --- a/src/mbgl/programs/programs.cpp +++ b/src/mbgl/programs/programs.cpp @@ -40,38 +40,8 @@ void registerTypes(gfx::ShaderRegistry& registry, const ProgramParameters& progr } void Programs::registerWith(gfx::ShaderRegistry& registry) { -#if MLN_LEGACY_RENDERER - /// The following types will be registered - registerTypes(registry, programParameters); -#else /// The following types will be registered registerTypes(registry, programParameters); -#endif } } // namespace mbgl diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index 15b7f3b5dec6..7826231bb056 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -6,9 +6,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif #include @@ -71,9 +69,7 @@ class Bucket { virtual void updateVertices( const Placement&, bool /*updateOpacities*/, const TransformState&, const RenderTile&, std::set&) {} -#if MLN_DRAWABLE_RENDERER const util::SimpleIdentity& getID() const { return bucketID; } -#endif #if MLN_SYMBOL_GUARDS virtual bool check(std::source_location) { return true; } @@ -88,9 +84,7 @@ class Bucket { Bucket() = default; std::atomic uploaded{false}; -#if MLN_DRAWABLE_RENDERER util::SimpleIdentity bucketID; -#endif std::optional renderThreadID; }; diff --git a/src/mbgl/renderer/buckets/circle_bucket.cpp b/src/mbgl/renderer/buckets/circle_bucket.cpp index c54cd5939209..fbcf430d74d6 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.cpp +++ b/src/mbgl/renderer/buckets/circle_bucket.cpp @@ -26,17 +26,6 @@ CircleBucket::~CircleBucket() { } void CircleBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (!uploaded) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - indexBuffer = uploadPass.createIndexBuffer(std::move(triangles)); - } - - for (auto& pair : paintPropertyBinders) { - pair.second.upload(uploadPass); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp index 72b05daa48dd..9fc5eb954639 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.hpp +++ b/src/mbgl/renderer/buckets/circle_bucket.hpp @@ -40,11 +40,6 @@ class CircleBucket final : public Bucket { SegmentVector segments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER - std::map paintPropertyBinders; const MapMode mode; diff --git a/src/mbgl/renderer/buckets/debug_bucket.cpp b/src/mbgl/renderer/buckets/debug_bucket.cpp index d35afa0ca75c..6d96abf58dcc 100644 --- a/src/mbgl/renderer/buckets/debug_bucket.cpp +++ b/src/mbgl/renderer/buckets/debug_bucket.cpp @@ -5,7 +5,6 @@ #include #include -#include namespace mbgl { @@ -70,18 +69,6 @@ DebugBucket::DebugBucket(const OverscaledTileID& id, segments.emplace_back(0, 0, vertices.elements(), indices.elements()); } -void DebugBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (!vertices.empty()) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - indexBuffer = uploadPass.createIndexBuffer(std::move(indices)); - } - if (!texture) { - std::array data{{0, 0, 0, 0}}; - static const PremultipliedImage emptyImage{Size(1, 1), data.data(), data.size()}; - texture = uploadPass.createTexture(emptyImage); - } -#endif // MLN_LEGACY_RENDERER -} +void DebugBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) {} } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/fill_bucket.cpp b/src/mbgl/renderer/buckets/fill_bucket.cpp index 5ba1da72f52a..a3352a9f7393 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.cpp +++ b/src/mbgl/renderer/buckets/fill_bucket.cpp @@ -76,19 +76,6 @@ void FillBucket::addFeature(const GeometryTileFeature& feature, #endif // MLN_TRIANGULATE_FILL_OUTLINES void FillBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (!uploaded) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - lineIndexBuffer = uploadPass.createIndexBuffer(std::move(basicLines)); - triangleIndexBuffer = triangles.empty() ? std::optional{} - : uploadPass.createIndexBuffer(std::move(triangles)); - } - - for (auto& pair : paintPropertyBinders) { - pair.second.upload(uploadPass); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp index 57b75f985eba..92d332ffb644 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_bucket.hpp @@ -8,7 +8,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER /** Control how the fill outlines are being generated: MLN_TRIANGULATE_FILL_OUTLINES = 0 : Simple line primitives will be generated. Draw using gfx::Lines @@ -16,17 +15,10 @@ */ #define MLN_TRIANGULATE_FILL_OUTLINES (MLN_RENDER_BACKEND_METAL) -#else // MLN_DRAWABLE_RENDERER -// Legacy Renderer is incompatible with triangulated lines -#define MLN_TRIANGULATE_FILL_OUTLINES 0 -#endif // MLN_DRAWABLE_RENDERER - #if MLN_TRIANGULATE_FILL_OUTLINES #include #endif -#include - namespace mbgl { class BucketParameters; @@ -85,12 +77,6 @@ class FillBucket final : public Bucket { SegmentVector triangleSegments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional lineIndexBuffer; - std::optional triangleIndexBuffer; -#endif // MLN_LEGACY_RENDERER - std::map paintPropertyBinders; }; diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp index ae2356a9f987..58587c8d6852 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp @@ -172,17 +172,6 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature, } void FillExtrusionBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (!uploaded) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - indexBuffer = uploadPass.createIndexBuffer(std::move(triangles)); - } - - for (auto& pair : paintPropertyBinders) { - pair.second.upload(uploadPass); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp index cb1328f15474..a430d1ff5969 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp @@ -49,11 +49,6 @@ class FillExtrusionBucket final : public Bucket { SegmentVector triangleSegments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER - std::unordered_map paintPropertyBinders; }; diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.cpp b/src/mbgl/renderer/buckets/heatmap_bucket.cpp index b13b8fb6e804..23b39b3022a0 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.cpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.cpp @@ -26,15 +26,6 @@ HeatmapBucket::~HeatmapBucket() { } void HeatmapBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - indexBuffer = uploadPass.createIndexBuffer(std::move(triangles)); - - for (auto& pair : paintPropertyBinders) { - pair.second.upload(uploadPass); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp index 86852ab13873..4f911a479413 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp @@ -40,11 +40,6 @@ class HeatmapBucket final : public Bucket { SegmentVector segments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER - std::map paintPropertyBinders; const MapMode mode; diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.cpp b/src/mbgl/renderer/buckets/hillshade_bucket.cpp index 991fe45a16b0..482d72264112 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.cpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.cpp @@ -31,27 +31,10 @@ void HillshadeBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { return; } -#if MLN_LEGACY_RENDERER - const PremultipliedImage* image = demdata.getImage(); - dem = uploadPass.createTexture(*image); - - if (!vertices.empty()) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - } - if (!indices.empty()) { - indexBuffer = uploadPass.createIndexBuffer(std::move(indices)); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } void HillshadeBucket::clear() { -#if MLN_LEGACY_RENDERER - vertexBuffer = {}; - indexBuffer = {}; -#endif // MLN_LEGACY_RENDERER - segments.clear(); vertices.clear(); indices.clear(); diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.hpp b/src/mbgl/renderer/buckets/hillshade_bucket.hpp index 4a9ae5dde142..1d46442c5cdd 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.hpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.hpp @@ -30,10 +30,8 @@ class HillshadeBucket final : public Bucket { std::optional dem; std::optional texture; -#if MLN_DRAWABLE_RENDERER RenderTargetPtr renderTarget; bool renderTargetPrepared = false; -#endif TileMask mask{{0, 0, 0}}; @@ -55,11 +53,6 @@ class HillshadeBucket final : public Bucket { SegmentVector segments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER - private: DEMData demdata; bool prepared = false; diff --git a/src/mbgl/renderer/buckets/line_bucket.cpp b/src/mbgl/renderer/buckets/line_bucket.cpp index ccfbdba82557..3adb72323961 100644 --- a/src/mbgl/renderer/buckets/line_bucket.cpp +++ b/src/mbgl/renderer/buckets/line_bucket.cpp @@ -127,17 +127,6 @@ void LineBucket::addGeometry(const GeometryCoordinates& coordinates, } void LineBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (!uploaded) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - indexBuffer = uploadPass.createIndexBuffer(std::move(triangles)); - } - - for (auto& pair : paintPropertyBinders) { - pair.second.upload(uploadPass); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; } diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp index 68757058ae57..c2630d0f1583 100644 --- a/src/mbgl/renderer/buckets/line_bucket.hpp +++ b/src/mbgl/renderer/buckets/line_bucket.hpp @@ -8,8 +8,6 @@ #include #include -#include - namespace mbgl { class BucketParameters; @@ -52,11 +50,6 @@ class LineBucket final : public Bucket { SegmentVector segments; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER - std::map paintPropertyBinders; private: diff --git a/src/mbgl/renderer/buckets/raster_bucket.cpp b/src/mbgl/renderer/buckets/raster_bucket.cpp index 3ec3371e3872..ba9bcad9b13d 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.cpp +++ b/src/mbgl/renderer/buckets/raster_bucket.cpp @@ -22,26 +22,10 @@ void RasterBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { if (!hasData()) { return; } -#if MLN_LEGACY_RENDERER - if (!texture) { - texture = uploadPass.createTexture(*image); - } - if (!vertices.empty()) { - vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices)); - } - if (!indices.empty()) { - indexBuffer = uploadPass.createIndexBuffer(std::move(indices)); - } -#endif // MLN_LEGACY_RENDERER uploaded = true; } void RasterBucket::clear() { -#if MLN_LEGACY_RENDERER - vertexBuffer = {}; - indexBuffer = {}; -#endif // MLN_LEGACY_RENDERER - segments.clear(); vertices.clear(); indices.clear(); diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index d9e21e75a884..e3e81f92aa54 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -48,11 +48,6 @@ class RasterBucket final : public Bucket { TriangleIndexVector& indices = *sharedTriangles; SegmentVector segments; - -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER }; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index cad152417937..c64c7aa6a8a4 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -52,132 +52,17 @@ SymbolBucket::SymbolBucket(Immutable(pair.second); - paintProperties.emplace( - std::piecewise_construct, - std::forward_as_tuple(pair.first), - std::forward_as_tuple(PaintProperties{{RenderSymbolLayer::iconPaintProperties(evaluated), zoom}, - {RenderSymbolLayer::textPaintProperties(evaluated), zoom}})); + paintProperties.emplace(std::piecewise_construct, + std::forward_as_tuple(pair.first), + std::forward_as_tuple(PaintProperties{ + .iconBinders = {RenderSymbolLayer::iconPaintProperties(evaluated), zoom}, + .textBinders = {RenderSymbolLayer::textPaintProperties(evaluated), zoom}})); } } SymbolBucket::~SymbolBucket() = default; void SymbolBucket::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_LEGACY_RENDERER - if (hasTextData()) { - if (!staticUploaded) { - text.indexBuffer = uploadPass.createIndexBuffer( - std::move(text.triangles), - sortFeaturesByY ? gfx::BufferUsageType::StreamDraw : gfx::BufferUsageType::StaticDraw); - text.vertexBuffer = uploadPass.createVertexBuffer(text.vertices()); - for (auto& pair : paintProperties) { - pair.second.textBinders.upload(uploadPass); - } - } else if (!sortUploaded) { - uploadPass.updateIndexBuffer(*text.indexBuffer, std::move(text.triangles)); - } - - if (!dynamicUploaded) { - if (!text.dynamicVertexBuffer) { - text.dynamicVertexBuffer = uploadPass.createVertexBuffer(text.dynamicVertices(), - gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*text.dynamicVertexBuffer, text.dynamicVertices()); - } - } - if (!placementChangesUploaded) { - if (!text.opacityVertexBuffer) { - text.opacityVertexBuffer = uploadPass.createVertexBuffer(text.opacityVertices(), - gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*text.opacityVertexBuffer, text.opacityVertices()); - } - } - } - - auto updateIconBuffer = [&](Buffer& iconBuffer) { - if (!staticUploaded) { - iconBuffer.indexBuffer = uploadPass.createIndexBuffer( - std::move(iconBuffer.triangles), - sortFeaturesByY ? gfx::BufferUsageType::StreamDraw : gfx::BufferUsageType::StaticDraw); - iconBuffer.vertexBuffer = uploadPass.createVertexBuffer(iconBuffer.vertices()); - for (auto& pair : paintProperties) { - pair.second.iconBinders.upload(uploadPass); - } - } else if (!sortUploaded) { - uploadPass.updateIndexBuffer(*iconBuffer.indexBuffer, std::move(iconBuffer.triangles)); - } - if (!dynamicUploaded) { - if (!iconBuffer.dynamicVertexBuffer) { - iconBuffer.dynamicVertexBuffer = uploadPass.createVertexBuffer(iconBuffer.dynamicVertices(), - gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*iconBuffer.dynamicVertexBuffer, iconBuffer.dynamicVertices()); - } - } - if (!placementChangesUploaded) { - if (!iconBuffer.opacityVertexBuffer) { - iconBuffer.opacityVertexBuffer = uploadPass.createVertexBuffer(iconBuffer.opacityVertices(), - gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*iconBuffer.opacityVertexBuffer, iconBuffer.opacityVertices()); - } - } - }; - if (hasIconData()) { - updateIconBuffer(icon); - } - if (hasSdfIconData()) { - updateIconBuffer(sdfIcon); - } - - const auto updateCollisionBox = [&](CollisionBoxBuffer& collisionBox) { - if (!staticUploaded) { - collisionBox.indexBuffer = uploadPass.createIndexBuffer(std::move(collisionBox.lines)); - collisionBox.vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionBox.vertices())); - } - if (!placementChangesUploaded) { - if (!collisionBox.dynamicVertexBuffer) { - collisionBox.dynamicVertexBuffer = uploadPass.createVertexBuffer( - std::move(collisionBox.dynamicVertices()), gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*collisionBox.dynamicVertexBuffer, - std::move(collisionBox.dynamicVertices())); - } - } - }; - if (hasIconCollisionBoxData()) { - updateCollisionBox(*iconCollisionBox); - } - - if (hasTextCollisionBoxData()) { - updateCollisionBox(*textCollisionBox); - } - - const auto updateCollisionCircle = [&](CollisionCircleBuffer& collisionCircle) { - if (!staticUploaded) { - collisionCircle.indexBuffer = uploadPass.createIndexBuffer(std::move(collisionCircle.triangles)); - collisionCircle.vertexBuffer = uploadPass.createVertexBuffer(std::move(collisionCircle.vertices())); - } - if (!placementChangesUploaded) { - if (!collisionCircle.dynamicVertexBuffer) { - collisionCircle.dynamicVertexBuffer = uploadPass.createVertexBuffer( - std::move(collisionCircle.dynamicVertices()), gfx::BufferUsageType::StreamDraw); - } else { - uploadPass.updateVertexBuffer(*collisionCircle.dynamicVertexBuffer, - std::move(collisionCircle.dynamicVertices())); - } - } - }; - if (hasIconCollisionCircleData()) { - updateCollisionCircle(*iconCollisionCircle); - } - - if (hasTextCollisionCircleData()) { - updateCollisionCircle(*textCollisionCircle); - } -#endif // MLN_LEGACY_RENDERER - uploaded = true; staticUploaded = true; placementChangesUploaded = true; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 760dee6a130f..eff8c3108856 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -182,13 +182,6 @@ class SymbolBucket final : public Bucket { SegmentVector segments; std::vector placedSymbols; - -#if MLN_LEGACY_RENDERER - std::optional vertexBuffer; - std::optional dynamicVertexBuffer; - std::optional opacityVertexBuffer; - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER } text; std::unique_ptr iconSizeBinder; @@ -210,20 +203,12 @@ class SymbolBucket final : public Bucket { const CollisionDynamicVertexVector& dynamicVertices() const { return *sharedDynamicVertices; } SegmentVector segments; - -#if MLN_LEGACY_RENDERER - std::optional>> vertexBuffer; - std::optional>> dynamicVertexBuffer; -#endif // MLN_LEGACY_RENDERER }; struct CollisionBoxBuffer : public CollisionBuffer { using LineIndexVector = gfx::IndexVector; const std::shared_ptr sharedLines = std::make_shared(); LineIndexVector& lines = *sharedLines; -#if MLN_LEGACY_RENDERER - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER }; std::unique_ptr iconCollisionBox; std::unique_ptr textCollisionBox; @@ -242,9 +227,6 @@ class SymbolBucket final : public Bucket { using TriangleIndexVector = gfx::IndexVector; const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; -#if MLN_LEGACY_RENDERER - std::optional indexBuffer; -#endif // MLN_LEGACY_RENDERER }; std::unique_ptr iconCollisionCircle; std::unique_ptr textCollisionCircle; diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index b32271a23bc7..3a0b6400043c 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -15,16 +15,12 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include #include #include #include -#endif - -#include namespace mbgl { @@ -70,11 +66,9 @@ void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters& paramet evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif } bool RenderBackgroundLayer::hasTransition() const { @@ -85,102 +79,6 @@ bool RenderBackgroundLayer::hasCrossfade() const { return getCrossfade(evaluatedProperties).t != 1; } -#if MLN_LEGACY_RENDERER -void RenderBackgroundLayer::render(PaintParameters& parameters) { - // Note that for bottommost layers without a pattern, the background color - // is drawn with glClear rather than this method. - - // Ensure programs are available - if (!parameters.shaders.getLegacyGroup().populate(backgroundProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(backgroundPatternProgram)) return; - - const Properties<>::PossiblyEvaluated properties; - const BackgroundProgram::Binders paintAttributeData(properties, 0); - - auto draw = [&](auto& program, auto&& uniformValues, const auto& textureBindings, const uint32_t id) { - const auto allUniformValues = program.computeAllUniformValues( - std::forward(uniformValues), - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = program.computeAllAttributeBindings( - *parameters.staticData.tileVertexBuffer, paintAttributeData, properties); - - checkRenderability(parameters, program.activeBindingCount(allAttributeBindings)); - - program.draw( - parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer( - 0, - parameters.pass == RenderPass::Opaque ? gfx::DepthMaskType::ReadWrite : gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *parameters.staticData.quadTriangleIndexBuffer, - segments, - allUniformValues, - allAttributeBindings, - textureBindings, - util::toString(id)); - }; - - if (segments.empty()) { - segments = RenderStaticData::tileTriangleSegments(); - } - - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const auto& crossfade = static_cast(*evaluatedProperties).crossfade; - if (!evaluated.get().to.empty()) { - std::optional imagePosA = parameters.patternAtlas.getPattern( - evaluated.get().from.id()); - std::optional imagePosB = parameters.patternAtlas.getPattern( - evaluated.get().to.id()); - - if (!imagePosA || !imagePosB) return; - - uint32_t i = 0; - for (const auto& tileID : util::tileCover(parameters.state, parameters.state.getIntegerZoom())) { - const UnwrappedTileID unwrappedTileID = tileID.toUnwrapped(); - draw(*backgroundPatternProgram, - BackgroundPatternProgram::layoutUniformValues(parameters.matrixForTile(unwrappedTileID), - evaluated.get(), - parameters.patternAtlas.getPixelSize(), - *imagePosA, - *imagePosB, - crossfade, - unwrappedTileID, - parameters.state), - BackgroundPatternProgram::TextureBindings{ - textures::image::Value{parameters.patternAtlas.textureBinding()}, - }, - i++); - } - } else { - auto backgroundRenderPass = (evaluated.get().a >= 1.0f && - evaluated.get() >= 1.0f && - parameters.currentLayer >= parameters.opaquePassCutoff) - ? RenderPass::Opaque - : RenderPass::Translucent; - if (parameters.pass != backgroundRenderPass) { - return; - } - uint32_t i = 0; - for (const auto& tileID : util::tileCover(parameters.state, parameters.state.getIntegerZoom())) { - draw(*backgroundProgram, - BackgroundProgram::LayoutUniformValues{ - uniforms::matrix::Value(parameters.matrixForTile(tileID.toUnwrapped())), - uniforms::color::Value(evaluated.get()), - uniforms::opacity::Value(evaluated.get()), - }, - BackgroundProgram::TextureBindings{}, - i++); - } - } -} -#endif // MLN_LEGACY_RENDERER - std::optional RenderBackgroundLayer::getSolidBackground() const { const auto& evaluated = getEvaluated(evaluatedProperties); if (!evaluated.get().from.empty() || evaluated.get() <= 0.0f) { @@ -210,7 +108,6 @@ void RenderBackgroundLayer::prepare(const LayerPrepareParameters& params) { } } -#if MLN_DRAWABLE_RENDERER static constexpr std::string_view BackgroundPlainShaderName = "BackgroundShader"; static constexpr std::string_view BackgroundPatternShaderName = "BackgroundPatternShader"; @@ -326,6 +223,5 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_background_layer.hpp b/src/mbgl/renderer/layers/render_background_layer.hpp index df302594190d..faadd7a39161 100644 --- a/src/mbgl/renderer/layers/render_background_layer.hpp +++ b/src/mbgl/renderer/layers/render_background_layer.hpp @@ -23,7 +23,6 @@ class RenderBackgroundLayer final : public RenderLayer { explicit RenderBackgroundLayer(Immutable); ~RenderBackgroundLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -31,7 +30,6 @@ class RenderBackgroundLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; @@ -40,26 +38,15 @@ class RenderBackgroundLayer final : public RenderLayer { bool hasCrossfade() const override; std::optional getSolidBackground() const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - void prepare(const LayerPrepareParameters&) override; // Paint properties style::BackgroundPaintProperties::Unevaluated unevaluated; SegmentVector segments; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr backgroundProgram; - std::shared_ptr backgroundPatternProgram; -#endif -#if MLN_DRAWABLE_RENDERER // Drawable shaders gfx::ShaderProgramBasePtr plainShader; gfx::ShaderProgramBasePtr patternShader; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 94ecb20ede2e..7ec29289e3c7 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -15,14 +15,12 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include #include #include #include -#endif namespace mbgl { @@ -30,29 +28,6 @@ using namespace style; namespace { -#if MLN_LEGACY_RENDERER -struct RenderableSegment { - RenderableSegment(const Segment& segment_, - const RenderTile& tile_, - const LayerRenderData* renderData_, - float sortKey_) - : segment(segment_), - tile(tile_), - renderData(renderData_), - sortKey(sortKey_) {} - - const Segment& segment; - const RenderTile& tile; - const LayerRenderData* renderData; - const float sortKey; - - friend bool operator<(const RenderableSegment& lhs, const RenderableSegment& rhs) { - if (lhs.sortKey == rhs.sortKey) return lhs.tile.id < rhs.tile.id; - return lhs.sortKey < rhs.sortKey; - } -}; -#endif - inline const style::CircleLayer::Impl& impl_cast(const Immutable& impl) { assert(impl->getTypeInfo() == CircleLayer::Impl::staticTypeInfo()); return static_cast(*impl); @@ -89,11 +64,9 @@ void RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif // MLN_DRAWABLE_RENDERER } bool RenderCircleLayer::hasTransition() const { @@ -104,88 +77,6 @@ bool RenderCircleLayer::hasCrossfade() const { return false; } -#if MLN_LEGACY_RENDERER -void RenderCircleLayer::render(PaintParameters& parameters) { - assert(renderTiles); - - if (parameters.pass == RenderPass::Opaque) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(circleProgram)) return; - - const auto drawTile = [&](const RenderTile& tile, const LayerRenderData* data, const auto& segments) { - auto& circleBucket = static_cast(*data->bucket); - const auto& evaluated = getEvaluated(data->layerProperties); - const bool scaleWithMap = evaluated.template get() == CirclePitchScaleType::Map; - const bool pitchWithMap = evaluated.template get() == AlignmentType::Map; - auto& paintPropertyBinders = circleBucket.paintPropertyBinders.at(getID()); - - using LayoutUniformValues = CircleProgram::LayoutUniformValues; - const auto& allUniformValues = CircleProgram::computeAllUniformValues( - LayoutUniformValues( - uniforms::matrix::Value(tile.translatedMatrix(evaluated.template get(), - evaluated.template get(), - parameters.state)), - uniforms::scale_with_map::Value(scaleWithMap), - uniforms::extrude_scale::Value( - pitchWithMap ? std::array{{tile.id.pixelsToTileUnits( - 1.0f, static_cast(parameters.state.getZoom())), - tile.id.pixelsToTileUnits( - 1.0f, static_cast(parameters.state.getZoom()))}} - : parameters.pixelsToGLUnits), - uniforms::device_pixel_ratio::Value(parameters.pixelRatio), - uniforms::camera_to_center_distance::Value(parameters.state.getCameraToCenterDistance()), - uniforms::pitch_with_map::Value(pitchWithMap)), - paintPropertyBinders, - evaluated, - static_cast(parameters.state.getZoom())); - const auto& allAttributeBindings = CircleProgram::computeAllAttributeBindings( - *circleBucket.vertexBuffer, paintPropertyBinders, evaluated); - - checkRenderability(parameters, CircleProgram::activeBindingCount(allAttributeBindings)); - - circleProgram->draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *circleBucket.indexBuffer, - segments, - allUniformValues, - allAttributeBindings, - CircleProgram::TextureBindings{}, - getID()); - }; - - const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get().isUndefined(); - std::multiset renderableSegments; - - for (const RenderTile& renderTile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(renderTile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - if (!sortFeaturesByKey) { - drawTile(renderTile, renderData, bucket.segments); - continue; - } - for (auto& segment : bucket.segments) { - renderableSegments.emplace(segment, renderTile, renderData, segment.sortKey); - } - } - - if (sortFeaturesByKey) { - for (const auto& renderable : renderableSegments) { - drawTile(renderable.tile, renderable.renderData, renderable.segment); - } - } -} -#endif // MLN_LEGACY_RENDERER - GeometryCoordinate projectPoint(const GeometryCoordinate& p, const mat4& posMatrix, const Size& size) { vec4 pos = {{static_cast(p.x), static_cast(p.y), 0, 1}}; matrix::transformMat4(pos, pos, posMatrix); @@ -264,7 +155,6 @@ bool RenderCircleLayer::queryIntersectsFeature(const GeometryCoordinates& queryG return false; } -#if MLN_DRAWABLE_RENDERER namespace { constexpr auto CircleShaderGroupName = "CircleShader"; @@ -403,6 +293,5 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_circle_layer.hpp b/src/mbgl/renderer/layers/render_circle_layer.hpp index ec2db3fac691..ecf2a42f7291 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.hpp +++ b/src/mbgl/renderer/layers/render_circle_layer.hpp @@ -6,21 +6,14 @@ namespace mbgl { -#if MLN_LEGACY_RENDERER -class CircleProgram; -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER class CircleLayerTweaker; using CircleLayerTweakerPtr = std::shared_ptr; -#endif // MLN_DRAWABLE_RENDERER class RenderCircleLayer final : public RenderLayer { public: explicit RenderCircleLayer(Immutable); ~RenderCircleLayer() final = default; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -28,7 +21,6 @@ class RenderCircleLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; @@ -44,22 +36,11 @@ class RenderCircleLayer final : public RenderLayer { const mat4&, const FeatureState&) const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif // MLN_LEGACY_RENDERER - private: // Paint properties style::CirclePaintProperties::Unevaluated unevaluated; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr circleProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr circleShaderGroup; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp b/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp index 4b111e90308c..a01870f29b8a 100644 --- a/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp @@ -9,11 +9,9 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include -#endif namespace mbgl { @@ -54,11 +52,6 @@ bool RenderCustomDrawableLayer::hasCrossfade() const { void RenderCustomDrawableLayer::prepare(const LayerPrepareParameters&) {} -#if MLN_LEGACY_RENDERER -void RenderCustomDrawableLayer::render(PaintParameters&) {} -#endif - -#if MLN_DRAWABLE_RENDERER void RenderCustomDrawableLayer::update(gfx::ShaderRegistry& shaders, gfx::Context& context, const TransformState& state, @@ -84,6 +77,4 @@ void RenderCustomDrawableLayer::update(gfx::ShaderRegistry& shaders, } } -#endif - } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp b/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp index 9a4591a06162..2b5a611fcc70 100644 --- a/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp @@ -10,7 +10,6 @@ class RenderCustomDrawableLayer final : public RenderLayer { explicit RenderCustomDrawableLayer(Immutable); ~RenderCustomDrawableLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -18,7 +17,6 @@ class RenderCustomDrawableLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override {} @@ -27,10 +25,6 @@ class RenderCustomDrawableLayer final : public RenderLayer { bool hasCrossfade() const override; void prepare(const LayerPrepareParameters&) override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - std::shared_ptr host; }; diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index 86168a1c562b..a01b7566e918 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -8,24 +8,13 @@ #include #include -#if MLN_LEGACY_RENDERER -#include -#include -#include -#include -#endif - -#if MLN_DRAWABLE_RENDERER #include #include #include #include -#if !MLN_LEGACY_RENDERER // TODO: platform agnostic error checks #define MBGL_CHECK_ERROR(cmd) (cmd) -#endif -#endif namespace mbgl { @@ -74,37 +63,6 @@ void RenderCustomLayer::markContextDestroyed() { void RenderCustomLayer::prepare(const LayerPrepareParameters&) {} -#if MLN_LEGACY_RENDERER -void RenderCustomLayer::render(PaintParameters& paintParameters) { - if (host != impl(baseImpl).host) { - // If the context changed, deinitialize the previous one before initializing the new one. - if (host && !contextDestroyed) { - MBGL_CHECK_ERROR(host->deinitialize()); - } - host = impl(baseImpl).host; - MBGL_CHECK_ERROR(host->initialize()); - } - - // TODO: remove cast - auto& glContext = static_cast(paintParameters.context); - - // Reset GL state to a known state so the CustomLayer always has a clean slate. - glContext.bindVertexArray = 0; - glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly)); - glContext.setStencilMode(gfx::StencilMode::disabled()); - glContext.setColorMode(paintParameters.colorModeForRenderPass()); - glContext.setCullFaceMode(gfx::CullFaceMode::disabled()); - - MBGL_CHECK_ERROR(host->render(CustomLayerRenderParameters(paintParameters))); - - // Reset the view back to our original one, just in case the CustomLayer - // changed the viewport or Framebuffer. - paintParameters.backend.getDefaultRenderable().getResource().bind(); - glContext.setDirtyState(); -} -#endif - -#if MLN_DRAWABLE_RENDERER void RenderCustomLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaders, gfx::Context& context, [[maybe_unused]] const TransformState& state, @@ -152,6 +110,5 @@ void RenderCustomLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaders, ++stats.drawablesAdded; } } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp index 876516c13ea1..1fb02133eaf4 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -10,7 +10,6 @@ class RenderCustomLayer final : public RenderLayer { explicit RenderCustomLayer(Immutable); ~RenderCustomLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -18,7 +17,6 @@ class RenderCustomLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override {} @@ -28,10 +26,6 @@ class RenderCustomLayer final : public RenderLayer { void markContextDestroyed() override; void prepare(const LayerPrepareParameters&) override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - bool contextDestroyed = false; std::shared_ptr host; }; diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index c70086ca1e05..eef29e9266f0 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -20,7 +20,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -28,7 +27,6 @@ #include #include #include -#endif // MLN_DRAWABLE_RENDERER namespace mbgl { @@ -69,11 +67,9 @@ void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& para properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif // MLN_DRAWABLE_RENDERER } bool RenderFillExtrusionLayer::hasTransition() const { @@ -88,165 +84,6 @@ bool RenderFillExtrusionLayer::is3D() const { return true; } -#if MLN_LEGACY_RENDERER -void RenderFillExtrusionLayer::render(PaintParameters& parameters) { - assert(renderTiles); - if (parameters.pass != RenderPass::Translucent) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(fillExtrusionProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(fillExtrusionPatternProgram)) return; - - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const auto& crossfade = static_cast(*evaluatedProperties).crossfade; - if (evaluatedProperties->renderPasses == mbgl::underlying_type(RenderPass::None)) { - return; - } - - const auto depthMode = parameters.depthModeFor3D(); - - auto draw = [&](auto& programInstance, - const auto& evaluated_, - const auto& crossfade_, - const gfx::StencilMode& stencilMode, - const gfx::ColorMode& colorMode, - auto& tileBucket, - const auto& uniformValues, - const std::optional& patternPositionA, - const std::optional& patternPositionB, - const auto& textureBindings, - const std::string& uniqueName) { - auto& paintPropertyBinders = tileBucket.paintPropertyBinders.at(getID()); - paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade_); - - const auto allUniformValues = programInstance.computeAllUniformValues( - uniformValues, paintPropertyBinders, evaluated_, static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = programInstance.computeAllAttributeBindings( - *tileBucket.vertexBuffer, paintPropertyBinders, evaluated_); - - checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - programInstance.draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - depthMode, - stencilMode, - colorMode, - gfx::CullFaceMode::backCCW(), - *tileBucket.indexBuffer, - tileBucket.triangleSegments, - allUniformValues, - allAttributeBindings, - textureBindings, - getID() + "/" + uniqueName); - }; - - if (unevaluated.get().isUndefined()) { - // Draw solid color extrusions - auto drawTiles = - [&](const gfx::StencilMode& stencilMode_, const gfx::ColorMode& colorMode_, const std::string& name) { - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - draw(*fillExtrusionProgram, - evaluated, - crossfade, - stencilMode_, - colorMode_, - bucket, - FillExtrusionProgram::layoutUniformValues( - tile.translatedClipMatrix(evaluated.get(), - evaluated.get(), - parameters.state), - parameters.state, - evaluated.get(), - parameters.evaluatedLight, - evaluated.get()), - {}, - {}, - FillExtrusionProgram::TextureBindings{}, - name); - } - }; - - if (evaluated.get() == 1) { - // Draw opaque extrusions - drawTiles(gfx::StencilMode::disabled(), parameters.colorModeForRenderPass(), "color"); - } else { - // Draw transparent buildings in two passes so that only the closest - // surface is drawn. First draw all the extrusions into only the - // depth buffer. No colors are drawn. - drawTiles(gfx::StencilMode::disabled(), gfx::ColorMode::disabled(), "depth"); - - // Then draw all the extrusions a second time, only coloring - // fragments if they have the same depth value as the closest - // fragment in the previous pass. Use the stencil buffer to prevent - // the second draw in cases where we have coincident polygons. - drawTiles(parameters.stencilModeFor3D(), parameters.colorModeForRenderPass(), "color"); - } - } else { - // Draw textured extrusions - const auto fillPatternValue = evaluated.get().constantOr( - mbgl::Faded{"", ""}); - auto drawTiles = - [&](const gfx::StencilMode& stencilMode_, const gfx::ColorMode& colorMode_, const std::string& name) { - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - const std::optional patternPosA = tile.getPattern(fillPatternValue.from.id()); - const std::optional patternPosB = tile.getPattern(fillPatternValue.to.id()); - const auto numTiles = std::pow(2, tile.id.canonical.z); - const auto heightFactor = static_cast(-numTiles / util::tileSize_D / 8.0); - - draw(*fillExtrusionPatternProgram, - evaluated, - crossfade, - stencilMode_, - colorMode_, - bucket, - FillExtrusionPatternProgram::layoutUniformValues( - tile.translatedClipMatrix(evaluated.get(), - evaluated.get(), - parameters.state), - tile.getIconAtlasTexture()->getSize(), - crossfade, - tile.id, - parameters.state, - evaluated.get(), - heightFactor, - parameters.pixelRatio, - parameters.evaluatedLight, - evaluated.get()), - patternPosA, - patternPosB, - FillExtrusionPatternProgram::TextureBindings{ - textures::image::Value{tile.getIconAtlasTextureBinding(gfx::TextureFilterType::Linear)}, - }, - name); - } - }; - - // Draw transparent buildings in two passes so that only the closest - // surface is drawn. First draw all the extrusions into only the depth - // buffer. No colors are drawn. - drawTiles(gfx::StencilMode::disabled(), gfx::ColorMode::disabled(), "depth"); - - // Then draw all the extrusions a second time, only coloring fragments - // if they have the same depth value as the closest fragment in the - // previous pass. Use the stencil buffer to prevent the second draw in - // cases where we have coincident polygons. - drawTiles(parameters.stencilModeFor3D(), parameters.colorModeForRenderPass(), "color"); - } -} -#endif // MLN_LEGACY_RENDERER - bool RenderFillExtrusionLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, const float, @@ -266,8 +103,6 @@ bool RenderFillExtrusionLayer::queryIntersectsFeature(const GeometryCoordinates& feature.getGeometries()); } -#if MLN_DRAWABLE_RENDERER - void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, gfx::Context& context, const TransformState&, @@ -496,6 +331,4 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders, } } -#endif // MLN_DRAWABLE_RENDERER - } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp index 4a9af08b1c79..f39bcc3fe764 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp @@ -7,11 +7,6 @@ namespace mbgl { -#if MLN_LEGACY_RENDERER -class FillExtrusionProgram; -class FillExtrusionPatternProgram; -#endif // MLN_LEGACY_RENDERER - class RenderFillExtrusionLayer final : public RenderLayer { public: explicit RenderFillExtrusionLayer(Immutable); @@ -24,11 +19,6 @@ class RenderFillExtrusionLayer final : public RenderLayer { bool hasCrossfade() const override; bool is3D() const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -36,7 +26,6 @@ class RenderFillExtrusionLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif // MLN_DRAWABLE_RENDERER bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, @@ -49,17 +38,8 @@ class RenderFillExtrusionLayer final : public RenderLayer { // Paint properties style::FillExtrusionPaintProperties::Unevaluated unevaluated; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr fillExtrusionProgram; - std::shared_ptr fillExtrusionPatternProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr fillExtrusionGroup; gfx::ShaderGroupPtr fillExtrusionPatternGroup; -#endif // MLN_DRAWABLE_RENDERER - std::unique_ptr renderTexture; }; diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 213d2aa530c9..740961fd535f 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -22,7 +22,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -30,7 +29,6 @@ #include #include #include -#endif namespace mbgl { @@ -39,7 +37,6 @@ using namespace shaders; namespace { -#if MLN_DRAWABLE_RENDERER constexpr auto FillShaderName = "FillShader"; constexpr auto FillOutlineShaderName = "FillOutlineShader"; constexpr auto FillPatternShaderName = "FillPatternShader"; @@ -47,7 +44,6 @@ constexpr auto FillOutlinePatternShaderName = "FillOutlinePatternShader"; #if MLN_TRIANGULATE_FILL_OUTLINES constexpr auto FillOutlineTriangulatedShaderName = "FillOutlineTriangulatedShader"; #endif -#endif // MLN_DRAWABLE_RENDERER inline const FillLayer::Impl& impl_cast(const Immutable& impl) { assert(impl->getTypeInfo() == FillLayer::Impl::staticTypeInfo()); @@ -91,11 +87,9 @@ void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif } bool RenderFillLayer::hasTransition() const { @@ -106,176 +100,6 @@ bool RenderFillLayer::hasCrossfade() const { return getCrossfade(evaluatedProperties).t != 1; } -#if MLN_LEGACY_RENDERER -void RenderFillLayer::render(PaintParameters& parameters) { - assert(renderTiles); - - if (!parameters.shaders.getLegacyGroup().populate(fillProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(fillPatternProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(fillOutlineProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(fillOutlinePatternProgram)) return; - - if (unevaluated.get().isUndefined()) { - parameters.renderTileClippingMasks(renderTiles); - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - const auto& evaluated = getEvaluated(renderData->layerProperties); - - auto draw = [&](auto& programInstance, - const auto& drawMode, - const auto& depthMode, - const auto& indexBuffer, - const auto& segments, - auto&& textureBindings) { - auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - - const auto allUniformValues = programInstance.computeAllUniformValues( - FillProgram::LayoutUniformValues{ - uniforms::matrix::Value(tile.translatedMatrix( - evaluated.get(), evaluated.get(), parameters.state)), - uniforms::world::Value(parameters.backend.getDefaultRenderable().getSize()), - }, - paintPropertyBinders, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = programInstance.computeAllAttributeBindings( - *bucket.vertexBuffer, paintPropertyBinders, evaluated); - - checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - programInstance.draw(parameters.context, - *parameters.renderPass, - drawMode, - depthMode, - parameters.stencilModeForClipping(tile.id), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - indexBuffer, - segments, - allUniformValues, - allAttributeBindings, - std::forward(textureBindings), - getID()); - }; - - auto fillRenderPass = (evaluated.get().constantOr(Color()).a >= 1.0f && - evaluated.get().constantOr(0) >= 1.0f && - parameters.currentLayer >= parameters.opaquePassCutoff) - ? RenderPass::Opaque - : RenderPass::Translucent; - if (bucket.triangleIndexBuffer && parameters.pass == fillRenderPass) { - draw(*fillProgram, - gfx::Triangles(), - parameters.depthModeForSublayer(1, - parameters.pass == RenderPass::Opaque - ? gfx::DepthMaskType::ReadWrite - : gfx::DepthMaskType::ReadOnly), - *bucket.triangleIndexBuffer, - bucket.triangleSegments, - FillProgram::TextureBindings{}); - } - - if (evaluated.get() && parameters.pass == RenderPass::Translucent) { - draw(*fillOutlineProgram, - gfx::Lines{2.0f}, - parameters.depthModeForSublayer(unevaluated.get().isUndefined() ? 2 : 0, - gfx::DepthMaskType::ReadOnly), - *bucket.lineIndexBuffer, - bucket.basicLineSegments, - FillOutlineProgram::TextureBindings{}); - } - } - } else { - if (parameters.pass != RenderPass::Translucent) { - return; - } - - parameters.renderTileClippingMasks(renderTiles); - - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - const auto& evaluated = getEvaluated(renderData->layerProperties); - const auto& crossfade = getCrossfade(renderData->layerProperties); - - const auto& fillPatternValue = evaluated.get().constantOr(Faded{"", ""}); - std::optional patternPosA = tile.getPattern(fillPatternValue.from.id()); - std::optional patternPosB = tile.getPattern(fillPatternValue.to.id()); - - auto draw = [&](auto& programInstance, - const auto& drawMode, - const auto& depthMode, - const auto& indexBuffer, - const auto& segments, - auto&& textureBindings) { - auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - paintPropertyBinders.setPatternParameters(patternPosA, patternPosB, crossfade); - - const auto allUniformValues = programInstance.computeAllUniformValues( - FillPatternProgram::layoutUniformValues( - tile.translatedMatrix( - evaluated.get(), evaluated.get(), parameters.state), - parameters.backend.getDefaultRenderable().getSize(), - tile.getIconAtlasTexture()->getSize(), - crossfade, - tile.id, - parameters.state, - parameters.pixelRatio), - paintPropertyBinders, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = programInstance.computeAllAttributeBindings( - *bucket.vertexBuffer, paintPropertyBinders, evaluated); - - checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - programInstance.draw(parameters.context, - *parameters.renderPass, - drawMode, - depthMode, - parameters.stencilModeForClipping(tile.id), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - indexBuffer, - segments, - allUniformValues, - allAttributeBindings, - std::forward(textureBindings), - getID()); - }; - - if (bucket.triangleIndexBuffer) { - draw(*fillPatternProgram, - gfx::Triangles(), - parameters.depthModeForSublayer(1, gfx::DepthMaskType::ReadWrite), - *bucket.triangleIndexBuffer, - bucket.triangleSegments, - FillPatternProgram::TextureBindings{ - tile.getIconAtlasTextureBinding(gfx::TextureFilterType::Linear), - }); - } - if (evaluated.get() && unevaluated.get().isUndefined()) { - draw(*fillOutlinePatternProgram, - gfx::Lines{2.0f}, - parameters.depthModeForSublayer(2, gfx::DepthMaskType::ReadOnly), - *bucket.lineIndexBuffer, - bucket.basicLineSegments, - FillOutlinePatternProgram::TextureBindings{ - tile.getIconAtlasTextureBinding(gfx::TextureFilterType::Linear), - }); - } - } - } -} -#endif // MLN_LEGACY_RENDERER - bool RenderFillLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, const float, @@ -294,8 +118,6 @@ bool RenderFillLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeo feature.getGeometries()); } -#if MLN_DRAWABLE_RENDERER - void RenderFillLayer::update(gfx::ShaderRegistry& shaders, gfx::Context& context, const TransformState&, @@ -713,6 +535,5 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_fill_layer.hpp b/src/mbgl/renderer/layers/render_fill_layer.hpp index 91efe25a39bb..1901e7a87239 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.hpp +++ b/src/mbgl/renderer/layers/render_fill_layer.hpp @@ -16,10 +16,8 @@ class FillPatternProgram; class FillOutlineProgram; class FillOutlinePatternProgram; -#if MLN_DRAWABLE_RENDERER class FillLayerTweaker; using FillLayerTweakerPtr = std::shared_ptr; -#endif // MLN_DRAWABLE_RENDERER class RenderFillLayer final : public RenderLayer { public: @@ -36,7 +34,6 @@ class RenderFillLayer final : public RenderLayer { explicit RenderFillLayer(Immutable); ~RenderFillLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -44,7 +41,6 @@ class RenderFillLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; @@ -52,10 +48,6 @@ class RenderFillLayer final : public RenderLayer { bool hasTransition() const override; bool hasCrossfade() const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, float, @@ -67,15 +59,6 @@ class RenderFillLayer final : public RenderLayer { // Paint properties style::FillPaintProperties::Unevaluated unevaluated; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr fillProgram; - std::shared_ptr fillPatternProgram; - std::shared_ptr fillOutlineProgram; - std::shared_ptr fillOutlinePatternProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr fillShaderGroup; gfx::ShaderGroupPtr outlineShaderGroup; gfx::ShaderGroupPtr patternShaderGroup; @@ -84,8 +67,6 @@ class RenderFillLayer final : public RenderLayer { #if MLN_TRIANGULATE_FILL_OUTLINES gfx::ShaderGroupPtr outlineTriangulatedShaderGroup; #endif // MLN_TRIANGULATE_FILL_OUTLINES - -#endif // MLN_DRAWABLE_RENDERER }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 28405353e146..f05c3e98560d 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -13,7 +13,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -24,7 +23,6 @@ #include #include #include -#endif namespace mbgl { @@ -54,14 +52,12 @@ void RenderHeatmapLayer::transition(const TransitionParameters& parameters) { updateColorRamp(); } -#if MLN_DRAWABLE_RENDERER void RenderHeatmapLayer::layerChanged(const TransitionParameters& parameters, const Immutable& impl, UniqueChangeRequestVec& changes) { RenderLayer::layerChanged(parameters, impl, changes); textureTweaker.reset(); } -#endif void RenderHeatmapLayer::evaluate(const PropertyEvaluationParameters& parameters) { const auto previousProperties = staticImmutableCast(evaluatedProperties); @@ -74,14 +70,12 @@ void RenderHeatmapLayer::evaluate(const PropertyEvaluationParameters& parameters properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } if (textureTweaker) { textureTweaker->updateProperties(evaluatedProperties); } -#endif } bool RenderHeatmapLayer::hasTransition() const { @@ -92,123 +86,6 @@ bool RenderHeatmapLayer::hasCrossfade() const { return false; } -#if MLN_LEGACY_RENDERER -void RenderHeatmapLayer::upload(gfx::UploadPass& uploadPass) { - if (!colorRampTexture) { - colorRampTexture = uploadPass.createTexture(*colorRamp, gfx::TextureChannelDataType::UnsignedByte); - } -} - -void RenderHeatmapLayer::render(PaintParameters& parameters) { - assert(renderTiles); - if (parameters.pass == RenderPass::Opaque) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(heatmapProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(heatmapTextureProgram)) return; - - if (parameters.pass == RenderPass::Pass3D) { - const auto& viewportSize = parameters.staticData.backendSize; - const auto size = Size{viewportSize.width / 4, viewportSize.height / 4}; - - assert(colorRampTexture); - - if (!renderTexture || renderTexture->getSize() != size) { - renderTexture = parameters.context.createOffscreenTexture(size, gfx::TextureChannelDataType::HalfFloat); - } - - auto renderPass = parameters.encoder->createRenderPass("heatmap texture", - {*renderTexture, Color{0.0f, 0.0f, 0.0f, 1.0f}, {}, {}}); - - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - const auto& evaluated = getEvaluated(renderData->layerProperties); - - const auto extrudeScale = tile.id.pixelsToTileUnits(1.0f, static_cast(parameters.state.getZoom())); - - auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - - const auto allUniformValues = HeatmapProgram::computeAllUniformValues( - HeatmapProgram::LayoutUniformValues{ - uniforms::intensity::Value(evaluated.get()), - uniforms::matrix::Value(tile.matrix), - uniforms::heatmap::extrude_scale::Value(extrudeScale)}, - paintPropertyBinders, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = HeatmapProgram::computeAllAttributeBindings( - *bucket.vertexBuffer, paintPropertyBinders, evaluated); - - checkRenderability(parameters, HeatmapProgram::activeBindingCount(allAttributeBindings)); - - heatmapProgram->draw(parameters.context, - *renderPass, - gfx::Triangles(), - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - gfx::ColorMode::additive(), - gfx::CullFaceMode::disabled(), - *bucket.indexBuffer, - bucket.segments, - allUniformValues, - allAttributeBindings, - HeatmapProgram::TextureBindings{}, - getID()); - } - - } else if (parameters.pass == RenderPass::Translucent) { - const auto& size = parameters.staticData.backendSize; - - mat4 viewportMat; - matrix::ortho(viewportMat, 0, size.width, size.height, 0, 0, 1); - - const Properties<>::PossiblyEvaluated properties; - const HeatmapTextureProgram::Binders paintAttributeData{properties, 0}; - - const auto allUniformValues = HeatmapTextureProgram::computeAllUniformValues( - HeatmapTextureProgram::LayoutUniformValues{ - uniforms::matrix::Value(viewportMat), - uniforms::world::Value(size), - uniforms::opacity::Value( - getEvaluated(evaluatedProperties).get())}, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = HeatmapTextureProgram::computeAllAttributeBindings( - *parameters.staticData.heatmapTextureVertexBuffer, paintAttributeData, properties); - - checkRenderability(parameters, HeatmapTextureProgram::activeBindingCount(allAttributeBindings)); - - if (segments.empty()) { - // Copy over the segments so that we can create our own DrawScopes. - segments = RenderStaticData::heatmapTextureSegments(); - } - heatmapTextureProgram->draw( - parameters.context, - *parameters.renderPass, - gfx::Triangles(), - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *parameters.staticData.quadTriangleIndexBuffer, - segments, - allUniformValues, - allAttributeBindings, - HeatmapTextureProgram::TextureBindings{ - textures::image::Value{renderTexture->getTexture().getResource(), gfx::TextureFilterType::Linear}, - textures::color_ramp::Value{colorRampTexture->getResource(), gfx::TextureFilterType::Linear}, - }, - getID()); - } -} -#endif // MLN_LEGACY_RENDERER - void RenderHeatmapLayer::updateColorRamp() { if (colorRamp) { auto colorValue = unevaluated.get().getValue(); @@ -236,7 +113,6 @@ bool RenderHeatmapLayer::queryIntersectsFeature(const GeometryCoordinates& query return false; } -#if MLN_DRAWABLE_RENDERER namespace { void activateRenderTarget(const RenderTargetPtr& renderTarget_, bool activate, UniqueChangeRequestVec& changes) { if (renderTarget_) { @@ -505,8 +381,9 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders, std::shared_ptr texture = context.createTexture2D(); texture->setImage(colorRamp); - texture->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + texture->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); heatmapTextureBuilder->setTexture(std::move(texture), idHeatmapColorRampTexture); heatmapTextureBuilder->flush(context); @@ -517,6 +394,5 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders, ++stats.drawablesAdded; } } -#endif // MLN_DRAWABLE_RENDERER } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.hpp b/src/mbgl/renderer/layers/render_heatmap_layer.hpp index 4c74305d7087..7c03b50557a7 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.hpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.hpp @@ -11,19 +11,16 @@ namespace mbgl { -#if MLN_DRAWABLE_RENDERER class HeatmapLayerTweaker; class HeatmapTextureLayerTweaker; using HeatmapLayerTweakerPtr = std::shared_ptr; using HeatmapTextureLayerTweakerPtr = std::shared_ptr; -#endif // MLN_DRAWABLE_RENDERER class RenderHeatmapLayer final : public RenderLayer { public: explicit RenderHeatmapLayer(Immutable); ~RenderHeatmapLayer() override; -#if MLN_DRAWABLE_RENDERER void markLayerRenderable(bool willRender, UniqueChangeRequestVec& changes) override; /// Generate any changes needed by the layer @@ -33,19 +30,12 @@ class RenderHeatmapLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; bool hasCrossfade() const override; - -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass&) override; - void render(PaintParameters&) override; -#endif - bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, float, @@ -55,7 +45,6 @@ class RenderHeatmapLayer final : public RenderLayer { const FeatureState&) const override; void updateColorRamp(); -#if MLN_DRAWABLE_RENDERER void layerChanged(const TransitionParameters& parameters, const Immutable& impl, UniqueChangeRequestVec& changes) override; @@ -68,8 +57,6 @@ class RenderHeatmapLayer final : public RenderLayer { /// @return The number of drawables actually removed. std::size_t removeAllDrawables() override; -#endif - // Paint properties style::HeatmapPaintProperties::Unevaluated unevaluated; std::shared_ptr colorRamp; @@ -77,13 +64,6 @@ class RenderHeatmapLayer final : public RenderLayer { std::optional colorRampTexture; SegmentVector segments; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr heatmapProgram; - std::shared_ptr heatmapTextureProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr heatmapShaderGroup; gfx::ShaderProgramBasePtr heatmapTextureShader; RenderTargetPtr renderTarget; @@ -94,7 +74,6 @@ class RenderHeatmapLayer final : public RenderLayer { // This is the layer tweaker for applying the off-screen texture to the framebuffer. // The inherited layer tweaker is for applying tiles to the off-screen texture. LayerTweakerPtr textureTweaker; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index 3e55dc4552d0..6bc7abe97c0f 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -13,7 +13,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -25,7 +24,6 @@ #include #include #include -#endif namespace mbgl { @@ -68,14 +66,12 @@ void RenderHillshadeLayer::transition(const TransitionParameters& parameters) { styleDependencies = unevaluated.getDependencies(); } -#if MLN_DRAWABLE_RENDERER void RenderHillshadeLayer::layerChanged(const TransitionParameters& parameters, const Immutable& impl, UniqueChangeRequestVec& changes) { RenderLayer::layerChanged(parameters, impl, changes); prepareLayerTweaker.reset(); } -#endif void RenderHillshadeLayer::evaluate(const PropertyEvaluationParameters& parameters) { const auto previousProperties = staticImmutableCast(evaluatedProperties); @@ -88,14 +84,12 @@ void RenderHillshadeLayer::evaluate(const PropertyEvaluationParameters& paramete : RenderPass::None; properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } if (prepareLayerTweaker) { prepareLayerTweaker->updateProperties(evaluatedProperties); } -#endif } bool RenderHillshadeLayer::hasTransition() const { @@ -110,158 +104,9 @@ void RenderHillshadeLayer::prepare(const LayerPrepareParameters& params) { renderTiles = params.source->getRenderTiles(); maxzoom = params.source->getMaxZoom(); -#if MLN_DRAWABLE_RENDERER updateRenderTileIDs(); -#endif // MLN_DRAWABLE_RENDERER } -#if MLN_LEGACY_RENDERER -void RenderHillshadeLayer::render(PaintParameters& parameters) { - assert(renderTiles); - if (parameters.pass != RenderPass::Translucent && parameters.pass != RenderPass::Pass3D) return; - - if (!parameters.shaders.getLegacyGroup().populate(hillshadeProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(hillshadePrepareProgram)) return; - - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - auto draw = [&](const mat4& matrix, - const auto& vertexBuffer, - const auto& indexBuffer, - const auto& segments, - const UnwrappedTileID& id, - const auto& textureBindings) { - const HillshadeProgram::Binders paintAttributeData{evaluated, 0}; - - const auto allUniformValues = HillshadeProgram::computeAllUniformValues( - HillshadeProgram::LayoutUniformValues{ - uniforms::matrix::Value(matrix), - uniforms::highlight::Value(evaluated.get()), - uniforms::shadow::Value(evaluated.get()), - uniforms::accent::Value(evaluated.get()), - uniforms::light::Value(getLight(parameters)), - uniforms::latrange::Value(getLatRange(id)), - }, - paintAttributeData, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = HillshadeProgram::computeAllAttributeBindings( - vertexBuffer, paintAttributeData, evaluated); - - checkRenderability(parameters, HillshadeProgram::activeBindingCount(allAttributeBindings)); - - hillshadeProgram->draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - indexBuffer, - segments, - allUniformValues, - allAttributeBindings, - textureBindings, - getID()); - }; - - mat4 mat; - matrix::ortho(mat, 0, util::EXTENT, -util::EXTENT, 0, 0, 1); - matrix::translate(mat, mat, 0, -util::EXTENT, 0); - - for (const RenderTile& tile : *renderTiles) { - auto* bucket_ = tile.getBucket(*baseImpl); - if (!bucket_) { - continue; - } - auto& bucket = static_cast(*bucket_); - - if (!bucket.hasData()) { - continue; - } - - if (!bucket.isPrepared() && parameters.pass == RenderPass::Pass3D) { - assert(bucket.dem); - const uint16_t stride = bucket.getDEMData().stride; - const uint16_t tilesize = bucket.getDEMData().dim; - auto view = parameters.context.createOffscreenTexture({tilesize, tilesize}, - gfx::TextureChannelDataType::UnsignedByte); - - auto renderPass = parameters.encoder->createRenderPass("hillshade prepare", - {*view, Color{0.0f, 0.0f, 0.0f, 0.0f}, {}, {}}); - - const Properties<>::PossiblyEvaluated properties; - const HillshadePrepareProgram::Binders paintAttributeData{properties, 0}; - - const auto allUniformValues = HillshadePrepareProgram::computeAllUniformValues( - HillshadePrepareProgram::LayoutUniformValues{ - uniforms::matrix::Value(mat), - uniforms::dimension::Value({{stride, stride}}), - uniforms::zoom::Value(static_cast(tile.id.canonical.z)), - uniforms::maxzoom::Value(static_cast(maxzoom)), - uniforms::unpack::Value(bucket.getDEMData().getUnpackVector()), - }, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = HillshadePrepareProgram::computeAllAttributeBindings( - *parameters.staticData.rasterVertexBuffer, paintAttributeData, properties); - - checkRenderability(parameters, HillshadePrepareProgram::activeBindingCount(allAttributeBindings)); - - // Copy over the segments so that we can create our own DrawScopes - // that get destroyed after this draw call. - auto segments = RenderStaticData::rasterSegments(); - hillshadePrepareProgram->draw(parameters.context, - *renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *parameters.staticData.quadTriangleIndexBuffer, - segments, - allUniformValues, - allAttributeBindings, - HillshadePrepareProgram::TextureBindings{ - textures::image::Value{bucket.dem->getResource()}, - }, - "prepare"); - bucket.texture = std::move(view->getTexture()); - bucket.setPrepared(true); - } else if (parameters.pass == RenderPass::Translucent) { - assert(bucket.texture); - - if (bucket.vertexBuffer && bucket.indexBuffer) { - // Draw only the parts of the tile that aren't drawn by another tile in the layer. - draw(parameters.matrixForTile(tile.id, true), - *bucket.vertexBuffer, - *bucket.indexBuffer, - bucket.segments, - tile.id, - HillshadeProgram::TextureBindings{ - textures::image::Value{bucket.texture->getResource(), gfx::TextureFilterType::Linear}, - }); - } else { - // Draw the full tile. - if (bucket.segments.empty()) { - // Copy over the segments so that we can create our own DrawScopes. - bucket.segments = RenderStaticData::rasterSegments(); - } - draw(parameters.matrixForTile(tile.id, true), - *parameters.staticData.rasterVertexBuffer, - *parameters.staticData.quadTriangleIndexBuffer, - bucket.segments, - tile.id, - HillshadeProgram::TextureBindings{ - textures::image::Value{bucket.texture->getResource(), gfx::TextureFilterType::Linear}, - }); - } - } - } -} -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER namespace { void activateRenderTarget(const RenderTargetPtr& renderTarget_, bool activate, UniqueChangeRequestVec& changes) { if (renderTarget_) { @@ -434,8 +279,9 @@ void RenderHillshadeLayer::update(gfx::ShaderRegistry& shaders, std::shared_ptr texture = context.createTexture2D(); texture->setImage(bucket.getDEMData().getImagePtr()); - texture->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + texture->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); hillshadePrepareBuilder->setTexture(texture, idHillshadeImageTexture); hillshadePrepareBuilder->flush(context); @@ -533,6 +379,5 @@ void RenderHillshadeLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif // MLN_DRAWABLE_RENDERER } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.hpp b/src/mbgl/renderer/layers/render_hillshade_layer.hpp index 59390317ea3c..28c59cce2939 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.hpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.hpp @@ -9,17 +9,14 @@ namespace mbgl { -#if MLN_DRAWABLE_RENDERER class HillshadeLayerTweaker; using HillshadeLayerTweakerPtr = std::shared_ptr; -#endif // MLN_DRAWABLE_RENDERER class RenderHillshadeLayer : public RenderLayer { public: explicit RenderHillshadeLayer(Immutable); ~RenderHillshadeLayer() override; -#if MLN_DRAWABLE_RENDERER void markLayerRenderable(bool willRender, UniqueChangeRequestVec& changes) override; void layerRemoved(UniqueChangeRequestVec&) override; @@ -31,7 +28,6 @@ class RenderHillshadeLayer : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; @@ -39,25 +35,16 @@ class RenderHillshadeLayer : public RenderLayer { bool hasTransition() const override; bool hasCrossfade() const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - -#if MLN_DRAWABLE_RENDERER void updateLayerTweaker(); void layerChanged(const TransitionParameters& parameters, const Immutable& impl, UniqueChangeRequestVec& changes) override; -#endif // MLN_DRAWABLE_RENDERER - void prepare(const LayerPrepareParameters&) override; -#if MLN_DRAWABLE_RENDERER void addRenderTarget(const RenderTargetPtr&, UniqueChangeRequestVec&); void removeRenderTargets(UniqueChangeRequestVec&); -#endif // Paint properties style::HillshadePaintProperties::Unevaluated unevaluated; @@ -66,13 +53,6 @@ class RenderHillshadeLayer : public RenderLayer { std::array getLatRange(const UnwrappedTileID& id); std::array getLight(const PaintParameters& parameters); -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr hillshadeProgram; - std::shared_ptr hillshadePrepareProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderProgramBasePtr hillshadePrepareShader; gfx::ShaderProgramBasePtr hillshadeShader; std::vector activatedRenderTargets; @@ -81,7 +61,6 @@ class RenderHillshadeLayer : public RenderLayer { std::shared_ptr staticDataSharedVertices; LayerTweakerPtr prepareLayerTweaker; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index e93bf879171e..86a3f69390d5 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -21,7 +21,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -30,7 +29,6 @@ #include #include #include -#endif namespace mbgl { @@ -44,12 +42,8 @@ inline const LineLayer::Impl& impl_cast(const Immutable& imp return static_cast(*impl); } -#if MLN_DRAWABLE_RENDERER - const auto posNormalAttribName = "a_pos_normal"; -#endif // MLN_DRAWABLE_RENDERER - } // namespace RenderLineLayer::RenderLineLayer(Immutable _impl) @@ -88,14 +82,12 @@ void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) { properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (auto* tweaker = static_cast(layerTweaker.get())) { tweaker->updateProperties(evaluatedProperties); #if MLN_RENDER_BACKEND_METAL tweaker->updateGPUExpressions(unevaluated, parameters.now); #endif // MLN_RENDER_BACKEND_METAL } -#endif } bool RenderLineLayer::hasTransition() const { @@ -124,134 +116,6 @@ void RenderLineLayer::prepare(const LayerPrepareParameters& params) { } } -#if MLN_LEGACY_RENDERER -void RenderLineLayer::upload(gfx::UploadPass& uploadPass) { - if (!unevaluated.get().getValue().isUndefined() && !colorRampTexture) { - colorRampTexture = uploadPass.createTexture(*colorRamp); - } -} - -void RenderLineLayer::render(PaintParameters& parameters) { - assert(renderTiles); - if (parameters.pass == RenderPass::Opaque) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(lineProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(lineGradientProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(lineSDFProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(linePatternProgram)) return; - - parameters.renderTileClippingMasks(renderTiles); - - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - auto& bucket = static_cast(*renderData->bucket); - const auto& evaluated = getEvaluated(renderData->layerProperties); - const auto& crossfade = getCrossfade(renderData->layerProperties); - - auto draw = [&](auto& programInstance, - auto&& uniformValues, - const std::optional& patternPositionA, - const std::optional& patternPositionB, - auto&& textureBindings) { - auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - - paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade); - - const auto allUniformValues = programInstance.computeAllUniformValues( - std::forward(uniformValues), - paintPropertyBinders, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = programInstance.computeAllAttributeBindings( - *bucket.vertexBuffer, paintPropertyBinders, evaluated); - - checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - programInstance.draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - parameters.stencilModeForClipping(tile.id), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *bucket.indexBuffer, - bucket.segments, - allUniformValues, - allAttributeBindings, - std::forward(textureBindings), - getID()); - }; - - if (!evaluated.get().from.empty()) { - const LinePatternCap cap = bucket.layout.get() == LineCapType::Round ? LinePatternCap::Round - : LinePatternCap::Square; - const auto& dashPatternTexture = parameters.lineAtlas.getDashPatternTexture( - evaluated.get().from, evaluated.get().to, cap); - - draw(*lineSDFProgram, - LineSDFProgram::layoutUniformValues(evaluated, - parameters.pixelRatio, - tile, - parameters.state, - parameters.pixelsToGLUnits, - dashPatternTexture.getFrom(), - dashPatternTexture.getTo(), - crossfade, - static_cast(dashPatternTexture.getSize().width)), - {}, - {}, - LineSDFProgram::TextureBindings{ - dashPatternTexture.textureBinding(), - }); - - } else if (!unevaluated.get().isUndefined()) { - const auto& linePatternValue = evaluated.get().constantOr(Faded{"", ""}); - const Size& texsize = tile.getIconAtlasTexture()->getSize(); - - std::optional posA = tile.getPattern(linePatternValue.from.id()); - std::optional posB = tile.getPattern(linePatternValue.to.id()); - - draw(*linePatternProgram, - LinePatternProgram::layoutUniformValues(evaluated, - tile, - parameters.state, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - texsize, - crossfade), - posA, - posB, - LinePatternProgram::TextureBindings{ - tile.getIconAtlasTextureBinding(gfx::TextureFilterType::Linear), - }); - } else if (!unevaluated.get().getValue().isUndefined()) { - assert(colorRampTexture); - - draw(*lineGradientProgram, - LineGradientProgram::layoutUniformValues( - evaluated, tile, parameters.state, parameters.pixelsToGLUnits, parameters.pixelRatio), - {}, - {}, - LineGradientProgram::TextureBindings{ - textures::image::Value{colorRampTexture->getResource(), gfx::TextureFilterType::Linear}, - }); - } else { - draw(*lineProgram, - LineProgram::layoutUniformValues( - evaluated, tile, parameters.state, parameters.pixelsToGLUnits, parameters.pixelRatio), - {}, - {}, - LineProgram::TextureBindings{}); - } - } -} -#endif // MLN_LEGACY_RENDERER - namespace { GeometryCollection offsetLine(const GeometryCollection& rings, double offset) { @@ -327,7 +191,6 @@ void RenderLineLayer::updateColorRamp() { colorRampTexture = std::nullopt; -#if MLN_DRAWABLE_RENDERER if (colorRampTexture2D) { colorRampTexture2D.reset(); @@ -337,7 +200,6 @@ void RenderLineLayer::updateColorRamp() { layerGroup->clearDrawables(); } } -#endif } float RenderLineLayer::getLineWidth(const GeometryTileFeature& feature, @@ -355,7 +217,6 @@ float RenderLineLayer::getLineWidth(const GeometryTileFeature& feature, } } -#if MLN_DRAWABLE_RENDERER namespace { inline void setSegments(std::unique_ptr& builder, const LineBucket& bucket) { @@ -603,8 +464,9 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, // create texture. to be reused for all the tiles of the layer colorRampTexture2D = context.createTexture2D(); colorRampTexture2D->setImage(colorRamp); - colorRampTexture2D->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + colorRampTexture2D->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); } if (colorRampTexture2D) { @@ -644,6 +506,5 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_line_layer.hpp b/src/mbgl/renderer/layers/render_line_layer.hpp index d45f3f6ee6ee..1e6dc8daee76 100644 --- a/src/mbgl/renderer/layers/render_line_layer.hpp +++ b/src/mbgl/renderer/layers/render_line_layer.hpp @@ -13,14 +13,6 @@ namespace mbgl { -#if MLN_LEGACY_RENDERER -class LineProgram; -class LineGradientProgram; -class LineSDFProgram; -class LinePatternProgram; -#endif - -#if MLN_DRAWABLE_RENDERER namespace gfx { class ShaderGroup; class UniformBuffer; @@ -30,14 +22,12 @@ using UniformBufferPtr = std::shared_ptr; class LineLayerTweaker; using LineLayerTweakerPtr = std::shared_ptr; -#endif class RenderLineLayer final : public RenderLayer { public: explicit RenderLineLayer(Immutable); ~RenderLineLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -45,7 +35,6 @@ class RenderLineLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif private: void transition(const TransitionParameters&) override; @@ -54,11 +43,6 @@ class RenderLineLayer final : public RenderLayer { bool hasCrossfade() const override; void prepare(const LayerPrepareParameters&) override; -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass&) override; - void render(PaintParameters&) override; -#endif - bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, float, @@ -76,23 +60,12 @@ class RenderLineLayer final : public RenderLayer { std::shared_ptr colorRamp; std::optional colorRampTexture; -#if MLN_DRAWABLE_RENDERER gfx::Texture2DPtr colorRampTexture2D; -#endif -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr lineProgram; - std::shared_ptr lineGradientProgram; - std::shared_ptr lineSDFProgram; - std::shared_ptr linePatternProgram; -#endif -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr lineShaderGroup; gfx::ShaderGroupPtr lineGradientShaderGroup; gfx::ShaderGroupPtr lineSDFShaderGroup; gfx::ShaderGroupPtr linePatternShaderGroup; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index a097b04bb73e..056b785ffea9 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -13,7 +13,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -21,7 +20,6 @@ #include #include #include -#endif namespace mbgl { @@ -60,11 +58,9 @@ void RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif } bool RenderRasterLayer::hasTransition() const { @@ -75,163 +71,15 @@ bool RenderRasterLayer::hasCrossfade() const { return false; } -#if MLN_LEGACY_RENDERER -static float saturationFactor(float saturation) { - if (saturation > 0) { - return 1.f - 1.f / (1.001f - saturation); - } else { - return -saturation; - } -} - -static float contrastFactor(float contrast) { - if (contrast > 0) { - return 1 / (1 - contrast); - } else { - return 1 + contrast; - } -} - -static std::array spinWeights(float spin) { - spin = util::deg2radf(spin); - float s = std::sin(spin); - float c = std::cos(spin); - std::array spin_weights = { - {(2 * c + 1) / 3, (-std::sqrt(3.0f) * s - c + 1) / 3, (std::sqrt(3.0f) * s - c + 1) / 3}}; - return spin_weights; -} -#endif - void RenderRasterLayer::prepare(const LayerPrepareParameters& params) { renderTiles = params.source->getRenderTiles(); imageData = params.source->getImageRenderData(); // It is possible image data is not available until the source loads it. assert(renderTiles || imageData || !params.source->isEnabled()); -#if MLN_DRAWABLE_RENDERER updateRenderTileIDs(); -#endif // MLN_DRAWABLE_RENDERER -} - -#if MLN_LEGACY_RENDERER -void RenderRasterLayer::render(PaintParameters& parameters) { - if (parameters.pass != RenderPass::Translucent || (!renderTiles && !imageData)) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(rasterProgram)) return; - - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - RasterProgram::Binders paintAttributeData{evaluated, 0}; - - auto draw = [&](const mat4& matrix, - const auto& vertexBuffer, - const auto& indexBuffer, - const auto& segments, - const auto& textureBindings, - const std::string& drawScopeID) { - const auto allUniformValues = RasterProgram::computeAllUniformValues( - RasterProgram::LayoutUniformValues{ - uniforms::matrix::Value(matrix), - uniforms::opacity::Value(evaluated.get()), - uniforms::fade_t::Value(1), - uniforms::brightness_low::Value(evaluated.get()), - uniforms::brightness_high::Value(evaluated.get()), - uniforms::saturation_factor::Value(saturationFactor(evaluated.get())), - uniforms::contrast_factor::Value(contrastFactor(evaluated.get())), - uniforms::spin_weights::Value(spinWeights(evaluated.get())), - uniforms::buffer_scale::Value(1.0f), - uniforms::scale_parent::Value(1.0f), - uniforms::tl_parent::Value(std::array{{0.0f, 0.0f}}), - }, - paintAttributeData, - evaluated, - static_cast(parameters.state.getZoom())); - const auto allAttributeBindings = RasterProgram::computeAllAttributeBindings( - vertexBuffer, paintAttributeData, evaluated); - - checkRenderability(parameters, RasterProgram::activeBindingCount(allAttributeBindings)); - - rasterProgram->draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - indexBuffer, - segments, - allUniformValues, - allAttributeBindings, - textureBindings, - getID() + "/" + drawScopeID); - }; - - const gfx::TextureFilterType filter = evaluated.get() == RasterResamplingType::Nearest - ? gfx::TextureFilterType::Nearest - : gfx::TextureFilterType::Linear; - - if (imageData && !imageData->bucket->needsUpload()) { - RasterBucket& bucket = *imageData->bucket; - assert(bucket.texture); - - size_t i = 0; - for (const auto& matrix_ : imageData->matrices) { - draw(matrix_, - *bucket.vertexBuffer, - *bucket.indexBuffer, - bucket.segments, - RasterProgram::TextureBindings{ - textures::image0::Value{bucket.texture->getResource(), filter}, - textures::image1::Value{bucket.texture->getResource(), filter}, - }, - std::to_string(i++)); - } - } else if (renderTiles) { - for (const RenderTile& tile : *renderTiles) { - auto* bucket_ = tile.getBucket(*baseImpl); - if (!bucket_) { - continue; - } - auto& bucket = static_cast(*bucket_); - - if (!bucket.hasData()) continue; - - assert(bucket.texture); - if (bucket.vertexBuffer && bucket.indexBuffer) { - // Draw only the parts of the tile that aren't drawn by another tile in the layer. - draw(parameters.matrixForTile(tile.id, !parameters.state.isChanging()), - *bucket.vertexBuffer, - *bucket.indexBuffer, - bucket.segments, - RasterProgram::TextureBindings{ - textures::image0::Value{bucket.texture->getResource(), filter}, - textures::image1::Value{bucket.texture->getResource(), filter}, - }, - "image"); - } else { - // Draw the full tile. - if (bucket.segments.empty()) { - // Copy over the segments so that we can create our own DrawScopes. - bucket.segments = RenderStaticData::rasterSegments(); - } - draw(parameters.matrixForTile(tile.id, !parameters.state.isChanging()), - *parameters.staticData.rasterVertexBuffer, - *parameters.staticData.quadTriangleIndexBuffer, - bucket.segments, - RasterProgram::TextureBindings{ - textures::image0::Value{bucket.texture->getResource(), filter}, - textures::image1::Value{bucket.texture->getResource(), filter}, - }, - "image"); - } - } - } } -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER void RenderRasterLayer::markLayerRenderable(bool willRender, UniqueChangeRequestVec& changes) { RenderLayer::markLayerRenderable(willRender, changes); if (imageLayerGroup) { @@ -324,7 +172,7 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, const auto filter = nearest ? gfx::TextureFilterType::Nearest : gfx::TextureFilterType::Linear; bucket.texture2d->setSamplerConfiguration( - {filter, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + {.filter = filter, .wrapU = gfx::TextureWrapType::Clamp, .wrapV = gfx::TextureWrapType::Clamp}); builder->setTexture(bucket.texture2d, idRasterImage0Texture); builder->setTexture(bucket.texture2d, idRasterImage1Texture); @@ -520,6 +368,5 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, } } } -#endif // MLN_DRAWABLE_RENDERER } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_raster_layer.hpp b/src/mbgl/renderer/layers/render_raster_layer.hpp index 105407f85ae5..6d73aa835cb5 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.hpp +++ b/src/mbgl/renderer/layers/render_raster_layer.hpp @@ -16,7 +16,6 @@ class RenderRasterLayer final : public RenderLayer { explicit RenderRasterLayer(Immutable); ~RenderRasterLayer() override; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -24,10 +23,8 @@ class RenderRasterLayer final : public RenderLayer { const std::shared_ptr&, const RenderTree&, UniqueChangeRequestVec&) override; -#endif protected: -#if MLN_DRAWABLE_RENDERER /// @brief Called by the RenderOrchestrator during RenderTree construction. /// This event is run to indicate if the layer should render or not for the current frame. /// @param willRender Indicates if this layer should render or not @@ -42,7 +39,6 @@ class RenderRasterLayer final : public RenderLayer { /// Called when the style layer is removed void layerRemoved(UniqueChangeRequestVec&) override; -#endif // MLN_DRAWABLE_RENDERER private: void transition(const TransitionParameters&) override; @@ -51,20 +47,10 @@ class RenderRasterLayer final : public RenderLayer { bool hasCrossfade() const override; void prepare(const LayerPrepareParameters&) override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif - // Paint properties style::RasterPaintProperties::Unevaluated unevaluated; const ImageSourceRenderData* imageData = nullptr; -#if MLN_LEGACY_RENDERER - // Programs - std::shared_ptr rasterProgram; -#endif - -#if MLN_DRAWABLE_RENDERER gfx::ShaderProgramBasePtr rasterShader; LayerGroupPtr imageLayerGroup; @@ -79,7 +65,6 @@ class RenderRasterLayer final : public RenderLayer { using RasterSegmentVector = SegmentVector; using RasterSegmentVectorPtr = std::shared_ptr; std::shared_ptr staticDataSegments; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 76bd8c38af03..250694f7782d 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -22,7 +22,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -33,9 +32,7 @@ #include #include #include -#endif // MLN_DRAWABLE_RENDERER -#include #include namespace mbgl { @@ -44,7 +41,6 @@ using namespace style; using namespace shaders; namespace { -#if MLN_DRAWABLE_RENDERER constexpr std::string_view SymbolIconShaderName = "SymbolIconShader"; constexpr std::string_view SymbolSDFIconShaderName = "SymbolSDFIconShader"; @@ -52,30 +48,30 @@ constexpr std::string_view SymbolTextAndIconShaderName = "SymbolTextAndIconShade constexpr std::string_view CollisionBoxShaderName = "CollisionBoxShader"; constexpr std::string_view CollisionCircleShaderName = "CollisionCircleShader"; -#endif // MLN_DRAWABLE_RENDERER - style::SymbolPropertyValues iconPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_, const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) { - return style::SymbolPropertyValues{layout_.get(), - layout_.get(), - layout_.get(), - evaluated_.get(), - evaluated_.get(), - evaluated_.get().constantOr(Color::black()).a > 0 && - evaluated_.get().constantOr(1) != 0, - evaluated_.get().constantOr(Color::black()).a > 0}; + return style::SymbolPropertyValues{ + .pitchAlignment = layout_.get(), + .rotationAlignment = layout_.get(), + .keepUpright = layout_.get(), + .translate = evaluated_.get(), + .translateAnchor = evaluated_.get(), + .hasHalo = evaluated_.get().constantOr(Color::black()).a > 0 && + evaluated_.get().constantOr(1) != 0, + .hasFill = evaluated_.get().constantOr(Color::black()).a > 0}; } style::SymbolPropertyValues textPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_, const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) { - return style::SymbolPropertyValues{layout_.get(), - layout_.get(), - layout_.get(), - evaluated_.get(), - evaluated_.get(), - evaluated_.get().constantOr(Color::black()).a > 0 && - evaluated_.get().constantOr(1) != 0, - evaluated_.get().constantOr(Color::black()).a > 0}; + return style::SymbolPropertyValues{ + .pitchAlignment = layout_.get(), + .rotationAlignment = layout_.get(), + .keepUpright = layout_.get(), + .translate = evaluated_.get(), + .translateAnchor = evaluated_.get(), + .hasHalo = evaluated_.get().constantOr(Color::black()).a > 0 && + evaluated_.get().constantOr(1) != 0, + .hasFill = evaluated_.get().constantOr(Color::black()).a > 0}; } using SegmentWrapper = std::reference_wrapper>; @@ -137,214 +133,6 @@ struct SegmentGroup { bool operator<(const SegmentGroup& other) const { return renderable < other.renderable; } }; -#if MLN_LEGACY_RENDERER - -template -void drawIcon(const RenderSymbolLayer::Programs& programs, - const DrawFn& draw, - const RenderTile& tile, - const LayerRenderData& renderData, - SegmentsWrapper iconSegments, - const SymbolBucket::PaintProperties& bucketPaintProperties, - const PaintParameters& parameters, - const bool sdfIcons) { - auto& bucket = static_cast(*renderData.bucket); - const auto& evaluated = getEvaluated(renderData.layerProperties); - const auto& layout = *bucket.layout; - auto values = iconPropertyValues(evaluated, layout); - const auto& paintPropertyValues = RenderSymbolLayer::iconPaintProperties(evaluated); - - const bool alongLine = layout.get() != SymbolPlacementType::Point && - layout.get() == AlignmentType::Map; - - const bool iconScaled = layout.get().constantOr(1.0) != 1.0 || bucket.iconsNeedLinear; - const bool iconTransformed = values.rotationAlignment == AlignmentType::Map || parameters.state.getPitch() != 0; - - const bool linear = sdfIcons || parameters.state.isChanging() || iconScaled || iconTransformed; - const auto filterType = linear ? gfx::TextureFilterType::Linear : gfx::TextureFilterType::Nearest; - const gfx::TextureBinding textureBinding = tile.getIconAtlasTextureBinding(filterType); - - const Size& iconSize = tile.getIconAtlasTexture()->getSize(); - const bool variablePlacedIcon = bucket.hasVariablePlacement && layout.get() != IconTextFitType::None; - - if (sdfIcons) { - if (values.hasHalo) { - draw(*programs.symbolSDFIconProgram, - SymbolSDFIconProgram::layoutUniformValues(/* isText = */ false, - variablePlacedIcon, - values, - iconSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Halo), - bucket.sdfIcon, - iconSegments, - bucket.iconSizeBinder, - bucketPaintProperties.iconBinders, - paintPropertyValues, - SymbolSDFIconProgram::TextureBindings{textureBinding}, - "halo"); - } - - if (values.hasFill) { - draw(*programs.symbolSDFIconProgram, - SymbolSDFIconProgram::layoutUniformValues(/* isText = */ false, - variablePlacedIcon, - values, - iconSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Fill), - bucket.sdfIcon, - iconSegments, - bucket.iconSizeBinder, - bucketPaintProperties.iconBinders, - paintPropertyValues, - SymbolSDFIconProgram::TextureBindings{textureBinding}, - "fill"); - } - } else { - draw(*programs.symbolIconProgram, - SymbolIconProgram::layoutUniformValues(/* isText = */ false, - variablePlacedIcon, - values, - iconSize, - parameters.pixelsToGLUnits, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange), - bucket.icon, - iconSegments, - bucket.iconSizeBinder, - bucketPaintProperties.iconBinders, - paintPropertyValues, - SymbolIconProgram::TextureBindings{textureBinding}, - "icon"); - } -} - -template -void drawText(const RenderSymbolLayer::Programs& programs, - const DrawFn& draw, - const RenderTile& tile, - const LayerRenderData& renderData, - SegmentsWrapper textSegments, - const SymbolBucket::PaintProperties& bucketPaintProperties, - const PaintParameters& parameters) { - const auto& bucket = static_cast(*renderData.bucket); - const auto& evaluated = getEvaluated(renderData.layerProperties); - const auto& layout = *bucket.layout; - - const auto values = textPropertyValues(evaluated, layout); - const auto& paintPropertyValues = RenderSymbolLayer::textPaintProperties(evaluated); - - const bool alongLine = layout.get() != SymbolPlacementType::Point && - values.rotationAlignment == AlignmentType::Map; - - const Size& glyphTexSize = tile.getGlyphAtlasTexture()->getSize(); - const gfx::TextureBinding glyphTextureBinding = tile.getGlyphAtlasTextureBinding(gfx::TextureFilterType::Linear); - - const auto drawGlyphs = [&](auto& program, const auto& uniforms, const auto& textures, SymbolSDFPart part) { - draw(program, - uniforms, - bucket.text, - textSegments, - bucket.textSizeBinder, - bucketPaintProperties.textBinders, - paintPropertyValues, - textures, - (part == SymbolSDFPart::Halo) ? "halo" : "fill"); - }; - - if (bucket.iconsInText) { - const ZoomEvaluatedSize partiallyEvaluatedTextSize = bucket.textSizeBinder->evaluateForZoom( - static_cast(parameters.state.getZoom())); - const bool transformed = values.rotationAlignment == AlignmentType::Map || parameters.state.getPitch() != 0; - const Size& iconTexSize = tile.getIconAtlasTexture()->getSize(); - const bool linear = parameters.state.isChanging() || transformed || !partiallyEvaluatedTextSize.isZoomConstant; - const auto filterType = linear ? gfx::TextureFilterType::Linear : gfx::TextureFilterType::Nearest; - const gfx::TextureBinding iconTextureBinding = tile.getIconAtlasTextureBinding(filterType); - if (values.hasHalo) { - drawGlyphs(*programs.symbolTextAndIconProgram, - SymbolTextAndIconProgram::layoutUniformValues(bucket.hasVariablePlacement, - values, - glyphTexSize, - iconTexSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Halo), - SymbolTextAndIconProgram::TextureBindings{glyphTextureBinding, iconTextureBinding}, - SymbolSDFPart::Halo); - } - - if (values.hasFill) { - drawGlyphs(*programs.symbolTextAndIconProgram, - SymbolTextAndIconProgram::layoutUniformValues(bucket.hasVariablePlacement, - values, - glyphTexSize, - iconTexSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Fill), - SymbolTextAndIconProgram::TextureBindings{glyphTextureBinding, iconTextureBinding}, - SymbolSDFPart::Fill); - } - } else { - if (values.hasHalo) { - drawGlyphs(*programs.symbolSDFTextProgram, - SymbolSDFTextProgram::layoutUniformValues(/* isText = */ true, - bucket.hasVariablePlacement, - values, - glyphTexSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Halo), - SymbolSDFTextProgram::TextureBindings{glyphTextureBinding}, - SymbolSDFPart::Halo); - } - - if (values.hasFill) { - drawGlyphs(*programs.symbolSDFTextProgram, - SymbolSDFTextProgram::layoutUniformValues(/* isText = */ true, - bucket.hasVariablePlacement, - values, - glyphTexSize, - parameters.pixelsToGLUnits, - parameters.pixelRatio, - alongLine, - tile, - parameters.state, - parameters.symbolFadeChange, - SymbolSDFPart::Fill), - SymbolSDFTextProgram::TextureBindings{glyphTextureBinding}, - SymbolSDFPart::Fill); - } - } -} - -#endif // MLN_LEGACY_RENDERER - inline const SymbolLayer::Impl& impl_cast(const Immutable& impl) { assert(impl->getTypeInfo() == SymbolLayer::Impl::staticTypeInfo()); return static_cast(*impl); @@ -392,13 +180,11 @@ void RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); -#if MLN_DRAWABLE_RENDERER // The symbol tweaker supports updating properties. // When the style changes, it will be replaced in `RenderLayer::layerChanged` if (layerTweaker) { layerTweaker->updateProperties(evaluatedProperties); } -#endif // MLN_DRAWABLE_RENDERER } bool RenderSymbolLayer::hasTransition() const { @@ -409,258 +195,6 @@ bool RenderSymbolLayer::hasCrossfade() const { return false; } -#if MLN_LEGACY_RENDERER - -void RenderSymbolLayer::render(PaintParameters& parameters) { - assert(renderTiles); - if (parameters.pass == RenderPass::Opaque) { - return; - } - - if (!parameters.shaders.getLegacyGroup().populate(programs.symbolIconProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(programs.symbolSDFIconProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(programs.symbolSDFTextProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(programs.symbolTextAndIconProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(programs.collisionBoxProgram)) return; - if (!parameters.shaders.getLegacyGroup().populate(programs.collisionCircleProgram)) return; - - const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get().isUndefined(); - std::multiset renderableSegments; - - const auto draw = [¶meters, this](auto& programInstance, - const auto& uniformValues, - const auto& buffers, - const auto& segments, - const auto& symbolSizeBinder, - const auto& binders, - const auto& paintProperties, - const auto& textureBindings, - const std::string& suffix) { - const auto allUniformValues = programInstance.computeAllUniformValues( - uniformValues, *symbolSizeBinder, binders, paintProperties, static_cast(parameters.state.getZoom())); - - const auto allAttributeBindings = programInstance.computeAllAttributeBindings(*buffers.vertexBuffer, - *buffers.dynamicVertexBuffer, - *buffers.opacityVertexBuffer, - binders, - paintProperties); - - this->checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - segments.match( - [&](const SegmentWrapper& segment) { - programInstance.draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *buffers.indexBuffer, - segment, - allUniformValues, - allAttributeBindings, - textureBindings, - this->getID() + "/" + suffix); - }, - [&](const SegmentVectorWrapper& segmentVector) { - programInstance.draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *buffers.indexBuffer, - segmentVector, - allUniformValues, - allAttributeBindings, - textureBindings, - this->getID() + "/" + suffix); - }); - }; - - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - if (!renderData) { - continue; - } - - auto& bucket = static_cast(*renderData->bucket); - assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end()); - const auto& bucketPaintProperties = bucket.paintProperties.at(getID()); - - if (!static_cast(bucket).check(SYM_GUARD_LOC)) { - continue; - } - - // Prevent a flickering issue when a symbol is moved. - // bucket.justReloaded = false; - - auto addRenderables = - [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()]( - auto& segments, const SymbolType type) mutable { - for (auto& segment : segments) { - it = renderableSegments.emplace_hint(it, - SegmentWrapper{std::ref(segment)}, - tile, - *renderData, - bucketPaintProperties, - segment.sortKey, - type); - } - }; - - if (bucket.hasIconData()) { - if (sortFeaturesByKey) { - addRenderables(bucket.icon.segments, SymbolType::IconRGBA); - } else { - drawIcon(programs, - draw, - tile, - *renderData, - std::cref(bucket.icon.segments), - bucketPaintProperties, - parameters, - false /*sdfIcon*/ - ); - } - } - - if (bucket.hasSdfIconData()) { - if (sortFeaturesByKey) { - addRenderables(bucket.sdfIcon.segments, SymbolType::IconSDF); - } else { - drawIcon(programs, - draw, - tile, - *renderData, - std::cref(bucket.sdfIcon.segments), - bucketPaintProperties, - parameters, - true /*sdfIcon*/ - ); - } - } - - if (bucket.hasTextData()) { - if (sortFeaturesByKey) { - addRenderables(bucket.text.segments, SymbolType::Text); - } else { - drawText(programs, - draw, - tile, - *renderData, - std::cref(bucket.text.segments), - bucketPaintProperties, - parameters); - } - } - - const auto drawCollisonData = [&](const bool isText, - const bool hasCollisionBox, - const bool hasCollisionCircle) { - if (!hasCollisionBox && !hasCollisionCircle) return; - - static const style::Properties<>::PossiblyEvaluated properties{}; - static const CollisionBoxProgram::Binders paintAttributeData(properties, 0); - const auto pixelRatio = tile.id.pixelsToTileUnits(1.0f, static_cast(parameters.state.getZoom())); - const auto scale = static_cast( - std::pow(2, parameters.state.getZoom() - tile.getOverscaledTileID().overscaledZ)); - std::array extrudeScale = {{parameters.pixelsToGLUnits[0] / (pixelRatio * scale), - parameters.pixelsToGLUnits[1] / (pixelRatio * scale)}}; - const auto& evaluated = getEvaluated(renderData->layerProperties); - const auto& layout = *bucket.layout; - const auto values = isText ? textPropertyValues(evaluated, layout) : iconPropertyValues(evaluated, layout); - const bool needTranslate = values.translate[0] != 0 || values.translate[1] != 0; - - if (hasCollisionBox) { - const auto& collisionBox = isText ? bucket.textCollisionBox : bucket.iconCollisionBox; - programs.collisionBoxProgram->draw( - parameters.context, - *parameters.renderPass, - gfx::Lines{1.0f}, - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - CollisionBoxProgram::LayoutUniformValues{ - uniforms::matrix::Value( - (needTranslate - ? tile.translatedMatrix(values.translate, values.translateAnchor, parameters.state) - : tile.matrix)), - uniforms::extrude_scale::Value(extrudeScale), - uniforms::camera_to_center_distance::Value(parameters.state.getCameraToCenterDistance())}, - *collisionBox->vertexBuffer, - *collisionBox->dynamicVertexBuffer, - *collisionBox->indexBuffer, - collisionBox->segments, - paintAttributeData, - properties, - CollisionBoxProgram::TextureBindings{}, - static_cast(parameters.state.getZoom()), - getID()); - } - if (hasCollisionCircle) { - const auto& collisionCircle = isText ? bucket.textCollisionCircle : bucket.iconCollisionCircle; - programs.collisionCircleProgram->draw( - parameters.context, - *parameters.renderPass, - gfx::Triangles(), - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - CollisionCircleProgram::LayoutUniformValues{ - uniforms::matrix::Value( - (needTranslate - ? tile.translatedMatrix(values.translate, values.translateAnchor, parameters.state) - : tile.matrix)), - uniforms::extrude_scale::Value(extrudeScale), - uniforms::overscale_factor::Value( - static_cast(tile.getOverscaledTileID().overscaleFactor())), - uniforms::camera_to_center_distance::Value(parameters.state.getCameraToCenterDistance())}, - *collisionCircle->vertexBuffer, - *collisionCircle->dynamicVertexBuffer, - *collisionCircle->indexBuffer, - collisionCircle->segments, - paintAttributeData, - properties, - CollisionCircleProgram::TextureBindings{}, - static_cast(parameters.state.getZoom()), - getID()); - } - }; - drawCollisonData(false /*isText*/, bucket.hasIconCollisionBoxData(), bucket.hasIconCollisionCircleData()); - drawCollisonData(true /*isText*/, bucket.hasTextCollisionBoxData(), bucket.hasTextCollisionCircleData()); - } - - if (sortFeaturesByKey) { - for (auto& renderable : renderableSegments) { - if (renderable.type == SymbolType::Text) { - drawText(programs, - draw, - renderable.tile, - renderable.renderData, - renderable.segment, - renderable.bucketPaintProperties, - parameters); - } else { - drawIcon(programs, - draw, - renderable.tile, - renderable.renderData, - renderable.segment, - renderable.bucketPaintProperties, - parameters, - renderable.type == SymbolType::IconSDF); - } - } - } -} - -#endif // MLN_LEGACY_RENDERER - // static style::IconPaintProperties::PossiblyEvaluated RenderSymbolLayer::iconPaintProperties( const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_) { @@ -688,10 +222,7 @@ style::TextPaintProperties::PossiblyEvaluated RenderSymbolLayer::textPaintProper void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) { renderTiles = params.source->getRenderTilesSortedByYPosition(); -#if MLN_DRAWABLE_RENDERER updateRenderTileIDs(); -#endif // MLN_DRAWABLE_RENDERER - addRenderPassesFromTiles(); placementData.clear(); @@ -710,7 +241,11 @@ void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) { placementData.push_back({*bucket, renderTile, featureIndex, baseImpl->source, std::nullopt}); } else { for (const auto& sortKeyRange : bucket->sortKeyRanges) { - BucketPlacementData layerData{*bucket, renderTile, featureIndex, baseImpl->source, sortKeyRange}; + BucketPlacementData layerData{.bucket = *bucket, + .tile = renderTile, + .featureIndex = featureIndex, + .sourceId = baseImpl->source, + .sortKeyRange = sortKeyRange}; auto sortPosition = std::upper_bound( placementData.cbegin(), placementData.cend(), layerData, [](const auto& lhs, const auto& rhs) { assert(lhs.sortKeyRange && rhs.sortKeyRange); @@ -723,8 +258,6 @@ void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) { } } -#if MLN_DRAWABLE_RENDERER - namespace { const SegmentVector emptySegmentVector; constexpr auto posOffsetAttribName = "a_pos_offset"; @@ -1112,13 +645,15 @@ void RenderSymbolLayer::update(gfx::ShaderRegistry& shaders, for (const auto& segment : buffer.segments) { assert(segment.vertexOffset + segment.vertexLength <= buffer.vertices().elements()); renderableSegments.emplace(SegmentGroup{ - {segment, tile, renderData, bucketPaintProperties, segment.sortKey, type}, emptySegmentVector}); + .renderable = {segment, tile, renderData, bucketPaintProperties, segment.sortKey, type}, + .segments = emptySegmentVector}); } } else if (!buffer.segments.empty()) { // Features can be rendered in the order produced, and as grouped by the bucket const auto& firstSeg = buffer.segments.front(); - renderableSegments.emplace(SegmentGroup{ - {firstSeg, tile, renderData, bucketPaintProperties, serialKey, type}, buffer.segments}); + renderableSegments.emplace( + SegmentGroup{.renderable = {firstSeg, tile, renderData, bucketPaintProperties, serialKey, type}, + .segments = buffer.segments}); serialKey += 1.0; } }; @@ -1325,6 +860,4 @@ void RenderSymbolLayer::update(gfx::ShaderRegistry& shaders, } } -#endif // MLN_DRAWABLE_RENDERER - } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp index 380e2dd41531..592e659c303d 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.hpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp @@ -6,9 +6,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif // MLN_DRAWABLE_RENDERER namespace mbgl { @@ -65,10 +63,8 @@ class SymbolTextAndIconProgram; class CollisionBoxProgram; class CollisionCircleProgram; -#if MLN_DRAWABLE_RENDERER class SymbolLayerTweaker; using SymbolLayerTweakerPtr = std::shared_ptr; -#endif // MLN_DRAWABLE_RENDERER class RenderSymbolLayer final : public RenderLayer { public: @@ -90,7 +86,6 @@ class RenderSymbolLayer final : public RenderLayer { static style::TextPaintProperties::PossiblyEvaluated textPaintProperties( const style::SymbolPaintProperties::PossiblyEvaluated&); -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer void update(gfx::ShaderRegistry&, gfx::Context&, @@ -102,10 +97,7 @@ class RenderSymbolLayer final : public RenderLayer { /// Remove all the drawables for tiles std::size_t removeAllDrawables() override; -#endif // MLN_DRAWABLE_RENDERER - protected: -#if MLN_DRAWABLE_RENDERER /// @brief Called by the RenderOrchestrator during RenderTree construction. /// This event is run to indicate if the layer should render or not for the current frame. /// @param willRender Indicates if this layer should render or not @@ -124,18 +116,12 @@ class RenderSymbolLayer final : public RenderLayer { /// Remove all drawables for the tile from the layer group std::size_t removeTile(RenderPass, const OverscaledTileID&) override; -#endif // MLN_DRAWABLE_RENDERER - private: void transition(const TransitionParameters&) override; void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; bool hasCrossfade() const override; -#if MLN_LEGACY_RENDERER - void render(PaintParameters&) override; -#endif // MLN_LEGACY_RENDERER - void prepare(const LayerPrepareParameters&) override; private: @@ -147,12 +133,6 @@ class RenderSymbolLayer final : public RenderLayer { bool hasFormatSectionOverrides = false; -#if MLN_LEGACY_RENDERER - // Programs - Programs programs; -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER gfx::ShaderGroupPtr symbolIconGroup; gfx::ShaderGroupPtr symbolSDFGroup; gfx::ShaderGroupPtr symbolTextAndIconGroup; @@ -162,7 +142,6 @@ class RenderSymbolLayer final : public RenderLayer { std::shared_ptr collisionTileLayerGroup; LayerTweakerPtr collisionLayerTweaker; -#endif // MLN_DRAWABLE_RENDERER }; } // namespace mbgl diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index b34e8113f371..ab2bb50c5578 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -120,13 +120,6 @@ class PaintPropertyBinder { virtual void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) = 0; -#if MLN_LEGACY_RENDERER - virtual void upload(gfx::UploadPass&) = 0; - - virtual std::tuple>...> attributeBinding( - const PossiblyEvaluatedType& currentValue) const = 0; -#endif // MLN_LEGACY_RENDERER - virtual void setPatternParameters(const std::optional&, const std::optional&, const CrossfadeParameters&) = 0; @@ -167,15 +160,6 @@ class ConstantPaintPropertyBinder : public PaintPropertyBinder> attributeBinding( - const PossiblyEvaluatedPropertyValue&) const override { - return {}; - } -#endif // MLN_LEGACY_RENDERER - void setPatternParameters(const std::optional&, const std::optional&, const CrossfadeParameters&) override {} @@ -219,15 +203,6 @@ class ConstantCrossFadedPaintPropertyBinder final const style::expression::Value&) override {} void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) override {} -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass&) override {} - - std::tuple, std::optional> attributeBinding( - const PossiblyEvaluatedPropertyValue>&) const override { - return {}; - } -#endif // MLN_LEGACY_RENDERER - void setPatternParameters(const std::optional& posA, const std::optional& posB, const CrossfadeParameters&) override { @@ -331,19 +306,6 @@ class SourceFunctionPaintPropertyBinder final : public PaintPropertyBinder> attributeBinding( - const PossiblyEvaluatedPropertyValue& currentValue) const override { - if (currentValue.isConstant()) { - return {}; - } else { - return std::tuple>{gfx::attributeBinding(*vertexBuffer)}; - } - } -#endif // MLN_LEGACY_RENDERER - std::tuple interpolationFactor(float) const override { return std::tuple{0.0f}; } std::tuple uniformValue(const PossiblyEvaluatedPropertyValue& currentValue) const override { @@ -371,10 +333,6 @@ class SourceFunctionPaintPropertyBinder final : public PaintPropertyBinder sharedVertexVector = std::make_shared>(); gfx::VertexVector& vertexVector = *sharedVertexVector; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; -#endif // MLN_LEGACY_RENDERER - FeatureVertexRangeMap featureMap; }; @@ -469,19 +427,6 @@ class CompositeFunctionPaintPropertyBinder final vertexVector.updateModified(); } -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass& uploadPass) override { vertexBuffer = uploadPass.createVertexBuffer(vertexVector); } - - std::tuple> attributeBinding( - const PossiblyEvaluatedPropertyValue& currentValue) const override { - if (currentValue.isConstant()) { - return {}; - } else { - return std::tuple>{gfx::attributeBinding(*vertexBuffer)}; - } - } -#endif // MLN_LEGACY_RENDERER - std::tuple interpolationFactor(float currentZoom) const override { const float possiblyRoundedZoom = expression.getUseIntegerZoom() ? std::floor(currentZoom) : currentZoom; @@ -516,10 +461,6 @@ class CompositeFunctionPaintPropertyBinder final gfx::VertexVectorPtr sharedVertexVector = std::make_shared>(); gfx::VertexVector& vertexVector = *sharedVertexVector; -#if MLN_LEGACY_RENDERER - std::optional> vertexBuffer; -#endif // MLN_LEGACY_RENDERER - FeatureVertexRangeMap featureMap; }; @@ -586,36 +527,6 @@ class CompositeCrossFadedPaintPropertyBinder final void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) override {} -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass& uploadPass) override { - if (!patternToVertexVector.empty()) { - assert(!zoomInVertexVector.empty()); - assert(!zoomOutVertexVector.empty()); - patternToVertexBuffer = uploadPass.createVertexBuffer(patternToVertexVector); - zoomInVertexBuffer = uploadPass.createVertexBuffer(zoomInVertexVector); - zoomOutVertexBuffer = uploadPass.createVertexBuffer(zoomOutVertexVector); - } - } - - std::tuple, std::optional> attributeBinding( - const PossiblyEvaluatedPropertyValue>& currentValue) const override { - if (currentValue.isConstant()) { - return {}; - } else { - if (patternToVertexBuffer) { - assert(zoomInVertexBuffer); - assert(zoomOutVertexBuffer); - return std::tuple, std::optional>{ - gfx::attributeBinding(*patternToVertexBuffer), - gfx::attributeBinding(crossfade.fromScale == 2 ? *zoomInVertexBuffer : *zoomOutVertexBuffer)}; - } - - return std::tuple, std::optional>{std::nullopt, - std::nullopt}; - } - } -#endif // MLN_LEGACY_RENDERER - std::tuple interpolationFactor(float) const override { return std::tuple{0.0f, 0.0f}; } std::tuple, std::array> uniformValue( @@ -648,12 +559,6 @@ class CompositeCrossFadedPaintPropertyBinder final gfx::VertexVector zoomInVertexVector; gfx::VertexVector zoomOutVertexVector; -#if MLN_LEGACY_RENDERER - std::optional> patternToVertexBuffer; - std::optional> zoomInVertexBuffer; - std::optional> zoomOutVertexBuffer; -#endif // MLN_LEGACY_RENDERER - CrossfadeParameters crossfade; }; @@ -780,10 +685,6 @@ class PaintPropertyBinders> : public PaintPropertyBindersBase { util::ignore({(binders.template get()->setPatternParameters(posA, posB, crossfade), 0)...}); } -#if MLN_LEGACY_RENDERER - void upload(gfx::UploadPass& uploadPass) { util::ignore({(binders.template get()->upload(uploadPass), 0)...}); } -#endif // MLN_LEGACY_RENDERER - template using ZoomInterpolatedAttributeList = typename Property

::ZoomInterpolatedAttributeList; template diff --git a/src/mbgl/renderer/pattern_atlas.cpp b/src/mbgl/renderer/pattern_atlas.cpp index 4f80e155f172..5f10ff98a6b4 100644 --- a/src/mbgl/renderer/pattern_atlas.cpp +++ b/src/mbgl/renderer/pattern_atlas.cpp @@ -1,9 +1,7 @@ #include #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif namespace mbgl { @@ -67,7 +65,7 @@ std::optional PatternAtlas::addPattern(const style::Image::Impl& dirty = true; - return patterns.emplace(image.id, Pattern{bin, {*bin, image}}).first->second.position; + return patterns.emplace(image.id, Pattern{.bin = bin, .position = {*bin, image}}).first->second.position; } void PatternAtlas::removePattern(const std::string& id) { @@ -90,7 +88,6 @@ Size PatternAtlas::getPixelSize() const { } void PatternAtlas::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { -#if MLN_DRAWABLE_RENDERER if (!atlasTexture2D) { atlasTexture2D = uploadPass.getContext().createTexture2D(); if (atlasTexture2D) { @@ -99,29 +96,11 @@ void PatternAtlas::upload([[maybe_unused]] gfx::UploadPass& uploadPass) { } else if (dirty) { atlasTexture2D->upload(atlasImage); } -#else - if (!atlasTexture) { - atlasTexture = uploadPass.createTexture(atlasImage); - } else if (dirty) { - uploadPass.updateTexture(*atlasTexture, atlasImage); - } -#endif dirty = false; } -#if MLN_LEGACY_RENDERER -// @note: Deprecated -gfx::TextureBinding PatternAtlas::textureBinding() const { - assert(atlasTexture); - assert(!dirty); - return {atlasTexture->getResource(), gfx::TextureFilterType::Linear}; -} -#endif - -#if MLN_DRAWABLE_RENDERER const std::shared_ptr& PatternAtlas::texture() const { return atlasTexture2D; } -#endif } // namespace mbgl diff --git a/src/mbgl/renderer/pattern_atlas.hpp b/src/mbgl/renderer/pattern_atlas.hpp index a782a7917ffe..311be87d1d21 100644 --- a/src/mbgl/renderer/pattern_atlas.hpp +++ b/src/mbgl/renderer/pattern_atlas.hpp @@ -15,9 +15,7 @@ template class Actor; namespace gfx { -#if MLN_DRAWABLE_RENDERER class Texture2D; -#endif class UploadPass; } // namespace gfx @@ -32,11 +30,7 @@ class PatternAtlas { std::optional addPattern(const style::Image::Impl&); void removePattern(const std::string&); -#if MLN_DRAWABLE_RENDERER const std::shared_ptr& texture() const; -#else - gfx::TextureBinding textureBinding() const; // @TODO: Migrate -#endif void upload(gfx::UploadPass&); Size getPixelSize() const; @@ -53,11 +47,7 @@ class PatternAtlas { mapbox::ShelfPack shelfPack; std::unordered_map patterns; PremultipliedImage atlasImage; -#if MLN_DRAWABLE_RENDERER std::shared_ptr atlasTexture2D{nullptr}; -#else - std::optional atlasTexture; -#endif bool dirty = true; }; diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index 070599044aa9..a3ebff97a3a9 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -11,9 +11,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif namespace mbgl { @@ -62,16 +60,13 @@ void RenderLayer::prepare(const LayerPrepareParameters& params) { renderTilesOwner = params.source->getRawRenderTiles(); addRenderPassesFromTiles(); -#if MLN_DRAWABLE_RENDERER updateRenderTileIDs(); -#endif // MLN_DRAWABLE_RENDERER } std::optional RenderLayer::getSolidBackground() const { return std::nullopt; } -#if MLN_DRAWABLE_RENDERER void RenderLayer::layerChanged(const TransitionParameters&, const Immutable&, UniqueChangeRequestVec&) { @@ -88,7 +83,6 @@ void RenderLayer::layerRemoved(UniqueChangeRequestVec& changes) { removeAllDrawables(); activateLayerGroup(layerGroup, false, changes); } -#endif void RenderLayer::markContextDestroyed() { // no-op @@ -142,7 +136,6 @@ const LayerRenderData* RenderLayer::getRenderDataForPass(const RenderTile& tile, return nullptr; } -#if MLN_DRAWABLE_RENDERER std::size_t RenderLayer::removeTile(RenderPass renderPass, const OverscaledTileID& tileID) { if (const auto tileGroup = static_cast(layerGroup.get())) { const auto n = tileGroup->removeDrawables(renderPass, tileID).size(); @@ -238,7 +231,6 @@ void RenderLayer::activateLayerGroup(const LayerGroupBasePtr& layerGroup_, } } } -#endif bool RenderLayer::applyColorRamp(const style::ColorRampPropertyValue& colorValue, PremultipliedImage& image) { if (colorValue.isUndefined()) { diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 417d17503258..418f19a67473 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -6,12 +6,10 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include #include -#endif // MLN_DRAWABLE_RENDERER #include #include @@ -32,12 +30,10 @@ class TransitionParameters; class UpdateParameters; class UploadParameters; -#if MLN_DRAWABLE_RENDERER class ChangeRequest; using LayerGroupBasePtr = std::shared_ptr; using UniqueChangeRequest = std::unique_ptr; using UniqueChangeRequestVec = std::vector; -#endif namespace gfx { class Context; @@ -45,10 +41,8 @@ class ShaderGroup; class ShaderRegistry; using ShaderGroupPtr = std::shared_ptr; -#if MLN_DRAWABLE_RENDERER class UniformBuffer; using UniformBufferPtr = std::shared_ptr; -#endif } // namespace gfx namespace style { @@ -161,7 +155,6 @@ class RenderLayer { // TODO: Only for background layers. virtual std::optional getSolidBackground() const; -#if MLN_DRAWABLE_RENDERER /// Generate any changes needed by the layer virtual void update(gfx::ShaderRegistry&, gfx::Context&, @@ -194,7 +187,6 @@ class RenderLayer { /// Remove all the drawables for tiles virtual std::size_t removeAllDrawables(); -#endif using Dependency = style::expression::Dependency; Dependency getStyleDependencies() const { return styleDependencies; } @@ -208,7 +200,6 @@ class RenderLayer { const LayerRenderData* getRenderDataForPass(const RenderTile&, RenderPass) const; -#if MLN_DRAWABLE_RENDERER void setLayerGroup(LayerGroupBasePtr, UniqueChangeRequestVec&); /// (Un-)Register the layer group with the orchestrator @@ -268,8 +259,6 @@ class RenderLayer { /// unchanged bool setRenderTileBucketID(const OverscaledTileID&, util::SimpleIdentity bucketID); -#endif // MLN_DRAWABLE_RENDERER - static bool applyColorRamp(const style::ColorRampPropertyValue&, PremultipliedImage&); protected: @@ -285,7 +274,6 @@ class RenderLayer { LayerPlacementData placementData; -#if MLN_DRAWABLE_RENDERER // will need to be overriden to handle their activation. LayerGroupBasePtr layerGroup; @@ -299,7 +287,6 @@ class RenderLayer { using RenderTileIDMap = util::TinyUnorderedMap; RenderTileIDMap renderTileIDs; RenderTileIDMap newRenderTileIDs; -#endif // Current layer index as specified by the layerIndexChanged event int32_t layerIndex{0}; diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 83cb534b4928..2e6190877336 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -2,9 +2,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif #include #include #include @@ -53,9 +51,7 @@ const std::string& LayerRenderItem::getName() const { return layer.get().getID(); } -#if MLN_DRAWABLE_RENDERER void LayerRenderItem::updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const {}; -#endif namespace { @@ -181,23 +177,24 @@ std::unique_ptr RenderOrchestrator::createRenderTree( const TransitionOptions transitionOptions = isMapModeContinuous ? updateParameters->transitionOptions : TransitionOptions(); - const TransitionParameters transitionParameters{updateParameters->timePoint, transitionOptions}; + const TransitionParameters transitionParameters{.now = updateParameters->timePoint, + .transition = transitionOptions}; const auto transitionDuration = transitionOptions.duration.value_or( isMapModeContinuous ? util::DEFAULT_TRANSITION_DURATION : Duration::zero()); PropertyEvaluationParameters evaluationParameters{zoomHistory, updateParameters->timePoint, transitionDuration}; evaluationParameters.zoomChanged = zoomChanged; - const TileParameters tileParameters{updateParameters->pixelRatio, - updateParameters->debugOptions, - updateParameters->transformState, - updateParameters->fileSource, - updateParameters->mode, - updateParameters->annotationManager, - imageManager, - glyphManager, - updateParameters->prefetchZoomDelta, - threadPool}; + const TileParameters tileParameters{.pixelRatio = updateParameters->pixelRatio, + .debugOptions = updateParameters->debugOptions, + .transformState = updateParameters->transformState, + .fileSource = updateParameters->fileSource, + .mode = updateParameters->mode, + .annotationManager = updateParameters->annotationManager, + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = updateParameters->prefetchZoomDelta, + .threadPool = threadPool}; glyphManager->setURL(updateParameters->glyphURL); @@ -246,18 +243,14 @@ std::unique_ptr RenderOrchestrator::createRenderTree( layerImpls = updateParameters->layers; const bool layersAddedOrRemoved = !layerDiff.added.empty() || !layerDiff.removed.empty(); -#if MLN_DRAWABLE_RENDERER std::vector> changes; -#endif // Remove render layers for removed layers. for (const auto& entry : layerDiff.removed) { MLN_TRACE_ZONE(remove layer); const auto hit = renderLayers.find(entry.first); if (hit != renderLayers.end()) { -#if MLN_DRAWABLE_RENDERER hit->second->layerRemoved(changes); -#endif renderLayers.erase(hit); } } @@ -276,10 +269,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree( if (const auto& renderLayer = renderLayers.at(entry.first)) { const auto& newLayer = entry.second.after; -#if MLN_DRAWABLE_RENDERER renderLayer->layerChanged(transitionParameters, newLayer, changes); -#endif // MLN_DRAWABLE_RENDERER - renderLayer->transition(transitionParameters, newLayer); } } @@ -293,10 +283,8 @@ std::unique_ptr RenderOrchestrator::createRenderTree( assert(layer); orderedLayers.emplace_back(*layer); -#if MLN_DRAWABLE_RENDERER // We're mutating the list of ordered layers and must notify them of their new assigned indices layer->layerIndexChanged(layerIndex++, changes); -#endif } } assert(orderedLayers.size() == renderLayers.size()); @@ -364,10 +352,8 @@ std::unique_ptr RenderOrchestrator::createRenderTree( filteredLayersForSource.reserve(layerImpls->size()); } -#if MLN_DRAWABLE_RENDERER // Track which layers are flagged for rendering std::vector updateList(orderedLayers.size()); -#endif // Update all sources and initialize renderItems. for (const auto& sourceImpl : *sourceImpls) { @@ -397,9 +383,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree( sourceNeedsRendering = true; renderItemsEmplaceHint = layerRenderItems.emplace_hint( renderItemsEmplaceHint, layer, source, static_cast(index)); -#if MLN_DRAWABLE_RENDERER updateList[index] = true; -#endif } } } @@ -418,15 +402,12 @@ std::unique_ptr RenderOrchestrator::createRenderTree( } renderItemsEmplaceHint = layerRenderItems.emplace_hint( renderItemsEmplaceHint, layer, nullptr, static_cast(index)); -#if MLN_DRAWABLE_RENDERER updateList[index] = true; -#endif } } source->update(sourceImpl, filteredLayersForSource, sourceNeedsRendering, sourceNeedsRelayout, tileParameters); filteredLayersForSource.clear(); -#if MLN_DRAWABLE_RENDERER // Update all layers with their new renderability status, if it changed. for (size_t i = 0; i < updateList.size(); i++) { if (orderedLayers[i].get().isLayerRenderable() != updateList[i]) { @@ -434,7 +415,6 @@ std::unique_ptr RenderOrchestrator::createRenderTree( } } addChanges(changes); -#endif } renderTreeParameters->loaded = updateParameters->styleLoaded && isLoaded(); @@ -446,8 +426,9 @@ std::unique_ptr RenderOrchestrator::createRenderTree( for (const auto& entry : renderSources) { MLN_TRACE_ZONE(prepare source); if (entry.second->isEnabled()) { - entry.second->prepare( - {renderTreeParameters->transformParams, updateParameters->debugOptions, *imageManager}); + entry.second->prepare({.transform = renderTreeParameters->transformParams, + .debugOptions = updateParameters->debugOptions, + .imageManager = *imageManager}); } } @@ -457,8 +438,11 @@ std::unique_ptr RenderOrchestrator::createRenderTree( MLN_TRACE_ZONE(prepare layer); MLN_ZONE_STR(renderLayer.getID()); - renderLayer.prepare( - {renderItem.source, *imageManager, *patternAtlas, *lineAtlas, updateParameters->transformState}); + renderLayer.prepare({.source = renderItem.source, + .imageManager = *imageManager, + .patternAtlas = *patternAtlas, + .lineAtlas = *lineAtlas, + .state = updateParameters->transformState}); if (renderLayer.needsPlacement()) { layersNeedPlacement.emplace_back(renderLayer); } @@ -869,7 +853,6 @@ void RenderOrchestrator::clearData() { if (!layerImpls->empty()) layerImpls = makeMutable>>(); if (!imageImpls->empty()) imageImpls = makeMutable>>(); -#if MLN_DRAWABLE_RENDERER UniqueChangeRequestVec changes; for (const auto& entry : renderLayers) { entry.second->layerRemoved(changes); @@ -877,7 +860,6 @@ void RenderOrchestrator::clearData() { addChanges(changes); debugLayerGroups.clear(); -#endif renderSources.clear(); renderLayers.clear(); @@ -891,7 +873,6 @@ void RenderOrchestrator::clearData() { glyphManager->evict(fontStacks(*layerImpls)); } -#if MLN_DRAWABLE_RENDERER void RenderOrchestrator::addChanges(UniqueChangeRequestVec& changes) { pendingChanges.insert( pendingChanges.end(), std::make_move_iterator(changes.begin()), std::make_move_iterator(changes.end())); @@ -1028,8 +1009,6 @@ void RenderOrchestrator::updateDebugLayerGroups(const RenderTree& renderTree, Pa } } -#endif // MLN_DRAWABLE_RENDERER - void RenderOrchestrator::onGlyphsLoaded(const FontStack& fontStack, const GlyphRange& range) { observer->onGlyphsLoaded(fontStack, range); } diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 132c75996da7..9e7738305f5d 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -1,7 +1,6 @@ #pragma once -#if MLN_DRAWABLE_RENDERER + #include -#endif #include #include #include @@ -24,9 +23,7 @@ #include namespace mbgl { -#if MLN_DRAWABLE_RENDERER class ChangeRequest; -#endif class RendererObserver; class RenderSource; class UpdateParameters; @@ -42,10 +39,8 @@ class RenderTree; namespace gfx { class ShaderRegistry; -#if MLN_DRAWABLE_RENDERER class Drawable; using DrawablePtr = std::shared_ptr; -#endif } // namespace gfx namespace style { @@ -106,7 +101,6 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage void update(const std::shared_ptr&); -#if MLN_DRAWABLE_RENDERER bool addLayerGroup(LayerGroupBasePtr); bool removeLayerGroup(const LayerGroupBasePtr&); size_t numLayerGroups() const noexcept; @@ -158,7 +152,6 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage } } } -#endif const ZoomHistory& getZoomHistory() const { return zoomHistory; } @@ -193,10 +186,8 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage void onStyleImageMissing(const std::string&, const std::function&) override; void onRemoveUnusedStyleImages(const std::vector&) override; -#if MLN_DRAWABLE_RENDERER /// Move changes into the pending set, clearing the provided collection void addChanges(UniqueChangeRequestVec&); -#endif RendererObserver* observer; @@ -236,7 +227,6 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage TaggedScheduler threadPool; -#if MLN_DRAWABLE_RENDERER std::vector> pendingChanges; using LayerGroupMap = std::multimap; @@ -244,7 +234,6 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage std::vector renderTargets; RenderItem::DebugLayerGroupMap debugLayerGroups; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/render_static_data.cpp b/src/mbgl/renderer/render_static_data.cpp index 33d8581794d6..519837736fc7 100644 --- a/src/mbgl/renderer/render_static_data.cpp +++ b/src/mbgl/renderer/render_static_data.cpp @@ -91,11 +91,6 @@ void RenderStaticData::upload(gfx::UploadPass& uploadPass) { tileVertices(), gfx::BufferUsageType::StaticDraw, /*persistent=*/false); quadTriangleIndexBuffer = uploadPass.createIndexBuffer( quadTriangleIndices(), gfx::BufferUsageType::StaticDraw, /*persistent=*/false); -#if MLN_LEGACY_RENDERER - rasterVertexBuffer = uploadPass.createVertexBuffer(rasterVertices()); - heatmapTextureVertexBuffer = uploadPass.createVertexBuffer(heatmapTextureVertices()); - tileBorderIndexBuffer = uploadPass.createIndexBuffer(tileLineStripIndices()); -#endif // MLN_LEGACY_RENDERER uploaded = true; } } diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index 2ada89a46e55..dc26fef755be 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -96,7 +96,6 @@ std::optional RenderTile::getPattern(const std::string& pattern) return renderData->getPattern(pattern); } -#if MLN_DRAWABLE_RENDERER static const gfx::Texture2DPtr noTexture; bool RenderTile::hasGlyphAtlasTexture() const { @@ -120,28 +119,6 @@ const std::shared_ptr& RenderTile::getAtlasTextures() const { return renderData ? renderData->getAtlasTextures() : noAtlas; } -#else -gfx::TextureBinding RenderTile::getGlyphAtlasTextureBinding(gfx::TextureFilterType filter) const { - assert(renderData); - return {getGlyphAtlasTexture()->getResource(), filter}; -} - -gfx::TextureBinding RenderTile::getIconAtlasTextureBinding(gfx::TextureFilterType filter) const { - assert(renderData); - return {getIconAtlasTexture()->getResource(), filter}; -} - -const gfx::Texture* RenderTile::getGlyphAtlasTexture() const { - assert(renderData); - return &renderData->getGlyphAtlasTexture(); -} - -const gfx::Texture* RenderTile::getIconAtlasTexture() const { - assert(renderData); - return &renderData->getIconAtlasTexture(); -} -#endif - void RenderTile::upload(gfx::UploadPass& uploadPass) const { assert(renderData); renderData->upload(uploadPass); diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index b7daa24706a2..53d88ea4f2d6 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -14,10 +14,8 @@ namespace mbgl { namespace gfx { -#if MLN_DRAWABLE_RENDERER class Texture2D; using Texture2DPtr = std::shared_ptr; -#endif class UploadPass; } // namespace gfx @@ -62,7 +60,6 @@ class RenderTile final { const LayerRenderData* getLayerRenderData(const style::Layer::Impl&) const; std::optional getPattern(const std::string& pattern) const; -#if MLN_DRAWABLE_RENDERER bool hasGlyphAtlasTexture() const; const gfx::Texture2DPtr& getGlyphAtlasTexture() const; @@ -72,13 +69,6 @@ class RenderTile final { const std::shared_ptr& getAtlasTextures() const; bool getNeedsRendering() const { return needsRendering; }; -#else - gfx::TextureBinding getGlyphAtlasTextureBinding(gfx::TextureFilterType) const; - gfx::TextureBinding getIconAtlasTextureBinding(gfx::TextureFilterType) const; - - const gfx::Texture* getGlyphAtlasTexture() const; - const gfx::Texture* getIconAtlasTexture() const; -#endif void upload(gfx::UploadPass&) const; void prepare(const SourcePrepareParameters&); diff --git a/src/mbgl/renderer/render_tree.hpp b/src/mbgl/renderer/render_tree.hpp index bf106e5e72e5..25ed16be8a59 100644 --- a/src/mbgl/renderer/render_tree.hpp +++ b/src/mbgl/renderer/render_tree.hpp @@ -1,7 +1,5 @@ #pragma once -#if MLN_DRAWABLE_RENDERER #include -#endif #include #include @@ -38,9 +36,7 @@ class RenderItem { virtual void render(PaintParameters&) const = 0; virtual bool hasRenderPass(RenderPass) const = 0; virtual const std::string& getName() const = 0; -#if MLN_DRAWABLE_RENDERER virtual void updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const = 0; -#endif }; class RenderSource; @@ -58,9 +54,7 @@ class LayerRenderItem final : public RenderItem { void upload(gfx::UploadPass& pass) const override; void render(PaintParameters& parameters) const override; const std::string& getName() const override; -#if MLN_DRAWABLE_RENDERER void updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const override; -#endif }; using RenderItems = std::vector>; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index f28165ca2c85..3186e50170b5 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -19,14 +19,10 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include -#include -#endif // MLN_DRAWABLE_RENDERER - #if MLN_RENDER_BACKEND_METAL #include #include @@ -38,9 +34,7 @@ constexpr auto CaptureFrameStart = 0; // frames are 0-based constexpr auto CaptureFrameCount = 1; #elif MLN_RENDER_BACKEND_OPENGL #include -#if MLN_DRAWABLE_RENDERER #include -#endif // MLN_DRAWABLE_RENDERER #endif // !MLN_RENDER_BACKEND_METAL namespace mbgl { @@ -169,11 +163,9 @@ void Renderer::Impl::render(const RenderTree& renderTree, // Initialize legacy shader programs staticData->programs.registerWith(*staticData->shaders); -#if MLN_DRAWABLE_RENDERER // Initialize shaders for drawables const auto programParameters = ProgramParameters{pixelRatio, false}; backend.initShaders(*staticData->shaders, programParameters); -#endif // Notify post-shader registration observer->onRegisterShaders(*staticData->shaders); @@ -206,11 +198,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, parameters.opaquePassCutoff = renderTreeParameters.opaquePassCutOff; const auto& sourceRenderItems = renderTree.getSourceRenderItems(); -#if MLN_DRAWABLE_RENDERER const auto& layerRenderItems = renderTree.getLayerRenderItemMap(); -#else - const auto& layerRenderItems = renderTree.getLayerRenderItems(); -#endif // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. @@ -233,7 +221,6 @@ void Renderer::Impl::render(const RenderTree& renderTree, renderTree.getPatternAtlas().upload(*uploadPass); } -#if MLN_DRAWABLE_RENDERER // - LAYER GROUP UPDATE ------------------------------------------------------------------------ // Updates all layer groups and process changes if (staticData && staticData->shaders) { @@ -279,19 +266,18 @@ void Renderer::Impl::render(const RenderTree& renderTree, const Size atlasSize = parameters.patternAtlas.getPixelSize(); const auto& worldSize = parameters.staticData.backendSize; const shaders::GlobalPaintParamsUBO globalPaintParamsUBO = { - /* .pattern_atlas_texsize = */ {static_cast(atlasSize.width), static_cast(atlasSize.height)}, - /* .units_to_pixels = */ {1.0f / parameters.pixelsToGLUnits[0], 1.0f / parameters.pixelsToGLUnits[1]}, - /* .world_size = */ {static_cast(worldSize.width), static_cast(worldSize.height)}, - /* .camera_to_center_distance = */ parameters.state.getCameraToCenterDistance(), - /* .symbol_fade_change = */ parameters.symbolFadeChange, - /* .aspect_ratio = */ parameters.state.getSize().aspectRatio(), - /* .pixel_ratio = */ parameters.pixelRatio, - /* .map_zoom = */ static_cast(parameters.state.getZoom()), - /* .pad1 = */ 0, + .pattern_atlas_texsize = {static_cast(atlasSize.width), static_cast(atlasSize.height)}, + .units_to_pixels = {1.0f / parameters.pixelsToGLUnits[0], 1.0f / parameters.pixelsToGLUnits[1]}, + .world_size = {static_cast(worldSize.width), static_cast(worldSize.height)}, + .camera_to_center_distance = parameters.state.getCameraToCenterDistance(), + .symbol_fade_change = parameters.symbolFadeChange, + .aspect_ratio = parameters.state.getSize().aspectRatio(), + .pixel_ratio = parameters.pixelRatio, + .map_zoom = static_cast(parameters.state.getZoom()), + .pad1 = 0, }; auto& globalUniforms = context.mutableGlobalUniformBuffers(); globalUniforms.createOrUpdate(shaders::idGlobalPaintParamsUBO, &globalPaintParamsUBO, context); -#endif // - 3D PASS // ------------------------------------------------------------------------------------- @@ -315,7 +301,6 @@ void Renderer::Impl::render(const RenderTree& renderTree, } }; -#if MLN_DRAWABLE_RENDERER const auto drawable3DPass = [&] { const auto debugGroup(parameters.encoder->createDebugGroup("drawables-3d")); assert(parameters.pass == RenderPass::Pass3D); @@ -329,30 +314,12 @@ void Renderer::Impl::render(const RenderTree& renderTree, } }); }; -#endif // MLN_DRAWABLE_RENDERER -#if MLN_LEGACY_RENDERER - const auto renderLayer3DPass = [&] { - const auto debugGroup(parameters.encoder->createDebugGroup("3d")); - int32_t i = static_cast(layerRenderItems.size()) - 1; - for (auto it = layerRenderItems.begin(); it != layerRenderItems.end() && i >= 0; ++it, --i) { - parameters.currentLayer = i; - const RenderItem& renderItem = it->get(); - if (renderItem.hasRenderPass(parameters.pass)) { - const auto layerDebugGroup(parameters.encoder->createDebugGroup(renderItem.getName().c_str())); - renderItem.render(parameters); - } - } - }; -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER const auto drawableTargetsPass = [&] { // draw render targets orchestrator.visitRenderTargets( [&](RenderTarget& renderTarget) { renderTarget.render(orchestrator, renderTree, parameters); }); }; -#endif const auto commonClearPass = [&] { // - CLEAR @@ -367,12 +334,15 @@ void Renderer::Impl::render(const RenderTree& renderTree, color = renderTreeParameters.backgroundColor; } parameters.renderPass = parameters.encoder->createRenderPass( - "main buffer", {parameters.backend.getDefaultRenderable(), color, 1.0f, 0}); + "main buffer", + {.renderable = parameters.backend.getDefaultRenderable(), + .clearColor = color, + .clearDepth = 1.0f, + .clearStencil = 0}); } }; // Actually render the layers -#if MLN_DRAWABLE_RENDERER // Drawables const auto drawableOpaquePass = [&] { const auto debugGroup(parameters.renderPass->createDebugGroup("drawables-opaque")); @@ -416,47 +386,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, } } }; -#endif - -#if MLN_LEGACY_RENDERER - // Render everything top-to-bottom by using reverse iterators. Render opaque objects first. - const auto renderLayerOpaquePass = [&] { - const auto debugGroup(parameters.renderPass->createDebugGroup("opaque")); - parameters.pass = RenderPass::Opaque; - parameters.depthRangeSize = 1 - (layerRenderItems.size() + 2) * PaintParameters::numSublayers * - PaintParameters::depthEpsilon; - - uint32_t i = 0; - for (auto it = layerRenderItems.rbegin(); it != layerRenderItems.rend(); ++it, ++i) { - parameters.currentLayer = i; - const RenderItem& renderItem = it->get(); - if (renderItem.hasRenderPass(parameters.pass)) { - const auto layerDebugGroup(parameters.renderPass->createDebugGroup(renderItem.getName().c_str())); - renderItem.render(parameters); - } - } - }; - - // Make a second pass, rendering translucent objects. This time, we render bottom-to-top. - const auto renderLayerTranslucentPass = [&] { - const auto debugGroup(parameters.renderPass->createDebugGroup("translucent")); - parameters.pass = RenderPass::Translucent; - parameters.depthRangeSize = 1 - (layerRenderItems.size() + 2) * PaintParameters::numSublayers * - PaintParameters::depthEpsilon; - int32_t i = static_cast(layerRenderItems.size()) - 1; - for (auto it = layerRenderItems.begin(); it != layerRenderItems.end() && i >= 0; ++it, --i) { - parameters.currentLayer = i; - const RenderItem& renderItem = it->get(); - if (renderItem.hasRenderPass(parameters.pass)) { - const auto layerDebugGroup(parameters.renderPass->createDebugGroup(renderItem.getName().c_str())); - renderItem.render(parameters); - } - } - }; -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER const auto drawableDebugOverlays = [&] { // Renders debug overlays. { @@ -468,36 +398,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, }); } }; -#endif // MLN_DRAWABLE_RENDERER -#if MLN_LEGACY_RENDERER - const auto renderDebugOverlays = [&] { - // Renders debug overlays. - { - const auto debugGroup(parameters.renderPass->createDebugGroup("debug")); - - // Finalize the rendering, e.g. by calling debug render calls per tile. - // This guarantees that we have at least one function per tile called. - // When only rendering layers via the stylesheet, it's possible that we - // don't ever visit a tile during rendering. - for (const RenderItem& renderItem : sourceRenderItems) { - renderItem.render(parameters); - } - } - -#if !defined(NDEBUG) - if (parameters.debugOptions & MapDebugOptions::StencilClip) { - // Render tile clip boundaries, using stencil buffer to calculate fill color. - parameters.context.visualizeStencilBuffer(); - } else if (parameters.debugOptions & MapDebugOptions::DepthBuffer) { - // Render the depth buffer. - parameters.context.visualizeDepthBuffer(parameters.depthRangeSize); - } -#endif - }; -#endif // MLN_LEGACY_RENDERER - -#if (MLN_DRAWABLE_RENDERER && !MLN_LEGACY_RENDERER) if (parameters.staticData.has3D) { common3DPass(); drawable3DPass(); @@ -508,24 +409,10 @@ void Renderer::Impl::render(const RenderTree& renderTree, drawableOpaquePass(); drawableTranslucentPass(); drawableDebugOverlays(); -#elif (MLN_LEGACY_RENDERER && !MLN_DRAWABLE_RENDERER) - if (parameters.staticData.has3D) { - common3DPass(); - renderLayer3DPass(); - } - commonClearPass(); - renderLayerOpaquePass(); - renderLayerTranslucentPass(); - renderDebugOverlays(); -#else - static_assert(0, "Must define one of (MLN_DRAWABLE_RENDERER, MLN_LEGACY_RENDERER)"); -#endif // MLN_LEGACY_RENDERER - -#if MLN_DRAWABLE_RENDERER + // Give the layers a chance to do cleanup orchestrator.visitLayerGroups([&](LayerGroupBase& layerGroup) { layerGroup.postRender(orchestrator, parameters); }); context.unbindGlobalUniformBuffers(*parameters.renderPass); -#endif // Ends the RenderPass parameters.renderPass.reset(); diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index 76c9e71dde39..902719f055af 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -24,14 +24,6 @@ void ImageSourceRenderData::upload(gfx::UploadPass& uploadPass) const { if (bucket && bucket->needsUpload()) { bucket->upload(uploadPass); } - -#if MLN_LEGACY_RENDERER - if (!debugTexture) { - std::array data{{0, 0, 0, 0}}; - static const PremultipliedImage emptyImage{Size(1, 1), data.data(), data.size()}; - debugTexture = uploadPass.createTexture(emptyImage); - } -#endif } void ImageSourceRenderData::render(PaintParameters& parameters) const { @@ -103,9 +95,6 @@ void RenderImageSource::prepare(const SourcePrepareParameters& parameters) { mat4& matrix = matrices[i]; matrix::identity(matrix); transformParams.state.matrixFor(matrix, tileIds[i]); -#if MLN_LEGACY_RENDERER - matrix::multiply(matrix, transformParams.alignedProjMatrix, matrix); -#endif } renderData = std::make_unique(bucket, std::move(matrices), baseImpl->id); } diff --git a/src/mbgl/renderer/sources/render_image_source.hpp b/src/mbgl/renderer/sources/render_image_source.hpp index 96dd8cf2227c..f0e2dc6ea1df 100644 --- a/src/mbgl/renderer/sources/render_image_source.hpp +++ b/src/mbgl/renderer/sources/render_image_source.hpp @@ -25,9 +25,7 @@ class ImageSourceRenderData final : public RenderItem { bool hasRenderPass(RenderPass) const override { return false; } const std::string& getName() const override { return name; } std::string name; -#if MLN_DRAWABLE_RENDERER void updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const override {}; -#endif mutable std::optional debugTexture; }; diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp index 848645c2b8d5..015f1fc05f6a 100644 --- a/src/mbgl/renderer/sources/render_tile_source.cpp +++ b/src/mbgl/renderer/sources/render_tile_source.cpp @@ -10,7 +10,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include #include #include @@ -27,16 +26,12 @@ #include #include -#include - #if MLN_RENDER_BACKEND_METAL || (MLN_RENDER_BACKEND_VULKAN && defined(__ANDROID__)) #define MLN_ENABLE_POLYLINE_DRAWABLES 1 #else #define MLN_ENABLE_POLYLINE_DRAWABLES 0 #endif -#endif - namespace mbgl { using namespace style; @@ -54,8 +49,6 @@ void TileSourceRenderItem::render(PaintParameters& parameters) const { } } -#if MLN_DRAWABLE_RENDERER - #if MLN_ENABLE_POLYLINE_DRAWABLES class PolylineLayerImpl : public Layer::Impl { public: @@ -66,13 +59,13 @@ class PolylineLayerImpl : public Layer::Impl { const LayerTypeInfo* getTypeInfo() const noexcept final { return staticTypeInfo(); } static const LayerTypeInfo* staticTypeInfo() noexcept { - const static LayerTypeInfo typeInfo{"debugPolyline", - LayerTypeInfo::Source::NotRequired, - LayerTypeInfo::Pass3D::NotRequired, - LayerTypeInfo::Layout::NotRequired, - LayerTypeInfo::FadingTiles::NotRequired, - LayerTypeInfo::CrossTileIndex::NotRequired, - LayerTypeInfo::TileKind::NotRequired}; + const static LayerTypeInfo typeInfo{.type = "debugPolyline", + .source = LayerTypeInfo::Source::NotRequired, + .pass3d = LayerTypeInfo::Pass3D::NotRequired, + .layout = LayerTypeInfo::Layout::NotRequired, + .fadingTiles = LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex = LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind = LayerTypeInfo::TileKind::NotRequired}; return &typeInfo; } }; @@ -457,7 +450,6 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr debugLayerGroups.erase(DebugType::Border); } } -#endif RenderTileSource::RenderTileSource(Immutable impl_, const TaggedScheduler& threadPool_) : RenderSource(std::move(impl_)), diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp index d1cbf8fc785b..0256a53829e7 100644 --- a/src/mbgl/renderer/sources/render_tile_source.hpp +++ b/src/mbgl/renderer/sources/render_tile_source.hpp @@ -6,9 +6,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif namespace mbgl { @@ -105,9 +103,7 @@ class TileSourceRenderItem : public RenderItem { bool hasRenderPass(RenderPass) const override { return false; } const std::string& getName() const override { return name; } -#if MLN_DRAWABLE_RENDERER void updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const override; -#endif Immutable> renderTiles; std::string name; diff --git a/src/mbgl/renderer/tile_render_data.cpp b/src/mbgl/renderer/tile_render_data.cpp index aa3a16b79360..0f28afd66e90 100644 --- a/src/mbgl/renderer/tile_render_data.cpp +++ b/src/mbgl/renderer/tile_render_data.cpp @@ -9,7 +9,6 @@ TileRenderData::TileRenderData(std::shared_ptr atlasTextures_ TileRenderData::~TileRenderData() = default; -#if MLN_DRAWABLE_RENDERER static gfx::Texture2DPtr noTexture; const gfx::Texture2DPtr& TileRenderData::getGlyphAtlasTexture() const { @@ -19,19 +18,6 @@ const gfx::Texture2DPtr& TileRenderData::getGlyphAtlasTexture() const { const gfx::Texture2DPtr& TileRenderData::getIconAtlasTexture() const { return atlasTextures ? atlasTextures->icon : noTexture; } -#else -const gfx::Texture& TileRenderData::getGlyphAtlasTexture() const { - assert(atlasTextures); - assert(atlasTextures->glyph); - return *atlasTextures->glyph; -} - -const gfx::Texture& TileRenderData::getIconAtlasTexture() const { - assert(atlasTextures); - assert(atlasTextures->icon); - return *atlasTextures->icon; -} -#endif std::optional TileRenderData::getPattern(const std::string&) const { assert(false); diff --git a/src/mbgl/renderer/tile_render_data.hpp b/src/mbgl/renderer/tile_render_data.hpp index 2a88c2cadde9..0f19d7823d51 100644 --- a/src/mbgl/renderer/tile_render_data.hpp +++ b/src/mbgl/renderer/tile_render_data.hpp @@ -10,10 +10,8 @@ namespace mbgl { namespace gfx { -#if MLN_DRAWABLE_RENDERER class Texture2D; using Texture2DPtr = std::shared_ptr; -#endif class UploadPass; } // namespace gfx @@ -24,26 +22,16 @@ class SourcePrepareParameters; class TileAtlasTextures { public: -#if MLN_DRAWABLE_RENDERER gfx::Texture2DPtr glyph; gfx::Texture2DPtr icon; -#else - std::optional glyph; - std::optional icon; -#endif }; class TileRenderData { public: virtual ~TileRenderData(); -#if MLN_DRAWABLE_RENDERER const gfx::Texture2DPtr& getGlyphAtlasTexture() const; const gfx::Texture2DPtr& getIconAtlasTexture() const; -#else - const gfx::Texture& getGlyphAtlasTexture() const; - const gfx::Texture& getIconAtlasTexture() const; -#endif const std::shared_ptr& getAtlasTextures() const { return atlasTextures; } // To be implemented for concrete tile types. diff --git a/src/mbgl/style/properties.hpp b/src/mbgl/style/properties.hpp index ecbb169dac60..571da06a210d 100644 --- a/src/mbgl/style/properties.hpp +++ b/src/mbgl/style/properties.hpp @@ -338,7 +338,6 @@ class Properties { return result; } -#if MLN_DRAWABLE_RENDERER using GPUExpressions = std::array; /// Update the GPU expressions, if applicable, for each item in the tuple. @@ -347,7 +346,6 @@ class Properties { const auto results = util::to_array(std::make_tuple(updateGPUExpression(exprs, now)...)); return std::any_of(results.begin(), results.end(), [](bool x) { return x; }); } -#endif // MLN_DRAWABLE_RENDERER protected: // gather dependencies for each type that can appear in this tuple @@ -362,7 +360,6 @@ class Properties { return v.getValue().getDependencies(); } -#if MLN_DRAWABLE_RENDERER template bool updateGPUExpression(Unevaluated::GPUExpressions& exprs, TimePoint now) const { constexpr auto index = TypeIndex::value; @@ -407,7 +404,6 @@ class Properties { bool) { return false; } -#endif // MLN_DRAWABLE_RENDERER }; class Transitionable : public Tuple { diff --git a/src/mbgl/style/property_expression.cpp b/src/mbgl/style/property_expression.cpp index 27499f83be8e..f15fe4879fd1 100644 --- a/src/mbgl/style/property_expression.cpp +++ b/src/mbgl/style/property_expression.cpp @@ -3,9 +3,7 @@ #include #include -#if MLN_DRAWABLE_RENDERER #include -#endif // MLN_DRAWABLE_RENDERER namespace mbgl { namespace style { @@ -72,12 +70,10 @@ PropertyExpressionBase& PropertyExpressionBase::operator=(const PropertyExpressi return *this; } -#if MLN_DRAWABLE_RENDERER gfx::UniqueGPUExpression PropertyExpressionBase::getGPUExpression(bool intZoom) const { return isGPUCapable_ ? gfx::GPUExpression::create(*expression, zoomCurve, useIntegerZoom_ || intZoom) : gfx::UniqueGPUExpression{}; } -#endif // MLN_DRAWABLE_RENDERER float PropertyExpressionBase::interpolationFactor(const Range& inputLevels, const float inputValue) const noexcept { diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index ee711c72b7ee..e898ae169c9d 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -96,39 +96,25 @@ void GeometryTileRenderData::upload(gfx::UploadPass& uploadPass) { assert(atlasTextures); if (layoutResult->glyphAtlasImage && layoutResult->glyphAtlasImage->valid()) { -#if MLN_DRAWABLE_RENDERER atlasTextures->glyph = uploadPass.getContext().createTexture2D(); - atlasTextures->glyph->setSamplerConfiguration( - {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); + atlasTextures->glyph->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, + .wrapU = gfx::TextureWrapType::Clamp, + .wrapV = gfx::TextureWrapType::Clamp}); atlasTextures->glyph->upload(*layoutResult->glyphAtlasImage); -#else - atlasTextures->glyph = uploadPass.createTexture(*layoutResult->glyphAtlasImage); -#endif layoutResult->glyphAtlasImage = {}; } if (layoutResult->iconAtlas.image.valid()) { -#if MLN_DRAWABLE_RENDERER atlasTextures->icon = uploadPass.getContext().createTexture2D(); atlasTextures->icon->upload(layoutResult->iconAtlas.image); -#else - atlasTextures->icon = uploadPass.createTexture(layoutResult->iconAtlas.image); -#endif layoutResult->iconAtlas.image = {}; } if (atlasTextures->icon && !imagePatches.empty()) { for (const auto& imagePatch : imagePatches) { // patch updated images. -#if MLN_DRAWABLE_RENDERER atlasTextures->icon->uploadSubRegion(imagePatch.image->image, imagePatch.paddedRect.x + ImagePosition::padding, imagePatch.paddedRect.y + ImagePosition::padding); -#else - uploadPass.updateTextureSub(*atlasTextures->icon, - imagePatch.image->image, - imagePatch.paddedRect.x + ImagePosition::padding, - imagePatch.paddedRect.y + ImagePosition::padding); -#endif } imagePatches.clear(); } diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp index 3b65f94bfcfd..94c1e7a76107 100644 --- a/src/mbgl/tile/raster_dem_tile.cpp +++ b/src/mbgl/tile/raster_dem_tile.cpp @@ -133,9 +133,7 @@ void RasterDEMTile::backfillBorder(const RasterDEMTile& borderTile, const DEMTil // mark HillshadeBucket.prepared as false so it runs through the prepare // render pass with the new texture data we just backfilled bucket->setPrepared(false); -#if MLN_DRAWABLE_RENDERER bucket->renderTargetPrepared = false; -#endif } } diff --git a/test/BUILD.bazel b/test/BUILD.bazel index 2848fce98cf8..99ce3b78310c 100644 --- a/test/BUILD.bazel +++ b/test/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") cc_library( diff --git a/test/android/app/build.gradle.kts b/test/android/app/build.gradle.kts index adfeefef904e..a34da1abe926 100644 --- a/test/android/app/build.gradle.kts +++ b/test/android/app/build.gradle.kts @@ -33,8 +33,6 @@ android { externalNativeBuild { cmake { arguments += listOf( - "-DMLN_LEGACY_RENDERER=OFF", - "-DMLN_DRAWABLE_RENDERER=ON", "-DANDROID_STL=c++_static" ) targets += "mbgl-test-runner" diff --git a/test/api/custom_drawable_layer.test.cpp b/test/api/custom_drawable_layer.test.cpp index 5c20485c21e2..89fc6a443d2f 100644 --- a/test/api/custom_drawable_layer.test.cpp +++ b/test/api/custom_drawable_layer.test.cpp @@ -10,8 +10,6 @@ #include #include -#if MLN_DRAWABLE_RENDERER - #include #include #include @@ -307,5 +305,3 @@ TEST(CustomDrawableLayer, SymbolIcon) { // render and test test::checkImage("test/fixtures/custom_drawable_layer/symbol_icon", frontend.render(map).image, 0.000657, 0.1); } - -#endif // MLN_DRAWABLE_RENDERER diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 8c44e52dac1b..6481c8fd5aaa 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -1634,12 +1634,8 @@ TEST(Map, StencilOverflow) { test.map.jumpTo(CameraOptions().withZoom(5)); auto result = test.frontend.render(test.map); - // In drawable builds, no drawables are built because no bucket/tiledata is available. -#if MLN_DRAWABLE_RENDERER + // No drawables are built because no bucket/tiledata is available. ASSERT_LE(0, result.stats.stencilUpdates); -#else - ASSERT_LT(0, result.stats.stencilClears); -#endif // MLN_DRAWABLE_RENDERER #if !defined(NDEBUG) Log::Info(Event::General, result.stats.toString("\n")); diff --git a/test/renderer/shader_registry.test.cpp b/test/renderer/shader_registry.test.cpp index d9ecd1ee36dd..caabf8a6cb45 100644 --- a/test/renderer/shader_registry.test.cpp +++ b/test/renderer/shader_registry.test.cpp @@ -207,11 +207,7 @@ TEST(ShaderRegistry, NamedReplace) { } // Test replacing an actual program instance with a similar instance -#if MLN_LEGACY_RENDERER -TEST(ShaderRegistry, GLSLReplacement_NoOp) { -#else TEST(ShaderRegistry, DISABLED_GLSLReplacement_NoOp) { -#endif MapInstance::ShaderAndStyleObserver observer; util::RunLoop runLoop; auto map = MapInstance(1.0f, observer); @@ -237,11 +233,7 @@ TEST(ShaderRegistry, DISABLED_GLSLReplacement_NoOp) { // Test replacing an actual program with a similar instance using a different // fragment shader -#if MLN_LEGACY_RENDERER -TEST(ShaderRegistry, GLSLReplacement1) { -#else TEST(ShaderRegistry, DISABLED_GLSLReplacement1) { -#endif MapInstance::ShaderAndStyleObserver observer; util::RunLoop runLoop; auto map = MapInstance(1.0f, observer); @@ -275,11 +267,7 @@ void main() { // Test replacing an actual program with a similar instance using a different // fragment shader -#if MLN_LEGACY_RENDERER -TEST(ShaderRegistry, GLSLReplacement2) { -#else TEST(ShaderRegistry, DISABLED_GLSLReplacement2) { -#endif MapInstance::ShaderAndStyleObserver observer; util::RunLoop runLoop; auto map = MapInstance(1.0f, observer); diff --git a/test/util/offscreen_texture.test.cpp b/test/util/offscreen_texture.test.cpp index 04228eb531ec..e4e0fe69df69 100644 --- a/test/util/offscreen_texture.test.cpp +++ b/test/util/offscreen_texture.test.cpp @@ -10,11 +10,7 @@ #include #include -#if MLN_LEGACY_RENDERER -#include -#else #include -#endif using namespace mbgl; using namespace mbgl::platform; @@ -173,13 +169,9 @@ void main() { test::checkImage("test/fixtures/offscreen_texture/render-to-fbo", image, 0, 0); // Now, composite the Framebuffer texture we've rendered to onto the main FBO. -#if MLN_LEGACY_RENDERER - gl::bindTexture(context, 0, {offscreenTexture.getTexture().getResource(), gfx::TextureFilterType::Linear}); - MBGL_CHECK_ERROR(glUniform1i(u_texture, 0)); -#else offscreenTexture.getTexture()->setSamplerConfiguration({gfx::TextureFilterType::Linear}); std::static_pointer_cast(offscreenTexture.getTexture())->bind(u_texture, 0); -#endif + MBGL_CHECK_ERROR(glUseProgram(compositeShader.program)); MBGL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, viewportBuffer.buffer)); MBGL_CHECK_ERROR(glEnableVertexAttribArray(compositeShader.a_pos)); diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 78fbf69c6c8a..3177b2530034 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS") # vendor/mapbox-base-files.json diff --git a/vendor/glfw.BUILD b/vendor/glfw.BUILD index dfd867cb9a3f..74bd66a231d6 100644 --- a/vendor/glfw.BUILD +++ b/vendor/glfw.BUILD @@ -1,3 +1,5 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") + cc_library( name = "glfw", hdrs = glob([ From 48d0691a8a68b583575dc4da0d66d068a715ff88 Mon Sep 17 00:00:00 2001 From: Vladimir Tagakov <10127655+Tagakov@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:23:11 -0600 Subject: [PATCH 145/339] TextureViewRenderThread#eventQueue should be LinkedList (#3397) --- .../maps/renderer/textureview/TextureViewRenderThread.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java index 76c5a0a7d7c1..11bddf38fde1 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/renderer/textureview/TextureViewRenderThread.java @@ -7,7 +7,7 @@ import androidx.annotation.Nullable; import androidx.annotation.UiThread; -import java.util.ArrayList; +import java.util.LinkedList; /** * The render thread is responsible for managing the communication between the @@ -24,7 +24,7 @@ abstract class TextureViewRenderThread extends Thread implements TextureView.Sur protected final Object lock = new Object(); // Guarded by lock - protected final ArrayList eventQueue = new ArrayList<>(); + protected final LinkedList eventQueue = new LinkedList<>(); @Nullable protected SurfaceTexture surfaceTexture; protected boolean hasNativeSurface; From b9f91c19247ed8d24c6a423d08e65d5d6b830507 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 16 Apr 2025 02:18:42 +0200 Subject: [PATCH 146/339] Pull in maplibre-native-base repo (#3389) --- .github/workflows/node-ci.yml | 8 +- .github/workflows/qt-ci.yml | 9 +- .gitmodules | 45 +- BUILD.bazel | 2 +- CMakeLists.txt | 50 +-- bin/CMakeLists.txt | 8 +- expression-test/CMakeLists.txt | 4 +- .../MapLibreAndroid/src/cpp/CMakeLists.txt | 2 +- platform/android/android.cmake | 10 +- platform/glfw/CMakeLists.txt | 7 +- platform/glfw/test_writer.cpp | 4 +- platform/node/CMakeLists.txt | 2 +- render-test/BUILD.bazel | 2 +- render-test/CMakeLists.txt | 5 +- test/CMakeLists.txt | 4 +- vendor/BUILD.bazel | 63 ++- vendor/mapbox-base | 1 - ...-base.cmake => maplibre-native-base.cmake} | 50 ++- vendor/maplibre-native-base/.clang-format | 10 + vendor/maplibre-native-base/.clang-tidy | 8 + .../.github/workflows/ci.yml | 35 ++ vendor/maplibre-native-base/.gitignore | 40 ++ vendor/maplibre-native-base/.gitmodules | 45 ++ vendor/maplibre-native-base/CHANGELOG.md | 139 +++++++ vendor/maplibre-native-base/CMakeLists.txt | 30 ++ vendor/maplibre-native-base/LICENSE | 26 ++ vendor/maplibre-native-base/README.md | 9 + .../maplibre-native-base/deps/CMakeLists.txt | 28 ++ .../maplibre-native-base/deps/cheap-ruler-cpp | 1 + .../maplibre-native-base/deps/geojson-vt-cpp | 1 + vendor/maplibre-native-base/deps/geojson.hpp | 1 + vendor/maplibre-native-base/deps/geometry.hpp | 1 + vendor/maplibre-native-base/deps/jni.hpp | 1 + .../maplibre-native-base/deps/pixelmatch-cpp | 1 + .../maplibre-native-base/deps/shelf-pack-cpp | 1 + .../deps/supercluster.hpp | 1 + vendor/maplibre-native-base/deps/variant | 1 + vendor/maplibre-native-base/docs/value.md | 338 +++++++++++++++ .../extras/CMakeLists.txt | 27 ++ vendor/maplibre-native-base/extras/args | 1 + .../maplibre-native-base/extras/expected-lite | 1 + .../extras/googletest.cmake | 17 + vendor/maplibre-native-base/extras/kdbush.hpp | 1 + vendor/maplibre-native-base/extras/rapidjson | 1 + .../extras/rapidjson.cmake | 11 + .../include/CMakeLists.txt | 10 + .../include/mapbox/compatibility/value.hpp | 14 + .../include/mapbox/io/io.hpp | 57 +++ .../include/mapbox/platform.hpp | 70 ++++ .../include/mapbox/std/weak.hpp | 384 ++++++++++++++++++ .../include/mapbox/util/expected.hpp | 17 + .../include/mapbox/util/type_wrapper.hpp | 41 ++ vendor/maplibre-native-base/test/.gitignore | 1 + .../maplibre-native-base/test/CMakeLists.txt | 31 ++ .../test/compatibility/value.cpp | 20 + .../test/fixtures/hello_world.txt | 1 + vendor/maplibre-native-base/test/io/io.cpp | 49 +++ .../test/io/io_delete.cpp | 21 + .../test/io/io_delete.hpp | 5 + vendor/maplibre-native-base/test/std/weak.cpp | 202 +++++++++ .../test/test_defines.hpp.in | 1 + .../test/util/type_wrapper.cpp | 174 ++++++++ 62 files changed, 2021 insertions(+), 129 deletions(-) delete mode 160000 vendor/mapbox-base rename vendor/{mapbox-base.cmake => maplibre-native-base.cmake} (74%) create mode 100644 vendor/maplibre-native-base/.clang-format create mode 100644 vendor/maplibre-native-base/.clang-tidy create mode 100644 vendor/maplibre-native-base/.github/workflows/ci.yml create mode 100644 vendor/maplibre-native-base/.gitignore create mode 100644 vendor/maplibre-native-base/.gitmodules create mode 100644 vendor/maplibre-native-base/CHANGELOG.md create mode 100644 vendor/maplibre-native-base/CMakeLists.txt create mode 100644 vendor/maplibre-native-base/LICENSE create mode 100644 vendor/maplibre-native-base/README.md create mode 100644 vendor/maplibre-native-base/deps/CMakeLists.txt create mode 160000 vendor/maplibre-native-base/deps/cheap-ruler-cpp create mode 160000 vendor/maplibre-native-base/deps/geojson-vt-cpp create mode 160000 vendor/maplibre-native-base/deps/geojson.hpp create mode 160000 vendor/maplibre-native-base/deps/geometry.hpp create mode 160000 vendor/maplibre-native-base/deps/jni.hpp create mode 160000 vendor/maplibre-native-base/deps/pixelmatch-cpp create mode 160000 vendor/maplibre-native-base/deps/shelf-pack-cpp create mode 160000 vendor/maplibre-native-base/deps/supercluster.hpp create mode 160000 vendor/maplibre-native-base/deps/variant create mode 100644 vendor/maplibre-native-base/docs/value.md create mode 100644 vendor/maplibre-native-base/extras/CMakeLists.txt create mode 160000 vendor/maplibre-native-base/extras/args create mode 160000 vendor/maplibre-native-base/extras/expected-lite create mode 100644 vendor/maplibre-native-base/extras/googletest.cmake create mode 160000 vendor/maplibre-native-base/extras/kdbush.hpp create mode 160000 vendor/maplibre-native-base/extras/rapidjson create mode 100644 vendor/maplibre-native-base/extras/rapidjson.cmake create mode 100644 vendor/maplibre-native-base/include/CMakeLists.txt create mode 100644 vendor/maplibre-native-base/include/mapbox/compatibility/value.hpp create mode 100644 vendor/maplibre-native-base/include/mapbox/io/io.hpp create mode 100644 vendor/maplibre-native-base/include/mapbox/platform.hpp create mode 100644 vendor/maplibre-native-base/include/mapbox/std/weak.hpp create mode 100644 vendor/maplibre-native-base/include/mapbox/util/expected.hpp create mode 100644 vendor/maplibre-native-base/include/mapbox/util/type_wrapper.hpp create mode 100644 vendor/maplibre-native-base/test/.gitignore create mode 100644 vendor/maplibre-native-base/test/CMakeLists.txt create mode 100644 vendor/maplibre-native-base/test/compatibility/value.cpp create mode 100644 vendor/maplibre-native-base/test/fixtures/hello_world.txt create mode 100644 vendor/maplibre-native-base/test/io/io.cpp create mode 100644 vendor/maplibre-native-base/test/io/io_delete.cpp create mode 100644 vendor/maplibre-native-base/test/io/io_delete.hpp create mode 100644 vendor/maplibre-native-base/test/std/weak.cpp create mode 100644 vendor/maplibre-native-base/test/test_defines.hpp.in create mode 100644 vendor/maplibre-native-base/test/util/type_wrapper.cpp diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 6a08ef5f933f..33d05ff48433 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -97,15 +97,9 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: + submodules: true fetch-depth: 0 - - name: Setup submodules - shell: bash - run: | - auth_header="$(git config --local --get http.https://github.com/.extraheader)" - git submodule sync --recursive - git -c core.longpaths=true -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive || true - - name: Get OS Architecture if: runner.os == 'MacOS' || runner.os == 'Linux' run: uname -m diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index 7a6f1d234e3b..ed17886263f0 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -109,14 +109,7 @@ jobs: with: path: source fetch-depth: 0 - - - name: Setup submodules - shell: bash - run: | - cd source - auth_header="$(git config --local --get http.https://github.com/.extraheader)" - git submodule sync --recursive - git -c core.longpaths=true -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 || true + submodules: true - name: Install test dependencies if: runner.os == 'Linux' && matrix.compiler != '' diff --git a/.gitmodules b/.gitmodules index 72537dd37ef9..83adba3d69f1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,9 +22,6 @@ [submodule "vendor/eternal"] path = vendor/eternal url = https://github.com/mapbox/eternal.git -[submodule "vendor/mapbox-base"] - path = vendor/mapbox-base - url = https://github.com/maplibre/maplibre-native-base.git [submodule "vendor/googletest"] path = vendor/googletest url = https://github.com/google/googletest.git @@ -58,3 +55,45 @@ [submodule "vendor/PMTiles"] path = vendor/PMTiles url = https://github.com/protomaps/PMTiles.git +[submodule "vendor/maplibre-native-base/extras/args"] + path = vendor/maplibre-native-base/extras/args + url = git@github.com:Taywee/args.git +[submodule "vendor/maplibre-native-base/extras/expected-lite"] + path = vendor/maplibre-native-base/extras/expected-lite + url = https://github.com/martinmoene/expected-lite.git +[submodule "vendor/maplibre-native-base/extras/kdbush.hpp"] + path = vendor/maplibre-native-base/extras/kdbush.hpp + url = https://github.com/mourner/kdbush.hpp.git +[submodule "vendor/maplibre-native-base/extras/rapidjson"] + path = vendor/maplibre-native-base/extras/rapidjson + url = https://github.com/Tencent/rapidjson.git +[submodule "vendor/maplibre-native-base/deps/cheap-ruler-cpp"] + path = vendor/maplibre-native-base/deps/cheap-ruler-cpp + url = https://github.com/mapbox/cheap-ruler-cpp.git +[submodule "vendor/maplibre-native-base/deps/geojson-vt-cpp"] + path = vendor/maplibre-native-base/deps/geojson-vt-cpp + url = https://github.com/mapbox/geojson-vt-cpp.git +[submodule "vendor/maplibre-native-base/deps/geojson-cpp"] + path = vendor/maplibre-native-base/deps/geojson-cpp + url = https://github.com/mapbox/geojson-cpp.git +[submodule "vendor/maplibre-native-base/deps/geometry.hpp"] + path = vendor/maplibre-native-base/deps/geometry.hpp + url = https://github.com/mapbox/geometry.hpp.git +[submodule "vendor/maplibre-native-base/deps/jni.hpp"] + path = vendor/maplibre-native-base/deps/jni.hpp + url = https://github.com/mapbox/jni.hpp.git +[submodule "vendor/maplibre-native-base/deps/pixelmatch-cpp"] + path = vendor/maplibre-native-base/deps/pixelmatch-cpp + url = https://github.com/mapbox/pixelmatch-cpp.git +[submodule "vendor/maplibre-native-base/deps/shelf-pack-cpp"] + path = vendor/maplibre-native-base/deps/shelf-pack-cpp + url = https://github.com/mapbox/shelf-pack-cpp.git +[submodule "vendor/maplibre-native-base/deps/supercluster.hpp"] + path = vendor/maplibre-native-base/deps/supercluster.hpp + url = https://github.com/mapbox/supercluster.hpp.git +[submodule "vendor/maplibre-native-base/deps/variant"] + path = vendor/maplibre-native-base/deps/variant + url = https://github.com/mapbox/variant.git +[submodule "vendor/maplibre-native-base/deps/geojson.hpp"] + path = vendor/maplibre-native-base/deps/geojson.hpp + url = https://github.com/mapbox/geojson-cpp.git diff --git a/BUILD.bazel b/BUILD.bazel index a097da5e3263..fb1d580e2abd 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -116,7 +116,7 @@ cc_library( "//vendor:boost", "//vendor:earcut.hpp", "//vendor:eternal", - "//vendor:mapbox-base", + "//vendor:maplibre-native-base", "//vendor:parsedate", "//vendor:pmtiles", "//vendor:polylabel", diff --git a/CMakeLists.txt b/CMakeLists.txt index 994f73a778fa..7c1f3c18b34b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1446,7 +1446,7 @@ include(${PROJECT_SOURCE_DIR}/vendor/boost.cmake) include(${PROJECT_SOURCE_DIR}/vendor/csscolorparser.cmake) include(${PROJECT_SOURCE_DIR}/vendor/earcut.hpp.cmake) include(${PROJECT_SOURCE_DIR}/vendor/eternal.cmake) -include(${PROJECT_SOURCE_DIR}/vendor/mapbox-base.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/maplibre-native-base.cmake) include(${PROJECT_SOURCE_DIR}/vendor/parsedate.cmake) include(${PROJECT_SOURCE_DIR}/vendor/pmtiles.cmake) include(${PROJECT_SOURCE_DIR}/vendor/polylabel.cmake) @@ -1465,11 +1465,11 @@ endif() target_link_libraries( mbgl-core PRIVATE - Mapbox::Base::Extras::kdbush.hpp - Mapbox::Base::supercluster.hpp - Mapbox::Base::shelf-pack-cpp - Mapbox::Base::geojson-vt-cpp - Mapbox::Base::cheap-ruler-cpp + MapLibreNative::Base::Extras::kdbush.hpp + MapLibreNative::Base::supercluster.hpp + MapLibreNative::Base::shelf-pack-cpp + MapLibreNative::Base::geojson-vt-cpp + MapLibreNative::Base::cheap-ruler-cpp mbgl-compiler-options mbgl-vendor-boost mbgl-vendor-earcut.hpp @@ -1484,31 +1484,31 @@ target_link_libraries( $<$:mbgl-vendor-metal-cpp> $,mbgl-rustutils,mbgl-vendor-csscolorparser> PUBLIC - Mapbox::Base - Mapbox::Base::Extras::expected-lite - Mapbox::Base::Extras::rapidjson - Mapbox::Base::geojson.hpp - Mapbox::Base::geometry.hpp - Mapbox::Base::variant + MapLibreNative::Base + MapLibreNative::Base::Extras::expected-lite + MapLibreNative::Base::Extras::rapidjson + MapLibreNative::Base::geojson.hpp + MapLibreNative::Base::geometry.hpp + MapLibreNative::Base::variant $<$:TracyClient> unordered_dense ) set(EXPORT_TARGETS mbgl-core - mapbox-base - mapbox-base-cheap-ruler-cpp - mapbox-base-extras-expected-lite - mapbox-base-extras-kdbush.hpp - mapbox-base-extras-rapidjson - mapbox-base-geojson-vt-cpp - mapbox-base-geojson.hpp - mapbox-base-geometry.hpp - mapbox-base-jni.hpp - mapbox-base-pixelmatch-cpp - mapbox-base-shelf-pack-cpp - mapbox-base-supercluster.hpp - mapbox-base-variant + maplibre-native-base + maplibre-native-base-cheap-ruler-cpp + maplibre-native-base-extras-expected-lite + maplibre-native-base-extras-kdbush.hpp + maplibre-native-base-extras-rapidjson + maplibre-native-base-geojson-vt-cpp + maplibre-native-base-geojson.hpp + maplibre-native-base-geometry.hpp + maplibre-native-base-jni.hpp + maplibre-native-base-pixelmatch-cpp + maplibre-native-base-shelf-pack-cpp + maplibre-native-base-supercluster.hpp + maplibre-native-base-variant mbgl-compiler-options mbgl-vendor-boost mbgl-vendor-earcut.hpp diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 0ff7593fbea9..7dca72a53be8 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -6,8 +6,8 @@ add_executable( target_link_libraries( mbgl-cache PRIVATE - Mapbox::Base - Mapbox::Base::Extras::args + MapLibreNative::Base + MapLibreNative::Base::Extras::args mbgl-compiler-options mbgl-core ) @@ -19,7 +19,7 @@ add_executable( target_link_libraries( mbgl-offline - PRIVATE Mapbox::Base::Extras::args mbgl-compiler-options mbgl-core + PRIVATE MapLibreNative::Base::Extras::args mbgl-compiler-options mbgl-core ) add_executable( @@ -29,7 +29,7 @@ add_executable( target_link_libraries( mbgl-render - PRIVATE Mapbox::Base::Extras::args mbgl-compiler-options mbgl-core + PRIVATE MapLibreNative::Base::Extras::args mbgl-compiler-options mbgl-core ) if(WIN32) diff --git a/expression-test/CMakeLists.txt b/expression-test/CMakeLists.txt index e71813fac1b3..e71d3a89f87b 100644 --- a/expression-test/CMakeLists.txt +++ b/expression-test/CMakeLists.txt @@ -20,8 +20,8 @@ target_include_directories( target_link_libraries( mbgl-expression-test PRIVATE - Mapbox::Base - Mapbox::Base::Extras::args + MapLibreNative::Base + MapLibreNative::Base::Extras::args mbgl-core mbgl-compiler-options ) diff --git a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt index 05902547e94e..462b252b4af2 100644 --- a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt +++ b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt @@ -239,7 +239,7 @@ target_link_libraries(maplibre $<$:-Wl,--gc-sections> $<$:-flto> $<$:-fuse-ld=gold> - Mapbox::Base::jni.hpp + MapLibreNative::Base::jni.hpp mbgl-core mbgl-vendor-unique_resource) diff --git a/platform/android/android.cmake b/platform/android/android.cmake index 4eb24f3711f1..cb9e28e5a5de 100644 --- a/platform/android/android.cmake +++ b/platform/android/android.cmake @@ -101,7 +101,7 @@ target_link_libraries( PRIVATE EGL GLESv3 - Mapbox::Base::jni.hpp + MapLibreNative::Base::jni.hpp android atomic jnigraphics @@ -125,7 +125,7 @@ target_link_libraries( example-custom-layer PRIVATE GLESv3 - Mapbox::Base + MapLibreNative::Base log mbgl-compiler-options ) @@ -160,7 +160,7 @@ find_package(curl CONFIG) target_link_libraries( mbgl-test-runner PRIVATE - Mapbox::Base::jni.hpp + MapLibreNative::Base::jni.hpp mbgl-compiler-options $<$:curl::curl_static> $ @@ -214,7 +214,7 @@ target_include_directories( target_link_libraries( mbgl-benchmark-runner PRIVATE - Mapbox::Base::jni.hpp + MapLibreNative::Base::jni.hpp mbgl-compiler-options $ ) @@ -265,7 +265,7 @@ target_include_directories( target_link_libraries( mbgl-render-test-runner PRIVATE - Mapbox::Base::jni.hpp + MapLibreNative::Base::jni.hpp android log mbgl-compiler-options diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index 887ab8df77a8..1792a5ab8186 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -128,12 +128,11 @@ endif() target_link_libraries( mbgl-glfw PRIVATE - Mapbox::Base::Extras::args - Mapbox::Base::Extras::filesystem - Mapbox::Base::Extras::rapidjson + MapLibreNative::Base::Extras::args + MapLibreNative::Base::Extras::rapidjson Mapbox::Map mbgl-compiler-options - Mapbox::Base::cheap-ruler-cpp + MapLibreNative::Base::cheap-ruler-cpp ) if(NOT WIN32 AND MLN_WITH_OPENGL) diff --git a/platform/glfw/test_writer.cpp b/platform/glfw/test_writer.cpp index 82dc8d0164de..c5ad6db0645f 100644 --- a/platform/glfw/test_writer.cpp +++ b/platform/glfw/test_writer.cpp @@ -3,11 +3,11 @@ #include #include #include -#include #include #include #include +#include using Writer = rapidjson::PrettyWriter; @@ -117,7 +117,7 @@ TestWriter& TestWriter::withInitialSize(const mbgl::Size& size) { } bool TestWriter::write(const std::string& dir) const { - namespace fs = ghc::filesystem; + namespace fs = std::filesystem; fs::path rootDir(dir); if (!fs::exists(rootDir)) { diff --git a/platform/node/CMakeLists.txt b/platform/node/CMakeLists.txt index c7eedf18702f..b499a4d7bd67 100644 --- a/platform/node/CMakeLists.txt +++ b/platform/node/CMakeLists.txt @@ -43,7 +43,7 @@ target_include_directories( target_link_libraries( mbgl-node-loop PUBLIC - Mapbox::Base + MapLibreNative::Base ) target_sources( diff --git a/render-test/BUILD.bazel b/render-test/BUILD.bazel index fbd3bf0213c1..7b01925a84ac 100644 --- a/render-test/BUILD.bazel +++ b/render-test/BUILD.bazel @@ -54,6 +54,6 @@ cc_test( deps = [ "render-test-srcs", "//platform/default:render-test-bin", - "//vendor:mapbox-base", + "//vendor:maplibre-native-base", ], ) diff --git a/render-test/CMakeLists.txt b/render-test/CMakeLists.txt index 46d2d149840a..3296a21c1891 100644 --- a/render-test/CMakeLists.txt +++ b/render-test/CMakeLists.txt @@ -57,9 +57,8 @@ include(${PROJECT_SOURCE_DIR}/vendor/boost.cmake) target_link_libraries( mbgl-render-test PRIVATE - Mapbox::Base::Extras::args - Mapbox::Base::Extras::filesystem - Mapbox::Base::pixelmatch-cpp + MapLibreNative::Base::Extras::args + MapLibreNative::Base::pixelmatch-cpp mbgl-compiler-options mbgl-vendor-boost PUBLIC mbgl-core diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3469349c0482..a53e20d144da 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -239,8 +239,8 @@ target_link_libraries( mbgl-test PRIVATE ${MLN_CORE_PRIVATE_LIBRARIES} - Mapbox::Base::Extras::args - Mapbox::Base::pixelmatch-cpp + MapLibreNative::Base::Extras::args + MapLibreNative::Base::pixelmatch-cpp mbgl-compiler-options mbgl-vendor-cpp-httplib PUBLIC mbgl-core diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 3177b2530034..240e2a2e5704 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -1,48 +1,45 @@ load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library") load("//bazel:flags.bzl", "CPP_FLAGS") -# vendor/mapbox-base-files.json cc_library( - name = "mapbox-base", + name = "maplibre-native-base", hdrs = [ - "mapbox-base/extras/args/args.hxx", + "maplibre-native-base/extras/args/args.hxx", ] + glob( [ - "mapbox-base/deps/cheap-ruler-cpp/include/mapbox/*.hpp", - "mapbox-base/deps/geojson-vt-cpp/include/**/*.hpp", - "mapbox-base/deps/geojson.hpp/include/**/*.hpp", - "mapbox-base/deps/geometry.hpp/include/**/*.hpp", - "mapbox-base/deps/jni.hpp/include/jni/*.hpp", - "mapbox-base/deps/pixelmatch-cpp/include/mapbox/*.hpp", - "mapbox-base/deps/shelf-pack-cpp/include/**/*.hpp", - "mapbox-base/deps/supercluster.hpp/include/*.hpp", - "mapbox-base/deps/variant/include/mapbox/*.hpp", - "mapbox-base/extras/expected-lite/include/**/*.hpp", - "mapbox-base/extras/filesystem/include/ghc/*.hpp", - "mapbox-base/extras/kdbush.hpp/include/*.hpp", - "mapbox-base/extras/rapidjson/include/**/*.h", - "mapbox-base/include/mapbox/**/*.hpp", + "maplibre-native-base/deps/cheap-ruler-cpp/include/mapbox/*.hpp", + "maplibre-native-base/deps/geojson-vt-cpp/include/**/*.hpp", + "maplibre-native-base/deps/geojson.hpp/include/**/*.hpp", + "maplibre-native-base/deps/geometry.hpp/include/**/*.hpp", + "maplibre-native-base/deps/jni.hpp/include/jni/*.hpp", + "maplibre-native-base/deps/pixelmatch-cpp/include/mapbox/*.hpp", + "maplibre-native-base/deps/shelf-pack-cpp/include/**/*.hpp", + "maplibre-native-base/deps/supercluster.hpp/include/*.hpp", + "maplibre-native-base/deps/variant/include/mapbox/*.hpp", + "maplibre-native-base/extras/expected-lite/include/**/*.hpp", + "maplibre-native-base/extras/kdbush.hpp/include/*.hpp", + "maplibre-native-base/extras/rapidjson/include/**/*.h", + "maplibre-native-base/include/mapbox/**/*.hpp", ], - exclude = ["mapbox-base/deps/jni.hpp/include/jni/string_conversion.hpp"], + exclude = ["maplibre-native-base/deps/jni.hpp/include/jni/string_conversion.hpp"], ), copts = CPP_FLAGS, defines = ["RAPIDJSON_HAS_STDSTRING=1"], includes = [ - "mapbox-base/deps/cheap-ruler-cpp/include", - "mapbox-base/deps/geojson.hpp/include", - "mapbox-base/deps/geojson-vt-cpp/include", - "mapbox-base/deps/geometry.hpp/include", - "mapbox-base/deps/jni.hpp/include", - "mapbox-base/deps/pixelmatch-cpp/include", - "mapbox-base/deps/shelf-pack-cpp/include", - "mapbox-base/deps/supercluster.hpp/include", - "mapbox-base/deps/variant/include", - "mapbox-base/extras/args", - "mapbox-base/extras/expected-lite/include", - "mapbox-base/extras/filesystem/include", - "mapbox-base/extras/kdbush.hpp/include", - "mapbox-base/extras/rapidjson/include", - "mapbox-base/include", + "maplibre-native-base/deps/cheap-ruler-cpp/include", + "maplibre-native-base/deps/geojson.hpp/include", + "maplibre-native-base/deps/geojson-vt-cpp/include", + "maplibre-native-base/deps/geometry.hpp/include", + "maplibre-native-base/deps/jni.hpp/include", + "maplibre-native-base/deps/pixelmatch-cpp/include", + "maplibre-native-base/deps/shelf-pack-cpp/include", + "maplibre-native-base/deps/supercluster.hpp/include", + "maplibre-native-base/deps/variant/include", + "maplibre-native-base/extras/args", + "maplibre-native-base/extras/expected-lite/include", + "maplibre-native-base/extras/kdbush.hpp/include", + "maplibre-native-base/extras/rapidjson/include", + "maplibre-native-base/include", ], visibility = ["//visibility:public"], ) diff --git a/vendor/mapbox-base b/vendor/mapbox-base deleted file mode 160000 index 8990092c304c..000000000000 --- a/vendor/mapbox-base +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8990092c304cbe72f3ffdf109ac4e150bde52782 diff --git a/vendor/mapbox-base.cmake b/vendor/maplibre-native-base.cmake similarity index 74% rename from vendor/mapbox-base.cmake rename to vendor/maplibre-native-base.cmake index e88a997a6c2e..86e978a5c19f 100644 --- a/vendor/mapbox-base.cmake +++ b/vendor/maplibre-native-base.cmake @@ -1,104 +1,102 @@ -# License helper for mapbox-base, should be upstreamed. - -if(NOT TARGET mapbox-base) - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/mapbox-base) +if(NOT TARGET maplibre-native) + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base) endif() set_target_properties( - mapbox-base-extras-kdbush.hpp + maplibre-native-base-extras-kdbush.hpp PROPERTIES INTERFACE_MAPLIBRE_NAME "kdbush.hpp" INTERFACE_MAPLIBRE_URL "https://github.com/mourner/kdbush.hpp" INTERFACE_MAPLIBRE_AUTHOR "Vladimir Agafonkin" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/extras/kdbush.hpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/extras/kdbush.hpp/LICENSE ) set_target_properties( - mapbox-base-extras-expected-lite + maplibre-native-base-extras-expected-lite PROPERTIES INTERFACE_MAPLIBRE_NAME "expected-lite" INTERFACE_MAPLIBRE_URL "https://github.com/martinmoene/expected-lite" INTERFACE_MAPLIBRE_AUTHOR "Martin Moene" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/extras/expected-lite/LICENSE.txt + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/extras/expected-lite/LICENSE.txt ) set_target_properties( - mapbox-base-supercluster.hpp + maplibre-native-base-supercluster.hpp PROPERTIES INTERFACE_MAPLIBRE_NAME "supercluster.hpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/supercluster.hpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/supercluster.hpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/supercluster.hpp/LICENSE ) set_target_properties( - mapbox-base-shelf-pack-cpp + maplibre-native-base-shelf-pack-cpp PROPERTIES INTERFACE_MAPLIBRE_NAME "shelf-pack-cpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/shelf-pack-cpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/shelf-pack-cpp/LICENSE.md + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/shelf-pack-cpp/LICENSE.md ) set_target_properties( - mapbox-base-geojson-vt-cpp + maplibre-native-base-geojson-vt-cpp PROPERTIES INTERFACE_MAPLIBRE_NAME "geojson-vt-cpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/geojson-vt-cpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/geojson-vt-cpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/geojson-vt-cpp/LICENSE ) set_target_properties( - mapbox-base-extras-rapidjson + maplibre-native-base-extras-rapidjson PROPERTIES INTERFACE_MAPLIBRE_NAME "RapidJSON" INTERFACE_MAPLIBRE_URL "https://rapidjson.org" INTERFACE_MAPLIBRE_AUTHOR "THL A29 Limited, a Tencent company, and Milo Yip" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/extras/rapidjson/license.txt + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/extras/rapidjson/license.txt ) set_target_properties( - mapbox-base-geojson.hpp + maplibre-native-base-geojson.hpp PROPERTIES INTERFACE_MAPLIBRE_NAME "geojson.hpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/geojson-cpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/geojson.hpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/geojson.hpp/LICENSE ) set_target_properties( - mapbox-base-geometry.hpp + maplibre-native-base-geometry.hpp PROPERTIES INTERFACE_MAPLIBRE_NAME "geometry.hpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/geometry.hpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/geometry.hpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/geometry.hpp/LICENSE ) set_target_properties( - mapbox-base + maplibre-native-base PROPERTIES INTERFACE_MAPLIBRE_NAME "mapbox-base" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/mapbox-base" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/LICENSE ) set_target_properties( - mapbox-base-variant + maplibre-native-base-variant PROPERTIES INTERFACE_MAPLIBRE_NAME "variant" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/variant" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/variant/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/variant/LICENSE ) set_target_properties( - mapbox-base-cheap-ruler-cpp + maplibre-native-base-cheap-ruler-cpp PROPERTIES INTERFACE_MAPLIBRE_NAME "cheap-ruler-cpp" INTERFACE_MAPLIBRE_URL "https://github.com/mapbox/cheap-ruler-cpp" INTERFACE_MAPLIBRE_AUTHOR "Mapbox" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/mapbox-base/deps/cheap-ruler-cpp/LICENSE + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/deps/cheap-ruler-cpp/LICENSE ) diff --git a/vendor/maplibre-native-base/.clang-format b/vendor/maplibre-native-base/.clang-format new file mode 100644 index 000000000000..52b2707b2847 --- /dev/null +++ b/vendor/maplibre-native-base/.clang-format @@ -0,0 +1,10 @@ +--- +Language: Cpp +BasedOnStyle: Google +AccessModifierOffset: -4 +IndentPPDirectives: AfterHash +AllowShortFunctionsOnASingleLine: Inline +ColumnLimit: 120 +IndentWidth: 4 +SpacesBeforeTrailingComments: 1 +... diff --git a/vendor/maplibre-native-base/.clang-tidy b/vendor/maplibre-native-base/.clang-tidy new file mode 100644 index 000000000000..609ccd54cee5 --- /dev/null +++ b/vendor/maplibre-native-base/.clang-tidy @@ -0,0 +1,8 @@ +Checks: 'bugprone-*,cppcoreguidelines-*,clang-analyzer-*,google-*,misc-*,modernize-*,performance-*,readability-*,-google-runtime-int,-google-readability-todo,-readability-named-parameter,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-special-member-functions,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-pro-bounds-pointer-arithmetic' +WarningsAsErrors: '*' +HeaderFilterRegex: '.*' +CheckOptions: + - key: readability-identifier-naming.PrivateMemberSuffix + value: '_' + - key: readability-identifier-naming.ProtectedMemberSuffix + value: '_' diff --git a/vendor/maplibre-native-base/.github/workflows/ci.yml b/vendor/maplibre-native-base/.github/workflows/ci.yml new file mode 100644 index 000000000000..956c22d1976e --- /dev/null +++ b/vendor/maplibre-native-base/.github/workflows/ci.yml @@ -0,0 +1,35 @@ +name: ci + +on: + push: + pull_request: + +jobs: + test_debug_build: + strategy: + matrix: + os: + - ubuntu-latest + node_version: + - 16 + architecture: + - x64 + ccompiler: + - clang + cxxcompiler: + - clang++ + release: + - Debug + + name: ${{ matrix.os }} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + + - name: Build and run tests + run: | + set -eo pipefail + export CC=${{ matrix.ccompiler }} CXX=${{ matrix.cxxcompiler }} + cmake -B build -S . -DCMAKE_BUILD_TYPE=${{ matrix.release }} -DBUILD_TESTING=ON + cmake --build build + ctest --test-dir build/test diff --git a/vendor/maplibre-native-base/.gitignore b/vendor/maplibre-native-base/.gitignore new file mode 100644 index 000000000000..6a8e2d32b9c4 --- /dev/null +++ b/vendor/maplibre-native-base/.gitignore @@ -0,0 +1,40 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# CMake build folder +build/ + +# NPM modules +node_modules + +*.user diff --git a/vendor/maplibre-native-base/.gitmodules b/vendor/maplibre-native-base/.gitmodules new file mode 100644 index 000000000000..fce4d39718cb --- /dev/null +++ b/vendor/maplibre-native-base/.gitmodules @@ -0,0 +1,45 @@ +[submodule "libs/geometry.hpp"] + path = deps/geometry.hpp + url = https://github.com/mapbox/geometry.hpp.git +[submodule "libs/variant"] + path = deps/variant + url = https://github.com/mapbox/variant.git +[submodule "libs/args"] + path = extras/args + url = https://github.com/Taywee/args +[submodule "libs/expected-lite"] + path = extras/expected-lite + url = https://github.com/martinmoene/expected-lite.git +[submodule "libs/filesystem"] + path = extras/filesystem + url = https://github.com/gulrak/filesystem.git +[submodule "libs/pixelmatch-cpp"] + path = deps/pixelmatch-cpp + url = https://github.com/mapbox/pixelmatch-cpp.git +[submodule "libs/rapidjson"] + path = extras/rapidjson + url = https://github.com/Tencent/rapidjson.git +[submodule "mapbox/jni.hpp"] + path = deps/jni.hpp + url = https://github.com/mapbox/jni.hpp.git +[submodule "mapbox/geojson.hpp"] + path = deps/geojson.hpp + url = https://github.com/mapbox/geojson.hpp.git +[submodule "mapbox/supercluster.hpp"] + path = deps/supercluster.hpp + url = https://github.com/mapbox/supercluster.hpp.git +[submodule "extras/kdbush.hpp"] + path = extras/kdbush.hpp + url = https://github.com/mourner/kdbush.hpp.git +[submodule "mapbox/cheap-ruler-cpp"] + path = deps/cheap-ruler-cpp + url = https://github.com/mapbox/cheap-ruler-cpp.git +[submodule "mapbox/shelf-pack-cpp"] + path = deps/shelf-pack-cpp + url = https://github.com/mapbox/shelf-pack-cpp.git +[submodule "mapbox/geojson-vt-cpp"] + path = deps/geojson-vt-cpp + url = https://github.com/mapbox/geojson-vt-cpp.git +[submodule "extras/googletest"] + path = extras/googletest + url = https://github.com/google/googletest.git diff --git a/vendor/maplibre-native-base/CHANGELOG.md b/vendor/maplibre-native-base/CHANGELOG.md new file mode 100644 index 000000000000..c01bb036223b --- /dev/null +++ b/vendor/maplibre-native-base/CHANGELOG.md @@ -0,0 +1,139 @@ +# MapLibre Base + +## v2.1.1 + +### 💫️ Features and Improvements +- [variant](https://github.com/mapbox/variant.git) from 1.1.6 to 1.2.0 +- [expected-lite](https://github.com/martinmoene/expected-lite) from 0.4.0 to 0.6.2 +- [filesystem](https://github.com/gulrak/filesystem.git) from 1.5.10 to 1.5.12 +- [googletest](https://github.com/google/googletest) 1.10.0 to 1.12.1 + + +## v2.1.0 + +### 💫️ Features and Improvements +- Update [args](https://github.com/Taywee/args) from 6.2.3 to 6.4.1 +- Update [rapidjson](https://github.com/Tencent/rapidjson) from (28 Jun 2019 - [d87b698d](https://github.com/Tencent/rapidjson/commit/d87b698d)) to (20 Jun 2022 - [27c3a8d](https://github.com/Tencent/rapidjson/commit/27c3a8d)) + +## v2.0.0 + +### 💫️ Other +- [base] New fork maintained by MapLibre +- [base] Replace Travis with Github Actions + +## v1.9.1 + +### 💫️ Other + - [deps] Update ghc::filesystem to v1.5.10 + +## v1.9.0 + +### 💫️ Other + - [deps] Update ghc::filesystem to v1.5.6 + +## v1.8.1 + +### 💫️ Other + - [deps] Update geojson-vt-cpp to v6.6.5 + +## v1.8.0 + +### 💫️ Other + - [deps] Update supercluster.hpp to v0.5.0 + +## v1.7.0 + +### 💫️ Other + - [deps] Bump supercluster.hpp to v0.4.0 + +## v1.6.1 + +### 💫️ Other + - [base] jni.hpp @ 57ca9ed4bbeb22ed8d20a55063dcaa217ba47f42 + +## v1.6.0 + +### 💫️ Other + - [base] Update geojson.hpp to v5.1.0 + - [base] Update geojson-vt-cpp to v6.6.4 + - [ci] Rename master branch to main + - [weak] Introduce WeakPtrFactory::invalidateWeakPtrs() + - [weak] Fix possible WeakPtr locks after WeakPtrFactory gets invalid. + +## v1.5.0 + +### 💫️ Other + - [base] Update geojson.hpp to v0.5.0 + +## v1.4.0 + +### ✨ New features +- [extras] Bump googletest to 1.10.0 + - Better gmock syntax. + +### ⚠️ Breaking changes +- [base] expected-lite @ v0.4.0 + +### 💫️ Other +- [doc] Add documentation for `mapbox::base::Value` + +## v1.3.0 + +### ✨ New features +- [base] Add platform definitions + +### ⚠️ Breaking changes +- [base] jni.hpp @ e2bbae090005ac1ce2a88c51c0cff2d22d957545 + +### 💫️ Other +- [build] Update LICENSE.thirdparty + +## v1.2.1 + +### 💫️ Other +- Add `MAPBOX_BASE_BUILD_TESTING` option for overriding building tests when building outside of mapbox-base project. + +## v1.2.0 + +### ✨ New features +- Update minimist dependency to v1.2.5 +- [base] Added GeoJSON VT and ShelfPack + +### ⚠️ Breaking changes +- Move mapbox-base-owned libraries to a single folder +- [base] cheap-ruler-cpp @ 746044cfbb7d254f1d67929eb564a0dcaaa39cc1 +- [base] jni.hpp @ 385dede669c843144b9ad68bbb7af3989d76104e +- [base] geometry.hpp @ a5571a3ace5853e0d1e8d5fbdc87163c824ebeb7 + +### 💫️ Other +- Use googletest framework + +## v1.1.0 + +### ✨ New features +Extras: +- extras/args @ 6.2.2-9-g401663c +- extras/expected-lite @ v0.3.0-6-g6fad61b +- extras/filesystem @ v1.2.4-7-g135015f +- extras/kdbush.hpp @ v0.1.3-1-ge1e847b +- extras/rapidjson @ v1.1.0-490-gd87b698d + +New libraries: +- mapbox/io +- mapbox/typewrapper +- mapbox/value +- mapbox/weak + +### ⚠️ Breaking changes +- mapbox/geojson.hpp @ v0.4.3 +- mapbox/geometry.hpp @ v1.0.0-8-gb3f4bd4 +- mapbox/jni.hpp @ v4.0.1 +- mapbox/optional @ f6249e7f +- mapbox/supercluster.hpp @ v0.3.2-1-g03c026c +- mapbox/variant @ v1.1.6 + +## v1.0.0 + +### ✨ New features +- geometry.hpp @ v1.0.0 +- variant @ v1.1.6 diff --git a/vendor/maplibre-native-base/CMakeLists.txt b/vendor/maplibre-native-base/CMakeLists.txt new file mode 100644 index 000000000000..9e58377d0f7a --- /dev/null +++ b/vendor/maplibre-native-base/CMakeLists.txt @@ -0,0 +1,30 @@ +if(TARGET maplibre-native-base) + return() +endif() + +cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR) +project(MAPBOX_BASE LANGUAGES CXX C) + +option(MAPBOX_BASE_BUILD_TESTING "Bypass project target check and enforce building tests" OFF) + +include(CTest) + +cmake_policy(SET CMP0063 NEW) + +if(NOT CMAKE_VERSION VERSION_LESS 3.13.0) + # Required to allow maplibre-native-base to depend on libraries coming from /deps + cmake_policy(SET CMP0079 NEW) +endif() + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) + +add_subdirectory(${PROJECT_SOURCE_DIR}/extras) +add_subdirectory(${PROJECT_SOURCE_DIR}/include) +add_subdirectory(${PROJECT_SOURCE_DIR}/deps) + +if ((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MAPBOX_BASE_BUILD_TESTING) AND BUILD_TESTING) + add_subdirectory(${PROJECT_SOURCE_DIR}/test) +endif() diff --git a/vendor/maplibre-native-base/LICENSE b/vendor/maplibre-native-base/LICENSE new file mode 100644 index 000000000000..9d693cd18cb5 --- /dev/null +++ b/vendor/maplibre-native-base/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2022 MapLibre contributors +Copyright (c) MapBox +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name "MapBox" nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/maplibre-native-base/README.md b/vendor/maplibre-native-base/README.md new file mode 100644 index 000000000000..4c2bbcbab19b --- /dev/null +++ b/vendor/maplibre-native-base/README.md @@ -0,0 +1,9 @@ +![MapLibre Logo](https://maplibre.org/img/maplibre-logo-big.svg) + +# MapLibre Native Base C++ Libraries + +maplibre-native-base + +A collection of common static and header-only C++ libraries used among our native SDKs. + +Part of the [Maplibre](https://maplibre.org) organization diff --git a/vendor/maplibre-native-base/deps/CMakeLists.txt b/vendor/maplibre-native-base/deps/CMakeLists.txt new file mode 100644 index 000000000000..01de7fe3d1ab --- /dev/null +++ b/vendor/maplibre-native-base/deps/CMakeLists.txt @@ -0,0 +1,28 @@ +function(maplibre_native_base_add_library name include_path) + if(TARGET maplibre-native-base-${name}) + return() + endif() + + if(NOT EXISTS ${include_path} OR NOT IS_DIRECTORY ${include_path}) + message(FATAL_ERROR "Dependency with include path '${include_path}' not found") + endif() + + add_library(maplibre-native-base-${name} INTERFACE) + add_library(MapLibreNative::Base::${name} ALIAS maplibre-native-base-${name}) + + target_include_directories(maplibre-native-base-${name} SYSTEM INTERFACE + ${include_path} + ) + + target_link_libraries(maplibre-native-base INTERFACE maplibre-native-base-${name}) +endfunction() + +maplibre_native_base_add_library(cheap-ruler-cpp ${CMAKE_CURRENT_LIST_DIR}/cheap-ruler-cpp/include) +maplibre_native_base_add_library(geojson-vt-cpp ${CMAKE_CURRENT_LIST_DIR}/geojson-vt-cpp/include) +maplibre_native_base_add_library(geojson.hpp ${CMAKE_CURRENT_LIST_DIR}/geojson.hpp/include) +maplibre_native_base_add_library(geometry.hpp ${CMAKE_CURRENT_LIST_DIR}/geometry.hpp/include) +maplibre_native_base_add_library(jni.hpp ${CMAKE_CURRENT_LIST_DIR}/jni.hpp/include) +maplibre_native_base_add_library(pixelmatch-cpp ${CMAKE_CURRENT_LIST_DIR}/pixelmatch-cpp/include) +maplibre_native_base_add_library(shelf-pack-cpp ${CMAKE_CURRENT_LIST_DIR}/shelf-pack-cpp/include) +maplibre_native_base_add_library(supercluster.hpp ${CMAKE_CURRENT_LIST_DIR}/supercluster.hpp/include) +maplibre_native_base_add_library(variant ${CMAKE_CURRENT_LIST_DIR}/variant/include) diff --git a/vendor/maplibre-native-base/deps/cheap-ruler-cpp b/vendor/maplibre-native-base/deps/cheap-ruler-cpp new file mode 160000 index 000000000000..2778eb89cb3b --- /dev/null +++ b/vendor/maplibre-native-base/deps/cheap-ruler-cpp @@ -0,0 +1 @@ +Subproject commit 2778eb89cb3b078d31ce225c7592360d6d9bb0a0 diff --git a/vendor/maplibre-native-base/deps/geojson-vt-cpp b/vendor/maplibre-native-base/deps/geojson-vt-cpp new file mode 160000 index 000000000000..b0f25fec9eb0 --- /dev/null +++ b/vendor/maplibre-native-base/deps/geojson-vt-cpp @@ -0,0 +1 @@ +Subproject commit b0f25fec9eb068cdf6fb9556b3cd11fd3694abf0 diff --git a/vendor/maplibre-native-base/deps/geojson.hpp b/vendor/maplibre-native-base/deps/geojson.hpp new file mode 160000 index 000000000000..ca4638c54518 --- /dev/null +++ b/vendor/maplibre-native-base/deps/geojson.hpp @@ -0,0 +1 @@ +Subproject commit ca4638c545183d9c138464d93f2c20975c8c4808 diff --git a/vendor/maplibre-native-base/deps/geometry.hpp b/vendor/maplibre-native-base/deps/geometry.hpp new file mode 160000 index 000000000000..a5571a3ace58 --- /dev/null +++ b/vendor/maplibre-native-base/deps/geometry.hpp @@ -0,0 +1 @@ +Subproject commit a5571a3ace5853e0d1e8d5fbdc87163c824ebeb7 diff --git a/vendor/maplibre-native-base/deps/jni.hpp b/vendor/maplibre-native-base/deps/jni.hpp new file mode 160000 index 000000000000..57ca9ed4bbeb --- /dev/null +++ b/vendor/maplibre-native-base/deps/jni.hpp @@ -0,0 +1 @@ +Subproject commit 57ca9ed4bbeb22ed8d20a55063dcaa217ba47f42 diff --git a/vendor/maplibre-native-base/deps/pixelmatch-cpp b/vendor/maplibre-native-base/deps/pixelmatch-cpp new file mode 160000 index 000000000000..61f433cb485d --- /dev/null +++ b/vendor/maplibre-native-base/deps/pixelmatch-cpp @@ -0,0 +1 @@ +Subproject commit 61f433cb485d6b08dc7fe97ae5f8717007c7bda1 diff --git a/vendor/maplibre-native-base/deps/shelf-pack-cpp b/vendor/maplibre-native-base/deps/shelf-pack-cpp new file mode 160000 index 000000000000..450f25f710c3 --- /dev/null +++ b/vendor/maplibre-native-base/deps/shelf-pack-cpp @@ -0,0 +1 @@ +Subproject commit 450f25f710c346f9c1583eab2749e011081ed20e diff --git a/vendor/maplibre-native-base/deps/supercluster.hpp b/vendor/maplibre-native-base/deps/supercluster.hpp new file mode 160000 index 000000000000..e5ba492754f8 --- /dev/null +++ b/vendor/maplibre-native-base/deps/supercluster.hpp @@ -0,0 +1 @@ +Subproject commit e5ba492754f865b475577fd85eecc3be70e050ce diff --git a/vendor/maplibre-native-base/deps/variant b/vendor/maplibre-native-base/deps/variant new file mode 160000 index 000000000000..a2a485834542 --- /dev/null +++ b/vendor/maplibre-native-base/deps/variant @@ -0,0 +1 @@ +Subproject commit a2a4858345423a760eca300ec42acad1ad123aa3 diff --git a/vendor/maplibre-native-base/docs/value.md b/vendor/maplibre-native-base/docs/value.md new file mode 100644 index 000000000000..cd73459784ce --- /dev/null +++ b/vendor/maplibre-native-base/docs/value.md @@ -0,0 +1,338 @@ + + +# mapbox::base values + +*Value* offers a fast, flexible and uncomplicated way to build easy-to-use APIs where strong types are not required. + +A mapbox::base::Value holds a value of a type. Supported types are `int`, `uint`, `bool`, `double`, `array`, `object` and `string`. The type and the value of a mapbox::base::Value [can change](#Type). + +Values are used widely in Mapbox libraries, for instance when working with geometries or data in JSON format. They can be nested to create complex structures. + +- [mapbox::base::Value](#Value) +- [mapbox::base::ValueArray](#ValueArray) +- [mapbox::base::ValueObject](#ValueObject) +- [Introspect Values](#Introspect-Values) +- [Example](#A-real-world-example) + +## Value + +```C++ + mapbox::base::Value num(-20); + mapbox::base::Value pi(3.14159265359); + mapbox::base::Value name("John Smith"); + mapbox::base::Value codingIsFun(true); +``` + +### get + +Use `get()` to get a copy. + +```C++ +double value = pi.get(); +``` + +It throws an exception if the type doesn't match the current type. + +```C++ + double value; + try { + value = pi.get(); + } catch (const std::exception& e) { + std::cout << "Error: " << e.what() << std::endl; + } + std::cout << value << std::endl; +``` + +If you don't want exceptions, use `get_unchecked()`: + +```C++ + pi.get_unchecked(); +``` + + +Get a pointer: +```C++ + double* value = pi.getDouble(); + std::cout << *value << std::endl; +``` + +outputs 3.14159265359 + +### set, update + +```C++ + pi = 0.456; + pi.set(0.123); + + std::cout << *pi.getDouble() << std::endl; +``` + +outputs 0.123 + +### Type + +Assigning a value of an allowed type changes the type of the [mapbox::base::Value](#Value). + +You can use `which()` to get the type index. + +```C++ + mapbox::base::Value val; + + val = "a string"; + std::cout << val.which() << std::endl; + + val = 0.5; + std::cout << val.which() << std::endl; +``` + +output: +``` +5 +4 +``` + +To ask for a specific type, use `is()`: + +```C++ +std::cout << "is double: " << val.is() << ", is string: " << val.is() << std::endl; +``` + +``` +is double: 1, is string: 0 +``` + +Use `valid()` to see if the type index is within the allowed range. + +## ValueArray + +The ValueArray can hold an arbitrary number of [values](#Value) and is based on a [std::vector](https://en.cppreference.com/w/cpp/container/vector). You can use all its methods to work with the array. + +```C++ + mapbox::base::ValueArray array = {num, pi, name, codingIsFun}; +``` + +or more programatically + +```C++ + array.push_back(num); + array.push_back(pi); + array.push_back(name); + array.push_back(codingIsFun); +``` + +Our array is: [-20,3.14159265359,"John Smith",true] + +### get an item + +```C++ + mapbox::base::Value myValue = array[1]; + double piV = myValue.get(); + + std::cout << piV << std::endl;>> +``` + +### and insert + +```C++ + auto it = array.begin() + 2; + array.insert(it, "inserting a string"); +``` +array is now [-20,3.14159265359,"inserting a string","John Smith",true] + +### update an item + +```C++ + array[1].set(0.45); +``` +array is now [-20,0.45,"inserting a string","John Smith",true]. Here we can also [change](#Type) the type and assign a value of a different type. + +## ValueObject + +The ValueObject holds key-value pairs and can be used to model structures similar to json objects. +It is based on an [std::unordered_map](https://de.cppreference.com/w/cpp/container/unordered_map). You can use their methods to work with ValueObject. + +```C++ + mapbox::base::ValueObject object; + object.insert({"text-color", "yellow"}); +``` + +### get an item: + +```C++ + mapbox::base::Value v = object["text-color"]; + + std::string color = *object["text-color"].getString(); + std::cout << color << std::endl; +``` + +outputs yellow; + +### update the value of an item: + +```C++ + object["text-color"].set("green"); + + std::cout << object["text-color"].get() << std::endl; +``` + +outputs green. + +## Introspect Values + +Lets assume you get a value from a component and want to peek inside to see whats 'in the box'. + +We don't know beforehand how deep the value is nested. Therefor we want to recursively visit the values, and we can use `match()` for the types: + +```C++ + std::function visit = [&](const mapbox::base::Value& value) { + + value.match([&](const mapbox::base::NullValue) {}, + [&](const std::string& str) {}, + [&](bool b) {}, + [&](uint64_t u64) {}, + [&](int64_t i64) {}, + [&](double f64) {}, + [&](const mapbox::base::ValueArray& array) { + for (const auto& v : array) { + visit(v); + } + }, + [&](const mapbox::base::ValueObject& object) { + for (const auto& kv : object) { + visit(kv.second) + } + }); + + }; + + visit(value); +``` + +And now with a bit of extra code to output the value in a json-like fashion: + +```C++ +std::string toString(const mapbox::base::Value& value) { + std::stringstream buffer; + + std::function visit = [&](const mapbox::base::Value& value, int depth) { + std::string indent = ""; + for(int i = 0; i < depth; ++i) { + indent += " "; + } + + value.match([&](const mapbox::base::NullValue) { buffer << indent << "nullptr"; }, + [&](const std::string& str) { buffer << "\"" << str << "\""; }, + [&](bool b) { buffer << b; }, + [&](uint64_t u64) { buffer << indent << u64; }, + [&](int64_t i64) { buffer << i64; }, + [&](double f64) { buffer << f64; }, + [&](const mapbox::base::ValueArray& array) { + buffer << indent << "[" << std::endl; + for (const auto& v : array) { + buffer << indent << " "; + visit(v, depth+1); + buffer << "," << std::endl; + } + if (array.size() > 1) buffer.seekp(-2, std::ios_base::end); + buffer << std::endl << indent << "]" << std::endl; + }, + [&](const mapbox::base::ValueObject& object) { + buffer << indent << "{" << std::endl; + for (const auto& kv : object) { + buffer << indent << " " << kv.first << ": "; + visit(kv.second, depth+1); + buffer << "," << std::endl; + } + if (object.size() > 1) buffer.seekp(-2, std::ios_base::end); + buffer << std::endl << indent << "}" << std::endl; + }); + }; + + visit(value, 0); + + return buffer.str(); +} + +//! lets add our array to our object to create a nested structure: +object.insert({"list", array}); + +std::cout << toString(object) << std::endl; +``` + +outputs + +```JSON +{ + text-color: "green", + list: [ + -20, + 0.45, + "inserting a string", + "John Smith", + 1 + ] +} +``` + +## A real world example + +Let's assume you want to create a line gradient to be used in MapLibre Native. We can programatically construct the data structure as we would do it if the data comes from a backend data source: + +```C++ + using A = mapbox::base::ValueArray; + + A lineGradient = {"interpolate", A{"linear"}, A{"line-progress"}}; + + lineGradient.push_back(0); + lineGradient.push_back("blue"); + + lineGradient.push_back(0.1); + lineGradient.push_back("royalblue"); + + lineGradient.push_back(0.3); + lineGradient.push_back("cyan"); + + lineGradient.push_back(0.5); + lineGradient.push_back("lime"); + + lineGradient.push_back(0.7); + lineGradient.push_back("yellow"); + + lineGradient.push_back(1); + lineGradient.push_back("red"); + + //! which we can now give to the map: + map->setStyleLayerProperty("my-line", "line-gradient", lineGradient); + + std::cout << toString(lineGradient) << std::endl; +``` + +results in: + +```JSON +[ + "interpolate", + ["linear"], + ["line-progress"], + 0, + "blue", + 0.1, + "royalblue", + 0.3, + "cyan", + 0.5, + "lime", + 0.7, + "yellow", + 1, + "red" +] +``` + +See https://maplibre.org/maplibre-style-spec/layers/#line-gradient to learn more about line gradients. diff --git a/vendor/maplibre-native-base/extras/CMakeLists.txt b/vendor/maplibre-native-base/extras/CMakeLists.txt new file mode 100644 index 000000000000..f86143fabed9 --- /dev/null +++ b/vendor/maplibre-native-base/extras/CMakeLists.txt @@ -0,0 +1,27 @@ +if(TARGET maplibre-native-base-extras) + return() +endif() + +function(maplibre_native_base_extras_add_library name include_path) + if(TARGET maplibre-native-base-extras-${name}) + return() + endif() + + add_library(maplibre-native-base-extras-${name} INTERFACE) + add_library(MapLibreNative::Base::Extras::${name} ALIAS maplibre-native-base-extras-${name}) + + target_include_directories(maplibre-native-base-extras-${name} SYSTEM INTERFACE + ${include_path} + ) + + target_link_libraries(maplibre-native-base-extras INTERFACE maplibre-native-base-extras-${name}) +endfunction() + +add_library(maplibre-native-base-extras INTERFACE) +add_library(MapLibreNative::Base::Extras ALIAS maplibre-native-base-extras) + +maplibre_native_base_extras_add_library(args ${CMAKE_CURRENT_LIST_DIR}/args) +maplibre_native_base_extras_add_library(expected-lite ${CMAKE_CURRENT_LIST_DIR}/expected-lite/include) +maplibre_native_base_extras_add_library(kdbush.hpp ${CMAKE_CURRENT_LIST_DIR}/kdbush.hpp/include) + +include(${PROJECT_SOURCE_DIR}/extras/rapidjson.cmake) diff --git a/vendor/maplibre-native-base/extras/args b/vendor/maplibre-native-base/extras/args new file mode 160000 index 000000000000..016aa8a054dd --- /dev/null +++ b/vendor/maplibre-native-base/extras/args @@ -0,0 +1 @@ +Subproject commit 016aa8a054dd88b8e1d2a020466ce38f310444cc diff --git a/vendor/maplibre-native-base/extras/expected-lite b/vendor/maplibre-native-base/extras/expected-lite new file mode 160000 index 000000000000..95b9cb015fa1 --- /dev/null +++ b/vendor/maplibre-native-base/extras/expected-lite @@ -0,0 +1 @@ +Subproject commit 95b9cb015fa17baa749c2b396b335906e1596a9e diff --git a/vendor/maplibre-native-base/extras/googletest.cmake b/vendor/maplibre-native-base/extras/googletest.cmake new file mode 100644 index 000000000000..37078ad6f8f5 --- /dev/null +++ b/vendor/maplibre-native-base/extras/googletest.cmake @@ -0,0 +1,17 @@ +add_library(gtest_all STATIC + ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/src/gtest_main.cc + ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/src/gtest-all.cc + ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(gtest_all PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest + ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/include + ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock + ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/include +) + +target_include_directories(gtest_all SYSTEM INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/include + ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/include +) diff --git a/vendor/maplibre-native-base/extras/kdbush.hpp b/vendor/maplibre-native-base/extras/kdbush.hpp new file mode 160000 index 000000000000..e1e847bfe97c --- /dev/null +++ b/vendor/maplibre-native-base/extras/kdbush.hpp @@ -0,0 +1 @@ +Subproject commit e1e847bfe97c8cdc09edbe87a4e74babc512d18d diff --git a/vendor/maplibre-native-base/extras/rapidjson b/vendor/maplibre-native-base/extras/rapidjson new file mode 160000 index 000000000000..27c3a8dc0e2c --- /dev/null +++ b/vendor/maplibre-native-base/extras/rapidjson @@ -0,0 +1 @@ +Subproject commit 27c3a8dc0e2c9218fe94986d249a12b5ed838f1d diff --git a/vendor/maplibre-native-base/extras/rapidjson.cmake b/vendor/maplibre-native-base/extras/rapidjson.cmake new file mode 100644 index 000000000000..a5788c87ba00 --- /dev/null +++ b/vendor/maplibre-native-base/extras/rapidjson.cmake @@ -0,0 +1,11 @@ +maplibre_native_base_extras_add_library(rapidjson ${CMAKE_CURRENT_LIST_DIR}/rapidjson/include) + +target_compile_definitions(maplibre-native-base-extras-rapidjson INTERFACE + RAPIDJSON_HAS_STDSTRING=1 +) + +if(WIN32) + target_compile_definitions(maplibre-native-base-extras-rapidjson INTERFACE + RAPIDJSON_HAS_CXX11_RVALUE_REFS + ) +endif() diff --git a/vendor/maplibre-native-base/include/CMakeLists.txt b/vendor/maplibre-native-base/include/CMakeLists.txt new file mode 100644 index 000000000000..b98014daa0e9 --- /dev/null +++ b/vendor/maplibre-native-base/include/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(maplibre-native-base INTERFACE) +add_library(MapLibreNative::Base ALIAS maplibre-native-base) + +target_include_directories(maplibre-native-base SYSTEM INTERFACE + "${PROJECT_SOURCE_DIR}/include" +) + +target_link_libraries(maplibre-native-base INTERFACE + MapLibreNative::Base::Extras::expected-lite +) diff --git a/vendor/maplibre-native-base/include/mapbox/compatibility/value.hpp b/vendor/maplibre-native-base/include/mapbox/compatibility/value.hpp new file mode 100644 index 000000000000..6856174d1323 --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/compatibility/value.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace mapbox { +namespace base { + +using Value = feature::value; +using ValueArray = Value::array_type; +using ValueObject = Value::object_type; +using NullValue = feature::null_value_t; + +} // namespace base +} // namespace mapbox diff --git a/vendor/maplibre-native-base/include/mapbox/io/io.hpp b/vendor/maplibre-native-base/include/mapbox/io/io.hpp new file mode 100644 index 000000000000..2fee8570ce2d --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/io/io.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include +#include +#include + +#include "mapbox/util/expected.hpp" + +namespace mapbox { +namespace base { +namespace io { + +using ErrorType = std::string; + +inline expected readFile(const std::string& filename) { + std::ifstream file(filename, std::ios::binary); + if (!file.good()) { + return make_unexpected(std::string("Failed to read file '") + filename + std::string("'")); + } + + std::stringstream data; + data << file.rdbuf(); + return expected(data.str()); +} + +inline expected writeFile(const std::string& filename, const std::string& data) { + std::ofstream file(filename, std::ios::binary); + if (!file.good()) { + return make_unexpected(std::string("Failed to write file '") + filename + std::string("'")); + } + + file << data; + + return expected(); +} + +inline expected deleteFile(const std::string& filename) { + const int ret = std::remove(filename.c_str()); + if (ret != 0) { + return make_unexpected(std::string("Failed to delete file '") + filename + std::string("'")); + } + + return expected(); +} + +inline expected copyFile(const std::string& sourcePath, const std::string& destinationPath) { + auto contents = readFile(sourcePath); + if (!contents) { + return nonstd::make_unexpected(contents.error()); + } + + return writeFile(destinationPath, *contents); +} + +} // namespace io +} // namespace base +} // namespace mapbox diff --git a/vendor/maplibre-native-base/include/mapbox/platform.hpp b/vendor/maplibre-native-base/include/mapbox/platform.hpp new file mode 100644 index 000000000000..0a8f194e68e0 --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/platform.hpp @@ -0,0 +1,70 @@ +#pragma once + +// Determine compiler +#define MB_COMPILER 0 +#define MB_COMPILER_GNU 1 +#define MB_COMPILER_CLANG 2 +#define MB_COMPILER_MSVC 3 + +#if defined(__clang__) +# define MB_COMPILER MB_COMPILER_CLANG +#elif defined(__GNUC__) || defined(__GNUG__) // after clang, possible it also has the same defines (need to research) +# define MB_COMPILER MB_COMPILER_GNU +#elif defined(_MSC_VER) +# define MB_COMPILER MB_COMPILER_MSVC +#else +# error "Unsupported compiler" +#endif + +// Determine platform +#define MB_PLATFORM 0 +#define MB_PLATFORM_WIN32 1 +#define MB_PLATFORM_LINUX 2 +#define MB_PLATFORM_MAC 3 +#define MB_PLATFORM_IOS_EMBEDDED 4 +#define MB_PLATFORM_IOS_SIMULATOR 5 +#define MB_PLATFORM_ANDROID 6 +#define MB_PLATFORM_QNX_NEUTRINO 7 +#define MB_PLATFORM_QNX_4 8 + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(__ANDROID__) +# define MB_PLATFORM MB_PLATFORM_WIN32 +#elif defined(__APPLE_CC__) +# include "TargetConditionals.h" +# if TARGET_OS_IOS && TARGET_OS_EMBEDDED +# define MB_PLATFORM MB_PLATFORM_IOS_EMBEDDED +# elif TARGET_OS_IOS && TARGET_OS_SIMULATOR +# define MB_PLATFORM MB_PLATFORM_IOS_SIMULATOR +# else +# define MB_PLATFORM MB_PLATFORM_MAC +# endif +#elif defined(__ANDROID__) +# define MB_PLATFORM MB_PLATFORM_ANDROID +#elif defined(__QNX__) +# if defined(__QNXNTO__) +# define MB_PLATFORM MB_PLATFORM_QNX_NEUTRINO +# else +# define MB_PLATFORM MB_PLATFORM_QNX_4 +# endif +#else // let all other platform right now is a linux platforms +# define MB_PLATFORM MB_PLATFORM_LINUX +#endif + +#define MB_PLATFORM_IS_WIN32 (MB_PLATFORM == MB_PLATFORM_WIN32) +#define MB_PLATFORM_IS_LINUX (MB_PLATFORM == MB_PLATFORM_LINUX) +#define MB_PLATFORM_IS_MAC (MB_PLATFORM == MB_PLATFORM_MAC) +#define MB_PLATFORM_IS_IOS_EMBEDDED (MB_PLATFORM == MB_PLATFORM_IOS_EMBEDDED) +#define MB_PLATFORM_IS_IOS_SIMULATOR (MB_PLATFORM == MB_PLATFORM_IOS_SIMULATOR) +#define MB_PLATFORM_IS_IOS (MB_PLATFORM_IS_IOS_EMBEDDED || MB_PLATFORM_IS_IOS_SIMULATOR) +#define MB_PLATFORM_IS_ANDROID (MB_PLATFORM == MB_PLATFORM_ANDROID) +#define MB_PLATFORM_IS_QNX_NEUTRINO (MB_PLATFORM == MB_PLATFORM_QNX_NEUTRINO) +#define MB_PLATFORM_IS_QNX_4 (MB_PLATFORM == MB_PLATFORM_QNX_4) +#define MB_PLATFORM_IS_QNX (MB_PLATFORM_IS_QNX_NEUTRINO || MB_PLATFORM_IS_QNX_4) + +#define MB_PLATFORM_IS_DESKTOP (MB_PLATFORM_IS_LINUX || MB_PLATFORM_IS_MAC || MB_PLATFORM_IS_WIN32) + +#ifdef NDEBUG +# define MB_IS_DEBUG 0 +#else +# define MB_IS_DEBUG 1 +#endif diff --git a/vendor/maplibre-native-base/include/mapbox/std/weak.hpp b/vendor/maplibre-native-base/include/mapbox/std/weak.hpp new file mode 100644 index 000000000000..af44bcfbd33c --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/std/weak.hpp @@ -0,0 +1,384 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mapbox { +namespace base { + +/// @cond internal +namespace internal { + +class WeakPtrSharedData { +public: + WeakPtrSharedData() = default; + + void sharedLock() { + std::size_t noLocks = sharedLocks_; + std::size_t incremented; + do { + if (noLocks == kInvalidValue) return; + incremented = noLocks + 1; + // `compare_exchange_weak()` is invoked in a cycle to handle the case, + // if another thread has just modified `sharedLocks_` (so that it is not + // equal to `noLocks` any more). We early return, if `sharedLocks_` became + // equal to `kInvalidValue`. + } while (!sharedLocks_.compare_exchange_weak(noLocks, incremented)); + } + + void sharedUnlock() { + std::size_t noLocks = sharedLocks_; + std::size_t decremented; + do { + if (noLocks == kInvalidValue) return; + assert(noLocks > 0u); + decremented = noLocks - 1; + } while (!sharedLocks_.compare_exchange_weak(noLocks, decremented)); + } + + void invalidate() { + assert(valid()); + std::size_t noLocks = 0u; + while (!sharedLocks_.compare_exchange_weak(noLocks, kInvalidValue)) { + assert(noLocks != kInvalidValue); + noLocks = 0u; + } + assert(!valid()); + } + + bool valid() const { return sharedLocks_ != kInvalidValue; } + +private: + static constexpr size_t kInvalidValue = std::numeric_limits::max(); + std::atomic_size_t sharedLocks_{0u}; +}; + +using StrongRef = std::shared_ptr; +using WeakRef = std::weak_ptr; + +template +class WeakPtrBase; + +} // namespace internal +/// @endcond + +/** + * @brief Scope guard for the WeakPtr-wrapped object + * + * The WeakPtr-wrapped object is guaranteed not to be deleted while + * a WeakPtrGuard instance is present in the scope. + */ +class WeakPtrGuard { +public: + /** + * @brief Default move constructor + */ + WeakPtrGuard(WeakPtrGuard&&) noexcept = default; + ~WeakPtrGuard() { + if (strong_) { + strong_->sharedUnlock(); + } + } + +private: + explicit WeakPtrGuard(internal::StrongRef strong) : strong_(std::move(strong)) { + assert(!strong_ || strong_->valid()); + } + internal::StrongRef strong_; + + template + friend class internal::WeakPtrBase; +}; + +namespace internal { + +/** + * @brief Base type for \c WeakPtr class. + * + * Contains the generic API for weak pointer classes. + * + * This class helps to create a \c WeakPtr template specialization for a + * certain type, enabling the type-specific semantics. + * + * \sa WeakPtr + * + * @tparam T the managed object type + */ +template +class WeakPtrBase { +public: + /** + * Gets a lock that protects the managed object, giving + * the guarantee that it will not be deleted (if not + * deleted yet). + * + * Note that it won't make the managed object thread-safe, but + * rather make sure it exists (or not) when the lock + * is being held. + * + * Note: there *MUST* be only one instance of the + * guard referring to the same \a WeakPtrFactory + * available in the scope at a time. + */ + WeakPtrGuard lock() const { + if (StrongRef strong = weak_.lock()) { + strong->sharedLock(); + if (strong->valid()) { + return WeakPtrGuard(std::move(strong)); + } + strong->sharedUnlock(); + } + return WeakPtrGuard(nullptr); + } + + /** + * @brief Quick nonblocking check that the managed object still exists. + * + * Checks if the weak pointer is still pointing to a valid + * object. Note that if the WeakPtrFactory lives in a different + * thread, a `false` result cannot be guaranteed to be + * correct since there is an implicit race condition, + * but a `true` result is always correct. + * + * @return given the thread restrictions, true if expired, + * false otherwise. + */ + bool expired() const { + if (StrongRef strong = weak_.lock()) { + return !strong->valid(); + } + return true; + } + + /** + * @brief Quick nonblocking check that the managed object still exists. + * + * \sa expired() + * + * @return given the thread restrictions, true if the object exists, + * false otherwise. + */ + explicit operator bool() const { return !expired(); } + + /** + * Get a raw pointer to the managed object. + * + * In multi-threaded environment, the caller *MUST* call + * lock() and keep locker, before using it. + * + * Usage should be as brief as possible, because it might + * potentially block the thread where the managed object lives. + * + * @return pointer to the object, nullptr if expired. + */ + T* get() const { + if (StrongRef strong = weak_.lock()) { + if (strong->valid()) { + return ptr_; + } + } + return nullptr; + } + +protected: + /// @cond internal + WeakPtrBase() = default; + WeakPtrBase(WeakPtrBase&&) noexcept = default; + WeakPtrBase(const WeakPtrBase&) noexcept = default; + template // NOLINTNEXTLINE + WeakPtrBase(WeakPtrBase&& other) noexcept : weak_(std::move(other.weak_)), ptr_(static_cast(other.ptr_)) {} + explicit WeakPtrBase(WeakRef weak, T* ptr) : weak_(std::move(weak)), ptr_(ptr) { assert(ptr_); } + WeakPtrBase& operator=(WeakPtrBase&& other) noexcept = default; + WeakPtrBase& operator=(const WeakPtrBase& other) = default; + + ~WeakPtrBase() = default; + +private: + WeakRef weak_; + T* ptr_{}; + template + friend class WeakPtrBase; + /// @endcond +}; + +} // namespace internal + +/** + * @brief Default implementation of a weak pointer to an object. + * + * Weak pointers are safe to access even if the + * pointer outlives the object, which this class wraps. + * + * This class will manage only object lifetime + * but will not deal with thread-safeness of the + * objects it is wrapping. + */ +template +class WeakPtr final : public internal::WeakPtrBase { +public: + /** + * @brief Default constructor. + * + * Constructs empty \c WeakPtr. + */ + WeakPtr() = default; + + /** + * @brief Converting move constructor + * + * \a other becomes empty after the call. + * + * @tparam U a type, which \c T is convertible to + * @param other \c WeakPtr instance + */ + template // NOLINTNEXTLINE + WeakPtr(WeakPtr&& other) noexcept : internal::WeakPtrBase(std::move(other)) {} + + /** + * @brief Default move constructor. + */ + WeakPtr(WeakPtr&&) noexcept = default; + + /** + * @brief Default copy constructor. + */ + WeakPtr(const WeakPtr&) noexcept = default; + + /** + * @brief Replaces the managed object with the one managed by \a other. + * + * \a other becomes empty after the call. + * + * @param other + * @return WeakPtr& \c *this + */ + WeakPtr& operator=(WeakPtr&& other) noexcept = default; + + /** + * @brief Replaces the managed object with the one managed by \a other. + * + * @param other + * @return WeakPtr& \c *this + */ + WeakPtr& operator=(const WeakPtr& other) = default; + + /** + * @brief Dereferences the stored pointer. + * + * Must not be called on empty \c WeakPtr. + * + * @return T* the stored pointer. + */ + T* operator->() const { + T* ptr = this->get(); + assert(ptr); + return ptr; + } + +private: + explicit WeakPtr(internal::WeakRef weak, T* object) : internal::WeakPtrBase(std::move(weak), object) {} + + template + friend class WeakPtrFactory; +}; + +/** + * @brief T wrapper that can create weak pointers. + * + * WARNING: the WeakPtrFactory should all be at the bottom of + * the list of member of the class, making it the first to + * be destroyed and the last to be initialized. + */ +template +class WeakPtrFactory final { +public: + WeakPtrFactory(const WeakPtrFactory&) = delete; + WeakPtrFactory& operator=(const WeakPtrFactory&) = delete; + + /** + * @brief Construct a new \c WeakPtrFactory object. + * + * @param obj an \c T instance to wrap. + */ + explicit WeakPtrFactory(T* obj) : strong_(std::make_shared()), obj_(obj) {} + + /** + * Destroys the factory, invalidating all the + * weak pointers to this object, i.e. makes them empty. + */ + ~WeakPtrFactory() { invalidateWeakPtrs(); } + + /** + * Make a weak pointer for this WeakPtrFactory. Weak pointer + * can be used for safely accessing the T object and not worry + * about lifetime. + * + * @return a weak pointer. + */ + WeakPtr makeWeakPtr() { return WeakPtr{strong_, obj_}; } + + /** + * @brief Makes a weak wrapper for calling a method on the wrapped + * \c T instance. + * + * While the wrapped \c T instance exists, calling the returned wrapper is + * equivalent to invoking \a method on the instance. Note that the instance deletion + * is blocked during the wrapper call. + * + * If the wrapped \c T instance does not exist, calling the returned wrapper + * is ignored. + * + * The example below illustrates creating an \c std::function instance from the + * returned wrapper. + * + * \code + * class T { + * void foo(int); + * std::function makeWeakFoo() { + * return weakFactory.makeWeakMethod(&T::foo); + * } + * mapbox::base::WeakPtrFactory weakFactory{this}; + * }; + * \endcode + * + * @param method Pointer to an \c T class method. + * @return auto Callable object + */ + template + auto makeWeakMethod(Method method) { + return [weakPtr = makeWeakPtr(), method](auto&&... params) mutable { + WeakPtrGuard guard = weakPtr.lock(); + if (T* obj = weakPtr.get()) { + (obj->*method)(std::forward(params)...); + } + }; + } + + /** + * @brief Invalidates all existing weak pointers. + * + * This method is particularly useful, when \c T class has a user-defined destructor, + * that makes the wrapped instance invalid even before entering the \c WeakPtrFactory + * destructor. + * In this case, clients *MUST* explicitly call \c invalidateWeakPtrs() before freeing any resources. + * + * Note: After \c invalidateWeakPtrs() is called, \c makeWeakPtr() returns empty weak pointers. + */ + void invalidateWeakPtrs() { + if (strong_) strong_->invalidate(); + strong_.reset(); + } + +private: + internal::StrongRef strong_; + T* obj_; +}; + +} // namespace base +} // namespace mapbox diff --git a/vendor/maplibre-native-base/include/mapbox/util/expected.hpp b/vendor/maplibre-native-base/include/mapbox/util/expected.hpp new file mode 100644 index 000000000000..48b7cf980dba --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/util/expected.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace mapbox { +namespace base { + +template +using expected = nonstd::expected; + +template +auto make_unexpected(E&& value) { + return nonstd::make_unexpected(std::move(value)); +} + +} // namespace base +} // namespace mapbox diff --git a/vendor/maplibre-native-base/include/mapbox/util/type_wrapper.hpp b/vendor/maplibre-native-base/include/mapbox/util/type_wrapper.hpp new file mode 100644 index 000000000000..92289e947a74 --- /dev/null +++ b/vendor/maplibre-native-base/include/mapbox/util/type_wrapper.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include + +namespace mapbox { +namespace base { + +class TypeWrapper { +public: + TypeWrapper() noexcept : storage_(nullptr, noop_deleter) {} + TypeWrapper(TypeWrapper&&) noexcept = default; + TypeWrapper& operator=(TypeWrapper&&) noexcept = default; + + template // NOLINTNEXTLINE misc-forwarding-reference-overload + TypeWrapper(T&& value) noexcept + : storage_(new std::decay_t(std::forward(value)), cast_deleter>) { + static_assert(!std::is_same>::value, "TypeWrapper must not wrap itself."); + } + + bool has_value() const noexcept { return static_cast(storage_); } + + template + T& get() noexcept { // NOLINTNEXTLINE cppcoreguidelines-pro-type-reinterpret-cast + return *reinterpret_cast(storage_.get()); + } + +private: + template + static void cast_deleter(void* ptr) noexcept { + delete reinterpret_cast(ptr); // NOLINT cppcoreguidelines-pro-type-reinterpret-cast + } + static void noop_deleter(void*) noexcept {} + + using storage_t = std::unique_ptr; + storage_t storage_; +}; + +} // namespace base +} // namespace mapbox diff --git a/vendor/maplibre-native-base/test/.gitignore b/vendor/maplibre-native-base/test/.gitignore new file mode 100644 index 000000000000..91001a90fb71 --- /dev/null +++ b/vendor/maplibre-native-base/test/.gitignore @@ -0,0 +1 @@ +test_defines.hpp diff --git a/vendor/maplibre-native-base/test/CMakeLists.txt b/vendor/maplibre-native-base/test/CMakeLists.txt new file mode 100644 index 000000000000..a26c9f8d0ddf --- /dev/null +++ b/vendor/maplibre-native-base/test/CMakeLists.txt @@ -0,0 +1,31 @@ +include(${PROJECT_SOURCE_DIR}/extras/googletest.cmake) + +set(TEST_BINARY_PATH ${CMAKE_CURRENT_BINARY_DIR}) +configure_file(${PROJECT_SOURCE_DIR}/test/test_defines.hpp.in ${PROJECT_BINARY_DIR}/test_defines.hpp) + +function(create_test folder_name) + set (target_name "test_${folder_name}") + set (curr_folder "${PROJECT_SOURCE_DIR}/test/${folder_name}") + + file (GLOB_RECURSE test_files "${curr_folder}/*.cpp" "${curr_folder}/*.hpp") + message (STATUS "Adding test ${target_name}") + + add_executable(${target_name} ${test_files}) + target_link_libraries(${target_name} PRIVATE + MapLibreNative::Base + gtest_all + pthread + ) + + target_include_directories(${target_name} PRIVATE + ${curr_folder} + ${PROJECT_BINARY_DIR} + ) + + add_test(NAME ${target_name} COMMAND ${target_name} ${TEST_ARGUMENTS}) +endfunction() + +create_test("compatibility") +create_test("io") +create_test("std") +create_test("util") diff --git a/vendor/maplibre-native-base/test/compatibility/value.cpp b/vendor/maplibre-native-base/test/compatibility/value.cpp new file mode 100644 index 000000000000..6e0f29f08da6 --- /dev/null +++ b/vendor/maplibre-native-base/test/compatibility/value.cpp @@ -0,0 +1,20 @@ +#include "mapbox/compatibility/value.hpp" + +#include + +template +void unused(T&&) {} + +TEST(Compatibility, Dummy) { + mapbox::base::Value v; + EXPECT_FALSE(bool(v)); + + mapbox::base::ValueArray va; + EXPECT_EQ(va.size(), 0); + + mapbox::base::ValueObject vo; + EXPECT_EQ(vo.size(), 0); + + mapbox::base::NullValue nv; + unused(nv); +} diff --git a/vendor/maplibre-native-base/test/fixtures/hello_world.txt b/vendor/maplibre-native-base/test/fixtures/hello_world.txt new file mode 100644 index 000000000000..8ab686eafeb1 --- /dev/null +++ b/vendor/maplibre-native-base/test/fixtures/hello_world.txt @@ -0,0 +1 @@ +Hello, World! diff --git a/vendor/maplibre-native-base/test/io/io.cpp b/vendor/maplibre-native-base/test/io/io.cpp new file mode 100644 index 000000000000..630a80cd04db --- /dev/null +++ b/vendor/maplibre-native-base/test/io/io.cpp @@ -0,0 +1,49 @@ +#include "mapbox/io/io.hpp" + +#include + +#include +#include + +#include "io_delete.hpp" +#include "mapbox/util/expected.hpp" +#include "test_defines.hpp" + +TEST(io, ReadWriteFiles) { + const std::string path(std::string(TEST_BINARY_PATH) + "/foo.txt"); + const std::string copyPath(std::string(TEST_BINARY_PATH) + "/bar.txt"); + const std::string invalidPath("invalid"); + const std::string unauthorizedPath("/root/unauthorized"); + const std::string bar("bar"); + + mapbox::base::expected voidExpected = mapbox::base::io::writeFile(path, bar); + EXPECT_TRUE(voidExpected); + + voidExpected = mapbox::base::io::writeFile(unauthorizedPath, bar); + EXPECT_FALSE(voidExpected); + EXPECT_EQ(voidExpected.error(), std::string("Failed to write file '/root/unauthorized'")); + + nonstd::expected stringExpected = mapbox::base::io::readFile(path); + EXPECT_TRUE(stringExpected); + EXPECT_EQ(*stringExpected, bar); + + stringExpected = mapbox::base::io::readFile(invalidPath); + EXPECT_FALSE(stringExpected); + EXPECT_EQ(stringExpected.error(), std::string("Failed to read file 'invalid'")); + + voidExpected = mapbox::base::io::copyFile(path, copyPath); + EXPECT_TRUE(voidExpected); + + stringExpected = mapbox::base::io::readFile(copyPath); + EXPECT_EQ(*stringExpected, bar); + + voidExpected = mapbox::base::io::copyFile(path, unauthorizedPath); + EXPECT_FALSE(voidExpected); + EXPECT_EQ(voidExpected.error(), std::string("Failed to write file '/root/unauthorized'")); + + voidExpected = mapbox::base::io::copyFile(invalidPath, path); + EXPECT_FALSE(voidExpected); + EXPECT_EQ(voidExpected.error(), std::string("Failed to read file 'invalid'")); + + deleteTests(path, copyPath, invalidPath); +} diff --git a/vendor/maplibre-native-base/test/io/io_delete.cpp b/vendor/maplibre-native-base/test/io/io_delete.cpp new file mode 100644 index 000000000000..adba8bc7922e --- /dev/null +++ b/vendor/maplibre-native-base/test/io/io_delete.cpp @@ -0,0 +1,21 @@ +#include "io_delete.hpp" + +#include + +#include +#include +#include + +void deleteTests(const std::string& path, const std::string& copyPath, const std::string& invalidPath) { + nonstd::expected voidExpected; + + voidExpected = mapbox::base::io::deleteFile(path); + EXPECT_TRUE(voidExpected); + + voidExpected = mapbox::base::io::deleteFile(copyPath); + EXPECT_TRUE(voidExpected); + + voidExpected = mapbox::base::io::deleteFile(invalidPath); + EXPECT_FALSE(voidExpected); + EXPECT_EQ(voidExpected.error(), std::string("Failed to delete file 'invalid'")); +} diff --git a/vendor/maplibre-native-base/test/io/io_delete.hpp b/vendor/maplibre-native-base/test/io/io_delete.hpp new file mode 100644 index 000000000000..61d55141f2bb --- /dev/null +++ b/vendor/maplibre-native-base/test/io/io_delete.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include + +void deleteTests(const std::string& path, const std::string& copyPath, const std::string& invalidPath); diff --git a/vendor/maplibre-native-base/test/std/weak.cpp b/vendor/maplibre-native-base/test/std/weak.cpp new file mode 100644 index 000000000000..0c355f9dfe28 --- /dev/null +++ b/vendor/maplibre-native-base/test/std/weak.cpp @@ -0,0 +1,202 @@ +#include "mapbox/std/weak.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +TEST(WeakPtr, Lock) { + using namespace std::chrono_literals; + static std::atomic_int g_i; + struct TestLock { + void inc() { ++g_i; } + mapbox::base::WeakPtrFactory factory_{this}; + }; + + auto t = std::make_unique(); + auto weak1 = t->factory_.makeWeakPtr(); + auto weak2 = t->factory_.makeWeakPtr(); + auto weak3 = weak2; + + std::thread thread1([&] { + auto guard = weak1.lock(); + std::this_thread::sleep_for(150ms); + weak1->inc(); + }); + std::thread thread2([&] { + auto guard = weak2.lock(); + std::this_thread::sleep_for(200ms); + weak2->inc(); + }); + { + auto guard = weak3.lock(); + std::this_thread::sleep_for(50ms); + weak3->inc(); + } + + EXPECT_FALSE(weak1.expired()); + EXPECT_FALSE(weak2.expired()); + EXPECT_TRUE(weak1); + EXPECT_TRUE(weak2); + ASSERT_NO_THROW(t.reset()); // Should not crash. + thread1.join(); + thread2.join(); + + EXPECT_TRUE(weak1.expired()); + EXPECT_TRUE(weak2.expired()); + EXPECT_FALSE(weak1); + EXPECT_FALSE(weak2); + EXPECT_EQ(g_i, 3); +} + +TEST(WeakPtr, InvalidateWeakPtrs) { + using namespace std::chrono_literals; + static std::atomic_int g_i; + struct TestLock { + void inc() { ++g_i; } + mapbox::base::WeakPtrFactory factory_{this}; + }; + + auto t = std::make_unique(); + auto weak1 = t->factory_.makeWeakPtr(); + auto weak2 = t->factory_.makeWeakPtr(); + auto weak3 = weak2; + + std::thread thread1([&] { + auto guard = weak1.lock(); + std::this_thread::sleep_for(150ms); + weak1->inc(); + }); + std::thread thread2([&] { + auto guard = weak2.lock(); + std::this_thread::sleep_for(200ms); + weak2->inc(); + }); + { + auto guard = weak3.lock(); + std::this_thread::sleep_for(50ms); + weak3->inc(); + } + + EXPECT_TRUE(weak1); + EXPECT_TRUE(weak2); + EXPECT_TRUE(weak3); + t->factory_.invalidateWeakPtrs(); + + // All the existing weak pointer have expired. + EXPECT_FALSE(weak3); + + thread1.join(); + thread2.join(); + + EXPECT_FALSE(weak1); + EXPECT_FALSE(weak2); + EXPECT_EQ(g_i, 3); + + // The newly created one is empty. + auto weak4 = t->factory_.makeWeakPtr(); + EXPECT_FALSE(weak4); +} + +TEST(WeakPtr, MultipleLock) { + using namespace std::chrono_literals; + using std::chrono::system_clock; + + static std::atomic_int g_i; + struct TestLock { + void inc() { ++g_i; } + mapbox::base::WeakPtrFactory factory_{this}; + }; + + std::time_t now = system_clock::to_time_t(system_clock::now()); + + struct std::tm* tm = std::localtime(&now); + ++tm->tm_sec; // Wait for the next second. + auto nextSecond = system_clock::from_time_t(mktime(tm)); + + auto t = std::make_unique(); + + const size_t threadsCount = 50u; + + std::vector threads; + threads.reserve(threadsCount); + + for (size_t i = 0; i < threadsCount; ++i) { + std::thread thread([nextSecond, weak = t->factory_.makeWeakPtr()] { + auto guard = weak.lock(); + std::this_thread::sleep_until(nextSecond); + weak->inc(); + }); + threads.emplace_back(std::move(thread)); + } + + t.reset(); + for (auto& thread : threads) { + thread.join(); + } + EXPECT_EQ(g_i, threadsCount); +} + +TEST(WeakPtr, WeakMethod) { + using namespace std::chrono_literals; + static std::atomic_int g_i; + class Test { + public: + void increaseGlobal(int delta) { g_i += delta; } + std::function makeWeakIncreaseGlobal() { return factory_.makeWeakMethod(&Test::increaseGlobal); } + + private: + mapbox::base::WeakPtrFactory factory_{this}; + }; + + auto t = std::make_unique(); + std::function weak1 = t->makeWeakIncreaseGlobal(); + std::function weak2 = t->makeWeakIncreaseGlobal(); + std::function weak3 = weak2; + + std::thread thread1([&] { weak1(1); }); + std::thread thread2([&] { weak2(10); }); + std::this_thread::sleep_for(50ms); + weak3(100); + + t.reset(); // Should not crash. + // The following calls are ignored. + weak1(1); + weak2(2); + weak3(3); + thread1.join(); + thread2.join(); + + EXPECT_EQ(g_i, 111); +} + +TEST(WeakPtr, WeakMethodBlock) { + // NOLINTNEXTLINE(google-build-using-namespace) + using namespace std::chrono; + using namespace std::chrono_literals; + static std::atomic_bool g_call_finished{false}; + struct Test { + void block(decltype(1ms) duration) { + std::this_thread::sleep_for(duration); + g_call_finished = true; + } + mapbox::base::WeakPtrFactory factory_{this}; + }; + + auto t = std::make_unique(); + auto weak = t->factory_.makeWeakMethod(&Test::block); + auto first = high_resolution_clock::now(); + + std::thread thread([&] { weak(100ms); }); + std::this_thread::sleep_for(10ms); + t.reset(); // Deletion is blocked until weak(100ms) call returns. + thread.join(); + auto totalTime = duration_cast(high_resolution_clock::now() - first); + + EXPECT_TRUE(g_call_finished); + EXPECT_GE(totalTime, 100ms); +} diff --git a/vendor/maplibre-native-base/test/test_defines.hpp.in b/vendor/maplibre-native-base/test/test_defines.hpp.in new file mode 100644 index 000000000000..3c5151af6b12 --- /dev/null +++ b/vendor/maplibre-native-base/test/test_defines.hpp.in @@ -0,0 +1 @@ +#define TEST_BINARY_PATH "${TEST_BINARY_PATH}" diff --git a/vendor/maplibre-native-base/test/util/type_wrapper.cpp b/vendor/maplibre-native-base/test/util/type_wrapper.cpp new file mode 100644 index 000000000000..bfa6b7fb5716 --- /dev/null +++ b/vendor/maplibre-native-base/test/util/type_wrapper.cpp @@ -0,0 +1,174 @@ +#include "mapbox/util/type_wrapper.hpp" + +#include + +using mapbox::base::TypeWrapper; + +namespace { + +class TestType { +public: + TestType() { str[0] = 'a'; } + + // Detect moves + TestType(TestType&& t) noexcept : i1(t.i1 + 1), i2(t.i2 + 2) { str[0] = t.str[0] + 1; } + + TestType(const TestType&) = delete; + TestType& operator=(const TestType&) = delete; + + int i1 = 0; + int i2 = 1; + char str[256] = {}; +}; + +} // namespace + +TEST(TypeWrapper, Empty) { + EXPECT_FALSE(TypeWrapper().has_value()); +} + +TEST(TypeWrapper, BasicTypes) { + TypeWrapper i = 3; + EXPECT_TRUE(i.has_value()); + EXPECT_EQ(i.get(), 3); + + auto iValue = i.get(); + EXPECT_EQ(iValue, 3); + + EXPECT_TRUE(TypeWrapper(4).has_value()); + EXPECT_EQ(TypeWrapper(4).get(), 4); + + TypeWrapper f = 6.2f; + EXPECT_TRUE(f.has_value()); + EXPECT_EQ(f.get(), 6.2f); + + const float fValue = f.get(); + EXPECT_EQ(fValue, 6.2f); + + EXPECT_TRUE(TypeWrapper(1.0f).has_value()); + EXPECT_EQ(TypeWrapper(1.0f).get(), 1.0f); + + TypeWrapper c = 'z'; + EXPECT_TRUE(c.has_value()); + EXPECT_EQ(c.get(), 'z'); + + EXPECT_TRUE(TypeWrapper('z').has_value()); + EXPECT_EQ(TypeWrapper('z').get(), 'z'); +} + +TEST(TypeWrapper, TypesMove) { + TypeWrapper i = 3; + EXPECT_TRUE(i.has_value()); + + TypeWrapper f = 6.2f; + EXPECT_TRUE(f.has_value()); + + f = std::move(i); + EXPECT_FALSE(i.has_value()); // NOLINT(bugprone-use-after-move) + + EXPECT_TRUE(f.has_value()); + EXPECT_EQ(f.get(), 3); +} + +TEST(TypeWrapper, SmallType) { + struct T { + explicit T(int32_t* p_) : p(p_) { (*p)++; } + + T(T&& t) noexcept : p(t.p) { (*p)++; } + + ~T() { (*p)--; } + + T(const T&) = delete; + T& operator=(const T&) = delete; + + int32_t* p; + }; + + int32_t p = 0; + + { + TypeWrapper u1 = TypeWrapper(T(&p)); + EXPECT_EQ(p, 1); + + auto u2(std::move(u1)); + EXPECT_EQ(p, 1); + } + + EXPECT_EQ(p, 0); +} + +TEST(TypeWrapper, LargeType) { + TestType t1; + TypeWrapper u1 = TypeWrapper(std::move(t1)); + EXPECT_TRUE(u1.has_value()); + + // TestType should be moved into owning TypeWrapper + EXPECT_EQ(u1.get().i1, 1); + + auto u2(std::move(u1)); + EXPECT_FALSE(u1.has_value()); // NOLINT(bugprone-use-after-move) + + // TestType should not be moved when owning TypeWrapper is moved; + EXPECT_EQ(u2.get().i1, 1); + + // TestType should not be moved out of owning TypeWrapper + auto& t2 = u2.get(); + EXPECT_TRUE(u2.has_value()); + EXPECT_EQ(t2.i1, 1); +} + +TEST(TypeWrapper, Pointer) { + auto* t1 = new TestType(); // NOLINT cppcoreguidelines-owning-memory + + auto u1 = TypeWrapper(t1); + EXPECT_TRUE(u1.has_value()); + + // Only the pointer should be moved + TestType* t2 = u1.get(); // NOLINT cppcoreguidelines-owning-memory + EXPECT_EQ(t2->i1, 0); + + TypeWrapper u2(4); + std::swap(u2, u1); + + EXPECT_TRUE(u1.has_value()); + EXPECT_TRUE(u2.has_value()); + + t2 = u2.get(); + EXPECT_EQ(t2->i1, 0); + delete t2; // NOLINT cppcoreguidelines-owning-memory +} + +TEST(TypeWrapper, UniquePtr) { + auto t1 = std::make_unique(); + auto u1 = TypeWrapper(std::move(t1)); + + EXPECT_EQ(t1, nullptr); + EXPECT_TRUE(u1.has_value()); + + u1 = TypeWrapper(); + EXPECT_FALSE(u1.has_value()); + + TypeWrapper u2; + auto* t3 = new TestType(); // NOLINT cppcoreguidelines-owning-memory + u2 = std::unique_ptr(t3); + EXPECT_TRUE(u2.has_value()); +} + +TEST(TypeWrapper, SharedPtr) { + std::shared_ptr shared(new int(3)); + std::weak_ptr weak = shared; + TypeWrapper u1 = 0; + + EXPECT_EQ(weak.use_count(), 1); + TypeWrapper u2 = shared; + EXPECT_EQ(weak.use_count(), 2); + + u1 = std::move(u2); + EXPECT_EQ(weak.use_count(), 2); + std::swap(u2, u1); + EXPECT_EQ(weak.use_count(), 2); + u2 = 0; + EXPECT_EQ(weak.use_count(), 1); + shared = nullptr; + EXPECT_EQ(weak.use_count(), 0); +} From 42a3a426206b8dc1a4ae3d406788cd420323e1dc Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 17 Apr 2025 19:32:15 -0400 Subject: [PATCH 147/339] Restore Rust build, fix cxx-bridge version (#3402) --- .github/workflows/linux-ci.yml | 6 ++++- MODULE.bazel | 4 ++-- docker/startup.sh | 3 ++- docs/mdbook/src/rust.md | 2 +- rustutils/Cargo.lock | 41 +++++++++++++++++++++++++--------- rustutils/Cargo.toml | 2 +- rustutils/generate.sh | 2 +- rustutils/rustutils.cmake | 2 +- 8 files changed, 44 insertions(+), 18 deletions(-) diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index b5e1ddc8ab21..118a85788f9e 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -53,7 +53,7 @@ jobs: strategy: fail-fast: true matrix: - renderer: [vulkan, drawable] + renderer: [vulkan, drawable, drawable-rust] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -79,6 +79,10 @@ jobs: - name: Install dependencies run: .github/scripts/install-linux-deps + - if: matrix.renderer == 'drawable-rust' + run: | + echo "renderer_flag_cmake=DMLN_WITH_OPENGL=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" + cargo install cxxbridge-cmd --version 1.0.154 --locked - if: matrix.renderer == 'drawable' run: | diff --git a/MODULE.bazel b/MODULE.bazel index 36d5814d281b..7aef664dc095 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -71,10 +71,10 @@ darwin_config( ) bazel_dep(name = "rules_rust", version = "0.59.2") -bazel_dep(name = "cxx.rs", version = "1.0.136") +bazel_dep(name = "cxx.rs", version = "1.0.154") git_override( module_name = "cxx.rs", - commit = "dfb54b4a6b2c60de54431ae97c2014aee96c162c", + commit = "204d76f53ab2380dd9d532795781beb51c953520", # 1.0.154 remote = "https://github.com/dtolnay/cxx.git", ) diff --git a/docker/startup.sh b/docker/startup.sh index 9534d378dc62..54fc9045e44f 100644 --- a/docker/startup.sh +++ b/docker/startup.sh @@ -44,7 +44,8 @@ fi if ! command -v cxxbridge > /dev/null; then echo "Installing cxxbridge..." - cargo install cxxbridge-cmd + # Attention: v1.0.154 was the last one was not causing &str passing issues + cargo install cxxbridge-cmd@1.0.154 --locked fi diff --git a/docs/mdbook/src/rust.md b/docs/mdbook/src/rust.md index d063ba86a3cd..9a7a85c3506e 100644 --- a/docs/mdbook/src/rust.md +++ b/docs/mdbook/src/rust.md @@ -25,7 +25,7 @@ See [Platform Support](https://doc.rust-lang.org/nightly/rustc/platform-support. You also need to have cxxbridge installed: ```shell -cargo install cxxbridge-cmd +cargo install cxxbridge-cmd@1.0.154 --locked ``` Set `-DMLN_USE_RUST=ON` when generating a configuration with CMake. diff --git a/rustutils/Cargo.lock b/rustutils/Cargo.lock index 2e77ada5c4be..8c3b671a8e77 100644 --- a/rustutils/Cargo.lock +++ b/rustutils/Cargo.lock @@ -45,10 +45,11 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", "unicode-width", ] @@ -64,9 +65,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.137" +version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc894913dccfed0f84106062c284fa021c3ba70cb1d78797d6f5165d4492e45" +checksum = "76751bca18309cbce06f9821698d6c05b3af5c3fde8af5caf57f11611729397b" dependencies = [ "cc", "cxxbridge-cmd", @@ -78,9 +79,9 @@ dependencies = [ [[package]] name = "cxxbridge-cmd" -version = "1.0.137" +version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d2cb64a95b4b5a381971482235c4db2e0208302a962acdbe314db03cbbe2fb" +checksum = "78ce717e582fc3b56bd2f1eb3cda9916e9b4629721e4c2ce637ac5e7d4beef11" dependencies = [ "clap", "codespan-reporting", @@ -91,15 +92,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.137" +version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f797b0206463c9c2a68ed605ab28892cca784f1ef066050f4942e3de26ad885" +checksum = "aa7fdd4b264a3335a8b21221092bd2fbfba35c3606bd50feb28d22ba3fb0a6e5" [[package]] name = "cxxbridge-macro" -version = "1.0.137" +version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79010a2093848e65a3e0f7062d3f02fb2ef27f866416dfe436fccfa73d3bb59" +checksum = "c36a0a2b78ff9232a3dc584340471d4fa1751a81026cf62f3661a06d5a8bae17" dependencies = [ "proc-macro2", "quote", @@ -211,6 +212,26 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "shlex" version = "1.3.0" diff --git a/rustutils/Cargo.toml b/rustutils/Cargo.toml index f32fceec61c3..fb64131faa6e 100644 --- a/rustutils/Cargo.toml +++ b/rustutils/Cargo.toml @@ -14,7 +14,7 @@ crate-type = ["staticlib"] [dependencies] csscolorparser = "0.7.0" -cxx = "1" +cxx = "1.0.154" [profile.release] lto = true diff --git a/rustutils/generate.sh b/rustutils/generate.sh index 3708914097c6..804dfdbc27ee 100755 --- a/rustutils/generate.sh +++ b/rustutils/generate.sh @@ -2,7 +2,7 @@ # Run this script from the repository root # Install cxxbridge with: -# $ cargo install cxxbridge-cmd +# $ cargo install cxxbridge-cmd@1.0.154 --locked set -e diff --git a/rustutils/rustutils.cmake b/rustutils/rustutils.cmake index 94decf5cd030..c4da8a6bc9a5 100644 --- a/rustutils/rustutils.cmake +++ b/rustutils/rustutils.cmake @@ -8,7 +8,7 @@ include(FetchContent) FetchContent_Declare( Corrosion GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git - GIT_TAG v0.5 # Optionally specify a commit hash, version tag or branch here + GIT_TAG v0.5.1 # Optionally specify a commit hash, version tag or branch here ) FetchContent_MakeAvailable(Corrosion) From 0257d53dfb5a07994a8d1db3f2d39058d47e2e57 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Fri, 18 Apr 2025 06:55:48 -0300 Subject: [PATCH 148/339] Fix sccache error in Windows-CI (#3405) --- .github/workflows/windows-ci.yml | 11 ++++++----- platform/windows/Get-VendorPackages.ps1 | 1 + platform/windows/vendor/vcpkg | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index fd98f40efef4..c9a0b368847a 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -38,6 +38,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + fetch-depth: 0 - name: Get all Windows files that have changed if: github.event_name != 'workflow_dispatch' @@ -62,7 +63,6 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - fetch-depth: 0 - uses: ilammy/msvc-dev-cmd@v1 @@ -75,9 +75,9 @@ jobs: - name: Acquire/Build Maplibre Native Core Dependencies env: - CI: 1 + CI: 1, VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - timeout-minutes: 60 + timeout-minutes: 120 run: | & ${{ github.workspace }}\platform\windows\Get-VendorPackages.ps1 -Triplet ${{ env.VSCMD_ARG_TGT_ARCH }}-windows -Renderer All @@ -112,7 +112,7 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - uses: mozilla-actions/sccache-action@v0.0.8 + - uses: mozilla-actions/sccache-action@v0.0.9 - name: Initialize sccache run: | @@ -122,12 +122,13 @@ jobs: - name: Configure MapLibre Native Core env: CI: 1 + VCPKG_INSTALL_OPTIONS: "--debug" VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" # VCPKG_KEEP_ENV_VARS: "CMAKE_CXX_COMPILER_LAUNCHER;CMAKE_C_COMPILER_LAUNCHER" CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" RENDERER: "${{ matrix.renderer }}" - timeout-minutes: 60 + timeout-minutes: 120 run: | cmake --version & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 diff --git a/platform/windows/Get-VendorPackages.ps1 b/platform/windows/Get-VendorPackages.ps1 index 8c7d2966023c..cc46d2d75151 100644 --- a/platform/windows/Get-VendorPackages.ps1 +++ b/platform/windows/Get-VendorPackages.ps1 @@ -35,6 +35,7 @@ if(-not (Test-Path ('{0}\vcpkg.exe' -f $vcpkg_temp_dir))) & ('{0}\vcpkg.exe' -f $vcpkg_temp_dir) $( @( + '--debug', '--disable-metrics', ('--overlay-triplets={0}' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-triplets')), ('--triplet={0}' -f $Triplet), diff --git a/platform/windows/vendor/vcpkg b/platform/windows/vendor/vcpkg index db4924694eab..ce613c41372b 160000 --- a/platform/windows/vendor/vcpkg +++ b/platform/windows/vendor/vcpkg @@ -1 +1 @@ -Subproject commit db4924694eabc161a7fb8eb43f083d0ca55396e2 +Subproject commit ce613c41372b23b1f51333815feb3edd87ef8a8b From ae58a4c9513965691ba80592ab33f99339a0b4fd Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Fri, 18 Apr 2025 19:06:55 -0400 Subject: [PATCH 149/339] Update Rust cxx version (#3411) Co-authored-by: Bart Louwers --- .github/renovate.json | 1 + .github/workflows/linux-ci.yml | 2 +- MODULE.bazel | 6 ++-- docker/startup.sh | 3 +- docs/mdbook/src/rust.md | 2 +- rustutils/Cargo.lock | 60 +++++++++++++++++----------------- rustutils/Cargo.toml | 2 +- rustutils/generate.sh | 2 +- 8 files changed, 40 insertions(+), 38 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 744b50012a3a..c904ad78945a 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -6,6 +6,7 @@ "groupName": "bazel" } ], + "ignoreDeps": ["cxx.rs"], "schedule": "* * 1,15 * *", "dependencyDashboard": true } diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 118a85788f9e..40c0de073291 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -82,7 +82,7 @@ jobs: - if: matrix.renderer == 'drawable-rust' run: | echo "renderer_flag_cmake=DMLN_WITH_OPENGL=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" - cargo install cxxbridge-cmd --version 1.0.154 --locked + cargo install cxxbridge-cmd --version 1.0.157 --locked - if: matrix.renderer == 'drawable' run: | diff --git a/MODULE.bazel b/MODULE.bazel index 7aef664dc095..838f2bedaa57 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -71,10 +71,12 @@ darwin_config( ) bazel_dep(name = "rules_rust", version = "0.59.2") -bazel_dep(name = "cxx.rs", version = "1.0.154") +bazel_dep(name = "cxx.rs", version = "1.0.157") +# The registry is not always up to date +# See https://registry.bazel.build/modules/cxx.rs git_override( module_name = "cxx.rs", - commit = "204d76f53ab2380dd9d532795781beb51c953520", # 1.0.154 + tag = "1.0.157", remote = "https://github.com/dtolnay/cxx.git", ) diff --git a/docker/startup.sh b/docker/startup.sh index 54fc9045e44f..d51493baac24 100644 --- a/docker/startup.sh +++ b/docker/startup.sh @@ -44,8 +44,7 @@ fi if ! command -v cxxbridge > /dev/null; then echo "Installing cxxbridge..." - # Attention: v1.0.154 was the last one was not causing &str passing issues - cargo install cxxbridge-cmd@1.0.154 --locked + cargo install cxxbridge-cmd@1.0.157 --locked fi diff --git a/docs/mdbook/src/rust.md b/docs/mdbook/src/rust.md index 9a7a85c3506e..657fdfe81138 100644 --- a/docs/mdbook/src/rust.md +++ b/docs/mdbook/src/rust.md @@ -25,7 +25,7 @@ See [Platform Support](https://doc.rust-lang.org/nightly/rustc/platform-support. You also need to have cxxbridge installed: ```shell -cargo install cxxbridge-cmd@1.0.154 --locked +cargo install cxxbridge-cmd@1.0.157 --locked ``` Set `-DMLN_USE_RUST=ON` when generating a configuration with CMake. diff --git a/rustutils/Cargo.lock b/rustutils/Cargo.lock index 8c3b671a8e77..54578e43ce03 100644 --- a/rustutils/Cargo.lock +++ b/rustutils/Cargo.lock @@ -10,27 +10,27 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "cc" -version = "1.2.10" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "shlex", ] [[package]] name = "clap" -version = "4.5.27" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" dependencies = [ "anstyle", "clap_lex", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.155" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76751bca18309cbce06f9821698d6c05b3af5c3fde8af5caf57f11611729397b" +checksum = "3d6354e975ea4ec28033ec3a36fa9baa1a02e3eb22ad740eeb4929370d4f5ba8" dependencies = [ "cc", "cxxbridge-cmd", @@ -79,9 +79,9 @@ dependencies = [ [[package]] name = "cxxbridge-cmd" -version = "1.0.155" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ce717e582fc3b56bd2f1eb3cda9916e9b4629721e4c2ce637ac5e7d4beef11" +checksum = "31860c98f69fc14da5742c5deaf78983e846c7b27804ca8c8319e32eef421bde" dependencies = [ "clap", "codespan-reporting", @@ -92,15 +92,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.155" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa7fdd4b264a3335a8b21221092bd2fbfba35c3606bd50feb28d22ba3fb0a6e5" +checksum = "b0402a66013f3b8d3d9f2d7c9994656cc81e671054822b0728d7454d9231892f" [[package]] name = "cxxbridge-macro" -version = "1.0.155" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36a0a2b78ff9232a3dc584340471d4fa1751a81026cf62f3661a06d5a8bae17" +checksum = "64c0b38f32d68f3324a981645ee39b2d686af36d03c98a386df3716108c9feae" dependencies = [ "proc-macro2", "quote", @@ -110,15 +110,15 @@ dependencies = [ [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "link-cplusplus" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +checksum = "4a6f6da007f968f9def0d65a05b187e2960183de70c160204ecfccf0ee330212" dependencies = [ "cc", ] @@ -167,18 +167,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -208,9 +208,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "serde" @@ -252,9 +252,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.96" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -272,15 +272,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "winapi-util" diff --git a/rustutils/Cargo.toml b/rustutils/Cargo.toml index fb64131faa6e..70b5c609fccc 100644 --- a/rustutils/Cargo.toml +++ b/rustutils/Cargo.toml @@ -14,7 +14,7 @@ crate-type = ["staticlib"] [dependencies] csscolorparser = "0.7.0" -cxx = "1.0.154" +cxx = "1.0.157" [profile.release] lto = true diff --git a/rustutils/generate.sh b/rustutils/generate.sh index 804dfdbc27ee..31d75b6c589e 100755 --- a/rustutils/generate.sh +++ b/rustutils/generate.sh @@ -2,7 +2,7 @@ # Run this script from the repository root # Install cxxbridge with: -# $ cargo install cxxbridge-cmd@1.0.154 --locked +# $ cargo install cxxbridge-cmd@1.0.157 --locked set -e From b03d4b348e1f74f09fb3ec3a535aecfef09da8ff Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 19 Apr 2025 13:01:55 +0200 Subject: [PATCH 150/339] Allow including Mermaid diagrams in Developer Docs (#3412) --- .github/workflows/gh-pages-mdbook.yml | 11 ++++-- docs/mdbook/README.md | 4 +- docs/mdbook/book.toml | 4 ++ .../src/design/ten-thousand-foot-view.md | 32 +++++++++++++++- docs/mdbook/theme/head.hbs | 37 +++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 docs/mdbook/theme/head.hbs diff --git a/.github/workflows/gh-pages-mdbook.yml b/.github/workflows/gh-pages-mdbook.yml index 3e6ea8c4eb1a..9e577cfd3b4a 100644 --- a/.github/workflows/gh-pages-mdbook.yml +++ b/.github/workflows/gh-pages-mdbook.yml @@ -1,7 +1,10 @@ -name: Build & Deploy mdBook documentation +name: gh-pages-mdbook on: workflow_dispatch: + pull_request: + paths: + - 'docs/mdbook/**' push: branches: - main @@ -20,8 +23,8 @@ jobs: - name: Install Dependencies shell: bash run: sudo apt-get install -y libwayland-dev libxkbcommon-dev # Required for winit - - name: Install mdbook-alerts - run: cargo install mdbook-alerts + - name: Install mdbook-alerts, mdbook-mermaid + run: cargo install mdbook-alerts mdbook-mermaid - name: Build working-directory: docs/mdbook shell: bash @@ -33,6 +36,7 @@ jobs: gh-pages-mdbook-deploy: needs: gh-pages-mdbook-build + if: github.event_name != 'pull_request' name: Deploy runs-on: ubuntu-latest steps: @@ -42,6 +46,7 @@ jobs: with: name: book path: artifacts/book + - name: Deploy uses: JamesIves/github-pages-deploy-action@v4.7.3 with: diff --git a/docs/mdbook/README.md b/docs/mdbook/README.md index 9e4a483131df..519d6905b519 100644 --- a/docs/mdbook/README.md +++ b/docs/mdbook/README.md @@ -2,10 +2,10 @@ ## Build Locally -Get the `mdbook` utility as well as [`mdbook-alerts`](https://github.com/lambdalisue/rs-mdbook-alerts), see https://rust-lang.github.io/mdBook/guide/installation.html +Get the `mdbook` utility as well as [`mdbook-alerts`](https://github.com/lambdalisue/rs-mdbook-alerts) and [`mdbook-mermaid`](https://github.com/badboy/mdbook-mermaid), see https://rust-lang.github.io/mdBook/guide/installation.html ``` -cargo install mdbook mdbook-alerts +cargo install mdbook mdbook-alerts mdbook-mermaid ``` Run diff --git a/docs/mdbook/book.toml b/docs/mdbook/book.toml index f68116e87f76..c8af3b2e8949 100644 --- a/docs/mdbook/book.toml +++ b/docs/mdbook/book.toml @@ -7,5 +7,9 @@ title = "MapLibre Native Developer Documentation" [output.html] additional-css = ["diff.css"] +additional-js = [] [preprocessor.alerts] + +[preprocessor.mermaid] +command = "mdbook-mermaid" diff --git a/docs/mdbook/src/design/ten-thousand-foot-view.md b/docs/mdbook/src/design/ten-thousand-foot-view.md index 5cbdd9f5db00..c3753c381262 100644 --- a/docs/mdbook/src/design/ten-thousand-foot-view.md +++ b/docs/mdbook/src/design/ten-thousand-foot-view.md @@ -1,6 +1,36 @@ # Ten Thousand Foot View -![](media/ten-thousand-foot-view-diagram.png) +```mermaid +graph TD + subgraph Platform + MV[Map View] + MR[Map Renderer] + end + + subgraph "MapLibre Native Core" + M[Map] + S[Style] + L[Layers] + I[Images] + Glyphs + R[Renderer] + TW[TileWorker] + end + + %% Platform Interactions + MV -- initializes --> MR + MV -- Initializes --> M + + %% Core Interactions + MR -- runs the rendering loop --> R + R -- Renders Map --> M + L -- Fetches --> S + L -- Fetches --> I + R -- Sends messages to generate tiles --> TW + TW -- Prepares layers to be rendered --> L + L -- Fetches --> Glyphs +``` + *Figure 1: MapLibre Native Components – Ten Thousand Foot view* From ten thousand foot, MapLibre Native is composed of *Map View* and a diff --git a/docs/mdbook/theme/head.hbs b/docs/mdbook/theme/head.hbs new file mode 100644 index 000000000000..76b4a003281c --- /dev/null +++ b/docs/mdbook/theme/head.hbs @@ -0,0 +1,37 @@ + From c67dfc85dd3298a05091c2aec70eb678ee27bb56 Mon Sep 17 00:00:00 2001 From: wangyingfang <132874950+wangyingfang@users.noreply.github.com> Date: Mon, 21 Apr 2025 19:36:23 +0800 Subject: [PATCH 151/339] Allow initializing MLNMapView with style json (#3240) Co-authored-by: Yingfang Co-authored-by: Bart Louwers --- platform/darwin/src/MLNStyle.h | 14 +++ platform/darwin/src/MLNStyle.mm | 10 ++ platform/darwin/test/MLNMapViewTests.m | 129 ++++++++++++++++++++++++- platform/darwin/test/MLNStyleTests.mm | 15 +++ platform/ios/src/MLNMapView.h | 26 +++++ platform/ios/src/MLNMapView.mm | 34 ++++++- 6 files changed, 224 insertions(+), 4 deletions(-) diff --git a/platform/darwin/src/MLNStyle.h b/platform/darwin/src/MLNStyle.h index ced327ca3830..54757147aa20 100644 --- a/platform/darwin/src/MLNStyle.h +++ b/platform/darwin/src/MLNStyle.h @@ -70,6 +70,20 @@ MLN_EXPORT */ @property (readonly, copy, nullable) NSString *name; +/** + * The style JSON representation of the map. + * + * Setting this property results in an asynchronous style change. If you wish to know when the style + * change is complete, observe the ``MLNMapViewDelegate/mapView:didFinishLoadingStyle:`` method + * on ``MLNMapViewDelegate``. + * + * The JSON must conform to the + * MapLibre Style Specification. + * + * @throws NSInvalidArgumentException if styleJSON is nil or invalid JSON + */ +@property (nonatomic, copy) NSString *styleJSON; + // MARK: Managing Sources /** diff --git a/platform/darwin/src/MLNStyle.mm b/platform/darwin/src/MLNStyle.mm index 48cbe1727ac5..3f4d211ff6a7 100644 --- a/platform/darwin/src/MLNStyle.mm +++ b/platform/darwin/src/MLNStyle.mm @@ -139,6 +139,16 @@ - (NSString *)name { return name.empty() ? nil : @(name.c_str()); } +- (NSString *)styleJSON { + std::string styleJSON = self.rawStyle->getJSON(); + // Return empty string if no style is set + return styleJSON.empty() ? @"" : @(styleJSON.c_str()); +} + +- (void)setStyleJSON:(NSString *)styleJSON { + self.rawStyle->loadJSON([styleJSON UTF8String]); +} + // MARK: Sources - (NSSet<__kindof MLNSource *> *)sources { diff --git a/platform/darwin/test/MLNMapViewTests.m b/platform/darwin/test/MLNMapViewTests.m index 06fa816fcdac..55d9f037da2e 100644 --- a/platform/darwin/test/MLNMapViewTests.m +++ b/platform/darwin/test/MLNMapViewTests.m @@ -9,11 +9,13 @@ #endif static MLNMapView *mapView; - -@interface MLNMapViewTests : XCTestCase +@interface MLNMapViewTests : XCTestCase @end -@implementation MLNMapViewTests +@implementation MLNMapViewTests { + XCTestExpectation *_styleLoadingExpectation; + XCTestExpectation *_styleLoadErrorExpectation; +} - (void)setUp { [super setUp]; @@ -21,14 +23,35 @@ - (void)setUp { [MLNSettings setApiKey:@"pk.feedcafedeadbeefbadebede"]; NSURL *styleURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"]; mapView = [[MLNMapView alloc] initWithFrame:CGRectMake(0, 0, 64, 64) styleURL:styleURL]; + mapView.delegate = self; + if (!mapView.style) { + _styleLoadingExpectation = [self expectationWithDescription:@"Map view should finish loading style."]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + } } - (void)tearDown { + _styleLoadingExpectation = nil; mapView = nil; [MLNSettings setApiKey:nil]; [super tearDown]; } +- (void)mapView:(MLNMapView *)mapView didFinishLoadingStyle:(MLNStyle *)style { + XCTAssertNotNil(mapView.style); + XCTAssertEqual(mapView.style, style); + + [_styleLoadingExpectation fulfill]; +} + +- (void)mapViewDidFailLoadingMap:(MLNMapView *)mapView withError:(NSError *)error { + XCTAssertNotNil(error); + XCTAssertEqual(error.domain, MLNErrorDomain); + if (error.code == MLNErrorCodeLoadStyleFailed || error.code == MLNErrorCodeParseStyleFailed) { + [_styleLoadErrorExpectation fulfill]; + } +} + - (void)testCoordinateBoundsConversion { [mapView setCenterCoordinate:CLLocationCoordinate2DMake(33, 179)]; @@ -160,5 +183,105 @@ - (void)testTileCache { XCTAssertEqual(mapView.tileCacheEnabled, YES); } +- (void)testStyleJSONWhenMapViewInitWithStyleURL { + // Test getting style JSON + NSString *styleJSON = mapView.styleJSON; + XCTAssertNotNil(styleJSON, @"Style JSON should not be nil"); + NSString * expectedJSON = @"{\"version\":8,\"sources\":{},\"layers\":[]}"; + XCTAssertEqualObjects([self normalizeJSON:expectedJSON], + [self normalizeJSON:styleJSON], + @"Style JSON should be expected"); + + // Verify the JSON is valid + NSError *error = nil; + id jsonObject = [NSJSONSerialization JSONObjectWithData:[styleJSON dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + XCTAssertNil(error, @"Style JSON should be valid JSON"); + XCTAssertNotNil(jsonObject, @"Style JSON should parse to a valid object"); + XCTAssertTrue([jsonObject isKindOfClass:[NSDictionary class]], @"Style JSON should represent a dictionary"); +} + +- (void)testMapViewInitWithStyleJSON { + // Test setting style JSON + NSString *styleJSON = @"{\"version\": 8, \"sources\": { \"mapbox\": {\"type\": \"vector\", \"tiles\": [ \"local://tiles/{z}-{x}-{y}.mvt\" ] }}, \"layers\": [], \"metadata\": { \"test\": 1, \"type\": \"template\"}}"; + MLNMapView* mapViewWithJSON = [[MLNMapView alloc] initWithFrame:CGRectMake(0, 0, 64, 64) styleJSON:styleJSON]; + + // Verify the style was updated + NSString *loadedStyleJSON = mapViewWithJSON.styleJSON; + XCTAssertEqualObjects([self normalizeJSON:loadedStyleJSON], + [self normalizeJSON:styleJSON], + @"Style JSON should match what was set"); + + XCTAssertNotNil(mapViewWithJSON.style); + XCTAssertNotNil(mapViewWithJSON.style.sources); +} + +- (void)testUpdateStyleJSON { + _styleLoadingExpectation = nil; + _styleLoadErrorExpectation = [self expectationWithDescription:@"Style should load error"]; + + // Test setting style JSON + NSString *newStyleJSON = @"{\"version\": 8, \"sources\": { \"mapbox\": {\"type\": \"vector\", \"tiles\": [ \"local://tiles/{z}-{x}-{y}.mvt\" ] }}, \"layers\": [], \"metadata\": { \"test\": 1, \"type\": \"template\"}}"; + mapView.styleJSON = newStyleJSON; + + // Verify the style was updated + NSString *updatedStyleJSON = mapView.styleJSON; + XCTAssertEqualObjects([self normalizeJSON:updatedStyleJSON], + [self normalizeJSON:newStyleJSON], + @"Style JSON should match what was set"); + + XCTAssertNotNil(mapView.style); + XCTAssertNotNil(mapView.style.sources); + // source "org.maplibre.annotations" is added by default + XCTAssertEqual(mapView.style.sources.count, 2UL); + + // Test invalid JSON syntax + NSString *invalidJSON = @"{invalid json"; + mapView.styleJSON = invalidJSON; + [self waitForExpectations:@[_styleLoadErrorExpectation] timeout:10]; +} + +- (void)testStyleJSONAfterAddLayer { + // Test getting style JSON + NSString *styleJSON = mapView.styleJSON; + XCTAssertNotNil(styleJSON, @"Style JSON should not be nil"); + + // Add a raster tile source + MLNVectorTileSource *vectorTileSource = [[MLNVectorTileSource alloc] initWithIdentifier:@"some-identifier" tileURLTemplates:@[] options:nil]; + [mapView.style addSource:vectorTileSource]; + + // Add a layer using it + MLNFillStyleLayer *fillLayer = [[MLNFillStyleLayer alloc] initWithIdentifier:@"fillLayer" source:vectorTileSource]; + [mapView.style addLayer:fillLayer]; + + // Style JSON should not be updated + NSString *updatedStyleJSON = mapView.styleJSON; + + XCTAssertEqualObjects([self normalizeJSON:updatedStyleJSON], + [self normalizeJSON:styleJSON], + @"Style JSON should be updated"); +} + +// Helper method to normalize JSON strings for comparison +- (NSString *)normalizeJSON:(NSString *)jsonString { + NSError *error = nil; + id jsonObject = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + if (error) { + return jsonString; + } + + NSData *normalizedData = [NSJSONSerialization dataWithJSONObject:jsonObject + options:0 + error:&error]; + if (error) { + return jsonString; + } + + NSString *normalizedString = [[NSString alloc] initWithData:normalizedData encoding:NSUTF8StringEncoding]; + return normalizedString ?: jsonString; +} @end diff --git a/platform/darwin/test/MLNStyleTests.mm b/platform/darwin/test/MLNStyleTests.mm index 5c4d69fbb799..9f36afeefd4b 100644 --- a/platform/darwin/test/MLNStyleTests.mm +++ b/platform/darwin/test/MLNStyleTests.mm @@ -422,4 +422,19 @@ - (void)testPerformsPlacementTransitions XCTAssertFalse(self.style.performsPlacementTransitions, @"Enabling placement transitions should be NO."); } +- (void)testStyleJSON { + // Test getting style JSON + NSString *styleJSON = self.style.styleJSON; + XCTAssertNotNil(styleJSON, @"Style JSON should not be nil"); + + // Verify the JSON is valid + NSError *error = nil; + id jsonObject = [NSJSONSerialization JSONObjectWithData:[styleJSON dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:&error]; + XCTAssertNil(error, @"Style JSON should be valid JSON"); + XCTAssertNotNil(jsonObject, @"Style JSON should parse to a valid object"); + XCTAssertTrue([jsonObject isKindOfClass:[NSDictionary class]], @"Style JSON should represent a dictionary"); +} + @end diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index beafb9fb0c06..89f78784149b 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -207,6 +207,18 @@ MLN_EXPORT */ - (instancetype)initWithFrame:(CGRect)frame styleURL:(nullable NSURL *)styleURL; +/** + * Initializes and returns a newly allocated map view with the specified frame + * and style JSON. + * + * @param frame The frame for the view, measured in points. + * @param styleJSON JSON string of the map style to display. The JSON must conform to the + * MapLibre Style Specification. + * Specify `nil` for the default style. + * @return An initialized map view. + */ +- (instancetype)initWithFrame:(CGRect)frame styleJSON:(NSString *)styleJSON; + // MARK: Accessing the Delegate /** @@ -253,6 +265,20 @@ MLN_EXPORT */ @property (nonatomic, null_resettable) NSURL *styleURL; +/** + * The style JSON representation of the map. + * + * Setting this property results in an asynchronous style change. If you wish to know when the style + * change is complete, observe the ``MLNMapViewDelegate/mapView:didFinishLoadingStyle:`` method + * on ``MLNMapViewDelegate``. + * + * The JSON must conform to the + * MapLibre Style Specification. + * + * @throws NSInvalidArgumentException if styleJSON is nil or invalid JSON + */ +@property (nonatomic, copy) NSString *styleJSON; + /** Reloads the style. diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index e5329c80915b..da42ab8b8106 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -424,6 +424,7 @@ @interface MLNMapView () 0 && + self.mbglMap.getStyle().getURL().empty()) { + return [NSURL URLWithString:@"local://style.json"]; + } + NSString *styleURLString = @(self.mbglMap.getStyle().getURL().c_str()).mgl_stringOrNilIfEmpty; MLNAssert(styleURLString, @"Invalid style URL string %@", styleURLString); return styleURLString ? [NSURL URLWithString:styleURLString] : nil; @@ -569,6 +589,16 @@ - (void)setStyleURL:(nullable NSURL *)styleURL self.mbglMap.getStyle().loadURL([[styleURL absoluteString] UTF8String]); } +- (NSString *)styleJSON { + return self.style.styleJSON; +} + +- (void)setStyleJSON:(NSString *)styleJSON { + // Reset style and load new JSON + self.style = nil; + self.mbglMap.getStyle().loadJSON([styleJSON UTF8String]); +} + - (IBAction)reloadStyle:(__unused id)sender { MLNLogInfo(@"Reloading style."); NSURL *styleURL = self.styleURL; @@ -890,7 +920,9 @@ - (void)destroyCoreObjects { self.terminated = YES; self.residualCamera = self.camera; self.residualDebugMask = self.debugMask; - self.residualStyleURL = self.styleURL; + if (!_initialStyleJSON) { + self.residualStyleURL = self.styleURL; + } // Tear down C++ objects, insuring worker threads correctly terminate. // Because of how _mbglMap is constructed, we need to destroy it first. From af937218f6056632ba999b88909cc77b2c716f9a Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Mon, 21 Apr 2025 08:21:46 -0400 Subject: [PATCH 152/339] Update node-release workflow - bring over changes from node-ci (#3381) --- .github/workflows/node-release.yml | 30 +- platform/node/README.md | 2 +- platform/node/package-lock.json | 1519 ++++++++-------------------- platform/node/package.json | 13 +- platform/node/scripts/publish.sh | 2 +- 5 files changed, 440 insertions(+), 1126 deletions(-) diff --git a/.github/workflows/node-release.yml b/.github/workflows/node-release.yml index fcc812df6cea..249475538e79 100644 --- a/.github/workflows/node-release.yml +++ b/.github/workflows/node-release.yml @@ -67,15 +67,9 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: + submodules: true fetch-depth: 0 - - name: Setup submodules - shell: bash - run: | - auth_header="$(git config --local --get http.https://github.com/.extraheader)" - git submodule sync --recursive - git -c core.longpaths=true -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive || true - - name: Get OS Architecture if: runner.os == 'MacOS' || runner.os == 'Linux' run: uname -m @@ -106,7 +100,6 @@ jobs: libcurl4-openssl-dev \ libglfw3-dev \ libuv1-dev \ - g++-12 \ libjpeg-dev \ libpng-dev \ libwebp-dev @@ -137,7 +130,7 @@ jobs: if: ${{contains(runner.name, 'GitHub Actions')}} uses: jwlawson/actions-setup-cmake@v2 with: - cmake-version: '3.29.2' + cmake-version: '3.31' - name: cmake version run: | @@ -174,14 +167,7 @@ jobs: - name: Configure maplibre-native (MacOS) if: runner.os == 'MacOS' run: | - cmake . -B build \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DMLN_WITH_NODE=ON \ - -DMLN_WITH_OPENGL=OFF \ - -DMLN_WITH_METAL=ON \ - -DMLN_WITH_WERROR=OFF + cmake --preset macos-node -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} - name: Configure maplibre-native (Linux) if: runner.os == 'Linux' @@ -191,7 +177,6 @@ jobs: -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER=gcc-12 \ - -DCMAKE_CXX_COMPILER=g++-12 \ -DMLN_WITH_NODE=ON - name: "Create directory '${{ github.workspace }}/platform/windows/vendor/vcpkg/bincache' (Windows)" @@ -214,11 +199,12 @@ jobs: - name: Configure maplibre-native (Windows) if: runner.os == 'Windows' + shell: pwsh run: | - cmake . -B build \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ - -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ + cmake . -B build ` + -G Ninja ` + -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} ` + -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ` -DMLN_WITH_NODE=ON - name: Build maplibre-native (MacOS/Linux) diff --git a/platform/node/README.md b/platform/node/README.md index 48a96d74eb3e..2e61182b1cad 100644 --- a/platform/node/README.md +++ b/platform/node/README.md @@ -11,7 +11,7 @@ Binaries are available and downloaded during install for the following platforms - Ubuntu 22.04 (amd64/arm64) - macOS 12 (amd64/arm64) - Windows (amd64) -- Node.js 16, 18, 20, 22 +- Node.js 18, 20, 22 Run: diff --git a/platform/node/package-lock.json b/platform/node/package-lock.json index d4d91e5adcba..27ecb0cf287f 100644 --- a/platform/node/package-lock.json +++ b/platform/node/package-lock.json @@ -10,8 +10,8 @@ "hasInstallScript": true, "license": "BSD-2-Clause", "dependencies": { - "@acalcutt/node-pre-gyp": "^1.0.15", - "@acalcutt/node-pre-gyp-github": "1.4.8", + "@acalcutt/node-pre-gyp-github": "2.0.1", + "@mapbox/node-pre-gyp": "2.0.0", "minimatch": "^9.0.4", "npm-run-all": "^4.1.5" }, @@ -22,9 +22,9 @@ "@mapbox/mvt-fixtures": "3.10.0", "@octokit/plugin-retry": "^7.1.0", "@octokit/rest": "^20.1.0", - "@types/node": "^20.12.7", + "@types/node": "^22.9.0", "argparse": "^2.0.1", - "csscolorparser": "~1.0.3", + "csscolorparser": "^1.0.3", "d3-queue": "3.0.7", "diff": "5.2.0", "ejs": "^3.1.10", @@ -32,13 +32,10 @@ "express": "^4.19.2", "json-stringify-pretty-compact": "^4.0.0", "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "lodash.template": "4.5.0", "mapbox-gl-styles": "2.0.2", "pixelmatch": "^5.3.0", "pngjs": "^7.0.0", "pretty-bytes": "^6.1.1", - "request": "^2.88.0", "semver": "^7.6.0", "shuffle-seed": "1.1.6", "st": "3.0.0", @@ -47,96 +44,36 @@ "xcode": "^3.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/@acalcutt/node-pre-gyp": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@acalcutt/node-pre-gyp/-/node-pre-gyp-1.0.15.tgz", - "integrity": "sha512-+9vgfGWqByWMO/XbbCSpKe/ug7n16YbjKixY6D/Wx6goqx43qdmcXhFrGlnqNbyrpzKwbbQASX7AS/YbZNc/rg==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "node": ">=18" } }, "node_modules/@acalcutt/node-pre-gyp-github": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@acalcutt/node-pre-gyp-github/-/node-pre-gyp-github-1.4.8.tgz", - "integrity": "sha512-GmtxEU5YdBUbeKw0Jy0qUFCy7/seA34iRj3buTlmY4L9ecaV2FKmhvgndhrJ3k7mYo2xQylGjNgpAQXY511oPw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@acalcutt/node-pre-gyp-github/-/node-pre-gyp-github-2.0.1.tgz", + "integrity": "sha512-XWqpm/IzPmh81dzvxNxJOnygOmxUxK5+RAFIQjM8vUlGXkYiBy+L9EqOkDiXT7X2EhDrpd1T2nEMxMhXx8XCag==", + "license": "MIT", "dependencies": { - "@octokit/rest": "18.12.0", - "commander": "7.2.0" + "@octokit/rest": "21.1.1", + "commander": "13.1.0", + "semver": "^7.6.3" }, "bin": { "node-pre-gyp-github": "bin/node-pre-gyp-github.js" } }, - "node_modules/@acalcutt/node-pre-gyp-github/node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@acalcutt/node-pre-gyp-github/node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@acalcutt/node-pre-gyp-github/node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@acalcutt/node-pre-gyp-github/node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, "node_modules/@acalcutt/node-pre-gyp-github/node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "license": "MIT", "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@aws-crypto/crc32": { @@ -1101,6 +1038,27 @@ "node": ">=6.0.0" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@ljharb/resumer": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", @@ -1155,6 +1113,144 @@ "protocol-buffers-schema": "^3.3.2" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@mapbox/point-geometry": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", @@ -1182,25 +1278,17 @@ "@mapbox/point-geometry": "~0.1.0" } }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, "node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", - "peer": true, + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", + "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" }, @@ -1212,18 +1300,17 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", - "peer": true, "engines": { "node": ">= 18" } }, "node_modules/@octokit/core/node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", - "peer": true, + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1231,20 +1318,21 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", - "peer": true + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "license": "MIT" }, "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz", - "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==", - "peer": true, - "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1252,56 +1340,44 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.0.tgz", - "integrity": "sha512-xcLJv4IgfWIOEEVZwfhUN3yHNWJL0AMw1J1Ba8BofM9RdDTbapg6MO4zNxlPS4XXX9aAIsbDRa47K57EhgeVAw==", - "peer": true, + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", - "peer": true, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.1.0" + "@octokit/openapi-types": "^25.0.0" } }, "node_modules/@octokit/core/node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "peer": true + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, "node_modules/@octokit/core/node_modules/universal-user-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "peer": true - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" }, "node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", - "peer": true, + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "license": "MIT", "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -1309,12 +1385,12 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", - "peer": true, + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1322,20 +1398,21 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", - "peer": true + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "license": "MIT" }, "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz", - "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==", - "peer": true, - "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1343,43 +1420,78 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.0.tgz", - "integrity": "sha512-xcLJv4IgfWIOEEVZwfhUN3yHNWJL0AMw1J1Ba8BofM9RdDTbapg6MO4zNxlPS4XXX9aAIsbDRa47K57EhgeVAw==", - "peer": true, + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", - "peer": true, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.1.0" + "@octokit/openapi-types": "^25.0.0" } }, "node_modules/@octokit/graphql/node_modules/universal-user-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "peer": true + "license": "ISC" }, "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-retry": { @@ -1399,54 +1511,34 @@ "@octokit/core": ">=6" } }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", - "dev": true - }, "node_modules/@octokit/plugin-retry/node_modules/@octokit/request-error": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.0.tgz", - "integrity": "sha512-xcLJv4IgfWIOEEVZwfhUN3yHNWJL0AMw1J1Ba8BofM9RdDTbapg6MO4zNxlPS4XXX9aAIsbDRa47K57EhgeVAw==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" } }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", + "node_modules/@octokit/plugin-retry/node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", "dev": true, - "dependencies": { - "@octokit/openapi-types": "^22.1.0" - } + "license": "MIT" }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "node_modules/@octokit/plugin-retry/node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/openapi-types": "^25.0.0" } }, "node_modules/@octokit/rest": { @@ -1492,10 +1584,11 @@ } }, "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1518,17 +1611,12 @@ "node": ">= 18" } }, - "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", - "dev": true - }, "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", - "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^12.6.0" }, @@ -1597,13 +1685,14 @@ } }, "node_modules/@octokit/rest/node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, @@ -1612,10 +1701,11 @@ } }, "node_modules/@octokit/rest/node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1625,21 +1715,13 @@ "node": ">= 18" } }, - "node_modules/@octokit/rest/node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^22.1.0" - } - }, "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@smithy/abort-controller": { @@ -2346,19 +2428,15 @@ } }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2372,41 +2450,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -2418,36 +2461,6 @@ "node": ">=4" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2515,24 +2528,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2549,12 +2544,6 @@ "lru-cache": "^4.0.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2569,21 +2558,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2609,19 +2583,11 @@ } ] }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/before-after-hook": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true }, "node_modules/big-integer": { "version": "1.6.51", @@ -2794,12 +2760,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2813,14 +2773,6 @@ "node": ">=4" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2834,32 +2786,13 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=18" } }, "node_modules/concat-map": { @@ -2867,10 +2800,14 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.4", @@ -2914,10 +2851,11 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2929,9 +2867,10 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -2963,18 +2902,6 @@ "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg=", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -3123,20 +3050,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3149,7 +3062,8 @@ "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true }, "node_modules/destroy": { "version": "1.2.0", @@ -3212,16 +3126,6 @@ "node": "*" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -3252,11 +3156,6 @@ "node": ">=0.10.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -3451,17 +3350,18 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -3475,7 +3375,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -3490,6 +3390,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -3527,32 +3431,21 @@ } ] }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/fast-xml-parser": { "version": "4.4.1", @@ -3644,29 +3537,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3685,21 +3555,11 @@ "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "node_modules/function-bind": { "version": "1.1.2", @@ -3734,25 +3594,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3796,19 +3637,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3828,6 +3661,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3837,6 +3671,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3874,29 +3709,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3976,11 +3788,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4013,33 +3820,6 @@ "node": ">= 0.8" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4076,6 +3856,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4084,7 +3865,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -4220,14 +4002,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -4265,14 +4039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4356,12 +4122,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -4406,12 +4166,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", @@ -4522,41 +4276,17 @@ "node": ">=8" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/json-stringify-pretty-compact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -4579,21 +4309,6 @@ "npm": ">=6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -4629,18 +4344,6 @@ "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -4683,25 +4386,6 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "dev": true }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -4718,28 +4402,6 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/mapbox-gl-styles": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mapbox-gl-styles/-/mapbox-gl-styles-2.0.2.tgz", @@ -4879,40 +4541,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mock-property": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", @@ -4987,20 +4615,6 @@ "node": ">=0.10.0" } }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -5064,34 +4678,6 @@ "node": "*" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -5157,6 +4743,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "dependencies": { "wrappy": "1" } @@ -5186,6 +4773,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5204,10 +4792,11 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "3.0.0", @@ -5233,12 +4822,6 @@ "pbf": "bin/pbf" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", @@ -5364,12 +4947,6 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -5439,47 +5016,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -5501,20 +5037,6 @@ "protocol-buffers-schema": "^3.3.1" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -5540,7 +5062,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.3", @@ -5571,12 +5094,10 @@ "dev": true }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5584,17 +5105,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -5658,11 +5168,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5749,11 +5254,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" - }, "node_modules/simple-plist": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", @@ -5793,31 +5293,6 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/st": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/st/-/st-3.0.0.tgz", @@ -5883,23 +5358,11 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.padend": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", @@ -5962,17 +5425,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6063,30 +5515,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -6096,28 +5524,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -6129,24 +5535,6 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6257,15 +5645,17 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true }, "node_modules/unpipe": { "version": "1.0.0", @@ -6276,28 +5666,11 @@ "node": ">= 0.8" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -6308,16 +5681,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6336,26 +5699,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -6438,18 +5781,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "node_modules/xcode": { "version": "3.0.1", @@ -6472,11 +5808,6 @@ "bin": { "uuid": "dist/bin/uuid" } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/platform/node/package.json b/platform/node/package.json index 44d64cbed0bd..0e970590b577 100644 --- a/platform/node/package.json +++ b/platform/node/package.json @@ -21,8 +21,8 @@ }, "license": "BSD-2-Clause", "dependencies": { - "@acalcutt/node-pre-gyp": "^1.0.15", - "@acalcutt/node-pre-gyp-github": "1.4.8", + "@mapbox/node-pre-gyp": "2.0.0", + "@acalcutt/node-pre-gyp-github": "2.0.1", "minimatch": "^9.0.4", "npm-run-all": "^4.1.5" }, @@ -33,9 +33,9 @@ "@mapbox/mvt-fixtures": "3.10.0", "@octokit/plugin-retry": "^7.1.0", "@octokit/rest": "^20.1.0", - "@types/node": "^20.12.7", + "@types/node": "^22.9.0", "argparse": "^2.0.1", - "csscolorparser": "~1.0.3", + "csscolorparser": "^1.0.3", "d3-queue": "3.0.7", "diff": "5.2.0", "ejs": "^3.1.10", @@ -43,13 +43,10 @@ "express": "^4.19.2", "json-stringify-pretty-compact": "^4.0.0", "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "lodash.template": "4.5.0", "mapbox-gl-styles": "2.0.2", "pixelmatch": "^5.3.0", "pngjs": "^7.0.0", "pretty-bytes": "^6.1.1", - "request": "^2.88.0", "semver": "^7.6.0", "shuffle-seed": "1.1.6", "st": "3.0.0", @@ -58,7 +55,7 @@ "xcode": "^3.0.1" }, "engines": { - "node": ">=6" + "node": ">=18" }, "scripts": { "install": "node-pre-gyp install --fallback-to-build=false", diff --git a/platform/node/scripts/publish.sh b/platform/node/scripts/publish.sh index a849827cfe91..5cd2dd8be39f 100755 --- a/platform/node/scripts/publish.sh +++ b/platform/node/scripts/publish.sh @@ -9,7 +9,7 @@ if [[ "${CIRCLE_TAG}" == "node-v${PACKAGE_JSON_VERSION}" ]] || [[ "${PUBLISH:-}" # Changes to the version targets here should happen in tandem with updates to the # EXCLUDE_NODE_ABIS property in cmake/node.cmake and the "node" engines property in # package.json. - for TARGET in 16.0.0 18.0.0 20.0.0 22.0.0; do + for TARGET in 18.0.0 20.0.0 22.0.0; do rm -rf build/stage if [[ "${BUILDTYPE}" == "RelWithDebInfo" ]]; then From 907c79e0a23ae8be2ad46c5636841969348e97bc Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 21 Apr 2025 16:01:46 +0200 Subject: [PATCH 153/339] Release MapLibre iOS 6.13.0 (#3413) --- platform/ios/CHANGELOG.md | 5 +++++ platform/ios/VERSION | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 46b89df380e2..3ce4107a84d8 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,11 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.13.0 + +- Allow initializing MLNMapView with style JSON ([#3240](https://github.com/maplibre/maplibre-native/pull/3240)). +- Remove legacy renderer from source, build files and CI ([#3384](https://github.com/maplibre/maplibre-native/pull/3384)). Should have no impact on iOS since releases where already using the new drawable renderer architecture since 6.0.0. + ## 6.12.3 - add MLNDefines.h to make sure Metal backend is available in headers ([#3335](https://github.com/maplibre/maplibre-native/issues/3335)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index ffd41f5c6b29..5917993c09da 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.12.3 +6.13.0 From a809039baedb1ef7890df71a0d29e4bf58ed42d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 17:45:46 +0200 Subject: [PATCH 154/339] Bump the github-actions group across 1 directory with 2 updates (#3407) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/android-ci.yml | 2 +- .github/workflows/gh-pages-mdbook.yml | 2 +- .github/workflows/ios-ci.yml | 4 ++-- .github/workflows/linux-ci.yml | 2 +- .github/workflows/windows-ci.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index e4cf00f5d19d..b499492235c1 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -30,7 +30,7 @@ jobs: - name: Get all Android files that have changed if: github.event_name != 'workflow_dispatch' id: changed-files - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: files_yaml_from_source_file: .github/changed-files.yml diff --git a/.github/workflows/gh-pages-mdbook.yml b/.github/workflows/gh-pages-mdbook.yml index 9e577cfd3b4a..9948868f8e59 100644 --- a/.github/workflows/gh-pages-mdbook.yml +++ b/.github/workflows/gh-pages-mdbook.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: extractions/setup-just@v2 + - uses: extractions/setup-just@v3 - name: Setup mdBook uses: peaceiris/actions-mdbook@v2 - name: Install Dependencies diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index e251c68824fa..6f53dc59b738 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -43,7 +43,7 @@ jobs: - name: Get all iOS files that have changed if: github.event_name != 'workflow_dispatch' id: changed-files-yaml - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: files_yaml_from_source_file: .github/changed-files.yml @@ -215,7 +215,7 @@ jobs: - name: VERSION file changed id: version-file-ios-changed - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: files: platform/ios/VERSION diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 40c0de073291..8a6e9ea48bff 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -38,7 +38,7 @@ jobs: if: github.event_name != 'workflow_dispatch' id: changed-files - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: files_yaml_from_source_file: .github/changed-files.yml diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index c9a0b368847a..fd0c613d844d 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -43,7 +43,7 @@ jobs: - name: Get all Windows files that have changed if: github.event_name != 'workflow_dispatch' id: changed-files - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: files_yaml_from_source_file: .github/changed-files.yml From 3eba74d1ac7efbbbe8cc8882db64cd6c0a1b0a37 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 21 Apr 2025 18:47:21 +0200 Subject: [PATCH 155/339] Add documentation about macOS to Developer Docs (#3415) --- CMakePresets.json | 23 ++++- README.md | 4 +- docs/mdbook/src/SUMMARY.md | 25 +++-- .../src/{platforms.md => platforms/README.md} | 0 .../src/{ => platforms}/android/README.md | 0 .../android/android-documentation.md | 0 .../{ => platforms}/android/android-tests.md | 0 .../src/{ => platforms}/android/benchmark.md | 0 .../src/{ => platforms}/android/release.md | 0 docs/mdbook/src/{ => platforms}/ios/README.md | 0 .../src/{ => platforms}/ios/dev-apps.md | 0 .../{ => platforms}/ios/ios-documentation.md | 0 .../src/{ => platforms}/ios/ios-tests.md | 0 .../mdbook/src/{ => platforms}/ios/release.md | 0 docs/mdbook/src/platforms/macos/README.md | 98 +++++++++++++++++++ platform/android/README.md | 2 +- platform/ios/README.md | 2 +- platform/macos/README.md | 33 +------ 18 files changed, 135 insertions(+), 52 deletions(-) rename docs/mdbook/src/{platforms.md => platforms/README.md} (100%) rename docs/mdbook/src/{ => platforms}/android/README.md (100%) rename docs/mdbook/src/{ => platforms}/android/android-documentation.md (100%) rename docs/mdbook/src/{ => platforms}/android/android-tests.md (100%) rename docs/mdbook/src/{ => platforms}/android/benchmark.md (100%) rename docs/mdbook/src/{ => platforms}/android/release.md (100%) rename docs/mdbook/src/{ => platforms}/ios/README.md (100%) rename docs/mdbook/src/{ => platforms}/ios/dev-apps.md (100%) rename docs/mdbook/src/{ => platforms}/ios/ios-documentation.md (100%) rename docs/mdbook/src/{ => platforms}/ios/ios-tests.md (100%) rename docs/mdbook/src/{ => platforms}/ios/release.md (100%) create mode 100644 docs/mdbook/src/platforms/macos/README.md diff --git a/CMakePresets.json b/CMakePresets.json index 18103ffa0b74..2f40204adca1 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -28,21 +28,36 @@ "CMAKE_SYSTEM_NAME": "Darwin", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_METAL": "ON", - "MLN_WITH_OPENGL": "OFF" + "MLN_WITH_OPENGL": "OFF", + "CMAKE_BUILD_TYPE": "Debug" } }, + { + "name": "macos-xcode", + "displayName": "macOS (Xcode)", + "generator": "Xcode", + "binaryDir": "${sourceDir}/build-macos-xcode", + "inherits": "macos" + }, { "name": "macos-vulkan", - "displayName": "macOS", + "displayName": "macOS Vulkan", "generator": "Ninja", "binaryDir": "${sourceDir}/build-macos-vulkan", + "inherits": "macos", "cacheVariables": { - "CMAKE_SYSTEM_NAME": "Darwin", - "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_VULKAN": "ON", + "MLN_WITH_METAL": "OFF", "MLN_WITH_OPENGL": "OFF" } }, + { + "name": "macos-vulkan-xcode", + "displayName": "macOS Vulkan (Xcode)", + "generator": "Xcode", + "binaryDir": "${sourceDir}/build-macos-vulkan-xcode", + "inherits": "macos-vulkan" + }, { "name": "macos-node", "inherits": "macos", diff --git a/README.md b/README.md index 113f6b97cf02..76b121e48f78 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ The go-to reference is the [MapLibre Native Developer Documentation](https://map Open `platform/android` with Android Studio. -More information: [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/android/index.html). +More information: [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/platforms/android/index.html). ### iOS @@ -216,7 +216,7 @@ xed platform/ios/MapLibre.xcodeproj To generate and open the Xcode project. -More information: [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/ios/index.html). +More information: [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/platforms/ios/index.html). ## Other Platforms diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index d1426f0814d0..1817ed77b4db 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -2,24 +2,23 @@ [Introduction](./introduction.md) -- [Platforms](./platforms.md) +- [Platforms](./platforms/README.md) + - [Android](./platforms/android/README.md) + - [Tests](./platforms/android/android-tests.md) + - [Documentation](./platforms/android/android-documentation.md) + - [Benchmark](./platforms/android/benchmark.md) + - [Release](./platforms/android/release.md) + - [iOS](./platforms/ios/README.md) + - [Tests](./platforms/ios/ios-tests.md) + - [Documentation](./platforms/ios/ios-documentation.md) + - [Release](./platforms/ios/release.md) + - [Development Apps](./platforms/ios/dev-apps.md) + - [macOS](./platforms/macos/README.md) - [Release Policy](./release-policy.md) - [Render Tests](./render-tests.md) -- [Android](./android/README.md) - - [Tests](./android/android-tests.md) - - [Documentation](./android/android-documentation.md) - - [Benchmark](./android/benchmark.md) - - [Release](android/release.md) - -- [iOS](./ios/README.md) - - [Tests](ios/ios-tests.md) - - [Documentation](ios/ios-documentation.md) - - [Release](ios/release.md) - - [Development Apps](ios/dev-apps.md) - - [Design](./design/README.md) - [Ten Thousand Foot View](design/ten-thousand-foot-view.md) - [Coordinate System](design/coordinate-system.md) diff --git a/docs/mdbook/src/platforms.md b/docs/mdbook/src/platforms/README.md similarity index 100% rename from docs/mdbook/src/platforms.md rename to docs/mdbook/src/platforms/README.md diff --git a/docs/mdbook/src/android/README.md b/docs/mdbook/src/platforms/android/README.md similarity index 100% rename from docs/mdbook/src/android/README.md rename to docs/mdbook/src/platforms/android/README.md diff --git a/docs/mdbook/src/android/android-documentation.md b/docs/mdbook/src/platforms/android/android-documentation.md similarity index 100% rename from docs/mdbook/src/android/android-documentation.md rename to docs/mdbook/src/platforms/android/android-documentation.md diff --git a/docs/mdbook/src/android/android-tests.md b/docs/mdbook/src/platforms/android/android-tests.md similarity index 100% rename from docs/mdbook/src/android/android-tests.md rename to docs/mdbook/src/platforms/android/android-tests.md diff --git a/docs/mdbook/src/android/benchmark.md b/docs/mdbook/src/platforms/android/benchmark.md similarity index 100% rename from docs/mdbook/src/android/benchmark.md rename to docs/mdbook/src/platforms/android/benchmark.md diff --git a/docs/mdbook/src/android/release.md b/docs/mdbook/src/platforms/android/release.md similarity index 100% rename from docs/mdbook/src/android/release.md rename to docs/mdbook/src/platforms/android/release.md diff --git a/docs/mdbook/src/ios/README.md b/docs/mdbook/src/platforms/ios/README.md similarity index 100% rename from docs/mdbook/src/ios/README.md rename to docs/mdbook/src/platforms/ios/README.md diff --git a/docs/mdbook/src/ios/dev-apps.md b/docs/mdbook/src/platforms/ios/dev-apps.md similarity index 100% rename from docs/mdbook/src/ios/dev-apps.md rename to docs/mdbook/src/platforms/ios/dev-apps.md diff --git a/docs/mdbook/src/ios/ios-documentation.md b/docs/mdbook/src/platforms/ios/ios-documentation.md similarity index 100% rename from docs/mdbook/src/ios/ios-documentation.md rename to docs/mdbook/src/platforms/ios/ios-documentation.md diff --git a/docs/mdbook/src/ios/ios-tests.md b/docs/mdbook/src/platforms/ios/ios-tests.md similarity index 100% rename from docs/mdbook/src/ios/ios-tests.md rename to docs/mdbook/src/platforms/ios/ios-tests.md diff --git a/docs/mdbook/src/ios/release.md b/docs/mdbook/src/platforms/ios/release.md similarity index 100% rename from docs/mdbook/src/ios/release.md rename to docs/mdbook/src/platforms/ios/release.md diff --git a/docs/mdbook/src/platforms/macos/README.md b/docs/mdbook/src/platforms/macos/README.md new file mode 100644 index 000000000000..251f617fd89f --- /dev/null +++ b/docs/mdbook/src/platforms/macos/README.md @@ -0,0 +1,98 @@ +# macOS + +MapLibre Native can be built for macOS. This is mostly used for development. + +> [!NOTE] +> There are some [AppKit](https://developer.apple.com/documentation/appkit) APIs for macOS the source tree. However those are not actively maintained. There is an [discussion](https://github.com/maplibre/maplibre-native/discussions/3414) on whether we should remove this code. + +## File Structure + +| Path | Description | +|-----------------------------|--------------------------------------------------------------------------| +| `platform/darwin` | Shared code between macOS and iOS | +| `platform/darwin/core` | iOS/macOS specific implementations for interfaces part of the MapLibre Native C++ Core | +| `platform/macos` | macOS specific code | +| `platform/macos/app` | AppKit based example app | + +## Getting Started + +Clone the repo: + +```sh +git clone --recurse-submodules git@github.com:maplibre/maplibre-native.git +``` + +Make sure the following Homebrew packages are installed: + +```sh +brew install bazelisk webp libuv webp icu4c jpeg-turbo glfw +brew link icu4c --force +``` + +You can get started building the project for macOS using either Bazel or CMake. + +## Bazel + +Configure Bazel (optional): + +```sh +cp platform/darwin/bazel/example_config.bzl platform/darwin/bazel/config.bzl +``` + +Run the GLFW app with a style of your choice: + +```sh +bazel run --//:renderer=metal //platform/glfw:glfw_app -- --style https://sgx.geodatenzentrum.de/gdz_basemapworld_vektor/styles/bm_web_wld_col.json +``` + +Create and open Xcode project: + +```sh +bazel run //platform/macos:xcodeproj --@rules_xcodeproj//xcodeproj:extra_common_flags="--//:renderer=metal" +xed platform/macos/MapLibre.xcodeproj +``` + +## CMake + +Configure CMake: + +```sh +cmake --preset macos +``` + +Build and run the render tests: + +```sh +cmake --build build-macos --target mbgl-render-test-runner +build-macos/mbgl-render-test-runner --manifestPath=metrics/macos-xcode11-release-style.json +``` + +Build and run the C++ Tests: + +```sh +cmake --build build-macos --target mbgl-test-runner +npm install && node test/storage/server.js # required test server +# in another terminal +build-macos/mbgl-test-runner +``` + +Create and open an Xcode project with CMake: + +```sh +cmake --preset macos-xcode +xed build-macos-xcode/MapLibre\ Native.xcodeproj +``` + +Configure project for Vulkan (make sure [MoltenVK](https://github.com/KhronosGroup/MoltenVK) is installed): + +```sh +cmake --preset macos-vulkan +``` + +Build and run `mbgl-render` (simple command line utility for rendering maps): + +```sh +cmake --build build-macos-vulkan --target mbgl-render +build-macos-vulkan/bin/mbgl-render -z 7 -x -74 -y 41 --style https://americanamap.org/style.json +open out.png +``` diff --git a/platform/android/README.md b/platform/android/README.md index 029a598eee0b..1e8854b64a92 100644 --- a/platform/android/README.md +++ b/platform/android/README.md @@ -18,4 +18,4 @@ Visit [MapLibre Android Dokka Docs](https://maplibre.org/maplibre-native/android ## Contributing -See the [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/android) for instructions on how to build the project or how to work on the documentation. +See the [MapLibre Android Developer Guide](https://maplibre.org/maplibre-native/docs/book/platforms/android) for instructions on how to build the project or how to work on the documentation. diff --git a/platform/ios/README.md b/platform/ios/README.md index 51d906cc2082..a8d8889cdb22 100644 --- a/platform/ios/README.md +++ b/platform/ios/README.md @@ -11,4 +11,4 @@ Embed interactive maps with scalable, customizable vector maps into iOS Applicat # Contributing -See the [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/ios) for instructions on how to build the project or how to work on the documentation. +See the [MapLibre iOS Developer Guide](https://maplibre.org/maplibre-native/docs/book/platforms/ios) for instructions on how to build the project or how to work on the documentation. diff --git a/platform/macos/README.md b/platform/macos/README.md index d4b27fe0e8ca..8cb6f24797f0 100644 --- a/platform/macos/README.md +++ b/platform/macos/README.md @@ -1,34 +1,5 @@ -# MapLibre Native for macOS +# MapLibre Native on macOS [![GitHub Action build status](https://github.com/maplibre/maplibre-native/workflows/macos-ci/badge.svg)](https://github.com/maplibre/maplibre-native/actions/workflows/macos-ci.yml) -Clone the repo: - -```sh -git clone --recurse-submodules git@github.com:maplibre/maplibre-native.git -``` - -Install needed tooling and dependencies with Homebrew. See [macos-ci.yml](https://github.com/maplibre/maplibre-native/blob/main/.github/workflows/macos-ci.yml) for the most up-to-date dependencies. - -Optionally configure Bazel: - -```sh -cp platform/darwin/bazel/example_config.bzl platform/darwin/bazel/config.bzl -``` - -Create and open Xcode project: - -```sh -bazel run //platform/macos:xcodeproj --@rules_xcodeproj//xcodeproj:extra_common_flags="--//:renderer=metal -xed platform/macos/MapLibre.xcodeproj -``` - -Build and run AppKit sample app directly from the command line: - -```sh -bazel run //platform/macos/app:macos_app --//:renderer=metal -``` - ---- - -The MapLibre Organization does not officially support the macOS to the same extent as iOS (see [project tiers](https://github.com/maplibre/maplibre/blob/main/PROJECT_TIERS.md)). However, bug reports and pull requests are certainly welcome. +Refer to the [MapLibre Native Developer Guide](https://maplibre.org/maplibre-native/docs/book/platforms/macos/index.html) to learn how to build the project for macOS. From 29e7c11d7442e2a73c01f5a93f2e0b883978bed3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 21 Apr 2025 21:47:31 +0200 Subject: [PATCH 156/339] Make sure android-device-test workflow fails when test fails (#3419) --- .github/workflows/android-device-test.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 5fdfb7abe5de..a0776a214256 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -150,7 +150,14 @@ jobs: export testSpecArn="${{ matrix.test.testSpecArn }}" export wait_for_completion=true - echo run_arn="$(./scripts/aws-device-farm/aws-device-farm-run.sh)" > "$GITHUB_ENV" + run_arn="$(./scripts/aws-device-farm/aws-device-farm-run.sh)" + exit_status=$? + echo "run_arn=$run_arn" >> "$GITHUB_ENV" + + # make sure workflow fails + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi - name: Store Test Artifacts if: (matrix.test.name == 'Android Benchmark' || failure()) && env.run_device_test == 'true' From dfa80771346ffba43999aa890578e796c73bd755 Mon Sep 17 00:00:00 2001 From: cjbd Date: Tue, 22 Apr 2025 23:06:54 +0800 Subject: [PATCH 157/339] Update Taywee/args in .gitmodules, use https instead of ssh (#3420) --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 83adba3d69f1..920fa338aadb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -57,7 +57,7 @@ url = https://github.com/protomaps/PMTiles.git [submodule "vendor/maplibre-native-base/extras/args"] path = vendor/maplibre-native-base/extras/args - url = git@github.com:Taywee/args.git + url = https://github.com/Taywee/args [submodule "vendor/maplibre-native-base/extras/expected-lite"] path = vendor/maplibre-native-base/extras/expected-lite url = https://github.com/martinmoene/expected-lite.git From fb224c25dcc2cf5790871952a15e1aa101ecbb9a Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 22 Apr 2025 21:05:36 +0300 Subject: [PATCH 158/339] Add missing `sourceDidChange` event (#3421) --- .gitmodules | 2 +- platform/ios/app/MBXViewController.mm | 5 +++++ platform/ios/src/MLNMapView.mm | 9 +++++++-- platform/ios/src/MLNMapViewDelegate.h | 8 ++++++++ .../ios/test/MLNMapViewDelegateIntegrationTests.swift | 2 ++ platform/macos/src/MLNMapView.mm | 5 +++++ platform/macos/src/MLNMapViewDelegate.h | 8 ++++++++ .../macos/test/MLNMapViewDelegateIntegrationTests.swift | 2 ++ 8 files changed, 38 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 920fa338aadb..fc278675725b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -57,7 +57,7 @@ url = https://github.com/protomaps/PMTiles.git [submodule "vendor/maplibre-native-base/extras/args"] path = vendor/maplibre-native-base/extras/args - url = https://github.com/Taywee/args + url = https://github.com/Taywee/args.git [submodule "vendor/maplibre-native-base/extras/expected-lite"] path = vendor/maplibre-native-base/extras/expected-lite url = https://github.com/martinmoene/expected-lite.git diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index 71c0004800c4..21aad990080f 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -2264,6 +2264,11 @@ - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id Date: Tue, 22 Apr 2025 23:12:01 +0200 Subject: [PATCH 159/339] Debug android-device-farm-run.sh (#3423) --- scripts/aws-device-farm/aws-device-farm-run.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/aws-device-farm/aws-device-farm-run.sh b/scripts/aws-device-farm/aws-device-farm-run.sh index 95a6c856c379..d4220ce9b786 100755 --- a/scripts/aws-device-farm/aws-device-farm-run.sh +++ b/scripts/aws-device-farm/aws-device-farm-run.sh @@ -1,6 +1,7 @@ #!/bin/bash set -e +set -o xtrace # List of required environment variables required_vars=( @@ -87,6 +88,14 @@ arn="$(aws devicefarm schedule-run \ --execution-configuration videoCapture=false \ --output text --query run.arn)" +echo ARN: $arn >&2 + +if [ -z "$arn" ]; then + echo "Error: Failed to schedule Device Farm run or got empty ARN" >&2 + exit 1 +fi + + echo "$arn" if [[ "$wait_for_completion" != "true" ]]; then From 159368138f29d15481dce200e147a354e33719e1 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 23 Apr 2025 17:25:53 +0200 Subject: [PATCH 160/339] Make sure run_arn is set in android-device-test (#3424) --- .github/workflows/android-device-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index a0776a214256..17d3ac5b3914 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -137,6 +137,7 @@ jobs: role-duration-seconds: 14400 - name: Run ${{ matrix.test.name }} on AWS Device Farm + if: env.run_device_test == 'true' run: | export name="${{ matrix.test.name }}" export appType=ANDROID_APP @@ -150,6 +151,8 @@ jobs: export testSpecArn="${{ matrix.test.testSpecArn }}" export wait_for_completion=true + set +e + run_arn="$(./scripts/aws-device-farm/aws-device-farm-run.sh)" exit_status=$? echo "run_arn=$run_arn" >> "$GITHUB_ENV" From 4c60d85056b00c4071c5b003f9e6198a63048204 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 25 Apr 2025 00:57:24 +0200 Subject: [PATCH 161/339] Make sure Android Instrumentation Tests pass again (#3426) --- .../runConfigurations/Instrumentation_Tests.xml | 3 +-- .../org/maplibre/android/maps/MapLibreMapTest.kt | 5 ++++- .../android/testapp/activity/EspressoTest.kt | 2 +- .../android/testapp/style/RuntimeStyleTests.java | 12 ++++++++---- .../testapp/activity/camera/LatLngBoundsActivity.kt | 2 +- .../activity/snapshot/MapSnapshotterActivity.kt | 3 +-- .../activity/style/DataDrivenStyleActivity.kt | 2 +- .../maplibre/android/testapp/styles/TestStyles.kt | 4 +--- 8 files changed, 18 insertions(+), 15 deletions(-) diff --git a/platform/android/.idea/runConfigurations/Instrumentation_Tests.xml b/platform/android/.idea/runConfigurations/Instrumentation_Tests.xml index 5a5b8e710e35..4e6e4d611c3d 100644 --- a/platform/android/.idea/runConfigurations/Instrumentation_Tests.xml +++ b/platform/android/.idea/runConfigurations/Instrumentation_Tests.xml @@ -1,6 +1,6 @@ - +

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 LYb%v0SOonWfnW>3 literal 0 HcmV?d00001 diff --git a/metrics/expectations/platform-linux/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/expected.png b/metrics/expectations/platform-linux/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..07cf78edc28e82169172046e75998b52d533cd73 GIT binary patch literal 128398 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 UL|u3#27!MkPn^MJsGHyZKdt}H%m4rY literal 0 HcmV?d00001 diff --git a/metrics/expectations/platform-windows/render-tests/icon-text-fit/textFit-grid-long/expected.png b/metrics/expectations/platform-windows/render-tests/icon-text-fit/textFit-grid-long/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d47f7f2e1b5753e76d2b25c5f38d4a8361b494bf GIT binary patch literal 9933 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 LYb%v0SOonWfnW>3 literal 0 HcmV?d00001 diff --git a/metrics/expectations/platform-windows/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/expected.png b/metrics/expectations/platform-windows/render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..07cf78edc28e82169172046e75998b52d533cd73 GIT binary patch literal 128398 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 UL|u3#27!MkPn^MJsGHyZKdt}H%m4rY literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/line-pattern/mixed/expectedPixel4a.png b/metrics/integration/render-tests/line-pattern/mixed/expectedPixel4a.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfba9e045eaedc9e450ca82e0b5043c5fa5b1b2 GIT binary patch literal 22794 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 literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/regressions/mapbox-gl-js#5776/expectedPixel4a.png b/metrics/integration/render-tests/regressions/mapbox-gl-js#5776/expectedPixel4a.png new file mode 100644 index 0000000000000000000000000000000000000000..f56b0760067c89df4f5f6b553c948cbabb9d4e60 GIT binary patch literal 3060 zcmeHJ=U3C&7X8r`L3m2~n6qkC&^wtcENA0P^l` zXD$MOnCK`5?2;A%?9S6b0NB&!e#Y@qT-nk{{7?Ft1P#N_^*Hcd1 z@Vw=6zMSTWY-G9r*Zv`cz$=a57md9k%dK>Mm!>B^%V+1$O)RZVI0Vrc8^c8hCntYn z9bPvtBrrD0R_)9AtE)*=@MMA*o|te~C=Gnq76;T00{9dE!arGp+!T3D%Vc%)z?!gd zsxW4K>VZNR1esXC3SUaKja`Ptta;eCu6$MKWsO8xbf|RO_3S=lQrH9*{LPq zvG=)Y=%rR^oX${Rp-vrGY>qnoOrt0NQY^nhOgLF|4YEidbut(Cshar0x| z%Al`z55FP6)c^I-wUXx$ayFG&XzJhfslddUGtn^{z$mkc)ZUSC1YYJ!P7zxtGLRvO z?zr{owEl+6&)+DyNiVqSCMqqzog+kSF14nK+({EDlI$Pe0eTh8G}N+=&})RZS*AJ; z7$e%_wqnO$k#pHe_S@^+*=a6KHwT0ItHwPmBb$8dp>!^4YKR24onW=!U9~nYwG7oL zGL0RNhG>0WTV&;M-1}7M(22O&M_E*Kn0Te*v)WvQYt!BNsx+tRu9Vq7SvpRl+GgU% zs5sn$ji}wSDpDqjX3Vd5CBLZ&`TF9z9Dz{1bLHyI?X3;W;gfMIQ$A!w$2xYL65V$K zwjLy@w@3E0=y9=E7!{2&ewgr z_xn7LQ14wqz;1P?@1I@tDz!9qXbl-^sJhixh>1B^VlYJXw;FurYqYgKn{xudazrWG z?OX39Z{$_>5c6*B0O02X@NP9;sCI!>n@DOj@+acMFx_e_M?grU?;ZS!7SXkXA2vF9v2N#QMTF&=&P-nap`I8~$lgmr+B=0Xt zT}(u$KJNGPV=$*SR~cZk03N9c^q~05`t>|9xH<9txF3BWiybmyy_zUa}(-qH^k~$p(kw4_=2+EBf zW)?NOJ=Vu~5`&xShR54tsWYFkqCi_)gHndRaiQXstc$lTB6wIfB7xguU5lVZ1&8de zG)DK?%rWb(MIAC^&Ma zTQsv~iyI+i1SW7rR0vIPUan#8&>adAjiVn8WDpX20zh9|*!5yUq||BV)=sS>S*R#w zT+B9>#U6vI)FQe4b5;DB(m+S(Xr`r=^06LMVQj(8{2XBHswhDp4J$2~sdDQ3q~+8U zci_kyo}tkyDxtdy5BnOD5?lI69s&IESfrgl3EFbR!KF`zShV&-=fsUOTTjrYS*2kk(-l_Xh_6inuI>6F9xd&KswHB< ztGTkK}0?s)@?_XCr5#)bA+-mb{GFOO&gw;jpV^mF170itbzGD4z#iA|u& zmW_H7VC12H(~YwWn39)h>~ncAF$aVKfs!~Ke3CVx^Cy(Eu&+G3wzeBQPKM)_=Fw@e zBK4LspF>HaHM1T`+*~UeIeuONKg>9VzyhxhKjYVUWZFng-ILLINF^hT-m--#-wPJT z(J*0lMxoQ{2%6l(kC^YT8f>y4LiChnh>Of%mFnDuuOF2q;Y0mdt{y;QU`C1l{h$A5 zstRpeWLt$U-=bt03W~o>P;QmDWJ=>nkI)c1p|#C8`CY>%&m3;}Ija3;MtOe}G+y!J z4@$DxGlQbZlLOpnJ0XF+GiX3d-X=LV=YP+_i3a65l)Wka@rMIk%x#k6Rv&=l_NZb4 zA8!+QP=PuG2$K`Xm!6YAcqj?&@!OVScQb*hy8f5nYl{#W@rOnf1`N7xKD*!U3`F>% z6r5O_{;gr!$5v~@W%W6Vz?j8|Om8qfr`-_%0wjUsF8{(mO#++*fQ{exzY>2>D z9ZuPRW8lNVIh^1N01`+`vkP_)UaS^yHdbFB?aWb+@wN1B#9d1y7`@EW$ga+_y;iOv z1aHSETzi=nlXdO!0$W+uMbNdxrv(4<3wWercLR#-N{e73X$R90YfXNQ-881bvfkoB z`VOkFe#|v+wQW3||HS`4%R44=rtXWKj^_(|-wN@Q8Vxl8I77?}2P&smBkC*c4aA`- za#ss(bd%Z(7f}d*fYZdRXf0$9Nu-V^!qXMP!*NIDe;dN)c`=buI794LH?mUeU#OAG4uU z>2(I$A|N0TqE}0D;&`E7K{^GWy+M_SSEP z@Na(+?QD1;jtp_|c>K5O2K6XhTYTLacLr3}T0xS=I777xW8o2T)mdXo54>^mW$%8# zC7h^3Frp3-aYZPsWjD1Hx4Yv}DBgoX2)AOpTPTnrvcUlc`dpVfVT@gYYL!G@{SYe$ zGHFpq>j<-uBOOPBoGM8u;YpPuQ~&ixyJsIuVyUsv!VKcNUg{!TD~iu-@P>r;z&%(d z7iQxRp^6cRU9qKR6Kavf#nS!Z;Ash2-gbkEy3I7eP{z_wsP=krAr_%q-W0qTb2e;K zkmFs@4#CRQ{$fU4fL(%{3K_qma3>J(KVI0|P};m42_O8D;SFeK1Z?~3)EcIIp_p%Z zCNnM9N~q9c)B2fcY8#Z(T=SBDoPu$KvZ&S__m}hZ)|{Tja?p1fjn_{`{@ueFLnbRo zU5ICi>d36bSrMN`!+^S~U$V&6p|<(WN8Z0I)7wsGv?*3Rdhg0+xSYc{ud%kgS!k+! zRX6OCQRd3|z7%JW;a^MmzK|)8iOy`sg%<6Ospsl-Y}=GO92o2UpB9s@Swis)BB48r z%8{-dZegcd?6r5NA61$NzI<-+LqDx+eaQr{;Dl&1bJ-4VjMGUs`d|Uu*kVR{)BRxc9 zCRZzmyB6xpSJXM@jGu_46$SmX8R0Z}e7wb?fM~)_D~yp&t!w2Z~E zf5lEm@~E#p&oA2k#?J6vgq%>qgTGCPgHO`dbIhW?yS?V>zb_!t^`9>{9ta}pmr(so zSKPQ!*5ZNWa9U5Sx{Ijv=V-**R%zcV-#N060cz{c@+C0($%50Q_V{XLQ#Kgj$D6clvesnG5uhW=giT5@iPVHRUz+nVz1&tAgo}!oXFML zEhs3;V%j?@!kp*qXRjWTlgK22l!O-(7Vz%*NflSqhFBEnS%h@lF$$R?1n=w6rG&Cw z3nrw0z4UuEZr1f1&MDvABS+IWF1no2c74RmhXeeBYG6FAY;jTGqr^oZoL5dDPXb;D z;$y3xhro@5wa#2JK$-3r_%pF|!^;*0w(uSD;C;#5apyc#d~JGNvb9)G#{-Um5Q~yR z;n4!~T3c|GxzG=Fq#^6kg>I+4dF&AN``W(*uitjx$9C-1d^gRHfk>9c&Q3bSDJ1x~ zj)u|?mzAtV~kX%O@HvXBqUO(!}dDh6a zlXrgi&P9;(eZQSgF~{eZt$96l`N-~*uY-n6NN$xnqiO$XQaFc%(0G}i6nnL9{>4oE z5LyVQ{&Cyj&1&wR&a~Qu6mqa#v&ol#fX_XVVqQPo>ESNLRxd#@Vk3*>sTLDBhTZeN z_N6vlc*BBb?_787zDs%LJI8{eTau8$9DRd5Pge56Wj@o?uqe%h=lt-XzdJHC8&_asvw~U&$LU&870$tD-&JXV?UD?*|n2#wuvl zOQ?HNkEn4~YT3IBktbmtkh#HCR-A~GjoHve?{vH-V0Yr8sBJ1fpE2@nC%VwfM>>%1 z#E1T7@A6B+`E~%SBujsxb_}RNCyN0JlU@u1C8oVy_mXkIv3DLvme(Efznsw+MTW7A z^NQ2~g|mTB?E$9dl8J8DT}qlcOTyp?UHXAqe{XAjNeU_XF8Ie1AwliZu~L)E+KcvJ ztY-;f^W|H%&NN?P=~M3&vb!9kxJ_=kgFq%^tGrM;htQ(G5?G~>e2UxN$7Bb(B-zo|a{Z7Ceo#)EyhgbK42Qgxn1c z`~6x9o3((=W`(bVEbi=m0f8?{4Pf9@n@V{|-PgXwZc!j=)r+qC{@Cw=maXl#Y{l|4 zRnI6>Db$og5uWV{EBg?FV}9`jL#?fKg_jpRQ>CPII2Vl!FF6_4GUN zkGaVZduqE}F~=XDIYWyE8mF?ji?YeZ7r%T!7M|b`c!EkU z=|&&qkZ)fOQujndzKQ`=CAVlxe>Y-n|LQX&@krh#jtX{MKD4@x$83Si5%lF0gEzV2 zoWiHG$jT7FR!ET>5tWK*Q=T%^CP%mh0^bn;{m5f(h1gf?+?20g^}CR=@|F9y@cgHI z2)NnZpSkKserSRdsIprBCQLTd?@WEe$MCj*)mu|ubs8KqmuZ$OBN_03(bpVO=MMu` zJ(MfqNzL-Yq!-YRBQ{F_7^@T4rXv&CMcpV`DB9;csMAHGLm*v)jC(C>!3E^5|!qW20y zZ>Ebj{B{lQRQC+X%15xLa+>=0&|T6V-ni~~O!%J@dN`4Xp;sV&MYqmXiuRqja~?FZ zifHubVro47S~RHhE#mym{=hM=|AR`4qM(?Sj7!O+8206jydDPib#QXBwb31pzV^qO zZ%)d=7z$zl4hi*LuD$YO4-v?*9^JyI2Ag{bcG~03{(8gr^0kZ`U z`_lf_80|maB`4k-RcD`CMDn0X2E3oIrWuLM*tW(m8CDNQ#DZ%4Wnmf+(~PTaMpmiU zW8#1H=JbAHhrMN+cu69PPli05Qi9DNv$Fo0He5O;;C=vD;Tlf$ID$HZ4TU)MPWjL* zgR7HM1xEymV{~?SD`zBVR`+={0GLLG$@JASNz9{bTFKvjtnl|3u^sN81!TRjF`saL zT#C15`OKfNdbs**yr%off6mb(wZ$HJw$6Oyn!A&^${^3mw{Eahy!M9B|G;!u(+3Si zpc@q_J{1&Wf#Wv!KxXF0^*1Vwe%=tiPxNqlE9kY9wZ4I9pq&rL%o+=*Vwxk?*RId- z<8bcLXR{~j#%JH1s5<(g+tawUpE3LT$0S0B!!S_0@ZpB%Wrn7h$6!~4U(3CFv+PPD z8PFuZ6l(>AjU2q<=B_U=3mM(M_p$FKId66BHsF2MQx{}%sZ(UOlF(h|qM5^3>ZUXlbJvo9pO%N^Ug3QRzG$O_S z3fYAe({~bt4xe_W_7O_hjL&@P-JBW&?zSwgJtyYoTs87YfkDh>z`IMZap5MF3hc}( zbtY@>a%~`g6}(0U0AVI8O<}S z`O@GULyI>{&Y08lVYkfRB0~M++D{)CHBg&)=>LX*8096g#AQZoq_Cc%*}}qOk9|35k?Y7 zmMqZ>9}0o%>a$XOeHw9*Wmp$GqM@s>qnmD?b9`X>|ans6}DpO>V5-#*&t{qEv zaZC9F2Ihw&nOD=rKHrgsMI7rs#b%i`rzm(Jn14MdW4nF%87-rNuxpCa577P6Wo#tX z6It5aS)KfkoDn#qDEGN7EW(WfJUQ2W>4l(a^kL+V0jXQDCp5(XUEQJ#W=-_|ezt){ z_=XNE5_xr`hib%P`tx)aBLE)sKv?QIZjyheAAUbR)5XF=fpnoQ&eP-ce6jszvNw@a z^wRIS&(#!z#R)?2P9+rZ^l=UmxPAHDco5`$(qZ~hAnFsqdgRI5%u%85HCGDfqrXi_ zPZ-4W1GI~vlM#~f+yJMVKvd71ceiD5iNR)Kkie7eoH?DR_wCk7h~Aof7ePY)%e$$M zo^;V#sIsDf(9;#8&j}yZkB7D8N|B4S@@ZJ;9iUk0QWR=-D&Zs%uBA*Hpj}B0^&Nn+ z`vcxp#rd2QhuzrmDLQKoHYA_j*H$h8>GpWc#*L3PE+>Odp0-G-N)v0C7cK^L7BqF^ zE*?G}Y`&yG@QS7sz&WSRSqd+vmT-aAKi`_Iz=C?l~ck+7z1efHE-{R=ZIvX({5AXhTa32wUu6S3wb~EfuPm>b0$%pxVLM2<>$g}Wc%fRb3RWRotly0wiP9O-+Ish`K5T@Y}hiQ&tkDn zmCW#pb)zz)TxKb!#hN;>ThgN~Nq!nhKiVc|Eqt8r4>IzpEj#zP8v5t)d0}T@*GX?m z4|7^~l;;HQ6B{4;NqnUdGMQo_dFZpyH%b?bezWpY-wlswTbP{|r%Nkyx`tJV!~XA0 zBiJ?`Rq{IcakBN<6@`KJ*hPz(o4X@~sX!HjXK4bslqAEQ3C9;{29vJ4^6-7(dw!Jn z(9)&~qEi)}ot(8erBqFe>L zz{n9_XiZL)Rgj($dpmTM=YbP4+ZaO2M%+8n7IO6!wo>|D zi1CLt-$=?EOlv!Hcl;c=qnu=Mka#bqDcGEMtC%;9<@*$~wq~*Oo}!DU7q^ zC}5yo?IHK`Wou;1rO@+=HBq<@GaCtk;Yg{@ zjX^EwBR64I1n&0WMto@$IOI;@!7Erue+0<^A($CNI0+LxhDp^=k0#%rULmzO;C8Sv zO_3^=MnAVG7Bs4=|3aE#nJm6*xgdnJwrYB*7g_4sp(#&&8s`Y z4zEaW;q8K^hG?x)USR<#{?n#7 z)l9%!(g9s7Ebrsh%GJ7Zr zO5h(8gtZ693qR^1k~aBMdwmC4l2~Vn;b&smDFOCSANyLpc0bph=7ovl_#u@alXAS4 zmo%sZ$VrVZ{waK=!j!CUxFj|qJMB;5g?@JR2dkZr&cx477THV~7KuK_l0%b{|F;c@ zSWk$a%X`&}`3PeibFwI)9aIwTu@9XMzcBKCKag4Faw=dIs9@TDTi%0@4Mv0vE*gAj ziX$6*Kt-gM^-5!!!Ntb)R(yLNyfn$PA(qyP@_?HSWE>`NkICi>*mYq#O{2xcRS^Yh4;XD>S-CeA7A6 zxOvN)xA-{Q?4*8N_(Y_$i!;D?OBXJn}> zOL8a3HDp&+gF}tb$ng%0wz;UVWpfF=eC2kvyjIm)KVM!+TCTvek z>7q&26AdSD4xZ=0fUT!zj3Vko3*ogcOyUioY?6iNh)46C?o~T)x z-es(3ENxHS%#Hjo?uoikF2rn55yTPt@2FzVOOfrI#}+krf;01G&RN#nL|dAQFOZ3; z^maJ@ilDE?*DZvfq>%?qOhKbzSPXCvAIetutE`(+4M5;PnBB7h?@Ms*+A{grx|`@5 zNh6}g#mR>p9Eb&VX1Ojbs1_8R8LN#Rx%ck{-k;cl7fUh9NO$B-{nJ5Htb=oF$yLr! zbjS>DtJt^aGe3M~bm#`0;E%f^KG#xXpWJIIB;k>=5r)X&ZSghnhW-PiS3fvlTEZB4 zWesj=%@;G?HqtV_*RPElBuRYCC>1$y-!od?LiBXg4YUq^57LsG3%1Gh@B2SXjO5NV zSpKOu#qpV^ZLpA6+8Kk0S0}NgW84}5v(FZURvP>%ne`&5(ank4Mc6vX9VWvhv)4+e zTi~l<<3o#ep@-V}6I>B2nMZb~&WR#2?{;^^prYb#?juwP9YX*gJ5#E9{u@F4AZRk% z$9!W3g6*2h#181B_5sC>`dZ8%OZC?>j)-H-6APZYJ^&8cMk#F`BO&zOqI?(9cCJ66 z1M+^2@>BL*;2z;w!tLX;;Ms0j#4~yv&oN!!dhi~nhYY{xYqXgt|>6#8tLcb>^40(RgW4%eHxVm_}WQmZ3GL_ z+e6@o#mEJm?sx<3dFq8pyB3dDLkDz)kRu**zoNELMZsI^1s+i+E94`tGxp#MO6Fd` zck&kI4^ceI>r1|~rF!w>@sM6red zcklGuYsBk~auvi2yrnZSkH5qpnUltg$m+>ZMyq`kG~Cprz(C{+MZ?EOm6(Ob{<=6X zJI>QhmsZ;SX}g#4iISWDUI{myGR_<&9xs-Ie%@;*+(=N98*sCi4Y>4Ci>gd=d6J`h ze(Bhe#D}&=_^2ZU)A$kL9w5ejy~x6Q*4Ka=kSH2Q^ybVNNA11Ew8{n`__CfOK;cKS zwo944Jj792h>W@Q)w1HG>&XWP0`Id=y7tW=Ulc|DqA?e=WZ z^^EJhikTMEVp)i9D6S3c>P|n_0u~W&%Qq&8~;KD z=s?fnf#C2fnn04KVa~^*=*1>szmft2@$oq3t|eiEPAEJobEMZiPp{D@uIN6LpD(`7 ztK}C{*4tzAN5W+Jg_KJt@=Rr>-BDem<;^lM4VF6qT^a`dcUSs<y1PX{VUki(17V{_haey= z-5tMu-}n9F_t$pqdUmeoKIcB?+@H9^^mR3EkTa130B}P~Q}qb|fC*p00F;FAao|02 z27ttNv{aRzd1r3?iKwl9?sfa>*mZ4nKrTHz64qHjto>eR2m%$hdrrju4 zv#Xes=htf%te2CD=k`Uj`E#?!&BsFF`#ly{dxJUWoTP{+r_g2rFx6h-q zz30PhP0#hN|0$Y#WGe34U-b?uUg562eXoMf2){;k|MBa;6ms?HQOh~MoV~ux589!+ zYUSCSy=(}o^+l^-uTR*ot&0NYCa*qT@30qcPj1&c|7y7!zxF*mX+W@_Xk4$dZ(cU( zw4CCvCKd1Ro=Sk~`juoZR<18{id^gpRzLkWb%zg8`0cB$ZMFwjCkrW?je#d0gHBY5 zc)T|%aM6K(ZwLOZ%+gzM4xTSsJmvwe|NC=(%R$Q3(4fUtPtfVA-c^^P&w(@{O0%<{ z6)^CQBHm9<8ME? zxvn>%H>HF2rDJBUj%wKhmc?`GSMPtCbiKg3nt7m~H?0{^Os4&{4_vm7zWQx(?qrHz z(YySn=ygyL6X5K#d3Ak(zrNt4!hMkM-?3IavhJzhCR*Ik2s+S+IkyVkWIqXJm)YHS z0=r?ApjkgaJm;TpH?6KFmH98JZH9{Y{~eq?y&tp^KdVA{)t+-gn#_Za-yZYaPS00{SF9co03?HqxT&-(RJvbN`RJ<&@esgx^VC28xru4UJsCg$; zM38(sDByd%ae!463#R3okglsfc)yuJ)7i5z+w^V-{LS`~2MaVC|*$=t4!GW)^h z^Om#G+s4;eCh%ONQC^^_j1qg(e*gUxedTHlf7$;GGPwTY_-B5M{~}k9RDsIm((#(l zMQ6-Kr?Lt7FK8TL957FtBXdT`&K4ouTWZ3G>5Ydm}8}%cIj5x!3;|@-rT= zAtRH#fxC?w#!&$|9$`zxL1$$_Gw)^taOeC&)*(-JSs}=!;}6n}FBwhGglsj_#*ea( z8&_yzNO){5u(A;cgBtASr5rXqGB#j9(B)X-B~AD5OOLXyd@BDrA`SM7IntQsqv|rD zncIsFi9(CFz_BZlkp}V0Y_UFG>?&X8&s(m~V-!xi^w?ZK0+HFNjG%#-PQ{rNG5H^3 zuxRR*Bd3swzr+y8GjE-c8BfMM$% z>cBz6_T|jBc{B5pUf8TB{((lzMNf2AeOZ zS}sq#nDA8f2!6+-rE2@f6@+klcfy}H&db=`MK74akb|b8T)-I|JfAtHTw1*e{>#EG zmMs`S0{Y$I$s_@iA;s)@Id=CWbh&KSYSiHdp+QVwOVMXo-|Nd`_Lfp^qA@5y?_@c0 zjSoDkDmrKPS&WOQDapVC9Um@lf?+9+P=Ml-(~f|}Y4=k7zo_>gn=vlh{~l*jcXxp_ zuLsBT5&X%}H`bwZN6l_S6WQm}D=&U*`n8;uwEV0)^eMk+{vu+Sp>XM`cic= zJ$W^mb2+&rJq`s#lJR~IIA6QxTKY%R%!ehI?v%c3a&l*-kc5-Ic)ktkNnXFu4+i8f zc7EYj*4eyu<9M>UmNw<=OZ~FJ+HuovSvC`|{_JzgUH@}Tb>P+aIWd17aZ0$y!PEj`JP>k%Wl;Vgh|dr%>Q4j0L#3q6_B5xgJX05wjqQ1X8Ji zTqtF`Ipf;}=l5Q!FIQ(Fhnhf$HUKvMOGje6c4)$&lmE&%9VHph{|*T+TV!~-6fl== zU-1|czo-8EkO?$bv%>Qgf^mJK5Y0}kRKZ9T{hrR*>0|oE^9p+KS9neh&n^!srpf2D z$0Bg!#z1WS&#YxOic#-Ck-*)En60{n=#Bw*T@HYZtH6K?P;M3d>#o$ici|n->Ad$X zKDu-7E?->u?Z!D`9Ct-q6>o`a^XYPE`$oinfy?!|)c$#^H7zDKP+5}mxq**pkl91*sm8N+`i25L{WF2>7Dt; z*QSBd0- zXs+k&o|hLZib2!0wRvP1S%eYSQCa?%4kG>IC^jS=1&6n&X_mbpypjs!CahIjJP``O z+EMer{YXxsxO^jP);jeNA>-CYGTC>zjdfk6>cRlU=bu~91z(GHSRZBrLchdNruqu2 zS{i;QjT)KcP+(;5oB6N^p=1J&``D zpQ4M>d3+$#zCwz1FBUQRUo^9V%67;l)z!@;7y zj7{_*=!LrwOVgW(%CiUJ*6(_csJf0#6nSX(W@Jh`CAr(tG?&PacNX!I(<&%2HqPhF03U;Nh$N5Giqp2Xy8#74fDRqQT4fdHQ~JL)W)1msRHfM z{O=!QoVkETqWDDlbt5neW&iV`3o*X`L6&ip*V*KR%~zt1#ot)0^6+t;vi)`reQDgs z&;r%mHCL@fWoYcffX;x!7j0Tll|GQD3dSf;Z~>HyUMT(EcWK52i1>6pEc9$2mXFz$ zWqOX5!`W_T1gM;@6LA2AJpGQqvrK95+=~Fh)nu`ymqnb*WA^^U@AYJvq9`=-_Cl+X zr(zUYrOVjILt4E2)M>zMk&zDwc2E2sw|{)a;%g`o-kJwkWS##?#<5f9z3H3zeCFYP z^M3E!!;SJ2YPxLL_|De5mU9}Fh(__N09RTi%5=h22M6RfCq&04uN;Zj?l7r^imjQE zq}|L;9cBUzw8E&ggWcqGpa^^HMEz5;)wOQ%IngUgncFi|Il3-Ybe=o=_N>iak zrYZ;=J`|9jijxE6-Lfq<8?u?H5Q~ZDow+b;K8yCr2ltaDD_dW=Pyf#B5roWLz|8Rx z9@0m+N!?vU@0?G-#R9wHj5=H$T>fohkdly!WKgH@RJUP=jtnXOK5DDz>Rx_nhvEd6 zJpg5!Ek%mSeM>n5dEaaKR5nWOweNG=+`E_UMWLYAmQU`6Ggb&E zK$Gj2Chc7Oaqs+bR$>$CQ1IWIZJ~QlMh6~fC44ci9X<#qpY^gJgM?G2$ zN*$Tru=R7DGk*J&e9|yBNe3u>y84EM#4f^R>j~N2uk?zmsIUj)-V;fWz-Y@|eNjT0 zc?2E1g1kdRS`c|KSS&jj#bM%ahUB+v&& z&`y@=>-r^c=RPQ~SSwG2jRWhRkAU0)198W=!tE6=51mR@Z@W^(Ib;8^s%$T3144Bj%;E_^Cc0_xI7Yo$aRlRH07bk5Bhwx!IiNW!jSb=Cv9 zosJzBxMhK@d?(3wbu<7tbbw9CNdHj=T*{>Dk0#(;v>}87+Hdu*!BgXnj9a9i$~!@j zhh4wf+^eC8$}hA(JDr55%t-SxWG54a1*psvm+lLEYYGE;=dK*-w0Hn)8H}1(S@ypD z3nA_4?RMtnpsaTaCVSbp^_b?@8D(`@r8`MEQFEVUdm>~P!N&O^H$XeiondQfN@q*{ zy*A_N9;&e_OzPlV_WF;DpA`O9c^IM6QMcY60-Z5pH|;|w9TPTQJsJ;j!E*Q{?|hgY z4YF6u`%UD=8WKOiPsTr53cZ!Z`p}llFJ?abhDUf>C`S$I2JOvh9fsrH&8?;$9U!x% zzc0PbgH>atG{@_T#BloaEl5$Yo_9DOGbS<0nuZPq;o(`4o!+(F z1$ACBq*S`hF|_=qYhYF~P$aUWZM)pL`j0lSZ^Sl0$I7jb`0Fbwj28)6KqBw@!27Z;PZaHX z@Ix^}9mjk>9q-i*chAZn#>DYUj%MT+Bn24qA;#efud((YPoo6kn!hqHx15=BKseuB zw$|$JPb?Uk+huYmvdR{09P!YV?s#n-pqp2mrIgzaf{<5a?4CY$(n4~9c5*7ey9eS^ zOx+W93ZXP6P}Dm|P0P&tI{FpPpMlGog-Bw(AI3`+lHl?W0%`!$3N2QlBS!N(Xpj#N z7~9en+-#>jlRibfh_06q=O%M|IyFk<)Og~u;6UGOIfs(>ZtBVp>)fvT;Yo`Wze#R4 zm6(fJd86IUBj`E)b5Jf@%Cpt}cOPXJyU{~TRglH8b<<1&dTr&n^uujSb--vw{!Th~ zxj7lI6FHI&phg9GS=@M@v@cxFD~ya8+HeDLHw?Q99h@DYHUZ5#08>;|FfR~=z15}( zw0l+f+mMm{S7scM5KH!6D6$>Vg}}_)6$lv1DR-*14X!dWRqZ?# zd<79v$)X7_hvIiEBlkOf;ObPmv`F;@=Ug&GzI!MV__W`nIy)Bc!bTXQ*ZP#1u5y%$ zXE`c2a!F0|swB3ti!0Vj5%UlpWOd=vBKB}~ku0{1gVsbiRPILA1p$6UVJ8v)4M+|G zi5BR6UaFBYY@+~)2I$dWPjD-1W6|e#78y~DcMgo3AxroK{h}uoSL>f2&}2UnNO%f& zZT0DTxx?z&hr5XR|Hf*SC`cHq(*WB4@Hq9aE#rT`I(*um*s^AoaW7uSRXid@8DDH| zXL_f#cPQl@ro?i~yYNFg(<=qJGURc9aD?EdHZY>9)L$YGc%d3LYX;^&3I|`Au}XkmNiapJ zFUYA9Ld+-pB5o6fVm$gb?p}S@|3#E%oyqtRVJQd?jZ=m{8FeTMRyH__sd{D?yYOT@ zP=?>GAQ@NluOZ&L)D~6a(Na;J!)(7TV|wPQ@6%ogGP^+$0l#81SbQ=cM|uTclD_rJaaWI~$ttY)B?cJk{7E8QJVQp;hM+guUe{>iz+c@t`9+|AkGnjV zL%;TfS={`;&<%)}?3q?I6!zi@Fp1-dq9wC;6Ai0Xpv9auTdH1Bet6|)jz%N@iW7gd zJ-=%k-DkhPqRes^l#8_QsLfn)K6TRP`&EHrFgmQNS^qJ26J)j`3P=fQIdpXjJa9D` zmD%syXTP|el2NhX&i;JV#I8(P%;>1OoL-84`c<#~_Y(7?=U?B{trw>^SfOL<-m+oI zdfv_&h`s9&9uE?Ni2%n6`uH=CcDQ$`xsxGkKin){jWe*Vbj`>F!E9>^1Q_)=`@XAr768>|WW`Q?Z4@H>Hn zuHVm8By{iaYgzNRplvE=Q=>@NCG_QzUR6nrn+OeWRHdJY3XDwHB5V|ISIv6$O}?uS z>(^46(SK8~QLOwVKCG|7@Hq2c4I)W9agqEKmtL6ZB>!M1Ae$KPIkrZK7b#!0n&erM z^HGc{*sO8Av>`g%ckSEg`kR?#(75#7F*`=l%8R4l=M8i#zX@RKCY?Nxm?b%>(fQ<$ zDv)S*W1o(_3i;4B-{{9psmc*!zOlb#1Crp_x`{_$t&S_blfHguop`5k(n=*vl$zTc zh+9&oUAYIxT{G1C%^z-DCM5rH$$U_LhP`^&SxK|5VEe&1Y{5QGFIfzvH?jUJvB-s< zU&O#=%*O4)s00+M=Ce{~hL2YH<|!TVa($ejOf)2Wrqu_lBoi$}f*0vESR6fj>+Tn+?t;sGm3}={CgO4hK`eJM&0DtL00Ouf;kHbEnB_vttKqmtq72aqGolrxfq#DLx9wHc`0%*ao82&i%I z_uU9hh!u-b|D??Lag;!Kf3*y@_sQ{n$(vc*<>ZPx!Bm3d7AjQOa6Fzq4 zS$fM6sOJ=+7S<=eJOt_(^U^YCfq7QutzL!to14a^leoT*modU#^fjOlz$ywAy5PbE zpb9{XbPvYs2Uk2@I_ADrDhxcmR`8s$0~b;7~_sEJ}!JT;zcLawkrM zt)5%`yh|_8XB@XH8;Ups&2*UyRJd1&+zDE|?~(IYj*hs7st?n43M z5I}L;2Y>(PE|xjvnn~@~y*HGz-(FIpi5y~jwt`bN}FVz?qx?+L#FUGH30-N+;Pv!$2MDaMe6^U zug3>$?Xrway>4)!w&McLIgSj{%nqGi?-0Z@jTptNllkr!^p_tY$u%*89^Ub zNZEdsPltZfSuK**donO<_q3kCxhicds@ddt!lzXLj4YW&*T=jscf4~BSqXJx+cM{h z0mU88sl>-N%F|2fv*LmChKk%W7J0hl$tkEq3J!paCZ()Xa(Tut`5Q&9Yu)V`t}^*q z^2-m8xS8WbAa_rR+Jk*dJZ9xz~sZWeln{TCY63$$h;HFJybg3_81$_?^MGPhieG;jB6H1gEj}Pzh zls=nYwHg|Hh7Pway&I+R~1@QeY&E^=d^$`Uk5>PFA z9$tFOkCz3zF=cbMe9^q#(Cp;?N3xU()<_o+-_-t_f6L^N+O@Sg?fh9~c|tSYLvKn@ zJ1t^@ld8=?q0Hj(y%!V@Mk{L6fkkTg=-GWv*WQUj)LqcdsnJ3Iu#88xW}v*=tutS2 z_yt3E0$P&+J{~K^O3-I4kC$WRL7FVeOR}Q!FwT|L=E#cuIAGBvf%GvMLJgXF4##nk z^=PW-ym*VJePPT6L|fRubmjys&W2K?mIYTux}JAFnHJ3;`Fg$QxcdI!7vVlZ5@9s~ zO8+*8M{j$6#36UMSj5aCP54F~{GTfX~)Oopds+mn@S2%g~ zn&t1lu)ZP)2kT|Nqb0&mEXQdmZ?na(%@lf5=W^SR66fQtJgx-)n98>CNF9kj_zks1J)lujvW$MCU}DQ_>~DOfR9;us#tH9jihke z{WN$t@m~PXN{q+wGi+^gT?NT|tAu-U5e#IQSN}*MDo5-7kdN1>knxw8=A4PK8g5K` zi86zYz_>B6C7JSvDGbR7`eeXk&B)^9A{L7bS%}vulz8G%Z+7+R{jB2VUPjD=qlq8c zr&2JMtwDvw)=N>gKjPrHT2*$qOx@Qg3rMtp&y6$E&z(J-l#8+|m0$I=?Miv$zkT1; zvrN4#p2v>Tv2*^DUPI?-12DgO z@TXo5z$ff>87GI%ULh~YV`1ErofgR&QDlq0TFG|JAm*@cxf>)Js6031$fGo%7?}?P zW^P@QFedehe6+DJ8&yUK4}^}@N2Pjt1;BpZKo^uhG+GWA;Z zLidd1#M|I~&zmX3k{-~n;lHb?l?{*(hU-GGEQ*wuiKiAXfnb#*<6n?Kw2kH(sX&nm zYOOLFVFnz&XhXdB)6ri@Hy)e5hVR2aj)E10TR(yiXRE`S!lKsvCKbNs$#0bjMb2Ip^~SphetCi`^%KYvw# z*N;N2`*=r^Qky=+dViP_RAAh}N`x#_l|G&As~R2mQHw=ZFaE(Eexx9g|aZ z-S)zhojqZm!6$$fm%4!Xbcr zJ1R@1?e-a~a(T(UqFnydJI=t!e-LzT2A_k|CZ6#}ULwh0;y`Xx1$u>!req z#c8~B&$kPcXUp)40%^pb4s@jdyt$zKBW}2@`N${}`Yy3M5@6`D`V!sJmEa~s4c;MC zW&!obHVnqgfrdOfyo|@tB#u2GFe&U+K~N%CBP?tS1gRW~0DbFzis^ z0=6QICSRSp^Wl~l!E-IMp1RXG#T_EWauie@1$>oHHZr&Bg-G-yN9ay_M#cIV(!rd@ zy$Zh+*If$k+OfmyC2KLV`f%&|aTmnEG?%K=TlO*JKs^;7Pd*pHUJ|rQb(t3-?_idZ z|B-lix0j$()*0|~E`+ur2BhM8oXE&CKC6B1q=X#{COB>TO?-jEalx{uoD|q{NA`Gd{$<|SVvY)Ffg`57cqKSbvkFj0biy_S9k-euhrwW5 zU4jw>WoV0)tQoJKZ4ue&_% z`?lGXILkBkS_%FEF~a>|yf8-pXCP77v{%7*L`#9FI*k$rf40dBS5{^`n<%xF<7aMB z)YW4)<*~tLZGTBiH>{O}xJ(zR)%)CRmgcSG2uq7@@0rhjf;#)dL5t*`wPngZ52a&N z21UkXOMrob!)su&D~qaaP(FzIdY%(gRYQb?CYUlSt}fRUB~QT(~Yr zGGr<5{eTOg`?;fR^&1=Pt`Hq$OC$fap(OOuzmFdS~Kw9W$9B_?T!2puLBXGpev|!x?h| z5C#tYgmp7%j^2>i#gI)}-E^08A9AC~Pr>IsoPSSKJ8t?A*9qeG8h1BfHqrbu{g+wF z_Y4m@O7amX? z!f9lp0B;h=cPZg;38GLdIT}4vAzOJV?JqRUD}6upDBQcHI=D~u4rQmZnL`tHwW+-W zv#YI{r4u3X%SPWGSa<^MxCa?3s!-rF6BtS9SGtIFlHRJv9NwyU1F>HwBgp7Md!(mt zH_*hE_dPdTT~GVuE)5hV=sS6ieR{3RAeepXg?Ags=|_sXLmB)1XSWv-Jcofr^d$E_ z#3grxGYYHc^~AIF9Z2$jP=xSrRznnJvVs)|JjtK$8q#pNy8QW&NZ zdna4RZ8lCkYRI^RHoNYC7msBCBS)T+UVf_1*?}!_wWoY@#-c=r3b_$qtd?sOAa&Ba zJndt_acAezp|U{IG;980 zTxZDd?dp+0ea|*cs^}j+ZxEE7dWE3@51e|r?HWeL^WaQ!Pxu$0kVns_C6pba00zs- zetROfUeLg#58%x>)OEuK5&|#H3X1Hjw5hOo&-AkVK@|g@3G~X05jJy1A+VXza++~F zBwlq~0)k93I;L)Of{)Z+*PBt3(@&YO0k#~OZ7v)8iHC(Ktp?>ATQ*!Ev=m^%0Uv*sa1a3v`*Jr-QI%ZsZ zB0<*i@%po{mQwI24{ry0<*rrbA?CQEky^@gED3rAP|+;CZdL$`>TVCW9Nz$ypE;Qs zLy4%fd~WzBOK!e<(mYyc>LgBubZJ?U(UeM24DBb5Mt)(43h??j9BwR@5eG1s8q+yW z9bgG=Oeunh)fR4=c#EUI#V*dxw6gzw8~|ewWU1gQ<9}iNeN;!124G0Itf{U*z$jh~ z%byT9Tk`NAb-JHI2dCD19_jkgGPIAzZ8$dxH${TbbhQjgf zoaxj^m(ce^Mh~h|GwNDQcASRI(gBIPcj|{}fXi5%bMllWQ}JS#j^sEsFloTVJ;tO|wAzbSmlcTA_YACpq!K0|obU#d zduRJHl2swZIsfd%+lk86X;A$~T3`thpVf;(wEN#$IOA0-FIe<_J64!;_*JH&*&KFp zjR=AyMOx)lOHv_i?v`Fx|JXzMPdxmWTAxpjXdO zK=}wRRHbgTV-0tSSu4^!JT#x5pFU7KC8jV_JeSx%5$gd$io zxIm)3JU0tB++99>^1COX^yigCzm%~2UME-22rU#eC;Vju$E)P_6l!@JO%1%p{@nRB zVPwh$g0HrlI=yH^7n>1iXJRnsQkY-AZAQ57-AIA=%Kh2;;ve>NFKMf!dkU=7fw~?3 zm1o{IgE1|(y|!NUXl~peMP0rGQ%km=nZXrO!NnQ!Z-aNEbF21n%jaui8=ifH9pF5t zEELKF##E+C?p`LqkdBYbd9mNL%#O9aUOVA^$Et)m0hHMBB6{M+!>EBIiB~38gjeZU zGSS_aU`Uc0F$SvADb8Bv<$t3OoI;%r>WwEhV5Kbts@~L$p{PG?y`_d;<{`%nIF_|n zZh~a?p~KU$>pT8;{!N~NZ%rpGbB%8oKQ1@?q%y$~;iftAn^%yT;7cB?%XWKtu0f#w z34C~_G{J|4K>Ju)ni~HW2vu=sEJC^GyMNDPADg^&uAKcrbp)wVZK$`D_2->!cLKs^ z)m*+lYX2iIK>ESmpo6?ykHJPN;0EfkluiN5l=EY{E{8n?b~aXD%5>V{;n+o3`Xca_>RhfmT$LxL^6%Jd83isa|Gf6UvmoSjDefP+*%l%PR*j~enZcv{S z?@{6WX7jJtcT%FmVA8wZT7k+~@}5&-Z@O6`_Ah}{42FkU82bfFS~i$8B<|HYJA|@O z6uiFmesb);;_)A+NO7Omk;G;MQk#qWkweKjR%x^GSswFkcczSVntPK@@fo%O>)j64 zJ@x^vvuS)$*d%0yotWfe>QX8F`}Tf`TMzjUf1bona;F)(To`L`PT6IoR;IaB>2B4p zWQU@sN`0PSa~yKQbE2La4v(l-L=(r0WpuoBEdDKI_oSZ0rZwoxuXK8+xx63UxeGrP z#@Cpl`l_W&zkGM!ByfRAKuWNlCf$~-fuQgZfStZ;5DJWjh1ki4FcfayyS(lV>Nr7ImfDg=vQ>vUj zzc(7So_&X47{m%CAz)Ca)KW$gkK`8yQ0Lpr83A(%g+UR*wh6F5kGX(!h^agPQ zMokV$D59RcQlel6{l-bD+JMYL^$A$GU4XNrc3(6Ec`GhNoJ0Ck%q(|eX31;-!6MiE ztmGgavvK+_$|)F4)H)>f;wiU_v)Piu%3+=AaVZBfEu`;VRIp2*?6XkaXgHJmWzn|? zcY+sEgroCkklE;{l}UYaKaOzif!*Nx%pAi0hJl4TV|B%7gL`2@h>$#L09 z*{>x^xw)?%XMZdII?Kdd$SjcAZgTAF>|ujwDUyjY;7N^gpR!t0NO392t}G9|Qdf%r zzWO`*9u$Hd(-&-#p2zmQpQ8{P`JgWf$6l6}MH}Een;Hpj$;$F?wztNye{%_Gi-8Zf z-;itzUa|x{(r|n9)@8{)p{a0i-riJ=UHx+UBMsOecN}Yv?;gqB2)hHId~03d){<2) ztptheyA|Om7|j%AqARaIb|NqRypiM+a+@21yd#rCIIBx;K*nUmU#I{F0rU+D{5Aza z(LxBC_CHbEXV=wb0h@8%=!L**p>wnIpXh)Y<=5V-K02pU0-x13u-)&TB!9EWF99dj5i@9j6BT8((hQ_y+f0d|5kt?LtpxtVM3GO74|7u zk52}z9xVi+B)L_vA8+2tG+EG53L%P$D2es1#;h&NCWI=|0Dr|_@OM>0Yp$zpqiAw+ zglKI2pB7siJ+!EOtG2mLCn}Qa(HGsce07|S?_392zZH^A`Pg?-d@e}6?a#y4Ls9Ie zaF|JFTNU}HP^z1{`1F3%FM`ZS1p2G=%1GN-+^vqWDH^~Y-B1tlzk#MG?Q;AU(|7LW z&ICb#*<6Y8!06Xw$0j#h8N#8U*eZl&7#9t1Mc{wZ4V%F0sM^mo!1(rgx~&_#_gru& zte*5J3WC{|08OycDfW0Re^7(e7v&JTDb(hkuX-kSj<;MLE(Ekm(z6%0BXT~oj3da@ zK%Aw}IVo;R!#}gw_kk4@eYJ*iR`^$tp2%IJ8FnJW~f zv};S=N&ecoCpz%`xy5$`WbQxP|BEPi*|>=AX>x6&EwxPPd(nz)l}6G}q#RC%+QI|X zOGV5nAe)9%c23xHMLbIM+63@;^<0yZv8@Q*wRtkhFBG=OrJ=tOk|y_4C9D|H|gQ5u0v^zV$1qvgPA zWAvp^r@u!^upOceDwIaEH2DSSx(Xh54j-o^zQZmf-!*l3?u)1K1nPc$Ua~SOcImLU zy00o1&*5?wrm*Z!gDrNc;r(R2cLe8ymV4$+k1=r)C5lkcIpoS8n%W?%OM}S1%ksJ= z`psW$Fm*GKAp=dGKTbp!D~<;=T3P3mNj|_D19PX5#}c89v2u7w#X?1iTC+cC+;R=R z`RB=qAjGm&VwUlE|51M@!P^u$Jop~vww(HZ8>AJ*)3e3HK*=&Sdil@m-V%tKfx@|+ zNYs@CNQ_FuEgv&u&?y1^0MEh#|5Oog>&g@1G$S zmL;kkQ0pGAA(9bs8(>1kD~4 zN}Io#Hdh9s4bG)1OQR~2V!lKjn7-**$2c4Pr)WX?UfP*TV_?L8rSo20D|`+$oPaR zv8oB{!E@Hd%?5&85={mydG-j^n#D)fQh+S$E1hSLYHEeFvohGy21)C8vKnS}f)*w3 z8R)i5yisJ)o0V?%7K9m0(Ir`rH74pnL7HvM45pt1r0Xutw$4iA=@(w2JkzKF6i=0H zc<`TD@#U z3aYTqV-4_}w2k0>Qt}*2uPu4*PpI+!R#!=3;_b-uM91*#e0!4&BL#4-o&O(pD%yvM zoOxeh$Z9iCOE7>EC84{`Q-as8bD-k{Bf7>f9g+?ze|H>)mfoTET*{X?EID9A0F|AI z)?7Co5~;xOewS(e^u~uZ{7z;M2*9u8abebIQS zp-)Z(qbpVEjh*AzxqLyxL@+Gh183{UGo-H5B)qu+5qTN&>WzEc!@RODIdFiyyRN1B zF${{SBeVe&g>eF9K7CHn%mro^F`;&`ngmkG-SYZ@6ZxPM`MZlud$YVU55B7M`VD?( z@&{pFXJA`yF@x(N{DI!(FaOIa*Oq{P;)zw~mN{Q!#vRc-!MZ_H1oKTZq-wE)Jm5`6 z(gu@mK6ez?%1immp?Cbl5qE5V{{78q%~f||k67(u!0n!MB-)@ZGm>Rp&6xj#H)cJ` zd<4uQI3QtV3Weu3KFNDRyDfbK_PFF+I@sfLxziP??f0=uDR7Eg3_ftZHgJ86|>9lR`6Wzi0*sb(slVuA%U0Jn0b0#`Xw+ z+|b;=cr^;_N(eC6Oz%JMTc&5`2f!`j>6WAhvY?j;W1ba2w_Et-(U!~Z(HcoMHE>EQ znWht&Hgp>d6V~o!Co6yU+U_%yHudtJ0HpyLP!Pj?lD$BtHnB`DZQo3WSnwrig6a#I z3qJ_n^505#L55Bi%V)e`Ok46J6EQAePZt)AG{{!f+x3%Ww>t8$MJI8%_t)@O>{0hZ zzq-Fcsk}zcYD3}WLJ$O@w{X@4JW!WC@IRpwHm+Ki#A`1IqRrxuMMW53lkOOgC+O$} z{c`NH6riuh*NIJx6d1>{lDP-hr+5o<^Cy29yFy=#%M+;vKarNC0)5-x>oa}lvh|+O zk+?q(JRc5nYy}RRwI&*htAi((B&*EF>U(|vhW1)Qd+GGyIED6K&m{J@79PW} zvAvysxdTxyY}B$;*6!c2)gO)7ovNr%VY-#PouvlsB7CU2wUeJ?|GOIHpZGBemb~2c zJ@pIHWcpgZg^90CktAe0j1>P)a=4XnHAaJlUzEw2!^Cd53;HG`aji=jR?){sn%pRt zI#2qQ)wkqoW(s$3N>Zfm3`j{~qlk1-G4FM_L2lrZvGz45J)lxV@JwpoKZ{U|{D;lm z2N2UEak-XpZQ7K2$^a?=hBOxlBd6-{$Qe}^OFCT6aGf#AS8L^IpS(7nQl-3iDYfa5 zr0hz_9fGazJxPyoh1gU5r|}m=>?fFc{@(;6W}v!j3?qM=g}B~;(I@gpN`0Iz;R#Xe zX-2h+r43sqhv8k1sb8qbW5Y9Z2)$y-PRuE9XCVgc)Srhxi1iZ_ERZ-I^hx*g=E`cy zWvJk5mqWCqrp=ydu+fMh+fv0NM)jV{Jb%d78z+nwr>7+U%NSn`#5i& z&__4u8`Mz=4h9{4Cif!iVKYRiJ$r-Qkf25IIqg7D;F>?Pya3M*^j=qA{5Up zmxnLN?F3%=$QbwCY!4MoNayBR#JEQ4kS>sSTQL=K*GD_A%S@$~_BwayuxQ}YM=x9n zt5XGZkEU}a3Q5by=8r{c3bKJL1F9-<@gwxo-INKxA2C*!wr@OeDKzSnf={V1d1r@G z(8Y2#*r$HS-pSh~7V&Q7%;(|ChRAbz04O@$_u@Lh9aX9a5X=Ed4CVeU8DIJFgAxV{F z9b2~L8l{B1a@-_6=H(c@4@PR#3Z?#xnR<0A;0j5o1p>v7FPvmjS;iw?P%X1 z?j^wOq``Z*;a_S@l|uilqkvBiql@uXkoR!LIy2{GEBh%VY)ro|>PaoW*u!bO+jg~T z+PO1kg>&Oq$Q*UsiPMZ)s1X+ms4J4ZKLKRh-gw$i6M!ugjkXTci=N$`#yKdW83M3? z#tC*Cp1aWOa#=Dc)6+TaXEU8TZ_HZMVgN=cY16Z;YcPCFVn6|!yjZny|tD$JSfLMfHB~-+P7uW&mM88YBdyyL&)ETBJ)lq)Vg(hLTPJDFIPH zLQ;?}=~O{LLFw*p`0x3Af6v)-=F0>2?0es}*1E3u(sf%mVEsGr+#?6#_U=y3Dn?-V_WjXEB z2Fj4%X4m?7_Vze(6Ai5zo;aEUlbUb(`?+(5f7CQ{f_orCij}fzG#Jsdl0ya;?w%HX z5+-uY@|cYPG+UFE`BXXMm1)cFMRgWWd-0R9Xe41d@uX#Ipn<*zUabg-o2X4ystWKz z=kmoDbr{3W@>o}NIgUxzvLUCzMe}`Ik+m&Kp}{}bl!h|coMnQIKeP`6-#9ue0A)4jU>lxQDmomd-;(S(Y=60S55at_uIE zJGhuIc5Ugq+aCTvt#d%*XQ7?#p7usgNBTIG>-SiIfl3NjDeC0!?DgN?3Spje0>zNL z*Kd8ehVGWb@?$9{fk%tYpZv`eDVuSR_Xda^x4W#z~#Yv%3!gY z9W4P5u6tB{cs5Tb(v~{h+Z3a4T!gwwpnQ@yt>U1}4{A_j;?>1m2g)|{u#^)ebtsu7 z8ZU#l8&|pf27Y=fZq#o#w6Lo(Gr$;98|yEv0*V;5yqfCj?}`$mrA|S>#HBF%=*c%C z+2*Bp4EI)U@27+MxK&r6H#4K*fn5X4h!sa_<;Sn4GXgWCQJY2L@wk#Z6`xcrj+E9k z;q7Zta9Vn%*Xl5|R{ori65ss8u)QwPfHBc~vYb0F@BMZhNES$|3D8NW=k2w^^=HD-(N+jJl;c17DQE012c;A9~%hEiDs1Ei1yj zEBLLFvyF{Oqn+;J37h%?RL_ho7kZdaebAp&7d+JjLT}s%Jak43j0BE-Q z0+1JFDru&0biBgv$(3NgiX9q!Sxr1r>DQu0FQ;ZGPvag3U&e%I$Aj0|dO8FfDYcDH zWOp!ujy9i_Gm{J>Fd{x#@lRy%ucK=JeE@Mz`2~*JKHF*Ye^@oS)R5664PzL6VFm?~ zxeYf)h~)uVGbN7F1LpxqWY&{h8?vFYz&Pyj=h=3#4Z@e5+1J7i2|5fvtZ&5bGFavO zoE3E%AfaCldG$p-M`G2YIib&YE9Tjo&`~K!{mhgwf=|U(55YG@3T@YHcr|=KkAQ8r z>O(>eupwT(R7x_f2;}=@Ke=N=3pI(@O!`YNs?P%K5Sgz_0jT#ANI-Kc6*zlRJXzmj zyRowUbvEz_Lku}cfWO z3|II@QMU43Sczl<4vs{i!9topik|W(_;^Yk?x7+%30d751whEQ<~XBxh{;}C55XiyW+jkELnjhm~UV16eh-HhfzV$ z?(^&)+cTG?;HilQ&7qg3Ww~D&qp~(6W4*fVU<}J2lCb|JZ{AayHByRLwbl-=7v3_q za5u4S?reCrPBK$WKl>a5SOCXLEo9-%!>4ccKcfatj+6IBwhr%E(Dru^JQ+pr^;>0F z)Dd3Si9E#9kE;pqnRp(Hi35d3nArjc8aWij>C)c32CbxMeMR{5M};p&I1)2?IJ#^$ zif=p3yd-aZ8#YeTyM~NAXdbY3Q9qD+SX0Pm`1$^y=NLcP2loez)|M|7YF*en!_+|| z^yf5*EqP$vuIT8Ohmy8=iHoC(1QU)|ZYBj2b9iI?Mvu4p!0RmaYIbG|?5B8izm?t> z^IPalacLXV#6|z_UF52G%7gHpI1}P&#$hYxfaUeJSFugIt(WOsWvTdYYvv_M6zq0A zj|U}vF^+!2MXR?W##|3z=0ndA5QEU&h8?wIFIn5}cF-qf_47#>K7r9yel>%6*KOLjS>ACx#D&8ez!7Do9uwcT7L_- z0$h&mq!y_jgK;Y^kHgcYlnYGiWvlgT5I4-71Zs{Gd4;ByKmk5{q(7-?^1<1|pN}zj ziFsCT6=&XQXF}O?R(FN0Lh{xe34!I(@8i^J%OBJ}|CpD|>{N3^0j=kt(j~uoMvAzV z0_rxVE~<_|uScc0XLf3JQhMbUhKW)H{f$WZq#wNZNfPv84CGK)JBe$2c#28&JkJ() z+qLVr*||xvA>Ykqffx~No{t9IZ0xgLer>zn?lr~w2SdDa9J>U+XbImYx))XZINFy6 zqUn-ZlrMtkH&aw~uvsSstG$zws&{J14BUf0-wM4;40MZ<3N~c7n>^9_dLtURD4G`h zm5BL_a*fG=Y-QZ#TjBBhDqj|JP|lHxrNCJ?`crh$G?~6^7`k`SflHrFr>d)P5DW4y z^6CwbNVi=u)K7d@oMGlLDqFnSNM~^XTz5s?QE;>dFQgZ(JQHo~ zK<@wZr6KWX-muYnQzye0D4nfSD|EB05K1E$ z?;(!+xv@{wFP>Issc+zI?U?KMcm1o`%YR?levgw-7C|@`o#F%4*FuqiFBWNKog>^l zY$iA*tXvEMnS=D7f3#U10H+!;>wN$xjF~3w6hmz4_L%(9FjqN0*|Os`XkOXk$R8ho zKwHs#pFxv)ICHpu=016ovD|#F?NhQ!BBD@g9xZn-hBgud`d>f z^!th6_OguI-E+YjdNW0TY1KPWO9IeITk*%JCaJT3WO~V4nwx$0%k28sqJ7{JuCH#< zjrfC%r_%n6KrDz?n!nR~>y3cuoNa;3uO>=OrV|#x)o&~-?J!+dbgma+V>(`PR=gV&YI{`@zU zmXnrkn^m*z-wG#HT%oG6{7UAj)(8VGTDeaMd2o9=2>p4zo_n)ylf*K%#Q{NY6l)7b zaPgP-6Ak2$)H->`;$DX1RbQ`tNZ=8OlaizKfw3JU(GuG2LhT!%o^%?HwvS!765LV+ z_t=0c3dr}WhG{l~v?_K%E;}w-?Uk2p;O@X4FC)fs##<~a}a%h6c0)*sH-c{ieBNV7|qlJb}=VpDkEkIV1-Y9D_u78Bk_=EhBv|6wUwvX(RT#Jf8cyRi8=BW8Wds8&qYCz^5fE&?-Tm zSYRmc*HsQfLuxjSpqD%^#>Hl*VgRY*ac$Ktvm(Lt&Xnt-wH8|{V?>&Bpy0Ct&lDcZUp*BfUO z1ga07NQaU&m185JD4C~oDdMAMEI?pPL{hIiGe8jPztdo+448Z?hoK{JQzEz4=fX&s>ea|Y``o6%|BTJM_P zY1Rlg6%ysRK79f-<+LHb>R#`zz#g#N}mo_Ge!|L!hgiFLFJT98o;2mw$I#`|zJz z+!yFt4I{K!wk`rSuwA+8d@; z>yb)n<7zd-rTi~RnXw=!hA-xss+v;L^ zg$0@FsAAz`KCk}G8d9zOad`fT&asZXs}&hIYh(MDXDSQmyLk*XVIG_wHusfe)RQbI z25kzTe2{O+z+xV6I3jzmbn(@pv;1*SmwU;fnt{x@+lBbDWA^kjw!>#X|zkiWJ6 zFw3HiZDPDSsK=4E-DN%6l6{uEC`lwyGD6}R=#@n*C8)SurcArKT%Kbq5xY}%=@UCK z_ospi;^rX_xNx!b{v1YBb@J1u@j=^JWJW#^`4GO6?c)NRo+!HNmNQ+wrddB#d)PG~ z^{Gl+QFlB!Ecr+uffj4={KAU}ONKt1Bmk?>y}uBpoRt`7Hft!A(J$l&M|ofk%@NT* zCm|X0HVsN&6z%G8Bqv{Y1eZ=-deY#$NHRvy?L*?z?8rm)o#NnOBGzQbnU_@DKleMf zS=PCA{hop92mrfRA-Cc1MisjBTEFSfH@7ijfZUyAr9{nC^D#}?B?5loH=n%Rm>o)FiKP|k#at!Ey~A@I zt(4l9xn0E{Ame+POtW+!^adEc3vA;&xet)$lGQ4POEfY!Cjha_f*@5gfu}0oQ1Pk^ znYiUAI(F1SB@Z|-=Ht1ffOlw+c(<-|Q$cpHk92L?t}B2eT*F5A9zbx)*}VoZvb`$$ zl$;7LE1BcsC)|Q{Y!imhGM*B8jta7cqt~H+YO&A$QQ8nS4`bZF_~8UFeH9%+H1_=}5l_7EfzX-kW_Jhii5g?cSyKrgsA@A|o_P7O#5_HGMBom2}pow3^EwVb@ zGa-Y{^%Q+dxXV8rC#k5G-+1&4CfW^JlMM{g$zuFxjee0<(cCP(d19*5B&puqOAss! zMIT$dUf`7&_G#sCvUs(!KUvH|a-~=i7N3*}sXY&T3v&U_f$R3Y{OqwILTy);*BONj zvln%RZ3xgLgIAq9(E|Qo+Z$Jw?eQm-Qm9wAqGs*Kg5pyX3p#c)R1Ti zvVuwkbJQR^x4bDsD;R=wxyy3I->Hk z)C%Q*L8v38KC#rgmoT_$7H@+WK73+t`;ljv$cQb~>Ue>s%d7Ow>p$PY+x9hd0qvlzk{a(4fenK4x()TjO|3Vn>$e}S%oyX|PENit7l6!^60Cqp+nZoag-WBNqLzgtgD6PWC zhiL`5zhaaJuL5Qj#HwX?{7qrQ?#q#Jn}0s;M_0%}Km6k41fQDBS{DT{2q*usGu_6- z9^hqOe~!oQSg(Mil^%*}(6@;K#`gq05|=aB&uZN&tbAm>OdLKL7s|?;U*zoZp9aK# zTS!oFiEa%0CK1EnMks~VFWgs!#D}%>FOQ4QZnS*jYjKY=iG?vZK63g$&IB!&A~exR zU>^Vz)E%v`yburaBHYjM>e->LVp|#6;~*$L&JQA3*E)4XAl~ z(Vyb#awW0-Oly`hKk+M2SXXpl-u}xKCwM(dFve6#E=fEG>*FK2W@i-2L7~HF$LB66 zIsb3RzV}}=1wL((@&EU~viY4jjZGMzD&(t~|LM24Xp9lB&YJK|T(Z0ueq}2ifjQM_ zaX|kvT72adz2&xrv>`gC7x>q-n6ntu6DwC2c(lt}z3%+&l7ZP>?k4ca+s zQWm~^+&>MNJ>~9Aw7KZ!4RrUTo%R1Smh(~yd-);##rH3^CtLnmg=?|uE3V)}gf!wo z9S>ARZ+P9Alg;Hmuo7RAdQZ$$_l&gBUXVjCPE%+B{44tc*J1giKU0;WI%&!RyUaf$ z74}+BTXqfR56Q*Mx~!*9NvrsZ-da{{A6Eojvs`XSO=Dgm8)TCa!towywoer6eYbGJ zKu_z~#(U|5Ui~f~WGy99cel$8AxXJ5&>e8l!qbdJ0c>+)VTd7b-N1Ol)1voM;B2Z_=H*e#>}AW~>DUg2 zG2Bb%zm*?QtMC+bJO-p3lz$F6@OEKXGWX(%aofAkHpAFed2)>eu(=!_0zCo$&B4VZ zPy~~w#1+_O1V>xyRH->SL~_@J!{PiDwbs+G!nI$sFq5HY{X3{t-UrKWk}jEv~^M{CoR9zj&F9>8HcYi)E=`p7fQslN)62u5rN)i06;AD zY!F!M6nTjR2t>*au7B8le-9kSlkH z?Lkd)BEKs?KAsE=IE-B&s3S&O|HDw#VzdbTkLe|U$=T|){)SFWq;2ymf5+3wGJ5uR z0F6eXiJM*nuWX&*?M`ikm^;cest`27kuR4co)~rWPTP|deLm6e$jjdY#iJFxf|){5 zQ}RiA|7xz8WDl5POh{hWUN^N}HucVa9liV|*}m9Vtl%PfTKhWNz&>&RIeEt7=tkF+ zzP|Rj39D5JIJCi8g(N`x0bipz4J48BQw=`-TAyK&QABc{KAAW6SLyBwbV331_3HvQ zyJ4L+E`7tQIKU|jPt1}V_Far7omjo|IXA(t=Ozfvv?bkC*_7)~Yr$mFJCk++v&qdj zlRYK3Kj^Q2bT=8DvNo@KzbfQ74w#c9D62|}Itt0;nl=|nGvUB_um@$}JyHjixSg>8 z>RG_JHNJk%ggt=YdM++3zn~j?TpfRFUs9xVMjU+>T{v@=q`1-pA`K|K_5JnJ$k6xhgxkRfuSN& z&G_n2k8`^hhq%(WXT4fBdulsYWlkGDyluN$e!G;?H#=n$a5&a}=CiJ9)>xbQk^gCn zV^73kP0&QFwDU~G%g2$h$%Dd13achiR$VAA9yf?vJw$3hD#ATlzB6XJ7eY}+f<|}e z%5+T|U6SetrOxteSyrjiG5307H}t_vdg7(9uK8fVd&(?im_b`5Pev@MBo0*oDA40# z)UQv}sw#q%?w6WfZ*+2ru*c(VNh%XGq3%zm$0p65G+jQZxJR8W%b8A6fk(%VbUi?V zpzNSm?qdn5S8A7UX7p<|f(0m84{}BtR#cv7#oS6DpbY2`CHrnjLD#DtH233R;T3&-A{fxtC#M9xzMh%di^eukxWr^^-EqW?DJcY zHE!3iO6s$1UMGCd=zT8N0#-Rq(~Bpw=Of;xBtc}Q%wdZ%3w}rU=t8)57JV=*?}k*M zkBTxF5L+c~{i^JVdf}sv62t30I4#8`}TBgM{%lc*|^n)RlJ&W0kSup^{1Q; z{Uq?4-U&AUD`Ttwe*W?m5CDL0rh;+h+4CHp_Ho5RQrs)w;OEu#Mx zsyUCT^Gy)LaYd)#SXRtTWH>9z#*3Aepj(WUy|pT6jRq5hnhu({epB`YY#G*w)jhhs z6J7QGwU$1mwkn)UcFxEctCwKd)S-&|>Zc8cebeL$QeZ|HOh!fU;t@TUT4I8jlZI1* z-dtv4KOu*^dVJlLfiD$-tJd$R>i~&PcV6U4VMNu@9nF0xYqBLgY%6`AgM49-{(9|k z5mi+xqvTUoVb8_*-#a|XrEWcy!~oGJLUU#yo7ZM#rJ!AnGeU83!-^Tm(6y8;oire8 z#M^q4V!efLMV!uRUkeP{+d_0I)8K*DqJj?XzJEp?zjFF?7`%-uC1M__`53wekIPZ* z6T3_nYKg%`5q20fM|eA?VF9cxfK+24ef*wySHsCH6$Dx5Hsi2_Ku8wuO=GimJ6OLz zH;+WgWBm(SdmnM)@JkR0HTMgX%RKWeZ2mR$0=ydYY5%i=qsqEu5cUF6Nmv9l{7I8Y z4=}VTr(^Rg?^hXrg9Rkd8Za^5_O*jG%+}@yj}T>VgvxydEZ%gR)qL%JF#CYvgW4oX zT{LSM34ruCqEZQXOPl%tn8b-JSe5kSI(>&DMgl0VP(lq50)2r@!k{A7Q85u=Q!+S-{$g5Ze0$djx;TRc*4D zuB*D&P@2rIs`fY(p-82v<8$Z!Q4pkdr+&rm_{j+)5YPBk&4o-M*Lv0P?tLTUu5D%* zu%DhvA@bL)?7Z!zy8J>PuK|5eEsVloCU6FqS=DWx37FF#A{(^!`~ zV|!99Mx7i+Kdh zT#9aSQaoPU&TcZSa^}UDdhg=sIm;3b1>bW0_4d-ifdqx1@h9|G0OBS%K`sc#_c+kN zt4d^^pNiU7{WwPke^oxBviG-0dfPsRv)s1R%97j^?nBlkM#zH^&)`61 zNv!@qH0M*QL}JYZ)d%849#&3*6q}LiFmnp9pU6etAX1%7>#@}N(wo6A&;1a=+Exm= z@7=n4f|K=^?1v2Z1G#SaQ&JXv{*gJtQ1wO+`Lds=pI9}F7OrnT#ETMG# zt2(3DKQy=4J}!jNzwjUx)R_o=H@YGL^7jjxP6Ayr>0fkCMc<7sf+Pzu@^mb=Cs+J# zAL$@{pY%-fB?}P$Ew0|tc?m50*?@|#*X^+YtmhSMXBp~i;ZSKG(La%Zi)s$!8mbxm zGXDUuyX$yO$RC%qalT3M!tCAkBMKY8BX}2McjyLGy3QB7$BU2o-bmq$onNh?_XjQS zz?$C%j*}l}6TIAPf0>m&o`-g;o!i+z9Qf7T?K~w6Lsj)k6D1Q1sE?|%0(?RQVBFrs z3E69HT%^>oyA`FLB!st%75LnRm;+n)AD=*Mh7TAW>s^z;o9P&B4JaILo)38xVq~e` z5&vwX4D{((uTG3Uy_nLdJ>vhsjIFz+0>CNcdt8^PB?v%dXFwMg1ADx1GC7|ZB`g+D zc}jAyT=tK>?0K5p${+13snn&IJ@bhqN>$TQY~%#qR5gS3KSL?e_{1mN_w0YV0CW3 znz-Q8F7S0Ou@*OFR6ltt`m1sy*bQJ=R+3lPdpw7a#uaDQ{(osHPu#I__9-s9Q%uhZ z3U0R5+TX6fHQwO}4zf*G?Q>{m)|`HEU&*ktt&+yBOey{P=VPb-hK7M!WU|PI&){|U zK))rKHIL^=8-adwnXP@DGiuDVN><_1?eVwn^Sm|%(&7J}gI_S;@Ljk&yZ%buzDOrE zS6^IU_i?axdQCwfyE$E0Z2|h4+{V=?pv?ag3^;ber5FJ6j)hFSzjm*)6-sSk07*}u zH)#hxShq-wa5prcv?Y6pe|;Wre^{49NQXE@)tD;&e?vC@^QWnHvpra&UR9W`z1|wV z+3H!`p@yPhKfw$CDEE$kv_AzDjjEjJU6P)U652yfJkbuU5k2Fq!ffQ?#h-Q`SZZrl?y$r z?H9%tn6>4vcI-EDJ+;@rU?y4m!v)&zPbO0OQmO`4ajU}E>62dXAMAKMlCzol!{!V+ z#W)pYLuc#cosYUe1(aUPS(_B}V&gT9i@`IY7!cuMuEzJm*^~*H3S>ti(P0E$w|02O z&@iozOP*@R2M7N(5Q%bvKCqQbsI@0`Su@(Qy)$9FwsoJX2a+Ff;KvN0Lz}Uv5 z`h^E(3ETu}W|QVmwU9A3w6ZKKzkb7Z+Bn(b;{G*Z3@bSMri)dk%3wi8R`p`gA#Ldl z9wU35Bzy2U?UX$L4ne_@2xjaF55Nb@;~rSxp|nFj=M6d^Oh5pAcTjk13YUkM&9q*h z=>x zNb^$&-aF7ZV@NU{=l*c>MyM(uFV`QFNa??L;iTd{lZz{fRkt>;BM@qG_OIU5XF{u2 zPulu+lX?>#ik(>h{;Dvb1+E2t23l^9B(*yb&9m3|+1;a?9E^#zxh`i9retpqWrL2A5?)y+?aR0#F0)))efRl7PwhB2GsWAn@$xl9Gi2Gx8Ey$F_&&i=cflCd*=Mb zc(8V?-ygZcDWpE3SffH#C4A@c&FY)=oEHAG+&q7ZK*#eLdtYH1Yo&Q+w!9TNd|r8B zms&vjbq^FyD1O+#4IR4LvXk{!1K1QiGJmWHcdrSOZc{@5z4}r9fAx#(CW@?o1w#le zBhM26&7LEqw~X|XBq>Pqps#xkRP3%AQp$4ivQwn!w&l%o(r`L8UFzTto=?DF2p^NvZF;NrYOA* zLdURq0X8;^;8kg~3imfRcuz@~k5Q#?(?zNXCE}JjI(ZP)Z+e9!1YIqTjV?7EH)lua zoi>oWlm{ydYR$;HvB&q+tM}+Hj@7 z9tRG0#s#`C@HqvQY{tI&FeKm?{ME*s)L#=L(zmNv_V4FKdXXbYO?J3k{=u0+Q?xQY z{pD0|o#`8c1ke0>QI>-!*#cB|>t}F9m+L2%z6h(AWY*(7Q7;#0cNn^dFkk{+5E2O~ zY*3o4V$ie{*fNKJPAm*vy%L-^dKJh5bV6Rx@G<9tO|I^ZZqM401E6IOhiY^m_8tEP zjWjz9g*!kjW&oXg1R?+^ctx?b6xO#)s0|+-O_DgdD2s4wA;pqZT&D0=V zrFEnt)?X19A2Mg#01Ceo1SKcu=IhBG?Uf-8OLMJ1vc?ja6=5ja?5ccT1;0QaNEn>@o zjCprU9h8m8KSGZz77~HRs8Ulc@eg$xSk@+57e~2=8a|nUk4${tCjrb$=HS5@ZLiSb z-rzr6D@X!Rs6ras@kHCfN`KtE-n{r8y0(6%=CeYSA0;C^S<&E@M2YP}t;p>P3Cu1B zAdP>+h#rr0%D_-3&sijyUW8yQ=l`kfyolUyC2AWvK$MbMa^7jfaB%g?--0vt6Lsxw z!y|b}B-B^KU7zZz`fZC7;?5;OLxK?O0I`rixmM@nniN_>(-&BEqXHySuBx|*Prk~L ziB6)9ykL0EgX0$!R&L3Xzl z+is)F0USY5+j?lA_WUgp*v!Sx=^RZVssWhyAiuJ5)>Z;zCdyl9E(L z6vt7N4$W`js*__WDX?vLyl4`ny6Y4 zHY$5UeV(88eD^s{7q54NZmYRT<@Y`Dm($;3%{*0B{Eg!xxKl#BVEL=G6Te3B=fvDi zUuxg=Kb`HQERBg$`}fD<_mPe$f;VGHX}{^3xeM2~lGmrfp|B&vRR!4OqQeT*#Z*n; zw#sO}oHp~%@3YT|%L^Q!G|u-U@370<)+ zbMaB%5t3b81x6%#-}@ifGjjV&Ww<>n>Gf11so*`^UG^B04*&aOU&t-wW5GTfY2B*H z--qMC^hI`36K9xEa{8hSBiiwpaAwj_?mk>N?h+>m7RQ9 z2|4i{c>YE4-K|p(dX|Rb^8L}W__&)Q9K}M%r7sSjo)81bcUWc5`|Vk}3=e-}`d+=I zjqv{mr9t?E?o%cfqRw+hB_>FuuFGiN`&s?Bs6oL$sy%D9znZmv%wQFd7U*vNT>tF>)ZB=1(5%=Z>>(l4 z6(V|QCv%w5jX!tlOBqHj)O+ANz;lkv1ztJewO0+F1ydh=SYl^XNtGu%a3icz{&?>FQ_9;LmtGnD-6}F@c)lj!*cFEW47th zwCX`0hDc;?d+#gKu=~5{*P{VpXkOa4XWoBn6Q!+t&Y6OqIah&uk!UsoilRy&OJ!>? zqA)8Jhmd01G$Yt=1VerE7Iv8GuYD;F{+1CGe1fv1c)<)lJH{vh*zCFQjauqHH2V^; z6{zc8zlx|mGJ z)WCVUVSuq zurN6l|As3epukOO_2+Y1ju9B>aTVWliGAeYWTgR-PlL&h@g)%@szvd|)-ZIf9{OrC zcn2>H3lnJ!_-f6hIxW%q5cXsf^p?O-%iOcee^#URjbuVKarX%K;Ct;`H71A00E|Gc zR9vjtVn-i4VZ6>zr1gzLWn%yDSKCxlqd(Z-iO&NFl^+dNz!JT>jT#SZ7r8!wk*y9x zq%TSRBH~eMdCBy%MMgQi=C($4;&GcdcIm|EarN|fb}Rs%D5Hox>mq+U z7yc?glTh3T7E(QFCQ$m4xAZzz(2Il3O`NuW69qVYB0@$Qo`s*<-G$6a<3*MAzW8Uw zqRyD3o+?u7KI}cu7LazTN|-3qm9^rRY%uWch_mg0lV->AgS#`BW0817GVP$9?=$w& zh`Sbqjgb%`25J@3Xe%BpBMOi?@{ICSFbM_6T*Wz$UDxVLc>sPT1cO1`X0{dyb9_Pf z4l>ERdGTJ1a8~iVk=|AMpsW1?>%y?k06YF{eV-9|^FpP@(Vb#vUj{gOGIKR5*2X_< zR68$~Aq?1)K;$x}EPCRDeGbj8U#}L4>~6Y77Rw}qn4#+8jE9jq1G!nrTD@UbrcBD6 z!KcG?3wOq5k0@YsD!vS0P9_*kt})j4mWFHm{!eF6IxS*hpM|9Re9qs&2V>w%jc+f{ z^^_{eE(HbodusN}coXM^4pF!C{--yd)4J~>W`ne2?uT(HC~s&*^a*rz3-`QqvZ|~? zXe>%7hkjCkGlnR#>!nh9K;#_q2-QPLRJh!>G*RlRwEq^~h5H+`MSLD09vI zy7^Wuh z<*!BWe+&Qo^idrn%5l=ou>G^?+tzYb>xAi_E^XH*4;$E1@|jIXc|NL|DyQ)u)2B85 zp<-gwSFSEDEe~R#+prtYB((MLaXELI74&I^w?Ac&?Y+&e0gWrgU5m|+HMUN_;Ohue z7e#?3NQKDi=MD=gf5tx4%6?M<3>3orKdUIEYa<=O%MiSO=mH<4>4uZa8#$K8|tC)Os$vS||crs@eYn^QGX1`*X~>!yZ6g zyKr`*JPYs}*G8cui=VIai~4Qb794`ink5sRWE%oWrZc|TVYpJBh<7=H`72+o2!XZS zT8b8-Ug3elQr)=%Fv2J~?e2mHF(#<%z- zd#y;Qx`8Nc|VAc3eENDHIfsx4VUze|76-D6dhhb(+{y2uqGcR$Df5GI;f)vsGY{3t>!f|g?Tn5cTD6H z1Q=r3?W42ZScVV^o(H|v!(}`l<<>2!ro)OYRYwYp{P7MkT3B3Pe0fC10_a@z-Njnv zXyvMq`cct(YgRCXjfSrHS?F%-@(Z@Bh4bv+ea;-xOTX zaW$a7;4PArm*PQ3ecfCfrPzFNwK?^Bqt(fpcnoRHMng=$e5njmry0EMx@LcpaU@f- z(O~ic>GXz=P26!ZUlL@euZFWHCZoGYzM=RJ^)%s*>fuTsd&Dc1*l)OabpL)UU&kmf zbj5)ZED^|A5FBDK*o3O?spa5c+u5MDi`p%jF(ihzAC!v&CrJn2FVc4%c5r=G4s<|; zL{+H=uHw`a7NA+{WRx>pD6=2EC80?Ev1IanQ06`eQcwVM!C`Yof9(n+qm!0%L>|_~ zgnIN>*z_~uaut@eCqVJ&h$$IeMu)Q-uN~vQn>D@0)1L5QELq-=etXiYOU{dhl#E6u zmEiL$KpX`JMaQ6E$FVbB{oAceqaG@@m!o8ey|zR#I&SMR-~BVUUz1@vqe-2G&365v zOdt$X=+JNf5o2rf!;>fbk|OuFPUR_-kVH5Y1|QtX|ML^j;ztq>zDtcUIXBTCr2Ts< zW4!D>arMObveoE^6hR>81U^xhL?iPI?}RBXmVq`7P(&rdY(G()$q0~v790*}XDcYJYiTCh_wBXt)xJ1@ zbse%>inDgAg7MF8M~Fs>;HZ8fCEZ&9maLdWa4B3{^_n^{?sB&+2qBn_%b>Pnc->qY zCfIje+?`lX;bUmqz!EK9AYc{o?BqX5l{**mrfi1V2xPY4*%UtF1l97S+Mfr~AB~jR zGoB;azayb4!JUb1TB!kWwCCSU2-rlf;M?|Sf~hn4n8F zOc=^wk)%7^ST6WHk>OGNCS8BDe5z*upAow*3%xtZTC&biq}#dVsnLipC#*eGA&I`| zSr>N4f2rvnmQHGj`Lc>h86ud0)!Zc0SnN?p89xja)ytG<8#EaW>}`p;j)g5+Boze% zLj$tyIP5st&cFqkI{!7x< zKLYP@nA@uRJ5@hzZ$@p&hO4Ad{;zUZ*BJ1Hz?Jqzdh%mDTW%Pd=3PkO#d=YN-?B}m z)7hWX167@bSou@`E*Se%>X4}C?DS;07sJcXRv!QUTfIU&AU+kn{I21+gf@Cx`=W#+ zz7!q(f%C9Tsve0(LN+Dn(3tEdzBr1G&8`8f%)eB|W&RT*ns(IpQ0vUKM04V`&XBEe zA5A)oxPnmhRrB?>Ywil(_=>1q@#}B) z|1GQMCM0hCH6y=Jd0pJqLVf_7RCG{X^80NS`fp`OO*jxf8l$->wAHDMXpiA-6>Iq? z44sp4GCXTN%)=pnV|dr zsz?L_3i{w~nXbV?W8|w#ez!w`DiF-G8pwFYU7G6EjxNqPmV4}|;eS~29~R^&D+6ISTkGw{n z<5z9NL>(Mul9>ts(8R8X`@d8GuFU(tImCh1uR>+cTo+Ym(V95Ca$G(<2C0i(+Te01 zJ{;_h#MG|@YfM}|xEs3tMF11Br4?#QXFF{2==Q6N$+p0(b4EUzI7h^QKw1@L zn{|nMN%FcP*ea{3;?E7H%x5l3x?0}JLapGR37caLTwqPJw^-!Dh!g*_^oQT#1=Q2Q z+E4si%Z=-feeUfmffLv<^c@UkLTD`OAc*?{2Wnl$gI&#oxYKESVz$$jM2qD3Fr8va z|E9>6A+nwy!B0LxT`#MfE}=1Px1qYYfYtv<&&J?3G-!{AeA&2&Is@kvY!ZJmF#YeO zuC$ObE=sj2?>4s%x7`jF5C?1>0M@i&0A;W8#Lpo`zB`{?w5P&X--9S*$t`AJ!HY>y zG(i49OU857;`~??BY&Z=c+@bVn?c}oD0(P<{Qe=p)uvP#`}=MD>5S*-y+0x#7AeLwSonX~uVv!CZ#>$g6VZ;%tk!|B?dtBEi)$I1E`dJ`43lBvBCg!)rL$V(q; zO%bgo+Y6ytJdn^Q*{@>Ba>;-p$gzOcM3^G>!sRqIG9mmu5Ut7Bkz9_=ueb!>Jeoac zz+Xokg0QE`X>vqp_Rsh;X$dRpOz~S*pSXuLIyhI?qlm?n4>2y4F+95Da+9z6QnMXx&_U3XfgN88e4{r)fc4PhK5eih^W zr$P@rQ!6Z)0Mm`0ht&p$M{$9E>2y*j%3w(L=fBUxgI%pG$*e(OBg5ui60dZhl6nvW5vxOP>|uVr~zBlqI}K3aSAjuIo#2*J=Wv>ATk{;q9r z{`+1$&U5v+%x_=V|I6^0hYLRaCjdj_3WX^JgE|xW&PMwjAG=TF8-do0X}XT?&p4D~ z!ZhK6vf95B=V<*;f68r6!t!b{u*%`cn){vAP^=MS$-N}ZGaBUslM};%Riab9LsZ{ew&Py z1;F65lmQ@)U~UoH4M#kKx|IyE@qILz!v^y@vVGm{S19Q^5dqt52_b(95YDZ7X3bvP z+;!KjG;Qv~+-&WGz3qhFIsW9MdkU7!yu*W2@W+wj)C>Fiax?e2#M3E=G}O+0IR?u= zr8~FfG`#9Ijs!F>Xo`-C$PC<=o0@+d{2n?Njpo1L>rbk3n1cyTP*C&}R_jPRoBu+f z-c#XfDRF}P=eoB6a8in&#DjA{cs-+^%Ugza&EF>}a~v3h<$)P!Uv&t^x9uDLFbXqy z011D(uLeL-sF8!~k;yNE@L=-4tdd6&AuPBZW!3Y?naIpjk%p{n$A=?e%o%v;^OVt( zv|j%Zc=>^>yEN|D|=9J?zeSQ+YUh~Kv7)%nck7y=iY8){Hep@d*G0lm!WJE_b6Vy0z1C}FSbrm2K=bB zprgt`I*PkQtH(6KV}7RWSRTOj{`Z5if=RMA6bf5AxcS!hSa0f&Y`tQcg2kQV1b{Wh z^zd@%q0cX2o}@VtF<@HL?)Xd{iJKO|KlP|7I9(#8vPicJ$xyi`m}uA(Z%p%$|E3?! zJjBdnVq^Mn{F9Ri=UY$<_ss)qrSNyrLy|Zhy7TiE}>*#DD5;{cYjiQ3G8T zVyk^(5d$$1YG+lAc&dxcmCS|Fvw7@K>r~3X4f9S;Xg$q%6-AyM3x#f z$14^>dM@VF8JXVO|9M-9PYCSc`QsVb@10tIBGlS_ z*3;5!^~coP!(>?gj84B{r02m4ELAKYgeW%TaPcKEl5n*!9K(uOWb|hpMG(ODi^0x_ z3Tojg0~+OjHmBur`G}HZu0u2!ZPTF2t;ww!>sbpCp-z79NrsF&KRGT>%Wn~K1?rJh z-nk??ig7>)^sNBe4XK#=2*woX*^0-2aSjRBA22*rgR6FkqWPKtx<5hygmn92NhJm` zA@rb#PrPVbf>=nKc1$|I!}$5=`Je6CdThA3y6F0*KV}@9?~BDXtIjtHEo3NRRqYv= zL-xD5KB2nTd#G&(`_^Boh2i0ojLh6|ddeHNyCI;ZW%>uwYIkp!Inb zBMbx4&08wFUbG)u*us_Sk00s}ohuDzJnhdhU zJ(c}r%%w-0^gg;~c8;*#gZ%TX4_|Pffeq8s&a(BV(llq7dO)7=LH2_;*S-heye`f8Eh$rDB!0b;#R^wt z2GWJMTK6VIEr+=REa7~9(@5$C(16TZCbRV4${}>f1yFB+Gou$=9#m&C@b;>rCvF~0 zzB(eP=`7fIOmqI1kMI9N z>+I~6nTLBtHmem9(Tumbeu9QC;i5;FDg=Ms?AiMUx9i38a})4Ym0DreJ&dmS_~5U> zfyKi9`BzeRuserc_e|ss7>{Td0XL}G^#S$%_$##y@+C|XXvZ9P27XmC1`Ie(N#QUc6XT^ zqoVTn#Jvfa6g0JCDoc5VD9P|~AJ!gxo_GGbH@4Z(*uaCu1ZzJ$^v(Ij*UNzrXE!b` z@ZyFuKVA`mAakUt?F2COjRI>hx9#3 z>OK6@hfx)`%@{n^vRc%-&T3``RyfJ;1!Z(^yz;4}aj(WdapJ zZo**{9h&N|D*Gqu8bOLf-^vFIGx|pZ|D67{*!;s;qtvjI-xa{gi`bn7Z>>EKAis-h z5@BpOYivv@(_Y_p%-%~*8ysoyCdo@A7b{r0_l{JM>FCA zOX@!prPmAy{(U>5#bE(_*v)Z;k&NAgGU(RX*x zA^`0-fO)=xqjNehNRI5g;HenXWV(O5$J1vJOJ;hkO2D6QItAs`dPntujpOTpvu{() zw*;#EPYp}Ny;_*Qej(6#)%uL&UjqVQ#ey6r(hrp!t8D+ln(@M3B|TN4MONW@--5@f ztDLk*Egp#hC0RqdkWMb#yjX)1{zDaDGYO8#`^9F-o%__bY?9GPO&MM0`gB6$QFR4t zZ@+!@YwsUaq&PJUDcsW)yfFL5#R|d(ww?w7Z&7a%&&t}Lq?7*?NJ%CzJAD1^Dytd% zrw7pT@DGj|A|~Qs2m!ddi9XtfN44)_zV;rg%qEca9K4t<@P@ON)x6*i6Ko*i5>62! z9cNQ_K1$Y4sih9vZrYYF8c!cBsfg488RDPMVTI?6pgC19S)I{lvhd@4C=9eJs*iCx zfx!N6+ZL*11+qa-Mz6Q^{MH%iL}N_mo8N)Fm6vvtC*$#b;FWIIYp3}oBc$f(O_DTE zNCtE3!|!XgR{i!W+jE{^IL9SeqxC$%l--G#Jyr8QG?AOE>xBY<}idBgdLRb78b)GL?8u4-0`mL|sqfVn6i27P7 zz+=`Mkk~YuU?m&`dx-z^8cDA|g=0#Ob3Ph3PI|v`Eenu5;`g*$C(fU;AD;a%&#T6< z5XJ&*l7SkC$GC}qyH>C`BaN>!Wj7uYIQrj{O5j>;S{c7iTM4;5`a`+iK-J+E&!N)N zk=^rwuR@(7>wlG4*`PxaCELv}`_Sld69M9kc%2o~Mnq3EtfD(rr%&-6)sy`#X|M(=ytQ#Z8DFCZyH8n?6 z`mrv7?eHt-S8(@&8-4Yp6lZR1qmh36_=`87T9d|)lt&uq`qQEqM$w}JQ#~6l4E;$uM>l4CNy_ z|9l~PT-wz#X|zJZS~MCn8e-=a^WwF9r3;gEq?R}NSm_1J*hAvOzbvqNL&D7aU_i7OR&hXckZR&QD_Sj8WRKDRzLWmGEtLV*+Rc^(ZT4DdkA3v%3oRbr zSQgjcvagN${SkP7J6K05NxlOdvi-6(>;~T~fn0{g6ff)u8*H<^-5--}690HDcgPX^d8@Ea};T2=LzJMA?-H)0;03{dx+d8?%sn#2@%X-YiE%k?-@z5zreA$L$<|ErL zdDPJO_N`VDQOckf-c=5i2nJLY*EIOAl{!F7UL zbJM<5&!7xecCcq2a?)>jFm~A=8%6W|DlmFg( z+MePAP>U+Doi~-+29){!2j9+V2>=wC5=*Pm>*VCWFB;uZ1AcUaUSIG~(A4KQBdZKP zqYgv96AMchJ&$RxD*0Q$9s2Wy)9)c-z=B;TW4ow+=HcrEm8T%xoT$rC9Zb*~Slu=- z8bJ{NI-kF#1=3d zC4jGRU|MR!91EE;T_;$c+4)4He`@U=uxsoq{*?4W8Gv)HC`f|{BTF-%$hlgfTI=42 zisWH6JA9Kv3vasJ63KphRjIuDLV(;!d^7ce8uMzY>Y8FrUh2uS@|DWWuuZ#H!s4>e zM>Eb4GUFuUs_VUWll{`o;WAosoa?IJ0<6`)_lQ`pDF#t%(w}^+gwU*h6II! zb@AxujD=_$W~LSmHP<>b@@ZModYJSd0fqEW78Q5i0NX~PH=qcWj;F^L!iZ9cot%>e zY8L%X$W!qw03yNI*X^yKhqmqbVlD0we*Tx;$?VcGJon%8|_YHihz1hc|6KE(KLZuwb>yttR}rlM@#IxSXtc5|8^MaqGJh$$^B zuXi0Q`;!W0rfgJ*>^LPbM{S4eN)Lr>hQAeu`jH0Tv|~!vu<7tWq1S`O?LG(%wpX)O zJ5KrhweiiF%I|A))ZFy5>cMYW582(9O^G!;R8!P=^sBNGN)AxZXbsK2B?OUqzazyz zar)cX@Q2c;u21MvE(7+0 zfQV#L%t0`?B2`3qiVtd$HS~RYTh(nLr>EQaHu_*=4_-f<*Cv*FTh4w_q(L=L|1-lC z4EY&IUlGKh`QiN-<4k2?$U8m81UmoSZkcfEu^2T0l-Ft)>iJy&x)QMO&dn!cx6;Yl z#KGon^O~E&AW%iXU--bss84s)I8bHn;YS#_(+L_#sr!)&@$T? z^gjHBP32|#LGOSw%vMa4)G_wlu$ZSt3cn{LZZN7w4me)1UPM*C7k1CTti;Q9@EPg2 zb@GxjRkA7&8=1;Di5bLEbt9n-ZwUA>DxpV@))1rmgWS|)LHSO=dCE={>}ZN72PuYc zd{Yz|h9lXl;Sr9O1VwFBm;yni#YBwIb}O43DsjiEneD`skoxNJ)>Kd)lAKht3YXtD zCIqJ1n0B$xvH0eNLVAa)$e)i4pPW#K*_0b3OH4fiscUrx9~;k}bQSW@;EmiAf%~|y zi}5bzVV9DW>NC>A?_)9v9p5(<5}Nm07uD7}+})NJLXrttM}6Mf!&XedQPYQ;iUha4 zFf#KQBZsW_YO5mEv9-N3Lbn7L0vZ4!dtHPUXn;tFJQjns-{L~m!#DQwZ2~;QF6S5Y z#2#w<_69AyMv4>1&DYTssMcU>=dl=Rc>9d0 z+`84PDiqi><&SD&qEA8czu|fG{bF@n@*nFu(b37kS6Lsiy9D)Z;z_i2kNtEJ$!;b6 zZ91%m*v;(|Nl}>NN_XN9W?Wd}1D%V(44PJ1$gKHJs^*o=cNP_sLHp@4e7i~Qp3G?> z5X!NQnrQ^%)^dX#``-H|9;Sci7IgiCg~UYYJYR#fhsUl$+CNKhJ#J-zKs$OT_k-xM z7KP36{I2NJPp+O$G@ToU7@bwrNKg*N`K<#G$cyTAvREPNZ3@0 zcaR?=JDYcgGz+XITb{ur$^RbtrV3=K7jeuG_T<&7AV%gSX@N2O79_jTJiORYA52Z0 zBAR{xQO>1Hx`3L0`9g~3Bf~cLM||z2aCz?mb>{U)N3{huaPTB5gs~e?OVVq2)W87T z?##wk1@zijCVmhQm9NsuTIV%NyJc32bQ|Y@Fp~9;Vl&Z;>gQ-+dxEUhSEaYnUMSJ17U_BRzly)(e|sD&E9z7-(#4 zDq)r@+&BM97um59S$f$9uj|qwEZxI}XVL>zEYE0WqQk z(;S%X0{^c2*1phTXU;FV_rIliNYZ+D)NDrzgfWpwkGy?akk`Xo4lWa`x5*Qoyf{;a#}jS(id?KD2}*9lZ$(Y6?|=U?)+ zA$bQNuyVYPnY`5;@WTF>kCSfD1!V z=C|GUFAT*rP--u!b4^~5nI{)FA-eG9vE!fpCxxRhwwzlff%e!Zy=}4iXzbur$r|%C*Em)L2Efb2_nWQDcx8cAXS#VF zXnd$qr(Y#uT?#;sqe3Ki;h#GyftEb#&hwxlV=z(rtAD&lbZWa#b07)BfgHNRQ}g~!%2J4!)VV1G zhbSEsF$$WUTkIlF?z`%e^Q>eS4IC-2B$^xfss~(`58pke&d?^4?_hk86XUDGUVr`1 zXo+}DLu62(pOPMgli?6L;;NmSTs)o^eD?{phH@$w_o!fa1It&J)9X9M)C1Fc4HfGlbPD-^Rv-<5%8 zIiwnv$3SCgx?9r8XY^?Q2bU9g-Gu!71%(DX@_&Q@-qX=>grN+tf6Y0Oqrhg+LTUeB zSDv2tt|F-;v6#*noBfOgZbQ&hlTay3xN0x~Ew^?ktEIxUqHBxYRALPVdN>ooFZ<%L zL1n=7akumz+x}g{9?+W}8c^r9p>M(nl-MOXav9V`j(Z;5(0;0WHOQ!vkZ6)DK@s6+ zJFr}VJ}JI3dyLnu6JNAtBtBrw&$xO;x52mA9#);xjhp=ay3WX5V-f8<&62W{D~{d= z-TDE}sL@@;ym#1Q?opHIfqKY#*x0cs{p$xmpMbZt(t?_#^wDl+A12wbFS%|eoWv^x?t1W{esbu07>D4 zaPlVY!7KfNkfN=LwaT?u;1wFdhjXD97m&c~Uf-R)eqNCdE_yNoBB<{(j}57jZq1v( z={be6RHjl*D!(R3oMtWo^#CtA$VcTbIYAsT{neq1+bt?5*7dR}s zi1u#DA&=kBUA{2CnDhN@edjtV&0>!*RxRtKCtCy({15&ZPUAnN&TjeV8~9!djsdgP+8|Ddr|%NJC;R#=3)q z(#=X$2m9AbC^APzL^5v|Idge^crUzTsDhCtgj%%9U62;o>6h-y(#h@%VMbC90*3^? zdd)qqmKC~g{Yjw+gJ>AAp7U!X9BZ8$8ZXaBFTPeyggchYp18ewF3zK6BfZS(;zMDV z0>nhYHFPTL0$sPZ_o)|i+sUN`9SSd^-I=lpXxivT?-UU*B){81f4bK9t|$9BTB-t2 z082w3zrdbFU3E!QUtmi-$1$eqWNhk_+toYY^xaErlvg18ZF4s<^icig!|vy5lBhZ8 zK@iL_l912>k=?b5PoN&*JMy#P= z&*~RXjx$|Jk-pZ{+naEake~id&tW6}iSu@JXOE{A4xbQpTafgee18{d_MzqlBcEJt(dgdrQDA_|UrBFVqW0R~yRN904 zT9$XSZ|;aHGR&l&i1Hw26Nz$9Wy}+eYoLbiDSnv6gIK^ds~j67`-BGi8b;tqlze)v zto<>!>owot@`<%eOyr_ZOuYh|rcDJ43j@>HPHTTX0a7~9r79YcPqnFZRM~GanledU zI41dzVzexAa&5I}lJ1|cKZcB3WwfrSZO#MHTv_RT!Z2Epkg1cVdRN+a(;FBg<)2$+ z(f;LNB*~yRFtHUUN3WA_KVr0xzdFXXSMv|O_{4u)WJx$yXR{q9rU^`15=SlgLu9)m zhG8F!a^vYGfnDf)1(AirPhv?J7&QpZ2{9C_&_YG>9}W2Gr(nL$U(=xsr9me-f77r; zh?-4Sfa;n9UfjRMP{S|n(&;csx|+Rbs)WHo&^xZZGLr2alo|7r^d?$fb+(6=#S|3z zS)ktKAf8X2@DvSI@Ud5WJ79C+A3k=OzJBq#zvm;v9s#ttOmpQGCR=0^_JLD_YKa+L zT~V9wDC2IHtf4F*8(ogs{#w@W)Yhig+u|=PYWbx0VD6FJTs-&r&*lnq-qB@Ozuqsjf$<7bV zm`kIk<*bKM5AZ3`NBFBJ+HY8L02HC|pnA|-GZm5NgY(Kk%;Y~P!AS=n@01Y)2l0Zh zdjdHkMm&eY8!_UF<#hRM<3~$Y+VNSVj+bcq*f0~+e+cqmX8@+!E>Tl|pDw7W2vhI4 zU~&<-wh20Y4w&kxcojMOCL;sZL-|9!X`2lg{8bTsvmZ1|VCU;Uc{#fxRFmu%c;O%@W~XJFRpg2ad%az>XXOvh%c=yR$QLew z-7$SPVpWguB4fgRhFj5-8`D_$2@nq((Qn0x&}V-pz94dcL)%bb6y{yjd~Y{0l?S!R zMPQ8@Ccy|;y-U;`(y7$zk%q>9Vk7xBt&VTi(00~P{UrQm7%rV^8`Hq^N6j^JTrdA4 zocTM3iZDl?C}ywTT2QZamdW)*;M43m4pL^G-Xy-k>r`^PyQMfag~y{Pse%7WHphgMC9G?HOuQtnnd$X2`m3QXWvunG4VL~Ezne^ML;XvUUg zedJZRWR6O4!-uRip0|-a=X>;lNH0&Gp4`3JixBB56W_jYD)z9)H6a<>Jj66abg9A@ z256DjhteoDG=uQd=*n+-+x8kOh)i3_va3azG8&;JyiO1q1rD$j{0P)FebrG zxge21_l}!)%;K`CzGhuk2K{4$z=lC(5pzc@e-SU3DN1v|r6a-l_tV-Dpi8vXvJYlo zO6i@2lBzGd(_Y4X*;KWy>zU3`VFn<_zl~6FCplsGo`it3_XhO8XP-r??%qhC@t`zO zsev}CrbvkV%&a~rYn_`}yk7!qf#e2v-FPyLRM(gpAf*hKeZm1br1{+Ag`*S*&tVF(qcdPRy6eU`7vE9`^^ z(<%~~#+I)^#gFHm%tG_7lIKg`VF(b}!ZHpvZ@#Q1!U?5?YIejX4Y`UP?Skik009sc zk)-8byRxhM-aYCatbDKx#^h& zOx_Uy{&K9O;>#T9yUh-`TP8V{d*V4b8fXlu_VOZ!1hxvb*k~$SGRuf|INP1aGb0@^ zF7^X5v1t)G!Rq%x_}LwJ)gKdiKu(35|>OMv@*>L@w>MNxAeM~*^0t{rT7ec-T@WG@w1V|wXkf}NNEjLWT$v%P+y5F|hF?S~6O$=wro_V`#T@`Mx z{RFuBsmv4)wFCzBM%+{-$Zqmwo!`43FBl3pRj;St6 zKHDoO@=(63CL{aczt}UUCL212#8I>N91j>(J&iPcAp!Myjru6vLyZ(N^@K`mre#VI z2@QK*k{XIT%0x#P*f(m^X?`Xo;5z++;THxYNBt37P{o*JJ)OvS-#&MgZZhuGCx_m% zN1fFc@LA!OgV$vV8jQoJ}geA8QMa;`w8D$=IjaJnKf&1{w*@)Kg+6xBcx7y3h!^&@?;bw5T3&{fKotPM5LB zjg_07TsGHjZi+4&(sp~@uPo*QvUz&;Lq9%>0EnbXIyO2=eX}K~ z^9?uo=eKX*NLa?)4(c+8Q1`}fl#s8f#&L;pB6#aKf#v_9@wIkLz@OIa>8agBMQb|E zAuev!mPT*D&|}T35k=SibSo((w6$mL&*RqT>jle*zIE2Zm!v3Ww0^s~gw^7r9d9cM z`fpbKh0w&&kkk4;!k0?|`Fvg3mVH~1xTRgI{WMR4Ada6YVIvXFt})S(QFzl^=EpS% z(S8VmH4H6O>B(q%Ytr-IqSIOIuoX~YE#5bJSauh^Q`W8wc)kUKjo^p@@5Z8X;x|EJ zkGk>AJfm%tt--WQz};#H4-}7h~UXtLP6IN$D+kc85-Sr1t3BXL5g&2AL7g zEmrwafr5&i<28C9AjHr0_t!w#Itj+Y-?9;mkXld}%QSRyxcj&6=yvLE?(u>4((-z~ z)dMRD^WINyOmTXLA@Ny>Z$MQ;E>h z+MVIl)+Q!&6kr3-xck|?=~8s|&jHpV9ZUD?*q_>^kvt8|kKNFQsDjAlM6uJ*($KYPTp~XZ*&P#o|lm!X38O8C1(IF_oZPBK;{uEKh z6BAk{QP(%cer;iZX2z$es!4WJyp>S4u{8ofSt$}z8W(%*=Sv@;b^6VmKbEu=ZG)xI z5nz#=#;={f=81QILm@;&^?lb;iJa)Eqid@d+cXq2VL87LAMjpyXQ)X{!ll{X`pI-~ zonEc&T~D8He#rF)uEyt)?0u1WxQ$r?QAy&yPPG<=kJzLJXpZ8a%l#h2AyRe8?h8Fg zz>UN=%KMer?y03|Z(mfq|5xUQG50UMKwW%cr4hwx*=EX1Wb1r-!{biR7J3QvpRQLV z<295}WvlSN-gaozAAl`CqE9tn_y)DywMo958;)1WN=vGZlw})ESUSQHDumgvnHPf2 zOnpTaPZC&m*^^)L++3L1kaM~W4=j}?6ep{aL`bkQwezvj?A>=>S5q6G%#TB1GD%9( zK|01H8q5qS(YpBUa9GE8qBT-sgqP#@nE0L{W65f1ClVnwTBVH5M@+#4wYR+o2@SO$ z@vYb}Lzd*H9B7bSYm(bz>iCsnBLVtJz!TirJKE4}n#ZsedQ=QC)gzv#5``=+Mbfe$ zATC?!tm330J|OnuDLfz%79dXfmwQsJ|U3J~kQ zK=l;GFqj273ozCt2A4ncD_Yu-*zmNFR!c87+I_>e|K*`*2V1FYe_|i@H4wGFiZy!Z zgj3l3+L|8Gclv$yCOY;+NJS>+4%fYh%KirImq} z6$d(7>QOG5cFM}x4QVYA9)l+vA%Kg}bYvB-u>0V~gI{~Aa{@DT-NZw1fFd9P2i79l z)8JdBp^RNLArWPiFNU=*JDYQm#w1Dv#1pTa7oLL@oo^cohoil`8aAh{a!K2$#y>>h-K*Y9%4Cj;vVFzFobr?%<4a zw+*a#mVO4|tkqwbPfP&~pvmd}nwmCsl)R1&Hxzd3{wa%~rC{Xp>-QZ{@Y9(4xbM)u zYg|WG@Ty~X&dK`sL_a)pIwP8bw}+Tt379(OhMHsKcv`w$O$0D6G8#V4p3}q2TW?Cm z?$N9<&vtmV4UH!KHo7+KPH()p@3r7ylAin!3#=6VK}iO1HR7O%c?nAaU9 zgbt~d9y(4+D<&P-mzU{-vh&eyV`4O$zqC|vabcoVbKXr=dpr=K-k6M3xF7Utbx4T@R^=h)(oU2-F zTXG>ZT28$T2P&ZQ7j4zB2Dh?mF=i^D&4|J%0CC{ zvaUz?cCIiOLkXGWGs-?j#E6@(&HbPGP0mKI%}l4n$j;GH$JtXzw})t}L2IPmyXK;n zpbFQI7BdH#o_kF+O|3me${?|YV`Y!Js_xExW zQ`!GqYhV#Z^#2(A9|-R0J>VakL;p)r0}EJ>E@OrHr2UhRpsze6Z?|NXb{c2E6;uP& ziwBk(h6{C`UuIv8vj#!p`A4iB1xFY>xlPJ1_{==3SCjCLh7qARl!H{Wr%FNq@k@76BZo0zA)T%s26H6TvOZT64 z<)A|hsZSlpdgjt;NwKx@B%h`k*G|-Qsz<5)^2_aKUxk?!?1!P6xmUkRQ_*F6>^hkMT*B~uKxVIwg75p!uzRFXYTQgqa$-lXJ|8VR!EtX?* z8&>sBGlj5i9Aik<&0_)wdyK8y%kK=;OI-b~o9@n*@iM+kvuxIXxdnR#s5%#dA7cei zrgwVXg2ijFDbyge4 zjgl3E%hO_UCjaewDLH-OBv{2-QFTVuc0@JkD?d2{k4N*^Zqmd;2IQhUgYJ`Rv&($C zt9;vyMyGk>zKx9!&&~Dk>cy6u5z%4Z(Ji2tP~=R#(a?J{2$R;31cj@5V@w|}TPI~r zNG}b%ZTOXx&m;93YvU?i=JfvV)c$1?YlSc^0Z=txu26#=>_Eoe_q)gwfXy&WZ#L^F z%=Qr4OudetJ1W0kBdy4SNm<}H-L@^R;9usp*2OIdxeF74jg)(K#fLh4t5M{D)P#pS zy4|F4@hAQ{@nHs;uaf2NX84Eu)D5&K6|>gACX5S76fF{t7QY#rjMnX#fL5DUeG`zf zx5S-c?SEcLDkBlXXC?6jEP96Qi;z04TZhqMKKr%U>hwKYyU3v z@K4L*GykO@Xsj&l{rsb?+aD?4Ckjbf+)6aRZEOONn#rmoADIJPT0or&$xg$5vUza zvDA~_^awU?+Jf2Ah7!im3S31OJ8{U)1s7En+wXT$SA|l>XVsT}phC)C*MRS2At&(m zvRsxr^a_O0FVkL+2;I#GqF&=mnxM5NR_sREvY6K6dq+s%FENcqD>R|wOdc-C|3o?( zIi`})$ow8AA$Dv??5f8;U#Ry1!;I<$m$(Onb94QU`xRV#@hBZLdLt1}U#O7}8_H2f z(_9L2-Eqb2Ka@c%oHLtN2wV3GtU_aht6cDMvL#>mO_{>{mDteumK8MbYdbXjckU#| zh@|GC1CWw0SAO;~<_0N0$*T^RUM#6jK)3G0`1A+squS#*I3z91B=Da>;J>ov_kA=3 zfKwbaqtZ}8dWU48>*2yzlX9Kn;hKjbW$g~n-~KKBhQ4eBHY#TDiu?EvYe4q4<^w^M zAdJU2XKKf}C3gdJ( zN+q_$WGx`Zr)MvB3ciRb?;L*Ew^NBdV7<9olZNOJGQp!k{-R9l~dV-eV+w8z*} zG@1&di%u-Nl;n>Nmp$}N?!=LLg+y*vVDflG$o<9PPI>#soH3It-|sz@(_#M?!3HRJoO zphdY+E=pDO&0>LJ2;|n|Vl0XdE)jZ`-JwkRFAvELVX+2|D%MgcrqL{gP$1k(=PEf5 zWtB&`mG}zo2<=0zI-Gnp9NSM=mO34in?UVYzV)cyK1=vVNL}#{4#|$R)xKLpwceeU zN_~67(xu?%aH?GcS3C$){H@2Fr{T&eMyjUU>-7zmCApEt)pegqIe6pZlzlCMp!hmv zVE?xlC$Wb{iJekvZKaeNLE5mno3mc;x-$Frzz7kRoHT0USPmLiAdue@_JhN3zjH}- z=4h@)K&+oJN=PU{e{2dJ2Y{~&pQ_52-YW-9IRHetN_lM@_0mc8jUG9bO|vM&0Uvid z!pAD#^6rU8jR#E|N5$C2jBdM=iV^RsmYo$cU+{^S_qpR;nZ|7e%aa)tto-OQy z-HvV!Dnh7*)68?qooD6qf^9Jdy=l^opsTd@pTPQHpk04Bh}}ugJNR2z#VCN&$B2<* z;D&iRao_Mp0&t&SvtZuMGYso0N=)1wO0nYj7=s&vK6z{BKMg9h6#fZD2B%ya+_T2^ z*25CeST$BIQ6O1DVF&q4^;(N{%*PY#A|pXoIL`{G7Hf78@33>}QWYC@xo;T`c1WY) z#|@_Zi#sJB>d&*MCun`>NRNc;z#-%^Y!@_*2Q60M!Eo=XBP*uXRQ{gpV=Q5x9pMq& z=bgh~o)JY3hA0tnAr)*^ePc3cCF` z^Rm=(szNvY2iwBKKAKsVrVrC7x?(5okAVPM0x%U*;gELgWq>idev_y zWyV>o2%xVk7$YYy+__MaYF&F0GHunrWw8SP)gR>tZn0ja9DUsoI-xOYKcTXc6t?yz zEupW*vx98GjjcLOwUt23Qg6lVC?y0ri?E6ykFJ+5Jb6a|bP6oto@W$z?U58hULG>Y zb9L1cj8H-ld5KiDiohG9yJ0S%bKxjHj?!^i0k|H$6vHD+HpmVyh@BUiy=8=a%)#g! zyfaK8p*L`7)zC7WGtwb)1P2@Hi*yfmKv8cdZ@i-{egRFB8yv8*rK`_?H_&h9Y*t;) zz>BO;Y9_hP2;q^agDfo18yMfOQG#=(PglEXRsAScfMWzKzTuGY9jQy+ODEi~rCh@1 z>Fw?|J}n0K+ypneT~3`=rsXO2=M5C^dzxIGB%JKn}C6@qW5< zha+#^-ho-G$7M&(6#++4&rOq+Ucui>B)W>P&WKR5Z3bT8-~BGw{r9PzoQaI^@K-@v zP^_Xdh1pdHZqC<$uSq}`hl@1s(g>Cnz8@FQk0*L&$Isq;z?neTgXS@AiaS3i%@3tI z`h6wEckKGyv=7CCpYu?2d-$gg6EGaj3b-CDK1R)@3~l64{TLY( zbuxPOPn@(oAmipefbi)#vSkEhB&iDRYBg_#u*Prbaavr7p}hMsTBGyiBzVV0FXFUW z2TyOB?{*~R012tyoG_VJj2hei4|Cdg&In&b^bQH{wHk&!bpD+7JxH#Fco!7&es?E}v-Mv5 z(Y4I$Q`_4W+dO(A!2v3!60+Ux?93kj~7QWQ<8f@ zYprIma&E%k{Sz+ON>eR4oH2XcT_c*0bX3x^v>szx;KVQDpFy?sD}g9KCSailJUxhB z_)K~e@Z+?f{5Df_`w3rWrQP#^(~(bKfmc8Z4sfr7@u*Eg@-i>AM69=D`}zX58}AJ{ zy{&80c#II`Iz35W=V(&>dBX}$5IiLEGzZsO#k+g+r;ZZO%yWq+Js8ZA0^Z(4>)7N1 zpt&gg6-n3)Wo`m-P9|UPRnw?gN``4!7ZX^zzLLJhK2I3d?B{WrT4UWHXED!8U)v;M#iH2-VFt+z_taYI*bUAZX*YEOG# zB10A39!{;y;%p*l>1|_G#=OlN^`I;M*~9_Ko}}M=Qh>vit*;sE%_N)#UuHOuI~_9h z7O0*8{SWeWeFnWR`?|Je=;tLK`2$+voPnNkeO*7@yrjbD?93^8S)VJu?%djdgGC$_ zQ!ghRg7E5>_hob&}yQq7zQx-ovsVvCj-$oknc*h2`{t^}5AYkz=-`F)}joi;| zi@$I~EeKrfUu^(~9ANRg09UYTeqZP^-dvZ6aLuTSMWXt+exi(VUN(@`T{!j7F* zhya-GZQO5zP+-eOxnG%UAuz&R04nWW!+`b4?CCQ73N&};7YEI3!z2YP!@cZe<7QJL zIWCM~OAw}}o;KcovE$|V@RAKA5c5do#>6#WNSrh%B%abii-|h_hqJegis}v9zV{3R z3>{L^-5t^}fFLOdf4VzHNfD455EP^p>68*_5CkL!q@+b!It4^Zx}H7W_p{dfUi+H8uk$>Q<98$hKte>Y(P{m`P(`1BtD;2Hkiy$6_0hsvdfl(uGt5j81SIzn zE?csjwlW@Y)YgZKmdh?cDTfqt$~s9U?YIyGf9JK@tOEEOXm|K{>`t|+(#I;^pK2w- zqb?S4`WP7wnZ*29^h^5oIcN<@ z%Cx?`&ph{;-CwC z_B4>qUd+#54#~!i)!!9d{GkcT2N52&OLxAJ?sg!Y-8>s~22a9jznj*OzZ1i~wJ-I# z*_mxfY5J{?KuW{C96Z_{bQ)G7DPHP{Y3?k~e~uYDX)fu?E^MSN6j&?4EVA-`r-RNz zVi^;cB|*mt_089RPrX%XxvrSSgC{sO&sO$U2v4wW|&Uw`N-26Inw30wI^=7G*| zNeu;3f)h_7_fFN`xB(EZaz>(MlbW~i3ZPL>mV*laTm^Q*b0Xf2}_vT>igAEHx!O+qy_FKsE*L@YM4SXd!Bl!M8Aup zEJNv)^67d#Nih83CaO|lHsz9q?RlpvQutYYtjK|)G!`;PeAWH&CF)&U{n-euKQ6bA z=JO$Woung*M&gAqQw21w#c5@=E!dhef?E$~{X_Hb9ljKA)=&tAX9GyuhEssA@j^#9TC z;{Yv;|9<%Yt957)K}no2J3emxVyx*Om8m&uRDq!F!@_yAZqUl~)Hv9Zfm*NCirV&V@NqDvTB>z^D zFINA&pL=^0nnMoU4jne_gTcV=1H{9H%g0x{t{T0-VUWrrE7U)^gmO_kVu-?oX8Mz;_OqCF z6QWj23QPkR2OLFJqXpg~dFFGkXL4H)J4ix2Ya0H+%yOM~F3AbJc&$f1M|AIf`=sLxu z%zdj%uU`TiL&m8h&&Qup89|?bO>;siK?uAJw8mMVcT%@io1DUEu=^uDN_Q~iI$X`r z|E`kdQbV4A%Mw}*C+J$43ca36wZG}{xau)%$C?~7nzpMT%P~iQ-AD0wC~QfG$N%k>b^> zThH~9(2J5PH#o{cDL;JXRE~)94gNare|({jVH_m)yI(2%&EN81xXpjXXf~gED?v+H zq68!ki#%|o{;PT)ZSow<3k)p0r7i13{);-SCIY2!{!2@BAhv}?nI4M1M12q=Zm=Rd z2AlOgcd?=Sn7qdUbcwoi6@R1v6s>=TiPC#9^5##xo9Z3)5*frn~K_x8~p5GI3mCH+N6bbzg+Uuut)jB{UP_!SW)FQ`P#|Ed6Eg%VjSfS(^(*=IYB!~0n3`275 zekWab^?(3;H*f@jlKEoh%Ii=V^{+=Ei!Kp>XVHj*9dnn&&d)=`e{R=rx#_`G-8w?a zJ?qwVhfnAeeoCxe8GsG{4(V~%CJ!)TljPz{$~AZfQJdcQLKb@YIW$lj4>h64f3H_{td`WlQh=x6*Yd&-*|Wq2F&*V%K^?FwQ$j3gGp$Wwq3*( zR-;3lev~$tnVU>ea}7bxFkfmx4b_Xs8E35dwhE#1RxGP&k^7UM+kCeaL#h;qGq%Dm z<_P703;N~eN%-`4Ea9)A*HyR2{S}`Vnl+?oqy-s+#V=ay2+4Cxi008^!0+T?N$euI=SAxo>GfAWXxM~lz*@r0feT# zZ0Ql}CvJb`kv*OzO`5Sr`6&<_mp3cBa1hTCfnbiON`9{d($h5FXfk<-pD4)z$-kti zP7b0(tNToXuReg@Yvjw+>bt9t%Rhaq<4k%6L*5dBOp5nn;{zz|U68>9XW8GLX*UiK z`)j5U==(4=1t{;pdVl41*sYQHs)zjJWGFTZ-!L83R+#=@m}PLI;<16E@2|Rmar`>H zo0-qIo)g}!8Sf3PyK8tMCRk;I9(0n7y&OPo(CxY6?dFf-k+d)EC)e=8cgHFLRT8jg zI1VaGOxM{{rn`@y?0*dGh8TcGDkiY#Zu15n*3d!@Jm1RwYNN8@5GJ+E|e-!yO>?ScYEC~#D4n~q*B&i>)!$X z_(-ySQ+FqwQta9ExfaYlO~+r!_gW6LF;5{9AN#5HQM>JVGoVl(6%)%#Zu%&5mk2OAWhdGrLnc$~J zkF?P#?s@k@wVVVv&GKmo?y1|d0nx9>U%vycj;(Kxz1^p0;XY_XQ~Pz5s7|vxBScOI z7DEbPJhbD59dK#%(WqaHvx*sRq?L1yW?#=cY1>RW#9E& zRQY1Tw@tKebVoD7gz>qSflcevq9)_Z*pZ&~PA@#vnjtK21J8eiv^+XcEbUc7)`++H zN(h%$_r_|?p{YMH9;${IwNK6PpUO8dvFVTA1s&wz0yCm|d0$~bYyWkN^>Zj`>~Giq z&Q>?;%Uuc~kfk@d!6QTl%PiiM*f&~eP>0iHs$SG1iKl#y&-igT%>OaZt#~)nQ)L5f zr#MyDcI4uoIeDGeJ*6lHNAzU{3|(JA2*cfVT~ z^V^~Nor#-gSqdJuT2T4_X_=SQd>{iB#%4~jWt~WHBr0P{X!YwJ~5q#9vFaWP^U8=M1{X;Xr^nv-CJ(5yg9Kul$EvX8|tR-Tqg5 zV4*wb3H5B12Pi&C=~*t2vBNay2p~31B{`Q-cOgJDbGjXfOvF?n&UYoVzy=JkL9LZ0 zOr#s$YsQkTef#!%mBXIGQMutU2w&^!e%a-ry?cke`sH65Xqs&tfGRh>TbSMC67$ik%3;vk#oNnJp&d`Xh)F-=Y=duJ z$gk$d23wvSy`eXo;8_I|vZQireD}WqcgNNWERT1(x2DJt^C_x;^YzrKtBb1JizKs; zZ)K<_^qqA~55VKik@3xp;-&L|N9gWU$P>^Ji!-6UGt2!YzG{2hXy&k|`(MrHm5<18 z1p(O2hnS;*)g*5IFU6aK1fkpthR$tc_aFj_UGv3@Nj?l*qVj47Jljw^B8L)9FK58I zgAc?qh6d~}V%W3BA%7o){^fm-@M_-+-phOwrFivK(c)(3s{GX(iAUnE=gLIaCkea+ z)QMLPV!&GF#}N}A>R2a>i(DKzDL7M-eBlT^{EW?h#Qn1h_u26d*}wfA8U9XA;C%O; z<3sL49A*IHpkKIT=}W>Rh-&>irUg3VPYiy74{K{7d=SMKlN!8)#nk8)3RWnJ4gS>6 zI+R^#O?QHJGbXt{W~jIO}*{ zeTwkU#AJr>WLVSDuq^e6c4T05(8Vp)&2{_jsWEs0@}m!$O#RDd%QNcHn{wpF(v|}DBw2bbBiMjpm@lpSj(Ml`qLTmDFzmyd3K-MrQt)Sp>2Tn zB--8^l!sZYe>;es_ZgTQk&~C6R0k5ZM*7}+!oeX3*R8|B{#vL}*}CDZG8`?a?3^BW zt%t;jmjo$HT3lBSQV2r9kijMpXrh#IK;5<<+5PcjJ9bK&9E8dg1(--A`#NENpEYqz zJ_ZRc`;X4p?t*tU5M=pw5(v@D+}?$FT47G$RabK(*K@VmuU0YDJg>WM%_Gsu8DD+Q zWc>BciM`OeXKeG6lK6)z+}g`IWac0RR?d24F1Tp0bu;cDw)OMwq`8M>!+92t(bowQ zFwikT{QgkcrbD|#RoAnhavqx!$WE0?=iN(C*I{jTQlz`}!wl1@@M2La)i?|U<3TI0 z&U0_im4U`#Qw4s%*UvwtaO*p$&52~S+pGq1UQHAbH?p6cJSV;aVa*LjI8Y2ZHun+JUXz% zzrYlRVSM$xEA^yk!V?2ZqDZB0$QG>fo4uPqdsYhuv=rKH4}e2PjZ!$o^G|Zj>D-v& z&8lMCm6hoGlw0H>gCLtzw2wI>5S@$smi*^v*6$sP1GeuRdg81l_9G&E({Ze2Gksq+ zt{2oB5Iy(?q8k3Cs0tEtpD~?VlV2cY_(m;yDUD>ZHVc;hxudMT3|mvX3qkB z1lF`w-58iMUxLELFJ-%|ua_W5cReeTC=ttmGPsf*$CYKNDVYa0wG)(`dfB=1X`T?T zzo#wuGvBx0tf*IxS)F*G2G*EZC#KNT^kVg?#?s`ecD(4&k3D1#cF_&U&|ylf!i?8j zyl<~hnMi?=_*35NcYb-#pK8<9x6dZdGhKBswYYs*O%S66a}ugCqR~d-vt3YG)6F0x zo0~`}yO~ks5WG>#p}yLQy#Vo=|4x3jZQS1MF!i(K%(eW=#08GnhD|G0LG_B0do#-J z#g$P%GN}{iC_R5j3@`(D5O&-pOhxDWOYtA`c_61~PsWlCJAvX6tl_+B>xDY7f{wff zTTjouURmRGAy=ilKW^-nE|8vn6D$8IehNbNgYUn8Cc%hR#Rj2qhQxx0dQ!miXwhdx zen6s-gWmA7YjNFV7S%uTouC~2@i!9*HKCo{>T<>~vSeu_K4b~fh^eQCXqgdBYo>0P zY(74CskUlt@d0GM2n&XzG0!6VJo-}O|CktFx_ukP*B^C8Lh^P$M( zaeCnO{a<;!f>Z1C>&nbPDw)PgrY#=~)e?O6mC5Q)!R^lxGw-535c$%SK@Nd3vs3EA zNYI#cUIZXlLaGUl$DMCRRY)v-t?c2z`D*b0Trk5LRBsI8=#r6gCeJdcKTOe#Ul{;G zP?;a|1iBk{&M3e~bI+o4O(?d0S;_Z{Bce^;WdWZRu$TNxu>d%r%HlNmwgb9Wv>#CJ zL<3#A8uB}}?!|`yR&kh_kSxK1#eZP43-)NgZ`KT~Ovy+PPPoj@6IiJKCJ94WP~Wjo zfYBfv718w%d9Q{0#{)m1x?<@M3A`g67j>xnt~J;jpdjeq)78gCjg`>+#u6nWb%Wb1 zngSa^Y+|qB2m1d(5#RR-&;E$6h=UiDZAyo%IFTF`njqWHlD{(oiS`kM7j4=uw1<@K zxl&wu$pLT#Xq$=aDS}RMK^};BgfUaZR57db%))g{Z|Bz14>`OZvjY@J{Cd5GH+`%v zKZ1lN<=m&>!O@{_uDD-37eulE`B4$Tr;I2XD066-e&QmSRVc&Ftl`u`qYO#?PT*ri`R1N*4djNR<%0l6)^3w(i3kg zHd}X=wBudbHf52p6@Q}Q%FYr;?nS5(OU~hp?IkD*0uN&j2|t#FSVL`6dW^DhBQvc) zh@)i@YW{RHC(ym=^kNQI@vMX6Z-G#Tw@l@le=vaR z?%dBbbz9CDWU+>j8kzeYQJ#(yy=(;W_~Pow6*faKoKTb_b2~gC1DJa_D|fZcn7(EyM_5ZpYMW*no^dei-SQ|CA7I!kiz>J~cNkYJ&T4g|%uUVm7q z28ifz5=d=M?4L;>H6K5_hahaBz?K$l4B_k8Ul3_J(f`gTu<4}me6H_-YZ#J|PIBK2 zLjR|GfM)NBxSIMXowF{?DH!ZxanIHBpfakVZ@|o&9YsnWzKE3HLg2Avz`B;1q$6!m zW`+A5kVG^!_3zJ?8BO{QwWK6Hd2NjDEqnAWxGR=QZW<0I2iJD)c#?5k0r z{N1ixqpfqAN8fbD5K^~YrlqUqTftad9dnAY(50Tyb?5lbbhPXa3cVr)uolmmNz8|& zW77ws?$;)TttSP`xKHwzoMmFNE0$2e?>mw-EPrHTa(~AR=s&OZ+C`*mK40no>D^rv zyoM~d{l|0`8;;(uIx##J&H7KOqE3owi>Ui zVN~7z5v>AbwV!^Y$dyQ+Q}2JgJw^*bAS{IbiJ~b9Ak0!-Jn{IZ5nqhB&9L~uiEs37 zXQNr_);-e^|H&>(j_|NjQmP3lw}D$aXF710sI}spGh<|6Wo>Yak`cgff`xyfDXZe1Z%vA5iqhC2s#1m65$Y)d z<-3@yZC3v-L+3>mDl3{y6W7TPR!DU7o6&A4KD|LuYNP~mu1%vyzply2LGz>kc4-N* z!q2KB8Zk-d9Vy9SMsAA;y>iR;G>J%I{?hH4ow7dn$=^8Ll7nSL+@S|omN1l7ThB@M zz#Uz=n*WRk?j3zO7Gl2_;{zt)+EgT}dsFw2q5@Vb7aPjuCNXu|?-!XA_@sP>Pk41& z#*r3(`^mjyG(*PVWPiqj9^xDIp=AEmGUNz+`Cgz%&;Br77leND4?6)fpFeF_641f#$9ylJk~n>>G4nj%j%I?SeJ(ipk5a|%QkqvrHo?Ni#8{B zmxIhD8>*8_`D%8VBr^*qJbzNjs+`9h)+5Slfv5V~qMp5%t!0~{1b@-z)O#cc2hw*e z0clLzx8RYzR`s_bqKYgHzRQyM$b)ye4Tkbf5HG7WLZZMltt3)lESjAe(xDDy4V1g3 z9f+|39cFM8*Pmh8J&T5axk8kZWQYwpa^Z4pE$5p9rrU#jrZ^aiHOG*8rNKJJ`6U2A z*5s%7M3ef>%|Tp|qw+pC429NC*O^uY{OP)0B)p}VX>1#1Qszb4i}+D!wmQ7>1NA;_x0kIvQRH?!0dbTb{OYr18mOBDKwT{YsRLN~FGs$3eu}9< z)Vklm($;ZJ_v-4wObWOvl-$;4H$hp#FxEjO0Tu=rD}z%9kPt|TlOY7GUbQkPv{n1TiyuPkwgb#547t8RJf|I?!6`pZd9@DCSp8<50y zcZywdqg?qB9QFIT#={7LQ~4d`z=Lk;R5dShr((x*3ni3BJZ;R!@q0$nbV{amqmkV3 ze(eNhGx5$@z7A_V)Z@phHt;KO9CBTj*l#rSyXPEX^zbKjGOIq%jZh6SxTDgxUm>JbdoQ= zEMEUnRqqooF2u{^U4m04ti4y@^n5Nkw19q-j zzz7_`HmA;89{R`#T+fPJS;LtbOTn-;uJU(Wk(z-27ymmJC54tSHT|mVvtj2;uv%VB zs3XH%=vN(!gJjP9BsD2@ddZFB_062sKvD4V7ogExTu56h*48eXF}P%O=H z3gu&L-Z$#TmS9@;cm{A`!T}(o{nTH0P72a64Rf$mO7vNi_K3#+=#4X;Am*5NYg;S< zjKShy8iXIj+CaG~&ou!w1t0XG{sa}|Lx1{8Wo{DIq%=q`N`L{TX?Q*hugW*&!N6$E z5P72gm2fUT)xxgEQ;lb0*S@=cm(O2Zg<3fD-RlB0Qn>1HuDu#Kui?>QJ$ZL!PQKt2 zMIj#*pzGO{z*ngFQn6co;e-iik+!XO44CJJic#$Jivb*>RqJtAo_NYJ;!cvYf~LIA z-&-ZQRxnp=YR(-+|WG}X3`k6nb zK~>4%{;?>ummG~25FDl%gd?g!D^x=W+eZI7Z;r-{>3>lx-^hzW#=ed)mAA%0%63mV zcslpeo_cfm!Iih{fP1Yjt#YmNz^`tGbP77$G#s?_tP;qt?dIi?rKYra?C)3O0KE5$Mry#1WE@Q!7y~n=v9K>k-xuk+Dspdx@SCv3D)rt6J z`I55H-_mV);v2L5b|K$ zQww8FR?1P628nOABg*V>U_|}e60KbIV@$lB^tba|<&6750U{-!_<4NXvBJ;FXaQp_ zs}f%) z4hmBE26+C6QwSTtVI(%4E{=1>RLmWLM39fU5=CyG(QKkrR`?Fx?YGx^if6HaUSHol z{I!wYy3rd`=0L0A9$HA>(|Zv`VD~l^wHe99qQhE>3a5P_j~>1r!jSMW!L# zU-Bk^eXhmZsfE@yGrw#{tlN^;XZd*$l_)%k@#M5FPIi_P8iOZsRGOvu0<+96yRYCm zE;0AU_2p3YYNZvppFWt>kKcLSKn_#7nBQENTs)oKyN;FLu<+S)Rt&6i-n$I%F!QNw z+OQpz?hT&rt$8ezHyUakd^|C~`NPG6s;gyOTK@zsYm|8!Ig#vp2f`GZ%K`##TP69c zEIf}b^&#E@jpr>eRGBe{iIMGU@-^K^qF>lNf6_61EVAIT#>)a!2!4Y@;Kbd4|M$lp7f(R*X2HdZ~zln+9w)mOzkNZ*`m9NLhJ4P|I5?cIV8* zVladv>Ae6~ob=G;F(y!nUiG1~DnzSe!5yd!d;1_$RmvyV1A0b1Ifa@1A4 z65qmLA&JyvL{2Fv#YVx90lOuB35O1=N-2eS$Xd(MaIsaaCsssQcD)2^vh^x=iP}8b z(bwW|-naE2&O^?0(yki;wB&vx7kd~7LomTP!9rs(Xy^L_Ci!%eGOsMms_u8fua4dz zBidQjO;4b-G_`{x4XObAtR6rJ=Z#BKP&{R|=ml7M4WE1`5Zqoot!Vzs2C)faUb9@p z1PbUtQ4vyA$%}^6o!W223rK+}_dKL{Jkh5;nJ3L@cSm+vpiAcuD=4Aa*kO_ATEEV& zhx|aqxtS$Z3b59M17QWAZg@dMvL9L`kYT%JzN04#6&S$<%aT3S3mW<<(K~ZI?_Uag z-l65!q)7Kgz4ie_3+xR;u!GHz2o<#`?_o{8zr}QPq%%Uc#c3Acovz!46?oKR=vWQgwV; zCP7BuK8a20;=Et|B>aW`Ti|Pn>EPi$5o)tCxyjyvXpS=I75}PY{OUt_Xcotdp3s^_WSLVa`>=gKI3e zNiL;Mgn)VU^x|zb6P;)n_ejVc^Tf;5*5tz-hGD6sbVGSr3945+LxJWcISovE0!YhR zAj=>;;JSx(NpkXq2pxhS<(qyu8)$}yD9$EM@_K0RX}8)4KI`8sN3x98>}Z=0Xs0?V zNC~;8v@Wqh_TQ5YzS@Z2bf&kqn{97mAe1V2DarEVUp|H8lEW z*v4bA9%X=i_)0x)pZ@Ns7%IVY5tFT4gqc3coC{_TF+ViHgb@wM|DE@JenKqoEXfdP z5B#gA?js)-c=DphP)UYDz?v_qYL)zHe&HoxG?IAz?Ea*R zQ;q9R%^GPsS;b^Q7jlLN4V=bh%ntMRdpxy{7AAbQf9~2ggT+}Y!e3-7;r%0ApMH&T(PB9tEIYnlH>7DI@n8d}Xg6<{^u+*nn6 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 literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-max-width/ideographic-punctuation-breaking/expectedPixel4a.png b/metrics/integration/render-tests/text-max-width/ideographic-punctuation-breaking/expectedPixel4a.png new file mode 100644 index 0000000000000000000000000000000000000000..109b4028e67a652e2a5c3654582ad0f5659a9d37 GIT binary patch literal 24984 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

{MV$LpB&qrJrf2C8#N=QpFK6vwe9P zccfn6wS#539o>)*2Df38rwg>QFQyCG6~Rw#-7HG0X$Lc7@<5SjTp}!~%V;hyQ@@;A zoc7iy&j{AW6$Hkgp$;p;XVNXkp-fus?80==uUy)GuysbeL-|2(mqO(U{)N>PXS?gM z{U;>FmzCV~$$h@%k6mizR_+5|@Jwop`ne&|XhuQ5AU8y4sEg~Bq0cl+=6BvRlgEBh z#pNVjJgGQNv2*E3NBS%3q4m8$t41cOUDjtzJQUv<}g0!9MW>w^0$1&hK5V zwL$97`k-&PI$f)ZC&Zt&_zic~Dur^Vu)O8CzXkWHa!Zr2*)__^+^?lL`OkW3?yb^r zF3z~ubV(W>)1zAO4{34eC0s+0dFmfhT<#k<)25}9uHBR(SRU-Z<>3R$3Q2TXX&DvY z*7cp+Wnp9Wc69{xX8cIyo%R%89)%glx^KBO_lE7$XY=0-MTWYBisuX!RC|6ujr)U* z)t4=a6~~Z`27!eR0?B+GlaVvymwZ8+noeaT$MrhamBZ2Y3@zPj6OdkT^R)9VP}D-} z{mCKNi<_m76gu8k_2I%d`!?e@NfW>PuOlyARG$L#KW@^l`O5v43tS+WXO-5Q(UT7b z`*9P7_vEXcjN}1(!|4S)wmB9;qQFNZwj>f~kRUh7aDmwMMbu`MV%g1K{0-OH7Cutw zbjA6iDF#qyy+XtDqMtRZb1=Tmxagwf^Lzru=R)=uk^i0;B?D+yzF|_$93PP~Zevy# zFz;pwmFtBDT#IH_mm~kt-MFuuF9E<|3o4}0o&Y!XiQn6B_~uHjxV0D^F#9|@b8IK| zrfzQnBM_l!7v?Qc4SpfaOByh2pc#!aQjD=3imm4?wmsJz|Oj{c;|IzGcNr_Y<(FZ`@);PrSDy7L_(;G z*RQYB^|FjWU_y6!R6dM@u4Jn_f7wsk6P^WlzLKVhid!(Kee*Ps8dFa3n=SizmkU2&{>M@wTeM{5z*X>$koiSoa#B1ESdzV8qks@RC zgBk;4U+f#G6zc#4lxF31mv6b^bCiQKA84oeAJ_bUSoi-??cx6~p#Hy4%I$U^DW4P> Rf&aJwppC7JS`0jr{sZi;ZixT@ literal 0 HcmV?d00001 diff --git a/metrics/linux-drawable.json b/metrics/linux-drawable.json index 2eb85a802618..c6d9222b7ebe 100644 --- a/metrics/linux-drawable.json +++ b/metrics/linux-drawable.json @@ -2,6 +2,7 @@ "base_test_path": "integration", "cache_path": "cache-style.db", "expectation_paths": [ + "expectations/platform-linux" ], "ignore_paths": [ "ignores/platform-all.json", diff --git a/metrics/linux-vulkan.json b/metrics/linux-vulkan.json index fe72271f5214..402e843f9822 100644 --- a/metrics/linux-vulkan.json +++ b/metrics/linux-vulkan.json @@ -2,6 +2,7 @@ "base_test_path": "integration", "cache_path": "cache-style.db", "expectation_paths": [ + "expectations/platform-linux" ], "ignore_paths": [ "ignores/platform-all.json", diff --git a/metrics/windows-egl.json b/metrics/windows-egl.json index a759272caac1..98f1409ef49e 100644 --- a/metrics/windows-egl.json +++ b/metrics/windows-egl.json @@ -2,6 +2,7 @@ "base_test_path": "integration", "cache_path": "cache-style.db", "expectation_paths": [ + "expectations/platform-windows" ], "ignore_paths": [ "ignores/platform-all.json", diff --git a/metrics/windows-opengl.json b/metrics/windows-opengl.json index bf693f931e11..e4c2d6176705 100644 --- a/metrics/windows-opengl.json +++ b/metrics/windows-opengl.json @@ -2,6 +2,7 @@ "base_test_path": "integration", "cache_path": "cache-style.db", "expectation_paths": [ + "expectations/platform-windows" ], "ignore_paths": [ "ignores/platform-all.json", diff --git a/metrics/windows-vulkan.json b/metrics/windows-vulkan.json index bbcbe79edc24..789484204a6f 100644 --- a/metrics/windows-vulkan.json +++ b/metrics/windows-vulkan.json @@ -2,6 +2,7 @@ "base_test_path": "integration", "cache_path": "cache-style.db", "expectation_paths": [ + "expectations/platform-windows" ], "ignore_paths": [ "ignores/platform-all.json", diff --git a/render-test/render_test.cpp b/render-test/render_test.cpp index ba5fadb068d2..ea6c416857d1 100644 --- a/render-test/render_test.cpp +++ b/render-test/render_test.cpp @@ -202,6 +202,7 @@ int runRenderTests(int argc, char** argv, std::function testStatus) { ignoreReason = it->second; if (ignoreReason.rfind("skip", 0) == 0) { printf(ANSI_COLOR_GRAY "* skipped %s (%s)" ANSI_COLOR_RESET "\n", id.c_str(), ignoreReason.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* skipped " + id + "(" + ignoreReason + ")"); continue; } } @@ -222,12 +223,14 @@ int runRenderTests(int argc, char** argv, std::function testStatus) { color = "#E8A408"; stats.ignorePassedTests++; printf(ANSI_COLOR_YELLOW "* ignore %s (%s)" ANSI_COLOR_RESET "\n", id.c_str(), ignoreReason.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* ignore " + id + " (" + ignoreReason + ")"); } else { status = "ignored failed"; color = "#9E9E9E"; stats.ignoreFailedTests++; printf( ANSI_COLOR_LIGHT_GRAY "* ignore %s (%s)" ANSI_COLOR_RESET "\n", id.c_str(), ignoreReason.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* ignore " + id + " (" + ignoreReason + ")"); } } else { // Only fail the bots on render errors, this is a CI limitation that @@ -244,6 +247,7 @@ int runRenderTests(int argc, char** argv, std::function testStatus) { color = "green"; stats.passedTests++; printf(ANSI_COLOR_GREEN "* passed %s" ANSI_COLOR_RESET "\n", id.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* passed " + id); } else if (errored) { status = "errored"; color = "red"; @@ -251,12 +255,15 @@ int runRenderTests(int argc, char** argv, std::function testStatus) { returnCode = 2; printf(ANSI_COLOR_RED "* errored %s" ANSI_COLOR_RESET "\n", id.c_str()); printf(ANSI_COLOR_RED "* error: %s" ANSI_COLOR_RESET "\n", metadata.errorMessage.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* errored " + id); + mbgl::Log::Info(mbgl::Event::General, "* error " + metadata.errorMessage); } else { status = "failed"; color = "red"; stats.failedTests++; returnCode = 3; printf(ANSI_COLOR_RED "* failed %s" ANSI_COLOR_RESET "\n", id.c_str()); + mbgl::Log::Info(mbgl::Event::General, "* failed " + id); } } @@ -278,26 +285,32 @@ int runRenderTests(int argc, char** argv, std::function testStatus) { printf(ANSI_COLOR_GREEN "%u passed (%.1lf%%)" ANSI_COLOR_RESET "\n", stats.passedTests, 100.0 * stats.passedTests / count); + mbgl::Log::Info(mbgl::Event::General, std::to_string(stats.passedTests) + " passed tests"); } if (stats.ignorePassedTests) { printf(ANSI_COLOR_YELLOW "%u passed but were ignored (%.1lf%%)" ANSI_COLOR_RESET "\n", stats.ignorePassedTests, 100.0 * stats.ignorePassedTests / count); + mbgl::Log::Info(mbgl::Event::General, + std::to_string(stats.ignorePassedTests) + " passed tests but were ignored"); } if (stats.ignoreFailedTests) { printf(ANSI_COLOR_LIGHT_GRAY "%u ignored (%.1lf%%)" ANSI_COLOR_RESET "\n", stats.ignoreFailedTests, 100.0 * stats.ignoreFailedTests / count); + mbgl::Log::Info(mbgl::Event::General, std::to_string(stats.ignoreFailedTests) + " ignored tests"); } if (stats.failedTests) { printf(ANSI_COLOR_RED "%u failed (%.1lf%%)" ANSI_COLOR_RESET "\n", stats.failedTests, 100.0 * stats.failedTests / count); + mbgl::Log::Info(mbgl::Event::General, std::to_string(stats.failedTests) + " failed tests"); } if (stats.erroredTests) { printf(ANSI_COLOR_RED "%u errored (%.1lf%%)" ANSI_COLOR_RESET "\n", stats.erroredTests, 100.0 * stats.erroredTests / count); + mbgl::Log::Info(mbgl::Event::General, std::to_string(stats.erroredTests) + " errored tests"); } printf("Results at: %s\n", mbgl::filesystem::canonical(resultPath).generic_string().c_str()); diff --git a/src/mbgl/gfx/drawable_atlases_tweaker.cpp b/src/mbgl/gfx/drawable_atlases_tweaker.cpp index 96c9b7385595..adf0c0fa3be6 100644 --- a/src/mbgl/gfx/drawable_atlases_tweaker.cpp +++ b/src/mbgl/gfx/drawable_atlases_tweaker.cpp @@ -10,11 +10,13 @@ namespace gfx { void DrawableAtlasesTweaker::setupTextures(gfx::Drawable& drawable, const bool linearFilterForIcons) { if (const auto& shader = drawable.getShader()) { - if (glyphTextureId) { - if (atlases) { + if (glyphTextureId && atlases) { + if (atlases->glyph) { atlases->glyph->setSamplerConfiguration({.filter = TextureFilterType::Linear, .wrapU = TextureWrapType::Clamp, .wrapV = TextureWrapType::Clamp}); + } + if (atlases->icon) { atlases->icon->setSamplerConfiguration( {.filter = linearFilterForIcons ? TextureFilterType::Linear : TextureFilterType::Nearest, .wrapU = TextureWrapType::Clamp, diff --git a/src/mbgl/gfx/dynamic_texture.cpp b/src/mbgl/gfx/dynamic_texture.cpp new file mode 100644 index 000000000000..f3bf5fa1ec69 --- /dev/null +++ b/src/mbgl/gfx/dynamic_texture.cpp @@ -0,0 +1,104 @@ +#include +#include +#include + +namespace mbgl { +namespace gfx { + +DynamicTexture::DynamicTexture(Context& context, Size size, TexturePixelType pixelType) { + mapbox::ShelfPack::ShelfPackOptions options; + options.autoResize = false; + shelfPack = mapbox::ShelfPack(size.width, size.height, options); + + texture = context.createTexture2D(); + texture->setSize(size); + texture->setFormat(pixelType, TextureChannelDataType::UnsignedByte); + texture->setSamplerConfiguration( + {gfx::TextureFilterType::Linear, gfx::TextureWrapType::Clamp, gfx::TextureWrapType::Clamp}); +#if MLN_DEFER_UPLOAD_ON_RENDER_THREAD + deferredCreation = true; +#else + texture->create(); +#endif +} + +const Texture2DPtr& DynamicTexture::getTexture() const { + assert(texture); + return texture; +} + +TexturePixelType DynamicTexture::getPixelFormat() const { + assert(texture); + return texture->getFormat(); +} + +bool DynamicTexture::isEmpty() const { + return (numTextures == 0); +} + +std::optional DynamicTexture::reserveSize(const Size& size, int32_t uniqueId) { + std::lock_guard lock(mutex); + mapbox::Bin* bin = shelfPack.packOne(uniqueId, size.width, size.height); + if (!bin) { + return std::nullopt; + } + if (bin->refcount() == 1) { + numTextures++; + } + return TextureHandle(*bin); +} + +void DynamicTexture::uploadImage(const uint8_t* pixelData, TextureHandle& texHandle) { + std::lock_guard lock(mutex); + const auto& rect = texHandle.getRectangle(); + const auto imageSize = Size(rect.w, rect.h); + +#if MLN_DEFER_UPLOAD_ON_RENDER_THREAD + auto size = imageSize.area() * texture->getPixelStride(); + auto imageData = std::make_unique(size); + std::copy(pixelData, pixelData + size, imageData.get()); + imagesToUpload.emplace(texHandle, std::move(imageData)); +#else + texture->uploadSubRegion(pixelData, imageSize, rect.x, rect.y); +#endif + texHandle.needsUpload = false; +} + +std::optional DynamicTexture::addImage(const uint8_t* pixelData, + const Size& imageSize, + int32_t uniqueId) { + auto texHandle = reserveSize(imageSize, uniqueId); + if (texHandle && texHandle->isUploadNeeded()) { + uploadImage(pixelData, *texHandle); + } + return texHandle; +} + +void DynamicTexture::uploadDeferredImages() { + std::lock_guard lock(mutex); + if (deferredCreation) { + texture->create(); + deferredCreation = false; + } + for (const auto& pair : imagesToUpload) { + const auto& rect = pair.first.getRectangle(); + texture->uploadSubRegion(pair.second.get(), Size(rect.w, rect.h), rect.x, rect.y); + } + imagesToUpload.clear(); +} + +void DynamicTexture::removeTexture(const TextureHandle& texHandle) { + std::lock_guard lock(mutex); + auto* bin = shelfPack.getBin(texHandle.getId()); + if (!bin) { + return; + } + auto refcount = shelfPack.unref(*bin); + if (refcount == 0) { + numTextures--; + imagesToUpload.erase(texHandle); + } +} + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/gfx/dynamic_texture_atlas.cpp b/src/mbgl/gfx/dynamic_texture_atlas.cpp new file mode 100644 index 000000000000..645d6ad97a73 --- /dev/null +++ b/src/mbgl/gfx/dynamic_texture_atlas.cpp @@ -0,0 +1,256 @@ +#include +#include + +#include + +namespace mbgl { +namespace gfx { + +constexpr const uint16_t extraPadding = 1; +constexpr const uint16_t padding = ImagePosition::padding + extraPadding; +constexpr const Size startSize = {512, 512}; + +Rect rectWithoutExtraPadding(const Rect& rect) { + return Rect( + rect.x + extraPadding, rect.y + extraPadding, rect.w - 2 * extraPadding, rect.h - 2 * extraPadding); +} + +GlyphAtlas DynamicTextureAtlas::uploadGlyphs(const GlyphMap& glyphs) { + using GlyphsToUpload = std::vector, FontStackHash>>; + std::lock_guard lock(mutex); + + GlyphAtlas glyphAtlas; + if (!glyphs.size()) { + glyphAtlas.dynamicTexture = dummyDynamicTexture[TexturePixelType::Alpha]; + if (!glyphAtlas.dynamicTexture) { + glyphAtlas.dynamicTexture = std::make_shared( + context, Size(1, 1), TexturePixelType::Alpha); + dummyDynamicTexture[TexturePixelType::Alpha] = glyphAtlas.dynamicTexture; + } + return glyphAtlas; + } + + size_t dynTexIndex = 0; + Size dynTexSize = startSize; + GlyphsToUpload glyphsToUpload; + + while (!glyphAtlas.dynamicTexture) { + if (dynTexIndex < dynamicTextures.size()) { + glyphAtlas.dynamicTexture = dynamicTextures[dynTexIndex++]; + } else { + glyphAtlas.dynamicTexture = std::make_shared( + context, dynTexSize, TexturePixelType::Alpha); + dynTexSize = Size(dynTexSize.width * 2, dynTexSize.height * 2); + dynTexIndex++; + } + + if (glyphAtlas.dynamicTexture->getPixelFormat() != TexturePixelType::Alpha) { + glyphAtlas.dynamicTexture = nullptr; + continue; + } + + bool hasSpace = true; + for (const auto& glyphMapEntry : glyphs) { + FontStackHash fontStack = glyphMapEntry.first; + + for (const auto& glyphEntry : glyphMapEntry.second) { + const auto& glyph = glyphEntry.second; + + if (glyph.has_value() && glyph.value()->bitmap.valid()) { + int32_t uniqueId = static_cast(sqrt(fontStack) / 2 + glyph.value()->id); + const auto size = Size(glyph.value()->bitmap.size.width + 2 * padding, + glyph.value()->bitmap.size.height + 2 * padding); + const auto& texHandle = glyphAtlas.dynamicTexture->reserveSize(size, uniqueId); + if (!texHandle) { + hasSpace = false; + break; + } + glyphsToUpload.emplace_back(std::make_tuple(*texHandle, glyph.value(), fontStack)); + } + } + if (!hasSpace) { + for (const auto& [texHandle, glyph, fontStack_] : glyphsToUpload) { + glyphAtlas.dynamicTexture->removeTexture(texHandle); + } + glyphsToUpload.clear(); + glyphAtlas.dynamicTexture = nullptr; + break; + } + } + } + if (dynTexIndex > dynamicTextures.size()) { + dynamicTextures.emplace_back(glyphAtlas.dynamicTexture); + } + + for (auto& [texHandle, glyph, fontStack] : glyphsToUpload) { + const auto& rect = texHandle.getRectangle(); + + if (texHandle.isUploadNeeded()) { + AlphaImage paddedImage(Size{rect.w, rect.h}); + paddedImage.fill(0); + AlphaImage::copy(glyph->bitmap, paddedImage, {0, 0}, {padding, padding}, glyph->bitmap.size); + + glyphAtlas.dynamicTexture->uploadImage(paddedImage.data.get(), texHandle); + } + glyphAtlas.textureHandles.emplace_back(texHandle); + glyphAtlas.glyphPositions[fontStack].emplace(glyph->id, + GlyphPosition{rectWithoutExtraPadding(rect), glyph->metrics}); + } + return glyphAtlas; +} + +ImageAtlas DynamicTextureAtlas::uploadIconsAndPatterns(const ImageMap& icons, + const ImageMap& patterns, + const ImageVersionMap& versionMap) { + using ImagesToUpload = std::vector>>; + std::lock_guard lock(mutex); + + ImageAtlas imageAtlas; + if (!icons.size() && !patterns.size()) { + imageAtlas.dynamicTexture = dummyDynamicTexture[TexturePixelType::RGBA]; + if (!imageAtlas.dynamicTexture) { + imageAtlas.dynamicTexture = std::make_shared( + context, Size(1, 1), TexturePixelType::RGBA); + dummyDynamicTexture[TexturePixelType::RGBA] = imageAtlas.dynamicTexture; + } + return imageAtlas; + } + + size_t dynTexIndex = 0; + Size dynTexSize = startSize; + ImagesToUpload iconsToUpload; + ImagesToUpload patternsToUpload; + + iconsToUpload.reserve(icons.size()); + patternsToUpload.reserve(patterns.size()); + while (!imageAtlas.dynamicTexture) { + if (dynTexIndex < dynamicTextures.size()) { + imageAtlas.dynamicTexture = dynamicTextures[dynTexIndex++]; + } else { + imageAtlas.dynamicTexture = std::make_shared( + context, dynTexSize, TexturePixelType::RGBA); + dynTexSize = Size(dynTexSize.width * 2, dynTexSize.height * 2); + dynTexIndex++; + } + + if (imageAtlas.dynamicTexture->getPixelFormat() != TexturePixelType::RGBA) { + imageAtlas.dynamicTexture = nullptr; + continue; + } + + bool hasSpace = true; + for (const auto& iconEntry : icons) { + const auto& icon = iconEntry.second; + + auto imageHash = util::hash(icon->id); + int32_t uniqueId = static_cast(sqrt(imageHash) / 2 + icon->image.size.area()); + const auto size = Size(icon->image.size.width + 2 * padding, icon->image.size.height + 2 * padding); + const auto& texHandle = imageAtlas.dynamicTexture->reserveSize(size, uniqueId); + if (!texHandle) { + hasSpace = false; + break; + } + iconsToUpload.emplace_back(std::make_pair(*texHandle, icon)); + } + if (hasSpace) { + for (const auto& patternEntry : patterns) { + const auto& pattern = patternEntry.second; + + auto patternHash = util::hash(pattern->id); + int32_t uniqueId = static_cast(sqrt(patternHash) / 2 + pattern->image.size.area()); + const auto size = Size(pattern->image.size.width + 2 * padding, + pattern->image.size.height + 2 * padding); + const auto& texHandle = imageAtlas.dynamicTexture->reserveSize(size, uniqueId); + if (!texHandle) { + hasSpace = false; + break; + } + patternsToUpload.emplace_back(std::make_pair(*texHandle, pattern)); + } + } + if (!hasSpace) { + for (const auto& [texHandle, icon] : iconsToUpload) { + imageAtlas.dynamicTexture->removeTexture(texHandle); + } + iconsToUpload.clear(); + for (const auto& [texHandle, pattern] : patternsToUpload) { + imageAtlas.dynamicTexture->removeTexture(texHandle); + } + patternsToUpload.clear(); + imageAtlas.dynamicTexture = nullptr; + continue; + } + } + if (dynTexIndex > dynamicTextures.size()) { + dynamicTextures.emplace_back(imageAtlas.dynamicTexture); + } + + imageAtlas.iconPositions.reserve(icons.size()); + for (auto& [texHandle, icon] : iconsToUpload) { + const auto& rect = texHandle.getRectangle(); + + if (texHandle.isUploadNeeded()) { + PremultipliedImage paddedImage(Size{rect.w, rect.h}); + paddedImage.fill(0); + PremultipliedImage::copy(icon->image, paddedImage, {0, 0}, {padding, padding}, icon->image.size); + + imageAtlas.dynamicTexture->uploadImage(paddedImage.data.get(), texHandle); + } + imageAtlas.textureHandles.emplace_back(texHandle); + const auto it = versionMap.find(icon->id); + const auto version = it != versionMap.end() ? it->second : 0; + imageAtlas.iconPositions.emplace(icon->id, ImagePosition{rectWithoutExtraPadding(rect), *icon, version}); + } + + imageAtlas.patternPositions.reserve(patterns.size()); + for (auto& [texHandle, pattern] : patternsToUpload) { + const auto& rect = texHandle.getRectangle(); + + if (texHandle.isUploadNeeded()) { + PremultipliedImage paddedImage(Size{rect.w, rect.h}); + paddedImage.fill(0); + PremultipliedImage::copy(pattern->image, paddedImage, {0, 0}, {padding, padding}, pattern->image.size); + + const uint32_t x = padding; + const uint32_t y = padding; + const uint32_t w = pattern->image.size.width; + const uint32_t h = pattern->image.size.height; + + // Add 1 pixel wrapped padding on each side of the image. + PremultipliedImage::copy(pattern->image, paddedImage, {0, h - 1}, {x, y - 1}, {w, 1}); // T + PremultipliedImage::copy(pattern->image, paddedImage, {0, 0}, {x, y + h}, {w, 1}); // B + PremultipliedImage::copy(pattern->image, paddedImage, {w - 1, 0}, {x - 1, y}, {1, h}); // L + PremultipliedImage::copy(pattern->image, paddedImage, {0, 0}, {x + w, y}, {1, h}); // R + + imageAtlas.dynamicTexture->uploadImage(paddedImage.data.get(), texHandle); + } + imageAtlas.textureHandles.emplace_back(texHandle); + const auto it = versionMap.find(pattern->id); + const auto version = it != versionMap.end() ? it->second : 0; + imageAtlas.patternPositions.emplace(pattern->id, + ImagePosition{rectWithoutExtraPadding(rect), *pattern, version}); + } + + return imageAtlas; +} + +void DynamicTextureAtlas::removeTextures(const std::vector& textureHandles, + const DynamicTexturePtr& dynamicTexture) { + std::lock_guard lock(mutex); + if (!dynamicTexture) { + return; + } + + for (const auto& texHandle : textureHandles) { + dynamicTexture->removeTexture(texHandle); + } + if (dynamicTexture->isEmpty()) { + auto iterator = std::find(dynamicTextures.begin(), dynamicTextures.end(), dynamicTexture); + if (iterator != dynamicTextures.end()) { + dynamicTextures.erase(iterator); + } + } +} + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/layout/layout.hpp b/src/mbgl/layout/layout.hpp index b826881b977b..d0914e69b933 100644 --- a/src/mbgl/layout/layout.hpp +++ b/src/mbgl/layout/layout.hpp @@ -1,7 +1,7 @@ #pragma once -#include -#include +#include +#include #include #include #include diff --git a/src/mbgl/layout/symbol_instance.hpp b/src/mbgl/layout/symbol_instance.hpp index 1520ebff986d..c03d23dc465b 100644 --- a/src/mbgl/layout/symbol_instance.hpp +++ b/src/mbgl/layout/symbol_instance.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 21a3d2d218e4..4b265a482ef4 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/programs/background_program.cpp b/src/mbgl/programs/background_program.cpp index cb1d71df7671..46fb13db3706 100644 --- a/src/mbgl/programs/background_program.cpp +++ b/src/mbgl/programs/background_program.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/src/mbgl/programs/fill_extrusion_program.cpp b/src/mbgl/programs/fill_extrusion_program.cpp index e2b2ee849ece..0fc4b85b603d 100644 --- a/src/mbgl/programs/fill_extrusion_program.cpp +++ b/src/mbgl/programs/fill_extrusion_program.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/src/mbgl/programs/fill_program.cpp b/src/mbgl/programs/fill_program.cpp index a6578e12a4d1..eb687acbe492 100644 --- a/src/mbgl/programs/fill_program.cpp +++ b/src/mbgl/programs/fill_program.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/src/mbgl/programs/line_program.cpp b/src/mbgl/programs/line_program.cpp index 17c7467864c0..a14c4528a178 100644 --- a/src/mbgl/programs/line_program.cpp +++ b/src/mbgl/programs/line_program.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index 7826231bb056..940ef209302f 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index c64c7aa6a8a4..adc616931801 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include diff --git a/src/mbgl/renderer/image_atlas.cpp b/src/mbgl/renderer/image_atlas.cpp deleted file mode 100644 index e4586ce90059..000000000000 --- a/src/mbgl/renderer/image_atlas.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include - -#include - -namespace mbgl { - -static constexpr uint32_t padding = 1; - -ImagePosition::ImagePosition(const mapbox::Bin& bin, const style::Image::Impl& image, uint32_t version_) - : pixelRatio(image.pixelRatio), - paddedRect(bin.x, bin.y, bin.w, bin.h), - version(version_), - stretchX(image.stretchX), - stretchY(image.stretchY), - content(image.content), - textFitWidth(image.textFitWidth), - textFitHeight(image.textFitHeight) {} - -namespace { - -const mapbox::Bin& _packImage(mapbox::ShelfPack& pack, - const style::Image::Impl& image, - ImageAtlas& resultImage, - ImageType imageType) { - const mapbox::Bin& bin = *pack.packOne( - -1, image.image.size.width + 2 * padding, image.image.size.height + 2 * padding); - - resultImage.image.resize({static_cast(pack.width()), static_cast(pack.height())}); - - PremultipliedImage::copy( - image.image, resultImage.image, {0, 0}, {bin.x + padding, bin.y + padding}, image.image.size); - - if (imageType == ImageType::Pattern) { - const uint32_t x = bin.x + padding; - const uint32_t y = bin.y + padding; - const uint32_t w = image.image.size.width; - const uint32_t h = image.image.size.height; - - // Add 1 pixel wrapped padding on each side of the image. - PremultipliedImage::copy(image.image, resultImage.image, {0, h - 1}, {x, y - 1}, {w, 1}); // T - PremultipliedImage::copy(image.image, resultImage.image, {0, 0}, {x, y + h}, {w, 1}); // B - PremultipliedImage::copy(image.image, resultImage.image, {w - 1, 0}, {x - 1, y}, {1, h}); // L - PremultipliedImage::copy(image.image, resultImage.image, {0, 0}, {x + w, y}, {1, h}); // R - } - return bin; -} - -void populateImagePatches(ImagePositions& imagePositions, - const ImageManager& imageManager, - std::vector& /*out*/ patches) { - if (imagePositions.empty()) { - imagePositions.reserve(imageManager.updatedImageVersions.size()); - } - for (auto& updatedImageVersion : imageManager.updatedImageVersions) { - const std::string& name = updatedImageVersion.first; - const uint32_t version = updatedImageVersion.second; - const auto it = imagePositions.find(updatedImageVersion.first); - if (it != imagePositions.end()) { - auto& position = it->second; - if (position.version == version) continue; - - const auto updatedImage = imageManager.getSharedImage(name); - if (updatedImage == nullptr) continue; - - patches.emplace_back(*updatedImage, position.paddedRect); - position.version = version; - } - } -} - -} // namespace - -std::vector ImageAtlas::getImagePatchesAndUpdateVersions(const ImageManager& imageManager) { - std::vector imagePatches; - populateImagePatches(iconPositions, imageManager, imagePatches); - populateImagePatches(patternPositions, imageManager, imagePatches); - return imagePatches; -} - -ImageAtlas makeImageAtlas(const ImageMap& icons, const ImageMap& patterns, const ImageVersionMap& versionMap) { - ImageAtlas result; - - mapbox::ShelfPack::ShelfPackOptions options; - options.autoResize = true; - mapbox::ShelfPack pack(0, 0, options); - - result.iconPositions.reserve(icons.size()); - - for (const auto& entry : icons) { - const style::Image::Impl& image = *entry.second; - const mapbox::Bin& bin = _packImage(pack, image, result, ImageType::Icon); - const auto it = versionMap.find(entry.first); - const auto version = it != versionMap.end() ? it->second : 0; - result.iconPositions.emplace(image.id, ImagePosition{bin, image, version}); - } - - result.patternPositions.reserve(patterns.size()); - - for (const auto& entry : patterns) { - const style::Image::Impl& image = *entry.second; - const mapbox::Bin& bin = _packImage(pack, image, result, ImageType::Pattern); - const auto it = versionMap.find(entry.first); - const auto version = it != versionMap.end() ? it->second : 0; - result.patternPositions.emplace(image.id, ImagePosition{bin, image, version}); - } - - pack.shrink(); - result.image.resize({static_cast(pack.width()), static_cast(pack.height())}); - - return result; -} - -} // namespace mbgl diff --git a/src/mbgl/renderer/image_atlas.hpp b/src/mbgl/renderer/image_atlas.hpp deleted file mode 100644 index 055c819088f0..000000000000 --- a/src/mbgl/renderer/image_atlas.hpp +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include -#include - -#include - -#include -#include - -namespace mbgl { - -namespace gfx { -class UploadPass; -class Texture; -} // namespace gfx - -class ImageManager; - -class ImagePosition { -public: - ImagePosition(const mapbox::Bin&, const style::Image::Impl&, uint32_t version = 0); - - static constexpr const uint16_t padding = 1u; - float pixelRatio; - Rect paddedRect; - uint32_t version; - style::ImageStretches stretchX; - style::ImageStretches stretchY; - std::optional content; - std::optional textFitWidth; - std::optional textFitHeight; - - std::array tl() const { - return {{static_cast(paddedRect.x + padding), static_cast(paddedRect.y + padding)}}; - } - - std::array br() const { - return {{static_cast(paddedRect.x + paddedRect.w - padding), - static_cast(paddedRect.y + paddedRect.h - padding)}}; - } - - std::array tlbr() const { - const auto _tl = tl(); - const auto _br = br(); - return {{_tl[0], _tl[1], _br[0], _br[1]}}; - } - - std::array displaySize() const { - return {{ - static_cast(paddedRect.w - padding * 2) / pixelRatio, - static_cast(paddedRect.h - padding * 2) / pixelRatio, - }}; - } -}; - -using ImagePositions = mbgl::unordered_map; - -class ImagePatch { -public: - ImagePatch(Immutable image_, const Rect& paddedRect_) - : image(std::move(image_)), - paddedRect(paddedRect_) {} - - Immutable image; - Rect paddedRect; -}; - -class ImageAtlas { -public: - PremultipliedImage image; - ImagePositions iconPositions; - ImagePositions patternPositions; - - std::vector getImagePatchesAndUpdateVersions(const ImageManager&); -}; - -ImageAtlas makeImageAtlas(const ImageMap&, const ImageMap&, const ImageVersionMap& versionMap); - -} // namespace mbgl diff --git a/src/mbgl/renderer/layers/line_layer_tweaker.cpp b/src/mbgl/renderer/layers/line_layer_tweaker.cpp index 8b1fa69c6b11..dd9e0a0fb774 100644 --- a/src/mbgl/renderer/layers/line_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/line_layer_tweaker.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 740961fd535f..9346e1323b31 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -498,11 +498,15 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, if (patternBuilder) { patternBuilder->clearTweakers(); - patternBuilder->addTweaker(getAtlasTweaker()); + if (const auto& tweaker = getAtlasTweaker()) { + patternBuilder->addTweaker(tweaker); + } } if (doOutline && outlinePatternBuilder) { outlinePatternBuilder->clearTweakers(); - outlinePatternBuilder->addTweaker(getAtlasTweaker()); + if (const auto& tweaker = getAtlasTweaker()) { + outlinePatternBuilder->addTweaker(tweaker); + } } if (patternBuilder && bucket.sharedTriangles->elements()) { diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 250694f7782d..c7bd608c9062 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index ab2bb50c5578..55b1f5ed1292 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/pattern_atlas.cpp b/src/mbgl/renderer/pattern_atlas.cpp index 5f10ff98a6b4..8693db7f7961 100644 --- a/src/mbgl/renderer/pattern_atlas.cpp +++ b/src/mbgl/renderer/pattern_atlas.cpp @@ -65,7 +65,9 @@ std::optional PatternAtlas::addPattern(const style::Image::Impl& dirty = true; - return patterns.emplace(image.id, Pattern{.bin = bin, .position = {*bin, image}}).first->second.position; + return patterns + .emplace(image.id, Pattern{.bin = bin, .position = {Rect(bin->x, bin->y, bin->w, bin->h), image}}) + .first->second.position; } void PatternAtlas::removePattern(const std::string& id) { diff --git a/src/mbgl/renderer/pattern_atlas.hpp b/src/mbgl/renderer/pattern_atlas.hpp index 311be87d1d21..240c07f326ea 100644 --- a/src/mbgl/renderer/pattern_atlas.hpp +++ b/src/mbgl/renderer/pattern_atlas.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 2e6190877336..339ad33c813b 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -153,7 +153,7 @@ void RenderOrchestrator::setObserver(RendererObserver* observer_) { } std::unique_ptr RenderOrchestrator::createRenderTree( - const std::shared_ptr& updateParameters) { + const std::shared_ptr& updateParameters, gfx::DynamicTextureAtlasPtr dynamicTextureAtlas) { MLN_TRACE_FUNC(); const auto startTime = util::MonotonicTimer::now().count(); @@ -194,7 +194,8 @@ std::unique_ptr RenderOrchestrator::createRenderTree( .imageManager = imageManager, .glyphManager = glyphManager, .prefetchZoomDelta = updateParameters->prefetchZoomDelta, - .threadPool = threadPool}; + .threadPool = threadPool, + .dynamicTextureAtlas = dynamicTextureAtlas}; glyphManager->setURL(updateParameters->glyphURL); diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 9e7738305f5d..05b67f3e63a4 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -41,6 +41,8 @@ namespace gfx { class ShaderRegistry; class Drawable; using DrawablePtr = std::shared_ptr; +class DynamicTextureAtlas; +using DynamicTextureAtlasPtr = std::shared_ptr; } // namespace gfx namespace style { @@ -64,7 +66,7 @@ class RenderOrchestrator final : public GlyphManagerObserver, public ImageManage // TODO: Introduce RenderOrchestratorObserver. void setObserver(RendererObserver*); - std::unique_ptr createRenderTree(const std::shared_ptr&); + std::unique_ptr createRenderTree(const std::shared_ptr&, gfx::DynamicTextureAtlasPtr); std::vector queryRenderedFeatures(const ScreenLineString&, const RenderedQueryOptions&) const; std::vector querySourceFeatures(const std::string& sourceID, const SourceQueryOptions&) const; diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index dc26fef755be..2797431be4e0 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -96,24 +96,6 @@ std::optional RenderTile::getPattern(const std::string& pattern) return renderData->getPattern(pattern); } -static const gfx::Texture2DPtr noTexture; - -bool RenderTile::hasGlyphAtlasTexture() const { - return renderData && renderData->getGlyphAtlasTexture(); -} - -const gfx::Texture2DPtr& RenderTile::getGlyphAtlasTexture() const { - return renderData ? renderData->getGlyphAtlasTexture() : noTexture; -} - -bool RenderTile::hasIconAtlasTexture() const { - return renderData && renderData->getIconAtlasTexture(); -} - -const gfx::Texture2DPtr& RenderTile::getIconAtlasTexture() const { - return renderData ? renderData->getIconAtlasTexture() : noTexture; -} - static const std::shared_ptr noAtlas; const std::shared_ptr& RenderTile::getAtlasTextures() const { return renderData ? renderData->getAtlasTextures() : noAtlas; diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index 53d88ea4f2d6..778eba3840d3 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -60,12 +60,6 @@ class RenderTile final { const LayerRenderData* getLayerRenderData(const style::Layer::Impl&) const; std::optional getPattern(const std::string& pattern) const; - bool hasGlyphAtlasTexture() const; - const gfx::Texture2DPtr& getGlyphAtlasTexture() const; - - bool hasIconAtlasTexture() const; - const gfx::Texture2DPtr& getIconAtlasTexture() const; - const std::shared_ptr& getAtlasTextures() const; bool getNeedsRendering() const { return needsRendering; }; diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index 611144d2aba6..ba3b0bc57add 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -32,7 +33,13 @@ void Renderer::setObserver(RendererObserver* observer) { void Renderer::render(const std::shared_ptr& updateParameters) { MLN_TRACE_FUNC(); assert(updateParameters); - if (auto renderTree = impl->orchestrator.createRenderTree(updateParameters)) { + const bool styleChanged = impl->styleLoaded && !updateParameters->styleLoaded; + impl->styleLoaded = updateParameters->styleLoaded; + if (!impl->dynamicTextureAtlas || styleChanged) { + auto& context = impl->backend.getContext(); + impl->dynamicTextureAtlas = std::make_unique(context); + } + if (auto renderTree = impl->orchestrator.createRenderTree(updateParameters, impl->dynamicTextureAtlas)) { renderTree->prepare(); impl->render(*renderTree, updateParameters); } diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index c34de65c3af9..b1137d267d92 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -20,6 +20,8 @@ class RenderTree; namespace gfx { class RendererBackend; class ShadeRegistry; +class DynamicTextureAtlas; +using DynamicTextureAtlasPtr = std::shared_ptr; } // namespace gfx class Renderer::Impl : public gfx::ContextObserver { @@ -50,6 +52,8 @@ class Renderer::Impl : public gfx::ContextObserver { const float pixelRatio; std::unique_ptr staticData; + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + bool styleLoaded = false; enum class RenderState { Never, diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp index 75c1c152f4ff..0596fcce85a1 100644 --- a/src/mbgl/renderer/tile_parameters.hpp +++ b/src/mbgl/renderer/tile_parameters.hpp @@ -15,6 +15,11 @@ class AnnotationManager; class ImageManager; class GlyphManager; +namespace gfx { +class DynamicTextureAtlas; +using DynamicTextureAtlasPtr = std::shared_ptr; +} // namespace gfx + class TileParameters { public: const float pixelRatio; @@ -27,6 +32,7 @@ class TileParameters { std::shared_ptr glyphManager; const uint8_t prefetchZoomDelta; TaggedScheduler threadPool; + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; }; } // namespace mbgl diff --git a/src/mbgl/renderer/tile_render_data.cpp b/src/mbgl/renderer/tile_render_data.cpp index 0f28afd66e90..49ba69736c6c 100644 --- a/src/mbgl/renderer/tile_render_data.cpp +++ b/src/mbgl/renderer/tile_render_data.cpp @@ -9,16 +9,6 @@ TileRenderData::TileRenderData(std::shared_ptr atlasTextures_ TileRenderData::~TileRenderData() = default; -static gfx::Texture2DPtr noTexture; - -const gfx::Texture2DPtr& TileRenderData::getGlyphAtlasTexture() const { - return atlasTextures ? atlasTextures->glyph : noTexture; -} - -const gfx::Texture2DPtr& TileRenderData::getIconAtlasTexture() const { - return atlasTextures ? atlasTextures->icon : noTexture; -} - std::optional TileRenderData::getPattern(const std::string&) const { assert(false); return std::nullopt; diff --git a/src/mbgl/renderer/tile_render_data.hpp b/src/mbgl/renderer/tile_render_data.hpp index 0f19d7823d51..cd5cae4ecb0a 100644 --- a/src/mbgl/renderer/tile_render_data.hpp +++ b/src/mbgl/renderer/tile_render_data.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include @@ -30,9 +30,6 @@ class TileRenderData { public: virtual ~TileRenderData(); - const gfx::Texture2DPtr& getGlyphAtlasTexture() const; - const gfx::Texture2DPtr& getIconAtlasTexture() const; - const std::shared_ptr& getAtlasTextures() const { return atlasTextures; } // To be implemented for concrete tile types. virtual std::optional getPattern(const std::string&) const; diff --git a/src/mbgl/style/image_impl.hpp b/src/mbgl/style/image_impl.hpp index 2865972c9527..a1fa558f4e40 100644 --- a/src/mbgl/style/image_impl.hpp +++ b/src/mbgl/style/image_impl.hpp @@ -2,9 +2,11 @@ #include #include +#include #include #include +#include namespace mbgl { namespace style { @@ -61,4 +63,52 @@ inline bool operator<(const Immutable& a, const Immuta return a->id < b->id; } +class ImagePosition { +public: + ImagePosition(const Rect& rect, const style::Image::Impl& image, uint32_t version_ = 0) + : paddedRect(rect), + pixelRatio(image.pixelRatio), + stretchX(image.stretchX), + stretchY(image.stretchY), + content(image.content), + textFitWidth(image.textFitWidth), + textFitHeight(image.textFitHeight), + version(version_) {} + + static constexpr const uint16_t padding = 1u; + + Rect paddedRect; + float pixelRatio; + style::ImageStretches stretchX; + style::ImageStretches stretchY; + std::optional content; + std::optional textFitWidth; + std::optional textFitHeight; + uint32_t version; + + std::array tl() const { + return {{static_cast(paddedRect.x + padding), static_cast(paddedRect.y + padding)}}; + } + + std::array br() const { + return {{static_cast(paddedRect.x + paddedRect.w - padding), + static_cast(paddedRect.y + paddedRect.h - padding)}}; + } + + std::array tlbr() const { + const auto _tl = tl(); + const auto _br = br(); + return {{_tl[0], _tl[1], _br[0], _br[1]}}; + } + + std::array displaySize() const { + return {{ + static_cast(paddedRect.w - padding * 2) / pixelRatio, + static_cast(paddedRect.h - padding * 2) / pixelRatio, + }}; + } +}; + +using ImagePositions = mbgl::unordered_map; + } // namespace mbgl diff --git a/src/mbgl/text/glyph_atlas.cpp b/src/mbgl/text/glyph_atlas.cpp deleted file mode 100644 index d2a048d659e5..000000000000 --- a/src/mbgl/text/glyph_atlas.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include - -namespace mbgl { - -static constexpr uint32_t padding = 1; - -GlyphAtlas makeGlyphAtlas(const GlyphMap& glyphs) { - GlyphAtlas result; - - mapbox::ShelfPack::ShelfPackOptions options; - options.autoResize = true; - mapbox::ShelfPack pack(0, 0, options); - - for (const auto& glyphMapEntry : glyphs) { - FontStackHash fontStack = glyphMapEntry.first; - GlyphPositionMap& positions = result.positions[fontStack]; - - for (const auto& entry : glyphMapEntry.second) { - if (entry.second && (*entry.second)->bitmap.valid()) { - const Glyph& glyph = **entry.second; - - const mapbox::Bin& bin = *pack.packOne( - -1, glyph.bitmap.size.width + 2 * padding, glyph.bitmap.size.height + 2 * padding); - - result.image.resize({static_cast(pack.width()), static_cast(pack.height())}); - - AlphaImage::copy( - glyph.bitmap, result.image, {0, 0}, {bin.x + padding, bin.y + padding}, glyph.bitmap.size); - - positions.emplace(glyph.id, - GlyphPosition{Rect{static_cast(bin.x), - static_cast(bin.y), - static_cast(bin.w), - static_cast(bin.h)}, - glyph.metrics}); - } - } - } - - pack.shrink(); - result.image.resize({static_cast(pack.width()), static_cast(pack.height())}); - - return result; -} - -} // namespace mbgl diff --git a/src/mbgl/text/glyph_atlas.hpp b/src/mbgl/text/glyph_atlas.hpp deleted file mode 100644 index 9dd063ef698f..000000000000 --- a/src/mbgl/text/glyph_atlas.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include - -#include - -namespace mbgl { - -struct GlyphPosition { - Rect rect; - GlyphMetrics metrics; -}; - -using GlyphPositionMap = std::map; -using GlyphPositions = std::map; - -class GlyphAtlas { -public: - AlphaImage image; - GlyphPositions positions; -}; - -GlyphAtlas makeGlyphAtlas(const GlyphMap&); - -} // namespace mbgl diff --git a/src/mbgl/text/quads.hpp b/src/mbgl/text/quads.hpp index 74c5d346cd96..4f90d54c467b 100644 --- a/src/mbgl/text/quads.hpp +++ b/src/mbgl/text/quads.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/text/shaping.hpp b/src/mbgl/text/shaping.hpp index 83a33c8943d1..4fae4dc2a7ba 100644 --- a/src/mbgl/text/shaping.hpp +++ b/src/mbgl/text/shaping.hpp @@ -1,10 +1,9 @@ #pragma once -#include +#include #include #include #include -#include #include #include diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index e898ae169c9d..535b958ab5bf 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -15,15 +14,14 @@ #include #include #include -#include #include #include #include #include #include #include - #include + #include namespace mbgl { @@ -44,6 +42,38 @@ LayerRenderData* GeometryTile::LayoutResult::getLayerRenderData(const style::Lay return &result; } +class ImagePatch { +public: + ImagePatch(Immutable image_, const Rect& paddedRect_) + : image(std::move(image_)), + paddedRect(paddedRect_) {} + Immutable image; + Rect paddedRect; +}; + +void populateImagePatches(ImagePositions& imagePositions, + const ImageManager& imageManager, + std::vector& /*out*/ patches) { + if (imagePositions.empty()) { + imagePositions.reserve(imageManager.updatedImageVersions.size()); + } + for (auto& updatedImageVersion : imageManager.updatedImageVersions) { + const std::string& name = updatedImageVersion.first; + const uint32_t version = updatedImageVersion.second; + const auto it = imagePositions.find(updatedImageVersion.first); + if (it != imagePositions.end()) { + auto& position = it->second; + if (position.version == version) continue; + + const auto updatedImage = imageManager.getSharedImage(name); + if (updatedImage == nullptr) continue; + + patches.emplace_back(*updatedImage, position.paddedRect); + position.version = version; + } + } +} + class GeometryTileRenderData final : public TileRenderData { public: GeometryTileRenderData(std::shared_ptr layoutResult_, @@ -69,9 +99,9 @@ std::optional GeometryTileRenderData::getPattern(const std::strin MLN_TRACE_FUNC(); if (layoutResult) { - const auto& iconAtlas = layoutResult->iconAtlas; - auto it = iconAtlas.patternPositions.find(pattern); - if (it != iconAtlas.patternPositions.end()) { + const auto& patternPositions = layoutResult->imageAtlas.patternPositions; + auto it = patternPositions.find(pattern); + if (it != patternPositions.end()) { return it->second; } } @@ -95,22 +125,16 @@ void GeometryTileRenderData::upload(gfx::UploadPass& uploadPass) { assert(atlasTextures); - if (layoutResult->glyphAtlasImage && layoutResult->glyphAtlasImage->valid()) { - atlasTextures->glyph = uploadPass.getContext().createTexture2D(); - atlasTextures->glyph->setSamplerConfiguration({.filter = gfx::TextureFilterType::Linear, - .wrapU = gfx::TextureWrapType::Clamp, - .wrapV = gfx::TextureWrapType::Clamp}); - atlasTextures->glyph->upload(*layoutResult->glyphAtlasImage); - layoutResult->glyphAtlasImage = {}; + if (const auto& glyphDynamicTexture = layoutResult->glyphAtlas.dynamicTexture) { + glyphDynamicTexture->uploadDeferredImages(); + atlasTextures->glyph = glyphDynamicTexture->getTexture(); } - - if (layoutResult->iconAtlas.image.valid()) { - atlasTextures->icon = uploadPass.getContext().createTexture2D(); - atlasTextures->icon->upload(layoutResult->iconAtlas.image); - layoutResult->iconAtlas.image = {}; + if (const auto& imageDynamicTexture = layoutResult->imageAtlas.dynamicTexture) { + imageDynamicTexture->uploadDeferredImages(); + atlasTextures->icon = imageDynamicTexture->getTexture(); } - if (atlasTextures->icon && !imagePatches.empty()) { + if (!imagePatches.empty()) { for (const auto& imagePatch : imagePatches) { // patch updated images. atlasTextures->icon->uploadSubRegion(imagePatch.image->image, imagePatch.paddedRect.x + ImagePosition::padding, @@ -124,7 +148,9 @@ void GeometryTileRenderData::prepare(const SourcePrepareParameters& parameters) MLN_TRACE_FUNC(); if (!layoutResult) return; - imagePatches = layoutResult->iconAtlas.getImagePatchesAndUpdateVersions(parameters.imageManager); + imagePatches.clear(); + populateImagePatches(layoutResult->imageAtlas.iconPositions, parameters.imageManager, imagePatches); + populateImagePatches(layoutResult->imageAtlas.patternPositions, parameters.imageManager, imagePatches); } Bucket* GeometryTileRenderData::getBucket(const Layer::Impl& layer) const { @@ -136,6 +162,13 @@ const LayerRenderData* GeometryTileRenderData::getLayerRenderData(const style::L return layoutResult ? layoutResult->getLayerRenderData(layerImpl) : nullptr; } +GeometryTile::LayoutResult::~LayoutResult() { + if (dynamicTextureAtlas) { + dynamicTextureAtlas->removeTextures(glyphAtlas.textureHandles, glyphAtlas.dynamicTexture); + dynamicTextureAtlas->removeTextures(imageAtlas.textureHandles, imageAtlas.dynamicTexture); + } +} + /* Correlation between GeometryTile and GeometryTileWorker is safeguarded by two correlation schemes: @@ -168,7 +201,8 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_, obsolete, parameters.mode, parameters.pixelRatio, - parameters.debugOptions & MapDebugOptions::Collision), + parameters.debugOptions & MapDebugOptions::Collision, + parameters.dynamicTextureAtlas), fileSource(parameters.fileSource), glyphManager(parameters.glyphManager), imageManager(parameters.imageManager), @@ -530,7 +564,7 @@ void GeometryTile::setFeatureState(const LayerFeatureStates& states) { auto bucket = layer.second.bucket; if (bucket && bucket->hasData()) { - bucket->update(featureStates, *sourceLayer, layerID, layoutResult->iconAtlas.patternPositions); + bucket->update(featureStates, *sourceLayer, layerID, layoutResult->imageAtlas.patternPositions); } } } diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index 549854d46ede..138ecc27b1a6 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -22,8 +23,6 @@ class GeometryTileData; class RenderLayer; class SourceQueryOptions; class TileParameters; -class GlyphAtlas; -class ImageAtlas; class TileAtlasTextures; class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor { @@ -73,19 +72,24 @@ class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor { public: mbgl::unordered_map layerRenderData; std::shared_ptr featureIndex; - std::optional glyphAtlasImage; - ImageAtlas iconAtlas; + gfx::GlyphAtlas glyphAtlas; + gfx::ImageAtlas imageAtlas; + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; LayerRenderData* getLayerRenderData(const style::Layer::Impl&); LayoutResult(mbgl::unordered_map renderData_, std::unique_ptr featureIndex_, - std::optional glyphAtlasImage_, - ImageAtlas iconAtlas_) + gfx::GlyphAtlas glyphAtlas_, + gfx::ImageAtlas imageAtlas_, + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas_) : layerRenderData(std::move(renderData_)), featureIndex(std::move(featureIndex_)), - glyphAtlasImage(std::move(glyphAtlasImage_)), - iconAtlas(std::move(iconAtlas_)) {} + glyphAtlas(std::move(glyphAtlas_)), + imageAtlas(std::move(imageAtlas_)), + dynamicTextureAtlas(dynamicTextureAtlas_) {} + + ~LayoutResult(); }; void onLayout(std::shared_ptr, uint64_t correlationID); diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 24a81c4ca708..4935bc5f3382 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -37,7 +37,8 @@ GeometryTileWorker::GeometryTileWorker(ActorRef self_, const std::atomic& obsolete_, const MapMode mode_, const float pixelRatio_, - const bool showCollisionBoxes_) + const bool showCollisionBoxes_, + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas_) : self(std::move(self_)), parent(std::move(parent_)), scheduler(scheduler_), @@ -46,7 +47,8 @@ GeometryTileWorker::GeometryTileWorker(ActorRef self_, obsolete(obsolete_), mode(mode_), pixelRatio(pixelRatio_), - showCollisionBoxes(showCollisionBoxes_) {} + showCollisionBoxes(showCollisionBoxes_), + dynamicTextureAtlas(dynamicTextureAtlas_) {} GeometryTileWorker::~GeometryTileWorker() { MLN_TRACE_FUNC(); @@ -332,7 +334,7 @@ void GeometryTileWorker::onImagesAvailable(ImageMap newIconMap, if (imageCorrelationID != imageCorrelationID_) { return; // Ignore outdated image request replies. } - imageMap = std::move(newIconMap); + iconMap = std::move(newIconMap); patternMap = std::move(newPatternMap); versionMap = std::move(newVersionMap); pendingImageDependencies.clear(); @@ -495,19 +497,25 @@ void GeometryTileWorker::finalizeLayout() { return; } - MBGL_TIMING_START(watch) - std::optional glyphAtlasImage; - ImageAtlas iconAtlas = makeImageAtlas(imageMap, patternMap, versionMap); + MBGL_TIMING_START(watch); + gfx::ImageAtlas imageAtlas; + gfx::GlyphAtlas glyphAtlas; + if (dynamicTextureAtlas) { + imageAtlas = dynamicTextureAtlas->uploadIconsAndPatterns(iconMap, patternMap, versionMap); + } if (!layouts.empty()) { - GlyphAtlas glyphAtlas = makeGlyphAtlas(glyphMap); - glyphAtlasImage = std::move(glyphAtlas.image); + if (dynamicTextureAtlas) { + glyphAtlas = dynamicTextureAtlas->uploadGlyphs(glyphMap); + } for (auto& layout : layouts) { if (obsolete) { + dynamicTextureAtlas->removeTextures(glyphAtlas.textureHandles, glyphAtlas.dynamicTexture); + dynamicTextureAtlas->removeTextures(imageAtlas.textureHandles, imageAtlas.dynamicTexture); return; } - layout->prepareSymbols(glyphMap, glyphAtlas.positions, imageMap, iconAtlas.iconPositions); + layout->prepareSymbols(glyphMap, glyphAtlas.glyphPositions, iconMap, imageAtlas.iconPositions); if (!layout->hasSymbolInstances()) { continue; @@ -515,7 +523,7 @@ void GeometryTileWorker::finalizeLayout() { // layout adds the bucket to buckets layout->createBucket( - iconAtlas.patternPositions, featureIndex, renderData, firstLoad, showCollisionBoxes, id.canonical); + imageAtlas.patternPositions, featureIndex, renderData, firstLoad, showCollisionBoxes, id.canonical); } } @@ -530,8 +538,11 @@ void GeometryTileWorker::finalizeLayout() { << id.canonical.y << " Time"); parent.invoke(&GeometryTile::onLayout, - std::make_shared( - std::move(renderData), std::move(featureIndex), std::move(glyphAtlasImage), std::move(iconAtlas)), + std::make_shared(std::move(renderData), + std::move(featureIndex), + std::move(glyphAtlas), + std::move(imageAtlas), + dynamicTextureAtlas), correlationID); } diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index ccd546520098..eea005dfdb72 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -26,6 +26,11 @@ namespace style { class Layer; } // namespace style +namespace gfx { +class DynamicTextureAtlas; +using DynamicTextureAtlasPtr = std::shared_ptr; +} // namespace gfx + class GeometryTileWorker { public: GeometryTileWorker(ActorRef self, @@ -36,7 +41,8 @@ class GeometryTileWorker { const std::atomic&, MapMode, float pixelRatio, - bool showCollisionBoxes_); + bool showCollisionBoxes_, + gfx::DynamicTextureAtlasPtr); ~GeometryTileWorker(); void setLayers(std::vector>, @@ -103,13 +109,15 @@ class GeometryTileWorker { GlyphDependencies pendingGlyphDependencies; ImageDependencies pendingImageDependencies; GlyphMap glyphMap; - ImageMap imageMap; + ImageMap iconMap; ImageMap patternMap; ImageVersionMap versionMap; std::set availableImages; bool showCollisionBoxes; bool firstLoad = true; + + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; }; } // namespace mbgl diff --git a/test/include/mbgl/test/vector_tile_test.hpp b/test/include/mbgl/test/vector_tile_test.hpp index f17a626dbbd2..3e2b41d73cbd 100644 --- a/test/include/mbgl/test/vector_tile_test.hpp +++ b/test/include/mbgl/test/vector_tile_test.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -24,11 +25,10 @@ class VectorTileTest { const std::shared_ptr imageManager = std::make_shared(); const std::shared_ptr glyphManager = std::make_shared(); - - Tileset tileset{{"https://example.com"}, {0, 22}, "none"}; - + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; TaggedScheduler threadPool; + Tileset tileset{{"https://example.com"}, {0, 22}, "none"}; TileParameters tileParameters; style::Style style; @@ -43,7 +43,8 @@ class VectorTileTest { imageManager, glyphManager, 0, - threadPool}, + threadPool, + dynamicTextureAtlas}, style{fileSource, 1, threadPool} {} ~VectorTileTest() { diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp index 7e1b6183277e..8aad9033e2e1 100644 --- a/test/style/source.test.cpp +++ b/test/style/source.test.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,7 @@ class SourceTest { AnnotationManager annotationManager{style}; std::shared_ptr imageManager = std::make_shared(); std::shared_ptr glyphManager = std::make_shared(); + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; TaggedScheduler threadPool; Style style; @@ -77,7 +79,8 @@ class SourceTest { imageManager, glyphManager, 0, - threadPool}; + threadPool, + dynamicTextureAtlas}; }; SourceTest() diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp index 3a2b9ba19ac1..af88238b07b2 100644 --- a/test/text/quads.test.cpp +++ b/test/text/quads.test.cpp @@ -13,8 +13,7 @@ using namespace mbgl::style; TEST(getIconQuads, normal) { SymbolLayoutProperties::Evaluated layout; Anchor anchor(2.0, 3.0, 0.0, 0); - ImagePosition image = {mapbox::Bin(-1, 15, 11, 0, 0, 0, 0), - style::Image::Impl("test", PremultipliedImage({1, 1}), 1.0f)}; + ImagePosition image = {Rect(0, 0, 15, 11), style::Image::Impl("test", PremultipliedImage({1, 1}), 1.0f)}; auto shapedIcon = PositionedIcon::shapeIcon(image, {{-6.5f, -4.5f}}, SymbolAnchorType::Center); @@ -36,7 +35,7 @@ TEST(getIconQuads, normal) { TEST(getIconQuads, style) { Anchor anchor(0.0, 0.0, 0.0, 0); - const ImagePosition image = {mapbox::Bin(-1, 20, 20, 0, 0, 0, 0), + const ImagePosition image = {Rect(0, 0, 20, 20), style::Image::Impl("test", PremultipliedImage({1, 1}), 1.0f)}; GeometryCoordinates line; diff --git a/test/text/shaping.test.cpp b/test/text/shaping.test.cpp index bd502611f69f..0535cef50acf 100644 --- a/test/text/shaping.test.cpp +++ b/test/text/shaping.test.cpp @@ -120,7 +120,7 @@ void setupShapedText(Shaping& shapedText, float textSize) { shapedText.positionedLines.back().positionedGlyphs.emplace_back(glyph); } -void testApplyTextFit(const mapbox::Bin& rectangle, +void testApplyTextFit(const Rect& rectangle, const style::ImageContent& content, const std::optional textFitWidth, const std::optional textFitHeight, @@ -159,7 +159,7 @@ TEST(Shaping, applyTextFit) { // applyTextFitHorizontal // This set of tests against applyTextFit starts with a 100x20 image with a 5,5,95,15 content box // that has been fitted to a 4*4 text with scale 4, resulting in a 16*16 image. - const auto horizontalRectangle = mapbox::Bin(-1, 100, 20, -1, -1, 0, 0); + const auto horizontalRectangle = Rect(0, 0, 100, 20); const style::ImageContent horizontalContent = {5, 5, 95, 15}; { @@ -207,7 +207,7 @@ TEST(Shaping, applyTextFit) { // applyTextFitVertical // This set of tests against applyTextFit starts with a 20x100 image with a 5,5,15,95 content box // that has been fitted to a 4*4 text with scale 4, resulting in a 16*16 image. - const auto verticalRectangle = mapbox::Bin(-1, 20, 100, -1, -1, 0, 0); + const auto verticalRectangle = Rect(0, 0, 20, 100); const style::ImageContent verticalContent = {5, 5, 15, 95}; { diff --git a/test/tile/custom_geometry_tile.test.cpp b/test/tile/custom_geometry_tile.test.cpp index 57fae1b8bf11..c630ae271817 100644 --- a/test/tile/custom_geometry_tile.test.cpp +++ b/test/tile/custom_geometry_tile.test.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -29,6 +30,8 @@ class CustomTileTest { AnnotationManager annotationManager{style}; std::shared_ptr imageManager = std::make_shared(); std::shared_ptr glyphManager = std::make_shared(); + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + TileParameters tileParameters; style::Style style; @@ -42,7 +45,8 @@ class CustomTileTest { imageManager, glyphManager, 0, - {Scheduler::GetBackground(), uniqueID}}, + {Scheduler::GetBackground(), uniqueID}, + dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/geojson_tile.test.cpp b/test/tile/geojson_tile.test.cpp index 4889192fe0a8..f1fb4dbf7390 100644 --- a/test/tile/geojson_tile.test.cpp +++ b/test/tile/geojson_tile.test.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -29,6 +30,8 @@ class GeoJSONTileTest { AnnotationManager annotationManager{style}; std::shared_ptr imageManager = std::make_shared(); std::shared_ptr glyphManager = std::make_shared(); + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + Tileset tileset{{"https://example.com"}, {0, 22}, "none"}; TileParameters tileParameters; style::Style style; @@ -43,7 +46,8 @@ class GeoJSONTileTest { imageManager, glyphManager, 0, - {Scheduler::GetBackground(), uniqueID}}, + {Scheduler::GetBackground(), uniqueID}, + dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/raster_dem_tile.test.cpp b/test/tile/raster_dem_tile.test.cpp index 23d67190b5d1..ea7eeec94e88 100644 --- a/test/tile/raster_dem_tile.test.cpp +++ b/test/tile/raster_dem_tile.test.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using namespace mbgl; @@ -23,6 +24,8 @@ class RasterDEMTileTest { AnnotationManager annotationManager{style}; std::shared_ptr imageManager = std::make_shared(); std::shared_ptr glyphManager = std::make_shared(); + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + Tileset tileset{{"https://example.com"}, {0, 22}, "none"}; TileParameters tileParameters; style::Style style; @@ -37,7 +40,8 @@ class RasterDEMTileTest { imageManager, glyphManager, 0, - {Scheduler::GetBackground(), uniqueID}}, + {Scheduler::GetBackground(), uniqueID}, + dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/raster_tile.test.cpp b/test/tile/raster_tile.test.cpp index 5f0922266332..a305c3bd2f60 100644 --- a/test/tile/raster_tile.test.cpp +++ b/test/tile/raster_tile.test.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using namespace mbgl; @@ -23,6 +24,8 @@ class RasterTileTest { AnnotationManager annotationManager{style}; std::shared_ptr imageManager = std::make_shared(); std::shared_ptr glyphManager = std::make_shared(); + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + Tileset tileset{{"https://example.com"}, {0, 22}, "none"}; TileParameters tileParameters; style::Style style; @@ -37,7 +40,8 @@ class RasterTileTest { imageManager, glyphManager, 0, - {Scheduler::GetBackground(), uniqueID}}, + {Scheduler::GetBackground(), uniqueID}, + dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; From b29e22a7f9bb65915ca09d7668d7960563d39695 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 14 May 2025 23:04:05 +0200 Subject: [PATCH 186/339] Improve core static build release (#3465) --- .github/workflows/core-release.yml | 11 ++++++++--- CMakePresets.json | 6 ++++-- vendor/nunicode.cmake | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index 3000d4a70953..60757b457388 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -12,9 +12,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Create maplibre-native-headers.tar.gz - run: tar czf maplibre-native-headers.tar.gz include + with: + submodules: recursive + - name: Create maplibre-native-headers.tar.gz + run: tar czf maplibre-native-headers.tar.gz \ + include \ + vendor/maplibre-native-base/deps/variant/include \ + vendor/maplibre-native-base/deps/geometry.hpp/include - name: Create Release run: | gh release create core-${{ github.sha }} \ @@ -22,7 +27,7 @@ jobs: --prerelease=false \ --latest=false \ --title "core-${{ github.sha }}" \ - maplibre-native-headers.tar.gz + maplibre-native-headers.tar.gz LICENSE.core.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CMakePresets.json b/CMakePresets.json index 9ae3b49806e4..64509e2b1a90 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -107,7 +107,8 @@ "name": "linux-opengl-core", "inherits": "linux-opengl", "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON" + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_USE_BUILTIN_ICU": "ON" } }, { @@ -124,7 +125,8 @@ "name": "linux-vulkan-core", "inherits": "linux-vulkan", "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON" + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_USE_BUILTIN_ICU": "ON" } } ], diff --git a/vendor/nunicode.cmake b/vendor/nunicode.cmake index 640539bb195d..0ecda14dd4c3 100644 --- a/vendor/nunicode.cmake +++ b/vendor/nunicode.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-nunicode) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-nunicode OBJECT) else() add_library(mbgl-vendor-nunicode STATIC) From 5d7223d51f34714fa187340e2f5afe3bfe56c98b Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 15 May 2025 00:59:10 +0200 Subject: [PATCH 187/339] Fix YAML syntax core-release.yml (#3467) --- .github/workflows/core-release.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index 60757b457388..1f2d6c783da0 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -16,10 +16,11 @@ jobs: submodules: recursive - name: Create maplibre-native-headers.tar.gz - run: tar czf maplibre-native-headers.tar.gz \ - include \ - vendor/maplibre-native-base/deps/variant/include \ - vendor/maplibre-native-base/deps/geometry.hpp/include + run: | + tar czf maplibre-native-headers.tar.gz \ + include \ + vendor/maplibre-native-base/deps/variant/include \ + vendor/maplibre-native-base/deps/geometry.hpp/include - name: Create Release run: | gh release create core-${{ github.sha }} \ @@ -27,7 +28,7 @@ jobs: --prerelease=false \ --latest=false \ --title "core-${{ github.sha }}" \ - maplibre-native-headers.tar.gz LICENSE.core.md + maplibre-native-headers.tar.gz LICENSES.core.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9987ccfc768d12b37350204e2535f20dc2870a11 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 15 May 2025 13:20:10 +0200 Subject: [PATCH 188/339] Retry iOS UI Tests (#3470) --- .github/workflows/ios-ci.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index df06cd954678..bd14a7943df3 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -100,7 +100,25 @@ jobs: # run: bazel test //platform/ios/iosapp-UITests:uitest --test_output=errors --//:renderer=metal --features=tsan - name: Running iOS UI tests (Address+UB Sanitizer) - run: bazel test //platform/ios/iosapp-UITests:uitest --test_output=errors --//:renderer=metal --features=include_clang_rt --copt=-fsanitize=undefined --linkopt=-fsanitize=undefined --copt=-fsanitize-recover=null --linkopt=-fsanitize-recover=null + run: | + retry_count=0 + max_retries=5 + while [ $retry_count -le $max_retries ]; do + bazel test //platform/ios/iosapp-UITests:uitest \ + --test_output=errors \ + --//:renderer=metal \ + --features=include_clang_rt \ + --copt=-fsanitize=undefined \ + --linkopt=-fsanitize=undefined \ + --copt=-fsanitize-recover=null \ + --linkopt=-fsanitize-recover=null && break + retry_count=$((retry_count+1)) + if [ $retry_count -eq $max_retries ]; then + echo "::error::Failed to run iOS UI tests after $max_retries attempts" + exit 1 + fi + echo "Attempt $retry_count failed. Retrying..." + done # render test From 9f034a36ab9f198009e226b633b1eafc091adc5e Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 15 May 2025 17:01:23 +0300 Subject: [PATCH 189/339] Fix validation error reported by VulkanSDK 1.4.313.0 (#3471) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- include/mbgl/vulkan/context.hpp | 11 +++-------- include/mbgl/vulkan/renderable_resource.hpp | 2 ++ .../maplibre.download-vulkan-validation.gradle.kts | 2 +- src/mbgl/vulkan/context.cpp | 12 +++++------- src/mbgl/vulkan/renderable_resource.cpp | 11 +++++++++++ 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index b9fb8c608fe2..6a4880c9df3b 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -157,19 +157,14 @@ class Context final : public gfx::Context { struct FrameResources { vk::UniqueCommandBuffer commandBuffer; - vk::UniqueSemaphore surfaceSemaphore; - vk::UniqueSemaphore frameSemaphore; + vk::UniqueSemaphore acquireSurfaceSemaphore; vk::UniqueFence flightFrameFence; std::vector> deletionQueue; - FrameResources(vk::UniqueCommandBuffer& cb, - vk::UniqueSemaphore&& surf, - vk::UniqueSemaphore&& frame, - vk::UniqueFence&& flight) + FrameResources(vk::UniqueCommandBuffer& cb, vk::UniqueSemaphore&& surf, vk::UniqueFence&& flight) : commandBuffer(std::move(cb)), - surfaceSemaphore(std::move(surf)), - frameSemaphore(std::move(frame)), + acquireSurfaceSemaphore(std::move(surf)), flightFrameFence(std::move(flight)) {} void runDeletionQueue(Context&); diff --git a/include/mbgl/vulkan/renderable_resource.hpp b/include/mbgl/vulkan/renderable_resource.hpp index 369e53d1e3eb..35a2337c0ad7 100644 --- a/include/mbgl/vulkan/renderable_resource.hpp +++ b/include/mbgl/vulkan/renderable_resource.hpp @@ -58,6 +58,7 @@ class SurfaceRenderableResource : public RenderableResource { uint32_t getAcquiredImageIndex() const { return acquiredImageIndex; }; void setAcquiredImageIndex(uint32_t index) { acquiredImageIndex = index; }; const vk::Image getAcquiredImage() const; + const vk::Semaphore& getAcquiredSemaphore() const; bool hasSurfaceTransformSupport() const; bool didSurfaceTransformUpdate() const; @@ -86,6 +87,7 @@ class SurfaceRenderableResource : public RenderableResource { std::vector swapchainImages; std::vector swapchainImageViews; std::vector swapchainFramebuffers; + std::vector swapchainSemaphores; vk::Format colorFormat{vk::Format::eUndefined}; UniqueImageAllocation depthAllocation; diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.download-vulkan-validation.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.download-vulkan-validation.gradle.kts index b9fe7e642ff3..a74f8759b37f 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.download-vulkan-validation.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.download-vulkan-validation.gradle.kts @@ -18,7 +18,7 @@ import java.net.URL */ // Define the validation layer version, with a default value. -var vvlVersion = "1.3.290.0" +var vvlVersion = "1.4.313.0" if (extra.has("vvl_version")) { vvlVersion = extra["vvl_version"] as String } diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index ed795052dfad..22ca8ca713a3 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -99,15 +99,13 @@ void Context::initFrameResources() { for (uint32_t index = 0; index < frameCount; ++index) { frameResources.emplace_back(commandBuffers[index], - device->createSemaphoreUnique({}), device->createSemaphoreUnique({}), device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled))); const auto& frame = frameResources.back(); backend.setDebugName(frame.commandBuffer.get(), "FrameCommandBuffer_" + std::to_string(index)); - backend.setDebugName(frame.frameSemaphore.get(), "FrameSemaphore_" + std::to_string(index)); - backend.setDebugName(frame.surfaceSemaphore.get(), "SurfaceSemaphore_" + std::to_string(index)); + backend.setDebugName(frame.acquireSurfaceSemaphore.get(), "AcquireSurfaceSemaphore_" + std::to_string(index)); backend.setDebugName(frame.flightFrameFence.get(), "FrameFence_" + std::to_string(index)); } @@ -259,7 +257,7 @@ void Context::beginFrame() { MLN_TRACE_ZONE(acquireNextImageKHR); try { const vk::ResultValue acquireImageResult = device->acquireNextImageKHR( - renderableResource.getSwapchain().get(), timeout, frame.surfaceSemaphore.get(), nullptr); + renderableResource.getSwapchain().get(), timeout, frame.acquireSurfaceSemaphore.get(), nullptr); if (acquireImageResult.result == vk::Result::eSuccess) { renderableResource.setAcquiredImageIndex(acquireImageResult.value); @@ -303,8 +301,8 @@ void Context::submitFrame() { auto submitInfo = vk::SubmitInfo().setCommandBuffers(frame.commandBuffer.get()); if (platformSurface) { - submitInfo.setSignalSemaphores(frame.frameSemaphore.get()) - .setWaitSemaphores(frame.surfaceSemaphore.get()) + submitInfo.setSignalSemaphores(renderableResource.getAcquiredSemaphore()) + .setWaitSemaphores(frame.acquireSurfaceSemaphore.get()) .setWaitDstStageMask(waitStageMask); } @@ -320,7 +318,7 @@ void Context::submitFrame() { const auto acquiredImage = renderableResource.getAcquiredImageIndex(); const auto presentInfo = vk::PresentInfoKHR() .setSwapchains(renderableResource.getSwapchain().get()) - .setWaitSemaphores(frame.frameSemaphore.get()) + .setWaitSemaphores(renderableResource.getAcquiredSemaphore()) .setImageIndices(acquiredImage); try { diff --git a/src/mbgl/vulkan/renderable_resource.cpp b/src/mbgl/vulkan/renderable_resource.cpp index f129a6176848..eb46f5deb078 100644 --- a/src/mbgl/vulkan/renderable_resource.cpp +++ b/src/mbgl/vulkan/renderable_resource.cpp @@ -159,6 +159,12 @@ void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { colorFormat = swapchainCreateInfo.imageFormat; extent = swapchainCreateInfo.imageExtent; + + swapchainSemaphores.reserve(swapchainImageCount); + for (uint32_t index = 0; index < swapchainImageCount; ++index) { + swapchainSemaphores.emplace_back(device->createSemaphoreUnique({})); + backend.setDebugName(swapchainSemaphores.back().get(), "SurfaceSemaphore_" + std::to_string(index)); + } } void SurfaceRenderableResource::initDepthStencil() { @@ -241,6 +247,10 @@ const vk::Image SurfaceRenderableResource::getAcquiredImage() const { return colorAllocations[acquiredImageIndex]->image; } +const vk::Semaphore& SurfaceRenderableResource::getAcquiredSemaphore() const { + return swapchainSemaphores[acquiredImageIndex].get(); +} + bool SurfaceRenderableResource::hasSurfaceTransformSupport() const { #ifdef __ANDROID__ return surface && capabilities.supportedTransforms != vk::SurfaceTransformFlagBitsKHR::eIdentity; @@ -391,6 +401,7 @@ void SurfaceRenderableResource::recreateSwapchain() { renderPass.reset(); swapchainImageViews.clear(); swapchainImages.clear(); + swapchainSemaphores.clear(); init(extent.width, extent.height); } From a810c4de0a9f262647863abe279eb2995667dc0c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 15 May 2025 17:28:53 +0200 Subject: [PATCH 190/339] Automate Android releases further (#3472) --- .github/workflows/android-ci.yml | 19 ++++++++++++++++++- .github/workflows/android-release.yml | 19 ++++++++----------- docs/mdbook/src/platforms/android/release.md | 18 ++---------------- platform/android/CHANGELOG.md | 5 +++++ .../android/MapLibreAndroid/build.gradle.kts | 2 +- .../android/MapLibreAndroid/gradle.properties | 2 -- platform/android/VERSION | 1 + .../maplibre.artifact-settings.gradle.kts | 10 ++++++---- 8 files changed, 41 insertions(+), 35 deletions(-) create mode 100644 platform/android/VERSION diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index b499492235c1..7a0938ef4c0d 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -46,6 +46,8 @@ jobs: BUILDTYPE: Debug IS_LOCAL_DEVELOPMENT: false MLN_ANDROID_STL: c++_static + outputs: + make_release: ${{ steps.make_release.outputs.make_release }} steps: - name: Free Disk Space (Ubuntu) if: startsWith(runner.name, 'GitHub Actions') @@ -200,6 +202,17 @@ jobs: platform/android/InstrumentationTestApp.apk platform/android/InstrumentationTests.apk + - name: VERSION file changed + id: version-file-android-changed + uses: tj-actions/changed-files@v46 + with: + files: platform/android/VERSION + + - name: Should make release? + id: make_release + if: github.ref == 'refs/heads/main' && github.event_name == 'push' && steps.version-file-android-changed.outputs.any_changed == 'true' + run: echo make_release=true >> "$GITHUB_OUTPUT" + android-build-cpp-test: runs-on: ubuntu-24.04 @@ -328,5 +341,9 @@ jobs: - android-build-render-test steps: - name: Mark result as failed - if: needs.android-build.result != 'success' + if: needs.android-build.result != 'success' || needs.android-build-cpp-test.result != 'success' || needs.android-build-render-test.result != 'success' run: exit 1 + + - name: Trigger release + if: needs.android-build.outputs.make_release == 'true' && needs.android-build.result == 'success' && needs.android-build-cpp-test.result == 'success' && needs.android-build-render-test.result == 'success' + run: gh workflow run android-release.yml --ref ${{ github.sha }} diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 8b7784fe059f..986384be8730 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -42,17 +42,9 @@ jobs: - name: Android nitpick run: make run-android-nitpick - - name: Update version name + - name: Set version name run: | - RELEASE_VERSION="$( git describe --tags --match=android-v*.*.* --abbrev=0 | sed 's/^android-v//' )" - echo version="$RELEASE_VERSION" >> "$GITHUB_ENV" - echo "Latest version from tag: $RELEASE_VERSION" - if [ -n "$RELEASE_VERSION" ]; then - sed -i -e "s/^VERSION_NAME=.*/VERSION_NAME=${RELEASE_VERSION}/" MapLibreAndroid/gradle.properties - echo "MapLibreAndroid/gradle.properties:" - cat MapLibreAndroid/gradle.properties - fi - shell: bash + echo version="$(cat VERSION)" > "$GITHUB_ENV" - name: Build package run: | @@ -68,7 +60,7 @@ jobs: RELEASE_NOTES_PATH="${PWD}/release_notes.txt" node scripts/release-notes.mjs > "${RELEASE_NOTES_PATH}" echo release_notes="${RELEASE_NOTES_PATH}" >> "$GITHUB_OUTPUT" - echo version_tag="$( git describe --tags --match=android-v*.*.* --abbrev=0 )" >> "$GITHUB_OUTPUT" + echo version_tag=android-v${{ env.version }} >> "$GITHUB_OUTPUT" shell: bash - name: Check if version is pre-release @@ -83,6 +75,11 @@ jobs: echo "prerelease=true" >> "$GITHUB_ENV" fi + - name: Create tag + run: | + git tag -s -a android-v${{ env.version }} -m "Publish android-v${{ env.version }}" ${{ github.sha }} + git push origin android-v${{ env.version }} + - name: Create release id: create_release uses: actions/create-release@v1 diff --git a/docs/mdbook/src/platforms/android/release.md b/docs/mdbook/src/platforms/android/release.md index 3906115fedf6..39800a1d38a5 100644 --- a/docs/mdbook/src/platforms/android/release.md +++ b/docs/mdbook/src/platforms/android/release.md @@ -19,20 +19,6 @@ To make an Android release, do the following: ## 9.6.0 ``` - - Update `android/MapLibreAndroid/gradle.properties` with the new version. + - Update `android/VERSION` with the new version. -2. Once the pull request updating the changelog is merged, tag the commit: - - - Create a tag locally, with for example: - ``` - git tag -a android-v9.6.0 -m "Release android-v9.6.0" - ``` - - You need write access to push the tag, use for example: - ``` - git push --atomic origin main android-v9.6.0 - ``` - -3. Once the tag is pushed, you can run the [`android-release.yml`](https://github.com/maplibre/maplibre-native/blob/main/.github/workflows/android-release.yml) workflow. - - - Open the [android-release](https://github.com/maplibre/maplibre-native/actions/workflows/android-release.yml) workflow page. - - Press *Run workflow* and select the tag you pushed. +2. Once the PR is merged, the [`android-release.yml`](https://github.com/maplibre/maplibre-native/blob/main/.github/workflows/android-release.yml) workflow will run automatically to make the release. diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index bd4dcadee78a..e83bd2f7bdd8 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,10 +1,15 @@ # Changelog MapLibre Native for Android +## 11.9.0-pre0 + +Pre-release to test out the new [dynamic texture atlas](https://github.com/maplibre/maplibre-native/pull/3198). This should result in a memory reduction. Please [open an issue](https://github.com/maplibre/maplibre-native/issues) if you encounter any problems. + ## 11.8.8 ### ✨ Features and improvements - Update NDK to 28.1.13356709 ([#3450](https://github.com/maplibre/maplibre-native/pull/3450)). +- Add support to range requests in AssetFileSource ([#3461](https://github.com/maplibre/maplibre-native/pull/3404)). ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/build.gradle.kts b/platform/android/MapLibreAndroid/build.gradle.kts index b642cf50e039..6cd320d4e774 100644 --- a/platform/android/MapLibreAndroid/build.gradle.kts +++ b/platform/android/MapLibreAndroid/build.gradle.kts @@ -67,7 +67,7 @@ android { buildConfigField( "String", "MAPLIBRE_VERSION_STRING", - "\"MapLibre Native/${project.property("VERSION_NAME")}\"" + "\"MapLibre Android/${project.extra["versionName"]}\"" ) consumerProguardFiles("proguard-rules.pro") } diff --git a/platform/android/MapLibreAndroid/gradle.properties b/platform/android/MapLibreAndroid/gradle.properties index 6c03dbe46f37..efa7f7574096 100644 --- a/platform/android/MapLibreAndroid/gradle.properties +++ b/platform/android/MapLibreAndroid/gradle.properties @@ -1,5 +1,3 @@ -VERSION_NAME=11.8.8 - # Only build native dependencies for the current ABI # See https://code.google.com/p/android/issues/detail?id=221098#c20 android.buildOnlyTargetAbi=true diff --git a/platform/android/VERSION b/platform/android/VERSION new file mode 100644 index 000000000000..330c0965226e --- /dev/null +++ b/platform/android/VERSION @@ -0,0 +1 @@ +11.9.0-pre0 diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts index 20ef7345923d..33ca3b2c5090 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.artifact-settings.gradle.kts @@ -9,9 +9,11 @@ extra["mapLibreArtifactScmUrl"] = "scm:git@github.com:maplibre/maplibre-native.g extra["mapLibreArtifactLicenseName"] = "BSD" extra["mapLibreArtifactLicenseUrl"] = "https://opensource.org/licenses/BSD-2-Clause" -// Handling conditional assignment for versionName -extra["versionName"] = if (project.hasProperty("VERSION_NAME")) { - project.property("VERSION_NAME") +val versionFilePath = rootDir.resolve("VERSION") +val versionName = if (versionFilePath.exists()) { + versionFilePath.readText().trim() } else { - System.getenv("VERSION_NAME") + throw GradleException("VERSION file not found at ${versionFilePath.absolutePath}") } + +extra["versionName"] = versionName From a650df219d780976a68c542d956fc85de9fa6d05 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Thu, 15 May 2025 22:53:09 +0300 Subject: [PATCH 191/339] Clean legacy code (#3469) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- CMakeLists.txt | 90 +-- bazel/core.bzl | 90 +-- include/mbgl/gfx/fill_generator.hpp | 20 +- include/mbgl/shaders/gl/background.hpp | 18 +- .../mbgl/shaders/gl/background_pattern.hpp | 77 ++- include/mbgl/shaders/gl/circle.hpp | 104 ++-- include/mbgl/shaders/gl/collision_box.hpp | 34 +- include/mbgl/shaders/gl/collision_circle.hpp | 46 +- ...ustom_geometry.hpp => custom_geometry.hpp} | 6 +- ...symbol_icon.hpp => custom_symbol_icon.hpp} | 0 include/mbgl/shaders/gl/debug.hpp | 24 +- .../mbgl/shaders/gl/drawable_background.hpp | 38 -- .../gl/drawable_background_pattern.hpp | 94 --- include/mbgl/shaders/gl/drawable_circle.hpp | 242 -------- .../shaders/gl/drawable_collision_box.hpp | 80 --- .../shaders/gl/drawable_collision_circle.hpp | 119 ---- include/mbgl/shaders/gl/drawable_debug.hpp | 51 -- include/mbgl/shaders/gl/drawable_fill.hpp | 89 --- .../shaders/gl/drawable_fill_extrusion.hpp | 139 ----- .../gl/drawable_fill_extrusion_pattern.hpp | 237 -------- .../mbgl/shaders/gl/drawable_fill_outline.hpp | 108 ---- .../gl/drawable_fill_outline_pattern.hpp | 181 ------ .../mbgl/shaders/gl/drawable_fill_pattern.hpp | 174 ------ include/mbgl/shaders/gl/drawable_heatmap.hpp | 123 ---- .../shaders/gl/drawable_heatmap_texture.hpp | 66 --- .../mbgl/shaders/gl/drawable_hillshade.hpp | 86 --- .../shaders/gl/drawable_hillshade_prepare.hpp | 116 ---- include/mbgl/shaders/gl/drawable_line.hpp | 224 ------- .../shaders/gl/drawable_line_gradient.hpp | 220 ------- .../mbgl/shaders/gl/drawable_line_pattern.hpp | 295 ---------- include/mbgl/shaders/gl/drawable_line_sdf.hpp | 275 --------- include/mbgl/shaders/gl/drawable_raster.hpp | 108 ---- .../mbgl/shaders/gl/drawable_symbol_icon.hpp | 195 ------- .../gl/drawable_symbol_text_and_icon.hpp | 320 ---------- include/mbgl/shaders/gl/fill.hpp | 45 +- include/mbgl/shaders/gl/fill_extrusion.hpp | 61 +- .../shaders/gl/fill_extrusion_pattern.hpp | 130 +++-- include/mbgl/shaders/gl/fill_outline.hpp | 60 +- .../mbgl/shaders/gl/fill_outline_pattern.hpp | 105 ++-- ...ated.hpp => fill_outline_triangulated.hpp} | 0 include/mbgl/shaders/gl/fill_pattern.hpp | 104 ++-- include/mbgl/shaders/gl/heatmap.hpp | 44 +- include/mbgl/shaders/gl/heatmap_texture.hpp | 43 +- include/mbgl/shaders/gl/hillshade.hpp | 33 +- include/mbgl/shaders/gl/hillshade_prepare.hpp | 33 +- include/mbgl/shaders/gl/line.hpp | 84 +-- include/mbgl/shaders/gl/line_gradient.hpp | 80 ++- include/mbgl/shaders/gl/line_pattern.hpp | 122 ++-- include/mbgl/shaders/gl/line_sdf.hpp | 112 ++-- ...n_indicator.hpp => location_indicator.hpp} | 6 +- ...ed.hpp => location_indicator_textured.hpp} | 6 +- include/mbgl/shaders/gl/raster.hpp | 49 +- include/mbgl/shaders/gl/symbol_icon.hpp | 104 +++- ...drawable_symbol_sdf.hpp => symbol_sdf.hpp} | 0 include/mbgl/shaders/gl/symbol_sdf_icon.hpp | 261 --------- include/mbgl/shaders/gl/symbol_sdf_text.hpp | 261 --------- .../mbgl/shaders/gl/symbol_text_and_icon.hpp | 138 +++-- ...awable_wide_vector.hpp => wide_vector.hpp} | 0 include/mbgl/shaders/shader_manifest.hpp | 53 +- include/mbgl/shaders/shader_source.hpp | 31 +- shaders/background.fragment.glsl | 10 +- shaders/background.vertex.glsl | 4 +- shaders/background_pattern.fragment.glsl | 39 +- shaders/background_pattern.vertex.glsl | 34 +- shaders/circle.fragment.glsl | 13 + shaders/circle.vertex.glsl | 50 +- shaders/collision_box.fragment.glsl | 1 - shaders/collision_box.vertex.glsl | 24 +- shaders/collision_circle.fragment.glsl | 18 +- shaders/collision_circle.vertex.glsl | 24 +- ....glsl => custom.symbol_icon.fragment.glsl} | 0 ...ex.glsl => custom.symbol_icon.vertex.glsl} | 0 ...ent.glsl => custom_geometry.fragment.glsl} | 0 ...ertex.glsl => custom_geometry.vertex.glsl} | 0 shaders/debug.fragment.glsl | 10 +- shaders/debug.vertex.glsl | 10 +- shaders/drawable.background.fragment.glsl | 14 - shaders/drawable.background.vertex.glsl | 8 - .../drawable.background_pattern.fragment.glsl | 45 -- .../drawable.background_pattern.vertex.glsl | 33 -- shaders/drawable.circle.fragment.glsl | 52 -- shaders/drawable.circle.vertex.glsl | 97 --- shaders/drawable.collision_box.fragment.glsl | 20 - shaders/drawable.collision_box.vertex.glsl | 45 -- .../drawable.collision_circle.fragment.glsl | 50 -- shaders/drawable.collision_circle.vertex.glsl | 53 -- shaders/drawable.debug.fragment.glsl | 17 - shaders/drawable.debug.vertex.glsl | 18 - shaders/drawable.fill.fragment.glsl | 22 - shaders/drawable.fill.vertex.glsl | 29 - shaders/drawable.fill_extrusion.fragment.glsl | 9 - shaders/drawable.fill_extrusion.vertex.glsl | 96 --- ...wable.fill_extrusion_pattern.fragment.glsl | 62 -- ...rawable.fill_extrusion_pattern.vertex.glsl | 115 ---- shaders/drawable.fill_outline.fragment.glsl | 26 - shaders/drawable.fill_outline.vertex.glsl | 44 -- ...rawable.fill_outline_pattern.fragment.glsl | 57 -- .../drawable.fill_outline_pattern.vertex.glsl | 75 --- shaders/drawable.fill_pattern.fragment.glsl | 54 -- shaders/drawable.fill_pattern.vertex.glsl | 71 --- shaders/drawable.heatmap.fragment.glsl | 27 - shaders/drawable.heatmap.vertex.glsl | 63 -- .../drawable.heatmap_texture.fragment.glsl | 21 - shaders/drawable.heatmap_texture.vertex.glsl | 29 - shaders/drawable.hillshade.fragment.glsl | 57 -- shaders/drawable.hillshade.vertex.glsl | 13 - .../drawable.hillshade_prepare.fragment.glsl | 77 --- .../drawable.hillshade_prepare.vertex.glsl | 23 - shaders/drawable.line.fragment.glsl | 40 -- shaders/drawable.line.vertex.glsl | 117 ---- shaders/drawable.line_gradient.fragment.glsl | 45 -- shaders/drawable.line_gradient.vertex.glsl | 119 ---- shaders/drawable.line_pattern.fragment.glsl | 86 --- shaders/drawable.line_pattern.vertex.glsl | 131 ----- shaders/drawable.line_sdf.fragment.glsl | 60 -- shaders/drawable.line_sdf.vertex.glsl | 132 ----- shaders/drawable.raster.fragment.glsl | 58 -- shaders/drawable.raster.vertex.glsl | 34 -- shaders/drawable.symbol_icon.fragment.glsl | 41 -- shaders/drawable.symbol_icon.vertex.glsl | 127 ---- shaders/drawable.symbol_sdf.fragment.glsl | 76 --- shaders/drawable.symbol_sdf.vertex.glsl | 156 ----- ...rawable.symbol_text_and_icon.fragment.glsl | 93 --- .../drawable.symbol_text_and_icon.vertex.glsl | 156 ----- shaders/fill.fragment.glsl | 9 + shaders/fill.vertex.glsl | 20 +- shaders/fill_extrusion.vertex.glsl | 46 +- shaders/fill_extrusion_pattern.fragment.glsl | 31 +- shaders/fill_extrusion_pattern.vertex.glsl | 71 ++- shaders/fill_outline.fragment.glsl | 9 + shaders/fill_outline.vertex.glsl | 35 +- shaders/fill_outline_pattern.fragment.glsl | 22 +- shaders/fill_outline_pattern.vertex.glsl | 58 +- ...> fill_outline_triangulated.fragment.glsl} | 0 ... => fill_outline_triangulated.vertex.glsl} | 0 shaders/fill_pattern.fragment.glsl | 26 +- shaders/fill_pattern.vertex.glsl | 55 +- shaders/heatmap.fragment.glsl | 9 +- shaders/heatmap.vertex.glsl | 21 +- shaders/heatmap_texture.fragment.glsl | 11 +- shaders/heatmap_texture.vertex.glsl | 24 +- shaders/hillshade.fragment.glsl | 17 +- shaders/hillshade.vertex.glsl | 6 +- shaders/hillshade_prepare.fragment.glsl | 13 +- shaders/hillshade_prepare.vertex.glsl | 14 +- shaders/line.fragment.glsl | 14 +- shaders/line.vertex.glsl | 42 +- shaders/line_gradient.fragment.glsl | 15 +- shaders/line_gradient.vertex.glsl | 42 +- shaders/line_pattern.fragment.glsl | 31 +- shaders/line_pattern.vertex.glsl | 54 +- shaders/line_sdf.fragment.glsl | 23 +- shaders/line_sdf.vertex.glsl | 52 +- ....glsl => location_indicator.fragment.glsl} | 0 ...ex.glsl => location_indicator.vertex.glsl} | 0 ...location_indicator_textured.fragment.glsl} | 0 ...> location_indicator_textured.vertex.glsl} | 0 shaders/manifest.json | 351 ++++------- shaders/raster.fragment.glsl | 24 +- shaders/raster.vertex.glsl | 21 +- shaders/symbol_icon.fragment.glsl | 24 + shaders/symbol_icon.vertex.glsl | 75 ++- shaders/symbol_sdf.fragment.glsl | 34 +- shaders/symbol_sdf.vertex.glsl | 77 ++- shaders/symbol_text_and_icon.fragment.glsl | 33 +- shaders/symbol_text_and_icon.vertex.glsl | 76 ++- src/mbgl/gfx/drawable_builder_impl.cpp | 4 +- src/mbgl/gfx/fill_generator.cpp | 42 +- src/mbgl/gfx/polyline_generator.cpp | 4 +- src/mbgl/layout/circle_layout.hpp | 8 +- src/mbgl/layout/symbol_layout.cpp | 86 +-- src/mbgl/layout/symbol_projection.cpp | 2 +- src/mbgl/layout/symbol_projection.hpp | 2 +- .../programs/background_pattern_program.hpp | 4 - src/mbgl/programs/background_program.cpp | 48 -- src/mbgl/programs/background_program.hpp | 79 --- src/mbgl/programs/circle_program.cpp | 7 - src/mbgl/programs/circle_program.hpp | 48 -- src/mbgl/programs/collision_box_program.cpp | 7 - src/mbgl/programs/collision_box_program.hpp | 168 ------ .../programs/collision_circle_program.hpp | 4 - src/mbgl/programs/debug_program.cpp | 3 - src/mbgl/programs/debug_program.hpp | 31 - .../fill_extrusion_pattern_program.hpp | 4 - src/mbgl/programs/fill_extrusion_program.cpp | 80 --- src/mbgl/programs/fill_extrusion_program.hpp | 118 ---- .../programs/fill_outline_pattern_program.hpp | 4 - src/mbgl/programs/fill_outline_program.hpp | 4 - src/mbgl/programs/fill_pattern_program.hpp | 4 - src/mbgl/programs/fill_program.cpp | 37 -- src/mbgl/programs/fill_program.hpp | 103 ---- src/mbgl/programs/heatmap_program.cpp | 7 - src/mbgl/programs/heatmap_program.hpp | 45 -- src/mbgl/programs/heatmap_texture_program.cpp | 7 - src/mbgl/programs/heatmap_texture_program.hpp | 31 - .../programs/hillshade_prepare_program.cpp | 7 - .../programs/hillshade_prepare_program.hpp | 40 -- src/mbgl/programs/hillshade_program.cpp | 7 - src/mbgl/programs/hillshade_program.hpp | 47 -- src/mbgl/programs/line_gradient_program.hpp | 4 - src/mbgl/programs/line_pattern_program.hpp | 4 - src/mbgl/programs/line_program.cpp | 101 ---- src/mbgl/programs/line_program.hpp | 180 ------ src/mbgl/programs/line_sdf_program.hpp | 4 - src/mbgl/programs/program.hpp | 4 +- src/mbgl/programs/programs.cpp | 11 +- src/mbgl/programs/programs.hpp | 12 - src/mbgl/programs/raster_program.cpp | 7 - src/mbgl/programs/raster_program.hpp | 55 -- src/mbgl/programs/segment.hpp | 8 +- src/mbgl/programs/symbol_icon_program.hpp | 4 - src/mbgl/programs/symbol_program.cpp | 175 ------ src/mbgl/programs/symbol_program.hpp | 551 ------------------ src/mbgl/programs/symbol_sdf_icon_program.hpp | 4 - src/mbgl/programs/symbol_sdf_text_program.hpp | 4 - .../programs/symbol_text_and_icon_program.hpp | 4 - src/mbgl/renderer/buckets/circle_bucket.cpp | 3 +- src/mbgl/renderer/buckets/circle_bucket.hpp | 20 +- src/mbgl/renderer/buckets/debug_bucket.cpp | 2 +- src/mbgl/renderer/buckets/debug_bucket.hpp | 11 +- src/mbgl/renderer/buckets/fill_bucket.cpp | 1 - src/mbgl/renderer/buckets/fill_bucket.hpp | 17 +- .../buckets/fill_extrusion_bucket.cpp | 32 +- .../buckets/fill_extrusion_bucket.hpp | 29 +- src/mbgl/renderer/buckets/heatmap_bucket.cpp | 9 +- src/mbgl/renderer/buckets/heatmap_bucket.hpp | 25 +- .../renderer/buckets/hillshade_bucket.cpp | 10 +- .../renderer/buckets/hillshade_bucket.hpp | 16 +- src/mbgl/renderer/buckets/line_bucket.cpp | 12 +- src/mbgl/renderer/buckets/line_bucket.hpp | 49 +- src/mbgl/renderer/buckets/raster_bucket.cpp | 9 +- src/mbgl/renderer/buckets/raster_bucket.hpp | 13 +- src/mbgl/renderer/buckets/symbol_bucket.cpp | 21 + src/mbgl/renderer/buckets/symbol_bucket.hpp | 219 ++++++- .../renderer/layers/circle_layer_tweaker.cpp | 4 +- .../layers/fill_extrusion_layer_tweaker.cpp | 10 +- .../renderer/layers/fill_layer_tweaker.cpp | 2 +- .../renderer/layers/heatmap_layer_tweaker.cpp | 3 +- .../renderer/layers/line_layer_tweaker.cpp | 4 +- .../layers/render_background_layer.hpp | 4 +- .../renderer/layers/render_circle_layer.cpp | 1 - .../layers/render_fill_extrusion_layer.cpp | 1 - .../renderer/layers/render_fill_layer.cpp | 1 - .../renderer/layers/render_fill_layer.hpp | 6 - .../renderer/layers/render_heatmap_layer.hpp | 4 +- .../layers/render_hillshade_layer.hpp | 3 +- .../renderer/layers/render_line_layer.cpp | 1 - .../renderer/layers/render_raster_layer.cpp | 1 - .../renderer/layers/render_raster_layer.hpp | 5 +- .../renderer/layers/render_symbol_layer.cpp | 8 +- .../renderer/layers/render_symbol_layer.hpp | 17 - .../renderer/layers/symbol_layer_tweaker.cpp | 5 +- src/mbgl/renderer/render_static_data.cpp | 32 +- src/mbgl/renderer/render_static_data.hpp | 15 +- src/mbgl/renderer/render_tile.cpp | 85 --- src/mbgl/renderer/render_tile.hpp | 1 - .../renderer/sources/render_image_source.cpp | 45 +- .../renderer/sources/render_image_source.hpp | 2 +- .../renderer/sources/render_tile_source.cpp | 6 - .../renderer/sources/render_tile_source.hpp | 2 +- .../style/layers/custom_drawable_layer.cpp | 11 +- src/mbgl/text/placement.cpp | 16 +- test/CMakeLists.txt | 1 - test/gl/bucket.test.cpp | 75 ++- test/programs/symbol_program.test.cpp | 65 --- test/renderer/shader_registry.test.cpp | 9 +- test/tile/vector_tile.test.cpp | 1 + 267 files changed, 2997 insertions(+), 10840 deletions(-) rename include/mbgl/shaders/gl/{drawable_custom_geometry.hpp => custom_geometry.hpp} (98%) rename include/mbgl/shaders/gl/{drawable_custom_symbol_icon.hpp => custom_symbol_icon.hpp} (100%) delete mode 100644 include/mbgl/shaders/gl/drawable_background.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_background_pattern.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_circle.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_collision_box.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_collision_circle.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_debug.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill_extrusion.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill_outline.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_fill_pattern.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_heatmap.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_heatmap_texture.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_hillshade.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_line.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_line_gradient.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_line_pattern.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_line_sdf.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_raster.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_symbol_icon.hpp delete mode 100644 include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp rename include/mbgl/shaders/gl/{drawable_fill_outline_triangulated.hpp => fill_outline_triangulated.hpp} (100%) rename include/mbgl/shaders/gl/{drawable_location_indicator.hpp => location_indicator.hpp} (98%) rename include/mbgl/shaders/gl/{drawable_location_indicator_textured.hpp => location_indicator_textured.hpp} (98%) rename include/mbgl/shaders/gl/{drawable_symbol_sdf.hpp => symbol_sdf.hpp} (100%) delete mode 100644 include/mbgl/shaders/gl/symbol_sdf_icon.hpp delete mode 100644 include/mbgl/shaders/gl/symbol_sdf_text.hpp rename include/mbgl/shaders/gl/{drawable_wide_vector.hpp => wide_vector.hpp} (100%) rename shaders/{drawable.custom.symbol_icon.fragment.glsl => custom.symbol_icon.fragment.glsl} (100%) rename shaders/{drawable.custom.symbol_icon.vertex.glsl => custom.symbol_icon.vertex.glsl} (100%) rename shaders/{drawable.custom_geometry.fragment.glsl => custom_geometry.fragment.glsl} (100%) rename shaders/{drawable.custom_geometry.vertex.glsl => custom_geometry.vertex.glsl} (100%) delete mode 100644 shaders/drawable.background.fragment.glsl delete mode 100644 shaders/drawable.background.vertex.glsl delete mode 100644 shaders/drawable.background_pattern.fragment.glsl delete mode 100644 shaders/drawable.background_pattern.vertex.glsl delete mode 100644 shaders/drawable.circle.fragment.glsl delete mode 100644 shaders/drawable.circle.vertex.glsl delete mode 100644 shaders/drawable.collision_box.fragment.glsl delete mode 100644 shaders/drawable.collision_box.vertex.glsl delete mode 100644 shaders/drawable.collision_circle.fragment.glsl delete mode 100644 shaders/drawable.collision_circle.vertex.glsl delete mode 100644 shaders/drawable.debug.fragment.glsl delete mode 100644 shaders/drawable.debug.vertex.glsl delete mode 100644 shaders/drawable.fill.fragment.glsl delete mode 100644 shaders/drawable.fill.vertex.glsl delete mode 100644 shaders/drawable.fill_extrusion.fragment.glsl delete mode 100644 shaders/drawable.fill_extrusion.vertex.glsl delete mode 100644 shaders/drawable.fill_extrusion_pattern.fragment.glsl delete mode 100644 shaders/drawable.fill_extrusion_pattern.vertex.glsl delete mode 100644 shaders/drawable.fill_outline.fragment.glsl delete mode 100644 shaders/drawable.fill_outline.vertex.glsl delete mode 100644 shaders/drawable.fill_outline_pattern.fragment.glsl delete mode 100644 shaders/drawable.fill_outline_pattern.vertex.glsl delete mode 100644 shaders/drawable.fill_pattern.fragment.glsl delete mode 100644 shaders/drawable.fill_pattern.vertex.glsl delete mode 100644 shaders/drawable.heatmap.fragment.glsl delete mode 100644 shaders/drawable.heatmap.vertex.glsl delete mode 100644 shaders/drawable.heatmap_texture.fragment.glsl delete mode 100644 shaders/drawable.heatmap_texture.vertex.glsl delete mode 100644 shaders/drawable.hillshade.fragment.glsl delete mode 100644 shaders/drawable.hillshade.vertex.glsl delete mode 100644 shaders/drawable.hillshade_prepare.fragment.glsl delete mode 100644 shaders/drawable.hillshade_prepare.vertex.glsl delete mode 100644 shaders/drawable.line.fragment.glsl delete mode 100644 shaders/drawable.line.vertex.glsl delete mode 100644 shaders/drawable.line_gradient.fragment.glsl delete mode 100644 shaders/drawable.line_gradient.vertex.glsl delete mode 100644 shaders/drawable.line_pattern.fragment.glsl delete mode 100644 shaders/drawable.line_pattern.vertex.glsl delete mode 100644 shaders/drawable.line_sdf.fragment.glsl delete mode 100644 shaders/drawable.line_sdf.vertex.glsl delete mode 100644 shaders/drawable.raster.fragment.glsl delete mode 100644 shaders/drawable.raster.vertex.glsl delete mode 100644 shaders/drawable.symbol_icon.fragment.glsl delete mode 100644 shaders/drawable.symbol_icon.vertex.glsl delete mode 100644 shaders/drawable.symbol_sdf.fragment.glsl delete mode 100644 shaders/drawable.symbol_sdf.vertex.glsl delete mode 100644 shaders/drawable.symbol_text_and_icon.fragment.glsl delete mode 100644 shaders/drawable.symbol_text_and_icon.vertex.glsl rename shaders/{drawable.fill_outline_triangulated.fragment.glsl => fill_outline_triangulated.fragment.glsl} (100%) rename shaders/{drawable.fill_outline_triangulated.vertex.glsl => fill_outline_triangulated.vertex.glsl} (100%) rename shaders/{drawable.location_indicator.fragment.glsl => location_indicator.fragment.glsl} (100%) rename shaders/{drawable.location_indicator.vertex.glsl => location_indicator.vertex.glsl} (100%) rename shaders/{drawable.location_indicator_textured.fragment.glsl => location_indicator_textured.fragment.glsl} (100%) rename shaders/{drawable.location_indicator_textured.vertex.glsl => location_indicator_textured.vertex.glsl} (100%) delete mode 100644 src/mbgl/programs/background_pattern_program.hpp delete mode 100644 src/mbgl/programs/background_program.cpp delete mode 100644 src/mbgl/programs/background_program.hpp delete mode 100644 src/mbgl/programs/circle_program.cpp delete mode 100644 src/mbgl/programs/circle_program.hpp delete mode 100644 src/mbgl/programs/collision_box_program.cpp delete mode 100644 src/mbgl/programs/collision_box_program.hpp delete mode 100644 src/mbgl/programs/collision_circle_program.hpp delete mode 100644 src/mbgl/programs/debug_program.cpp delete mode 100644 src/mbgl/programs/debug_program.hpp delete mode 100644 src/mbgl/programs/fill_extrusion_pattern_program.hpp delete mode 100644 src/mbgl/programs/fill_extrusion_program.cpp delete mode 100644 src/mbgl/programs/fill_extrusion_program.hpp delete mode 100644 src/mbgl/programs/fill_outline_pattern_program.hpp delete mode 100644 src/mbgl/programs/fill_outline_program.hpp delete mode 100644 src/mbgl/programs/fill_pattern_program.hpp delete mode 100644 src/mbgl/programs/fill_program.cpp delete mode 100644 src/mbgl/programs/fill_program.hpp delete mode 100644 src/mbgl/programs/heatmap_program.cpp delete mode 100644 src/mbgl/programs/heatmap_program.hpp delete mode 100644 src/mbgl/programs/heatmap_texture_program.cpp delete mode 100644 src/mbgl/programs/heatmap_texture_program.hpp delete mode 100644 src/mbgl/programs/hillshade_prepare_program.cpp delete mode 100644 src/mbgl/programs/hillshade_prepare_program.hpp delete mode 100644 src/mbgl/programs/hillshade_program.cpp delete mode 100644 src/mbgl/programs/hillshade_program.hpp delete mode 100644 src/mbgl/programs/line_gradient_program.hpp delete mode 100644 src/mbgl/programs/line_pattern_program.hpp delete mode 100644 src/mbgl/programs/line_program.cpp delete mode 100644 src/mbgl/programs/line_program.hpp delete mode 100644 src/mbgl/programs/line_sdf_program.hpp delete mode 100644 src/mbgl/programs/raster_program.cpp delete mode 100644 src/mbgl/programs/raster_program.hpp delete mode 100644 src/mbgl/programs/symbol_icon_program.hpp delete mode 100644 src/mbgl/programs/symbol_program.cpp delete mode 100644 src/mbgl/programs/symbol_program.hpp delete mode 100644 src/mbgl/programs/symbol_sdf_icon_program.hpp delete mode 100644 src/mbgl/programs/symbol_sdf_text_program.hpp delete mode 100644 src/mbgl/programs/symbol_text_and_icon_program.hpp delete mode 100644 test/programs/symbol_program.test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b47c67564510..aefcb6d16db5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -544,53 +544,14 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/math/log2.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/platform/settings.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/attributes.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/background_pattern_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/background_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/background_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/circle_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/circle_program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/clipping_mask_program.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/clipping_mask_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/collision_box_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/collision_box_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/collision_circle_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/debug_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/debug_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_extrusion_pattern_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_extrusion_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_extrusion_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_outline_pattern_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_outline_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_pattern_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/fill_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/heatmap_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/heatmap_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/heatmap_texture_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/heatmap_texture_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/hillshade_prepare_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/hillshade_prepare_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/hillshade_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/hillshade_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/line_gradient_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/line_pattern_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/line_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/line_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/line_sdf_program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program_parameters.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program_parameters.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/programs.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/programs.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/raster_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/raster_program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/segment.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_icon_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_sdf_icon_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_sdf_text_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/symbol_text_and_icon_program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/textures.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/programs/uniforms.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/backend_scope.cpp @@ -1024,61 +985,36 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/shader_group_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/prelude.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/background.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_background.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_background_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_circle.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_box.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_collision_circle.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_custom_geometry.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_debug.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_outline.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_outline_triangulated.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_heatmap.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_hillshade.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_gradient.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_line_sdf.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_location_indicator.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_raster.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/drawable_wide_vector.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/background_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/circle.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/clipping_mask.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/collision_box.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/collision_circle.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/custom_geometry.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/custom_symbol_icon.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/debug.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_extrusion.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_outline_pattern.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_outline.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_pattern.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/heatmap_texture.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_outline_pattern.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_outline_triangulated.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_extrusion.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/heatmap.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/heatmap_texture.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/hillshade_prepare.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/hillshade.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/line.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/line_gradient.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/line_pattern.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/line_sdf.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/line.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/location_indicator.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/location_indicator_textured.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/raster.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/symbol_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/symbol_sdf_icon.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/symbol_sdf_text.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/symbol_sdf.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/symbol_text_and_icon.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/wide_vector.hpp ) list(APPEND SRC_FILES diff --git a/bazel/core.bzl b/bazel/core.bzl index 80ea58fee643..06efec4e3566 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -61,57 +61,32 @@ MLN_GENERATED_OPENGL_SHADER_HEADERS = [ "include/mbgl/shaders/gl/clipping_mask.hpp", "include/mbgl/shaders/gl/collision_box.hpp", "include/mbgl/shaders/gl/collision_circle.hpp", + "include/mbgl/shaders/gl/custom_geometry.hpp", + "include/mbgl/shaders/gl/custom_symbol_icon.hpp", "include/mbgl/shaders/gl/debug.hpp", - "include/mbgl/shaders/gl/drawable_background.hpp", - "include/mbgl/shaders/gl/drawable_background_pattern.hpp", - "include/mbgl/shaders/gl/drawable_circle.hpp", - "include/mbgl/shaders/gl/drawable_collision_box.hpp", - "include/mbgl/shaders/gl/drawable_collision_circle.hpp", - "include/mbgl/shaders/gl/drawable_custom_geometry.hpp", - "include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp", - "include/mbgl/shaders/gl/drawable_debug.hpp", - "include/mbgl/shaders/gl/drawable_fill.hpp", - "include/mbgl/shaders/gl/drawable_fill_outline.hpp", - "include/mbgl/shaders/gl/drawable_fill_pattern.hpp", - "include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp", - "include/mbgl/shaders/gl/drawable_fill_outline_triangulated.hpp", - "include/mbgl/shaders/gl/drawable_fill_extrusion.hpp", - "include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp", - "include/mbgl/shaders/gl/drawable_heatmap.hpp", - "include/mbgl/shaders/gl/drawable_heatmap_texture.hpp", - "include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp", - "include/mbgl/shaders/gl/drawable_hillshade.hpp", - "include/mbgl/shaders/gl/drawable_line_gradient.hpp", - "include/mbgl/shaders/gl/drawable_line_pattern.hpp", - "include/mbgl/shaders/gl/drawable_line_sdf.hpp", - "include/mbgl/shaders/gl/drawable_line.hpp", - "include/mbgl/shaders/gl/drawable_location_indicator.hpp", - "include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp", - "include/mbgl/shaders/gl/drawable_raster.hpp", - "include/mbgl/shaders/gl/drawable_symbol_icon.hpp", - "include/mbgl/shaders/gl/drawable_symbol_sdf.hpp", - "include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp", - "include/mbgl/shaders/gl/drawable_wide_vector.hpp", - "include/mbgl/shaders/gl/fill_extrusion_pattern.hpp", - "include/mbgl/shaders/gl/fill_extrusion.hpp", - "include/mbgl/shaders/gl/fill_outline_pattern.hpp", + "include/mbgl/shaders/gl/fill.hpp", "include/mbgl/shaders/gl/fill_outline.hpp", "include/mbgl/shaders/gl/fill_pattern.hpp", - "include/mbgl/shaders/gl/fill.hpp", - "include/mbgl/shaders/gl/heatmap_texture.hpp", + "include/mbgl/shaders/gl/fill_outline_pattern.hpp", + "include/mbgl/shaders/gl/fill_outline_triangulated.hpp", + "include/mbgl/shaders/gl/fill_extrusion.hpp", + "include/mbgl/shaders/gl/fill_extrusion_pattern.hpp", "include/mbgl/shaders/gl/heatmap.hpp", + "include/mbgl/shaders/gl/heatmap_texture.hpp", "include/mbgl/shaders/gl/hillshade_prepare.hpp", "include/mbgl/shaders/gl/hillshade.hpp", "include/mbgl/shaders/gl/line_gradient.hpp", "include/mbgl/shaders/gl/line_pattern.hpp", "include/mbgl/shaders/gl/line_sdf.hpp", "include/mbgl/shaders/gl/line.hpp", - "include/mbgl/shaders/gl/prelude.hpp", + "include/mbgl/shaders/gl/location_indicator.hpp", + "include/mbgl/shaders/gl/location_indicator_textured.hpp", "include/mbgl/shaders/gl/raster.hpp", "include/mbgl/shaders/gl/symbol_icon.hpp", - "include/mbgl/shaders/gl/symbol_sdf_text.hpp", - "include/mbgl/shaders/gl/symbol_sdf_icon.hpp", + "include/mbgl/shaders/gl/symbol_sdf.hpp", "include/mbgl/shaders/gl/symbol_text_and_icon.hpp", + "include/mbgl/shaders/gl/wide_vector.hpp", + "include/mbgl/shaders/gl/prelude.hpp", ] MLN_CORE_SOURCE = [ @@ -210,53 +185,14 @@ MLN_CORE_SOURCE = [ "src/mbgl/math/log2.cpp", "src/mbgl/platform/settings.cpp", "src/mbgl/programs/attributes.hpp", - "src/mbgl/programs/background_pattern_program.hpp", - "src/mbgl/programs/background_program.cpp", - "src/mbgl/programs/background_program.hpp", - "src/mbgl/programs/circle_program.cpp", - "src/mbgl/programs/circle_program.hpp", "src/mbgl/programs/clipping_mask_program.cpp", "src/mbgl/programs/clipping_mask_program.hpp", - "src/mbgl/programs/collision_box_program.cpp", - "src/mbgl/programs/collision_box_program.hpp", - "src/mbgl/programs/collision_circle_program.hpp", - "src/mbgl/programs/debug_program.cpp", - "src/mbgl/programs/debug_program.hpp", - "src/mbgl/programs/fill_extrusion_pattern_program.hpp", - "src/mbgl/programs/fill_extrusion_program.cpp", - "src/mbgl/programs/fill_extrusion_program.hpp", - "src/mbgl/programs/fill_outline_pattern_program.hpp", - "src/mbgl/programs/fill_outline_program.hpp", - "src/mbgl/programs/fill_pattern_program.hpp", - "src/mbgl/programs/fill_program.cpp", - "src/mbgl/programs/fill_program.hpp", - "src/mbgl/programs/heatmap_program.cpp", - "src/mbgl/programs/heatmap_program.hpp", - "src/mbgl/programs/heatmap_texture_program.cpp", - "src/mbgl/programs/heatmap_texture_program.hpp", - "src/mbgl/programs/hillshade_prepare_program.cpp", - "src/mbgl/programs/hillshade_prepare_program.hpp", - "src/mbgl/programs/hillshade_program.cpp", - "src/mbgl/programs/hillshade_program.hpp", - "src/mbgl/programs/line_gradient_program.hpp", - "src/mbgl/programs/line_pattern_program.hpp", - "src/mbgl/programs/line_program.cpp", - "src/mbgl/programs/line_program.hpp", - "src/mbgl/programs/line_sdf_program.hpp", "src/mbgl/programs/program.hpp", "src/mbgl/programs/program_parameters.cpp", "src/mbgl/programs/program_parameters.hpp", "src/mbgl/programs/programs.cpp", "src/mbgl/programs/programs.hpp", - "src/mbgl/programs/raster_program.cpp", - "src/mbgl/programs/raster_program.hpp", "src/mbgl/programs/segment.hpp", - "src/mbgl/programs/symbol_icon_program.hpp", - "src/mbgl/programs/symbol_program.cpp", - "src/mbgl/programs/symbol_program.hpp", - "src/mbgl/programs/symbol_sdf_icon_program.hpp", - "src/mbgl/programs/symbol_sdf_text_program.hpp", - "src/mbgl/programs/symbol_text_and_icon_program.hpp", "src/mbgl/programs/textures.hpp", "src/mbgl/programs/uniforms.hpp", "src/mbgl/renderer/backend_scope.cpp", diff --git a/include/mbgl/gfx/fill_generator.hpp b/include/mbgl/gfx/fill_generator.hpp index 6766cf1127eb..fed717ca6998 100644 --- a/include/mbgl/gfx/fill_generator.hpp +++ b/include/mbgl/gfx/fill_generator.hpp @@ -4,8 +4,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace gfx { @@ -14,35 +14,35 @@ namespace gfx { void generateFillBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments); + SegmentVector& fillSegments); /// Generate fill and outline buffers, with the outline composed of line primitives. void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& vertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments); + SegmentVector& lineSegments); /// Generate fill and outline buffers, where the outlines are built with triangle primitives void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::VertexVector& lineVertices, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments); + SegmentVector& lineSegments); /// Generate fill and outline buffers, where the outlines are built both with triangle primitives AND with simple lines void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::VertexVector& lineVertices, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments, + SegmentVector& lineSegments, gfx::IndexVector& basicLineIndexes, - SegmentVector& basicLineSegments); + SegmentVector& basicLineSegments); } // namespace gfx } // namespace mbgl diff --git a/include/mbgl/shaders/gl/background.hpp b/include/mbgl/shaders/gl/background.hpp index cfc19d79246c..9e7e233a1df4 100644 --- a/include/mbgl/shaders/gl/background.hpp +++ b/include/mbgl/shaders/gl/background.hpp @@ -6,21 +6,27 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "BackgroundProgram"; +struct ShaderSource { + static constexpr const char* name = "BackgroundShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -uniform mat4 u_matrix; +layout (std140) uniform BackgroundDrawableUBO { + highp mat4 u_matrix; +}; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); } )"; - static constexpr const char* fragment = R"(uniform vec4 u_color; -uniform float u_opacity; + static constexpr const char* fragment = R"(layout (std140) uniform BackgroundPropsUBO { + highp vec4 u_color; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; void main() { fragColor = u_color * u_opacity; - #ifdef OVERDRAW_INSPECTOR fragColor = vec4(1.0); #endif diff --git a/include/mbgl/shaders/gl/background_pattern.hpp b/include/mbgl/shaders/gl/background_pattern.hpp index bb6dd59682cf..94cacec93d8a 100644 --- a/include/mbgl/shaders/gl/background_pattern.hpp +++ b/include/mbgl/shaders/gl/background_pattern.hpp @@ -6,20 +6,34 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "BackgroundPatternProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_pattern_size_a; -uniform vec2 u_pattern_size_b; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform float u_scale_a; -uniform float u_scale_b; -uniform float u_tile_units_to_pixels; +struct ShaderSource { + static constexpr const char* name = "BackgroundPatternShader"; + static constexpr const char* vertex = R"(layout (std140) uniform BackgroundPatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_units_to_pixels; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; +}; + +layout (std140) uniform BackgroundPatternPropsUBO { + highp vec2 u_pattern_tl_a; + highp vec2 u_pattern_br_a; + highp vec2 u_pattern_tl_b; + highp vec2 u_pattern_br_b; + highp vec2 u_pattern_size_a; + highp vec2 u_pattern_size_b; + highp float u_scale_a; + highp float u_scale_b; + highp float u_mix; + highp float u_opacity; +}; layout (location = 0) in vec2 a_pos; -out vec2 v_pos_a; -out vec2 v_pos_b; +out mediump vec2 v_pos_a; +out mediump vec2 v_pos_b; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); @@ -28,26 +42,43 @@ void main() { v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos); } )"; - static constexpr const char* fragment = R"(uniform vec2 u_pattern_tl_a; -uniform vec2 u_pattern_br_a; -uniform vec2 u_pattern_tl_b; -uniform vec2 u_pattern_br_b; -uniform vec2 u_texsize; -uniform float u_mix; -uniform float u_opacity; + static constexpr const char* fragment = R"(layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform BackgroundPatternPropsUBO { + highp vec2 u_pattern_tl_a; + highp vec2 u_pattern_br_a; + highp vec2 u_pattern_tl_b; + highp vec2 u_pattern_br_b; + highp vec2 u_pattern_size_a; + highp vec2 u_pattern_size_b; + highp float u_scale_a; + highp float u_scale_b; + highp float u_mix; + highp float u_opacity; +}; uniform sampler2D u_image; -in vec2 v_pos_a; -in vec2 v_pos_b; +in mediump vec2 v_pos_a; +in mediump vec2 v_pos_b; void main() { vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord); + vec2 pos = mix(u_pattern_tl_a / u_pattern_atlas_texsize, u_pattern_br_a / u_pattern_atlas_texsize, imagecoord); vec4 color1 = texture(u_image, pos); vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b); + vec2 pos2 = mix(u_pattern_tl_b / u_pattern_atlas_texsize, u_pattern_br_b / u_pattern_atlas_texsize, imagecoord_b); vec4 color2 = texture(u_image, pos2); fragColor = mix(color1, color2, u_mix) * u_opacity; diff --git a/include/mbgl/shaders/gl/circle.hpp b/include/mbgl/shaders/gl/circle.hpp index f02c025894a4..54b0ab20d2c4 100644 --- a/include/mbgl/shaders/gl/circle.hpp +++ b/include/mbgl/shaders/gl/circle.hpp @@ -6,66 +6,79 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "CircleProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform bool u_scale_with_map; -uniform bool u_pitch_with_map; -uniform vec2 u_extrude_scale; -uniform lowp float u_device_pixel_ratio; -uniform highp float u_camera_to_center_distance; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "CircleShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; out vec3 v_data; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CircleDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_extrude_scale; + // Interpolations + lowp float u_color_t; + lowp float u_radius_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_stroke_color_t; + lowp float u_stroke_width_t; + lowp float u_stroke_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; +}; + +layout (std140) uniform CircleEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_stroke_color; + mediump float u_radius; + lowp float u_blur; + lowp float u_opacity; + mediump float u_stroke_width; + lowp float u_stroke_opacity; + bool u_scale_with_map; + bool u_pitch_with_map; + lowp float props_pad1; +}; + #ifndef HAS_UNIFORM_u_color -uniform lowp float u_color_t; layout (location = 1) in highp vec4 a_color; out highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_radius -uniform lowp float u_radius_t; layout (location = 2) in mediump vec2 a_radius; out mediump float radius; -#else -uniform mediump float u_radius; #endif #ifndef HAS_UNIFORM_u_blur -uniform lowp float u_blur_t; layout (location = 3) in lowp vec2 a_blur; out lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 4) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_stroke_color -uniform lowp float u_stroke_color_t; layout (location = 5) in highp vec4 a_stroke_color; out highp vec4 stroke_color; -#else -uniform highp vec4 u_stroke_color; #endif #ifndef HAS_UNIFORM_u_stroke_width -uniform lowp float u_stroke_width_t; layout (location = 6) in mediump vec2 a_stroke_width; out mediump float stroke_width; -#else -uniform mediump float u_stroke_width; #endif #ifndef HAS_UNIFORM_u_stroke_opacity -uniform lowp float u_stroke_opacity_t; layout (location = 7) in lowp vec2 a_stroke_opacity; out lowp float stroke_opacity; -#else -uniform lowp float u_stroke_opacity; #endif void main(void) { @@ -137,47 +150,46 @@ lowp float stroke_opacity = u_stroke_opacity; // This is a minimum blur distance that serves as a faux-antialiasing for // the circle. since blur is a ratio of the circle's size and the intent is // to keep the blur at roughly 1px, the two are inversely related. - lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width); + lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width); v_data = vec3(extrude.x, extrude.y, antialiasblur); } )"; static constexpr const char* fragment = R"(in vec3 v_data; +layout (std140) uniform CircleEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_stroke_color; + mediump float u_radius; + lowp float u_blur; + lowp float u_opacity; + mediump float u_stroke_width; + lowp float u_stroke_opacity; + bool u_scale_with_map; + bool u_pitch_with_map; + lowp float props_pad1; +}; + #ifndef HAS_UNIFORM_u_color in highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_radius in mediump float radius; -#else -uniform mediump float u_radius; #endif #ifndef HAS_UNIFORM_u_blur in lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_stroke_color in highp vec4 stroke_color; -#else -uniform highp vec4 u_stroke_color; #endif #ifndef HAS_UNIFORM_u_stroke_width in mediump float stroke_width; -#else -uniform mediump float u_stroke_width; #endif #ifndef HAS_UNIFORM_u_stroke_opacity in lowp float stroke_opacity; -#else -uniform lowp float u_stroke_opacity; #endif void main() { diff --git a/include/mbgl/shaders/gl/collision_box.hpp b/include/mbgl/shaders/gl/collision_box.hpp index 526af7baf804..00f653e304e3 100644 --- a/include/mbgl/shaders/gl/collision_box.hpp +++ b/include/mbgl/shaders/gl/collision_box.hpp @@ -6,17 +6,35 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "CollisionBoxProgram"; +struct ShaderSource { + static constexpr const char* name = "CollisionBoxShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_anchor_pos; layout (location = 2) in vec2 a_extrude; layout (location = 3) in vec2 a_placed; layout (location = 4) in vec2 a_shift; -uniform mat4 u_matrix; -uniform vec2 u_extrude_scale; -uniform float u_camera_to_center_distance; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; out float v_placed; out float v_notUsed; @@ -36,8 +54,7 @@ void main() { v_notUsed = a_placed.y; } )"; - static constexpr const char* fragment = R"( -in float v_placed; + static constexpr const char* fragment = R"(in float v_placed; in float v_notUsed; void main() { @@ -56,7 +73,8 @@ void main() { // This box not used, fade it out fragColor *= .1; } -})"; +} +)"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/collision_circle.hpp b/include/mbgl/shaders/gl/collision_circle.hpp index 05a5217d966b..437692d803b1 100644 --- a/include/mbgl/shaders/gl/collision_circle.hpp +++ b/include/mbgl/shaders/gl/collision_circle.hpp @@ -6,16 +6,34 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "CollisionCircleProgram"; +struct ShaderSource { + static constexpr const char* name = "CollisionCircleShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_anchor_pos; layout (location = 2) in vec2 a_extrude; layout (location = 3) in vec2 a_placed; -uniform mat4 u_matrix; -uniform vec2 u_extrude_scale; -uniform float u_camera_to_center_distance; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; out float v_placed; out float v_notUsed; @@ -44,7 +62,23 @@ void main() { v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio; } )"; - static constexpr const char* fragment = R"(uniform float u_overscale_factor; + static constexpr const char* fragment = R"(layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; in float v_placed; in float v_notUsed; diff --git a/include/mbgl/shaders/gl/drawable_custom_geometry.hpp b/include/mbgl/shaders/gl/custom_geometry.hpp similarity index 98% rename from include/mbgl/shaders/gl/drawable_custom_geometry.hpp rename to include/mbgl/shaders/gl/custom_geometry.hpp index cd4ad682051d..6c1c8082febf 100644 --- a/include/mbgl/shaders/gl/drawable_custom_geometry.hpp +++ b/include/mbgl/shaders/gl/custom_geometry.hpp @@ -21,7 +21,8 @@ out vec2 frag_uv; void main() { frag_uv = a_uv; gl_Position = u_matrix * vec4(a_pos, 1.0); -})"; +} +)"; static constexpr const char* fragment = R"(layout (std140) uniform CustomGeometryDrawableUBO { mat4 u_matrix; vec4 u_color; @@ -32,7 +33,8 @@ uniform sampler2D u_image; void main() { fragColor = texture(u_image, frag_uv) * u_color; -})"; +} +)"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp b/include/mbgl/shaders/gl/custom_symbol_icon.hpp similarity index 100% rename from include/mbgl/shaders/gl/drawable_custom_symbol_icon.hpp rename to include/mbgl/shaders/gl/custom_symbol_icon.hpp diff --git a/include/mbgl/shaders/gl/debug.hpp b/include/mbgl/shaders/gl/debug.hpp index 4c0ef97adcf2..c0782a655314 100644 --- a/include/mbgl/shaders/gl/debug.hpp +++ b/include/mbgl/shaders/gl/debug.hpp @@ -6,13 +6,19 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "DebugProgram"; +struct ShaderSource { + static constexpr const char* name = "DebugShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; out vec2 v_uv; -uniform mat4 u_matrix; -uniform float u_overlay_scale; +layout (std140) uniform DebugUBO { + highp mat4 u_matrix; + highp vec4 u_color; + highp float u_overlay_scale; + lowp float pad1; + lowp float pad2; + lowp float pad3; +}; void main() { // This vertex shader expects a EXTENT x EXTENT quad, @@ -21,7 +27,15 @@ void main() { gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, 0, 1); } )"; - static constexpr const char* fragment = R"(uniform highp vec4 u_color; + static constexpr const char* fragment = R"(layout (std140) uniform DebugUBO { + highp mat4 u_matrix; + highp vec4 u_color; + highp float u_overlay_scale; + lowp float pad1; + lowp float pad2; + lowp float pad3; +}; + uniform sampler2D u_overlay; in vec2 v_uv; diff --git a/include/mbgl/shaders/gl/drawable_background.hpp b/include/mbgl/shaders/gl/drawable_background.hpp deleted file mode 100644 index 9e7e233a1df4..000000000000 --- a/include/mbgl/shaders/gl/drawable_background.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "BackgroundShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (std140) uniform BackgroundDrawableUBO { - highp mat4 u_matrix; -}; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform BackgroundPropsUBO { - highp vec4 u_color; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - fragColor = u_color * u_opacity; -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_background_pattern.hpp b/include/mbgl/shaders/gl/drawable_background_pattern.hpp deleted file mode 100644 index 94cacec93d8a..000000000000 --- a/include/mbgl/shaders/gl/drawable_background_pattern.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "BackgroundPatternShader"; - static constexpr const char* vertex = R"(layout (std140) uniform BackgroundPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_units_to_pixels; - lowp float drawable_pad1; - lowp float drawable_pad2; - lowp float drawable_pad3; -}; - -layout (std140) uniform BackgroundPatternPropsUBO { - highp vec2 u_pattern_tl_a; - highp vec2 u_pattern_br_a; - highp vec2 u_pattern_tl_b; - highp vec2 u_pattern_br_b; - highp vec2 u_pattern_size_a; - highp vec2 u_pattern_size_b; - highp float u_scale_a; - highp float u_scale_b; - highp float u_mix; - highp float u_opacity; -}; - -layout (location = 0) in vec2 a_pos; -out mediump vec2 v_pos_a; -out mediump vec2 v_pos_b; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform BackgroundPatternPropsUBO { - highp vec2 u_pattern_tl_a; - highp vec2 u_pattern_br_a; - highp vec2 u_pattern_tl_b; - highp vec2 u_pattern_br_b; - highp vec2 u_pattern_size_a; - highp vec2 u_pattern_size_b; - highp float u_scale_a; - highp float u_scale_b; - highp float u_mix; - highp float u_opacity; -}; - -uniform sampler2D u_image; - -in mediump vec2 v_pos_a; -in mediump vec2 v_pos_b; - -void main() { - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a / u_pattern_atlas_texsize, u_pattern_br_a / u_pattern_atlas_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b / u_pattern_atlas_texsize, u_pattern_br_b / u_pattern_atlas_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - fragColor = mix(color1, color2, u_mix) * u_opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_circle.hpp b/include/mbgl/shaders/gl/drawable_circle.hpp deleted file mode 100644 index 54b0ab20d2c4..000000000000 --- a/include/mbgl/shaders/gl/drawable_circle.hpp +++ /dev/null @@ -1,242 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "CircleShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -out vec3 v_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CircleDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_extrude_scale; - // Interpolations - lowp float u_color_t; - lowp float u_radius_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_stroke_color_t; - lowp float u_stroke_width_t; - lowp float u_stroke_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; - lowp float drawable_pad3; -}; - -layout (std140) uniform CircleEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_stroke_color; - mediump float u_radius; - lowp float u_blur; - lowp float u_opacity; - mediump float u_stroke_width; - lowp float u_stroke_opacity; - bool u_scale_with_map; - bool u_pitch_with_map; - lowp float props_pad1; -}; - -#ifndef HAS_UNIFORM_u_color -layout (location = 1) in highp vec4 a_color; -out highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_radius -layout (location = 2) in mediump vec2 a_radius; -out mediump float radius; -#endif -#ifndef HAS_UNIFORM_u_blur -layout (location = 3) in lowp vec2 a_blur; -out lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 4) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_stroke_color -layout (location = 5) in highp vec4 a_stroke_color; -out highp vec4 stroke_color; -#endif -#ifndef HAS_UNIFORM_u_stroke_width -layout (location = 6) in mediump vec2 a_stroke_width; -out mediump float stroke_width; -#endif -#ifndef HAS_UNIFORM_u_stroke_opacity -layout (location = 7) in lowp vec2 a_stroke_opacity; -out lowp float stroke_opacity; -#endif - -void main(void) { - #ifndef HAS_UNIFORM_u_color -color = unpack_mix_color(a_color, u_color_t); -#else -highp vec4 color = u_color; -#endif - #ifndef HAS_UNIFORM_u_radius -radius = unpack_mix_vec2(a_radius, u_radius_t); -#else -mediump float radius = u_radius; -#endif - #ifndef HAS_UNIFORM_u_blur -blur = unpack_mix_vec2(a_blur, u_blur_t); -#else -lowp float blur = u_blur; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_stroke_color -stroke_color = unpack_mix_color(a_stroke_color, u_stroke_color_t); -#else -highp vec4 stroke_color = u_stroke_color; -#endif - #ifndef HAS_UNIFORM_u_stroke_width -stroke_width = unpack_mix_vec2(a_stroke_width, u_stroke_width_t); -#else -mediump float stroke_width = u_stroke_width; -#endif - #ifndef HAS_UNIFORM_u_stroke_opacity -stroke_opacity = unpack_mix_vec2(a_stroke_opacity, u_stroke_opacity_t); -#else -lowp float stroke_opacity = u_stroke_opacity; -#endif - - // unencode the extrusion vector that we snuck into the a_pos vector - vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0); - - // multiply a_pos by 0.5, since we had it * 2 in order to sneak - // in extrusion data - vec2 circle_center = floor(a_pos * 0.5); - if (u_pitch_with_map) { - vec2 corner_position = circle_center; - if (u_scale_with_map) { - corner_position += extrude * (radius + stroke_width) * u_extrude_scale; - } else { - // Pitching the circle with the map effectively scales it with the map - // To counteract the effect for pitch-scale: viewport, we rescale the - // whole circle based on the pitch scaling effect at its central point - vec4 projected_center = u_matrix * vec4(circle_center, 0, 1); - corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance); - } - - gl_Position = u_matrix * vec4(corner_position, 0, 1); - } else { - gl_Position = u_matrix * vec4(circle_center, 0, 1); - - if (u_scale_with_map) { - gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance; - } else { - gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w; - } - } - - // This is a minimum blur distance that serves as a faux-antialiasing for - // the circle. since blur is a ratio of the circle's size and the intent is - // to keep the blur at roughly 1px, the two are inversely related. - lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width); - - v_data = vec3(extrude.x, extrude.y, antialiasblur); -} -)"; - static constexpr const char* fragment = R"(in vec3 v_data; - -layout (std140) uniform CircleEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_stroke_color; - mediump float u_radius; - lowp float u_blur; - lowp float u_opacity; - mediump float u_stroke_width; - lowp float u_stroke_opacity; - bool u_scale_with_map; - bool u_pitch_with_map; - lowp float props_pad1; -}; - -#ifndef HAS_UNIFORM_u_color -in highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_radius -in mediump float radius; -#endif -#ifndef HAS_UNIFORM_u_blur -in lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_stroke_color -in highp vec4 stroke_color; -#endif -#ifndef HAS_UNIFORM_u_stroke_width -in mediump float stroke_width; -#endif -#ifndef HAS_UNIFORM_u_stroke_opacity -in lowp float stroke_opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_color -highp vec4 color = u_color; -#endif - #ifdef HAS_UNIFORM_u_radius -mediump float radius = u_radius; -#endif - #ifdef HAS_UNIFORM_u_blur -lowp float blur = u_blur; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_stroke_color -highp vec4 stroke_color = u_stroke_color; -#endif - #ifdef HAS_UNIFORM_u_stroke_width -mediump float stroke_width = u_stroke_width; -#endif - #ifdef HAS_UNIFORM_u_stroke_opacity -lowp float stroke_opacity = u_stroke_opacity; -#endif - - vec2 extrude = v_data.xy; - float extrude_length = length(extrude); - - lowp float antialiasblur = v_data.z; - float antialiased_blur = -max(blur, antialiasblur); - - float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0); - - float color_t = stroke_width < 0.01 ? 0.0 : smoothstep( - antialiased_blur, - 0.0, - extrude_length - radius / (radius + stroke_width) - ); - - fragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_collision_box.hpp b/include/mbgl/shaders/gl/drawable_collision_box.hpp deleted file mode 100644 index 6be0126ab252..000000000000 --- a/include/mbgl/shaders/gl/drawable_collision_box.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "CollisionBoxShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_anchor_pos; -layout (location = 2) in vec2 a_extrude; -layout (location = 3) in vec2 a_placed; -layout (location = 4) in vec2 a_shift; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -out float v_placed; -out float v_notUsed; - -void main() { - vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - highp float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles - 4.0); - - gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); - gl_Position.xy += (a_extrude + a_shift) * u_extrude_scale * gl_Position.w * collision_perspective_ratio; - - v_placed = a_placed.x; - v_notUsed = a_placed.y; -} -)"; - static constexpr const char* fragment = R"(in float v_placed; -in float v_notUsed; - -void main() { - - float alpha = 0.5; - - // Red = collision, hide label - fragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (v_placed > 0.5) { - fragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (v_notUsed > 0.5) { - // This box not used, fade it out - fragColor *= .1; - } -})"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_collision_circle.hpp b/include/mbgl/shaders/gl/drawable_collision_circle.hpp deleted file mode 100644 index 437692d803b1..000000000000 --- a/include/mbgl/shaders/gl/drawable_collision_circle.hpp +++ /dev/null @@ -1,119 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "CollisionCircleShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_anchor_pos; -layout (location = 2) in vec2 a_extrude; -layout (location = 3) in vec2 a_placed; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -out float v_placed; -out float v_notUsed; -out float v_radius; -out highp vec2 v_extrude; -out vec2 v_extrude_scale; - -void main() { - vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - highp float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles - 4.0); - - gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); - - highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur - gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio; - - v_placed = a_placed.x; - v_notUsed = a_placed.y; - v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius - - v_extrude = a_extrude * padding_factor; - v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio; -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -in float v_placed; -in float v_notUsed; -in float v_radius; -in highp vec2 v_extrude; -in vec2 v_extrude_scale; - -void main() { - float alpha = 0.5; - - // Red = collision, hide label - vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (v_placed > 0.5) { - color = vec4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (v_notUsed > 0.5) { - // This box not used, fade it out - color *= .2; - } - - float extrude_scale_length = length(v_extrude_scale); - float extrude_length = length(v_extrude) * extrude_scale_length; - float stroke_width = 15.0 * extrude_scale_length / u_overscale_factor; - float radius = v_radius * extrude_scale_length; - - float distance_to_edge = abs(extrude_length - radius); - float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge); - - fragColor = opacity_t * color; -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_debug.hpp b/include/mbgl/shaders/gl/drawable_debug.hpp deleted file mode 100644 index c0782a655314..000000000000 --- a/include/mbgl/shaders/gl/drawable_debug.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "DebugShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -out vec2 v_uv; - -layout (std140) uniform DebugUBO { - highp mat4 u_matrix; - highp vec4 u_color; - highp float u_overlay_scale; - lowp float pad1; - lowp float pad2; - lowp float pad3; -}; - -void main() { - // This vertex shader expects a EXTENT x EXTENT quad, - // The UV co-ordinates for the overlay texture can be calculated using that knowledge - v_uv = a_pos / 8192.0; - gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, 0, 1); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform DebugUBO { - highp mat4 u_matrix; - highp vec4 u_color; - highp float u_overlay_scale; - lowp float pad1; - lowp float pad2; - lowp float pad3; -}; - -uniform sampler2D u_overlay; - -in vec2 v_uv; - -void main() { - vec4 overlay_color = texture(u_overlay, v_uv); - fragColor = mix(u_color, overlay_color, overlay_color.a); -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill.hpp b/include/mbgl/shaders/gl/drawable_fill.hpp deleted file mode 100644 index 58e2ab57bd5b..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillShader"; - static constexpr const char* vertex = R"(layout (std140) uniform FillDrawableUBO { - highp mat4 u_matrix; - // Interpolations - highp float u_color_t; - highp float u_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -#ifndef HAS_UNIFORM_u_color -layout (location = 1) in highp vec4 a_color; -out highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 2) in lowp vec2 a_opacity; -out lowp float opacity; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_color -color = unpack_mix_color(a_color, u_color_t); -#else -highp vec4 color = u_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - - gl_Position = u_matrix * vec4(a_pos, 0, 1); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -#ifndef HAS_UNIFORM_u_color -in highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_color -highp vec4 color = u_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - fragColor = color * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp b/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp deleted file mode 100644 index 10a7d912fb95..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill_extrusion.hpp +++ /dev/null @@ -1,139 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec4 a_normal_ed; -out vec4 v_color; - -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; - // Interpolations - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -#ifndef HAS_UNIFORM_u_base -layout (location = 2) in highp vec2 a_base; -#endif -#ifndef HAS_UNIFORM_u_height -layout (location = 3) in highp vec2 a_height; -#endif -#ifndef HAS_UNIFORM_u_color -layout (location = 4) in highp vec4 a_color; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_base -highp float base = unpack_mix_vec2(a_base, u_base_t); -#else -highp float base = u_base; -#endif - #ifndef HAS_UNIFORM_u_height -highp float height = unpack_mix_vec2(a_height, u_height_t); -#else -highp float height = u_height; -#endif - #ifndef HAS_UNIFORM_u_color -highp vec4 color = unpack_mix_color(a_color, u_color_t); -#else -highp vec4 color = u_color; -#endif - - vec3 normal = a_normal_ed.xyz; - - base = max(0.0, base); - height = max(0.0, height); - - float t = mod(normal.x, 2.0); - - gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1); - - // Relative luminance (how dark/bright is the surface color?) - float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; - - v_color = vec4(0.0, 0.0, 0.0, 1.0); - - // Add slight ambient lighting so no extrusions are totally black - vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0); - color += ambientlight; - - // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray - float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0); - - // Adjust directional so that - // the range of values for highlight/shading is narrower - // with lower light intensity - // and with lighter/brighter surface colors - directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional); - - // Add gradient along z axis of side surfaces - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - u_vertical_gradient) + - (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0))); - } - - // Assign final color based on surface + ambient light color, diffuse light directional, and light color - // with lower bounds adjusted to hue of light - // so that shading is tinted with the complementary (opposite) color to the light color - v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0); - v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0); - v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0); - v_color *= u_opacity; -} -)"; - static constexpr const char* fragment = R"(in vec4 v_color; - -void main() { - fragColor = v_color; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp b/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp deleted file mode 100644 index 11f7e40c42e8..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill_extrusion_pattern.hpp +++ /dev/null @@ -1,237 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionPatternShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec4 a_normal_ed; - -out vec2 v_pos_a; -out vec2 v_pos_b; -out vec4 v_lighting; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; - // Interpolations - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -#ifndef HAS_UNIFORM_u_base -layout (location = 2) in lowp vec2 a_base; -out lowp float base; -#endif -#ifndef HAS_UNIFORM_u_height -layout (location = 3) in lowp vec2 a_height; -out lowp float height; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -layout (location = 4) in mediump vec4 a_pattern_from; -out mediump vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -layout (location = 5) in mediump vec4 a_pattern_to; -out mediump vec4 pattern_to; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_base -base = unpack_mix_vec2(a_base, u_base_t); -#else -lowp float base = u_base; -#endif - #ifndef HAS_UNIFORM_u_height -height = unpack_mix_vec2(a_height, u_height_t); -#else -lowp float height = u_height; -#endif - #ifndef HAS_UNIFORM_u_pattern_from -pattern_from = a_pattern_from; -#else -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifndef HAS_UNIFORM_u_pattern_to -pattern_to = a_pattern_to; -#else -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - vec3 normal = a_normal_ed.xyz; - float edgedistance = a_normal_ed.w; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - base = max(0.0, base); - height = max(0.0, height); - - float t = mod(normal.x, 2.0); - float z = t > 0.0 ? height : base; - - gl_Position = u_matrix * vec4(a_pos, z, 1); - - vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 - ? a_pos // extrusion top - : vec2(edgedistance, z * u_height_factor); // extrusion side - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos); - - v_lighting = vec4(0.0, 0.0, 0.0, 1.0); - float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0); - directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional); - - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - u_vertical_gradient) + - (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0))); - } - - v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0)); - v_lighting *= u_opacity; -} -)"; - static constexpr const char* fragment = R"(in vec2 v_pos_a; -in vec2 v_pos_b; -in vec4 v_lighting; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -#ifndef HAS_UNIFORM_u_base -in lowp float base; -#endif -#ifndef HAS_UNIFORM_u_height -in lowp float height; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -in mediump vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -in mediump vec4 pattern_to; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_base -lowp float base = u_base; -#endif - #ifdef HAS_UNIFORM_u_height -lowp float height = u_height; -#endif - #ifdef HAS_UNIFORM_u_pattern_from -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifdef HAS_UNIFORM_u_pattern_to -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - vec4 mixedColor = mix(color1, color2, u_fade); - - fragColor = mixedColor * v_lighting; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill_outline.hpp b/include/mbgl/shaders/gl/drawable_fill_outline.hpp deleted file mode 100644 index ae157ae5f4bf..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill_outline.hpp +++ /dev/null @@ -1,108 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillOutlineShader"; - static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillOutlineDrawableUBO { - highp mat4 u_matrix; - // Interpolations - highp float u_outline_color_t; - highp float u_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos; - -#ifndef HAS_UNIFORM_u_outline_color -layout (location = 1) in highp vec4 a_outline_color; -out highp vec4 outline_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 2) in lowp vec2 a_opacity; -out lowp float opacity; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_outline_color -outline_color = unpack_mix_color(a_outline_color, u_outline_color_t); -#else -highp vec4 outline_color = u_outline_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - - gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -in vec2 v_pos; - -#ifndef HAS_UNIFORM_u_outline_color -in highp vec4 outline_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_outline_color -highp vec4 outline_color = u_outline_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - float dist = length(v_pos - gl_FragCoord.xy); - float alpha = 1.0 - smoothstep(0.0, 1.0, dist); - fragColor = outline_color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp b/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp deleted file mode 100644 index f197a56318f6..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill_outline_pattern.hpp +++ /dev/null @@ -1,181 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillOutlinePatternShader"; - static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillOutlinePatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_ratio; - // Interpolations - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; -}; - -layout (std140) uniform FillOutlinePatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos_a; -out vec2 v_pos_b; -out vec2 v_pos; - -#ifndef HAS_UNIFORM_u_opacity -layout (location = 1) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -layout (location = 2) in lowp vec4 a_pattern_from; -out lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -layout (location = 3) in lowp vec4 a_pattern_to; -out lowp vec4 pattern_to; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_pattern_from -pattern_from = a_pattern_from; -#else -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifndef HAS_UNIFORM_u_pattern_to -pattern_to = a_pattern_to; -#else -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos); - - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform FillOutlinePatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -uniform sampler2D u_image; - -in vec2 v_pos_a; -in vec2 v_pos_b; -in vec2 v_pos; - -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -in lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -in lowp vec4 pattern_to; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_pattern_from -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifdef HAS_UNIFORM_u_pattern_to -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - // find distance to outline for alpha interpolation - - float dist = length(v_pos - gl_FragCoord.xy); - float alpha = 1.0 - smoothstep(0.0, 1.0, dist); - - - fragColor = mix(color1, color2, u_fade) * alpha * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_fill_pattern.hpp b/include/mbgl/shaders/gl/drawable_fill_pattern.hpp deleted file mode 100644 index fecf17edad22..000000000000 --- a/include/mbgl/shaders/gl/drawable_fill_pattern.hpp +++ /dev/null @@ -1,174 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "FillPatternShader"; - static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_ratio; - // Interpolations - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; -}; - -layout (std140) uniform FillPatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos_a; -out vec2 v_pos_b; - -#ifndef HAS_UNIFORM_u_opacity -layout (location = 1) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -layout (location = 2) in lowp vec4 a_pattern_from; -out lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -layout (location = 3) in lowp vec4 a_pattern_to; -out lowp vec4 pattern_to; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_pattern_from -pattern_from = a_pattern_from; -#else -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifndef HAS_UNIFORM_u_pattern_to -pattern_to = a_pattern_to; -#else -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileZoomRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform FillPatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -uniform sampler2D u_image; - -in vec2 v_pos_a; -in vec2 v_pos_b; - -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -in lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -in lowp vec4 pattern_to; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_pattern_from -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifdef HAS_UNIFORM_u_pattern_to -mediump vec4 pattern_to = u_pattern_to; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - if (u_texsize.x < 1.0 || u_texsize.y < 1.0) { - discard; - } - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - fragColor = mix(color1, color2, u_fade) * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_heatmap.hpp b/include/mbgl/shaders/gl/drawable_heatmap.hpp deleted file mode 100644 index 9b93c798e12b..000000000000 --- a/include/mbgl/shaders/gl/drawable_heatmap.hpp +++ /dev/null @@ -1,123 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "HeatmapShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -out vec2 v_extrude; - -layout (std140) uniform HeatmapDrawableUBO { - highp mat4 u_matrix; - highp float u_extrude_scale; - // Interpolations - lowp float u_weight_t; - lowp float u_radius_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform HeatmapEvaluatedPropsUBO { - highp float u_weight; - highp float u_radius; - highp float u_intensity; - lowp float props_pad1; -}; - -#ifndef HAS_UNIFORM_u_weight -layout (location = 1) in highp vec2 a_weight; -out highp float weight; -#endif -#ifndef HAS_UNIFORM_u_radius -layout (location = 2) in mediump vec2 a_radius; -#endif - -// Effective "0" in the kernel density texture to adjust the kernel size to; -// this empirically chosen number minimizes artifacts on overlapping kernels -// for typical heatmap cases (assuming clustered source) -const highp float ZERO = 1.0 / 255.0 / 16.0; - -// Gaussian kernel coefficient: 1 / sqrt(2 * PI) -#define GAUSS_COEF 0.3989422804014327 - -void main(void) { - #ifndef HAS_UNIFORM_u_weight -weight = unpack_mix_vec2(a_weight, u_weight_t); -#else -highp float weight = u_weight; -#endif - #ifndef HAS_UNIFORM_u_radius -mediump float radius = unpack_mix_vec2(a_radius, u_radius_t); -#else -mediump float radius = u_radius; -#endif - - // unencode the extrusion vector that we snuck into the a_pos vector - vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0); - - // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use - // it to produce the vertices of a square mesh framing the point feature - // we're adding to the kernel density texture. We'll also pass it as - // a varying, so that the fragment shader can determine the distance of - // each fragment from the point feature. - // Before we do so, we need to scale it up sufficiently so that the - // kernel falls effectively to zero at the edge of the mesh. - // That is, we want to know S such that - // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO - // Which solves to: - // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0 - float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0; - - // Pass the varying in units of radius - v_extrude = S * unscaled_extrude; - - // Scale by radius and the zoom-based scale factor to produce actual - // mesh position - vec2 extrude = v_extrude * radius * u_extrude_scale; - - // multiply a_pos by 0.5, since we had it * 2 in order to sneak - // in extrusion data - vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1); - - gl_Position = u_matrix * pos; -} -)"; - static constexpr const char* fragment = R"(in vec2 v_extrude; - -layout (std140) uniform HeatmapEvaluatedPropsUBO { - highp float u_weight; - highp float u_radius; - highp float u_intensity; - lowp float props_pad1; -}; - -#ifndef HAS_UNIFORM_u_weight -in highp float weight; -#endif - -// Gaussian kernel coefficient: 1 / sqrt(2 * PI) -#define GAUSS_COEF 0.3989422804014327 - -void main() { - #ifdef HAS_UNIFORM_u_weight -highp float weight = u_weight; -#endif - - // Kernel density estimation with a Gaussian kernel of size 5x5 - float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude); - float val = weight * u_intensity * GAUSS_COEF * exp(d); - - fragColor = vec4(val, 1.0, 1.0, 1.0); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp b/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp deleted file mode 100644 index 19317a2d6c61..000000000000 --- a/include/mbgl/shaders/gl/drawable_heatmap_texture.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "HeatmapTextureShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -out vec2 v_pos; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform HeatmapTexturePropsUBO { - highp mat4 u_matrix; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - gl_Position = u_matrix * vec4(a_pos * u_world_size, 0, 1); - - v_pos.x = a_pos.x; - v_pos.y = 1.0 - a_pos.y; -} -)"; - static constexpr const char* fragment = R"(in vec2 v_pos; -uniform sampler2D u_image; -uniform sampler2D u_color_ramp; - -layout (std140) uniform HeatmapTexturePropsUBO { - highp mat4 u_matrix; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - float t = texture(u_image, v_pos).r; - vec4 color = texture(u_color_ramp, vec2(t, 0.5)); - fragColor = color * u_opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(0.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_hillshade.hpp b/include/mbgl/shaders/gl/drawable_hillshade.hpp deleted file mode 100644 index 8d186538040b..000000000000 --- a/include/mbgl/shaders/gl/drawable_hillshade.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "HillshadeShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -layout (std140) uniform HillshadeDrawableUBO { - highp mat4 u_matrix; -}; - -out vec2 v_pos; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = a_texture_pos / 8192.0; -} -)"; - static constexpr const char* fragment = R"(in vec2 v_pos; -uniform sampler2D u_image; - -layout (std140) uniform HillshadeTilePropsUBO { - highp vec2 u_latrange; - highp vec2 u_light; -}; - -layout (std140) uniform HillshadeEvaluatedPropsUBO { - highp vec4 u_highlight; - highp vec4 u_shadow; - highp vec4 u_accent; -}; - -#define PI 3.141592653589793 - -void main() { - vec4 pixel = texture(u_image, v_pos); - - vec2 deriv = ((pixel.rg * 2.0) - 1.0); - - // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude - // to account for mercator projection distortion. see #4807 for details - float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1])); - // We also multiply the slope by an arbitrary z-factor of 1.25 - float slope = atan(1.25 * length(deriv) / scaleFactor); - float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0); - - float intensity = u_light.x; - // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal - // position property to account for 0deg corresponding to north/the top of the viewport in the style spec - // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal. - float azimuth = u_light.y + PI; - - // We scale the slope exponentially based on intensity, using a calculation similar to - // the exponential interpolation function in the style spec: - // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228 - // so that higher intensity values create more opaque hillshading. - float base = 1.875 - intensity * 1.75; - float maxValue = 0.5 * PI; - float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope; - - // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine - // so that the accent color's rate of change eases in while the shade color's eases out. - float accent = cos(scaledSlope); - // We multiply both the accent and shade color by a clamped intensity value - // so that intensities >= 0.5 do not additionally affect the color values - // while intensity values < 0.5 make the overall color more transparent. - vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0); - float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0); - vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0); - fragColor = accent_color * (1.0 - shade_color.a) + shade_color; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp b/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp deleted file mode 100644 index 2a2bf01b5334..000000000000 --- a/include/mbgl/shaders/gl/drawable_hillshade_prepare.hpp +++ /dev/null @@ -1,116 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "HillshadePrepareShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -layout (std140) uniform HillshadePrepareDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform HillshadePrepareTilePropsUBO { - highp vec4 u_unpack; - highp vec2 u_dimension; - highp float u_zoom; - highp float u_maxzoom; -}; - -out vec2 v_pos; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - highp vec2 epsilon = 1.0 / u_dimension; - float scale = (u_dimension.x - 2.0) / u_dimension.x; - v_pos = (a_texture_pos / 8192.0) * scale + epsilon; -} -)"; - static constexpr const char* fragment = R"(#ifdef GL_ES -precision highp float; -#endif - -in vec2 v_pos; -uniform sampler2D u_image; - -layout (std140) uniform HillshadePrepareTilePropsUBO { - highp vec4 u_unpack; - highp vec2 u_dimension; - highp float u_zoom; - highp float u_maxzoom; -}; - -float getElevation(vec2 coord, float bias) { - // Convert encoded elevation value to meters - vec4 data = texture(u_image, coord) * 255.0; - data.a = -1.0; - return dot(data, u_unpack) / 4.0; -} - -void main() { - vec2 epsilon = 1.0 / u_dimension; - - // queried pixels: - // +-----------+ - // | | | | - // | a | b | c | - // | | | | - // +-----------+ - // | | | | - // | d | e | f | - // | | | | - // +-----------+ - // | | | | - // | g | h | i | - // | | | | - // +-----------+ - - float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0); - float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0); - float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0); - float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0); - //float e = getElevation(v_pos, 0.0); - float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0); - float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0); - float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0); - float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0); - - // here we divide the x and y slopes by 8 * pixel size - // where pixel size (aka meters/pixel) is: - // circumference of the world / (pixels per tile * number of tiles) - // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom)) - // which can be reduced to: pow(2, 19.25619978527 - u_zoom) - // we want to vertically exaggerate the hillshading though, because otherwise - // it is barely noticeable at low zooms. to do this, we multiply this by some - // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value - // Here we use a=0.3 which works out to the expression below. see - // nickidlugash's awesome breakdown for more info - // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556 - float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3; - - vec2 deriv = vec2( - (c + f + f + i) - (a + d + d + g), - (g + h + h + i) - (a + b + b + c) - ) / pow(2.0, (u_zoom - u_maxzoom) * exaggeration + 19.2562 - u_zoom); - - fragColor = clamp(vec4( - deriv.x / 2.0 + 0.5, - deriv.y / 2.0 + 0.5, - 1.0, - 1.0), 0.0, 1.0); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_line.hpp b/include/mbgl/shaders/gl/drawable_line.hpp deleted file mode 100644 index 1f0935817825..000000000000 --- a/include/mbgl/shaders/gl/drawable_line.hpp +++ /dev/null @@ -1,224 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "LineShader"; - static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_gamma_scale; -out highp float v_linesofar; - -#ifndef HAS_UNIFORM_u_color -layout (location = 2) in highp vec4 a_color; -out highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_blur -layout (location = 3) in lowp vec2 a_blur; -out lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 4) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_gapwidth -layout (location = 5) in mediump vec2 a_gapwidth; -#endif -#ifndef HAS_UNIFORM_u_offset -layout (location = 6) in lowp vec2 a_offset; -#endif -#ifndef HAS_UNIFORM_u_width -layout (location = 7) in mediump vec2 a_width; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_color -color = unpack_mix_color(a_color, u_color_t); -#else -highp vec4 color = u_color; -#endif - #ifndef HAS_UNIFORM_u_blur -blur = unpack_mix_vec2(a_blur, u_blur_t); -#else -lowp float blur = u_blur; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_gapwidth -mediump float gapwidth = unpack_mix_vec2(a_gapwidth, u_gapwidth_t); -#else -mediump float gapwidth = u_gapwidth; -#endif - #ifndef HAS_UNIFORM_u_offset -lowp float offset = unpack_mix_vec2(a_offset, u_offset_t); -#else -lowp float offset = u_offset; -#endif - #ifndef HAS_UNIFORM_u_width -mediump float width = unpack_mix_vec2(a_width, u_width_t); -#else -mediump float width = u_width; -#endif - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - - v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_width2 = vec2(outset, inset); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -in vec2 v_width2; -in vec2 v_normal; -in float v_gamma_scale; - -#ifndef HAS_UNIFORM_u_color -in highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_blur -in lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_color -highp vec4 color = u_color; -#endif - #ifdef HAS_UNIFORM_u_blur -lowp float blur = u_blur; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_line_gradient.hpp b/include/mbgl/shaders/gl/drawable_line_gradient.hpp deleted file mode 100644 index c77e020c44ab..000000000000 --- a/include/mbgl/shaders/gl/drawable_line_gradient.hpp +++ /dev/null @@ -1,220 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "LineGradientShader"; - static constexpr const char* vertex = R"( -// the attribute conveying progress along a line is scaled to [0, 2^15) -#define MAX_LINE_DISTANCE 32767.0 - -// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineGradientDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_gamma_scale; -out highp float v_lineprogress; - -#ifndef HAS_UNIFORM_u_blur -layout (location = 2) in lowp vec2 a_blur; -out lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 3) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_gapwidth -layout (location = 4) in mediump vec2 a_gapwidth; -#endif -#ifndef HAS_UNIFORM_u_offset -layout (location = 5) in lowp vec2 a_offset; -#endif -#ifndef HAS_UNIFORM_u_width -layout (location = 6) in mediump vec2 a_width; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_blur -blur = unpack_mix_vec2(a_blur, u_blur_t); -#else -lowp float blur = u_blur; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_gapwidth -mediump float gapwidth = unpack_mix_vec2(a_gapwidth, u_gapwidth_t); -#else -mediump float gapwidth = u_gapwidth; -#endif - #ifndef HAS_UNIFORM_u_offset -lowp float offset = unpack_mix_vec2(a_offset, u_offset_t); -#else -lowp float offset = u_offset; -#endif - #ifndef HAS_UNIFORM_u_width -mediump float width = unpack_mix_vec2(a_width, u_width_t); -#else -mediump float width = u_width; -#endif - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - - v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_width2 = vec2(outset, inset); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_width2; -in vec2 v_normal; -in float v_gamma_scale; -in highp float v_lineprogress; - -#ifndef HAS_UNIFORM_u_blur -in lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_blur -lowp float blur = u_blur; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - // For gradient lines, v_lineprogress is the ratio along the entire line, - // scaled to [0, 2^15), and the gradient ramp is stored in a texture. - vec4 color = texture(u_image, vec2(v_lineprogress, 0.5)); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_line_pattern.hpp b/include/mbgl/shaders/gl/drawable_line_pattern.hpp deleted file mode 100644 index ea4b8809f806..000000000000 --- a/include/mbgl/shaders/gl/drawable_line_pattern.hpp +++ /dev/null @@ -1,295 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "LinePatternShader"; - static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -// We scale the distance before adding it to the buffers so that we can store -// long distances for long segments. Use this value to unscale the distance. -#define LINE_DISTANCE_SCALE 2.0 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; -layout (std140) uniform LinePatternDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_offset_t; - lowp float u_gapwidth_t; - lowp float u_width_t; - lowp float u_pattern_from_t; - lowp float u_pattern_to_t; -}; - -layout (std140) uniform LinePatternTilePropsUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; - mediump vec4 u_scale; - highp vec2 u_texsize; - highp float u_fade; - lowp float tileprops_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_linesofar; -out float v_gamma_scale; - -#ifndef HAS_UNIFORM_u_blur -layout (location = 2) in lowp vec2 a_blur; -out lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 3) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_offset -layout (location = 4) in lowp vec2 a_offset; -#endif -#ifndef HAS_UNIFORM_u_gapwidth -layout (location = 5) in mediump vec2 a_gapwidth; -#endif -#ifndef HAS_UNIFORM_u_width -layout (location = 6) in mediump vec2 a_width; -#endif -#ifndef HAS_UNIFORM_u_pattern_from -layout (location = 7) in lowp vec4 a_pattern_from; -out lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -layout (location = 8) in lowp vec4 a_pattern_to; -out lowp vec4 pattern_to; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_blur -blur = unpack_mix_vec2(a_blur, u_blur_t); -#else -lowp float blur = u_blur; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_offset -lowp float offset = unpack_mix_vec2(a_offset, u_offset_t); -#else -lowp float offset = u_offset; -#endif - #ifndef HAS_UNIFORM_u_gapwidth -mediump float gapwidth = unpack_mix_vec2(a_gapwidth, u_gapwidth_t); -#else -mediump float gapwidth = u_gapwidth; -#endif - #ifndef HAS_UNIFORM_u_width -mediump float width = unpack_mix_vec2(a_width, u_width_t); -#else -mediump float width = u_width; -#endif - #ifndef HAS_UNIFORM_u_pattern_from -pattern_from = a_pattern_from; -#else -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifndef HAS_UNIFORM_u_pattern_to -pattern_to = a_pattern_to; -#else -mediump vec4 pattern_to = u_pattern_to; -#endif - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE; - // float tileRatio = u_scale.y; - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_linesofar = a_linesofar; - v_width2 = vec2(outset, inset); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform LinePatternTilePropsUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; - mediump vec4 u_scale; - highp vec2 u_texsize; - highp float u_fade; - lowp float tileprops_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_normal; -in vec2 v_width2; -in float v_linesofar; -in float v_gamma_scale; - -#ifndef HAS_UNIFORM_u_pattern_from -in lowp vec4 pattern_from; -#endif -#ifndef HAS_UNIFORM_u_pattern_to -in lowp vec4 pattern_to; -#endif -#ifndef HAS_UNIFORM_u_blur -in lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_pattern_from -mediump vec4 pattern_from = u_pattern_from; -#endif - #ifdef HAS_UNIFORM_u_pattern_to -mediump vec4 pattern_to = u_pattern_to; -#endif - - #ifdef HAS_UNIFORM_u_blur -lowp float blur = u_blur; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_scale.x; - float tileZoomRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y); - vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y); - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - float x_a = mod(v_linesofar / pattern_size_a.x, 1.0); - float x_b = mod(v_linesofar / pattern_size_b.x, 1.0); - - // v_normal.y is 0 at the midpoint of the line, -1 at the lower edge, 1 at the upper edge - // we clamp the line width outset to be between 0 and half the pattern height plus padding (2.0) - // to ensure we don't sample outside the designated symbol on the sprite sheet. - // 0.5 is added to shift the component to be bounded between 0 and 1 for interpolation of - // the texture coordinate - float y_a = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y); - float y_b = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y); - vec2 pos_a = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, vec2(x_a, y_a)); - vec2 pos_b = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, vec2(x_b, y_b)); - - vec4 color = mix(texture(u_image, pos_a), texture(u_image, pos_b), u_fade); - - fragColor = color * alpha * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_line_sdf.hpp b/include/mbgl/shaders/gl/drawable_line_sdf.hpp deleted file mode 100644 index 7772658f2c2b..000000000000 --- a/include/mbgl/shaders/gl/drawable_line_sdf.hpp +++ /dev/null @@ -1,275 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "LineSDFShader"; - static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -// We scale the distance before adding it to the buffers so that we can store -// long distances for long segments. Use this value to unscale the distance. -#define LINE_DISTANCE_SCALE 2.0 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineSDFDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_patternscale_a; - highp vec2 u_patternscale_b; - highp float u_tex_y_a; - highp float u_tex_y_b; - mediump float u_ratio; - // Interpolations - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float u_floorwidth_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out vec2 v_tex_a; -out vec2 v_tex_b; -out float v_gamma_scale; - -#ifndef HAS_UNIFORM_u_color -layout (location = 2) in highp vec4 a_color; -out highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_blur -layout (location = 3) in lowp vec2 a_blur; -out lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 4) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_gapwidth -layout (location = 5) in mediump vec2 a_gapwidth; -#endif -#ifndef HAS_UNIFORM_u_offset -layout (location = 6) in lowp vec2 a_offset; -#endif -#ifndef HAS_UNIFORM_u_width -layout (location = 7) in mediump vec2 a_width; -out mediump float width; -#endif -#ifndef HAS_UNIFORM_u_floorwidth -layout (location = 8) in lowp vec2 a_floorwidth; -out lowp float floorwidth; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_color -color = unpack_mix_color(a_color, u_color_t); -#else -highp vec4 color = u_color; -#endif - #ifndef HAS_UNIFORM_u_blur -blur = unpack_mix_vec2(a_blur, u_blur_t); -#else -lowp float blur = u_blur; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_gapwidth -mediump float gapwidth = unpack_mix_vec2(a_gapwidth, u_gapwidth_t); -#else -mediump float gapwidth = u_gapwidth; -#endif - #ifndef HAS_UNIFORM_u_offset -lowp float offset = unpack_mix_vec2(a_offset, u_offset_t); -#else -lowp float offset = u_offset; -#endif - #ifndef HAS_UNIFORM_u_width -width = unpack_mix_vec2(a_width, u_width_t); -#else -mediump float width = u_width; -#endif - #ifndef HAS_UNIFORM_u_floorwidth -floorwidth = unpack_mix_vec2(a_floorwidth, u_floorwidth_t); -#else -lowp float floorwidth = u_floorwidth; -#endif - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist =outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a); - v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b); - - v_width2 = vec2(outset, inset); -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform LineSDFTilePropsUBO { - highp float u_sdfgamma; - highp float u_mix; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_normal; -in vec2 v_width2; -in vec2 v_tex_a; -in vec2 v_tex_b; -in float v_gamma_scale; - -#ifndef HAS_UNIFORM_u_color -in highp vec4 color; -#endif -#ifndef HAS_UNIFORM_u_blur -in lowp float blur; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_width -in mediump float width; -#endif -#ifndef HAS_UNIFORM_u_floorwidth -in lowp float floorwidth; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_color -highp vec4 color = u_color; -#endif - #ifdef HAS_UNIFORM_u_blur -lowp float blur = u_blur; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_width -mediump float width = u_width; -#endif - #ifdef HAS_UNIFORM_u_floorwidth -lowp float floorwidth = u_floorwidth; -#endif - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - float sdfdist_a = texture(u_image, v_tex_a).a; - float sdfdist_b = texture(u_image, v_tex_b).a; - float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix); - alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_raster.hpp b/include/mbgl/shaders/gl/drawable_raster.hpp deleted file mode 100644 index ee2865764d19..000000000000 --- a/include/mbgl/shaders/gl/drawable_raster.hpp +++ /dev/null @@ -1,108 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "RasterShader"; - static constexpr const char* vertex = R"(layout (std140) uniform RasterDrawableUBO { - highp mat4 u_matrix; -}; -layout (std140) uniform RasterEvaluatedPropsUBO { - highp vec3 u_spin_weights; - highp vec2 u_tl_parent; - highp float u_scale_parent; - highp float u_buffer_scale; - highp float u_fade_t; - highp float u_opacity; - highp float u_brightness_low; - highp float u_brightness_high; - highp float u_saturation_factor; - highp float u_contrast_factor; - lowp float props_pad1; - lowp float props_pad2; -}; - -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -out vec2 v_pos0; -out vec2 v_pos1; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - // We are using Int16 for texture position coordinates to give us enough precision for - // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer - // as an arbitrarily high number to preserve adequate precision when rendering. - // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates, - // so math for modifying either is consistent. - v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5; - v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent; -} -)"; - static constexpr const char* fragment = R"(layout (std140) uniform RasterEvaluatedPropsUBO { - highp vec3 u_spin_weights; - highp vec2 u_tl_parent; - highp float u_scale_parent; - highp float u_buffer_scale; - highp float u_fade_t; - highp float u_opacity; - highp float u_brightness_low; - highp float u_brightness_high; - highp float u_saturation_factor; - highp float u_contrast_factor; - lowp float props_pad1; - lowp float props_pad2; -}; -uniform sampler2D u_image0; -uniform sampler2D u_image1; - -in vec2 v_pos0; -in vec2 v_pos1; - -void main() { - - // read and cross-fade colors from the main and parent tiles - vec4 color0 = texture(u_image0, v_pos0); - vec4 color1 = texture(u_image1, v_pos1); - if (color0.a > 0.0) { - color0.rgb = color0.rgb / color0.a; - } - if (color1.a > 0.0) { - color1.rgb = color1.rgb / color1.a; - } - vec4 color = mix(color0, color1, u_fade_t); - color.a *= u_opacity; - vec3 rgb = color.rgb; - - // spin - rgb = vec3( - dot(rgb, u_spin_weights.xyz), - dot(rgb, u_spin_weights.zxy), - dot(rgb, u_spin_weights.yzx)); - - // saturation - float average = (color.r + color.g + color.b) / 3.0; - rgb += (average - rgb) * u_saturation_factor; - - // contrast - rgb = (rgb - 0.5) * u_contrast_factor + 0.5; - - // brightness - vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low); - vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high); - - fragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_symbol_icon.hpp b/include/mbgl/shaders/gl/drawable_symbol_icon.hpp deleted file mode 100644 index 9ac73b34aa43..000000000000 --- a/include/mbgl/shaders/gl/drawable_symbol_icon.hpp +++ /dev/null @@ -1,195 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "SymbolIconShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - bool u_is_text_prop; - bool u_rotate_symbol; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - - // Interpolations - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -out vec2 v_tex; -out float v_fade_opacity; - -#ifndef HAS_UNIFORM_u_opacity -layout (location = 5) in lowp vec2 a_opacity; -out lowp float opacity; -#endif - -void main() { - highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; - - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - vec2 a_minFontScale = a_pixeloffset.zw / 256.0; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // See comments in symbol_sdf.vertex - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text_prop ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // See comments in symbol_sdf.vertex - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * max(a_minFontScale, fontScale) + a_pxoffset / 16.0), 0.0, 1.0); - - v_tex = a_tex / u_texsize; - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; - v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); -} -)"; - static constexpr const char* fragment = R"(uniform sampler2D u_texture; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; - highp float u_gamma_scale; - lowp float tileprops_pad1; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -in vec2 v_tex; -in float v_fade_opacity; - -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif - -void main() { - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - - lowp float alpha = opacity * v_fade_opacity; - fragColor = texture(u_texture, v_tex) * alpha; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp b/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp deleted file mode 100644 index 4b55116f1297..000000000000 --- a/include/mbgl/shaders/gl/drawable_symbol_text_and_icon.hpp +++ /dev/null @@ -1,320 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "SymbolTextAndIconShader"; - static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec3 a_projected_pos; -layout (location = 3) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - bool u_is_text_prop; - bool u_rotate_symbol; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - - // Interpolations - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -out vec4 v_data0; -out vec4 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -layout (location = 4) in highp vec4 a_fill_color; -out highp vec4 fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -layout (location = 5) in highp vec4 a_halo_color; -out highp vec4 halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -layout (location = 6) in lowp vec2 a_opacity; -out lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -layout (location = 7) in lowp vec2 a_halo_width; -out lowp float halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -layout (location = 8) in lowp vec2 a_halo_blur; -out lowp float halo_blur; -#endif - -void main() { - highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; - - #ifndef HAS_UNIFORM_u_fill_color -fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); -#else -highp vec4 fill_color = u_fill_color; -#endif - #ifndef HAS_UNIFORM_u_halo_color -halo_color = unpack_mix_color(a_halo_color, u_halo_color_t); -#else -highp vec4 halo_color = u_halo_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_halo_width -halo_width = unpack_mix_vec2(a_halo_width, u_halo_width_t); -#else -lowp float halo_width = u_halo_width; -#endif - #ifndef HAS_UNIFORM_u_halo_blur -halo_blur = unpack_mix_vec2(a_halo_blur, u_halo_blur_t); -#else -lowp float halo_blur = u_halo_blur; -#endif - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - float is_sdf = a_size[0] - 2.0 * a_size_min; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = size / 24.0; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0.xy = a_tex / u_texsize; - v_data0.zw = a_tex / u_texsize_icon; - v_data1 = vec4(gamma_scale, size, interpolated_fade_opacity, is_sdf); -} -)"; - static constexpr const char* fragment = R"(#define SDF_PX 8.0 - -#define SDF 1.0 -#define ICON 0.0 - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; - highp float u_gamma_scale; - lowp float tileprops_pad1; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -uniform sampler2D u_texture; -uniform sampler2D u_texture_icon; - -in vec4 v_data0; -in vec4 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -in highp vec4 fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -in highp vec4 halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -in lowp float halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -in lowp float halo_blur; -#endif - -void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; - - #ifdef HAS_UNIFORM_u_fill_color -highp vec4 fill_color = u_fill_color; -#endif - #ifdef HAS_UNIFORM_u_halo_color -highp vec4 halo_color = u_halo_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_halo_width -lowp float halo_width = u_halo_width; -#endif - #ifdef HAS_UNIFORM_u_halo_blur -lowp float halo_blur = u_halo_blur; -#endif - - float fade_opacity = v_data1[2]; - - if (v_data1.w == ICON) { - vec2 tex_icon = v_data0.zw; - lowp float alpha = opacity * fade_opacity; - fragColor = texture(u_texture_icon, tex_icon) * alpha; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif - return; - } - - vec2 tex = v_data0.xy; - - float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - - float gamma_scale = v_data1.x; - float size = v_data1.y; - - float fontScale = size / 24.0; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/fill.hpp b/include/mbgl/shaders/gl/fill.hpp index f1ed0e6f27d1..58e2ab57bd5b 100644 --- a/include/mbgl/shaders/gl/fill.hpp +++ b/include/mbgl/shaders/gl/fill.hpp @@ -6,25 +6,35 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillProgram"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "FillShader"; + static constexpr const char* vertex = R"(layout (std140) uniform FillDrawableUBO { + highp mat4 u_matrix; + // Interpolations + highp float u_color_t; + highp float u_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; -uniform mat4 u_matrix; +layout (location = 0) in vec2 a_pos; #ifndef HAS_UNIFORM_u_color -uniform lowp float u_color_t; layout (location = 1) in highp vec4 a_color; out highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 2) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { @@ -42,15 +52,20 @@ lowp float opacity = u_opacity; gl_Position = u_matrix * vec4(a_pos, 0, 1); } )"; - static constexpr const char* fragment = R"(#ifndef HAS_UNIFORM_u_color + static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + +#ifndef HAS_UNIFORM_u_color in highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { diff --git a/include/mbgl/shaders/gl/fill_extrusion.hpp b/include/mbgl/shaders/gl/fill_extrusion.hpp index afe1936e1916..10a7d912fb95 100644 --- a/include/mbgl/shaders/gl/fill_extrusion.hpp +++ b/include/mbgl/shaders/gl/fill_extrusion.hpp @@ -6,36 +6,59 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec3 u_lightcolor; -uniform lowp vec3 u_lightpos; -uniform lowp float u_lightintensity; -uniform float u_vertical_gradient; -uniform lowp float u_opacity; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "FillExtrusionShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec4 a_normal_ed; out vec4 v_color; +layout (std140) uniform FillExtrusionDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_height_factor; + highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + #ifndef HAS_UNIFORM_u_base -uniform lowp float u_base_t; layout (location = 2) in highp vec2 a_base; -#else -uniform highp float u_base; #endif #ifndef HAS_UNIFORM_u_height -uniform lowp float u_height_t; layout (location = 3) in highp vec2 a_height; -#else -uniform highp float u_height; #endif #ifndef HAS_UNIFORM_u_color -uniform lowp float u_color_t; layout (location = 4) in highp vec4 a_color; -#else -uniform highp vec4 u_color; #endif void main() { diff --git a/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp b/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp index a24c7b9065bc..11f7e40c42e8 100644 --- a/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp +++ b/include/mbgl/shaders/gl/fill_extrusion_pattern.hpp @@ -6,54 +6,81 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillExtrusionPatternProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform float u_height_factor; -uniform vec4 u_scale; -uniform float u_vertical_gradient; -uniform lowp float u_opacity; - -uniform vec3 u_lightcolor; -uniform lowp vec3 u_lightpos; -uniform lowp float u_lightintensity; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "FillExtrusionPatternShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec4 a_normal_ed; out vec2 v_pos_a; out vec2 v_pos_b; out vec4 v_lighting; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillExtrusionDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_height_factor; + highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + #ifndef HAS_UNIFORM_u_base -uniform lowp float u_base_t; layout (location = 2) in lowp vec2 a_base; out lowp float base; -#else -uniform lowp float u_base; #endif #ifndef HAS_UNIFORM_u_height -uniform lowp float u_height_t; layout (location = 3) in lowp vec2 a_height; out lowp float height; -#else -uniform lowp float u_height; #endif #ifndef HAS_UNIFORM_u_pattern_from -uniform lowp float u_pattern_from_t; layout (location = 4) in mediump vec4 a_pattern_from; out mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -uniform lowp float u_pattern_to_t; layout (location = 5) in mediump vec4 a_pattern_to; out mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; #endif void main() { @@ -83,10 +110,10 @@ mediump vec4 pattern_to = u_pattern_to; vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; vec3 normal = a_normal_ed.xyz; float edgedistance = a_normal_ed.w; @@ -125,34 +152,47 @@ mediump vec4 pattern_to = u_pattern_to; v_lighting *= u_opacity; } )"; - static constexpr const char* fragment = R"(uniform vec2 u_texsize; -uniform float u_fade; - -uniform sampler2D u_image; - -in vec2 v_pos_a; + static constexpr const char* fragment = R"(in vec2 v_pos_a; in vec2 v_pos_b; in vec4 v_lighting; +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + +uniform sampler2D u_image; + #ifndef HAS_UNIFORM_u_base in lowp float base; -#else -uniform lowp float u_base; #endif #ifndef HAS_UNIFORM_u_height in lowp float height; -#else -uniform lowp float u_height; #endif #ifndef HAS_UNIFORM_u_pattern_from in mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to in mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; #endif void main() { diff --git a/include/mbgl/shaders/gl/fill_outline.hpp b/include/mbgl/shaders/gl/fill_outline.hpp index 800829391f62..ae157ae5f4bf 100644 --- a/include/mbgl/shaders/gl/fill_outline.hpp +++ b/include/mbgl/shaders/gl/fill_outline.hpp @@ -6,28 +6,49 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillOutlineProgram"; - static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "FillOutlineShader"; + static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillOutlineDrawableUBO { + highp mat4 u_matrix; + // Interpolations + highp float u_outline_color_t; + highp float u_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; -uniform mat4 u_matrix; -uniform vec2 u_world; +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + +layout (location = 0) in vec2 a_pos; out vec2 v_pos; #ifndef HAS_UNIFORM_u_outline_color -uniform lowp float u_outline_color_t; layout (location = 1) in highp vec4 a_outline_color; out highp vec4 outline_color; -#else -uniform highp vec4 u_outline_color; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 2) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { @@ -43,20 +64,25 @@ lowp float opacity = u_opacity; #endif gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world; + v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; } )"; - static constexpr const char* fragment = R"(in vec2 v_pos; + static constexpr const char* fragment = R"(layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + +in vec2 v_pos; #ifndef HAS_UNIFORM_u_outline_color in highp vec4 outline_color; -#else -uniform highp vec4 u_outline_color; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { diff --git a/include/mbgl/shaders/gl/fill_outline_pattern.hpp b/include/mbgl/shaders/gl/fill_outline_pattern.hpp index ca6c80aec26d..f197a56318f6 100644 --- a/include/mbgl/shaders/gl/fill_outline_pattern.hpp +++ b/include/mbgl/shaders/gl/fill_outline_pattern.hpp @@ -6,13 +6,47 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillOutlinePatternProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_world; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform vec4 u_scale; +struct ShaderSource { + static constexpr const char* name = "FillOutlinePatternShader"; + static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillOutlinePatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_ratio; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; +}; + +layout (std140) uniform FillOutlinePatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; layout (location = 0) in vec2 a_pos; @@ -21,25 +55,16 @@ out vec2 v_pos_b; out vec2 v_pos; #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 1) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_pattern_from -uniform lowp float u_pattern_from_t; -layout (location = 2) in mediump vec4 a_pattern_from; -out mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +layout (location = 2) in lowp vec4 a_pattern_from; +out lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -uniform lowp float u_pattern_to_t; -layout (location = 3) in mediump vec4 a_pattern_to; -out mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +layout (location = 3) in lowp vec4 a_pattern_to; +out lowp vec4 pattern_to; #endif void main() { @@ -64,10 +89,10 @@ mediump vec4 pattern_to = u_pattern_to; vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; gl_Position = u_matrix * vec4(a_pos, 0, 1); @@ -77,13 +102,27 @@ mediump vec4 pattern_to = u_pattern_to; v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos); v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world; + v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; } )"; - static constexpr const char* fragment = R"( -uniform vec2 u_texsize; + static constexpr const char* fragment = R"(layout (std140) uniform FillOutlinePatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + uniform sampler2D u_image; -uniform float u_fade; in vec2 v_pos_a; in vec2 v_pos_b; @@ -91,18 +130,12 @@ in vec2 v_pos; #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_pattern_from -in mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +in lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -in mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +in lowp vec4 pattern_to; #endif void main() { diff --git a/include/mbgl/shaders/gl/drawable_fill_outline_triangulated.hpp b/include/mbgl/shaders/gl/fill_outline_triangulated.hpp similarity index 100% rename from include/mbgl/shaders/gl/drawable_fill_outline_triangulated.hpp rename to include/mbgl/shaders/gl/fill_outline_triangulated.hpp diff --git a/include/mbgl/shaders/gl/fill_pattern.hpp b/include/mbgl/shaders/gl/fill_pattern.hpp index 40b7cb18e95d..fecf17edad22 100644 --- a/include/mbgl/shaders/gl/fill_pattern.hpp +++ b/include/mbgl/shaders/gl/fill_pattern.hpp @@ -6,12 +6,47 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "FillPatternProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform vec4 u_scale; +struct ShaderSource { + static constexpr const char* name = "FillPatternShader"; + static constexpr const char* vertex = R"(layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillPatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_ratio; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; +}; + +layout (std140) uniform FillPatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; layout (location = 0) in vec2 a_pos; @@ -19,25 +54,16 @@ out vec2 v_pos_a; out vec2 v_pos_b; #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 1) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_pattern_from -uniform lowp float u_pattern_from_t; -layout (location = 2) in mediump vec4 a_pattern_from; -out mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +layout (location = 2) in lowp vec4 a_pattern_from; +out lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -uniform lowp float u_pattern_to_t; -layout (location = 3) in mediump vec4 a_pattern_to; -out mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +layout (location = 3) in lowp vec4 a_pattern_to; +out lowp vec4 pattern_to; #endif void main() { @@ -62,10 +88,10 @@ mediump vec4 pattern_to = u_pattern_to; vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileZoomRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileZoomRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); @@ -75,8 +101,22 @@ mediump vec4 pattern_to = u_pattern_to; v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos); } )"; - static constexpr const char* fragment = R"(uniform vec2 u_texsize; -uniform float u_fade; + static constexpr const char* fragment = R"(layout (std140) uniform FillPatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; uniform sampler2D u_image; @@ -85,18 +125,12 @@ in vec2 v_pos_b; #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_pattern_from -in mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +in lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -in mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +in lowp vec4 pattern_to; #endif void main() { @@ -115,6 +149,10 @@ mediump vec4 pattern_to = u_pattern_to; vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; + if (u_texsize.x < 1.0 || u_texsize.y < 1.0) { + discard; + } + vec2 imagecoord = mod(v_pos_a, 1.0); vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); vec4 color1 = texture(u_image, pos); diff --git a/include/mbgl/shaders/gl/heatmap.hpp b/include/mbgl/shaders/gl/heatmap.hpp index ea0aeab9f6f8..9b93c798e12b 100644 --- a/include/mbgl/shaders/gl/heatmap.hpp +++ b/include/mbgl/shaders/gl/heatmap.hpp @@ -6,28 +6,33 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "HeatmapProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform float u_extrude_scale; -uniform float u_opacity; -uniform float u_intensity; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "HeatmapShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; out vec2 v_extrude; +layout (std140) uniform HeatmapDrawableUBO { + highp mat4 u_matrix; + highp float u_extrude_scale; + // Interpolations + lowp float u_weight_t; + lowp float u_radius_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform HeatmapEvaluatedPropsUBO { + highp float u_weight; + highp float u_radius; + highp float u_intensity; + lowp float props_pad1; +}; + #ifndef HAS_UNIFORM_u_weight -uniform lowp float u_weight_t; layout (location = 1) in highp vec2 a_weight; out highp float weight; -#else -uniform highp float u_weight; #endif #ifndef HAS_UNIFORM_u_radius -uniform lowp float u_radius_t; layout (location = 2) in mediump vec2 a_radius; -#else -uniform mediump float u_radius; #endif // Effective "0" in the kernel density texture to adjust the kernel size to; @@ -80,14 +85,17 @@ mediump float radius = u_radius; gl_Position = u_matrix * pos; } )"; - static constexpr const char* fragment = R"(uniform highp float u_intensity; + static constexpr const char* fragment = R"(in vec2 v_extrude; -in vec2 v_extrude; +layout (std140) uniform HeatmapEvaluatedPropsUBO { + highp float u_weight; + highp float u_radius; + highp float u_intensity; + lowp float props_pad1; +}; #ifndef HAS_UNIFORM_u_weight in highp float weight; -#else -uniform highp float u_weight; #endif // Gaussian kernel coefficient: 1 / sqrt(2 * PI) diff --git a/include/mbgl/shaders/gl/heatmap_texture.hpp b/include/mbgl/shaders/gl/heatmap_texture.hpp index 5115a2897f43..19317a2d6c61 100644 --- a/include/mbgl/shaders/gl/heatmap_texture.hpp +++ b/include/mbgl/shaders/gl/heatmap_texture.hpp @@ -6,24 +6,49 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "HeatmapTextureProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_world; -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "HeatmapTextureShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; out vec2 v_pos; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform HeatmapTexturePropsUBO { + highp mat4 u_matrix; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; + void main() { - gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1); + gl_Position = u_matrix * vec4(a_pos * u_world_size, 0, 1); v_pos.x = a_pos.x; v_pos.y = 1.0 - a_pos.y; } )"; - static constexpr const char* fragment = R"(uniform sampler2D u_image; + static constexpr const char* fragment = R"(in vec2 v_pos; +uniform sampler2D u_image; uniform sampler2D u_color_ramp; -uniform float u_opacity; -in vec2 v_pos; + +layout (std140) uniform HeatmapTexturePropsUBO { + highp mat4 u_matrix; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; void main() { float t = texture(u_image, v_pos).r; diff --git a/include/mbgl/shaders/gl/hillshade.hpp b/include/mbgl/shaders/gl/hillshade.hpp index 67b69950c38f..8d186538040b 100644 --- a/include/mbgl/shaders/gl/hillshade.hpp +++ b/include/mbgl/shaders/gl/hillshade.hpp @@ -6,13 +6,15 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "HillshadeProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "HillshadeShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; +layout (std140) uniform HillshadeDrawableUBO { + highp mat4 u_matrix; +}; + out vec2 v_pos; void main() { @@ -20,14 +22,19 @@ void main() { v_pos = a_texture_pos / 8192.0; } )"; - static constexpr const char* fragment = R"(uniform sampler2D u_image; -in vec2 v_pos; - -uniform vec2 u_latrange; -uniform vec2 u_light; -uniform vec4 u_shadow; -uniform vec4 u_highlight; -uniform vec4 u_accent; + static constexpr const char* fragment = R"(in vec2 v_pos; +uniform sampler2D u_image; + +layout (std140) uniform HillshadeTilePropsUBO { + highp vec2 u_latrange; + highp vec2 u_light; +}; + +layout (std140) uniform HillshadeEvaluatedPropsUBO { + highp vec4 u_highlight; + highp vec4 u_shadow; + highp vec4 u_accent; +}; #define PI 3.141592653589793 diff --git a/include/mbgl/shaders/gl/hillshade_prepare.hpp b/include/mbgl/shaders/gl/hillshade_prepare.hpp index ae1abf2f9016..2a2bf01b5334 100644 --- a/include/mbgl/shaders/gl/hillshade_prepare.hpp +++ b/include/mbgl/shaders/gl/hillshade_prepare.hpp @@ -6,14 +6,22 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "HillshadePrepareProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_dimension; - -layout (location = 0) in vec2 a_pos; +struct ShaderSource { + static constexpr const char* name = "HillshadePrepareShader"; + static constexpr const char* vertex = R"(layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; +layout (std140) uniform HillshadePrepareDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform HillshadePrepareTilePropsUBO { + highp vec4 u_unpack; + highp vec2 u_dimension; + highp float u_zoom; + highp float u_maxzoom; +}; + out vec2 v_pos; void main() { @@ -28,12 +36,15 @@ void main() { precision highp float; #endif -uniform sampler2D u_image; in vec2 v_pos; -uniform vec2 u_dimension; -uniform float u_zoom; -uniform float u_maxzoom; -uniform vec4 u_unpack; +uniform sampler2D u_image; + +layout (std140) uniform HillshadePrepareTilePropsUBO { + highp vec4 u_unpack; + highp vec2 u_dimension; + highp float u_zoom; + highp float u_maxzoom; +}; float getElevation(vec2 coord, float bias) { // Convert encoded elevation value to meters diff --git a/include/mbgl/shaders/gl/line.hpp b/include/mbgl/shaders/gl/line.hpp index 3993a8a3286d..1f0935817825 100644 --- a/include/mbgl/shaders/gl/line.hpp +++ b/include/mbgl/shaders/gl/line.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "LineProgram"; +struct ShaderSource { + static constexpr const char* name = "LineShader"; static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 // the maximum allowed miter limit is 2.0 at the moment. the extrude normal is // stored in a byte (-128..127). we scale regular normals up to length 63, but @@ -19,10 +19,42 @@ struct ShaderSource { layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform vec2 u_units_to_pixels; -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_color_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -30,43 +62,25 @@ out float v_gamma_scale; out highp float v_linesofar; #ifndef HAS_UNIFORM_u_color -uniform lowp float u_color_t; layout (location = 2) in highp vec4 a_color; out highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_blur -uniform lowp float u_blur_t; layout (location = 3) in lowp vec2 a_blur; out lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 4) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_gapwidth -uniform lowp float u_gapwidth_t; layout (location = 5) in mediump vec2 a_gapwidth; -#else -uniform mediump float u_gapwidth; #endif #ifndef HAS_UNIFORM_u_offset -uniform lowp float u_offset_t; layout (location = 6) in lowp vec2 a_offset; -#else -uniform lowp float u_offset; #endif #ifndef HAS_UNIFORM_u_width -uniform lowp float u_width_t; layout (location = 7) in mediump vec2 a_width; -#else -uniform mediump float u_width; #endif void main() { @@ -103,7 +117,7 @@ mediump float width = u_width; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; @@ -151,7 +165,17 @@ mediump float width = u_width; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(uniform lowp float u_device_pixel_ratio; + static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; in vec2 v_width2; in vec2 v_normal; @@ -159,18 +183,12 @@ in float v_gamma_scale; #ifndef HAS_UNIFORM_u_color in highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_blur in lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { @@ -190,7 +208,7 @@ lowp float opacity = u_opacity; // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); fragColor = color * (alpha * opacity); diff --git a/include/mbgl/shaders/gl/line_gradient.hpp b/include/mbgl/shaders/gl/line_gradient.hpp index 74f0d105a0a8..c77e020c44ab 100644 --- a/include/mbgl/shaders/gl/line_gradient.hpp +++ b/include/mbgl/shaders/gl/line_gradient.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "LineGradientProgram"; +struct ShaderSource { + static constexpr const char* name = "LineGradientShader"; static constexpr const char* vertex = R"( // the attribute conveying progress along a line is scaled to [0, 2^15) #define MAX_LINE_DISTANCE 32767.0 @@ -23,10 +23,42 @@ struct ShaderSource { layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; -uniform vec2 u_units_to_pixels; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineGradientDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -34,36 +66,21 @@ out float v_gamma_scale; out highp float v_lineprogress; #ifndef HAS_UNIFORM_u_blur -uniform lowp float u_blur_t; layout (location = 2) in lowp vec2 a_blur; out lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 3) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_gapwidth -uniform lowp float u_gapwidth_t; layout (location = 4) in mediump vec2 a_gapwidth; -#else -uniform mediump float u_gapwidth; #endif #ifndef HAS_UNIFORM_u_offset -uniform lowp float u_offset_t; layout (location = 5) in lowp vec2 a_offset; -#else -uniform lowp float u_offset; #endif #ifndef HAS_UNIFORM_u_width -uniform lowp float u_width_t; layout (location = 6) in mediump vec2 a_width; -#else -uniform mediump float u_width; #endif void main() { @@ -95,7 +112,7 @@ mediump float width = u_width; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; @@ -143,7 +160,18 @@ mediump float width = u_width; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(uniform lowp float u_device_pixel_ratio; + static constexpr const char* fragment = R"(layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; + uniform sampler2D u_image; in vec2 v_width2; @@ -153,13 +181,9 @@ in highp float v_lineprogress; #ifndef HAS_UNIFORM_u_blur in lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { @@ -176,7 +200,7 @@ lowp float opacity = u_opacity; // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); // For gradient lines, v_lineprogress is the ratio along the entire line, diff --git a/include/mbgl/shaders/gl/line_pattern.hpp b/include/mbgl/shaders/gl/line_pattern.hpp index 46a3a0cd1194..ea4b8809f806 100644 --- a/include/mbgl/shaders/gl/line_pattern.hpp +++ b/include/mbgl/shaders/gl/line_pattern.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "LinePatternProgram"; +struct ShaderSource { + static constexpr const char* name = "LinePatternShader"; static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 // the maximum allowed miter limit is 2.0 at the moment. the extrude normal is // stored in a byte (-128..127). we scale regular normals up to length 63, but @@ -23,10 +23,50 @@ struct ShaderSource { layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform vec2 u_units_to_pixels; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; +layout (std140) uniform LinePatternDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_offset_t; + lowp float u_gapwidth_t; + lowp float u_width_t; + lowp float u_pattern_from_t; + lowp float u_pattern_to_t; +}; + +layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -34,50 +74,29 @@ out float v_linesofar; out float v_gamma_scale; #ifndef HAS_UNIFORM_u_blur -uniform lowp float u_blur_t; layout (location = 2) in lowp vec2 a_blur; out lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 3) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_offset -uniform lowp float u_offset_t; layout (location = 4) in lowp vec2 a_offset; -#else -uniform lowp float u_offset; #endif #ifndef HAS_UNIFORM_u_gapwidth -uniform lowp float u_gapwidth_t; layout (location = 5) in mediump vec2 a_gapwidth; -#else -uniform mediump float u_gapwidth; #endif #ifndef HAS_UNIFORM_u_width -uniform lowp float u_width_t; layout (location = 6) in mediump vec2 a_width; -#else -uniform mediump float u_width; #endif #ifndef HAS_UNIFORM_u_pattern_from -uniform lowp float u_pattern_from_t; -layout (location = 7) in mediump vec4 a_pattern_from; -out mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +layout (location = 7) in lowp vec4 a_pattern_from; +out lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -uniform lowp float u_pattern_to_t; -layout (location = 8) in mediump vec4 a_pattern_to; -out mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +layout (location = 8) in lowp vec4 a_pattern_to; +out lowp vec4 pattern_to; #endif void main() { @@ -119,7 +138,7 @@ mediump vec4 pattern_to = u_pattern_to; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; @@ -167,10 +186,26 @@ mediump vec4 pattern_to = u_pattern_to; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"(uniform lowp float u_device_pixel_ratio; -uniform vec2 u_texsize; -uniform float u_fade; -uniform mediump vec4 u_scale; + static constexpr const char* fragment = R"(layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; uniform sampler2D u_image; @@ -180,24 +215,16 @@ in float v_linesofar; in float v_gamma_scale; #ifndef HAS_UNIFORM_u_pattern_from -in mediump vec4 pattern_from; -#else -uniform mediump vec4 u_pattern_from; +in lowp vec4 pattern_from; #endif #ifndef HAS_UNIFORM_u_pattern_to -in mediump vec4 pattern_to; -#else -uniform mediump vec4 u_pattern_to; +in lowp vec4 pattern_to; #endif #ifndef HAS_UNIFORM_u_blur in lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { @@ -207,6 +234,7 @@ mediump vec4 pattern_from = u_pattern_from; #ifdef HAS_UNIFORM_u_pattern_to mediump vec4 pattern_to = u_pattern_to; #endif + #ifdef HAS_UNIFORM_u_blur lowp float blur = u_blur; #endif @@ -236,7 +264,7 @@ lowp float opacity = u_opacity; // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); float x_a = mod(v_linesofar / pattern_size_a.x, 1.0); diff --git a/include/mbgl/shaders/gl/line_sdf.hpp b/include/mbgl/shaders/gl/line_sdf.hpp index 830a2f03aa4f..7772658f2c2b 100644 --- a/include/mbgl/shaders/gl/line_sdf.hpp +++ b/include/mbgl/shaders/gl/line_sdf.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "LineSDFProgram"; +struct ShaderSource { + static constexpr const char* name = "LineSDFShader"; static constexpr const char* vertex = R"(// floor(127 / 2) == 63.0 // the maximum allowed miter limit is 2.0 at the moment. the extrude normal is // stored in a byte (-128..127). we scale regular normals up to length 63, but @@ -23,14 +23,48 @@ struct ShaderSource { layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; -uniform vec2 u_patternscale_a; -uniform float u_tex_y_a; -uniform vec2 u_patternscale_b; -uniform float u_tex_y_b; -uniform vec2 u_units_to_pixels; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineSDFDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_patternscale_a; + highp vec2 u_patternscale_b; + highp float u_tex_y_a; + highp float u_tex_y_b; + mediump float u_ratio; + // Interpolations + lowp float u_color_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float u_floorwidth_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -39,51 +73,30 @@ out vec2 v_tex_b; out float v_gamma_scale; #ifndef HAS_UNIFORM_u_color -uniform lowp float u_color_t; layout (location = 2) in highp vec4 a_color; out highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_blur -uniform lowp float u_blur_t; layout (location = 3) in lowp vec2 a_blur; out lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 4) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_gapwidth -uniform lowp float u_gapwidth_t; layout (location = 5) in mediump vec2 a_gapwidth; -#else -uniform mediump float u_gapwidth; #endif #ifndef HAS_UNIFORM_u_offset -uniform lowp float u_offset_t; layout (location = 6) in lowp vec2 a_offset; -#else -uniform lowp float u_offset; #endif #ifndef HAS_UNIFORM_u_width -uniform lowp float u_width_t; layout (location = 7) in mediump vec2 a_width; out mediump float width; -#else -uniform mediump float u_width; #endif #ifndef HAS_UNIFORM_u_floorwidth -uniform lowp float u_floorwidth_t; layout (location = 8) in lowp vec2 a_floorwidth; out lowp float floorwidth; -#else -uniform lowp float u_floorwidth; #endif void main() { @@ -125,7 +138,7 @@ lowp float floorwidth = u_floorwidth; // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; @@ -175,11 +188,26 @@ lowp float floorwidth = u_floorwidth; v_width2 = vec2(outset, inset); } )"; - static constexpr const char* fragment = R"( -uniform lowp float u_device_pixel_ratio; + static constexpr const char* fragment = R"(layout (std140) uniform LineSDFTilePropsUBO { + highp float u_sdfgamma; + highp float u_mix; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; + uniform sampler2D u_image; -uniform float u_sdfgamma; -uniform float u_mix; in vec2 v_normal; in vec2 v_width2; @@ -189,28 +217,18 @@ in float v_gamma_scale; #ifndef HAS_UNIFORM_u_color in highp vec4 color; -#else -uniform highp vec4 u_color; #endif #ifndef HAS_UNIFORM_u_blur in lowp float blur; -#else -uniform lowp float u_blur; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_width in mediump float width; -#else -uniform mediump float u_width; #endif #ifndef HAS_UNIFORM_u_floorwidth in lowp float floorwidth; -#else -uniform lowp float u_floorwidth; #endif void main() { @@ -236,7 +254,7 @@ lowp float floorwidth = u_floorwidth; // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); float sdfdist_a = texture(u_image, v_tex_a).a; diff --git a/include/mbgl/shaders/gl/drawable_location_indicator.hpp b/include/mbgl/shaders/gl/location_indicator.hpp similarity index 98% rename from include/mbgl/shaders/gl/drawable_location_indicator.hpp rename to include/mbgl/shaders/gl/location_indicator.hpp index 5d0b261f9c55..3316f6c90665 100644 --- a/include/mbgl/shaders/gl/drawable_location_indicator.hpp +++ b/include/mbgl/shaders/gl/location_indicator.hpp @@ -17,7 +17,8 @@ layout(location = 0) in vec2 a_pos; void main() { gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); -})"; +} +)"; static constexpr const char* fragment = R"(layout (std140) uniform LocationIndicatorDrawableUBO { mat4 u_matrix; vec4 u_color; @@ -25,7 +26,8 @@ void main() { void main() { fragColor = u_color; -})"; +} +)"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp b/include/mbgl/shaders/gl/location_indicator_textured.hpp similarity index 98% rename from include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp rename to include/mbgl/shaders/gl/location_indicator_textured.hpp index 2993936c4ba0..f0dc0cfe9810 100644 --- a/include/mbgl/shaders/gl/drawable_location_indicator_textured.hpp +++ b/include/mbgl/shaders/gl/location_indicator_textured.hpp @@ -21,7 +21,8 @@ out vec2 frag_uv; void main() { frag_uv = a_uv; gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); -})"; +} +)"; static constexpr const char* fragment = R"(layout (std140) uniform LocationIndicatorDrawableUBO { mat4 u_matrix; vec4 u_color; @@ -32,7 +33,8 @@ uniform sampler2D u_image; void main() { fragColor = texture(u_image, frag_uv); -})"; +} +)"; }; } // namespace shaders diff --git a/include/mbgl/shaders/gl/raster.hpp b/include/mbgl/shaders/gl/raster.hpp index 6320dad54c06..ee2865764d19 100644 --- a/include/mbgl/shaders/gl/raster.hpp +++ b/include/mbgl/shaders/gl/raster.hpp @@ -6,12 +6,25 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "RasterProgram"; - static constexpr const char* vertex = R"(uniform mat4 u_matrix; -uniform vec2 u_tl_parent; -uniform float u_scale_parent; -uniform float u_buffer_scale; +struct ShaderSource { + static constexpr const char* name = "RasterShader"; + static constexpr const char* vertex = R"(layout (std140) uniform RasterDrawableUBO { + highp mat4 u_matrix; +}; +layout (std140) uniform RasterEvaluatedPropsUBO { + highp vec3 u_spin_weights; + highp vec2 u_tl_parent; + highp float u_scale_parent; + highp float u_buffer_scale; + highp float u_fade_t; + highp float u_opacity; + highp float u_brightness_low; + highp float u_brightness_high; + highp float u_saturation_factor; + highp float u_contrast_factor; + lowp float props_pad1; + lowp float props_pad2; +}; layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; @@ -30,20 +43,26 @@ void main() { v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent; } )"; - static constexpr const char* fragment = R"(uniform float u_fade_t; -uniform float u_opacity; + static constexpr const char* fragment = R"(layout (std140) uniform RasterEvaluatedPropsUBO { + highp vec3 u_spin_weights; + highp vec2 u_tl_parent; + highp float u_scale_parent; + highp float u_buffer_scale; + highp float u_fade_t; + highp float u_opacity; + highp float u_brightness_low; + highp float u_brightness_high; + highp float u_saturation_factor; + highp float u_contrast_factor; + lowp float props_pad1; + lowp float props_pad2; +}; uniform sampler2D u_image0; uniform sampler2D u_image1; + in vec2 v_pos0; in vec2 v_pos1; -uniform float u_brightness_low; -uniform float u_brightness_high; - -uniform float u_saturation_factor; -uniform float u_contrast_factor; -uniform vec3 u_spin_weights; - void main() { // read and cross-fade colors from the main and parent tiles diff --git a/include/mbgl/shaders/gl/symbol_icon.hpp b/include/mbgl/shaders/gl/symbol_icon.hpp index bf96c3952d40..9ac73b34aa43 100644 --- a/include/mbgl/shaders/gl/symbol_icon.hpp +++ b/include/mbgl/shaders/gl/symbol_icon.hpp @@ -6,45 +6,77 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "SymbolIconProgram"; +struct ShaderSource { + static constexpr const char* name = "SymbolIconShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; layout (location = 1) in vec4 a_data; layout (location = 2) in vec4 a_pixeloffset; layout (location = 3) in vec3 a_projected_pos; layout (location = 4) in float a_fade_opacity; -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform highp float u_camera_to_center_distance; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform float u_fade_change; - -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; -uniform bool u_is_text; -uniform bool u_pitch_with_map; +layout (std140) uniform SymbolDrawableUBO { + highp mat4 u_matrix; + highp mat4 u_label_plane_matrix; + highp mat4 u_coord_matrix; + + highp vec2 u_texsize; + highp vec2 u_texsize_icon; + + bool u_is_text_prop; + bool u_rotate_symbol; + bool u_pitch_with_map; + bool u_is_size_zoom_constant; + bool u_is_size_feature_constant; + + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function + highp float u_size; // used when size is both zoom and feature constant + + // Interpolations + highp float u_fill_color_t; + highp float u_halo_color_t; + highp float u_opacity_t; + highp float u_halo_width_t; + highp float u_halo_blur_t; +}; -uniform vec2 u_texsize; +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; out vec2 v_tex; out float v_fade_opacity; #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 5) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + #ifndef HAS_UNIFORM_u_opacity opacity = unpack_mix_vec2(a_opacity, u_opacity_t); #else @@ -85,7 +117,7 @@ lowp float opacity = u_opacity; size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { @@ -107,22 +139,44 @@ lowp float opacity = u_opacity; v_tex = a_tex / u_texsize; vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; + float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); } )"; static constexpr const char* fragment = R"(uniform sampler2D u_texture; +layout (std140) uniform SymbolTilePropsUBO { + bool u_is_text; + bool u_is_halo; + highp float u_gamma_scale; + lowp float tileprops_pad1; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; + in vec2 v_tex; in float v_fade_opacity; #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif void main() { + highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + #ifdef HAS_UNIFORM_u_opacity lowp float opacity = u_opacity; #endif diff --git a/include/mbgl/shaders/gl/drawable_symbol_sdf.hpp b/include/mbgl/shaders/gl/symbol_sdf.hpp similarity index 100% rename from include/mbgl/shaders/gl/drawable_symbol_sdf.hpp rename to include/mbgl/shaders/gl/symbol_sdf.hpp diff --git a/include/mbgl/shaders/gl/symbol_sdf_icon.hpp b/include/mbgl/shaders/gl/symbol_sdf_icon.hpp deleted file mode 100644 index 6094108c8635..000000000000 --- a/include/mbgl/shaders/gl/symbol_sdf_icon.hpp +++ /dev/null @@ -1,261 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "SymbolSDFIconProgram"; - static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; -uniform bool u_is_text; -uniform bool u_pitch_with_map; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform highp float u_camera_to_center_distance; -uniform float u_fade_change; -uniform vec2 u_texsize; - -out vec2 v_data0; -out vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -uniform lowp float u_fill_color_t; -layout (location = 5) in highp vec4 a_fill_color; -out highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -uniform lowp float u_halo_color_t; -layout (location = 6) in highp vec4 a_halo_color; -out highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; -layout (location = 7) in lowp vec2 a_opacity; -out lowp float opacity; -#else -uniform lowp float u_opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -uniform lowp float u_halo_width_t; -layout (location = 8) in lowp vec2 a_halo_width; -out lowp float halo_width; -#else -uniform lowp float u_halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -uniform lowp float u_halo_blur_t; -layout (location = 9) in lowp vec2 a_halo_blur; -out lowp float halo_blur; -#else -uniform lowp float u_halo_blur; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_fill_color -fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); -#else -highp vec4 fill_color = u_fill_color; -#endif - #ifndef HAS_UNIFORM_u_halo_color -halo_color = unpack_mix_color(a_halo_color, u_halo_color_t); -#else -highp vec4 halo_color = u_halo_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_halo_width -halo_width = unpack_mix_vec2(a_halo_width, u_halo_width_t); -#else -lowp float halo_width = u_halo_width; -#endif - #ifndef HAS_UNIFORM_u_halo_blur -halo_blur = unpack_mix_vec2(a_halo_blur, u_halo_blur_t); -#else -lowp float halo_blur = u_halo_blur; -#endif - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0 = a_tex / u_texsize; - v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity); -} -)"; - static constexpr const char* fragment = R"(#define SDF_PX 8.0 - -uniform bool u_is_halo; -uniform sampler2D u_texture; -uniform highp float u_gamma_scale; -uniform lowp float u_device_pixel_ratio; -uniform bool u_is_text; - -in vec2 v_data0; -in vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -in highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -in highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#else -uniform lowp float u_opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -in lowp float halo_width; -#else -uniform lowp float u_halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -in lowp float halo_blur; -#else -uniform lowp float u_halo_blur; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_fill_color -highp vec4 fill_color = u_fill_color; -#endif - #ifdef HAS_UNIFORM_u_halo_color -highp vec4 halo_color = u_halo_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_halo_width -lowp float halo_width = u_halo_width; -#endif - #ifdef HAS_UNIFORM_u_halo_blur -lowp float halo_blur = u_halo_blur; -#endif - - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; - - vec2 tex = v_data0.xy; - float gamma_scale = v_data1.x; - float size = v_data1.y; - float fade_opacity = v_data1[2]; - - float fontScale = u_is_text ? size / 24.0 : size; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/symbol_sdf_text.hpp b/include/mbgl/shaders/gl/symbol_sdf_text.hpp deleted file mode 100644 index eecf6ff6be0e..000000000000 --- a/include/mbgl/shaders/gl/symbol_sdf_text.hpp +++ /dev/null @@ -1,261 +0,0 @@ -// Generated code, do not modify this file! -#pragma once -#include - -namespace mbgl { -namespace shaders { - -template <> -struct ShaderSource { - static constexpr const char* name = "SymbolSDFTextProgram"; - static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; -uniform bool u_is_text; -uniform bool u_pitch_with_map; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform highp float u_camera_to_center_distance; -uniform float u_fade_change; -uniform vec2 u_texsize; - -out vec2 v_data0; -out vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -uniform lowp float u_fill_color_t; -layout (location = 5) in highp vec4 a_fill_color; -out highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -uniform lowp float u_halo_color_t; -layout (location = 6) in highp vec4 a_halo_color; -out highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; -layout (location = 7) in lowp vec2 a_opacity; -out lowp float opacity; -#else -uniform lowp float u_opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -uniform lowp float u_halo_width_t; -layout (location = 8) in lowp vec2 a_halo_width; -out lowp float halo_width; -#else -uniform lowp float u_halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -uniform lowp float u_halo_blur_t; -layout (location = 9) in lowp vec2 a_halo_blur; -out lowp float halo_blur; -#else -uniform lowp float u_halo_blur; -#endif - -void main() { - #ifndef HAS_UNIFORM_u_fill_color -fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); -#else -highp vec4 fill_color = u_fill_color; -#endif - #ifndef HAS_UNIFORM_u_halo_color -halo_color = unpack_mix_color(a_halo_color, u_halo_color_t); -#else -highp vec4 halo_color = u_halo_color; -#endif - #ifndef HAS_UNIFORM_u_opacity -opacity = unpack_mix_vec2(a_opacity, u_opacity_t); -#else -lowp float opacity = u_opacity; -#endif - #ifndef HAS_UNIFORM_u_halo_width -halo_width = unpack_mix_vec2(a_halo_width, u_halo_width_t); -#else -lowp float halo_width = u_halo_width; -#endif - #ifndef HAS_UNIFORM_u_halo_blur -halo_blur = unpack_mix_vec2(a_halo_blur, u_halo_blur_t); -#else -lowp float halo_blur = u_halo_blur; -#endif - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0 = a_tex / u_texsize; - v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity); -} -)"; - static constexpr const char* fragment = R"(#define SDF_PX 8.0 - -uniform bool u_is_halo; -uniform sampler2D u_texture; -uniform highp float u_gamma_scale; -uniform lowp float u_device_pixel_ratio; -uniform bool u_is_text; - -in vec2 v_data0; -in vec3 v_data1; - -#ifndef HAS_UNIFORM_u_fill_color -in highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; -#endif -#ifndef HAS_UNIFORM_u_halo_color -in highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; -#endif -#ifndef HAS_UNIFORM_u_opacity -in lowp float opacity; -#else -uniform lowp float u_opacity; -#endif -#ifndef HAS_UNIFORM_u_halo_width -in lowp float halo_width; -#else -uniform lowp float u_halo_width; -#endif -#ifndef HAS_UNIFORM_u_halo_blur -in lowp float halo_blur; -#else -uniform lowp float u_halo_blur; -#endif - -void main() { - #ifdef HAS_UNIFORM_u_fill_color -highp vec4 fill_color = u_fill_color; -#endif - #ifdef HAS_UNIFORM_u_halo_color -highp vec4 halo_color = u_halo_color; -#endif - #ifdef HAS_UNIFORM_u_opacity -lowp float opacity = u_opacity; -#endif - #ifdef HAS_UNIFORM_u_halo_width -lowp float halo_width = u_halo_width; -#endif - #ifdef HAS_UNIFORM_u_halo_blur -lowp float halo_blur = u_halo_blur; -#endif - - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; - - vec2 tex = v_data0.xy; - float gamma_scale = v_data1.x; - float size = v_data1.y; - float fade_opacity = v_data1[2]; - - float fontScale = u_is_text ? size / 24.0 : size; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} -)"; -}; - -} // namespace shaders -} // namespace mbgl diff --git a/include/mbgl/shaders/gl/symbol_text_and_icon.hpp b/include/mbgl/shaders/gl/symbol_text_and_icon.hpp index 6cb8f109f3ad..4b55116f1297 100644 --- a/include/mbgl/shaders/gl/symbol_text_and_icon.hpp +++ b/include/mbgl/shaders/gl/symbol_text_and_icon.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "SymbolTextAndIconProgram"; +struct ShaderSource { + static constexpr const char* name = "SymbolTextAndIconShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; layout (location = 1) in vec4 a_data; layout (location = 2) in vec3 a_projected_pos; @@ -20,63 +20,90 @@ layout (location = 3) in float a_fade_opacity; // For composite functions: // [ text-size(lowerZoomStop, feature), // text-size(upperZoomStop, feature) ] -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; -uniform bool u_is_text; -uniform bool u_pitch_with_map; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform highp float u_camera_to_center_distance; -uniform float u_fade_change; -uniform vec2 u_texsize; -uniform vec2 u_texsize_icon; + +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform SymbolDrawableUBO { + highp mat4 u_matrix; + highp mat4 u_label_plane_matrix; + highp mat4 u_coord_matrix; + + highp vec2 u_texsize; + highp vec2 u_texsize_icon; + + bool u_is_text_prop; + bool u_rotate_symbol; + bool u_pitch_with_map; + bool u_is_size_zoom_constant; + bool u_is_size_feature_constant; + + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function + highp float u_size; // used when size is both zoom and feature constant + + // Interpolations + highp float u_fill_color_t; + highp float u_halo_color_t; + highp float u_opacity_t; + highp float u_halo_width_t; + highp float u_halo_blur_t; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; out vec4 v_data0; out vec4 v_data1; #ifndef HAS_UNIFORM_u_fill_color -uniform lowp float u_fill_color_t; layout (location = 4) in highp vec4 a_fill_color; out highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; #endif #ifndef HAS_UNIFORM_u_halo_color -uniform lowp float u_halo_color_t; layout (location = 5) in highp vec4 a_halo_color; out highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; #endif #ifndef HAS_UNIFORM_u_opacity -uniform lowp float u_opacity_t; layout (location = 6) in lowp vec2 a_opacity; out lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_halo_width -uniform lowp float u_halo_width_t; layout (location = 7) in lowp vec2 a_halo_width; out lowp float halo_width; -#else -uniform lowp float u_halo_width; #endif #ifndef HAS_UNIFORM_u_halo_blur -uniform lowp float u_halo_blur_t; layout (location = 8) in lowp vec2 a_halo_blur; out lowp float halo_blur; -#else -uniform lowp float u_halo_blur; #endif void main() { + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; + #ifndef HAS_UNIFORM_u_fill_color fill_color = unpack_mix_color(a_fill_color, u_fill_color_t); #else @@ -165,7 +192,7 @@ lowp float halo_blur = u_halo_blur; float gamma_scale = gl_Position.w; vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; + float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); v_data0.xy = a_tex / u_texsize; @@ -178,42 +205,57 @@ lowp float halo_blur = u_halo_blur; #define SDF 1.0 #define ICON 0.0 -uniform bool u_is_halo; +layout (std140) uniform SymbolTilePropsUBO { + bool u_is_text; + bool u_is_halo; + highp float u_gamma_scale; + lowp float tileprops_pad1; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; + uniform sampler2D u_texture; uniform sampler2D u_texture_icon; -uniform highp float u_gamma_scale; -uniform lowp float u_device_pixel_ratio; in vec4 v_data0; in vec4 v_data1; #ifndef HAS_UNIFORM_u_fill_color in highp vec4 fill_color; -#else -uniform highp vec4 u_fill_color; #endif #ifndef HAS_UNIFORM_u_halo_color in highp vec4 halo_color; -#else -uniform highp vec4 u_halo_color; #endif #ifndef HAS_UNIFORM_u_opacity in lowp float opacity; -#else -uniform lowp float u_opacity; #endif #ifndef HAS_UNIFORM_u_halo_width in lowp float halo_width; -#else -uniform lowp float u_halo_width; #endif #ifndef HAS_UNIFORM_u_halo_blur in lowp float halo_blur; -#else -uniform lowp float u_halo_blur; #endif void main() { + highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + #ifdef HAS_UNIFORM_u_fill_color highp vec4 fill_color = u_fill_color; #endif @@ -245,7 +287,7 @@ lowp float halo_blur = u_halo_blur; vec2 tex = v_data0.xy; - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; + float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; float gamma_scale = v_data1.x; float size = v_data1.y; diff --git a/include/mbgl/shaders/gl/drawable_wide_vector.hpp b/include/mbgl/shaders/gl/wide_vector.hpp similarity index 100% rename from include/mbgl/shaders/gl/drawable_wide_vector.hpp rename to include/mbgl/shaders/gl/wide_vector.hpp diff --git a/include/mbgl/shaders/shader_manifest.hpp b/include/mbgl/shaders/shader_manifest.hpp index 1f537fae29fc..3ff0c80423c2 100644 --- a/include/mbgl/shaders/shader_manifest.hpp +++ b/include/mbgl/shaders/shader_manifest.hpp @@ -3,61 +3,36 @@ #include #if MLN_RENDER_BACKEND_OPENGL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include #include #include #include -#include #include #include +#include +#include #include -#include -#include -#include +#include #include #include -#include -#include +#include +#include +#include +#include #include +#include #include #include +#include #include #include +#include +#include #include -#include #include #include -#include -#include +#include #include +#include #endif diff --git a/include/mbgl/shaders/shader_source.hpp b/include/mbgl/shaders/shader_source.hpp index 4ae34388e05f..5e387d186883 100644 --- a/include/mbgl/shaders/shader_source.hpp +++ b/include/mbgl/shaders/shader_source.hpp @@ -9,6 +9,8 @@ namespace shaders { /// source code for the desired program and graphics back-end. enum class BuiltIn { None, + Prelude, + ClippingMaskProgram, BackgroundShader, BackgroundPatternShader, CircleShader, @@ -38,34 +40,7 @@ enum class BuiltIn { SymbolIconShader, SymbolSDFIconShader, SymbolTextAndIconShader, - WideVectorShader, - Prelude, - BackgroundProgram, - BackgroundPatternProgram, - CircleProgram, - ClippingMaskProgram, - CollisionBoxProgram, - CollisionCircleProgram, - DebugProgram, - FillExtrusionPatternProgram, - FillExtrusionProgram, - FillOutlinePatternProgram, - FillOutlineProgram, - FillPatternProgram, - FillProgram, - HeatmapTextureProgram, - HeatmapProgram, - HillshadePrepareProgram, - HillshadeProgram, - LineGradientProgram, - LinePatternProgram, - LineSDFProgram, - LineProgram, - RasterProgram, - SymbolIconProgram, - SymbolSDFTextProgram, - SymbolSDFIconProgram, - SymbolTextAndIconProgram + WideVectorShader }; /// @brief Select shader source based on a program type and a desired diff --git a/shaders/background.fragment.glsl b/shaders/background.fragment.glsl index fdb7205e26de..2b55c4991b8b 100644 --- a/shaders/background.fragment.glsl +++ b/shaders/background.fragment.glsl @@ -1,9 +1,13 @@ -uniform vec4 u_color; -uniform float u_opacity; +layout (std140) uniform BackgroundPropsUBO { + highp vec4 u_color; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; void main() { fragColor = u_color * u_opacity; - #ifdef OVERDRAW_INSPECTOR fragColor = vec4(1.0); #endif diff --git a/shaders/background.vertex.glsl b/shaders/background.vertex.glsl index 3b0ec957fb9c..5e4c0dd3dc29 100644 --- a/shaders/background.vertex.glsl +++ b/shaders/background.vertex.glsl @@ -1,5 +1,7 @@ layout (location = 0) in vec2 a_pos; -uniform mat4 u_matrix; +layout (std140) uniform BackgroundDrawableUBO { + highp mat4 u_matrix; +}; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); diff --git a/shaders/background_pattern.fragment.glsl b/shaders/background_pattern.fragment.glsl index 7cbb25d9c041..8729d5d62542 100644 --- a/shaders/background_pattern.fragment.glsl +++ b/shaders/background_pattern.fragment.glsl @@ -1,23 +1,40 @@ -uniform vec2 u_pattern_tl_a; -uniform vec2 u_pattern_br_a; -uniform vec2 u_pattern_tl_b; -uniform vec2 u_pattern_br_b; -uniform vec2 u_texsize; -uniform float u_mix; -uniform float u_opacity; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform BackgroundPatternPropsUBO { + highp vec2 u_pattern_tl_a; + highp vec2 u_pattern_br_a; + highp vec2 u_pattern_tl_b; + highp vec2 u_pattern_br_b; + highp vec2 u_pattern_size_a; + highp vec2 u_pattern_size_b; + highp float u_scale_a; + highp float u_scale_b; + highp float u_mix; + highp float u_opacity; +}; uniform sampler2D u_image; -in vec2 v_pos_a; -in vec2 v_pos_b; +in mediump vec2 v_pos_a; +in mediump vec2 v_pos_b; void main() { vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord); + vec2 pos = mix(u_pattern_tl_a / u_pattern_atlas_texsize, u_pattern_br_a / u_pattern_atlas_texsize, imagecoord); vec4 color1 = texture(u_image, pos); vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b); + vec2 pos2 = mix(u_pattern_tl_b / u_pattern_atlas_texsize, u_pattern_br_b / u_pattern_atlas_texsize, imagecoord_b); vec4 color2 = texture(u_image, pos2); fragColor = mix(color1, color2, u_mix) * u_opacity; diff --git a/shaders/background_pattern.vertex.glsl b/shaders/background_pattern.vertex.glsl index ddada5e6c5df..1341c0651ae0 100644 --- a/shaders/background_pattern.vertex.glsl +++ b/shaders/background_pattern.vertex.glsl @@ -1,15 +1,29 @@ -uniform mat4 u_matrix; -uniform vec2 u_pattern_size_a; -uniform vec2 u_pattern_size_b; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform float u_scale_a; -uniform float u_scale_b; -uniform float u_tile_units_to_pixels; +layout (std140) uniform BackgroundPatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_units_to_pixels; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; +}; + +layout (std140) uniform BackgroundPatternPropsUBO { + highp vec2 u_pattern_tl_a; + highp vec2 u_pattern_br_a; + highp vec2 u_pattern_tl_b; + highp vec2 u_pattern_br_b; + highp vec2 u_pattern_size_a; + highp vec2 u_pattern_size_b; + highp float u_scale_a; + highp float u_scale_b; + highp float u_mix; + highp float u_opacity; +}; layout (location = 0) in vec2 a_pos; -out vec2 v_pos_a; -out vec2 v_pos_b; +out mediump vec2 v_pos_a; +out mediump vec2 v_pos_b; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); diff --git a/shaders/circle.fragment.glsl b/shaders/circle.fragment.glsl index 9aa80256591d..afb58420e06a 100644 --- a/shaders/circle.fragment.glsl +++ b/shaders/circle.fragment.glsl @@ -1,5 +1,18 @@ in vec3 v_data; +layout (std140) uniform CircleEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_stroke_color; + mediump float u_radius; + lowp float u_blur; + lowp float u_opacity; + mediump float u_stroke_width; + lowp float u_stroke_opacity; + bool u_scale_with_map; + bool u_pitch_with_map; + lowp float props_pad1; +}; + #pragma mapbox: define highp vec4 color #pragma mapbox: define mediump float radius #pragma mapbox: define lowp float blur diff --git a/shaders/circle.vertex.glsl b/shaders/circle.vertex.glsl index 96cca8760776..a6c16eea5ac9 100644 --- a/shaders/circle.vertex.glsl +++ b/shaders/circle.vertex.glsl @@ -1,13 +1,47 @@ -uniform mat4 u_matrix; -uniform bool u_scale_with_map; -uniform bool u_pitch_with_map; -uniform vec2 u_extrude_scale; -uniform lowp float u_device_pixel_ratio; -uniform highp float u_camera_to_center_distance; - layout (location = 0) in vec2 a_pos; out vec3 v_data; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CircleDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_extrude_scale; + // Interpolations + lowp float u_color_t; + lowp float u_radius_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_stroke_color_t; + lowp float u_stroke_width_t; + lowp float u_stroke_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; + lowp float drawable_pad3; +}; + +layout (std140) uniform CircleEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_stroke_color; + mediump float u_radius; + lowp float u_blur; + lowp float u_opacity; + mediump float u_stroke_width; + lowp float u_stroke_opacity; + bool u_scale_with_map; + bool u_pitch_with_map; + lowp float props_pad1; +}; + #pragma mapbox: define highp vec4 color #pragma mapbox: define mediump float radius #pragma mapbox: define lowp float blur @@ -57,7 +91,7 @@ void main(void) { // This is a minimum blur distance that serves as a faux-antialiasing for // the circle. since blur is a ratio of the circle's size and the intent is // to keep the blur at roughly 1px, the two are inversely related. - lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width); + lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width); v_data = vec3(extrude.x, extrude.y, antialiasblur); } diff --git a/shaders/collision_box.fragment.glsl b/shaders/collision_box.fragment.glsl index 7132879bd74c..7fe3151dc105 100644 --- a/shaders/collision_box.fragment.glsl +++ b/shaders/collision_box.fragment.glsl @@ -1,4 +1,3 @@ - in float v_placed; in float v_notUsed; diff --git a/shaders/collision_box.vertex.glsl b/shaders/collision_box.vertex.glsl index f5bd79acb8c5..eca7f956862c 100644 --- a/shaders/collision_box.vertex.glsl +++ b/shaders/collision_box.vertex.glsl @@ -4,9 +4,27 @@ layout (location = 2) in vec2 a_extrude; layout (location = 3) in vec2 a_placed; layout (location = 4) in vec2 a_shift; -uniform mat4 u_matrix; -uniform vec2 u_extrude_scale; -uniform float u_camera_to_center_distance; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; out float v_placed; out float v_notUsed; diff --git a/shaders/collision_circle.fragment.glsl b/shaders/collision_circle.fragment.glsl index 9623672ae657..611cf6b9cacc 100644 --- a/shaders/collision_circle.fragment.glsl +++ b/shaders/collision_circle.fragment.glsl @@ -1,4 +1,20 @@ -uniform float u_overscale_factor; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; in float v_placed; in float v_notUsed; diff --git a/shaders/collision_circle.vertex.glsl b/shaders/collision_circle.vertex.glsl index 2d61e47c9c4c..2cc20f008b1d 100644 --- a/shaders/collision_circle.vertex.glsl +++ b/shaders/collision_circle.vertex.glsl @@ -3,9 +3,27 @@ layout (location = 1) in vec2 a_anchor_pos; layout (location = 2) in vec2 a_extrude; layout (location = 3) in vec2 a_placed; -uniform mat4 u_matrix; -uniform vec2 u_extrude_scale; -uniform float u_camera_to_center_distance; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform CollisionDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform CollisionTilePropsUBO { + highp vec2 u_extrude_scale; + highp float u_overscale_factor; + lowp float drawable_pad1; +}; out float v_placed; out float v_notUsed; diff --git a/shaders/drawable.custom.symbol_icon.fragment.glsl b/shaders/custom.symbol_icon.fragment.glsl similarity index 100% rename from shaders/drawable.custom.symbol_icon.fragment.glsl rename to shaders/custom.symbol_icon.fragment.glsl diff --git a/shaders/drawable.custom.symbol_icon.vertex.glsl b/shaders/custom.symbol_icon.vertex.glsl similarity index 100% rename from shaders/drawable.custom.symbol_icon.vertex.glsl rename to shaders/custom.symbol_icon.vertex.glsl diff --git a/shaders/drawable.custom_geometry.fragment.glsl b/shaders/custom_geometry.fragment.glsl similarity index 100% rename from shaders/drawable.custom_geometry.fragment.glsl rename to shaders/custom_geometry.fragment.glsl diff --git a/shaders/drawable.custom_geometry.vertex.glsl b/shaders/custom_geometry.vertex.glsl similarity index 100% rename from shaders/drawable.custom_geometry.vertex.glsl rename to shaders/custom_geometry.vertex.glsl diff --git a/shaders/debug.fragment.glsl b/shaders/debug.fragment.glsl index 53e0f40d7379..2376634a8818 100644 --- a/shaders/debug.fragment.glsl +++ b/shaders/debug.fragment.glsl @@ -1,4 +1,12 @@ -uniform highp vec4 u_color; +layout (std140) uniform DebugUBO { + highp mat4 u_matrix; + highp vec4 u_color; + highp float u_overlay_scale; + lowp float pad1; + lowp float pad2; + lowp float pad3; +}; + uniform sampler2D u_overlay; in vec2 v_uv; diff --git a/shaders/debug.vertex.glsl b/shaders/debug.vertex.glsl index f459ffe419f8..10236b141f21 100644 --- a/shaders/debug.vertex.glsl +++ b/shaders/debug.vertex.glsl @@ -1,8 +1,14 @@ layout (location = 0) in vec2 a_pos; out vec2 v_uv; -uniform mat4 u_matrix; -uniform float u_overlay_scale; +layout (std140) uniform DebugUBO { + highp mat4 u_matrix; + highp vec4 u_color; + highp float u_overlay_scale; + lowp float pad1; + lowp float pad2; + lowp float pad3; +}; void main() { // This vertex shader expects a EXTENT x EXTENT quad, diff --git a/shaders/drawable.background.fragment.glsl b/shaders/drawable.background.fragment.glsl deleted file mode 100644 index 2b55c4991b8b..000000000000 --- a/shaders/drawable.background.fragment.glsl +++ /dev/null @@ -1,14 +0,0 @@ -layout (std140) uniform BackgroundPropsUBO { - highp vec4 u_color; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - fragColor = u_color * u_opacity; -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.background.vertex.glsl b/shaders/drawable.background.vertex.glsl deleted file mode 100644 index 5e4c0dd3dc29..000000000000 --- a/shaders/drawable.background.vertex.glsl +++ /dev/null @@ -1,8 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (std140) uniform BackgroundDrawableUBO { - highp mat4 u_matrix; -}; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); -} diff --git a/shaders/drawable.background_pattern.fragment.glsl b/shaders/drawable.background_pattern.fragment.glsl deleted file mode 100644 index 8729d5d62542..000000000000 --- a/shaders/drawable.background_pattern.fragment.glsl +++ /dev/null @@ -1,45 +0,0 @@ -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform BackgroundPatternPropsUBO { - highp vec2 u_pattern_tl_a; - highp vec2 u_pattern_br_a; - highp vec2 u_pattern_tl_b; - highp vec2 u_pattern_br_b; - highp vec2 u_pattern_size_a; - highp vec2 u_pattern_size_b; - highp float u_scale_a; - highp float u_scale_b; - highp float u_mix; - highp float u_opacity; -}; - -uniform sampler2D u_image; - -in mediump vec2 v_pos_a; -in mediump vec2 v_pos_b; - -void main() { - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a / u_pattern_atlas_texsize, u_pattern_br_a / u_pattern_atlas_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b / u_pattern_atlas_texsize, u_pattern_br_b / u_pattern_atlas_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - fragColor = mix(color1, color2, u_mix) * u_opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.background_pattern.vertex.glsl b/shaders/drawable.background_pattern.vertex.glsl deleted file mode 100644 index 1341c0651ae0..000000000000 --- a/shaders/drawable.background_pattern.vertex.glsl +++ /dev/null @@ -1,33 +0,0 @@ -layout (std140) uniform BackgroundPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_units_to_pixels; - lowp float drawable_pad1; - lowp float drawable_pad2; - lowp float drawable_pad3; -}; - -layout (std140) uniform BackgroundPatternPropsUBO { - highp vec2 u_pattern_tl_a; - highp vec2 u_pattern_br_a; - highp vec2 u_pattern_tl_b; - highp vec2 u_pattern_br_b; - highp vec2 u_pattern_size_a; - highp vec2 u_pattern_size_b; - highp float u_scale_a; - highp float u_scale_b; - highp float u_mix; - highp float u_opacity; -}; - -layout (location = 0) in vec2 a_pos; -out mediump vec2 v_pos_a; -out mediump vec2 v_pos_b; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos); -} diff --git a/shaders/drawable.circle.fragment.glsl b/shaders/drawable.circle.fragment.glsl deleted file mode 100644 index afb58420e06a..000000000000 --- a/shaders/drawable.circle.fragment.glsl +++ /dev/null @@ -1,52 +0,0 @@ -in vec3 v_data; - -layout (std140) uniform CircleEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_stroke_color; - mediump float u_radius; - lowp float u_blur; - lowp float u_opacity; - mediump float u_stroke_width; - lowp float u_stroke_opacity; - bool u_scale_with_map; - bool u_pitch_with_map; - lowp float props_pad1; -}; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define mediump float radius -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define highp vec4 stroke_color -#pragma mapbox: define mediump float stroke_width -#pragma mapbox: define lowp float stroke_opacity - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize mediump float radius - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize highp vec4 stroke_color - #pragma mapbox: initialize mediump float stroke_width - #pragma mapbox: initialize lowp float stroke_opacity - - vec2 extrude = v_data.xy; - float extrude_length = length(extrude); - - lowp float antialiasblur = v_data.z; - float antialiased_blur = -max(blur, antialiasblur); - - float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0); - - float color_t = stroke_width < 0.01 ? 0.0 : smoothstep( - antialiased_blur, - 0.0, - extrude_length - radius / (radius + stroke_width) - ); - - fragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.circle.vertex.glsl b/shaders/drawable.circle.vertex.glsl deleted file mode 100644 index a6c16eea5ac9..000000000000 --- a/shaders/drawable.circle.vertex.glsl +++ /dev/null @@ -1,97 +0,0 @@ -layout (location = 0) in vec2 a_pos; -out vec3 v_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CircleDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_extrude_scale; - // Interpolations - lowp float u_color_t; - lowp float u_radius_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_stroke_color_t; - lowp float u_stroke_width_t; - lowp float u_stroke_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; - lowp float drawable_pad3; -}; - -layout (std140) uniform CircleEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_stroke_color; - mediump float u_radius; - lowp float u_blur; - lowp float u_opacity; - mediump float u_stroke_width; - lowp float u_stroke_opacity; - bool u_scale_with_map; - bool u_pitch_with_map; - lowp float props_pad1; -}; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define mediump float radius -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define highp vec4 stroke_color -#pragma mapbox: define mediump float stroke_width -#pragma mapbox: define lowp float stroke_opacity - -void main(void) { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize mediump float radius - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize highp vec4 stroke_color - #pragma mapbox: initialize mediump float stroke_width - #pragma mapbox: initialize lowp float stroke_opacity - - // unencode the extrusion vector that we snuck into the a_pos vector - vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0); - - // multiply a_pos by 0.5, since we had it * 2 in order to sneak - // in extrusion data - vec2 circle_center = floor(a_pos * 0.5); - if (u_pitch_with_map) { - vec2 corner_position = circle_center; - if (u_scale_with_map) { - corner_position += extrude * (radius + stroke_width) * u_extrude_scale; - } else { - // Pitching the circle with the map effectively scales it with the map - // To counteract the effect for pitch-scale: viewport, we rescale the - // whole circle based on the pitch scaling effect at its central point - vec4 projected_center = u_matrix * vec4(circle_center, 0, 1); - corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance); - } - - gl_Position = u_matrix * vec4(corner_position, 0, 1); - } else { - gl_Position = u_matrix * vec4(circle_center, 0, 1); - - if (u_scale_with_map) { - gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance; - } else { - gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w; - } - } - - // This is a minimum blur distance that serves as a faux-antialiasing for - // the circle. since blur is a ratio of the circle's size and the intent is - // to keep the blur at roughly 1px, the two are inversely related. - lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width); - - v_data = vec3(extrude.x, extrude.y, antialiasblur); -} diff --git a/shaders/drawable.collision_box.fragment.glsl b/shaders/drawable.collision_box.fragment.glsl deleted file mode 100644 index 7fe3151dc105..000000000000 --- a/shaders/drawable.collision_box.fragment.glsl +++ /dev/null @@ -1,20 +0,0 @@ -in float v_placed; -in float v_notUsed; - -void main() { - - float alpha = 0.5; - - // Red = collision, hide label - fragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (v_placed > 0.5) { - fragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (v_notUsed > 0.5) { - // This box not used, fade it out - fragColor *= .1; - } -} diff --git a/shaders/drawable.collision_box.vertex.glsl b/shaders/drawable.collision_box.vertex.glsl deleted file mode 100644 index eca7f956862c..000000000000 --- a/shaders/drawable.collision_box.vertex.glsl +++ /dev/null @@ -1,45 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_anchor_pos; -layout (location = 2) in vec2 a_extrude; -layout (location = 3) in vec2 a_placed; -layout (location = 4) in vec2 a_shift; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -out float v_placed; -out float v_notUsed; - -void main() { - vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - highp float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles - 4.0); - - gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); - gl_Position.xy += (a_extrude + a_shift) * u_extrude_scale * gl_Position.w * collision_perspective_ratio; - - v_placed = a_placed.x; - v_notUsed = a_placed.y; -} diff --git a/shaders/drawable.collision_circle.fragment.glsl b/shaders/drawable.collision_circle.fragment.glsl deleted file mode 100644 index 611cf6b9cacc..000000000000 --- a/shaders/drawable.collision_circle.fragment.glsl +++ /dev/null @@ -1,50 +0,0 @@ -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -in float v_placed; -in float v_notUsed; -in float v_radius; -in highp vec2 v_extrude; -in vec2 v_extrude_scale; - -void main() { - float alpha = 0.5; - - // Red = collision, hide label - vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha; - - // Blue = no collision, label is showing - if (v_placed > 0.5) { - color = vec4(0.0, 0.0, 1.0, 0.5) * alpha; - } - - if (v_notUsed > 0.5) { - // This box not used, fade it out - color *= .2; - } - - float extrude_scale_length = length(v_extrude_scale); - float extrude_length = length(v_extrude) * extrude_scale_length; - float stroke_width = 15.0 * extrude_scale_length / u_overscale_factor; - float radius = v_radius * extrude_scale_length; - - float distance_to_edge = abs(extrude_length - radius); - float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge); - - fragColor = opacity_t * color; -} diff --git a/shaders/drawable.collision_circle.vertex.glsl b/shaders/drawable.collision_circle.vertex.glsl deleted file mode 100644 index 2cc20f008b1d..000000000000 --- a/shaders/drawable.collision_circle.vertex.glsl +++ /dev/null @@ -1,53 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_anchor_pos; -layout (location = 2) in vec2 a_extrude; -layout (location = 3) in vec2 a_placed; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform CollisionDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform CollisionTilePropsUBO { - highp vec2 u_extrude_scale; - highp float u_overscale_factor; - lowp float drawable_pad1; -}; - -out float v_placed; -out float v_notUsed; -out float v_radius; -out highp vec2 v_extrude; -out vec2 v_extrude_scale; - -void main() { - vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - highp float collision_perspective_ratio = clamp( - 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance), - 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles - 4.0); - - gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); - - highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur - gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio; - - v_placed = a_placed.x; - v_notUsed = a_placed.y; - v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius - - v_extrude = a_extrude * padding_factor; - v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio; -} diff --git a/shaders/drawable.debug.fragment.glsl b/shaders/drawable.debug.fragment.glsl deleted file mode 100644 index 2376634a8818..000000000000 --- a/shaders/drawable.debug.fragment.glsl +++ /dev/null @@ -1,17 +0,0 @@ -layout (std140) uniform DebugUBO { - highp mat4 u_matrix; - highp vec4 u_color; - highp float u_overlay_scale; - lowp float pad1; - lowp float pad2; - lowp float pad3; -}; - -uniform sampler2D u_overlay; - -in vec2 v_uv; - -void main() { - vec4 overlay_color = texture(u_overlay, v_uv); - fragColor = mix(u_color, overlay_color, overlay_color.a); -} diff --git a/shaders/drawable.debug.vertex.glsl b/shaders/drawable.debug.vertex.glsl deleted file mode 100644 index 10236b141f21..000000000000 --- a/shaders/drawable.debug.vertex.glsl +++ /dev/null @@ -1,18 +0,0 @@ -layout (location = 0) in vec2 a_pos; -out vec2 v_uv; - -layout (std140) uniform DebugUBO { - highp mat4 u_matrix; - highp vec4 u_color; - highp float u_overlay_scale; - lowp float pad1; - lowp float pad2; - lowp float pad3; -}; - -void main() { - // This vertex shader expects a EXTENT x EXTENT quad, - // The UV co-ordinates for the overlay texture can be calculated using that knowledge - v_uv = a_pos / 8192.0; - gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, 0, 1); -} diff --git a/shaders/drawable.fill.fragment.glsl b/shaders/drawable.fill.fragment.glsl deleted file mode 100644 index cd2d2aa4a80a..000000000000 --- a/shaders/drawable.fill.fragment.glsl +++ /dev/null @@ -1,22 +0,0 @@ -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float opacity - - fragColor = color * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill.vertex.glsl b/shaders/drawable.fill.vertex.glsl deleted file mode 100644 index f77883221c9a..000000000000 --- a/shaders/drawable.fill.vertex.glsl +++ /dev/null @@ -1,29 +0,0 @@ -layout (std140) uniform FillDrawableUBO { - highp mat4 u_matrix; - // Interpolations - highp float u_color_t; - highp float u_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float opacity - - gl_Position = u_matrix * vec4(a_pos, 0, 1); -} diff --git a/shaders/drawable.fill_extrusion.fragment.glsl b/shaders/drawable.fill_extrusion.fragment.glsl deleted file mode 100644 index c7913c30ee45..000000000000 --- a/shaders/drawable.fill_extrusion.fragment.glsl +++ /dev/null @@ -1,9 +0,0 @@ -in vec4 v_color; - -void main() { - fragColor = v_color; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill_extrusion.vertex.glsl b/shaders/drawable.fill_extrusion.vertex.glsl deleted file mode 100644 index ae4dc60fd264..000000000000 --- a/shaders/drawable.fill_extrusion.vertex.glsl +++ /dev/null @@ -1,96 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec4 a_normal_ed; -out vec4 v_color; - -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; - // Interpolations - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -#pragma mapbox: define highp float base -#pragma mapbox: define highp float height -#pragma mapbox: define highp vec4 color - -void main() { - #pragma mapbox: initialize highp float base - #pragma mapbox: initialize highp float height - #pragma mapbox: initialize highp vec4 color - - vec3 normal = a_normal_ed.xyz; - - base = max(0.0, base); - height = max(0.0, height); - - float t = mod(normal.x, 2.0); - - gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1); - - // Relative luminance (how dark/bright is the surface color?) - float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; - - v_color = vec4(0.0, 0.0, 0.0, 1.0); - - // Add slight ambient lighting so no extrusions are totally black - vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0); - color += ambientlight; - - // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray - float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0); - - // Adjust directional so that - // the range of values for highlight/shading is narrower - // with lower light intensity - // and with lighter/brighter surface colors - directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional); - - // Add gradient along z axis of side surfaces - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - u_vertical_gradient) + - (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0))); - } - - // Assign final color based on surface + ambient light color, diffuse light directional, and light color - // with lower bounds adjusted to hue of light - // so that shading is tinted with the complementary (opposite) color to the light color - v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0); - v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0); - v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0); - v_color *= u_opacity; -} diff --git a/shaders/drawable.fill_extrusion_pattern.fragment.glsl b/shaders/drawable.fill_extrusion_pattern.fragment.glsl deleted file mode 100644 index a4ce886e3d9a..000000000000 --- a/shaders/drawable.fill_extrusion_pattern.fragment.glsl +++ /dev/null @@ -1,62 +0,0 @@ -in vec2 v_pos_a; -in vec2 v_pos_b; -in vec4 v_lighting; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -#pragma mapbox: define lowp float base -#pragma mapbox: define lowp float height -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float base - #pragma mapbox: initialize lowp float height - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - vec4 mixedColor = mix(color1, color2, u_fade); - - fragColor = mixedColor * v_lighting; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill_extrusion_pattern.vertex.glsl b/shaders/drawable.fill_extrusion_pattern.vertex.glsl deleted file mode 100644 index 71645f7f3df9..000000000000 --- a/shaders/drawable.fill_extrusion_pattern.vertex.glsl +++ /dev/null @@ -1,115 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec4 a_normal_ed; - -out vec2 v_pos_a; -out vec2 v_pos_b; -out vec4 v_lighting; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillExtrusionDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_height_factor; - highp float u_tile_ratio; - // Interpolations - highp float u_base_t; - highp float u_height_t; - highp float u_color_t; - highp float u_pattern_from_t; - highp float u_pattern_to_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform FillExtrusionTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillExtrusionPropsUBO { - highp vec4 u_color; - highp vec3 u_lightcolor; - lowp float props_pad1; - highp vec3 u_lightpos; - highp float u_base; - highp float u_height; - highp float u_lightintensity; - highp float u_vertical_gradient; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; - lowp float props_pad2; -}; - -#pragma mapbox: define lowp float base -#pragma mapbox: define lowp float height -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float base - #pragma mapbox: initialize lowp float height - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - vec3 normal = a_normal_ed.xyz; - float edgedistance = a_normal_ed.w; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - base = max(0.0, base); - height = max(0.0, height); - - float t = mod(normal.x, 2.0); - float z = t > 0.0 ? height : base; - - gl_Position = u_matrix * vec4(a_pos, z, 1); - - vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0 - ? a_pos // extrusion top - : vec2(edgedistance, z * u_height_factor); // extrusion side - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos); - - v_lighting = vec4(0.0, 0.0, 0.0, 1.0); - float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0); - directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional); - - if (normal.y != 0.0) { - // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient, - // and otherwise calculates the gradient based on base + height - directional *= ( - (1.0 - u_vertical_gradient) + - (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0))); - } - - v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0)); - v_lighting *= u_opacity; -} diff --git a/shaders/drawable.fill_outline.fragment.glsl b/shaders/drawable.fill_outline.fragment.glsl deleted file mode 100644 index eacab7664996..000000000000 --- a/shaders/drawable.fill_outline.fragment.glsl +++ /dev/null @@ -1,26 +0,0 @@ -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -in vec2 v_pos; - -#pragma mapbox: define highp vec4 outline_color -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize highp vec4 outline_color - #pragma mapbox: initialize lowp float opacity - - float dist = length(v_pos - gl_FragCoord.xy); - float alpha = 1.0 - smoothstep(0.0, 1.0, dist); - fragColor = outline_color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill_outline.vertex.glsl b/shaders/drawable.fill_outline.vertex.glsl deleted file mode 100644 index 50dadb4c3ddb..000000000000 --- a/shaders/drawable.fill_outline.vertex.glsl +++ /dev/null @@ -1,44 +0,0 @@ -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillOutlineDrawableUBO { - highp mat4 u_matrix; - // Interpolations - highp float u_outline_color_t; - highp float u_opacity_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos; - -#pragma mapbox: define highp vec4 outline_color -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize highp vec4 outline_color - #pragma mapbox: initialize lowp float opacity - - gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; -} diff --git a/shaders/drawable.fill_outline_pattern.fragment.glsl b/shaders/drawable.fill_outline_pattern.fragment.glsl deleted file mode 100644 index 7e6175401681..000000000000 --- a/shaders/drawable.fill_outline_pattern.fragment.glsl +++ /dev/null @@ -1,57 +0,0 @@ -layout (std140) uniform FillOutlinePatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -uniform sampler2D u_image; - -in vec2 v_pos_a; -in vec2 v_pos_b; -in vec2 v_pos; - -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - // find distance to outline for alpha interpolation - - float dist = length(v_pos - gl_FragCoord.xy); - float alpha = 1.0 - smoothstep(0.0, 1.0, dist); - - - fragColor = mix(color1, color2, u_fade) * alpha * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill_outline_pattern.vertex.glsl b/shaders/drawable.fill_outline_pattern.vertex.glsl deleted file mode 100644 index ebedb8cd0fce..000000000000 --- a/shaders/drawable.fill_outline_pattern.vertex.glsl +++ /dev/null @@ -1,75 +0,0 @@ -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillOutlinePatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_ratio; - // Interpolations - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; -}; - -layout (std140) uniform FillOutlinePatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos_a; -out vec2 v_pos_b; -out vec2 v_pos; - -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos); - - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; -} diff --git a/shaders/drawable.fill_pattern.fragment.glsl b/shaders/drawable.fill_pattern.fragment.glsl deleted file mode 100644 index 37f2d0caaf64..000000000000 --- a/shaders/drawable.fill_pattern.fragment.glsl +++ /dev/null @@ -1,54 +0,0 @@ -layout (std140) uniform FillPatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -uniform sampler2D u_image; - -in vec2 v_pos_a; -in vec2 v_pos_b; - -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - if (u_texsize.x < 1.0 || u_texsize.y < 1.0) { - discard; - } - - vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); - vec4 color1 = texture(u_image, pos); - - vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b); - vec4 color2 = texture(u_image, pos2); - - fragColor = mix(color1, color2, u_fade) * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.fill_pattern.vertex.glsl b/shaders/drawable.fill_pattern.vertex.glsl deleted file mode 100644 index 574ac994e248..000000000000 --- a/shaders/drawable.fill_pattern.vertex.glsl +++ /dev/null @@ -1,71 +0,0 @@ -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform FillPatternDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_pixel_coord_upper; - highp vec2 u_pixel_coord_lower; - highp float u_tile_ratio; - // Interpolations - highp float u_pattern_from_t; - highp float u_pattern_to_t; - highp float u_opacity_t; -}; - -layout (std140) uniform FillPatternTilePropsUBO { - highp vec4 u_pattern_from; - highp vec4 u_pattern_to; - highp vec2 u_texsize; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform FillEvaluatedPropsUBO { - highp vec4 u_color; - highp vec4 u_outline_color; - highp float u_opacity; - highp float u_fade; - highp float u_from_scale; - highp float u_to_scale; -}; - -layout (location = 0) in vec2 a_pos; - -out vec2 v_pos_a; -out vec2 v_pos_b; - -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_pixel_ratio; - float tileZoomRatio = u_tile_ratio; - float fromScale = u_from_scale; - float toScale = u_to_scale; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, a_pos); - v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos); -} diff --git a/shaders/drawable.heatmap.fragment.glsl b/shaders/drawable.heatmap.fragment.glsl deleted file mode 100644 index d98ce5b8d7f1..000000000000 --- a/shaders/drawable.heatmap.fragment.glsl +++ /dev/null @@ -1,27 +0,0 @@ -in vec2 v_extrude; - -layout (std140) uniform HeatmapEvaluatedPropsUBO { - highp float u_weight; - highp float u_radius; - highp float u_intensity; - lowp float props_pad1; -}; - -#pragma mapbox: define highp float weight - -// Gaussian kernel coefficient: 1 / sqrt(2 * PI) -#define GAUSS_COEF 0.3989422804014327 - -void main() { - #pragma mapbox: initialize highp float weight - - // Kernel density estimation with a Gaussian kernel of size 5x5 - float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude); - float val = weight * u_intensity * GAUSS_COEF * exp(d); - - fragColor = vec4(val, 1.0, 1.0, 1.0); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.heatmap.vertex.glsl b/shaders/drawable.heatmap.vertex.glsl deleted file mode 100644 index 430b428b1601..000000000000 --- a/shaders/drawable.heatmap.vertex.glsl +++ /dev/null @@ -1,63 +0,0 @@ -layout (location = 0) in vec2 a_pos; -out vec2 v_extrude; - -layout (std140) uniform HeatmapDrawableUBO { - highp mat4 u_matrix; - highp float u_extrude_scale; - // Interpolations - lowp float u_weight_t; - lowp float u_radius_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform HeatmapEvaluatedPropsUBO { - highp float u_weight; - highp float u_radius; - highp float u_intensity; - lowp float props_pad1; -}; - -#pragma mapbox: define highp float weight -#pragma mapbox: define mediump float radius - -// Effective "0" in the kernel density texture to adjust the kernel size to; -// this empirically chosen number minimizes artifacts on overlapping kernels -// for typical heatmap cases (assuming clustered source) -const highp float ZERO = 1.0 / 255.0 / 16.0; - -// Gaussian kernel coefficient: 1 / sqrt(2 * PI) -#define GAUSS_COEF 0.3989422804014327 - -void main(void) { - #pragma mapbox: initialize highp float weight - #pragma mapbox: initialize mediump float radius - - // unencode the extrusion vector that we snuck into the a_pos vector - vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0); - - // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use - // it to produce the vertices of a square mesh framing the point feature - // we're adding to the kernel density texture. We'll also pass it as - // a varying, so that the fragment shader can determine the distance of - // each fragment from the point feature. - // Before we do so, we need to scale it up sufficiently so that the - // kernel falls effectively to zero at the edge of the mesh. - // That is, we want to know S such that - // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO - // Which solves to: - // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0 - float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0; - - // Pass the varying in units of radius - v_extrude = S * unscaled_extrude; - - // Scale by radius and the zoom-based scale factor to produce actual - // mesh position - vec2 extrude = v_extrude * radius * u_extrude_scale; - - // multiply a_pos by 0.5, since we had it * 2 in order to sneak - // in extrusion data - vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1); - - gl_Position = u_matrix * pos; -} diff --git a/shaders/drawable.heatmap_texture.fragment.glsl b/shaders/drawable.heatmap_texture.fragment.glsl deleted file mode 100644 index b718394c18b0..000000000000 --- a/shaders/drawable.heatmap_texture.fragment.glsl +++ /dev/null @@ -1,21 +0,0 @@ -in vec2 v_pos; -uniform sampler2D u_image; -uniform sampler2D u_color_ramp; - -layout (std140) uniform HeatmapTexturePropsUBO { - highp mat4 u_matrix; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - float t = texture(u_image, v_pos).r; - vec4 color = texture(u_color_ramp, vec2(t, 0.5)); - fragColor = color * u_opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(0.0); -#endif -} diff --git a/shaders/drawable.heatmap_texture.vertex.glsl b/shaders/drawable.heatmap_texture.vertex.glsl deleted file mode 100644 index 714540473b08..000000000000 --- a/shaders/drawable.heatmap_texture.vertex.glsl +++ /dev/null @@ -1,29 +0,0 @@ -layout (location = 0) in vec2 a_pos; -out vec2 v_pos; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform HeatmapTexturePropsUBO { - highp mat4 u_matrix; - highp float u_opacity; - lowp float props_pad1; - lowp float props_pad2; - lowp float props_pad3; -}; - -void main() { - gl_Position = u_matrix * vec4(a_pos * u_world_size, 0, 1); - - v_pos.x = a_pos.x; - v_pos.y = 1.0 - a_pos.y; -} diff --git a/shaders/drawable.hillshade.fragment.glsl b/shaders/drawable.hillshade.fragment.glsl deleted file mode 100644 index 499aa3c67d0f..000000000000 --- a/shaders/drawable.hillshade.fragment.glsl +++ /dev/null @@ -1,57 +0,0 @@ -in vec2 v_pos; -uniform sampler2D u_image; - -layout (std140) uniform HillshadeTilePropsUBO { - highp vec2 u_latrange; - highp vec2 u_light; -}; - -layout (std140) uniform HillshadeEvaluatedPropsUBO { - highp vec4 u_highlight; - highp vec4 u_shadow; - highp vec4 u_accent; -}; - -#define PI 3.141592653589793 - -void main() { - vec4 pixel = texture(u_image, v_pos); - - vec2 deriv = ((pixel.rg * 2.0) - 1.0); - - // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude - // to account for mercator projection distortion. see #4807 for details - float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1])); - // We also multiply the slope by an arbitrary z-factor of 1.25 - float slope = atan(1.25 * length(deriv) / scaleFactor); - float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0); - - float intensity = u_light.x; - // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal - // position property to account for 0deg corresponding to north/the top of the viewport in the style spec - // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal. - float azimuth = u_light.y + PI; - - // We scale the slope exponentially based on intensity, using a calculation similar to - // the exponential interpolation function in the style spec: - // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228 - // so that higher intensity values create more opaque hillshading. - float base = 1.875 - intensity * 1.75; - float maxValue = 0.5 * PI; - float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope; - - // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine - // so that the accent color's rate of change eases in while the shade color's eases out. - float accent = cos(scaledSlope); - // We multiply both the accent and shade color by a clamped intensity value - // so that intensities >= 0.5 do not additionally affect the color values - // while intensity values < 0.5 make the overall color more transparent. - vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0); - float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0); - vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0); - fragColor = accent_color * (1.0 - shade_color.a) + shade_color; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.hillshade.vertex.glsl b/shaders/drawable.hillshade.vertex.glsl deleted file mode 100644 index acbc038036d7..000000000000 --- a/shaders/drawable.hillshade.vertex.glsl +++ /dev/null @@ -1,13 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -layout (std140) uniform HillshadeDrawableUBO { - highp mat4 u_matrix; -}; - -out vec2 v_pos; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = a_texture_pos / 8192.0; -} diff --git a/shaders/drawable.hillshade_prepare.fragment.glsl b/shaders/drawable.hillshade_prepare.fragment.glsl deleted file mode 100644 index 9f7988750092..000000000000 --- a/shaders/drawable.hillshade_prepare.fragment.glsl +++ /dev/null @@ -1,77 +0,0 @@ -#ifdef GL_ES -precision highp float; -#endif - -in vec2 v_pos; -uniform sampler2D u_image; - -layout (std140) uniform HillshadePrepareTilePropsUBO { - highp vec4 u_unpack; - highp vec2 u_dimension; - highp float u_zoom; - highp float u_maxzoom; -}; - -float getElevation(vec2 coord, float bias) { - // Convert encoded elevation value to meters - vec4 data = texture(u_image, coord) * 255.0; - data.a = -1.0; - return dot(data, u_unpack) / 4.0; -} - -void main() { - vec2 epsilon = 1.0 / u_dimension; - - // queried pixels: - // +-----------+ - // | | | | - // | a | b | c | - // | | | | - // +-----------+ - // | | | | - // | d | e | f | - // | | | | - // +-----------+ - // | | | | - // | g | h | i | - // | | | | - // +-----------+ - - float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0); - float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0); - float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0); - float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0); - //float e = getElevation(v_pos, 0.0); - float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0); - float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0); - float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0); - float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0); - - // here we divide the x and y slopes by 8 * pixel size - // where pixel size (aka meters/pixel) is: - // circumference of the world / (pixels per tile * number of tiles) - // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom)) - // which can be reduced to: pow(2, 19.25619978527 - u_zoom) - // we want to vertically exaggerate the hillshading though, because otherwise - // it is barely noticeable at low zooms. to do this, we multiply this by some - // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value - // Here we use a=0.3 which works out to the expression below. see - // nickidlugash's awesome breakdown for more info - // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556 - float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3; - - vec2 deriv = vec2( - (c + f + f + i) - (a + d + d + g), - (g + h + h + i) - (a + b + b + c) - ) / pow(2.0, (u_zoom - u_maxzoom) * exaggeration + 19.2562 - u_zoom); - - fragColor = clamp(vec4( - deriv.x / 2.0 + 0.5, - deriv.y / 2.0 + 0.5, - 1.0, - 1.0), 0.0, 1.0); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.hillshade_prepare.vertex.glsl b/shaders/drawable.hillshade_prepare.vertex.glsl deleted file mode 100644 index b917e86fdb23..000000000000 --- a/shaders/drawable.hillshade_prepare.vertex.glsl +++ /dev/null @@ -1,23 +0,0 @@ -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -layout (std140) uniform HillshadePrepareDrawableUBO { - highp mat4 u_matrix; -}; - -layout (std140) uniform HillshadePrepareTilePropsUBO { - highp vec4 u_unpack; - highp vec2 u_dimension; - highp float u_zoom; - highp float u_maxzoom; -}; - -out vec2 v_pos; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - - highp vec2 epsilon = 1.0 / u_dimension; - float scale = (u_dimension.x - 2.0) / u_dimension.x; - v_pos = (a_texture_pos / 8192.0) * scale + epsilon; -} diff --git a/shaders/drawable.line.fragment.glsl b/shaders/drawable.line.fragment.glsl deleted file mode 100644 index 0d201bd28bee..000000000000 --- a/shaders/drawable.line.fragment.glsl +++ /dev/null @@ -1,40 +0,0 @@ -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -in vec2 v_width2; -in vec2 v_normal; -in float v_gamma_scale; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.line.vertex.glsl b/shaders/drawable.line.vertex.glsl deleted file mode 100644 index 5dc5f87269a9..000000000000 --- a/shaders/drawable.line.vertex.glsl +++ /dev/null @@ -1,117 +0,0 @@ -// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float drawable_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_gamma_scale; -out highp float v_linesofar; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump float gapwidth -#pragma mapbox: define lowp float offset -#pragma mapbox: define mediump float width - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump float gapwidth - #pragma mapbox: initialize lowp float offset - #pragma mapbox: initialize mediump float width - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - - v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_width2 = vec2(outset, inset); -} diff --git a/shaders/drawable.line_gradient.fragment.glsl b/shaders/drawable.line_gradient.fragment.glsl deleted file mode 100644 index a970705ab5b2..000000000000 --- a/shaders/drawable.line_gradient.fragment.glsl +++ /dev/null @@ -1,45 +0,0 @@ -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_width2; -in vec2 v_normal; -in float v_gamma_scale; -in highp float v_lineprogress; - -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - // For gradient lines, v_lineprogress is the ratio along the entire line, - // scaled to [0, 2^15), and the gradient ramp is stored in a texture. - vec4 color = texture(u_image, vec2(v_lineprogress, 0.5)); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.line_gradient.vertex.glsl b/shaders/drawable.line_gradient.vertex.glsl deleted file mode 100644 index f521a227095a..000000000000 --- a/shaders/drawable.line_gradient.vertex.glsl +++ /dev/null @@ -1,119 +0,0 @@ - -// the attribute conveying progress along a line is scaled to [0, 2^15) -#define MAX_LINE_DISTANCE 32767.0 - -// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineGradientDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_gamma_scale; -out highp float v_lineprogress; - -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump float gapwidth -#pragma mapbox: define lowp float offset -#pragma mapbox: define mediump float width - -void main() { - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump float gapwidth - #pragma mapbox: initialize lowp float offset - #pragma mapbox: initialize mediump float width - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - - v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_width2 = vec2(outset, inset); -} diff --git a/shaders/drawable.line_pattern.fragment.glsl b/shaders/drawable.line_pattern.fragment.glsl deleted file mode 100644 index 4fbcf49ecef2..000000000000 --- a/shaders/drawable.line_pattern.fragment.glsl +++ /dev/null @@ -1,86 +0,0 @@ -layout (std140) uniform LinePatternTilePropsUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; - mediump vec4 u_scale; - highp vec2 u_texsize; - highp float u_fade; - lowp float tileprops_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_normal; -in vec2 v_width2; -in float v_linesofar; -in float v_gamma_scale; - -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity - -void main() { - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - - vec2 pattern_tl_a = pattern_from.xy; - vec2 pattern_br_a = pattern_from.zw; - vec2 pattern_tl_b = pattern_to.xy; - vec2 pattern_br_b = pattern_to.zw; - - float pixelRatio = u_scale.x; - float tileZoomRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; - - vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); - vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); - - vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y); - vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y); - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - float x_a = mod(v_linesofar / pattern_size_a.x, 1.0); - float x_b = mod(v_linesofar / pattern_size_b.x, 1.0); - - // v_normal.y is 0 at the midpoint of the line, -1 at the lower edge, 1 at the upper edge - // we clamp the line width outset to be between 0 and half the pattern height plus padding (2.0) - // to ensure we don't sample outside the designated symbol on the sprite sheet. - // 0.5 is added to shift the component to be bounded between 0 and 1 for interpolation of - // the texture coordinate - float y_a = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y); - float y_b = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y); - vec2 pos_a = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, vec2(x_a, y_a)); - vec2 pos_b = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, vec2(x_b, y_b)); - - vec4 color = mix(texture(u_image, pos_a), texture(u_image, pos_b), u_fade); - - fragColor = color * alpha * opacity; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.line_pattern.vertex.glsl b/shaders/drawable.line_pattern.vertex.glsl deleted file mode 100644 index c42ab953d436..000000000000 --- a/shaders/drawable.line_pattern.vertex.glsl +++ /dev/null @@ -1,131 +0,0 @@ -// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -// We scale the distance before adding it to the buffers so that we can store -// long distances for long segments. Use this value to unscale the distance. -#define LINE_DISTANCE_SCALE 2.0 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; -layout (std140) uniform LinePatternDrawableUBO { - highp mat4 u_matrix; - mediump float u_ratio; - // Interpolations - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_offset_t; - lowp float u_gapwidth_t; - lowp float u_width_t; - lowp float u_pattern_from_t; - lowp float u_pattern_to_t; -}; - -layout (std140) uniform LinePatternTilePropsUBO { - lowp vec4 u_pattern_from; - lowp vec4 u_pattern_to; - mediump vec4 u_scale; - highp vec2 u_texsize; - highp float u_fade; - lowp float tileprops_pad1; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out float v_linesofar; -out float v_gamma_scale; - -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float offset -#pragma mapbox: define mediump float gapwidth -#pragma mapbox: define mediump float width -#pragma mapbox: define lowp vec4 pattern_from -#pragma mapbox: define lowp vec4 pattern_to - -void main() { - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float offset - #pragma mapbox: initialize mediump float gapwidth - #pragma mapbox: initialize mediump float width - #pragma mapbox: initialize mediump vec4 pattern_from - #pragma mapbox: initialize mediump vec4 pattern_to - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE; - // float tileRatio = u_scale.y; - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_linesofar = a_linesofar; - v_width2 = vec2(outset, inset); -} diff --git a/shaders/drawable.line_sdf.fragment.glsl b/shaders/drawable.line_sdf.fragment.glsl deleted file mode 100644 index 852f5f6d59a6..000000000000 --- a/shaders/drawable.line_sdf.fragment.glsl +++ /dev/null @@ -1,60 +0,0 @@ -layout (std140) uniform LineSDFTilePropsUBO { - highp float u_sdfgamma; - highp float u_mix; - lowp float tileprops_pad1; - lowp float tileprops_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -uniform sampler2D u_image; - -in vec2 v_normal; -in vec2 v_width2; -in vec2 v_tex_a; -in vec2 v_tex_b; -in float v_gamma_scale; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump float width -#pragma mapbox: define lowp float floorwidth - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump float width - #pragma mapbox: initialize lowp float floorwidth - - // Calculate the distance of the pixel from the line in pixels. - float dist = length(v_normal) * v_width2.s; - - // Calculate the antialiasing fade factor. This is either when fading in - // the line in case of an offset line (v_width2.t) or when fading out - // (v_width2.s) - float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; - float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - - float sdfdist_a = texture(u_image, v_tex_a).a; - float sdfdist_b = texture(u_image, v_tex_b).a; - float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix); - alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist); - - fragColor = color * (alpha * opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.line_sdf.vertex.glsl b/shaders/drawable.line_sdf.vertex.glsl deleted file mode 100644 index 434498972d66..000000000000 --- a/shaders/drawable.line_sdf.vertex.glsl +++ /dev/null @@ -1,132 +0,0 @@ -// floor(127 / 2) == 63.0 -// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is -// stored in a byte (-128..127). we scale regular normals up to length 63, but -// there are also "special" normals that have a bigger length (of up to 126 in -// this case). -// #define scale 63.0 -#define scale 0.015873016 - -// We scale the distance before adding it to the buffers so that we can store -// long distances for long segments. Use this value to unscale the distance. -#define LINE_DISTANCE_SCALE 2.0 - -layout (location = 0) in vec2 a_pos_normal; -layout (location = 1) in vec4 a_data; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform LineSDFDrawableUBO { - highp mat4 u_matrix; - highp vec2 u_patternscale_a; - highp vec2 u_patternscale_b; - highp float u_tex_y_a; - highp float u_tex_y_b; - mediump float u_ratio; - // Interpolations - lowp float u_color_t; - lowp float u_blur_t; - lowp float u_opacity_t; - lowp float u_gapwidth_t; - lowp float u_offset_t; - lowp float u_width_t; - lowp float u_floorwidth_t; - lowp float drawable_pad1; - lowp float drawable_pad2; -}; - -layout (std140) uniform LineEvaluatedPropsUBO { - highp vec4 u_color; - lowp float u_blur; - lowp float u_opacity; - mediump float u_gapwidth; - lowp float u_offset; - mediump float u_width; - lowp float u_floorwidth; - lowp float props_pad1; - lowp float props_pad2; -}; - -out vec2 v_normal; -out vec2 v_width2; -out vec2 v_tex_a; -out vec2 v_tex_b; -out float v_gamma_scale; - -#pragma mapbox: define highp vec4 color -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump float gapwidth -#pragma mapbox: define lowp float offset -#pragma mapbox: define mediump float width -#pragma mapbox: define lowp float floorwidth - -void main() { - #pragma mapbox: initialize highp vec4 color - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize mediump float gapwidth - #pragma mapbox: initialize lowp float offset - #pragma mapbox: initialize mediump float width - #pragma mapbox: initialize lowp float floorwidth - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; - - vec2 a_extrude = a_data.xy - 128.0; - float a_direction = mod(a_data.z, 4.0) - 1.0; - float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE; - - vec2 pos = floor(a_pos_normal * 0.5); - - // x is 1 if it's a round cap, 0 otherwise - // y is 1 if the normal points up, and -1 if it points down - // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; - normal.y = normal.y * 2.0 - 1.0; - v_normal = normal; - - // these transformations used to be applied in the JS and native code bases. - // moved them into the shader for clarity and simplicity. - gapwidth = gapwidth / 2.0; - float halfwidth = width / 2.0; - offset = -1.0 * offset; - - float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); - float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING); - - // Scale the extrusion vector down to a normal and then up by the line width - // of this vertex. - mediump vec2 dist =outset * a_extrude * scale; - - // Calculate the offset when drawing a line that is to the side of the actual line. - // We do this by creating a vector that points towards the extrude, but rotate - // it when we're drawing round end points (a_direction = -1 or 1) since their - // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); - - vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); - gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; - - // calculate how much the perspective view squishes or stretches the extrude - float extrude_length_without_perspective = length(dist); - float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels); - v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; - - v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a); - v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b); - - v_width2 = vec2(outset, inset); -} diff --git a/shaders/drawable.raster.fragment.glsl b/shaders/drawable.raster.fragment.glsl deleted file mode 100644 index 352cf5a00606..000000000000 --- a/shaders/drawable.raster.fragment.glsl +++ /dev/null @@ -1,58 +0,0 @@ -layout (std140) uniform RasterEvaluatedPropsUBO { - highp vec3 u_spin_weights; - highp vec2 u_tl_parent; - highp float u_scale_parent; - highp float u_buffer_scale; - highp float u_fade_t; - highp float u_opacity; - highp float u_brightness_low; - highp float u_brightness_high; - highp float u_saturation_factor; - highp float u_contrast_factor; - lowp float props_pad1; - lowp float props_pad2; -}; -uniform sampler2D u_image0; -uniform sampler2D u_image1; - -in vec2 v_pos0; -in vec2 v_pos1; - -void main() { - - // read and cross-fade colors from the main and parent tiles - vec4 color0 = texture(u_image0, v_pos0); - vec4 color1 = texture(u_image1, v_pos1); - if (color0.a > 0.0) { - color0.rgb = color0.rgb / color0.a; - } - if (color1.a > 0.0) { - color1.rgb = color1.rgb / color1.a; - } - vec4 color = mix(color0, color1, u_fade_t); - color.a *= u_opacity; - vec3 rgb = color.rgb; - - // spin - rgb = vec3( - dot(rgb, u_spin_weights.xyz), - dot(rgb, u_spin_weights.zxy), - dot(rgb, u_spin_weights.yzx)); - - // saturation - float average = (color.r + color.g + color.b) / 3.0; - rgb += (average - rgb) * u_saturation_factor; - - // contrast - rgb = (rgb - 0.5) * u_contrast_factor + 0.5; - - // brightness - vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low); - vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high); - - fragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.raster.vertex.glsl b/shaders/drawable.raster.vertex.glsl deleted file mode 100644 index 331f376fed89..000000000000 --- a/shaders/drawable.raster.vertex.glsl +++ /dev/null @@ -1,34 +0,0 @@ -layout (std140) uniform RasterDrawableUBO { - highp mat4 u_matrix; -}; -layout (std140) uniform RasterEvaluatedPropsUBO { - highp vec3 u_spin_weights; - highp vec2 u_tl_parent; - highp float u_scale_parent; - highp float u_buffer_scale; - highp float u_fade_t; - highp float u_opacity; - highp float u_brightness_low; - highp float u_brightness_high; - highp float u_saturation_factor; - highp float u_contrast_factor; - lowp float props_pad1; - lowp float props_pad2; -}; - -layout (location = 0) in vec2 a_pos; -layout (location = 1) in vec2 a_texture_pos; - -out vec2 v_pos0; -out vec2 v_pos1; - -void main() { - gl_Position = u_matrix * vec4(a_pos, 0, 1); - // We are using Int16 for texture position coordinates to give us enough precision for - // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer - // as an arbitrarily high number to preserve adequate precision when rendering. - // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates, - // so math for modifying either is consistent. - v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5; - v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent; -} diff --git a/shaders/drawable.symbol_icon.fragment.glsl b/shaders/drawable.symbol_icon.fragment.glsl deleted file mode 100644 index ce3a301d52d7..000000000000 --- a/shaders/drawable.symbol_icon.fragment.glsl +++ /dev/null @@ -1,41 +0,0 @@ -uniform sampler2D u_texture; - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; - highp float u_gamma_scale; - lowp float tileprops_pad1; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -in vec2 v_tex; -in float v_fade_opacity; - -#pragma mapbox: define lowp float opacity - -void main() { - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - - #pragma mapbox: initialize lowp float opacity - - lowp float alpha = opacity * v_fade_opacity; - fragColor = texture(u_texture, v_tex) * alpha; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.symbol_icon.vertex.glsl b/shaders/drawable.symbol_icon.vertex.glsl deleted file mode 100644 index 678f3323b74f..000000000000 --- a/shaders/drawable.symbol_icon.vertex.glsl +++ /dev/null @@ -1,127 +0,0 @@ -layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - bool u_is_text_prop; - bool u_rotate_symbol; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - - // Interpolations - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -out vec2 v_tex; -out float v_fade_opacity; - -#pragma mapbox: define lowp float opacity - -void main() { - highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; - - #pragma mapbox: initialize lowp float opacity - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - vec2 a_minFontScale = a_pixeloffset.zw / 256.0; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // See comments in symbol_sdf.vertex - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text_prop ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // See comments in symbol_sdf.vertex - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * max(a_minFontScale, fontScale) + a_pxoffset / 16.0), 0.0, 1.0); - - v_tex = a_tex / u_texsize; - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; - v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); -} diff --git a/shaders/drawable.symbol_sdf.fragment.glsl b/shaders/drawable.symbol_sdf.fragment.glsl deleted file mode 100644 index 6bc97ac3e171..000000000000 --- a/shaders/drawable.symbol_sdf.fragment.glsl +++ /dev/null @@ -1,76 +0,0 @@ -#define SDF_PX 8.0 - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; - highp float u_gamma_scale; - lowp float tileprops_pad1; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -uniform sampler2D u_texture; - -in vec2 v_data0; -in vec3 v_data1; - -#pragma mapbox: define highp vec4 fill_color -#pragma mapbox: define highp vec4 halo_color -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float halo_width -#pragma mapbox: define lowp float halo_blur - -void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; - - #pragma mapbox: initialize highp vec4 fill_color - #pragma mapbox: initialize highp vec4 halo_color - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float halo_width - #pragma mapbox: initialize lowp float halo_blur - - float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - - vec2 tex = v_data0.xy; - float gamma_scale = v_data1.x; - float size = v_data1.y; - float fade_opacity = v_data1[2]; - - float fontScale = u_is_text ? size / 24.0 : size; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.symbol_sdf.vertex.glsl b/shaders/drawable.symbol_sdf.vertex.glsl deleted file mode 100644 index 6c94980d7afe..000000000000 --- a/shaders/drawable.symbol_sdf.vertex.glsl +++ /dev/null @@ -1,156 +0,0 @@ -layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec4 a_pixeloffset; -layout (location = 3) in vec3 a_projected_pos; -layout (location = 4) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - bool u_is_text_prop; - bool u_rotate_symbol; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - - // Interpolations - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -out vec2 v_data0; -out vec3 v_data1; - -#pragma mapbox: define highp vec4 fill_color -#pragma mapbox: define highp vec4 halo_color -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float halo_width -#pragma mapbox: define lowp float halo_blur - -void main() { - highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; - - #pragma mapbox: initialize highp vec4 fill_color - #pragma mapbox: initialize highp vec4 halo_color - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float halo_width - #pragma mapbox: initialize lowp float halo_blur - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - vec2 a_pxoffset = a_pixeloffset.xy; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = u_is_text_prop ? size / 24.0 : size; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0 = a_tex / u_texsize; - v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity); -} diff --git a/shaders/drawable.symbol_text_and_icon.fragment.glsl b/shaders/drawable.symbol_text_and_icon.fragment.glsl deleted file mode 100644 index 8c307d0f0d44..000000000000 --- a/shaders/drawable.symbol_text_and_icon.fragment.glsl +++ /dev/null @@ -1,93 +0,0 @@ -#define SDF_PX 8.0 - -#define SDF 1.0 -#define ICON 0.0 - -layout (std140) uniform SymbolTilePropsUBO { - bool u_is_text; - bool u_is_halo; - highp float u_gamma_scale; - lowp float tileprops_pad1; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -uniform sampler2D u_texture; -uniform sampler2D u_texture_icon; - -in vec4 v_data0; -in vec4 v_data1; - -#pragma mapbox: define highp vec4 fill_color -#pragma mapbox: define highp vec4 halo_color -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float halo_width -#pragma mapbox: define lowp float halo_blur - -void main() { - highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; - - #pragma mapbox: initialize highp vec4 fill_color - #pragma mapbox: initialize highp vec4 halo_color - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float halo_width - #pragma mapbox: initialize lowp float halo_blur - - float fade_opacity = v_data1[2]; - - if (v_data1.w == ICON) { - vec2 tex_icon = v_data0.zw; - lowp float alpha = opacity * fade_opacity; - fragColor = texture(u_texture_icon, tex_icon) * alpha; - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif - return; - } - - vec2 tex = v_data0.xy; - - float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; - - float gamma_scale = v_data1.x; - float size = v_data1.y; - - float fontScale = size / 24.0; - - lowp vec4 color = fill_color; - highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); - lowp float buff = (256.0 - 64.0) / 256.0; - if (u_is_halo) { - color = halo_color; - gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); - buff = (6.0 - halo_width / fontScale) / SDF_PX; - } - - lowp float dist = texture(u_texture, tex).a; - highp float gamma_scaled = gamma * gamma_scale; - highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); - - fragColor = color * (alpha * opacity * fade_opacity); - -#ifdef OVERDRAW_INSPECTOR - fragColor = vec4(1.0); -#endif -} diff --git a/shaders/drawable.symbol_text_and_icon.vertex.glsl b/shaders/drawable.symbol_text_and_icon.vertex.glsl deleted file mode 100644 index 6035d4512770..000000000000 --- a/shaders/drawable.symbol_text_and_icon.vertex.glsl +++ /dev/null @@ -1,156 +0,0 @@ -layout (location = 0) in vec4 a_pos_offset; -layout (location = 1) in vec4 a_data; -layout (location = 2) in vec3 a_projected_pos; -layout (location = 3) in float a_fade_opacity; - -// contents of a_size vary based on the type of property value -// used for {text,icon}-size. -// For constants, a_size is disabled. -// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature. -// For composite functions: -// [ text-size(lowerZoomStop, feature), -// text-size(upperZoomStop, feature) ] - -layout (std140) uniform GlobalPaintParamsUBO { - highp vec2 u_pattern_atlas_texsize; - highp vec2 u_units_to_pixels; - highp vec2 u_world_size; - highp float u_camera_to_center_distance; - highp float u_symbol_fade_change; - highp float u_aspect_ratio; - highp float u_pixel_ratio; - highp float u_map_zoom; - lowp float global_pad1; -}; - -layout (std140) uniform SymbolDrawableUBO { - highp mat4 u_matrix; - highp mat4 u_label_plane_matrix; - highp mat4 u_coord_matrix; - - highp vec2 u_texsize; - highp vec2 u_texsize_icon; - - bool u_is_text_prop; - bool u_rotate_symbol; - bool u_pitch_with_map; - bool u_is_size_zoom_constant; - bool u_is_size_feature_constant; - - highp float u_size_t; // used to interpolate between zoom stops when size is a composite function - highp float u_size; // used when size is both zoom and feature constant - - // Interpolations - highp float u_fill_color_t; - highp float u_halo_color_t; - highp float u_opacity_t; - highp float u_halo_width_t; - highp float u_halo_blur_t; -}; - -layout (std140) uniform SymbolEvaluatedPropsUBO { - highp vec4 u_text_fill_color; - highp vec4 u_text_halo_color; - highp float u_text_opacity; - highp float u_text_halo_width; - highp float u_text_halo_blur; - lowp float props_pad1; - highp vec4 u_icon_fill_color; - highp vec4 u_icon_halo_color; - highp float u_icon_opacity; - highp float u_icon_halo_width; - highp float u_icon_halo_blur; - lowp float props_pad2; -}; - -out vec4 v_data0; -out vec4 v_data1; - -#pragma mapbox: define highp vec4 fill_color -#pragma mapbox: define highp vec4 halo_color -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float halo_width -#pragma mapbox: define lowp float halo_blur - -void main() { - highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; - highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; - highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; - highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; - highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; - - #pragma mapbox: initialize highp vec4 fill_color - #pragma mapbox: initialize highp vec4 halo_color - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float halo_width - #pragma mapbox: initialize lowp float halo_blur - - vec2 a_pos = a_pos_offset.xy; - vec2 a_offset = a_pos_offset.zw; - - vec2 a_tex = a_data.xy; - vec2 a_size = a_data.zw; - - float a_size_min = floor(a_size[0] * 0.5); - float is_sdf = a_size[0] - 2.0 * a_size_min; - - highp float segment_angle = -a_projected_pos[2]; - float size; - - if (!u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = mix(a_size_min, a_size[1], u_size_t) / 128.0; - } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) { - size = a_size_min / 128.0; - } else { - size = u_size; - } - - vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1); - highp float camera_to_anchor_distance = projectedPoint.w; - // If the label is pitched with the map, layout is done in pitched space, - // which makes labels in the distance smaller relative to viewport space. - // We counteract part of that effect by multiplying by the perspective ratio. - // If the label isn't pitched with the map, we do layout in viewport space, - // which makes labels in the distance larger relative to the features around - // them. We counteract part of that effect by dividing by the perspective ratio. - highp float distance_ratio = u_pitch_with_map ? - camera_to_anchor_distance / u_camera_to_center_distance : - u_camera_to_center_distance / camera_to_anchor_distance; - highp float perspective_ratio = clamp( - 0.5 + 0.5 * distance_ratio, - 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles - 4.0); - - size *= perspective_ratio; - - float fontScale = size / 24.0; - - highp float symbol_rotation = 0.0; - if (u_rotate_symbol) { - // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units - // To figure out that angle in projected space, we draw a short horizontal line in tile - // space, project it, and measure its angle in projected space. - vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1); - - vec2 a = projectedPoint.xy / projectedPoint.w; - vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w; - - symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x); - } - - highp float angle_sin = sin(segment_angle + symbol_rotation); - highp float angle_cos = cos(segment_angle + symbol_rotation); - mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos); - - vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0); - gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0); - float gamma_scale = gl_Position.w; - - vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; - float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); - - v_data0.xy = a_tex / u_texsize; - v_data0.zw = a_tex / u_texsize_icon; - v_data1 = vec4(gamma_scale, size, interpolated_fade_opacity, is_sdf); -} diff --git a/shaders/fill.fragment.glsl b/shaders/fill.fragment.glsl index ffd33c16c3d0..cd2d2aa4a80a 100644 --- a/shaders/fill.fragment.glsl +++ b/shaders/fill.fragment.glsl @@ -1,3 +1,12 @@ +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + #pragma mapbox: define highp vec4 color #pragma mapbox: define lowp float opacity diff --git a/shaders/fill.vertex.glsl b/shaders/fill.vertex.glsl index 7a1db638238f..f77883221c9a 100644 --- a/shaders/fill.vertex.glsl +++ b/shaders/fill.vertex.glsl @@ -1,6 +1,22 @@ -layout (location = 0) in vec2 a_pos; +layout (std140) uniform FillDrawableUBO { + highp mat4 u_matrix; + // Interpolations + highp float u_color_t; + highp float u_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; -uniform mat4 u_matrix; +layout (location = 0) in vec2 a_pos; #pragma mapbox: define highp vec4 color #pragma mapbox: define lowp float opacity diff --git a/shaders/fill_extrusion.vertex.glsl b/shaders/fill_extrusion.vertex.glsl index dda699133b17..ae4dc60fd264 100644 --- a/shaders/fill_extrusion.vertex.glsl +++ b/shaders/fill_extrusion.vertex.glsl @@ -1,14 +1,46 @@ -uniform mat4 u_matrix; -uniform vec3 u_lightcolor; -uniform lowp vec3 u_lightpos; -uniform lowp float u_lightintensity; -uniform float u_vertical_gradient; -uniform lowp float u_opacity; - layout (location = 0) in vec2 a_pos; layout (location = 1) in vec4 a_normal_ed; out vec4 v_color; +layout (std140) uniform FillExtrusionDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_height_factor; + highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + #pragma mapbox: define highp float base #pragma mapbox: define highp float height #pragma mapbox: define highp vec4 color diff --git a/shaders/fill_extrusion_pattern.fragment.glsl b/shaders/fill_extrusion_pattern.fragment.glsl index 1e0638012c2a..a4ce886e3d9a 100644 --- a/shaders/fill_extrusion_pattern.fragment.glsl +++ b/shaders/fill_extrusion_pattern.fragment.glsl @@ -1,12 +1,33 @@ -uniform vec2 u_texsize; -uniform float u_fade; - -uniform sampler2D u_image; - in vec2 v_pos_a; in vec2 v_pos_b; in vec4 v_lighting; +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + +uniform sampler2D u_image; + #pragma mapbox: define lowp float base #pragma mapbox: define lowp float height #pragma mapbox: define mediump vec4 pattern_from diff --git a/shaders/fill_extrusion_pattern.vertex.glsl b/shaders/fill_extrusion_pattern.vertex.glsl index 459cf8baa9ba..71645f7f3df9 100644 --- a/shaders/fill_extrusion_pattern.vertex.glsl +++ b/shaders/fill_extrusion_pattern.vertex.glsl @@ -1,15 +1,3 @@ -uniform mat4 u_matrix; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform float u_height_factor; -uniform vec4 u_scale; -uniform float u_vertical_gradient; -uniform lowp float u_opacity; - -uniform vec3 u_lightcolor; -uniform lowp vec3 u_lightpos; -uniform lowp float u_lightintensity; - layout (location = 0) in vec2 a_pos; layout (location = 1) in vec4 a_normal_ed; @@ -17,6 +5,57 @@ out vec2 v_pos_a; out vec2 v_pos_b; out vec4 v_lighting; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillExtrusionDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_height_factor; + highp float u_tile_ratio; + // Interpolations + highp float u_base_t; + highp float u_height_t; + highp float u_color_t; + highp float u_pattern_from_t; + highp float u_pattern_to_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform FillExtrusionTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillExtrusionPropsUBO { + highp vec4 u_color; + highp vec3 u_lightcolor; + lowp float props_pad1; + highp vec3 u_lightpos; + highp float u_base; + highp float u_height; + highp float u_lightintensity; + highp float u_vertical_gradient; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; + lowp float props_pad2; +}; + #pragma mapbox: define lowp float base #pragma mapbox: define lowp float height #pragma mapbox: define mediump vec4 pattern_from @@ -33,10 +72,10 @@ void main() { vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; vec3 normal = a_normal_ed.xyz; float edgedistance = a_normal_ed.w; diff --git a/shaders/fill_outline.fragment.glsl b/shaders/fill_outline.fragment.glsl index f13b94edac84..eacab7664996 100644 --- a/shaders/fill_outline.fragment.glsl +++ b/shaders/fill_outline.fragment.glsl @@ -1,3 +1,12 @@ +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + in vec2 v_pos; #pragma mapbox: define highp vec4 outline_color diff --git a/shaders/fill_outline.vertex.glsl b/shaders/fill_outline.vertex.glsl index dea871d58cd5..50dadb4c3ddb 100644 --- a/shaders/fill_outline.vertex.glsl +++ b/shaders/fill_outline.vertex.glsl @@ -1,7 +1,34 @@ -layout (location = 0) in vec2 a_pos; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillOutlineDrawableUBO { + highp mat4 u_matrix; + // Interpolations + highp float u_outline_color_t; + highp float u_opacity_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; -uniform mat4 u_matrix; -uniform vec2 u_world; +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; + +layout (location = 0) in vec2 a_pos; out vec2 v_pos; @@ -13,5 +40,5 @@ void main() { #pragma mapbox: initialize lowp float opacity gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world; + v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; } diff --git a/shaders/fill_outline_pattern.fragment.glsl b/shaders/fill_outline_pattern.fragment.glsl index 031d8d648684..7e6175401681 100644 --- a/shaders/fill_outline_pattern.fragment.glsl +++ b/shaders/fill_outline_pattern.fragment.glsl @@ -1,15 +1,29 @@ +layout (std140) uniform FillOutlinePatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; -uniform vec2 u_texsize; uniform sampler2D u_image; -uniform float u_fade; in vec2 v_pos_a; in vec2 v_pos_b; in vec2 v_pos; #pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to void main() { #pragma mapbox: initialize lowp float opacity diff --git a/shaders/fill_outline_pattern.vertex.glsl b/shaders/fill_outline_pattern.vertex.glsl index aa75f7865316..ebedb8cd0fce 100644 --- a/shaders/fill_outline_pattern.vertex.glsl +++ b/shaders/fill_outline_pattern.vertex.glsl @@ -1,8 +1,42 @@ -uniform mat4 u_matrix; -uniform vec2 u_world; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform vec4 u_scale; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillOutlinePatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_ratio; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; +}; + +layout (std140) uniform FillOutlinePatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; layout (location = 0) in vec2 a_pos; @@ -11,8 +45,8 @@ out vec2 v_pos_b; out vec2 v_pos; #pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to void main() { #pragma mapbox: initialize lowp float opacity @@ -24,10 +58,10 @@ void main() { vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; gl_Position = u_matrix * vec4(a_pos, 0, 1); @@ -37,5 +71,5 @@ void main() { v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos); v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos); - v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world; + v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world_size; } diff --git a/shaders/drawable.fill_outline_triangulated.fragment.glsl b/shaders/fill_outline_triangulated.fragment.glsl similarity index 100% rename from shaders/drawable.fill_outline_triangulated.fragment.glsl rename to shaders/fill_outline_triangulated.fragment.glsl diff --git a/shaders/drawable.fill_outline_triangulated.vertex.glsl b/shaders/fill_outline_triangulated.vertex.glsl similarity index 100% rename from shaders/drawable.fill_outline_triangulated.vertex.glsl rename to shaders/fill_outline_triangulated.vertex.glsl diff --git a/shaders/fill_pattern.fragment.glsl b/shaders/fill_pattern.fragment.glsl index 9624f8de7ef3..37f2d0caaf64 100644 --- a/shaders/fill_pattern.fragment.glsl +++ b/shaders/fill_pattern.fragment.glsl @@ -1,5 +1,19 @@ -uniform vec2 u_texsize; -uniform float u_fade; +layout (std140) uniform FillPatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; uniform sampler2D u_image; @@ -7,8 +21,8 @@ in vec2 v_pos_a; in vec2 v_pos_b; #pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to void main() { #pragma mapbox: initialize lowp float opacity @@ -20,6 +34,10 @@ void main() { vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; + if (u_texsize.x < 1.0 || u_texsize.y < 1.0) { + discard; + } + vec2 imagecoord = mod(v_pos_a, 1.0); vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord); vec4 color1 = texture(u_image, pos); diff --git a/shaders/fill_pattern.vertex.glsl b/shaders/fill_pattern.vertex.glsl index f3a5f891f20b..574ac994e248 100644 --- a/shaders/fill_pattern.vertex.glsl +++ b/shaders/fill_pattern.vertex.glsl @@ -1,7 +1,42 @@ -uniform mat4 u_matrix; -uniform vec2 u_pixel_coord_upper; -uniform vec2 u_pixel_coord_lower; -uniform vec4 u_scale; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform FillPatternDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_pixel_coord_upper; + highp vec2 u_pixel_coord_lower; + highp float u_tile_ratio; + // Interpolations + highp float u_pattern_from_t; + highp float u_pattern_to_t; + highp float u_opacity_t; +}; + +layout (std140) uniform FillPatternTilePropsUBO { + highp vec4 u_pattern_from; + highp vec4 u_pattern_to; + highp vec2 u_texsize; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform FillEvaluatedPropsUBO { + highp vec4 u_color; + highp vec4 u_outline_color; + highp float u_opacity; + highp float u_fade; + highp float u_from_scale; + highp float u_to_scale; +}; layout (location = 0) in vec2 a_pos; @@ -9,8 +44,8 @@ out vec2 v_pos_a; out vec2 v_pos_b; #pragma mapbox: define lowp float opacity -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to void main() { #pragma mapbox: initialize lowp float opacity @@ -22,10 +57,10 @@ void main() { vec2 pattern_tl_b = pattern_to.xy; vec2 pattern_br_b = pattern_to.zw; - float pixelRatio = u_scale.x; - float tileZoomRatio = u_scale.y; - float fromScale = u_scale.z; - float toScale = u_scale.w; + float pixelRatio = u_pixel_ratio; + float tileZoomRatio = u_tile_ratio; + float fromScale = u_from_scale; + float toScale = u_to_scale; vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio); vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio); diff --git a/shaders/heatmap.fragment.glsl b/shaders/heatmap.fragment.glsl index bd6aaa517f39..d98ce5b8d7f1 100644 --- a/shaders/heatmap.fragment.glsl +++ b/shaders/heatmap.fragment.glsl @@ -1,7 +1,12 @@ -uniform highp float u_intensity; - in vec2 v_extrude; +layout (std140) uniform HeatmapEvaluatedPropsUBO { + highp float u_weight; + highp float u_radius; + highp float u_intensity; + lowp float props_pad1; +}; + #pragma mapbox: define highp float weight // Gaussian kernel coefficient: 1 / sqrt(2 * PI) diff --git a/shaders/heatmap.vertex.glsl b/shaders/heatmap.vertex.glsl index e51b39d63193..430b428b1601 100644 --- a/shaders/heatmap.vertex.glsl +++ b/shaders/heatmap.vertex.glsl @@ -1,11 +1,22 @@ -uniform mat4 u_matrix; -uniform float u_extrude_scale; -uniform float u_opacity; -uniform float u_intensity; - layout (location = 0) in vec2 a_pos; out vec2 v_extrude; +layout (std140) uniform HeatmapDrawableUBO { + highp mat4 u_matrix; + highp float u_extrude_scale; + // Interpolations + lowp float u_weight_t; + lowp float u_radius_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform HeatmapEvaluatedPropsUBO { + highp float u_weight; + highp float u_radius; + highp float u_intensity; + lowp float props_pad1; +}; + #pragma mapbox: define highp float weight #pragma mapbox: define mediump float radius diff --git a/shaders/heatmap_texture.fragment.glsl b/shaders/heatmap_texture.fragment.glsl index 3eed37b1f0c9..b718394c18b0 100644 --- a/shaders/heatmap_texture.fragment.glsl +++ b/shaders/heatmap_texture.fragment.glsl @@ -1,7 +1,14 @@ +in vec2 v_pos; uniform sampler2D u_image; uniform sampler2D u_color_ramp; -uniform float u_opacity; -in vec2 v_pos; + +layout (std140) uniform HeatmapTexturePropsUBO { + highp mat4 u_matrix; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; void main() { float t = texture(u_image, v_pos).r; diff --git a/shaders/heatmap_texture.vertex.glsl b/shaders/heatmap_texture.vertex.glsl index f0f89a1e54ea..714540473b08 100644 --- a/shaders/heatmap_texture.vertex.glsl +++ b/shaders/heatmap_texture.vertex.glsl @@ -1,10 +1,28 @@ -uniform mat4 u_matrix; -uniform vec2 u_world; layout (location = 0) in vec2 a_pos; out vec2 v_pos; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform HeatmapTexturePropsUBO { + highp mat4 u_matrix; + highp float u_opacity; + lowp float props_pad1; + lowp float props_pad2; + lowp float props_pad3; +}; + void main() { - gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1); + gl_Position = u_matrix * vec4(a_pos * u_world_size, 0, 1); v_pos.x = a_pos.x; v_pos.y = 1.0 - a_pos.y; diff --git a/shaders/hillshade.fragment.glsl b/shaders/hillshade.fragment.glsl index f7b0f662d6ec..499aa3c67d0f 100644 --- a/shaders/hillshade.fragment.glsl +++ b/shaders/hillshade.fragment.glsl @@ -1,11 +1,16 @@ -uniform sampler2D u_image; in vec2 v_pos; +uniform sampler2D u_image; + +layout (std140) uniform HillshadeTilePropsUBO { + highp vec2 u_latrange; + highp vec2 u_light; +}; -uniform vec2 u_latrange; -uniform vec2 u_light; -uniform vec4 u_shadow; -uniform vec4 u_highlight; -uniform vec4 u_accent; +layout (std140) uniform HillshadeEvaluatedPropsUBO { + highp vec4 u_highlight; + highp vec4 u_shadow; + highp vec4 u_accent; +}; #define PI 3.141592653589793 diff --git a/shaders/hillshade.vertex.glsl b/shaders/hillshade.vertex.glsl index 0bac6fdff9e4..acbc038036d7 100644 --- a/shaders/hillshade.vertex.glsl +++ b/shaders/hillshade.vertex.glsl @@ -1,8 +1,10 @@ -uniform mat4 u_matrix; - layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; +layout (std140) uniform HillshadeDrawableUBO { + highp mat4 u_matrix; +}; + out vec2 v_pos; void main() { diff --git a/shaders/hillshade_prepare.fragment.glsl b/shaders/hillshade_prepare.fragment.glsl index 3ef99c543021..9f7988750092 100644 --- a/shaders/hillshade_prepare.fragment.glsl +++ b/shaders/hillshade_prepare.fragment.glsl @@ -2,12 +2,15 @@ precision highp float; #endif -uniform sampler2D u_image; in vec2 v_pos; -uniform vec2 u_dimension; -uniform float u_zoom; -uniform float u_maxzoom; -uniform vec4 u_unpack; +uniform sampler2D u_image; + +layout (std140) uniform HillshadePrepareTilePropsUBO { + highp vec4 u_unpack; + highp vec2 u_dimension; + highp float u_zoom; + highp float u_maxzoom; +}; float getElevation(vec2 coord, float bias) { // Convert encoded elevation value to meters diff --git a/shaders/hillshade_prepare.vertex.glsl b/shaders/hillshade_prepare.vertex.glsl index aa8f8320f143..b917e86fdb23 100644 --- a/shaders/hillshade_prepare.vertex.glsl +++ b/shaders/hillshade_prepare.vertex.glsl @@ -1,9 +1,17 @@ -uniform mat4 u_matrix; -uniform vec2 u_dimension; - layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; +layout (std140) uniform HillshadePrepareDrawableUBO { + highp mat4 u_matrix; +}; + +layout (std140) uniform HillshadePrepareTilePropsUBO { + highp vec4 u_unpack; + highp vec2 u_dimension; + highp float u_zoom; + highp float u_maxzoom; +}; + out vec2 v_pos; void main() { diff --git a/shaders/line.fragment.glsl b/shaders/line.fragment.glsl index 4ea11c11a4f1..0d201bd28bee 100644 --- a/shaders/line.fragment.glsl +++ b/shaders/line.fragment.glsl @@ -1,4 +1,14 @@ -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; in vec2 v_width2; in vec2 v_normal; @@ -19,7 +29,7 @@ void main() { // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); fragColor = color * (alpha * opacity); diff --git a/shaders/line.vertex.glsl b/shaders/line.vertex.glsl index 65c99911d93a..5dc5f87269a9 100644 --- a/shaders/line.vertex.glsl +++ b/shaders/line.vertex.glsl @@ -9,10 +9,42 @@ layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform vec2 u_units_to_pixels; -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_color_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float drawable_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -36,7 +68,7 @@ void main() { // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; diff --git a/shaders/line_gradient.fragment.glsl b/shaders/line_gradient.fragment.glsl index d7e7504d6e18..a970705ab5b2 100644 --- a/shaders/line_gradient.fragment.glsl +++ b/shaders/line_gradient.fragment.glsl @@ -1,4 +1,15 @@ -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; + uniform sampler2D u_image; in vec2 v_width2; @@ -19,7 +30,7 @@ void main() { // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); // For gradient lines, v_lineprogress is the ratio along the entire line, diff --git a/shaders/line_gradient.vertex.glsl b/shaders/line_gradient.vertex.glsl index b236f2883a3b..f521a227095a 100644 --- a/shaders/line_gradient.vertex.glsl +++ b/shaders/line_gradient.vertex.glsl @@ -13,10 +13,42 @@ layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; -uniform vec2 u_units_to_pixels; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineGradientDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -38,7 +70,7 @@ void main() { // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; diff --git a/shaders/line_pattern.fragment.glsl b/shaders/line_pattern.fragment.glsl index 10aff6031ad2..4fbcf49ecef2 100644 --- a/shaders/line_pattern.fragment.glsl +++ b/shaders/line_pattern.fragment.glsl @@ -1,7 +1,23 @@ -uniform lowp float u_device_pixel_ratio; -uniform vec2 u_texsize; -uniform float u_fade; -uniform mediump vec4 u_scale; +layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; uniform sampler2D u_image; @@ -10,14 +26,15 @@ in vec2 v_width2; in float v_linesofar; in float v_gamma_scale; -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to #pragma mapbox: define lowp float blur #pragma mapbox: define lowp float opacity void main() { #pragma mapbox: initialize mediump vec4 pattern_from #pragma mapbox: initialize mediump vec4 pattern_to + #pragma mapbox: initialize lowp float blur #pragma mapbox: initialize lowp float opacity @@ -43,7 +60,7 @@ void main() { // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); float x_a = mod(v_linesofar / pattern_size_a.x, 1.0); diff --git a/shaders/line_pattern.vertex.glsl b/shaders/line_pattern.vertex.glsl index 60ad0c5b4730..c42ab953d436 100644 --- a/shaders/line_pattern.vertex.glsl +++ b/shaders/line_pattern.vertex.glsl @@ -13,10 +13,50 @@ layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform vec2 u_units_to_pixels; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; +layout (std140) uniform LinePatternDrawableUBO { + highp mat4 u_matrix; + mediump float u_ratio; + // Interpolations + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_offset_t; + lowp float u_gapwidth_t; + lowp float u_width_t; + lowp float u_pattern_from_t; + lowp float u_pattern_to_t; +}; + +layout (std140) uniform LinePatternTilePropsUBO { + lowp vec4 u_pattern_from; + lowp vec4 u_pattern_to; + mediump vec4 u_scale; + highp vec2 u_texsize; + highp float u_fade; + lowp float tileprops_pad1; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -28,8 +68,8 @@ out float v_gamma_scale; #pragma mapbox: define lowp float offset #pragma mapbox: define mediump float gapwidth #pragma mapbox: define mediump float width -#pragma mapbox: define mediump vec4 pattern_from -#pragma mapbox: define mediump vec4 pattern_to +#pragma mapbox: define lowp vec4 pattern_from +#pragma mapbox: define lowp vec4 pattern_to void main() { #pragma mapbox: initialize lowp float blur @@ -42,7 +82,7 @@ void main() { // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; diff --git a/shaders/line_sdf.fragment.glsl b/shaders/line_sdf.fragment.glsl index 3cbd2c9b668f..852f5f6d59a6 100644 --- a/shaders/line_sdf.fragment.glsl +++ b/shaders/line_sdf.fragment.glsl @@ -1,8 +1,23 @@ +layout (std140) uniform LineSDFTilePropsUBO { + highp float u_sdfgamma; + highp float u_mix; + lowp float tileprops_pad1; + lowp float tileprops_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; -uniform lowp float u_device_pixel_ratio; uniform sampler2D u_image; -uniform float u_sdfgamma; -uniform float u_mix; in vec2 v_normal; in vec2 v_width2; @@ -29,7 +44,7 @@ void main() { // Calculate the antialiasing fade factor. This is either when fading in // the line in case of an offset line (v_width2.t) or when fading out // (v_width2.s) - float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; + float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); float sdfdist_a = texture(u_image, v_tex_a).a; diff --git a/shaders/line_sdf.vertex.glsl b/shaders/line_sdf.vertex.glsl index 24397177b5e1..434498972d66 100644 --- a/shaders/line_sdf.vertex.glsl +++ b/shaders/line_sdf.vertex.glsl @@ -13,14 +13,48 @@ layout (location = 0) in vec2 a_pos_normal; layout (location = 1) in vec4 a_data; -uniform mat4 u_matrix; -uniform mediump float u_ratio; -uniform lowp float u_device_pixel_ratio; -uniform vec2 u_patternscale_a; -uniform float u_tex_y_a; -uniform vec2 u_patternscale_b; -uniform float u_tex_y_b; -uniform vec2 u_units_to_pixels; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform LineSDFDrawableUBO { + highp mat4 u_matrix; + highp vec2 u_patternscale_a; + highp vec2 u_patternscale_b; + highp float u_tex_y_a; + highp float u_tex_y_b; + mediump float u_ratio; + // Interpolations + lowp float u_color_t; + lowp float u_blur_t; + lowp float u_opacity_t; + lowp float u_gapwidth_t; + lowp float u_offset_t; + lowp float u_width_t; + lowp float u_floorwidth_t; + lowp float drawable_pad1; + lowp float drawable_pad2; +}; + +layout (std140) uniform LineEvaluatedPropsUBO { + highp vec4 u_color; + lowp float u_blur; + lowp float u_opacity; + mediump float u_gapwidth; + lowp float u_offset; + mediump float u_width; + lowp float u_floorwidth; + lowp float props_pad1; + lowp float props_pad2; +}; out vec2 v_normal; out vec2 v_width2; @@ -47,7 +81,7 @@ void main() { // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. - float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0; + float ANTIALIASING = 1.0 / DEVICE_PIXEL_RATIO / 2.0; vec2 a_extrude = a_data.xy - 128.0; float a_direction = mod(a_data.z, 4.0) - 1.0; diff --git a/shaders/drawable.location_indicator.fragment.glsl b/shaders/location_indicator.fragment.glsl similarity index 100% rename from shaders/drawable.location_indicator.fragment.glsl rename to shaders/location_indicator.fragment.glsl diff --git a/shaders/drawable.location_indicator.vertex.glsl b/shaders/location_indicator.vertex.glsl similarity index 100% rename from shaders/drawable.location_indicator.vertex.glsl rename to shaders/location_indicator.vertex.glsl diff --git a/shaders/drawable.location_indicator_textured.fragment.glsl b/shaders/location_indicator_textured.fragment.glsl similarity index 100% rename from shaders/drawable.location_indicator_textured.fragment.glsl rename to shaders/location_indicator_textured.fragment.glsl diff --git a/shaders/drawable.location_indicator_textured.vertex.glsl b/shaders/location_indicator_textured.vertex.glsl similarity index 100% rename from shaders/drawable.location_indicator_textured.vertex.glsl rename to shaders/location_indicator_textured.vertex.glsl diff --git a/shaders/manifest.json b/shaders/manifest.json index 8d4345588aed..7a6e3d3f6b6e 100644 --- a/shaders/manifest.json +++ b/shaders/manifest.json @@ -1,375 +1,224 @@ [ + { + "name": "Prelude", + "header": "prelude", + "glsl_vert": "_prelude.vertex.glsl", + "glsl_frag": "_prelude.fragment.glsl" + }, + { + "name": "ClippingMaskProgram", + "header": "clipping_mask", + "glsl_vert": "clipping_mask.vertex.glsl", + "glsl_frag": "clipping_mask.fragment.glsl" + }, { "name": "BackgroundShader", - "header": "drawable_background", - "glsl_vert": "drawable.background.vertex.glsl", - "glsl_frag": "drawable.background.fragment.glsl", + "header": "background", + "glsl_vert": "background.vertex.glsl", + "glsl_frag": "background.fragment.glsl", "uses_ubos": true }, { "name": "BackgroundPatternShader", - "header": "drawable_background_pattern", - "glsl_vert": "drawable.background_pattern.vertex.glsl", - "glsl_frag": "drawable.background_pattern.fragment.glsl", + "header": "background_pattern", + "glsl_vert": "background_pattern.vertex.glsl", + "glsl_frag": "background_pattern.fragment.glsl", "uses_ubos": true }, { "name": "CircleShader", - "header": "drawable_circle", - "glsl_vert": "drawable.circle.vertex.glsl", - "glsl_frag": "drawable.circle.fragment.glsl", + "header": "circle", + "glsl_vert": "circle.vertex.glsl", + "glsl_frag": "circle.fragment.glsl", "uses_ubos": true }, { "name": "CollisionBoxShader", - "header": "drawable_collision_box", - "glsl_vert": "drawable.collision_box.vertex.glsl", - "glsl_frag": "drawable.collision_box.fragment.glsl", + "header": "collision_box", + "glsl_vert": "collision_box.vertex.glsl", + "glsl_frag": "collision_box.fragment.glsl", "uses_ubos": true }, { "name": "CollisionCircleShader", - "header": "drawable_collision_circle", - "glsl_vert": "drawable.collision_circle.vertex.glsl", - "glsl_frag": "drawable.collision_circle.fragment.glsl", + "header": "collision_circle", + "glsl_vert": "collision_circle.vertex.glsl", + "glsl_frag": "collision_circle.fragment.glsl", "uses_ubos": true }, { "name": "CustomGeometryShader", - "header": "drawable_custom_geometry", - "glsl_vert": "drawable.custom_geometry.vertex.glsl", - "glsl_frag": "drawable.custom_geometry.fragment.glsl", + "header": "custom_geometry", + "glsl_vert": "custom_geometry.vertex.glsl", + "glsl_frag": "custom_geometry.fragment.glsl", "uses_ubos": true }, { "name": "CustomSymbolIconShader", - "header": "drawable_custom_symbol_icon", - "glsl_vert": "drawable.custom.symbol_icon.vertex.glsl", - "glsl_frag": "drawable.custom.symbol_icon.fragment.glsl", + "header": "custom_symbol_icon", + "glsl_vert": "custom.symbol_icon.vertex.glsl", + "glsl_frag": "custom.symbol_icon.fragment.glsl", "uses_ubos": true }, { "name": "DebugShader", - "header": "drawable_debug", - "glsl_vert": "drawable.debug.vertex.glsl", - "glsl_frag": "drawable.debug.fragment.glsl", + "header": "debug", + "glsl_vert": "debug.vertex.glsl", + "glsl_frag": "debug.fragment.glsl", "uses_ubos": true }, { "name": "FillShader", - "header": "drawable_fill", - "glsl_vert": "drawable.fill.vertex.glsl", - "glsl_frag": "drawable.fill.fragment.glsl", + "header": "fill", + "glsl_vert": "fill.vertex.glsl", + "glsl_frag": "fill.fragment.glsl", "uses_ubos": true }, { "name": "FillOutlineShader", - "header": "drawable_fill_outline", - "glsl_vert": "drawable.fill_outline.vertex.glsl", - "glsl_frag": "drawable.fill_outline.fragment.glsl", + "header": "fill_outline", + "glsl_vert": "fill_outline.vertex.glsl", + "glsl_frag": "fill_outline.fragment.glsl", "uses_ubos": true }, { "name": "FillPatternShader", - "header": "drawable_fill_pattern", - "glsl_vert": "drawable.fill_pattern.vertex.glsl", - "glsl_frag": "drawable.fill_pattern.fragment.glsl", + "header": "fill_pattern", + "glsl_vert": "fill_pattern.vertex.glsl", + "glsl_frag": "fill_pattern.fragment.glsl", "uses_ubos": true }, { "name": "FillOutlinePatternShader", - "header": "drawable_fill_outline_pattern", - "glsl_vert": "drawable.fill_outline_pattern.vertex.glsl", - "glsl_frag": "drawable.fill_outline_pattern.fragment.glsl", + "header": "fill_outline_pattern", + "glsl_vert": "fill_outline_pattern.vertex.glsl", + "glsl_frag": "fill_outline_pattern.fragment.glsl", "uses_ubos": true }, { "name": "FillOutlineTriangulatedShader", - "header": "drawable_fill_outline_triangulated", - "glsl_vert": "drawable.fill_outline_triangulated.vertex.glsl", - "glsl_frag": "drawable.fill_outline_triangulated.fragment.glsl", + "header": "fill_outline_triangulated", + "glsl_vert": "fill_outline_triangulated.vertex.glsl", + "glsl_frag": "fill_outline_triangulated.fragment.glsl", "uses_ubos": true }, { "name": "FillExtrusionShader", - "header": "drawable_fill_extrusion", - "glsl_vert": "drawable.fill_extrusion.vertex.glsl", - "glsl_frag": "drawable.fill_extrusion.fragment.glsl", + "header": "fill_extrusion", + "glsl_vert": "fill_extrusion.vertex.glsl", + "glsl_frag": "fill_extrusion.fragment.glsl", "uses_ubos": true }, { "name": "FillExtrusionPatternShader", - "header": "drawable_fill_extrusion_pattern", - "glsl_vert": "drawable.fill_extrusion_pattern.vertex.glsl", - "glsl_frag": "drawable.fill_extrusion_pattern.fragment.glsl", + "header": "fill_extrusion_pattern", + "glsl_vert": "fill_extrusion_pattern.vertex.glsl", + "glsl_frag": "fill_extrusion_pattern.fragment.glsl", "uses_ubos": true }, { "name": "HeatmapShader", - "header": "drawable_heatmap", - "glsl_vert": "drawable.heatmap.vertex.glsl", - "glsl_frag": "drawable.heatmap.fragment.glsl", + "header": "heatmap", + "glsl_vert": "heatmap.vertex.glsl", + "glsl_frag": "heatmap.fragment.glsl", "uses_ubos": true }, { "name": "HeatmapTextureShader", - "header": "drawable_heatmap_texture", - "glsl_vert": "drawable.heatmap_texture.vertex.glsl", - "glsl_frag": "drawable.heatmap_texture.fragment.glsl", + "header": "heatmap_texture", + "glsl_vert": "heatmap_texture.vertex.glsl", + "glsl_frag": "heatmap_texture.fragment.glsl", "uses_ubos": true }, { "name": "HillshadePrepareShader", - "header": "drawable_hillshade_prepare", - "glsl_vert": "drawable.hillshade_prepare.vertex.glsl", - "glsl_frag": "drawable.hillshade_prepare.fragment.glsl", + "header": "hillshade_prepare", + "glsl_vert": "hillshade_prepare.vertex.glsl", + "glsl_frag": "hillshade_prepare.fragment.glsl", "uses_ubos": true }, { "name": "HillshadeShader", - "header": "drawable_hillshade", - "glsl_vert": "drawable.hillshade.vertex.glsl", - "glsl_frag": "drawable.hillshade.fragment.glsl", + "header": "hillshade", + "glsl_vert": "hillshade.vertex.glsl", + "glsl_frag": "hillshade.fragment.glsl", "uses_ubos": true }, { "name": "LineShader", - "header": "drawable_line", - "glsl_vert": "drawable.line.vertex.glsl", - "glsl_frag": "drawable.line.fragment.glsl", + "header": "line", + "glsl_vert": "line.vertex.glsl", + "glsl_frag": "line.fragment.glsl", "uses_ubos": true }, { "name": "LineGradientShader", - "header": "drawable_line_gradient", - "glsl_vert": "drawable.line_gradient.vertex.glsl", - "glsl_frag": "drawable.line_gradient.fragment.glsl", + "header": "line_gradient", + "glsl_vert": "line_gradient.vertex.glsl", + "glsl_frag": "line_gradient.fragment.glsl", "uses_ubos": true }, { "name": "LinePatternShader", - "header": "drawable_line_pattern", - "glsl_vert": "drawable.line_pattern.vertex.glsl", - "glsl_frag": "drawable.line_pattern.fragment.glsl", + "header": "line_pattern", + "glsl_vert": "line_pattern.vertex.glsl", + "glsl_frag": "line_pattern.fragment.glsl", "uses_ubos": true }, { "name": "LocationIndicatorShader", - "header": "drawable_location_indicator", - "glsl_vert": "drawable.location_indicator.vertex.glsl", - "glsl_frag": "drawable.location_indicator.fragment.glsl", + "header": "location_indicator", + "glsl_vert": "location_indicator.vertex.glsl", + "glsl_frag": "location_indicator.fragment.glsl", "uses_ubos": true }, { "name": "LocationIndicatorTexturedShader", - "header": "drawable_location_indicator_textured", - "glsl_vert": "drawable.location_indicator_textured.vertex.glsl", - "glsl_frag": "drawable.location_indicator_textured.fragment.glsl", + "header": "location_indicator_textured", + "glsl_vert": "location_indicator_textured.vertex.glsl", + "glsl_frag": "location_indicator_textured.fragment.glsl", "uses_ubos": true }, { "name": "LineSDFShader", - "header": "drawable_line_sdf", - "glsl_vert": "drawable.line_sdf.vertex.glsl", - "glsl_frag": "drawable.line_sdf.fragment.glsl", + "header": "line_sdf", + "glsl_vert": "line_sdf.vertex.glsl", + "glsl_frag": "line_sdf.fragment.glsl", "uses_ubos": true }, { "name": "RasterShader", - "header": "drawable_raster", - "glsl_vert": "drawable.raster.vertex.glsl", - "glsl_frag": "drawable.raster.fragment.glsl", + "header": "raster", + "glsl_vert": "raster.vertex.glsl", + "glsl_frag": "raster.fragment.glsl", "uses_ubos": true }, { "name": "SymbolIconShader", - "header": "drawable_symbol_icon", - "glsl_vert": "drawable.symbol_icon.vertex.glsl", - "glsl_frag": "drawable.symbol_icon.fragment.glsl", + "header": "symbol_icon", + "glsl_vert": "symbol_icon.vertex.glsl", + "glsl_frag": "symbol_icon.fragment.glsl", "uses_ubos": true }, { "name": "SymbolSDFIconShader", - "header": "drawable_symbol_sdf", - "glsl_vert": "drawable.symbol_sdf.vertex.glsl", - "glsl_frag": "drawable.symbol_sdf.fragment.glsl", + "header": "symbol_sdf", + "glsl_vert": "symbol_sdf.vertex.glsl", + "glsl_frag": "symbol_sdf.fragment.glsl", "uses_ubos": true }, { "name": "SymbolTextAndIconShader", - "header": "drawable_symbol_text_and_icon", - "glsl_vert": "drawable.symbol_text_and_icon.vertex.glsl", - "glsl_frag": "drawable.symbol_text_and_icon.fragment.glsl", + "header": "symbol_text_and_icon", + "glsl_vert": "symbol_text_and_icon.vertex.glsl", + "glsl_frag": "symbol_text_and_icon.fragment.glsl", "uses_ubos": true }, { "name": "WideVectorShader", - "header": "drawable_wide_vector", + "header": "wide_vector", "glsl_vert": "_empty.glsl", "glsl_frag": "_empty.glsl", "uses_ubos": true - }, - - { - "name": "Prelude", - "header": "prelude", - "glsl_vert": "_prelude.vertex.glsl", - "glsl_frag": "_prelude.fragment.glsl" - }, - { - "name": "BackgroundProgram", - "header": "background", - "glsl_vert": "background.vertex.glsl", - "glsl_frag": "background.fragment.glsl" - }, - { - "name": "BackgroundPatternProgram", - "header": "background_pattern", - "glsl_vert": "background_pattern.vertex.glsl", - "glsl_frag": "background_pattern.fragment.glsl" - }, - { - "name": "CircleProgram", - "header": "circle", - "glsl_vert": "circle.vertex.glsl", - "glsl_frag": "circle.fragment.glsl" - }, - { - "name": "ClippingMaskProgram", - "header": "clipping_mask", - "glsl_vert": "clipping_mask.vertex.glsl", - "glsl_frag": "clipping_mask.fragment.glsl" - }, - { - "name": "CollisionBoxProgram", - "header": "collision_box", - "glsl_vert": "collision_box.vertex.glsl", - "glsl_frag": "collision_box.fragment.glsl" - }, - { - "name": "CollisionCircleProgram", - "header": "collision_circle", - "glsl_vert": "collision_circle.vertex.glsl", - "glsl_frag": "collision_circle.fragment.glsl" - }, - { - "name": "DebugProgram", - "header": "debug", - "glsl_vert": "debug.vertex.glsl", - "glsl_frag": "debug.fragment.glsl" - }, - { - "name": "FillExtrusionPatternProgram", - "header": "fill_extrusion_pattern", - "glsl_vert": "fill_extrusion_pattern.vertex.glsl", - "glsl_frag": "fill_extrusion_pattern.fragment.glsl" - }, - { - "name": "FillExtrusionProgram", - "header": "fill_extrusion", - "glsl_vert": "fill_extrusion.vertex.glsl", - "glsl_frag": "fill_extrusion.fragment.glsl" - }, - { - "name": "FillOutlinePatternProgram", - "header": "fill_outline_pattern", - "glsl_vert": "fill_outline_pattern.vertex.glsl", - "glsl_frag": "fill_outline_pattern.fragment.glsl" - }, - { - "name": "FillOutlineProgram", - "header": "fill_outline", - "glsl_vert": "fill_outline.vertex.glsl", - "glsl_frag": "fill_outline.fragment.glsl" - }, - { - "name": "FillPatternProgram", - "header": "fill_pattern", - "glsl_vert": "fill_pattern.vertex.glsl", - "glsl_frag": "fill_pattern.fragment.glsl" - }, - { - "name": "FillProgram", - "header": "fill", - "glsl_vert": "fill.vertex.glsl", - "glsl_frag": "fill.fragment.glsl" - }, - { - "name": "HeatmapTextureProgram", - "header": "heatmap_texture", - "glsl_vert": "heatmap_texture.vertex.glsl", - "glsl_frag": "heatmap_texture.fragment.glsl" - }, - { - "name": "HeatmapProgram", - "header": "heatmap", - "glsl_vert": "heatmap.vertex.glsl", - "glsl_frag": "heatmap.fragment.glsl" - }, - { - "name": "HillshadePrepareProgram", - "header": "hillshade_prepare", - "glsl_vert": "hillshade_prepare.vertex.glsl", - "glsl_frag": "hillshade_prepare.fragment.glsl" - }, - { - "name": "HillshadeProgram", - "header": "hillshade", - "glsl_vert": "hillshade.vertex.glsl", - "glsl_frag": "hillshade.fragment.glsl" - }, - { - "name": "LineGradientProgram", - "header": "line_gradient", - "glsl_vert": "line_gradient.vertex.glsl", - "glsl_frag": "line_gradient.fragment.glsl" - }, - { - "name": "LinePatternProgram", - "header": "line_pattern", - "glsl_vert": "line_pattern.vertex.glsl", - "glsl_frag": "line_pattern.fragment.glsl" - }, - { - "name": "LineSDFProgram", - "header": "line_sdf", - "glsl_vert": "line_sdf.vertex.glsl", - "glsl_frag": "line_sdf.fragment.glsl" - }, - { - "name": "LineProgram", - "header": "line", - "glsl_vert": "line.vertex.glsl", - "glsl_frag": "line.fragment.glsl" - }, - { - "name": "RasterProgram", - "header": "raster", - "glsl_vert": "raster.vertex.glsl", - "glsl_frag": "raster.fragment.glsl" - }, - { - "name": "SymbolIconProgram", - "header": "symbol_icon", - "glsl_vert": "symbol_icon.vertex.glsl", - "glsl_frag": "symbol_icon.fragment.glsl" - }, - { - "name": "SymbolSDFTextProgram", - "header": "symbol_sdf_text", - "glsl_vert": "symbol_sdf.vertex.glsl", - "glsl_frag": "symbol_sdf.fragment.glsl" - }, - { - "name": "SymbolSDFIconProgram", - "header": "symbol_sdf_icon", - "glsl_vert": "symbol_sdf.vertex.glsl", - "glsl_frag": "symbol_sdf.fragment.glsl" - }, - { - "name": "SymbolTextAndIconProgram", - "header": "symbol_text_and_icon", - "glsl_vert": "symbol_text_and_icon.vertex.glsl", - "glsl_frag": "symbol_text_and_icon.fragment.glsl" } ] diff --git a/shaders/raster.fragment.glsl b/shaders/raster.fragment.glsl index 473d45ddcae8..352cf5a00606 100644 --- a/shaders/raster.fragment.glsl +++ b/shaders/raster.fragment.glsl @@ -1,17 +1,23 @@ -uniform float u_fade_t; -uniform float u_opacity; +layout (std140) uniform RasterEvaluatedPropsUBO { + highp vec3 u_spin_weights; + highp vec2 u_tl_parent; + highp float u_scale_parent; + highp float u_buffer_scale; + highp float u_fade_t; + highp float u_opacity; + highp float u_brightness_low; + highp float u_brightness_high; + highp float u_saturation_factor; + highp float u_contrast_factor; + lowp float props_pad1; + lowp float props_pad2; +}; uniform sampler2D u_image0; uniform sampler2D u_image1; + in vec2 v_pos0; in vec2 v_pos1; -uniform float u_brightness_low; -uniform float u_brightness_high; - -uniform float u_saturation_factor; -uniform float u_contrast_factor; -uniform vec3 u_spin_weights; - void main() { // read and cross-fade colors from the main and parent tiles diff --git a/shaders/raster.vertex.glsl b/shaders/raster.vertex.glsl index b3a764e744ef..331f376fed89 100644 --- a/shaders/raster.vertex.glsl +++ b/shaders/raster.vertex.glsl @@ -1,7 +1,20 @@ -uniform mat4 u_matrix; -uniform vec2 u_tl_parent; -uniform float u_scale_parent; -uniform float u_buffer_scale; +layout (std140) uniform RasterDrawableUBO { + highp mat4 u_matrix; +}; +layout (std140) uniform RasterEvaluatedPropsUBO { + highp vec3 u_spin_weights; + highp vec2 u_tl_parent; + highp float u_scale_parent; + highp float u_buffer_scale; + highp float u_fade_t; + highp float u_opacity; + highp float u_brightness_low; + highp float u_brightness_high; + highp float u_saturation_factor; + highp float u_contrast_factor; + lowp float props_pad1; + lowp float props_pad2; +}; layout (location = 0) in vec2 a_pos; layout (location = 1) in vec2 a_texture_pos; diff --git a/shaders/symbol_icon.fragment.glsl b/shaders/symbol_icon.fragment.glsl index ec81b93632bc..ce3a301d52d7 100644 --- a/shaders/symbol_icon.fragment.glsl +++ b/shaders/symbol_icon.fragment.glsl @@ -1,11 +1,35 @@ uniform sampler2D u_texture; +layout (std140) uniform SymbolTilePropsUBO { + bool u_is_text; + bool u_is_halo; + highp float u_gamma_scale; + lowp float tileprops_pad1; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; + in vec2 v_tex; in float v_fade_opacity; #pragma mapbox: define lowp float opacity void main() { + highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + #pragma mapbox: initialize lowp float opacity lowp float alpha = opacity * v_fade_opacity; diff --git a/shaders/symbol_icon.vertex.glsl b/shaders/symbol_icon.vertex.glsl index 22142319583a..678f3323b74f 100644 --- a/shaders/symbol_icon.vertex.glsl +++ b/shaders/symbol_icon.vertex.glsl @@ -4,24 +4,57 @@ layout (location = 2) in vec4 a_pixeloffset; layout (location = 3) in vec3 a_projected_pos; layout (location = 4) in float a_fade_opacity; -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform highp float u_camera_to_center_distance; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform float u_fade_change; - -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; - -uniform bool u_is_text; -uniform bool u_pitch_with_map; - -uniform vec2 u_texsize; +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform SymbolDrawableUBO { + highp mat4 u_matrix; + highp mat4 u_label_plane_matrix; + highp mat4 u_coord_matrix; + + highp vec2 u_texsize; + highp vec2 u_texsize_icon; + + bool u_is_text_prop; + bool u_rotate_symbol; + bool u_pitch_with_map; + bool u_is_size_zoom_constant; + bool u_is_size_feature_constant; + + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function + highp float u_size; // used when size is both zoom and feature constant + + // Interpolations + highp float u_fill_color_t; + highp float u_halo_color_t; + highp float u_opacity_t; + highp float u_halo_width_t; + highp float u_halo_blur_t; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; out vec2 v_tex; out float v_fade_opacity; @@ -29,6 +62,8 @@ out float v_fade_opacity; #pragma mapbox: define lowp float opacity void main() { + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + #pragma mapbox: initialize lowp float opacity vec2 a_pos = a_pos_offset.xy; @@ -65,7 +100,7 @@ void main() { size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { @@ -87,6 +122,6 @@ void main() { v_tex = a_tex / u_texsize; vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; + float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); } diff --git a/shaders/symbol_sdf.fragment.glsl b/shaders/symbol_sdf.fragment.glsl index 59cf59c1c049..6bc97ac3e171 100644 --- a/shaders/symbol_sdf.fragment.glsl +++ b/shaders/symbol_sdf.fragment.glsl @@ -1,10 +1,28 @@ #define SDF_PX 8.0 -uniform bool u_is_halo; +layout (std140) uniform SymbolTilePropsUBO { + bool u_is_text; + bool u_is_halo; + highp float u_gamma_scale; + lowp float tileprops_pad1; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; + uniform sampler2D u_texture; -uniform highp float u_gamma_scale; -uniform lowp float u_device_pixel_ratio; -uniform bool u_is_text; in vec2 v_data0; in vec3 v_data1; @@ -16,13 +34,19 @@ in vec3 v_data1; #pragma mapbox: define lowp float halo_blur void main() { + highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color #pragma mapbox: initialize lowp float opacity #pragma mapbox: initialize lowp float halo_width #pragma mapbox: initialize lowp float halo_blur - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; + float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; vec2 tex = v_data0.xy; float gamma_scale = v_data1.x; diff --git a/shaders/symbol_sdf.vertex.glsl b/shaders/symbol_sdf.vertex.glsl index 2141399de272..6c94980d7afe 100644 --- a/shaders/symbol_sdf.vertex.glsl +++ b/shaders/symbol_sdf.vertex.glsl @@ -11,21 +11,58 @@ layout (location = 4) in float a_fade_opacity; // For composite functions: // [ text-size(lowerZoomStop, feature), // text-size(upperZoomStop, feature) ] -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; -uniform bool u_is_text; -uniform bool u_pitch_with_map; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform highp float u_camera_to_center_distance; -uniform float u_fade_change; -uniform vec2 u_texsize; + +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform SymbolDrawableUBO { + highp mat4 u_matrix; + highp mat4 u_label_plane_matrix; + highp mat4 u_coord_matrix; + + highp vec2 u_texsize; + highp vec2 u_texsize_icon; + + bool u_is_text_prop; + bool u_rotate_symbol; + bool u_pitch_with_map; + bool u_is_size_zoom_constant; + bool u_is_size_feature_constant; + + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function + highp float u_size; // used when size is both zoom and feature constant + + // Interpolations + highp float u_fill_color_t; + highp float u_halo_color_t; + highp float u_opacity_t; + highp float u_halo_width_t; + highp float u_halo_blur_t; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; out vec2 v_data0; out vec3 v_data1; @@ -37,6 +74,12 @@ out vec3 v_data1; #pragma mapbox: define lowp float halo_blur void main() { + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; + #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color #pragma mapbox: initialize lowp float opacity @@ -81,7 +124,7 @@ void main() { size *= perspective_ratio; - float fontScale = u_is_text ? size / 24.0 : size; + float fontScale = u_is_text_prop ? size / 24.0 : size; highp float symbol_rotation = 0.0; if (u_rotate_symbol) { @@ -105,7 +148,7 @@ void main() { float gamma_scale = gl_Position.w; vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; + float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); v_data0 = a_tex / u_texsize; diff --git a/shaders/symbol_text_and_icon.fragment.glsl b/shaders/symbol_text_and_icon.fragment.glsl index 672e1dcb1f96..8c307d0f0d44 100644 --- a/shaders/symbol_text_and_icon.fragment.glsl +++ b/shaders/symbol_text_and_icon.fragment.glsl @@ -3,11 +3,30 @@ #define SDF 1.0 #define ICON 0.0 -uniform bool u_is_halo; +layout (std140) uniform SymbolTilePropsUBO { + bool u_is_text; + bool u_is_halo; + highp float u_gamma_scale; + lowp float tileprops_pad1; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; + uniform sampler2D u_texture; uniform sampler2D u_texture_icon; -uniform highp float u_gamma_scale; -uniform lowp float u_device_pixel_ratio; in vec4 v_data0; in vec4 v_data1; @@ -19,6 +38,12 @@ in vec4 v_data1; #pragma mapbox: define lowp float halo_blur void main() { + highp vec4 u_fill_color = u_is_text ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text ? u_text_halo_blur : u_icon_halo_blur; + #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color #pragma mapbox: initialize lowp float opacity @@ -40,7 +65,7 @@ void main() { vec2 tex = v_data0.xy; - float EDGE_GAMMA = 0.105 / u_device_pixel_ratio; + float EDGE_GAMMA = 0.105 / DEVICE_PIXEL_RATIO; float gamma_scale = v_data1.x; float size = v_data1.y; diff --git a/shaders/symbol_text_and_icon.vertex.glsl b/shaders/symbol_text_and_icon.vertex.glsl index f4812aacc63c..6035d4512770 100644 --- a/shaders/symbol_text_and_icon.vertex.glsl +++ b/shaders/symbol_text_and_icon.vertex.glsl @@ -10,22 +10,58 @@ layout (location = 3) in float a_fade_opacity; // For composite functions: // [ text-size(lowerZoomStop, feature), // text-size(upperZoomStop, feature) ] -uniform bool u_is_size_zoom_constant; -uniform bool u_is_size_feature_constant; -uniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function -uniform highp float u_size; // used when size is both zoom and feature constant -uniform mat4 u_matrix; -uniform mat4 u_label_plane_matrix; -uniform mat4 u_coord_matrix; -uniform bool u_is_text; -uniform bool u_pitch_with_map; -uniform highp float u_pitch; -uniform bool u_rotate_symbol; -uniform highp float u_aspect_ratio; -uniform highp float u_camera_to_center_distance; -uniform float u_fade_change; -uniform vec2 u_texsize; -uniform vec2 u_texsize_icon; + +layout (std140) uniform GlobalPaintParamsUBO { + highp vec2 u_pattern_atlas_texsize; + highp vec2 u_units_to_pixels; + highp vec2 u_world_size; + highp float u_camera_to_center_distance; + highp float u_symbol_fade_change; + highp float u_aspect_ratio; + highp float u_pixel_ratio; + highp float u_map_zoom; + lowp float global_pad1; +}; + +layout (std140) uniform SymbolDrawableUBO { + highp mat4 u_matrix; + highp mat4 u_label_plane_matrix; + highp mat4 u_coord_matrix; + + highp vec2 u_texsize; + highp vec2 u_texsize_icon; + + bool u_is_text_prop; + bool u_rotate_symbol; + bool u_pitch_with_map; + bool u_is_size_zoom_constant; + bool u_is_size_feature_constant; + + highp float u_size_t; // used to interpolate between zoom stops when size is a composite function + highp float u_size; // used when size is both zoom and feature constant + + // Interpolations + highp float u_fill_color_t; + highp float u_halo_color_t; + highp float u_opacity_t; + highp float u_halo_width_t; + highp float u_halo_blur_t; +}; + +layout (std140) uniform SymbolEvaluatedPropsUBO { + highp vec4 u_text_fill_color; + highp vec4 u_text_halo_color; + highp float u_text_opacity; + highp float u_text_halo_width; + highp float u_text_halo_blur; + lowp float props_pad1; + highp vec4 u_icon_fill_color; + highp vec4 u_icon_halo_color; + highp float u_icon_opacity; + highp float u_icon_halo_width; + highp float u_icon_halo_blur; + lowp float props_pad2; +}; out vec4 v_data0; out vec4 v_data1; @@ -37,6 +73,12 @@ out vec4 v_data1; #pragma mapbox: define lowp float halo_blur void main() { + highp vec4 u_fill_color = u_is_text_prop ? u_text_fill_color : u_icon_fill_color; + highp vec4 u_halo_color = u_is_text_prop ? u_text_halo_color : u_icon_halo_color; + highp float u_opacity = u_is_text_prop ? u_text_opacity : u_icon_opacity; + highp float u_halo_width = u_is_text_prop ? u_text_halo_width : u_icon_halo_width; + highp float u_halo_blur = u_is_text_prop ? u_text_halo_blur : u_icon_halo_blur; + #pragma mapbox: initialize highp vec4 fill_color #pragma mapbox: initialize highp vec4 halo_color #pragma mapbox: initialize lowp float opacity @@ -105,7 +147,7 @@ void main() { float gamma_scale = gl_Position.w; vec2 fade_opacity = unpack_opacity(a_fade_opacity); - float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change; + float fade_change = fade_opacity[1] > 0.5 ? u_symbol_fade_change : -u_symbol_fade_change; float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change)); v_data0.xy = a_tex / u_texsize; diff --git a/src/mbgl/gfx/drawable_builder_impl.cpp b/src/mbgl/gfx/drawable_builder_impl.cpp index 781a0a8576f1..98c54f74aee2 100644 --- a/src/mbgl/gfx/drawable_builder_impl.cpp +++ b/src/mbgl/gfx/drawable_builder_impl.cpp @@ -203,8 +203,8 @@ void DrawableBuilder::Impl::setupForWideVectors(gfx::Context& context, gfx::Draw } // segments - SegmentVector triangleSegments; - triangleSegments.emplace_back(Segment{0, 0, 12, 18}); + SegmentVector triangleSegments; + triangleSegments.emplace_back(0, 0, 12, 18); // add to builder { diff --git a/src/mbgl/gfx/fill_generator.cpp b/src/mbgl/gfx/fill_generator.cpp index f1879fdcd95d..4e5f61f3b227 100644 --- a/src/mbgl/gfx/fill_generator.cpp +++ b/src/mbgl/gfx/fill_generator.cpp @@ -38,7 +38,7 @@ namespace { std::size_t addRingVertices(gfx::VertexVector& vertices, const GeometryCoordinates& ring) { for (auto& point : ring) { - vertices.emplace_back(FillProgram::layoutVertex(point)); + vertices.emplace_back(FillBucket::layoutVertex(point)); } return ring.size(); } @@ -52,7 +52,7 @@ std::size_t totalVerticesCheck(const GeometryCollection& polygon) { return totalVertices; } -void addFillIndices(SegmentVector& fillSegments, +void addFillIndices(SegmentVector& fillSegments, gfx::IndexVector& fillIndexes, std::vector& indices, std::size_t startVertices, @@ -80,7 +80,7 @@ void addFillIndices(SegmentVector& fillSegments, void addOutlineIndices(std::size_t base, std::size_t nVertices, - SegmentVector& lineSegments, + SegmentVector& lineSegments, gfx::IndexVector& lineIndexes) { if (nVertices == 0) return; @@ -106,7 +106,7 @@ void addOutlineIndices(std::size_t base, void generateFillBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments) { + SegmentVector& fillSegments) { for (auto& polygon : classifyRings(geometry)) { // Optimize polygons with many interior rings for earcut tesselation. limitHoles(polygon, 500); @@ -126,9 +126,9 @@ void generateFillBuffers(const GeometryCollection& geometry, void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& vertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments) { + SegmentVector& lineSegments) { for (auto& polygon : classifyRings(geometry)) { // Optimize polygons with many interior rings for earcut tesselation. limitHoles(polygon, 500); @@ -150,18 +150,18 @@ void generateFillAndOutineBuffers(const GeometryCollection& geometry, void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::VertexVector& lineVertices, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments) { - gfx::PolylineGenerator> lineGenerator( + SegmentVector& lineSegments) { + gfx::PolylineGenerator lineGenerator( lineVertices, - LineProgram::layoutVertex, + LineBucket::layoutVertex, lineSegments, - [](std::size_t vertexOffset, std::size_t indexOffset) -> Segment { - return Segment(vertexOffset, indexOffset); + [](std::size_t vertexOffset, std::size_t indexOffset) -> SegmentBase { + return SegmentBase(vertexOffset, indexOffset); }, - [](auto& seg) -> Segment& { return seg; }, + [](auto& seg) -> SegmentBase& { return seg; }, lineIndexes); gfx::PolylineGeneratorOptions lineOptions; @@ -187,20 +187,20 @@ void generateFillAndOutineBuffers(const GeometryCollection& geometry, void generateFillAndOutineBuffers(const GeometryCollection& geometry, gfx::VertexVector& fillVertices, gfx::IndexVector& fillIndexes, - SegmentVector& fillSegments, + SegmentVector& fillSegments, gfx::VertexVector& lineVertices, gfx::IndexVector& lineIndexes, - SegmentVector& lineSegments, + SegmentVector& lineSegments, gfx::IndexVector& basicLineIndexes, - SegmentVector& basicLineSegments) { - gfx::PolylineGenerator> lineGenerator( + SegmentVector& basicLineSegments) { + gfx::PolylineGenerator lineGenerator( lineVertices, - LineProgram::layoutVertex, + LineBucket::layoutVertex, lineSegments, - [](std::size_t vertexOffset, std::size_t indexOffset) -> Segment { - return Segment(vertexOffset, indexOffset); + [](std::size_t vertexOffset, std::size_t indexOffset) -> SegmentBase { + return SegmentBase(vertexOffset, indexOffset); }, - [](auto& seg) -> Segment& { return seg; }, + [](auto& seg) -> SegmentBase& { return seg; }, lineIndexes); gfx::PolylineGeneratorOptions lineOptions; diff --git a/src/mbgl/gfx/polyline_generator.cpp b/src/mbgl/gfx/polyline_generator.cpp index fc4cb1ccdb22..897c378bcc09 100644 --- a/src/mbgl/gfx/polyline_generator.cpp +++ b/src/mbgl/gfx/polyline_generator.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -637,7 +637,7 @@ void PolylineGenerator::addPieSliceVertex(const GeometryCoordinate& cur template class PolylineGenerator>; -template class PolylineGenerator>; +template class PolylineGenerator; } // namespace gfx } // namespace mbgl diff --git a/src/mbgl/layout/circle_layout.hpp b/src/mbgl/layout/circle_layout.hpp index 72a870fceceb..e5197565b522 100644 --- a/src/mbgl/layout/circle_layout.hpp +++ b/src/mbgl/layout/circle_layout.hpp @@ -126,10 +126,10 @@ class CircleLayout final : public Layout { // │ 1 2 │ // └─────────┘ // - vertices.emplace_back(CircleProgram::vertex(point, -1, -1)); // 1 - vertices.emplace_back(CircleProgram::vertex(point, 1, -1)); // 2 - vertices.emplace_back(CircleProgram::vertex(point, 1, 1)); // 3 - vertices.emplace_back(CircleProgram::vertex(point, -1, 1)); // 4 + vertices.emplace_back(CircleBucket::vertex(point, -1, -1)); // 1 + vertices.emplace_back(CircleBucket::vertex(point, 1, -1)); // 2 + vertices.emplace_back(CircleBucket::vertex(point, 1, 1)); // 3 + vertices.emplace_back(CircleBucket::vertex(point, -1, 1)); // 4 auto& segment = segments.back(); assert(segment.vertexLength <= std::numeric_limits::max()); diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 4b265a482ef4..50a80c8b9140 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -1087,53 +1087,53 @@ size_t SymbolLayout::addSymbol(SymbolBucket::Buffer& buffer, // coordinates (2 triangles) auto& vertices = buffer.vertices(); - vertices.emplace_back(SymbolSDFIconProgram::layoutVertex(labelAnchor.point, - tl, - symbol.glyphOffset.y, - tex.x, - tex.y, - sizeData, - symbol.isSDF, - pixelOffsetTL, - minFontScale)); - vertices.emplace_back(SymbolSDFIconProgram::layoutVertex(labelAnchor.point, - tr, - symbol.glyphOffset.y, - tex.x + tex.w, - tex.y, - sizeData, - symbol.isSDF, - {pixelOffsetBR.x, pixelOffsetTL.y}, - minFontScale)); - vertices.emplace_back(SymbolSDFIconProgram::layoutVertex(labelAnchor.point, - bl, - symbol.glyphOffset.y, - tex.x, - tex.y + tex.h, - sizeData, - symbol.isSDF, - {pixelOffsetTL.x, pixelOffsetBR.y}, - minFontScale)); - vertices.emplace_back(SymbolSDFIconProgram::layoutVertex(labelAnchor.point, - br, - symbol.glyphOffset.y, - tex.x + tex.w, - tex.y + tex.h, - sizeData, - symbol.isSDF, - pixelOffsetBR, - minFontScale)); + vertices.emplace_back(SymbolBucket::layoutVertex(labelAnchor.point, + tl, + symbol.glyphOffset.y, + tex.x, + tex.y, + sizeData, + symbol.isSDF, + pixelOffsetTL, + minFontScale)); + vertices.emplace_back(SymbolBucket::layoutVertex(labelAnchor.point, + tr, + symbol.glyphOffset.y, + tex.x + tex.w, + tex.y, + sizeData, + symbol.isSDF, + {pixelOffsetBR.x, pixelOffsetTL.y}, + minFontScale)); + vertices.emplace_back(SymbolBucket::layoutVertex(labelAnchor.point, + bl, + symbol.glyphOffset.y, + tex.x, + tex.y + tex.h, + sizeData, + symbol.isSDF, + {pixelOffsetTL.x, pixelOffsetBR.y}, + minFontScale)); + vertices.emplace_back(SymbolBucket::layoutVertex(labelAnchor.point, + br, + symbol.glyphOffset.y, + tex.x + tex.w, + tex.y + tex.h, + sizeData, + symbol.isSDF, + pixelOffsetBR, + minFontScale)); // Dynamic/Opacity vertices are initialized so that the vertex count always // agrees with the layout vertex buffer, but they will always be updated // before rendering happens - auto dynamicVertex = SymbolSDFIconProgram::dynamicLayoutVertex(labelAnchor.point, 0); + auto dynamicVertex = SymbolBucket::dynamicLayoutVertex(labelAnchor.point, 0); buffer.dynamicVertices().emplace_back(dynamicVertex); buffer.dynamicVertices().emplace_back(dynamicVertex); buffer.dynamicVertices().emplace_back(dynamicVertex); buffer.dynamicVertices().emplace_back(dynamicVertex); - auto opacityVertex = SymbolSDFIconProgram::opacityVertex(true, 1.0); + auto opacityVertex = SymbolBucket::opacityVertex(true, 1.0); buffer.opacityVertices().emplace_back(opacityVertex); buffer.opacityVertices().emplace_back(opacityVertex); buffer.opacityVertices().emplace_back(opacityVertex); @@ -1209,18 +1209,18 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) { auto index = static_cast(segment.vertexLength); collisionBuffer.vertices().emplace_back( - CollisionBoxProgram::layoutVertex(anchor, symbolInstance.getAnchor().point, tl)); + SymbolBucket::collisionLayoutVertex(anchor, symbolInstance.getAnchor().point, tl)); collisionBuffer.vertices().emplace_back( - CollisionBoxProgram::layoutVertex(anchor, symbolInstance.getAnchor().point, tr)); + SymbolBucket::collisionLayoutVertex(anchor, symbolInstance.getAnchor().point, tr)); collisionBuffer.vertices().emplace_back( - CollisionBoxProgram::layoutVertex(anchor, symbolInstance.getAnchor().point, br)); + SymbolBucket::collisionLayoutVertex(anchor, symbolInstance.getAnchor().point, br)); collisionBuffer.vertices().emplace_back( - CollisionBoxProgram::layoutVertex(anchor, symbolInstance.getAnchor().point, bl)); + SymbolBucket::collisionLayoutVertex(anchor, symbolInstance.getAnchor().point, bl)); // Dynamic vertices are initialized so that the vertex count // always agrees with the layout vertex buffer, but they will // always be updated before rendering happens - auto dynamicVertex = CollisionBoxProgram::dynamicVertex(false, false, {}); + auto dynamicVertex = SymbolBucket::collisionDynamicVertex(false, false, {}); collisionBuffer.dynamicVertices().emplace_back(dynamicVertex); collisionBuffer.dynamicVertices().emplace_back(dynamicVertex); collisionBuffer.dynamicVertices().emplace_back(dynamicVertex); diff --git a/src/mbgl/layout/symbol_projection.cpp b/src/mbgl/layout/symbol_projection.cpp index 57052a0b0d41..a6d14600b5d0 100644 --- a/src/mbgl/layout/symbol_projection.cpp +++ b/src/mbgl/layout/symbol_projection.cpp @@ -141,7 +141,7 @@ bool isVisible(const vec4& anchorPos, const std::array& clippingBuffe void addDynamicAttributes(const Point& anchorPoint, const float angle, gfx::VertexVector>& dynamicVertexArray) { - auto dynamicVertex = SymbolSDFIconProgram::dynamicLayoutVertex(anchorPoint, angle); + auto dynamicVertex = SymbolBucket::dynamicLayoutVertex(anchorPoint, angle); dynamicVertexArray.emplace_back(dynamicVertex); dynamicVertexArray.emplace_back(dynamicVertex); dynamicVertexArray.emplace_back(dynamicVertex); diff --git a/src/mbgl/layout/symbol_projection.hpp b/src/mbgl/layout/symbol_projection.hpp index 6cfade3da9b0..903b32c28e32 100644 --- a/src/mbgl/layout/symbol_projection.hpp +++ b/src/mbgl/layout/symbol_projection.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include namespace mbgl { diff --git a/src/mbgl/programs/background_pattern_program.hpp b/src/mbgl/programs/background_pattern_program.hpp deleted file mode 100644 index 4b66065670ca..000000000000 --- a/src/mbgl/programs/background_pattern_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/background_program.cpp b/src/mbgl/programs/background_program.cpp deleted file mode 100644 index 46fb13db3706..000000000000 --- a/src/mbgl/programs/background_program.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include -#include - -namespace mbgl { - -using namespace style; - -static_assert(sizeof(BackgroundLayoutVertex) == 4, "expected BackgroundLayoutVertex size"); - -BackgroundPatternProgram::LayoutUniformValues BackgroundPatternProgram::layoutUniformValues( - mat4 matrix, - float opacity, - Size atlasSize, - const ImagePosition& a, - const ImagePosition& b, - const CrossfadeParameters& fading, - const UnwrappedTileID& tileID, - const TransformState& state) { - int32_t tileSizeAtNearestZoom = static_cast(util::tileSize_D * - state.zoomScale(state.getIntegerZoom() - tileID.canonical.z)); - int32_t pixelX = static_cast(tileSizeAtNearestZoom * - (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z))); - int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; - - return { - uniforms::matrix::Value(matrix), - uniforms::opacity::Value(opacity), - uniforms::texsize::Value(atlasSize), - uniforms::pattern_tl_a::Value(a.tl()), - uniforms::pattern_br_a::Value(a.br()), - uniforms::pattern_tl_b::Value(b.tl()), - uniforms::pattern_br_b::Value(b.br()), - uniforms::pattern_size_a::Value(a.displaySize()), - uniforms::pattern_size_b::Value(b.displaySize()), - uniforms::scale_a::Value(fading.fromScale), - uniforms::scale_b::Value(fading.toScale), - uniforms::mix::Value(fading.t), - uniforms::pixel_coord_upper::Value( - std::array{{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}}), - uniforms::pixel_coord_lower::Value( - std::array{{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}}), - uniforms::tile_units_to_pixels::Value(1.0f / tileID.pixelsToTileUnits(1.0f, state.getIntegerZoom())), - }; -} - -} // namespace mbgl diff --git a/src/mbgl/programs/background_program.hpp b/src/mbgl/programs/background_program.hpp deleted file mode 100644 index 205d8cad96cb..000000000000 --- a/src/mbgl/programs/background_program.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -class ImagePosition; -class UnwrappedTileID; -class TransformState; -template -class Faded; - -using BackgroundLayoutAttributes = PositionOnlyLayoutAttributes; - -using BackgroundUniforms = TypeList; - -using BackgroundPatternUniforms = TypeList; - -class BackgroundProgram final : public Program, - style::Properties<>> { -public: - static constexpr std::string_view Name{"BackgroundProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; -}; - -class BackgroundPatternProgram final : public Program, - style::Properties<>> { -public: - static constexpr std::string_view Name{"BackgroundPatternProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(mat4 matrix, - float opacity, - Size atlasSize, - const ImagePosition&, - const ImagePosition&, - const CrossfadeParameters&, - const UnwrappedTileID&, - const TransformState&); -}; - -using BackgroundLayoutVertex = BackgroundProgram::LayoutVertex; -using BackgroundAttributes = BackgroundProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/circle_program.cpp b/src/mbgl/programs/circle_program.cpp deleted file mode 100644 index 99b47dd5c02e..000000000000 --- a/src/mbgl/programs/circle_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(CircleLayoutVertex) == 4, "expected CircleLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/circle_program.hpp b/src/mbgl/programs/circle_program.hpp deleted file mode 100644 index bb93c6c8fe4f..000000000000 --- a/src/mbgl/programs/circle_program.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(bool, scale_with_map); -} // namespace uniforms - -class CircleProgram final : public Program, - TypeList, - TypeList<>, - style::CirclePaintProperties> { -public: - static constexpr std::string_view Name{"CircleProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - /* - * @param {number} x vertex position - * @param {number} y vertex position - * @param {number} ex extrude normal - * @param {number} ey extrude normal - */ - static LayoutVertex vertex(Point p, float ex, float ey) { - return LayoutVertex{ - {{static_cast((p.x * 2) + ((ex + 1) / 2)), static_cast((p.y * 2) + ((ey + 1) / 2))}}}; - } -}; - -using CircleLayoutVertex = CircleProgram::LayoutVertex; -using CircleAttributes = CircleProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/collision_box_program.cpp b/src/mbgl/programs/collision_box_program.cpp deleted file mode 100644 index 584013640e72..000000000000 --- a/src/mbgl/programs/collision_box_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(CollisionBoxProgram::LayoutVertex) == 24, "expected CollisionBoxVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp deleted file mode 100644 index 2a9635467236..000000000000 --- a/src/mbgl/programs/collision_box_program.hpp +++ /dev/null @@ -1,168 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include - -namespace mbgl { - -using CollisionBoxLayoutAttributes = TypeList; - -using CollisionBoxDynamicAttributes = TypeList; - -class CollisionBoxProgram final - : public Program, - TypeList, - TypeList<>, - style::Properties<>> { -public: - static constexpr std::string_view Name{"CollisionBoxProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static gfx::Vertex layoutVertex(Point a, Point anchor, Point o) { - return {{{static_cast(a.x), static_cast(a.y)}}, - {{static_cast(anchor.x), static_cast(anchor.y)}}, - {{static_cast(::round(o.x)), static_cast(::round(o.y))}}}; - } - - static gfx::Vertex dynamicVertex(bool placed, bool notUsed, Point shift) { - return {{{static_cast(placed), static_cast(notUsed)}}, {{shift.x, shift.y}}}; - } - - template - void draw(gfx::Context& context, - gfx::RenderPass& renderPass, - const DrawMode& drawMode, - const gfx::DepthMode& depthMode, - const gfx::StencilMode& stencilMode, - const gfx::ColorMode& colorMode, - const gfx::CullFaceMode& cullFaceMode, - const LayoutUniformValues& layoutUniformValues, - const gfx::VertexBuffer>& layoutVertexBuffer, - const gfx::VertexBuffer>& dynamicVertexBuffer, - const gfx::IndexBuffer& indexBuffer, - const SegmentVector& segments, - const Binders& paintPropertyBinders, - const typename PaintProperties::PossiblyEvaluated& currentProperties, - const TextureBindings& textureBindings, - float currentZoom, - const std::string& layerID) { - UniformValues uniformValues = layoutUniformValues.concat( - paintPropertyBinders.uniformValues(currentZoom, currentProperties)); - - AttributeBindings allAttributeBindings = - gfx::AttributeBindings(layoutVertexBuffer) - .concat(gfx::AttributeBindings(dynamicVertexBuffer)) - .concat(paintPropertyBinders.attributeBindings(currentProperties)); - - assert(layoutVertexBuffer.elements == dynamicVertexBuffer.elements); - - for (auto& segment : segments) { - auto drawScopeIt = segment.drawScopes.find(layerID); - - if (drawScopeIt == segment.drawScopes.end()) { - drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; - } - - program->draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - uniformValues, - drawScopeIt->second, - allAttributeBindings.offset(segment.vertexOffset), - textureBindings, - indexBuffer, - segment.indexOffset, - segment.indexLength); - } - } -}; - -class CollisionCircleProgram final - : public Program, - TypeList, - TypeList<>, - style::Properties<>> { -public: - static constexpr std::string_view Name{"CollisionCircleProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static gfx::Vertex vertex(Point a, Point anchor, Point o) { - return {{{static_cast(a.x), static_cast(a.y)}}, - {{static_cast(anchor.x), static_cast(anchor.y)}}, - {{static_cast(::round(o.x)), static_cast(::round(o.y))}}}; - } - - template - void draw(gfx::Context& context, - gfx::RenderPass& renderPass, - const DrawMode& drawMode, - const gfx::DepthMode& depthMode, - const gfx::StencilMode& stencilMode, - const gfx::ColorMode& colorMode, - const gfx::CullFaceMode& cullFaceMode, - const LayoutUniformValues& layoutUniformValues, - const gfx::VertexBuffer>& layoutVertexBuffer, - const gfx::VertexBuffer>& dynamicVertexBuffer, - const gfx::IndexBuffer& indexBuffer, - const SegmentVector& segments, - const Binders& paintPropertyBinders, - const typename PaintProperties::PossiblyEvaluated& currentProperties, - const TextureBindings& textureBindings, - float currentZoom, - const std::string& layerID) { - UniformValues uniformValues = layoutUniformValues.concat( - paintPropertyBinders.uniformValues(currentZoom, currentProperties)); - - AttributeBindings allAttributeBindings = - gfx::AttributeBindings(layoutVertexBuffer) - .concat(gfx::AttributeBindings(dynamicVertexBuffer)) - .concat(paintPropertyBinders.attributeBindings(currentProperties)); - - for (auto& segment : segments) { - auto drawScopeIt = segment.drawScopes.find(layerID); - - if (drawScopeIt == segment.drawScopes.end()) { - drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; - } - - program->draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - uniformValues, - drawScopeIt->second, - allAttributeBindings.offset(segment.vertexOffset), - textureBindings, - indexBuffer, - segment.indexOffset, - segment.indexLength); - } - } -}; - -} // namespace mbgl diff --git a/src/mbgl/programs/collision_circle_program.hpp b/src/mbgl/programs/collision_circle_program.hpp deleted file mode 100644 index 1fd36af36013..000000000000 --- a/src/mbgl/programs/collision_circle_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/debug_program.cpp b/src/mbgl/programs/debug_program.cpp deleted file mode 100644 index 5ef4dc378aed..000000000000 --- a/src/mbgl/programs/debug_program.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -namespace mbgl {} // namespace mbgl diff --git a/src/mbgl/programs/debug_program.hpp b/src/mbgl/programs/debug_program.hpp deleted file mode 100644 index fe0843798a9c..000000000000 --- a/src/mbgl/programs/debug_program.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(float, overlay_scale); -} -class DebugProgram final : public Program, - TypeList, - TypeList, - style::Properties<>> { -public: - static constexpr std::string_view Name{"DebugProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; -}; - -using DebugLayoutVertex = DebugProgram::LayoutVertex; -using DebugAttributes = DebugProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/fill_extrusion_pattern_program.hpp b/src/mbgl/programs/fill_extrusion_pattern_program.hpp deleted file mode 100644 index b723ce0614ae..000000000000 --- a/src/mbgl/programs/fill_extrusion_pattern_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/fill_extrusion_program.cpp b/src/mbgl/programs/fill_extrusion_program.cpp deleted file mode 100644 index 0fc4b85b603d..000000000000 --- a/src/mbgl/programs/fill_extrusion_program.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include - -namespace mbgl { - -using namespace style; - -static_assert(sizeof(FillExtrusionLayoutVertex) == 12, "expected FillExtrusionLayoutVertex size"); - -std::array FillExtrusionProgram::lightColor(const EvaluatedLight& light) { - const auto color = light.get(); - return {{color.r, color.g, color.b}}; -} - -std::array FillExtrusionProgram::lightPosition(const EvaluatedLight& light, const TransformState& state) { - auto lightPos = light.get().getCartesian(); - mat3 lightMat; - matrix::identity(lightMat); - if (light.get() == LightAnchorType::Viewport) { - matrix::rotate(lightMat, lightMat, -state.getBearing()); - } - matrix::transformMat3f(lightPos, lightPos, lightMat); - return lightPos; -} - -float FillExtrusionProgram::lightIntensity(const EvaluatedLight& light) { - return light.get(); -} - -FillExtrusionProgram::LayoutUniformValues FillExtrusionProgram::layoutUniformValues(const mat4& matrix, - const TransformState& state, - const float opacity, - const EvaluatedLight& light, - const float verticalGradient) { - return {uniforms::matrix::Value(matrix), - uniforms::opacity::Value(opacity), - uniforms::lightcolor::Value(FillExtrusionProgram::lightColor(light)), - uniforms::lightpos::Value(FillExtrusionProgram::lightPosition(light, state)), - uniforms::lightintensity::Value(FillExtrusionProgram::lightIntensity(light)), - uniforms::vertical_gradient::Value(verticalGradient)}; -} - -FillExtrusionPatternProgram::LayoutUniformValues FillExtrusionPatternProgram::layoutUniformValues( - const mat4& matrix, - const Size atlasSize, - const CrossfadeParameters& crossfade, - const UnwrappedTileID& tileID, - const TransformState& state, - const float opacity, - const float heightFactor, - const float pixelRatio, - const EvaluatedLight& light, - const float verticalGradient) { - const auto tileRatio = 1 / tileID.pixelsToTileUnits(1, state.getIntegerZoom()); - const int32_t tileSizeAtNearestZoom = static_cast( - util::tileSize_D * state.zoomScale(state.getIntegerZoom() - tileID.canonical.z)); - const int32_t pixelX = static_cast( - tileSizeAtNearestZoom * (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z))); - const int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; - - return {uniforms::matrix::Value(matrix), - uniforms::opacity::Value(opacity), - uniforms::scale::Value({{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}}), - uniforms::texsize::Value(atlasSize), - uniforms::fade::Value(crossfade.t), - uniforms::pixel_coord_upper::Value( - std::array{{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}}), - uniforms::pixel_coord_lower::Value( - std::array{{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}}), - uniforms::height_factor::Value(heightFactor), - uniforms::lightcolor::Value(FillExtrusionProgram::lightColor(light)), - uniforms::lightpos::Value(FillExtrusionProgram::lightPosition(light, state)), - uniforms::lightintensity::Value(FillExtrusionProgram::lightIntensity(light)), - uniforms::vertical_gradient::Value(verticalGradient)}; -} - -} // namespace mbgl diff --git a/src/mbgl/programs/fill_extrusion_program.hpp b/src/mbgl/programs/fill_extrusion_program.hpp deleted file mode 100644 index 2f19b743f5b9..000000000000 --- a/src/mbgl/programs/fill_extrusion_program.hpp +++ /dev/null @@ -1,118 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace mbgl { - -class ImagePosition; -class UnwrappedTileID; -class TransformState; -template -class Faded; - -namespace uniforms { -MBGL_DEFINE_UNIFORM_VECTOR(float, 3, lightpos); -MBGL_DEFINE_UNIFORM_VECTOR(float, 3, lightcolor); -MBGL_DEFINE_UNIFORM_SCALAR(float, lightintensity); -MBGL_DEFINE_UNIFORM_SCALAR(float, vertical_gradient); -MBGL_DEFINE_UNIFORM_SCALAR(float, height_factor); -} // namespace uniforms - -using FillExtrusionLayoutAttributes = TypeList; - -using FillExtrusionUniforms = TypeList; - -using FillExtrusionPatternUniforms = TypeList; - -class FillExtrusionProgram final : public Program, - style::FillExtrusionPaintProperties> { -public: - static constexpr std::string_view Name{"FillExtrusionProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p, double nx, double ny, double nz, unsigned short t, uint16_t e) { - const auto factor = pow(2, 13); - - return LayoutVertex{{{p.x, p.y}}, - {{// Multiply normal vector components by 2^13 to pack them into - // integers We pack a bool (`t`) into the x component indicating - // whether it is an upper or lower vertex - static_cast(floor(nx * factor) * 2 + t), - static_cast(ny * factor * 2), - static_cast(nz * factor * 2), - // The edgedistance attribute is used for wrapping fill_extrusion patterns - static_cast(e)}}}; - } - - static std::array lightColor(const EvaluatedLight&); - static std::array lightPosition(const EvaluatedLight&, const TransformState&); - static float lightIntensity(const EvaluatedLight&); - - static LayoutUniformValues layoutUniformValues( - const mat4&, const TransformState&, float opacity, const EvaluatedLight&, float verticalGradient); -}; - -class FillExtrusionPatternProgram final : public Program, - style::FillExtrusionPaintProperties> { -public: - static constexpr std::string_view Name{"FillExtrusionPatternProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(const mat4&, - Size atlasSize, - const CrossfadeParameters&, - const UnwrappedTileID&, - const TransformState&, - float opacity, - float heightFactor, - float pixelRatio, - const EvaluatedLight&, - float verticalGradient); -}; - -using FillExtrusionLayoutVertex = FillExtrusionProgram::LayoutVertex; -using FillExtrusionAttributes = FillExtrusionProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/fill_outline_pattern_program.hpp b/src/mbgl/programs/fill_outline_pattern_program.hpp deleted file mode 100644 index a2c26a168df7..000000000000 --- a/src/mbgl/programs/fill_outline_pattern_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/fill_outline_program.hpp b/src/mbgl/programs/fill_outline_program.hpp deleted file mode 100644 index a2c26a168df7..000000000000 --- a/src/mbgl/programs/fill_outline_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/fill_pattern_program.hpp b/src/mbgl/programs/fill_pattern_program.hpp deleted file mode 100644 index a2c26a168df7..000000000000 --- a/src/mbgl/programs/fill_pattern_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/fill_program.cpp b/src/mbgl/programs/fill_program.cpp deleted file mode 100644 index eb687acbe492..000000000000 --- a/src/mbgl/programs/fill_program.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include - -namespace mbgl { - -using namespace style; - -static_assert(sizeof(FillLayoutVertex) == 4, "expected FillLayoutVertex size"); - -FillPatternProgram::LayoutUniformValues FillPatternProgram::layoutUniformValues(mat4 matrix, - Size framebufferSize, - Size atlasSize, - const CrossfadeParameters& crossfade, - const UnwrappedTileID& tileID, - const TransformState& state, - const float pixelRatio) { - const auto tileRatio = 1 / tileID.pixelsToTileUnits(1, state.getIntegerZoom()); - int32_t tileSizeAtNearestZoom = static_cast(util::tileSize_D * - state.zoomScale(state.getIntegerZoom() - tileID.canonical.z)); - int32_t pixelX = static_cast(tileSizeAtNearestZoom * - (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z))); - int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; - - return {uniforms::matrix::Value(matrix), - uniforms::world::Value(framebufferSize), - uniforms::texsize::Value(atlasSize), - uniforms::scale::Value({{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}}), - uniforms::fade::Value(crossfade.t), - uniforms::pixel_coord_upper::Value( - std::array{{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}}), - uniforms::pixel_coord_lower::Value( - std::array{{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}})}; -} - -} // namespace mbgl diff --git a/src/mbgl/programs/fill_program.hpp b/src/mbgl/programs/fill_program.hpp deleted file mode 100644 index aee0e15c1fc2..000000000000 --- a/src/mbgl/programs/fill_program.hpp +++ /dev/null @@ -1,103 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace mbgl { - -class ImagePosition; -class UnwrappedTileID; -class TransformState; -template -class Faded; - -using FillLayoutAttributes = PositionOnlyLayoutAttributes; - -using FillUniforms = TypeList; - -using FillPatternUniforms = TypeList; - -class FillProgram final : public Program, - style::FillPaintProperties> { -public: - static constexpr std::string_view Name{"FillProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p) { return LayoutVertex{{{p.x, p.y}}}; } -}; - -class FillPatternProgram final : public Program, - style::FillPaintProperties> { -public: - static constexpr std::string_view Name{"FillPatternProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(mat4 matrix, - Size framebufferSize, - Size atlasSize, - const CrossfadeParameters& crossfade, - const UnwrappedTileID&, - const TransformState&, - float pixelRatio); -}; - -class FillOutlineProgram final : public Program, - style::FillPaintProperties> { -public: - static constexpr std::string_view Name{"FillOutlineProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; -}; - -class FillOutlinePatternProgram final : public Program, - style::FillPaintProperties> { -public: - static constexpr std::string_view Name{"FillOutlinePatternProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; -}; - -using FillLayoutVertex = FillProgram::LayoutVertex; -using FillAttributes = FillProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/heatmap_program.cpp b/src/mbgl/programs/heatmap_program.cpp deleted file mode 100644 index 67f84fbd528a..000000000000 --- a/src/mbgl/programs/heatmap_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(HeatmapLayoutVertex) == 4, "expected HeatmapLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/heatmap_program.hpp b/src/mbgl/programs/heatmap_program.hpp deleted file mode 100644 index 6404e9c94372..000000000000 --- a/src/mbgl/programs/heatmap_program.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(float, intensity); -} // namespace uniforms - -class HeatmapProgram final - : public Program, - TypeList, - TypeList<>, - style::HeatmapPaintProperties> { -public: - static constexpr std::string_view Name{"HeatmapProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - /* - * @param {number} x vertex position - * @param {number} y vertex position - * @param {number} ex extrude normal - * @param {number} ey extrude normal - */ - static LayoutVertex vertex(Point p, float ex, float ey) { - return LayoutVertex{ - {{static_cast((p.x * 2) + ((ex + 1) / 2)), static_cast((p.y * 2) + ((ey + 1) / 2))}}}; - } -}; - -using HeatmapLayoutVertex = HeatmapProgram::LayoutVertex; -using HeatmapAttributes = HeatmapProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/heatmap_texture_program.cpp b/src/mbgl/programs/heatmap_texture_program.cpp deleted file mode 100644 index 3b0e24eab8fc..000000000000 --- a/src/mbgl/programs/heatmap_texture_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(HeatmapTextureLayoutVertex) == 4, "expected HeatmapTextureLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/heatmap_texture_program.hpp b/src/mbgl/programs/heatmap_texture_program.hpp deleted file mode 100644 index 9bce2240f7b9..000000000000 --- a/src/mbgl/programs/heatmap_texture_program.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -class HeatmapTextureProgram final : public Program, - TypeList, - TypeList, - style::Properties<>> { -public: - static constexpr std::string_view Name{"HeatmapTextureProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p) { return LayoutVertex{{{p.x, p.y}}}; } -}; - -using HeatmapTextureLayoutVertex = HeatmapTextureProgram::LayoutVertex; -using HeatmapTextureAttributes = HeatmapTextureProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/hillshade_prepare_program.cpp b/src/mbgl/programs/hillshade_prepare_program.cpp deleted file mode 100644 index 0c0446d3f500..000000000000 --- a/src/mbgl/programs/hillshade_prepare_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(HillshadePrepareLayoutVertex) == 8, "expected HillshadeLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/hillshade_prepare_program.hpp b/src/mbgl/programs/hillshade_prepare_program.hpp deleted file mode 100644 index ef9d8aa42709..000000000000 --- a/src/mbgl/programs/hillshade_prepare_program.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 2, dimension); -MBGL_DEFINE_UNIFORM_SCALAR(float, maxzoom); -MBGL_DEFINE_UNIFORM_VECTOR(float, 4, unpack); -} // namespace uniforms - -class HillshadePrepareProgram final - : public Program< - HillshadePrepareProgram, - shaders::BuiltIn::HillshadePrepareProgram, - gfx::PrimitiveType::Triangle, - TypeList, - TypeList, - TypeList, - style::Properties<>> { -public: - static constexpr std::string_view Name{"HillshadePrepareProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p, Point t) { - return LayoutVertex{{{p.x, p.y}}, {{t.x, t.y}}}; - } -}; - -using HillshadePrepareLayoutVertex = HillshadePrepareProgram::LayoutVertex; -using HillshadePrepareAttributes = HillshadePrepareProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/hillshade_program.cpp b/src/mbgl/programs/hillshade_program.cpp deleted file mode 100644 index f054ad4b74ed..000000000000 --- a/src/mbgl/programs/hillshade_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(HillshadeLayoutVertex) == 8, "expected HillshadeLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/hillshade_program.hpp b/src/mbgl/programs/hillshade_program.hpp deleted file mode 100644 index f888196366a2..000000000000 --- a/src/mbgl/programs/hillshade_program.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(Color, shadow); -MBGL_DEFINE_UNIFORM_SCALAR(Color, highlight); -MBGL_DEFINE_UNIFORM_SCALAR(Color, accent); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, light); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, latrange); -} // namespace uniforms - -class HillshadeProgram final : public Program, - TypeList, - TypeList, - style::HillshadePaintProperties> { -public: - static constexpr std::string_view Name{"HillshadeProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p, Point t) { - return LayoutVertex{{{p.x, p.y}}, {{t.x, t.y}}}; - } -}; - -using HillshadeLayoutVertex = HillshadeProgram::LayoutVertex; -using HillshadeAttributes = HillshadeProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/line_gradient_program.hpp b/src/mbgl/programs/line_gradient_program.hpp deleted file mode 100644 index c98cd37e98e7..000000000000 --- a/src/mbgl/programs/line_gradient_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/line_pattern_program.hpp b/src/mbgl/programs/line_pattern_program.hpp deleted file mode 100644 index c98cd37e98e7..000000000000 --- a/src/mbgl/programs/line_pattern_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/line_program.cpp b/src/mbgl/programs/line_program.cpp deleted file mode 100644 index a14c4528a178..000000000000 --- a/src/mbgl/programs/line_program.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -using namespace style; - -static_assert(sizeof(LineLayoutVertex) == 8, "expected LineLayoutVertex size"); - -template -Values makeValues(const style::LinePaintProperties::PossiblyEvaluated& properties, - const RenderTile& tile, - const TransformState& state, - const std::array& pixelsToGLUnits, - const float pixelRatio, - Args&&... args) { - return Values{uniforms::matrix::Value(tile.translatedMatrix( - properties.get(), properties.get(), state)), - uniforms::ratio::Value(1.0f / tile.id.pixelsToTileUnits(1.0f, static_cast(state.getZoom()))), - uniforms::units_to_pixels::Value({{1.0f / pixelsToGLUnits[0], 1.0f / pixelsToGLUnits[1]}}), - uniforms::device_pixel_ratio::Value(pixelRatio), - std::forward(args)...}; -} - -LineProgram::LayoutUniformValues LineProgram::layoutUniformValues( - const style::LinePaintProperties::PossiblyEvaluated& properties, - const RenderTile& tile, - const TransformState& state, - const std::array& pixelsToGLUnits, - const float pixelRatio) { - return makeValues(properties, tile, state, pixelsToGLUnits, pixelRatio); -} - -LineSDFProgram::LayoutUniformValues LineSDFProgram::layoutUniformValues( - const style::LinePaintProperties::PossiblyEvaluated& properties, - float pixelRatio, - const RenderTile& tile, - const TransformState& state, - const std::array& pixelsToGLUnits, - const LinePatternPos& posA, - const LinePatternPos& posB, - const CrossfadeParameters& crossfade, - float atlasWidth) { - const float widthA = posA.width * crossfade.fromScale; - const float widthB = posB.width * crossfade.toScale; - - std::array scaleA{ - {1.0f / tile.id.pixelsToTileUnits(widthA, state.getIntegerZoom()), -posA.height / 2.0f}}; - - std::array scaleB{ - {1.0f / tile.id.pixelsToTileUnits(widthB, state.getIntegerZoom()), -posB.height / 2.0f}}; - - return makeValues( - properties, - tile, - state, - pixelsToGLUnits, - pixelRatio, - uniforms::patternscale_a::Value(scaleA), - uniforms::patternscale_b::Value(scaleB), - uniforms::tex_y_a::Value(posA.y), - uniforms::tex_y_b::Value(posB.y), - uniforms::mix::Value(crossfade.t), - uniforms::sdfgamma::Value(atlasWidth / (std::min(widthA, widthB) * 256.0f * pixelRatio) / 2.0f)); -} - -LinePatternProgram::LayoutUniformValues LinePatternProgram::layoutUniformValues( - const style::LinePaintProperties::PossiblyEvaluated& properties, - const RenderTile& tile, - const TransformState& state, - const std::array& pixelsToGLUnits, - const float pixelRatio, - const Size atlasSize, - const CrossfadeParameters& crossfade) { - const auto tileRatio = 1 / tile.id.pixelsToTileUnits(1, state.getIntegerZoom()); - - return makeValues( - properties, - tile, - state, - pixelsToGLUnits, - pixelRatio, - uniforms::scale::Value({{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}}), - uniforms::texsize::Value(atlasSize), - uniforms::fade::Value(crossfade.t)); -} - -LineGradientProgram::LayoutUniformValues LineGradientProgram::layoutUniformValues( - const style::LinePaintProperties::PossiblyEvaluated& properties, - const RenderTile& tile, - const TransformState& state, - const std::array& pixelsToGLUnits, - const float pixelRatio) { - return makeValues(properties, tile, state, pixelsToGLUnits, pixelRatio); -} - -} // namespace mbgl diff --git a/src/mbgl/programs/line_program.hpp b/src/mbgl/programs/line_program.hpp deleted file mode 100644 index 122ebd6ad4af..000000000000 --- a/src/mbgl/programs/line_program.hpp +++ /dev/null @@ -1,180 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace mbgl { - -class RenderTile; -class TransformState; -class LinePatternPos; -class ImagePosition; - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(float, ratio); -MBGL_DEFINE_UNIFORM_SCALAR(float, tex_y_a); -MBGL_DEFINE_UNIFORM_SCALAR(float, tex_y_b); -MBGL_DEFINE_UNIFORM_SCALAR(float, sdfgamma); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, patternscale_a); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, patternscale_b); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, units_to_pixels); -} // namespace uniforms - -using LineLayoutAttributes = TypeList>; - -class LineProgram final - : public Program< - LineProgram, - shaders::BuiltIn::LineProgram, - gfx::PrimitiveType::Triangle, - LineLayoutAttributes, - TypeList, - TypeList<>, - style::LinePaintProperties> { -public: - static constexpr std::string_view Name{"LineProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - /* - * @param p vertex position - * @param e extrude normal - * @param round whether the vertex uses a round line cap - * @param up whether the line normal points up or down - * @param dir direction of the line cap (-1/0/1) - */ - static LayoutVertex layoutVertex( - Point p, Point e, bool round, bool up, int8_t dir, int32_t linesofar = 0) { - return LayoutVertex{ - {{static_cast((p.x * 2) | (round ? 1 : 0)), static_cast((p.y * 2) | (up ? 1 : 0))}}, - {{// add 128 to store a byte in an unsigned byte - static_cast(util::clamp(::round(extrudeScale * e.x) + 128, 0., 255.)), - static_cast(util::clamp(::round(extrudeScale * e.y) + 128, 0., 255.)), - - // Encode the -1/0/1 direction value into the first two bits of .z - // of a_data. Combine it with the lower 6 bits of `linesofar` - // (shifted by 2 bites to make room for the direction value). The - // upper 8 bits of `linesofar` are placed in the `w` component. - // `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that we - // can store longer distances while sacrificing precision. - - // Encode the -1/0/1 direction value into .zw coordinates of - // a_data, which is normally covered by linesofar, so we need to - // merge them. The z component's first bit, as well as the sign - // bit is reserved for the direction, so we need to shift the - // linesofar. - static_cast(((dir == 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2)), - static_cast(linesofar >> 6)}}}; - } - - /* - * Scale the extrusion vector so that the normal length is this value. - * Contains the "texture" normals (-1..1). This is distinct from the extrude - * normals for line joins, because the x-value remains 0 for the texture - * normal array, while the extrude normal actually moves the vertex to - * create the acute/bevelled line join. - */ - static const int8_t extrudeScale = 63; - - static LayoutUniformValues layoutUniformValues(const style::LinePaintProperties::PossiblyEvaluated&, - const RenderTile&, - const TransformState&, - const std::array& pixelsToGLUnits, - float pixelRatio); -}; - -class LinePatternProgram final : public Program, - TypeList, - style::LinePaintProperties> { -public: - static constexpr std::string_view Name{"LinePatternProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(const style::LinePaintProperties::PossiblyEvaluated&, - const RenderTile&, - const TransformState&, - const std::array& pixelsToGLUnits, - float pixelRatio, - Size atlasSize, - const CrossfadeParameters& crossfade); -}; - -class LineSDFProgram final : public Program, - TypeList, - style::LinePaintProperties> { -public: - static constexpr std::string_view Name{"LineSDFProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(const style::LinePaintProperties::PossiblyEvaluated&, - float pixelRatio, - const RenderTile&, - const TransformState&, - const std::array& pixelsToGLUnits, - const LinePatternPos& posA, - const LinePatternPos& posB, - const CrossfadeParameters& crossfade, - float atlasWidth); -}; - -class LineGradientProgram final - : public Program< - LineGradientProgram, - shaders::BuiltIn::LineGradientProgram, - gfx::PrimitiveType::Triangle, - LineLayoutAttributes, - TypeList, - TypeList, - style::LinePaintProperties> { -public: - static constexpr std::string_view Name{"LineGradientProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutUniformValues layoutUniformValues(const style::LinePaintProperties::PossiblyEvaluated&, - const RenderTile&, - const TransformState&, - const std::array& pixelsToGLUnits, - float pixelRatio); -}; - -using LineLayoutVertex = LineProgram::LayoutVertex; -using LineAttributes = LineProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/line_sdf_program.hpp b/src/mbgl/programs/line_sdf_program.hpp deleted file mode 100644 index c98cd37e98e7..000000000000 --- a/src/mbgl/programs/line_sdf_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index 439c36ca5b2d..59772f3fe4d1 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -105,7 +105,7 @@ class Program : public gfx::Shader { const gfx::ColorMode& colorMode, const gfx::CullFaceMode& cullFaceMode, const gfx::IndexBuffer& indexBuffer, - const Segment& segment, + const SegmentBase& segment, const UniformValues& uniformValues, const AttributeBindings& allAttributeBindings, const TextureBindings& textureBindings, @@ -146,7 +146,7 @@ class Program : public gfx::Shader { const gfx::ColorMode& colorMode, const gfx::CullFaceMode& cullFaceMode, const gfx::IndexBuffer& indexBuffer, - const SegmentVector& segments, + const SegmentVector& segments, const UniformValues& uniformValues, const AttributeBindings& allAttributeBindings, const TextureBindings& textureBindings, diff --git a/src/mbgl/programs/programs.cpp b/src/mbgl/programs/programs.cpp index 6b35265df219..2f7591b8ade1 100644 --- a/src/mbgl/programs/programs.cpp +++ b/src/mbgl/programs/programs.cpp @@ -1,13 +1,4 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include @@ -41,7 +32,7 @@ void registerTypes(gfx::ShaderRegistry& registry, const ProgramParameters& progr void Programs::registerWith(gfx::ShaderRegistry& registry) { /// The following types will be registered - registerTypes(registry, programParameters); + registerTypes(registry, programParameters); } } // namespace mbgl diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/programs/programs.hpp index 9049a233796a..136209e255e8 100644 --- a/src/mbgl/programs/programs.hpp +++ b/src/mbgl/programs/programs.hpp @@ -1,24 +1,12 @@ #pragma once #include -#include #include #include #include namespace mbgl { -class BackgroundLayerPrograms; - -class CircleLayerPrograms; -class RasterLayerPrograms; -class HeatmapLayerPrograms; -class HillshadeLayerPrograms; -class FillLayerPrograms; -class FillExtrusionLayerPrograms; -class LineLayerPrograms; -class SymbolLayerPrograms; - class Programs { public: Programs(const ProgramParameters&); diff --git a/src/mbgl/programs/raster_program.cpp b/src/mbgl/programs/raster_program.cpp deleted file mode 100644 index 6906903e6bd1..000000000000 --- a/src/mbgl/programs/raster_program.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace mbgl { - -static_assert(sizeof(RasterLayoutVertex) == 8, "expected RasterLayoutVertex size"); - -} // namespace mbgl diff --git a/src/mbgl/programs/raster_program.hpp b/src/mbgl/programs/raster_program.hpp deleted file mode 100644 index 491ad3f83545..000000000000 --- a/src/mbgl/programs/raster_program.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -namespace uniforms { -MBGL_DEFINE_UNIFORM_SCALAR(float, fade_t); -MBGL_DEFINE_UNIFORM_SCALAR(float, buffer_scale); -MBGL_DEFINE_UNIFORM_SCALAR(float, brightness_low); -MBGL_DEFINE_UNIFORM_SCALAR(float, brightness_high); -MBGL_DEFINE_UNIFORM_SCALAR(float, saturation_factor); -MBGL_DEFINE_UNIFORM_SCALAR(float, contrast_factor); -MBGL_DEFINE_UNIFORM_SCALAR(float, scale_parent); -MBGL_DEFINE_UNIFORM_VECTOR(float, 3, spin_weights); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, tl_parent); -} // namespace uniforms - -class RasterProgram final : public Program, - TypeList, - TypeList, - style::RasterPaintProperties> { -public: - static constexpr std::string_view Name{"RasterProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using Program::Program; - - static LayoutVertex layoutVertex(Point p, Point t) { - return LayoutVertex{{{p.x, p.y}}, {{t.x, t.y}}}; - } -}; - -using RasterLayoutVertex = RasterProgram::LayoutVertex; -using RasterAttributes = RasterProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/segment.hpp b/src/mbgl/programs/segment.hpp index bed60cea7d1d..8d240c465a1a 100644 --- a/src/mbgl/programs/segment.hpp +++ b/src/mbgl/programs/segment.hpp @@ -47,12 +47,6 @@ class SegmentBase { float sortKey; }; -template -class Segment : public SegmentBase { - using SegmentBase::SegmentBase; -}; - -template -using SegmentVector = std::vector>; +using SegmentVector = std::vector; } // namespace mbgl diff --git a/src/mbgl/programs/symbol_icon_program.hpp b/src/mbgl/programs/symbol_icon_program.hpp deleted file mode 100644 index 57f27518d19c..000000000000 --- a/src/mbgl/programs/symbol_icon_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/symbol_program.cpp b/src/mbgl/programs/symbol_program.cpp deleted file mode 100644 index 52037f8c01c3..000000000000 --- a/src/mbgl/programs/symbol_program.cpp +++ /dev/null @@ -1,175 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mbgl { - -using namespace style; - -static_assert(sizeof(SymbolLayoutVertex) == 24, "expected SymbolLayoutVertex size"); - -std::unique_ptr SymbolSizeBinder::create(const float tileZoom, - const style::PropertyValue& sizeProperty, - const float defaultValue) { - return sizeProperty.match( - [&](const Undefined& value) -> std::unique_ptr { - return std::make_unique(tileZoom, value, defaultValue); - }, - [&](float value) -> std::unique_ptr { - return std::make_unique(tileZoom, value, defaultValue); - }, - [&](const style::PropertyExpression& expression) -> std::unique_ptr { - if (expression.isFeatureConstant()) { - return std::make_unique(tileZoom, expression, defaultValue); - } else if (expression.isZoomConstant()) { - return std::make_unique(tileZoom, expression, defaultValue); - } else { - return std::make_unique(tileZoom, expression, defaultValue); - } - }); -} - -template -Values makeValues(const bool isText, - const bool hasVariablePacement, - const style::SymbolPropertyValues& values, - const Size& texsize, - const std::array& pixelsToGLUnits, - const bool alongLine, - const RenderTile& tile, - const TransformState& state, - const float symbolFadeChange, - Args&&... args) { - std::array extrudeScale; - - if (values.pitchAlignment == AlignmentType::Map) { - extrudeScale.fill(tile.id.pixelsToTileUnits(1.f, static_cast(state.getZoom()))); - } else { - extrudeScale = {{pixelsToGLUnits[0] * state.getCameraToCenterDistance(), - pixelsToGLUnits[1] * state.getCameraToCenterDistance()}}; - } - - const float pixelsToTileUnits = tile.id.pixelsToTileUnits(1.f, static_cast(state.getZoom())); - const bool pitchWithMap = values.pitchAlignment == style::AlignmentType::Map; - const bool rotateWithMap = values.rotationAlignment == style::AlignmentType::Map; - - // Line label rotation happens in `updateLineLabels`/`reprojectLineLabels`` - // Pitched point labels are automatically rotated by the labelPlaneMatrix projection - // Unpitched point labels need to have their rotation applied after projection - const bool rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; - - mat4 labelPlaneMatrix; - if (alongLine || hasVariablePacement) { - // For labels that follow lines the first part of the projection is - // handled on the cpu. Pass an identity matrix because no transformation - // needs to be done in the vertex shader. - matrix::identity(labelPlaneMatrix); - } else { - labelPlaneMatrix = getLabelPlaneMatrix(tile.matrix, pitchWithMap, rotateWithMap, state, pixelsToTileUnits); - } - - mat4 glCoordMatrix = getGlCoordMatrix(tile.matrix, pitchWithMap, rotateWithMap, state, pixelsToTileUnits); - - return Values{uniforms::matrix::Value(tile.translatedMatrix(values.translate, values.translateAnchor, state)), - uniforms::label_plane_matrix::Value(labelPlaneMatrix), - uniforms::coord_matrix::Value( - tile.translateVtxMatrix(glCoordMatrix, values.translate, values.translateAnchor, state, true)), - uniforms::extrude_scale::Value(extrudeScale), - uniforms::texsize::Value(texsize), - uniforms::fade_change::Value(symbolFadeChange), - uniforms::is_text::Value(isText), - uniforms::camera_to_center_distance::Value(state.getCameraToCenterDistance()), - uniforms::pitch::Value(state.getPitch()), - uniforms::pitch_with_map::Value(pitchWithMap), - uniforms::rotate_symbol::Value(rotateInShader), - uniforms::aspect_ratio::Value(state.getSize().aspectRatio()), - std::forward(args)...}; -} - -SymbolIconProgram::LayoutUniformValues SymbolIconProgram::layoutUniformValues( - const bool isText, - const bool hasVariablePacement, - const style::SymbolPropertyValues& values, - const Size& texsize, - const std::array& pixelsToGLUnits, - const bool alongLine, - const RenderTile& tile, - const TransformState& state, - const float symbolFadeChange) { - return makeValues( - isText, hasVariablePacement, values, texsize, pixelsToGLUnits, alongLine, tile, state, symbolFadeChange); -} - -template -typename SymbolSDFProgram::LayoutUniformValues -SymbolSDFProgram::layoutUniformValues(const bool isText, - const bool hasVariablePacement, - const style::SymbolPropertyValues& values, - const Size& texsize, - const std::array& pixelsToGLUnits, - const float pixelRatio, - const bool alongLine, - const RenderTile& tile, - const TransformState& state, - const float symbolFadeChange, - const SymbolSDFPart part) { - const float gammaScale = (values.pitchAlignment == AlignmentType::Map - ? static_cast(std::cos(state.getPitch())) * state.getCameraToCenterDistance() - : 1.0f); - - return makeValues::LayoutUniformValues>( - isText, - hasVariablePacement, - values, - texsize, - pixelsToGLUnits, - alongLine, - tile, - state, - symbolFadeChange, - uniforms::gamma_scale::Value(gammaScale), - uniforms::device_pixel_ratio::Value(pixelRatio), - uniforms::is_halo::Value(part == SymbolSDFPart::Halo)); -} - -SymbolTextAndIconProgram::LayoutUniformValues SymbolTextAndIconProgram::layoutUniformValues( - const bool hasVariablePacement, - const style::SymbolPropertyValues& values, - const Size& texsize, - const Size& texsize_icon, - const std::array& pixelsToGLUnits, - const float pixelRatio, - const bool alongLine, - const RenderTile& tile, - const TransformState& state, - const float symbolFadeChange, - const SymbolSDFPart part) { - return {SymbolSDFProgram::layoutUniformValues(true, - hasVariablePacement, - values, - texsize, - pixelsToGLUnits, - pixelRatio, - alongLine, - tile, - state, - symbolFadeChange, - part) - .concat(gfx::UniformValues(uniforms::texsize::Value(texsize_icon)))}; -} - -template class SymbolSDFProgram; -template class SymbolSDFProgram; - -} // namespace mbgl diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp deleted file mode 100644 index 4aadbbc1bf92..000000000000 --- a/src/mbgl/programs/symbol_program.hpp +++ /dev/null @@ -1,551 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#if MLN_RENDER_BACKEND_OPENGL -#include -#endif - -namespace mbgl { - -const uint16_t MAX_GLYPH_ICON_SIZE = 255; -const uint16_t SIZE_PACK_FACTOR = 128; -const uint16_t MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR; - -namespace style { -class SymbolPropertyValues; -} // namespace style - -class RenderTile; -class TransformState; - -namespace uniforms { -MBGL_DEFINE_UNIFORM_MATRIX(double, 4, coord_matrix); -MBGL_DEFINE_UNIFORM_MATRIX(double, 4, label_plane_matrix); -MBGL_DEFINE_UNIFORM_SCALAR(bool, is_halo); -MBGL_DEFINE_UNIFORM_SCALAR(float, gamma_scale); - -MBGL_DEFINE_UNIFORM_SCALAR(bool, is_text); -MBGL_DEFINE_UNIFORM_SCALAR(bool, is_size_zoom_constant); -MBGL_DEFINE_UNIFORM_SCALAR(bool, is_size_feature_constant); -MBGL_DEFINE_UNIFORM_SCALAR(float, size_t); -MBGL_DEFINE_UNIFORM_SCALAR(float, size); -MBGL_DEFINE_UNIFORM_SCALAR(bool, rotate_symbol); -MBGL_DEFINE_UNIFORM_SCALAR(float, aspect_ratio); -} // namespace uniforms - -using SymbolLayoutAttributes = TypeList, attributes::pixeloffset>; - -using SymbolDynamicLayoutAttributes = TypeList; - -using SymbolOpacityAttributes = TypeList; - -struct ZoomEvaluatedSize { - bool isZoomConstant; - bool isFeatureConstant; - float sizeT; - float size; - float layoutSize; -}; -// Mimic the PaintPropertyBinder technique specifically for the {text,icon}-size -// layout properties in order to provide a 'custom' scheme for encoding the -// necessary attribute data. As with PaintPropertyBinder, SymbolSizeBinder is -// an abstract class whose implementations handle the particular attribute & -// uniform logic needed by each possible type of the {Text,Icon}Size properties. -class SymbolSizeBinder { -public: - virtual ~SymbolSizeBinder() = default; - - using UniformList = - TypeList; - using UniformValues = gfx::UniformValues; - - static std::unique_ptr create(float tileZoom, - const style::PropertyValue& sizeProperty, - float defaultValue); - - virtual Range getVertexSizeData(const GeometryTileFeature& feature) = 0; - virtual ZoomEvaluatedSize evaluateForZoom(float currentZoom) const = 0; - - UniformValues uniformValues(float currentZoom) const { - const ZoomEvaluatedSize u = evaluateForZoom(currentZoom); - return UniformValues{uniforms::is_size_zoom_constant::Value(u.isZoomConstant), - uniforms::is_size_feature_constant::Value(u.isFeatureConstant), - uniforms::size_t::Value(u.sizeT), - uniforms::size::Value(u.size)}; - } -}; - -class ConstantSymbolSizeBinder final : public SymbolSizeBinder { -public: - ConstantSymbolSizeBinder(const float /*tileZoom*/, const float& size, const float /*defaultValue*/) noexcept - : layoutSize(size) {} - - ConstantSymbolSizeBinder(const float /*tileZoom*/, const style::Undefined&, const float defaultValue) noexcept - : layoutSize(defaultValue) {} - - ConstantSymbolSizeBinder(const float tileZoom, - const style::PropertyExpression& expression_, - const float /*defaultValue*/ - ) - : layoutSize(expression_.evaluate(tileZoom + 1)), - expression(expression_) { - const Range zoomLevels = expression_.getCoveringStops(tileZoom, tileZoom + 1); - coveringRanges = std::make_tuple( - zoomLevels, Range{expression_.evaluate(zoomLevels.min), expression_.evaluate(zoomLevels.max)}); - } - - Range getVertexSizeData(const GeometryTileFeature&) noexcept override { return {0.0f, 0.0f}; }; - - ZoomEvaluatedSize evaluateForZoom(float currentZoom) const override { - float size = layoutSize; - bool isZoomConstant = !(coveringRanges || expression); - if (coveringRanges) { - // Even though we could get the exact value of the camera function - // at z = currentZoom, we intentionally do not: instead, we - // interpolate between the camera function values at a pair of zoom - // stops covering [tileZoom, tileZoom + 1] in order to be consistent - // with this restriction on composite functions. - const Range& zoomLevels = std::get<0>(*coveringRanges); - const Range& sizeLevels = std::get<1>(*coveringRanges); - float t = util::clamp(expression->interpolationFactor(zoomLevels, currentZoom), 0.0f, 1.0f); - size = sizeLevels.min + t * (sizeLevels.max - sizeLevels.min); - } else if (expression) { - size = expression->evaluate(currentZoom); - } - - const float unused = 0.0f; - return {.isZoomConstant = isZoomConstant, - .isFeatureConstant = true, - .sizeT = unused, - .size = size, - .layoutSize = layoutSize}; - } - - float layoutSize; - std::optional, Range>> coveringRanges; - std::optional> expression; -}; - -class SourceFunctionSymbolSizeBinder final : public SymbolSizeBinder { -public: - SourceFunctionSymbolSizeBinder(const float /*tileZoom*/, - style::PropertyExpression expression_, - const float defaultValue_) noexcept - : expression(std::move(expression_)), - defaultValue(defaultValue_) {} - - Range getVertexSizeData(const GeometryTileFeature& feature) override { - const float size = expression.evaluate(feature, defaultValue); - return {size, size}; - }; - - ZoomEvaluatedSize evaluateForZoom(float) const noexcept override { - const float unused = 0.0f; - return { - .isZoomConstant = true, .isFeatureConstant = false, .sizeT = unused, .size = unused, .layoutSize = unused}; - } - - style::PropertyExpression expression; - const float defaultValue; -}; - -class CompositeFunctionSymbolSizeBinder final : public SymbolSizeBinder { -public: - CompositeFunctionSymbolSizeBinder(const float tileZoom, - style::PropertyExpression expression_, - const float defaultValue_) noexcept - : expression(std::move(expression_)), - defaultValue(defaultValue_), - layoutZoom(tileZoom + 1), - coveringZoomStops(expression.getCoveringStops(tileZoom, tileZoom + 1)) {} - - Range getVertexSizeData(const GeometryTileFeature& feature) override { - return {expression.evaluate(coveringZoomStops.min, feature, defaultValue), - expression.evaluate(coveringZoomStops.max, feature, defaultValue)}; - }; - - ZoomEvaluatedSize evaluateForZoom(float currentZoom) const override { - float sizeInterpolationT = util::clamp( - expression.interpolationFactor(coveringZoomStops, currentZoom), 0.0f, 1.0f); - - const float unused = 0.0f; - return {.isZoomConstant = false, - .isFeatureConstant = false, - .sizeT = sizeInterpolationT, - .size = unused, - .layoutSize = unused}; - } - - style::PropertyExpression expression; - const float defaultValue; - float layoutZoom; - Range coveringZoomStops; -}; - -class SymbolProgramBase : public gfx::Shader { -public: - static gfx::Vertex layoutVertex(Point labelAnchor, - Point o, - float glyphOffsetY, - uint16_t tx, - uint16_t ty, - const Range& sizeData, - bool isSDF, - Point pixelOffset, - Point minFontScale) { - const uint16_t aSizeMin = (std::min(MAX_PACKED_SIZE, static_cast(sizeData.min * SIZE_PACK_FACTOR)) - << 1) + - uint16_t(isSDF); - const uint16_t aSizeMax = std::min(MAX_PACKED_SIZE, static_cast(sizeData.max * SIZE_PACK_FACTOR)); - return { - // combining pos and offset to reduce number of vertex attributes - // passed to shader (8 max for some devices) - {{static_cast(labelAnchor.x), - static_cast(labelAnchor.y), - static_cast(std::round(o.x * 32)), // use 1/32 pixels for placement - static_cast(std::round((o.y + glyphOffsetY) * 32))}}, - {{tx, ty, aSizeMin, aSizeMax}}, - {{static_cast(pixelOffset.x * 16), - static_cast(pixelOffset.y * 16), - static_cast(minFontScale.x * 256), - static_cast(minFontScale.y * 256)}}, - }; - } - - static gfx::Vertex dynamicLayoutVertex(Point anchorPoint, float labelAngle) { - return {{{anchorPoint.x, anchorPoint.y, labelAngle}}}; - } - - static gfx::Vertex opacityVertex(bool placed, float opacity) { - return {{{static_cast((static_cast(opacity * 127) << 1) | static_cast(placed))}}}; - } -}; - -template -class SymbolProgram : public SymbolProgramBase { -public: - using LayoutVertex = gfx::Vertex; - - using LayoutAndSizeAttributeList = - TypeListConcat; - - using PaintProperties = PaintProps; - using Binders = PaintPropertyBinders; - - using PaintAttributeList = typename Binders::AttributeList; - using AttributeList = TypeListConcat; - using AttributeBindings = gfx::AttributeBindings; - - using LayoutUniformValues = gfx::UniformValues; - using SizeUniformList = typename SymbolSizeBinder::UniformList; - using PaintUniformList = typename Binders::UniformList; - using UniformList = TypeListConcat; - using UniformValues = gfx::UniformValues; - - using TextureList = Textures; - using TextureBindings = gfx::TextureBindings; - - std::unique_ptr> program; - - // NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility) - SymbolProgram([[maybe_unused]] const ProgramParameters& programParameters) { - switch (gfx::Backend::GetType()) { -#if MLN_RENDER_BACKEND_OPENGL - case gfx::Backend::Type::OpenGL: { - program = std::make_unique>(programParameters.withDefaultSource( - {gfx::Backend::Type::OpenGL, - shaders::ShaderSource::vertex, - shaders::ShaderSource::fragment})); - break; - } -#endif - default: { - throw std::runtime_error("Unsupported rendering backend!"); - } - } - } - - static UniformValues computeAllUniformValues(const LayoutUniformValues& layoutUniformValues, - const SymbolSizeBinder& symbolSizeBinder, - const Binders& paintPropertyBinders, - const typename PaintProperties::PossiblyEvaluated& currentProperties, - float currentZoom) { - return layoutUniformValues.concat(symbolSizeBinder.uniformValues(currentZoom)) - .concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties)); - } - - static AttributeBindings computeAllAttributeBindings( - const gfx::VertexBuffer& layoutVertexBuffer, - const gfx::VertexBuffer>& dynamicLayoutVertexBuffer, - const gfx::VertexBuffer>& opacityVertexBuffer, - const Binders& paintPropertyBinders, - const typename PaintProperties::PossiblyEvaluated& currentProperties) { - assert(layoutVertexBuffer.elements == dynamicLayoutVertexBuffer.elements && - layoutVertexBuffer.elements == opacityVertexBuffer.elements); - return gfx::AttributeBindings(layoutVertexBuffer) - .concat(gfx::AttributeBindings(dynamicLayoutVertexBuffer)) - .concat(gfx::AttributeBindings(opacityVertexBuffer)) - .concat(paintPropertyBinders.attributeBindings(currentProperties)); - } - - static uint32_t activeBindingCount(const AttributeBindings& allAttributeBindings) { - return allAttributeBindings.activeCount(); - } - - template - void draw(gfx::Context& context, - gfx::RenderPass& renderPass, - const DrawMode& drawMode, - const gfx::DepthMode& depthMode, - const gfx::StencilMode& stencilMode, - const gfx::ColorMode& colorMode, - const gfx::CullFaceMode& cullFaceMode, - const gfx::IndexBuffer& indexBuffer, - const Segment& segment, - const UniformValues& uniformValues, - const AttributeBindings& allAttributeBindings, - const TextureBindings& textureBindings, - const std::string& layerID) { - static_assert(Primitive == gfx::PrimitiveTypeOf::value, "incompatible draw mode"); - - if (!program) { - return; - } - - auto drawScopeIt = segment.drawScopes.find(layerID); - if (drawScopeIt == segment.drawScopes.end()) { - drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; - } - - program->draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - uniformValues, - drawScopeIt->second, - allAttributeBindings.offset(segment.vertexOffset), - textureBindings, - indexBuffer, - segment.indexOffset, - segment.indexLength); - } - - template - void draw(gfx::Context& context, - gfx::RenderPass& renderPass, - const DrawMode& drawMode, - const gfx::DepthMode& depthMode, - const gfx::StencilMode& stencilMode, - const gfx::ColorMode& colorMode, - const gfx::CullFaceMode& cullFaceMode, - const gfx::IndexBuffer& indexBuffer, - const SegmentVector& segments, - const UniformValues& uniformValues, - const AttributeBindings& allAttributeBindings, - const TextureBindings& textureBindings, - const std::string& layerID) { - static_assert(Primitive == gfx::PrimitiveTypeOf::value, "incompatible draw mode"); - - if (!program) { - return; - } - - for (const auto& segment : segments) { - draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - indexBuffer, - segment, - uniformValues, - allAttributeBindings, - textureBindings, - layerID); - } - } -}; - -class SymbolIconProgram final : public SymbolProgram, - TypeList, - style::IconPaintProperties> { -public: - static constexpr std::string_view Name{"SymbolIconProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using SymbolProgram::SymbolProgram; - - static LayoutUniformValues layoutUniformValues(bool isText, - bool hasVariablePacement, - const style::SymbolPropertyValues&, - const Size& texsize, - const std::array& pixelsToGLUnits, - bool alongLine, - const RenderTile&, - const TransformState&, - float symbolFadeChange); -}; - -enum class SymbolSDFPart { - Fill = 1, - Halo = 0 -}; - -using SymbolSDFProgramUniforms = TypeList; - -template -// NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility) -class SymbolSDFProgram : public SymbolProgram, - PaintProperties> { -public: - using BaseProgram = SymbolProgram, - PaintProperties>; - - using LayoutUniformValues = typename BaseProgram::LayoutUniformValues; - - using BaseProgram::BaseProgram; - - static LayoutUniformValues layoutUniformValues(bool isText, - bool hasVariablePacement, - const style::SymbolPropertyValues&, - const Size& texsize, - const std::array& pixelsToGLUnits, - float pixelRatio, - bool alongLine, - const RenderTile&, - const TransformState&, - float SymbolFadeChange, - SymbolSDFPart); -}; - -using SymbolTextAndIconProgramUniforms = TypeList; - -class SymbolTextAndIconProgram final - : public SymbolProgram, - TypeList, - style::TextPaintProperties> { -public: - static constexpr std::string_view Name{"SymbolTextAndIconProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using BaseProgram = SymbolProgram, - TypeList, - style::TextPaintProperties>; - - using LayoutUniformValues = typename BaseProgram::LayoutUniformValues; - - using BaseProgram::BaseProgram; - - static LayoutUniformValues layoutUniformValues(bool hasVariablePacement, - const style::SymbolPropertyValues&, - const Size& texsize, - const Size& texsize_icon, - const std::array& pixelsToGLUnits, - float pixelRatio, - bool alongLine, - const RenderTile&, - const TransformState&, - float SymbolFadeChange, - SymbolSDFPart); -}; - -class SymbolSDFIconProgram final : public SymbolSDFProgram { -public: - static constexpr std::string_view Name{"SymbolSDFIconProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using SymbolSDFProgram::SymbolSDFProgram; -}; - -class SymbolSDFTextProgram final : public SymbolSDFProgram { -public: - static constexpr std::string_view Name{"SymbolSDFTextProgram"}; - const std::string_view typeName() const noexcept override { return Name; } - - using SymbolSDFProgram::SymbolSDFProgram; -}; - -using SymbolLayoutVertex = gfx::Vertex; -using SymbolIconAttributes = SymbolIconProgram::AttributeList; -using SymbolTextAttributes = SymbolSDFTextProgram::AttributeList; - -} // namespace mbgl diff --git a/src/mbgl/programs/symbol_sdf_icon_program.hpp b/src/mbgl/programs/symbol_sdf_icon_program.hpp deleted file mode 100644 index 57f27518d19c..000000000000 --- a/src/mbgl/programs/symbol_sdf_icon_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/symbol_sdf_text_program.hpp b/src/mbgl/programs/symbol_sdf_text_program.hpp deleted file mode 100644 index 57f27518d19c..000000000000 --- a/src/mbgl/programs/symbol_sdf_text_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/programs/symbol_text_and_icon_program.hpp b/src/mbgl/programs/symbol_text_and_icon_program.hpp deleted file mode 100644 index 57f27518d19c..000000000000 --- a/src/mbgl/programs/symbol_text_and_icon_program.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -// Alias -#include diff --git a/src/mbgl/renderer/buckets/circle_bucket.cpp b/src/mbgl/renderer/buckets/circle_bucket.cpp index fbcf430d74d6..8fbb4e955359 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.cpp +++ b/src/mbgl/renderer/buckets/circle_bucket.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -36,7 +35,7 @@ bool CircleBucket::hasData() const { template static float get(const CirclePaintProperties::PossiblyEvaluated& evaluated, const std::string& id, - const std::map& paintPropertyBinders) { + const std::map& paintPropertyBinders) { auto it = paintPropertyBinders.find(id); if (it == paintPropertyBinders.end() || !it->second.statistics().max()) { return evaluated.get().constantOr(Property::defaultValue()); diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp index 9fc5eb954639..4c351a102eaa 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.hpp +++ b/src/mbgl/renderer/buckets/circle_bucket.hpp @@ -1,18 +1,21 @@ #pragma once #include +#include #include #include #include #include #include -#include #include namespace mbgl { class BucketParameters; +using CircleBinders = PaintPropertyBinders; +using CircleLayoutVertex = gfx::Vertex>; + class CircleBucket final : public Bucket { public: using PossiblyEvaluatedLayoutProperties = style::CircleLayoutProperties::PossiblyEvaluated; @@ -30,6 +33,17 @@ class CircleBucket final : public Bucket { void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; + /* + * @param {number} x vertex position + * @param {number} y vertex position + * @param {number} ex extrude normal + * @param {number} ey extrude normal + */ + static CircleLayoutVertex vertex(Point p, float ex, float ey) { + return CircleLayoutVertex{ + {{static_cast((p.x * 2) + ((ex + 1) / 2)), static_cast((p.y * 2) + ((ey + 1) / 2))}}}; + } + using VertexVector = gfx::VertexVector; const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; @@ -38,9 +52,9 @@ class CircleBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector segments; + SegmentVector segments; - std::map paintPropertyBinders; + std::map paintPropertyBinders; const MapMode mode; }; diff --git a/src/mbgl/renderer/buckets/debug_bucket.cpp b/src/mbgl/renderer/buckets/debug_bucket.cpp index 6d96abf58dcc..f2b8f37976c8 100644 --- a/src/mbgl/renderer/buckets/debug_bucket.cpp +++ b/src/mbgl/renderer/buckets/debug_bucket.cpp @@ -33,7 +33,7 @@ DebugBucket::DebugBucket(const OverscaledTileID& id, Point p{int16_t(::round(left + glyph.data[j] * scale)), int16_t(::round(baseline - glyph.data[j + 1] * scale))}; - vertices.emplace_back(FillProgram::layoutVertex(p)); + vertices.emplace_back(FillBucket::layoutVertex(p)); if (prev) { indices.emplace_back(static_cast(vertices.elements() - 2), diff --git a/src/mbgl/renderer/buckets/debug_bucket.hpp b/src/mbgl/renderer/buckets/debug_bucket.hpp index c70148b7add6..c9a4e030505c 100644 --- a/src/mbgl/renderer/buckets/debug_bucket.hpp +++ b/src/mbgl/renderer/buckets/debug_bucket.hpp @@ -6,13 +6,16 @@ #include #include #include -#include -#include +#include +#include +#include namespace mbgl { class OverscaledTileID; +using DebugLayoutVertex = gfx::Vertex>; + class DebugBucket : private util::noncopyable { public: DebugBucket(const OverscaledTileID& id, @@ -33,8 +36,8 @@ class DebugBucket : private util::noncopyable { gfx::VertexVector vertices; gfx::IndexVector indices; - SegmentVector segments; - SegmentVector tileBorderSegments; + SegmentVector segments; + SegmentVector tileBorderSegments; std::optional> vertexBuffer; std::optional indexBuffer; std::optional texture; diff --git a/src/mbgl/renderer/buckets/fill_bucket.cpp b/src/mbgl/renderer/buckets/fill_bucket.cpp index a3352a9f7393..f9ec9d64d55d 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.cpp +++ b/src/mbgl/renderer/buckets/fill_bucket.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp index 92d332ffb644..f2ea405a5677 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_bucket.hpp @@ -1,11 +1,11 @@ #pragma once #include +#include #include #include #include #include -#include #include /** @@ -16,7 +16,7 @@ #define MLN_TRIANGULATE_FILL_OUTLINES (MLN_RENDER_BACKEND_METAL) #if MLN_TRIANGULATE_FILL_OUTLINES -#include +#include #endif namespace mbgl { @@ -24,6 +24,9 @@ namespace mbgl { class BucketParameters; class RenderFillLayer; +using FillBinders = PaintPropertyBinders; +using FillLayoutVertex = gfx::Vertex>; + class FillBucket final : public Bucket { public: ~FillBucket() override; @@ -49,6 +52,8 @@ class FillBucket final : public Bucket { void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; + static FillLayoutVertex layoutVertex(Point p) { return FillLayoutVertex{{{p.x, p.y}}}; } + #if MLN_TRIANGULATE_FILL_OUTLINES using LineVertexVector = gfx::VertexVector; const std::shared_ptr sharedLineVertices = std::make_shared(); @@ -58,14 +63,14 @@ class FillBucket final : public Bucket { const std::shared_ptr sharedLineIndexes = std::make_shared(); LineIndexVector& lineIndexes = *sharedLineIndexes; - SegmentVector lineSegments; + SegmentVector lineSegments; #endif // MLN_TRIANGULATE_FILL_OUTLINES using BasicLineIndexVector = gfx::IndexVector; const std::shared_ptr sharedBasicLineIndexes = std::make_shared(); BasicLineIndexVector& basicLines = *sharedBasicLineIndexes; - SegmentVector basicLineSegments; + SegmentVector basicLineSegments; using VertexVector = gfx::VertexVector; const std::shared_ptr sharedVertices = std::make_shared(); @@ -75,9 +80,9 @@ class FillBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector triangleSegments; + SegmentVector triangleSegments; - std::map paintPropertyBinders; + std::map paintPropertyBinders; }; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp index 58587c8d6852..535abc8f15f1 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp @@ -1,8 +1,8 @@ #include -#include #include #include #include +#include #include #include @@ -102,7 +102,7 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature, const auto& p1 = ring[i]; vertices.emplace_back( - FillExtrusionProgram::layoutVertex(p1, 0, 0, 1, 1, static_cast(edgeDistance))); + FillExtrusionBucket::layoutVertex(p1, 0, 0, 1, 1, static_cast(edgeDistance))); flatIndices.emplace_back(triangleIndex); triangleIndex++; @@ -118,16 +118,16 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature, edgeDistance = 0; } - vertices.emplace_back(FillExtrusionProgram::layoutVertex( + vertices.emplace_back(FillExtrusionBucket::layoutVertex( p1, perp.x, perp.y, 0, 0, static_cast(edgeDistance))); - vertices.emplace_back(FillExtrusionProgram::layoutVertex( + vertices.emplace_back(FillExtrusionBucket::layoutVertex( p1, perp.x, perp.y, 0, 1, static_cast(edgeDistance))); edgeDistance += dist; - vertices.emplace_back(FillExtrusionProgram::layoutVertex( + vertices.emplace_back(FillExtrusionBucket::layoutVertex( p2, perp.x, perp.y, 0, 0, static_cast(edgeDistance))); - vertices.emplace_back(FillExtrusionProgram::layoutVertex( + vertices.emplace_back(FillExtrusionBucket::layoutVertex( p2, perp.x, perp.y, 0, 1, static_cast(edgeDistance))); // ┌──────┐ @@ -198,4 +198,24 @@ void FillExtrusionBucket::update(const FeatureStates& states, } } +std::array FillExtrusionBucket::lightColor(const EvaluatedLight& light) { + const auto color = light.get(); + return {{color.r, color.g, color.b}}; +} + +std::array FillExtrusionBucket::lightPosition(const EvaluatedLight& light, const TransformState& state) { + auto lightPos = light.get().getCartesian(); + mat3 lightMat; + matrix::identity(lightMat); + if (light.get() == LightAnchorType::Viewport) { + matrix::rotate(lightMat, lightMat, -state.getBearing()); + } + matrix::transformMat3f(lightPos, lightPos, lightMat); + return lightPos; +} + +float FillExtrusionBucket::lightIntensity(const EvaluatedLight& light) { + return light.get(); +} + } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp index a430d1ff5969..0c7ee70ea1b8 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp @@ -1,11 +1,12 @@ #pragma once #include +#include +#include #include #include #include #include -#include #include namespace mbgl { @@ -13,6 +14,9 @@ namespace mbgl { class BucketParameters; class RenderFillExtrusionLayer; +using FillExtrusionBinders = PaintPropertyBinders; +using FillExtrusionLayoutVertex = gfx::Vertex>; + class FillExtrusionBucket final : public Bucket { public: ~FillExtrusionBucket() override; @@ -39,6 +43,25 @@ class FillExtrusionBucket final : public Bucket { void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; + static FillExtrusionLayoutVertex layoutVertex( + Point p, double nx, double ny, double nz, unsigned short t, uint16_t e) { + const auto factor = pow(2, 13); + + return FillExtrusionLayoutVertex{{{p.x, p.y}}, + {{// Multiply normal vector components by 2^13 to pack them into + // integers We pack a bool (`t`) into the x component indicating + // whether it is an upper or lower vertex + static_cast(floor(nx * factor) * 2 + t), + static_cast(ny * factor * 2), + static_cast(nz * factor * 2), + // The edgedistance attribute is used for wrapping fill_extrusion patterns + static_cast(e)}}}; + } + + static std::array lightColor(const EvaluatedLight&); + static std::array lightPosition(const EvaluatedLight&, const TransformState&); + static float lightIntensity(const EvaluatedLight&); + using VertexVector = gfx::VertexVector; const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; @@ -47,9 +70,9 @@ class FillExtrusionBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector triangleSegments; + SegmentVector triangleSegments; - std::unordered_map paintPropertyBinders; + std::unordered_map paintPropertyBinders; }; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.cpp b/src/mbgl/renderer/buckets/heatmap_bucket.cpp index 23b39b3022a0..5b147324731a 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.cpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -66,10 +65,10 @@ void HeatmapBucket::addFeature(const GeometryTileFeature& feature, // │ 1 2 │ // └─────────┘ // - vertices.emplace_back(HeatmapProgram::vertex(point, -1, -1)); // 1 - vertices.emplace_back(HeatmapProgram::vertex(point, 1, -1)); // 2 - vertices.emplace_back(HeatmapProgram::vertex(point, 1, 1)); // 3 - vertices.emplace_back(HeatmapProgram::vertex(point, -1, 1)); // 4 + vertices.emplace_back(HeatmapBucket::vertex(point, -1, -1)); // 1 + vertices.emplace_back(HeatmapBucket::vertex(point, 1, -1)); // 2 + vertices.emplace_back(HeatmapBucket::vertex(point, 1, 1)); // 3 + vertices.emplace_back(HeatmapBucket::vertex(point, -1, 1)); // 4 auto& segment = segments.back(); assert(segment.vertexLength <= std::numeric_limits::max()); diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp index 4f911a479413..a3ad9fe866b6 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp @@ -1,18 +1,22 @@ #pragma once #include +#include #include #include #include #include #include -#include #include namespace mbgl { class BucketParameters; +using HeatmapBinders = PaintPropertyBinders; +using HeatmapLayoutVertex = gfx::Vertex>; +using HeatmapTextureLayoutVertex = gfx::Vertex>; + class HeatmapBucket final : public Bucket { public: HeatmapBucket(const BucketParameters&, const std::vector>&); @@ -30,6 +34,21 @@ class HeatmapBucket final : public Bucket { float getQueryRadius(const RenderLayer&) const override; + /* + * @param {number} x vertex position + * @param {number} y vertex position + * @param {number} ex extrude normal + * @param {number} ey extrude normal + */ + static HeatmapLayoutVertex vertex(Point p, float ex, float ey) { + return HeatmapLayoutVertex{ + {{static_cast((p.x * 2) + ((ex + 1) / 2)), static_cast((p.y * 2) + ((ey + 1) / 2))}}}; + } + + static HeatmapTextureLayoutVertex textureVertex(Point p) { + return HeatmapTextureLayoutVertex{{{p.x, p.y}}}; + } + using VertexVector = gfx::VertexVector; const std::shared_ptr sharedVertices = std::make_shared(); VertexVector& vertices = *sharedVertices; @@ -38,9 +57,9 @@ class HeatmapBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector segments; + SegmentVector segments; - std::map paintPropertyBinders; + std::map paintPropertyBinders; const MapMode mode; }; diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.cpp b/src/mbgl/renderer/buckets/hillshade_bucket.cpp index 482d72264112..8a653c20b1cc 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.cpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include namespace mbgl { @@ -80,13 +78,13 @@ void HillshadeBucket::setMask(TileMask&& mask_) { segments.emplace_back(vertices.elements(), indices.elements()); } - vertices.emplace_back(HillshadeProgram::layoutVertex( + vertices.emplace_back(HillshadeBucket::layoutVertex( {tlVertex.x, tlVertex.y}, {static_cast(tlVertex.x), static_cast(tlVertex.y)})); - vertices.emplace_back(HillshadeProgram::layoutVertex( + vertices.emplace_back(HillshadeBucket::layoutVertex( {brVertex.x, tlVertex.y}, {static_cast(brVertex.x), static_cast(tlVertex.y)})); - vertices.emplace_back(HillshadeProgram::layoutVertex( + vertices.emplace_back(HillshadeBucket::layoutVertex( {tlVertex.x, brVertex.y}, {static_cast(tlVertex.x), static_cast(brVertex.y)})); - vertices.emplace_back(HillshadeProgram::layoutVertex( + vertices.emplace_back(HillshadeBucket::layoutVertex( {brVertex.x, brVertex.y}, {static_cast(brVertex.x), static_cast(brVertex.y)})); auto& segment = segments.back(); diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.hpp b/src/mbgl/renderer/buckets/hillshade_bucket.hpp index 1d46442c5cdd..a6413beccc78 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.hpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.hpp @@ -1,19 +1,23 @@ #pragma once #include +#include #include #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include namespace mbgl { +using HillshadeBinders = PaintPropertyBinders; +using HillshadeLayoutVertex = gfx::Vertex>; + class HillshadeBucket final : public Bucket { public: HillshadeBucket(PremultipliedImage&&, Tileset::DEMEncoding encoding); @@ -42,6 +46,10 @@ class HillshadeBucket final : public Bucket { void setPrepared(bool preparedState) { prepared = preparedState; } + static HillshadeLayoutVertex layoutVertex(Point p, Point t) { + return HillshadeLayoutVertex{{{p.x, p.y}}, {{t.x, t.y}}}; + } + // Raster-DEM Tile Sources use the default buffers from Painter using VertexVector = gfx::VertexVector; std::shared_ptr sharedVertices = std::make_shared(); @@ -51,7 +59,7 @@ class HillshadeBucket final : public Bucket { std::shared_ptr sharedIndices = std::make_shared(); IndexVector& indices = *sharedIndices; - SegmentVector segments; + SegmentVector segments; private: DEMData demdata; diff --git a/src/mbgl/renderer/buckets/line_bucket.cpp b/src/mbgl/renderer/buckets/line_bucket.cpp index 3adb72323961..2ae782ea7812 100644 --- a/src/mbgl/renderer/buckets/line_bucket.cpp +++ b/src/mbgl/renderer/buckets/line_bucket.cpp @@ -54,14 +54,14 @@ void LineBucket::addFeature(const GeometryTileFeature& feature, void LineBucket::addGeometry(const GeometryCoordinates& coordinates, const GeometryTileFeature& feature, const CanonicalTileID& canonical) { - gfx::PolylineGenerator> generator( + gfx::PolylineGenerator generator( vertices, - LineProgram::layoutVertex, + LineBucket::layoutVertex, segments, - [](std::size_t vertexOffset, std::size_t indexOffset) -> Segment { - return Segment(vertexOffset, indexOffset); + [](std::size_t vertexOffset, std::size_t indexOffset) -> SegmentBase { + return SegmentBase(vertexOffset, indexOffset); }, - [](auto& seg) -> Segment& { return seg; }, + [](auto& seg) -> SegmentBase& { return seg; }, triangles); gfx::PolylineGeneratorOptions options; @@ -137,7 +137,7 @@ bool LineBucket::hasData() const { template static float get(const LinePaintProperties::PossiblyEvaluated& evaluated, const std::string& id, - const std::map& paintPropertyBinders) { + const std::map& paintPropertyBinders) { auto it = paintPropertyBinders.find(id); if (it == paintPropertyBinders.end() || !it->second.statistics().max()) { return evaluated.get().constantOr(Property::defaultValue()); diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp index c2630d0f1583..b72dbfa932e4 100644 --- a/src/mbgl/renderer/buckets/line_bucket.hpp +++ b/src/mbgl/renderer/buckets/line_bucket.hpp @@ -1,10 +1,10 @@ #pragma once #include +#include #include #include #include #include -#include #include #include @@ -13,6 +13,9 @@ namespace mbgl { class BucketParameters; class RenderLineLayer; +using LineBinders = PaintPropertyBinders; +using LineLayoutVertex = gfx::Vertex>>; + class LineBucket final : public Bucket { public: using PossiblyEvaluatedLayoutProperties = style::LineLayoutProperties::PossiblyEvaluated; @@ -38,6 +41,46 @@ class LineBucket final : public Bucket { void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override; + /* + * @param p vertex position + * @param e extrude normal + * @param round whether the vertex uses a round line cap + * @param up whether the line normal points up or down + * @param dir direction of the line cap (-1/0/1) + */ + static LineLayoutVertex layoutVertex( + Point p, Point e, bool round, bool up, int8_t dir, int32_t linesofar = 0) { + return LineLayoutVertex{ + {{static_cast((p.x * 2) | (round ? 1 : 0)), static_cast((p.y * 2) | (up ? 1 : 0))}}, + {{// add 128 to store a byte in an unsigned byte + static_cast(util::clamp(::round(extrudeScale * e.x) + 128, 0., 255.)), + static_cast(util::clamp(::round(extrudeScale * e.y) + 128, 0., 255.)), + + // Encode the -1/0/1 direction value into the first two bits of .z + // of a_data. Combine it with the lower 6 bits of `linesofar` + // (shifted by 2 bites to make room for the direction value). The + // upper 8 bits of `linesofar` are placed in the `w` component. + // `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that we + // can store longer distances while sacrificing precision. + + // Encode the -1/0/1 direction value into .zw coordinates of + // a_data, which is normally covered by linesofar, so we need to + // merge them. The z component's first bit, as well as the sign + // bit is reserved for the direction, so we need to shift the + // linesofar. + static_cast(((dir == 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2)), + static_cast(linesofar >> 6)}}}; + } + + /* + * Scale the extrusion vector so that the normal length is this value. + * Contains the "texture" normals (-1..1). This is distinct from the extrude + * normals for line joins, because the x-value remains 0 for the texture + * normal array, while the extrude normal actually moves the vertex to + * create the acute/bevelled line join. + */ + static const int8_t extrudeScale = 63; + PossiblyEvaluatedLayoutProperties layout; using VertexVector = gfx::VertexVector; @@ -48,9 +91,9 @@ class LineBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector segments; + SegmentVector segments; - std::map paintPropertyBinders; + std::map paintPropertyBinders; private: void addGeometry(const GeometryCoordinates&, const GeometryTileFeature&, const CanonicalTileID&); diff --git a/src/mbgl/renderer/buckets/raster_bucket.cpp b/src/mbgl/renderer/buckets/raster_bucket.cpp index ba9bcad9b13d..d139c98cc78e 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.cpp +++ b/src/mbgl/renderer/buckets/raster_bucket.cpp @@ -1,6 +1,5 @@ #include #include -#include #include namespace mbgl { @@ -78,13 +77,13 @@ void RasterBucket::setMask(TileMask&& mask_) { segments.emplace_back(vertices.elements(), indices.elements()); } - vertices.emplace_back(RasterProgram::layoutVertex( + vertices.emplace_back(RasterBucket::layoutVertex( {tlVertex.x, tlVertex.y}, {static_cast(tlVertex.x), static_cast(tlVertex.y)})); - vertices.emplace_back(RasterProgram::layoutVertex( + vertices.emplace_back(RasterBucket::layoutVertex( {brVertex.x, tlVertex.y}, {static_cast(brVertex.x), static_cast(tlVertex.y)})); - vertices.emplace_back(RasterProgram::layoutVertex( + vertices.emplace_back(RasterBucket::layoutVertex( {tlVertex.x, brVertex.y}, {static_cast(tlVertex.x), static_cast(brVertex.y)})); - vertices.emplace_back(RasterProgram::layoutVertex( + vertices.emplace_back(RasterBucket::layoutVertex( {brVertex.x, brVertex.y}, {static_cast(brVertex.x), static_cast(brVertex.y)})); auto& segment = segments.back(); diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index e3e81f92aa54..8e14507e3dd9 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -3,9 +3,11 @@ #include #include #include -#include +#include #include +#include #include +#include #include #include @@ -19,6 +21,9 @@ class Texture2D; using Texture2DPtr = std::shared_ptr; } // namespace gfx +using RasterBinders = PaintPropertyBinders; +using RasterLayoutVertex = gfx::Vertex>; + class RasterBucket final : public Bucket { public: RasterBucket(PremultipliedImage&&); @@ -32,6 +37,10 @@ class RasterBucket final : public Bucket { void setImage(std::shared_ptr); void setMask(TileMask&&); + static RasterLayoutVertex layoutVertex(Point p, Point t) { + return RasterLayoutVertex{{{p.x, p.y}}, {{t.x, t.y}}}; + } + std::shared_ptr image; std::optional texture; gfx::Texture2DPtr texture2d; @@ -47,7 +56,7 @@ class RasterBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& indices = *sharedTriangles; - SegmentVector segments; + SegmentVector segments; }; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index adc616931801..b21036c49927 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -15,6 +15,27 @@ namespace { std::atomic maxBucketInstanceId; } // namespace +std::unique_ptr SymbolSizeBinder::create(const float tileZoom, + const style::PropertyValue& sizeProperty, + const float defaultValue) { + return sizeProperty.match( + [&](const Undefined& value) -> std::unique_ptr { + return std::make_unique(tileZoom, value, defaultValue); + }, + [&](float value) -> std::unique_ptr { + return std::make_unique(tileZoom, value, defaultValue); + }, + [&](const style::PropertyExpression& expression) -> std::unique_ptr { + if (expression.isFeatureConstant()) { + return std::make_unique(tileZoom, expression, defaultValue); + } else if (expression.isZoomConstant()) { + return std::make_unique(tileZoom, expression, defaultValue); + } else { + return std::make_unique(tileZoom, expression, defaultValue); + } + }); +} + SymbolBucket::SymbolBucket(Immutable layout_, const std::map>& paintProperties_, const style::PropertyValue& textSize, diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index eff8c3108856..88a0a73eaadf 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -5,13 +5,12 @@ #include #include #include -#include #include -#include #include +#include +#include #include #include -#include #include #include @@ -20,6 +19,162 @@ namespace mbgl { class CrossTileSymbolLayerIndex; +using SymbolIconBinders = PaintPropertyBinders; +using SymbolTextBinders = PaintPropertyBinders; +using SymbolLayoutVertex = + gfx::Vertex, attributes::pixeloffset>>; +using SymbolDynamicLayoutAttributes = TypeList; +using SymbolOpacityAttributes = TypeList; + +using CollisionBoxLayoutAttributes = TypeList; +using CollisionBoxDynamicAttributes = TypeList; + +const uint16_t MAX_GLYPH_ICON_SIZE = 255; +const uint16_t SIZE_PACK_FACTOR = 128; +const uint16_t MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR; + +struct ZoomEvaluatedSize { + bool isZoomConstant; + bool isFeatureConstant; + float sizeT; + float size; + float layoutSize; +}; +// Mimic the PaintPropertyBinder technique specifically for the {text,icon}-size +// layout properties in order to provide a 'custom' scheme for encoding the +// necessary attribute data. As with PaintPropertyBinder, SymbolSizeBinder is +// an abstract class whose implementations handle the particular attribute & +// uniform logic needed by each possible type of the {Text,Icon}Size properties. +class SymbolSizeBinder { +public: + virtual ~SymbolSizeBinder() = default; + + // using UniformList = TypeList; using UniformValues = gfx::UniformValues; + + static std::unique_ptr create(float tileZoom, + const style::PropertyValue& sizeProperty, + float defaultValue); + + virtual Range getVertexSizeData(const GeometryTileFeature& feature) = 0; + virtual ZoomEvaluatedSize evaluateForZoom(float currentZoom) const = 0; + + /*UniformValues uniformValues(float currentZoom) const { + const ZoomEvaluatedSize u = evaluateForZoom(currentZoom); + return UniformValues{uniforms::is_size_zoom_constant::Value(u.isZoomConstant), + uniforms::is_size_feature_constant::Value(u.isFeatureConstant), + uniforms::size_t::Value(u.sizeT), + uniforms::size::Value(u.size)}; + }*/ +}; + +class ConstantSymbolSizeBinder final : public SymbolSizeBinder { +public: + ConstantSymbolSizeBinder(const float /*tileZoom*/, const float& size, const float /*defaultValue*/) noexcept + : layoutSize(size) {} + + ConstantSymbolSizeBinder(const float /*tileZoom*/, const style::Undefined&, const float defaultValue) noexcept + : layoutSize(defaultValue) {} + + ConstantSymbolSizeBinder(const float tileZoom, + const style::PropertyExpression& expression_, + const float /*defaultValue*/ + ) + : layoutSize(expression_.evaluate(tileZoom + 1)), + expression(expression_) { + const Range zoomLevels = expression_.getCoveringStops(tileZoom, tileZoom + 1); + coveringRanges = std::make_tuple( + zoomLevels, Range{expression_.evaluate(zoomLevels.min), expression_.evaluate(zoomLevels.max)}); + } + + Range getVertexSizeData(const GeometryTileFeature&) noexcept override { return {0.0f, 0.0f}; }; + + ZoomEvaluatedSize evaluateForZoom(float currentZoom) const override { + float size = layoutSize; + bool isZoomConstant = !(coveringRanges || expression); + if (coveringRanges) { + // Even though we could get the exact value of the camera function + // at z = currentZoom, we intentionally do not: instead, we + // interpolate between the camera function values at a pair of zoom + // stops covering [tileZoom, tileZoom + 1] in order to be consistent + // with this restriction on composite functions. + const Range& zoomLevels = std::get<0>(*coveringRanges); + const Range& sizeLevels = std::get<1>(*coveringRanges); + float t = util::clamp(expression->interpolationFactor(zoomLevels, currentZoom), 0.0f, 1.0f); + size = sizeLevels.min + t * (sizeLevels.max - sizeLevels.min); + } else if (expression) { + size = expression->evaluate(currentZoom); + } + + const float unused = 0.0f; + return {.isZoomConstant = isZoomConstant, + .isFeatureConstant = true, + .sizeT = unused, + .size = size, + .layoutSize = layoutSize}; + } + + float layoutSize; + std::optional, Range>> coveringRanges; + std::optional> expression; +}; + +class SourceFunctionSymbolSizeBinder final : public SymbolSizeBinder { +public: + SourceFunctionSymbolSizeBinder(const float /*tileZoom*/, + style::PropertyExpression expression_, + const float defaultValue_) noexcept + : expression(std::move(expression_)), + defaultValue(defaultValue_) {} + + Range getVertexSizeData(const GeometryTileFeature& feature) override { + const float size = expression.evaluate(feature, defaultValue); + return {size, size}; + }; + + ZoomEvaluatedSize evaluateForZoom(float) const noexcept override { + const float unused = 0.0f; + return { + .isZoomConstant = true, .isFeatureConstant = false, .sizeT = unused, .size = unused, .layoutSize = unused}; + } + + style::PropertyExpression expression; + const float defaultValue; +}; + +class CompositeFunctionSymbolSizeBinder final : public SymbolSizeBinder { +public: + CompositeFunctionSymbolSizeBinder(const float tileZoom, + style::PropertyExpression expression_, + const float defaultValue_) noexcept + : expression(std::move(expression_)), + defaultValue(defaultValue_), + layoutZoom(tileZoom + 1), + coveringZoomStops(expression.getCoveringStops(tileZoom, tileZoom + 1)) {} + + Range getVertexSizeData(const GeometryTileFeature& feature) override { + return {expression.evaluate(coveringZoomStops.min, feature, defaultValue), + expression.evaluate(coveringZoomStops.max, feature, defaultValue)}; + }; + + ZoomEvaluatedSize evaluateForZoom(float currentZoom) const override { + float sizeInterpolationT = util::clamp( + expression.interpolationFactor(coveringZoomStops, currentZoom), 0.0f, 1.0f); + + const float unused = 0.0f; + return {.isZoomConstant = false, + .isFeatureConstant = false, + .sizeT = sizeInterpolationT, + .size = unused, + .layoutSize = unused}; + } + + style::PropertyExpression expression; + const float defaultValue; + float layoutZoom; + Range coveringZoomStops; +}; + class PlacedSymbol { public: PlacedSymbol(Point anchorPoint_, @@ -110,6 +265,42 @@ class SymbolBucket final : public Bucket { bool check(std::source_location) override; #endif + static SymbolLayoutVertex layoutVertex(Point labelAnchor, + Point o, + float glyphOffsetY, + uint16_t tx, + uint16_t ty, + const Range& sizeData, + bool isSDF, + Point pixelOffset, + Point minFontScale) { + const uint16_t aSizeMin = (std::min(MAX_PACKED_SIZE, static_cast(sizeData.min * SIZE_PACK_FACTOR)) + << 1) + + uint16_t(isSDF); + const uint16_t aSizeMax = std::min(MAX_PACKED_SIZE, static_cast(sizeData.max * SIZE_PACK_FACTOR)); + return { + // combining pos and offset to reduce number of vertex attributes + // passed to shader (8 max for some devices) + {{static_cast(labelAnchor.x), + static_cast(labelAnchor.y), + static_cast(std::round(o.x * 32)), // use 1/32 pixels for placement + static_cast(std::round((o.y + glyphOffsetY) * 32))}}, + {{tx, ty, aSizeMin, aSizeMax}}, + {{static_cast(pixelOffset.x * 16), + static_cast(pixelOffset.y * 16), + static_cast(minFontScale.x * 256), + static_cast(minFontScale.y * 256)}}, + }; + } + + static gfx::Vertex dynamicLayoutVertex(Point anchorPoint, float labelAngle) { + return {{{anchorPoint.x, anchorPoint.y, labelAngle}}}; + } + + static gfx::Vertex opacityVertex(bool placed, float opacity) { + return {{{static_cast((static_cast(opacity * 127) << 1) | static_cast(placed))}}}; + } + Immutable layout; const std::string bucketLeaderID; float sortedAngle = std::numeric_limits::max(); @@ -131,8 +322,8 @@ class SymbolBucket final : public Bucket { const std::vector sortKeyRanges; struct PaintProperties { - SymbolIconProgram::Binders iconBinders; - SymbolSDFTextProgram::Binders textBinders; + SymbolIconBinders iconBinders; + SymbolTextBinders textBinders; }; std::map paintProperties; @@ -180,7 +371,7 @@ class SymbolBucket final : public Bucket { const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector segments; + SegmentVector segments; std::vector placedSymbols; } text; @@ -202,7 +393,7 @@ class SymbolBucket final : public Bucket { CollisionDynamicVertexVector& dynamicVertices() { return *sharedDynamicVertices; } const CollisionDynamicVertexVector& dynamicVertices() const { return *sharedDynamicVertices; } - SegmentVector segments; + SegmentVector segments; }; struct CollisionBoxBuffer : public CollisionBuffer { @@ -241,6 +432,20 @@ class SymbolBucket final : public Bucket { return *textCollisionCircle; } + static gfx::Vertex collisionLayoutVertex(Point a, + Point anchor, + Point o) { + return {{{static_cast(a.x), static_cast(a.y)}}, + {{static_cast(anchor.x), static_cast(anchor.y)}}, + {{static_cast(::round(o.x)), static_cast(::round(o.y))}}}; + } + + static gfx::Vertex collisionDynamicVertex(bool placed, + bool notUsed, + Point shift) { + return {{{static_cast(placed), static_cast(notUsed)}}, {{shift.x, shift.y}}}; + } + const float tilePixelRatio; uint32_t bucketInstanceId; const bool allowVerticalPlacement; diff --git a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp index 80d94fdf047e..1da8d75dee22 100644 --- a/src/mbgl/renderer/layers/circle_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/circle_layer_tweaker.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -70,7 +70,7 @@ void CircleLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete } const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - auto* binders = static_cast(drawable.getBinders()); + auto* binders = static_cast(drawable.getBinders()); if (!binders) { assert(false); return; diff --git a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp index d474e0c3a222..2b439c089e3c 100644 --- a/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_extrusion_layer_tweaker.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -43,12 +43,12 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP // but the resulting buffer can be shared across all the drawables from the layer. const FillExtrusionPropsUBO propsUBO = { .color = constOrDefault(evaluated), - .light_color = FillExtrusionProgram::lightColor(parameters.evaluatedLight), + .light_color = FillExtrusionBucket::lightColor(parameters.evaluatedLight), .pad1 = 0, - .light_position = FillExtrusionProgram::lightPosition(parameters.evaluatedLight, state), + .light_position = FillExtrusionBucket::lightPosition(parameters.evaluatedLight, state), .base = constOrDefault(evaluated), .height = constOrDefault(evaluated), - .light_intensity = FillExtrusionProgram::lightIntensity(parameters.evaluatedLight), + .light_intensity = FillExtrusionBucket::lightIntensity(parameters.evaluatedLight), .vertical_gradient = evaluated.get() ? 1.0f : 0.0f, .opacity = evaluated.get(), .fade = crossfade.t, @@ -75,7 +75,7 @@ void FillExtrusionLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintP return; } - auto* binders = static_cast(drawable.getBinders()); + auto* binders = static_cast(drawable.getBinders()); const auto* tile = drawable.getRenderTile(); if (!binders || !tile) { assert(false); diff --git a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp index 83979102c049..61c6a0863447 100644 --- a/src/mbgl/renderer/layers/fill_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/fill_layer_tweaker.cpp @@ -70,7 +70,7 @@ void FillLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - auto* binders = static_cast(drawable.getBinders()); + auto* binders = static_cast(drawable.getBinders()); const auto* tile = drawable.getRenderTile(); if (!binders || !tile) { assert(false); diff --git a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp index ed22ad2f6331..8c22cb113d1c 100644 --- a/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/heatmap_layer_tweaker.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -58,7 +57,7 @@ void HeatmapLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamet const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - auto* binders = static_cast(drawable.getBinders()); + auto* binders = static_cast(drawable.getBinders()); const auto* tile = drawable.getRenderTile(); if (!binders || !tile) { assert(false); diff --git a/src/mbgl/renderer/layers/line_layer_tweaker.cpp b/src/mbgl/renderer/layers/line_layer_tweaker.cpp index dd9e0a0fb774..d09310e4f273 100644 --- a/src/mbgl/renderer/layers/line_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/line_layer_tweaker.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -175,7 +175,7 @@ void LineLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParameters const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); - auto* binders = static_cast(drawable.getBinders()); + auto* binders = static_cast(drawable.getBinders()); const auto* tile = drawable.getRenderTile(); if (!binders || !tile) { assert(false); diff --git a/src/mbgl/renderer/layers/render_background_layer.hpp b/src/mbgl/renderer/layers/render_background_layer.hpp index faadd7a39161..f3e7bd2bceb8 100644 --- a/src/mbgl/renderer/layers/render_background_layer.hpp +++ b/src/mbgl/renderer/layers/render_background_layer.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -42,7 +42,7 @@ class RenderBackgroundLayer final : public RenderLayer { // Paint properties style::BackgroundPaintProperties::Unevaluated unevaluated; - SegmentVector segments; + SegmentVector segments; // Drawable shaders gfx::ShaderProgramBasePtr plainShader; diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 7ec29289e3c7..4dfd429b7341 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index eef29e9266f0..1c2709301218 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 9346e1323b31..26028b31e1b2 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_layer.hpp b/src/mbgl/renderer/layers/render_fill_layer.hpp index 1901e7a87239..f68cf6924e7f 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.hpp +++ b/src/mbgl/renderer/layers/render_fill_layer.hpp @@ -10,12 +10,6 @@ namespace mbgl { -class FillBucket; -class FillProgram; -class FillPatternProgram; -class FillOutlineProgram; -class FillOutlinePatternProgram; - class FillLayerTweaker; using FillLayerTweakerPtr = std::shared_ptr; diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.hpp b/src/mbgl/renderer/layers/render_heatmap_layer.hpp index 7c03b50557a7..640ab02bb05c 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.hpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -62,7 +62,7 @@ class RenderHeatmapLayer final : public RenderLayer { std::shared_ptr colorRamp; std::unique_ptr renderTexture; std::optional colorRampTexture; - SegmentVector segments; + SegmentVector segments; gfx::ShaderGroupPtr heatmapShaderGroup; gfx::ShaderProgramBasePtr heatmapTextureShader; diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.hpp b/src/mbgl/renderer/layers/render_hillshade_layer.hpp index 28c59cce2939..3490788bc0a4 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.hpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.hpp @@ -1,8 +1,7 @@ #pragma once #include -#include -#include +#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 86a3f69390d5..454026466b85 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 056b785ffea9..6846f31c4f0c 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_raster_layer.hpp b/src/mbgl/renderer/layers/render_raster_layer.hpp index 6d73aa835cb5..fcffd8461bc9 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.hpp +++ b/src/mbgl/renderer/layers/render_raster_layer.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include #include @@ -9,7 +9,6 @@ namespace mbgl { class ImageSourceRenderData; -class RasterProgram; class RenderRasterLayer final : public RenderLayer { public: @@ -62,7 +61,7 @@ class RenderRasterLayer final : public RenderLayer { using TriangleIndexVectorPtr = std::shared_ptr; TriangleIndexVectorPtr staticDataIndices; - using RasterSegmentVector = SegmentVector; + using RasterSegmentVector = SegmentVector; using RasterSegmentVectorPtr = std::shared_ptr; std::shared_ptr staticDataSegments; }; diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index c7bd608c9062..40ec6d7ea927 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -2,9 +2,7 @@ #include #include -#include #include -#include #include #include #include @@ -73,8 +71,8 @@ style::SymbolPropertyValues textPropertyValues(const style::SymbolPaintPropertie .hasFill = evaluated_.get().constantOr(Color::black()).a > 0}; } -using SegmentWrapper = std::reference_wrapper>; -using SegmentVectorWrapper = std::reference_wrapper>; +using SegmentWrapper = std::reference_wrapper; +using SegmentVectorWrapper = std::reference_wrapper; using SegmentsWrapper = variant; struct RenderableSegment { @@ -258,7 +256,7 @@ void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) { } namespace { -const SegmentVector emptySegmentVector; +const SegmentVector emptySegmentVector; constexpr auto posOffsetAttribName = "a_pos_offset"; void updateTileAttributes(const SymbolBucket::Buffer& buffer, diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp index 592e659c303d..1091f7e08c2e 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.hpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp @@ -56,27 +56,10 @@ enum class SymbolType : uint8_t { } // namespace style -class SymbolIconProgram; -class SymbolSDFIconProgram; -class SymbolSDFTextProgram; -class SymbolTextAndIconProgram; -class CollisionBoxProgram; -class CollisionCircleProgram; - class SymbolLayerTweaker; using SymbolLayerTweakerPtr = std::shared_ptr; class RenderSymbolLayer final : public RenderLayer { -public: - struct Programs { - std::shared_ptr symbolIconProgram; - std::shared_ptr symbolSDFIconProgram; - std::shared_ptr symbolSDFTextProgram; - std::shared_ptr symbolTextAndIconProgram; - std::shared_ptr collisionBoxProgram; - std::shared_ptr collisionCircleProgram; - }; - public: explicit RenderSymbolLayer(Immutable); ~RenderSymbolLayer() override; diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp index 2553b8241530..864881718eda 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -104,8 +103,8 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete const auto& symbolData = static_cast(*drawable.getData()); const auto isText = (symbolData.symbolType == SymbolType::Text); - const auto* textBinders = isText ? static_cast(drawable.getBinders()) : nullptr; - const auto* iconBinders = isText ? nullptr : static_cast(drawable.getBinders()); + const auto* textBinders = isText ? static_cast(drawable.getBinders()) : nullptr; + const auto* iconBinders = isText ? nullptr : static_cast(drawable.getBinders()); const auto bucket = std::static_pointer_cast(drawable.getBucket()); const auto* tile = drawable.getRenderTile(); diff --git a/src/mbgl/renderer/render_static_data.cpp b/src/mbgl/renderer/render_static_data.cpp index 519837736fc7..56f5fdb65cfc 100644 --- a/src/mbgl/renderer/render_static_data.cpp +++ b/src/mbgl/renderer/render_static_data.cpp @@ -33,19 +33,19 @@ gfx::IndexVector RenderStaticData::tileLineStripIndices() { gfx::VertexVector RenderStaticData::rasterVertices() { gfx::VertexVector result; - result.emplace_back(RasterProgram::layoutVertex({0, 0}, {0, 0})); - result.emplace_back(RasterProgram::layoutVertex({util::EXTENT, 0}, {util::EXTENT, 0})); - result.emplace_back(RasterProgram::layoutVertex({0, util::EXTENT}, {0, util::EXTENT})); - result.emplace_back(RasterProgram::layoutVertex({util::EXTENT, util::EXTENT}, {util::EXTENT, util::EXTENT})); + result.emplace_back(RasterBucket::layoutVertex({0, 0}, {0, 0})); + result.emplace_back(RasterBucket::layoutVertex({util::EXTENT, 0}, {util::EXTENT, 0})); + result.emplace_back(RasterBucket::layoutVertex({0, util::EXTENT}, {0, util::EXTENT})); + result.emplace_back(RasterBucket::layoutVertex({util::EXTENT, util::EXTENT}, {util::EXTENT, util::EXTENT})); return result; } gfx::VertexVector RenderStaticData::heatmapTextureVertices() { gfx::VertexVector result; - result.emplace_back(HeatmapTextureProgram::layoutVertex({0, 0})); - result.emplace_back(HeatmapTextureProgram::layoutVertex({1, 0})); - result.emplace_back(HeatmapTextureProgram::layoutVertex({0, 1})); - result.emplace_back(HeatmapTextureProgram::layoutVertex({1, 1})); + result.emplace_back(HeatmapBucket::textureVertex({0, 0})); + result.emplace_back(HeatmapBucket::textureVertex({1, 0})); + result.emplace_back(HeatmapBucket::textureVertex({0, 1})); + result.emplace_back(HeatmapBucket::textureVertex({1, 1})); return result; } @@ -60,26 +60,26 @@ RenderStaticData::RenderStaticData(float pixelRatio, std::unique_ptr RenderStaticData::tileTriangleSegments() { - SegmentVector segments; +SegmentVector RenderStaticData::tileTriangleSegments() { + SegmentVector segments; segments.emplace_back(0, 0, 4, 6); return segments; } -SegmentVector RenderStaticData::tileBorderSegments() { - SegmentVector segments; +SegmentVector RenderStaticData::tileBorderSegments() { + SegmentVector segments; segments.emplace_back(0, 0, 4, 5); return segments; } -SegmentVector RenderStaticData::rasterSegments() { - SegmentVector segments; +SegmentVector RenderStaticData::rasterSegments() { + SegmentVector segments; segments.emplace_back(0, 0, 4, 6); return segments; } -SegmentVector RenderStaticData::heatmapTextureSegments() { - SegmentVector segments; +SegmentVector RenderStaticData::heatmapTextureSegments() { + SegmentVector segments; segments.emplace_back(0, 0, 4, 6); return segments; } diff --git a/src/mbgl/renderer/render_static_data.hpp b/src/mbgl/renderer/render_static_data.hpp index 9e2fb5b6d885..bbbf6c88b732 100644 --- a/src/mbgl/renderer/render_static_data.hpp +++ b/src/mbgl/renderer/render_static_data.hpp @@ -4,10 +4,9 @@ #include #include #include -#include -#include #include -#include +#include +#include #include #include @@ -37,10 +36,10 @@ class RenderStaticData { static gfx::VertexVector rasterVertices(); static gfx::VertexVector heatmapTextureVertices(); - static SegmentVector tileTriangleSegments(); - static SegmentVector tileBorderSegments(); - static SegmentVector rasterSegments(); - static SegmentVector heatmapTextureSegments(); + static SegmentVector tileTriangleSegments(); + static SegmentVector tileBorderSegments(); + static SegmentVector rasterSegments(); + static SegmentVector heatmapTextureSegments(); std::optional> depthRenderbuffer; bool has3D = false; @@ -52,7 +51,7 @@ class RenderStaticData { std::unique_ptr shaders; - const SegmentVector clippingMaskSegments; + const SegmentVector clippingMaskSegments; #ifndef NDEBUG Programs overdrawPrograms; diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index 2797431be4e0..fc842ef878a1 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -137,91 +137,6 @@ void RenderTile::prepare(const SourcePrepareParameters& parameters) { matrix::multiply(nearClippedMatrix, transform.nearClippedProjMatrix, nearClippedMatrix); } -void RenderTile::finishRender(PaintParameters& parameters) const { - if (!needsRendering || parameters.debugOptions == MapDebugOptions::NoDebug) return; - - static const style::Properties<>::PossiblyEvaluated properties{}; - static const DebugProgram::Binders paintAttributeData(properties, 0); - - auto program = parameters.shaders.getLegacyGroup().get(); - if (!program) { - return; - } - - if (parameters.debugOptions & (MapDebugOptions::Timestamps | MapDebugOptions::ParseStatus)) { - assert(debugBucket); - const auto allAttributeBindings = DebugProgram::computeAllAttributeBindings( - *debugBucket->vertexBuffer, paintAttributeData, properties); - - program->draw(parameters.context, - *parameters.renderPass, - gfx::Lines{4.0f * parameters.pixelRatio}, - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - gfx::ColorMode::unblended(), - gfx::CullFaceMode::disabled(), - *debugBucket->indexBuffer, - debugBucket->segments, - DebugProgram::computeAllUniformValues( - DebugProgram::LayoutUniformValues{uniforms::matrix::Value(matrix), - uniforms::color::Value(Color::white()), - uniforms::overlay_scale::Value(1.0f)}, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())), - allAttributeBindings, - DebugProgram::TextureBindings{textures::image::Value{debugBucket->texture->getResource()}}, - "text-outline"); - - program->draw(parameters.context, - *parameters.renderPass, - gfx::Lines{2.0f * parameters.pixelRatio}, - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - gfx::ColorMode::unblended(), - gfx::CullFaceMode::disabled(), - *debugBucket->indexBuffer, - debugBucket->segments, - DebugProgram::computeAllUniformValues( - DebugProgram::LayoutUniformValues{uniforms::matrix::Value(matrix), - uniforms::color::Value(Color::black()), - uniforms::overlay_scale::Value(1.0f)}, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())), - allAttributeBindings, - DebugProgram::TextureBindings{textures::image::Value{debugBucket->texture->getResource()}}, - "text"); - } - - if (parameters.debugOptions & MapDebugOptions::TileBorders) { - assert(debugBucket); - if (debugBucket->tileBorderSegments.empty()) { - debugBucket->tileBorderSegments = RenderStaticData::tileBorderSegments(); - } - program->draw(parameters.context, - *parameters.renderPass, - gfx::LineStrip{4.0f * parameters.pixelRatio}, - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - gfx::ColorMode::unblended(), - gfx::CullFaceMode::disabled(), - *parameters.staticData.tileBorderIndexBuffer, - debugBucket->tileBorderSegments, - DebugProgram::computeAllUniformValues( - DebugProgram::LayoutUniformValues{uniforms::matrix::Value(matrix), - uniforms::color::Value(Color::red()), - uniforms::overlay_scale::Value(1.0f)}, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())), - DebugProgram::computeAllAttributeBindings( - *parameters.staticData.tileVertexBuffer, paintAttributeData, properties), - DebugProgram::TextureBindings{textures::image::Value{debugBucket->texture->getResource()}}, - "border"); - } -} - void RenderTile::setFeatureState(const LayerFeatureStates& states) { tile.setFeatureState(states); } diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index 778eba3840d3..5fd313576aaa 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -66,7 +66,6 @@ class RenderTile final { void upload(gfx::UploadPass&) const; void prepare(const SourcePrepareParameters&); - void finishRender(PaintParameters&) const; static mat4 translateVtxMatrix(const UnwrappedTileID& id, const mat4& tileMatrix, diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index 902719f055af..b8d46892df2b 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -26,43 +26,6 @@ void ImageSourceRenderData::upload(gfx::UploadPass& uploadPass) const { } } -void ImageSourceRenderData::render(PaintParameters& parameters) const { - if (!bucket || !(parameters.debugOptions & MapDebugOptions::TileBorders)) { - return; - } - assert(debugTexture); - static const style::Properties<>::PossiblyEvaluated properties{}; - static const DebugProgram::Binders paintAttributeData(properties, 0); - - auto programInstance = parameters.shaders.getLegacyGroup().get(); - if (!programInstance) { - return; - } - - for (auto matrix : matrices) { - programInstance->draw(parameters.context, - *parameters.renderPass, - gfx::LineStrip{4.0f * parameters.pixelRatio}, - gfx::DepthMode::disabled(), - gfx::StencilMode::disabled(), - gfx::ColorMode::unblended(), - gfx::CullFaceMode::disabled(), - *parameters.staticData.tileBorderIndexBuffer, - RenderStaticData::tileBorderSegments(), - DebugProgram::computeAllUniformValues( - DebugProgram::LayoutUniformValues{uniforms::matrix::Value(matrix), - uniforms::color::Value(Color::red()), - uniforms::overlay_scale::Value(1.0f)}, - paintAttributeData, - properties, - static_cast(parameters.state.getZoom())), - DebugProgram::computeAllAttributeBindings( - *parameters.staticData.tileVertexBuffer, paintAttributeData, properties), - DebugProgram::TextureBindings{textures::image::Value{debugTexture->getResource()}}, - "image"); - } -} - RenderImageSource::RenderImageSource(Immutable impl_) : RenderSource(std::move(impl_)) {} @@ -207,11 +170,11 @@ void RenderImageSource::update(Immutable baseImpl_, } // Set Bucket Vertices, Indices, and segments - bucket->vertices.emplace_back(RasterProgram::layoutVertex({geomCoords[0].x, geomCoords[0].y}, {0, 0})); - bucket->vertices.emplace_back(RasterProgram::layoutVertex({geomCoords[1].x, geomCoords[1].y}, {util::EXTENT, 0})); - bucket->vertices.emplace_back(RasterProgram::layoutVertex({geomCoords[3].x, geomCoords[3].y}, {0, util::EXTENT})); + bucket->vertices.emplace_back(RasterBucket::layoutVertex({geomCoords[0].x, geomCoords[0].y}, {0, 0})); + bucket->vertices.emplace_back(RasterBucket::layoutVertex({geomCoords[1].x, geomCoords[1].y}, {util::EXTENT, 0})); + bucket->vertices.emplace_back(RasterBucket::layoutVertex({geomCoords[3].x, geomCoords[3].y}, {0, util::EXTENT})); bucket->vertices.emplace_back( - RasterProgram::layoutVertex({geomCoords[2].x, geomCoords[2].y}, {util::EXTENT, util::EXTENT})); + RasterBucket::layoutVertex({geomCoords[2].x, geomCoords[2].y}, {util::EXTENT, util::EXTENT})); bucket->indices.emplace_back(0, 1, 2); bucket->indices.emplace_back(1, 2, 3); diff --git a/src/mbgl/renderer/sources/render_image_source.hpp b/src/mbgl/renderer/sources/render_image_source.hpp index f0e2dc6ea1df..f542711038ad 100644 --- a/src/mbgl/renderer/sources/render_image_source.hpp +++ b/src/mbgl/renderer/sources/render_image_source.hpp @@ -21,7 +21,7 @@ class ImageSourceRenderData final : public RenderItem { private: void upload(gfx::UploadPass&) const override; - void render(PaintParameters&) const override; + void render(PaintParameters&) const override {} bool hasRenderPass(RenderPass) const override { return false; } const std::string& getName() const override { return name; } std::string name; diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp index 015f1fc05f6a..37bbae8b0aa4 100644 --- a/src/mbgl/renderer/sources/render_tile_source.cpp +++ b/src/mbgl/renderer/sources/render_tile_source.cpp @@ -43,12 +43,6 @@ void TileSourceRenderItem::upload(gfx::UploadPass& parameters) const { } } -void TileSourceRenderItem::render(PaintParameters& parameters) const { - for (auto& tile : *renderTiles) { - tile.finishRender(parameters); - } -} - #if MLN_ENABLE_POLYLINE_DRAWABLES class PolylineLayerImpl : public Layer::Impl { public: diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp index 0256a53829e7..3b09f275854c 100644 --- a/src/mbgl/renderer/sources/render_tile_source.hpp +++ b/src/mbgl/renderer/sources/render_tile_source.hpp @@ -99,7 +99,7 @@ class TileSourceRenderItem : public RenderItem { private: void upload(gfx::UploadPass&) const override; - void render(PaintParameters&) const override; + void render(PaintParameters&) const override {} bool hasRenderPass(RenderPass) const override { return false; } const std::string& getName() const override { return name; } diff --git a/src/mbgl/style/layers/custom_drawable_layer.cpp b/src/mbgl/style/layers/custom_drawable_layer.cpp index 3df0ee2c4931..04e49879cd98 100644 --- a/src/mbgl/style/layers/custom_drawable_layer.cpp +++ b/src/mbgl/style/layers/custom_drawable_layer.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -582,7 +581,7 @@ util::SimpleIdentity CustomDrawableLayerHost::Interface::addFill(const GeometryC const std::shared_ptr sharedTriangles = std::make_shared(); TriangleIndexVector& triangles = *sharedTriangles; - SegmentVector triangleSegments; + SegmentVector triangleSegments; // generate fill geometry into buffers gfx::generateFillBuffers(geometry, vertices, triangles, triangleSegments); @@ -642,8 +641,8 @@ util::SimpleIdentity CustomDrawableLayerHost::Interface::addSymbol( triangles.emplace_back(0, 1, 2, 1, 2, 3); - SegmentVector triangleSegments; - triangleSegments.emplace_back(Segment{0, 0, 4, 6}); + SegmentVector triangleSegments; + triangleSegments.emplace_back(0, 0, 4, 6); // add to builder auto attrs = context.createVertexAttributeArray(); @@ -697,8 +696,8 @@ util::SimpleIdentity CustomDrawableLayerHost::Interface::addGeometry( // geographic coordinates require tile {0, 0, 0} setTileID({0, 0, 0}); - SegmentVector triangleSegments; - triangleSegments.emplace_back(Segment{0, 0, vertices->elements(), indices->elements()}); + SegmentVector triangleSegments; + triangleSegments.emplace_back(0, 0, vertices->elements(), indices->elements()); // add to builder auto attrs = context.createVertexAttributeArray(); diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 88402e142c94..b8a222c512fa 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -1011,8 +1011,8 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, } if (symbolInstance.hasText()) { size_t textOpacityVerticesSize = 0u; - const auto& opacityVertex = SymbolSDFTextProgram::opacityVertex(opacityState.text.placed, - opacityState.text.opacity); + const auto& opacityVertex = SymbolBucket::opacityVertex(opacityState.text.placed, + opacityState.text.opacity); if (symbolInstance.getPlacedRightTextIndex()) { textOpacityVerticesSize += symbolInstance.getRightJustifiedGlyphQuadsSize() * 4; PlacedSymbol& placed = bucket.text.placedSymbols[*symbolInstance.getPlacedRightTextIndex()]; @@ -1052,8 +1052,8 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, } if (symbolInstance.hasIcon()) { size_t iconOpacityVerticesSize = 0u; - const auto& opacityVertex = SymbolIconProgram::opacityVertex(opacityState.icon.placed, - opacityState.icon.opacity); + const auto& opacityVertex = SymbolBucket::opacityVertex(opacityState.icon.placed, + opacityState.icon.opacity); auto& iconBuffer = symbolInstance.hasSdfIcon() ? bucket.sdfIcon : bucket.icon; if (symbolInstance.getPlacedIconIndex()) { @@ -1073,7 +1073,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, if (feature.alongLine) { return; } - const auto& dynamicVertex = CollisionBoxProgram::dynamicVertex(placed, false, shift); + const auto& dynamicVertex = SymbolBucket::collisionDynamicVertex(placed, false, shift); bucket.iconCollisionBox->dynamicVertices().extend(feature.boxes.size() * 4, dynamicVertex); }; @@ -1109,7 +1109,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, used = false; } } - const auto& dynamicVertex = CollisionBoxProgram::dynamicVertex(placed, !used, shift); + const auto& dynamicVertex = SymbolBucket::collisionDynamicVertex(placed, !used, shift); bucket.textCollisionBox->dynamicVertices().extend(feature.boxes.size() * 4, dynamicVertex); return shift; }; @@ -1121,14 +1121,14 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, auto circles = collisionCircles.find(&feature); if (circles != collisionCircles.end()) { for (const auto& circle : circles->second) { - const auto& dynamicVertex = CollisionBoxProgram::dynamicVertex(placed, !circle.isCircle(), {}); + const auto& dynamicVertex = SymbolBucket::collisionDynamicVertex(placed, !circle.isCircle(), {}); isText ? bucket.textCollisionCircle->dynamicVertices().extend(4, dynamicVertex) : bucket.iconCollisionCircle->dynamicVertices().extend(4, dynamicVertex); } } else { // This feature was not placed, because it was not loaded or // from a fading tile. Apply default values. - static const auto dynamicVertex = CollisionBoxProgram::dynamicVertex(placed, false /*not used*/, {}); + static const auto dynamicVertex = SymbolBucket::collisionDynamicVertex(placed, false /*not used*/, {}); isText ? bucket.textCollisionCircle->dynamicVertices().extend(4 * feature.boxes.size(), dynamicVertex) : bucket.iconCollisionCircle->dynamicVertices().extend(4 * feature.boxes.size(), dynamicVertex); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a53e20d144da..754dc9e2bf2f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,7 +18,6 @@ add_library( ${PROJECT_SOURCE_DIR}/test/math/minmax.test.cpp ${PROJECT_SOURCE_DIR}/test/math/wrap.test.cpp ${PROJECT_SOURCE_DIR}/test/platform/settings.test.cpp - ${PROJECT_SOURCE_DIR}/test/programs/symbol_program.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/image_manager.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/pattern_atlas.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/shader_registry.test.cpp diff --git a/test/gl/bucket.test.cpp b/test/gl/bucket.test.cpp index cf3d8e434e0f..870a4d06c1b4 100644 --- a/test/gl/bucket.test.cpp +++ b/test/gl/bucket.test.cpp @@ -18,8 +18,7 @@ namespace mbgl { -template -bool operator==(const Segment& lhs, const Segment& rhs) { +bool operator==(const SegmentBase& lhs, const SegmentBase& rhs) { return std::tie(lhs.vertexOffset, lhs.indexOffset, lhs.vertexLength, lhs.indexLength) == std::tie(rhs.vertexOffset, rhs.indexOffset, rhs.vertexLength, rhs.indexLength); } @@ -221,7 +220,7 @@ TEST(Buckets, RasterBucketMaskEmpty) { bucket.setMask({}); EXPECT_EQ((std::vector{}), bucket.vertices.vector()); EXPECT_EQ((std::vector{}), bucket.indices.vector()); - SegmentVector expectedSegments; + SegmentVector expectedSegments; expectedSegments.emplace_back(0, 0, 0, 0); EXPECT_EQ(expectedSegments, bucket.segments); } @@ -233,7 +232,7 @@ TEST(Buckets, RasterBucketMaskNoChildren) { // A mask of 0/0/0 doesn't produce buffers since we're instead using the global shared buffers. EXPECT_EQ((std::vector{}), bucket.vertices.vector()); EXPECT_EQ((std::vector{}), bucket.indices.vector()); - EXPECT_EQ((SegmentVector{}), bucket.segments); + EXPECT_EQ((SegmentVector{}), bucket.segments); } TEST(Buckets, RasterBucketMaskTwoChildren) { @@ -242,16 +241,16 @@ TEST(Buckets, RasterBucketMaskTwoChildren) { EXPECT_EQ((std::vector{ // 1/0/1 - RasterProgram::layoutVertex({0, 0}, {0, 0}), - RasterProgram::layoutVertex({4096, 0}, {4096, 0}), - RasterProgram::layoutVertex({0, 4096}, {0, 4096}), - RasterProgram::layoutVertex({4096, 4096}, {4096, 4096}), + RasterBucket::layoutVertex({0, 0}, {0, 0}), + RasterBucket::layoutVertex({4096, 0}, {4096, 0}), + RasterBucket::layoutVertex({0, 4096}, {0, 4096}), + RasterBucket::layoutVertex({4096, 4096}, {4096, 4096}), // 1/1/1 - RasterProgram::layoutVertex({4096, 4096}, {4096, 4096}), - RasterProgram::layoutVertex({8192, 4096}, {8192, 4096}), - RasterProgram::layoutVertex({4096, 8192}, {4096, 8192}), - RasterProgram::layoutVertex({8192, 8192}, {8192, 8192}), + RasterBucket::layoutVertex({4096, 4096}, {4096, 4096}), + RasterBucket::layoutVertex({8192, 4096}, {8192, 4096}), + RasterBucket::layoutVertex({4096, 8192}, {4096, 8192}), + RasterBucket::layoutVertex({8192, 8192}, {8192, 8192}), }), bucket.vertices.vector()); @@ -274,7 +273,7 @@ TEST(Buckets, RasterBucketMaskTwoChildren) { }), bucket.indices.vector()); - SegmentVector expectedSegments; + SegmentVector expectedSegments; expectedSegments.emplace_back(0, 0, 8, 12); EXPECT_EQ(expectedSegments, bucket.segments); } @@ -290,40 +289,40 @@ TEST(Buckets, RasterBucketMaskComplex) { EXPECT_EQ((std::vector{ // 1/0/1 - RasterProgram::layoutVertex({0, 4096}, {0, 4096}), - RasterProgram::layoutVertex({4096, 4096}, {4096, 4096}), - RasterProgram::layoutVertex({0, 8192}, {0, 8192}), - RasterProgram::layoutVertex({4096, 8192}, {4096, 8192}), + RasterBucket::layoutVertex({0, 4096}, {0, 4096}), + RasterBucket::layoutVertex({4096, 4096}, {4096, 4096}), + RasterBucket::layoutVertex({0, 8192}, {0, 8192}), + RasterBucket::layoutVertex({4096, 8192}, {4096, 8192}), // 1/1/0 - RasterProgram::layoutVertex({4096, 0}, {4096, 0}), - RasterProgram::layoutVertex({8192, 0}, {8192, 0}), - RasterProgram::layoutVertex({4096, 4096}, {4096, 4096}), - RasterProgram::layoutVertex({8192, 4096}, {8192, 4096}), + RasterBucket::layoutVertex({4096, 0}, {4096, 0}), + RasterBucket::layoutVertex({8192, 0}, {8192, 0}), + RasterBucket::layoutVertex({4096, 4096}, {4096, 4096}), + RasterBucket::layoutVertex({8192, 4096}, {8192, 4096}), // 2/2/3 - RasterProgram::layoutVertex({4096, 6144}, {4096, 6144}), - RasterProgram::layoutVertex({6144, 6144}, {6144, 6144}), - RasterProgram::layoutVertex({4096, 8192}, {4096, 8192}), - RasterProgram::layoutVertex({6144, 8192}, {6144, 8192}), + RasterBucket::layoutVertex({4096, 6144}, {4096, 6144}), + RasterBucket::layoutVertex({6144, 6144}, {6144, 6144}), + RasterBucket::layoutVertex({4096, 8192}, {4096, 8192}), + RasterBucket::layoutVertex({6144, 8192}, {6144, 8192}), // 2/3/2 - RasterProgram::layoutVertex({6144, 4096}, {6144, 4096}), - RasterProgram::layoutVertex({8192, 4096}, {8192, 4096}), - RasterProgram::layoutVertex({6144, 6144}, {6144, 6144}), - RasterProgram::layoutVertex({8192, 6144}, {8192, 6144}), + RasterBucket::layoutVertex({6144, 4096}, {6144, 4096}), + RasterBucket::layoutVertex({8192, 4096}, {8192, 4096}), + RasterBucket::layoutVertex({6144, 6144}, {6144, 6144}), + RasterBucket::layoutVertex({8192, 6144}, {8192, 6144}), // 3/6/7 - RasterProgram::layoutVertex({6144, 7168}, {6144, 7168}), - RasterProgram::layoutVertex({7168, 7168}, {7168, 7168}), - RasterProgram::layoutVertex({6144, 8192}, {6144, 8192}), - RasterProgram::layoutVertex({7168, 8192}, {7168, 8192}), + RasterBucket::layoutVertex({6144, 7168}, {6144, 7168}), + RasterBucket::layoutVertex({7168, 7168}, {7168, 7168}), + RasterBucket::layoutVertex({6144, 8192}, {6144, 8192}), + RasterBucket::layoutVertex({7168, 8192}, {7168, 8192}), // 3/7/6 - RasterProgram::layoutVertex({7168, 6144}, {7168, 6144}), - RasterProgram::layoutVertex({8192, 6144}, {8192, 6144}), - RasterProgram::layoutVertex({7168, 7168}, {7168, 7168}), - RasterProgram::layoutVertex({8192, 7168}, {8192, 7168}), + RasterBucket::layoutVertex({7168, 6144}, {7168, 6144}), + RasterBucket::layoutVertex({8192, 6144}, {8192, 6144}), + RasterBucket::layoutVertex({7168, 7168}, {7168, 7168}), + RasterBucket::layoutVertex({8192, 7168}, {8192, 7168}), }), bucket.vertices.vector()); @@ -378,7 +377,7 @@ TEST(Buckets, RasterBucketMaskComplex) { }), bucket.indices.vector()); - SegmentVector expectedSegments; + SegmentVector expectedSegments; expectedSegments.emplace_back(0, 0, 24, 36); EXPECT_EQ(expectedSegments, bucket.segments); } diff --git a/test/programs/symbol_program.test.cpp b/test/programs/symbol_program.test.cpp deleted file mode 100644 index ac33fc0b13c8..000000000000 --- a/test/programs/symbol_program.test.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include - -#include -#include - -using namespace mbgl; -using namespace mbgl::style::expression::dsl; - -TEST(SymbolProgram, SymbolSizeBinder) { - auto binder = SymbolSizeBinder::create(5.0f, 12.0f, 0.0f); - auto uniformValues = binder->uniformValues(5.5f); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), 12.0f); - - binder = SymbolSizeBinder::create( - 1.0f, - style::PropertyExpression(interpolate(linear(), zoom(), 0., literal(8.), 10., literal(18.))), - 0.0f); - uniformValues = binder->uniformValues(1.5f); - EXPECT_EQ(uniformValues.get(), false); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), 9.5f); - - binder = SymbolSizeBinder::create( - 0.0f, - style::PropertyExpression(interpolate(linear(), zoom(), 1., literal(8.), 11., literal(18.))), - 0.0f); - uniformValues = binder->uniformValues(0.5f); - EXPECT_EQ(uniformValues.get(), false); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), 8.0f); - - binder = SymbolSizeBinder::create( - 12.0f, - style::PropertyExpression(interpolate(linear(), zoom(), 1., literal(8.), 11., literal(18.))), - 0.0f); - uniformValues = binder->uniformValues(12.5f); - EXPECT_EQ(uniformValues.get(), false); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), 18.0f); - - binder = SymbolSizeBinder::create( - 0.0f, - style::PropertyExpression(interpolate(linear(), number(get("x")), 1., literal(8.), 11., literal(18.))), - 0.0f); - uniformValues = binder->uniformValues(12.5f); - EXPECT_EQ(uniformValues.get(), true); - EXPECT_EQ(uniformValues.get(), false); - - binder = SymbolSizeBinder::create( - 5.0f, - style::PropertyExpression( - interpolate(linear(), - zoom(), - 1., - interpolate(linear(), number(get("x")), 0., literal(8.), 100., literal(18.)), - 11., - interpolate(linear(), number(get("x")), 0., literal(12.), 100., literal(24.9)))), - 0.0f); - uniformValues = binder->uniformValues(5.5f); - EXPECT_EQ(uniformValues.get(), false); - EXPECT_EQ(uniformValues.get(), false); - EXPECT_EQ(uniformValues.get(), 0.45f); -} diff --git a/test/renderer/shader_registry.test.cpp b/test/renderer/shader_registry.test.cpp index caabf8a6cb45..e8a308f6948d 100644 --- a/test/renderer/shader_registry.test.cpp +++ b/test/renderer/shader_registry.test.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include using namespace mbgl; @@ -214,7 +214,8 @@ TEST(ShaderRegistry, DISABLED_GLSLReplacement_NoOp) { // Just replace with a default instance observer.registerShaders = [&](gfx::ShaderRegistry& registry) { - if (!registry.getLegacyGroup().replaceShader(std::make_shared(ProgramParameters(1.0f, false)))) { + if (!registry.getLegacyGroup().replaceShader( + std::make_shared(ProgramParameters(1.0f, false)))) { throw std::runtime_error("Failed to register shader!"); } }; @@ -240,7 +241,7 @@ TEST(ShaderRegistry, DISABLED_GLSLReplacement1) { // Replace with an instance that only renders blue observer.registerShaders = [&](gfx::ShaderRegistry& registry) { - if (!registry.getLegacyGroup().replaceShader(std::make_shared( + if (!registry.getLegacyGroup().replaceShader(std::make_shared( ProgramParameters(1.0f, false) .withShaderSource(ProgramParameters::ProgramSource(gfx::Backend::Type::OpenGL, "", @@ -274,7 +275,7 @@ TEST(ShaderRegistry, DISABLED_GLSLReplacement2) { // Replace with an instance that adds some red and green observer.registerShaders = [&](gfx::ShaderRegistry& registry) { - if (!registry.getLegacyGroup().replaceShader(std::make_shared( + if (!registry.getLegacyGroup().replaceShader(std::make_shared( ProgramParameters(1.0f, false) .withShaderSource(ProgramParameters::ProgramSource(gfx::Backend::Type::OpenGL, "", diff --git a/test/tile/vector_tile.test.cpp b/test/tile/vector_tile.test.cpp index 0c1a8286bd2e..fae330a8abf8 100644 --- a/test/tile/vector_tile.test.cpp +++ b/test/tile/vector_tile.test.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include From 96c8c7fbaee0c9d95e28b0f574912031558b0e24 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 16 May 2025 00:05:10 +0200 Subject: [PATCH 192/339] Tweak Android release (#3474) --- .github/workflows/android-ci.yml | 2 ++ .github/workflows/android-release.yml | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 7a0938ef4c0d..6882ce54020f 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -347,3 +347,5 @@ jobs: - name: Trigger release if: needs.android-build.outputs.make_release == 'true' && needs.android-build.result == 'success' && needs.android-build-cpp-test.result == 'success' && needs.android-build-render-test.result == 'success' run: gh workflow run android-release.yml --ref ${{ github.sha }} + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 986384be8730..fb5ff57ed294 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -75,10 +75,25 @@ jobs: echo "prerelease=true" >> "$GITHUB_ENV" fi - - name: Create tag + - name: Create tag if it does not exist run: | - git tag -s -a android-v${{ env.version }} -m "Publish android-v${{ env.version }}" ${{ github.sha }} - git push origin android-v${{ env.version }} + git config user.name "MapLibre Team" + git config user.email "team@maplibre.org" + tag="android-v${{ env.version }}" + + if git rev-parse "$tag" >/dev/null 2>&1; then + tag_sha=$(git rev-parse "$tag^{commit}") + if [ "$tag_sha" = "${{ github.sha }}" ]; then + echo "✅ Tag $tag exists and matches current commit SHA." + exit 0 + else + echo "::error::❌ Tag $tag exists but points to a different commit. Aborting." + exit 1 + fi + else + git tag -a "$tag" -m "Publish $tag" ${{ github.sha }} + git push origin "$tag" + fi - name: Create release id: create_release From ff38ee609e21c56240eec0ba8fe92845d76fe8ae Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Fri, 16 May 2025 01:09:54 +0300 Subject: [PATCH 193/339] Rename Symbol SDF shader (#3473) --- include/mbgl/shaders/gl/shader_info.hpp | 2 +- include/mbgl/shaders/gl/symbol_sdf.hpp | 4 ++-- include/mbgl/shaders/mtl/symbol.hpp | 4 ++-- include/mbgl/shaders/shader_source.hpp | 2 +- include/mbgl/shaders/vulkan/symbol.hpp | 4 ++-- shaders/manifest.json | 2 +- src/mbgl/gl/renderer_backend.cpp | 2 +- src/mbgl/mtl/renderer_backend.cpp | 2 +- src/mbgl/renderer/layers/render_symbol_layer.cpp | 4 ++-- src/mbgl/shaders/gl/shader_info.cpp | 8 ++++---- src/mbgl/shaders/mtl/symbol.cpp | 6 +++--- src/mbgl/shaders/vulkan/symbol.cpp | 6 +++--- src/mbgl/vulkan/renderer_backend.cpp | 2 +- test/util/hash.test.cpp | 2 +- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/include/mbgl/shaders/gl/shader_info.hpp b/include/mbgl/shaders/gl/shader_info.hpp index 7d9228a2dd3f..1d9c6c96998e 100644 --- a/include/mbgl/shaders/gl/shader_info.hpp +++ b/include/mbgl/shaders/gl/shader_info.hpp @@ -220,7 +220,7 @@ struct ShaderInfo { }; template <> -struct ShaderInfo { +struct ShaderInfo { static const std::vector attributes; static const std::vector uniformBlocks; static const std::vector textures; diff --git a/include/mbgl/shaders/gl/symbol_sdf.hpp b/include/mbgl/shaders/gl/symbol_sdf.hpp index 12d88136a7cb..1329676bdc45 100644 --- a/include/mbgl/shaders/gl/symbol_sdf.hpp +++ b/include/mbgl/shaders/gl/symbol_sdf.hpp @@ -6,8 +6,8 @@ namespace mbgl { namespace shaders { template <> -struct ShaderSource { - static constexpr const char* name = "SymbolSDFIconShader"; +struct ShaderSource { + static constexpr const char* name = "SymbolSDFShader"; static constexpr const char* vertex = R"(layout (location = 0) in vec4 a_pos_offset; layout (location = 1) in vec4 a_data; layout (location = 2) in vec4 a_pixeloffset; diff --git a/include/mbgl/shaders/mtl/symbol.hpp b/include/mbgl/shaders/mtl/symbol.hpp index 997f569b0a89..118eb5b61d91 100644 --- a/include/mbgl/shaders/mtl/symbol.hpp +++ b/include/mbgl/shaders/mtl/symbol.hpp @@ -211,8 +211,8 @@ half4 fragment fragmentMain(FragmentStage in [[stage_in]], }; template <> -struct ShaderSource { - static constexpr auto name = "SymbolSDFIconShader"; +struct ShaderSource { + static constexpr auto name = "SymbolSDFShader"; static constexpr auto vertexMainFunction = "vertexMain"; static constexpr auto fragmentMainFunction = "fragmentMain"; diff --git a/include/mbgl/shaders/shader_source.hpp b/include/mbgl/shaders/shader_source.hpp index 5e387d186883..6f3e3111b80f 100644 --- a/include/mbgl/shaders/shader_source.hpp +++ b/include/mbgl/shaders/shader_source.hpp @@ -38,7 +38,7 @@ enum class BuiltIn { LineSDFShader, RasterShader, SymbolIconShader, - SymbolSDFIconShader, + SymbolSDFShader, SymbolTextAndIconShader, WideVectorShader }; diff --git a/include/mbgl/shaders/vulkan/symbol.hpp b/include/mbgl/shaders/vulkan/symbol.hpp index 75be0c266ca7..31664b14fd72 100644 --- a/include/mbgl/shaders/vulkan/symbol.hpp +++ b/include/mbgl/shaders/vulkan/symbol.hpp @@ -203,8 +203,8 @@ void main() { }; template <> -struct ShaderSource { - static constexpr const char* name = "SymbolSDFIconShader"; +struct ShaderSource { + static constexpr const char* name = "SymbolSDFShader"; static const std::array attributes; static constexpr std::array instanceAttributes{}; diff --git a/shaders/manifest.json b/shaders/manifest.json index 7a6e3d3f6b6e..8ea7f8c5b608 100644 --- a/shaders/manifest.json +++ b/shaders/manifest.json @@ -201,7 +201,7 @@ "uses_ubos": true }, { - "name": "SymbolSDFIconShader", + "name": "SymbolSDFShader", "header": "symbol_sdf", "glsl_vert": "symbol_sdf.vertex.glsl", "glsl_frag": "symbol_sdf.fragment.glsl", diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp index 4f04687c6f6a..a11c799a6c87 100644 --- a/src/mbgl/gl/renderer_backend.cpp +++ b/src/mbgl/gl/renderer_backend.cpp @@ -144,7 +144,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, - shaders::BuiltIn::SymbolSDFIconShader, + shaders::BuiltIn::SymbolSDFShader, shaders::BuiltIn::SymbolTextAndIconShader>(shaders, programParameters); } diff --git a/src/mbgl/mtl/renderer_backend.cpp b/src/mbgl/mtl/renderer_backend.cpp index 3fc14b25a375..0511768f4f37 100644 --- a/src/mbgl/mtl/renderer_backend.cpp +++ b/src/mbgl/mtl/renderer_backend.cpp @@ -129,7 +129,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, - shaders::BuiltIn::SymbolSDFIconShader, + shaders::BuiltIn::SymbolSDFShader, shaders::BuiltIn::SymbolTextAndIconShader, shaders::BuiltIn::WideVectorShader>(shaders, programParameters); } diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 40ec6d7ea927..a6abe183b023 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -40,7 +40,7 @@ using namespace shaders; namespace { constexpr std::string_view SymbolIconShaderName = "SymbolIconShader"; -constexpr std::string_view SymbolSDFIconShaderName = "SymbolSDFIconShader"; +constexpr std::string_view SymbolSDFShaderName = "SymbolSDFShader"; constexpr std::string_view SymbolTextAndIconShaderName = "SymbolTextAndIconShader"; constexpr std::string_view CollisionBoxShaderName = "CollisionBoxShader"; constexpr std::string_view CollisionCircleShaderName = "CollisionCircleShader"; @@ -475,7 +475,7 @@ void RenderSymbolLayer::update(gfx::ShaderRegistry& shaders, symbolIconGroup = shaders.getShaderGroup(std::string(SymbolIconShaderName)); } if (!symbolSDFGroup) { - symbolSDFGroup = shaders.getShaderGroup(std::string(SymbolSDFIconShaderName)); + symbolSDFGroup = shaders.getShaderGroup(std::string(SymbolSDFShaderName)); } if (!symbolTextAndIconGroup) { symbolTextAndIconGroup = shaders.getShaderGroup(std::string(SymbolTextAndIconShaderName)); diff --git a/src/mbgl/shaders/gl/shader_info.cpp b/src/mbgl/shaders/gl/shader_info.cpp index 7e9e28a5cb77..03643e4a0e3b 100644 --- a/src/mbgl/shaders/gl/shader_info.cpp +++ b/src/mbgl/shaders/gl/shader_info.cpp @@ -467,15 +467,15 @@ const std::vector SymbolIconShaderInfo::textures = { }; // Symbol SDF -using SymbolSDFIconShaderInfo = ShaderInfo; +using SymbolSDFShaderInfo = ShaderInfo; -const std::vector SymbolSDFIconShaderInfo::uniformBlocks = { +const std::vector SymbolSDFShaderInfo::uniformBlocks = { UniformBlockInfo{"GlobalPaintParamsUBO", idGlobalPaintParamsUBO}, UniformBlockInfo{"SymbolDrawableUBO", idSymbolDrawableUBO}, UniformBlockInfo{"SymbolTilePropsUBO", idSymbolTilePropsUBO}, UniformBlockInfo{"SymbolEvaluatedPropsUBO", idSymbolEvaluatedPropsUBO}, }; -const std::vector SymbolSDFIconShaderInfo::attributes = { +const std::vector SymbolSDFShaderInfo::attributes = { AttributeInfo{"a_pos_offset", idSymbolPosOffsetVertexAttribute}, AttributeInfo{"a_data", idSymbolDataVertexAttribute}, AttributeInfo{"a_pixeloffset", idSymbolPixelOffsetVertexAttribute}, @@ -487,7 +487,7 @@ const std::vector SymbolSDFIconShaderInfo::attributes = { AttributeInfo{"a_halo_width", idSymbolHaloWidthVertexAttribute}, AttributeInfo{"a_halo_blur", idSymbolHaloBlurVertexAttribute}, }; -const std::vector SymbolSDFIconShaderInfo::textures = { +const std::vector SymbolSDFShaderInfo::textures = { TextureInfo{"u_texture", idSymbolImageTexture}, }; diff --git a/src/mbgl/shaders/mtl/symbol.cpp b/src/mbgl/shaders/mtl/symbol.cpp index 2d1d51e6aca2..67d1a2be6d3b 100644 --- a/src/mbgl/shaders/mtl/symbol.cpp +++ b/src/mbgl/shaders/mtl/symbol.cpp @@ -27,9 +27,9 @@ const std::array SymbolIconShaderSource::textures = { // // Symbol sdf -using SymbolSDFIconShaderSource = ShaderSource; +using SymbolSDFShaderSource = ShaderSource; -const std::array SymbolSDFIconShaderSource::attributes = { +const std::array SymbolSDFShaderSource::attributes = { // always attributes AttributeInfo{symbolUBOCount + 0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, AttributeInfo{symbolUBOCount + 1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, @@ -44,7 +44,7 @@ const std::array SymbolSDFIconShaderSource::attributes = { AttributeInfo{symbolUBOCount + 8, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, AttributeInfo{symbolUBOCount + 9, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, }; -const std::array SymbolSDFIconShaderSource::textures = { +const std::array SymbolSDFShaderSource::textures = { TextureInfo{0, idSymbolImageTexture}, }; diff --git a/src/mbgl/shaders/vulkan/symbol.cpp b/src/mbgl/shaders/vulkan/symbol.cpp index b2a398071099..c938145d0f24 100644 --- a/src/mbgl/shaders/vulkan/symbol.cpp +++ b/src/mbgl/shaders/vulkan/symbol.cpp @@ -28,9 +28,9 @@ const std::array SymbolIconShaderSource::textures = { // // Symbol sdf -using SymbolSDFIconShaderSource = ShaderSource; +using SymbolSDFShaderSource = ShaderSource; -const std::array SymbolSDFIconShaderSource::attributes = { +const std::array SymbolSDFShaderSource::attributes = { // always attributes AttributeInfo{0, gfx::AttributeDataType::Short4, idSymbolPosOffsetVertexAttribute}, AttributeInfo{1, gfx::AttributeDataType::UShort4, idSymbolDataVertexAttribute}, @@ -45,7 +45,7 @@ const std::array SymbolSDFIconShaderSource::attributes = { AttributeInfo{8, gfx::AttributeDataType::Float, idSymbolHaloWidthVertexAttribute}, AttributeInfo{9, gfx::AttributeDataType::Float, idSymbolHaloBlurVertexAttribute}, }; -const std::array SymbolSDFIconShaderSource::textures = { +const std::array SymbolSDFShaderSource::textures = { TextureInfo{0, idSymbolImageTexture}, }; diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index e20826c3d080..9f4de91b30f4 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -692,7 +692,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::LocationIndicatorTexturedShader, shaders::BuiltIn::RasterShader, shaders::BuiltIn::SymbolIconShader, - shaders::BuiltIn::SymbolSDFIconShader, + shaders::BuiltIn::SymbolSDFShader, shaders::BuiltIn::SymbolTextAndIconShader, shaders::BuiltIn::WideVectorShader>(shaders, programParameters); } diff --git a/test/util/hash.test.cpp b/test/util/hash.test.cpp index 7d8c32ad8ebf..dee37bdcaf51 100644 --- a/test/util/hash.test.cpp +++ b/test/util/hash.test.cpp @@ -153,7 +153,7 @@ TEST(OrderIndependentHash, Shaders) { BuiltIn::LocationIndicatorTexturedShader, BuiltIn::RasterShader, BuiltIn::SymbolIconShader, - BuiltIn::SymbolSDFIconShader, + BuiltIn::SymbolSDFShader, BuiltIn::SymbolTextAndIconShader>(); } From 30f32313960a5ddb3e6b31ed5102f934ef99563e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 16 May 2025 01:14:16 +0200 Subject: [PATCH 194/339] Make sure iOS pre-releases contain 'pre' and update changelog (#3475) --- .github/workflows/ios-ci.yml | 4 ++++ platform/ios/CHANGELOG.md | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index bd14a7943df3..140b4f23d241 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -271,6 +271,10 @@ jobs: if [[ -z "$version" ]]; then version="$(head VERSION)"-pre${{ github.sha }} fi + if [[ "$version" != *"pre"* ]]; then + echo "::error::Pre-release version must include 'pre' (Current version: $version)" + exit 1 + fi echo version="$version" >> "$GITHUB_ENV" echo changelog_version_heading="## main" >> "$GITHUB_ENV" diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index ecf1a5f9b411..c009503372c9 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,15 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.14.0 + +> [!IMPORTANT] +> Please verify glyphs are loading correctly for your styles with this release. Despite careful testing, we also rely on our users to help test the new dynamic texture atlas and to [report any issues](https://github.com/maplibre/maplibre-native/issues/new?template=ios-bug-report.yml). + +- Force PMTiles metadata to always have XYZ tile scheme ([#3403](https://github.com/maplibre/maplibre-native/pull/3403)). +- Add support to range requests in AssetFileSource ([#3404](https://github.com/maplibre/maplibre-native/pull/3404)). +- Implement dynamic texture atlas ([#3198](https://github.com/maplibre/maplibre-native/pull/3198)). + ## 6.13.0 - Allow initializing MLNMapView with style JSON ([#3240](https://github.com/maplibre/maplibre-native/pull/3240)). From 2538ac1f31dfe3b40d539811397cf35645fda080 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 16 May 2025 15:02:31 +0200 Subject: [PATCH 195/339] Validate version android-ci and android-release workflow (#3479) --- .github/scripts/validate-version.sh | 23 +++++++++++++++++++++++ .github/workflows/android-ci.yml | 4 ++++ .github/workflows/android-release.yml | 5 +++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100755 .github/scripts/validate-version.sh diff --git a/.github/scripts/validate-version.sh b/.github/scripts/validate-version.sh new file mode 100755 index 000000000000..124ee1820bc1 --- /dev/null +++ b/.github/scripts/validate-version.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +validate_version() { + local version="$1" + if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-pre.*)?$ ]]; then + echo "::error::Invalid version format in VERSION file. Expected: X.Y.Z or X.Y.Z-pre*" + return 1 + fi + return 0 +} + +version=$(cat VERSION 2>/dev/null) +if [ -z "$version" ]; then + echo "::error::VERSION file not found or empty" + exit 1 +fi + +if validate_version "$version"; then + echo "Version validation successful: $version" + if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "version=$version" >> "$GITHUB_ENV" + fi +fi diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 6882ce54020f..9b6716580279 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -66,6 +66,10 @@ jobs: submodules: recursive fetch-depth: 0 + - name: Validate VERSION + run: ../../.github/scripts/validate-version.sh + working-directory: platform/android + - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties - uses: actions/setup-java@v4 diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index fb5ff57ed294..619e8130bdf8 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -42,9 +42,10 @@ jobs: - name: Android nitpick run: make run-android-nitpick - - name: Set version name + - name: Validate and set version + working-directory: platform/android run: | - echo version="$(cat VERSION)" > "$GITHUB_ENV" + ../../.github/scripts/validate-version.sh - name: Build package run: | From b585b0086f41db383bb7cbb4ab75abda2c5b6ca8 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Fri, 16 May 2025 19:29:25 +0300 Subject: [PATCH 196/339] Clean more legacy code (#3478) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- CMakeLists.txt | 28 +++--- bazel/core.bzl | 28 +++--- include/mbgl/gfx/context.hpp | 12 +-- include/mbgl/gfx/drawable_impl.hpp | 2 +- include/mbgl/gfx/polyline_generator.hpp | 2 +- include/mbgl/gfx/texture2d.hpp | 2 + include/mbgl/gl/drawable_gl.hpp | 4 +- include/mbgl/gl/texture2d.hpp | 3 +- include/mbgl/mtl/context.hpp | 5 -- include/mbgl/mtl/drawable.hpp | 2 +- include/mbgl/mtl/upload_pass.hpp | 16 ---- include/mbgl/shaders/gl/shader_group_gl.hpp | 2 +- include/mbgl/shaders/mtl/shader_group.hpp | 2 +- .../mbgl/shaders}/program_parameters.hpp | 0 include/mbgl/shaders/vulkan/shader_group.hpp | 2 +- include/mbgl/vulkan/context.hpp | 5 -- include/mbgl/vulkan/pipeline.hpp | 1 + include/mbgl/vulkan/upload_pass.hpp | 16 ---- src/mbgl/geometry/line_atlas.hpp | 1 - src/mbgl/gfx/drawable_builder_impl.hpp | 2 +- src/mbgl/gfx/program.hpp | 58 ------------- src/mbgl/gfx/texture.hpp | 86 ------------------- src/mbgl/gfx/upload_pass.hpp | 46 ---------- src/mbgl/gl/attribute.hpp | 2 +- src/mbgl/gl/context.cpp | 70 --------------- src/mbgl/gl/context.hpp | 8 -- src/mbgl/gl/drawable_gl.cpp | 2 +- src/mbgl/gl/drawable_gl_impl.hpp | 4 +- src/mbgl/gl/renderer_backend.cpp | 5 ++ src/mbgl/gl/resource_pool.cpp | 46 +++++++--- src/mbgl/gl/resource_pool.hpp | 4 + src/mbgl/gl/texture.cpp | 55 ------------ src/mbgl/gl/texture.hpp | 47 ---------- src/mbgl/gl/texture2d.cpp | 23 ++--- src/mbgl/gl/texture_resource.cpp | 45 ---------- src/mbgl/gl/texture_resource.hpp | 24 ------ src/mbgl/gl/upload_pass.cpp | 63 -------------- src/mbgl/gl/upload_pass.hpp | 16 ---- src/mbgl/mtl/context.cpp | 9 +- src/mbgl/mtl/drawable.cpp | 2 +- src/mbgl/mtl/drawable_impl.hpp | 3 +- src/mbgl/mtl/upload_pass.cpp | 25 ------ src/mbgl/programs/clipping_mask_program.cpp | 3 - src/mbgl/programs/textures.hpp | 17 ---- src/mbgl/renderer/buckets/circle_bucket.hpp | 2 +- src/mbgl/renderer/buckets/debug_bucket.hpp | 4 +- src/mbgl/renderer/buckets/fill_bucket.hpp | 2 +- .../buckets/fill_extrusion_bucket.hpp | 2 +- src/mbgl/renderer/buckets/heatmap_bucket.hpp | 2 +- .../renderer/buckets/hillshade_bucket.hpp | 6 +- src/mbgl/renderer/buckets/line_bucket.hpp | 2 +- src/mbgl/renderer/buckets/raster_bucket.cpp | 1 - src/mbgl/renderer/buckets/raster_bucket.hpp | 4 +- src/mbgl/renderer/buckets/symbol_bucket.hpp | 13 +-- .../layers/render_background_layer.cpp | 1 - .../layers/render_background_layer.hpp | 2 +- .../renderer/layers/render_circle_layer.cpp | 1 - .../layers/render_fill_extrusion_layer.cpp | 1 - .../renderer/layers/render_fill_layer.cpp | 2 +- .../renderer/layers/render_heatmap_layer.cpp | 5 +- .../renderer/layers/render_heatmap_layer.hpp | 2 - .../layers/render_hillshade_layer.cpp | 1 - .../renderer/layers/render_line_layer.cpp | 4 +- .../renderer/layers/render_line_layer.hpp | 5 +- .../render_location_indicator_layer.cpp | 3 +- .../renderer/layers/render_raster_layer.cpp | 1 - .../renderer/layers/render_symbol_layer.cpp | 2 +- src/mbgl/renderer/paint_parameters.cpp | 14 ++- src/mbgl/renderer/paint_parameters.hpp | 4 - src/mbgl/renderer/paint_property_binder.hpp | 2 +- src/mbgl/renderer/pattern_atlas.hpp | 1 - src/mbgl/renderer/render_static_data.cpp | 15 +--- src/mbgl/renderer/render_static_data.hpp | 10 +-- src/mbgl/renderer/render_tile.cpp | 1 - src/mbgl/renderer/render_tile.hpp | 1 - src/mbgl/renderer/renderer_impl.cpp | 7 +- .../renderer/sources/render_image_source.cpp | 1 - .../renderer/sources/render_image_source.hpp | 1 - src/mbgl/renderer/tile_render_data.hpp | 1 - src/mbgl/{programs => shaders}/attributes.hpp | 0 .../gl/legacy}/clipping_mask_program.hpp | 7 +- .../gl/legacy}/program.hpp | 81 ++++++++--------- .../gl/legacy/program_base.hpp} | 31 +++---- .../gl/legacy}/programs.cpp | 3 +- .../gl/legacy}/programs.hpp | 3 +- src/mbgl/shaders/gl/shader_program_gl.cpp | 2 +- src/mbgl/shaders/mtl/shader_program.cpp | 2 +- .../program_parameters.cpp | 2 +- src/mbgl/{programs => shaders}/segment.hpp | 0 src/mbgl/{programs => shaders}/uniforms.hpp | 0 src/mbgl/shaders/vulkan/shader_program.cpp | 2 +- .../layers/background_layer_properties.hpp | 4 +- .../style/layers/circle_layer_properties.hpp | 4 +- .../fill_extrusion_layer_properties.hpp | 4 +- .../style/layers/fill_layer_properties.hpp | 4 +- .../style/layers/heatmap_layer_properties.hpp | 4 +- .../layers/hillshade_layer_properties.hpp | 4 +- .../style/layers/layer_properties.hpp.ejs | 4 +- .../style/layers/line_layer_properties.hpp | 4 +- .../location_indicator_layer_properties.hpp | 4 +- .../style/layers/raster_layer_properties.hpp | 4 +- .../style/layers/symbol_layer_properties.hpp | 4 +- src/mbgl/tile/geometry_tile.hpp | 1 - src/mbgl/vulkan/context.cpp | 9 +- src/mbgl/vulkan/drawable.cpp | 2 +- src/mbgl/vulkan/drawable_impl.hpp | 2 +- src/mbgl/vulkan/upload_pass.cpp | 25 ------ test/renderer/shader_registry.test.cpp | 7 +- 108 files changed, 211 insertions(+), 936 deletions(-) rename {src/mbgl/programs => include/mbgl/shaders}/program_parameters.hpp (100%) delete mode 100644 src/mbgl/gfx/program.hpp delete mode 100644 src/mbgl/gfx/texture.hpp delete mode 100644 src/mbgl/gl/texture.cpp delete mode 100644 src/mbgl/gl/texture.hpp delete mode 100644 src/mbgl/gl/texture_resource.cpp delete mode 100644 src/mbgl/gl/texture_resource.hpp delete mode 100644 src/mbgl/programs/clipping_mask_program.cpp delete mode 100644 src/mbgl/programs/textures.hpp rename src/mbgl/{programs => shaders}/attributes.hpp (100%) rename src/mbgl/{programs => shaders/gl/legacy}/clipping_mask_program.hpp (83%) rename src/mbgl/{programs => shaders/gl/legacy}/program.hpp (82%) rename src/mbgl/{gl/program.hpp => shaders/gl/legacy/program_base.hpp} (88%) rename src/mbgl/{programs => shaders/gl/legacy}/programs.cpp (93%) rename src/mbgl/{programs => shaders/gl/legacy}/programs.hpp (82%) rename src/mbgl/{programs => shaders}/program_parameters.cpp (98%) rename src/mbgl/{programs => shaders}/segment.hpp (100%) rename src/mbgl/{programs => shaders}/uniforms.hpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index aefcb6d16db5..cb25edf48a20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,6 +279,7 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_frontend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_observer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_state.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/program_parameters.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/database_file_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source_manager.hpp @@ -485,7 +486,6 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/offscreen_texture.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/polyline_generator.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/fill_generator.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/render_pass.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/renderbuffer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/renderer_backend.cpp @@ -493,7 +493,6 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/shader_group.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/shader_registry.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/stencil_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/texture.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/upload_pass.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_buffer.hpp @@ -543,17 +542,6 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/map/zoom_history.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/math/log2.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/platform/settings.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/attributes.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/clipping_mask_program.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/clipping_mask_program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program_parameters.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/program_parameters.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/programs.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/programs.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/segment.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/textures.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/programs/uniforms.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/backend_scope.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/bucket.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/bucket_parameters.cpp @@ -657,6 +645,10 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/transition_parameters.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/update_parameters.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/upload_parameters.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/attributes.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/program_parameters.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/segment.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/uniforms.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/sprite/sprite_loader.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/sprite/sprite_loader.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/sprite/sprite_loader_observer.hpp @@ -1040,7 +1032,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/object.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/offscreen_texture.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/offscreen_texture.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/program.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_pass.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_pass.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/renderbuffer_resource.cpp @@ -1049,10 +1040,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/resource_pool.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/resource_pool.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/state.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture_resource.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/texture_resource.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/timestamp_query_extension.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/timestamp_query_extension.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/types.hpp @@ -1067,6 +1054,11 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_buffer_resource.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_buffer_resource.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/platform/gl_functions.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/legacy/clipping_mask_program.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/legacy/program_base.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/legacy/program.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/legacy/programs.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/gl/legacy/programs.hpp ) list(APPEND INCLUDE_FILES diff --git a/bazel/core.bzl b/bazel/core.bzl index 06efec4e3566..485dc8dbdb1d 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -132,7 +132,6 @@ MLN_CORE_SOURCE = [ "src/mbgl/gfx/index_vector.hpp", "src/mbgl/gfx/offscreen_texture.hpp", "src/mbgl/gfx/polyline_generator.cpp", - "src/mbgl/gfx/program.hpp", "src/mbgl/gfx/render_pass.hpp", "src/mbgl/gfx/renderbuffer.hpp", "src/mbgl/gfx/renderer_backend.cpp", @@ -140,7 +139,6 @@ MLN_CORE_SOURCE = [ "src/mbgl/gfx/shader_registry.cpp", "src/mbgl/gfx/shader_group.cpp", "src/mbgl/gfx/stencil_mode.hpp", - "src/mbgl/gfx/texture.hpp", "src/mbgl/gfx/uniform.hpp", "src/mbgl/gfx/upload_pass.hpp", "src/mbgl/gfx/vertex_buffer.hpp", @@ -184,17 +182,6 @@ MLN_CORE_SOURCE = [ "src/mbgl/map/zoom_history.hpp", "src/mbgl/math/log2.cpp", "src/mbgl/platform/settings.cpp", - "src/mbgl/programs/attributes.hpp", - "src/mbgl/programs/clipping_mask_program.cpp", - "src/mbgl/programs/clipping_mask_program.hpp", - "src/mbgl/programs/program.hpp", - "src/mbgl/programs/program_parameters.cpp", - "src/mbgl/programs/program_parameters.hpp", - "src/mbgl/programs/programs.cpp", - "src/mbgl/programs/programs.hpp", - "src/mbgl/programs/segment.hpp", - "src/mbgl/programs/textures.hpp", - "src/mbgl/programs/uniforms.hpp", "src/mbgl/renderer/backend_scope.cpp", "src/mbgl/renderer/bucket.hpp", "src/mbgl/renderer/bucket_parameters.cpp", @@ -302,6 +289,10 @@ MLN_CORE_SOURCE = [ "src/mbgl/renderer/transition_parameters.hpp", "src/mbgl/renderer/update_parameters.hpp", "src/mbgl/renderer/upload_parameters.hpp", + "src/mbgl/shaders/attributes.hpp", + "src/mbgl/shaders/program_parameters.cpp", + "src/mbgl/shaders/segment.hpp", + "src/mbgl/shaders/uniforms.hpp", "src/mbgl/sprite/sprite_loader.cpp", "src/mbgl/sprite/sprite_loader.hpp", "src/mbgl/sprite/sprite_loader_observer.hpp", @@ -653,6 +644,7 @@ MLN_CORE_HEADERS = [ "include/mbgl/renderer/renderer_frontend.hpp", "include/mbgl/renderer/renderer_observer.hpp", "include/mbgl/renderer/renderer_state.hpp", + "include/mbgl/shaders/program_parameters.hpp", "include/mbgl/storage/database_file_source.hpp", "include/mbgl/storage/file_source.hpp", "include/mbgl/storage/file_source_manager.hpp", @@ -834,7 +826,6 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/object.hpp", "src/mbgl/gl/offscreen_texture.cpp", "src/mbgl/gl/offscreen_texture.hpp", - "src/mbgl/gl/program.hpp", "src/mbgl/gl/render_pass.cpp", "src/mbgl/gl/render_pass.hpp", "src/mbgl/gl/renderbuffer_resource.cpp", @@ -843,10 +834,6 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/resource_pool.cpp", "src/mbgl/gl/resource_pool.hpp", "src/mbgl/gl/state.hpp", - "src/mbgl/gl/texture.cpp", - "src/mbgl/gl/texture.hpp", - "src/mbgl/gl/texture_resource.cpp", - "src/mbgl/gl/texture_resource.hpp", "src/mbgl/gl/timestamp_query_extension.cpp", "src/mbgl/gl/timestamp_query_extension.hpp", "src/mbgl/gl/types.hpp", @@ -861,6 +848,11 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/vertex_buffer_resource.cpp", "src/mbgl/gl/vertex_buffer_resource.hpp", "src/mbgl/platform/gl_functions.cpp", + "src/mbgl/shaders/gl/legacy/clipping_mask_program.hpp", + "src/mbgl/shaders/gl/legacy/program_base.hpp", + "src/mbgl/shaders/gl/legacy/program.hpp", + "src/mbgl/shaders/gl/legacy/programs.cpp", + "src/mbgl/shaders/gl/legacy/programs.hpp", ] MLN_OPENGL_HEADERS = [ diff --git a/include/mbgl/gfx/context.hpp b/include/mbgl/gfx/context.hpp index 28016426c54b..abcefef38e7c 100644 --- a/include/mbgl/gfx/context.hpp +++ b/include/mbgl/gfx/context.hpp @@ -5,10 +5,8 @@ #include #include #include -#include #include #include -#include #include #include @@ -30,6 +28,8 @@ using RenderTargetPtr = std::shared_ptr; namespace gfx { +class DepthMode; +class ColorMode; class OffscreenTexture; class ShaderRegistry; @@ -79,13 +79,6 @@ class Context { virtual std::unique_ptr createOffscreenTexture(Size, TextureChannelDataType) = 0; - /// Creates an empty texture with the specified dimensions. - Texture createTexture(const Size size, - TexturePixelType format = TexturePixelType::RGBA, - TextureChannelDataType type = TextureChannelDataType::UnsignedByte) { - return {size, createTextureResource(size, format, type)}; - } - template Renderbuffer createRenderbuffer(const Size size) { return {size, createRenderbufferResource(pixelType, size)}; @@ -173,7 +166,6 @@ class Context { virtual void unbindGlobalUniformBuffers(gfx::RenderPass&) const noexcept = 0; protected: - virtual std::unique_ptr createTextureResource(Size, TexturePixelType, TextureChannelDataType) = 0; virtual std::unique_ptr createRenderbufferResource(RenderbufferPixelType, Size) = 0; virtual std::unique_ptr createDrawScopeResource() = 0; diff --git a/include/mbgl/gfx/drawable_impl.hpp b/include/mbgl/gfx/drawable_impl.hpp index c98be4914f9d..b01ca246ab45 100644 --- a/include/mbgl/gfx/drawable_impl.hpp +++ b/include/mbgl/gfx/drawable_impl.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include namespace mbgl { namespace gfx { diff --git a/include/mbgl/gfx/polyline_generator.hpp b/include/mbgl/gfx/polyline_generator.hpp index f257523156f1..bb82ff6ebceb 100644 --- a/include/mbgl/gfx/polyline_generator.hpp +++ b/include/mbgl/gfx/polyline_generator.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include diff --git a/include/mbgl/gfx/texture2d.hpp b/include/mbgl/gfx/texture2d.hpp index 2200e9a9ba5d..5b4d73256433 100644 --- a/include/mbgl/gfx/texture2d.hpp +++ b/include/mbgl/gfx/texture2d.hpp @@ -15,6 +15,8 @@ class Context; class UploadPass; class TextureResource; +constexpr int32_t MaxActiveTextureUnits = 8; + class Texture2D { public: struct SamplerState { diff --git a/include/mbgl/gl/drawable_gl.hpp b/include/mbgl/gl/drawable_gl.hpp index 2aad6c4d8b12..3c14a125533a 100644 --- a/include/mbgl/gl/drawable_gl.hpp +++ b/include/mbgl/gl/drawable_gl.hpp @@ -4,14 +4,12 @@ #include #include #include -#include #include namespace mbgl { -template -class Segment; +class SegmentBase; class PaintParameters; namespace gfx { diff --git a/include/mbgl/gl/texture2d.hpp b/include/mbgl/gl/texture2d.hpp index 37071a8d72aa..6cce3b3a1523 100644 --- a/include/mbgl/gl/texture2d.hpp +++ b/include/mbgl/gl/texture2d.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -66,7 +67,7 @@ class Texture2D : public gfx::Texture2D { private: gl::Context& context; - std::unique_ptr textureResource{nullptr}; + std::unique_ptr texture; SamplerState samplerState{}; gfx::TexturePixelType pixelFormat{gfx::TexturePixelType::RGBA}; diff --git a/include/mbgl/mtl/context.hpp b/include/mbgl/mtl/context.hpp index 46c6e2c08e0e..7a5573de8342 100644 --- a/include/mbgl/mtl/context.hpp +++ b/include/mbgl/mtl/context.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -109,10 +108,6 @@ class Context final : public gfx::Context { std::unique_ptr createOffscreenTexture(Size, gfx::TextureChannelDataType) override; - std::unique_ptr createTextureResource(Size, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - std::unique_ptr createRenderbufferResource(gfx::RenderbufferPixelType, Size size) override; diff --git a/include/mbgl/mtl/drawable.hpp b/include/mbgl/mtl/drawable.hpp index b40c87b76e19..d98e62d1197c 100644 --- a/include/mbgl/mtl/drawable.hpp +++ b/include/mbgl/mtl/drawable.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include diff --git a/include/mbgl/mtl/upload_pass.hpp b/include/mbgl/mtl/upload_pass.hpp index 99598529a273..8a994a6591c8 100644 --- a/include/mbgl/mtl/upload_pass.hpp +++ b/include/mbgl/mtl/upload_pass.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -71,21 +70,6 @@ class UploadPass final : public gfx::UploadPass { const std::optional> lastUpdate, /*out*/ std::vector>& outBuffers) override; - std::unique_ptr createTextureResource(Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - void updateTextureResource( - gfx::TextureResource&, Size, const void* data, gfx::TexturePixelType, gfx::TextureChannelDataType) override; - - void updateTextureResourceSub(gfx::TextureResource&, - uint16_t xOffset, - uint16_t yOffset, - Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - private: void pushDebugGroup(const char* name) override; void popDebugGroup() override; diff --git a/include/mbgl/shaders/gl/shader_group_gl.hpp b/include/mbgl/shaders/gl/shader_group_gl.hpp index 6eada1fc9017..acaf6358f611 100644 --- a/include/mbgl/shaders/gl/shader_group_gl.hpp +++ b/include/mbgl/shaders/gl/shader_group_gl.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include namespace mbgl { diff --git a/include/mbgl/shaders/mtl/shader_group.hpp b/include/mbgl/shaders/mtl/shader_group.hpp index a63953715054..a1dee00ae681 100644 --- a/include/mbgl/shaders/mtl/shader_group.hpp +++ b/include/mbgl/shaders/mtl/shader_group.hpp @@ -1,9 +1,9 @@ #pragma once #include -#include #include #include +#include #include #include #include diff --git a/src/mbgl/programs/program_parameters.hpp b/include/mbgl/shaders/program_parameters.hpp similarity index 100% rename from src/mbgl/programs/program_parameters.hpp rename to include/mbgl/shaders/program_parameters.hpp diff --git a/include/mbgl/shaders/vulkan/shader_group.hpp b/include/mbgl/shaders/vulkan/shader_group.hpp index 475336502a23..818b272ae352 100644 --- a/include/mbgl/shaders/vulkan/shader_group.hpp +++ b/include/mbgl/shaders/vulkan/shader_group.hpp @@ -1,8 +1,8 @@ #pragma once #include -#include #include +#include #include #include #include diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index 6a4880c9df3b..9a75e5e96940 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -105,10 +104,6 @@ class Context final : public gfx::Context { std::unique_ptr createOffscreenTexture(Size, gfx::TextureChannelDataType) override; - std::unique_ptr createTextureResource(Size, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - std::unique_ptr createRenderbufferResource(gfx::RenderbufferPixelType, Size size) override; diff --git a/include/mbgl/vulkan/pipeline.hpp b/include/mbgl/vulkan/pipeline.hpp index 2c7af7fdffa2..69c909e09767 100644 --- a/include/mbgl/vulkan/pipeline.hpp +++ b/include/mbgl/vulkan/pipeline.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/include/mbgl/vulkan/upload_pass.hpp b/include/mbgl/vulkan/upload_pass.hpp index 5a9a0232ccdc..45713e70677d 100644 --- a/include/mbgl/vulkan/upload_pass.hpp +++ b/include/mbgl/vulkan/upload_pass.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -66,21 +65,6 @@ class UploadPass final : public gfx::UploadPass { const std::optional> lastUpdate, /*out*/ std::vector>& outBuffers) override; - std::unique_ptr createTextureResource(Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - void updateTextureResource( - gfx::TextureResource&, Size, const void* data, gfx::TexturePixelType, gfx::TextureChannelDataType) override; - - void updateTextureResourceSub(gfx::TextureResource&, - uint16_t xOffset, - uint16_t yOffset, - Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - private: void pushDebugGroup(const char* name) override; void popDebugGroup() override; diff --git a/src/mbgl/geometry/line_atlas.hpp b/src/mbgl/geometry/line_atlas.hpp index 3ab22442d8ec..ca3a735247f2 100644 --- a/src/mbgl/geometry/line_atlas.hpp +++ b/src/mbgl/geometry/line_atlas.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include diff --git a/src/mbgl/gfx/drawable_builder_impl.hpp b/src/mbgl/gfx/drawable_builder_impl.hpp index d3fec0b1a75f..4992360a8f39 100644 --- a/src/mbgl/gfx/drawable_builder_impl.hpp +++ b/src/mbgl/gfx/drawable_builder_impl.hpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/gfx/program.hpp b/src/mbgl/gfx/program.hpp deleted file mode 100644 index 04c15603dcfa..000000000000 --- a/src/mbgl/gfx/program.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include - -namespace mbgl { -namespace gfx { - -class Context; -class DrawMode; -class DepthMode; -class StencilMode; -class ColorMode; -class CullFaceMode; -class DrawScope; -class IndexBuffer; -class RenderPass; -template -class UniformValues; -template -class AttributeBindings; -template -class TextureBindings; - -template -class Program { -protected: - Program() = default; - -public: - virtual ~Program() = default; - - Program(Program&&) = delete; - Program(const Program&) = delete; - Program& operator=(Program&&) = delete; - Program& operator=(const Program&) = delete; - - using AttributeList = typename Name::AttributeList; - using UniformList = typename Name::UniformList; - using TextureList = typename Name::TextureList; - - virtual void draw(Context&, - RenderPass&, - const DrawMode&, - const DepthMode&, - const StencilMode&, - const ColorMode&, - const CullFaceMode&, - const UniformValues&, - DrawScope&, - const AttributeBindings&, - const TextureBindings&, - const IndexBuffer&, - std::size_t indexOffset, - std::size_t indexLength) = 0; -}; - -} // namespace gfx -} // namespace mbgl diff --git a/src/mbgl/gfx/texture.hpp b/src/mbgl/gfx/texture.hpp deleted file mode 100644 index 00b9ff7a6a45..000000000000 --- a/src/mbgl/gfx/texture.hpp +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include -#include - -#define MBGL_DEFINE_TEXTURE(name_) \ - struct name_ { \ - using Value = ::mbgl::gfx::TextureBinding; \ - static constexpr auto name() { \ - return #name_; \ - } \ - } - -namespace mbgl { -namespace gfx { - -constexpr int32_t MaxActiveTextureUnits = 8; -class TextureResource { -protected: - TextureResource() = default; - -public: - virtual ~TextureResource() = default; -}; - -class Texture { -public: - Texture(const Size size_, std::unique_ptr&& resource_) - : size(size_), - resource(std::move(resource_)) {} - - template - T& getResource() const { - assert(resource); - return static_cast(*resource); - } - - const Size& getSize() const noexcept { return size; } - - Size size; - -protected: - std::unique_ptr resource; -}; - -class TextureBinding { -public: - TextureBinding(TextureResource& resource_, - TextureFilterType filter_ = TextureFilterType::Nearest, - TextureMipMapType mipmap_ = TextureMipMapType::No, - TextureWrapType wrapX_ = TextureWrapType::Clamp, - TextureWrapType wrapY_ = TextureWrapType::Clamp) - : resource(&resource_), - filter(filter_), - mipmap(mipmap_), - wrapX(wrapX_), - wrapY(wrapY_) {} - - TextureResource* resource; - TextureFilterType filter; - TextureMipMapType mipmap; - TextureWrapType wrapX; - TextureWrapType wrapY; -}; - -template -class TextureBindings; - -template -class TextureBindings> final - : public IndexedTuple, TypeList...>> { - using Base = IndexedTuple, TypeList...>>; - -public: - template - TextureBindings(Args&&... args) - : Base(std::forward(args)...) {} -}; - -} // namespace gfx -} // namespace mbgl diff --git a/src/mbgl/gfx/upload_pass.hpp b/src/mbgl/gfx/upload_pass.hpp index 71a76909dcca..8804dde541a3 100644 --- a/src/mbgl/gfx/upload_pass.hpp +++ b/src/mbgl/gfx/upload_pass.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -97,51 +96,6 @@ class UploadPass { BufferUsageType, bool persistent = false) = 0; virtual void updateIndexBufferResource(IndexBufferResource&, const void* data, std::size_t size) = 0; - -public: - // Create a texture from an image with data. - template - Texture createTexture(const Image& image, TextureChannelDataType type = TextureChannelDataType::UnsignedByte) { - auto format = image.channels == 4 ? TexturePixelType::RGBA : TexturePixelType::Alpha; - return {image.size, createTextureResource(image.size, image.data.get(), format, type)}; - } - - template - void updateTexture(Texture& texture, - const Image& image, - TextureChannelDataType type = TextureChannelDataType::UnsignedByte) { - const auto format = image.channels == 4 ? TexturePixelType::RGBA : TexturePixelType::Alpha; - updateTextureResource(texture.getResource(), image.size, image.data.get(), format, type); - texture.size = image.size; - } - - template - void updateTextureSub(Texture& texture, - const Image& image, - const uint16_t offsetX, - const uint16_t offsetY, - TextureChannelDataType type = TextureChannelDataType::UnsignedByte) { - assert(image.size.width + offsetX <= texture.size.width); - assert(image.size.height + offsetY <= texture.size.height); - const auto format = image.channels == 4 ? TexturePixelType::RGBA : TexturePixelType::Alpha; - updateTextureResourceSub(texture.getResource(), offsetX, offsetY, image.size, image.data.get(), format, type); - } - -public: - virtual std::unique_ptr createTextureResource(Size, - const void* data, - TexturePixelType, - TextureChannelDataType) = 0; - virtual void updateTextureResource( - TextureResource&, Size, const void* data, TexturePixelType, TextureChannelDataType) = 0; - - virtual void updateTextureResourceSub(TextureResource&, - uint16_t xOffset, - uint16_t yOffset, - Size, - const void* data, - TexturePixelType, - TextureChannelDataType) = 0; }; } // namespace gfx diff --git a/src/mbgl/gl/attribute.hpp b/src/mbgl/gl/attribute.hpp index 52a44d29e13b..d39e8789feea 100644 --- a/src/mbgl/gl/attribute.hpp +++ b/src/mbgl/gl/attribute.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 5d81f21ed885..91679793738e 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -7,8 +7,6 @@ #include #include #include -#include -#include #include #include #include @@ -295,29 +293,6 @@ UniqueFramebuffer Context::createFramebuffer() { return UniqueFramebuffer{std::move(id), {this}}; } -std::unique_ptr Context::createTextureResource(const Size size, - const gfx::TexturePixelType format, - const gfx::TextureChannelDataType type) { - MLN_TRACE_FUNC(); - - auto obj = createUniqueTexture(size, format, type); - std::unique_ptr resource = std::make_unique(std::move(obj)); - - // Always use texture unit 0 for manipulating it. - activeTextureUnit = 0; - texture[0] = static_cast(*resource).texture; - - // We are using clamp to edge here since OpenGL ES doesn't allow GL_REPEAT - // on NPOT textures. We use those when the pixelRatio isn't a power of two, - // e.g. on iPhone 6 Plus. - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); - - return resource; -} - std::unique_ptr Context::createRenderbufferResource(const gfx::RenderbufferPixelType type, const Size size) { MLN_TRACE_FUNC(); @@ -449,51 +424,6 @@ Framebuffer Context::createFramebuffer(const gfx::Renderbuffer& depthStencil) { - MLN_TRACE_FUNC(); - - if (color.size != depthStencil.getSize()) { - throw std::runtime_error("Renderbuffer size mismatch"); - } - auto fbo = createFramebuffer(); - bindFramebuffer = fbo; - MBGL_CHECK_ERROR(glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color.getResource().texture, 0)); - bindDepthStencilRenderbuffer(depthStencil); - checkFramebuffer(); - return {color.size, std::move(fbo)}; -} - -Framebuffer Context::createFramebuffer(const gfx::Texture& color) { - MLN_TRACE_FUNC(); - - auto fbo = createFramebuffer(); - bindFramebuffer = fbo; - MBGL_CHECK_ERROR(glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color.getResource().texture, 0)); - checkFramebuffer(); - return {color.size, std::move(fbo)}; -} - -Framebuffer Context::createFramebuffer(const gfx::Texture& color, - const gfx::Renderbuffer& depth) { - MLN_TRACE_FUNC(); - if (color.size != depth.getSize()) { - throw std::runtime_error("Renderbuffer size mismatch"); - } - auto fbo = createFramebuffer(); - bindFramebuffer = fbo; - MBGL_CHECK_ERROR(glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color.getResource().texture, 0)); - - auto& depthResource = depth.getResource(); - MBGL_CHECK_ERROR( - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthResource.renderbuffer)); - checkFramebuffer(); - return {depth.getSize(), std::move(fbo)}; -} - std::unique_ptr Context::createOffscreenTexture(const Size size, const gfx::TextureChannelDataType type) { MLN_TRACE_FUNC(); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 82ec8d3af2f2..6ce4bb0ee3b2 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -63,10 +62,6 @@ class Context final : public gfx::Context { Framebuffer createFramebuffer(const gfx::Renderbuffer&, const gfx::Renderbuffer&); Framebuffer createFramebuffer(const gfx::Renderbuffer&); - Framebuffer createFramebuffer(const gfx::Texture&, - const gfx::Renderbuffer&); - Framebuffer createFramebuffer(const gfx::Texture&); - Framebuffer createFramebuffer(const gfx::Texture&, const gfx::Renderbuffer&); template createOffscreenTexture(Size, gfx::TextureChannelDataType) override; - std::unique_ptr createTextureResource(Size, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; private: std::unique_ptr createRenderbufferResource(gfx::RenderbufferPixelType, diff --git a/src/mbgl/gl/drawable_gl.cpp b/src/mbgl/gl/drawable_gl.cpp index 3a65cf4fb25c..c335cebd1873 100644 --- a/src/mbgl/gl/drawable_gl.cpp +++ b/src/mbgl/gl/drawable_gl.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/gl/drawable_gl_impl.hpp b/src/mbgl/gl/drawable_gl_impl.hpp index 787c52896114..a972ac6cd31d 100644 --- a/src/mbgl/gl/drawable_gl_impl.hpp +++ b/src/mbgl/gl/drawable_gl_impl.hpp @@ -2,15 +2,13 @@ #include #include -#include #include #include #include -#include #include #include #include -#include +#include #include #include diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp index a11c799a6c87..3a8a31b9d3c4 100644 --- a/src/mbgl/gl/renderer_backend.cpp +++ b/src/mbgl/gl/renderer_backend.cpp @@ -8,6 +8,7 @@ #include #include +#include #include @@ -146,6 +147,10 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::SymbolIconShader, shaders::BuiltIn::SymbolSDFShader, shaders::BuiltIn::SymbolTextAndIconShader>(shaders, programParameters); + + // Initialize legacy shader programs + Programs programs(programParameters); + programs.registerWith(shaders); } } // namespace gl diff --git a/src/mbgl/gl/resource_pool.cpp b/src/mbgl/gl/resource_pool.cpp index 9c0f4ea15469..2de7b8056cfb 100644 --- a/src/mbgl/gl/resource_pool.cpp +++ b/src/mbgl/gl/resource_pool.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -18,10 +17,6 @@ using namespace platform; namespace { -size_t storageSize(const Texture2DDesc& desc) { - return static_cast(TextureResource::getStorageSize(desc.size, desc.pixelFormat, desc.channelType)); -} - #if !defined(NDEBUG) void logDebugMessage(const std::string& message) { Log::Debug(Event::General, "Texture2DPool: " + message); @@ -32,6 +27,37 @@ void logDebugMessage(const std::string&) {} } // namespace +size_t Texture2DDesc::channelCount() const { + switch (pixelFormat) { + case gfx::TexturePixelType::Alpha: + case gfx::TexturePixelType::Depth: + case gfx::TexturePixelType::Luminance: + case gfx::TexturePixelType::Stencil: + return 1; + case gfx::TexturePixelType::RGBA: + return 4; + default: + assert(!"Unknown texture pixel type"); + return 0; + } +} + +size_t Texture2DDesc::channelStorageSize() const { + switch (channelType) { + case gfx::TextureChannelDataType::HalfFloat: + return 2; + case gfx::TextureChannelDataType::UnsignedByte: + return 1; + default: + assert(!"Unknown texture channel data type"); + return 0; + } +} + +size_t Texture2DDesc::getStorageSize() const { + return size.width * size.height * channelCount() * channelStorageSize(); +} + std::size_t Texture2DDescHash::operator()(const Texture2DDesc& desc) const { std::size_t seed = 0; util::hash_combine(seed, desc.size.width); @@ -133,7 +159,7 @@ TextureID Texture2DPool::allocateGLMemory(const Texture2DDesc& desc) { pool[desc].used.insert(id); // Update poolStorage - auto storage = storageSize(desc); + auto storage = desc.getStorageSize(); poolStorage += storage; context->renderingStats().memTextures += storage; MLN_TRACE_ALLOC_TEXTURE(id, storage); @@ -167,7 +193,7 @@ void Texture2DPool::freeAllocatedGLMemory(TextureID id) { } // Update poolStorage - auto storage = storageSize(desc); + auto storage = desc.getStorageSize(); poolStorage -= storage; context->renderingStats().memTextures -= storage; assert(context->renderingStats().memTextures >= 0); @@ -224,7 +250,7 @@ bool Texture2DPool::isUnused(TextureID id) const { size_t Texture2DPool::usedStorage() const { size_t total = 0; for (const auto& set : pool) { - total += storageSize(set.first) * set.second.used.size(); + total += set.first.getStorageSize() * set.second.used.size(); } return total; } @@ -232,7 +258,7 @@ size_t Texture2DPool::usedStorage() const { size_t Texture2DPool::unusedStorage() const { size_t total = 0; for (const auto& set : pool) { - total += storageSize(set.first) * set.second.free.size(); + total += set.first.getStorageSize() * set.second.free.size(); } return total; } @@ -244,7 +270,7 @@ const Texture2DDesc& Texture2DPool::desc(TextureID id) const { size_t Texture2DPool::storage(TextureID id) const { assert(descriptions.find(id) != descriptions.end()); - return storageSize(descriptions.at(id)); + return descriptions.at(id).getStorageSize(); } } // namespace gl diff --git a/src/mbgl/gl/resource_pool.hpp b/src/mbgl/gl/resource_pool.hpp index 7abd6230466d..2532c3cd4d20 100644 --- a/src/mbgl/gl/resource_pool.hpp +++ b/src/mbgl/gl/resource_pool.hpp @@ -19,6 +19,10 @@ struct Texture2DDesc { Size size; gfx::TexturePixelType pixelFormat; gfx::TextureChannelDataType channelType; + + size_t channelCount() const; + size_t channelStorageSize() const; + size_t getStorageSize() const; }; struct Texture2DDescHash { diff --git a/src/mbgl/gl/texture.cpp b/src/mbgl/gl/texture.cpp deleted file mode 100644 index 41557ce089a8..000000000000 --- a/src/mbgl/gl/texture.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include - -namespace mbgl { -namespace gl { - -using namespace platform; - -void bindTexture(gl::Context& context, const uint8_t unit, const gfx::TextureBinding& binding) { - auto& resource = static_cast(*binding.resource); - if (binding.filter != resource.filter || binding.mipmap != resource.mipmap || binding.wrapX != resource.wrapX || - binding.wrapY != resource.wrapY) { - context.activeTextureUnit = unit; - context.texture[unit] = resource.texture; - - if (binding.filter != resource.filter || binding.mipmap != resource.mipmap) { - MBGL_CHECK_ERROR(glTexParameteri( - GL_TEXTURE_2D, - GL_TEXTURE_MIN_FILTER, - binding.filter == gfx::TextureFilterType::Linear - ? (binding.mipmap == gfx::TextureMipMapType::Yes ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR) - : (binding.mipmap == gfx::TextureMipMapType::Yes ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST))); - MBGL_CHECK_ERROR( - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_MAG_FILTER, - binding.filter == gfx::TextureFilterType::Linear ? GL_LINEAR : GL_NEAREST)); - resource.filter = binding.filter; - resource.mipmap = binding.mipmap; - } - if (binding.wrapX != resource.wrapX) { - MBGL_CHECK_ERROR( - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_WRAP_S, - binding.wrapX == gfx::TextureWrapType::Clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT)); - resource.wrapX = binding.wrapX; - } - if (binding.wrapY != resource.wrapY) { - MBGL_CHECK_ERROR( - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_WRAP_T, - binding.wrapY == gfx::TextureWrapType::Clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT)); - resource.wrapY = binding.wrapY; - } - } else if (context.texture[unit] != resource.texture) { - // We are checking first to avoid setting the active texture without a - // subsequent texture bind. - context.activeTextureUnit = unit; - context.texture[unit] = resource.texture; - } -} - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/texture.hpp b/src/mbgl/gl/texture.hpp deleted file mode 100644 index f6cecc397fdc..000000000000 --- a/src/mbgl/gl/texture.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include -#include - -namespace mbgl { -namespace gl { - -class Context; - -void bindTexture(gl::Context&, uint8_t unit, const gfx::TextureBinding&); - -template -class TextureStates; - -template -class TextureStates> { -private: - using State = IndexedTuple, TypeList>...>>; - - State state; - -public: - void queryLocations(const ProgramID& id) { - state = State{ - gl::uniformLocation(id, concat_literals<&string_literal<'u', '_'>::value, &Ts::name>::value())...}; - } - - NamedUniformLocations getNamedLocations() const { - return NamedUniformLocations{{concat_literals<&string_literal<'u', '_'>::value, &Ts::name>::value(), - state.template get().location}...}; - } - - void bind(gl::Context& context, const gfx::TextureBindings>& bindings) { - util::ignore({(state.template get() = TypeIndex::value, - gl::bindTexture(context, TypeIndex::value, bindings.template get()), - 0)...}); - } -}; - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/texture2d.cpp b/src/mbgl/gl/texture2d.cpp index a1c9dd9572c4..332e515a7c54 100644 --- a/src/mbgl/gl/texture2d.cpp +++ b/src/mbgl/gl/texture2d.cpp @@ -5,9 +5,6 @@ #include #include -#include -#include - namespace mbgl { namespace gl { @@ -18,7 +15,7 @@ Texture2D::~Texture2D() {} Texture2D& Texture2D::setSamplerConfiguration(const SamplerState& samplerState_) noexcept { samplerState = samplerState_; - samplerStateDirty = textureResource != nullptr; + samplerStateDirty = texture != nullptr; return *this; } @@ -27,7 +24,7 @@ Texture2D& Texture2D::setFormat(gfx::TexturePixelType pixelFormat_, gfx::Texture return *this; } - assert(!textureResource); + assert(!texture); pixelFormat = pixelFormat_; channelType = channelType_; storageDirty = true; @@ -76,9 +73,7 @@ void Texture2D::allocateTexture() noexcept { // Create a new texture object auto obj = context.createUniqueTexture(size, pixelFormat, channelType); - - // @TODO: TextureResource is still needed while we have legacy rendering pathways - textureResource = std::make_unique(std::move(obj)); + texture = std::make_unique(std::move(obj)); } void Texture2D::updateTextureData(const void* data) noexcept { @@ -99,7 +94,7 @@ void Texture2D::create() noexcept { } platform::GLuint Texture2D::getTextureID() const noexcept { - return textureResource ? static_cast(*textureResource).texture : 0; + return texture ? *texture : 0; } void Texture2D::updateSamplerConfiguration() noexcept { @@ -118,12 +113,6 @@ void Texture2D::updateSamplerConfiguration() noexcept { MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, samplerState.wrapV == gfx::TextureWrapType::Clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT)); - - // Keep the resource sampler configuration in sync - auto& glResource = static_cast(*textureResource); - glResource.filter = samplerState.filter; - glResource.wrapX = samplerState.wrapU; - glResource.wrapY = samplerState.wrapV; } void Texture2D::bind(int32_t location, int32_t textureUnit) noexcept { @@ -166,7 +155,7 @@ void Texture2D::unbind() noexcept { } void Texture2D::upload(const void* pixelData, const Size& size_) noexcept { - if (!textureResource || storageDirty || size_ == Size{0, 0} || size_ != size) { + if (!texture || storageDirty || size_ == Size{0, 0} || size_ != size) { size = size_; // Create the texture object if we don't already have one or if storage is dirty @@ -178,7 +167,7 @@ void Texture2D::upload(const void* pixelData, const Size& size_) noexcept { void Texture2D::uploadSubRegion(const void* pixelData, const Size& size_, uint16_t xOffset, uint16_t yOffset) noexcept { using namespace platform; - assert(textureResource); + assert(texture); // update sampler configuration if needed if (samplerStateDirty) { diff --git a/src/mbgl/gl/texture_resource.cpp b/src/mbgl/gl/texture_resource.cpp deleted file mode 100644 index e04ec47e49eb..000000000000 --- a/src/mbgl/gl/texture_resource.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include - -namespace mbgl { -namespace gl { - -static int channelCount(gfx::TexturePixelType format) { - switch (format) { - case gfx::TexturePixelType::Alpha: - case gfx::TexturePixelType::Depth: - case gfx::TexturePixelType::Luminance: - case gfx::TexturePixelType::Stencil: - return 1; - case gfx::TexturePixelType::RGBA: - return 4; - default: - assert(!"Unknown texture pixel type"); - return 0; - } -} - -static int channelStorageSize(gfx::TextureChannelDataType type) { - switch (type) { - case gfx::TextureChannelDataType::HalfFloat: - return 2; - case gfx::TextureChannelDataType::UnsignedByte: - return 1; - default: - assert(!"Unknown texture channel data type"); - return 0; - } -} - -TextureResource::TextureResource(UniqueTexture&& texture_) - : texture(std::move(texture_)) {} - -TextureResource::~TextureResource() noexcept {} - -int TextureResource::getStorageSize(const Size& size, gfx::TexturePixelType format, gfx::TextureChannelDataType type) { - return size.width * size.height * channelCount(format) * channelStorageSize(type); -} - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/texture_resource.hpp b/src/mbgl/gl/texture_resource.hpp deleted file mode 100644 index d6b284b32f85..000000000000 --- a/src/mbgl/gl/texture_resource.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include - -namespace mbgl { -namespace gl { - -class TextureResource : public gfx::TextureResource { -public: - TextureResource(UniqueTexture&& texture_); - ~TextureResource() noexcept override; - - static int getStorageSize(const Size& size, gfx::TexturePixelType format, gfx::TextureChannelDataType type); - - UniqueTexture texture; - gfx::TextureFilterType filter = gfx::TextureFilterType::Nearest; - gfx::TextureMipMapType mipmap = gfx::TextureMipMapType::No; - gfx::TextureWrapType wrapX = gfx::TextureWrapType::Clamp; - gfx::TextureWrapType wrapY = gfx::TextureWrapType::Clamp; -}; - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/upload_pass.cpp b/src/mbgl/gl/upload_pass.cpp index fae1b550cad4..b58358b3cde2 100644 --- a/src/mbgl/gl/upload_pass.cpp +++ b/src/mbgl/gl/upload_pass.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -70,68 +69,6 @@ void UploadPass::updateIndexBufferResource(gfx::IndexBufferResource& resource, c MBGL_CHECK_ERROR(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, size, data)); } -std::unique_ptr UploadPass::createTextureResource(const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { - MLN_TRACE_FUNC(); - - auto obj = commandEncoder.context.createUniqueTexture(size, format, type); - auto resource = std::make_unique(std::move(obj)); - commandEncoder.context.pixelStoreUnpack = {1}; - updateTextureResourceSub(*resource, 0, 0, size, data, format, type); - // We are using clamp to edge here since OpenGL ES doesn't allow GL_REPEAT - // on NPOT textures. We use those when the pixelRatio isn't a power of two, - // e.g. on iPhone 6 Plus. - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); - MBGL_CHECK_ERROR(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); - return resource; -} - -void UploadPass::updateTextureResource(gfx::TextureResource& resource, - const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { - MLN_TRACE_FUNC(); - - updateTextureResourceSub(resource, 0, 0, size, data, format, type); -} - -void UploadPass::updateTextureResourceSub(gfx::TextureResource& resource, - const uint16_t xOffset, - const uint16_t yOffset, - const Size size, - const void* data, - gfx::TexturePixelType format, - gfx::TextureChannelDataType type) { - MLN_TRACE_FUNC(); - - auto& ctx = commandEncoder.context; - assert(ctx.getTexturePool().isUsed(static_cast(resource).texture)); - assert(ctx.getTexturePool().desc(static_cast(resource).texture).channelType == type); - assert(ctx.getTexturePool().desc(static_cast(resource).texture).pixelFormat == format); - assert(ctx.getTexturePool().desc(static_cast(resource).texture).size.width >= - xOffset + size.width); - assert(ctx.getTexturePool().desc(static_cast(resource).texture).size.height >= - yOffset + size.height); - - // Always use texture unit 0 for manipulating it. - ctx.activeTextureUnit = 0; - ctx.texture[0] = static_cast(resource).texture; - MBGL_CHECK_ERROR(glTexSubImage2D(GL_TEXTURE_2D, - 0, - xOffset, - yOffset, - size.width, - size.height, - Enum::to(format), - Enum::to(type), - data)); -} - struct VertexBufferGL : public gfx::VertexBufferBase { ~VertexBufferGL() override = default; diff --git a/src/mbgl/gl/upload_pass.hpp b/src/mbgl/gl/upload_pass.hpp index 60d39f098e66..99aceb44ea80 100644 --- a/src/mbgl/gl/upload_pass.hpp +++ b/src/mbgl/gl/upload_pass.hpp @@ -56,22 +56,6 @@ class UploadPass final : public gfx::UploadPass { const std::optional> lastUpdate, /*out*/ std::vector>& outBuffers) override; -public: - std::unique_ptr createTextureResource(Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - void updateTextureResource( - gfx::TextureResource&, Size, const void* data, gfx::TexturePixelType, gfx::TextureChannelDataType) override; - - void updateTextureResourceSub(gfx::TextureResource&, - uint16_t xOffset, - uint16_t yOffset, - Size, - const void* data, - gfx::TexturePixelType, - gfx::TextureChannelDataType) override; - private: gl::CommandEncoder& commandEncoder; const gfx::DebugGroup debugGroup; diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index b0ccfb116cd9..c2cb732bfcd0 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -13,12 +13,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -456,13 +456,6 @@ std::unique_ptr Context::createOffscreenTexture(Size size return createOffscreenTexture(size, type, false, false); } -std::unique_ptr Context::createTextureResource(Size, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - assert(false); - return nullptr; -} - std::unique_ptr Context::createRenderbufferResource(gfx::RenderbufferPixelType, Size) { return std::make_unique(); } diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index 84c760373b98..a4d2f8fc41fc 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/mtl/drawable_impl.hpp b/src/mbgl/mtl/drawable_impl.hpp index 1938050e756f..e1dace21b9fd 100644 --- a/src/mbgl/mtl/drawable_impl.hpp +++ b/src/mbgl/mtl/drawable_impl.hpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -12,7 +11,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/mtl/upload_pass.cpp b/src/mbgl/mtl/upload_pass.cpp index fefbc41637eb..5a39ae33fcd5 100644 --- a/src/mbgl/mtl/upload_pass.cpp +++ b/src/mbgl/mtl/upload_pass.cpp @@ -81,31 +81,6 @@ void UploadPass::updateIndexBufferResource(gfx::IndexBufferResource& resource, c static_cast(resource).get().update(data, size, /*offset=*/0); } -std::unique_ptr UploadPass::createTextureResource(const Size, - const void*, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::createTextureResource not implemented on Metal!"); -} - -void UploadPass::updateTextureResource( - gfx::TextureResource&, const Size, const void*, gfx::TexturePixelType, gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::updateTextureResource not implemented on Metal!"); -} - -void UploadPass::updateTextureResourceSub(gfx::TextureResource&, - const uint16_t, - const uint16_t, - const Size, - const void*, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::updateTextureResourceSub not implemented on Metal!"); -} - struct VertexBuffer : public gfx::VertexBufferBase { ~VertexBuffer() override = default; diff --git a/src/mbgl/programs/clipping_mask_program.cpp b/src/mbgl/programs/clipping_mask_program.cpp deleted file mode 100644 index 0e4338063124..000000000000 --- a/src/mbgl/programs/clipping_mask_program.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -namespace mbgl {} // namespace mbgl diff --git a/src/mbgl/programs/textures.hpp b/src/mbgl/programs/textures.hpp deleted file mode 100644 index b525b0d44cc7..000000000000 --- a/src/mbgl/programs/textures.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include - -namespace mbgl { -namespace textures { - -MBGL_DEFINE_TEXTURE(image); -MBGL_DEFINE_TEXTURE(image0); -MBGL_DEFINE_TEXTURE(image1); -MBGL_DEFINE_TEXTURE(color_ramp); -MBGL_DEFINE_TEXTURE(texture); -MBGL_DEFINE_TEXTURE(texture_icon); -MBGL_DEFINE_TEXTURE(overlay); - -} // namespace textures -} // namespace mbgl diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp index 4c351a102eaa..ca83cf699a84 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.hpp +++ b/src/mbgl/renderer/buckets/circle_bucket.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace mbgl { diff --git a/src/mbgl/renderer/buckets/debug_bucket.hpp b/src/mbgl/renderer/buckets/debug_bucket.hpp index c9a4e030505c..908b69bb5215 100644 --- a/src/mbgl/renderer/buckets/debug_bucket.hpp +++ b/src/mbgl/renderer/buckets/debug_bucket.hpp @@ -6,8 +6,7 @@ #include #include #include -#include -#include +#include #include namespace mbgl { @@ -40,7 +39,6 @@ class DebugBucket : private util::noncopyable { SegmentVector tileBorderSegments; std::optional> vertexBuffer; std::optional indexBuffer; - std::optional texture; }; } // namespace mbgl diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp index f2ea405a5677..2477eb046232 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_bucket.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include /** diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp index 0c7ee70ea1b8..f6c3c7b19232 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace mbgl { diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp index a3ad9fe866b6..2dbf038699fd 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace mbgl { diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.hpp b/src/mbgl/renderer/buckets/hillshade_bucket.hpp index a6413beccc78..9f3296ca99f6 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.hpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.hpp @@ -2,10 +2,9 @@ #include #include -#include #include #include -#include +#include #include #include #include @@ -31,9 +30,6 @@ class HillshadeBucket final : public Bucket { void clear(); void setMask(TileMask&&); - std::optional dem; - std::optional texture; - RenderTargetPtr renderTarget; bool renderTargetPrepared = false; diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp index b72dbfa932e4..4c9ed848a408 100644 --- a/src/mbgl/renderer/buckets/line_bucket.hpp +++ b/src/mbgl/renderer/buckets/line_bucket.hpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/renderer/buckets/raster_bucket.cpp b/src/mbgl/renderer/buckets/raster_bucket.cpp index d139c98cc78e..05ea0b1459b1 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.cpp +++ b/src/mbgl/renderer/buckets/raster_bucket.cpp @@ -36,7 +36,6 @@ void RasterBucket::clear() { void RasterBucket::setImage(std::shared_ptr image_) { image = std::move(image_); - texture = {}; texture2d.reset(); uploaded = false; } diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index 8e14507e3dd9..bc02bf844450 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -1,9 +1,8 @@ #pragma once #include -#include #include -#include +#include #include #include #include @@ -42,7 +41,6 @@ class RasterBucket final : public Bucket { } std::shared_ptr image; - std::optional texture; gfx::Texture2DPtr texture2d; TileMask mask{{0, 0, 0}}; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 88a0a73eaadf..530a9a467236 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include @@ -49,23 +49,12 @@ class SymbolSizeBinder { public: virtual ~SymbolSizeBinder() = default; - // using UniformList = TypeList; using UniformValues = gfx::UniformValues; - static std::unique_ptr create(float tileZoom, const style::PropertyValue& sizeProperty, float defaultValue); virtual Range getVertexSizeData(const GeometryTileFeature& feature) = 0; virtual ZoomEvaluatedSize evaluateForZoom(float currentZoom) const = 0; - - /*UniformValues uniformValues(float currentZoom) const { - const ZoomEvaluatedSize u = evaluateForZoom(currentZoom); - return UniformValues{uniforms::is_size_zoom_constant::Value(u.isZoomConstant), - uniforms::is_size_feature_constant::Value(u.isFeatureConstant), - uniforms::size_t::Value(u.sizeT), - uniforms::size::Value(u.size)}; - }*/ }; class ConstantSymbolSizeBinder final : public SymbolSizeBinder { diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 3a0b6400043c..bc61344b4de6 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_background_layer.hpp b/src/mbgl/renderer/layers/render_background_layer.hpp index f3e7bd2bceb8..89cf6a88c69a 100644 --- a/src/mbgl/renderer/layers/render_background_layer.hpp +++ b/src/mbgl/renderer/layers/render_background_layer.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 4dfd429b7341..90b21c12f8f2 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 1c2709301218..c09779a96a57 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 26028b31e1b2..c70190698a63 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index f05c3e98560d..5f4416415619 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -93,9 +92,7 @@ void RenderHeatmapLayer::updateColorRamp() { colorValue = HeatmapLayer::getDefaultHeatmapColor(); } - if (applyColorRamp(colorValue, *colorRamp)) { - colorRampTexture = std::nullopt; - } + applyColorRamp(colorValue, *colorRamp); } } diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.hpp b/src/mbgl/renderer/layers/render_heatmap_layer.hpp index 640ab02bb05c..c5fd6eac788f 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.hpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -61,7 +60,6 @@ class RenderHeatmapLayer final : public RenderLayer { style::HeatmapPaintProperties::Unevaluated unevaluated; std::shared_ptr colorRamp; std::unique_ptr renderTexture; - std::optional colorRampTexture; SegmentVector segments; gfx::ShaderGroupPtr heatmapShaderGroup; diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index 6bc7abe97c0f..872f78563204 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 454026466b85..12fbbca999f8 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -188,8 +188,6 @@ void RenderLineLayer::updateColorRamp() { return; } - colorRampTexture = std::nullopt; - if (colorRampTexture2D) { colorRampTexture2D.reset(); diff --git a/src/mbgl/renderer/layers/render_line_layer.hpp b/src/mbgl/renderer/layers/render_line_layer.hpp index 1e6dc8daee76..a994c28ddbfd 100644 --- a/src/mbgl/renderer/layers/render_line_layer.hpp +++ b/src/mbgl/renderer/layers/render_line_layer.hpp @@ -3,10 +3,9 @@ #include #include #include -#include +#include #include #include -#include #include #include @@ -58,8 +57,6 @@ class RenderLineLayer final : public RenderLayer { void updateColorRamp(); std::shared_ptr colorRamp; - std::optional colorRampTexture; - gfx::Texture2DPtr colorRampTexture2D; gfx::ShaderGroupPtr lineShaderGroup; diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index 6462e328e935..2bd1a3ba49b5 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -36,8 +36,7 @@ #include #include #include -#include -#include +#include #include #endif diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 6846f31c4f0c..35f9c9b8b69b 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index a6abe183b023..965b852b5e1f 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -1,8 +1,8 @@ #include #include +#include #include -#include #include #include #include diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 460e5d2278bc..5e72b914f856 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -11,6 +11,10 @@ #include #include +#if MLN_RENDER_BACKEND_OPENGL +#include +#endif + #if MLN_RENDER_BACKEND_METAL #include #include @@ -65,11 +69,6 @@ PaintParameters::PaintParameters(gfx::Context& context_, debugOptions(debugOptions_), timePoint(timePoint_), pixelRatio(pixelRatio_), -#ifndef NDEBUG - programs((debugOptions & MapDebugOptions::Overdraw) ? staticData_.overdrawPrograms : staticData_.programs), -#else - programs(staticData_.programs), -#endif shaders(*staticData_.shaders), frameCount(frameCount_) { pixelsToGLUnits = {{2.0f / state.getSize().width, -2.0f / state.getSize().height}}; @@ -242,7 +241,7 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) { vulkanContext.renderingStats().stencilUpdates++; } -#else // !MLN_RENDER_BACKEND_METAL +#else // MLN_RENDER_BACKEND_OPENGL auto program = staticData.shaders->getLegacyGroup().get(); if (!program) { @@ -290,10 +289,9 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) { static_cast(state.getZoom())), ClippingMaskProgram::computeAllAttributeBindings( *staticData.tileVertexBuffer, paintAttributeData, properties), - ClippingMaskProgram::TextureBindings{}, "clipping/" + util::toString(stencilID)); } -#endif // MLN_RENDER_BACKEND_METAL +#endif // MLN_RENDER_BACKEND_OPENGL } gfx::StencilMode PaintParameters::stencilModeForClipping(const UnwrappedTileID& tileID) const { diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 6bb5a13fcde7..545bdaf0b1ff 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -21,7 +21,6 @@ namespace mbgl { class UpdateParameters; class RenderStaticData; -class Programs; class TransformState; class ImageManager; class LineAtlas; @@ -82,9 +81,6 @@ class PaintParameters { float pixelRatio; std::array pixelsToGLUnits; - // Programs is, in effect, an immutable shader registry - Programs& programs; - // We're migrating to a dynamic one gfx::ShaderRegistry& shaders; gfx::DepthMode depthModeForSublayer(uint8_t n, gfx::DepthMaskType) const; diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 55b1f5ed1292..8fcb4c018c12 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/renderer/pattern_atlas.hpp b/src/mbgl/renderer/pattern_atlas.hpp index 240c07f326ea..486b2cd73c85 100644 --- a/src/mbgl/renderer/pattern_atlas.hpp +++ b/src/mbgl/renderer/pattern_atlas.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include diff --git a/src/mbgl/renderer/render_static_data.cpp b/src/mbgl/renderer/render_static_data.cpp index 56f5fdb65cfc..f94328c353cb 100644 --- a/src/mbgl/renderer/render_static_data.cpp +++ b/src/mbgl/renderer/render_static_data.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include namespace mbgl { @@ -49,16 +49,9 @@ gfx::VertexVector RenderStaticData::heatmapTextureVe return result; } -RenderStaticData::RenderStaticData(float pixelRatio, std::unique_ptr&& shaders_) - : programs(ProgramParameters{pixelRatio, false}), - shaders(std::move(shaders_)), - clippingMaskSegments(tileTriangleSegments()) -#ifndef NDEBUG - , - overdrawPrograms(ProgramParameters{pixelRatio, true}) -#endif -{ -} +RenderStaticData::RenderStaticData(std::unique_ptr&& shaders_) + : shaders(std::move(shaders_)), + clippingMaskSegments(tileTriangleSegments()) {} SegmentVector RenderStaticData::tileTriangleSegments() { SegmentVector segments; diff --git a/src/mbgl/renderer/render_static_data.hpp b/src/mbgl/renderer/render_static_data.hpp index bbbf6c88b732..a35bd6f982d3 100644 --- a/src/mbgl/renderer/render_static_data.hpp +++ b/src/mbgl/renderer/render_static_data.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -19,7 +18,7 @@ class UploadPass; class RenderStaticData { public: - RenderStaticData(float pixelRatio, std::unique_ptr&& shaders_); + RenderStaticData(std::unique_ptr&& shaders_); void upload(gfx::UploadPass&); @@ -46,16 +45,9 @@ class RenderStaticData { bool uploaded = false; Size backendSize; - // @TODO: Migrate away from and remove `Programs` - Programs programs; - std::unique_ptr shaders; const SegmentVector clippingMaskSegments; - -#ifndef NDEBUG - Programs overdrawPrograms; -#endif }; } // namespace mbgl diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp index fc842ef878a1..6f0dfd817464 100644 --- a/src/mbgl/renderer/render_tile.cpp +++ b/src/mbgl/renderer/render_tile.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp index 5fd313576aaa..bfd106f4dd2c 100644 --- a/src/mbgl/renderer/render_tile.hpp +++ b/src/mbgl/renderer/render_tile.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 3186e50170b5..b44d69b1a212 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -8,12 +8,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -158,10 +158,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, context.beginFrame(); if (!staticData) { - staticData = std::make_unique(pixelRatio, std::make_unique()); - - // Initialize legacy shader programs - staticData->programs.registerWith(*staticData->shaders); + staticData = std::make_unique(std::make_unique()); // Initialize shaders for drawables const auto programParameters = ProgramParameters{pixelRatio, false}; diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index b8d46892df2b..d0bdb3d87fd1 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/renderer/sources/render_image_source.hpp b/src/mbgl/renderer/sources/render_image_source.hpp index f542711038ad..9f9f6898bb64 100644 --- a/src/mbgl/renderer/sources/render_image_source.hpp +++ b/src/mbgl/renderer/sources/render_image_source.hpp @@ -26,7 +26,6 @@ class ImageSourceRenderData final : public RenderItem { const std::string& getName() const override { return name; } std::string name; void updateDebugDrawables(DebugLayerGroupMap&, PaintParameters&) const override {}; - mutable std::optional debugTexture; }; class RenderImageSource final : public RenderSource { diff --git a/src/mbgl/renderer/tile_render_data.hpp b/src/mbgl/renderer/tile_render_data.hpp index cd5cae4ecb0a..4f65567e5b9f 100644 --- a/src/mbgl/renderer/tile_render_data.hpp +++ b/src/mbgl/renderer/tile_render_data.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include diff --git a/src/mbgl/programs/attributes.hpp b/src/mbgl/shaders/attributes.hpp similarity index 100% rename from src/mbgl/programs/attributes.hpp rename to src/mbgl/shaders/attributes.hpp diff --git a/src/mbgl/programs/clipping_mask_program.hpp b/src/mbgl/shaders/gl/legacy/clipping_mask_program.hpp similarity index 83% rename from src/mbgl/programs/clipping_mask_program.hpp rename to src/mbgl/shaders/gl/legacy/clipping_mask_program.hpp index 210fb94efda5..ac4efc6b6a76 100644 --- a/src/mbgl/programs/clipping_mask_program.hpp +++ b/src/mbgl/shaders/gl/legacy/clipping_mask_program.hpp @@ -1,8 +1,8 @@ #pragma once -#include -#include -#include +#include +#include +#include #include namespace mbgl { @@ -12,7 +12,6 @@ class ClippingMaskProgram final : public Program, - TypeList<>, style::Properties<>> { public: static constexpr std::string_view Name{"ClippingMaskProgram"}; diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/shaders/gl/legacy/program.hpp similarity index 82% rename from src/mbgl/programs/program.hpp rename to src/mbgl/shaders/gl/legacy/program.hpp index 59772f3fe4d1..eba7a62c4849 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/shaders/gl/legacy/program.hpp @@ -1,23 +1,20 @@ #pragma once +#include #include #include #include #include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include -#include -#if MLN_RENDER_BACKEND_OPENGL -#include -#endif - namespace mbgl { namespace gfx { @@ -29,7 +26,6 @@ template class Program : public gfx::Shader { public: @@ -47,10 +43,7 @@ class Program : public gfx::Shader { using LayoutUniformValues = gfx::UniformValues; using UniformValues = gfx::UniformValues; - using TextureList = Textures; - using TextureBindings = gfx::TextureBindings; - - std::unique_ptr> program; + std::unique_ptr> programBase; Program([[maybe_unused]] const ProgramParameters& programParameters) { switch (gfx::Backend::GetType()) { @@ -64,7 +57,7 @@ class Program : public gfx::Shader { } #else // MLN_RENDER_BACKEND_OPENGL case gfx::Backend::Type::OpenGL: { - program = std::make_unique>(programParameters.withDefaultSource( + programBase = std::make_unique>(programParameters.withDefaultSource( {gfx::Backend::Type::OpenGL, shaders::ShaderSource::vertex, shaders::ShaderSource::fragment})); @@ -108,11 +101,10 @@ class Program : public gfx::Shader { const SegmentBase& segment, const UniformValues& uniformValues, const AttributeBindings& allAttributeBindings, - const TextureBindings& textureBindings, const std::string& layerID) { static_assert(Primitive == gfx::PrimitiveTypeOf::value, "incompatible draw mode"); - if (!program) { + if (!programBase) { return; } @@ -121,20 +113,19 @@ class Program : public gfx::Shader { drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } - program->draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - uniformValues, - drawScopeIt->second, - allAttributeBindings.offset(segment.vertexOffset), - textureBindings, - indexBuffer, - segment.indexOffset, - segment.indexLength); + programBase->draw(context, + renderPass, + drawMode, + depthMode, + stencilMode, + colorMode, + cullFaceMode, + uniformValues, + drawScopeIt->second, + allAttributeBindings.offset(segment.vertexOffset), + indexBuffer, + segment.indexOffset, + segment.indexLength); } template @@ -149,11 +140,10 @@ class Program : public gfx::Shader { const SegmentVector& segments, const UniformValues& uniformValues, const AttributeBindings& allAttributeBindings, - const TextureBindings& textureBindings, const std::string& layerID) { static_assert(Primitive == gfx::PrimitiveTypeOf::value, "incompatible draw mode"); - if (!program) { + if (!programBase) { return; } @@ -164,20 +154,19 @@ class Program : public gfx::Shader { drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } - program->draw(context, - renderPass, - drawMode, - depthMode, - stencilMode, - colorMode, - cullFaceMode, - uniformValues, - drawScopeIt->second, - allAttributeBindings.offset(segment.vertexOffset), - textureBindings, - indexBuffer, - segment.indexOffset, - segment.indexLength); + programBase->draw(context, + renderPass, + drawMode, + depthMode, + stencilMode, + colorMode, + cullFaceMode, + uniformValues, + drawScopeIt->second, + allAttributeBindings.offset(segment.vertexOffset), + indexBuffer, + segment.indexOffset, + segment.indexLength); } } }; diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/shaders/gl/legacy/program_base.hpp similarity index 88% rename from src/mbgl/gl/program.hpp rename to src/mbgl/shaders/gl/legacy/program_base.hpp index 22d97a062185..bda40764f773 100644 --- a/src/mbgl/gl/program.hpp +++ b/src/mbgl/shaders/gl/legacy/program_base.hpp @@ -1,22 +1,19 @@ #pragma once -#include +#include +#include +#include #include #include #include #include -#include -#include -#include #include #include #include -#include +#include +#include #include - #include -#include -#include #include @@ -24,15 +21,19 @@ namespace mbgl { namespace gl { template -class Program final : public gfx::Program { +class ProgramBase { public: using AttributeList = typename Name::AttributeList; using UniformList = typename Name::UniformList; - using TextureList = typename Name::TextureList; - Program(ProgramParameters programParameters_) + ProgramBase(ProgramParameters programParameters_) : programParameters(std::move(programParameters_)) {} + ProgramBase(ProgramBase&&) = delete; + ProgramBase(const ProgramBase&) = delete; + ProgramBase& operator=(ProgramBase&&) = delete; + ProgramBase& operator=(const ProgramBase&) = delete; + const ProgramParameters programParameters; class Instance { @@ -45,8 +46,6 @@ class Program final : public gfx::Program { attributeLocations.getFirstAttribName())) { attributeLocations.queryLocations(program); uniformStates.queryLocations(program); - // Texture units are specified via uniforms as well, so we need query their locations - textureStates.queryLocations(program); } static std::unique_ptr createInstance(gl::Context& context, @@ -79,7 +78,6 @@ class Program final : public gfx::Program { UniqueProgram program; gl::AttributeLocations attributeLocations; gl::UniformStates uniformStates; - gl::TextureStates textureStates; }; void draw(gfx::Context& genericContext, @@ -92,10 +90,9 @@ class Program final : public gfx::Program { const gfx::UniformValues& uniformValues, gfx::DrawScope& drawScope, const gfx::AttributeBindings& attributeBindings, - const gfx::TextureBindings& textureBindings, const gfx::IndexBuffer& indexBuffer, std::size_t indexOffset, - std::size_t indexLength) override { + std::size_t indexLength) { auto& context = static_cast(genericContext); context.setDepthMode(depthMode); @@ -124,8 +121,6 @@ class Program final : public gfx::Program { instance.uniformStates.bind(uniformValues); - instance.textureStates.bind(context, textureBindings); - auto& vertexArray = drawScope.getResource().vertexArray; vertexArray.bind(context, indexBuffer, instance.attributeLocations.toBindingArray(attributeBindings)); diff --git a/src/mbgl/programs/programs.cpp b/src/mbgl/shaders/gl/legacy/programs.cpp similarity index 93% rename from src/mbgl/programs/programs.cpp rename to src/mbgl/shaders/gl/legacy/programs.cpp index 2f7591b8ade1..118b829e97f8 100644 --- a/src/mbgl/programs/programs.cpp +++ b/src/mbgl/shaders/gl/legacy/programs.cpp @@ -1,4 +1,5 @@ -#include +#include +#include #include #include diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/shaders/gl/legacy/programs.hpp similarity index 82% rename from src/mbgl/programs/programs.hpp rename to src/mbgl/shaders/gl/legacy/programs.hpp index 136209e255e8..ddb7cd8ce9d7 100644 --- a/src/mbgl/programs/programs.hpp +++ b/src/mbgl/shaders/gl/legacy/programs.hpp @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include #include #include diff --git a/src/mbgl/shaders/gl/shader_program_gl.cpp b/src/mbgl/shaders/gl/shader_program_gl.cpp index a5b3a668c4bb..b8ac76cbc2bf 100644 --- a/src/mbgl/shaders/gl/shader_program_gl.cpp +++ b/src/mbgl/shaders/gl/shader_program_gl.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/shaders/mtl/shader_program.cpp b/src/mbgl/shaders/mtl/shader_program.cpp index 1f525d8921c3..c75fe60edd0e 100644 --- a/src/mbgl/shaders/mtl/shader_program.cpp +++ b/src/mbgl/shaders/mtl/shader_program.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/programs/program_parameters.cpp b/src/mbgl/shaders/program_parameters.cpp similarity index 98% rename from src/mbgl/programs/program_parameters.cpp rename to src/mbgl/shaders/program_parameters.cpp index d5ce6182eddc..2a40a51b19bd 100644 --- a/src/mbgl/programs/program_parameters.cpp +++ b/src/mbgl/shaders/program_parameters.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/mbgl/programs/segment.hpp b/src/mbgl/shaders/segment.hpp similarity index 100% rename from src/mbgl/programs/segment.hpp rename to src/mbgl/shaders/segment.hpp diff --git a/src/mbgl/programs/uniforms.hpp b/src/mbgl/shaders/uniforms.hpp similarity index 100% rename from src/mbgl/programs/uniforms.hpp rename to src/mbgl/shaders/uniforms.hpp diff --git a/src/mbgl/shaders/vulkan/shader_program.cpp b/src/mbgl/shaders/vulkan/shader_program.cpp index a0b29b5ebaf3..b4d000bbab5e 100644 --- a/src/mbgl/shaders/vulkan/shader_program.cpp +++ b/src/mbgl/shaders/vulkan/shader_program.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/style/layers/background_layer_properties.hpp b/src/mbgl/style/layers/background_layer_properties.hpp index 63ce00bfa884..7f4c150cea94 100644 --- a/src/mbgl/style/layers/background_layer_properties.hpp +++ b/src/mbgl/style/layers/background_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/circle_layer_properties.hpp b/src/mbgl/style/layers/circle_layer_properties.hpp index 37e6007b0c7c..b64c091e8fe2 100644 --- a/src/mbgl/style/layers/circle_layer_properties.hpp +++ b/src/mbgl/style/layers/circle_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp b/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp index c7c46666100e..2808b95fd67c 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp +++ b/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/fill_layer_properties.hpp b/src/mbgl/style/layers/fill_layer_properties.hpp index 7073d909a536..ee72d09fb499 100644 --- a/src/mbgl/style/layers/fill_layer_properties.hpp +++ b/src/mbgl/style/layers/fill_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/heatmap_layer_properties.hpp b/src/mbgl/style/layers/heatmap_layer_properties.hpp index 5997f5b7cd8c..ae0b352af95f 100644 --- a/src/mbgl/style/layers/heatmap_layer_properties.hpp +++ b/src/mbgl/style/layers/heatmap_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/hillshade_layer_properties.hpp b/src/mbgl/style/layers/hillshade_layer_properties.hpp index cf073f1ce501..a87526548e7a 100644 --- a/src/mbgl/style/layers/hillshade_layer_properties.hpp +++ b/src/mbgl/style/layers/hillshade_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/layer_properties.hpp.ejs b/src/mbgl/style/layers/layer_properties.hpp.ejs index c81bf6133ad2..713a9ec3b78f 100644 --- a/src/mbgl/style/layers/layer_properties.hpp.ejs +++ b/src/mbgl/style/layers/layer_properties.hpp.ejs @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/line_layer_properties.hpp b/src/mbgl/style/layers/line_layer_properties.hpp index 09615261ae18..6bc0dad7fac9 100644 --- a/src/mbgl/style/layers/line_layer_properties.hpp +++ b/src/mbgl/style/layers/line_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/location_indicator_layer_properties.hpp b/src/mbgl/style/layers/location_indicator_layer_properties.hpp index 95ad7b6bd8a3..e41979fefd5b 100644 --- a/src/mbgl/style/layers/location_indicator_layer_properties.hpp +++ b/src/mbgl/style/layers/location_indicator_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/raster_layer_properties.hpp b/src/mbgl/style/layers/raster_layer_properties.hpp index 5da2ce39d586..444cc12a89a8 100644 --- a/src/mbgl/style/layers/raster_layer_properties.hpp +++ b/src/mbgl/style/layers/raster_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/style/layers/symbol_layer_properties.hpp b/src/mbgl/style/layers/symbol_layer_properties.hpp index b4bd6d254cb5..bb418eea1618 100644 --- a/src/mbgl/style/layers/symbol_layer_properties.hpp +++ b/src/mbgl/style/layers/symbol_layer_properties.hpp @@ -10,8 +10,8 @@ #include #include #include -#include -#include +#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index 138ecc27b1a6..de49123b40f6 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 22ca8ca713a3..f5a8ba33100a 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include #include @@ -16,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -415,13 +415,6 @@ std::unique_ptr Context::createOffscreenTexture(Size size return createOffscreenTexture(size, type, false, false); } -std::unique_ptr Context::createTextureResource(Size, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - throw std::runtime_error("Vulkan TextureResource not implemented"); - return nullptr; -} - std::unique_ptr Context::createRenderbufferResource(gfx::RenderbufferPixelType, Size) { return std::make_unique(); } diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index 257cea6b64f5..2fedddc32bfd 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/vulkan/drawable_impl.hpp b/src/mbgl/vulkan/drawable_impl.hpp index b74b5d5f6ce9..1f345dc0c64e 100644 --- a/src/mbgl/vulkan/drawable_impl.hpp +++ b/src/mbgl/vulkan/drawable_impl.hpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/vulkan/upload_pass.cpp b/src/mbgl/vulkan/upload_pass.cpp index d2f6a3564919..448737301084 100644 --- a/src/mbgl/vulkan/upload_pass.cpp +++ b/src/mbgl/vulkan/upload_pass.cpp @@ -50,31 +50,6 @@ void UploadPass::updateIndexBufferResource(gfx::IndexBufferResource& resource, c static_cast(resource).get().update(data, size, /*offset=*/0); } -std::unique_ptr UploadPass::createTextureResource(const Size, - const void*, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::createTextureResource not implemented on Vulkan!"); -} - -void UploadPass::updateTextureResource( - gfx::TextureResource&, const Size, const void*, gfx::TexturePixelType, gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::updateTextureResource not implemented on Vulkan!"); -} - -void UploadPass::updateTextureResourceSub(gfx::TextureResource&, - const uint16_t, - const uint16_t, - const Size, - const void*, - gfx::TexturePixelType, - gfx::TextureChannelDataType) { - assert(false); - throw std::runtime_error("UploadPass::updateTextureResourceSub not implemented on Vulkan!"); -} - struct VertexBuffer : public gfx::VertexBufferBase { ~VertexBuffer() override = default; diff --git a/test/renderer/shader_registry.test.cpp b/test/renderer/shader_registry.test.cpp index e8a308f6948d..e4dee245a1ca 100644 --- a/test/renderer/shader_registry.test.cpp +++ b/test/renderer/shader_registry.test.cpp @@ -21,7 +21,10 @@ #include #include #include -#include + +#ifdef MLN_RENDER_BACKEND_OPENGL +#include +#endif using namespace mbgl; @@ -206,6 +209,7 @@ TEST(ShaderRegistry, NamedReplace) { ASSERT_NE(progA, progB); } +#ifdef MLN_RENDER_BACKEND_OPENGL // Test replacing an actual program instance with a similar instance TEST(ShaderRegistry, DISABLED_GLSLReplacement_NoOp) { MapInstance::ShaderAndStyleObserver observer; @@ -323,3 +327,4 @@ void main() { auto img = map.frontend.render(map.adapter).image; test::checkImage("test/fixtures/shader_registry/glsl_replace_2", img, 0.005, 0.1); } +#endif // MLN_RENDER_BACKEND_OPENGL From f5cfbc898d589cab911c230c9757f96e8425a8e3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 16 May 2025 18:32:22 +0200 Subject: [PATCH 197/339] Do not check out tag in android-release.yml (#3480) --- .github/scripts/validate-version.sh | 4 +-- .github/workflows/android-release.yml | 10 +------- .../android/scripts/ensure-code-revision.sh | 25 ------------------- 3 files changed, 3 insertions(+), 36 deletions(-) delete mode 100755 platform/android/scripts/ensure-code-revision.sh diff --git a/.github/scripts/validate-version.sh b/.github/scripts/validate-version.sh index 124ee1820bc1..d267073285b9 100755 --- a/.github/scripts/validate-version.sh +++ b/.github/scripts/validate-version.sh @@ -3,7 +3,7 @@ validate_version() { local version="$1" if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-pre.*)?$ ]]; then - echo "::error::Invalid version format in VERSION file. Expected: X.Y.Z or X.Y.Z-pre*" + echo "::error::Invalid version '$version' in $(realpath VERSION). Expected: X.Y.Z or X.Y.Z-pre*" return 1 fi return 0 @@ -11,7 +11,7 @@ validate_version() { version=$(cat VERSION 2>/dev/null) if [ -z "$version" ]; then - echo "::error::VERSION file not found or empty" + echo "::error::No VERSION file found or empty in $PWD" exit 1 fi diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 619e8130bdf8..b81f425253a5 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -30,22 +30,14 @@ jobs: cmakeVersion: 3.24.1 ninjaVersion: latest - - name: Ensure source code revision - run: scripts/ensure-code-revision.sh - working-directory: platform/android - shell: bash - - name: npm install run: npm install --ignore-scripts - working-directory: platform/android - name: Android nitpick run: make run-android-nitpick - name: Validate and set version - working-directory: platform/android - run: | - ../../.github/scripts/validate-version.sh + run: ../../.github/scripts/validate-version.sh - name: Build package run: | diff --git a/platform/android/scripts/ensure-code-revision.sh b/platform/android/scripts/ensure-code-revision.sh deleted file mode 100755 index 921b7136e319..000000000000 --- a/platform/android/scripts/ensure-code-revision.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail -set -u - -function step { >&2 echo -e "\033[1m\033[36m* $@\033[0m"; } -function finish { >&2 echo -en "\033[0m"; } -trap finish EXIT - -VERSION_TAG=${VERSION_TAG:-''} -if [[ -z ${VERSION_TAG} ]]; then - step "Determining version number from most recent relevant git tag…" - VERSION_TAG=$( git describe --tags --match=android-v*.*.* --abbrev=0 ) - echo "Found tag: ${VERSION_TAG}" -fi - -if [[ $( echo ${VERSION_TAG} | grep --invert-match android-v ) ]]; then - echo "Error: ${VERSION_TAG} is not a valid android version tag" - echo "VERSION_TAG should be in format: android-vX.X.X-pre.X" - exit 1 -fi - -step "Checking out source code at ${VERSION_TAG}" -git checkout ${VERSION_TAG} From 2ddad225c1c4c7ff79804c3ecabdc043ea19c6e8 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Sat, 17 May 2025 12:30:45 +0300 Subject: [PATCH 198/339] Remove some of unused legacy uniforms (#3481) --- src/mbgl/shaders/uniforms.hpp | 41 ++++------------------------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/src/mbgl/shaders/uniforms.hpp b/src/mbgl/shaders/uniforms.hpp index bf928cde5e0c..545429f4736b 100644 --- a/src/mbgl/shaders/uniforms.hpp +++ b/src/mbgl/shaders/uniforms.hpp @@ -7,17 +7,14 @@ namespace mbgl { namespace uniforms { -// Uniforms common to several shaders. - +// Legacy matrix uniform used in legacy shader ClippingMaskProgram MBGL_DEFINE_UNIFORM_MATRIX(double, 4, matrix); + +// Legacy uniforms needed by layer properties templates, not used in shaders. +// Shaders are using UBOs in drawable architecture. MBGL_DEFINE_UNIFORM_SCALAR(float, opacity); MBGL_DEFINE_UNIFORM_SCALAR(Color, color); MBGL_DEFINE_UNIFORM_SCALAR(float, blur); - -MBGL_DEFINE_UNIFORM_SCALAR(float, zoom); -MBGL_DEFINE_UNIFORM_SCALAR(float, collision_y_stretch); -MBGL_DEFINE_UNIFORM_SCALAR(float, pitch); -MBGL_DEFINE_UNIFORM_SCALAR(float, bearing); MBGL_DEFINE_UNIFORM_SCALAR(float, radius); MBGL_DEFINE_UNIFORM_SCALAR(float, stroke_width); MBGL_DEFINE_UNIFORM_SCALAR(Color, stroke_color); @@ -33,39 +30,9 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, width); MBGL_DEFINE_UNIFORM_SCALAR(float, floorwidth); MBGL_DEFINE_UNIFORM_SCALAR(float, gapwidth); MBGL_DEFINE_UNIFORM_SCALAR(float, offset); -MBGL_DEFINE_UNIFORM_SCALAR(Size, world); -MBGL_DEFINE_UNIFORM_SCALAR(Size, texsize); -MBGL_DEFINE_UNIFORM_SCALAR(Size, texsize_icon); -MBGL_DEFINE_UNIFORM_SCALAR(bool, pitch_with_map); -MBGL_DEFINE_UNIFORM_SCALAR(float, camera_to_center_distance); -MBGL_DEFINE_UNIFORM_SCALAR(float, device_pixel_ratio); -MBGL_DEFINE_UNIFORM_SCALAR(float, fade); -MBGL_DEFINE_UNIFORM_SCALAR(float, fade_change); MBGL_DEFINE_UNIFORM_SCALAR(float, weight); - -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, extrude_scale); - -namespace heatmap { -MBGL_DEFINE_UNIFORM_SCALAR(float, extrude_scale); -} // namespace heatmap - MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 4, pattern_from); MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 4, pattern_to); -MBGL_DEFINE_UNIFORM_VECTOR(float, 4, scale); -MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 2, pattern_tl_a); -MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 2, pattern_br_a); -MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 2, pattern_tl_b); -MBGL_DEFINE_UNIFORM_VECTOR(uint16_t, 2, pattern_br_b); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, pattern_size_a); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, pattern_size_b); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, pixel_coord_upper); -MBGL_DEFINE_UNIFORM_VECTOR(float, 2, pixel_coord_lower); - -MBGL_DEFINE_UNIFORM_SCALAR(float, mix); -MBGL_DEFINE_UNIFORM_SCALAR(float, scale_a); -MBGL_DEFINE_UNIFORM_SCALAR(float, scale_b); -MBGL_DEFINE_UNIFORM_SCALAR(float, tile_units_to_pixels); -MBGL_DEFINE_UNIFORM_SCALAR(float, overscale_factor); } // namespace uniforms } // namespace mbgl From 08bdeeb103fd8c3d4604b5a072ce69b86bd96865 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Sun, 18 May 2025 16:46:47 +0200 Subject: [PATCH 199/339] add `maplibre-native-base` to `maplibre-native-headers.tar.gz` included in the core release (#3482) --- .github/workflows/core-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index 1f2d6c783da0..169c74d1b582 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -19,6 +19,7 @@ jobs: run: | tar czf maplibre-native-headers.tar.gz \ include \ + vendor/maplibre-native-base/include \ vendor/maplibre-native-base/deps/variant/include \ vendor/maplibre-native-base/deps/geometry.hpp/include - name: Create Release From 8e3899df391b21f9cd1786194cb6fbfa318795da Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 19 May 2025 00:21:03 +0200 Subject: [PATCH 200/339] Use TARGET_OBJECTS generator expression in CMake for core builds (#3484) --- platform/linux/linux.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 4289fd57a63c..e2a664482469 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -142,8 +142,8 @@ target_include_directories( include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) -if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0) - message(STATUS "ICU not found or too old, using builtin.") +if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) + message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requestd, using builtin.") set(MLN_USE_BUILTIN_ICU TRUE) include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) @@ -167,7 +167,7 @@ target_link_libraries( ${WEBP_LIBRARIES} $<$>:ICU::i18n> $<$>:ICU::uc> - $<$:mbgl-vendor-icu> + $<$:$,$,mbgl-vendor-icu>> PNG::PNG mbgl-vendor-nunicode mbgl-vendor-sqlite From fece07e3032083dade581fea93a30973efe93b9d Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 19 May 2025 14:12:28 +0300 Subject: [PATCH 201/339] Fix swapchain out of bounds (#3486) --- src/mbgl/vulkan/renderable_resource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mbgl/vulkan/renderable_resource.cpp b/src/mbgl/vulkan/renderable_resource.cpp index eb46f5deb078..5174c6415411 100644 --- a/src/mbgl/vulkan/renderable_resource.cpp +++ b/src/mbgl/vulkan/renderable_resource.cpp @@ -160,8 +160,8 @@ void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { colorFormat = swapchainCreateInfo.imageFormat; extent = swapchainCreateInfo.imageExtent; - swapchainSemaphores.reserve(swapchainImageCount); - for (uint32_t index = 0; index < swapchainImageCount; ++index) { + swapchainSemaphores.reserve(swapchainImages.size()); + for (uint32_t index = 0; index < swapchainImages.size(); ++index) { swapchainSemaphores.emplace_back(device->createSemaphoreUnique({})); backend.setDebugName(swapchainSemaphores.back().get(), "SurfaceSemaphore_" + std::to_string(index)); } From e97687bc5598174d5ece0e0b3b00bd52763725b2 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 21 May 2025 19:46:55 +0300 Subject: [PATCH 202/339] Fix vulkan scaling issue (#3489) --- src/mbgl/vulkan/pipeline.cpp | 19 +++++++++++++++++++ src/mbgl/vulkan/renderable_resource.cpp | 6 +++--- src/mbgl/vulkan/renderer_backend.cpp | 3 +-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/mbgl/vulkan/pipeline.cpp b/src/mbgl/vulkan/pipeline.cpp index 29042131d5d0..db1d2645a354 100644 --- a/src/mbgl/vulkan/pipeline.cpp +++ b/src/mbgl/vulkan/pipeline.cpp @@ -6,6 +6,8 @@ namespace mbgl { namespace vulkan { +#define USE_DYNAMIC_VIEWPORT 0 + vk::Format PipelineInfo::vulkanFormat(const gfx::AttributeDataType& value) { switch (value) { case gfx::AttributeDataType::Byte: @@ -398,6 +400,10 @@ std::size_t PipelineInfo::hash() const { stencilDepthFail, wideLines, VkRenderPass(renderPass), +#if !USE_DYNAMIC_VIEWPORT + viewExtent.width, + viewExtent.height, +#endif vertexInputHash); } @@ -415,6 +421,14 @@ void PipelineInfo::setDynamicValues(const RendererBackend& backend, const vk::Un if (backend.getDeviceFeatures().wideLines && wideLines) { buffer->setLineWidth(dynamicValues.lineWidth); } + +#if USE_DYNAMIC_VIEWPORT + const vk::Viewport viewport(0.0f, 0.0f, viewExtent.width, viewExtent.height, 0.0f, 1.0f); + const vk::Rect2D scissorRect({}, {viewExtent.width, viewExtent.height}); + + buffer->setViewport(0, viewport); + buffer->setScissor(0, scissorRect); +#endif } std::vector PipelineInfo::getDynamicStates(const RendererBackend& backend) const { @@ -434,6 +448,11 @@ std::vector PipelineInfo::getDynamicStates(const RendererBacke dynamicStates.push_back(vk::DynamicState::eLineWidth); } +#if USE_DYNAMIC_VIEWPORT + dynamicStates.push_back(vk::DynamicState::eViewport); + dynamicStates.push_back(vk::DynamicState::eScissor); +#endif + return dynamicStates; } diff --git a/src/mbgl/vulkan/renderable_resource.cpp b/src/mbgl/vulkan/renderable_resource.cpp index 5174c6415411..f9bc99120286 100644 --- a/src/mbgl/vulkan/renderable_resource.cpp +++ b/src/mbgl/vulkan/renderable_resource.cpp @@ -230,7 +230,7 @@ void SurfaceRenderableResource::initDepthStencil() { depthAllocation->imageView = device->createImageViewUnique(imageViewCreateInfo); - backend.setDebugName(vk::Image(depthAllocation->image), "SwapchainDepthImage"); + backend.setDebugName(depthAllocation->image, "SwapchainDepthImage"); backend.setDebugName(depthAllocation->imageView.get(), "SwapchainDepthImageView"); } @@ -309,8 +309,8 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { swapchainImageViews.push_back(device->createImageViewUnique(imageViewCreateInfo)); const size_t index = swapchainImageViews.size() - 1; - backend.setDebugName(vk::Image(image), "SwapchainImage_" + std::to_string(index)); - backend.setDebugName(vk::Image(image), "SwapchainImageView_" + std::to_string(index)); + backend.setDebugName(image, "SwapchainImage_" + std::to_string(index)); + backend.setDebugName(image, "SwapchainImageView_" + std::to_string(index)); } // depth resources diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index 9f4de91b30f4..a1c7d3ba7567 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -331,8 +331,7 @@ void RendererBackend::initDebug() { const vk::DebugUtilsMessageTypeFlagsEXT type = vk::DebugUtilsMessageTypeFlagsEXT() | vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | - vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | - vk::DebugUtilsMessageTypeFlagBitsEXT::eDeviceAddressBinding; + vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance; const auto createInfo = vk::DebugUtilsMessengerCreateInfoEXT().setMessageSeverity(severity).setMessageType(type).setPfnUserCallback( From 89f453604b997a95bcba3d84312efd45b986e871 Mon Sep 17 00:00:00 2001 From: Nathan Gass Date: Sun, 25 May 2025 15:50:56 +0200 Subject: [PATCH 203/339] also use MLN_WITH_GLFW in linux.cmake (#3492) --- platform/linux/linux.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index e2a664482469..0c54b5d3362c 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -175,7 +175,9 @@ target_link_libraries( add_subdirectory(${PROJECT_SOURCE_DIR}/bin) add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) -add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +if(MLN_WITH_GLFW) + add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +endif() if(MLN_WITH_NODE) add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node) endif() From 5ec8430fa38a890633b5145951ef350b7eb18206 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sun, 25 May 2025 22:21:09 +0200 Subject: [PATCH 204/339] Release workflow fixes, release MapLibre Android 11.9.0 (#3491) --- .github/workflows/android-ci.yml | 11 ++- .github/workflows/android-release.yml | 2 +- platform/android/CHANGELOG.md | 20 +++++ platform/android/VERSION | 2 +- .../scripts/release-notes-github.md.ejs | 1 - platform/android/scripts/release-notes.mjs | 81 ++++++------------- 6 files changed, 56 insertions(+), 61 deletions(-) delete mode 100644 platform/android/scripts/release-notes-github.md.ejs diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 9b6716580279..c56d6c37210a 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -344,12 +344,19 @@ jobs: - android-build-cpp-test - android-build-render-test steps: + - name: Set success=true + if: needs.android-build.result == 'success' && needs.android-build-cpp-test.result == 'success' && needs.android-build-render-test.result == 'success' + run: echo success=true > "$GITHUB_ENV" + - name: Mark result as failed - if: needs.android-build.result != 'success' || needs.android-build-cpp-test.result != 'success' || needs.android-build-render-test.result != 'success' + if: env.success != 'true' run: exit 1 + - uses: actions/checkout@v4 + if: needs.android-build.outputs.make_release == 'true' && env.success + - name: Trigger release - if: needs.android-build.outputs.make_release == 'true' && needs.android-build.result == 'success' && needs.android-build-cpp-test.result == 'success' && needs.android-build-render-test.result == 'success' + if: needs.android-build.outputs.make_release == 'true' && env.success run: gh workflow run android-release.yml --ref ${{ github.sha }} env: GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index b81f425253a5..8a5aa7bb74af 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -51,7 +51,7 @@ jobs: id: prepare_release run: | RELEASE_NOTES_PATH="${PWD}/release_notes.txt" - node scripts/release-notes.mjs > "${RELEASE_NOTES_PATH}" + node scripts/release-notes.mjs ${{ env.version }} > "${RELEASE_NOTES_PATH}" echo release_notes="${RELEASE_NOTES_PATH}" >> "$GITHUB_OUTPUT" echo version_tag=android-v${{ env.version }} >> "$GITHUB_OUTPUT" shell: bash diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index e83bd2f7bdd8..cfa963c2fb50 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog MapLibre Native for Android +## main + +### ✨ Features and improvements + +### 🐞 Bug fixes + +## 11.9.0 + +### ✨ Features and improvements + +- Add dynamic texture atlas ([#3198](https://github.com/maplibre/maplibre-native/pull/3198)). +- Remove some of unused legacy uniforms ([#3481](https://github.com/maplibre/maplibre-native/pull/3481)). + +### 🐞 Bug fixes + +- Fix vulkan scaling issue ([#3489](https://github.com/maplibre/maplibre-native/pull/3489)). +- Fix swapchain out of bounds ([#3486](https://github.com/maplibre/maplibre-native/pull/3486)). +- Fix validation error reported by VulkanSDK 1.4.313.0 ([#3471](https://github.com/maplibre/maplibre-native/pull/3471)).P + ## 11.9.0-pre0 Pre-release to test out the new [dynamic texture atlas](https://github.com/maplibre/maplibre-native/pull/3198). This should result in a memory reduction. Please [open an issue](https://github.com/maplibre/maplibre-native/issues) if you encounter any problems. @@ -10,6 +29,7 @@ Pre-release to test out the new [dynamic texture atlas](https://github.com/mapli - Update NDK to 28.1.13356709 ([#3450](https://github.com/maplibre/maplibre-native/pull/3450)). - Add support to range requests in AssetFileSource ([#3461](https://github.com/maplibre/maplibre-native/pull/3404)). +- Force PMTiles metadata to always have XYZ tile scheme ([#3403](https://github.com/maplibre/maplibre-native/pull/3403)). ### 🐞 Bug fixes diff --git a/platform/android/VERSION b/platform/android/VERSION index 330c0965226e..ba9aff72cbbe 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.9.0-pre0 +11.9.0 diff --git a/platform/android/scripts/release-notes-github.md.ejs b/platform/android/scripts/release-notes-github.md.ejs deleted file mode 100644 index 83042c6dd411..000000000000 --- a/platform/android/scripts/release-notes-github.md.ejs +++ /dev/null @@ -1 +0,0 @@ -<%-CHANGELOG-%> diff --git a/platform/android/scripts/release-notes.mjs b/platform/android/scripts/release-notes.mjs index 6867a6452eb4..d771aeccb48e 100755 --- a/platform/android/scripts/release-notes.mjs +++ b/platform/android/scripts/release-notes.mjs @@ -1,73 +1,42 @@ import fs from 'node:fs'; import { execSync } from 'node:child_process'; -import ejs from 'ejs'; -import _ from 'lodash'; -import semver from 'semver'; const changelogPath = 'CHANGELOG.md'; const changelog = fs.readFileSync(changelogPath, 'utf8'); -/* - Find current and immediately previous releases by parsing git tags. -*/ -let currentVersion = execSync('git describe --tags --match=android-v*.*.* --abbrev=0') - .toString() - .trim() - .replace('android-v', ''); +function usage() { + console.error(`Usage ${process.argv[0]} ${process.argv[1]} current-version`); + process.exit(1); +} + +if (process.argv.length !== 3) { + usage(); +} -let gitTags = execSync('git tag --list android-v*.*.*') - .toString() - .split('\n') - .map(function (tag) { - tag = tag.replace('android-v', '').trim(); - return semver.clean(tag); - }); -let previousVersion = semver.maxSatisfying(gitTags, "<" + currentVersion); +let currentVersion = process.argv[2]; +if (typeof currentVersion !== 'string') { + usage(); +} /* Parse the raw changelog text and split it into individual releases. - - This regular expression: - - Matches lines starting with "## x.x.x". - - Groups the version number. - - Skips the (optional) release date. - - Groups the changelog content. - - Ends when another "## x.x.x" is found. */ -const regex = /^## (\d+\.\d+\.\d+).*?\n(.+?)(?=\n^## \d+\.\d+\.\d+.*?\n)/gms; +const regex = /^## (\d+\.\d+\.\d+(?:-[^\s]+)?).*?\n(.+?)(?=\n^## \d+\.\d+\.\d+(?:-[^\s]+)?.*?\n)/gms; -let releaseNotes = []; +let releaseNotes = {}; let match; while (match = regex.exec(changelog)) { - releaseNotes.push({ - 'version': match[1], - 'changelog': match[2].trim(), - }); + const version = match[1]; + const changelog = match[2].trim(); + releaseNotes[version] = changelog; } -/* - Match the current tag with the most appropriate release notes. -*/ -const versionsInReleaseNotes = _.map(releaseNotes, 'version'); -const bestReleaseNotesForCurrentVersion = semver.minSatisfying(versionsInReleaseNotes, ">=" + currentVersion); -const currentReleaseNotes = _.find(releaseNotes, { version: bestReleaseNotesForCurrentVersion }); - -if (!currentReleaseNotes) { - console.error('Could not find a release section satisfying %s in %s — did you forget to rename the "main" section to %s?', currentVersion, changelogPath, currentVersion.split("-")[0]); - process.exit(1); +if (releaseNotes[currentVersion]) { + process.stdout.write(releaseNotes[currentVersion]); +} else if (currentVersion.includes("pre")) { + console.error(`No release notes found for version ${currentVersion}, ignoring since pre release.`); + process.exit(0); +} else { + console.error(`No release notes found for version ${currentVersion}, please update the changelog.`); + process.exit(1); } - -/* - Fill and print the release notes template. -*/ -let templatedReleaseNotes; - -templatedReleaseNotes = ejs.render(fs.readFileSync('scripts/release-notes-github.md.ejs', 'utf8'), { - 'CURRENTVERSION': currentVersion, - 'PREVIOUSVERSION': previousVersion, - 'CHANGELOG': currentReleaseNotes.changelog, - 'isPrerelease': semver.prerelease(currentVersion) -}); -templatedReleaseNotes = templatedReleaseNotes.trimEnd(); - -process.stdout.write(templatedReleaseNotes); From 08eb760acdf88692139cc9d777ed95074662387e Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 27 May 2025 16:15:56 +0300 Subject: [PATCH 205/339] Add action journal (#3409) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bart Louwers --- .github/workflows/android-ci.yml | 2 +- .gitmodules | 3 + BUILD.bazel | 3 + CMakeLists.txt | 10 +- bazel/core.bzl | 10 + include/mbgl/map/map.hpp | 14 +- include/mbgl/util/action_journal.hpp | 68 +++ include/mbgl/util/action_journal_options.hpp | 101 +++ include/mbgl/util/chrono.hpp | 3 + .../MapLibreAndroid/src/cpp/CMakeLists.txt | 2 + .../MapLibreAndroid/src/cpp/jni_native.cpp | 2 + .../src/cpp/native_map_options.cpp | 43 ++ .../src/cpp/native_map_options.hpp | 25 + .../src/cpp/native_map_view.cpp | 67 +- .../src/cpp/native_map_view.hpp | 10 +- .../maplibre/android/maps/MapLibreMap.java | 43 ++ .../android/maps/MapLibreMapOptions.java | 144 +++++ .../org/maplibre/android/maps/MapView.java | 8 +- .../org/maplibre/android/maps/NativeMap.java | 6 + .../android/maps/NativeMapOptions.java | 56 ++ .../maplibre/android/maps/NativeMapView.java | 54 +- .../src/main/res-public/values/public.xml | 5 + .../src/main/res/values/attrs.xml | 5 + .../java/org/maplibre/android/MapLibreTest.kt | 3 + .../maplibre/android/maps/BaseLayerTest.kt | 2 +- .../android/maps/NativeMapViewTest.kt | 4 +- .../activity/events/ObserverActivity.kt | 51 +- .../main/res/layout/activity_map_events.xml | 29 + .../docs/observability/action-journal.md | 80 +++ .../docs/observability/observe-map-events.md | 21 + platform/darwin/bazel/files.bzl | 5 + platform/darwin/src/MLNActionJournalOptions.h | 35 ++ .../darwin/src/MLNActionJournalOptions.mm | 54 ++ .../src/MLNActionJournalOptions_Private.h | 12 + platform/darwin/src/MLNMapOptions.h | 37 ++ platform/darwin/src/MLNMapOptions.mm | 23 + platform/ios/BUILD.bazel | 1 + .../ios/MapLibre.docc/ActionJournalExample.md | 84 +++ platform/ios/MapLibre.docc/MapLibre.md | 6 +- .../app-swift/Sources/ObserverExample.swift | 26 +- platform/ios/ios.cmake | 6 + platform/ios/src/MLNMapView.h | 45 ++ platform/ios/src/MLNMapView.mm | 93 ++- platform/macos/src/MLNMapView.h | 22 + platform/macos/src/MLNMapView.mm | 67 +- platform/macos/src/MLNMapViewDelegate.h | 1 + shaders/generate_shader_code.mjs | 18 + src/mbgl/map/map.cpp | 30 +- src/mbgl/map/map_impl.cpp | 131 +++- src/mbgl/map/map_impl.hpp | 12 +- src/mbgl/map/transform.cpp | 2 +- src/mbgl/map/transform.hpp | 20 +- src/mbgl/shaders/shader_source.cpp | 44 ++ src/mbgl/tile/tile_operation.cpp | 18 + src/mbgl/util/action_journal.cpp | 33 + src/mbgl/util/action_journal_impl.cpp | 575 ++++++++++++++++++ src/mbgl/util/action_journal_impl.hpp | 105 ++++ src/mbgl/util/chrono.cpp | 16 + test/CMakeLists.txt | 1 + test/map/transform.test.cpp | 6 +- test/tile/tile_coordinate.test.cpp | 2 +- test/util/action_journal.test.cpp | 431 +++++++++++++ vendor/BUILD.bazel | 2 + vendor/maplibre-native-base.cmake | 9 + .../extras/CMakeLists.txt | 1 + vendor/maplibre-native-base/extras/filesystem | 1 + 66 files changed, 2773 insertions(+), 75 deletions(-) create mode 100644 include/mbgl/util/action_journal.hpp create mode 100644 include/mbgl/util/action_journal_options.hpp create mode 100644 platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp create mode 100644 platform/android/MapLibreAndroid/src/cpp/native_map_options.hpp create mode 100644 platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml create mode 100644 platform/android/docs/observability/action-journal.md create mode 100644 platform/android/docs/observability/observe-map-events.md create mode 100644 platform/darwin/src/MLNActionJournalOptions.h create mode 100644 platform/darwin/src/MLNActionJournalOptions.mm create mode 100644 platform/darwin/src/MLNActionJournalOptions_Private.h create mode 100644 platform/darwin/src/MLNMapOptions.h create mode 100644 platform/darwin/src/MLNMapOptions.mm create mode 100644 platform/ios/MapLibre.docc/ActionJournalExample.md create mode 100644 src/mbgl/shaders/shader_source.cpp create mode 100644 src/mbgl/tile/tile_operation.cpp create mode 100644 src/mbgl/util/action_journal.cpp create mode 100644 src/mbgl/util/action_journal_impl.cpp create mode 100644 src/mbgl/util/action_journal_impl.hpp create mode 100644 test/util/action_journal.test.cpp create mode 160000 vendor/maplibre-native-base/extras/filesystem diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index c56d6c37210a..6dedab7a5cfb 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -53,7 +53,7 @@ jobs: if: startsWith(runner.name, 'GitHub Actions') uses: jlumbroso/free-disk-space@main with: - tool-cache: false + tool-cache: true android: false dotnet: true haskell: true diff --git a/.gitmodules b/.gitmodules index fc278675725b..7877024b0967 100644 --- a/.gitmodules +++ b/.gitmodules @@ -97,3 +97,6 @@ [submodule "vendor/maplibre-native-base/deps/geojson.hpp"] path = vendor/maplibre-native-base/deps/geojson.hpp url = https://github.com/mapbox/geojson-cpp.git +[submodule "vendor/maplibre-native-base/extras/filesystem"] + path = vendor/maplibre-native-base/extras/filesystem + url = https://github.com/gulrak/filesystem.git diff --git a/BUILD.bazel b/BUILD.bazel index cf9f9e3aee11..8ec90d818947 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -14,6 +14,7 @@ load( "MLN_DRAWABLES_SOURCE", "MLN_GENERATED_OPENGL_SHADER_HEADERS", "MLN_GENERATED_SHADER_HEADERS", + "MLN_GENERATED_SHADER_SOURCE", "MLN_GENERATED_STYLE_SOURCE", "MLN_OPENGL_HEADERS", "MLN_OPENGL_SOURCE", @@ -43,6 +44,7 @@ js_run_binary( allow_empty = False, ), outs = MLN_GENERATED_SHADER_HEADERS + + MLN_GENERATED_SHADER_SOURCE + MLN_GENERATED_OPENGL_SHADER_HEADERS, tool = ":generate-shader-code-script", ) @@ -75,6 +77,7 @@ cc_library( cc_library( name = "mbgl-core", srcs = MLN_CORE_SOURCE + + MLN_GENERATED_SHADER_SOURCE + MLN_GENERATED_STYLE_SOURCE + select({ ":drawable_renderer": MLN_OPENGL_SOURCE + MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_GL_SOURCE, ":metal_renderer": MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_MTL_SOURCE, diff --git a/CMakeLists.txt b/CMakeLists.txt index cb25edf48a20..a776d95acab5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,6 +279,7 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_frontend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_observer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_state.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/program_parameters.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/database_file_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source.hpp @@ -386,6 +387,8 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_id.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_operation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_necessity.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/action_journal.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/action_journal_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/async_request.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/async_task.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/char_array_buffer.hpp @@ -645,6 +648,7 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/transition_parameters.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/update_parameters.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/upload_parameters.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/shader_source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/attributes.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/program_parameters.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/segment.hpp @@ -881,10 +885,14 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/tile/tile_loader_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/tile_loader_observer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/tile_observer.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/tile/tile_operation.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile_data.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile_data.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/camera.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.cpp @@ -972,7 +980,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/gl/renderable_resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/renderer_backend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/platform/gl_functions.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_manifest.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/shader_group_gl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/gl/prelude.hpp @@ -1425,6 +1432,7 @@ set(EXPORT_TARGETS mbgl-core maplibre-native-base maplibre-native-base-cheap-ruler-cpp + maplibre-native-base-extras-filesystem maplibre-native-base-extras-expected-lite maplibre-native-base-extras-kdbush.hpp maplibre-native-base-extras-rapidjson diff --git a/bazel/core.bzl b/bazel/core.bzl index 485dc8dbdb1d..479b9484178b 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -54,6 +54,10 @@ MLN_GENERATED_SHADER_HEADERS = [ "include/mbgl/shaders/shader_manifest.hpp", ] +MLN_GENERATED_SHADER_SOURCE = [ + "src/mbgl/shaders/shader_source.cpp", +] + MLN_GENERATED_OPENGL_SHADER_HEADERS = [ "include/mbgl/shaders/gl/background.hpp", "include/mbgl/shaders/gl/background_pattern.hpp", @@ -498,10 +502,14 @@ MLN_CORE_SOURCE = [ "src/mbgl/tile/tile_loader_impl.hpp", "src/mbgl/tile/tile_loader_observer.hpp", "src/mbgl/tile/tile_observer.hpp", + "src/mbgl/tile/tile_operation.cpp", "src/mbgl/tile/vector_tile.cpp", "src/mbgl/tile/vector_tile.hpp", "src/mbgl/tile/vector_tile_data.cpp", "src/mbgl/tile/vector_tile_data.hpp", + "src/mbgl/util/action_journal.cpp", + "src/mbgl/util/action_journal_impl.hpp", + "src/mbgl/util/action_journal_impl.cpp", "src/mbgl/util/camera.cpp", "src/mbgl/util/camera.hpp", "src/mbgl/util/bounding_volumes.hpp", @@ -743,6 +751,8 @@ MLN_CORE_HEADERS = [ "include/mbgl/tile/tile_id.hpp", "include/mbgl/tile/tile_operation.hpp", "include/mbgl/tile/tile_necessity.hpp", + "include/mbgl/util/action_journal.hpp", + "include/mbgl/util/action_journal_options.hpp", "include/mbgl/util/async_request.hpp", "include/mbgl/util/async_task.hpp", "include/mbgl/util/bitmask_operations.hpp", diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 914560c92030..e68853e04df6 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -31,13 +32,18 @@ class Image; class Style; } // namespace style +namespace util { +class ActionJournal; +} // namespace util + class Map : private util::noncopyable { public: explicit Map(RendererFrontend&, MapObserver&, const MapOptions&, const ResourceOptions&, - const ClientOptions& = ClientOptions()); + const ClientOptions& = ClientOptions(), + const util::ActionJournalOptions& = util::ActionJournalOptions()); ~Map(); /// Register a callback that will get called (on the render thread) when all @@ -152,12 +158,16 @@ class Map : private util::noncopyable { void setFreeCameraOptions(const FreeCameraOptions& camera); FreeCameraOptions getFreeCameraOptions() const; + ClientOptions getClientOptions() const; + + const std::unique_ptr& getActionJournal(); + protected: class Impl; const std::unique_ptr impl; // For testing only. - Map(std::unique_ptr); + Map(std::unique_ptr, const util::ActionJournalOptions& = {}); }; } // namespace mbgl diff --git a/include/mbgl/util/action_journal.hpp b/include/mbgl/util/action_journal.hpp new file mode 100644 index 000000000000..49dd8ccd2836 --- /dev/null +++ b/include/mbgl/util/action_journal.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace mbgl { + +namespace util { + +class ActionJournalOptions; + +/** + * @brief Logs map events in a persistent rolling file format. + * Each event is stored as a serialized json object with the event data. + * Example + * { + * "name" : "onTileAction", + * "time" : "2025-04-17T13:13:13.974Z", + * "styleName" : "Streets", + * "styleURL" : "maptiler://maps/streets", + * "event" : { + * "action" : "RequestedFromNetwork", + * "tileX" : 0, + * "tileY" : 0, + * "tileZ" : 0, + * "overscaledZ" : 0, + * "sourceID" : "openmaptiles" + * } + * } + */ +class ActionJournal { +public: + ActionJournal(const Map& map, const ActionJournalOptions& options); + ~ActionJournal(); + + /** + * @brief Get the action journal umbrella directory containing all logs. + * @return log directory + */ + std::string getLogDirectory() const; + + /** + * @brief Get the action journal log files. + * @return list of log files + */ + std::vector getLogFiles() const; + + /** + * @brief Get the action journal events from oldest to newest. + * Each element contains a serialized json object with the event data. + * @return List of serialized events + */ + std::vector getLog(); + + /** + * @brief Clear stored action journal events by removing logs files. + */ + void clearLog(); + + class Impl; + const std::unique_ptr impl; +}; + +} // namespace util +} // namespace mbgl diff --git a/include/mbgl/util/action_journal_options.hpp b/include/mbgl/util/action_journal_options.hpp new file mode 100644 index 000000000000..c666e9de8ef8 --- /dev/null +++ b/include/mbgl/util/action_journal_options.hpp @@ -0,0 +1,101 @@ +#pragma once + +#include + +namespace mbgl { + +namespace util { + +/** + * @brief Holds values for Action Journal options. + */ +class ActionJournalOptions { +public: + ActionJournalOptions() = default; + ~ActionJournalOptions() = default; + + /** + * @brief Enable action journal event logging, defaults to false. + * + * @param value true to enable, false to disable. + * @return ActionJournalOptions for chaining options together. + */ + ActionJournalOptions& enable(bool value = true) { + enable_ = value; + return *this; + } + + /** + * @brief Gets the previously set (or default) value. + * @return Returns ActionJournal state + */ + bool enabled() const { return enable_; } + + /** + * @brief Set the log files location. An umbrela `action_journal` directory + * will be created at the given location containing all files. + * + * @param path Action Journal log path. + * @return ActionJournalOptions for chaining options together. + */ + ActionJournalOptions& withPath(const std::string& path) { + path_ = path; + return *this; + } + + /** + * @brief Gets the previously set (or default) log path. + * @return Returns ActionJournal log path + */ + std::string path() const { return path_; } + + /** + * @brief Set the file size for the log files. The action journal uses a + * rolling log with multiple files. Total log size is equal to + * `logFileSize * logFileCount`. + * + * @param size Action Journal log file size. + * @return ActionJournalOptions for chaining options together. + */ + ActionJournalOptions& withLogFileSize(const uint32_t size) { + logFileSize_ = size; + return *this; + } + + /** + * @brief Gets the previously set (or default) log file size. + * @return Returns ActionJournal log file size + */ + uint32_t logFileSize() const { return logFileSize_; } + + /** + * @brief Set the number of log files. The action journal uses a + * rolling log with multiple files. Total log size is equal to + * `logFileSize * logFileCount`. + * + * @param count Action Journal log file count. + * @return ActionJournalOptions for chaining options together. + */ + ActionJournalOptions& withLogFileCount(const uint32_t count) { + logFileCount_ = count; + return *this; + } + + /** + * @brief Gets the previously set (or default) number of log files. + * @return Returns ActionJournal log file count + */ + uint32_t logFileCount() const { return logFileCount_; } + +protected: + bool enable_ = false; + // path of the log + std::string path_{"/tmp/"}; + // log file size + uint32_t logFileSize_ = 1024 * 1024; + // number of log files (each of `logFileSize` size) + uint32_t logFileCount_ = 5; +}; + +} // namespace util +} // namespace mbgl diff --git a/include/mbgl/util/chrono.hpp b/include/mbgl/util/chrono.hpp index de4f7d7d510f..69a13383b88a 100644 --- a/include/mbgl/util/chrono.hpp +++ b/include/mbgl/util/chrono.hpp @@ -32,6 +32,9 @@ std::string rfc1123(Timestamp); // YYYY-mm-dd HH:MM:SS e.g. "2015-11-26 16:11:23" std::string iso8601(Timestamp); +// YYYY-mm-ddTHH:MM:SS.MS e.g. "2015-11-26T16:11:23.324Z" +std::string iso8601(std::chrono::time_point); + Timestamp parseTimestamp(const char *); Timestamp parseTimestamp(int32_t timestamp); diff --git a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt index 462b252b4af2..a1db3493a912 100644 --- a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt +++ b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt @@ -110,6 +110,8 @@ add_library(maplibre SHARED ${PROJECT_SOURCE_DIR}/map_renderer_runnable.hpp ${PROJECT_SOURCE_DIR}/native_map_view.cpp ${PROJECT_SOURCE_DIR}/native_map_view.hpp + ${PROJECT_SOURCE_DIR}/native_map_options.cpp + ${PROJECT_SOURCE_DIR}/native_map_options.hpp ${PROJECT_SOURCE_DIR}/offline/offline_manager.cpp ${PROJECT_SOURCE_DIR}/offline/offline_manager.hpp ${PROJECT_SOURCE_DIR}/offline/offline_region.cpp diff --git a/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp b/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp index ce343c48d23d..b84fd671ce5d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp @@ -34,6 +34,7 @@ #include "map_renderer_runnable.hpp" #include "maplibre.hpp" #include "native_map_view.hpp" +#include "native_map_options.hpp" #include "util/tile_server_options.hpp" #ifndef MBGL_MODULE_OFFLINE_DISABLE #include "offline/offline_manager.hpp" @@ -109,6 +110,7 @@ void registerNatives(JavaVM* vm) { MapRenderer::registerNative(env); MapRendererRunnable::registerNative(env); NativeMapView::registerNative(env); + NativeMapOptions::registerNative(env); // Http RegisterNativeHTTPRequest(env); diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp new file mode 100644 index 000000000000..42ce9d2b14c4 --- /dev/null +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp @@ -0,0 +1,43 @@ +#include "native_map_options.hpp" + +namespace mbgl { +namespace android { + +void NativeMapOptions::registerNative(jni::JNIEnv &env) { + jni::Class::Singleton(env); +} + +NativeMapOptions::NativeMapOptions(jni::JNIEnv &_env, const jni::Object &_obj) {} + +NativeMapOptions::~NativeMapOptions() {} + +util::ActionJournalOptions NativeMapOptions::getActionJournalOptions(jni::JNIEnv &env, + const jni::Object &obj) { + auto &javaClass = jni::Class::Singleton(env); + + auto enabledField = javaClass.GetField(env, "actionJournalEnabled"); + auto pathField = javaClass.GetField(env, "actionJournalPath"); + auto logFileSizeField = javaClass.GetField(env, "actionJournalLogFileSize"); + auto logFileCountField = javaClass.GetField(env, "actionJournalLogFileCount"); + + return util::ActionJournalOptions() + .enable(obj.Get(env, enabledField)) + .withPath(jni::Make(env, obj.Get(env, pathField))) + .withLogFileSize(obj.Get(env, logFileSizeField)) + .withLogFileCount(obj.Get(env, logFileCountField)); +} + +float NativeMapOptions::pixelRatio(jni::JNIEnv &env, const jni::Object &obj) { + auto &javaClass = jni::Class::Singleton(env); + auto pixelRatioField = javaClass.GetField(env, "pixelRatio"); + return obj.Get(env, pixelRatioField); +} + +bool NativeMapOptions::crossSourceCollisions(jni::JNIEnv &env, const jni::Object &obj) { + auto &javaClass = jni::Class::Singleton(env); + auto crossSourceCollisionsField = javaClass.GetField(env, "crossSourceCollisions"); + return obj.Get(env, crossSourceCollisionsField); +} + +} // namespace android +} // namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_options.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_options.hpp new file mode 100644 index 000000000000..b951af617400 --- /dev/null +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_options.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace android { + +class NativeMapOptions { +public: + static constexpr auto Name() { return "org/maplibre/android/maps/NativeMapOptions"; }; + + static void registerNative(jni::JNIEnv&); + + NativeMapOptions(jni::JNIEnv&, const jni::Object&); + virtual ~NativeMapOptions(); + + static util::ActionJournalOptions getActionJournalOptions(jni::JNIEnv&, const jni::Object&); + static float pixelRatio(jni::JNIEnv&, const jni::Object&); + static bool crossSourceCollisions(jni::JNIEnv&, const jni::Object&); +}; + +} // namespace android +} // namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 082443b98efa..232c2652f94c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -62,11 +63,10 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, const jni::Object& _obj, const jni::Object& jFileSource, const jni::Object& jMapRenderer, - jni::jfloat pixelRatio_, - jni::jboolean crossSourceCollisions_) + const jni::Object& jNativeMapOptions) : javaPeer(_env, _obj), mapRenderer(MapRenderer::getNativePeer(_env, jMapRenderer)), - pixelRatio(pixelRatio_) { + pixelRatio(NativeMapOptions::pixelRatio(_env, jNativeMapOptions)) { // Get a reference to the JavaVM for callbacks if (_env.GetJavaVM(&vm) < 0) { _env.ExceptionDescribe(); @@ -83,14 +83,16 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, .withPixelRatio(pixelRatio) .withConstrainMode(ConstrainMode::HeightOnly) .withViewportMode(ViewportMode::Default) - .withCrossSourceCollisions(crossSourceCollisions_); + .withCrossSourceCollisions(NativeMapOptions::crossSourceCollisions(_env, jNativeMapOptions)); // Create the core map - map = std::make_unique(*rendererFrontend, - *this, - options, - mbgl::android::FileSource::getSharedResourceOptions(_env, jFileSource), - mbgl::android::FileSource::getSharedClientOptions(_env, jFileSource)); + map = std::make_unique( + *rendererFrontend, + *this, + options, + mbgl::android::FileSource::getSharedResourceOptions(_env, jFileSource), + mbgl::android::FileSource::getSharedClientOptions(_env, jFileSource), + mbgl::android::NativeMapOptions::getActionJournalOptions(_env, jNativeMapOptions)); } /** @@ -693,6 +695,47 @@ jni::jboolean NativeMapView::getDebug(JNIEnv&) { return map->getDebug() != DebugOptions::NoDebug; } +jni::Local> NativeMapView::getActionJournalLogFiles(JNIEnv& env) { + const auto& actionJournal = map->getActionJournal(); + if (!actionJournal) { + return jni::Local>(); + } + + const auto& files = actionJournal->getLogFiles(); + auto jFiles = jni::Array::New(env, files.size()); + + uint32_t index = 0; + for (const auto& file : files) { + jFiles.Set(env, index++, jni::Make(env, file)); + } + + return jFiles; +} + +jni::Local> NativeMapView::getActionJournalLog(JNIEnv& env) { + const auto& actionJournal = map->getActionJournal(); + if (!actionJournal) { + return jni::Local>(); + } + + const auto& events = actionJournal->getLog(); + auto jEvents = jni::Array::New(env, events.size()); + + uint32_t index = 0; + for (const auto& event : events) { + jEvents.Set(env, index++, jni::Make(env, event)); + } + + return jEvents; +} + +void NativeMapView::clearActionJournalLog(JNIEnv&) { + const auto& actionJournal = map->getActionJournal(); + if (actionJournal) { + actionJournal->clearLog(); + } +} + jni::jboolean NativeMapView::isFullyLoaded(JNIEnv&) { return map->isFullyLoaded(); } @@ -1246,8 +1289,7 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { const jni::Object&, const jni::Object&, const jni::Object&, - jni::jfloat, - jni::jboolean>, + const jni::Object&>, "nativeInitialize", "nativeDestroy", METHOD(&NativeMapView::resizeView, "nativeResizeView"), @@ -1292,6 +1334,9 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::addMarkers, "nativeAddMarkers"), METHOD(&NativeMapView::setDebug, "nativeSetDebug"), METHOD(&NativeMapView::getDebug, "nativeGetDebug"), + METHOD(&NativeMapView::getActionJournalLogFiles, "nativeGetActionJournalLogFiles"), + METHOD(&NativeMapView::getActionJournalLog, "nativeGetActionJournalLog"), + METHOD(&NativeMapView::clearActionJournalLog, "nativeClearActionJournalLog"), METHOD(&NativeMapView::isFullyLoaded, "nativeIsFullyLoaded"), METHOD(&NativeMapView::onLowMemory, "nativeOnLowMemory"), METHOD(&NativeMapView::getMetersPerPixelAtLatitude, "nativeGetMetersPerPixelAtLatitude"), diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 7ec2a4dd3596..6fff2e49ccbc 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -23,6 +23,7 @@ #include "map/camera_position.hpp" #include "map/image.hpp" #include "style/light.hpp" +#include "native_map_options.hpp" #include "bitmap.hpp" #include @@ -49,8 +50,7 @@ class NativeMapView : public MapObserver { const jni::Object&, const jni::Object&, const jni::Object&, - jni::jfloat, - jni::jboolean); + const jni::Object&); virtual ~NativeMapView(); @@ -199,6 +199,12 @@ class NativeMapView : public MapObserver { jni::jboolean getDebug(JNIEnv&); + jni::Local> getActionJournalLogFiles(JNIEnv&); + + jni::Local> getActionJournalLog(JNIEnv&); + + void clearActionJournalLog(JNIEnv&); + jni::jboolean isFullyLoaded(JNIEnv&); jni::jdouble getMetersPerPixelAtLatitude(JNIEnv&, jni::jdouble, jni::jdouble); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java index 04d758d68e88..cc282134aabb 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java @@ -897,6 +897,49 @@ public void cycleDebugOptions() { nativeMapView.setDebug(debugActive); } + /** + *

+ * Get the list of action journal log files from oldest to newest. + *

+ */ + public String[] getActionJournalLogFiles() { + return nativeMapView.getActionJournalLogFiles(); + } + + /** + *

+ * Get the action journal events from oldest to newest. + *

+ * Each element contains a serialized json object with the event data. + * Example + * `{ + * "name" : "onTileAction", + * "time" : "2025-04-17T13:13:13.974Z", + * "styleName" : "Streets", + * "styleURL" : "maptiler://maps/streets", + * "event" : { + * "action" : "RequestedFromNetwork", + * "tileX" : 0, + * "tileY" : 0, + * "tileZ" : 0, + * "overscaledZ" : 0, + * "sourceID" : "openmaptiles" + * } + * }` + */ + public String[] getActionJournalLog() { + return nativeMapView.getActionJournalLog(); + } + + /** + *

+ * Clear stored action journal events. + *

+ */ + public void clearActionJournalLog() { + nativeMapView.clearActionJournalLog(); + } + // // API endpoint config // diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java index 4f35ceecdb57..231f2e91569e 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java @@ -94,6 +94,11 @@ public class MapLibreMapOptions implements Parcelable { private boolean crossSourceCollisions = true; + private boolean actionJournalEnabled = false; + private String actionJournalPath = ""; + private long actionJournalLogFileSize = 1024 * 1024; + private long actionJournalLogFileCount = 5; + /** * Creates a new MapLibreMapOptions object. * @@ -151,6 +156,11 @@ private MapLibreMapOptions(Parcel in) { pixelRatio = in.readFloat(); foregroundLoadColor = in.readInt(); crossSourceCollisions = in.readByte() != 0; + + actionJournalEnabled = in.readByte() != 0; + actionJournalPath = in.readString(); + actionJournalLogFileSize = in.readLong(); + actionJournalLogFileCount = in.readLong(); } /** @@ -182,6 +192,8 @@ static MapLibreMapOptions createFromAttributes(@NonNull MapLibreMapOptions mapli @NonNull Context context, @Nullable TypedArray typedArray) { float pxlRatio = context.getResources().getDisplayMetrics().density; + maplibreMapOptions.actionJournalPath(context.getFilesDir().getAbsolutePath()); + try { maplibreMapOptions.camera(new CameraPosition.Builder(typedArray).build()); @@ -305,6 +317,16 @@ static MapLibreMapOptions createFromAttributes(@NonNull MapLibreMapOptions mapli maplibreMapOptions.crossSourceCollisions( typedArray.getBoolean(R.styleable.maplibre_MapView_maplibre_cross_source_collisions, true) ); + + maplibreMapOptions.actionJournalEnabled( + typedArray.getBoolean(R.styleable.maplibre_MapView_maplibre_actionJournalEnabled, false) + ); + maplibreMapOptions.actionJournalLogFileSize( + typedArray.getInteger(R.styleable.maplibre_MapView_maplibre_actionJournalLogFileSize, 1024 * 1024) + ); + maplibreMapOptions.actionJournalLogFileCount( + typedArray.getInteger(R.styleable.maplibre_MapView_maplibre_actionJournalLogFileCount, 5) + ); } finally { typedArray.recycle(); } @@ -730,6 +752,65 @@ public MapLibreMapOptions crossSourceCollisions(boolean crossSourceCollisions) { return this; } + /** + * Enable action journal event logging, defaults to false. + *

+ * If set to true, enables map event file logging (obtainable via MapView#getActionJournalLog) + *

+ * + * @param actionJournalEnabled true to enable, false to disable + * @return This + */ + @NonNull + public MapLibreMapOptions actionJournalEnabled(boolean actionJournalEnabled) { + this.actionJournalEnabled = actionJournalEnabled; + return this; + } + + /** + * Set the action journal log path. + * + * @param actionJournalPath Path to be used + * @return This + */ + @NonNull + public MapLibreMapOptions actionJournalPath(@NonNull String actionJournalPath) { + this.actionJournalPath = actionJournalPath; + return this; + } + + /** + * Set the action journal log file size. + *

+ * The action journal uses a rolling log with multiple files. + * Total log size is equal to `actionJournalLogFileSize * actionJournalLogFileCount`. + *

+ * + * @param actionJournalLogFileSize maximum log file size + * @return This + */ + @NonNull + public MapLibreMapOptions actionJournalLogFileSize(long actionJournalLogFileSize) { + this.actionJournalLogFileSize = actionJournalLogFileSize; + return this; + } + + /** + * Set the action journal log file count. + *

+ * The action journal uses a rolling log with multiple files. + * Total log size is equal to `actionJournalLogFileSize * actionJournalLogFileCount`. + *

+ * + * @param actionJournalLogFileCount maximum number of log files + * @return This + */ + @NonNull + public MapLibreMapOptions actionJournalLogFileCount(long actionJournalLogFileCount) { + this.actionJournalLogFileCount = actionJournalLogFileCount; + return this; + } + /** * Enable local ideograph font family, defaults to true. * @@ -821,6 +902,44 @@ public boolean getCrossSourceCollisions() { return crossSourceCollisions; } + /** + * Check whether action journal logging is enabled. + * + * @return true if enabled + */ + public boolean getActionJournalEnabled() { + return actionJournalEnabled; + } + + /** + * Get the current configured action journal log path. + * + * @return log file path + */ + public String getActionJournalPath() { + return actionJournalPath; + } + + /** + * Get the current configured action journal log file size. + * Total log size is equal to `actionJournalLogFileSize * actionJournalLogFileCount`. + * + * @return maximum file size + */ + public long getActionJournalLogFileSize() { + return actionJournalLogFileSize; + } + + /** + * Get the current configured action journal log file count. + * Total log size is equal to `actionJournalLogFileSize * actionJournalLogFileCount`. + * + * @return maximum log files used + */ + public long getActionJournalLogFileCount() { + return actionJournalLogFileCount; + } + /** * Set the flag to render the map surface on top of another surface. * @@ -1205,6 +1324,11 @@ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeFloat(pixelRatio); dest.writeInt(foregroundLoadColor); dest.writeByte((byte) (crossSourceCollisions ? 1 : 0)); + + dest.writeByte((byte) (actionJournalEnabled ? 1 : 0)); + dest.writeString(actionJournalPath); + dest.writeLong(actionJournalLogFileSize); + dest.writeLong(actionJournalLogFileCount); } @Override @@ -1325,6 +1449,22 @@ public boolean equals(@Nullable Object o) { return false; } + if (actionJournalEnabled != options.actionJournalEnabled) { + return false; + } + + if (actionJournalPath.equals(options.actionJournalPath)) { + return false; + } + + if (actionJournalLogFileSize != options.actionJournalLogFileSize) { + return false; + } + + if (actionJournalLogFileCount != options.actionJournalLogFileCount) { + return false; + } + return false; } @@ -1372,6 +1512,10 @@ public int hashCode() { result = 31 * result + Arrays.hashCode(localIdeographFontFamilies); result = 31 * result + (int) pixelRatio; result = 31 * result + (crossSourceCollisions ? 1 : 0); + result = 31 * result + (actionJournalEnabled ? 1 : 0); + result = 31 * result + (actionJournalPath != null ? actionJournalPath.hashCode() : 0); + result = 31 * result + (int) actionJournalLogFileSize; + result = 31 * result + (int) actionJournalLogFileCount; return result; } } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java index 4c62ff47ec91..39721f55eb01 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java @@ -306,15 +306,13 @@ public void onCreate(@Nullable Bundle savedInstanceState) { } private void initializeDrawingSurface(MapLibreMapOptions options) { - mapRenderer = MapRenderer.create(options, getContext(), () -> MapView.this.onSurfaceCreated()); + mapRenderer = MapRenderer.create(options, getContext(), MapView.this::onSurfaceCreated); renderView = mapRenderer.getView(); addView(renderView, 0); - boolean crossSourceCollisions = options.getCrossSourceCollisions(); - nativeMapView = new NativeMapView( - getContext(), getPixelRatio(), crossSourceCollisions, this, mapChangeReceiver, mapRenderer - ); + options.pixelRatio(getPixelRatio()); + nativeMapView = new NativeMapView(getContext(), options, this, mapChangeReceiver, mapRenderer); } private void onSurfaceCreated() { diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java index 31fd4f6bafa5..4192b6d77ccf 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java @@ -221,6 +221,12 @@ List queryRenderedFeatures(@NonNull RectF coordinates, boolean getDebug(); + String[] getActionJournalLogFiles(); + + String[] getActionJournalLog(); + + void clearActionJournalLog(); + void setReachability(boolean status); void setApiBaseUrl(String baseUrl); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java new file mode 100644 index 000000000000..788a9d2d7147 --- /dev/null +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java @@ -0,0 +1,56 @@ +package org.maplibre.android.maps; + +public class NativeMapOptions { + + private final float pixelRatio; + private final boolean crossSourceCollisions; + + private final boolean actionJournalEnabled; + private final String actionJournalPath; + private final long actionJournalLogFileSize; + private final long actionJournalLogFileCount; + + public NativeMapOptions(MapLibreMapOptions options) { + pixelRatio = options.getPixelRatio(); + crossSourceCollisions = options.getCrossSourceCollisions(); + + actionJournalEnabled = options.getActionJournalEnabled(); + actionJournalPath = options.getActionJournalPath(); + actionJournalLogFileSize = options.getActionJournalLogFileSize(); + actionJournalLogFileCount = options.getActionJournalLogFileCount(); + } + + public NativeMapOptions(float pixelRatio, boolean crossSourceCollisions) { + this.pixelRatio = pixelRatio; + this.crossSourceCollisions = crossSourceCollisions; + + actionJournalEnabled = false; + actionJournalPath = ""; + actionJournalLogFileSize = 0; + actionJournalLogFileCount = 0; + } + + public float pixelRatio() { + return pixelRatio; + } + + public boolean crossSourceCollisions() { + return crossSourceCollisions; + } + + public boolean actionJournalEnabled() { + return actionJournalEnabled; + } + + public String actionJournalPath() { + return actionJournalPath; + } + + public long actionJournalLogFileSize() { + return actionJournalLogFileSize; + } + + public long actionJournalLogFileCount() { + return actionJournalLogFileCount; + } +} diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java index 4ed013c50dcb..b714896e348b 100755 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java @@ -91,23 +91,29 @@ final class NativeMapView implements NativeMap { // Constructors // - public NativeMapView(@NonNull final Context context, final boolean crossSourceCollisions, + public NativeMapView(@NonNull final Context context, final ViewCallback viewCallback, final StateCallback stateCallback, final MapRenderer mapRenderer) { - this(context, context.getResources().getDisplayMetrics().density, crossSourceCollisions, viewCallback, - stateCallback, mapRenderer); + this(context, new NativeMapOptions(context.getResources().getDisplayMetrics().density, false), + viewCallback, stateCallback, mapRenderer); } - public NativeMapView(final Context context, final float pixelRatio, final boolean crossSourceCollisions, + public NativeMapView(@NonNull final Context context, final MapLibreMapOptions options, + final ViewCallback viewCallback, final StateCallback stateCallback, + final MapRenderer mapRenderer) { + this(context, new NativeMapOptions(options), viewCallback, stateCallback, mapRenderer); + } + + public NativeMapView(@NonNull final Context context, final NativeMapOptions nativeOptions, final ViewCallback viewCallback, final StateCallback stateCallback, final MapRenderer mapRenderer) { this.mapRenderer = mapRenderer; this.viewCallback = viewCallback; this.fileSource = FileSource.getInstance(context); - this.pixelRatio = pixelRatio; + this.pixelRatio = nativeOptions.pixelRatio(); this.thread = Thread.currentThread(); this.stateCallback = stateCallback; - nativeInitialize(this, fileSource, mapRenderer, pixelRatio, crossSourceCollisions); + nativeInitialize(this, fileSource, mapRenderer, nativeOptions); } // @@ -646,6 +652,30 @@ public boolean getDebug() { return nativeGetDebug(); } + @Override + public String[] getActionJournalLogFiles() { + if (checkState("getActionJournalLogFiles")) { + return null; + } + return nativeGetActionJournalLogFiles(); + } + + @Override + public String[] getActionJournalLog() { + if (checkState("getActionJournalLog")) { + return null; + } + return nativeGetActionJournalLog(); + } + + @Override + public void clearActionJournalLog() { + if (checkState("clearActionJournalLog")) { + return; + } + nativeClearActionJournalLog(); + } + @Override public boolean isFullyLoaded() { if (checkState("isFullyLoaded")) { @@ -1275,8 +1305,7 @@ private void onSpriteRequested(String id, String url) { private native void nativeInitialize(NativeMapView nativeMap, FileSource fileSource, MapRenderer mapRenderer, - float pixelRatio, - boolean crossSourceCollisions); + NativeMapOptions nativeOptions); @Keep private native void nativeDestroy(); @@ -1429,6 +1458,15 @@ private native void nativeSetVisibleCoordinateBounds(LatLng[] coordinates, RectF @Keep private native boolean nativeGetDebug(); + @Keep + private native String[] nativeGetActionJournalLogFiles(); + + @Keep + private native String[] nativeGetActionJournalLog(); + + @Keep + private native void nativeClearActionJournalLog(); + @Keep private native boolean nativeIsFullyLoaded(); diff --git a/platform/android/MapLibreAndroid/src/main/res-public/values/public.xml b/platform/android/MapLibreAndroid/src/main/res-public/values/public.xml index 84939ddea8b9..bd4ea5ee290a 100644 --- a/platform/android/MapLibreAndroid/src/main/res-public/values/public.xml +++ b/platform/android/MapLibreAndroid/src/main/res-public/values/public.xml @@ -17,6 +17,11 @@ + + + + + diff --git a/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml b/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml index ff471520c569..658184e4d227 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml @@ -12,6 +12,11 @@ + + + + + diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/MapLibreTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/MapLibreTest.kt index 54d6b103acd9..ef8783a2171c 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/MapLibreTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/MapLibreTest.kt @@ -18,6 +18,7 @@ import org.maplibre.android.maps.MapView import org.maplibre.android.utils.ConfigUtils.Companion.getMockedOptions import org.mockito.ArgumentMatchers import org.mockito.Mockito +import java.io.File class MapLibreTest { private var context: Context? = null @@ -68,8 +69,10 @@ class MapLibreTest { fun testNoInstance() { val displayMetrics = Mockito.mock(DisplayMetrics::class.java) val resources = Mockito.mock(Resources::class.java) + val files = Mockito.mock(File::class.java) Mockito.`when`(resources.displayMetrics).thenReturn(displayMetrics) Mockito.`when`(context!!.resources).thenReturn(resources) + Mockito.`when`(context!!.filesDir).thenReturn(files) val typedArray = Mockito.mock(TypedArray::class.java) Mockito.`when`(context!!.obtainStyledAttributes(ArgumentMatchers.nullable(AttributeSet::class.java), ArgumentMatchers.any(IntArray::class.java), ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())) .thenReturn(typedArray) diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/BaseLayerTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/BaseLayerTest.kt index e67647441bc9..5e6b4aa58279 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/BaseLayerTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/BaseLayerTest.kt @@ -17,7 +17,7 @@ abstract class BaseLayerTest : AppCenter() { fun before() { val context = InstrumentationRegistry.getInstrumentation().context - nativeMapView = NativeMapView(context, false, null, null, NativeMapViewTest.DummyRenderer(context)) + nativeMapView = NativeMapView(context, null, null, NativeMapViewTest.DummyRenderer(context)) nativeMapView.resizeView(WIDTH, HEIGHT) } diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/NativeMapViewTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/NativeMapViewTest.kt index 5664fa4471d4..2d32ca74c56d 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/NativeMapViewTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/maps/NativeMapViewTest.kt @@ -46,8 +46,10 @@ class NativeMapViewTest : AppCenter() { fun before() { val context = InstrumentationRegistry.getInstrumentation().context val apiKey = MapLibre.getApiKey() + val options = NativeMapOptions(2.0f, false) + MapLibre.getInstance(context, apiKey, WellKnownTileServer.MapTiler) - nativeMapView = NativeMapView(context, 2.0f, false, null, null, DummyRenderer(context)) + nativeMapView = NativeMapView(context, options, null, null, DummyRenderer(context)) nativeMapView.resizeView(WIDTH, HEIGHT) } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt index e24990b5c46a..9ac827fea2e0 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt @@ -3,6 +3,7 @@ package org.maplibre.android.testapp.activity.events import android.app.ActivityManager import android.os.Build import android.os.Bundle +import android.view.View import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import org.maplibre.android.MapLibre @@ -18,7 +19,11 @@ import kotlin.time.TimeSource import kotlin.time.TimeSource.Monotonic import org.maplibre.android.log.Logger import org.maplibre.android.log.Logger.INFO +import org.maplibre.android.maps.MapLibreMap + + +// # --8<-- [start:ObserverActivity] /** * Test activity showcasing logging observer actions from the core */ @@ -30,6 +35,8 @@ class ObserverActivity : AppCompatActivity(), MapView.OnGlyphsRequestedListener, MapView.OnSpriteLoadedListener, MapView.OnSpriteRequestedListener { + // # --8<-- [end:ObserverActivity] + private lateinit var mapView: MapView companion object { @@ -38,9 +45,11 @@ class ObserverActivity : AppCompatActivity(), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_map_simple) + setContentView(R.layout.activity_map_events) mapView = findViewById(R.id.mapView) mapView.onCreate(savedInstanceState) + + // # --8<-- [start:addListeners] mapView.addOnPreCompileShaderListener(this) mapView.addOnPostCompileShaderListener(this) mapView.addOnTileActionListener(this) @@ -48,44 +57,67 @@ class ObserverActivity : AppCompatActivity(), mapView.addOnGlyphsRequestedListener(this) mapView.addOnSpriteLoadedListener(this) mapView.addOnSpriteRequestedListener(this) + // # --8<-- [end:addListeners] + mapView.getMapAsync { it.setStyle( - Style.Builder().fromUri(TestStyles.getPredefinedStyleWithFallback("Streets")) + Style.Builder().fromUri(TestStyles.DEMOTILES) ) } + + // print and clear action journal + val fab = findViewById(R.id.fab) + fab?.setOnClickListener { _: View? -> + mapView.getMapAsync { + printActionJournal(it) + } + } + } + + // # --8<-- [start:printActionJournal] + fun printActionJournal(map: MapLibreMap) { + // configure using `MapLibreMapOptions.actionJournal*` methods + + Logger.i(TAG,"ActionJournal files: \n${map.actionJournalLogFiles.joinToString("\n")}") + Logger.i(TAG,"ActionJournal : \n${map.actionJournalLog.joinToString("\n")}") + + // print only the newest events on each call + map.clearActionJournalLog() } + // # --8<-- [end:printActionJournal] private val shaderTimes: HashMap = HashMap() - public override fun onPreCompileShader(id: Int, type: Int, defines: String) { + // # --8<-- [start:mapEvents] + override fun onPreCompileShader(id: Int, type: Int, defines: String) { shaderTimes["${id}-${type}-${defines}"] = TimeSource.Monotonic.markNow() Logger.i(TAG, "A new shader is being compiled, shaderID:${id}, backend type:${type}, program configuration:${defines}") } - public override fun onPostCompileShader(id: Int, type: Int, defines: String) { + override fun onPostCompileShader(id: Int, type: Int, defines: String) { val startTime = shaderTimes.get("${id}-${type}-${defines}") if (startTime != null) { Logger.i(TAG, "A shader has been compiled in ${startTime.elapsedNow()}, shaderID:${id}, backend type:${type}, program configuration:${defines}") } } - public override fun onGlyphsRequested(fontStack: Array, rangeStart: Int, rangeEnd: Int) { + override fun onGlyphsRequested(fontStack: Array, rangeStart: Int, rangeEnd: Int) { Logger.i(TAG, "Glyphs are being requested for the font stack $fontStack, ranging from $rangeStart to $rangeEnd") } - public override fun onGlyphsLoaded(fontStack: Array, rangeStart: Int, rangeEnd: Int) { + override fun onGlyphsLoaded(fontStack: Array, rangeStart: Int, rangeEnd: Int) { Logger.i(TAG, "Glyphs have been loaded for the font stack $fontStack, ranging from $rangeStart to $rangeEnd") } - public override fun onSpriteRequested(id: String, url: String) { + override fun onSpriteRequested(id: String, url: String) { Logger.i(TAG, "The sprite $id has been requested from $url") } - public override fun onSpriteLoaded(id: String, url: String) { + override fun onSpriteLoaded(id: String, url: String) { Logger.i(TAG, "The sprite $id has been loaded from $url") } - public override fun onTileAction(op: TileOperation, x: Int, y: Int, z: Int, wrap: Int, overscaledZ: Int, sourceID: String) { + override fun onTileAction(op: TileOperation, x: Int, y: Int, z: Int, wrap: Int, overscaledZ: Int, sourceID: String) { val tile = "X:${x}, Y:${y}, Z:${z}, Wrap:${wrap}, OverscaledZ:${overscaledZ}, SourceID:${sourceID}" when (op) { TileOperation.RequestedFromCache -> Logger.i(TAG, "Requesting tile ${tile} from the cache") @@ -99,6 +131,7 @@ class ObserverActivity : AppCompatActivity(), TileOperation.NullOp -> Logger.e(TAG, "An unknown tile operation was emitted for tile ${tile}") } } + // # --8<-- [end:mapEvents] override fun onStart() { super.onStart() diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml new file mode 100644 index 000000000000..5a0cdfd4e927 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/platform/android/docs/observability/action-journal.md b/platform/android/docs/observability/action-journal.md new file mode 100644 index 000000000000..4f4caee74d3f --- /dev/null +++ b/platform/android/docs/observability/action-journal.md @@ -0,0 +1,80 @@ +# Action Journal + +{{ activity_source_note("ObserverActivity.kt") }} + +The Action Journal provides functionality for persistent logging of top level map events. + + + +Its primary use case is to assist in debugging problematic sessions and crashes by offering additional insight into the actions performed by the map at the time of failure. Data is stored in human readable format, which is useful for analyzing individual cases, but can also be easily translated and aggregated into a database, allowing for efficient analysis of multiple cases and helping to identify recurring patterns (Google BigQuery, AWS Glue + S3 + Athena, etc). + +We are always interested in improving observability, so if you have a special use case, feel free to [open an issue or pull request](https://github.com/maplibre/maplibre-native) to extend the types of observability methods. + +## Enabling the Action Journal + +You can enable the action journal either through XML: + +```xml +--8<-- "MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml:MapView" +``` + +Or by passing the corresponding options with `MapLibreMapOptions` to `MapView`. For more information see [Configuration](../configuration.md). + +## Logging implementation details + +The logging is implemented using rolling files with a size based policy: + +- A new file is created when the current log size exceeds `MapLibreMapOptions.actionJournalLogFileSize`. +- When the maximum number of files exceeds `MapLibreMapOptions.actionJournalLogFileCount`: + - The oldest one is deleted. + - The remaining files are renamed sequentially to maintain the naming convention `action_journal.0.log` through `action_journal.{logFileCount - 1}.log`. +- Each file contains one event per line. +- All files are stored in an umbrella `action_journal` directory at `MapLibreMapOptions.actionJournalPath`. + +See also: `MapLibreMap`, `MapLibreMapOptions`. + +## Event format + +Events are stored as JSON objects with the following format: + +| Field | Type | Required | Description | +| :---- | :--: | :------: | :---------- | +| name | string | true | event name | +| time | string | true | event time ([ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) with milliseconds) | +| styleName | string | false | currently loaded style name | +| styleURL | string | false | currently loaded style URL | +| clientName | string | false | | +| clientVersion | string | false | | +| event | object | false | event specific data - consists of encoded values of the parameters passed to their `MLNMapViewDelegate` counterparts + + +``` +{ + "name" : "onTileAction", + "time" : "2025-04-17T13:13:13.974Z", + "styleName" : "Streets", + "styleURL" : "maptiler://maps/streets", + "clientName" : "App", + "clientVersion" : "1.0", + "event" : { + "action" : "RequestedFromNetwork", + "tileX" : 0, + "tileY" : 0, + "tileZ" : 0, + "overscaledZ" : 0, + "sourceID" : "openmaptiles" + } +} +``` + +## Usage + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:printActionJournal" +``` + +## Alternative + +The implementation is kept close to the core events to minimize additional locking and avoid platform-specific conversions and calls. As a result customization options and extensibility is limited. + +For greater flexibility, consider using the `MapView` event interface (see also `MapChangeReceiver`). It provides hooks for most Action Journal events and allows for more customizable querying and storage of map data. However, this comes at the cost of added complexity. See [Observe Map Events](./observe-map-events.md) to learn about the map events that you can listen for, which mirror the events available in the action journal. diff --git a/platform/android/docs/observability/observe-map-events.md b/platform/android/docs/observability/observe-map-events.md new file mode 100644 index 000000000000..4c27f6bf313c --- /dev/null +++ b/platform/android/docs/observability/observe-map-events.md @@ -0,0 +1,21 @@ +# Observe Map Events + +{{ activity_source_note("ObserverActivity.kt") }} + +You can observe-low level map events that are happening by registering listeners to a `MapView`. Below you can see the the map events that are currently available. + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:mapEvents" +``` + +You need to register them with these APIs: + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:addListeners" +``` + +In this case we implement them by implementing the interfaces below in the activity class, but you could also use lambdas. + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:ObserverActivity" +``` diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index facd90f72a8e..4f732095ff13 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -50,6 +50,7 @@ MLN_GENERATED_DARWIN_TEST_CODE = [ ] MLN_DARWIN_OBJC_HEADERS = [ + "src/MLNActionJournalOptions.h", "src/MLNAnnotation.h", "src/MLNAttributedExpression.h", "src/MLNAttributionInfo.h", @@ -71,6 +72,7 @@ MLN_DARWIN_OBJC_HEADERS = [ "src/MLNLocationManager.h", "src/MLNLoggingConfiguration.h", "src/MLNMapCamera.h", + "src/MLNMapOptions.h", "src/MLNMapSnapshotter.h", "src/MLNMultiPoint.h", "src/MLNNetworkConfiguration.h", @@ -126,6 +128,7 @@ MLN_DARWIN_OBJCPP_HEADERS = [ ] MLN_DARWIN_PRIVATE_HEADERS = [ + "src/MLNActionJournalOptions_Private.h", "src/MLNAttributionInfo_Private.h", "src/MLNComputedShapeSource_Private.h", "src/MLNCustomStyleLayer_Private.h", @@ -161,6 +164,7 @@ MLN_DARWIN_PRIVATE_HEADERS = [ ] MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ + "src/MLNActionJournalOptions.mm", "src/MLNAttributionInfo.mm", "src/MLNBackendResource.mm", "src/MLNComputedShapeSource.mm", @@ -173,6 +177,7 @@ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ "src/MLNImageSource.mm", "src/MLNLoggingConfiguration.mm", "src/MLNMapCamera.mm", + "src/MLNMapOptions.mm", "src/MLNMapSnapshotter.mm", "src/MLNMultiPoint.mm", "src/MLNNetworkConfiguration.mm", diff --git a/platform/darwin/src/MLNActionJournalOptions.h b/platform/darwin/src/MLNActionJournalOptions.h new file mode 100644 index 000000000000..635db686923b --- /dev/null +++ b/platform/darwin/src/MLNActionJournalOptions.h @@ -0,0 +1,35 @@ +#import + +#import "MLNFoundation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + The ``MLNActionJournalOptions`` defines action journal properties such as path, log size, etc... + */ +MLN_EXPORT +@interface MLNActionJournalOptions : NSObject + +/** + * Enable/disable journal logging + */ +@property (nonatomic) BOOL enabled; + +/** + * Local file path. + */ +@property (nonatomic, nonnull) NSString* path; + +/** + * Log file size (total journal size is equal to `logFileSize * logFileCount`) + */ +@property (nonatomic) NSInteger logFileSize; + +/** + * Maximum number of log files + */ +@property (nonatomic) NSInteger logFileCount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNActionJournalOptions.mm b/platform/darwin/src/MLNActionJournalOptions.mm new file mode 100644 index 000000000000..a56e684f0d35 --- /dev/null +++ b/platform/darwin/src/MLNActionJournalOptions.mm @@ -0,0 +1,54 @@ +#import "MLNActionJournalOptions.h" +#import + +@implementation MLNActionJournalOptions { + std::unique_ptr _actionJournalOptionsInternal; +} + +- (instancetype)init { + if (self = [super init]) { + _actionJournalOptionsInternal = std::make_unique(); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + _actionJournalOptionsInternal->withPath([paths.firstObject stringByAppendingPathComponent:@""].UTF8String); + } + return self; +} + +- (mbgl::util::ActionJournalOptions)getCoreOptions { + return *_actionJournalOptionsInternal; +} + +- (void)setEnabled:(BOOL)value { + _actionJournalOptionsInternal->enable(value); +} + +- (BOOL)enabled { + return _actionJournalOptionsInternal->enabled(); +} + +- (void)setPath:(NSString*)value { + _actionJournalOptionsInternal->withPath(value.UTF8String); +} + +- (NSString*)path { + return [NSString stringWithUTF8String:_actionJournalOptionsInternal->path().c_str()]; +} + +- (void)setLogFileSize:(NSInteger)value { + _actionJournalOptionsInternal->withLogFileSize(static_cast(value)); +} + +- (NSInteger)logFileSize { + return _actionJournalOptionsInternal->logFileSize(); +} + +- (void)setLogFileCount:(NSInteger)value { + _actionJournalOptionsInternal->withLogFileCount(static_cast(value)); +} + +- (NSInteger)logFileCount { + return _actionJournalOptionsInternal->logFileCount(); +} + +@end diff --git a/platform/darwin/src/MLNActionJournalOptions_Private.h b/platform/darwin/src/MLNActionJournalOptions_Private.h new file mode 100644 index 000000000000..a48680b0695d --- /dev/null +++ b/platform/darwin/src/MLNActionJournalOptions_Private.h @@ -0,0 +1,12 @@ +#import +#import "MLNActionJournalOptions.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MLNActionJournalOptions (Private) + +- (mbgl::util::ActionJournalOptions)getCoreOptions; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNMapOptions.h b/platform/darwin/src/MLNMapOptions.h new file mode 100644 index 000000000000..48267467c45b --- /dev/null +++ b/platform/darwin/src/MLNMapOptions.h @@ -0,0 +1,37 @@ +#import + +#import "MLNActionJournalOptions.h" +#import "MLNFoundation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + The ``MLNMapOptions`` object provides a way to set map properties for each instance + */ +MLN_EXPORT +@interface MLNMapOptions : NSObject + +/** + URL of the map style to display. The URL may be a full HTTP + or HTTPS URL, a canonical URL or a path to a local file relative + to the application’s resource path. Specify `nil` for the default style. + */ +@property (nonatomic, nullable) NSURL *styleURL; + +/** + JSON string of the map style to display. The JSON must conform to the +
MapLibre Style Specification. + Specify `nil` for the default style. + Ignored if `styleURL` is set to a non-nil value. + */ + +@property (nonatomic, nullable) NSString *styleJSON; + +/** + Action journal options + */ +@property (nonatomic, nonnull) MLNActionJournalOptions *actionJournalOptions; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNMapOptions.mm b/platform/darwin/src/MLNMapOptions.mm new file mode 100644 index 000000000000..d9ddabbc355a --- /dev/null +++ b/platform/darwin/src/MLNMapOptions.mm @@ -0,0 +1,23 @@ +#import "MLNMapOptions.h" + +@interface MLNMapOptions () + +@end + +@implementation MLNMapOptions + +-(instancetype _Nonnull)init +{ + self = [super init]; + if (self) + { + _styleURL = nil; + _styleJSON = nil; + + _actionJournalOptions = [[MLNActionJournalOptions alloc] init]; + } + + return self; +} + +@end diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index 18f05e9b21a3..b818510d755d 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -4,6 +4,7 @@ load("@rules_apple//apple:apple.bzl", "apple_static_xcframework", "apple_xcframe load("@rules_apple//apple:ios.bzl", "ios_application", "ios_framework") load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") load("@rules_apple//apple:versioning.bzl", "apple_bundle_version") + load( "@rules_xcodeproj//xcodeproj:defs.bzl", "top_level_target", diff --git a/platform/ios/MapLibre.docc/ActionJournalExample.md b/platform/ios/MapLibre.docc/ActionJournalExample.md new file mode 100644 index 000000000000..4842f0abe482 --- /dev/null +++ b/platform/ios/MapLibre.docc/ActionJournalExample.md @@ -0,0 +1,84 @@ +# Action Journal + +Learn about the ``MLNMapView`` methods for logging and viewing map actions. + + + +The Action Journal provides functionality for persistent logging of top level map events. + +Its primary use case is to assist in debugging problematic sessions and crashes by offering additional insight into the actions performed by the map at the time of failure. Data is stored in human readable format, which is useful for analyzing individual cases, but can also be easily translated and aggregated into a database, allowing for efficient analysis of multiple cases and helping to identify recurring patterns (Google BigQuery, AWS Glue + S3 + Athena, etc). + +We are always interested in improving observability, so if you have a special use case, feel free to [open an issue or pull request](https://github.com/maplibre/maplibre-native) to extend the types of observability methods. + +## Logging implementation details + +The logging is implemented using rolling files with a size based policy: + +- A new file is created when the current log size exceeds ``MLNActionJournalOptions/logFileSize``. +- When the maximum number of files exceeds ``MLNActionJournalOptions/logFileCount``: + - The oldest one is deleted. + - The remaining files are renamed sequentially to maintain the naming convention `action_journal.0.log` through `action_journal.{logFileCount - 1}.log`. +- Each file contains one event per line. +- All files are stored in an umbrella "action_journal" directory at ``MLNActionJournalOptions/path``. + +See also: ``MLNSettings``, ``MLNActionJournalOptions``. + +## Event format + +Events are stored as JSON objects with the following format: + +| Field | Type | Required | Description | +| :---- | :--: | :------: | :---------- | +| name | string | true | event name | +| time | string | true | event time ([ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) with milliseconds) | +| styleName | string | false | currently loaded style name | +| styleURL | string | false | currently loaded style URL | +| clientName | string | false | | +| clientVersion | string | false | | +| event | object | false | event specific data - consists of encoded values of the parameters passed to their ``MLNMapViewDelegate`` counterparts + +``` +{ + "name" : "onTileAction", + "time" : "2025-04-17T13:13:13.974Z", + "styleName" : "Streets", + "styleURL" : "maptiler://maps/streets", + "clientName" : "App", + "clientVersion" : "1.0", + "event" : { + "action" : "RequestedFromNetwork", + "tileX" : 0, + "tileY" : 0, + "tileZ" : 0, + "overscaledZ" : 0, + "sourceID" : "openmaptiles" + } +} +``` + +## Usage + +Enabling the action journal. + + + +```swift +MLNSettings.actionJournalOptions.enabled = true +``` + + + +```swift +@objc func printActionJournal() { + print("ActionJournalLog files: \(mapView.getActionJournalLogFiles())") + print("ActionJournalLog : \(mapView.getActionJournalLog())") + // print only the newest events on each call + mapView.clearActionJournalLog() + } +``` + +## Alternative + +The implementation is kept close to the core events to minimize additional locking and avoid platform-specific conversions and calls. As a result customization options and extensibility is limited. + +For greater flexibility, consider using the ``MLNMapViewDelegate`` interface. It provides hooks for most Action Journal events and allows for more customizable querying and storage of map data. However, this comes at the cost of added complexity. See [Observe Low-Level Events](./ObserverExample.md) to learn about the map events that you can listen for, which mirror the events available in the action journal. diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index 051fc8dff279..e459c0eb68b6 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -49,9 +49,13 @@ Powerful, free and open-source mapping toolkit with full control over data sourc - - -### Advanced +### Observability - +- + +### Advanced + - ### Other Articles diff --git a/platform/ios/app-swift/Sources/ObserverExample.swift b/platform/ios/app-swift/Sources/ObserverExample.swift index 74938ac0e2d8..167c1bfe1913 100644 --- a/platform/ios/app-swift/Sources/ObserverExample.swift +++ b/platform/ios/app-swift/Sources/ObserverExample.swift @@ -4,11 +4,18 @@ import UIKit class ObserverExampleView: UIViewController, MLNMapViewDelegate { var mapView: MLNMapView! + var button: UIButton! override func viewDidLoad() { super.viewDidLoad() - mapView = MLNMapView(frame: view.bounds, styleURL: AMERICANA_STYLE) + // #-example-code(actionJournalOptions) + let options = MLNMapOptions() + options.actionJournalOptions.enabled = true + options.styleURL = AMERICANA_STYLE + mapView = MLNMapView(frame: view.bounds, options: options) + // #-end-example-code + mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] mapView.setCenter( @@ -19,8 +26,25 @@ class ObserverExampleView: UIViewController, MLNMapViewDelegate { view.addSubview(mapView) mapView.delegate = self + + button = UIButton(frame: CGRect(x: view.bounds.width / 2 - 100, y: view.bounds.height - 200, width: 200, height: 30)) + button.setTitle("Print Action Journal", for: .normal) + button.layer.cornerRadius = 15 + button.backgroundColor = UIColor(red: 0.96, green: 0.65, blue: 0.14, alpha: 1.0) + button.addTarget(self, action: #selector(printActionJournal), for: .touchUpInside) + view.addSubview(button) + } + + // #-example-code(ObserverExampleActionJournal) + @objc func printActionJournal() { + print("ActionJournalLog files: \(mapView.getActionJournalLogFiles())") + print("ActionJournalLog : \(mapView.getActionJournalLog())") + // print only the newest events on each call + mapView.clearActionJournalLog() } + // #-end-example-code + // #-example-code(ObserverExampleShaders) func mapView(_: MLNMapView, shaderWillCompile id: Int, backend: Int, defines: String) { print("A new shader is being compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") diff --git a/platform/ios/ios.cmake b/platform/ios/ios.cmake index 0be447426e5c..dddced2479ae 100644 --- a/platform/ios/ios.cmake +++ b/platform/ios/ios.cmake @@ -4,6 +4,12 @@ target_include_directories( ${PROJECT_SOURCE_DIR}/platform/ios/src ) +target_link_libraries( + mbgl-core + PRIVATE + MapLibreNative::Base::Extras::filesystem +) + file(GLOB_RECURSE IOS_SDK_SOURCE_FILES "${PROJECT_SOURCE_DIR}/platform/darwin/src/*.m" "${PROJECT_SOURCE_DIR}/platform/darwin/src/*.mm" diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 89f78784149b..d56c07f365cc 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -5,6 +5,7 @@ #import "MLNFoundation.h" #import "MLNGeometry.h" #import "MLNMapCamera.h" +#import "MLNMapOptions.h" #import "MLNStyle.h" #import "MLNTypes.h" @@ -219,6 +220,16 @@ MLN_EXPORT */ - (instancetype)initWithFrame:(CGRect)frame styleJSON:(NSString *)styleJSON; +/** + Initializes and returns a newly allocated map view with the specified frame + and the default style. + + @param frame The frame for the view, measured in points. + @param options The map instance options + @return An initialized map view. + */ +- (instancetype)initWithFrame:(CGRect)frame options:(MLNMapOptions *)options; + // MARK: Accessing the Delegate /** @@ -2146,6 +2157,40 @@ vertically on the map. */ @property (nonatomic) MLNMapDebugMaskOptions debugMask; +/** + Get the list of action journal log files from oldest to newest. + + @return An array of log file paths. +*/ +- (NSArray *)getActionJournalLogFiles; + +/** + Get the action journal events from oldest to newest. + + Each element contains a serialized json object with the event data. + Example + `{ + "name" : "onTileAction", + "time" : "2025-04-17T13:13:13.974Z", + "styleName" : "Streets", + "styleURL" : "maptiler://maps/streets", + "event" : { + "action" : "RequestedFromNetwork", + "tileX" : 0, + "tileY" : 0, + "tileZ" : 0, + "overscaledZ" : 0, + "sourceID" : "openmaptiles" + } + }` + */ +- (NSArray *)getActionJournalLog; + +/** + Clear stored action journal events. + */ +- (void)clearActionJournalLog; + - (MLNBackendResource *)backendResource; /** diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 4e3083854f30..7eeacf3d1607 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -68,6 +69,7 @@ #import "MLNNetworkConfiguration_Private.h" #import "MLNReachability.h" #import "MLNSettings_Private.h" +#import "MLNActionJournalOptions_Private.h" #import "MLNMapProjection.h" #include @@ -503,7 +505,7 @@ - (instancetype)initWithFrame:(CGRect)frame { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); MLNLogDebug(@"Initializing frame: %@", NSStringFromCGRect(frame)); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleURL = nil; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } @@ -516,7 +518,7 @@ - (instancetype)initWithFrame:(CGRect)frame styleURL:(nullable NSURL *)styleURL { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); MLNLogDebug(@"Initializing frame: %@ styleURL: %@", NSStringFromCGRect(frame), styleURL); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleURL = styleURL; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } @@ -529,7 +531,7 @@ - (instancetype)initWithFrame:(CGRect)frame styleJSON:(NSString *)styleJSON { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); MLNLogDebug(@"Initializing frame: %@ styleJSON: %@", NSStringFromCGRect(frame), styleJSON); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleJSON = styleJSON; _initialStyleJSON = [styleJSON copy]; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); @@ -537,12 +539,39 @@ - (instancetype)initWithFrame:(CGRect)frame styleJSON:(NSString *)styleJSON return self; } +- (instancetype)initWithFrame:(CGRect)frame options:(MLNMapOptions *)options +{ + if (self = [super initWithFrame:frame]) + { + MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); + MLNLogDebug(@"Initializing frame: %@ with options", NSStringFromCGRect(frame)); + [self commonInitWithOptions:options]; + + if (options) + { + if (options.styleURL) { + self.styleURL = options.styleURL; + } else if (options.styleJSON) { + self.styleJSON = options.styleJSON; + _initialStyleJSON = [options.styleJSON copy]; + } else { + self.styleURL = nil; + } + } else { + self.styleURL = nil; + } + + MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); + } + return self; +} + - (instancetype)initWithCoder:(nonnull NSCoder *)decoder { if (self = [super initWithCoder:decoder]) { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleURL = nil; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } @@ -621,8 +650,13 @@ - (IBAction)reloadStyle:(__unused id)sender { return _rendererFrontend->getRenderer(); } -- (void)commonInit +- (void)commonInitWithOptions:(MLNMapOptions*)mlnMapoptions { + if (mlnMapoptions == nil) + { + mlnMapoptions = [[MLNMapOptions alloc] init]; + } + _opaque = NO; // setup accessibility @@ -683,8 +717,11 @@ - (void)commonInit resourceOptions.withApiKey([apiKey UTF8String]); } + const mbgl::util::ActionJournalOptions& actionJournalOptions = [mlnMapoptions.actionJournalOptions getCoreOptions]; + NSAssert(!_mbglMap, @"_mbglMap should be NULL"); - _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions, clientOptions); + _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, + resourceOptions, clientOptions, actionJournalOptions); // start paused if launch into the background if (background) { @@ -7525,6 +7562,50 @@ - (void)triggerRepaint _mbglMap->triggerRepaint(); } +- (NSArray*)getActionJournalLogFiles +{ + const auto& actionJournal = _mbglMap->getActionJournal(); + if (!actionJournal) { + return nil; + } + + const auto& files = actionJournal->getLogFiles(); + NSMutableArray* objcFiles = [NSMutableArray new]; + + for (const auto& file : files) { + [objcFiles addObject:[NSString stringWithUTF8String:file.c_str()]]; + } + + return objcFiles; +} + +- (NSArray*)getActionJournalLog +{ + const auto& actionJournal = _mbglMap->getActionJournal(); + if (!actionJournal) { + return nil; + } + + const auto& log = actionJournal->getLog(); + NSMutableArray* objcLog = [NSMutableArray new]; + + for (const auto& event : log) { + [objcLog addObject:[NSString stringWithUTF8String:event.c_str()]]; + } + + return objcLog; +} + +- (void)clearActionJournalLog +{ + const auto& actionJournal = _mbglMap->getActionJournal(); + if (!actionJournal) { + return; + } + + actionJournal->clearLog(); +} + - (MLNBackendResource *)backendResource { return _mbglView->getObject(); } diff --git a/platform/macos/src/MLNMapView.h b/platform/macos/src/MLNMapView.h index d3db2ea6f988..ef4ac5e12052 100644 --- a/platform/macos/src/MLNMapView.h +++ b/platform/macos/src/MLNMapView.h @@ -4,6 +4,7 @@ #import "MLNFoundation.h" #import "MLNGeometry.h" +#import "MLNMapOptions.h" #import "MLNStyle.h" #import "MLNTypes.h" @@ -90,6 +91,16 @@ MLN_EXPORT IB_DESIGNABLE @interface MLNMapView : NSView */ - (instancetype)initWithFrame:(NSRect)frame styleURL:(nullable NSURL *)styleURL; +/** + Initializes and returns a newly allocated map view with the specified frame + and the default style. + + @param frame The frame for the view, measured in points. + @param options The map instance options + @return An initialized map view. + */ +- (instancetype)initWithFrame:(CGRect)frame options:(MLNMapOptions *)options; + // MARK: Accessing the Delegate /** @@ -1270,6 +1281,17 @@ around the returned camera object if it were set as the receiver’s camera. */ @property (nonatomic) MLNMapDebugMaskOptions debugMask; +/** + Get the action journal events from oldest to newest. + Each element contains a serialized json object with the event data. + */ +- (NSArray *)getActionJournalLog; + +/** + Clear stored action journal events. + */ +- (void)clearActionJournalLog; + @end NS_ASSUME_NONNULL_END diff --git a/platform/macos/src/MLNMapView.mm b/platform/macos/src/MLNMapView.mm index 6ef3e88638ec..cdaf39dd2599 100644 --- a/platform/macos/src/MLNMapView.mm +++ b/platform/macos/src/MLNMapView.mm @@ -34,6 +34,7 @@ #import #import #import +#import #import #import #import @@ -59,6 +60,7 @@ #import "MLNNetworkConfiguration_Private.h" #import "MLNLoggingConfiguration_Private.h" #import "MLNReachability.h" +#import "MLNActionJournalOptions_Private.h" #import "MLNSettings_Private.h" #import @@ -221,7 +223,7 @@ - (instancetype)initWithFrame:(NSRect)frameRect { if (self = [super initWithFrame:frameRect]) { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); MLNLogDebug(@"Initializing frame: %@", NSStringFromRect(frameRect)); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleURL = nil; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } @@ -232,17 +234,38 @@ - (instancetype)initWithFrame:(NSRect)frame styleURL:(nullable NSURL *)styleURL if (self = [super initWithFrame:frame]) { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); MLNLogDebug(@"Initializing frame: %@ styleURL: %@", NSStringFromRect(frame), styleURL); - [self commonInit]; + [self commonInitWithOptions:nil]; self.styleURL = styleURL; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } return self; } +- (instancetype)initWithFrame:(CGRect)frame options:(MLNMapOptions *)options +{ + if (self = [super initWithFrame:frame]) + { + MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); + MLNLogDebug(@"Initializing frame: %@ with options", NSStringFromRect(frame)); + [self commonInitWithOptions:options]; + + if (options) { + if (options.styleURL) { + self.styleURL = options.styleURL; + } + } else { + self.styleURL = nil; + } + + MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); + } + return self; +} + - (instancetype)initWithCoder:(nonnull NSCoder *)decoder { if (self = [super initWithCoder:decoder]) { MLNLogInfo(@"Starting %@ initialization.", NSStringFromClass([self class])); - [self commonInit]; + [self commonInitWithOptions:nil]; MLNLogInfo(@"Finalizing %@ initialization.", NSStringFromClass([self class])); } return self; @@ -262,7 +285,13 @@ + (NSArray *)restorableStateKeyPaths { return @[@"camera", @"debugMask"]; } -- (void)commonInit { +- (void)commonInitWithOptions:(MLNMapOptions*)mlnMapoptions +{ + if (mlnMapoptions == nil) + { + mlnMapoptions = [[MLNMapOptions alloc] init]; + } + [MLNNetworkConfiguration sharedManager]; _isTargetingInterfaceBuilder = NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent; @@ -308,7 +337,8 @@ - (void)commonInit { resourceOptions.withApiKey([apiKey UTF8String]); } - _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions, clientOptions); + const mbgl::util::ActionJournalOptions& actionJournalOptions = [mlnMapoptions.actionJournalOptions getCoreOptions]; + _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions, clientOptions, actionJournalOptions); // Notify map object when network reachability status changes. _reachability = [MLNReachability reachabilityForInternetConnection]; @@ -3195,4 +3225,31 @@ - (void)setDebugMask:(MLNMapDebugMaskOptions)debugMask { _mbglMap->setDebug(options); } +- (NSArray*)getActionJournalLog +{ + const auto& actionJournal = _mbglMap->getActionJournal(); + if (!actionJournal) { + return nil; + } + + const auto& log = actionJournal->getLog(); + NSMutableArray* objcLog = [NSMutableArray new]; + + for (const auto& event : log) { + [objcLog addObject:[NSString stringWithUTF8String:event.c_str()]]; + } + + return objcLog; +} + +- (void)clearActionJournalLog +{ + const auto& actionJournal = _mbglMap->getActionJournal(); + if (!actionJournal) { + return; + } + + actionJournal->clearLog(); +} + @end diff --git a/platform/macos/src/MLNMapViewDelegate.h b/platform/macos/src/MLNMapViewDelegate.h index 07be47b8a6c7..9dcf94141765 100644 --- a/platform/macos/src/MLNMapViewDelegate.h +++ b/platform/macos/src/MLNMapViewDelegate.h @@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @class MLNPolyline; @class MLNShape; @class MLNStyle; +@class MLNSource; @protocol MLNAnnotation; /** diff --git a/shaders/generate_shader_code.mjs b/shaders/generate_shader_code.mjs index 1ed98ebaf6a1..78e97f301e96 100644 --- a/shaders/generate_shader_code.mjs +++ b/shaders/generate_shader_code.mjs @@ -220,6 +220,7 @@ const root = path.dirname(import.meta.dirname); const outLocation = args.out ? args.out : root; const shaderRoot = path.join(root, "shaders"); const outputRoot = path.join(outLocation, "include/mbgl/shaders"); +const cppOutputRoot = path.join(outLocation, "src/mbgl/shaders"); let generatedHeaders = []; let shaderNames = []; @@ -317,4 +318,21 @@ struct ShaderSource { } // namespace mbgl `); +// Generate shader_source.cpp +fs.writeFileSync(path.join(cppOutputRoot, "shader_source.cpp"), +`${generatedHeader} +#include +#include + +namespace mbgl { + +using namespace shaders; + +MBGL_DEFINE_ENUM(BuiltIn, { +{BuiltIn::None, "None"},${shaderNames.map(name => `\n{BuiltIn::` + name + `, "` + name + `"}`)} +}); + +} // namespace mbgl +`); + console.log("Shaders generated!"); diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 9bad545b1842..cff580adb3c1 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -31,19 +32,30 @@ Map::Map(RendererFrontend& frontend, MapObserver& observer, const MapOptions& mapOptions, const ResourceOptions& resourceOptions, - const ClientOptions& clientOptions) + const ClientOptions& clientOptions, + const util::ActionJournalOptions& actionJournalOptions) : impl(std::make_unique(frontend, observer, FileSourceManager::get() ? std::shared_ptr(FileSourceManager::get()->getFileSource( ResourceLoader, resourceOptions, clientOptions)) : nullptr, - mapOptions)) {} + mapOptions)) { + if (actionJournalOptions.enabled()) { + impl->actionJournal = std::make_unique(*this, actionJournalOptions); + } +} -Map::Map(std::unique_ptr impl_) - : impl(std::move(impl_)) {} +Map::Map(std::unique_ptr impl_, const util::ActionJournalOptions& actionJournalOptions) + : impl(std::move(impl_)) { + if (actionJournalOptions.enabled()) { + impl->actionJournal = std::make_unique(*this, actionJournalOptions); + } +} -Map::~Map() = default; +Map::~Map() { + impl->actionJournal.reset(); +} void Map::renderStill(StillImageCallback callback) { if (!callback) { @@ -527,4 +539,12 @@ FreeCameraOptions Map::getFreeCameraOptions() const { return impl->transform.getFreeCameraOptions(); } +ClientOptions Map::getClientOptions() const { + return impl->fileSource ? impl->fileSource->getClientOptions() : ClientOptions(); +} + +const std::unique_ptr& Map::getActionJournal() { + return impl->actionJournal; +} + } // namespace mbgl diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 6b5a6454f182..bca50cd62e04 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include namespace mbgl { @@ -47,7 +49,7 @@ Map::Impl::Impl(RendererFrontend& frontend_, const MapOptions& mapOptions) : observer(observer_), rendererFrontend(frontend_), - transform(observer, mapOptions.constrainMode(), mapOptions.viewportMode()), + transform(*this, mapOptions.constrainMode(), mapOptions.viewportMode()), mode(mapOptions.mapMode()), pixelRatio(mapOptions.pixelRatio()), crossSourceCollisions(mapOptions.crossSourceCollisions()), @@ -66,10 +68,38 @@ Map::Impl::~Impl() { rendererFrontend.reset(); }; +void Map::Impl::onCameraWillChange(MapObserver::CameraChangeMode cameraMode) { + observer.onCameraWillChange(cameraMode); + + if (actionJournal) { + actionJournal->impl->onCameraWillChange(cameraMode); + } +} + +void Map::Impl::onCameraIsChanging() { + observer.onCameraIsChanging(); + + if (actionJournal) { + actionJournal->impl->onCameraIsChanging(); + } +} + +void Map::Impl::onCameraDidChange(MapObserver::CameraChangeMode cameraMode) { + observer.onCameraDidChange(cameraMode); + + if (actionJournal) { + actionJournal->impl->onCameraDidChange(cameraMode); + } +} + // MARK: - Map::Impl StyleObserver void Map::Impl::onSourceChanged(style::Source& source) { observer.onSourceChanged(source); + + if (actionJournal) { + actionJournal->impl->onSourceChanged(source); + } } void Map::Impl::onUpdate() { @@ -108,6 +138,10 @@ void Map::Impl::onStyleLoading() { loading = true; rendererFullyLoaded = false; observer.onWillStartLoadingMap(); + + if (actionJournal) { + actionJournal->impl->onWillStartLoadingMap(); + } } void Map::Impl::onStyleLoaded() { @@ -117,8 +151,13 @@ void Map::Impl::onStyleLoaded() { if (LayerManager::annotationsEnabled) { annotationManager.onStyleLoaded(); } + observer.onDidFinishLoadingStyle(); + if (actionJournal) { + actionJournal->impl->onDidFinishLoadingStyle(); + } + #if !defined(NDEBUG) logStyleDependencies(EventSeverity::Info, Event::Style, *style); #endif @@ -145,18 +184,34 @@ void Map::Impl::onStyleError(std::exception_ptr error) { } observer.onDidFailLoadingMap(type, description); + + if (actionJournal) { + actionJournal->impl->onDidFailLoadingMap(type, description); + } } void Map::Impl::onSpriteLoaded(const std::optional& sprite) { observer.onSpriteLoaded(sprite); + + if (actionJournal) { + actionJournal->impl->onSpriteLoaded(sprite); + } } void Map::Impl::onSpriteError(const std::optional& sprite, std::exception_ptr ex) { observer.onSpriteError(sprite, ex); + + if (actionJournal) { + actionJournal->impl->onSpriteError(sprite, ex); + } } void Map::Impl::onSpriteRequested(const std::optional& sprite) { observer.onSpriteRequested(sprite); + + if (actionJournal) { + actionJournal->impl->onSpriteRequested(sprite); + } } // MARK: - Map::Impl RendererObserver @@ -175,6 +230,10 @@ void Map::Impl::onResourceError(std::exception_ptr error) { void Map::Impl::onWillStartRenderingFrame() { if (mode == MapMode::Continuous) { observer.onWillStartRenderingFrame(); + + if (actionJournal) { + actionJournal->impl->onWillStartRenderingFrame(); + } } } @@ -186,16 +245,23 @@ void Map::Impl::onDidFinishRenderingFrame(RenderMode renderMode, rendererFullyLoaded = renderMode == RenderMode::Full; if (mode == MapMode::Continuous) { - observer.onDidFinishRenderingFrame({MapObserver::RenderMode(renderMode), - needsRepaint, - placemenChanged, - frameEncodingTime, - frameRenderingTime}); + const MapObserver::RenderFrameStatus frameStatus{ + MapObserver::RenderMode(renderMode), needsRepaint, placemenChanged, frameEncodingTime, frameRenderingTime}; + + observer.onDidFinishRenderingFrame(frameStatus); + + if (actionJournal) { + actionJournal->impl->onDidFinishRenderingFrame(frameStatus); + } if (needsRepaint || transform.inTransition()) { onUpdate(); } else if (rendererFullyLoaded) { observer.onDidBecomeIdle(); + + if (actionJournal) { + actionJournal->impl->onDidBecomeIdle(); + } } } else if (stillImageRequest && rendererFullyLoaded) { auto request = std::move(stillImageRequest); @@ -206,15 +272,28 @@ void Map::Impl::onDidFinishRenderingFrame(RenderMode renderMode, void Map::Impl::onWillStartRenderingMap() { if (mode == MapMode::Continuous) { observer.onWillStartRenderingMap(); + + if (actionJournal) { + actionJournal->impl->onWillStartRenderingMap(); + } } } void Map::Impl::onDidFinishRenderingMap() { if (mode == MapMode::Continuous && loading) { observer.onDidFinishRenderingMap(MapObserver::RenderMode::Full); + + if (actionJournal) { + actionJournal->impl->onDidFinishRenderingMap(MapObserver::RenderMode::Full); + } + if (loading) { loading = false; observer.onDidFinishLoadingMap(); + + if (actionJournal) { + actionJournal->impl->onDidFinishLoadingMap(); + } } } }; @@ -226,7 +305,13 @@ void Map::Impl::jumpTo(const CameraOptions& camera) { } void Map::Impl::onStyleImageMissing(const std::string& id, const std::function& done) { - if (!style->getImage(id)) observer.onStyleImageMissing(id); + if (!style->getImage(id)) { + observer.onStyleImageMissing(id); + + if (actionJournal) { + actionJournal->impl->onStyleImageMissing(id); + } + } done(); onUpdate(); @@ -242,40 +327,72 @@ void Map::Impl::onRemoveUnusedStyleImages(const std::vector& unused void Map::Impl::onRegisterShaders(gfx::ShaderRegistry& registry) { observer.onRegisterShaders(registry); + + if (actionJournal) { + actionJournal->impl->onRegisterShaders(registry); + } } void Map::Impl::onPreCompileShader(shaders::BuiltIn shaderID, gfx::Backend::Type type, const std::string& additionalDefines) { observer.onPreCompileShader(shaderID, type, additionalDefines); + + if (actionJournal) { + actionJournal->impl->onPreCompileShader(shaderID, type, additionalDefines); + } } void Map::Impl::onPostCompileShader(shaders::BuiltIn shaderID, gfx::Backend::Type type, const std::string& additionalDefines) { observer.onPostCompileShader(shaderID, type, additionalDefines); + + if (actionJournal) { + actionJournal->impl->onPostCompileShader(shaderID, type, additionalDefines); + } } void Map::Impl::onShaderCompileFailed(shaders::BuiltIn shaderID, gfx::Backend::Type type, const std::string& additionalDefines) { observer.onShaderCompileFailed(shaderID, type, additionalDefines); + + if (actionJournal) { + actionJournal->impl->onShaderCompileFailed(shaderID, type, additionalDefines); + } } void Map::Impl::onGlyphsLoaded(const FontStack& fontStack, const GlyphRange& ranges) { observer.onGlyphsLoaded(fontStack, ranges); + + if (actionJournal) { + actionJournal->impl->onGlyphsLoaded(fontStack, ranges); + } } void Map::Impl::onGlyphsError(const FontStack& fontStack, const GlyphRange& ranges, std::exception_ptr ex) { observer.onGlyphsError(fontStack, ranges, ex); + + if (actionJournal) { + actionJournal->impl->onGlyphsError(fontStack, ranges, ex); + } } void Map::Impl::onGlyphsRequested(const FontStack& fontStack, const GlyphRange& ranges) { observer.onGlyphsRequested(fontStack, ranges); + + if (actionJournal) { + actionJournal->impl->onGlyphsRequested(fontStack, ranges); + } } void Map::Impl::onTileAction(TileOperation op, const OverscaledTileID& id, const std::string& sourceID) { observer.onTileAction(op, id, sourceID); + + if (actionJournal) { + actionJournal->impl->onTileAction(op, id, sourceID); + } } } // namespace mbgl diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index d093b30f227b..1a8f6c4e14de 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -23,6 +23,10 @@ namespace gfx { class ShaderRegistry; } // namespace gfx +namespace util { +class ActionJournal; +} // namespace util + struct StillImageRequest { StillImageRequest(Map::StillImageCallback&& callback_) : callback(std::move(callback_)) {} @@ -30,11 +34,16 @@ struct StillImageRequest { Map::StillImageCallback callback; }; -class Map::Impl final : public style::Observer, public RendererObserver { +class Map::Impl final : public TransformObserver, public style::Observer, public RendererObserver { public: Impl(RendererFrontend&, MapObserver&, std::shared_ptr, const MapOptions&); ~Impl() final; + // TransformObserver + void onCameraWillChange(MapObserver::CameraChangeMode) final; + void onCameraIsChanging() final; + void onCameraDidChange(MapObserver::CameraChangeMode) final; + // StyleObserver void onSourceChanged(style::Source&) final; void onUpdate() final; @@ -69,6 +78,7 @@ class Map::Impl final : public style::Observer, public RendererObserver { MapObserver& observer; RendererFrontend& rendererFrontend; + std::unique_ptr actionJournal; Transform transform; diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index dbf23ae98827..72408bb6e141 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -40,7 +40,7 @@ static double _normalizeAngle(double angle, double anchorAngle) { return angle; } -Transform::Transform(MapObserver& observer_, ConstrainMode constrainMode, ViewportMode viewportMode) +Transform::Transform(TransformObserver& observer_, ConstrainMode constrainMode, ViewportMode viewportMode) : observer(observer_), state(constrainMode, viewportMode) {} diff --git a/src/mbgl/map/transform.hpp b/src/mbgl/map/transform.hpp index eac0e8fb99d6..4828f372f686 100644 --- a/src/mbgl/map/transform.hpp +++ b/src/mbgl/map/transform.hpp @@ -16,14 +16,28 @@ namespace mbgl { +class TransformObserver { +public: + virtual ~TransformObserver() = default; + + static TransformObserver& nullObserver() { + static TransformObserver observer; + return observer; + } + + virtual void onCameraWillChange(MapObserver::CameraChangeMode) {} + virtual void onCameraIsChanging() {} + virtual void onCameraDidChange(MapObserver::CameraChangeMode) {} +}; + class Transform : private util::noncopyable { public: - Transform(MapObserver& = MapObserver::nullObserver(), + Transform(TransformObserver& = TransformObserver::nullObserver(), ConstrainMode = ConstrainMode::HeightOnly, ViewportMode = ViewportMode::Default); Transform(const TransformState& state_) - : observer(MapObserver::nullObserver()), + : observer(TransformObserver::nullObserver()), state(state_) {} // Map view @@ -119,7 +133,7 @@ class Transform : private util::noncopyable { void setFreeCameraOptions(const FreeCameraOptions& options); private: - MapObserver& observer; + TransformObserver& observer; TransformState state; void startTransition(const CameraOptions&, diff --git a/src/mbgl/shaders/shader_source.cpp b/src/mbgl/shaders/shader_source.cpp new file mode 100644 index 000000000000..e14fee616d10 --- /dev/null +++ b/src/mbgl/shaders/shader_source.cpp @@ -0,0 +1,44 @@ +// Generated code, do not modify this file! +#include +#include + +namespace mbgl { + +using namespace shaders; + +MBGL_DEFINE_ENUM(BuiltIn, + {{BuiltIn::None, "None"}, + {BuiltIn::Prelude, "Prelude"}, + {BuiltIn::ClippingMaskProgram, "ClippingMaskProgram"}, + {BuiltIn::BackgroundShader, "BackgroundShader"}, + {BuiltIn::BackgroundPatternShader, "BackgroundPatternShader"}, + {BuiltIn::CircleShader, "CircleShader"}, + {BuiltIn::CollisionBoxShader, "CollisionBoxShader"}, + {BuiltIn::CollisionCircleShader, "CollisionCircleShader"}, + {BuiltIn::CustomGeometryShader, "CustomGeometryShader"}, + {BuiltIn::CustomSymbolIconShader, "CustomSymbolIconShader"}, + {BuiltIn::DebugShader, "DebugShader"}, + {BuiltIn::FillShader, "FillShader"}, + {BuiltIn::FillOutlineShader, "FillOutlineShader"}, + {BuiltIn::FillPatternShader, "FillPatternShader"}, + {BuiltIn::FillOutlinePatternShader, "FillOutlinePatternShader"}, + {BuiltIn::FillOutlineTriangulatedShader, "FillOutlineTriangulatedShader"}, + {BuiltIn::FillExtrusionShader, "FillExtrusionShader"}, + {BuiltIn::FillExtrusionPatternShader, "FillExtrusionPatternShader"}, + {BuiltIn::HeatmapShader, "HeatmapShader"}, + {BuiltIn::HeatmapTextureShader, "HeatmapTextureShader"}, + {BuiltIn::HillshadePrepareShader, "HillshadePrepareShader"}, + {BuiltIn::HillshadeShader, "HillshadeShader"}, + {BuiltIn::LineShader, "LineShader"}, + {BuiltIn::LineGradientShader, "LineGradientShader"}, + {BuiltIn::LinePatternShader, "LinePatternShader"}, + {BuiltIn::LocationIndicatorShader, "LocationIndicatorShader"}, + {BuiltIn::LocationIndicatorTexturedShader, "LocationIndicatorTexturedShader"}, + {BuiltIn::LineSDFShader, "LineSDFShader"}, + {BuiltIn::RasterShader, "RasterShader"}, + {BuiltIn::SymbolIconShader, "SymbolIconShader"}, + {BuiltIn::SymbolSDFShader, "SymbolSDFShader"}, + {BuiltIn::SymbolTextAndIconShader, "SymbolTextAndIconShader"}, + {BuiltIn::WideVectorShader, "WideVectorShader"}}); + +} // namespace mbgl diff --git a/src/mbgl/tile/tile_operation.cpp b/src/mbgl/tile/tile_operation.cpp new file mode 100644 index 000000000000..e20866d28fa2 --- /dev/null +++ b/src/mbgl/tile/tile_operation.cpp @@ -0,0 +1,18 @@ +#include +#include + +namespace mbgl { + +MBGL_DEFINE_ENUM(TileOperation, + { + {TileOperation::RequestedFromCache, "RequestedFromCache"}, + {TileOperation::RequestedFromNetwork, "RequestedFromNetwork"}, + {TileOperation::LoadFromNetwork, "LoadFromNetwork"}, + {TileOperation::LoadFromCache, "LoadFromCache"}, + {TileOperation::StartParse, "StartParse"}, + {TileOperation::EndParse, "EndParse"}, + {TileOperation::Error, "Error"}, + {TileOperation::Cancelled, "Cancelled"}, + {TileOperation::NullOp, "NullOp"}, + }); +} // namespace mbgl diff --git a/src/mbgl/util/action_journal.cpp b/src/mbgl/util/action_journal.cpp new file mode 100644 index 000000000000..532771e81079 --- /dev/null +++ b/src/mbgl/util/action_journal.cpp @@ -0,0 +1,33 @@ +#include +#include + +namespace mbgl { +namespace util { + +ActionJournal::ActionJournal(const Map& map, const ActionJournalOptions& options) + : impl(std::make_unique(map, options)) { + impl->onMapCreate(); +} + +ActionJournal::~ActionJournal() { + impl->onMapDestroy(); +} + +std::string ActionJournal::getLogDirectory() const { + return impl->getLogDirectory(); +} + +std::vector ActionJournal::getLogFiles() const { + return impl->getLogFiles(); +} + +std::vector ActionJournal::getLog() { + return impl->getLog(); +} + +void ActionJournal::clearLog() { + impl->clearLog(); +} + +} // namespace util +} // namespace mbgl diff --git a/src/mbgl/util/action_journal_impl.cpp b/src/mbgl/util/action_journal_impl.cpp new file mode 100644 index 000000000000..a0adebc17442 --- /dev/null +++ b/src/mbgl/util/action_journal_impl.cpp @@ -0,0 +1,575 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include + +#ifdef __APPLE__ +#include +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + +#define USE_GHC_FILESYSTEM + +#endif +#endif + +#ifdef USE_GHC_FILESYSTEM + +#include +namespace mbgl { +namespace filesystem = ghc::filesystem; +} + +#else + +#include +namespace mbgl { +namespace filesystem = std::filesystem; +} + +#endif + +namespace mbgl { +namespace util { + +constexpr auto ACTION_JOURNAL_DIRECTORY_NAME = "action_journal"; +constexpr auto ACTION_JOURNAL_FILE_NAME = "action_journal"; +constexpr auto ACTION_JOURNAL_FILE_EXTENSION = "log"; + +class MapEnvironmentSnapshot { +public: + MapEnvironmentSnapshot(const ActionJournal::Impl& journal) + : time(std::chrono::time_point_cast(std::chrono::system_clock::now())), + clientName(journal.getMap().getClientOptions().name()), + clientVersion(journal.getMap().getClientOptions().version()), + styleName(journal.getMap().getStyle().getName()), + styleURL(journal.getMap().getStyle().getURL()) {} + + const auto& getTime() const { return time; } + const auto& getClientName() const { return clientName; } + const auto& getClientVersion() const { return clientVersion; } + const auto& getStyleName() const { return styleName; } + const auto& getStyleURL() const { return styleURL; } + +protected: + const std::chrono::time_point time; + const std::string clientName; + const std::string clientVersion; + const std::string styleName; + const std::string styleURL; +}; + +class ActionJournalEvent { +public: + ActionJournalEvent(const rapidjson::GenericStringRef& name, const MapEnvironmentSnapshot& env) + : json(rapidjson::kObjectType), + eventJson(rapidjson::kObjectType) { + json.AddMember("name", name, json.GetAllocator()); + json.AddMember("time", iso8601(env.getTime()), json.GetAllocator()); + + if (!env.getClientName().empty()) { + json.AddMember("clientName", env.getClientName(), json.GetAllocator()); + } + + if (!env.getClientVersion().empty()) { + json.AddMember("clientVersion", env.getClientVersion(), json.GetAllocator()); + } + + if (!env.getStyleName().empty()) { + json.AddMember("styleName", env.getStyleName(), json.GetAllocator()); + } + + if (!env.getStyleURL().empty()) { + json.AddMember("styleURL", env.getStyleURL(), json.GetAllocator()); + } + } + + ~ActionJournalEvent() = default; + + template + ActionJournalEvent& addEvent(const rapidjson::GenericStringRef& key, const T& value) { + eventJson.AddMember(key, value, json.GetAllocator()); + return *this; + } + + ActionJournalEvent& addEventStringArray(const rapidjson::GenericStringRef& key, + const std::vector& value) { + rapidjson::Value arrayJson(rapidjson::kArrayType); + + for (const auto& elem : value) { + rapidjson::Value elemJson(rapidjson::kStringType); + elemJson.SetString(elem.c_str(), static_cast(elem.size())); + arrayJson.PushBack(elemJson, json.GetAllocator()); + } + + eventJson.AddMember(key, arrayJson, json.GetAllocator()); + return *this; + } + + template + ActionJournalEvent& addEventEnum(const rapidjson::GenericStringRef& key, const T& value) { + eventJson.AddMember(key, rapidjson::StringRef(Enum::toString(value)), json.GetAllocator()); + return *this; + } + + std::string toString() { + if (!eventJson.ObjectEmpty()) { + json.AddMember("event", eventJson, json.GetAllocator()); + } + + rapidjson::StringBuffer jsonBuffer; + rapidjson::Writer jsonWriter(jsonBuffer); + + json.Accept(jsonWriter); + + return jsonBuffer.GetString(); + } + + rapidjson::Document json; + rapidjson::Value eventJson; +}; + +ActionJournal::Impl::Impl(const Map& map_, const ActionJournalOptions& options_) + : map(map_), + options(options_), + scheduler(Scheduler::GetSequenced()) { + assert(!options.path().empty()); + assert(options.logFileSize() > 0); + assert(options.logFileCount() > 1); + + options.withPath((mbgl::filesystem::canonical(options.path()) / ACTION_JOURNAL_DIRECTORY_NAME).generic_string()); + + if (!openFile(detectFiles(), false)) { + Log::Error(Event::General, "Failed to open Action Journal file"); + } +} + +ActionJournal::Impl::~Impl() { + flush(); +} + +std::string ActionJournal::Impl::getLogDirectory() const { + return options.path(); +} + +std::vector ActionJournal::Impl::getLogFiles() const { + std::set files; + for (const auto& entry : mbgl::filesystem::directory_iterator(options.path())) { + if (!entry.is_regular_file()) { + continue; + } + + files.emplace(mbgl::filesystem::canonical(entry.path()).generic_string()); + } + + return std::vector(files.begin(), files.end()); +} + +std::vector ActionJournal::Impl::getLog() { + std::lock_guard lock(fileMutex); + std::vector logEvents; + + const auto readFile = [&](std::fstream& file) { + if (!file) { + return; + } + + for (std::string line; std::getline(file, line);) { + logEvents.emplace_back(line); + } + + file.clear(); + }; + + // read current file + if (currentFile && currentFileIndex == 0) { + currentFile.seekg(std::ios::beg); + readFile(currentFile); + return logEvents; + } + + const uint32_t maxFileIndex = currentFile ? currentFileIndex - 1 : detectFiles(); + + // read previous files + for (uint32_t fileIndex = 0; fileIndex <= maxFileIndex; ++fileIndex) { + const auto& filepath = getFilepath(fileIndex); + std::fstream file(filepath, std::fstream::in); + readFile(file); + } + + if (currentFile) { + currentFile.seekg(std::ios::beg); + readFile(currentFile); + } + + return logEvents; +} + +void ActionJournal::Impl::clearLog() { + std::lock_guard lock(fileMutex); + + // close current file + currentFile.close(); + + currentFileIndex = 0; + currentFileSize = 0; + + if (!mbgl::filesystem::remove_all(options.path())) { + Log::Error(Event::General, "Failed to clear ActionJournal"); + } + + if (!openFile(0, false)) { + Log::Error(Event::General, "Failed to open Action Journal file"); + } +} + +void ActionJournal::Impl::flush() { + scheduler->waitForEmpty(); +} + +std::string ActionJournal::Impl::getDirectoryName() { + return ACTION_JOURNAL_DIRECTORY_NAME; +} + +void ActionJournal::Impl::onCameraWillChange(CameraChangeMode mode) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onCameraWillChange", env).addEvent("cameraMode", static_cast(mode))); + }); +} + +void ActionJournal::Impl::onCameraDidChange(CameraChangeMode mode) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onCameraDidChange", env).addEvent("cameraMode", static_cast(mode))); + }); +} + +void ActionJournal::Impl::onWillStartLoadingMap() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onWillStartLoadingMap", env)); }); +} + +void ActionJournal::Impl::onDidFinishLoadingMap() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onDidFinishLoadingMap", env)); }); +} + +void ActionJournal::Impl::onDidFailLoadingMap(MapLoadError error, const std::string& errorStr) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onDidFailLoadingMap", env) + .addEvent("error", errorStr) + .addEvent("code", static_cast(error))); + }); +} + +void ActionJournal::Impl::onWillStartRenderingMap() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onWillStartRenderingMap", env)); }); +} + +void ActionJournal::Impl::onDidFinishRenderingMap(RenderMode) { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onDidFinishRenderingMap", env)); }); +} + +void ActionJournal::Impl::onDidFinishLoadingStyle() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onDidFinishLoadingStyle", env)); }); +} + +void ActionJournal::Impl::onSourceChanged(style::Source& source) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this), type = source.getType(), id = source.getID()]() { + log(ActionJournalEvent("onSourceChanged", env).addEventEnum("type", type).addEvent("id", id)); + }); +} + +void ActionJournal::Impl::onDidBecomeIdle() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onDidBecomeIdle", env)); }); +} + +void ActionJournal::Impl::onStyleImageMissing(const std::string& id) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onStyleImageMissing", env).addEvent("id", id)); + }); +} + +void ActionJournal::Impl::onRegisterShaders(gfx::ShaderRegistry&) { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onRegisterShaders", env)); }); +} + +void ActionJournal::Impl::onPreCompileShader(shaders::BuiltIn id, gfx::Backend::Type backend, const std::string&) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onPreCompileShader", env) + .addEventEnum("shader", id) + .addEvent("backend", static_cast(backend))); + }); +} + +void ActionJournal::Impl::onPostCompileShader(shaders::BuiltIn id, gfx::Backend::Type backend, const std::string&) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onPostCompileShader", env) + .addEventEnum("shader", id) + .addEvent("backend", static_cast(backend))); + }); +} + +void ActionJournal::Impl::onShaderCompileFailed(shaders::BuiltIn id, + gfx::Backend::Type backend, + const std::string& defines) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onShaderCompileFailed", env) + .addEventEnum("shader", id) + .addEvent("backend", static_cast(backend)) + .addEvent("defines", defines)); + }); +} + +void ActionJournal::Impl::onGlyphsLoaded(const FontStack& fonts, const GlyphRange& range) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onGlyphsLoaded", env) + .addEventStringArray("fonts", fonts) + .addEvent("rangeStart", range.first) + .addEvent("rangeEnd", range.second)); + }); +} + +void ActionJournal::Impl::onGlyphsError(const FontStack& fonts, const GlyphRange& range, std::exception_ptr error) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + ActionJournalEvent event("onGlyphsError", env); + + event.addEventStringArray("fonts", fonts); + event.addEvent("rangeStart", range.first); + event.addEvent("rangeEnd", range.second); + + if (error) { + try { + std::rethrow_exception(error); + } catch (const std::exception& e) { + event.addEvent("error", std::string(e.what())); + } + } + + log(event); + }); +} + +void ActionJournal::Impl::onGlyphsRequested(const FontStack& fonts, const GlyphRange& range) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onGlyphsRequested", env) + .addEventStringArray("fonts", fonts) + .addEvent("rangeStart", range.first) + .addEvent("rangeEnd", range.second)); + }); +} + +void ActionJournal::Impl::onTileAction(TileOperation op, const OverscaledTileID& id, const std::string& sourceID) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + log(ActionJournalEvent("onTileAction", env) + .addEventEnum("action", op) + .addEvent("tileX", id.canonical.x) + .addEvent("tileY", id.canonical.y) + .addEvent("tileZ", id.canonical.z) + .addEvent("overscaledZ", id.overscaledZ) + .addEvent("sourceID", sourceID)); + }); +} + +void ActionJournal::Impl::onSpriteLoaded(const std::optional& sprite) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + ActionJournalEvent event("onSpriteLoaded", *this); + + if (sprite) { + event.addEvent("id", sprite.value().id); + event.addEvent("url", sprite.value().spriteURL); + } + + log(event); + }); +} + +void ActionJournal::Impl::onSpriteError(const std::optional& sprite, std::exception_ptr error) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + ActionJournalEvent event("onSpriteError", env); + + if (sprite) { + event.addEvent("id", sprite.value().id); + event.addEvent("url", sprite.value().spriteURL); + } + + if (error) { + try { + std::rethrow_exception(error); + } catch (const std::exception& e) { + event.addEvent("error", std::string(e.what())); + } + } + + log(event); + }); +} + +void ActionJournal::Impl::onSpriteRequested(const std::optional& sprite) { + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this)]() { + ActionJournalEvent event("onSpriteRequested", env); + + if (sprite) { + event.addEvent("id", sprite.value().id); + event.addEvent("url", sprite.value().spriteURL); + } + + log(event); + }); +} + +void ActionJournal::Impl::onMapCreate() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onMapCreate", env)); }); +} + +void ActionJournal::Impl::onMapDestroy() { + scheduler->schedule( + [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onMapDestroy", env)); }); +} + +void ActionJournal::Impl::log(ActionJournalEvent& value) { + logToFile(value.toString()); +} + +void ActionJournal::Impl::log(ActionJournalEvent&& value) { + logToFile(value.toString()); +} + +std::string ActionJournal::Impl::getFilepath(uint32_t fileIndex) const { + return options.path() + "/" + ACTION_JOURNAL_FILE_NAME + "." + std::to_string(fileIndex) + "." + + ACTION_JOURNAL_FILE_EXTENSION; +} + +uint32_t ActionJournal::Impl::detectFiles() const { + if (!mbgl::filesystem::exists(options.path())) { + return 0; + } + + std::map existingFiles; + + const std::regex fileRegex(std::string(R"(.*\.([0-9]+)\.)") + ACTION_JOURNAL_FILE_EXTENSION); + std::smatch fileMatch; + + for (const auto& entry : mbgl::filesystem::directory_iterator(options.path())) { + if (!entry.is_regular_file()) { + continue; + } + + const std::string& path = entry.path().string(); + if (std::regex_match(path, fileMatch, fileRegex)) { + if (fileMatch.size() == 2) { + existingFiles.emplace(std::stoi(fileMatch[1].str()), path); + } + } + } + + if (existingFiles.empty()) { + return 0; + } + + // removing extra files (old files or due to the file count changing) + for (auto it = existingFiles.begin(); existingFiles.size() > options.logFileCount();) { + mbgl::filesystem::remove(it->second); + it = existingFiles.erase(it); + } + + uint32_t expectedIndex = 0; + + // validate file index + for (const auto& file : existingFiles) { + if (file.first != expectedIndex) { + mbgl::filesystem::rename(file.second, getFilepath(expectedIndex)); + } + + ++expectedIndex; + } + + return expectedIndex - 1; +} + +uint32_t ActionJournal::Impl::rollFiles() { + // delete the oldest file + const auto& oldestFilepath = getFilepath(0); + if (mbgl::filesystem::exists(oldestFilepath)) { + mbgl::filesystem::remove(oldestFilepath); + } + + // rename the rest + uint32_t expectedIndex = 0; + for (uint32_t index = 1; index < options.logFileCount(); ++index) { + const auto& filepath = getFilepath(index); + if (mbgl::filesystem::exists(filepath)) { + mbgl::filesystem::rename(filepath, getFilepath(expectedIndex++)); + } + } + + return expectedIndex; +} + +bool ActionJournal::Impl::openFile(uint32_t fileIndex, bool truncate) { + assert(fileIndex < options.logFileCount()); + + if (!mbgl::filesystem::exists(options.path())) { + mbgl::filesystem::create_directories(options.path()); + } + + const auto& filepath = getFilepath(fileIndex); + const std::ios::openmode openMode = (truncate ? std::ios::trunc : std::ios::ate | std::ios::app) | + std::fstream::out | std::fstream::in; + + currentFile.open(filepath, openMode); + + if (currentFile.is_open()) { + currentFileIndex = fileIndex; + currentFileSize = mbgl::filesystem::file_size(filepath); + return true; + } + + return false; +} + +bool ActionJournal::Impl::prepareFile(size_t size) { + if (currentFileSize + size <= options.logFileSize() && currentFile) { + currentFileSize += size; + return true; + } + + // else roll file + currentFile.close(); + + if (currentFileIndex + 1 >= options.logFileCount()) { + currentFileIndex = rollFiles(); + } else { + ++currentFileIndex; + } + + return openFile(currentFileIndex, true); +} + +void ActionJournal::Impl::logToFile(const std::string& value) { + if (value.empty()) { + return; + } + + std::lock_guard lock(fileMutex); + + if (!prepareFile(value.size() + 1)) { + return; + } + + currentFile << value << "\n"; + currentFile.flush(); +} + +} // namespace util +} // namespace mbgl diff --git a/src/mbgl/util/action_journal_impl.hpp b/src/mbgl/util/action_journal_impl.hpp new file mode 100644 index 000000000000..ce07bc3a1be4 --- /dev/null +++ b/src/mbgl/util/action_journal_impl.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include +#include +#include + +#include + +namespace mbgl { + +class Map; +class Scheduler; + +namespace util { + +class ActionJournalEvent; + +class ActionJournal::Impl : public MapObserver { +public: + Impl(const Map& map, const ActionJournalOptions& options); + ~Impl(); + + const Map& getMap() const { return map; } + std::string getLogDirectory() const; + std::vector getLogFiles() const; + std::vector getLog(); + void clearLog(); + void flush(); + + static std::string getDirectoryName(); + + // Logged events + + // MapObserver + void onCameraWillChange(CameraChangeMode) override; + void onCameraDidChange(CameraChangeMode) override; + void onWillStartLoadingMap() override; + void onDidFinishLoadingMap() override; + void onDidFailLoadingMap(MapLoadError, const std::string&) override; + void onWillStartRenderingMap() override; + void onDidFinishRenderingMap(RenderMode) override; + void onDidFinishLoadingStyle() override; + void onSourceChanged(style::Source&) override; + void onDidBecomeIdle() override; + void onStyleImageMissing(const std::string&) override; + void onRegisterShaders(gfx::ShaderRegistry&) override; + void onPreCompileShader(shaders::BuiltIn, gfx::Backend::Type, const std::string&) override; + void onPostCompileShader(shaders::BuiltIn, gfx::Backend::Type, const std::string&) override; + void onShaderCompileFailed(shaders::BuiltIn, gfx::Backend::Type, const std::string&) override; + void onGlyphsLoaded(const FontStack&, const GlyphRange&) override; + void onGlyphsError(const FontStack&, const GlyphRange&, std::exception_ptr) override; + void onGlyphsRequested(const FontStack&, const GlyphRange&) override; + void onTileAction(TileOperation, const OverscaledTileID&, const std::string&) override; + void onSpriteLoaded(const std::optional&) override; + void onSpriteError(const std::optional&, std::exception_ptr) override; + void onSpriteRequested(const std::optional&) override; + + void onMapCreate(); + void onMapDestroy(); + +protected: + void log(ActionJournalEvent& value); + void log(ActionJournalEvent&& value); + + // file operations + + // generate the file path for the given index -> action_journal.{fileIndex}.log + std::string getFilepath(uint32_t fileIndex) const; + + // detect and validate files at `ActionJournalOptions.path()/ACTION_JOURNAL_DIRECTORY_NAME` + uint32_t detectFiles() const; + + // create a new log file with the highest unused index + // delete the oldest one if `logFileCount` number of files was reached + // rename the remaining files to match the index chain if a file was deleted + // + // action_journal.0.log -> deleted + // action_journal.1.log -> action_journal.0.log + // ... + // action_journal.{logFileCount - 1}.log -> action_journal.{logFileCount - 2}.log + // action_journal.{logFileCount - 1}.log -> new file + uint32_t rollFiles(); + + // open the given index file + bool openFile(uint32_t fileIndex, bool truncate = false); + // check if the current file can log `size` bytes of info and roll files if needed + bool prepareFile(size_t size); + // log string to file and flush + void logToFile(const std::string& value); + +protected: + const Map& map; + + ActionJournalOptions options; + + const std::shared_ptr scheduler; + + std::mutex fileMutex; + std::fstream currentFile; + uint32_t currentFileIndex{0}; + size_t currentFileSize{0}; +}; + +} // namespace util +} // namespace mbgl diff --git a/src/mbgl/util/chrono.cpp b/src/mbgl/util/chrono.cpp index d815771e77db..ad42852af316 100644 --- a/src/mbgl/util/chrono.cpp +++ b/src/mbgl/util/chrono.cpp @@ -49,6 +49,22 @@ std::string iso8601(Timestamp timestamp) { return buffer; } +std::string iso8601(std::chrono::time_point timestamp) { + std::time_t time = std::chrono::system_clock::to_time_t(timestamp); + std::tm info; + _gmtime(&time, &info); + + long long ms = + std::chrono::duration_cast(timestamp - std::chrono::system_clock::from_time_t(time)).count() % + 1000; + + char buffer[sizeof("yyyy-mm-ddThh:mm:ss.000Z")]; + const std::size_t offset = std::strftime(buffer, sizeof(buffer), "%FT%T", &info); + snprintf(buffer + offset, sizeof(buffer) - offset, ".%03lldZ", ms); + + return buffer; +} + Timestamp parseTimestamp(const char *timestamp) { return std::chrono::time_point_cast(std::chrono::system_clock::from_time_t(parse_date(timestamp))); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 754dc9e2bf2f..60fc46969a0d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -85,6 +85,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/tile/tile_coordinate.test.cpp ${PROJECT_SOURCE_DIR}/test/tile/tile_id.test.cpp ${PROJECT_SOURCE_DIR}/test/tile/vector_tile.test.cpp + ${PROJECT_SOURCE_DIR}/test/util/action_journal.test.cpp ${PROJECT_SOURCE_DIR}/test/util/async_task.test.cpp ${PROJECT_SOURCE_DIR}/test/util/bounding_volumes.test.cpp ${PROJECT_SOURCE_DIR}/test/util/camera.test.cpp diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp index c2efcf9d70b2..e98b82c7d159 100644 --- a/test/map/transform.test.cpp +++ b/test/map/transform.test.cpp @@ -178,7 +178,7 @@ TEST(Transform, UnwrappedLatLng) { } TEST(Transform, ConstrainHeightOnly) { - Transform transform(MapObserver::nullObserver(), ConstrainMode::HeightOnly); + Transform transform(TransformObserver::nullObserver(), ConstrainMode::HeightOnly); transform.resize({2, 2}); transform.jumpTo(CameraOptions().withCenter(LatLngBounds::world().southwest()).withZoom(util::MAX_ZOOM)); @@ -191,7 +191,7 @@ TEST(Transform, ConstrainHeightOnly) { } TEST(Transform, ConstrainWidthAndHeight) { - Transform transform(MapObserver::nullObserver(), ConstrainMode::WidthAndHeight); + Transform transform(TransformObserver::nullObserver(), ConstrainMode::WidthAndHeight); transform.resize({2, 2}); transform.jumpTo(CameraOptions().withCenter(LatLngBounds::world().southwest()).withZoom(util::MAX_ZOOM)); @@ -541,7 +541,7 @@ TEST(Transform, IsPanning) { } TEST(Transform, DefaultTransform) { - struct TransformObserver : public mbgl::MapObserver { + struct TransformObserver : public mbgl::TransformObserver { void onCameraWillChange(MapObserver::CameraChangeMode) final { cameraWillChangeCallback(); }; void onCameraDidChange(MapObserver::CameraChangeMode) final { cameraDidChangeCallback(); }; diff --git a/test/tile/tile_coordinate.test.cpp b/test/tile/tile_coordinate.test.cpp index 695087ff6f82..cc3908241670 100644 --- a/test/tile/tile_coordinate.test.cpp +++ b/test/tile/tile_coordinate.test.cpp @@ -12,7 +12,7 @@ using namespace mbgl; TEST(TileCoordinate, FromLatLng) { size_t changeCount = 0; - struct TransformObserver : public mbgl::MapObserver { + struct TransformObserver : public mbgl::TransformObserver { void onCameraWillChange(MapObserver::CameraChangeMode mode) final { if (mode == MapObserver::CameraChangeMode::Immediate && cameraWillChangeImmediateCallback) { cameraWillChangeImmediateCallback(); diff --git a/test/util/action_journal.test.cpp b/test/util/action_journal.test.cpp new file mode 100644 index 000000000000..5a131099d3c4 --- /dev/null +++ b/test/util/action_journal.test.cpp @@ -0,0 +1,431 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +using namespace mbgl; +using namespace mbgl::util; +using namespace ::testing; + +class ActionJournalTest { +public: + class MapAdapter : public Map { + public: + MapAdapter(RendererFrontend& frontend, + MapObserver& observer, + std::shared_ptr fileSource, + const MapOptions& options, + const util::ActionJournalOptions& actionJournalOptions) + : Map(std::make_unique(frontend, observer, std::move(fileSource), options), + actionJournalOptions) {} + + Map::Impl& getImpl() { return *impl; } + }; + + ActionJournalOptions options; + StubMapObserver observer; + std::shared_ptr fileSource; + std::unique_ptr frontend; + std::unique_ptr map; + + util::RunLoop runLoop; + + ActionJournalTest(const ActionJournalOptions& options_, MapMode mode = MapMode::Static) + : options(options_) { + clear(); + createMap(mode); + } + + ~ActionJournalTest() { + map.reset(); + frontend.reset(); + fileSource.reset(); + clear(); + } + + void createMap(MapMode mode = MapMode::Static) { + fileSource = std::make_shared(ResourceOptions::Default(), + ClientOptions().withName("ActionJournalTest").withVersion("1.0")); + frontend = std::make_unique(1.0f); + map = std::make_unique( + *frontend, observer, fileSource, MapOptions().withMapMode(mode).withSize(frontend->getSize()), options); + } + + std::filesystem::path getDirectoryPath() { + return std::filesystem::canonical(options.path()) / ActionJournal::Impl::getDirectoryName(); + } + + void clear() { std::filesystem::remove_all(getDirectoryPath()); } +}; + +TEST(ActionJournal, Create) { + ActionJournalTest test(ActionJournalOptions().enable().withPath(".")); + + test.map->getActionJournal()->impl->flush(); + + // map creation logs `onMapCreate` + EXPECT_EQ(test.map->getActionJournal()->getLogDirectory(), test.getDirectoryPath().generic_string()); + EXPECT_TRUE(std::filesystem::exists(test.map->getActionJournal()->getLogDirectory())); + EXPECT_EQ(test.map->getActionJournal()->getLogFiles().size(), 1u); + + const auto log = test.map->getActionJournal()->getLog(); + EXPECT_EQ(log.size(), 1u); + EXPECT_THAT(log.front(), HasSubstr("onMapCreate")); +} + +TEST(ActionJournal, Clear) { + ActionJournalTest test(ActionJournalOptions().enable().withPath(".")); + + test.map->getActionJournal()->impl->flush(); + test.map->getActionJournal()->clearLog(); + + EXPECT_TRUE(std::filesystem::exists(test.map->getActionJournal()->getLogDirectory())); + EXPECT_EQ(test.map->getActionJournal()->getLogFiles().size(), 1u); + EXPECT_THAT(test.map->getActionJournal()->getLog(), IsEmpty()); +} + +TEST(ActionJournal, ReadPreviousSession) { + // generate `onMapCreate` event + ActionJournalTest test(ActionJournalOptions().enable().withPath(".")); + + // generate `onMapDestroy` event + test.map.reset(); + + // generate `onMapCreate` event + test.createMap(); + + test.map->getActionJournal()->impl->flush(); + + const auto log = test.map->getActionJournal()->getLog(); + EXPECT_EQ(log.size(), 3u); + EXPECT_THAT(log, ElementsAre(HasSubstr("onMapCreate"), HasSubstr("onMapDestroy"), HasSubstr("onMapCreate"))); +} + +TEST(ActionJournal, RollFiles) { + // limit the number of files and the size of the file + ActionJournalTest test(ActionJournalOptions().enable().withPath(".").withLogFileSize(1).withLogFileCount(2)); + + // generate multiple log events by loading a style and rendering + test.map->getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + + test.runLoop.runOnce(); + test.frontend->render(*test.map); + + test.map->getActionJournal()->impl->flush(); + + // check if the files roll and respect the limits + const auto files = test.map->getActionJournal()->getLogFiles(); + EXPECT_TRUE(std::filesystem::exists(test.map->getActionJournal()->getLogDirectory())); + EXPECT_EQ(files.size(), 2u); + EXPECT_EQ(test.map->getActionJournal()->getLog().size(), 2u); + + // the newest event should be `onMapDestroy` + test.map.reset(); + EXPECT_THAT(util::read_file(files.back()), HasSubstr("onMapDestroy")); +} + +namespace { + +template +void validateEventList(ActionJournalTest& test, + std::vector>>&& generatedEvents, + EventMethod&& eventGenerator, + Args&&... args) { + test.map->getActionJournal()->clearLog(); + (test.map->getImpl().*eventGenerator)(std::forward(args)...); + test.map->getActionJournal()->impl->flush(); + + const auto& log = test.map->getActionJournal()->getLog(); + EXPECT_EQ(log.size(), generatedEvents.size()); + + auto logIt = log.begin(); + for (const auto& generatedEvent : generatedEvents) { + mbgl::JSDocument document; + document.Parse(*logIt++); + + EXPECT_FALSE(document.HasParseError()); + EXPECT_TRUE(document.IsObject()); + + const auto& json = document.GetObject(); + + EXPECT_TRUE(json.HasMember("name")); + EXPECT_TRUE(json["name"].IsString()); + EXPECT_STREQ(json["name"].GetString(), generatedEvent.first); + + EXPECT_TRUE(json.HasMember("time")); + EXPECT_TRUE(json["time"].IsString()); + + EXPECT_TRUE(json.HasMember("clientName")); + EXPECT_TRUE(json["clientName"].IsString()); + EXPECT_STREQ(json["clientName"].GetString(), test.fileSource->getClientOptions().name().c_str()); + + EXPECT_TRUE(json.HasMember("clientVersion")); + EXPECT_TRUE(json["clientVersion"].IsString()); + EXPECT_STREQ(json["clientVersion"].GetString(), test.fileSource->getClientOptions().version().c_str()); + + // `MatchesRegex(R"(\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\dZ)")` fails on linux gcc + // https://github.com/google/googletest/issues/3084 + // `MatchesRegex(R"([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9][0-9]Z)"))` + // fails on windows CI + // using std::regex for now + std::cmatch match; + const std::regex timeRegex(R"(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z)"); + EXPECT_TRUE(std::regex_match(json["time"].GetString(), match, timeRegex)); + + if (generatedEvent.second) { + EXPECT_TRUE(json.HasMember("event")); + EXPECT_TRUE(json["event"].IsObject()); + + generatedEvent.second(json["event"].GetObject()); + } + } +} + +template +void validateEvent(ActionJournalTest& test, + const char* generatedEvent, + std::function&& checkOutput, + EventMethod&& eventGenerator, + Args&&... args) { + validateEventList(test, {{generatedEvent, checkOutput}}, eventGenerator, std::forward(args)...); +} + +} // namespace + +TEST(ActionJournal, ValidateEvents) { + ActionJournalTest test( + ActionJournalOptions().enable().withPath(".").withLogFileCount(2).withLogFileSize(1024 * 1024 * 5), + MapMode::Continuous); + + test.map->getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + test.map->getActionJournal()->impl->flush(); + + const auto testShaderRegistry = std::make_unique(); + const auto testSource = std::make_unique("testSource"); + const auto testSprite = style::Sprite("testID", "testURL"); + const auto testExceptionMessage = "test error"; + const auto testException = std::make_exception_ptr(std::runtime_error(testExceptionMessage)); + const auto testFontStack = FontStack{"Roboto Condensed Italic", "Noto Sans Italic"}; + const auto testGlyphRange = GlyphRange(0, 255); + + validateEvent( + test, + "onCameraWillChange", + [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("cameraMode")); + EXPECT_TRUE(json["cameraMode"].IsInt()); + EXPECT_EQ(json["cameraMode"].GetInt(), static_cast(MapObserver::CameraChangeMode::Immediate)); + }, + &TransformObserver::onCameraWillChange, + MapObserver::CameraChangeMode::Immediate); + + validateEvent( + test, + "onCameraDidChange", + [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("cameraMode")); + EXPECT_TRUE(json["cameraMode"].IsInt()); + EXPECT_EQ(json["cameraMode"].GetInt(), static_cast(MapObserver::CameraChangeMode::Immediate)); + }, + &TransformObserver::onCameraDidChange, + MapObserver::CameraChangeMode::Immediate); + + validateEvent(test, "onWillStartLoadingMap", nullptr, &style::Observer::onStyleLoading); + validateEvent(test, "onDidFinishLoadingStyle", nullptr, &style::Observer::onStyleLoaded); + + validateEvent( + test, + "onSourceChanged", + [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("type")); + EXPECT_TRUE(json["type"].IsString()); + EXPECT_EQ(Enum::toEnum(json["type"].GetString()), style::SourceType::GeoJSON); + + EXPECT_TRUE(json.HasMember("id")); + EXPECT_TRUE(json["id"].IsString()); + EXPECT_STREQ(json["id"].GetString(), testSource->getID().c_str()); + }, + &style::Observer::onSourceChanged, + *testSource); + + validateEvent(test, "onRegisterShaders", nullptr, &RendererObserver::onRegisterShaders, *testShaderRegistry); + + validateEvent( + test, + "onDidFailLoadingMap", + [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("error")); + EXPECT_TRUE(json["error"].IsString()); + EXPECT_STREQ(json["error"].GetString(), testExceptionMessage); + + EXPECT_TRUE(json.HasMember("code")); + EXPECT_TRUE(json["code"].IsInt()); + EXPECT_EQ(json["code"].GetInt(), static_cast(MapLoadError::UnknownError)); + }, + &style::Observer::onStyleError, + testException); + + const auto checkSprite = [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("id")); + EXPECT_TRUE(json["id"].IsString()); + EXPECT_EQ(json["id"].GetString(), testSprite.id); + + EXPECT_TRUE(json.HasMember("url")); + EXPECT_TRUE(json["url"].IsString()); + EXPECT_EQ(json["url"].GetString(), testSprite.spriteURL); + }; + + validateEvent(test, "onSpriteLoaded", checkSprite, &style::Observer::onSpriteLoaded, testSprite); + validateEvent(test, "onSpriteRequested", checkSprite, &style::Observer::onSpriteRequested, testSprite); + validateEvent( + test, + "onSpriteError", + [&](const mbgl::JSValue& json) { + checkSprite(json); + + EXPECT_TRUE(json.HasMember("error")); + EXPECT_TRUE(json["error"].IsString()); + EXPECT_STREQ(json["error"].GetString(), testExceptionMessage); + }, + &style::Observer::onSpriteError, + testSprite, + testException); + + validateEvent(test, "onWillStartRenderingMap", nullptr, &RendererObserver::onWillStartRenderingMap); + + // `onDidFinishRenderingMap` and `onDidFinishLoadingMap` are generated by the same callback + validateEventList(test, + {{"onDidFinishRenderingMap", nullptr}, {"onDidFinishLoadingMap", nullptr}}, + &RendererObserver::onDidFinishRenderingMap); + + validateEvent( + test, + "onStyleImageMissing", + [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("id")); + EXPECT_TRUE(json["id"].IsString()); + EXPECT_STREQ(json["id"].GetString(), "image"); + }, + &RendererObserver::onStyleImageMissing, + "image", + []() {}); + + const auto checkShader = [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("shader")); + EXPECT_TRUE(json["shader"].IsString()); + EXPECT_EQ(Enum::toEnum(json["shader"].GetString()), shaders::BuiltIn::None); + + EXPECT_TRUE(json.HasMember("backend")); + EXPECT_TRUE(json["backend"].IsInt()); + EXPECT_EQ(json["backend"].GetInt(), static_cast(gfx::Backend::Type::OpenGL)); + }; + + validateEvent(test, + "onPreCompileShader", + checkShader, + &RendererObserver::onPreCompileShader, + shaders::BuiltIn::None, + gfx::Backend::Type::OpenGL, + "defines"); + + validateEvent(test, + "onPostCompileShader", + checkShader, + &RendererObserver::onPostCompileShader, + shaders::BuiltIn::None, + gfx::Backend::Type::OpenGL, + "defines"); + + validateEvent( + test, + "onShaderCompileFailed", + [&](const mbgl::JSValue& json) { + checkShader(json); + + EXPECT_TRUE(json.HasMember("defines")); + EXPECT_TRUE(json["defines"].IsString()); + EXPECT_STREQ(json["defines"].GetString(), "defines"); + }, + &RendererObserver::onShaderCompileFailed, + shaders::BuiltIn::None, + gfx::Backend::Type::OpenGL, + "defines"); + + const auto checkGlyphs = [&](const mbgl::JSValue& json) { + EXPECT_TRUE(json.HasMember("fonts")); + EXPECT_TRUE(json["fonts"].IsArray()); + EXPECT_EQ(json["fonts"].GetArray().Size(), testFontStack.size()); + + auto fontIt = testFontStack.begin(); + for (const auto& font : json["fonts"].GetArray()) { + EXPECT_TRUE(font.IsString()); + EXPECT_EQ(font.GetString(), *fontIt++); + } + + EXPECT_TRUE(json.HasMember("rangeStart")); + EXPECT_TRUE(json["rangeStart"].IsInt()); + EXPECT_EQ(json["rangeStart"].GetInt(), testGlyphRange.first); + + EXPECT_TRUE(json.HasMember("rangeEnd")); + EXPECT_TRUE(json["rangeEnd"].IsInt()); + EXPECT_EQ(json["rangeEnd"].GetInt(), testGlyphRange.second); + }; + + validateEvent( + test, "onGlyphsLoaded", checkGlyphs, &RendererObserver::onGlyphsLoaded, testFontStack, testGlyphRange); + validateEvent( + test, "onGlyphsRequested", checkGlyphs, &RendererObserver::onGlyphsRequested, testFontStack, testGlyphRange); + + validateEvent( + test, + "onGlyphsError", + [&](const mbgl::JSValue& json) { + checkGlyphs(json); + + EXPECT_TRUE(json.HasMember("error")); + EXPECT_TRUE(json["error"].IsString()); + EXPECT_STREQ(json["error"].GetString(), testExceptionMessage); + }, + &RendererObserver::onGlyphsError, + testFontStack, + testGlyphRange, + testException); + + validateEvent(test, + "onTileAction", + nullptr, + &RendererObserver::onTileAction, + TileOperation::StartParse, + OverscaledTileID(0, 0, 0), + ""); + + const auto onDidFinishRenderingFrame = + static_cast( + &RendererObserver::onDidFinishRenderingFrame); + + validateEvent(test, + "onDidBecomeIdle", + nullptr, + onDidFinishRenderingFrame, + RendererObserver::RenderMode::Full, + false, + false, + 0.0, + 0.0); +} diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 240e2a2e5704..73e83019f5c7 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -17,6 +17,7 @@ cc_library( "maplibre-native-base/deps/supercluster.hpp/include/*.hpp", "maplibre-native-base/deps/variant/include/mapbox/*.hpp", "maplibre-native-base/extras/expected-lite/include/**/*.hpp", + "maplibre-native-base/extras/filesystem/include/ghc/*.hpp", "maplibre-native-base/extras/kdbush.hpp/include/*.hpp", "maplibre-native-base/extras/rapidjson/include/**/*.h", "maplibre-native-base/include/mapbox/**/*.hpp", @@ -37,6 +38,7 @@ cc_library( "maplibre-native-base/deps/variant/include", "maplibre-native-base/extras/args", "maplibre-native-base/extras/expected-lite/include", + "maplibre-native-base/extras/filesystem/include", "maplibre-native-base/extras/kdbush.hpp/include", "maplibre-native-base/extras/rapidjson/include", "maplibre-native-base/include", diff --git a/vendor/maplibre-native-base.cmake b/vendor/maplibre-native-base.cmake index 86e978a5c19f..633cc92693ed 100644 --- a/vendor/maplibre-native-base.cmake +++ b/vendor/maplibre-native-base.cmake @@ -20,6 +20,15 @@ set_target_properties( INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/extras/expected-lite/LICENSE.txt ) +set_target_properties( + maplibre-native-base-extras-filesystem + PROPERTIES + INTERFACE_MAPLIBRE_NAME "filesystem" + INTERFACE_MAPLIBRE_URL "https://github.com/gulrak/filesystem" + INTERFACE_MAPLIBRE_AUTHOR "Steffen Schümann" + INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/maplibre-native-base/extras/filesystem/LICENSE.txt +) + set_target_properties( maplibre-native-base-supercluster.hpp PROPERTIES diff --git a/vendor/maplibre-native-base/extras/CMakeLists.txt b/vendor/maplibre-native-base/extras/CMakeLists.txt index f86143fabed9..502a55c81b38 100644 --- a/vendor/maplibre-native-base/extras/CMakeLists.txt +++ b/vendor/maplibre-native-base/extras/CMakeLists.txt @@ -21,6 +21,7 @@ add_library(maplibre-native-base-extras INTERFACE) add_library(MapLibreNative::Base::Extras ALIAS maplibre-native-base-extras) maplibre_native_base_extras_add_library(args ${CMAKE_CURRENT_LIST_DIR}/args) +maplibre_native_base_extras_add_library(filesystem ${CMAKE_CURRENT_LIST_DIR}/filesystem/include) maplibre_native_base_extras_add_library(expected-lite ${CMAKE_CURRENT_LIST_DIR}/expected-lite/include) maplibre_native_base_extras_add_library(kdbush.hpp ${CMAKE_CURRENT_LIST_DIR}/kdbush.hpp/include) diff --git a/vendor/maplibre-native-base/extras/filesystem b/vendor/maplibre-native-base/extras/filesystem new file mode 160000 index 000000000000..9fda7b0afbd0 --- /dev/null +++ b/vendor/maplibre-native-base/extras/filesystem @@ -0,0 +1 @@ +Subproject commit 9fda7b0afbd0640f482f4aea8720a8c0afd18740 From a32eca0c0e35143659ec313ca63385902946451e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 27 May 2025 15:29:37 +0200 Subject: [PATCH 206/339] pass GH_TOKEN to gh workflow run in ios-ci.yml (#3498) --- .github/workflows/ios-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 140b4f23d241..f30867325c0e 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -352,6 +352,8 @@ jobs: shell: bash -leo pipefail {0} # so pod is found if: env.make_release run: gh workflow run ios-release-cocoapods.yml --field version=${{ env.version }} + env: + GH_TOKEN: ${{ github.token }} ios-build-cmake: needs: pre_job From 72598cb7467734f647735019427debf3eb0fe635 Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Tue, 27 May 2025 11:46:00 -0400 Subject: [PATCH 207/339] Plugin Layer Design Proposal (#3452) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- design-proposals/2025-05-08-plugin-layers.md | 82 ++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 design-proposals/2025-05-08-plugin-layers.md diff --git a/design-proposals/2025-05-08-plugin-layers.md b/design-proposals/2025-05-08-plugin-layers.md new file mode 100644 index 000000000000..b09cc146d61a --- /dev/null +++ b/design-proposals/2025-05-08-plugin-layers.md @@ -0,0 +1,82 @@ +# Plug-In Layer Architecture Design Proposal + +## Motivation + +This project is to add the ability to "register" additional layer types at runtime and have them integrated into the standard parameter/rendering pipeline. + +## Proposed Change + +For the initial implemention, the following functionality is proposed: + +* At the platform level, be able to register a plug-in layer that is then parseable by the style parser +* The plug-in layer will be limited to simple rendering (via handing off the rendering context to the plug-in layer) and will not include the ability to define drawables/etc +* The "paint" properties will be parseable, support expressions and passed in frame by frame +* A custom set of "plugin-propeties" will also be available at the same level as the "paint" properties +* The plug-in layer will be notified about lifecycle events (creation, addition to the mapview, removal, destruction/etc) and be expected to manage it's own resources + +Future features: +* Placeholder for ideas that could be implemented in the future + +## Example IOS Utilization +An example implemention is shown in the PR: https://github.com/maplibre/maplibre-native/pull/3430 +The platform/darwin/app/PluginLayerExampleMetalRendering.h/mm class shows how the layer manages it's own rendering and how properties from the style are passed to it. In platform/ios/app/MBXViewController.mm there's a single line where the plug-in layer class is registered with the map view +``` + [self.mapView addPluginLayerType:[PluginLayerExampleMetalRendering class]]; +``` + +The layer is then added to the style in the platform/darwin/app/PluginLayerTestStyleSimple.json file and an expression based scale property +is added + +``` + { "id": "metal-rendering-layer-1", + "type": "plugin-layer-metal-rendering", + "properties": { + "color1":"#FFAADD", + "offset-x": -300 + }, + "paint": { + "scale": [ + "interpolate", + ["linear"], + ["zoom"], + 5, + 0.5, + 15, + 3.0 + ] + } + }, +``` + +That scale property is then evaluated by the internal implementation and passed back to the plug-in layer via the onUpdateLayerProperties virtual method where it's incorporated by the rendering. +``` +-(void)onUpdateLayerProperties:(NSDictionary *)layerProperties { + NSLog(@"Metal Layer Rendering Properties: %@", layerProperties); + + NSNumber *offsetX = [layerProperties objectForKey:@"offset-x"]; + if (offsetX) { + _offsetX = [[layerProperties objectForKey:@"offset-x"] floatValue]; + } + + NSNumber *scale = [layerProperties objectForKey:@"scale"]; + if (scale) { + if ([scale isKindOfClass:[NSNumber class]]) { + _scale = [scale floatValue]; + } + } + +} +``` + +## API Modifications + +The platform layer would provide a base class for implementing the plug-in layer. The mapview would have a new method for registering the plug-in layer class. + + +## Migration Plan and Compatibility + +All API changes are additive, so, no backwards compatibility issues should be present. + +## Rejected Alternatives + +N/A From b33dd1711b032d62e537884f5f9ebaf21b8df306 Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Wed, 28 May 2025 22:01:04 +0300 Subject: [PATCH 208/339] Fix failing render test on OpenGL (#3504) --- src/mbgl/gfx/dynamic_texture_atlas.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mbgl/gfx/dynamic_texture_atlas.cpp b/src/mbgl/gfx/dynamic_texture_atlas.cpp index 645d6ad97a73..08e440f792d4 100644 --- a/src/mbgl/gfx/dynamic_texture_atlas.cpp +++ b/src/mbgl/gfx/dynamic_texture_atlas.cpp @@ -9,6 +9,7 @@ namespace gfx { constexpr const uint16_t extraPadding = 1; constexpr const uint16_t padding = ImagePosition::padding + extraPadding; constexpr const Size startSize = {512, 512}; +constexpr const Size dummySize = {1, 1}; Rect rectWithoutExtraPadding(const Rect& rect) { return Rect( @@ -23,8 +24,11 @@ GlyphAtlas DynamicTextureAtlas::uploadGlyphs(const GlyphMap& glyphs) { if (!glyphs.size()) { glyphAtlas.dynamicTexture = dummyDynamicTexture[TexturePixelType::Alpha]; if (!glyphAtlas.dynamicTexture) { + AlphaImage dummyImage(dummySize); + dummyImage.fill(0); glyphAtlas.dynamicTexture = std::make_shared( - context, Size(1, 1), TexturePixelType::Alpha); + context, dummySize, TexturePixelType::Alpha); + glyphAtlas.dynamicTexture->addImage(dummyImage.data.get(), dummySize); dummyDynamicTexture[TexturePixelType::Alpha] = glyphAtlas.dynamicTexture; } return glyphAtlas; @@ -109,8 +113,11 @@ ImageAtlas DynamicTextureAtlas::uploadIconsAndPatterns(const ImageMap& icons, if (!icons.size() && !patterns.size()) { imageAtlas.dynamicTexture = dummyDynamicTexture[TexturePixelType::RGBA]; if (!imageAtlas.dynamicTexture) { + PremultipliedImage dummyImage(dummySize); + dummyImage.fill(0); imageAtlas.dynamicTexture = std::make_shared( - context, Size(1, 1), TexturePixelType::RGBA); + context, dummySize, TexturePixelType::RGBA); + imageAtlas.dynamicTexture->addImage(dummyImage.data.get(), dummySize); dummyDynamicTexture[TexturePixelType::RGBA] = imageAtlas.dynamicTexture; } return imageAtlas; From 806fad4f75ef1e423d77f959a8518632476ce7d5 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Fri, 30 May 2025 03:24:51 +0300 Subject: [PATCH 209/339] Fix VulkanSDK version (#3507) Co-authored-by: Bart Louwers --- .github/workflows/windows-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 47856b593ffd..3885dda0a0e3 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -196,8 +196,10 @@ jobs: - name: Download and configure Vulkan if: matrix.renderer == 'vulkan' + # 1.4.313.1 doesn't have runtime components? + # $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows run: | - $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows + $version = "1.4.313.0" Invoke-WebRequest https://sdk.lunarg.com/sdk/download/$version/windows/VulkanRT-X64-$version-Components.zip -OutFile VulkanRT.zip & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild -r .\VulkanRT.zip *x64\vulkan-1.* From 5ac3a2e9018e1a28bf8c3091abf2a89a9aeeff5b Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Fri, 30 May 2025 09:58:19 -0700 Subject: [PATCH 210/339] Pattern layout performance improvement (#3495) --- src/mbgl/layout/pattern_layout.hpp | 23 +++++++++++++++-------- src/mbgl/renderer/bucket.hpp | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp index af28c1b920bb..c8e362218e4d 100644 --- a/src/mbgl/layout/pattern_layout.hpp +++ b/src/mbgl/layout/pattern_layout.hpp @@ -1,5 +1,4 @@ #pragma once -#include #include #include #include @@ -18,25 +17,33 @@ class PatternDependency { std::string max; }; -using PatternLayerMap = std::map; +using PatternLayerMap = mbgl::unordered_map; class PatternFeature { public: PatternFeature(std::size_t i_, - std::unique_ptr feature_, - PatternLayerMap patterns_, + std::unique_ptr&& feature_, + PatternLayerMap&& patterns_, float sortKey_ = 0.0f) : i(i_), feature(std::move(feature_)), - patterns(std::move(patterns_)), - sortKey(sortKey_) {} + sortKey(sortKey_), + patterns(std::make_unique(std::move(patterns_))) {} + PatternFeature(const PatternFeature&) = delete; + PatternFeature(PatternFeature&&) = default; + PatternFeature& operator=(const PatternFeature&) = delete; + PatternFeature& operator=(PatternFeature&&) = default; + + const PatternLayerMap& getPatterns() const { return *patterns; } friend bool operator<(const PatternFeature& lhs, const PatternFeature& rhs) { return lhs.sortKey < rhs.sortKey; } std::size_t i; std::unique_ptr feature; - PatternLayerMap patterns; float sortKey; + +protected: + std::unique_ptr patterns; }; template @@ -182,7 +189,7 @@ class PatternLayout : public Layout { for (auto& patternFeature : features) { const auto i = patternFeature.i; std::unique_ptr feature = std::move(patternFeature.feature); - const PatternLayerMap& patterns = patternFeature.patterns; + const PatternLayerMap& patterns = patternFeature.getPatterns(); const GeometryCollection& geometries = feature->getGeometries(); bucket->addFeature(*feature, geometries, patternPositions, patterns, i, canonical); diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index 940ef209302f..11e2d214a300 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -19,7 +19,7 @@ class RenderLayer; class CrossTileSymbolLayerIndex; class OverscaledTileID; class PatternDependency; -using PatternLayerMap = std::map; +using PatternLayerMap = mbgl::unordered_map; class Placement; class TransformState; class BucketPlacementData; From 317c971114cb3f5c0e3f9defd4adb725682a8ee0 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Fri, 30 May 2025 10:45:02 -0700 Subject: [PATCH 211/339] Improve weak pointer use (#3510) Co-authored-by: Bart Louwers --- include/mbgl/actor/scheduler.hpp | 6 +++--- .../src/cpp/snapshotter/map_snapshotter.cpp | 9 ++------- src/mbgl/actor/mailbox.cpp | 5 ++--- src/mbgl/actor/scheduler.cpp | 5 +++-- src/mbgl/annotation/annotation_tile.cpp | 6 ++---- src/mbgl/renderer/render_orchestrator.cpp | 3 +-- src/mbgl/sprite/sprite_loader.cpp | 18 +++++++++--------- src/mbgl/style/sources/geojson_source.cpp | 13 +++++++------ src/mbgl/tile/geojson_tile.cpp | 17 +++++++++-------- 9 files changed, 38 insertions(+), 44 deletions(-) diff --git a/include/mbgl/actor/scheduler.hpp b/include/mbgl/actor/scheduler.hpp index 8b2f81f22b8a..e6fa414eab1e 100644 --- a/include/mbgl/actor/scheduler.hpp +++ b/include/mbgl/actor/scheduler.hpp @@ -115,9 +115,9 @@ class Scheduler { ReplyFn&& reply, mapbox::base::WeakPtr replyScheduler) { schedule(tag, [replyScheduler = std::move(replyScheduler), tag, task, reply] { - auto lock = replyScheduler.lock(); - if (!replyScheduler) return; - replyScheduler->schedule(tag, [reply, result = task()] { reply(result); }); + if (auto guard = replyScheduler.lock(); replyScheduler) { + replyScheduler->schedule(tag, [reply, result = task()] { reply(result); }); + } }); } }; diff --git a/platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.cpp b/platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.cpp index 45d6e5a07c7c..186b0cc3e7c2 100644 --- a/platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.cpp @@ -66,14 +66,9 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, } MapSnapshotter::~MapSnapshotter() { - auto guard = weakScheduler.lock(); - if (weakScheduler && weakScheduler.get() != mbgl::Scheduler::GetCurrent()) { + if (auto guard = weakScheduler.lock(); weakScheduler && weakScheduler.get() != Scheduler::GetCurrent()) { snapshotter->cancel(); - weakScheduler->schedule([ptr = snapshotter.release()]() mutable { - if (ptr) { - delete ptr; - } - }); + weakScheduler->schedule([ptr = snapshotter.release()]() { delete ptr; }); } } diff --git a/src/mbgl/actor/mailbox.cpp b/src/mbgl/actor/mailbox.cpp index d27ef05857ed..31127dd38f9e 100644 --- a/src/mbgl/actor/mailbox.cpp +++ b/src/mbgl/actor/mailbox.cpp @@ -69,7 +69,7 @@ void Mailbox::abandon() { } bool Mailbox::isOpen() const { - return bool(weakScheduler) && !closed; + return !closed && weakScheduler; } void Mailbox::push(std::unique_ptr message) { @@ -152,8 +152,7 @@ void Mailbox::receive() { } void Mailbox::scheduleToRecieve(const std::optional& tag) { - auto guard = weakScheduler.lock(); - if (weakScheduler) { + if (auto guard = weakScheduler.lock(); weakScheduler) { std::weak_ptr mailbox = shared_from_this(); auto setToRecieve = [mbox = std::move(mailbox)]() { if (auto locked = mbox.lock()) { diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp index 68a55cbef9c6..36eee420f239 100644 --- a/src/mbgl/actor/scheduler.cpp +++ b/src/mbgl/actor/scheduler.cpp @@ -9,8 +9,9 @@ std::function Scheduler::bindOnce(std::function fn) { assert(fn); return [scheduler = makeWeakPtr(), scheduled = std::move(fn)]() mutable { if (!scheduled) return; // Repeated call. - auto schedulerGuard = scheduler.lock(); - if (scheduler) scheduler->schedule(std::move(scheduled)); + if (auto guard = scheduler.lock(); scheduler) { + scheduler->schedule(std::move(scheduled)); + } }; } diff --git a/src/mbgl/annotation/annotation_tile.cpp b/src/mbgl/annotation/annotation_tile.cpp index ad3496f81587..40f4ab04cabe 100644 --- a/src/mbgl/annotation/annotation_tile.cpp +++ b/src/mbgl/annotation/annotation_tile.cpp @@ -12,15 +12,13 @@ AnnotationTile::AnnotationTile(const OverscaledTileID& overscaledTileID, TileObserver* observer_) : GeometryTile(overscaledTileID, AnnotationManager::SourceID, parameters, observer_), annotationManager(parameters.annotationManager) { - auto guard = annotationManager.lock(); - if (annotationManager) { + if (auto guard = annotationManager.lock(); annotationManager) { annotationManager->addTile(*this); } } AnnotationTile::~AnnotationTile() { - auto guard = annotationManager.lock(); - if (annotationManager) { + if (auto guard = annotationManager.lock(); annotationManager) { annotationManager->removeTile(*this); } } diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 339ad33c813b..b625617a8e88 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -165,8 +165,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree( } if (LayerManager::annotationsEnabled) { - auto guard = updateParameters->annotationManager.lock(); - if (updateParameters->annotationManager) { + if (auto guard = updateParameters->annotationManager.lock(); updateParameters->annotationManager) { updateParameters->annotationManager->updateData(); } } diff --git a/src/mbgl/sprite/sprite_loader.cpp b/src/mbgl/sprite/sprite_loader.cpp index 4d927d8c4c63..85178810b312 100644 --- a/src/mbgl/sprite/sprite_loader.cpp +++ b/src/mbgl/sprite/sprite_loader.cpp @@ -99,20 +99,20 @@ void SpriteLoader::emitSpriteLoadedIfComplete(style::Sprite sprite) { /* parseClosure */ [sprite = sprite, image = data->image, json = data->json]() -> ParseResult { try { - return {parseSprite(sprite.id, *image, *json), nullptr}; + return {.images = parseSprite(sprite.id, *image, *json), .error = nullptr}; } catch (...) { - return {{}, std::current_exception()}; + return {.images = {}, .error = std::current_exception()}; } }, /* resultClosure */ - [this, sprite = sprite, weak = weakFactory.makeWeakPtr()](ParseResult result) { - if (!weak) return; // This instance has been deleted. - - if (result.error) { - observer->onSpriteError(std::optional(sprite), result.error); - return; + [this, sprite = sprite, factory = weakFactory.makeWeakPtr()](ParseResult result) { + if (auto guard = factory.lock(); factory) { + if (result.error) { + observer->onSpriteError(std::optional(sprite), result.error); + } else { + observer->onSpriteLoaded(std::optional(sprite), std::move(result.images)); + } } - observer->onSpriteLoaded(std::optional(sprite), std::move(result.images)); }); } diff --git a/src/mbgl/style/sources/geojson_source.cpp b/src/mbgl/style/sources/geojson_source.cpp index ebdda4222276..afc65d71e96a 100644 --- a/src/mbgl/style/sources/geojson_source.cpp +++ b/src/mbgl/style/sources/geojson_source.cpp @@ -101,12 +101,13 @@ void GeoJSONSource::loadDescription(FileSource& fileSource) { /* onImplReady */ [this, self = makeWeakPtr(), capturedReq = req.get()](Immutable newImpl) { assert(capturedReq); - if (!self) return; // This source has been deleted. - if (capturedReq != req.get()) return; // A new request is being processed, ignore this impl. - - baseImpl = std::move(newImpl); - loaded = true; - observer->onSourceLoaded(*this); + if (auto guard = self.lock(); self) { + if (capturedReq == req.get()) { // If a new request is being processed, ignore this impl. + baseImpl = std::move(newImpl); + loaded = true; + observer->onSourceLoaded(*this); + } + } }); } }); diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp index 7a47d80dea08..70d2f6a91654 100644 --- a/src/mbgl/tile/geojson_tile.cpp +++ b/src/mbgl/tile/geojson_tile.cpp @@ -8,6 +8,8 @@ namespace mbgl { +using TileFeatures = style::GeoJSONData::TileFeatures; + GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID, std::string sourceID_, const TileParameters& parameters, @@ -23,14 +25,13 @@ void GeoJSONTile::updateData(std::shared_ptr data_, bool nee assert(data_); data = std::move(data_); if (needsRelayout) reset(); - data->getTile( - id.canonical, - [this, self = weakFactory.makeWeakPtr(), capturedData = data.get()](style::GeoJSONData::TileFeatures features) { - if (!self) return; - if (data.get() != capturedData) return; - auto tileData = std::make_unique(std::move(features)); - setData(std::move(tileData)); - }); + data->getTile(id.canonical, + [this, self = weakFactory.makeWeakPtr(), capturedData = data.get()](TileFeatures features) { + // If the data has changed, a new request is being processed, ignore this one + if (auto guard = self.lock(); self && data.get() == capturedData) { + setData(std::make_unique(std::move(features))); + } + }); } void GeoJSONTile::querySourceFeatures(std::vector& result, const SourceQueryOptions& options) { From 77c0031f31e24d8272f71cb516bab43ec63ef590 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 2 Jun 2025 01:40:30 +0200 Subject: [PATCH 212/339] improve automated MapLibre Android release (#3497) --- .github/scripts/ensure-tag.sh | 41 ++++++++++++++++++++++++ .github/scripts/validate-version.sh | 27 +++++++++++++--- .github/workflows/android-ci.yml | 45 ++++++++++++++++----------- .github/workflows/android-release.yml | 23 +++----------- 4 files changed, 95 insertions(+), 41 deletions(-) create mode 100755 .github/scripts/ensure-tag.sh diff --git a/.github/scripts/ensure-tag.sh b/.github/scripts/ensure-tag.sh new file mode 100755 index 000000000000..8e1d6ced3cde --- /dev/null +++ b/.github/scripts/ensure-tag.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +if [ $# -lt 1 ] || [ $# -gt 2 ]; then + echo "Usage: $0 []" + echo " Git tag name to create or verify" + echo " Optional commit SHA to use (defaults to HEAD)" + echo "" + echo "This script will:" + echo " - Check if the tag exists and matches the specified commit" + echo " - Create and push the tag if it doesn't exist" + echo " - Exit with error if tag exists but points to different commit" + exit 1 +fi + +tag=$1 +commit_sha=${2:-$(git rev-parse HEAD)} + +if [ -z "$(git config user.name)" ]; then + git config user.name "MapLibre Team" +fi + +if [ -z "$(git config user.email)" ]; then + git config user.email "team@maplibre.org" +fi + +if git rev-parse "$tag" >/dev/null 2>&1; then + tag_sha=$(git rev-parse "$tag^{commit}") + if [ "$tag_sha" = "$commit_sha" ]; then + echo "✅ Tag $tag exists and matches specified commit SHA." + exit 0 + else + echo "::error::❌ Tag $tag exists but points to a different commit." + echo " Expected: $commit_sha" + echo " Actual: $tag_sha" + exit 1 + fi +else + git tag -a "$tag" -m "Publish $tag" "$commit_sha" + # git push origin "$tag" + echo "✅ Created tag $tag for commit $commit_sha." +fi diff --git a/.github/scripts/validate-version.sh b/.github/scripts/validate-version.sh index d267073285b9..0206eacf2c0c 100755 --- a/.github/scripts/validate-version.sh +++ b/.github/scripts/validate-version.sh @@ -3,21 +3,40 @@ validate_version() { local version="$1" if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-pre.*)?$ ]]; then - echo "::error::Invalid version '$version' in $(realpath VERSION). Expected: X.Y.Z or X.Y.Z-pre*" + echo "::error::Invalid version '$version' in $(realpath "$version_file"). Expected: X.Y.Z or X.Y.Z-pre*" return 1 fi return 0 } -version=$(cat VERSION 2>/dev/null) +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + echo "" + echo "This script will:" + echo " - Validate version format in specified file" + echo " - Export version to GITHUB_ENV if in GitHub Actions" + exit 1 +fi + +version_file="$1" + +if [ ! -f "$version_file" ]; then + echo "::error::Version file not found: $(realpath "$version_file")" + exit 1 +fi + +version=$(cat "$version_file" 2>/dev/null) if [ -z "$version" ]; then - echo "::error::No VERSION file found or empty in $PWD" + echo "::error::Version file is empty: $(realpath "$version_file")" exit 1 fi if validate_version "$version"; then - echo "Version validation successful: $version" + echo "✅ Version validation successful: $version" if [[ -n "${GITHUB_ENV:-}" ]]; then echo "version=$version" >> "$GITHUB_ENV" fi + exit 0 +else + exit 1 fi diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 6dedab7a5cfb..8bdcd16380f6 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -46,8 +46,6 @@ jobs: BUILDTYPE: Debug IS_LOCAL_DEVELOPMENT: false MLN_ANDROID_STL: c++_static - outputs: - make_release: ${{ steps.make_release.outputs.make_release }} steps: - name: Free Disk Space (Ubuntu) if: startsWith(runner.name, 'GitHub Actions') @@ -67,8 +65,8 @@ jobs: fetch-depth: 0 - name: Validate VERSION - run: ../../.github/scripts/validate-version.sh - working-directory: platform/android + run: .github/scripts/validate-version.sh platform/android/VERSION + working-directory: . - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties @@ -206,17 +204,6 @@ jobs: platform/android/InstrumentationTestApp.apk platform/android/InstrumentationTests.apk - - name: VERSION file changed - id: version-file-android-changed - uses: tj-actions/changed-files@v46 - with: - files: platform/android/VERSION - - - name: Should make release? - id: make_release - if: github.ref == 'refs/heads/main' && github.event_name == 'push' && steps.version-file-android-changed.outputs.any_changed == 'true' - run: echo make_release=true >> "$GITHUB_OUTPUT" - android-build-cpp-test: runs-on: ubuntu-24.04 @@ -352,11 +339,33 @@ jobs: if: env.success != 'true' run: exit 1 + # automatically trigger android-release when code is pushed to main + # and the platform/android/VERSION file has changed - uses: actions/checkout@v4 - if: needs.android-build.outputs.make_release == 'true' && env.success + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + + - name: VERSION file changed + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + id: version-file-android-changed + uses: tj-actions/changed-files@v46 + with: + files: platform/android/VERSION + + - name: Should make release? + if: env.success && github.ref == 'refs/heads/main' && github.event_name == 'push' && steps.version-file-android-changed.outputs.any_changed == 'true' + run: echo make_release=true >> "$GITHUB_ENV" + + - name: Validate and set version + if: env.make_release == 'true' + working-directory: . + run: .github/scripts/validate-version.sh platform/android/VERSION + + - name: Create tag if it does not exist + if: env.make_release == 'true' + run: .github/scripts/ensure-tag.sh android-v${{ env.version }} ${{ github.sha }} - name: Trigger release - if: needs.android-build.outputs.make_release == 'true' && env.success - run: gh workflow run android-release.yml --ref ${{ github.sha }} + if: env.make_release == 'true' + run: gh workflow run android-release.yml --ref android-v${{ env.version }} env: GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 8a5aa7bb74af..ee4e96c2e5c9 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -37,7 +37,8 @@ jobs: run: make run-android-nitpick - name: Validate and set version - run: ../../.github/scripts/validate-version.sh + working-directory: . + run: .github/scripts/validate-version.sh platform/android/VERSION - name: Build package run: | @@ -69,24 +70,8 @@ jobs: fi - name: Create tag if it does not exist - run: | - git config user.name "MapLibre Team" - git config user.email "team@maplibre.org" - tag="android-v${{ env.version }}" - - if git rev-parse "$tag" >/dev/null 2>&1; then - tag_sha=$(git rev-parse "$tag^{commit}") - if [ "$tag_sha" = "${{ github.sha }}" ]; then - echo "✅ Tag $tag exists and matches current commit SHA." - exit 0 - else - echo "::error::❌ Tag $tag exists but points to a different commit. Aborting." - exit 1 - fi - else - git tag -a "$tag" -m "Publish $tag" ${{ github.sha }} - git push origin "$tag" - fi + working-directory: . + run: .github/scripts/ensure-tag.sh android-v${{ env.version }} ${{ github.sha }} - name: Create release id: create_release From 4c9c7804b58ea5d1b3f2088afda5d02aa21fcb4e Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Sun, 1 Jun 2025 18:36:10 -0700 Subject: [PATCH 213/339] Expose MLNSource.attributionHtmlString (#3502) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- platform/darwin/src/MLNTileSource.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/darwin/src/MLNTileSource.h b/platform/darwin/src/MLNTileSource.h index fc3939c2d13b..9528dfa1e537 100644 --- a/platform/darwin/src/MLNTileSource.h +++ b/platform/darwin/src/MLNTileSource.h @@ -204,6 +204,15 @@ MLN_EXPORT */ @property (nonatomic, copy, readonly) NSArray *attributionInfos; +/** + The attribution HTML string associated with this source. + + By default, this is nil. If the source is initialized with a + configuration URL, this is nil until the configuration JSON file + is loaded. + */ +@property (nonatomic, copy, readonly) NSString *attributionHTMLString; + @end NS_ASSUME_NONNULL_END From 0366b5809fc60676e7207683c81533c934c113f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:34:13 +0200 Subject: [PATCH 214/339] Update dependency platforms to v1 (#3516) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 838f2bedaa57..cc6c0090ca4d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,7 +1,7 @@ module(name = "maplibre") bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "platforms", version = "0.0.11") +bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "rules_apple", version = "3.20.1") bazel_dep(name = "rules_swift", version = "2.7.0") bazel_dep(name = "rules_xcodeproj", version = "2.11.1") From 3c07cacc4d6e5fd8057727b66673e7dade742d96 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:33:49 +0200 Subject: [PATCH 215/339] [pre-commit.ci] pre-commit autoupdate (#3518) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- .../Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7a75760f4147..73dffddc5d91 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,7 +19,7 @@ repos: exclude: '(platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$)|(platform/windows/vendor/.*)' - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.3 + rev: v20.1.5 hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' @@ -37,7 +37,7 @@ repos: additional_dependencies: [ shellcheck-py ] - repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.55.6" + rev: "0.56.2" hooks: - id: swiftformat args: [ --swiftversion, "5.8" ] diff --git a/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift b/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift index 76317fd8b4dc..d35a61539e42 100644 --- a/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift +++ b/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift @@ -38,7 +38,6 @@ class MLNMapSnapshotterSwiftTests: MLNMapViewIntegrationTest { let snapshotter = MLNMapSnapshotter(options: options) snapshotter.start(completionHandler: { snapshot, error in - // // Without capturing snapshotter: // XCTAssertNil(snapshot) // XCTAssertNotNil(error) From 2a7249a3b0039d36561298c709df13ec620759dd Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 3 Jun 2025 18:59:51 +0300 Subject: [PATCH 216/339] Rendering statistics view (#3322) Co-authored-by: Bart Louwers --- CMakeLists.txt | 2 + include/mbgl/gfx/rendering_stats.hpp | 61 ++++++ include/mbgl/gl/uniform_buffer_gl.hpp | 4 +- include/mbgl/map/map.hpp | 3 + include/mbgl/map/map_observer.hpp | 6 +- include/mbgl/renderer/renderer_observer.hpp | 8 + include/mbgl/style/layers/symbol_layer.hpp | 4 + include/mbgl/vulkan/context.hpp | 2 +- .../mbgl/vulkan/vertex_buffer_resource.hpp | 7 +- .../MapLibreAndroid/src/cpp/CMakeLists.txt | 2 + .../src/cpp/android_renderer_frontend.cpp | 7 +- .../MapLibreAndroid/src/cpp/jni_native.cpp | 2 + .../src/cpp/native_map_view.cpp | 28 ++- .../src/cpp/native_map_view.hpp | 8 +- .../src/cpp/rendering_stats.cpp | 61 ++++++ .../src/cpp/rendering_stats.hpp | 22 ++ .../src/cpp/style/layers/symbol_layer.cpp | 6 + .../src/cpp/style/layers/symbol_layer.hpp | 2 + .../android/maps/MapChangeReceiver.java | 20 +- .../maplibre/android/maps/MapLibreMap.java | 14 ++ .../org/maplibre/android/maps/MapView.java | 46 ++++- .../org/maplibre/android/maps/NativeMap.java | 4 + .../maplibre/android/maps/NativeMapView.java | 22 +- .../maplibre/android/maps/RenderingStats.java | 75 +++++++ .../android/style/layers/PropertyFactory.java | 20 ++ .../android/style/layers/SymbolLayer.java | 16 ++ .../android/maps/MapChangeReceiverTest.kt | 66 +++++- .../testapp/maps/RemoveUnusedImagesTest.kt | 4 +- .../testapp/style/SymbolLayerTest.java | 13 ++ .../activity/benchmark/BenchmarkActivity.kt | 7 +- .../activity/events/ObserverActivity.kt | 11 +- .../imagegenerator/SnapshotActivity.kt | 1 + .../activity/maplayout/MapChangeActivity.kt | 2 +- platform/darwin/bazel/files.bzl | 3 + platform/darwin/src/MLNRenderingStats.h | 83 ++++++++ platform/darwin/src/MLNRenderingStats.mm | 38 ++++ .../darwin/src/MLNRenderingStats_Private.h | 12 ++ .../default/src/mbgl/map/map_snapshotter.cpp | 17 +- platform/glfw/glfw_view.cpp | 5 + .../ios/MapLibre.docc/ActionJournalExample.md | 5 +- platform/ios/MapLibre.docc/MapLibre.md | 1 + platform/ios/MapLibre.docc/ObserverExample.md | 14 ++ .../MapLibre.docc/RenderingStatisticsHud.md | 13 ++ .../Sources/MapLibreNavigationView.swift | 2 +- .../app-swift/Sources/ObserverExample.swift | 18 +- platform/ios/app/MBXViewController.mm | 19 +- platform/ios/src/MLNMapView+Impl.h | 2 +- platform/ios/src/MLNMapView+Impl.mm | 6 +- platform/ios/src/MLNMapView.h | 10 + platform/ios/src/MLNMapView.mm | 30 ++- platform/ios/src/MLNMapViewDelegate.h | 18 ++ platform/ios/src/MLNMapView_Private.h | 10 +- .../MLNMapViewDelegateIntegrationTests.swift | 2 + platform/macos/src/MLNMapView+Impl.h | 2 +- platform/macos/src/MLNMapView+Impl.mm | 4 +- platform/macos/src/MLNMapView.mm | 26 ++- platform/macos/src/MLNMapViewDelegate.h | 25 ++- platform/macos/src/MLNMapView_Private.h | 8 +- scripts/style-spec.mjs | 8 + src/mbgl/gfx/rendering_stats.cpp | 189 ++++++++++++++++++ src/mbgl/gl/context.cpp | 8 +- src/mbgl/gl/index_buffer_resource.cpp | 22 +- src/mbgl/gl/texture2d.cpp | 3 + src/mbgl/gl/uniform_buffer_gl.cpp | 26 ++- src/mbgl/gl/upload_pass.cpp | 16 +- src/mbgl/gl/vertex_buffer_resource.cpp | 22 +- src/mbgl/map/map.cpp | 8 + src/mbgl/map/map_impl.cpp | 33 ++- src/mbgl/map/map_impl.hpp | 6 +- src/mbgl/mtl/buffer_resource.cpp | 1 + src/mbgl/mtl/command_encoder.cpp | 4 +- .../renderer/layers/symbol_layer_tweaker.cpp | 27 ++- src/mbgl/renderer/renderer_impl.cpp | 7 +- src/mbgl/style/layers/symbol_layer.cpp | 30 ++- .../style/layers/symbol_layer_properties.hpp | 6 + src/mbgl/text/placement.cpp | 5 +- src/mbgl/vulkan/buffer_resource.cpp | 10 +- src/mbgl/vulkan/context.cpp | 25 ++- src/mbgl/vulkan/texture2d.cpp | 7 +- test/src/mbgl/test/stub_map_observer.hpp | 2 +- test/util/action_journal.test.cpp | 5 +- 81 files changed, 1271 insertions(+), 128 deletions(-) create mode 100644 platform/android/MapLibreAndroid/src/cpp/rendering_stats.cpp create mode 100644 platform/android/MapLibreAndroid/src/cpp/rendering_stats.hpp create mode 100644 platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java create mode 100644 platform/darwin/src/MLNRenderingStats.h create mode 100644 platform/darwin/src/MLNRenderingStats.mm create mode 100644 platform/darwin/src/MLNRenderingStats_Private.h create mode 100644 platform/ios/MapLibre.docc/RenderingStatisticsHud.md diff --git a/CMakeLists.txt b/CMakeLists.txt index a776d95acab5..adfbadd6cd0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1239,6 +1239,7 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/include/mbgl/vulkan/uniform_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/vulkan/upload_pass.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/vulkan/vertex_attribute.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/vulkan/vertex_buffer_resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/shader_group.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/shader_program.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/vulkan/background.hpp @@ -1282,6 +1283,7 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/src/mbgl/vulkan/uniform_buffer.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/vulkan/upload_pass.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/vulkan/vertex_attribute.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/vulkan/vertex_buffer_resource.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/shader_program.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/background.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/circle.cpp diff --git a/include/mbgl/gfx/rendering_stats.hpp b/include/mbgl/gfx/rendering_stats.hpp index 22918e28ae0d..8ee33894e2e1 100644 --- a/include/mbgl/gfx/rendering_stats.hpp +++ b/include/mbgl/gfx/rendering_stats.hpp @@ -2,14 +2,27 @@ #include #include +#include +#include namespace mbgl { + +namespace style { +class Style; +class SymbolLayer; +} // namespace style + namespace gfx { struct RenderingStats { RenderingStats() = default; bool isZero() const; + /// Frame CPU encoding time (milliseconds) + double encodingTime = 0.0; + /// Frame CPU rendering time (milliseconds) + double renderingTime = 0.0; + /// Number of frames rendered int numFrames = 0; /// Number of draw calls (`glDrawElements`, `drawIndexedPrimitives`, etc.) executed during the most recent frame @@ -41,25 +54,40 @@ struct RenderingStats { /// Number of active buffers int numBuffers = 0; + /// Number of active offscreen frame buffers int numFrameBuffers = 0; + /// Number of active index buffers int numIndexBuffers = 0; + /// Sum of index buffers update sizes std::size_t indexUpdateBytes = 0; + /// Number of active vertex buffers int numVertexBuffers = 0; + /// Sum of vertex buffers update sizes std::size_t vertexUpdateBytes = 0; + /// Number of active uniform buffers int numUniformBuffers = 0; + /// Number of times a uniform buffer is updated int numUniformUpdates = 0; + /// Sum of uniform buffers update sizes std::size_t uniformUpdateBytes = 0; + /// Total texture memory int memTextures = 0; + /// Total buffer memory int memBuffers = 0; + /// Total index buffer memory int memIndexBuffers = 0; + /// Total vertex buffer memory int memVertexBuffers = 0; + /// Total uniform buffer memory int memUniformBuffers = 0; + /// Number of stencil buffer clears int stencilClears = 0; + /// Number of stencil buffer updates int stencilUpdates = 0; RenderingStats& operator+=(const RenderingStats&); @@ -69,5 +97,38 @@ struct RenderingStats { #endif }; +class RenderingStatsView final { +public: + struct Options { + float updateInterval = 0.25f; + bool verbose = false; + Color textColor = Color::red(); + float textSize = 4.0f; + }; + + RenderingStatsView() = default; + RenderingStatsView(const Options& options_) + : options(options_) {} + ~RenderingStatsView() = default; + + void create(style::Style& style); + void destroy(style::Style& style); + + mbgl::style::SymbolLayer* getLayer(style::Style& style); + + void update(style::Style& style, const gfx::RenderingStats& stats); + +protected: + const std::string layerID = "rendering-stats"; + const std::string sourceID = layerID + "-source"; + + Options options; + + double lastUpdate = 0.0; + uint32_t frameCount = 0; + double encodingTime = 0.0; + double renderingTime = 0.0; +}; + } // namespace gfx } // namespace mbgl diff --git a/include/mbgl/gl/uniform_buffer_gl.hpp b/include/mbgl/gl/uniform_buffer_gl.hpp index 3a205cfbeb81..475007f40e41 100644 --- a/include/mbgl/gl/uniform_buffer_gl.hpp +++ b/include/mbgl/gl/uniform_buffer_gl.hpp @@ -11,7 +11,7 @@ class UniformBufferGL final : public gfx::UniformBuffer { UniformBufferGL(const UniformBufferGL&); public: - UniformBufferGL(const void* data, std::size_t size_, IBufferAllocator& allocator); + UniformBufferGL(Context& context, const void* data, std::size_t size_, IBufferAllocator& allocator); ~UniformBufferGL() override; UniformBufferGL(UniformBufferGL&& rhs) noexcept; @@ -27,6 +27,8 @@ class UniformBufferGL final : public gfx::UniformBuffer { void update(const void* data, std::size_t dataSize) override; private: + Context& context; + // unique id used for debugging and profiling purposes // localID should not be used as unique id because a const buffer pool is managed using IBufferAllocator // Currently unique IDs for constant buffers are only used when Tracy profiling is enabled diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index e68853e04df6..22972e27ddda 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -145,6 +145,9 @@ class Map : private util::noncopyable { void setDebug(MapDebugOptions); MapDebugOptions getDebug() const; + bool isRenderingStatsViewEnabled() const; + void enableRenderingStatsView(bool value); + bool isFullyLoaded() const; void dumpDebugLogs() const; diff --git a/include/mbgl/map/map_observer.hpp b/include/mbgl/map/map_observer.hpp index 4c9170fc18e1..f6055571d3d0 100644 --- a/include/mbgl/map/map_observer.hpp +++ b/include/mbgl/map/map_observer.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -47,8 +48,7 @@ class MapObserver { RenderMode mode; bool needsRepaint; // In continous mode, shows that there are ongoig transitions. bool placementChanged; - double frameEncodingTime; - double frameRenderingTime; + gfx::RenderingStats renderingStats; }; virtual void onCameraWillChange(CameraChangeMode) {} @@ -58,7 +58,7 @@ class MapObserver { virtual void onDidFinishLoadingMap() {} virtual void onDidFailLoadingMap(MapLoadError, const std::string&) {} virtual void onWillStartRenderingFrame() {} - virtual void onDidFinishRenderingFrame(RenderFrameStatus) {} + virtual void onDidFinishRenderingFrame(const RenderFrameStatus&) {} virtual void onWillStartRenderingMap() {} virtual void onDidFinishRenderingMap(RenderMode) {} virtual void onDidFinishLoadingStyle() {} diff --git a/include/mbgl/renderer/renderer_observer.hpp b/include/mbgl/renderer/renderer_observer.hpp index 5df817afa43e..5fac1a2a1ccc 100644 --- a/include/mbgl/renderer/renderer_observer.hpp +++ b/include/mbgl/renderer/renderer_observer.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -51,6 +52,13 @@ class RendererObserver { onDidFinishRenderingFrame(mode, repaint, placementChanged); } + virtual void onDidFinishRenderingFrame(RenderMode mode, + bool repaint, + bool placementChanged, + const gfx::RenderingStats& stats) { + onDidFinishRenderingFrame(mode, repaint, placementChanged, stats.encodingTime, stats.renderingTime); + } + /// Final frame virtual void onDidFinishRenderingMap() {} diff --git a/include/mbgl/style/layers/symbol_layer.hpp b/include/mbgl/style/layers/symbol_layer.hpp index 4d565cb9b45a..27485c806c4f 100644 --- a/include/mbgl/style/layers/symbol_layer.hpp +++ b/include/mbgl/style/layers/symbol_layer.hpp @@ -89,6 +89,10 @@ class SymbolLayer final : public Layer { const PropertyValue& getSymbolPlacement() const; void setSymbolPlacement(const PropertyValue&); + static PropertyValue getDefaultSymbolScreenSpace(); + const PropertyValue& getSymbolScreenSpace() const; + void setSymbolScreenSpace(const PropertyValue&); + static PropertyValue getDefaultSymbolSortKey(); const PropertyValue& getSymbolSortKey() const; void setSymbolSortKey(const PropertyValue&); diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index 9a75e5e96940..8a3d060919c4 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -70,7 +70,7 @@ class Context final : public gfx::Context { const mbgl::unordered_map& additionalDefines); /// Called at the end of a frame. - void performCleanup() override {} + void performCleanup() override; void reduceMemoryUsage() override {} gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; diff --git a/include/mbgl/vulkan/vertex_buffer_resource.hpp b/include/mbgl/vulkan/vertex_buffer_resource.hpp index 5b2b85910059..90380220ecf9 100644 --- a/include/mbgl/vulkan/vertex_buffer_resource.hpp +++ b/include/mbgl/vulkan/vertex_buffer_resource.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -9,12 +10,10 @@ namespace vulkan { class VertexBufferResource : public gfx::VertexBufferResource { public: - VertexBufferResource() noexcept = delete; - VertexBufferResource(BufferResource&& buffer_) noexcept - : buffer(std::move(buffer_)) {} + VertexBufferResource(BufferResource&& buffer_) noexcept; VertexBufferResource(VertexBufferResource&& other) noexcept : buffer(std::move(other.buffer)) {} - ~VertexBufferResource() noexcept override = default; + ~VertexBufferResource() noexcept override; std::size_t getSizeInBytes() const noexcept { return buffer.getSizeInBytes(); } const void* contents() const noexcept { return buffer.contents(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt index a1db3493a912..c156aa756a73 100644 --- a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt +++ b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt @@ -122,6 +122,8 @@ add_library(maplibre SHARED ${PROJECT_SOURCE_DIR}/offline/offline_region_error.hpp ${PROJECT_SOURCE_DIR}/offline/offline_region_status.cpp ${PROJECT_SOURCE_DIR}/offline/offline_region_status.hpp + ${PROJECT_SOURCE_DIR}/rendering_stats.cpp + ${PROJECT_SOURCE_DIR}/rendering_stats.hpp ${PROJECT_SOURCE_DIR}/snapshotter/map_snapshot.cpp ${PROJECT_SOURCE_DIR}/snapshotter/map_snapshot.hpp ${PROJECT_SOURCE_DIR}/snapshotter/map_snapshotter.cpp diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 0f5ddb662354..988dff420432 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -36,11 +36,10 @@ class ForwardingRendererObserver : public RendererObserver { void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded, bool placementChanged, - double frameEncodingTime, - double frameRenderingTime) override { + const gfx::RenderingStats& stats) override { void (RendererObserver::*f)( - RenderMode, bool, bool, double, double) = &RendererObserver::onDidFinishRenderingFrame; - delegate.invoke(f, mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); + RenderMode, bool, bool, const gfx::RenderingStats&) = &RendererObserver::onDidFinishRenderingFrame; + delegate.invoke(f, mode, repaintNeeded, placementChanged, stats); } void onDidFinishRenderingMap() override { delegate.invoke(&RendererObserver::onDidFinishRenderingMap); } diff --git a/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp b/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp index b84fd671ce5d..b0a29b677d3d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/jni_native.cpp @@ -35,6 +35,7 @@ #include "maplibre.hpp" #include "native_map_view.hpp" #include "native_map_options.hpp" +#include "rendering_stats.hpp" #include "util/tile_server_options.hpp" #ifndef MBGL_MODULE_OFFLINE_DISABLE #include "offline/offline_manager.hpp" @@ -111,6 +112,7 @@ void registerNatives(JavaVM* vm) { MapRendererRunnable::registerNative(env); NativeMapView::registerNative(env); NativeMapOptions::registerNative(env); + RenderingStats::registerNative(env); // Http RegisterNativeHTTPRequest(env); diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 232c2652f94c..9bfb3037d9eb 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -40,6 +40,7 @@ #include "conversion/collection.hpp" #include "style/conversion/filter.hpp" #include "geojson/feature.hpp" +#include "rendering_stats.hpp" #include "android_renderer_frontend.hpp" #include "attach_env.hpp" @@ -187,20 +188,25 @@ void NativeMapView::onWillStartRenderingFrame() { } } -void NativeMapView::onDidFinishRenderingFrame(MapObserver::RenderFrameStatus status) { +void NativeMapView::onDidFinishRenderingFrame(const MapObserver::RenderFrameStatus& status) { assert(vm != nullptr); android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); - static auto onDidFinishRenderingFrame = javaClass.GetMethod( + static auto onDidFinishRenderingFrame = javaClass.GetMethod)>( *_env, "onDidFinishRenderingFrame"); auto weakReference = javaPeer.get(*_env); if (weakReference) { + if (!renderingStats) { + renderingStats = jni::NewGlobal(*_env, RenderingStats::Create(*_env)); + } + + RenderingStats::Update(*_env, renderingStats, status.renderingStats); + weakReference.Call(*_env, onDidFinishRenderingFrame, (jboolean)(status.mode != MapObserver::RenderMode::Partial), - (jdouble)status.frameEncodingTime, - (jdouble)status.frameRenderingTime); + renderingStats); } } @@ -1272,6 +1278,16 @@ void NativeMapView::triggerRepaint(JNIEnv&) { map->triggerRepaint(); } +jni::jboolean NativeMapView::isRenderingStatsViewEnabled(JNIEnv&) { + assert(map); + return jni::jboolean(map->isRenderingStatsViewEnabled()); +} + +void NativeMapView::enableRenderingStatsView(JNIEnv&, jni::jboolean value) { + assert(map); + map->enableRenderingStatsView(value); +} + // Static methods // void NativeMapView::registerNative(jni::JNIEnv& env) { @@ -1384,7 +1400,9 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::getPrefetchZoomDelta, "nativeGetPrefetchZoomDelta"), METHOD(&NativeMapView::setTileCacheEnabled, "nativeSetTileCacheEnabled"), METHOD(&NativeMapView::getTileCacheEnabled, "nativeGetTileCacheEnabled"), - METHOD(&NativeMapView::triggerRepaint, "nativeTriggerRepaint")); + METHOD(&NativeMapView::triggerRepaint, "nativeTriggerRepaint"), + METHOD(&NativeMapView::isRenderingStatsViewEnabled, "nativeIsRenderingStatsViewEnabled"), + METHOD(&NativeMapView::enableRenderingStatsView, "nativeEnableRenderingStatsView")); } void NativeMapView::onRegisterShaders(gfx::ShaderRegistry&) {}; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 6fff2e49ccbc..bdfb9143ca13 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -39,6 +39,7 @@ namespace android { class AndroidRendererFrontend; class FileSource; class MapRenderer; +class RenderingStats; class NativeMapView : public MapObserver { public: @@ -62,7 +63,7 @@ class NativeMapView : public MapObserver { void onDidFinishLoadingMap() override; void onDidFailLoadingMap(MapLoadError, const std::string&) override; void onWillStartRenderingFrame() override; - void onDidFinishRenderingFrame(MapObserver::RenderFrameStatus) override; + void onDidFinishRenderingFrame(const MapObserver::RenderFrameStatus&) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(MapObserver::RenderMode) override; void onDidBecomeIdle() override; @@ -305,6 +306,9 @@ class NativeMapView : public MapObserver { void triggerRepaint(JNIEnv&); + jni::jboolean isRenderingStatsViewEnabled(JNIEnv&); + void enableRenderingStatsView(JNIEnv&, jni::jboolean); + // Shader compilation void onRegisterShaders(mbgl::gfx::ShaderRegistry&) override; void onPreCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, const std::string&) override; @@ -336,6 +340,8 @@ class NativeMapView : public MapObserver { float pixelRatio; + jni::Global> renderingStats; + // Minimum texture size according to OpenGL ES 2.0 specification. int width = 64; int height = 64; diff --git a/platform/android/MapLibreAndroid/src/cpp/rendering_stats.cpp b/platform/android/MapLibreAndroid/src/cpp/rendering_stats.cpp new file mode 100644 index 000000000000..2cca9d4f12ab --- /dev/null +++ b/platform/android/MapLibreAndroid/src/cpp/rendering_stats.cpp @@ -0,0 +1,61 @@ +#include "rendering_stats.hpp" + +namespace mbgl { +namespace android { + +void RenderingStats::registerNative(jni::JNIEnv& env) { + jni::Class::Singleton(env); +} + +jni::Local> RenderingStats::Create(jni::JNIEnv& env) { + auto& javaClass = jni::Class::Singleton(env); + auto constructor = javaClass.GetConstructor(env); + return javaClass.New(env, constructor); +} + +void RenderingStats::Update(jni::JNIEnv& env, + jni::Object& javaObject, + const gfx::RenderingStats& stats) { + static auto& javaClass = jni::Class::Singleton(env); + +#define SetField(name, type) \ + static auto name##Field = javaClass.GetField(env, #name); \ + javaObject.Set(env, name##Field, static_cast(stats.name)); + + SetField(encodingTime, jni::jdouble); + SetField(renderingTime, jni::jdouble); + SetField(numFrames, jni::jint); + SetField(numDrawCalls, jni::jint); + SetField(totalDrawCalls, jni::jint); + SetField(numCreatedTextures, jni::jint); + SetField(numActiveTextures, jni::jint); + SetField(numTextureBindings, jni::jint); + SetField(numTextureUpdates, jni::jint); + SetField(textureUpdateBytes, jni::jlong); + SetField(totalBuffers, jni::jlong); + SetField(totalBufferObjs, jni::jlong); + SetField(bufferUpdates, jni::jlong); + SetField(bufferObjUpdates, jni::jlong); + SetField(bufferUpdateBytes, jni::jlong); + SetField(numBuffers, jni::jint); + SetField(numFrameBuffers, jni::jint); + SetField(numIndexBuffers, jni::jint); + SetField(indexUpdateBytes, jni::jlong); + SetField(numVertexBuffers, jni::jint); + SetField(vertexUpdateBytes, jni::jlong); + SetField(numUniformBuffers, jni::jint); + SetField(numUniformUpdates, jni::jint); + SetField(uniformUpdateBytes, jni::jlong); + SetField(memTextures, jni::jint); + SetField(memBuffers, jni::jint); + SetField(memIndexBuffers, jni::jint); + SetField(memVertexBuffers, jni::jint); + SetField(memUniformBuffers, jni::jint); + SetField(stencilClears, jni::jint); + SetField(stencilUpdates, jni::jint); + +#undef SetField +} + +} // namespace android +} // namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/rendering_stats.hpp b/platform/android/MapLibreAndroid/src/cpp/rendering_stats.hpp new file mode 100644 index 000000000000..6c452fa26404 --- /dev/null +++ b/platform/android/MapLibreAndroid/src/cpp/rendering_stats.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mbgl { +namespace android { + +class RenderingStats { +public: + static constexpr auto Name() { return "org/maplibre/android/maps/RenderingStats"; }; + static void registerNative(jni::JNIEnv& env); + + static jni::Local> Create(jni::JNIEnv&); + static void Update(jni::JNIEnv&, jni::Object&, const gfx::RenderingStats&); +}; + +} // namespace android +} // namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp index 7038fc3eca51..104016817049 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp @@ -249,6 +249,11 @@ jni::Local> SymbolLayer::getTextOptional(jni::JNIEnv& env) { return std::move(*convert>>(env, toSymbolLayer(layer).getTextOptional())); } +jni::Local> SymbolLayer::getSymbolScreenSpace(jni::JNIEnv& env) { + using namespace mbgl::android::conversion; + return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolScreenSpace())); +} + jni::Local> SymbolLayer::getIconOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; return std::move(*convert>>(env, toSymbolLayer(layer).getIconOpacity())); @@ -557,6 +562,7 @@ void SymbolJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) { METHOD(&SymbolLayer::getTextAllowOverlap, "nativeGetTextAllowOverlap"), METHOD(&SymbolLayer::getTextIgnorePlacement, "nativeGetTextIgnorePlacement"), METHOD(&SymbolLayer::getTextOptional, "nativeGetTextOptional"), + METHOD(&SymbolLayer::getSymbolScreenSpace, "nativeGetSymbolScreenSpace"), METHOD(&SymbolLayer::getIconOpacityTransition, "nativeGetIconOpacityTransition"), METHOD(&SymbolLayer::setIconOpacityTransition, "nativeSetIconOpacityTransition"), METHOD(&SymbolLayer::getIconOpacity, "nativeGetIconOpacity"), diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.hpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.hpp index d7333784ce26..3175f1389b10 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.hpp @@ -110,6 +110,8 @@ class SymbolLayer : public Layer { jni::Local> getTextOptional(jni::JNIEnv&); + jni::Local> getSymbolScreenSpace(jni::JNIEnv&); + jni::Local> getIconOpacity(jni::JNIEnv&); void setIconOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); jni::Local> getIconOpacityTransition(jni::JNIEnv&); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapChangeReceiver.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapChangeReceiver.java index d8216c85784f..c92d50520b76 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapChangeReceiver.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapChangeReceiver.java @@ -23,6 +23,8 @@ class MapChangeReceiver implements NativeMapView.StateCallback { = new CopyOnWriteArrayList<>(); private final List onDidFinishRenderingFrameList = new CopyOnWriteArrayList<>(); + private final List onDidFinishRenderingFrameWithStatsList + = new CopyOnWriteArrayList<>(); private final List onWillStartRenderingMapListenerList = new CopyOnWriteArrayList<>(); private final List onDidFinishRenderingMapListenerList @@ -156,11 +158,17 @@ public void onWillStartRenderingFrame() { } @Override - public void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime) { + public void onDidFinishRenderingFrame(boolean fully, RenderingStats stats) { try { if (!onDidFinishRenderingFrameList.isEmpty()) { for (MapView.OnDidFinishRenderingFrameListener listener : onDidFinishRenderingFrameList) { - listener.onDidFinishRenderingFrame(fully, frameEncodingTime, frameRenderingTime); + listener.onDidFinishRenderingFrame(fully, stats.encodingTime, stats.renderingTime); + } + } + + if (!onDidFinishRenderingFrameWithStatsList.isEmpty()) { + for (MapView.OnDidFinishRenderingFrameWithStatsListener listener : onDidFinishRenderingFrameWithStatsList) { + listener.onDidFinishRenderingFrame(fully, stats); } } } catch (Throwable err) { @@ -480,6 +488,14 @@ void removeOnDidFinishRenderingFrameListener(MapView.OnDidFinishRenderingFrameLi onDidFinishRenderingFrameList.remove(listener); } + void addOnDidFinishRenderingFrameListener(MapView.OnDidFinishRenderingFrameWithStatsListener listener) { + onDidFinishRenderingFrameWithStatsList.add(listener); + } + + void removeOnDidFinishRenderingFrameListener(MapView.OnDidFinishRenderingFrameWithStatsListener listener) { + onDidFinishRenderingFrameWithStatsList.remove(listener); + } + void addOnWillStartRenderingMapListener(MapView.OnWillStartRenderingMapListener listener) { onWillStartRenderingMapListenerList.add(listener); } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java index cc282134aabb..ab758b79ab27 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java @@ -103,6 +103,20 @@ public void triggerRepaint() { nativeMapView.triggerRepaint(); } + /** + * Query rendering statistics overlay status. + */ + public boolean isRenderingStatsViewEnabled() { + return nativeMapView.isRenderingStatsViewEnabled(); + } + + /** + * Enable rendering statistics overlay with {@link RenderingStats} values. + */ + public void enableRenderingStatsView(boolean value) { + nativeMapView.enableRenderingStatsView(value); + } + public void setSwapBehaviorFlush(boolean flush) { nativeMapView.setSwapBehaviorFlush(flush); } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java index 39721f55eb01..d0828b14272f 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapView.java @@ -763,6 +763,24 @@ public void removeOnDidFinishRenderingFrameListener(@NonNull OnDidFinishRenderin mapChangeReceiver.removeOnDidFinishRenderingFrameListener(listener); } + /** + * Set a callback that's invoked when the map has finished rendering a frame. + * + * @param listener The callback that's invoked when the map has finished rendering a frame + */ + public void addOnDidFinishRenderingFrameListener(@NonNull OnDidFinishRenderingFrameWithStatsListener listener) { + mapChangeReceiver.addOnDidFinishRenderingFrameListener(listener); + } + + /** + * Set a callback that's invoked when the map has finished rendering a frame. + * + * @param listener The callback that's invoked when the map has finished rendering a frame + */ + public void removeOnDidFinishRenderingFrameListener(@NonNull OnDidFinishRenderingFrameWithStatsListener listener) { + mapChangeReceiver.removeOnDidFinishRenderingFrameListener(listener); + } + /** * Set a callback that's invoked when the map will start rendering. * @@ -1182,14 +1200,34 @@ public interface OnWillStartRenderingFrameListener { *

*/ public interface OnDidFinishRenderingFrameListener { + /** * Called when the map has finished rendering a frame * * @param fully true if all frames have been rendered, false if partially rendered + * @param frameEncodingTime CPU encoding time + * @param frameRenderingTime CPU rendering time */ void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime); } + /** + * Interface definition for a callback to be invoked when the map finished rendering a frame. + *

+ * {@link MapView#addOnDidFinishRenderingFrameListener(OnDidFinishRenderingFrameListener)} + *

+ */ + public interface OnDidFinishRenderingFrameWithStatsListener { + + /** + * Called when the map has finished rendering a frame + * + * @param fully true if all frames have been rendered, false if partially rendered + * @param stats rendering statistics + */ + void onDidFinishRenderingFrame(boolean fully, RenderingStats stats); + } + /** * Interface definition for a callback to be invoked when the map will start rendering the map. *

@@ -1528,7 +1566,7 @@ public void onFocalPointChanged(PointF pointF) { * The initial render callback waits for rendering to happen before making the map visible for end-users. * We wait for the second DID_FINISH_RENDERING_FRAME map change event as the first will still show a black surface. */ - private class InitialRenderCallback implements OnDidFinishRenderingFrameListener { + private class InitialRenderCallback implements OnDidFinishRenderingFrameWithStatsListener { private int renderCount; @@ -1537,7 +1575,7 @@ private class InitialRenderCallback implements OnDidFinishRenderingFrameListener } @Override - public void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime) { + public void onDidFinishRenderingFrame(boolean fully, RenderingStats stats) { if (maplibreMap != null && maplibreMap.getStyle() != null && maplibreMap.getStyle().isFullyLoaded()) { renderCount++; if (renderCount == 3) { @@ -1643,7 +1681,7 @@ public void cancelAllVelocityAnimations() { } private class MapCallback implements OnDidFinishLoadingStyleListener, - OnDidFinishRenderingFrameListener, OnDidFinishLoadingMapListener, + OnDidFinishRenderingFrameWithStatsListener, OnDidFinishLoadingMapListener, OnCameraIsChangingListener, OnCameraDidChangeListener, OnDidFailLoadingMapListener { private final List onMapReadyCallbackList = new ArrayList<>(); @@ -1709,7 +1747,7 @@ public void onDidFailLoadingMap(String errorMessage) { } @Override - public void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime) { + public void onDidFinishRenderingFrame(boolean fully, RenderingStats stats) { if (maplibreMap != null) { maplibreMap.onUpdateFullyRendered(); } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java index 4192b6d77ccf..0b3265156c6b 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java @@ -250,6 +250,10 @@ List queryRenderedFeatures(@NonNull RectF coordinates, void triggerRepaint(); + boolean isRenderingStatsViewEnabled(); + + void enableRenderingStatsView(boolean value); + void setSwapBehaviorFlush(boolean flush); // diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java index b714896e348b..a0ed4dfccf80 100755 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java @@ -1075,6 +1075,16 @@ public void triggerRepaint() { nativeTriggerRepaint(); } + @Override + public boolean isRenderingStatsViewEnabled() { + return nativeIsRenderingStatsViewEnabled(); + } + + @Override + public void enableRenderingStatsView(boolean value) { + nativeEnableRenderingStatsView(value); + } + @Override public void setSwapBehaviorFlush(boolean flush) { mapRenderer.setSwapBehaviorFlush(flush); @@ -1145,9 +1155,9 @@ private void onWillStartRenderingFrame() { } @Keep - private void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime) { + private void onDidFinishRenderingFrame(boolean fully, RenderingStats stats) { if (stateCallback != null) { - stateCallback.onDidFinishRenderingFrame(fully, frameEncodingTime, frameRenderingTime); + stateCallback.onDidFinishRenderingFrame(fully, stats); } } @@ -1642,6 +1652,12 @@ public long getNativePtr() { @Keep private native void nativeTriggerRepaint(); + @Keep + private native boolean nativeIsRenderingStatsViewEnabled(); + + @Keep + private native void nativeEnableRenderingStatsView(boolean enabled); + // // Snapshot // @@ -1719,7 +1735,7 @@ interface StateCallback extends StyleCallback { void onWillStartRenderingFrame(); - void onDidFinishRenderingFrame(boolean fully, double frameEncodingTime, double frameRenderingTime); + void onDidFinishRenderingFrame(boolean fully, RenderingStats stats); void onWillStartRenderingMap(); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java new file mode 100644 index 000000000000..4e250db53f8e --- /dev/null +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java @@ -0,0 +1,75 @@ +package org.maplibre.android.maps; + +public class RenderingStats { + /// Frame CPU encoding time (milliseconds) + public double encodingTime = 0.0; + /// Frame CPU rendering time (milliseconds) + public double renderingTime = 0.0; + + /// Number of frames rendered + public int numFrames = 0; + /// Number of draw calls (`glDrawElements`, `drawIndexedPrimitives`, etc.) executed during the most recent frame + public int numDrawCalls = 0; + /// Total number of draw calls executed during all the frames + public int totalDrawCalls = 0; + + /// Total number of textures created + public int numCreatedTextures = 0; + /// Net textures + public int numActiveTextures = 0; + /// Net texture bindings + public int numTextureBindings = 0; + /// Number of times a texture was updated + public int numTextureUpdates = 0; + /// Number of bytes used in texture updates + public long textureUpdateBytes = 0; + + /// Number of buffers created + public long totalBuffers = 0; + /// Number of SDK-specific buffers created + public long totalBufferObjs = 0; + /// Number of times a buffer is updated + public long bufferUpdates = 0; + /// Number of times an SDK-specific buffer is updated + public long bufferObjUpdates = 0; + /// Sum of update sizes + public long bufferUpdateBytes = 0; + + /// Number of active buffers + public int numBuffers = 0; + /// Number of active offscreen frame buffers + public int numFrameBuffers = 0; + + /// Number of active index buffers + public int numIndexBuffers = 0; + /// Sum of index buffers update sizes + public long indexUpdateBytes = 0; + + /// Number of active vertex buffers + public int numVertexBuffers = 0; + /// Sum of vertex buffers update sizes + public long vertexUpdateBytes = 0; + + /// Number of active uniform buffers + public int numUniformBuffers = 0; + /// Number of times a uniform buffer is updated + public int numUniformUpdates = 0; + /// Sum of uniform buffers update sizes + public long uniformUpdateBytes = 0; + + /// Total texture memory + public int memTextures = 0; + /// Total buffer memory + public int memBuffers = 0; + /// Total index buffer memory + public int memIndexBuffers = 0; + /// Total vertex buffer memory + public int memVertexBuffers = 0; + /// Total uniform buffer memory + public int memUniformBuffers = 0; + + /// Number of stencil buffer clears + public int stencilClears = 0; + /// Number of stencil buffer updates + public int stencilUpdates = 0; +} diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/PropertyFactory.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/PropertyFactory.java index e845ca276c0f..2613a2dc8bf9 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/PropertyFactory.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/PropertyFactory.java @@ -2651,6 +2651,26 @@ public static PropertyValue textOptional(Expression value) { return new LayoutPropertyValue<>("text-optional", value); } + /** + * Internal use only + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue symbolScreenSpace(Boolean value) { + return new LayoutPropertyValue<>("symbol-screen-space", value); + } + + /** + * Internal use only + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue symbolScreenSpace(Expression value) { + return new LayoutPropertyValue<>("symbol-screen-space", value); + } + /** * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key. * diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/SymbolLayer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/SymbolLayer.java index 8d5212776528..1d8847670e55 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/SymbolLayer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/layers/SymbolLayer.java @@ -649,6 +649,18 @@ public PropertyValue getTextOptional() { return (PropertyValue) new PropertyValue("text-optional", nativeGetTextOptional()); } + /** + * Get the SymbolScreenSpace property + * + * @return property wrapper value around Boolean + */ + @NonNull + @SuppressWarnings("unchecked") + public PropertyValue getSymbolScreenSpace() { + checkThread(); + return (PropertyValue) new PropertyValue("symbol-screen-space", nativeGetSymbolScreenSpace()); + } + /** * Get the IconOpacity property * @@ -1305,6 +1317,10 @@ public PropertyValue getTextTranslateAnchor() { @Keep private native Object nativeGetTextOptional(); + @NonNull + @Keep + private native Object nativeGetSymbolScreenSpace(); + @NonNull @Keep private native Object nativeGetIconOpacity(); diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/MapChangeReceiverTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/MapChangeReceiverTest.kt index 37d1d285af74..8731b9f23d71 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/MapChangeReceiverTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/maps/MapChangeReceiverTest.kt @@ -42,6 +42,9 @@ class MapChangeReceiverTest { @Mock private val onDidFinishRenderingFrameListener: OnDidFinishRenderingFrameListener? = null + @Mock + private val onDidFinishRenderingFrameWithStatsListener: OnDidFinishRenderingFrameWithStatsListener? = null + @Mock private val onWillStartRenderingMapListener: OnWillStartRenderingMapListener? = null @@ -401,13 +404,13 @@ class MapChangeReceiverTest { mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener ) - mapChangeEventManager!!?.onDidFinishRenderingFrame(true, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) Mockito.verify(onDidFinishRenderingFrameListener)?.onDidFinishRenderingFrame(true, .0, .0) mapChangeEventManager!!.removeOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener ) - mapChangeEventManager!!?.onDidFinishRenderingFrame(true, .0, .0) - Mockito.verify(onDidFinishRenderingFrameListener)?.onDidFinishRenderingFrame(true,.0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + Mockito.verify(onDidFinishRenderingFrameListener)?.onDidFinishRenderingFrame(true, .0, .0) mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener ) @@ -416,7 +419,7 @@ class MapChangeReceiverTest { Mockito.doThrow(exc).`when`(onDidFinishRenderingFrameListener) ?.onDidFinishRenderingFrame(true, .0, .0) try { - mapChangeEventManager!!?.onDidFinishRenderingFrame(true, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) Assert.fail("The exception should've been re-thrown.") } catch (throwable: RuntimeException) { Mockito.verify(loggerDefinition)?.e( @@ -429,7 +432,51 @@ class MapChangeReceiverTest { Mockito.doThrow(err).`when`(onDidFinishRenderingFrameListener) ?.onDidFinishRenderingFrame(true, .0, .0) try { - mapChangeEventManager!!?.onDidFinishRenderingFrame(true, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + Assert.fail("The exception should've been re-thrown.") + } catch (throwable: ExecutionError) { + Mockito.verify(loggerDefinition)?.e( + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.eq(err) + ) + } + } + + @Test + fun testOnDidFinishRenderingFrameWithStatsListener() { + mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( + onDidFinishRenderingFrameWithStatsListener + ) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + Mockito.verify(onDidFinishRenderingFrameWithStatsListener)?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + mapChangeEventManager!!.removeOnDidFinishRenderingFrameListener( + onDidFinishRenderingFrameWithStatsListener + ) + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + Mockito.verify(onDidFinishRenderingFrameWithStatsListener)?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( + onDidFinishRenderingFrameWithStatsListener + ) + Logger.setLoggerDefinition(loggerDefinition) + val exc: Exception = RuntimeException() + Mockito.doThrow(exc).`when`(onDidFinishRenderingFrameWithStatsListener) + ?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + try { + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + Assert.fail("The exception should've been re-thrown.") + } catch (throwable: RuntimeException) { + Mockito.verify(loggerDefinition)?.e( + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.eq(exc) + ) + } + val err: Error = ExecutionError("", Error()) + Mockito.doThrow(err).`when`(onDidFinishRenderingFrameWithStatsListener) + ?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) + try { + mapChangeEventManager!!?.onDidFinishRenderingFrame(true, TEST_RENDERING_STATS) Assert.fail("The exception should've been re-thrown.") } catch (throwable: ExecutionError) { Mockito.verify(loggerDefinition)?.e( @@ -445,12 +492,12 @@ class MapChangeReceiverTest { mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener ) - mapChangeEventManager!!?.onDidFinishRenderingFrame(false, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(false, TEST_RENDERING_STATS) Mockito.verify(onDidFinishRenderingFrameListener)?.onDidFinishRenderingFrame(false, .0, .0) mapChangeEventManager!!.removeOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener ) - mapChangeEventManager!!?.onDidFinishRenderingFrame(false, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(false, TEST_RENDERING_STATS) Mockito.verify(onDidFinishRenderingFrameListener)?.onDidFinishRenderingFrame(false, .0, .0) mapChangeEventManager!!.addOnDidFinishRenderingFrameListener( onDidFinishRenderingFrameListener @@ -460,7 +507,7 @@ class MapChangeReceiverTest { Mockito.doThrow(exc).`when`(onDidFinishRenderingFrameListener) ?.onDidFinishRenderingFrame(false, .0, .0) try { - mapChangeEventManager!!?.onDidFinishRenderingFrame(false, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(false, TEST_RENDERING_STATS) Assert.fail("The exception should've been re-thrown.") } catch (throwable: RuntimeException) { Mockito.verify(loggerDefinition)?.e( @@ -473,7 +520,7 @@ class MapChangeReceiverTest { Mockito.doThrow(err).`when`(onDidFinishRenderingFrameListener) ?.onDidFinishRenderingFrame(false, .0, .0) try { - mapChangeEventManager!!?.onDidFinishRenderingFrame(false, .0, .0) + mapChangeEventManager!!?.onDidFinishRenderingFrame(false, TEST_RENDERING_STATS) Assert.fail("The exception should've been re-thrown.") } catch (throwable: ExecutionError) { Mockito.verify(loggerDefinition)?.e( @@ -710,5 +757,6 @@ class MapChangeReceiverTest { companion object { private const val TEST_STRING = "mapChangeRandom" + private val TEST_RENDERING_STATS = RenderingStats(); } } diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/maps/RemoveUnusedImagesTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/maps/RemoveUnusedImagesTest.kt index 40842838b61b..79a1219616c1 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/maps/RemoveUnusedImagesTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/maps/RemoveUnusedImagesTest.kt @@ -60,7 +60,7 @@ class RemoveUnusedImagesTest : AppCenter() { mapView.addOnCanRemoveUnusedStyleImageListener { callbackLatch.countDown() maplibreMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 120.0), 8.0)) - mapView.addOnDidFinishRenderingFrameListener{ _, _, _ -> + mapView.addOnDidFinishRenderingFrameListener{ _, _ -> assertNotNull(maplibreMap.style!!.getImage("small")) assertNotNull(maplibreMap.style!!.getImage("large")) latch.countDown() @@ -89,7 +89,7 @@ class RemoveUnusedImagesTest : AppCenter() { maplibreMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 120.0), 8.0)) // Wait for the next frame and check that images were removed from the style. - mapView.addOnDidFinishRenderingFrameListener { _, _, _ -> + mapView.addOnDidFinishRenderingFrameListener { _, _ -> if (maplibreMap.style!!.getImage("small") == null && maplibreMap.style!!.getImage("large") == null) { latch.countDown() } diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/SymbolLayerTest.java b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/SymbolLayerTest.java index cd1ed59fe4bc..62a9752d9922 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/SymbolLayerTest.java +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/SymbolLayerTest.java @@ -917,6 +917,19 @@ public void testTextOptionalAsConstant() { assertEquals(layer.getTextOptional().getValue(), propertyValue); } + @Test + @UiThreadTest + public void testSymbolScreenSpaceAsConstant() { + Timber.i("symbol-screen-space"); + assertNotNull(layer); + assertNull(layer.getSymbolScreenSpace().getValue()); + + // Set and Get + Boolean propertyValue = true; + layer.setProperties(symbolScreenSpace(propertyValue)); + assertEquals(layer.getSymbolScreenSpace().getValue(), propertyValue); + } + @Test @UiThreadTest public void testIconOpacityTransition() { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt index 330a995f4cd0..c7f4f1ca202a 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt @@ -27,6 +27,7 @@ import org.maplibre.android.log.Logger.INFO import org.maplibre.android.maps.MapLibreMap import org.maplibre.android.maps.MapLibreMap.CancelableCallback import org.maplibre.android.maps.MapView +import org.maplibre.android.maps.RenderingStats import org.maplibre.android.testapp.R import org.maplibre.android.testapp.styles.TestStyles import org.maplibre.android.testapp.utils.BenchmarkInputData @@ -250,9 +251,9 @@ class BenchmarkActivity : AppCompatActivity() { maplibreMap.setSwapBehaviorFlush(benchmarkRun.syncRendering) - val listener = MapView.OnDidFinishRenderingFrameListener { _: Boolean, frameEncodingTime: Double, frameRenderingTime: Double -> - encodingTimeStore.add(frameEncodingTime * 1e3) - renderingTimeStore.add(frameRenderingTime * 1e3) + val listener = MapView.OnDidFinishRenderingFrameWithStatsListener { _: Boolean, stats: RenderingStats -> + encodingTimeStore.add(stats.encodingTime * 1e3) + renderingTimeStore.add(stats.renderingTime * 1e3) numFrames++; } mapView.addOnDidFinishRenderingFrameListener(listener) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt index 9ac827fea2e0..214493e1bd0f 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt @@ -19,10 +19,10 @@ import kotlin.time.TimeSource import kotlin.time.TimeSource.Monotonic import org.maplibre.android.log.Logger import org.maplibre.android.log.Logger.INFO +import org.maplibre.android.maps.RenderingStats import org.maplibre.android.maps.MapLibreMap - // # --8<-- [start:ObserverActivity] /** * Test activity showcasing logging observer actions from the core @@ -34,7 +34,8 @@ class ObserverActivity : AppCompatActivity(), MapView.OnGlyphsLoadedListener, MapView.OnGlyphsRequestedListener, MapView.OnSpriteLoadedListener, - MapView.OnSpriteRequestedListener { + MapView.OnSpriteRequestedListener, + MapView.OnDidFinishRenderingFrameWithStatsListener { // # --8<-- [end:ObserverActivity] private lateinit var mapView: MapView @@ -57,12 +58,14 @@ class ObserverActivity : AppCompatActivity(), mapView.addOnGlyphsRequestedListener(this) mapView.addOnSpriteLoadedListener(this) mapView.addOnSpriteRequestedListener(this) + mapView.addOnDidFinishRenderingFrameListener(this) // # --8<-- [end:addListeners] mapView.getMapAsync { it.setStyle( Style.Builder().fromUri(TestStyles.DEMOTILES) ) + it.enableRenderingStatsView(true) } // print and clear action journal @@ -131,6 +134,10 @@ class ObserverActivity : AppCompatActivity(), TileOperation.NullOp -> Logger.e(TAG, "An unknown tile operation was emitted for tile ${tile}") } } + + override fun onDidFinishRenderingFrame(fully: Boolean, stats: RenderingStats) { + + } // # --8<-- [end:mapEvents] override fun onStart() { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/imagegenerator/SnapshotActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/imagegenerator/SnapshotActivity.kt index b512f5bf2aa6..98c55421ecdc 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/imagegenerator/SnapshotActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/imagegenerator/SnapshotActivity.kt @@ -6,6 +6,7 @@ import org.maplibre.android.log.Logger import org.maplibre.android.maps.MapView import org.maplibre.android.maps.MapLibreMap import org.maplibre.android.maps.OnMapReadyCallback +import org.maplibre.android.maps.RenderingStats import org.maplibre.android.maps.Style import org.maplibre.android.testapp.databinding.ActivitySnapshotBinding import org.maplibre.android.testapp.styles.TestStyles diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/MapChangeActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/MapChangeActivity.kt index 7950ffe991c3..a77057540ed4 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/MapChangeActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/MapChangeActivity.kt @@ -59,7 +59,7 @@ class MapChangeActivity : AppCompatActivity() { mapView.addOnDidFinishLoadingMapListener(OnDidFinishLoadingMapListener { Timber.v("OnDidFinishLoadingMap") }) mapView.addOnDidFinishLoadingStyleListener(OnDidFinishLoadingStyleListener { Timber.v("OnDidFinishLoadingStyle") }) mapView.addOnDidFinishRenderingFrameListener( - OnDidFinishRenderingFrameListener { fully: Boolean, frameEncodingTime: Double, frameRenderingTime: Double -> + OnDidFinishRenderingFrameListener { fully: Boolean, _: Double, _: Double -> Timber.v( "OnDidFinishRenderingFrame: fully: %s", fully diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index 4f732095ff13..4db2748fb7b1 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -86,6 +86,7 @@ MLN_DARWIN_OBJC_HEADERS = [ "src/MLNPolyline.h", "src/MLNRasterDEMSource.h", "src/MLNRasterTileSource.h", + "src/MLNRenderingStats.h", "src/MLNSettings.h", "src/MLNShape.h", "src/MLNShapeCollection.h", @@ -148,6 +149,7 @@ MLN_DARWIN_PRIVATE_HEADERS = [ "src/MLNPolygon_Private.h", "src/MLNPolyline_Private.h", "src/MLNRasterTileSource_Private.h", + "src/MLNRenderingStats_Private.h", "src/MLNSettings_Private.h", "src/MLNShapeOfflineRegion_Private.h", "src/MLNShapeSource_Private.h", @@ -189,6 +191,7 @@ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ "src/MLNPolyline.mm", "src/MLNRasterDEMSource.mm", "src/MLNRasterTileSource.mm", + "src/MLNRenderingStats.mm", "src/MLNSettings.mm", "src/MLNShape.mm", "src/MLNShapeCollection.mm", diff --git a/platform/darwin/src/MLNRenderingStats.h b/platform/darwin/src/MLNRenderingStats.h new file mode 100644 index 000000000000..0c5e208fd135 --- /dev/null +++ b/platform/darwin/src/MLNRenderingStats.h @@ -0,0 +1,83 @@ +#import +#import "MLNFoundation.h" + +NS_ASSUME_NONNULL_BEGIN + +MLN_EXPORT +@interface MLNRenderingStats : NSObject + +/// Frame CPU encoding time (milliseconds) +@property (readonly) double encodingTime; +/// Frame CPU rendering time (milliseconds) +@property (readonly) double renderingTime; + +/// Number of frames rendered +@property (readonly) int numFrames; +/// Number of draw calls (`glDrawElements`, `drawIndexedPrimitives`, etc.) executed during the most +/// recent frame +@property (readonly) int numDrawCalls; +/// Total number of draw calls executed during all the frames +@property (readonly) int totalDrawCalls; + +/// Total number of textures created +@property (readonly) int numCreatedTextures; +/// Net textures +@property (readonly) int numActiveTextures; +/// Net texture bindings +@property (readonly) int numTextureBindings; +/// Number of times a texture was updated +@property (readonly) int numTextureUpdates; +/// Number of bytes used in texture updates +@property (readonly) unsigned long textureUpdateBytes; + +/// Number of buffers created +@property (readonly) unsigned long totalBuffers; +/// Number of SDK-specific buffers created +@property (readonly) unsigned long totalBufferObjs; +/// Number of times a buffer is updated +@property (readonly) unsigned long bufferUpdates; +/// Number of times an SDK-specific buffer is updated +@property (readonly) unsigned long bufferObjUpdates; +/// Sum of update sizes +@property (readonly) unsigned long bufferUpdateBytes; + +/// Number of active buffers +@property (readonly) int numBuffers; +/// Number of active offscreen frame buffers +@property (readonly) int numFrameBuffers; + +/// Number of active index buffers +@property (readonly) int numIndexBuffers; +/// Sum of index buffers update sizes +@property (readonly) unsigned long indexUpdateBytes; + +/// Number of active vertex buffers +@property (readonly) int numVertexBuffers; +/// Sum of vertex buffers update sizes +@property (readonly) unsigned long vertexUpdateBytes; + +/// Number of active uniform buffers +@property (readonly) int numUniformBuffers; +/// Number of times a uniform buffer is updated +@property (readonly) int numUniformUpdates; +/// Sum of uniform buffers update sizes +@property (readonly) unsigned long uniformUpdateBytes; + +/// Total texture memory +@property (readonly) int memTextures; +/// Total buffer memory +@property (readonly) int memBuffers; +/// Total index buffer memory +@property (readonly) int memIndexBuffers; +/// Total vertex buffer memory +@property (readonly) int memVertexBuffers; +/// Total uniform buffer memory +@property (readonly) int memUniformBuffers; + +/// Number of stencil buffer clears +@property (readonly) int stencilClears; +/// Number of stencil buffer updates +@property (readonly) int stencilUpdates; +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNRenderingStats.mm b/platform/darwin/src/MLNRenderingStats.mm new file mode 100644 index 000000000000..63231993c233 --- /dev/null +++ b/platform/darwin/src/MLNRenderingStats.mm @@ -0,0 +1,38 @@ +#import "MLNRenderingStats_Private.h" + +@implementation MLNRenderingStats + +- (void)setCoreData:(const mbgl::gfx::RenderingStats&)stats { + _encodingTime = stats.encodingTime; + _renderingTime = stats.renderingTime; + _numFrames = stats.numFrames; + _numDrawCalls = stats.numDrawCalls; + _totalDrawCalls = stats.totalDrawCalls; + _numCreatedTextures = stats.numCreatedTextures; + _numActiveTextures = stats.numActiveTextures; + _numTextureBindings = stats.numTextureBindings; + _numTextureUpdates = stats.numTextureUpdates; + _textureUpdateBytes = stats.textureUpdateBytes; + _totalBuffers = stats.totalBuffers; + _totalBufferObjs = stats.totalBufferObjs; + _bufferUpdates = stats.bufferUpdates; + _bufferObjUpdates = stats.bufferObjUpdates; + _bufferUpdateBytes = stats.bufferUpdateBytes; + _numIndexBuffers = stats.numIndexBuffers; + _indexUpdateBytes = stats.indexUpdateBytes; + _numVertexBuffers = stats.numVertexBuffers; + _vertexUpdateBytes = stats.vertexUpdateBytes; + _numUniformBuffers = stats.numUniformBuffers; + _numUniformUpdates = stats.numUniformUpdates; + _uniformUpdateBytes = stats.uniformUpdateBytes; + _memTextures = stats.memTextures; + _memBuffers = stats.memBuffers; + _memIndexBuffers = stats.memIndexBuffers; + _memVertexBuffers = stats.memVertexBuffers; + _memUniformBuffers = stats.memUniformBuffers; + _stencilClears = stats.stencilClears; + _stencilUpdates = stats.stencilUpdates; +} + + +@end diff --git a/platform/darwin/src/MLNRenderingStats_Private.h b/platform/darwin/src/MLNRenderingStats_Private.h new file mode 100644 index 000000000000..24265f40d32e --- /dev/null +++ b/platform/darwin/src/MLNRenderingStats_Private.h @@ -0,0 +1,12 @@ +#import +#import "MLNRenderingStats.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MLNRenderingStats (Private) + +- (void)setCoreData:(const mbgl::gfx::RenderingStats&)stats; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/default/src/mbgl/map/map_snapshotter.cpp b/platform/default/src/mbgl/map/map_snapshotter.cpp index e42fe0719c42..fa74b076aaa6 100644 --- a/platform/default/src/mbgl/map/map_snapshotter.cpp +++ b/platform/default/src/mbgl/map/map_snapshotter.cpp @@ -39,11 +39,10 @@ class ForwardingRendererObserver final : public RendererObserver { void onDidFinishRenderingFrame(RenderMode mode, bool repaintNeeded, bool placementChanged, - double frameEncodingTime, - double frameRenderingTime) override { + const gfx::RenderingStats& stats) override { void (RendererObserver::*f)( - RenderMode, bool, bool, double, double) = &RendererObserver::onDidFinishRenderingFrame; - delegate.invoke(f, mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); + RenderMode, bool, bool, const gfx::RenderingStats&) = &RendererObserver::onDidFinishRenderingFrame; + delegate.invoke(f, mode, repaintNeeded, placementChanged, stats); } void onStyleImageMissing(const std::string& image, const StyleImageMissingCallback& cb) override { @@ -95,6 +94,16 @@ class SnapshotterRenderer final : public RendererObserver { mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); } + void onDidFinishRenderingFrame(RenderMode mode, + bool repaint, + bool placementChanged, + const gfx::RenderingStats& stats) override { + if (mode == RenderMode::Full && hasPendingStillImageRequest) { + stillImage = frontend.readStillImage(); + } + rendererObserver->onDidFinishRenderingFrame(mode, repaint, placementChanged, stats); + } + void onStyleImageMissing(const std::string& id, const StyleImageMissingCallback& done) override { rendererObserver->onStyleImageMissing(id, done); } diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 200fade649f6..9ba9a1f76c8b 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -278,6 +278,8 @@ GLFWView::GLFWView(bool fullscreen_, printf("- Press `K` to add a random custom runtime imagery annotation\n"); printf("- Press `L` to add a random line annotation\n"); printf("- Press `W` to pop the last-added annotation off\n"); + printf("- Press `V` to toggle custom drawable layer\n"); + printf("- Press `B` to toggle rendering stats\n"); printf("- Press `P` to pause tile requests\n"); printf("\n"); printf("- Hold `Control` + mouse drag to rotate\n"); @@ -373,6 +375,9 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, case GLFW_KEY_V: view->toggleCustomDrawableStyle(); break; + case GLFW_KEY_B: + view->map->enableRenderingStatsView(!view->map->isRenderingStatsViewEnabled()); + break; case GLFW_KEY_I: view->resetDatabaseCallback(); break; diff --git a/platform/ios/MapLibre.docc/ActionJournalExample.md b/platform/ios/MapLibre.docc/ActionJournalExample.md index 4842f0abe482..8d33785b32cb 100644 --- a/platform/ios/MapLibre.docc/ActionJournalExample.md +++ b/platform/ios/MapLibre.docc/ActionJournalExample.md @@ -63,7 +63,10 @@ Enabling the action journal. ```swift -MLNSettings.actionJournalOptions.enabled = true +let options = MLNMapOptions() + options.actionJournalOptions.enabled = true + options.styleURL = AMERICANA_STYLE + mapView = MLNMapView(frame: view.bounds, options: options) ``` diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index e459c0eb68b6..8004db5db652 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -57,6 +57,7 @@ Powerful, free and open-source mapping toolkit with full control over data sourc ### Advanced - +- ### Other Articles diff --git a/platform/ios/MapLibre.docc/ObserverExample.md b/platform/ios/MapLibre.docc/ObserverExample.md index 0df88adf3954..f5fdc148cbf9 100644 --- a/platform/ios/MapLibre.docc/ObserverExample.md +++ b/platform/ios/MapLibre.docc/ObserverExample.md @@ -6,6 +6,20 @@ Learn about the ``MLNMapViewDelegate`` methods for observing map events. You can observe certain low-level events as they happen. Use these methods to collect metrics or investigate issues during map rendering. This feature is intended primarily for power users. We are always interested in improving observability, so if you have a special use case, feel free to [open an issue or pull request](https://github.com/maplibre/maplibre-native) to extend the types of observability methods. +## Frame Events + +Observe frame rendering statistics with ``MLNMapViewDelegate/mapViewDidFinishRenderingFrame:fullyRendered:renderingStats:``. + + + +```swift +func mapViewDidFinishRenderingFrame(_: MLNMapView, fullyRendered: Bool, renderingStats: MLNRenderingStats) { + + } +``` + +See also: ``MLNMapViewDelegate/mapViewDidFinishRenderingFrame:fullyRendered:`` and ``MLNMapViewDelegate/mapViewDidFinishRenderingFrame:fullyRendered:frameEncodingTime:frameRenderingTime:`` + ## Shader Events Observe shader compilation with ``MLNMapViewDelegate/mapView:shaderWillCompile:backend:defines:`` and ``MLNMapViewDelegate/mapView:shaderDidCompile:backend:defines:``. diff --git a/platform/ios/MapLibre.docc/RenderingStatisticsHud.md b/platform/ios/MapLibre.docc/RenderingStatisticsHud.md new file mode 100644 index 000000000000..e0317387685e --- /dev/null +++ b/platform/ios/MapLibre.docc/RenderingStatisticsHud.md @@ -0,0 +1,13 @@ +# Rendering Statistics HUD + +Show rendering statistics on the map + +Enable the rendering HUD with: + + + +```swift +mapView.enableRenderingStatsView(true) +``` + +![](RenderingStatistics.png) diff --git a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift index a815f6a2c337..e4dd3f371059 100644 --- a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift +++ b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift @@ -35,7 +35,7 @@ struct MapLibreNavigationView: View { AddMarkerSymbolExampleUIViewControllerRepresentable() } NavigationLink("ObserverExample") { - ObserverExampleViewExampleUIViewControllerRepresentable() + ObserverExampleViewUIViewControllerRepresentable() } Group { NavigationLink("AnimatedLineExample") { diff --git a/platform/ios/app-swift/Sources/ObserverExample.swift b/platform/ios/app-swift/Sources/ObserverExample.swift index 167c1bfe1913..7fcea92aea08 100644 --- a/platform/ios/app-swift/Sources/ObserverExample.swift +++ b/platform/ios/app-swift/Sources/ObserverExample.swift @@ -18,11 +18,6 @@ class ObserverExampleView: UIViewController, MLNMapViewDelegate { mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - mapView.setCenter( - CLLocationCoordinate2D(latitude: 45.5076, longitude: -122.6736), - zoomLevel: 11, - animated: false - ) view.addSubview(mapView) mapView.delegate = self @@ -45,6 +40,17 @@ class ObserverExampleView: UIViewController, MLNMapViewDelegate { // #-end-example-code + func mapViewDidFinishLoadingMap(_: MLNMapView) { + // #-example-code(enableRenderingStatsView) + mapView.enableRenderingStatsView(true) + // #-end-example-code + } + + // #-example-code(ObserverExampleRenderingStats) + func mapViewDidFinishRenderingFrame(_: MLNMapView, fullyRendered _: Bool, renderingStats _: MLNRenderingStats) {} + + // #-end-example-code + // #-example-code(ObserverExampleShaders) func mapView(_: MLNMapView, shaderWillCompile id: Int, backend: Int, defines: String) { print("A new shader is being compiled - shaderID:\(id), backend type:\(backend), program configuration:\(defines)") @@ -125,7 +131,7 @@ class ObserverExampleView: UIViewController, MLNMapViewDelegate { // #-end-example-code } -struct ObserverExampleViewExampleUIViewControllerRepresentable: UIViewControllerRepresentable { +struct ObserverExampleViewUIViewControllerRepresentable: UIViewControllerRepresentable { typealias UIViewControllerType = ObserverExampleView func makeUIViewController(context _: Context) -> ObserverExampleView { diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index 21aad990080f..c8bad1e55926 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -54,7 +54,8 @@ typedef NS_ENUM(NSInteger, MBXSettingsDebugToolsRows) { MBXSettingsDebugToolsOverdrawVisualization, MBXSettingsDebugToolsShowZoomLevel, MBXSettingsDebugToolsShowFrameTimeGraph, - MBXSettingsDebugToolsShowReuseQueueStats + MBXSettingsDebugToolsShowReuseQueueStats, + MBXSettingsDebugToolsShowRenderingStats }; typedef NS_ENUM(NSInteger, MBXSettingsAnnotationsRows) { @@ -220,6 +221,7 @@ @interface MBXViewController () isRenderingStatsViewEnabled(); +} + +- (void)enableRenderingStatsView:(BOOL)value { + _mbglMap->enableRenderingStatsView(value); +} + - (void)triggerRepaint { _mbglMap->triggerRepaint(); diff --git a/platform/ios/src/MLNMapViewDelegate.h b/platform/ios/src/MLNMapViewDelegate.h index 1fa78827ad07..ec9dd6e54f20 100644 --- a/platform/ios/src/MLNMapViewDelegate.h +++ b/platform/ios/src/MLNMapViewDelegate.h @@ -1,6 +1,7 @@ #import #import "MLNCameraChangeReason.h" +#import "MLNRenderingStats.h" #import "MLNTileOperation.h" #import "Mapbox.h" @@ -267,6 +268,23 @@ NS_ASSUME_NONNULL_BEGIN fullyRendered:(BOOL)fullyRendered frameEncodingTime:(double)frameEncodingTime frameRenderingTime:(double)frameRenderingTime; +/** + Tells the delegate that the map view has just redrawn. + + This method is called any time the map view needs to redraw due to a change in + the viewpoint or style property transition. This method may be called very + frequently, even moreso than `-mapViewRegionIsChanging:`. Therefore, your + implementation of this method should be as lightweight as possible to avoid + affecting performance. + + @param mapView The map view that has just redrawn. + @param fullyRendered A Boolean value indicating whether the map is fully rendered or not. + @param renderingStats A collection of rendering statistics + */ +- (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView + fullyRendered:(BOOL)fullyRendered + renderingStats:(MLNRenderingStats *)renderingStats; + /** Tells the delegate that the map view is entering an idle state, and no more drawing will be necessary until new data is loaded or there is some interaction diff --git a/platform/ios/src/MLNMapView_Private.h b/platform/ios/src/MLNMapView_Private.h index 632fe4938845..db918f1aac2d 100644 --- a/platform/ios/src/MLNMapView_Private.h +++ b/platform/ios/src/MLNMapView_Private.h @@ -3,11 +3,14 @@ #import "MLNTileOperation.h" #import "MLNUserLocationAnnotationView.h" -#include - namespace mbgl { class Map; class Renderer; + +namespace gfx { +struct RenderingStats; +} + } // namespace mbgl class MLNMapViewImpl; @@ -39,8 +42,7 @@ FOUNDATION_EXTERN MLN_EXPORT MLNExceptionName const _Nonnull MLNUnderlyingMapUna - (void)mapViewDidFailLoadingMapWithError:(nonnull NSError *)error; - (void)mapViewWillStartRenderingFrame; - (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered - frameEncodingTime:(double)frameEncodingTime - frameRenderingTime:(double)frameRenderingTime; + renderingStats:(const mbgl::gfx::RenderingStats &)stats; - (void)mapViewWillStartRenderingMap; - (void)mapViewDidFinishRenderingMapFullyRendered:(BOOL)fullyRendered; - (void)mapViewDidBecomeIdle; diff --git a/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift b/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift index 3509830e1a50..6f7e69b9dc43 100644 --- a/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift +++ b/platform/ios/test/MLNMapViewDelegateIntegrationTests.swift @@ -62,6 +62,8 @@ extension MLNMapViewDelegateIntegrationTests: MLNMapViewDelegate { func mapViewDidFinishRenderingFrame(_: MLNMapView, fullyRendered _: Bool, frameEncodingTime _: Double, frameRenderingTime _: Double) {} + func mapViewDidFinishRenderingFrame(_: MLNMapView, fullyRendered _: Bool, renderingStats _: MLNRenderingStats) {} + func mapView(_: MLNMapView, shapeAnnotationIsEnabled _: MLNShape) -> Bool { false } func mapView(_: MLNMapView, didAdd _: [MLNAnnotationView]) {} diff --git a/platform/macos/src/MLNMapView+Impl.h b/platform/macos/src/MLNMapView+Impl.h index 16a61fca4a6c..07fd08cc21d5 100644 --- a/platform/macos/src/MLNMapView+Impl.h +++ b/platform/macos/src/MLNMapView+Impl.h @@ -31,7 +31,7 @@ class MLNMapViewImpl : public mbgl::MapObserver { void onDidFinishLoadingMap() override; void onDidFailLoadingMap(mbgl::MapLoadError mapError, const std::string& what) override; void onWillStartRenderingFrame() override; - void onDidFinishRenderingFrame(mbgl::MapObserver::RenderFrameStatus) override; + void onDidFinishRenderingFrame(const mbgl::MapObserver::RenderFrameStatus&) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(mbgl::MapObserver::RenderMode) override; void onDidFinishLoadingStyle() override; diff --git a/platform/macos/src/MLNMapView+Impl.mm b/platform/macos/src/MLNMapView+Impl.mm index 90ba411ada56..f555ffdbae2f 100644 --- a/platform/macos/src/MLNMapView+Impl.mm +++ b/platform/macos/src/MLNMapView+Impl.mm @@ -80,9 +80,9 @@ [mapView mapViewWillStartRenderingFrame]; } -void MLNMapViewImpl::onDidFinishRenderingFrame(mbgl::MapObserver::RenderFrameStatus status) { +void MLNMapViewImpl::onDidFinishRenderingFrame(const mbgl::MapObserver::RenderFrameStatus& status) { bool fullyRendered = status.mode == mbgl::MapObserver::RenderMode::Full; - [mapView mapViewDidFinishRenderingFrameFullyRendered:fullyRendered]; + [mapView mapViewDidFinishRenderingFrameFullyRendered:fullyRendered renderingStats:status.renderingStats]; } void MLNMapViewImpl::onWillStartRenderingMap() { diff --git a/platform/macos/src/MLNMapView.mm b/platform/macos/src/MLNMapView.mm index cdaf39dd2599..83cd35ed9181 100644 --- a/platform/macos/src/MLNMapView.mm +++ b/platform/macos/src/MLNMapView.mm @@ -61,6 +61,7 @@ #import "MLNLoggingConfiguration_Private.h" #import "MLNReachability.h" #import "MLNActionJournalOptions_Private.h" +#import "MLNRenderingStats_Private.h" #import "MLNSettings_Private.h" #import @@ -207,6 +208,8 @@ @implementation MLNMapView { /// reachability instance MLNReachability *_reachability; + + MLNRenderingStats* _renderingStats; } // MARK: Lifecycle @@ -954,7 +957,8 @@ - (void)mapViewWillStartRenderingFrame { } } -- (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered { +- (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered + renderingStats:(const mbgl::gfx::RenderingStats &)stats { if (!_mbglMap) { return; } @@ -963,7 +967,25 @@ - (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered { _isChangingAnnotationLayers = NO; [self.style didChangeValueForKey:@"layers"]; } - if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:)]) { + + if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:renderingStats:)]) + { + if (!_renderingStats) { + _renderingStats = [[MLNRenderingStats alloc] init]; + } + + [_renderingStats setCoreData:stats]; + [self.delegate mapViewDidFinishRenderingFrame:self fullyRendered:fullyRendered renderingStats:_renderingStats]; + } + else if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:frameEncodingTime:frameRenderingTime:)]) + { + [self.delegate mapViewDidFinishRenderingFrame:self + fullyRendered:fullyRendered + frameEncodingTime:stats.encodingTime + frameRenderingTime:stats.renderingTime]; + } + else if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:)]) + { [self.delegate mapViewDidFinishRenderingFrame:self fullyRendered:fullyRendered]; } } diff --git a/platform/macos/src/MLNMapViewDelegate.h b/platform/macos/src/MLNMapViewDelegate.h index 9dcf94141765..43e631b3f442 100644 --- a/platform/macos/src/MLNMapViewDelegate.h +++ b/platform/macos/src/MLNMapViewDelegate.h @@ -1,5 +1,6 @@ #import #import +#import "MLNRenderingStats.h" #import "MLNTileOperation.h" NS_ASSUME_NONNULL_BEGIN @@ -169,11 +170,31 @@ NS_ASSUME_NONNULL_BEGIN affecting performance. @param mapView The map view that has just redrawn. - @param frameTimeNanos The time taken to render the frame, in nanoseconds + @param fullyRendered A Boolean value indicating whether the map is fully rendered or not. + @param frameEncodingTime The time taken to encode the frame, in milliseconds. + @param frameRenderingTime The time taken to render the frame, in milliseconds. */ - (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView fullyRendered:(BOOL)fullyRendered - frameTime:(double)frameTime; + frameEncodingTime:(double)frameEncodingTime + frameRenderingTime:(double)frameRenderingTime; + +/** + Tells the delegate that the map view has just redrawn. + + This method is called any time the map view needs to redraw due to a change in + the viewpoint or style property transition. This method may be called very + frequently, even moreso than `-mapViewRegionIsChanging:`. Therefore, your + implementation of this method should be as lightweight as possible to avoid + affecting performance. + + @param mapView The map view that has just redrawn. + @param fullyRendered A Boolean value indicating whether the map is fully rendered or not. + @param renderingStats A collection of rendering statistics + */ +- (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView + fullyRendered:(BOOL)fullyRendered + renderingStats:(MLNRenderingStats *)renderingStats; /** Tells the delegate that the map view is entering an idle state, and no more diff --git a/platform/macos/src/MLNMapView_Private.h b/platform/macos/src/MLNMapView_Private.h index 12c04213da8d..d5573544c668 100644 --- a/platform/macos/src/MLNMapView_Private.h +++ b/platform/macos/src/MLNMapView_Private.h @@ -6,6 +6,11 @@ namespace mbgl { class Map; class Renderer; + +namespace gfx { +struct RenderingStats; +} + } // namespace mbgl @class MLNSource; @@ -40,7 +45,8 @@ class Renderer; - (void)mapViewDidFinishLoadingMap; - (void)mapViewDidFailLoadingMapWithError:(nonnull NSError *)error; - (void)mapViewWillStartRenderingFrame; -- (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered; +- (void)mapViewDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered + renderingStats:(const mbgl::gfx::RenderingStats &)stats; - (void)mapViewWillStartRenderingMap; - (void)mapViewDidFinishRenderingMapFullyRendered:(BOOL)fullyRendered; - (void)mapViewDidBecomeIdle; diff --git a/scripts/style-spec.mjs b/scripts/style-spec.mjs index aec25a0300ca..cb383cd91189 100644 --- a/scripts/style-spec.mjs +++ b/scripts/style-spec.mjs @@ -190,4 +190,12 @@ modifiedReferenceSpec["paint_location-indicator"] = { } }; +// internal use +modifiedReferenceSpec["layout_symbol"]["symbol-screen-space"] = { + "type": "boolean", + "default": false, + "property-type": "data-constant", + "doc": "Internal use only" +}; + export default modifiedReferenceSpec; diff --git a/src/mbgl/gfx/rendering_stats.cpp b/src/mbgl/gfx/rendering_stats.cpp index 20b20c21d17d..84aa6c59027e 100644 --- a/src/mbgl/gfx/rendering_stats.cpp +++ b/src/mbgl/gfx/rendering_stats.cpp @@ -1,8 +1,14 @@ #include +#include +#include +#include +#include +#include #include #include #include +#include namespace mbgl { namespace gfx { @@ -24,6 +30,8 @@ bool RenderingStats::isZero() const { } RenderingStats& RenderingStats::operator+=(const RenderingStats& r) { + encodingTime += r.encodingTime; + renderingTime += r.renderingTime; numFrames += r.numFrames; numDrawCalls += r.numDrawCalls; totalDrawCalls += r.totalDrawCalls; @@ -66,6 +74,10 @@ std::ostream& optionalStatLine(std::ostream& stream, T value, std::string_view l } std::string RenderingStats::toString(std::string_view sep) const { std::stringstream ss; + ss.precision(2); + + optionalStatLine(ss, encodingTime, "encodingTime", sep); + optionalStatLine(ss, renderingTime, "renderingTime", sep); optionalStatLine(ss, numFrames, "numFrames", sep); optionalStatLine(ss, numDrawCalls, "numDrawCalls", sep); optionalStatLine(ss, totalDrawCalls, "totalDrawCalls", sep); @@ -99,5 +111,182 @@ std::string RenderingStats::toString(std::string_view sep) const { } #endif +void RenderingStatsView::create(style::Style& style) { + if (!style.getSource(sourceID)) { + style::CustomGeometrySource::Options sourceOptions; + + sourceOptions.zoomRange = {0, 0}; + + sourceOptions.fetchTileFunction = [&](const CanonicalTileID& tileID) { + auto source = static_cast(style.getSource(sourceID)); + + if (!source) { + return; + } + + mbgl::FeatureCollection features; + + mapbox::geojson::feature feature; + feature.geometry = mapbox::geometry::geometry(Point{0, 0}); + + features.emplace_back(feature); + source->setTileData(tileID, features); + }; + + style.addSource(std::make_unique(sourceID, sourceOptions)); + } + + if (!style.getLayer(layerID)) { + auto infoLayer = std::make_unique(layerID, sourceID); + + // required + infoLayer->setSymbolScreenSpace(true); + infoLayer->setTextAllowOverlap(true); + infoLayer->setIconAllowOverlap(true); + infoLayer->setTextIgnorePlacement(true); + + // customizable + infoLayer->setTextColor(options.textColor); + infoLayer->setTextSize(options.textSize); + infoLayer->setTextMaxWidth(300.0f); + infoLayer->setTextJustify(mbgl::style::TextJustifyType::Left); + infoLayer->setTextAnchor(mbgl::style::SymbolAnchorType::TopRight); + + const float translation = mbgl::util::EXTENT / 2.0f - 100.0f; + infoLayer->setTextTranslateAnchor(mbgl::style::TranslateAnchorType::Viewport); + infoLayer->setTextTranslate(std::array{translation, translation}); + + style.addLayer(std::move(infoLayer)); + } +} + +void RenderingStatsView::destroy(style::Style& style) { + style.removeLayer(layerID); + style.removeSource(sourceID); +} + +mbgl::style::SymbolLayer* RenderingStatsView::getLayer(style::Style& style) { + return static_cast(style.getLayer(layerID)); +} + +namespace { +template +void printNumber(std::stringstream& ss, const std::string_view label, const T& value, bool print) { + if (!print) { + return; + } + + ss << label << ": "; + + if (value >= 1e9) { + ss << value / 1e9 << "B"; + } else if (value >= 1e6) { + ss << value / 1e6 << "M"; + } else if (value >= 1e3) { + ss << value / 1e3 << "K"; + } else { + ss << value; + } + + ss << "\n"; +}; + +template +void printMemory(std::stringstream& ss, const std::string_view label, const T& value, bool print) { + if (!print) { + return; + } + + constexpr auto base = 1024; + constexpr auto kb = base; + constexpr auto mb = kb * base; + constexpr auto gb = mb * base; + + ss << label << ": "; + + if (value >= gb) { + ss << value / gb << "GB"; + } else if (value >= mb) { + ss << value / mb << "MB"; + } else if (value >= kb) { + ss << value / kb << "KB"; + } else { + ss << value << "B"; + } + + ss << "\n"; +}; + +} // namespace + +void RenderingStatsView::update(style::Style& style, const gfx::RenderingStats& stats) { + auto layer = getLayer(style); + + // style reloaded? layer got removed? + if (!layer) { + create(style); + layer = getLayer(style); + } + + if (!layer) { + return; + } + + ++frameCount; + encodingTime += stats.encodingTime; + renderingTime += stats.renderingTime; + + const auto currentTime = util::MonotonicTimer::now().count(); + if (currentTime - lastUpdate < options.updateInterval) { + return; + } + + std::stringstream ss; + ss << std::setprecision(3) << std::fixed; + + ss << "Encoding time (ms): " << std::setw(7) << encodingTime / frameCount * 1000 << "\n"; + ss << "Rendering time (ms): " << std::setw(7) << renderingTime / frameCount * 1000 << "\n"; + + printNumber(ss, "Frame count", stats.numFrames, true); + printNumber(ss, "Draw calls", stats.numDrawCalls, true); + printNumber(ss, "Total draw calls", stats.totalDrawCalls, options.verbose); + + printNumber(ss, "Textures", stats.numActiveTextures, true); + printNumber(ss, "Total textures", stats.numCreatedTextures, options.verbose); + printNumber(ss, "Texture updates", stats.numTextureUpdates, options.verbose); + printMemory(ss, "Texture updates", stats.textureUpdateBytes, options.verbose); + + printNumber(ss, "Buffers", stats.numBuffers, true); + printNumber(ss, "Total buffers", stats.totalBuffers, options.verbose); + printNumber(ss, "Total buffer updates", stats.bufferUpdates, options.verbose); + printMemory(ss, "Total buffer updates", stats.bufferUpdateBytes, options.verbose); + + printNumber(ss, "Index buffers", stats.numIndexBuffers, true); + printMemory(ss, "Index buffers updates", stats.indexUpdateBytes, options.verbose); + + printNumber(ss, "Vertex buffers", stats.numVertexBuffers, true); + printMemory(ss, "Vertex buffers updates", stats.vertexUpdateBytes, options.verbose); + + printNumber(ss, "Uniform buffers", stats.numUniformBuffers, true); + printNumber(ss, "Uniform buffer updates", stats.numUniformUpdates, options.verbose); + printMemory(ss, "Uniform buffer updates", stats.uniformUpdateBytes, options.verbose); + + printMemory(ss, "Texture memory", stats.memTextures, true); + printMemory(ss, "Buffer memory", stats.memBuffers, true); + printMemory(ss, "Index buffer memory", stats.memIndexBuffers, true); + printMemory(ss, "Vertex buffer memory", stats.memVertexBuffers, true); + printMemory(ss, "Uniform buffer memory", stats.memUniformBuffers, true); + + printNumber(ss, "Stencil buffer clears", stats.stencilClears, true); + printNumber(ss, "Stencil buffer updates", stats.stencilUpdates, options.verbose); + + layer->setTextField(mbgl::style::expression::Formatted(ss.str().c_str())); + + frameCount = 0; + encodingTime = 0.0; + renderingTime = 0.0; + lastUpdate = currentTime; +} + } // namespace gfx } // namespace mbgl diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 91679793738e..4659190c3a4a 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -100,6 +100,10 @@ Context::~Context() noexcept { if (cleanupOnDestruction) { backend.getThreadPool().runRenderJobs(true /* closeQueue */); + for (size_t i = 0; i < globalUniformBuffers.allocatedSize(); i++) { + globalUniformBuffers.set(i, nullptr); + } + reset(); // Delete all pooled resources while the context is still valid @@ -536,7 +540,7 @@ gfx::UniformBufferPtr Context::createUniformBuffer(const void* data, bool /*ssbo*/) { MLN_TRACE_FUNC(); - return std::make_shared(data, size, *uboAllocator); + return std::make_shared(*this, data, size, *uboAllocator); } gfx::UniqueUniformBufferArray Context::createLayerUniformBufferArray() { @@ -622,6 +626,7 @@ void Context::clear(std::optional color, std::optional depth MBGL_CHECK_ERROR(glClear(mask)); stats.numDrawCalls = 0; + stats.numFrames++; } void Context::setCullFaceMode(const gfx::CullFaceMode& mode) { @@ -728,6 +733,7 @@ void Context::draw(const gfx::DrawMode& drawMode, std::size_t indexOffset, std:: reinterpret_cast(sizeof(uint16_t) * indexOffset))); stats.numDrawCalls++; + stats.totalDrawCalls++; } void Context::performCleanup() { diff --git a/src/mbgl/gl/index_buffer_resource.cpp b/src/mbgl/gl/index_buffer_resource.cpp index e9a5cc1f26a0..0212527f10d9 100644 --- a/src/mbgl/gl/index_buffer_resource.cpp +++ b/src/mbgl/gl/index_buffer_resource.cpp @@ -9,13 +9,29 @@ IndexBufferResource::IndexBufferResource(UniqueBuffer&& buffer_, int byteSize_) : buffer(std::move(buffer_)), byteSize(byteSize_) { MLN_TRACE_ALLOC_INDEX_BUFFER(buffer.get(), byteSize); + + if (buffer) { + auto& stats = buffer.get_deleter().context.renderingStats(); + stats.numIndexBuffers++; + stats.memIndexBuffers += byteSize; + + stats.numBuffers++; + stats.totalBuffers++; + stats.memBuffers += byteSize; + } } IndexBufferResource::~IndexBufferResource() noexcept { MLN_TRACE_FREE_INDEX_BUFFER(buffer.get()); - auto& stats = buffer.get_deleter().context.renderingStats(); - stats.memIndexBuffers -= byteSize; - assert(stats.memIndexBuffers >= 0); + + if (buffer) { + auto& stats = buffer.get_deleter().context.renderingStats(); + stats.numIndexBuffers--; + stats.memIndexBuffers -= byteSize; + stats.memBuffers -= byteSize; + + assert(stats.memIndexBuffers >= 0); + } } } // namespace gl diff --git a/src/mbgl/gl/texture2d.cpp b/src/mbgl/gl/texture2d.cpp index 332e515a7c54..a9551dfa8c72 100644 --- a/src/mbgl/gl/texture2d.cpp +++ b/src/mbgl/gl/texture2d.cpp @@ -187,6 +187,9 @@ void Texture2D::uploadSubRegion(const void* pixelData, const Size& size_, uint16 Enum::to(pixelFormat), Enum::to(channelType), pixelData)); + + context.renderingStats().numTextureUpdates++; + context.renderingStats().textureUpdateBytes += static_cast(getPixelStride() * size_.width * size_.height); } void Texture2D::upload() noexcept { diff --git a/src/mbgl/gl/uniform_buffer_gl.cpp b/src/mbgl/gl/uniform_buffer_gl.cpp index 7bc7d470d713..200a945c6c0b 100644 --- a/src/mbgl/gl/uniform_buffer_gl.cpp +++ b/src/mbgl/gl/uniform_buffer_gl.cpp @@ -26,12 +26,21 @@ int64_t generateDebugId() noexcept { } // namespace -UniformBufferGL::UniformBufferGL(const void* data_, std::size_t size_, IBufferAllocator& allocator_) +UniformBufferGL::UniformBufferGL(Context& context_, const void* data_, std::size_t size_, IBufferAllocator& allocator_) : UniformBuffer(size_), + context(context_), #ifdef MLN_TRACY_ENABLE uniqueDebugId(generateDebugId()), #endif managedBuffer(allocator_, this) { + + context.renderingStats().numUniformBuffers++; + context.renderingStats().memUniformBuffers += size; + + context.renderingStats().totalBuffers++; + context.renderingStats().numBuffers++; + context.renderingStats().memBuffers += size; + MLN_TRACE_ALLOC_CONST_BUFFER(uniqueDebugId, size_); if (size_ > managedBuffer.allocator.pageSize()) { // Buffer is very large, won't fit in the provided allocator @@ -48,6 +57,7 @@ UniformBufferGL::UniformBufferGL(const void* data_, std::size_t size_, IBufferAl UniformBufferGL::UniformBufferGL(UniformBufferGL&& rhs) noexcept : UniformBuffer(rhs.size), + context(rhs.context), #ifdef MLN_TRACY_ENABLE uniqueDebugId(rhs.uniqueDebugId), #endif @@ -62,6 +72,7 @@ UniformBufferGL::UniformBufferGL(UniformBufferGL&& rhs) noexcept UniformBufferGL::UniformBufferGL(const UniformBufferGL& other) : UniformBuffer(other), + context(other.context), #ifdef MLN_TRACY_ENABLE uniqueDebugId(generateDebugId()), #endif @@ -83,6 +94,13 @@ UniformBufferGL::~UniformBufferGL() { #ifdef MLN_TRACY_ENABLE assert(uniqueDebugId > 0); #endif + + context.renderingStats().numUniformBuffers--; + context.renderingStats().memUniformBuffers -= size; + + context.renderingStats().numBuffers--; + context.renderingStats().memBuffers -= size; + MLN_TRACE_FREE_CONST_BUFFER(uniqueDebugId); if (isManagedAllocation) { return; @@ -123,6 +141,12 @@ void UniformBufferGL::update(const void* data, std::size_t dataSize) { MBGL_CHECK_ERROR(glBufferSubData(GL_UNIFORM_BUFFER, 0, dataSize, data)); MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, 0)); } + + context.renderingStats().numUniformUpdates++; + context.renderingStats().bufferUpdates++; + context.renderingStats().bufferObjUpdates++; + context.renderingStats().uniformUpdateBytes += dataSize; + context.renderingStats().bufferUpdateBytes += dataSize; } void UniformBufferArrayGL::bind() const { diff --git a/src/mbgl/gl/upload_pass.cpp b/src/mbgl/gl/upload_pass.cpp index b58358b3cde2..1a1cec168dc3 100644 --- a/src/mbgl/gl/upload_pass.cpp +++ b/src/mbgl/gl/upload_pass.cpp @@ -31,8 +31,7 @@ std::unique_ptr UploadPass::createVertexBufferResourc bool /*persistent*/) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); - commandEncoder.context.renderingStats().numBuffers++; - commandEncoder.context.renderingStats().memVertexBuffers += static_cast(size); + // NOLINTNEXTLINE(performance-move-const-arg) UniqueBuffer result{std::move(id), {commandEncoder.context}}; commandEncoder.context.vertexBuffer = result; @@ -43,6 +42,11 @@ std::unique_ptr UploadPass::createVertexBufferResourc void UploadPass::updateVertexBufferResource(gfx::VertexBufferResource& resource, const void* data, std::size_t size) { commandEncoder.context.vertexBuffer = static_cast(resource).getBuffer(); MBGL_CHECK_ERROR(glBufferSubData(GL_ARRAY_BUFFER, 0, size, data)); + + commandEncoder.context.renderingStats().vertexUpdateBytes += size; + commandEncoder.context.renderingStats().bufferUpdateBytes += size; + commandEncoder.context.renderingStats().bufferUpdates++; + commandEncoder.context.renderingStats().bufferObjUpdates++; } std::unique_ptr UploadPass::createIndexBufferResource(const void* data, @@ -51,8 +55,7 @@ std::unique_ptr UploadPass::createIndexBufferResource( bool /*persistent*/) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); - commandEncoder.context.renderingStats().numBuffers++; - commandEncoder.context.renderingStats().memIndexBuffers += static_cast(size); + // NOLINTNEXTLINE(performance-move-const-arg) UniqueBuffer result{std::move(id), {commandEncoder.context}}; commandEncoder.context.bindVertexArray = 0; @@ -67,6 +70,11 @@ void UploadPass::updateIndexBufferResource(gfx::IndexBufferResource& resource, c commandEncoder.context.bindVertexArray = 0; commandEncoder.context.globalVertexArrayState.indexBuffer = static_cast(resource).buffer; MBGL_CHECK_ERROR(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, size, data)); + + commandEncoder.context.renderingStats().indexUpdateBytes += size; + commandEncoder.context.renderingStats().bufferUpdateBytes += size; + commandEncoder.context.renderingStats().bufferUpdates++; + commandEncoder.context.renderingStats().bufferObjUpdates++; } struct VertexBufferGL : public gfx::VertexBufferBase { diff --git a/src/mbgl/gl/vertex_buffer_resource.cpp b/src/mbgl/gl/vertex_buffer_resource.cpp index fbd7e0c888a2..e66ad9766a40 100644 --- a/src/mbgl/gl/vertex_buffer_resource.cpp +++ b/src/mbgl/gl/vertex_buffer_resource.cpp @@ -9,13 +9,29 @@ VertexBufferResource::VertexBufferResource(UniqueBuffer&& buffer_, int byteSize_ : buffer(std::move(buffer_)), byteSize(byteSize_) { MLN_TRACE_ALLOC_VERTEX_BUFFER(buffer.get(), byteSize); + + if (buffer) { + auto& stats = buffer.get_deleter().context.renderingStats(); + stats.numVertexBuffers++; + stats.memVertexBuffers += byteSize; + + stats.numBuffers++; + stats.totalBuffers++; + stats.memBuffers += byteSize; + } } VertexBufferResource::~VertexBufferResource() noexcept { MLN_TRACE_FREE_VERTEX_BUFFER(buffer.get()); - auto& stats = buffer.get_deleter().context.renderingStats(); - stats.memVertexBuffers -= byteSize; - assert(stats.memVertexBuffers >= 0); + + if (buffer) { + auto& stats = buffer.get_deleter().context.renderingStats(); + stats.numVertexBuffers--; + stats.memVertexBuffers -= byteSize; + stats.memBuffers -= byteSize; + + assert(stats.memVertexBuffers >= 0); + } } } // namespace gl diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index cff580adb3c1..c298c1242aa4 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -507,6 +507,14 @@ MapDebugOptions Map::getDebug() const { return impl->debugOptions; } +bool Map::isRenderingStatsViewEnabled() const { + return impl->isRenderingStatsViewEnabled(); +} + +void Map::enableRenderingStatsView(bool value) { + impl->enableRenderingStatsView(value); +} + void Map::setPrefetchZoomDelta(uint8_t delta) { impl->prefetchZoomDelta = delta; } diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index bca50cd62e04..7ef9d8c5088c 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace mbgl { @@ -240,14 +241,16 @@ void Map::Impl::onWillStartRenderingFrame() { void Map::Impl::onDidFinishRenderingFrame(RenderMode renderMode, bool needsRepaint, bool placemenChanged, - double frameEncodingTime, - double frameRenderingTime) { + const gfx::RenderingStats& stats) { rendererFullyLoaded = renderMode == RenderMode::Full; + if (renderingStatsView && style) { + renderingStatsView->update(*style, stats); + } + if (mode == MapMode::Continuous) { const MapObserver::RenderFrameStatus frameStatus{ - MapObserver::RenderMode(renderMode), needsRepaint, placemenChanged, frameEncodingTime, frameRenderingTime}; - + MapObserver::RenderMode(renderMode), needsRepaint, placemenChanged, stats}; observer.onDidFinishRenderingFrame(frameStatus); if (actionJournal) { @@ -304,6 +307,28 @@ void Map::Impl::jumpTo(const CameraOptions& camera) { onUpdate(); } +bool Map::Impl::isRenderingStatsViewEnabled() const { + return !!renderingStatsView; +} + +void Map::Impl::enableRenderingStatsView(bool value) { + if (value) { + if (!renderingStatsView) { + renderingStatsView = std::make_unique(); + if (style) { + renderingStatsView->create(*style); + } + } + } else { + if (renderingStatsView) { + if (style) { + renderingStatsView->destroy(*style); + } + renderingStatsView = nullptr; + } + } +} + void Map::Impl::onStyleImageMissing(const std::string& id, const std::function& done) { if (!style->getImage(id)) { observer.onStyleImageMissing(id); diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index 1a8f6c4e14de..f280bd1da83d 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -58,7 +58,7 @@ class Map::Impl final : public TransformObserver, public style::Observer, public void onInvalidate() final; void onResourceError(std::exception_ptr) final; void onWillStartRenderingFrame() final; - void onDidFinishRenderingFrame(RenderMode, bool, bool, double, double) final; + void onDidFinishRenderingFrame(RenderMode, bool, bool, const gfx::RenderingStats&) final; void onWillStartRenderingMap() final; void onDidFinishRenderingMap() final; void onStyleImageMissing(const std::string&, const std::function&) final; @@ -76,6 +76,9 @@ class Map::Impl final : public TransformObserver, public style::Observer, public // Map void jumpTo(const CameraOptions&); + bool isRenderingStatsViewEnabled() const; + void enableRenderingStatsView(bool value); + MapObserver& observer; RendererFrontend& rendererFrontend; std::unique_ptr actionJournal; @@ -87,6 +90,7 @@ class Map::Impl final : public TransformObserver, public style::Observer, public const bool crossSourceCollisions; MapDebugOptions debugOptions{MapDebugOptions::NoDebug}; + std::unique_ptr renderingStatsView; std::shared_ptr fileSource; diff --git a/src/mbgl/mtl/buffer_resource.cpp b/src/mbgl/mtl/buffer_resource.cpp index f60528445dd7..a2d2db61eb3f 100644 --- a/src/mbgl/mtl/buffer_resource.cpp +++ b/src/mbgl/mtl/buffer_resource.cpp @@ -81,6 +81,7 @@ BufferResource& BufferResource::operator=(BufferResource&& other) noexcept { context.renderingStats().numBuffers--; context.renderingStats().memBuffers -= size; } + buffer = std::move(other.buffer); raw = std::move(other.raw); size = other.size; diff --git a/src/mbgl/mtl/command_encoder.cpp b/src/mbgl/mtl/command_encoder.cpp index b7f7602e0a13..96a27ad83e80 100644 --- a/src/mbgl/mtl/command_encoder.cpp +++ b/src/mbgl/mtl/command_encoder.cpp @@ -15,9 +15,7 @@ namespace mtl { CommandEncoder::CommandEncoder(Context& context_) : context(context_) {} -CommandEncoder::~CommandEncoder() { - context.performCleanup(); -} +CommandEncoder::~CommandEncoder() {} std::unique_ptr CommandEncoder::createUploadPass(const char* name, gfx::Renderable& renderable) { return std::make_unique(renderable, *this, name); diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp index 864881718eda..8e08a7679ced 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp @@ -58,7 +58,8 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete auto& context = parameters.context; const auto& state = parameters.state; - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + const auto& symbolLayerProperties = static_cast(*evaluatedProperties); + const auto& evaluated = symbolLayerProperties.evaluated; #if !defined(NDEBUG) const auto label = layerGroup.getName() + "-update-uniforms"; @@ -94,6 +95,10 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete #endif const auto camDist = state.getCameraToCenterDistance(); + const auto screenSpaceProp = symbolLayerProperties.layerImpl().layout.get(); + const auto isScreenSpace = screenSpaceProp.isConstant() ? screenSpaceProp.asConstant() + : SymbolScreenSpace::defaultValue(); + visitLayerGroupDrawables(layerGroup, [&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !drawable.getData()) { return; @@ -117,12 +122,20 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete // from RenderTile::translatedMatrix const auto translate = isText ? evaluated.get() : evaluated.get(); - const auto anchor = isText ? evaluated.get() - : evaluated.get(); - constexpr bool nearClipped = false; - constexpr bool inViewportPixelUnits = false; - const auto matrix = getTileMatrix( - tileID, parameters, translate, anchor, nearClipped, inViewportPixelUnits, drawable); + + mat4 matrix; + + if (isScreenSpace) { + matrix::ortho(matrix, 0, util::EXTENT, -util::EXTENT, 0, 0, 1); + matrix::translate(matrix, matrix, 0, -util::EXTENT, 0); + matrix::translate(matrix, matrix, translate[0], translate[1], 0); + } else { + constexpr bool nearClipped = false; + constexpr bool inViewportPixelUnits = false; + const auto anchor = isText ? evaluated.get() + : evaluated.get(); + matrix = getTileMatrix(tileID, parameters, translate, anchor, nearClipped, inViewportPixelUnits, drawable); + } // from symbol_program, makeValues const auto currentZoom = static_cast(parameters.state.getZoom()); diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index b44d69b1a212..3e5a64208563 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -417,7 +417,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, const auto startRendering = util::MonotonicTimer::now().count(); // present submits render commands parameters.encoder->present(parameters.backend.getDefaultRenderable()); - const auto renderingTime = util::MonotonicTimer::now().count() - startRendering; + context.renderingStats().renderingTime = util::MonotonicTimer::now().count() - startRendering; parameters.encoder.reset(); context.endFrame(); @@ -435,14 +435,13 @@ void Renderer::Impl::render(const RenderTree& renderTree, } #endif // MLN_RENDER_BACKEND_METAL - const auto encodingTime = renderTree.getElapsedTime() - renderingTime; + context.renderingStats().encodingTime = renderTree.getElapsedTime() - context.renderingStats().renderingTime; observer->onDidFinishRenderingFrame( renderTreeParameters.loaded ? RendererObserver::RenderMode::Full : RendererObserver::RenderMode::Partial, renderTreeParameters.needsRepaint, renderTreeParameters.placementChanged, - encodingTime, - renderingTime); + context.renderingStats()); if (!renderTreeParameters.loaded) { renderState = RenderState::Partial; diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp index 6f7b736c1793..a55daf5dd113 100644 --- a/src/mbgl/style/layers/symbol_layer.cpp +++ b/src/mbgl/style/layers/symbol_layer.cpp @@ -302,6 +302,21 @@ void SymbolLayer::setSymbolPlacement(const PropertyValue& v baseImpl = std::move(impl_); observer->onLayerChanged(*this); } +PropertyValue SymbolLayer::getDefaultSymbolScreenSpace() { + return SymbolScreenSpace::defaultValue(); +} + +const PropertyValue& SymbolLayer::getSymbolScreenSpace() const { + return impl().layout.get(); +} + +void SymbolLayer::setSymbolScreenSpace(const PropertyValue& value) { + if (value == getSymbolScreenSpace()) return; + auto impl_ = mutableImpl(); + impl_->layout.get() = value; + baseImpl = std::move(impl_); + observer->onLayerChanged(*this); +} PropertyValue SymbolLayer::getDefaultSymbolSortKey() { return SymbolSortKey::defaultValue(); } @@ -1124,6 +1139,7 @@ enum class Property : uint8_t { IconTextFitPadding, SymbolAvoidEdges, SymbolPlacement, + SymbolScreenSpace, SymbolSortKey, SymbolSpacing, SymbolZOrder, @@ -1202,6 +1218,7 @@ constexpr const auto layerProperties = mapbox::eternal::hash_map SymbolLayer::setPropertyInternal(const std::string& name, c } if (property == Property::IconAllowOverlap || property == Property::IconIgnorePlacement || property == Property::IconKeepUpright || property == Property::IconOptional || - property == Property::SymbolAvoidEdges || property == Property::TextAllowOverlap || - property == Property::TextIgnorePlacement || property == Property::TextKeepUpright || - property == Property::TextOptional) { + property == Property::SymbolAvoidEdges || property == Property::SymbolScreenSpace || + property == Property::TextAllowOverlap || property == Property::TextIgnorePlacement || + property == Property::TextKeepUpright || property == Property::TextOptional) { Error error; const auto& typedValue = convert>(value, error, false, false); if (!typedValue) { @@ -1582,6 +1601,11 @@ std::optional SymbolLayer::setPropertyInternal(const std::string& name, c return std::nullopt; } + if (property == Property::SymbolScreenSpace) { + setSymbolScreenSpace(*typedValue); + return std::nullopt; + } + if (property == Property::TextAllowOverlap) { setTextAllowOverlap(*typedValue); return std::nullopt; diff --git a/src/mbgl/style/layers/symbol_layer_properties.hpp b/src/mbgl/style/layers/symbol_layer_properties.hpp index bb418eea1618..4fc77ff150b5 100644 --- a/src/mbgl/style/layers/symbol_layer_properties.hpp +++ b/src/mbgl/style/layers/symbol_layer_properties.hpp @@ -96,6 +96,11 @@ struct SymbolPlacement : LayoutProperty { static SymbolPlacementType defaultValue() { return SymbolPlacementType::Point; } }; +struct SymbolScreenSpace : LayoutProperty { + static constexpr const char *name() { return "symbol-screen-space"; } + static bool defaultValue() { return false; } +}; + struct SymbolSortKey : DataDrivenLayoutProperty { static constexpr const char *name() { return "symbol-sort-key"; } static float defaultValue() { return 0.f; } @@ -302,6 +307,7 @@ class SymbolLayoutProperties : public Properties< IconTextFitPadding, SymbolAvoidEdges, SymbolPlacement, + SymbolScreenSpace, SymbolSortKey, SymbolSpacing, SymbolZOrder, diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index b8a222c512fa..fe774da2e7c1 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -974,6 +974,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, const bool rotateWithMap = bucket.layout->get() == style::AlignmentType::Map; const bool pitchWithMap = bucket.layout->get() == style::AlignmentType::Map; const bool hasIconTextFit = bucket.layout->get() != style::IconTextFitType::None; + const bool screenSpace = bucket.layout->get(); // If allow-overlap is true, we can show symbols before placement runs on them // But we have to wait for placement if we potentially depend on a paired icon/text @@ -981,10 +982,10 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, // See https://github.com/mapbox/mapbox-gl-native/issues/12483 // Prevent a flickering issue when showing a symbol allowing overlap. const JointOpacityState defaultOpacityState( - bucket.justReloaded && textAllowOverlap && + (screenSpace || bucket.justReloaded) && textAllowOverlap && (iconAllowOverlap || !(bucket.hasIconData() || bucket.hasSdfIconData()) || bucket.layout->get()), - bucket.justReloaded && iconAllowOverlap && + (screenSpace || bucket.justReloaded) && iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || bucket.layout->get()), true); diff --git a/src/mbgl/vulkan/buffer_resource.cpp b/src/mbgl/vulkan/buffer_resource.cpp index b920627a55f4..4e3c3266591a 100644 --- a/src/mbgl/vulkan/buffer_resource.cpp +++ b/src/mbgl/vulkan/buffer_resource.cpp @@ -129,7 +129,12 @@ BufferResource::BufferResource(BufferResource&& other) noexcept BufferResource::~BufferResource() noexcept { if (isValid()) { context.renderingStats().numBuffers--; - context.renderingStats().memBuffers -= size; + + if (bufferWindowSize > 0) { + context.renderingStats().memBuffers -= bufferWindowSize * context.getBackend().getMaxFrames(); + } else { + context.renderingStats().memBuffers -= size; + } } if (!bufferAllocation) return; @@ -146,7 +151,7 @@ BufferResource& BufferResource::operator=(BufferResource&& other) noexcept { if (isValid()) { context.renderingStats().numBuffers--; context.renderingStats().memBuffers -= size; - }; + } size = other.size; usage = other.usage; @@ -171,6 +176,7 @@ void BufferResource::update(const void* newData, std::size_t updateSize, std::si auto& stats = context.renderingStats(); stats.bufferUpdateBytes += updateSize; stats.bufferUpdates++; + stats.bufferObjUpdates++; version++; if (bufferWindowSize) { diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index f5a8ba33100a..5084262761c8 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -67,6 +67,12 @@ Context::~Context() noexcept { if (--glslangRefCount == 0) { glslang::FinalizeProcess(); } + +#if !defined(NDEBUG) + Log::Debug(Event::General, "Rendering Stats:\n" + stats.toString("\n")); +#endif + + assert(stats.isZero()); } void Context::initFrameResources() { @@ -134,10 +140,20 @@ void Context::destroyResources() { frame.runDeletionQueue(*this); } - globalUniformBuffers.freeDescriptorSets(); - // all resources have unique handles frameResources.clear(); + + globalUniformBuffers.freeDescriptorSets(); + + for (size_t i = 0; i < globalUniformBuffers.allocatedSize(); i++) { + globalUniformBuffers.set(i, nullptr); + } + + dummyBuffer.reset(); + dummyTexture2D.reset(); + + clipping.indexBuffer.reset(); + clipping.vertexBuffer.reset(); } void Context::enqueueDeletion(std::function&& function) { @@ -355,6 +371,11 @@ UniqueShaderProgram Context::createProgram(shaders::BuiltIn shaderID, return program; } +void Context::performCleanup() { + stats.numDrawCalls = 0; + ++stats.numFrames; +} + gfx::UniqueDrawableBuilder Context::createDrawableBuilder(std::string name) { return std::make_unique(std::move(name)); } diff --git a/src/mbgl/vulkan/texture2d.cpp b/src/mbgl/vulkan/texture2d.cpp index 8f2da1495bee..235848d7737b 100644 --- a/src/mbgl/vulkan/texture2d.cpp +++ b/src/mbgl/vulkan/texture2d.cpp @@ -44,9 +44,6 @@ Texture2D::Texture2D(Context& context_) Texture2D::~Texture2D() { destroyTexture(); destroySampler(); - - context.renderingStats().numActiveTextures--; - context.renderingStats().memTextures -= Texture2D::getDataSize(); } gfx::Texture2D& Texture2D::setSamplerConfiguration(const SamplerState& samplerState_) noexcept { @@ -209,6 +206,7 @@ void Texture2D::uploadSubRegion(const void* pixelData, context.enqueueDeletion([buffAlloc = std::move(bufferAllocation)](auto&) mutable { buffAlloc.reset(); }); context.renderingStats().numTextureUpdates++; + context.renderingStats().textureUpdateBytes += bufferInfo.size; } vk::Format Texture2D::vulkanFormat(const gfx::TexturePixelType pixel, gfx::TextureChannelDataType channel) { @@ -402,6 +400,9 @@ void Texture2D::destroyTexture() { context.enqueueDeletion([allocation = std::move(imageAllocation)](auto&) mutable { allocation.reset(); }); imageLayout = vk::ImageLayout::eUndefined; + + context.renderingStats().numActiveTextures--; + context.renderingStats().memTextures -= Texture2D::getDataSize(); } } diff --git a/test/src/mbgl/test/stub_map_observer.hpp b/test/src/mbgl/test/stub_map_observer.hpp index 76972a62dc9a..4b81ac69977a 100644 --- a/test/src/mbgl/test/stub_map_observer.hpp +++ b/test/src/mbgl/test/stub_map_observer.hpp @@ -32,7 +32,7 @@ class StubMapObserver : public MapObserver { } } - void onDidFinishRenderingFrame(RenderFrameStatus status) final { + void onDidFinishRenderingFrame(const RenderFrameStatus& status) final { if (didFinishRenderingFrameCallback) { didFinishRenderingFrameCallback(status); } diff --git a/test/util/action_journal.test.cpp b/test/util/action_journal.test.cpp index 5a131099d3c4..d97a8206a3ea 100644 --- a/test/util/action_journal.test.cpp +++ b/test/util/action_journal.test.cpp @@ -416,7 +416,7 @@ TEST(ActionJournal, ValidateEvents) { ""); const auto onDidFinishRenderingFrame = - static_cast( + static_cast( &RendererObserver::onDidFinishRenderingFrame); validateEvent(test, @@ -426,6 +426,5 @@ TEST(ActionJournal, ValidateEvents) { RendererObserver::RenderMode::Full, false, false, - 0.0, - 0.0); + gfx::RenderingStats()); } From 863e39565f4129784dd5559cdb740da7f66f5f86 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 4 Jun 2025 01:03:18 +0200 Subject: [PATCH 217/339] Make sure correct debug symbols are in Android release (#3521) --- .github/workflows/android-ci.yml | 18 +-- .github/workflows/android-release.yml | 146 ++++++++---------- platform/android/CHANGELOG.md | 7 +- platform/android/Makefile | 14 +- .../android/MapLibreAndroid/build.gradle.kts | 4 +- .../MapLibreAndroidTestApp/build.gradle.kts | 5 +- platform/android/VERSION | 2 +- .../kotlin/maplibre.gradle-publish.gradle.kts | 10 +- 8 files changed, 97 insertions(+), 109 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 8bdcd16380f6..85cef8241c78 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -167,14 +167,14 @@ jobs: - name: Build Benchmark, copy to platform/android run: | - ./gradlew assembleDrawableRelease assembleDrawableReleaseAndroidTest -PtestBuildType=release - cp MapLibreAndroidTestApp/build/outputs/apk/drawable/release/MapLibreAndroidTestApp-drawable-release.apk . - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/drawable/release/MapLibreAndroidTestApp-drawable-release-androidTest.apk . + ./gradlew assembleOpenglRelease assembleOpenglReleaseAndroidTest -PtestBuildType=release + cp MapLibreAndroidTestApp/build/outputs/apk/opengl/release/MapLibreAndroidTestApp-opengl-release.apk . + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/release/MapLibreAndroidTestApp-opengl-release-androidTest.apk . # https://developer.android.com/guide/practices/page-sizes - name: Check alignment of .apk run: | - unzip -o MapLibreAndroidTestApp/build/outputs/apk/drawable/release/MapLibreAndroidTestApp-drawable-release.apk -d /tmp/my_apk_out + unzip -o MapLibreAndroidTestApp/build/outputs/apk/opengl/release/MapLibreAndroidTestApp-opengl-release.apk -d /tmp/my_apk_out scripts/check-alignment.sh /tmp/my_apk_out - name: Create artifact for benchmark APKs @@ -183,17 +183,17 @@ jobs: if-no-files-found: error name: benchmarkAPKs path: | - platform/android/MapLibreAndroidTestApp-drawable-release.apk - platform/android/MapLibreAndroidTestApp-drawable-release-androidTest.apk + platform/android/MapLibreAndroidTestApp-opengl-release.apk + platform/android/MapLibreAndroidTestApp-opengl-release-androidTest.apk - if: github.event_name == 'pull_request' uses: ./.github/actions/save-pr-number - name: Build Instrumentation Tests, copy to platform/android run: | - ./gradlew assembleDrawableDebug assembleDrawableDebugAndroidTest -PtestBuildType=debug - cp MapLibreAndroidTestApp/build/outputs/apk/drawable/debug/MapLibreAndroidTestApp-drawable-debug.apk InstrumentationTestApp.apk - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/drawable/debug/MapLibreAndroidTestApp-drawable-debug-androidTest.apk InstrumentationTests.apk + ./gradlew assembleOpenglDebug assembleOpenglDebugAndroidTest -PtestBuildType=debug + cp MapLibreAndroidTestApp/build/outputs/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk InstrumentationTestApp.apk + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/debug/MapLibreAndroidTestApp-opengl-debug-androidTest.apk InstrumentationTests.apk - name: Upload android-ui-test uses: actions/upload-artifact@v4 diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index ee4e96c2e5c9..a85f971e884d 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -4,48 +4,23 @@ on: workflow_dispatch: jobs: - build: - runs-on: MapLibre_Native_Ubuntu_24_04_x84_16_core + android-create-release: + runs-on: ubuntu-24.04 + outputs: + version_tag: ${{ steps.prepare_release.outputs.version_tag }} + upload_url: ${{ steps.create_release.outputs.upload_url }} defaults: run: working-directory: platform/android - env: - JOBS: 8 - BUILDTYPE: Release - IS_LOCAL_DEVELOPMENT: false steps: - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - - uses: actions/setup-java@v4 - with: - distribution: "temurin" - java-version: "17" - - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - - name: npm install - run: npm install --ignore-scripts - - - name: Android nitpick - run: make run-android-nitpick - name: Validate and set version working-directory: . run: .github/scripts/validate-version.sh platform/android/VERSION - - name: Build package - run: | - RENDERER=vulkan make apackage - BUILDTYPE=Debug RENDERER=vulkan make apackage - RENDERER=drawable make apackage - BUILDTYPE=Debug RENDERER=drawable make apackage + - name: npm install + run: npm install --ignore-scripts # create github release - name: Prepare release @@ -85,71 +60,75 @@ jobs: draft: false prerelease: ${{ env.prerelease }} - - name: Upload aar (OpenGL) - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + android-build-and-upload-release: + needs: android-create-release + runs-on: ubuntu-24.04 + defaults: + run: + working-directory: platform/android + env: + JOBS: 8 + IS_LOCAL_DEVELOPMENT: false + strategy: + matrix: + RENDERER: + - vulkan + - opengl + BUILDTYPE: + - Release + - Debug + steps: + - uses: actions/checkout@v4 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-drawable-release.aar - asset_name: MapLibreAndroid-release.aar - asset_content_type: application/zip + submodules: recursive + fetch-depth: 0 - - name: Upload aar (OpenGL, Debug) - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-java@v4 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-drawable-debug.aar - asset_name: MapLibreAndroid-debug.aar - asset_content_type: application/zip + distribution: "temurin" + java-version: "17" - - name: Upload aar (Vulkan) - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Get CMake and Ninja + uses: lukka/get-cmake@latest with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-vulkan-release.aar - asset_name: MapLibreAndroid-release-vulkan.aar - asset_content_type: application/zip + cmakeVersion: 3.24.1 + ninjaVersion: latest - - name: Upload aar (Vulkan, Debug) - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-vulkan-debug.aar - asset_name: MapLibreAndroid-debug-vulkan.aar - asset_content_type: application/zip + - name: npm install + run: npm install --ignore-scripts + + - name: Android nitpick + run: make run-android-nitpick - - name: Upload debug symbols (OpenGL) + - name: Build package + run: RENDERER=${{ matrix.RENDERER }} BUILDTYPE=${{ matrix.BUILDTYPE }} make apackage + + - name: Save buildtype to GITHUB_ENV + run: | + buildtype=${{ matrix.BUILDTYPE }} + # lowercase + echo buildtype=${buildtype,,} > "$GITHUB_ENV" + + - name: Upload aar (${{ matrix.RENDERER }}, ${{ matrix.BUILDTYPE }}) uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/build/debug-symbols-opengl.tar.gz - asset_name: debug-symbols-maplibre-android-opengl-${{ steps.prepare_release.outputs.version_tag }}.tar.gz - asset_content_type: application/gzip + upload_url: ${{ needs.android-create-release.outputs.upload_url }} + asset_path: platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-${{ matrix.RENDERER }}-${{ env.buildtype }}.aar + asset_name: MapLibreAndroid-${{ matrix.RENDERER }}-${{ env.buildtype }}-${{ needs.android-create-release.outputs.version_tag }}.aar + asset_content_type: application/zip - - name: Upload debug symbols (Vulkan) + - name: Upload debug symbols (${{ matrix.RENDERER }}, ${{ matrix.BUILDTYPE }}) uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: platform/android/build/debug-symbols-vulkan.tar.gz - asset_name: debug-symbols-maplibre-android-vulkan-${{ steps.prepare_release.outputs.version_tag }}.tar.gz + upload_url: ${{ needs.android-create-release.outputs.upload_url }} + asset_path: platform/android/build/debug-symbols-${{ matrix.RENDERER }}-${{ env.buildtype }}.tar.gz + asset_name: debug-symbols-maplibre-android-${{ matrix.RENDERER }}-${{ needs.android-create-release.outputs.version_tag }}.tar.gz asset_content_type: application/gzip - - name: Clean release - run: | - rm -f ${{ steps.prepare_release.outputs.release_notes }} - shell: bash - - name: Prepare MavenCentral release env: GPG_KEY_CONTENTS: ${{ secrets.GPG_KEY_CONTENTS }} @@ -158,7 +137,14 @@ jobs: shell: bash - name: Publish to MavenCentral - run: make run-android-publish + run: | + renderer=${{ matrix.RENDERER }} + if [ "$renderer" = "opengl" ]; then + ./gradlew :MapLibreAndroid:publishOpengl${{ env.buildtype }}PublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository + ./gradlew :MapLibreAndroid:publishDefault${{ env.buildtype }}PublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository + else + ./gradlew :MapLibreAndroid:publishVulkan${{ env.buildtype }}PublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository + fi env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index cfa963c2fb50..effa4a9c216f 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,11 +1,16 @@ # Changelog MapLibre Native for Android -## main +## 11.10.0 ### ✨ Features and improvements +- Add action journal ([#3409](https://github.com/maplibre/maplibre-native/pull/3409)). Documentation: https://maplibre.org/maplibre-native/android/examples/observability/action-journal/ +- Pattern layout performance improvement ([#3495](https://github.com/maplibre/maplibre-native/pull/3495)). + ### 🐞 Bug fixes +- Improve weak pointer use ([#3510](https://github.com/maplibre/maplibre-native/pull/3510)). + ## 11.9.0 ### ✨ Features and improvements diff --git a/platform/android/Makefile b/platform/android/Makefile index 553f6fd81787..75037686878b 100644 --- a/platform/android/Makefile +++ b/platform/android/Makefile @@ -1,5 +1,5 @@ export BUILDTYPE ?= Debug -export RENDERER ?= drawable +export RENDERER ?= opengl export IS_LOCAL_DEVELOPMENT ?= true export TARGET_BRANCH ?= main @@ -14,10 +14,10 @@ else $(error BUILDTYPE must be Debug, Sanitize, Release or RelWithDebInfo) endif -ifeq ($(RENDERER), drawable) +ifeq ($(RENDERER), opengl) else ifeq ($(RENDERER), vulkan) else - $(error RENDERER must be 'drawable' (OpenGL) or 'vulkan') + $(error RENDERER must be 'opengl' or 'vulkan') endif buildtype := $(shell echo "$(BUILDTYPE)" | tr "[A-Z]" "[a-z]") @@ -218,11 +218,11 @@ run-android-ui-test-%: run-android-ui-test-arm-v7-% # Run Java Unit tests on the JVM of the development machine executing this .PHONY: run-android-unit-test run-android-unit-test: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testDrawableDebugUnitTest --info + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testOpenglDebugUnitTest --info run-android-unit-test-%: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testDrawableDebugUnitTest --info --tests "$*" + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testOpenglDebugUnitTest --info --tests "$*" -DEBUG_TAR_FILE_NAME := $(if $(findstring drawable,$(RENDERER)),debug-symbols-opengl.tar.gz,debug-symbols-$(RENDERER).tar.gz) +DEBUG_TAR_FILE_NAME := $(if $(findstring opengl,$(RENDERER)),debug-symbols-opengl-$(MLN_ANDROID_APK_SUFFIX).tar.gz,debug-symbols-$(RENDERER)-$(MLN_ANDROID_APK_SUFFIX).tar.gz) # Builds a release package and .tar.gz with debug symbols of the Android SDK .PHONY: apackage @@ -280,7 +280,7 @@ android-lint-test-app: # Generates LICENSE.md file based on all Android project dependencies .PHONY: android-license android-license: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:licenseDrawableReleaseReport + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:licenseOpenglReleaseReport python3 scripts/generate-license.py # Symbolicate ndk stack traces for the arm-v7 abi diff --git a/platform/android/MapLibreAndroid/build.gradle.kts b/platform/android/MapLibreAndroid/build.gradle.kts index 6cd320d4e774..acd5a37ddf72 100644 --- a/platform/android/MapLibreAndroid/build.gradle.kts +++ b/platform/android/MapLibreAndroid/build.gradle.kts @@ -74,7 +74,7 @@ android { flavorDimensions += "renderer" productFlavors { - create("drawable") { + create("opengl") { dimension = "renderer" } create("vulkan") { @@ -88,7 +88,7 @@ android { } sourceSets { - getByName("drawable") { + getByName("opengl") { java.srcDirs("src/opengl/java/") } } diff --git a/platform/android/MapLibreAndroidTestApp/build.gradle.kts b/platform/android/MapLibreAndroidTestApp/build.gradle.kts index c41fd48fd1ce..a3e8e1996077 100644 --- a/platform/android/MapLibreAndroidTestApp/build.gradle.kts +++ b/platform/android/MapLibreAndroidTestApp/build.gradle.kts @@ -62,10 +62,7 @@ android { flavorDimensions += "renderer" productFlavors { - create("legacy") { - dimension = "renderer" - } - create("drawable") { + create("opengl") { dimension = "renderer" } create("vulkan") { diff --git a/platform/android/VERSION b/platform/android/VERSION index ba9aff72cbbe..933dbb1dfc7a 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.9.0 +11.10.0 diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts index 0395df46d2b8..7d0b157f5029 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.gradle-publish.gradle.kts @@ -98,15 +98,15 @@ tasks { } afterEvaluate { - configureMavenPublication("drawable", "opengl", "", "") - configureMavenPublication("drawable", "opengldebug", "-debug", " (Debug)", "Debug") - configureMavenPublication("vulkan", "vulkan", "-vulkan", "(Vulkan)") + configureMavenPublication("opengl", "defaultrelease", "", "") + configureMavenPublication("opengl", "defaultdebug", "-debug", " (Debug)", "Debug") + configureMavenPublication("vulkan", "vulkanrelease", "-vulkan", "(Vulkan)") configureMavenPublication("vulkan", "vulkandebug", "-vulkan-debug", "(Vulkan, Debug)", "Debug") // Right now this is the same as the first, but in the future we might release a major version // which defaults to Vulkan (or has support for multiple backends). We will keep using only // OpenGL ES with this artifact ID if that happens. - configureMavenPublication("drawable", "opengl2", "-opengl", " (OpenGL ES)") - configureMavenPublication("drawable", "opengl2debug", "-opengl-debug", " (OpenGL ES, Debug)", "Debug") + configureMavenPublication("opengl", "openglrelease", "-opengl", " (OpenGL ES)") + configureMavenPublication("opengl", "opengldebug", "-opengl-debug", " (OpenGL ES, Debug)", "Debug") } From 2e4541c441cbc32c4bd93ce32c90cc4a5774a629 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 4 Jun 2025 13:12:49 +0200 Subject: [PATCH 218/339] Fix android-release.yml asset name debug symbols (#3523) --- .github/workflows/android-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index a85f971e884d..5e64c4225af6 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -126,7 +126,7 @@ jobs: with: upload_url: ${{ needs.android-create-release.outputs.upload_url }} asset_path: platform/android/build/debug-symbols-${{ matrix.RENDERER }}-${{ env.buildtype }}.tar.gz - asset_name: debug-symbols-maplibre-android-${{ matrix.RENDERER }}-${{ needs.android-create-release.outputs.version_tag }}.tar.gz + asset_name: debug-symbols-maplibre-android-${{ matrix.RENDERER }}-${{ env.buildtype }}-${{ needs.android-create-release.outputs.version_tag }}.tar.gz asset_content_type: application/gzip - name: Prepare MavenCentral release From b11134a301f720097183adc26c99fd6f7a85cf4f Mon Sep 17 00:00:00 2001 From: alasram Date: Wed, 4 Jun 2025 05:49:41 -0700 Subject: [PATCH 219/339] Add Tile LOD controls (#2958) Co-authored-by: Bart Louwers Co-authored-by: Adrian Cojocaru Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- benchmark/util/tilecover.benchmark.cpp | 2 +- include/mbgl/map/map.hpp | 32 ++++ .../src/cpp/native_map_view.cpp | 40 +++++ .../src/cpp/native_map_view.hpp | 16 ++ .../maplibre/android/maps/MapLibreMap.java | 95 +++++++++++ .../org/maplibre/android/maps/NativeMap.java | 16 ++ .../maplibre/android/maps/NativeMapView.java | 88 ++++++++++ platform/glfw/glfw_view.cpp | 86 +++++++++- platform/ios/app/MBXViewController.mm | 125 +++++++++++++- platform/ios/src/MLNMapView.h | 44 +++++ platform/ios/src/MLNMapView.mm | 40 +++++ platform/macos/src/MLNMapView.h | 44 +++++ platform/macos/src/MLNMapView.mm | 40 +++++ src/mbgl/map/map.cpp | 32 ++++ src/mbgl/map/map_impl.cpp | 6 +- src/mbgl/map/map_impl.hpp | 7 + .../layers/render_background_layer.cpp | 9 +- src/mbgl/renderer/paint_parameters.cpp | 10 +- src/mbgl/renderer/paint_parameters.hpp | 9 +- src/mbgl/renderer/render_orchestrator.cpp | 4 + src/mbgl/renderer/renderer_impl.cpp | 11 +- .../renderer/sources/render_image_source.cpp | 4 +- src/mbgl/renderer/tile_parameters.hpp | 5 + src/mbgl/renderer/tile_pyramid.cpp | 16 +- src/mbgl/renderer/update_parameters.hpp | 6 + src/mbgl/util/tile_cover.cpp | 31 ++-- src/mbgl/util/tile_cover.hpp | 13 +- test/CMakeLists.txt | 1 + test/fixtures/tile_lod/disabled/expected.png | Bin 0 -> 872 bytes .../tile_lod/pitchThreshold-line/expected.png | Bin 0 -> 5195 bytes .../pitchThreshold-polyline/expected.png | Bin 0 -> 11076 bytes test/fixtures/tile_lod/radius/expected.png | Bin 0 -> 3800 bytes test/fixtures/tile_lod/scale/expected.png | Bin 0 -> 3416 bytes test/include/mbgl/test/util.hpp | 7 + test/include/mbgl/test/vector_tile_test.hpp | 22 +-- test/src/mbgl/test/util.cpp | 31 +++- test/style/source.test.cpp | 22 +-- test/tile/custom_geometry_tile.test.cpp | 22 +-- test/tile/geojson_tile.test.cpp | 22 +-- test/tile/raster_dem_tile.test.cpp | 22 +-- test/tile/raster_tile.test.cpp | 22 +-- test/tile/tile_lod.test.cpp | 156 ++++++++++++++++++ test/util/tile_cover.test.cpp | 22 +-- 43 files changed, 1066 insertions(+), 114 deletions(-) create mode 100644 test/fixtures/tile_lod/disabled/expected.png create mode 100644 test/fixtures/tile_lod/pitchThreshold-line/expected.png create mode 100644 test/fixtures/tile_lod/pitchThreshold-polyline/expected.png create mode 100644 test/fixtures/tile_lod/radius/expected.png create mode 100644 test/fixtures/tile_lod/scale/expected.png create mode 100644 test/tile/tile_lod.test.cpp diff --git a/benchmark/util/tilecover.benchmark.cpp b/benchmark/util/tilecover.benchmark.cpp index dde9f3e9e2b5..c541323edde4 100644 --- a/benchmark/util/tilecover.benchmark.cpp +++ b/benchmark/util/tilecover.benchmark.cpp @@ -26,7 +26,7 @@ static void TileCoverPitchedViewport(benchmark::State& state) { std::size_t length = 0; while (state.KeepRunning()) { - auto tiles = util::tileCover(transform.getState(), 8); + auto tiles = util::tileCover({transform.getState()}, 8); length += tiles.size(); } benchmark::DoNotOptimize(length); diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 22972e27ddda..06b4f29fd8e2 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -161,6 +161,38 @@ class Map : private util::noncopyable { void setFreeCameraOptions(const FreeCameraOptions& camera); FreeCameraOptions getFreeCameraOptions() const; + // Tile LOD controls + // + /// The number of map tile requests can be reduced by using a lower level + /// of details (Lower zoom level) away from the camera. + /// This can improve performance, particularly when the camera pitch is high. + /// The LOD calculation uses a heuristic based on the distance to the camera + /// view point. The heuristic behavior is controlled with 3 parameters: + /// - `TileLodMinRadius` is a radius around the view point in unit of tiles + /// in which the fine grained zoom level tiles are always used + /// - `TileLodScale` is a scale factor for the distance to the camera view + /// point. A value larger than 1 increases the distance to the camera view + /// point in which case the LOD is reduced + /// - `TileLodPitchThreshold` is the pitch angle in radians above which LOD + /// calculation is performed. + /// LOD calculation is always performed if `TileLodPitchThreshold` is zero. + /// LOD calculation is never performed if `TileLodPitchThreshold` is pi. + /// - `TileLodZoomShift` shifts the the Zoom level used for LOD calculation + /// A value of zero (default) does not change the Zoom level + /// A positive value increases the Zoom level and a negative value decreases + /// the Zoom level + /// A negative values typically improves performance but reduces quality. + /// For instance, a value of -1 reduces the zoom level by 1 and this + /// reduces the number of tiles by a factor of 4 for the same camera view. + void setTileLodMinRadius(double radius); + double getTileLodMinRadius() const; + void setTileLodScale(double scale); + double getTileLodScale() const; + void setTileLodPitchThreshold(double threshold); + double getTileLodPitchThreshold() const; + void setTileLodZoomShift(double shift); + double getTileLodZoomShift() const; + ClientOptions getClientOptions() const; const std::unique_ptr& getActionJournal(); diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 9bfb3037d9eb..7fccd881478d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -1269,6 +1269,38 @@ jni::jboolean NativeMapView::getTileCacheEnabled(JNIEnv&) { return jni::jboolean(rendererFrontend->getTileCacheEnabled()); } +void NativeMapView::setTileLodMinRadius(JNIEnv&, jni::jdouble radius) { + map->setTileLodMinRadius(radius); +} + +jni::jdouble NativeMapView::getTileLodMinRadius(JNIEnv&) { + return jni::jdouble(map->getTileLodMinRadius()); +} + +void NativeMapView::setTileLodScale(JNIEnv&, jni::jdouble scale) { + map->setTileLodScale(scale); +} + +jni::jdouble NativeMapView::getTileLodScale(JNIEnv&) { + return jni::jdouble(map->getTileLodScale()); +} + +void NativeMapView::setTileLodPitchThreshold(JNIEnv&, jni::jdouble threshold) { + map->setTileLodPitchThreshold(threshold); +} + +jni::jdouble NativeMapView::getTileLodPitchThreshold(JNIEnv&) { + return jni::jdouble(map->getTileLodPitchThreshold()); +} + +void NativeMapView::setTileLodZoomShift(JNIEnv&, jni::jdouble shift) { + map->setTileLodZoomShift(shift); +} + +jni::jdouble NativeMapView::getTileLodZoomShift(JNIEnv&) { + return jni::jdouble(map->getTileLodZoomShift()); +} + mbgl::Map& NativeMapView::getMap() { return *map; } @@ -1400,6 +1432,14 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::getPrefetchZoomDelta, "nativeGetPrefetchZoomDelta"), METHOD(&NativeMapView::setTileCacheEnabled, "nativeSetTileCacheEnabled"), METHOD(&NativeMapView::getTileCacheEnabled, "nativeGetTileCacheEnabled"), + METHOD(&NativeMapView::setTileLodMinRadius, "nativeSetTileLodMinRadius"), + METHOD(&NativeMapView::getTileLodMinRadius, "nativeGetTileLodMinRadius"), + METHOD(&NativeMapView::setTileLodScale, "nativeSetTileLodScale"), + METHOD(&NativeMapView::getTileLodScale, "nativeGetTileLodScale"), + METHOD(&NativeMapView::setTileLodPitchThreshold, "nativeSetTileLodPitchThreshold"), + METHOD(&NativeMapView::getTileLodPitchThreshold, "nativeGetTileLodPitchThreshold"), + METHOD(&NativeMapView::setTileLodZoomShift, "nativeSetTileLodZoomShift"), + METHOD(&NativeMapView::getTileLodZoomShift, "nativeGetTileLodZoomShift"), METHOD(&NativeMapView::triggerRepaint, "nativeTriggerRepaint"), METHOD(&NativeMapView::isRenderingStatsViewEnabled, "nativeIsRenderingStatsViewEnabled"), METHOD(&NativeMapView::enableRenderingStatsView, "nativeEnableRenderingStatsView")); diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index bdfb9143ca13..045b20c5780c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -302,6 +302,22 @@ class NativeMapView : public MapObserver { jni::jboolean getTileCacheEnabled(JNIEnv&); + void setTileLodMinRadius(JNIEnv&, jni::jdouble); + + jni::jdouble getTileLodMinRadius(JNIEnv&); + + void setTileLodScale(JNIEnv&, jni::jdouble); + + jni::jdouble getTileLodScale(JNIEnv&); + + void setTileLodPitchThreshold(JNIEnv&, jni::jdouble); + + jni::jdouble getTileLodPitchThreshold(JNIEnv&); + + void setTileLodZoomShift(JNIEnv&, jni::jdouble); + + jni::jdouble getTileLodZoomShift(JNIEnv&); + mbgl::Map& getMap(); void triggerRepaint(JNIEnv&); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java index ab758b79ab27..cdbecdfd660a 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMap.java @@ -358,6 +358,101 @@ public boolean getTileCacheEnabled() { return nativeMapView.getTileCacheEnabled(); } + /** + * Camera based tile level of detail controls + * + * @param radius minimum radius around the view point in unit of tiles in which the fine + * grained zoom level tiles are always used when performing LOD + * radius must be greater than 1 (At least 1 fine detailed tile is present) + * A smaller radius value may improve performance at the cost of quality (tiles away from + * camera use lower Zoom levels) + */ + public void setTileLodMinRadius(@FloatRange(from = 1, fromInclusive = true) double radius) { + nativeMapView.setTileLodMinRadius(radius); + } + + /** + * Camera based tile level of detail controls + * + * @return minimum radius around the view point in unit of tiles in which the fine grained + * zoom level tiles are always used when performing LOD + * @see MapLibreMap#setTileLodMinRadius(double) + */ + public double getTileLodMinRadius() { + return nativeMapView.getTileLodMinRadius(); + } + + /** + * Camera based tile level of detail controls + * + * @param scale factor for the distance to the camera view point + * A value larger than 1 increases the distance to the camera view point reducing LOD + * Larger values may improve performance at the cost of quality (tiles away from camera + * use lower Zoom levels) + */ + public void setTileLodScale(@FloatRange(from = 0, fromInclusive = false) double scale) { + nativeMapView.setTileLodScale(scale); + } + + /** + * Camera based tile level of detail controls + * + * @return scale factor for the distance to the camera view point + * @see MapLibreMap#setTileLodScale(double) + */ + public double getTileLodScale() { + return nativeMapView.getTileLodScale(); + } + + /** + * Camera based tile level of detail controls + * + * @param threshold pitch angle in radians above which LOD calculation is performed + * A smaller radius value may improve performance at the cost of quality + */ + public void setTileLodPitchThreshold(@FloatRange(from = 0, to = Math.PI) double threshold) { + nativeMapView.setTileLodPitchThreshold(threshold); + } + + /** + * Camera based tile level of detail controls + * + * @return pitch angle threshold in radians above which LOD calculation is performed + * @see MapLibreMap#setTileLodPitchThreshold(double) + */ + public double getTileLodPitchThreshold() { + return nativeMapView.getTileLodPitchThreshold(); + } + + /** + * Camera based tile level of detail controls + * + * @param shift shift applied to the Zoom level during LOD calculation + * A negative value shifts the Zoom level to a coarser level reducing quality but + * improving performance + * A positive value shifts the Zoom level to a finer level increasing details but + * negatively affecting performance + * A value of zero (default) does not apply any shift to the Zoom level + * It is not recommended to change the default value unless performance is critical + * and the loss of quality is acceptable. A value of -1 reduces the number of + * displayed tiles by a factor of 4 on average + * It is recommended to first configure the pixelRatio before adjusting + * TileLodZoomShift. {@link MapLibreMapOptions#pixelRatio(float)} + */ + public void setTileLodZoomShift(double shift) { + nativeMapView.setTileLodZoomShift(shift); + } + + /** + * Camera based tile level of detail controls + * + * @return shift applied to the Zoom level during LOD calculation + * @see MapLibreMap#setTileLodZoomShift(double) + */ + public double getTileLodZoomShift() { + return nativeMapView.getTileLodZoomShift(); + } + // // MinZoom // diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java index 0b3265156c6b..585f7ed332b6 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMap.java @@ -244,6 +244,22 @@ List queryRenderedFeatures(@NonNull RectF coordinates, boolean getTileCacheEnabled(); + void setTileLodMinRadius(double radius); + + double getTileLodMinRadius(); + + void setTileLodScale(double scale); + + double getTileLodScale(); + + void setTileLodPitchThreshold(double threshold); + + double getTileLodPitchThreshold(); + + void setTileLodZoomShift(double shift); + + double getTileLodZoomShift(); + void setGestureInProgress(boolean inProgress); float getPixelRatio(); diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java index a0ed4dfccf80..571193bd45d5 100755 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapView.java @@ -855,6 +855,70 @@ public boolean getTileCacheEnabled() { } return nativeGetTileCacheEnabled(); } + + @Override + public void setTileLodMinRadius(double radius) { + if (checkState("setTileLodMinRadius")) { + return; + } + nativeSetTileLodMinRadius(radius); + } + + @Override + public double getTileLodMinRadius() { + if (checkState("getTileLodMinRadius")) { + return 0; + } + return nativeGetTileLodMinRadius(); + } + + @Override + public void setTileLodScale(double scale) { + if (checkState("setTileLodScale")) { + return; + } + nativeSetTileLodScale(scale); + } + + @Override + public double getTileLodScale() { + if (checkState("getTileLodScale")) { + return 0; + } + return nativeGetTileLodScale(); + } + + @Override + public void setTileLodPitchThreshold(double threshold) { + if (checkState("setTileLodPitchThreshold")) { + return; + } + nativeSetTileLodPitchThreshold(threshold); + } + + @Override + public double getTileLodPitchThreshold() { + if (checkState("getTileLodPitchThreshold")) { + return 0; + } + return nativeGetTileLodPitchThreshold(); + } + + @Override + public void setTileLodZoomShift(double shift) { + if (checkState("setTileLodZoomShift")) { + return; + } + nativeSetTileLodZoomShift(shift); + } + + @Override + public double getTileLodZoomShift() { + if (checkState("getTileLodZoomShift")) { + return 0; + } + return nativeGetTileLodZoomShift(); + } // Runtime style Api @Override @@ -1644,6 +1708,30 @@ private native Feature[] nativeQueryRenderedFeaturesForBox(float left, float top @Keep private native int nativeGetPrefetchZoomDelta(); + @Keep + private native void nativeSetTileLodMinRadius(double radius); + + @Keep + private native double nativeGetTileLodMinRadius(); + + @Keep + private native void nativeSetTileLodScale(double scale); + + @Keep + private native double nativeGetTileLodScale(); + + @Keep + private native void nativeSetTileLodPitchThreshold(double threshold); + + @Keep + private native double nativeGetTileLodPitchThreshold(); + + @Keep + private native void nativeSetTileLodZoomShift(double shift); + + @Keep + private native double nativeGetTileLodZoomShift(); + @Override public long getNativePtr() { return nativePtr; diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 9ba9a1f76c8b..3485ef5b4f9f 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,6 @@ using namespace std::numbers; #ifdef ENABLE_LOCATION_INDICATOR - namespace { const std::string mbglPuckAssetsPath{MLN_ASSETS_PATH}; @@ -83,7 +83,7 @@ std::array toArray(const mbgl::LatLng &crd) { return {crd.latitude(), crd.longitude(), 0}; } } // namespace -#endif +#endif // ENABLE_LOCATION_INDICATOR class SnapshotObserver final : public mbgl::MapSnapshotterObserver { public: @@ -99,6 +99,76 @@ class SnapshotObserver final : public mbgl::MapSnapshotterObserver { }; namespace { + +enum class TileLodMode { + Default, // Default Tile LOD parameters + NoLod, // Disable LOD + Reduced, // Reduce LOD away from camera + Aggressive, // Aggressively reduce LOD away from camera at the detriment of quality +}; + +constexpr TileLodMode nextTileLodMode(TileLodMode current) { + switch (current) { + case TileLodMode::Default: + return TileLodMode::NoLod; + case TileLodMode::NoLod: + return TileLodMode::Reduced; + case TileLodMode::Reduced: + return TileLodMode::Aggressive; + case TileLodMode::Aggressive: + return TileLodMode::Default; + default: + return TileLodMode::Default; + } +} + +void cycleTileLodMode(mbgl::Map &map) { + // TileLodMode::Default parameters + static const auto defaultRadius = map.getTileLodMinRadius(); + static const auto defaultScale = map.getTileLodScale(); + static const auto defaultTilePitchThreshold = map.getTileLodPitchThreshold(); + + static TileLodMode mode = TileLodMode::Default; + mode = nextTileLodMode(mode); + + switch (mode) { + case TileLodMode::Default: + map.setTileLodMinRadius(defaultRadius); + map.setTileLodScale(defaultScale); + map.setTileLodPitchThreshold(defaultTilePitchThreshold); + mbgl::Log::Info(mbgl::Event::General, "Tile LOD mode: default"); + break; + case TileLodMode::NoLod: + // When LOD is off we set a maximum PitchThreshold + map.setTileLodPitchThreshold(std::numbers::pi); + mbgl::Log::Info(mbgl::Event::General, "Tile LOD mode: disabled"); + break; + case TileLodMode::Reduced: + map.setTileLodMinRadius(2); + map.setTileLodScale(1.5); + map.setTileLodPitchThreshold(std::numbers::pi / 4); + mbgl::Log::Info(mbgl::Event::General, "Tile LOD mode: reduced"); + break; + case TileLodMode::Aggressive: + map.setTileLodMinRadius(1); + map.setTileLodScale(2); + map.setTileLodPitchThreshold(0); + mbgl::Log::Info(mbgl::Event::General, "Tile LOD mode: aggressive"); + break; + } + map.triggerRepaint(); +} + +void tileLodZoomShift(mbgl::Map &map, bool positive) { + constexpr auto tileLodZoomShiftStep = 0.25; + auto shift = positive ? tileLodZoomShiftStep : -tileLodZoomShiftStep; + shift = map.getTileLodZoomShift() + shift; + shift = mbgl::util::clamp(shift, -2.5, 2.5); + mbgl::Log::Info(mbgl::Event::OpenGL, "Zoom shift: " + std::to_string(shift)); + map.setTileLodZoomShift(shift); + map.triggerRepaint(); +} + void addFillExtrusionLayer(mbgl::style::Style &style, bool visible) { MLN_TRACE_FUNC(); @@ -288,6 +358,9 @@ GLFWView::GLFWView(bool fullscreen_, printf("- Press `F1` to generate a render test for the current view\n"); printf("\n"); printf("- Press `Tab` to cycle through the map debug options\n"); + printf("- Press `F6` to cycle through Tile LOD modes\n"); + printf("- Press `F7` to lower the zoom level without changing the camera\n"); + printf("- Press `F8` to higher the zoom level without changing the camera\n"); printf("- Press `Esc` to quit\n"); printf("\n"); printf( @@ -567,6 +640,15 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, view->freeCameraDemoStartTime = mbgl::Clock::now(); view->invalidate(); } break; + case GLFW_KEY_F6: { + cycleTileLodMode(*view->map); + } break; + case GLFW_KEY_F7: { + tileLodZoomShift(*view->map, false); + } break; + case GLFW_KEY_F8: { + tileLodZoomShift(*view->map, true); + } break; } } diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index c8bad1e55926..b219244cd6b6 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -121,10 +121,19 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) { MBXSettingsMiscellaneousShowCustomLocationManager, MBXSettingsMiscellaneousOrnamentsPlacement, MBXSettingsMiscellaneousLatLngBoundsWithPadding, + MBXSettingsMiscellaneousCycleTileLOD, MBXSettingsMiscellaneousPrintLogFile, MBXSettingsMiscellaneousDeleteLogFile }; +typedef NS_ENUM(NSInteger, MBXTileLodMode) { + MBXTileLodModeNoLod = 0, + MBXTileLodModeDefault, + MBXTileLodModeReduced, + MBXTileLodModeAggressive, + MBXTileLodModeCount +}; + // Utility methods CLLocationCoordinate2D coordinateCentered(CLLocationCoordinate2D origin, CLLocationDegrees bearing, CLLocationDistance distance) { @@ -245,6 +254,8 @@ @implementation MBXViewController NSDictionary* _pointFeatures; NSLock* _loadLock; + + MBXTileLodMode _tileLodMode; } // MARK: - Setup & Teardown @@ -474,7 +485,8 @@ - (void)dismissSettings:(__unused id)sender [NSString stringWithFormat:@"Turn %@ Content Insets", (_contentInsetsEnabled ? @"Off" : @"On")], @"View Route Simulation", @"Ornaments Placement", - @"Lat Long bounds with padding" + @"Lat Long bounds with padding", + [NSString stringWithFormat:@"Cycle tile LOD mode: %@", [self getTileLodModeName]] ]]; break; @@ -807,6 +819,9 @@ - (void)performActionForSettingAtIndexPath:(NSIndexPath *)indexPath case MBXSettingsMiscellaneousLatLngBoundsWithPadding: [self flyToWithLatLngBoundsAndPadding]; break; + case MBXSettingsMiscellaneousCycleTileLOD: + [self cycleTileLodMode]; + break; default: NSAssert(NO, @"All miscellaneous setting rows should be implemented"); break; @@ -1992,6 +2007,114 @@ - (void)flyToWithLatLngBoundsAndPadding }]; } +-(void)cycleTileLodMode +{ + // TileLodMode::Default parameters + static const double defaultRadius = self.mapView.tileLodMinRadius; + static const double defaultScale = self.mapView.tileLodScale; + static const double defaultPitchThreshold = self.mapView.tileLodPitchThreshold; + + _tileLodMode = static_cast((static_cast(_tileLodMode) + 1) % static_cast(MBXTileLodModeCount)); + + switch (_tileLodMode) { + case MBXTileLodModeDefault: + self.mapView.tileLodMinRadius = defaultRadius; + self.mapView.tileLodScale = defaultScale; + self.mapView.tileLodPitchThreshold = defaultPitchThreshold; + break; + case MBXTileLodModeNoLod: + // When LOD is off we set a maximum PitchThreshold + self.mapView.tileLodPitchThreshold = M_PI; + break; + case MBXTileLodModeReduced: + self.mapView.tileLodMinRadius = 2; + self.mapView.tileLodScale = 1.5; + self.mapView.tileLodPitchThreshold = M_PI / 4; + break; + case MBXTileLodModeAggressive: + self.mapView.tileLodMinRadius = 1; + self.mapView.tileLodScale = 2; + self.mapView.tileLodPitchThreshold = 0; + break; + default: + break; + } + + // update UI + static UISlider* zoomSlider = nil; + if (zoomSlider && _tileLodMode == MBXTileLodModeNoLod) { + [zoomSlider removeFromSuperview]; + zoomSlider = nil; + } + + if (!zoomSlider && _tileLodMode != MBXTileLodModeNoLod) { + const float zoomShiftRange = 5.0f; + zoomSlider = [[UISlider alloc] init]; + zoomSlider.minimumValue = -zoomShiftRange / 2.0f; + zoomSlider.maximumValue = zoomShiftRange / 2.0f; + zoomSlider.value = self.mapView.tileLodZoomShift; + zoomSlider.continuous = NO; + + [zoomSlider addTarget:self action:@selector(updateTileLodZoom:) forControlEvents:UIControlEventValueChanged]; + [self.view addSubview:zoomSlider]; + + zoomSlider.translatesAutoresizingMaskIntoConstraints = NO; + zoomSlider.frame = CGRectMake(0, 0, 100, 100); + + NSArray* layout = @[ + [NSLayoutConstraint constraintWithItem:zoomSlider + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0], + [NSLayoutConstraint constraintWithItem:zoomSlider + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeWidth + multiplier:0.5 + constant:0], + [NSLayoutConstraint constraintWithItem:zoomSlider + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterY + multiplier:1 + constant:0], + [zoomSlider.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor]]; + + [self.view addConstraints:layout]; + } + + [self.mapView triggerRepaint]; +} + +-(void)updateTileLodZoom:(id)sender { + UISlider* slider = (UISlider*)sender; + + self.mapView.tileLodZoomShift = slider.value; + [self.mapView triggerRepaint]; + + NSLog(@"Tile LOD zoom shift: %f", self.mapView.tileLodZoomShift); +} + +-(NSString*)getTileLodModeName { + switch (_tileLodMode) { + case MBXTileLodModeDefault: + return @"Default"; + case MBXTileLodModeNoLod: + return @"Disabled"; + case MBXTileLodModeReduced: + return @"Reduced"; + case MBXTileLodModeAggressive: + return @"Aggressive"; + default: + return @""; + } +} + // MARK: - Random World Tour - (void)addAnnotations:(NSInteger)numAnnotations aroundCoordinate:(CLLocationCoordinate2D)coordinate radius:(CLLocationDistance)radius { diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 9308ded6e569..f8455efe35fd 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -463,6 +463,50 @@ MLN_EXPORT @property (nonatomic, assign) BOOL tileCacheEnabled; +// MARK: Tile LOD controls + +/** + Camera based tile level of detail controls + + Minimum radius around the view point in unit of tiles in which the fine + grained zoom level tiles are always used when performing LOD + radius must be greater than 1 (At least 1 fine detailed tile is present) + A smaller radius value may improve performance at the cost of quality (tiles away from + camera use lower Zoom levels) + */ +@property (nonatomic, assign) double tileLodMinRadius; + +/** + Camera based tile level of detail controls + + Factor for the distance to the camera view point + A value larger than 1 increases the distance to the camera view point reducing LOD + Larger values may improve performance at the cost of quality (tiles away from camera + use lower Zoom levels) + */ +@property (nonatomic, assign) double tileLodScale; + +/** + Camera based tile level of detail controls + + Pitch angle in radians above which LOD calculation is performed + A smaller radius value may improve performance at the cost of quality + */ +@property (nonatomic, assign) double tileLodPitchThreshold; + +/** + Camera based tile level of detail controls + + Shift applied to the Zoom level during LOD calculation + A negative value shifts the Zoom level to a coarser level reducing quality but improving + performance A positive value shifts the Zoom level to a finer level increasing details but + negatively affecting performance A value of zero (default) does not apply any shift to the Zoom + level It is not recommended to change the default value unless performance is critical and the loss + of quality is acceptable. A value of -1 reduces the number of displayed tiles by a factor of 4 on + average It is recommended to first configure the pixelRatio before adjusting TileLodZoomShift. + */ +@property (nonatomic, assign) double tileLodZoomShift; + // MARK: Displaying the User’s Location /** diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index fcb0811133dc..56de8dc12685 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -3231,6 +3231,46 @@ - (BOOL)tileCacheEnabled return _rendererFrontend->getTileCacheEnabled(); } +- (void)setTileLodMinRadius:(double)tileLodMinRadius +{ + _mbglMap->setTileLodMinRadius(tileLodMinRadius); +} + +- (double)tileLodMinRadius +{ + return _mbglMap->getTileLodMinRadius(); +} + +- (void)setTileLodScale:(double)tileLodScale +{ + _mbglMap->setTileLodScale(tileLodScale); +} + +- (double)tileLodScale +{ + return _mbglMap->getTileLodScale(); +} + +-(void)setTileLodPitchThreshold:(double)tileLodPitchThreshold +{ + _mbglMap->setTileLodPitchThreshold(tileLodPitchThreshold); +} + +-(double)tileLodPitchThreshold +{ + return _mbglMap->getTileLodPitchThreshold(); +} + +-(void)setTileLodZoomShift:(double)tileLodZoomShift +{ + _mbglMap->setTileLodZoomShift(tileLodZoomShift); +} + +-(double)tileLodZoomShift +{ + return _mbglMap->getTileLodZoomShift(); +} + // MARK: - Accessibility - - (NSString *)accessibilityValue diff --git a/platform/macos/src/MLNMapView.h b/platform/macos/src/MLNMapView.h index ef4ac5e12052..3894741317d8 100644 --- a/platform/macos/src/MLNMapView.h +++ b/platform/macos/src/MLNMapView.h @@ -202,6 +202,50 @@ MLN_EXPORT IB_DESIGNABLE @interface MLNMapView : NSView */ @property (nonatomic, assign) BOOL prefetchesTiles; +// MARK: Tile LOD controls + +/** + Camera based tile level of detail controls + + Minimum radius around the view point in unit of tiles in which the fine + grained zoom level tiles are always used when performing LOD + radius must be greater than 1 (At least 1 fine detailed tile is present) + A smaller radius value may improve performance at the cost of quality (tiles away from + camera use lower Zoom levels) + */ +@property (nonatomic, assign) double tileLodMinRadius; + +/** + Camera based tile level of detail controls + + Factor for the distance to the camera view point + A value larger than 1 increases the distance to the camera view point reducing LOD + Larger values may improve performance at the cost of quality (tiles away from camera + use lower Zoom levels) + */ +@property (nonatomic, assign) double tileLodScale; + +/** + Camera based tile level of detail controls + + Pitch angle in radians above which LOD calculation is performed + A smaller radius value may improve performance at the cost of quality + */ +@property (nonatomic, assign) double tileLodPitchThreshold; + +/** + Camera based tile level of detail controls + + Shift applied to the Zoom level during LOD calculation + A negative value shifts the Zoom level to a coarser level reducing quality but improving + performance A positive value shifts the Zoom level to a finer level increasing details but + negatively affecting performance A value of zero (default) does not apply any shift to the Zoom + level It is not recommended to change the default value unless performance is critical and the loss + of quality is acceptable. A value of -1 reduces the number of displayed tiles by a factor of 4 on + average It is recommended to first configure the pixelRatio before adjusting TileLodZoomShift. + */ +@property (nonatomic, assign) double tileLodZoomShift; + // MARK: Manipulating the Viewpoint /** diff --git a/platform/macos/src/MLNMapView.mm b/platform/macos/src/MLNMapView.mm index 83cd35ed9181..6dc79ba88bfa 100644 --- a/platform/macos/src/MLNMapView.mm +++ b/platform/macos/src/MLNMapView.mm @@ -710,6 +710,46 @@ - (BOOL)prefetchesTiles return _mbglMap->getPrefetchZoomDelta() > 0 ? YES : NO; } +- (void)setTileLodMinRadius:(double)tileLodMinRadius +{ + _mbglMap->setTileLodMinRadius(tileLodMinRadius); +} + +- (double)tileLodMinRadius +{ + return _mbglMap->getTileLodMinRadius(); +} + +- (void)setTileLodScale:(double)tileLodScale +{ + _mbglMap->setTileLodScale(tileLodScale); +} + +- (double)tileLodScale +{ + return _mbglMap->getTileLodScale(); +} + +-(void)setTileLodPitchThreshold:(double)tileLodPitchThreshold +{ + _mbglMap->setTileLodPitchThreshold(tileLodPitchThreshold); +} + +-(double)tileLodPitchThreshold +{ + return _mbglMap->getTileLodPitchThreshold(); +} + +-(void)setTileLodZoomShift:(double)tileLodZoomShift +{ + _mbglMap->setTileLodZoomShift(tileLodZoomShift); +} + +-(double)tileLodZoomShift +{ + return _mbglMap->getTileLodZoomShift(); +} + - (mbgl::Renderer *)renderer { return _rendererFrontend->getRenderer(); } diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index c298c1242aa4..3f2b3c298e96 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -547,6 +547,38 @@ FreeCameraOptions Map::getFreeCameraOptions() const { return impl->transform.getFreeCameraOptions(); } +void Map::setTileLodMinRadius(double radius) { + impl->tileLodMinRadius = radius; +} + +double Map::getTileLodMinRadius() const { + return impl->tileLodMinRadius; +} + +void Map::setTileLodScale(double scale) { + impl->tileLodScale = scale; +} + +double Map::getTileLodScale() const { + return impl->tileLodScale; +} + +void Map::setTileLodPitchThreshold(double threshold) { + impl->tileLodPitchThreshold = threshold; +} + +double Map::getTileLodPitchThreshold() const { + return impl->tileLodPitchThreshold; +} + +void Map::setTileLodZoomShift(double shift) { + impl->tileLodZoomShift = shift; +} + +double Map::getTileLodZoomShift() const { + return impl->tileLodZoomShift; +} + ClientOptions Map::getClientOptions() const { return impl->fileSource ? impl->fileSource->getClientOptions() : ClientOptions(); } diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 7ef9d8c5088c..4fd84cd0262a 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -130,7 +130,11 @@ void Map::Impl::onUpdate() { fileSource, prefetchZoomDelta, bool(stillImageRequest), - crossSourceCollisions}; + crossSourceCollisions, + tileLodMinRadius, + tileLodScale, + tileLodPitchThreshold, + tileLodZoomShift}; rendererFrontend.update(std::make_shared(std::move(params))); } diff --git a/src/mbgl/map/map_impl.hpp b/src/mbgl/map/map_impl.hpp index f280bd1da83d..1207b510a9a9 100644 --- a/src/mbgl/map/map_impl.hpp +++ b/src/mbgl/map/map_impl.hpp @@ -14,6 +14,8 @@ #include #include +#include + namespace mbgl { class FileSource; @@ -104,6 +106,11 @@ class Map::Impl final : public TransformObserver, public style::Observer, public bool loading = false; bool rendererFullyLoaded; std::unique_ptr stillImageRequest; + + double tileLodMinRadius = 3; + double tileLodScale = 1; + double tileLodPitchThreshold = (60.0 / 180.0) * std::numbers::pi; + double tileLodZoomShift = 0; }; // Forward declaration of this method is required for the MapProjection class diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index bc61344b4de6..0e18fec440cf 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -113,11 +113,16 @@ static constexpr std::string_view BackgroundPatternShaderName = "BackgroundPatte void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders, gfx::Context& context, const TransformState& state, - const std::shared_ptr&, + const std::shared_ptr& updateParameters, [[maybe_unused]] const RenderTree& renderTree, [[maybe_unused]] UniqueChangeRequestVec& changes) { + assert(updateParameters); const auto zoom = state.getIntegerZoom(); - const auto tileCover = util::tileCover(state, zoom); + const auto tileCover = util::tileCover({state, + updateParameters->tileLodMinRadius, + updateParameters->tileLodScale, + updateParameters->tileLodPitchThreshold}, + zoom); // renderTiles is always empty, we use tileCover instead if (tileCover.empty()) { diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 5e72b914f856..1b80741d339c 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -55,7 +55,10 @@ PaintParameters::PaintParameters(gfx::Context& context_, RenderStaticData& staticData_, LineAtlas& lineAtlas_, PatternAtlas& patternAtlas_, - uint64_t frameCount_) + uint64_t frameCount_, + double tileLodMinRadius_, + double tileLodScale_, + double tileLodPitchThreshold_) : context(context_), backend(backend_), encoder(context.createCommandEncoder()), @@ -70,7 +73,10 @@ PaintParameters::PaintParameters(gfx::Context& context_, timePoint(timePoint_), pixelRatio(pixelRatio_), shaders(*staticData_.shaders), - frameCount(frameCount_) { + frameCount(frameCount_), + tileLodMinRadius(tileLodMinRadius_), + tileLodScale(tileLodScale_), + tileLodPitchThreshold(tileLodPitchThreshold_) { pixelsToGLUnits = {{2.0f / state.getSize().width, -2.0f / state.getSize().height}}; if (state.getViewportMode() == ViewportMode::FlippedY) { diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 545bdaf0b1ff..4f4be3b2c3c1 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -57,7 +57,10 @@ class PaintParameters { RenderStaticData&, LineAtlas&, PatternAtlas&, - uint64_t frameCount); + uint64_t frameCount, + double tileLodMinRadius, + double tileLodScale, + double tileLodPitchThreshold); ~PaintParameters(); gfx::Context& context; @@ -130,6 +133,10 @@ class PaintParameters { static constexpr float depthEpsilon = 1.0f / (1 << 12); #endif static constexpr int maxStencilValue = 255; + + double tileLodMinRadius; + double tileLodScale; + double tileLodPitchThreshold; }; } // namespace mbgl diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index b625617a8e88..8f6e3abf0419 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -194,6 +194,10 @@ std::unique_ptr RenderOrchestrator::createRenderTree( .glyphManager = glyphManager, .prefetchZoomDelta = updateParameters->prefetchZoomDelta, .threadPool = threadPool, + .tileLodMinRadius = updateParameters->tileLodMinRadius, + .tileLodScale = updateParameters->tileLodScale, + .tileLodPitchThreshold = updateParameters->tileLodPitchThreshold, + .tileLodZoomShift = updateParameters->tileLodZoomShift, .dynamicTextureAtlas = dynamicTextureAtlas}; glyphManager->setURL(updateParameters->glyphURL); diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 3e5a64208563..50dc45910e99 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -84,12 +85,13 @@ void Renderer::Impl::setObserver(RendererObserver* observer_) { observer = observer_ ? observer_ : &nullObserver(); } -void Renderer::Impl::render(const RenderTree& renderTree, - [[maybe_unused]] const std::shared_ptr& updateParameters) { +void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr& updateParameters) { MLN_TRACE_FUNC(); auto& context = backend.getContext(); context.setObserver(this); + assert(updateParameters); + #if MLN_RENDER_BACKEND_METAL if constexpr (EnableMetalCapture) { const auto& mtlBackend = static_cast(backend); @@ -189,7 +191,10 @@ void Renderer::Impl::render(const RenderTree& renderTree, *staticData, renderTree.getLineAtlas(), renderTree.getPatternAtlas(), - frameCount}; + frameCount, + updateParameters->tileLodMinRadius, + updateParameters->tileLodScale, + updateParameters->tileLodPitchThreshold}; parameters.symbolFadeChange = renderTreeParameters.symbolFadeChange; parameters.opaquePassCutoff = renderTreeParameters.opaquePassCutOff; diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index d0bdb3d87fd1..e88a806bb80b 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -133,7 +133,9 @@ void RenderImageSource::update(Immutable baseImpl_, bool hasVisibleTile = false; // Add additional wrapped tile ids if neccessary - auto idealTiles = util::tileCover(transformState, static_cast(transformState.getZoom())); + auto idealTiles = util::tileCover( + {transformState, parameters.tileLodMinRadius, parameters.tileLodScale, parameters.tileLodPitchThreshold}, + static_cast(transformState.getZoom())); for (auto tile : idealTiles) { if (tile.wrap != 0 && tileCover[0].canonical.isChildOf(tile.canonical)) { tileIds.emplace_back(tile.wrap, tileCover[0].canonical); diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp index 0596fcce85a1..32e3911c90f7 100644 --- a/src/mbgl/renderer/tile_parameters.hpp +++ b/src/mbgl/renderer/tile_parameters.hpp @@ -4,6 +4,7 @@ #include #include +#include #include @@ -32,6 +33,10 @@ class TileParameters { std::shared_ptr glyphManager; const uint8_t prefetchZoomDelta; TaggedScheduler threadPool; + double tileLodMinRadius = 3; + double tileLodScale = 1; + double tileLodPitchThreshold = (60.0 / 180.0) * std::numbers::pi; + double tileLodZoomShift = 0; gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; }; diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 3e79657b5bf6..2c62ec348c29 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -89,9 +89,14 @@ void TilePyramid::update(const std::vector>& l handleWrapJump(static_cast(parameters.transformState.getLatLng().longitude())); + // Optionally shift the zoom level + double zoom = util::clamp(parameters.transformState.getZoom() + parameters.tileLodZoomShift, + parameters.transformState.getMinZoom(), + parameters.transformState.getMaxZoom()); + const auto type = sourceImpl.type; // Determine the overzooming/underzooming amounts and required tiles. - int32_t overscaledZoom = util::coveringZoomLevel(parameters.transformState.getZoom(), type, tileSize); + int32_t overscaledZoom = util::coveringZoomLevel(zoom, type, tileSize); int32_t tileZoom = overscaledZoom; int32_t panZoom = zoomRange.max; @@ -103,6 +108,11 @@ void TilePyramid::update(const std::vector>& l std::vector idealTiles; std::vector panTiles; + util::TileCoverParameters tileCoverParameters = {parameters.transformState, + parameters.tileLodMinRadius, + parameters.tileLodScale, + parameters.tileLodPitchThreshold}; + if (overscaledZoom >= zoomRange.min) { int32_t idealZoom = std::min(zoomRange.max, overscaledZoom); @@ -123,11 +133,11 @@ void TilePyramid::update(const std::vector>& l } if (panZoom < idealZoom) { - panTiles = util::tileCover(parameters.transformState, panZoom); + panTiles = util::tileCover(tileCoverParameters, panZoom); } } - idealTiles = util::tileCover(parameters.transformState, idealZoom, tileZoom); + idealTiles = util::tileCover(tileCoverParameters, idealZoom, tileZoom); if (parameters.mode == MapMode::Tile && type != SourceType::Raster && type != SourceType::RasterDEM && idealTiles.size() > 1) { mbgl::Log::Warning(mbgl::Event::General, diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp index a16a2801f0bb..d2b162c29eeb 100644 --- a/src/mbgl/renderer/update_parameters.hpp +++ b/src/mbgl/renderer/update_parameters.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -44,6 +45,11 @@ class UpdateParameters { const bool stillImageRequest; const bool crossSourceCollisions; + + double tileLodMinRadius = 3; + double tileLodScale = 1; + double tileLodPitchThreshold = (60.0 / 180.0) * std::numbers::pi; + double tileLodZoomShift = 0; }; } // namespace mbgl diff --git a/src/mbgl/util/tile_cover.cpp b/src/mbgl/util/tile_cover.cpp index 1a3055788bfd..d4f2e4eab4f5 100644 --- a/src/mbgl/util/tile_cover.cpp +++ b/src/mbgl/util/tile_cover.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -9,7 +8,6 @@ #include #include -#include using namespace std::numbers; @@ -157,7 +155,7 @@ int32_t coveringZoomLevel(double zoom, style::SourceType type, uint16_t size) no } } -std::vector tileCover(const TransformState& state, +std::vector tileCover(const TileCoverParameters& state, uint8_t z, const std::optional& overscaledZ) { struct Node { @@ -173,23 +171,26 @@ std::vector tileCover(const TransformState& state, double sqrDist; }; + const auto& transform = state.transformState; const double numTiles = std::pow(2.0, z); - const double worldSize = Projection::worldSize(state.getScale()); - const uint8_t minZoom = state.getPitch() <= (60.0 / 180.0) * pi ? z : 0; + const double worldSize = Projection::worldSize(transform.getScale()); + const uint8_t minZoom = transform.getPitch() <= state.tileLodPitchThreshold ? z : 0; const uint8_t maxZoom = z; - const uint8_t overscaledZoom = overscaledZ.value_or(z); - const bool flippedY = state.getViewportMode() == ViewportMode::FlippedY; + const uint8_t overscaledZoom = std::max(overscaledZ.value_or(z), z); + const bool flippedY = transform.getViewportMode() == ViewportMode::FlippedY; - const auto centerPoint = - TileCoordinate::fromScreenCoordinate(state, z, {state.getSize().width / 2.0, state.getSize().height / 2.0}).p; + const auto centerPoint = TileCoordinate::fromScreenCoordinate( + transform, z, {transform.getSize().width / 2.0, transform.getSize().height / 2.0}) + .p; const vec3 centerCoord = {{centerPoint.x, centerPoint.y, 0.0}}; - const Frustum frustum = Frustum::fromInvProjMatrix(state.getInvProjectionMatrix(), worldSize, z, flippedY); + const Frustum frustum = Frustum::fromInvProjMatrix(transform.getInvProjectionMatrix(), worldSize, z, flippedY); // There should always be a certain number of maximum zoom level tiles // surrounding the center location - const double radiusOfMaxLvlLodInTiles = 3; + assert(state.tileLodMinRadius >= 1); + const double radiusOfMaxLvlLodInTiles = std::max(1.0, state.tileLodMinRadius); const auto newRootTile = [&](int16_t wrap) -> Node { return {AABB({{wrap * numTiles, 0.0, 0.0}}, {{(wrap + 1) * numTiles, numTiles, 0.0}}), @@ -235,12 +236,14 @@ std::vector tileCover(const TransformState& state, // there's always a certain number of maxLevel tiles next to the map // center. Using the fact that a parent node in quadtree is twice the // size of its children (per dimension) we can define distance - // thresholds for each relative level: f(k) = offset + 2 + 4 + 8 + 16 + - // ... + 2^k. This is the same as "offset+2^(k+1)-2" + // thresholds for each relative level: + // f(k) = offset + 2 + 4 + 8 + 16 + ... + 2^k + // This is the same as: + // f(k) = offset + 2^(k+1)-2 const double distToSplit = radiusOfMaxLvlLodInTiles + (1 << (maxZoom - node.zoom)) - 2; // Have we reached the target depth or is the tile too far away to be any split further? - if (node.zoom == maxZoom || (*longestDim > distToSplit && node.zoom >= minZoom)) { + if (node.zoom == maxZoom || (*longestDim * state.tileLodScale > distToSplit && node.zoom >= minZoom)) { // Perform precise intersection test between the frustum and aabb. // This will cull < 1% false positives missed by the original test if (node.fullyVisible || frustum.intersectsPrecise(node.aabb, true) != IntersectionResult::Separate) { diff --git a/src/mbgl/util/tile_cover.hpp b/src/mbgl/util/tile_cover.hpp index 972fdc5ed844..a935b2d3a4cb 100644 --- a/src/mbgl/util/tile_cover.hpp +++ b/src/mbgl/util/tile_cover.hpp @@ -1,16 +1,18 @@ #pragma once +#include #include #include #include +#include #include #include +#include #include namespace mbgl { -class TransformState; class LatLngBounds; namespace util { @@ -31,9 +33,16 @@ class TileCover { std::unique_ptr impl; }; +struct TileCoverParameters { + TransformState transformState; + double tileLodMinRadius = 3; + double tileLodScale = 1; + double tileLodPitchThreshold = (60.0 / 180.0) * std::numbers::pi; +}; + int32_t coveringZoomLevel(double z, style::SourceType type, uint16_t tileSize) noexcept; -std::vector tileCover(const TransformState&, +std::vector tileCover(const TileCoverParameters& state, uint8_t z, const std::optional& overscaledZ = std::nullopt); std::vector tileCover(const LatLngBounds&, uint8_t z); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 60fc46969a0d..940c1e658504 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -84,6 +84,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/tile/tile_cache.test.cpp ${PROJECT_SOURCE_DIR}/test/tile/tile_coordinate.test.cpp ${PROJECT_SOURCE_DIR}/test/tile/tile_id.test.cpp + ${PROJECT_SOURCE_DIR}/test/tile/tile_lod.test.cpp ${PROJECT_SOURCE_DIR}/test/tile/vector_tile.test.cpp ${PROJECT_SOURCE_DIR}/test/util/action_journal.test.cpp ${PROJECT_SOURCE_DIR}/test/util/async_task.test.cpp diff --git a/test/fixtures/tile_lod/disabled/expected.png b/test/fixtures/tile_lod/disabled/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e86d8f954830e5e2903cef025fa4769c3784dd99 GIT binary patch literal 872 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 z zA4@3Fd!K`HHtXR7TRXVV;;g95%goy=qIMQh`fxD7~7XEu^#Yd9LheGPOqaidKJdeVQ@2Q3Q$~!xm z=bIz_oZD&!kK}M=MLbqd1Ef$Y`L2A(mel$FL!A|1G z^NyT6(>RIwrcvd&>{G7gD85Xp4=F6D&xD;Po>PE5K4X$4)m_&D^iooqr$Y~yOD-lN zU`N2}$oTsLhG-)KU#YsjIbkIz4fB~9>e5ipq0lvg<$7o=hDh*_5hgX&v%kY`mA%dx z-YXu_uXLp{OB)8kMXjC0)%$4>f~dq2wRA!$dUlZ`!JjsvlTJikqS5HyjH{&DXcG0# z!1IV^4m=wit#8q2jtuQLONcf2?@X@jB%PAF2YUR7C8AK7FAO(oAS{H()7pKo0k%uX zP7n#pwZJT#X^R(e46Qpkn5f843tIdb+Pm8Q2`xCq9{}N$*#x1(xZ<@@b=+rN`xx3s zx{pz|JvTiD2>o~fV18->L)zsryaqsEA@Bx3;KhLEla6q!!ek}4vk>?h@-6U;B*1X> z)BHE~yJIhGF<`2YTM@#r0p&41FN-TH#uqC`$=9LdJC2mGbkfyr1z(X{`#U4M2mSO4 zB~F#_m@!KJ32G5I(9R4u;_i7ZpfZaMwW!X2lb!J1NxT7(f(B4L*A!swttatJZrYbY zv8cY`#aA8`dVYhm(@dxCQKSx%m#~WNh-6l|9&b*CR+)e>J^CXk(9Rwk5Yl)avR&fCbaWuFVBLAZlm*6pE(`{1mX8io6*K0%LZQ?J zpNqrQvU+2F$>tVy0jN-SztouzG?C1P9Q7O((%iQR_=Tm)fu(gIGkQ3}u_00vvo+Xm3f zvusE<@=)|CJBvi-LJ@ZxOeJj;dzV4L*U>?qnaP(Q{LL&c^)-u`)Ot!2F#k?IF;Q* zG`qoNE!mB7@gHWXztCcLME-uc#xEUyhMWhA#!n`j^G>Mfl)j+e>F0oY#CZA{8ziY& z6?3r3mx5n(ZPZ{oOe-TyKh;HA0e0$Ql~qp853`&?RfZx9VSMfJZk~8+L%;s zvSQ+^6STjmqp9PdGQb*nNe&n~lS)OW}~p7uGtZE5{_nD_z|?fwS2iGF$HfC?@jhCwEL}} zmUS{v94crKEzQ~$(BQmh0skiZ4q(TKg&oPpLEr~RZ7fIjn?yTw8;mK*H1mDQ`UTyy3Y~s?c z3tvYrGtV+X@B#KWx8jd#Fxoe&qT%&U;;i>@RNH9tapOW%=eA3AQ!__^R&-fbYZ#?gR=DilT>=P-0=&)n5$@wNC!nMLS4NR=ihTtth JRe`aY{{_g`gzNwS literal 0 HcmV?d00001 diff --git a/test/fixtures/tile_lod/scale/expected.png b/test/fixtures/tile_lod/scale/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..9050578d4852fb69da0ba009b48fdf72cbb2e27d GIT binary patch literal 3416 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 possibleExpected, + const PremultipliedImage& actual, + double imageThreshold = 0, + double pixelThreshold = 0); + +double getImageDiff(const std::string& base, const PremultipliedImage& actual, double pixelThreshold = 0); + } // namespace test } // namespace mbgl diff --git a/test/include/mbgl/test/vector_tile_test.hpp b/test/include/mbgl/test/vector_tile_test.hpp index 3e2b41d73cbd..9ae85853b4eb 100644 --- a/test/include/mbgl/test/vector_tile_test.hpp +++ b/test/include/mbgl/test/vector_tile_test.hpp @@ -34,17 +34,17 @@ class VectorTileTest { VectorTileTest() : threadPool(Scheduler::GetBackground(), uniqueID), - tileParameters{1.0, - MapDebugOptions(), - transformState, - fileSource, - MapMode::Continuous, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - threadPool, - dynamicTextureAtlas}, + tileParameters{.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = MapMode::Continuous, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = threadPool, + .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, threadPool} {} ~VectorTileTest() { diff --git a/test/src/mbgl/test/util.cpp b/test/src/mbgl/test/util.cpp index 79de8bd44479..dafb5fb8f179 100644 --- a/test/src/mbgl/test/util.cpp +++ b/test/src/mbgl/test/util.cpp @@ -9,12 +9,16 @@ #pragma warning(disable : 4244) #endif +#include +#include #include #ifdef _MSC_VER #pragma warning(pop) #endif +using namespace ::testing; + namespace mbgl { namespace test { @@ -22,10 +26,27 @@ void checkImage(const std::string& base, const PremultipliedImage& actual, double imageThreshold, double pixelThreshold) { + EXPECT_LE(getImageDiff(base, actual, pixelThreshold), imageThreshold); +} + +void checkImages(const std::vector& possibleExpected, + const PremultipliedImage& actual, + double imageThreshold, + double pixelThreshold) { + std::vector diffs(0.0, possibleExpected.size()); + + for (const auto& expected : possibleExpected) { + diffs.push_back(getImageDiff(expected, actual, pixelThreshold)); + } + + EXPECT_THAT(diffs, Contains(Le(imageThreshold))); +} + +double getImageDiff(const std::string& base, const PremultipliedImage& actual, double pixelThreshold) { #if !TEST_READ_ONLY if (getenv("UPDATE")) { util::write_file(base + "/expected.png", encodePNG(actual)); - return; + return 0.0; } #endif @@ -44,7 +65,9 @@ void checkImage(const std::string& base, util::write_file(base + "/actual.png", encodePNG(actual)); #endif - ASSERT_EQ(expected.size, actual.size); + if (expected.size != actual.size) { + return 1.0; + } uint64_t pixels = mapbox::pixelmatch(actual.data.get(), expected.data.get(), @@ -53,11 +76,11 @@ void checkImage(const std::string& base, diff.data.get(), pixelThreshold); - EXPECT_LE(static_cast(pixels) / (expected.size.width * expected.size.height), imageThreshold); - #if !TEST_READ_ONLY util::write_file(base + "/diff.png", encodePNG(diff)); #endif + + return static_cast(pixels) / (expected.size.width * expected.size.height); } } // namespace test diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp index 8aad9033e2e1..70d784111761 100644 --- a/test/style/source.test.cpp +++ b/test/style/source.test.cpp @@ -70,17 +70,17 @@ class SourceTest { Style style; TileParameters tileParameters(MapMode mapMode = MapMode::Continuous) { - return {1.0, - MapDebugOptions(), - transformState, - fileSource, - mapMode, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - threadPool, - dynamicTextureAtlas}; + return {.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = mapMode, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = threadPool, + .dynamicTextureAtlas = dynamicTextureAtlas}; }; SourceTest() diff --git a/test/tile/custom_geometry_tile.test.cpp b/test/tile/custom_geometry_tile.test.cpp index c630ae271817..fed5a36bab44 100644 --- a/test/tile/custom_geometry_tile.test.cpp +++ b/test/tile/custom_geometry_tile.test.cpp @@ -36,17 +36,17 @@ class CustomTileTest { style::Style style; CustomTileTest() - : tileParameters{1.0, - MapDebugOptions(), - transformState, - fileSource, - MapMode::Continuous, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - {Scheduler::GetBackground(), uniqueID}, - dynamicTextureAtlas}, + : tileParameters{.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = MapMode::Continuous, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = {Scheduler::GetBackground(), uniqueID}, + .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/geojson_tile.test.cpp b/test/tile/geojson_tile.test.cpp index f1fb4dbf7390..33baa241422f 100644 --- a/test/tile/geojson_tile.test.cpp +++ b/test/tile/geojson_tile.test.cpp @@ -37,17 +37,17 @@ class GeoJSONTileTest { style::Style style; GeoJSONTileTest() - : tileParameters{1.0, - MapDebugOptions(), - transformState, - fileSource, - MapMode::Continuous, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - {Scheduler::GetBackground(), uniqueID}, - dynamicTextureAtlas}, + : tileParameters{.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = MapMode::Continuous, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = {Scheduler::GetBackground(), uniqueID}, + .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/raster_dem_tile.test.cpp b/test/tile/raster_dem_tile.test.cpp index ea7eeec94e88..2519eac704b5 100644 --- a/test/tile/raster_dem_tile.test.cpp +++ b/test/tile/raster_dem_tile.test.cpp @@ -31,17 +31,17 @@ class RasterDEMTileTest { style::Style style; RasterDEMTileTest() - : tileParameters{1.0, - MapDebugOptions(), - transformState, - fileSource, - MapMode::Continuous, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - {Scheduler::GetBackground(), uniqueID}, - dynamicTextureAtlas}, + : tileParameters{.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = MapMode::Continuous, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = {Scheduler::GetBackground(), uniqueID}, + .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/raster_tile.test.cpp b/test/tile/raster_tile.test.cpp index a305c3bd2f60..f716fb6453c9 100644 --- a/test/tile/raster_tile.test.cpp +++ b/test/tile/raster_tile.test.cpp @@ -31,17 +31,17 @@ class RasterTileTest { style::Style style; RasterTileTest() - : tileParameters{1.0, - MapDebugOptions(), - transformState, - fileSource, - MapMode::Continuous, - annotationManager.makeWeakPtr(), - imageManager, - glyphManager, - 0, - {Scheduler::GetBackground(), uniqueID}, - dynamicTextureAtlas}, + : tileParameters{.pixelRatio = 1.0, + .debugOptions = MapDebugOptions(), + .transformState = transformState, + .fileSource = fileSource, + .mode = MapMode::Continuous, + .annotationManager = annotationManager.makeWeakPtr(), + .imageManager = imageManager, + .glyphManager = glyphManager, + .prefetchZoomDelta = 0, + .threadPool = {Scheduler::GetBackground(), uniqueID}, + .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; diff --git a/test/tile/tile_lod.test.cpp b/test/tile/tile_lod.test.cpp new file mode 100644 index 000000000000..fc3e32d84d1a --- /dev/null +++ b/test/tile/tile_lod.test.cpp @@ -0,0 +1,156 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace mbgl; +using namespace mbgl::util; +using namespace ::testing; + +class TileLODTest { +public: + util::RunLoop loop; + HeadlessFrontend frontend; + Map map; + + uint32_t tileCount = 0; + +public: + TileLODTest(const CameraOptions& cameraOptions = CameraOptions()) + : frontend(1.0f), + map(frontend, + MapObserver::nullObserver(), + MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize()), + ResourceOptions().withCachePath(":memory:").withAssetPath("test/fixtures/api/assets")) { + map.jumpTo(cameraOptions); + + map.setDebug(MapDebugOptions::TileBorders); + map.getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + + style::CustomGeometrySource::Options options; + options.fetchTileFunction = [&](const mbgl::CanonicalTileID& tileID) { + auto source = static_cast(map.getStyle().getSource("custom")); + if (!source) { + return; + } + + const LatLngBounds bounds(tileID); + const LatLng& center = bounds.center(); + + mapbox::geojson::feature feature; + feature.geometry = mapbox::geometry::geometry(Point{center.longitude(), center.latitude()}); + + FeatureCollection features; + features.emplace_back(feature); + + source->setTileData(tileID, features); + + ++tileCount; + }; + + map.getStyle().addSource(std::make_unique("custom", options)); + + auto layer = std::make_unique("circles", "custom"); + layer->setCircleColor(Color{0.0, 0.0, 1.0, 0.0}); + map.getStyle().addLayer(std::move(layer)); + } + + void checkImage(std::string image, uint32_t expectedTileCount, double imageThreshold = 0.0002) { + checkImages(std::vector{image}, expectedTileCount, imageThreshold); + } + + void checkImages(std::vector images, uint32_t expectedTileCount, double imageThreshold) { + const auto result = frontend.render(map); + + // check this after frontend.render() + EXPECT_EQ(tileCount, expectedTileCount); + + std::transform(images.begin(), images.end(), images.begin(), [](const auto& img) { + return "test/fixtures/tile_lod/" + img; + }); + + test::checkImages(images, result.image, imageThreshold, 0.01); + } +}; + +TEST(TileLOD, disabled) { + TileLODTest test(CameraOptions().withZoom(10.0)); + + test.map.setTileLodPitchThreshold(std::numbers::pi); + + test.checkImage("disabled", 4); +} + +TEST(TileLOD, zoomShift) { + TileLODTest test(CameraOptions().withZoom(12.0)); + + test.map.setTileLodZoomShift(4.0); + test.frontend.render(test.map); + EXPECT_EQ(test.tileCount, 64); + + test.tileCount = 0; + + test.map.setTileLodZoomShift(-4.0); + test.frontend.render(test.map); + EXPECT_EQ(test.tileCount, 4); +} + +TEST(TileLOD, pitchThreshold) { + TileLODTest test(CameraOptions().withZoom(10.0)); + + constexpr double pitch = 45.0; + test.map.setTileLodZoomShift(4.0); + test.map.setTileLodMinRadius(1.0); + test.map.setTileLodScale(1.0); + test.map.setTileLodPitchThreshold(pitch / 180.0 * std::numbers::pi); + + test.map.jumpTo(CameraOptions().withPitch(pitch - 1.0)); + test.frontend.render(test.map); + EXPECT_EQ(test.tileCount, 140); + test.tileCount = 0; + + test.map.jumpTo(CameraOptions().withPitch(pitch + 1.0)); + test.checkImages( + { + "pitchThreshold-line", + "pitchThreshold-polyline", + }, + 22, + 0.0015); +} + +TEST(TileLOD, scale) { + TileLODTest test(CameraOptions().withZoom(0.0)); + + test.map.setTileLodMinRadius(1.0); + test.map.setTileLodScale(0.4); + test.map.setTileLodPitchThreshold(-1.0); + + test.map.setTileLodZoomShift(5.0); + + test.checkImage("scale", 112); +} + +TEST(TileLOD, radius) { + TileLODTest test(CameraOptions().withZoom(0.0)); + + test.map.setTileLodMinRadius(5.0); + test.map.setTileLodScale(1.0); + test.map.setTileLodPitchThreshold(-1.0); + + test.map.setTileLodZoomShift(5.0); + + test.checkImage("radius", 172); +} diff --git a/test/util/tile_cover.test.cpp b/test/util/tile_cover.test.cpp index 535029d1d4ed..a84119d2da36 100644 --- a/test/util/tile_cover.test.cpp +++ b/test/util/tile_cover.test.cpp @@ -44,7 +44,7 @@ TEST(TileCover, Pitch) { .withPitch(40.0)); EXPECT_EQ((std::vector{{2, 1, 1}, {2, 2, 1}, {2, 1, 2}, {2, 2, 2}}), - util::tileCover(transform.getState(), 2)); + util::tileCover({transform.getState()}, 2)); } TEST(TileCover, PitchIssue15442) { @@ -62,7 +62,7 @@ TEST(TileCover, PitchIssue15442) { EXPECT_EQ((std::vector{ {2, 3, 1}, {2, 2, 1}, {2, 3, 0}, {2, 2, 0}, {2, 1, {2, 0, 0}}, {2, 1, {2, 1, 0}}}), - util::tileCover(transform.getState(), 2)); + util::tileCover({transform.getState()}, 2)); } TEST(TileCover, PitchOverAllowedByContentInsets) { @@ -80,7 +80,7 @@ TEST(TileCover, PitchOverAllowedByContentInsets) { EXPECT_EQ( (std::vector{{3, 4, 3}, {3, 3, 3}, {3, 4, 4}, {3, 3, 4}, {3, 4, 2}, {3, 5, 3}, {3, 5, 2}}), - util::tileCover(transform.getState(), 3)); + util::tileCover({transform.getState()}, 3)); } TEST(TileCover, PitchWithLargerResultSet) { @@ -96,7 +96,7 @@ TEST(TileCover, PitchWithLargerResultSet) { .withBearing(-142.2630000003529176) .withPitch(60.0)); - auto cover = util::tileCover(transform.getState(), 5); + auto cover = util::tileCover({transform.getState()}, 5); // Returned vector has above 100 elements, we check first 16 as there is a // plan to return lower LOD for distant tiles. EXPECT_EQ((std::vector{{5, 15, 16}, @@ -148,7 +148,7 @@ TEST(TileCover, CoordinatesAreUnwrapped) { EXPECT_EQ( (std::vector{{1, 0, {1, 1, 0}}, {1, 1, {1, 0, 0}}, {1, 0, {1, 1, 1}}, {1, 1, {1, 0, 1}}}), - util::tileCover(transform.getState(), 1)); + util::tileCover({transform.getState()}, 1)); } TEST(TileCover, DifferentOverscaledZ) { @@ -165,7 +165,7 @@ TEST(TileCover, DifferentOverscaledZ) { EXPECT_EQ( (std::vector{{3, 0, {2, 1, 1}}, {3, 0, {2, 2, 1}}, {3, 0, {2, 1, 2}}, {3, 0, {2, 2, 2}}}), - util::tileCover(transform.getState(), 2, 3)); + util::tileCover({transform.getState()}, 2, 3)); } TEST(TileCover, DifferentOverscaledZWithPitch) { @@ -186,7 +186,7 @@ TEST(TileCover, DifferentOverscaledZWithPitch) { {5, 0, {3, 3, 1}}, {5, 0, {3, 4, 1}}, {5, 0, {3, 2, 1}}}), - util::tileCover(transform.getState(), 3, 5)); + util::tileCover({transform.getState()}, 3, 5)); } TEST(TileCover, DifferentOverscaledZWrapped) { @@ -201,7 +201,7 @@ TEST(TileCover, DifferentOverscaledZWrapped) { EXPECT_EQ( (std::vector{{2, 0, {1, 1, 0}}, {2, 1, {1, 0, 0}}, {2, 0, {1, 1, 1}}, {2, 1, {1, 0, 1}}}), - util::tileCover(transform.getState(), 1, 2)); + util::tileCover({transform.getState()}, 1, 2)); } TEST(TileCover, FlippedY) { @@ -216,7 +216,7 @@ TEST(TileCover, FlippedY) { .withZoom(1.0)); EXPECT_EQ((std::vector{{1, 0, 0}, {1, 1, 0}, {1, 0, 1}, {1, 1, 1}}), - util::tileCover(transform.getState(), 1)); + util::tileCover({transform.getState()}, 1)); } TEST(TileCover, FlippedYPitch) { @@ -233,7 +233,7 @@ TEST(TileCover, FlippedYPitch) { .withPitch(40.0)); EXPECT_EQ((std::vector{{2, 1, 1}, {2, 2, 1}, {2, 1, 2}, {2, 2, 2}}), - util::tileCover(transform.getState(), 2)); + util::tileCover({transform.getState()}, 2)); } TEST(TileCover, FlippedYHelsinki) { @@ -248,7 +248,7 @@ TEST(TileCover, FlippedYHelsinki) { .withZoom(11.447425)); EXPECT_EQ((std::vector{{11, 1165, 592}, {11, 1166, 592}, {11, 1165, 593}, {11, 1166, 593}}), - util::tileCover(transform.getState(), 11)); + util::tileCover({transform.getState()}, 11)); } TEST(TileCoverStream, Arctic) { From 47605a92fae2f3ce0886cb68940e38c2f20ba4d4 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 4 Jun 2025 18:40:50 +0200 Subject: [PATCH 220/339] Make sure AndroidRendererFrontend exists when accessing it (#3522) --- .../src/cpp/android_renderer_frontend.cpp | 23 ++++++++++++++----- .../src/cpp/android_renderer_frontend.hpp | 12 ++++++++-- .../src/cpp/native_map_view.cpp | 2 +- .../src/cpp/native_map_view.hpp | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 988dff420432..6ecc42981738 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -91,13 +91,24 @@ class ForwardingRendererObserver : public RendererObserver { ActorRef delegate; }; -AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) +AndroidRendererFrontend::AndroidRendererFrontend(Private, MapRenderer& mapRenderer_) : mapRenderer(mapRenderer_), - mapRunLoop(util::RunLoop::Get()), - updateAsyncTask(std::make_unique([this]() { - mapRenderer.update(std::move(updateParams)); - mapRenderer.requestRender(); - })) {} + mapRunLoop(util::RunLoop::Get()) {} + +std::shared_ptr AndroidRendererFrontend::create(MapRenderer& mapRenderer) { + auto ptr = std::make_shared(Private(), mapRenderer); + ptr->init(); + return ptr; +} + +void AndroidRendererFrontend::init() { + updateAsyncTask = std::make_unique([weakSelf = weak_from_this()]() { + if (auto self = weakSelf.lock()) { + self->mapRenderer.update(std::move(self->updateParams)); + self->mapRenderer.requestRender(); + } + }); +} AndroidRendererFrontend::~AndroidRendererFrontend() = default; diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp index 2eb325c9c438..3210634fa2d8 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp @@ -27,9 +27,17 @@ class AsyncTask; namespace android { -class AndroidRendererFrontend : public RendererFrontend { +class AndroidRendererFrontend : public RendererFrontend, public std::enable_shared_from_this { + struct Private { + explicit Private() = default; + }; + public: - AndroidRendererFrontend(MapRenderer&); + AndroidRendererFrontend(Private, MapRenderer&); + + static std::shared_ptr create(MapRenderer&); + void init(); + ~AndroidRendererFrontend() override; void reset() override; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 7fccd881478d..c62cad5fff09 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -75,7 +75,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, } // Create a renderer frontend - rendererFrontend = std::make_unique(mapRenderer); + rendererFrontend = AndroidRendererFrontend::create(mapRenderer); // Create Map options MapOptions options; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 045b20c5780c..f9a0c7a3e136 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -345,7 +345,7 @@ class NativeMapView : public MapObserver { void onSpriteRequested(const std::optional&) override; private: - std::unique_ptr rendererFrontend; + std::shared_ptr rendererFrontend; JavaVM* vm = nullptr; jni::WeakReference> javaPeer; From ce504080cf0000918c3f9483b78ffb39f9abd697 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 4 Jun 2025 22:12:10 +0200 Subject: [PATCH 221/339] Use 16-core runner for Android releases (#3525) --- .github/workflows/android-release.yml | 2 +- platform/android/CHANGELOG.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 5e64c4225af6..bd37deb13a93 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -62,7 +62,7 @@ jobs: android-build-and-upload-release: needs: android-create-release - runs-on: ubuntu-24.04 + runs-on: MapLibre_Native_Ubuntu_24_04_x84_16_core defaults: run: working-directory: platform/android diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index effa4a9c216f..ab2faccd1adb 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -6,11 +6,12 @@ - Add action journal ([#3409](https://github.com/maplibre/maplibre-native/pull/3409)). Documentation: https://maplibre.org/maplibre-native/android/examples/observability/action-journal/ - Pattern layout performance improvement ([#3495](https://github.com/maplibre/maplibre-native/pull/3495)). +- Add Tile LOD controls ([#2958](https://github.com/maplibre/maplibre-native/pull/2958)). ### 🐞 Bug fixes - Improve weak pointer use ([#3510](https://github.com/maplibre/maplibre-native/pull/3510)). - +- Make sure AndroidRendererFrontend exists when accessing it ([#3522](https://github.com/maplibre/maplibre-native/pull/3522)) ## 11.9.0 ### ✨ Features and improvements From 53393f1af6648744899c43e2adf1552644082a2e Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 5 Jun 2025 14:27:28 +0300 Subject: [PATCH 222/339] Add missing proguard rules (#3529) Co-authored-by: Bart Louwers --- platform/android/CHANGELOG.md | 6 ++++++ platform/android/MapLibreAndroid/proguard-rules.pro | 2 ++ platform/android/VERSION | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index ab2faccd1adb..5cf2d5a29681 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog MapLibre Native for Android +## 11.10.1 + +### 🐞 Bug fixes + +- Add missing proguard rules ([#3529](https://github.com/maplibre/maplibre-native/pull/3529)). + ## 11.10.0 ### ✨ Features and improvements diff --git a/platform/android/MapLibreAndroid/proguard-rules.pro b/platform/android/MapLibreAndroid/proguard-rules.pro index 18beeaa2fc81..61a739a86ed8 100644 --- a/platform/android/MapLibreAndroid/proguard-rules.pro +++ b/platform/android/MapLibreAndroid/proguard-rules.pro @@ -10,6 +10,8 @@ -keep class com.google.gson.JsonPrimitive { *; } -dontnote com.google.gson.** -keep enum org.maplibre.android.tile.TileOperation +-keep class org.maplibre.android.maps.RenderingStats { *; } +-keep class org.maplibre.android.maps.NativeMapOptions { *; } -keepclassmembers class * extends java.lang.Enum { ; public static **[] values(); diff --git a/platform/android/VERSION b/platform/android/VERSION index 933dbb1dfc7a..46577f54faa8 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.10.0 +11.10.1 From b81de15587e738dde3c4cf8a88b23d7fcee6fbae Mon Sep 17 00:00:00 2001 From: NithinAashikPS <153351835+NithinAashikPS@users.noreply.github.com> Date: Fri, 6 Jun 2025 03:14:22 +0530 Subject: [PATCH 223/339] Fix incomplete feature state updates in GeometryTile and SourceFeatureState [Vector Tile Layer]. (#3406) Co-authored-by: nithin.aashik Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bart Louwers Co-authored-by: Bart Louwers --- .../feature-state/vector-source/style.json | 2 +- src/mbgl/renderer/source_state.cpp | 2 ++ src/mbgl/tile/geometry_tile.cpp | 18 +++++++----------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/metrics/integration/render-tests/feature-state/vector-source/style.json b/metrics/integration/render-tests/feature-state/vector-source/style.json index 1fcd61ce1a75..e7cff042dcae 100644 --- a/metrics/integration/render-tests/feature-state/vector-source/style.json +++ b/metrics/integration/render-tests/feature-state/vector-source/style.json @@ -44,7 +44,7 @@ } }, { - "id": "poi_label", + "id": "poi_layer", "type": "circle", "source": "maplibre", "source-layer": "poi_label", diff --git a/src/mbgl/renderer/source_state.cpp b/src/mbgl/renderer/source_state.cpp index f36d49c5cc68..5eab581b5a54 100644 --- a/src/mbgl/renderer/source_state.cpp +++ b/src/mbgl/renderer/source_state.cpp @@ -97,6 +97,8 @@ void SourceFeatureState::coalesceChanges(std::vector& tiles) { stateChanges.clear(); deletedStates.clear(); + changes.insert(currentStates.begin(), currentStates.end()); + if (changes.empty()) { return; } diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 535b958ab5bf..1d71c8b99084 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -542,18 +542,16 @@ void GeometryTile::performedFadePlacement() { void GeometryTile::setFeatureState(const LayerFeatureStates& states) { MLN_TRACE_FUNC(); - auto layers = getData(); + const auto layers = getData(); if ((layers == nullptr) || states.empty() || !layoutResult) { return; } - auto& layerIdToLayerRenderData = layoutResult->layerRenderData; - for (auto& layer : layerIdToLayerRenderData) { - const auto& layerID = layer.first; - const auto sourceLayer = layers->getLayer(layerID); - if (sourceLayer) { - const auto& sourceLayerID = sourceLayer->getName(); - auto entry = states.find(sourceLayerID); + for (auto& layerIdToLayerRenderData = layoutResult->layerRenderData; + auto& [layerID, renderData] : layerIdToLayerRenderData) { + std::string sourceLayerId = renderData.layerProperties->baseImpl->sourceLayer; + if (const auto sourceLayer = layers->getLayer(sourceLayerId)) { + auto entry = states.find(sourceLayerId); if (entry == states.end()) { continue; } @@ -561,9 +559,7 @@ void GeometryTile::setFeatureState(const LayerFeatureStates& states) { if (featureStates.empty()) { continue; } - - auto bucket = layer.second.bucket; - if (bucket && bucket->hasData()) { + if (const auto bucket = renderData.bucket; bucket && bucket->hasData()) { bucket->update(featureStates, *sourceLayer, layerID, layoutResult->imageAtlas.patternPositions); } } From f6de3bc0e95912d16b65a0f1427f8bf91faad900 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 6 Jun 2025 10:51:28 +0200 Subject: [PATCH 224/339] Fix filename benchmark apk android-device-test.yml (#3531) --- .github/workflows/android-device-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index c7de1b25c50c..f9329669d6ca 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -37,8 +37,8 @@ jobs: }, { artifactName: benchmarkAPKs, - testFile: "MapLibreAndroidTestApp-drawable-release-androidTest.apk", - appFile: "MapLibreAndroidTestApp-drawable-release.apk", + testFile: "MapLibreAndroidTestApp-opengl-release-androidTest.apk", + appFile: "MapLibreAndroidTestApp-opengl-release.apk", name: "Android Benchmark", testFilter: "org.maplibre.android.benchmark.Benchmark", # Google Pixel 7 Pro From b0e2e2ce852352d100e541a937ee3b543415e330 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 6 Jun 2025 23:38:19 +0200 Subject: [PATCH 225/339] Fix segfault this-capture GeoJsonSource which may be deleted (#3536) Co-authored-by: Tim Sylvester Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- include/mbgl/style/source.hpp | 12 +++++-- .../style/sources/custom_geometry_source.cpp | 10 +++--- .../src/cpp/style/sources/geojson_source.cpp | 28 +++++++++------ .../src/cpp/style/sources/geojson_source.hpp | 4 +-- .../src/cpp/style/sources/image_source.cpp | 8 ++--- .../cpp/style/sources/raster_dem_source.cpp | 2 +- .../src/cpp/style/sources/raster_source.cpp | 2 +- .../src/cpp/style/sources/source.cpp | 34 +++++++++---------- .../src/cpp/style/sources/source.hpp | 14 ++++++-- .../src/cpp/style/sources/vector_source.cpp | 4 +-- .../testapp/style/GeoJsonSourceTests.java | 24 +++++++++++++ 11 files changed, 96 insertions(+), 46 deletions(-) diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp index db3b7063b313..456cff0abc3f 100644 --- a/include/mbgl/style/source.hpp +++ b/include/mbgl/style/source.hpp @@ -55,13 +55,21 @@ class Source { /// Dynamically cast this source to the given subtype. template + requires(std::is_base_of_v) T* as() { - return is() ? reinterpret_cast(this) : nullptr; + if constexpr (std::is_same_v) { + return this; + } + return is() ? static_cast(this) : nullptr; } template + requires(std::is_base_of_v) const T* as() const { - return is() ? reinterpret_cast(this) : nullptr; + if constexpr (std::is_same_v) { + return this; + } + return is() ? static_cast(this) : nullptr; } SourceType getType() const; diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp index 79b3116efcb8..25cdd9798c8b 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp @@ -141,18 +141,18 @@ void CustomGeometrySource::setTileData( // Update the core source if not cancelled if (!isCancelled(z, x, y)) { - source.as()->CustomGeometrySource::setTileData(CanonicalTileID(z, x, y), - GeoJSON(geometry)); + getSource().CustomGeometrySource::setTileData(CanonicalTileID(z, x, y), + GeoJSON(geometry)); } } void CustomGeometrySource::invalidateTile(jni::JNIEnv&, jni::jint z, jni::jint x, jni::jint y) { - source.as()->CustomGeometrySource::invalidateTile(CanonicalTileID(z, x, y)); + getSource().CustomGeometrySource::invalidateTile(CanonicalTileID(z, x, y)); } void CustomGeometrySource::invalidateBounds(jni::JNIEnv& env, const jni::Object& jBounds) { auto bounds = LatLngBounds::getLatLngBounds(env, jBounds); - source.as()->CustomGeometrySource::invalidateRegion(bounds); + getSource().CustomGeometrySource::invalidateRegion(bounds); } jni::Local>> CustomGeometrySource::querySourceFeatures( @@ -162,7 +162,7 @@ jni::Local>> CustomGeometrySource::quer std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(source.getID(), {{}, toFilter(env, jfilter)}); + features = rendererFrontend->querySourceFeatures(getSource().getID(), {{}, toFilter(env, jfilter)}); } return Feature::convert(env, features); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp index bc37a5f5c5fb..cb51a1326d13 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp @@ -50,12 +50,12 @@ GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, cons std::make_unique(jni::Make(env, sourceId), convertGeoJSONOptions(env, options))), converter(std::make_unique>(Scheduler::GetBackground(), - source.as()->impl().getOptions())) {} + getSource().impl().getOptions())) {} GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend* frontend) : Source(env, coreSource, createJavaPeer(env), frontend), converter(std::make_unique>(Scheduler::GetBackground(), - source.as()->impl().getOptions())) {} + getSource().impl().getOptions())) {} GeoJSONSource::~GeoJSONSource() = default; @@ -83,11 +83,11 @@ void GeoJSONSource::setGeometry(jni::JNIEnv& env, const jni::Object()->setURL(jni::Make(env, url)); + getSource().setURL(jni::Make(env, url)); } jni::Local GeoJSONSource::getURL(jni::JNIEnv& env) { - std::optional url = source.as()->getURL(); + std::optional url = getSource().getURL(); return url ? jni::Make(env, *url) : jni::Local(); } @@ -98,7 +98,7 @@ jni::Local>> GeoJSONSource::querySource std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(source.getID(), {{}, toFilter(env, jfilter)}); + features = rendererFrontend->querySourceFeatures(getSource().getID(), {{}, toFilter(env, jfilter)}); } return Feature::convert(env, features); } @@ -112,7 +112,7 @@ jni::Local>> GeoJSONSource::getClusterC mbgl::Feature _feature = Feature::convert(env, feature); _feature.properties["cluster_id"] = static_cast(_feature.properties["cluster_id"].get()); const auto featureExtension = rendererFrontend->queryFeatureExtensions( - source.getID(), _feature, "supercluster", "children", {}); + getSource().getID(), _feature, "supercluster", "children", {}); if (featureExtension.is()) { return Feature::convert(env, featureExtension.get()); } @@ -131,7 +131,7 @@ jni::Local>> GeoJSONSource::getClusterL const std::map options = {{"limit", static_cast(limit)}, {"offset", static_cast(offset)}}; auto featureExtension = rendererFrontend->queryFeatureExtensions( - source.getID(), _feature, "supercluster", "leaves", options); + getSource().getID(), _feature, "supercluster", "leaves", options); if (featureExtension.is()) { return Feature::convert(env, featureExtension.get()); } @@ -148,7 +148,7 @@ jint GeoJSONSource::getClusterExpansionZoom(jni::JNIEnv& env, const jni::Object< mbgl::Feature _feature = Feature::convert(env, feature); _feature.properties["cluster_id"] = static_cast(_feature.properties["cluster_id"].get()); auto featureExtension = rendererFrontend->queryFeatureExtensions( - source.getID(), _feature, "supercluster", "expansion-zoom", {}); + getSource().getID(), _feature, "supercluster", "expansion-zoom", {}); if (featureExtension.is()) { auto value = featureExtension.get(); if (value.is()) { @@ -181,12 +181,20 @@ void GeoJSONSource::setAsync(Update::Converter converterFn) { awaitingUpdate = std::make_unique( std::move(converterFn), std::make_unique>( - *Scheduler::GetCurrent(), [this](std::shared_ptr geoJSONData) { + *Scheduler::GetCurrent(), + [awaitingUpdateWeak = std::weak_ptr(awaitingUpdate), + sourceWeak = getWeakSource(), + updateWeak = std::weak_ptr(update)](std::shared_ptr geoJSONData) { + auto awaitingUpdate = awaitingUpdateWeak.lock(); + auto source = sourceWeak.lock(); + auto update = updateWeak.lock(); + if (!awaitingUpdate || !source || !update) return; + // conversion from Java features to core ones finished android::UniqueEnv _env = android::AttachEnv(); // Update the core source - source.as()->setGeoJSONData(std::move(geoJSONData)); + source->get().as()->setGeoJSONData(std::move(geoJSONData)); // if there is an awaiting update, execute it, otherwise, release resources if (awaitingUpdate) { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp index 6a360484b534..ac4999bb53e3 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp @@ -70,8 +70,8 @@ class GeoJSONSource : public Source { jni::Local getURL(jni::JNIEnv&); jni::Local> createJavaPeer(jni::JNIEnv&); - std::unique_ptr awaitingUpdate; - std::unique_ptr update; + std::shared_ptr awaitingUpdate; + std::shared_ptr update; std::shared_ptr threadPool; std::unique_ptr> converter; diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp index 8d278b318669..f1f6559e4a7b 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp @@ -29,20 +29,20 @@ ImageSource::~ImageSource() = default; void ImageSource::setURL(jni::JNIEnv& env, const jni::String& url) { // Update the core source - source.as()->ImageSource::setURL(jni::Make(env, url)); + getSource().ImageSource::setURL(jni::Make(env, url)); } jni::Local ImageSource::getURL(jni::JNIEnv& env) { - std::optional url = source.as()->ImageSource::getURL(); + std::optional url = getSource().ImageSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } void ImageSource::setImage(jni::JNIEnv& env, const jni::Object& bitmap) { - source.as()->setImage(Bitmap::GetImage(env, bitmap)); + getSource().setImage(Bitmap::GetImage(env, bitmap)); } void ImageSource::setCoordinates(jni::JNIEnv& env, const jni::Object& coordinatesObject) { - source.as()->setCoordinates(LatLngQuad::getLatLngArray(env, coordinatesObject)); + getSource().setCoordinates(LatLngQuad::getLatLngArray(env, coordinatesObject)); } jni::Local> ImageSource::createJavaPeer(jni::JNIEnv& env) { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp index 107c96a066e3..56bad65aa141 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp @@ -26,7 +26,7 @@ RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, mbgl::style::Source& coreSour RasterDEMSource::~RasterDEMSource() = default; jni::Local RasterDEMSource::getURL(jni::JNIEnv& env) { - std::optional url = source.as()->RasterDEMSource::getURL(); + auto url = getSource().RasterDEMSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp index d023fca6dcd9..cba02423784d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp @@ -25,7 +25,7 @@ RasterSource::RasterSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, An RasterSource::~RasterSource() = default; jni::Local RasterSource::getURL(jni::JNIEnv& env) { - std::optional url = source.as()->RasterSource::getURL(); + auto url = getSource().RasterSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp index ec7026d441be..af11e2a59e96 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp @@ -70,13 +70,13 @@ Source::Source(jni::JNIEnv& env, mbgl::style::Source& coreSource, const jni::Object& obj, AndroidRendererFrontend* frontend) - : source(coreSource), + : source(std::make_shared>(coreSource)), javaPeer(jni::NewGlobal(env, obj)), rendererFrontend(frontend) {} Source::Source(jni::JNIEnv&, std::unique_ptr coreSource) : ownedSource(std::move(coreSource)), - source(*ownedSource) {} + source(std::make_shared>(*ownedSource)) {} Source::~Source() { if (ownedSource) { @@ -102,24 +102,24 @@ Source::~Source() { } jni::Local Source::getId(jni::JNIEnv& env) { - return jni::Make(env, source.getID()); + return jni::Make(env, source->get().getID()); } jni::Local Source::getAttribution(jni::JNIEnv& env) { - auto attribution = source.getAttribution(); + auto attribution = source->get().getAttribution(); return attribution ? jni::Make(env, attribution.value()) : jni::Make(env, ""); } void Source::setPrefetchZoomDelta(jni::JNIEnv& env, jni::Integer& delta) { if (!delta) { - source.setPrefetchZoomDelta(std::nullopt); + source->get().setPrefetchZoomDelta(std::nullopt); } else { - source.setPrefetchZoomDelta(jni::Unbox(env, delta)); + source->get().setPrefetchZoomDelta(jni::Unbox(env, delta)); } } jni::Local Source::getPrefetchZoomDelta(jni::JNIEnv& env) { - auto delta = source.getPrefetchZoomDelta(); + auto delta = source->get().getPrefetchZoomDelta(); if (delta.has_value()) { return jni::Box(env, jni::jint(delta.value())); } @@ -128,14 +128,14 @@ jni::Local Source::getPrefetchZoomDelta(jni::JNIEnv& env) { void Source::setMaxOverscaleFactorForParentTiles(jni::JNIEnv& env, jni::Integer& maxOverscaleFactor) { if (!maxOverscaleFactor) { - source.setMaxOverscaleFactorForParentTiles(std::nullopt); + source->get().setMaxOverscaleFactorForParentTiles(std::nullopt); } else { - source.setMaxOverscaleFactorForParentTiles(jni::Unbox(env, maxOverscaleFactor)); + source->get().setMaxOverscaleFactorForParentTiles(jni::Unbox(env, maxOverscaleFactor)); } } jni::Local Source::getMaxOverscaleFactorForParentTiles(jni::JNIEnv& env) { - auto maxOverscaleFactor = source.getMaxOverscaleFactorForParentTiles(); + auto maxOverscaleFactor = source->get().getMaxOverscaleFactorForParentTiles(); if (maxOverscaleFactor) { return jni::Box(env, jni::jint(*maxOverscaleFactor)); } @@ -151,7 +151,7 @@ void Source::addToStyle(JNIEnv& env, const jni::Object& obj, mbgl::style style.addSource(std::move(ownedSource)); // Add peer to core source - source.peer = std::unique_ptr(this); + source->get().peer = std::unique_ptr(this); // Add strong reference to java source javaPeer = jni::NewGlobal(env, obj); @@ -167,7 +167,7 @@ void Source::addToMap(JNIEnv& env, const jni::Object& obj, mbgl::Map& ma map.getStyle().addSource(std::move(ownedSource)); // Add peer to core source - source.peer = std::unique_ptr(this); + source->get().peer = std::unique_ptr(this); // Add strong reference to java source javaPeer = jni::NewGlobal(env, obj); @@ -182,26 +182,26 @@ bool Source::removeFromMap(JNIEnv&, const jni::Object&, mbgl::Map& map) } // Remove the source from the map and take ownership - ownedSource = map.getStyle().removeSource(source.getID()); + ownedSource = map.getStyle().removeSource(source->get().getID()); // The source may not be removed if any layers still reference it return ownedSource != nullptr; } jni::Local Source::isVolatile(jni::JNIEnv& env) { - return jni::Box(env, jni::jboolean(source.isVolatile())); + return jni::Box(env, jni::jboolean(source->get().isVolatile())); } void Source::setVolatile(JNIEnv& env, jni::Boolean& value) { - source.setVolatile(jni::Unbox(env, value)); + source->get().setVolatile(jni::Unbox(env, value)); } void Source::setMinimumTileUpdateInterval(JNIEnv& env, jni::Long& interval) { - source.setMinimumTileUpdateInterval(Milliseconds(jni::Unbox(env, interval))); + source->get().setMinimumTileUpdateInterval(Milliseconds(jni::Unbox(env, interval))); } jni::Local Source::getMinimumTileUpdateInterval(JNIEnv& env) { - return jni::Box(env, jni::jlong(source.getMinimumTileUpdateInterval().count() / 1000000)); + return jni::Box(env, jni::jlong(source->get().getMinimumTileUpdateInterval().count() / 1000000)); } void Source::releaseJavaPeer() { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp index b7782c3487d7..8c9243f62971 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp @@ -8,6 +8,7 @@ #include "../../android_renderer_frontend.hpp" #include +#include namespace mbgl { namespace android { @@ -63,12 +64,21 @@ class Source : private mbgl::util::noncopyable { jni::Local getMinimumTileUpdateInterval(JNIEnv&); protected: + template + T& getSource() { + return *ownedSource->as(); + } + + std::weak_ptr> getWeakSource() const { return source; } + +private: // Set on newly created sources until added to the map. std::unique_ptr ownedSource; - // Raw pointer that is valid at all times. - mbgl::style::Source& source; + // Reference that is valid at all times. + std::shared_ptr> source; +protected: // Set when the source is added to a map. jni::Global> javaPeer; diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp index 01e092f83915..e3e77d57c061 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp @@ -31,7 +31,7 @@ VectorSource::VectorSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, An VectorSource::~VectorSource() = default; jni::Local VectorSource::getURL(jni::JNIEnv& env) { - std::optional url = source.as()->VectorSource::getURL(); + std::optional url = getSource().VectorSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } @@ -42,7 +42,7 @@ jni::Local>> VectorSource::querySourceF std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(source.getID(), + features = rendererFrontend->querySourceFeatures(getSource().getID(), {toVector(env, jSourceLayerIds), toFilter(env, jfilter)}); } return Feature::convert(env, features); diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java index 5ab3e8ccc7af..04fbfc2a96e8 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java @@ -1,5 +1,6 @@ package org.maplibre.android.testapp.style; +import org.maplibre.android.style.sources.CannotAddSourceException; import org.maplibre.geojson.Feature; import org.maplibre.geojson.FeatureCollection; import org.maplibre.geojson.Point; @@ -155,6 +156,29 @@ protected void testFeatureFromResource(final @RawRes int resource) { }); } + @Test + public void testDuplicateSourceDuringAsyncSetGeoJson() { + // regression test for segfault when setting GeoJSON contents + // for a source that has been deleted + // https://github.com/maplibre/maplibre-native/issues/3493 + validateTestSetup(); + MapLibreMapAction.invoke(maplibreMap, (uiController, maplibreMap) -> { + String geoJsonString = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[0,0]}}"; + for (int i = 0; i < 1000; i++) { + // Create a GeoJSON source with the same ID each iteration + GeoJsonSource source = new GeoJsonSource("source"); + try { + maplibreMap.getStyle().addSource(source); + } catch (CannotAddSourceException ex) { + // ignore, this is expected + } + + // Schedule an async update via setGeoJson(String) + source.setGeoJson(geoJsonString); + } + }); + } + public abstract class BaseViewAction implements ViewAction { @Override From 6704f0f80ac3e83c3a1ab03b872ae24d8ed6d778 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Sat, 7 Jun 2025 20:00:38 +0300 Subject: [PATCH 226/339] Fix recycler view test (#3537) --- .../src/cpp/android_vulkan_renderer_backend.cpp | 5 +++++ .../src/cpp/android_vulkan_renderer_backend.hpp | 1 + .../MapLibreAndroid/src/cpp/map_renderer.cpp | 14 +++++++++++--- .../surfaceview/MapLibreVulkanSurfaceView.java | 12 ++---------- ...eViewReopenTest.kt => SurfaceViewReopenTest.kt} | 4 ++-- ...aceViewReuseTest.kt => SurfaceViewReuseTest.kt} | 8 ++++---- .../src/main/AndroidManifest.xml | 6 +++--- ...wActivity.kt => SurfaceRecyclerViewActivity.kt} | 11 ++++++----- .../maplayout/TextureRecyclerViewActivity.kt | 2 +- .../src/main/res/values/descriptions.xml | 2 +- .../src/main/res/values/titles.xml | 2 +- src/mbgl/gl/context.hpp | 1 + src/mbgl/gl/resource_pool.cpp | 4 ++++ 13 files changed, 42 insertions(+), 30 deletions(-) rename platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/{GLSurfaceViewReopenTest.kt => SurfaceViewReopenTest.kt} (85%) rename platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/{GLSurfaceViewReuseTest.kt => SurfaceViewReuseTest.kt} (61%) rename platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/{GLSurfaceRecyclerViewActivity.kt => SurfaceRecyclerViewActivity.kt} (89%) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp index 752d2cb78dd2..043bc5c4f912 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp @@ -68,6 +68,11 @@ void AndroidVulkanRendererBackend::resizeFramebuffer(int width, int height) { } } +PremultipliedImage AndroidVulkanRendererBackend::readFramebuffer() { + // TODO not implemented + return PremultipliedImage(Size(2, 2)); +} + } // namespace android } // namespace mbgl diff --git a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.hpp index 8094a2f5cca1..1d6f988caefb 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.hpp @@ -21,6 +21,7 @@ class AndroidVulkanRendererBackend : public AndroidRendererBackend, std::vector getInstanceExtensions() override; void resizeFramebuffer(int width, int height) override; + PremultipliedImage readFramebuffer() override; // mbgl::gfx::RendererBackend implementation public: diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index 9fd889e05ef6..fd75d28287e1 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -234,8 +234,14 @@ void MapRenderer::onSurfaceCreated(JNIEnv& env, const jni::ObjectmarkContextLost(); - if (renderer) renderer->markContextLost(); + if (backend) { + gfx::BackendScope backendGuard{backend->getImpl()}; + backend->markContextLost(); + } + + if (renderer) { + renderer->markContextLost(); + } // Reset in opposite order renderer.reset(); @@ -270,12 +276,14 @@ void MapRenderer::onSurfaceCreated(JNIEnv& env, const jni::Object(nullObj)); } +#endif backend->resizeFramebuffer(width, height); framebufferSizeChanged = true; diff --git a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java index 7d38575efddd..433dbae4eaaf 100644 --- a/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/vulkan/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreVulkanSurfaceView.java @@ -61,15 +61,6 @@ protected void guardedRun() throws InterruptedException { renderThreadManager.notifyAll(); } - if (paused && graphicsSurfaceCreated) { - MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); - if (view != null) { - destroySurface = true; - graphicsSurfaceCreated = false; - } - renderThreadManager.notifyAll(); - } - // lost surface if (!hasSurface && !waitingForSurface) { MapLibreVulkanSurfaceView view = mSurfaceViewWeakRef.get(); @@ -105,7 +96,7 @@ protected void guardedRun() throws InterruptedException { } // Ready to draw? - if (readyToDraw()) { + if (readyToDraw() && graphicsSurfaceCreated) { if (this.sizeChanged) { sizeChanged = true; w = width; @@ -144,6 +135,7 @@ protected void guardedRun() throws InterruptedException { if (view != null) { view.renderer.onSurfaceDestroyed(); destroySurface = false; + continue; } } diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReopenTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReopenTest.kt similarity index 85% rename from platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReopenTest.kt rename to platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReopenTest.kt index 485f1476f4e2..8684216c427c 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReopenTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReopenTest.kt @@ -9,10 +9,10 @@ import org.junit.Test import org.junit.runner.RunWith /** - * Regression test that validates reopening an Activity with a GLSurfaceView + * Regression test that validates reopening an Activity with a SurfaceView */ @RunWith(AndroidJUnit4ClassRunner::class) -class GLSurfaceViewReopenTest : BaseIntegrationTest() { +class SurfaceViewReopenTest : BaseIntegrationTest() { @get:Rule var activityRule: ActivityTestRule = ActivityTestRule(SimpleMapActivity::class.java) diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReuseTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReuseTest.kt similarity index 61% rename from platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReuseTest.kt rename to platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReuseTest.kt index 0839de3f6c71..3240c23001a4 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/GLSurfaceViewReuseTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/integration/SurfaceViewReuseTest.kt @@ -3,19 +3,19 @@ package org.maplibre.android.integration import androidx.test.filters.LargeTest import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner import androidx.test.rule.ActivityTestRule -import org.maplibre.android.testapp.activity.maplayout.GLSurfaceRecyclerViewActivity +import org.maplibre.android.testapp.activity.maplayout.SurfaceRecyclerViewActivity import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** - * Regression test that validates if a GLSurfaceView surface can be recreated without crashing. + * Regression test that validates if a SurfaceView surface can be recreated without crashing. */ @RunWith(AndroidJUnit4ClassRunner::class) -class GLSurfaceViewReuseTest : BaseIntegrationTest() { +class SurfaceViewReuseTest : BaseIntegrationTest() { @get:Rule - var activityRule: ActivityTestRule = ActivityTestRule(GLSurfaceRecyclerViewActivity::class.java) + var activityRule: ActivityTestRule = ActivityTestRule(SurfaceRecyclerViewActivity::class.java) @Test @LargeTest diff --git a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml index 85aaf0875fe9..348e3557e2a0 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml @@ -1129,10 +1129,10 @@ android:value=".activity.FeatureOverviewActivity" /> + android:label="@string/activity_recyclerview_surfaceview"> diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/GLSurfaceRecyclerViewActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/SurfaceRecyclerViewActivity.kt similarity index 89% rename from platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/GLSurfaceRecyclerViewActivity.kt rename to platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/SurfaceRecyclerViewActivity.kt index 9a4827ba676e..14e585c290f7 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/GLSurfaceRecyclerViewActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/SurfaceRecyclerViewActivity.kt @@ -9,16 +9,17 @@ import androidx.appcompat.app.AppCompatActivity import org.maplibre.android.maps.MapView import org.maplibre.android.testapp.R import org.maplibre.android.testapp.databinding.ActivityRecyclerviewBinding +import org.maplibre.android.testapp.styles.TestStyles /** - * TestActivity showcasing how to integrate multiple GLSurfaceView MapViews in a RecyclerView. + * TestActivity showcasing how to integrate multiple SurfaceView MapViews in a RecyclerView. *

* It requires calling the correct lifecycle methods when detaching and attaching the View to * the RecyclerView with onViewAttachedToWindow and onViewDetachedFromWindow. *

*/ @SuppressLint("ClickableViewAccessibility") -open class GLSurfaceRecyclerViewActivity : AppCompatActivity() { +open class SurfaceRecyclerViewActivity : AppCompatActivity() { lateinit var binding: ActivityRecyclerviewBinding @@ -46,12 +47,12 @@ open class GLSurfaceRecyclerViewActivity : AppCompatActivity() { return R.layout.item_map_gl } - class ItemAdapter(private val activity: GLSurfaceRecyclerViewActivity, private val inflater: LayoutInflater) : androidx.recyclerview.widget.RecyclerView.Adapter() { + class ItemAdapter(private val activity: SurfaceRecyclerViewActivity, private val inflater: LayoutInflater) : androidx.recyclerview.widget.RecyclerView.Adapter() { private val items: List = listOf( - "one", "two", "three", "four", "five", "seven", "eight", "nine", "ten", + "one", "two", "three", MapItem(TestStyles.DEMOTILES), "four", "five", MapItem(TestStyles.DEMOTILES), "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", - "nineteen", "twenty", "twenty-one" + "nineteen", "twenty", "twenty-one", ) private var mapHolders: MutableList = mutableListOf() diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/TextureRecyclerViewActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/TextureRecyclerViewActivity.kt index 2db941fe1861..6c1d7f467e36 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/TextureRecyclerViewActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/maplayout/TextureRecyclerViewActivity.kt @@ -7,7 +7,7 @@ import org.maplibre.android.testapp.R * TestActivity showcasing how to integrate multiple TexureView MapViews in a RecyclerView. */ @SuppressLint("ClickableViewAccessibility") -class TextureRecyclerViewActivity : GLSurfaceRecyclerViewActivity() { +class TextureRecyclerViewActivity : SurfaceRecyclerViewActivity() { override fun getMapItemLayoutId(): Int { return R.layout.item_map_texture diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml index fcfdcb84277f..cbeab37c0171 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml @@ -95,7 +95,7 @@ Force location updates and don\'t rely on the engine Use LocationComponentActivationOptions to set options Show multiple TextureView MapViews as recyclerView items - Show multiple GLSurfaceView MapViews as recyclerView items + Show multiple SurfaceView MapViews as recyclerView items Show a MapView inside a viewpager inside a recyclerView Show the use PerformanceEvent for performance measurements Use TurfTransformation#circle() to show a Cirlce expressed in physical units diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml index 6a0953d4399f..66121464a7fc 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml @@ -91,7 +91,7 @@ Manual Location updates Build Location Activation RecyclerView TextureView - RecyclerView GLSurfaceView + RecyclerView SurfaceView Nested ViewPager Performance Measurement Physical Unit Circle diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 6ce4bb0ee3b2..d7757e15c120 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -107,6 +107,7 @@ class Context final : public gfx::Context { extension::Debugging* getDebuggingExtension() const { return debugging.get(); } + bool getCleanupOnDestruction() { return cleanupOnDestruction; } void setCleanupOnDestruction(bool cleanup) { cleanupOnDestruction = cleanup; } gfx::UniqueDrawableBuilder createDrawableBuilder(std::string name) override; diff --git a/src/mbgl/gl/resource_pool.cpp b/src/mbgl/gl/resource_pool.cpp index 2de7b8056cfb..e9f8e2ad44ab 100644 --- a/src/mbgl/gl/resource_pool.cpp +++ b/src/mbgl/gl/resource_pool.cpp @@ -74,6 +74,10 @@ Texture2DPool::Texture2DPool(Context* context_, size_t maxPoolStorage_) } Texture2DPool::~Texture2DPool() { + if (!context->getCleanupOnDestruction()) { + return; + } + assert(usedStorage() == 0); assert(unusedStorage() == poolStorage); shrink(); From 7b8f7458ca69299c350b28413ed863545e29b876 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 11 Jun 2025 01:27:09 +0300 Subject: [PATCH 227/339] Add `MapRenderer` dangling reference check (#3541) Co-authored-by: Bart Louwers --- .../src/cpp/android_renderer_frontend.cpp | 41 +++++++++++++------ .../src/cpp/android_renderer_frontend.hpp | 9 ++-- .../MapLibreAndroid/src/cpp/map_renderer.cpp | 12 ++++++ .../MapLibreAndroid/src/cpp/map_renderer.hpp | 1 + .../src/cpp/native_map_view.cpp | 2 +- 5 files changed, 48 insertions(+), 17 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 6ecc42981738..764fac17dc38 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -9,8 +9,10 @@ #include #include #include +#include #include "android_renderer_backend.hpp" +#include "attach_env.hpp" namespace mbgl { namespace android { @@ -91,23 +93,38 @@ class ForwardingRendererObserver : public RendererObserver { ActorRef delegate; }; -AndroidRendererFrontend::AndroidRendererFrontend(Private, MapRenderer& mapRenderer_) - : mapRenderer(mapRenderer_), +AndroidRendererFrontend::AndroidRendererFrontend(Private, + jni::JNIEnv& env, + const jni::Object& mapRendererObj) + : mapRenderer(MapRenderer::getNativePeer(env, mapRendererObj)), mapRunLoop(util::RunLoop::Get()) {} -std::shared_ptr AndroidRendererFrontend::create(MapRenderer& mapRenderer) { - auto ptr = std::make_shared(Private(), mapRenderer); - ptr->init(); +std::shared_ptr AndroidRendererFrontend::create( + jni::JNIEnv& env, const jni::Object& mapRendererObj) { + auto ptr = std::make_shared(Private(), env, mapRendererObj); + ptr->init(env, mapRendererObj); return ptr; } -void AndroidRendererFrontend::init() { - updateAsyncTask = std::make_unique([weakSelf = weak_from_this()]() { - if (auto self = weakSelf.lock()) { - self->mapRenderer.update(std::move(self->updateParams)); - self->mapRenderer.requestRender(); - } - }); +void AndroidRendererFrontend::init(jni::JNIEnv& env, const jni::Object& mapRendererObj) { + auto weakMapRenderer = std::make_shared>>(env, mapRendererObj); + + updateAsyncTask = std::make_unique( + [weakSelf = weak_from_this(), weakMapRenderer = std::move(weakMapRenderer)]() { + if (auto self = weakSelf.lock()) { + try { + android::UniqueEnv _env = android::AttachEnv(); + auto mapRendererRef = weakMapRenderer->get(*_env); + if (mapRendererRef) { + self->mapRenderer.update(std::move(self->updateParams)); + self->mapRenderer.requestRender(*_env, mapRendererRef); + } + } catch (const std::exception& exception) { + Log::Error(Event::Android, + std::string("AndroidRendererFrontend::updateAsyncTask failed: ") + exception.what()); + } + } + }); } AndroidRendererFrontend::~AndroidRendererFrontend() = default; diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp index 3210634fa2d8..60c273815cb4 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp @@ -14,6 +14,8 @@ #include "map_renderer.hpp" +#include + namespace mbgl { class RenderedQueryOptions; @@ -33,10 +35,9 @@ class AndroidRendererFrontend : public RendererFrontend, public std::enable_shar }; public: - AndroidRendererFrontend(Private, MapRenderer&); - - static std::shared_ptr create(MapRenderer&); - void init(); + AndroidRendererFrontend(Private, jni::JNIEnv&, const jni::Object&); + static std::shared_ptr create(jni::JNIEnv&, const jni::Object&); + void init(jni::JNIEnv&, const jni::Object&); ~AndroidRendererFrontend() override; diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index fd75d28287e1..e17874ba1cae 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -138,6 +138,18 @@ void MapRenderer::requestRender() { } } +void MapRenderer::requestRender(JNIEnv& env, jni::Local>& ref) { + try { + static auto& javaClass = jni::Class::Singleton(env); + static auto onInvalidate = javaClass.GetMethod(env, "requestRender"); + if (ref) { + ref.Call(env, onInvalidate); + } + } catch (const std::exception& exception) { + Log::Error(Event::Android, std::string("MapRenderer::requestRender failed: ") + exception.what()); + } +} + void MapRenderer::update(std::shared_ptr params) { try { // Lock on the parameters diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp index 9fc962c0d353..84ed971c4e04 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.hpp @@ -81,6 +81,7 @@ class MapRenderer : public Scheduler { void waitForEmpty(const util::SimpleIdentity tag) override; void requestRender(); + void requestRender(JNIEnv&, jni::Local>&); // Snapshot - requires a RunLoop on the calling thread using SnapshotCallback = std::function; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index c62cad5fff09..e7a48ac3c31f 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -75,7 +75,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, } // Create a renderer frontend - rendererFrontend = AndroidRendererFrontend::create(mapRenderer); + rendererFrontend = AndroidRendererFrontend::create(_env, jMapRenderer); // Create Map options MapOptions options; From fea33716cd110c9ebdaced8468938b43183f7312 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Jun 2025 03:42:17 +0200 Subject: [PATCH 228/339] Release MapLibre Android 11.10.2 (#3542) --- .github/scripts/ensure-tag.sh | 2 +- platform/android/CHANGELOG.md | 12 ++++++++++++ platform/android/VERSION | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/scripts/ensure-tag.sh b/.github/scripts/ensure-tag.sh index 8e1d6ced3cde..47a4240721ef 100755 --- a/.github/scripts/ensure-tag.sh +++ b/.github/scripts/ensure-tag.sh @@ -36,6 +36,6 @@ if git rev-parse "$tag" >/dev/null 2>&1; then fi else git tag -a "$tag" -m "Publish $tag" "$commit_sha" - # git push origin "$tag" + git push origin "$tag" echo "✅ Created tag $tag for commit $commit_sha." fi diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 5cf2d5a29681..39c956329487 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog MapLibre Native for Android +## 11.10.2 + +### 🐞 Bug fixes + +- Fix segfault this-capture GeoJsonSource which may be deleted ([#3536](https://github.com/maplibre/maplibre-native/pull/3536)). +- Add `MapRenderer` dangling reference check ([#3541](https://github.com/maplibre/maplibre-native/pull/3541)). +- Fix incomplete feature state updates in GeometryTile and SourceFeatureState [Vector Tile Layer]. ([#3406](https://github.com/maplibre/maplibre-native/pull/3406)). + +### ✨ Features and improvements + +- Fix recycler view test ([#3537](https://github.com/maplibre/maplibre-native/pull/3537)). + ## 11.10.1 ### 🐞 Bug fixes diff --git a/platform/android/VERSION b/platform/android/VERSION index 46577f54faa8..bd0f144b3bab 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.10.1 +11.10.2 From 7fa809449b3daa27e7ccd4ff9f2b47a55c2e1e8f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Jun 2025 03:59:50 +0200 Subject: [PATCH 229/339] Release MapLibre iOS 6.15.0 (#3543) --- platform/ios/CHANGELOG.md | 14 ++++++++++++++ platform/ios/VERSION | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index c009503372c9..dd57e29c3e51 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,20 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.15.0 + +- Add action journal ([#3409](https://github.com/maplibre/maplibre-native/pull/3409)). Documentation: https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre-native-for-ios/actionjournalexample +- Expose MLNSource.attributionHtmlString ([#3502](https://github.com/maplibre/maplibre-native/pull/3502)). +- Rendering statistics view ([#3322](https://github.com/maplibre/maplibre-native/pull/3322)). Documentation: https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre-native-for-ios/renderingstatisticshud + +- Clean legacy code ([#3469](https://github.com/maplibre/maplibre-native/pull/3469)). +- Rename Symbol SDF shader ([#3473](https://github.com/maplibre/maplibre-native/pull/3473)). +- Clean more legacy code ([#3478](https://github.com/maplibre/maplibre-native/pull/3478)). +- Remove some of unused legacy uniforms ([#3481](https://github.com/maplibre/maplibre-native/pull/3481)). +- Pattern layout performance improvement ([#3495](https://github.com/maplibre/maplibre-native/pull/3495)). +- Improve weak pointer use ([#3510](https://github.com/maplibre/maplibre-native/pull/3510)). +- Fix incomplete feature state updates in GeometryTile and SourceFeatureState [Vector Tile Layer]. ([#3406](https://github.com/maplibre/maplibre-native/pull/3406)). + ## 6.14.0 > [!IMPORTANT] diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 5917993c09da..a3748c562100 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.13.0 +6.15.0 From 1e78e146f1066320f195496ce9f43825f26488b6 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 11 Jun 2025 21:39:25 +0200 Subject: [PATCH 230/339] Use libuv run loop implementation on macOS (#3546) --- CMakePresets.json | 3 ++- docs/mdbook/src/platforms/macos/README.md | 2 +- platform/darwin/darwin.cmake | 25 ++++++++++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 64509e2b1a90..5feb9708ef29 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -29,7 +29,8 @@ "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "MLN_WITH_METAL": "ON", "MLN_WITH_OPENGL": "OFF", - "CMAKE_BUILD_TYPE": "Debug" + "CMAKE_BUILD_TYPE": "Debug", + "MLN_DARWIN_USE_LIBUV": "ON" } }, { diff --git a/docs/mdbook/src/platforms/macos/README.md b/docs/mdbook/src/platforms/macos/README.md index 251f617fd89f..68aae63cde5a 100644 --- a/docs/mdbook/src/platforms/macos/README.md +++ b/docs/mdbook/src/platforms/macos/README.md @@ -25,7 +25,7 @@ git clone --recurse-submodules git@github.com:maplibre/maplibre-native.git Make sure the following Homebrew packages are installed: ```sh -brew install bazelisk webp libuv webp icu4c jpeg-turbo glfw +brew install bazelisk webp libuv webp icu4c jpeg-turbo glfw libuv brew link icu4c --force ``` diff --git a/platform/darwin/darwin.cmake b/platform/darwin/darwin.cmake index 158ed0a35135..de3bab2ceddc 100644 --- a/platform/darwin/darwin.cmake +++ b/platform/darwin/darwin.cmake @@ -12,10 +12,31 @@ target_link_libraries( z ) +if(MLN_DARWIN_USE_LIBUV) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBUV REQUIRED IMPORTED_TARGET libuv) + + target_link_libraries(mbgl-core + PRIVATE + PkgConfig::LIBUV + ) +endif() + target_sources( mbgl-core PRIVATE - ${PROJECT_SOURCE_DIR}/platform/darwin/core/async_task.cpp + $<$: + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/async_task.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/run_loop.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/timer.cpp + > + + $<$>: + ${PROJECT_SOURCE_DIR}/platform/darwin/core/async_task.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/core/run_loop.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/core/timer.cpp + > + ${PROJECT_SOURCE_DIR}/platform/darwin/core/collator.mm ${PROJECT_SOURCE_DIR}/platform/darwin/core/http_file_source.mm ${PROJECT_SOURCE_DIR}/platform/darwin/core/image.mm @@ -24,9 +45,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/darwin/core/native_apple_interface.m ${PROJECT_SOURCE_DIR}/platform/darwin/core/nsthread.mm ${PROJECT_SOURCE_DIR}/platform/darwin/core/number_format.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/core/run_loop.cpp ${PROJECT_SOURCE_DIR}/platform/darwin/core/string_nsstring.mm - ${PROJECT_SOURCE_DIR}/platform/darwin/core/timer.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp From 6e67ebf51dd65b8e2ab0ce3fe899d202ce24fcfc Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Fri, 13 Jun 2025 03:30:52 -0700 Subject: [PATCH 231/339] Fix nullability of attributionHtmlString (#3551) --- platform/darwin/src/MLNTileSource.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/darwin/src/MLNTileSource.h b/platform/darwin/src/MLNTileSource.h index 9528dfa1e537..9ea6b0bcda14 100644 --- a/platform/darwin/src/MLNTileSource.h +++ b/platform/darwin/src/MLNTileSource.h @@ -211,7 +211,7 @@ MLN_EXPORT configuration URL, this is nil until the configuration JSON file is loaded. */ -@property (nonatomic, copy, readonly) NSString *attributionHTMLString; +@property (nonatomic, copy, nullable, readonly) NSString *attributionHTMLString; @end From 248eb04a7c70028e788e67c319e1cb1978ae0c88 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 13 Jun 2025 22:24:52 +0200 Subject: [PATCH 232/339] Revert "Fix segfault this-capture GeoJsonSource which may be deleted" #3536 (#3554) --- platform/android/CHANGELOG.md | 6 ++++ .../style/sources/custom_geometry_source.cpp | 10 +++--- .../src/cpp/style/sources/geojson_source.cpp | 28 ++++++--------- .../src/cpp/style/sources/geojson_source.hpp | 4 +-- .../src/cpp/style/sources/image_source.cpp | 8 ++--- .../cpp/style/sources/raster_dem_source.cpp | 2 +- .../src/cpp/style/sources/raster_source.cpp | 2 +- .../src/cpp/style/sources/source.cpp | 34 +++++++++---------- .../src/cpp/style/sources/source.hpp | 14 ++------ .../src/cpp/style/sources/vector_source.cpp | 4 +-- .../testapp/style/GeoJsonSourceTests.java | 2 ++ platform/android/VERSION | 2 +- 12 files changed, 53 insertions(+), 63 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 39c956329487..b5f65b787c3b 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog MapLibre Native for Android +## 11.10.3 + +### 🐞 Bug fixes + +- Revert fix [#3536](https://github.com/maplibre/maplibre-native/pull/3536) due to `getSource` crashes. + ## 11.10.2 ### 🐞 Bug fixes diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp index 25cdd9798c8b..79b3116efcb8 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/custom_geometry_source.cpp @@ -141,18 +141,18 @@ void CustomGeometrySource::setTileData( // Update the core source if not cancelled if (!isCancelled(z, x, y)) { - getSource().CustomGeometrySource::setTileData(CanonicalTileID(z, x, y), - GeoJSON(geometry)); + source.as()->CustomGeometrySource::setTileData(CanonicalTileID(z, x, y), + GeoJSON(geometry)); } } void CustomGeometrySource::invalidateTile(jni::JNIEnv&, jni::jint z, jni::jint x, jni::jint y) { - getSource().CustomGeometrySource::invalidateTile(CanonicalTileID(z, x, y)); + source.as()->CustomGeometrySource::invalidateTile(CanonicalTileID(z, x, y)); } void CustomGeometrySource::invalidateBounds(jni::JNIEnv& env, const jni::Object& jBounds) { auto bounds = LatLngBounds::getLatLngBounds(env, jBounds); - getSource().CustomGeometrySource::invalidateRegion(bounds); + source.as()->CustomGeometrySource::invalidateRegion(bounds); } jni::Local>> CustomGeometrySource::querySourceFeatures( @@ -162,7 +162,7 @@ jni::Local>> CustomGeometrySource::quer std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(getSource().getID(), {{}, toFilter(env, jfilter)}); + features = rendererFrontend->querySourceFeatures(source.getID(), {{}, toFilter(env, jfilter)}); } return Feature::convert(env, features); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp index cb51a1326d13..bc37a5f5c5fb 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp @@ -50,12 +50,12 @@ GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, cons std::make_unique(jni::Make(env, sourceId), convertGeoJSONOptions(env, options))), converter(std::make_unique>(Scheduler::GetBackground(), - getSource().impl().getOptions())) {} + source.as()->impl().getOptions())) {} GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend* frontend) : Source(env, coreSource, createJavaPeer(env), frontend), converter(std::make_unique>(Scheduler::GetBackground(), - getSource().impl().getOptions())) {} + source.as()->impl().getOptions())) {} GeoJSONSource::~GeoJSONSource() = default; @@ -83,11 +83,11 @@ void GeoJSONSource::setGeometry(jni::JNIEnv& env, const jni::Object().setURL(jni::Make(env, url)); + source.as()->setURL(jni::Make(env, url)); } jni::Local GeoJSONSource::getURL(jni::JNIEnv& env) { - std::optional url = getSource().getURL(); + std::optional url = source.as()->getURL(); return url ? jni::Make(env, *url) : jni::Local(); } @@ -98,7 +98,7 @@ jni::Local>> GeoJSONSource::querySource std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(getSource().getID(), {{}, toFilter(env, jfilter)}); + features = rendererFrontend->querySourceFeatures(source.getID(), {{}, toFilter(env, jfilter)}); } return Feature::convert(env, features); } @@ -112,7 +112,7 @@ jni::Local>> GeoJSONSource::getClusterC mbgl::Feature _feature = Feature::convert(env, feature); _feature.properties["cluster_id"] = static_cast(_feature.properties["cluster_id"].get()); const auto featureExtension = rendererFrontend->queryFeatureExtensions( - getSource().getID(), _feature, "supercluster", "children", {}); + source.getID(), _feature, "supercluster", "children", {}); if (featureExtension.is()) { return Feature::convert(env, featureExtension.get()); } @@ -131,7 +131,7 @@ jni::Local>> GeoJSONSource::getClusterL const std::map options = {{"limit", static_cast(limit)}, {"offset", static_cast(offset)}}; auto featureExtension = rendererFrontend->queryFeatureExtensions( - getSource().getID(), _feature, "supercluster", "leaves", options); + source.getID(), _feature, "supercluster", "leaves", options); if (featureExtension.is()) { return Feature::convert(env, featureExtension.get()); } @@ -148,7 +148,7 @@ jint GeoJSONSource::getClusterExpansionZoom(jni::JNIEnv& env, const jni::Object< mbgl::Feature _feature = Feature::convert(env, feature); _feature.properties["cluster_id"] = static_cast(_feature.properties["cluster_id"].get()); auto featureExtension = rendererFrontend->queryFeatureExtensions( - getSource().getID(), _feature, "supercluster", "expansion-zoom", {}); + source.getID(), _feature, "supercluster", "expansion-zoom", {}); if (featureExtension.is()) { auto value = featureExtension.get(); if (value.is()) { @@ -181,20 +181,12 @@ void GeoJSONSource::setAsync(Update::Converter converterFn) { awaitingUpdate = std::make_unique( std::move(converterFn), std::make_unique>( - *Scheduler::GetCurrent(), - [awaitingUpdateWeak = std::weak_ptr(awaitingUpdate), - sourceWeak = getWeakSource(), - updateWeak = std::weak_ptr(update)](std::shared_ptr geoJSONData) { - auto awaitingUpdate = awaitingUpdateWeak.lock(); - auto source = sourceWeak.lock(); - auto update = updateWeak.lock(); - if (!awaitingUpdate || !source || !update) return; - + *Scheduler::GetCurrent(), [this](std::shared_ptr geoJSONData) { // conversion from Java features to core ones finished android::UniqueEnv _env = android::AttachEnv(); // Update the core source - source->get().as()->setGeoJSONData(std::move(geoJSONData)); + source.as()->setGeoJSONData(std::move(geoJSONData)); // if there is an awaiting update, execute it, otherwise, release resources if (awaitingUpdate) { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp index ac4999bb53e3..6a360484b534 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp @@ -70,8 +70,8 @@ class GeoJSONSource : public Source { jni::Local getURL(jni::JNIEnv&); jni::Local> createJavaPeer(jni::JNIEnv&); - std::shared_ptr awaitingUpdate; - std::shared_ptr update; + std::unique_ptr awaitingUpdate; + std::unique_ptr update; std::shared_ptr threadPool; std::unique_ptr> converter; diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp index f1f6559e4a7b..8d278b318669 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/image_source.cpp @@ -29,20 +29,20 @@ ImageSource::~ImageSource() = default; void ImageSource::setURL(jni::JNIEnv& env, const jni::String& url) { // Update the core source - getSource().ImageSource::setURL(jni::Make(env, url)); + source.as()->ImageSource::setURL(jni::Make(env, url)); } jni::Local ImageSource::getURL(jni::JNIEnv& env) { - std::optional url = getSource().ImageSource::getURL(); + std::optional url = source.as()->ImageSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } void ImageSource::setImage(jni::JNIEnv& env, const jni::Object& bitmap) { - getSource().setImage(Bitmap::GetImage(env, bitmap)); + source.as()->setImage(Bitmap::GetImage(env, bitmap)); } void ImageSource::setCoordinates(jni::JNIEnv& env, const jni::Object& coordinatesObject) { - getSource().setCoordinates(LatLngQuad::getLatLngArray(env, coordinatesObject)); + source.as()->setCoordinates(LatLngQuad::getLatLngArray(env, coordinatesObject)); } jni::Local> ImageSource::createJavaPeer(jni::JNIEnv& env) { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp index 56bad65aa141..107c96a066e3 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_dem_source.cpp @@ -26,7 +26,7 @@ RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, mbgl::style::Source& coreSour RasterDEMSource::~RasterDEMSource() = default; jni::Local RasterDEMSource::getURL(jni::JNIEnv& env) { - auto url = getSource().RasterDEMSource::getURL(); + std::optional url = source.as()->RasterDEMSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp index cba02423784d..d023fca6dcd9 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/raster_source.cpp @@ -25,7 +25,7 @@ RasterSource::RasterSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, An RasterSource::~RasterSource() = default; jni::Local RasterSource::getURL(jni::JNIEnv& env) { - auto url = getSource().RasterSource::getURL(); + std::optional url = source.as()->RasterSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp index af11e2a59e96..ec7026d441be 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.cpp @@ -70,13 +70,13 @@ Source::Source(jni::JNIEnv& env, mbgl::style::Source& coreSource, const jni::Object& obj, AndroidRendererFrontend* frontend) - : source(std::make_shared>(coreSource)), + : source(coreSource), javaPeer(jni::NewGlobal(env, obj)), rendererFrontend(frontend) {} Source::Source(jni::JNIEnv&, std::unique_ptr coreSource) : ownedSource(std::move(coreSource)), - source(std::make_shared>(*ownedSource)) {} + source(*ownedSource) {} Source::~Source() { if (ownedSource) { @@ -102,24 +102,24 @@ Source::~Source() { } jni::Local Source::getId(jni::JNIEnv& env) { - return jni::Make(env, source->get().getID()); + return jni::Make(env, source.getID()); } jni::Local Source::getAttribution(jni::JNIEnv& env) { - auto attribution = source->get().getAttribution(); + auto attribution = source.getAttribution(); return attribution ? jni::Make(env, attribution.value()) : jni::Make(env, ""); } void Source::setPrefetchZoomDelta(jni::JNIEnv& env, jni::Integer& delta) { if (!delta) { - source->get().setPrefetchZoomDelta(std::nullopt); + source.setPrefetchZoomDelta(std::nullopt); } else { - source->get().setPrefetchZoomDelta(jni::Unbox(env, delta)); + source.setPrefetchZoomDelta(jni::Unbox(env, delta)); } } jni::Local Source::getPrefetchZoomDelta(jni::JNIEnv& env) { - auto delta = source->get().getPrefetchZoomDelta(); + auto delta = source.getPrefetchZoomDelta(); if (delta.has_value()) { return jni::Box(env, jni::jint(delta.value())); } @@ -128,14 +128,14 @@ jni::Local Source::getPrefetchZoomDelta(jni::JNIEnv& env) { void Source::setMaxOverscaleFactorForParentTiles(jni::JNIEnv& env, jni::Integer& maxOverscaleFactor) { if (!maxOverscaleFactor) { - source->get().setMaxOverscaleFactorForParentTiles(std::nullopt); + source.setMaxOverscaleFactorForParentTiles(std::nullopt); } else { - source->get().setMaxOverscaleFactorForParentTiles(jni::Unbox(env, maxOverscaleFactor)); + source.setMaxOverscaleFactorForParentTiles(jni::Unbox(env, maxOverscaleFactor)); } } jni::Local Source::getMaxOverscaleFactorForParentTiles(jni::JNIEnv& env) { - auto maxOverscaleFactor = source->get().getMaxOverscaleFactorForParentTiles(); + auto maxOverscaleFactor = source.getMaxOverscaleFactorForParentTiles(); if (maxOverscaleFactor) { return jni::Box(env, jni::jint(*maxOverscaleFactor)); } @@ -151,7 +151,7 @@ void Source::addToStyle(JNIEnv& env, const jni::Object& obj, mbgl::style style.addSource(std::move(ownedSource)); // Add peer to core source - source->get().peer = std::unique_ptr(this); + source.peer = std::unique_ptr(this); // Add strong reference to java source javaPeer = jni::NewGlobal(env, obj); @@ -167,7 +167,7 @@ void Source::addToMap(JNIEnv& env, const jni::Object& obj, mbgl::Map& ma map.getStyle().addSource(std::move(ownedSource)); // Add peer to core source - source->get().peer = std::unique_ptr(this); + source.peer = std::unique_ptr(this); // Add strong reference to java source javaPeer = jni::NewGlobal(env, obj); @@ -182,26 +182,26 @@ bool Source::removeFromMap(JNIEnv&, const jni::Object&, mbgl::Map& map) } // Remove the source from the map and take ownership - ownedSource = map.getStyle().removeSource(source->get().getID()); + ownedSource = map.getStyle().removeSource(source.getID()); // The source may not be removed if any layers still reference it return ownedSource != nullptr; } jni::Local Source::isVolatile(jni::JNIEnv& env) { - return jni::Box(env, jni::jboolean(source->get().isVolatile())); + return jni::Box(env, jni::jboolean(source.isVolatile())); } void Source::setVolatile(JNIEnv& env, jni::Boolean& value) { - source->get().setVolatile(jni::Unbox(env, value)); + source.setVolatile(jni::Unbox(env, value)); } void Source::setMinimumTileUpdateInterval(JNIEnv& env, jni::Long& interval) { - source->get().setMinimumTileUpdateInterval(Milliseconds(jni::Unbox(env, interval))); + source.setMinimumTileUpdateInterval(Milliseconds(jni::Unbox(env, interval))); } jni::Local Source::getMinimumTileUpdateInterval(JNIEnv& env) { - return jni::Box(env, jni::jlong(source->get().getMinimumTileUpdateInterval().count() / 1000000)); + return jni::Box(env, jni::jlong(source.getMinimumTileUpdateInterval().count() / 1000000)); } void Source::releaseJavaPeer() { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp index 8c9243f62971..b7782c3487d7 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/source.hpp @@ -8,7 +8,6 @@ #include "../../android_renderer_frontend.hpp" #include -#include namespace mbgl { namespace android { @@ -64,21 +63,12 @@ class Source : private mbgl::util::noncopyable { jni::Local getMinimumTileUpdateInterval(JNIEnv&); protected: - template - T& getSource() { - return *ownedSource->as(); - } - - std::weak_ptr> getWeakSource() const { return source; } - -private: // Set on newly created sources until added to the map. std::unique_ptr ownedSource; - // Reference that is valid at all times. - std::shared_ptr> source; + // Raw pointer that is valid at all times. + mbgl::style::Source& source; -protected: // Set when the source is added to a map. jni::Global> javaPeer; diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp index e3e77d57c061..01e092f83915 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/vector_source.cpp @@ -31,7 +31,7 @@ VectorSource::VectorSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, An VectorSource::~VectorSource() = default; jni::Local VectorSource::getURL(jni::JNIEnv& env) { - std::optional url = getSource().VectorSource::getURL(); + std::optional url = source.as()->VectorSource::getURL(); return url ? jni::Make(env, *url) : jni::Local(); } @@ -42,7 +42,7 @@ jni::Local>> VectorSource::querySourceF std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(getSource().getID(), + features = rendererFrontend->querySourceFeatures(source.getID(), {toVector(env, jSourceLayerIds), toFilter(env, jfilter)}); } return Feature::convert(env, features); diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java index 04fbfc2a96e8..9f75618c0fec 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java @@ -1,5 +1,6 @@ package org.maplibre.android.testapp.style; +import org.junit.Ignore; import org.maplibre.android.style.sources.CannotAddSourceException; import org.maplibre.geojson.Feature; import org.maplibre.geojson.FeatureCollection; @@ -157,6 +158,7 @@ protected void testFeatureFromResource(final @RawRes int resource) { } @Test + @Ignore("https://github.com/maplibre/maplibre-native/issues/3493") public void testDuplicateSourceDuringAsyncSetGeoJson() { // regression test for segfault when setting GeoJSON contents // for a source that has been deleted diff --git a/platform/android/VERSION b/platform/android/VERSION index bd0f144b3bab..d5b7da553866 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.10.2 +11.10.3 From 1899cde3bd19dac0b88536c55d7a42b7507460ff Mon Sep 17 00:00:00 2001 From: liyanjin <36877356+grab-liyanjin@users.noreply.github.com> Date: Wed, 18 Jun 2025 17:58:39 +0800 Subject: [PATCH 233/339] Improve the logic to let source peers be consistent with C++ peers (#3561) --- .../main/java/org/maplibre/android/maps/Style.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Style.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Style.java index b9864b5ee415..401b94c94057 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Style.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/Style.java @@ -160,8 +160,11 @@ public T getSourceAs(@NonNull String sourceId) { */ public boolean removeSource(@NonNull String sourceId) { validateState("removeSource"); - sources.remove(sourceId); - return nativeMap.removeSource(sourceId); + boolean successful = nativeMap.removeSource(sourceId); + if (successful) { + sources.remove(sourceId); + } + return successful; } /** @@ -172,8 +175,11 @@ public boolean removeSource(@NonNull String sourceId) { */ public boolean removeSource(@NonNull Source source) { validateState("removeSource"); - sources.remove(source.getId()); - return nativeMap.removeSource(source); + boolean successful = nativeMap.removeSource(source); + if (successful) { + sources.remove(source.getId()); + } + return successful; } // From 2e0b464849680a0014ade90b5f6adb7734b0f988 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Mon, 23 Jun 2025 18:36:33 +0200 Subject: [PATCH 234/339] set default move gesture threshold to a small non-zero value (#3573) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- CHANGELOG.md | 2 + .../location/LocationCameraController.java | 3 +- .../android/maps/MapGestureDetector.java | 9 ++- .../src/main/res/values/dimens.xml | 4 + .../location/LocationCameraControllerTest.kt | 76 +++++++------------ 5 files changed, 42 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 683f6f91152d..26a8f6168dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ - [core] Fix memory access violation exception in vector_tile_data.cpp [#632](https://github.com/maplibre/maplibre-native/pull/632) - [iOS] Fix a bug where the compass was determined to be misplaced when hidden [#498](https://github.com/maplibre/maplibre-native/pull/498). - [core] `MaptilerFileSource` renamed to `MBTilesFileSource` [#198](https://github.com/maplibre/maplibre-native/pull/198). +- [android] Fix `OnMoveListener::onMoveBegin` was always called even on a simple tap. [#2792](https://github.com/maplibre/maplibre-native/issues/2792) + In case you rely on the old behavior, call `maplibreMap.getGesturesManager().getMoveGestureDetector().setMoveThreshold(0f)` to restore it ## maps-v1.6.0 diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationCameraController.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationCameraController.java index 4b82ff8d4218..c923308079cf 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationCameraController.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/LocationCameraController.java @@ -314,7 +314,8 @@ private void adjustGesturesThresholds() { if (isLocationTracking()) { moveGestureDetector.setMoveThreshold(options.trackingInitialMoveThreshold()); } else { - moveGestureDetector.setMoveThreshold(0f); + float initialMoveThreshold = initialGesturesManager.getMoveGestureDetector().getMoveThreshold(); + moveGestureDetector.setMoveThreshold(initialMoveThreshold); moveGestureDetector.setMoveThresholdRect(null); } } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapGestureDetector.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapGestureDetector.java index af36ccbd2ef0..4d04e18bd5be 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapGestureDetector.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapGestureDetector.java @@ -169,8 +169,15 @@ private void initializeGesturesManager(@NonNull AndroidGesturesManager androidGe androidGesturesManager.setMutuallyExclusiveGestures(shoveScaleSet, shoveRotateSet, ScaleLongPressSet); } + // If this was 0°, every shove gesture (for tilting the map) would be detected as also a rotate + androidGesturesManager.getRotateGestureDetector().setAngleThreshold(3f); + + // If this was 0 (the default), a simple tap would also be detected as a move. A (very) small + // move threshold solves this issue, while not making the map feel "sticky". (See #2792) + androidGesturesManager.getMoveGestureDetector().setMoveThresholdResource(R.dimen.maplibre_minimum_move_threshold); + gesturesManager = androidGesturesManager; - gesturesManager.getRotateGestureDetector().setAngleThreshold(3f); + } /** diff --git a/platform/android/MapLibreAndroid/src/main/res/values/dimens.xml b/platform/android/MapLibreAndroid/src/main/res/values/dimens.xml index 6252cbf68ce2..11b8aa1eef72 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values/dimens.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values/dimens.xml @@ -24,6 +24,10 @@ 0.29dp + + 4dp + + 25dp 400dp diff --git a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationCameraControllerTest.kt b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationCameraControllerTest.kt index f675f01d1685..bc4dfad78e95 100644 --- a/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationCameraControllerTest.kt +++ b/platform/android/MapLibreAndroid/src/test/java/org/maplibre/android/location/LocationCameraControllerTest.kt @@ -94,7 +94,7 @@ class LocationCameraControllerTest { camera.initializeOptions(options) camera.cameraMode = CameraMode.NONE Mockito.verify(moveGestureDetector, Mockito.times(2)).moveThreshold = - 0f // one for initialization + MOVEMENT_THRESHOLD // one for initialization Mockito.verify(moveGestureDetector, Mockito.times(2)).moveThresholdRect = null // one for initialization } @@ -698,9 +698,7 @@ class LocationCameraControllerTest { @Test fun gesturesManagement_enabled() { val maplibreMap = Mockito.mock(MapLibreMap::class.java) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) + val initialGesturesManager = buildInitialGesturesManager() val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -717,9 +715,7 @@ class LocationCameraControllerTest { @Test fun gesturesManagement_disabled() { val maplibreMap = Mockito.mock(MapLibreMap::class.java) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) + val initialGesturesManager = buildInitialGesturesManager() val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -736,9 +732,7 @@ class LocationCameraControllerTest { @Test fun gesturesManagement_optionNotChangedInitial() { val maplibreMap = Mockito.mock(MapLibreMap::class.java) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) + val initialGesturesManager = buildInitialGesturesManager() val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -756,9 +750,7 @@ class LocationCameraControllerTest { @Test fun gesturesManagement_optionNotChangedInternal() { val maplibreMap = Mockito.mock(MapLibreMap::class.java) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) + val initialGesturesManager = buildInitialGesturesManager() val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -792,7 +784,7 @@ class LocationCameraControllerTest { Mockito.`when`(options.trackingMultiFingerProtectedMoveArea()).thenReturn(multiFingerArea) camera.initializeOptions(options) camera.onMoveListener.onMoveBegin(moveGestureDetector) - Mockito.verify(moveGestureDetector, Mockito.times(2)).moveThreshold = 0f + Mockito.verify(moveGestureDetector, Mockito.times(2)).moveThreshold = MOVEMENT_THRESHOLD Mockito.verify(moveGestureDetector, Mockito.times(2)).moveThresholdRect = null } @@ -876,12 +868,8 @@ class LocationCameraControllerTest { Mockito.verify(moveGestureDetector, Mockito.times(2)).interrupt() // verify that threshold are reset - val moveThresholdCaptor = ArgumentCaptor.forClass( - Float::class.java - ) Mockito.verify(moveGestureDetector, Mockito.atLeastOnce()).moveThreshold = - moveThresholdCaptor.capture() - org.junit.Assert.assertEquals(java.lang.Float.valueOf(0f), moveThresholdCaptor.value) + MOVEMENT_THRESHOLD } @Test @@ -973,18 +961,9 @@ class LocationCameraControllerTest { Mockito.verify(moveGestureDetector, Mockito.times(2)).interrupt() // verify that threshold are reset - val moveThresholdCaptor = ArgumentCaptor.forClass( - Float::class.java - ) Mockito.verify(moveGestureDetector, Mockito.atLeastOnce()).moveThreshold = - moveThresholdCaptor.capture() - org.junit.Assert.assertEquals(java.lang.Float.valueOf(0f), moveThresholdCaptor.value) - val areaCaptor = ArgumentCaptor.forClass( - RectF::class.java - ) - Mockito.verify(moveGestureDetector, Mockito.atLeastOnce()).moveThresholdRect = - areaCaptor.capture() - org.junit.Assert.assertNull(areaCaptor.value) + MOVEMENT_THRESHOLD + Mockito.verify(moveGestureDetector, Mockito.atLeastOnce()).moveThresholdRect = null } @Test @@ -1911,9 +1890,6 @@ class LocationCameraControllerTest { val onCameraMoveInvalidateListener = Mockito.mock( OnCameraMoveInvalidateListener::class.java ) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -1923,7 +1899,7 @@ class LocationCameraControllerTest { moveGestureDetector, onCameraTrackingChangedListener, onCameraMoveInvalidateListener, - initialGesturesManager, + buildInitialGesturesManager(), internalGesturesManager ) } @@ -1955,9 +1931,6 @@ class LocationCameraControllerTest { val onCameraMoveInvalidateListener = Mockito.mock( OnCameraMoveInvalidateListener::class.java ) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -1967,7 +1940,7 @@ class LocationCameraControllerTest { moveGestureDetector, onCameraTrackingChangedListener, onCameraMoveInvalidateListener, - initialGesturesManager, + buildInitialGesturesManager(), internalGesturesManager ) } @@ -1985,9 +1958,6 @@ class LocationCameraControllerTest { val onCameraMoveInvalidateListener = Mockito.mock( OnCameraMoveInvalidateListener::class.java ) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -1997,7 +1967,7 @@ class LocationCameraControllerTest { moveGestureDetector, onCameraTrackingChangedListener, onCameraMoveInvalidateListener, - initialGesturesManager, + buildInitialGesturesManager(), internalGesturesManager ) } @@ -2034,9 +2004,6 @@ class LocationCameraControllerTest { val onCameraMoveInvalidateListener = Mockito.mock( OnCameraMoveInvalidateListener::class.java ) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -2046,7 +2013,7 @@ class LocationCameraControllerTest { moveGestureDetector, onCameraTrackingChangedListener, onCameraMoveInvalidateListener, - initialGesturesManager, + buildInitialGesturesManager(), internalGesturesManager ) } @@ -2066,9 +2033,6 @@ class LocationCameraControllerTest { val onCameraMoveInvalidateListener = Mockito.mock( OnCameraMoveInvalidateListener::class.java ) - val initialGesturesManager = Mockito.mock( - AndroidGesturesManager::class.java - ) val internalGesturesManager = Mockito.mock( AndroidGesturesManager::class.java ) @@ -2078,7 +2042,7 @@ class LocationCameraControllerTest { moveGestureDetector, onCameraTrackingChangedListener, onCameraMoveInvalidateListener, - initialGesturesManager, + buildInitialGesturesManager(), internalGesturesManager ) locationCameraController.setEnabled(true) @@ -2113,6 +2077,18 @@ class LocationCameraControllerTest { ) } + private fun buildInitialGesturesManager(): AndroidGesturesManager { + val moveGestureDetector = Mockito.mock() + // return just "some" value + Mockito.`when`(moveGestureDetector.moveThreshold).thenReturn(MOVEMENT_THRESHOLD) + + val manager = Mockito.mock() + Mockito.`when`(manager.moveGestureDetector).thenReturn(moveGestureDetector) + return manager + } + + private val MOVEMENT_THRESHOLD = 10f + private fun getAnimationListener( @MapLibreAnimator.Type animatorType: Int, holders: Set From bf4b55727d6612f2f54239dba3f6fadb69f6925d Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 23 Jun 2025 19:56:39 +0300 Subject: [PATCH 235/339] Prevent `Style.validateState()` exception on location state updates (#3574) --- .../android/location/SymbolLocationLayerRenderer.java | 4 ++++ .../activity/location/ManualLocationUpdatesActivity.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java index ee193dddf9a1..55ffde4703c7 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/location/SymbolLocationLayerRenderer.java @@ -245,6 +245,10 @@ private void updateForegroundBearing(float bearing) { } private void setLayerVisibility(@NonNull String layerId, boolean visible) { + if (!style.isFullyLoaded()) { + return; + } + Layer layer = style.getLayer(layerId); if (layer != null) { String targetVisibility = visible ? VISIBLE : NONE; diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/location/ManualLocationUpdatesActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/location/ManualLocationUpdatesActivity.kt index ef88bad7df35..5557c3ad72ba 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/location/ManualLocationUpdatesActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/location/ManualLocationUpdatesActivity.kt @@ -30,6 +30,7 @@ class ManualLocationUpdatesActivity : AppCompatActivity(), OnMapReadyCallback { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_location_manual_update) + mapView = findViewById(R.id.mapView) locationEngine = LocationEngineDefault.getDefaultLocationEngine(mapView.context) val fabManualUpdate = findViewById(R.id.fabManualLocationChange) fabManualUpdate.setOnClickListener { v: View? -> @@ -66,7 +67,6 @@ class ManualLocationUpdatesActivity : AppCompatActivity(), OnMapReadyCallback { } } } - mapView = findViewById(R.id.mapView) mapView.onCreate(savedInstanceState) if (PermissionsManager.areLocationPermissionsGranted(this)) { mapView.getMapAsync(this) From 55ff6a442809e60b990d4b24eddda43bdc577e93 Mon Sep 17 00:00:00 2001 From: qqz003 Date: Tue, 24 Jun 2025 09:37:27 +0800 Subject: [PATCH 236/339] Fix the symbol blink issue by only placing the symbol in current level (#3534) Co-authored-by: Xiaolian Qin --- src/mbgl/text/placement.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index fe774da2e7c1..71c2b92bf173 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -276,6 +276,12 @@ JointPlacement Placement::placeSymbol(const SymbolInstance& symbolInstance, cons // a parent tile that _should_ be placed. return kUnplaced; } + + // Place the symbol only at the current level to prevent it from blinking during the transition. + if (ctx.getOverscaledID().overscaledZ != int(placementZoom)) { + return kUnplaced; + } + const SymbolBucket& bucket = ctx.getBucket(); const mat4& posMatrix = ctx.getRenderTile().matrix; const auto& collisionGroup = ctx.collisionGroup; From 282735772b7f7fe59a16dede9ccb1a5d5af3195a Mon Sep 17 00:00:00 2001 From: liyanjin <36877356+grab-liyanjin@users.noreply.github.com> Date: Tue, 24 Jun 2025 20:38:22 +0800 Subject: [PATCH 237/339] Expose sync methods in GeoJsonSource (#3560) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../src/cpp/style/sources/geojson_source.cpp | 39 ++++++++ .../src/cpp/style/sources/geojson_source.hpp | 9 ++ .../android/style/sources/GeoJsonSource.kt | 75 +++++++++++++++ .../testapp/style/GeoJsonSourceTests.java | 94 +++++++++++++++++++ 4 files changed, 217 insertions(+) diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp index bc37a5f5c5fb..4188db872ba4 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.cpp @@ -69,6 +69,16 @@ void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jStrin setAsync(converterFn); } +void GeoJSONSource::setGeoJSONStringSync(jni::JNIEnv& env, const jni::String& jString) { + std::shared_ptr json = std::make_shared(jni::Make(env, jString)); + + Update::Converter converterFn = [this, json](ActorRef _callback) { + converter->self().ask(&FeatureConverter::convertJson, json, _callback).wait(); + }; + + setAsync(converterFn); +} + void GeoJSONSource::setFeatureCollection(jni::JNIEnv& env, const jni::Object& jFeatures) { setCollectionAsync(env, jFeatures); } @@ -81,6 +91,19 @@ void GeoJSONSource::setGeometry(jni::JNIEnv& env, const jni::Object& jFeatures) { + setCollectionSync(env, jFeatures); +} + +void GeoJSONSource::setFeatureSync(jni::JNIEnv& env, const jni::Object& jFeature) { + setCollectionSync(env, jFeature); +} + +void GeoJSONSource::setGeometrySync(jni::JNIEnv& env, const jni::Object& jGeometry) { + setCollectionSync(env, jGeometry); +} + void GeoJSONSource::setURL(jni::JNIEnv& env, const jni::String& url) { // Update the core source source.as()->setURL(jni::Make(env, url)); @@ -207,6 +230,18 @@ void GeoJSONSource::setAsync(Update::Converter converterFn) { update->converterFn(update->callback->self()); } +template +void GeoJSONSource::setCollectionSync(jni::JNIEnv& env, const jni::Object& jObject) { + auto global = jni::NewGlobal(env, jObject); + auto object = std::make_shared(std::move(global)); + + Update::Converter converterFn = [this, object](ActorRef _callback) { + converter->self().ask(&FeatureConverter::convertObject, object, _callback).wait(); + }; + + setAsync(converterFn); +} + void GeoJSONSource::registerNative(jni::JNIEnv& env) { // Lookup the class static auto& javaClass = jni::Class::Singleton(env); @@ -225,6 +260,10 @@ void GeoJSONSource::registerNative(jni::JNIEnv& env) { METHOD(&GeoJSONSource::setFeatureCollection, "nativeSetFeatureCollection"), METHOD(&GeoJSONSource::setFeature, "nativeSetFeature"), METHOD(&GeoJSONSource::setGeometry, "nativeSetGeometry"), + METHOD(&GeoJSONSource::setGeoJSONStringSync, "nativeSetGeoJsonStringSync"), + METHOD(&GeoJSONSource::setFeatureCollectionSync, "nativeSetFeatureCollectionSync"), + METHOD(&GeoJSONSource::setFeatureSync, "nativeSetFeatureSync"), + METHOD(&GeoJSONSource::setGeometrySync, "nativeSetGeometrySync"), METHOD(&GeoJSONSource::setURL, "nativeSetUrl"), METHOD(&GeoJSONSource::getURL, "nativeGetUrl"), METHOD(&GeoJSONSource::querySourceFeatures, "querySourceFeatures"), diff --git a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp index 6a360484b534..6722cb7cb5bd 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/sources/geojson_source.hpp @@ -54,6 +54,12 @@ class GeoJSONSource : public Source { void setFeatureCollection(jni::JNIEnv&, const jni::Object&); void setFeature(jni::JNIEnv&, const jni::Object&); void setGeometry(jni::JNIEnv&, const jni::Object&); + + void setGeoJSONStringSync(jni::JNIEnv&, const jni::String&); + void setFeatureCollectionSync(jni::JNIEnv&, const jni::Object&); + void setFeatureSync(jni::JNIEnv&, const jni::Object&); + void setGeometrySync(jni::JNIEnv&, const jni::Object&); + void setURL(jni::JNIEnv&, const jni::String&); jni::Local>> querySourceFeatures(jni::JNIEnv&, @@ -80,6 +86,9 @@ class GeoJSONSource : public Source { void setAsync(Update::Converter); + template + void setCollectionSync(jni::JNIEnv&, const jni::Object&); + }; // class GeoJSONSource } // namespace android diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonSource.kt b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonSource.kt index 68f2161bb65c..380f37ff18b2 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonSource.kt +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonSource.kt @@ -275,6 +275,55 @@ class GeoJsonSource : Source { } } + + /** + * Updates the GeoJson with a single feature. The update is performed synchronously, + * so the data will be immediately visible and available to query when this method returns. + * + * @param feature the GeoJSON [Feature] to set + */ + fun setGeoJsonSync(feature: Feature?) { + if (detached) { + return + } + checkThread() + nativeSetFeatureSync(feature) + } + + /** + * Updates the GeoJson with a single geometry. The update is performed synchronously, + * so the data will be immediately visible and available to query when this method returns. + * + * @param geometry the GeoJSON [Geometry] to set + */ + fun setGeoJsonSync(geometry: Geometry?) { + if (detached) { + return + } + checkThread() + nativeSetGeometrySync(geometry) + } + + /** + * Updates the GeoJson. The update is performed synchronously, + * so the data will be immediately visible and available to query when this method returns. + * + * @param featureCollection the GeoJSON FeatureCollection + */ + fun setGeoJsonSync(featureCollection: FeatureCollection?) { + if (detached) { + return + } + checkThread() + if (featureCollection != null && featureCollection.features() != null) { + val features = featureCollection.features() + val featuresCopy: List = ArrayList(features) + nativeSetFeatureCollectionSync(FeatureCollection.fromFeatures(featuresCopy)) + } else { + nativeSetFeatureCollectionSync(featureCollection) + } + } + /** * Updates the GeoJson. The update is performed asynchronously, * so the data won't be immediately visible or available to query when this method returns. @@ -289,6 +338,20 @@ class GeoJsonSource : Source { nativeSetGeoJsonString(json) } + /** + * Updates the GeoJson. The update is performed synchronously, + * so the data will be immediately visible and available to query when this method returns. + * + * @param json the raw GeoJson FeatureCollection string + */ + fun setGeoJsonSync(json: String) { + if (detached) { + return + } + checkThread() + nativeSetGeoJsonStringSync(json) + } + /** * Updates the url * @@ -480,6 +543,18 @@ class GeoJsonSource : Source { @Keep private external fun nativeSetGeometry(geometry: Geometry?) + @Keep + private external fun nativeSetGeoJsonStringSync(geoJson: String) + + @Keep + private external fun nativeSetFeatureCollectionSync(geoJson: FeatureCollection?) + + @Keep + private external fun nativeSetFeatureSync(feature: Feature?) + + @Keep + private external fun nativeSetGeometrySync(geometry: Geometry?) + @Keep private external fun querySourceFeatures(filter: Array?): Array diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java index 9f75618c0fec..9de93454cc21 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/style/GeoJsonSourceTests.java @@ -91,6 +91,26 @@ public void testUpdateCoalescing() { }); } + @Test + public void testUpdateCoalescingSync() { + validateTestSetup(); + MapLibreMapAction.invoke(maplibreMap, (uiController, maplibreMap) -> { + GeoJsonSource source = new GeoJsonSource("source"); + maplibreMap.getStyle().addSource(source); + maplibreMap.getStyle().addLayer(new CircleLayer("layer", source.getId())); + + source.setGeoJsonSync(Point.fromLngLat(0, 0)); + source.setGeoJsonSync(Point.fromLngLat(-25, -25)); + source.setGeoJsonSync(ResourceUtils.readRawResource(rule.getActivity(), R.raw.test_feature_properties)); + + source.setGeoJsonSync(Point.fromLngLat(20, 55)); + TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView); + assertEquals(1, maplibreMap.queryRenderedFeatures( + maplibreMap.getProjection().toScreenLocation( + new LatLng(55, 20)), "layer").size()); + }); + } + @Test public void testClearCollectionDuringConversion() { // https://github.com/mapbox/mapbox-gl-native/issues/14565 @@ -157,6 +177,56 @@ protected void testFeatureFromResource(final @RawRes int resource) { }); } + @Test + public void testPointFeatureSync() { + testFeatureFromResourceSync(R.raw.test_point_feature); + } + + @Test + public void testLineStringFeatureSync() { + testFeatureFromResourceSync(R.raw.test_line_string_feature); + } + + @Test + public void testPolygonFeatureSync() { + testFeatureFromResourceSync(R.raw.test_polygon_feature); + } + + @Test + public void testPolygonWithHoleFeatureSync() { + testFeatureFromResourceSync(R.raw.test_polygon_with_hole_feature); + } + + @Test + public void testMultiPointFeatureSync() { + testFeatureFromResourceSync(R.raw.test_multi_point_feature); + } + + @Test + public void testMultiLineStringFeatureSync() { + testFeatureFromResourceSync(R.raw.test_multi_line_string_feature); + } + + @Test + public void testMultiPolygonFeatureSync() { + testFeatureFromResourceSync(R.raw.test_multi_polygon_feature); + } + + protected void testFeatureFromResourceSync(final @RawRes int resource) { + validateTestSetup(); + MapLibreMapAction.invoke(maplibreMap, (uiController, maplibreMap) -> { + GeoJsonSource source = new GeoJsonSource("source"); + maplibreMap.getStyle().addSource(source); + Layer layer = new CircleLayer("layer", source.getId()); + maplibreMap.getStyle().addLayer(layer); + + source.setGeoJsonSync(Feature.fromJson(ResourceUtils.readRawResource(rule.getActivity(), resource))); + + maplibreMap.getStyle().removeLayer(layer); + maplibreMap.getStyle().removeSource(source); + }); + } + @Test @Ignore("https://github.com/maplibre/maplibre-native/issues/3493") public void testDuplicateSourceDuringAsyncSetGeoJson() { @@ -181,6 +251,30 @@ public void testDuplicateSourceDuringAsyncSetGeoJson() { }); } + @Test + @Ignore("https://github.com/maplibre/maplibre-native/issues/3493") + public void testDuplicateSourceDuringSyncSetGeoJson() { + // regression test for segfault when setting GeoJSON contents + // for a source that has been deleted + // https://github.com/maplibre/maplibre-native/issues/3493 + validateTestSetup(); + MapLibreMapAction.invoke(maplibreMap, (uiController, maplibreMap) -> { + String geoJsonString = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[0,0]}}"; + for (int i = 0; i < 1000; i++) { + // Create a GeoJSON source with the same ID each iteration + GeoJsonSource source = new GeoJsonSource("source"); + try { + maplibreMap.getStyle().addSource(source); + } catch (CannotAddSourceException ex) { + // ignore, this is expected + } + + // Schedule a sync update via setGeoJson(String) + source.setGeoJsonSync(geoJsonString); + } + }); + } + public abstract class BaseViewAction implements ViewAction { @Override From 3e62496d802b31e32cd2f44a51222850e656fadb Mon Sep 17 00:00:00 2001 From: yousifd Date: Tue, 24 Jun 2025 16:38:27 +0300 Subject: [PATCH 238/339] add functionality to metal render pass to cache winding order and cull mode (#3566) --- include/mbgl/mtl/render_pass.hpp | 7 +++++++ src/mbgl/mtl/context.cpp | 2 +- src/mbgl/mtl/drawable.cpp | 4 ++-- src/mbgl/mtl/render_pass.cpp | 26 ++++++++++++++++++-------- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/include/mbgl/mtl/render_pass.hpp b/include/mbgl/mtl/render_pass.hpp index d2ffc3e2b1fa..a86788fcd4b7 100644 --- a/include/mbgl/mtl/render_pass.hpp +++ b/include/mbgl/mtl/render_pass.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -56,6 +57,9 @@ class RenderPass final : public gfx::RenderPass { void bindFragment(const BufferResource&, std::size_t offset, std::size_t index, std::size_t size = 0); void unbindFragment(std::size_t index); + void setCullMode(const MTL::CullMode); + void setFrontFacingWinding(const MTL::Winding); + private: void pushDebugGroup(const char* name) override; void popDebugGroup() override; @@ -80,6 +84,9 @@ class RenderPass final : public gfx::RenderPass { std::array fragmentTextureBindings; std::array fragmentSamplerStates; + + MTL::CullMode currentCullMode = MTL::CullModeNone; + MTL::Winding currentWinding = MTL::WindingClockwise; }; } // namespace mtl diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index c2cb732bfcd0..81f13ada1cb1 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -408,7 +408,7 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, uboBuffer->update(tileUBOs.data(), bufferSize, /*offset=*/0); } - encoder->setCullMode(MTL::CullModeNone); + mtlRenderPass.setCullMode(MTL::CullModeNone); mtlRenderPass.bindVertex(vertexRes, /*offset=*/0, ShaderClass::attributes[0].index); diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index a4d2f8fc41fc..0472ed9aff53 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -212,8 +212,8 @@ void Drawable::draw(PaintParameters& parameters) const { } const auto& cullMode = getCullFaceMode(); - encoder->setCullMode(cullMode.enabled ? mapCullMode(cullMode.side) : MTL::CullModeNone); - encoder->setFrontFacingWinding(mapWindingMode(cullMode.winding)); + renderPass.setCullMode(cullMode.enabled ? mapCullMode(cullMode.side) : MTL::CullModeNone); + renderPass.setFrontFacingWinding(mapWindingMode(cullMode.winding)); if (!impl->pipelineState) { impl->pipelineState = shaderMTL.getRenderPipelineState( diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index dd3dd4aa6708..4c8ac237a746 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -62,14 +62,7 @@ void RenderPass::endEncoding() { encoder.reset(); } - currentDepthStencilState.reset(); - currentStencilReferenceValue = 0; - for (int i = 0; i < maxBinds; ++i) { - vertexBinds[i].reset(); - fragmentBinds[i].reset(); - fragmentTextureBindings[i].reset(); - fragmentSamplerStates[i].reset(); - } + resetState(); } void RenderPass::resetState() { @@ -81,6 +74,9 @@ void RenderPass::resetState() { fragmentTextureBindings[i].reset(); fragmentSamplerStates[i].reset(); } + + currentCullMode = MTL::CullModeNone; + currentWinding = MTL::WindingClockwise; } namespace { @@ -197,5 +193,19 @@ void RenderPass::setFragmentSamplerState(const MTLSamplerStatePtr& state, int32_ } } +void RenderPass::setCullMode(const MTL::CullMode mode) { + if (mode != currentCullMode) { + encoder->setCullMode(mode); + currentCullMode = mode; + } +} + +void RenderPass::setFrontFacingWinding(const MTL::Winding winding) { + if (winding != currentWinding) { + encoder->setFrontFacingWinding(winding); + currentWinding = winding; + } +} + } // namespace mtl } // namespace mbgl From f2a6e2cff2af1cfb324a280027da370380abe20b Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Tue, 24 Jun 2025 18:37:23 +0300 Subject: [PATCH 239/339] Fix compilation errors on Benchmark app (#3582) --- platform/ios/benchmark/MBXBenchViewController.mm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/ios/benchmark/MBXBenchViewController.mm b/platform/ios/benchmark/MBXBenchViewController.mm index 1b901616a615..21451a5e6b43 100644 --- a/platform/ios/benchmark/MBXBenchViewController.mm +++ b/platform/ios/benchmark/MBXBenchViewController.mm @@ -26,14 +26,14 @@ - (void)mapDidFinishRenderingFrameFullyRendered:(BOOL)fullyRendered BenchMapObserver(id mapDelegate_) : mapDelegate(mapDelegate_) {} virtual ~BenchMapObserver() = default; - void onDidFinishRenderingFrame(RenderFrameStatus status) override final { - //NSLog(@"Frame encoding time: %4.1f ms", status.frameEncodingTime * 1e3); - //NSLog(@"Frame rendering time: %4.1f ms", status.frameRenderingTime * 1e3); + void onDidFinishRenderingFrame(const RenderFrameStatus& status) override final { + //NSLog(@"Frame encoding time: %4.1f ms", status.renderingStats.encodingTime * 1e3); + //NSLog(@"Frame rendering time: %4.1f ms", status.renderingStats.renderingTime * 1e3); bool fullyRendered = status.mode == mbgl::MapObserver::RenderMode::Full; [mapDelegate mapDidFinishRenderingFrameFullyRendered:fullyRendered - frameEncodingTime:status.frameEncodingTime - frameRenderingTime:status.frameRenderingTime]; + frameEncodingTime:status.renderingStats.encodingTime + frameRenderingTime:status.renderingStats.renderingTime]; } protected: From 32302a4c19acab623d4c75ea5bacc11293695ecc Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Tue, 24 Jun 2025 12:46:08 -0300 Subject: [PATCH 240/339] Windows build fixes and Windows inclusion in core releases (#3581) --- .../scripts/windows-ci_configure_wrapper.ps1 | 16 -- .github/workflows/core-release.yml | 26 +++ .github/workflows/node-ci.yml | 27 ++- .github/workflows/windows-ci.yml | 53 ++--- CMakePresets.json | 80 ++++++++ platform/node/CMakeLists.txt | 2 +- platform/windows/Get-VendorPackages.ps1 | 9 +- .../angle/004-fix-opengl32.dll-load.patch | 13 -- .../vcpkg-custom-ports/angle/portfile.cmake | 194 ------------------ platform/windows/windows.cmake | 58 ++++-- vendor/benchmark.cmake | 5 + 11 files changed, 202 insertions(+), 281 deletions(-) delete mode 100644 .github/scripts/windows-ci_configure_wrapper.ps1 delete mode 100644 platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch delete mode 100644 platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake diff --git a/.github/scripts/windows-ci_configure_wrapper.ps1 b/.github/scripts/windows-ci_configure_wrapper.ps1 deleted file mode 100644 index 27e48588c7f3..000000000000 --- a/.github/scripts/windows-ci_configure_wrapper.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -$compile_flags = @( - '-DCMAKE_POLICY_DEFAULT_CMP0141=NEW', - '-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded', - '-DCMAKE_BUILD_TYPE=RelWithDebInfo' -) - -switch ($env:RENDERER) -{ - 'opengl' { $compile_flags += '-DMLN_WITH_OPENGL=ON'; break; } - 'egl' { $compile_flags += '-DMLN_WITH_EGL=ON' ; break; } - 'vulkan' { $compile_flags += @('-DMLN_WITH_VULKAN=ON', '-DMLN_WITH_OPENGL=OFF'); break; } -} - -Write-Host 'Compile flags: ' $compile_flags - -& cmake -B build -G Ninja $($compile_flags) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index 169c74d1b582..b5c60e265017 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -88,3 +88,29 @@ jobs: run: gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a env: GH_TOKEN: ${{ github.token }} + + build-windows: + needs: [create-release] + runs-on: windows-2022 + strategy: + matrix: + renderer: [opengl, egl, vulkan] + steps: + - run: | + git config --system core.longpaths true + + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Build mbgl-core for Windows + run: | + cmake --preset windows-${{ matrix.renderer }}-core -DCMAKE_CXX_COMPILER_LAUNCHER="" + cmake --build --preset windows-${{ matrix.renderer }}-core + + - name: Rename artifact + run: Copy-Item build-windows-${{ matrix.renderer }}/mbgl-core.lib maplibre-native-core-windows-x64-${{ matrix.renderer }}.lib + + - name: Upload Windows artifact + run: gh release upload core-${{ github.sha }} maplibre-native-core-windows-x64-${{ matrix.renderer }}.lib + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 0f50fafc834d..4337867b5fd6 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -209,27 +209,26 @@ jobs: -DCMAKE_C_COMPILER=gcc-12 \ -DMLN_WITH_NODE=ON - - name: "Create directory '${{ github.workspace }}/platform/windows/vendor/vcpkg/bincache' (Windows)" + - name: Get vcpkg commit id if: runner.os == 'Windows' - run: mkdir -p ${{ github.workspace }}/platform/windows/vendor/vcpkg/bincache - shell: bash + shell: pwsh + run: | + $vcpkg_commit_id = ($(git submodule status .\platform\windows\vendor\vcpkg).Trim() -split ' ')[0] + Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_COMMIT_ID=${vcpkg_commit_id}" - - name: Restore vcpkg cache (Windows) + - name: Restore vcpkg binary cache if: runner.os == 'Windows' - uses: actions/cache@v4 + uses: actions/cache/restore@v4 with: - path: | - ${{ github.workspace }}/platform/windows/vendor/vcpkg - !${{ github.workspace }}/platform/windows/vendor/vcpkg/buildtrees - !${{ github.workspace }}/platform/windows/vendor/vcpkg/packages - !${{ github.workspace }}/platform/windows/vendor/vcpkg/downloads - !${{ github.workspace }}/platform/windows/vendor/vcpkg/installed - key: | - ${{ matrix.runs-on }}-${{ env.BUILDTYPE }}-${{ github.job }}-${{ hashFiles( '.git/modules/platform/windows/vendor/vcpkg/HEAD' ) }}-${{ hashFiles( 'platform/windows/Get-VendorPackages.ps1' ) }} + path: ${{ github.workspace }}\platform\windows\vendor\vcpkg\archives + key: vcpkg-${{ env.VCPKG_COMMIT_ID }} - name: Configure maplibre-native (Windows) if: runner.os == 'Windows' shell: pwsh + env: + VCPKG_INSTALL_OPTIONS: "--debug" + VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}\\platform\\windows\\vendor\\vcpkg\\archives,readwrite" run: | cmake . -B build ` -G Ninja ` @@ -279,7 +278,7 @@ jobs: LIBGL_ALWAYS_SOFTWARE: true GALLIUM_DRIVER: llvmpipe run: | - (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-(release|devel)-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } + (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-release-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } & 'C:\Program Files\7-Zip\7z.exe' e -olib\node-v131 .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll npm test diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 3885dda0a0e3..bb9282b6eee5 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -62,11 +62,13 @@ jobs: - uses: actions/checkout@v4 with: - submodules: recursive + sparse-checkout: | + platform/windows/vendor + platform/windows/Get-VendorPackages.ps1 - name: Get vcpkg commit id run: | - $vcpkg_commit_id = ($(git submodule status .\platform\windows\vendor\vcpkg).Trim() -split ' ')[0] + $vcpkg_commit_id = (Invoke-WebRequest ${{ github.api_url }}/repos/${{ github.repository }}/contents/platform/windows/vendor/vcpkg?ref=${{ github.ref }} -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json).sha Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_COMMIT_ID=${vcpkg_commit_id}" - name: Restore vcpkg binary cache @@ -77,6 +79,12 @@ jobs: key: vcpkg-${{ env.VCPKG_COMMIT_ID }} lookup-only: true + - name: Initialize vcpkg submodule + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + run: | + git submodule sync --recursive + git submodule update --init --force --depth=1 --recursive platform/windows/vendor/vcpkg + - uses: ilammy/msvc-dev-cmd@v1 if: steps.vcpkg-cache.outputs.cache-hit != 'true' @@ -84,11 +92,10 @@ jobs: if: steps.vcpkg-cache.outputs.cache-hit != 'true' env: CI: 1, -# VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}\\platform\\windows\\vendor\\vcpkg\\archives,readwrite" timeout-minutes: 60 run: | - & ${{ github.workspace }}\platform\windows\Get-VendorPackages.ps1 -Triplet ${{ env.VSCMD_ARG_TGT_ARCH }}-windows -Renderer All + & ${{ github.workspace }}\platform\windows\Get-VendorPackages.ps1 -Triplet ${{ env.VSCMD_ARG_TGT_ARCH }}-windows -Renderer All -With-ICU - name: Save vcpkg binary cache if: steps.vcpkg-cache.outputs.cache-hit != 'true' @@ -99,7 +106,6 @@ jobs: windows-build-and-test: -# if: needs.pre-job.outputs.should_skip != 'true' needs: windows-get-or-build-dependencies strategy: matrix: @@ -142,19 +148,17 @@ jobs: env: CI: 1 VCPKG_INSTALL_OPTIONS: "--debug" -# VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}\\platform\\windows\\vendor\\vcpkg\\archives,readwrite" CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" - RENDERER: "${{ matrix.renderer }}" timeout-minutes: 60 run: | cmake --version - & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 + cmake --preset windows-${{ matrix.renderer }} -DCMAKE_POLICY_DEFAULT_CMP0141=NEW -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded -DCMAKE_BUILD_TYPE=RelWithDebInfo - name: Build MapLibre Native Core run: | - cmake --build build --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner + cmake --build build-windows-${{ matrix.renderer }} --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner # CodeQL @@ -165,43 +169,42 @@ jobs: - name: Download Mesa3D run: | - (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-(release|devel)-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } + (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-release-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } - name: Extract Mesa3D files for OpenGL if: matrix.renderer != 'vulkan' run: | - & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll - - - name: Extract Mesa3D files for EGL - if: matrix.renderer == 'egl' - run: | - & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\d3d10warp.dll + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} .\mesa3d.7z x64\libgallium_wgl.dll x64\libGLESv2.dll - name: Extract Mesa3D files for Vulkan if: matrix.renderer == 'vulkan' run: | - & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll # unit tests - name: Configure Mesa3D drivers (OpenGL) if: matrix.renderer != 'vulkan' run: | + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v DLL /t REG_SZ /d ('{0}\build-windows-${{ matrix.renderer }}\libgallium_wgl.dll' -f $PWD.Path) /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v DriverVersion /t REG_DWORD /d 1 /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v Flags /t REG_DWORD /d 1 /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v Version /t REG_DWORD /d 2 /f Add-Content -Path $env:GITHUB_ENV -Value 'GALLIUM_DRIVER=llvmpipe' - name: Configure Mesa3D drivers (Vulkan) if: matrix.renderer == 'vulkan' run: | - reg add 'HKLM\Software\Khronos\Vulkan\Drivers' /f /v '${{ github.workspace }}\build\lvp_icd.x86_64.json' /t REG_DWORD /d 0 + reg add 'HKLM\Software\Khronos\Vulkan\Drivers' /f /v '${{ github.workspace }}\build-windows-${{ matrix.renderer }}\lvp_icd.x86_64.json' /t REG_DWORD /d 0 - name: Download and configure Vulkan if: matrix.renderer == 'vulkan' - # 1.4.313.1 doesn't have runtime components? - # $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows run: | - $version = "1.4.313.0" + # 1.4.313.1 doesn't have runtime components? + # $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows + $version = '1.4.313.0' Invoke-WebRequest https://sdk.lunarg.com/sdk/download/$version/windows/VulkanRT-X64-$version-Components.zip -OutFile VulkanRT.zip - & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild -r .\VulkanRT.zip *x64\vulkan-1.* + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} -r .\VulkanRT.zip *x64\vulkan-1.* - name: Run C++ tests continue-on-error: ${{ matrix.renderer == 'vulkan' }} @@ -209,7 +212,7 @@ jobs: ANGLE_DEFAULT_PLATFORM: 'gl' GALLIUM_DRIVER: llvmpipe LIBGL_ALWAYS_SOFTWARE: true - run: build/mbgl-test-runner.exe + run: build-windows-${{ matrix.renderer }}/mbgl-test-runner.exe # render tests @@ -220,7 +223,7 @@ jobs: ANGLE_DEFAULT_PLATFORM: 'gl' GALLIUM_DRIVER: llvmpipe LIBGL_ALWAYS_SOFTWARE: true - run: build/mbgl-render-test-runner.exe "--manifestPath=metrics/windows-${env:manifest_file}.json" + run: build-windows-${{ matrix.renderer }}/mbgl-render-test-runner.exe "--manifestPath=metrics/windows-${env:manifest_file}.json" - name: Upload render test result if: always() && steps.render_test.outcome == 'failure' @@ -233,7 +236,7 @@ jobs: # expression tests - name: Run expression test - run: build/expression-test/mbgl-expression-test.exe + run: build-windows-${{ matrix.renderer }}/expression-test/mbgl-expression-test.exe windows-ci-result: name: Windows CI Result diff --git a/CMakePresets.json b/CMakePresets.json index 5feb9708ef29..768fcdf0101d 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -129,6 +129,71 @@ "MLN_CORE_INCLUDE_DEPS": "ON", "MLN_USE_BUILTIN_ICU": "ON" } + }, + { + "name": "windows", + "hidden": true, + "generator": "Ninja", + "cacheVariables": { + "CMAKE_SYSTEM_NAME": "Windows", + "MLN_WITH_OPENGL": "OFF", + "MLN_WITH_EGL": "OFF", + "MLN_WITH_VULKAN": "OFF", + "CMAKE_BUILD_TYPE": "RelWithDebInfo" + } + }, + { + "name": "windows-opengl", + "binaryDir": "${sourceDir}/build-windows-opengl", + "generator": "Ninja", + "inherits": "windows", + "cacheVariables": { + "MLN_WITH_OPENGL": "ON" + } + }, + { + "name": "windows-opengl-core", + "inherits": "windows-opengl", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_USE_BUILTIN_ICU": "ON" + } + }, + { + "name": "windows-egl", + "binaryDir": "${sourceDir}/build-windows-egl", + "generator": "Ninja", + "inherits": "windows", + "cacheVariables": { + "MLN_WITH_OPENGL": "ON", + "MLN_WITH_EGL": "ON" + } + }, + { + "name": "windows-egl-core", + "inherits": "windows-egl", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_USE_BUILTIN_ICU": "ON" + } + }, + { + "name": "windows-vulkan", + "binaryDir": "${sourceDir}/build-windows-vulkan", + "inherits": "windows", + "cacheVariables": { + "MLN_WITH_OPENGL": "OFF", + "MLN_WITH_EGL": "OFF", + "MLN_WITH_VULKAN": "ON" + } + }, + { + "name": "windows-vulkan-core", + "inherits": "windows-vulkan", + "cacheVariables": { + "MLN_CORE_INCLUDE_DEPS": "ON", + "MLN_USE_BUILTIN_ICU": "ON" + } } ], "buildPresets": [ @@ -146,6 +211,21 @@ "name": "linux-vulkan-core", "configurePreset": "linux-vulkan", "targets": ["mbgl-core"] + }, + { + "name": "windows-opengl-core", + "configurePreset": "windows-opengl", + "targets": ["mbgl-core"] + }, + { + "name": "windows-egl-core", + "configurePreset": "windows-egl", + "targets": ["mbgl-core"] + }, + { + "name": "windows-vulkan-core", + "configurePreset": "windows-vulkan", + "targets": ["mbgl-core"] } ] } diff --git a/platform/node/CMakeLists.txt b/platform/node/CMakeLists.txt index b53a17fa5eb6..3774b3678f98 100644 --- a/platform/node/CMakeLists.txt +++ b/platform/node/CMakeLists.txt @@ -1,5 +1,5 @@ set(NODE_MODULE_MINIMUM_ABI 83) # Minimum supported Node.js version: 14 -set(NODE_MODULE_CACHE_DIR ${CMAKE_SOURCE_DIR}/build/headers) +set(NODE_MODULE_CACHE_DIR ${CMAKE_BINARY_DIR}/headers) include(${CMAKE_CURRENT_LIST_DIR}/cmake/module.cmake) diff --git a/platform/windows/Get-VendorPackages.ps1 b/platform/windows/Get-VendorPackages.ps1 index b64ce4e2e663..5874a32f1b17 100644 --- a/platform/windows/Get-VendorPackages.ps1 +++ b/platform/windows/Get-VendorPackages.ps1 @@ -1,12 +1,11 @@ param( [Parameter(Mandatory=$true)][string]$Triplet, - [Parameter(Mandatory=$true)][string]$Renderer + [Parameter(Mandatory=$true)][string]$Renderer, + [Parameter(Mandatory=$false)][switch]${With-ICU} ) Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent) -Copy-Item ('{0}\*' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-ports')) -Force -Recurse -Destination ('{0}\ports\' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg')) - $vcpkg_temp_dir = '***' foreach($letter in [byte][char]'Z'..[byte][char]'A') @@ -40,8 +39,8 @@ if(-not (Test-Path ('{0}\vcpkg.exe' -f $vcpkg_temp_dir))) ('--overlay-triplets={0}' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-triplets')), ('--triplet={0}' -f $Triplet), '--clean-after-build', - 'install', 'curl', 'dlfcn-win32', 'glfw3', 'icu', 'libuv', 'libjpeg-turbo', 'libpng', 'libwebp' - ) + $renderer_packages + 'install', 'curl', 'dlfcn-win32', 'glfw3', 'libuv', 'libjpeg-turbo', 'libpng', 'libwebp' + ) + $renderer_packages + $(if(${With-ICU}) {@('icu')} else {@()}) ) subst $vcpkg_temp_dir /D diff --git a/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch b/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch deleted file mode 100644 index 88b5d64804ec..000000000000 --- a/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp -index b83b8971a6..a2c24cdb31 100644 ---- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp -+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp -@@ -128,7 +128,7 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display) - { - mDisplayAttributes = display->getAttributeMap(); - -- mOpenGLModule = LoadLibraryExA("opengl32.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); -+ mOpenGLModule = LoadLibraryExA("opengl32.dll", NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); - if (!mOpenGLModule) - { - return egl::EglNotInitialized() << "Failed to load OpenGL library."; diff --git a/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake b/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake deleted file mode 100644 index 0354308a2fef..000000000000 --- a/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake +++ /dev/null @@ -1,194 +0,0 @@ -if (VCPKG_TARGET_IS_LINUX) - message(WARNING "Building with a gcc version less than 6.1 is not supported.") - message(WARNING "${PORT} currently requires the following libraries from the system package manager:\n libx11-dev\n mesa-common-dev\n libxi-dev\n libxext-dev\n\nThese can be installed on Ubuntu systems via apt-get install libx11-dev mesa-common-dev libxi-dev libxext-dev.") -endif() - -if (VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") - set(ANGLE_CPU_BITNESS ANGLE_IS_32_BIT_CPU) -elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") - set(ANGLE_CPU_BITNESS ANGLE_IS_64_BIT_CPU) -elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "arm") - set(ANGLE_CPU_BITNESS ANGLE_IS_32_BIT_CPU) -elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") - set(ANGLE_CPU_BITNESS ANGLE_IS_64_BIT_CPU) -else() - message(FATAL_ERROR "Unsupported architecture: ${VCPKG_TARGET_ARCHITECTURE}") -endif() - -set(ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW "OFF") -if (VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_UWP) - set(ANGLE_BUILDSYSTEM_PORT "Win") - if (NOT VCPKG_TARGET_IS_MINGW) - set(ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW "ON") - endif() -elseif (VCPKG_TARGET_IS_OSX) - set(ANGLE_BUILDSYSTEM_PORT "Mac") -elseif (VCPKG_TARGET_IS_LINUX) - set(ANGLE_BUILDSYSTEM_PORT "Linux") -else() - # default other platforms to "Linux" config - set(ANGLE_BUILDSYSTEM_PORT "Linux") -endif() - -# chromium/5414 -set(ANGLE_COMMIT aa63ea230e0c507e7b4b164a30e502fb17168c17) -set(ANGLE_VERSION 5414) -set(ANGLE_SHA512 a3b55d4b484e1e9ece515d60af1d47a80a0576b198d9a2397e4e68b16efd83468dcdfadc98dae57ff17f01d02d74526f8b59fdf00661b70a45b6dd266e5ffe38) -set(ANGLE_THIRDPARTY_ZLIB_COMMIT 44d9b490c721abdb923d5c6c23ac211e45ffb1a5) - -vcpkg_from_github( - OUT_SOURCE_PATH SOURCE_PATH - REPO google/angle - REF ${ANGLE_COMMIT} - SHA512 ${ANGLE_SHA512} - # On update check headers against opengl-registry - PATCHES - 001-fix-uwp.patch - 002-fix-builder-error.patch - 003-fix-mingw.patch - 004-fix-opengl32.dll-load.patch -) - -# Generate angle_commit.h -set(ANGLE_COMMIT_HASH_SIZE 12) -string(SUBSTRING "${ANGLE_COMMIT}" 0 ${ANGLE_COMMIT_HASH_SIZE} ANGLE_COMMIT_HASH) -set(ANGLE_COMMIT_DATE "invalid-date") -set(ANGLE_REVISION "${ANGLE_VERSION}") -configure_file("${CMAKE_CURRENT_LIST_DIR}/angle_commit.h.in" "${SOURCE_PATH}/angle_commit.h" @ONLY) -configure_file("${CMAKE_CURRENT_LIST_DIR}/angle_commit.h.in" "${SOURCE_PATH}/src/common/angle_commit.h" @ONLY) -file(COPY "${CMAKE_CURRENT_LIST_DIR}/unofficial-angle-config.cmake" DESTINATION "${SOURCE_PATH}") - -set(ANGLE_WEBKIT_BUILDSYSTEM_COMMIT "bb1da00b9ba878d228a5e9834a0767dbca2fee43") - -# Download WebKit gni-to-cmake.py conversion script -vcpkg_download_distfile(GNI_TO_CMAKE_PY - URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/ThirdParty/ANGLE/gni-to-cmake.py" - FILENAME "gni-to-cmake.py" - SHA512 9da35caf2db2e849d6cc85721ba0b77eee06b6f65a7c5314fb80483db4949b0b6e9bf4b2d4fc63613665629b24e9b052e03fb1451b09313d881297771a4f2736 -) - -# Generate CMake files from GN / GNI files -vcpkg_find_acquire_program(PYTHON3) - -set(_root_gni_files_to_convert - "compiler.gni Compiler.cmake" - "libGLESv2.gni GLESv2.cmake" -) -set(_renderer_gn_files_to_convert - "libANGLE/renderer/d3d/BUILD.gn D3D.cmake" - "libANGLE/renderer/gl/BUILD.gn GL.cmake" - "libANGLE/renderer/metal/BUILD.gn Metal.cmake" -) - -foreach(_root_gni_file IN LISTS _root_gni_files_to_convert) - separate_arguments(_file_values UNIX_COMMAND "${_root_gni_file}") - list(GET _file_values 0 _src_gn_file) - list(GET _file_values 1 _dst_file) - vcpkg_execute_required_process( - COMMAND "${PYTHON3}" "${GNI_TO_CMAKE_PY}" "src/${_src_gn_file}" "${_dst_file}" - WORKING_DIRECTORY "${SOURCE_PATH}" - LOGNAME "gni-to-cmake-${_dst_file}-${TARGET_TRIPLET}" - ) -endforeach() - -foreach(_renderer_gn_file IN LISTS _renderer_gn_files_to_convert) - separate_arguments(_file_values UNIX_COMMAND "${_renderer_gn_file}") - list(GET _file_values 0 _src_gn_file) - list(GET _file_values 1 _dst_file) - get_filename_component(_src_dir "${_src_gn_file}" DIRECTORY) - vcpkg_execute_required_process( - COMMAND "${PYTHON3}" "${GNI_TO_CMAKE_PY}" "src/${_src_gn_file}" "${_dst_file}" --prepend "src/${_src_dir}/" - WORKING_DIRECTORY "${SOURCE_PATH}" - LOGNAME "gni-to-cmake-${_dst_file}-${TARGET_TRIPLET}" - ) -endforeach() - -# Fetch additional CMake files from WebKit ANGLE buildsystem -vcpkg_download_distfile(WK_ANGLE_INCLUDE_CMAKELISTS - URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/ThirdParty/ANGLE/include/CMakeLists.txt" - FILENAME "include_CMakeLists.txt" - SHA512 a7ddf3c6df7565e232f87ec651cc4fd84240b8866609e23e3e6e41d22532fd34c70e0f3b06120fd3d6d930ca29c1d0d470d4c8cb7003a66f8c1a840a42f32949 -) -configure_file("${WK_ANGLE_INCLUDE_CMAKELISTS}" "${SOURCE_PATH}/include/CMakeLists.txt" COPYONLY) - -vcpkg_download_distfile(WK_ANGLE_CMAKE_WEBKITCOMPILERFLAGS - URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/WebKitCompilerFlags.cmake" - FILENAME "WebKitCompilerFlags.cmake" - SHA512 63f981694ae37d4c4ca4c34e2bf62b4d4602b6a1a660851304fa7a6ee834fc58fa6730eeb41ef4e075550f3c8b675823d4d00bdcd72ca869c6d5ab11196b33bb -) -file(COPY "${WK_ANGLE_CMAKE_WEBKITCOMPILERFLAGS}" DESTINATION "${SOURCE_PATH}/cmake") - -vcpkg_download_distfile(WK_ANGLE_CMAKE_DETECTSSE2 - URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/DetectSSE2.cmake" - FILENAME "DetectSSE2.cmake" - SHA512 219a4c8591ee31d11eb3d1e4803cc3c9d4573984bb25ecac6f2c76e6a3dab598c00b0157d0f94b18016de6786e49d8b29a161693a5ce23d761c8fe6a798c1bca -) -file(COPY "${WK_ANGLE_CMAKE_DETECTSSE2}" DESTINATION "${SOURCE_PATH}/cmake") - -vcpkg_download_distfile(WK_ANGLE_CMAKE_WEBKITMACROS - URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/WebKitMacros.cmake" - FILENAME "WebKitMacros.cmake" - SHA512 0d126b1d1b0ca995c2ea6e51c73326db363f560f3f07912ce58c7c022d9257d27b963dac56aee0e9604ca7a3d74c5aa9f0451c243fec922fb485dd2253685ab6 -) -file(COPY "${WK_ANGLE_CMAKE_WEBKITMACROS}" DESTINATION "${SOURCE_PATH}/cmake") - -# Copy additional custom CMake buildsystem into appropriate folders -file(GLOB MAIN_BUILDSYSTEM "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/CMakeLists.txt" "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/*.cmake") -file(COPY ${MAIN_BUILDSYSTEM} DESTINATION "${SOURCE_PATH}") -file(GLOB MODULES "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/cmake/*.cmake") -file(COPY ${MODULES} DESTINATION "${SOURCE_PATH}/cmake") - -function(checkout_in_path PATH URL REF) - if(EXISTS "${PATH}") - return() - endif() - - vcpkg_from_git( - OUT_SOURCE_PATH DEP_SOURCE_PATH - URL "${URL}" - REF "${REF}" - ) - file(RENAME "${DEP_SOURCE_PATH}" "${PATH}") - file(REMOVE_RECURSE "${DEP_SOURCE_PATH}") -endfunction() - -checkout_in_path( - "${SOURCE_PATH}/third_party/zlib" - "https://chromium.googlesource.com/chromium/src/third_party/zlib" - "${ANGLE_THIRDPARTY_ZLIB_COMMIT}" -) - -vcpkg_cmake_configure( - SOURCE_PATH "${SOURCE_PATH}" - OPTIONS_DEBUG -DDISABLE_INSTALL_HEADERS=1 - OPTIONS - "-D${ANGLE_CPU_BITNESS}=1" - "-DPORT=${ANGLE_BUILDSYSTEM_PORT}" - "-DANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW=${ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW}" - "-DVCPKG_TARGET_IS_WINDOWS=${VCPKG_TARGET_IS_WINDOWS}" -) - -vcpkg_cmake_install() - -vcpkg_cmake_config_fixup(CONFIG_PATH share/unofficial-angle PACKAGE_NAME unofficial-angle) - -vcpkg_copy_pdbs() - -file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) - -file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") -# Remove empty directories inside include directory -file(GLOB directory_children RELATIVE "${CURRENT_PACKAGES_DIR}/include" "${CURRENT_PACKAGES_DIR}/include/*") -foreach(directory_child ${directory_children}) - if(IS_DIRECTORY "${CURRENT_PACKAGES_DIR}/include/${directory_child}") - file(GLOB_RECURSE subdirectory_children "${CURRENT_PACKAGES_DIR}/include/${directory_child}/*") - if("${subdirectory_children}" STREQUAL "") - file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/${directory_child}") - endif() - endif() -endforeach() -unset(subdirectory_children) -unset(directory_child) -unset(directory_children) - -file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") diff --git a/platform/windows/windows.cmake b/platform/windows/windows.cmake index 94a302c0856f..d44ebb73b8b8 100644 --- a/platform/windows/windows.cmake +++ b/platform/windows/windows.cmake @@ -6,7 +6,11 @@ else() set(_RENDERER OpenGL) endif() -execute_process(COMMAND powershell -ExecutionPolicy Bypass -File ${CMAKE_CURRENT_LIST_DIR}/Get-VendorPackages.ps1 -Triplet ${VCPKG_TARGET_TRIPLET} -Renderer ${_RENDERER}) +if(NOT MLN_USE_BUILTIN_ICU) + set(WITH_ICU -With-ICU) +endif() + +execute_process(COMMAND powershell -ExecutionPolicy Bypass -File ${CMAKE_CURRENT_LIST_DIR}/Get-VendorPackages.ps1 -Triplet ${VCPKG_TARGET_TRIPLET} -Renderer ${_RENDERER} ${WITH_ICU}) unset(_RENDERER) add_compile_definitions(NOMINMAX GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE) @@ -130,6 +134,15 @@ else() ) endif() +if (DEFINED ENV{CI}) + message("Building for CI") + target_compile_definitions( + mbgl-core + PRIVATE + CI_BUILD=1 + ) +endif() + # FIXME: Should not be needed, but now needed by node because of the headless frontend. target_include_directories( mbgl-core @@ -146,8 +159,8 @@ target_include_directories( include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) -if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0) - message(STATUS "ICU not found or too old, using builtin.") +if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) + message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requestd, using builtin.") set(MLN_USE_BUILTIN_ICU TRUE) include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) @@ -158,6 +171,19 @@ if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0) COMPILE_DEFINITIONS MBGL_USE_BUILTIN_ICU ) + + target_compile_definitions( + mbgl-vendor-icu + PRIVATE + U_STATIC_IMPLEMENTATION + ) + + target_include_directories( + mbgl-core + BEFORE + PRIVATE + ${PROJECT_SOURCE_DIR}/vendor/icu/include + ) endif() target_link_libraries( @@ -168,10 +194,10 @@ target_link_libraries( ${LIBUV_LIBRARIES} ${WEBP_LIBRARIES} dlfcn-win32::dl - $<$>:ICU::data> $<$>:ICU::i18n> $<$>:ICU::uc> - $<$:mbgl-vendor-icu> + $<$>:ICU::data> + $<$:$,$,mbgl-vendor-icu>> PNG::PNG mbgl-vendor-nunicode mbgl-vendor-sqlite @@ -179,7 +205,9 @@ target_link_libraries( add_subdirectory(${PROJECT_SOURCE_DIR}/bin) add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) -add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +if(MLN_WITH_GLFW) + add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +endif() if(MLN_WITH_NODE) add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node) endif() @@ -191,9 +219,19 @@ add_executable( target_compile_definitions( mbgl-test-runner - PRIVATE MBGL_BUILDING_LIB WORK_DIRECTORY=${PROJECT_SOURCE_DIR} + PRIVATE + MBGL_BUILDING_LIB + WORK_DIRECTORY=${PROJECT_SOURCE_DIR} ) +if (DEFINED ENV{CI}) + target_compile_definitions( + mbgl-test-runner + PRIVATE + CI_BUILD=1 + ) +endif() + target_include_directories( mbgl-test-runner PRIVATE @@ -219,7 +257,6 @@ target_link_libraries( mbgl-compiler-options $ $,libuv::uv_a,libuv::uv> - shlwapi ) add_executable( @@ -227,11 +264,6 @@ add_executable( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/render-test/main.cpp ) -target_compile_definitions( - mbgl-render-test-runner - PRIVATE MBGL_BUILDING_LIB -) - target_link_libraries( mbgl-render-test-runner PRIVATE diff --git a/vendor/benchmark.cmake b/vendor/benchmark.cmake index 87d80c458b69..427254d65d21 100644 --- a/vendor/benchmark.cmake +++ b/vendor/benchmark.cmake @@ -35,6 +35,11 @@ if(WIN32) mbgl-vendor-benchmark PUBLIC BENCHMARK_STATIC_DEFINE ) + + target_link_libraries( + mbgl-vendor-benchmark + PRIVATE shlwapi + ) endif() target_include_directories( From aaaf55a5491e31131e33060fbfd83f47cabcec70 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 24 Jun 2025 19:15:40 +0300 Subject: [PATCH 241/339] Add polylines with geographic coordinates (#3547) Co-authored-by: Bart Louwers --- .../style/layers/custom_drawable_layer.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/mbgl/style/layers/custom_drawable_layer.cpp b/src/mbgl/style/layers/custom_drawable_layer.cpp index 04e49879cd98..07810146a4dd 100644 --- a/src/mbgl/style/layers/custom_drawable_layer.cpp +++ b/src/mbgl/style/layers/custom_drawable_layer.cpp @@ -519,8 +519,23 @@ util::SimpleIdentity CustomDrawableLayerHost::Interface::addPolyline(const LineS switch (shaderType) { case LineShaderType::Classic: { - // TODO: build classic polyline with Geo coordinates - return util::SimpleIdentity::Empty; + // build classic polyline with Geo coordinates + if (!updateBuilder(BuilderType::LineClassic, "custom-lines", lineShaderDefault())) { + return util::SimpleIdentity::Empty; + } + + // geographic coordinates require tile {0, 0, 0} + setTileID({0, 0, 0}); + + constexpr int32_t zoom = 0; + GeometryCoordinates tileCoordinates; + for (const auto& coord : coordinates) { + const auto point = Projection::project(LatLng(coord.y, coord.x), zoom); + tileCoordinates.push_back(Point(static_cast(point.x * mbgl::util::EXTENT), + static_cast(point.y * mbgl::util::EXTENT))); + } + + builder->addPolyline(tileCoordinates, lineOptions.geometry); } break; case LineShaderType::WideVector: { From 8a5d5a5287d59f35bed57cc7d9d977b9979bf18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Tue, 24 Jun 2025 18:19:03 +0200 Subject: [PATCH 242/339] Increase the high-end GCC version in qt-ci (#3488) --- .github/workflows/qt-ci.yml | 8 ++++---- include/mbgl/util/image.hpp | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index ed17886263f0..cded63c78d55 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -59,18 +59,18 @@ jobs: strategy: matrix: include: - - name: Linux + - name: Linux_GCC11 os: ubuntu-24.04 build_type: RelWithDebInfo qt_version: 6.8.1 qt_target: desktop compiler: "" - - name: Linux_GCC13 + - name: Linux_GCC14 os: ubuntu-24.04 build_type: RelWithDebInfo qt_version: 6.8.1 qt_target: desktop - compiler: "gcc-13" + compiler: "gcc-14" - name: macOS os: macos-14 build_type: RelWithDebInfo @@ -128,7 +128,7 @@ jobs: libegl1 \ fonts-noto-cjk - - name: Install compiler + - name: Install compiler (Linux) id: install_compiler if: runner.os == 'Linux' && matrix.compiler != '' uses: rlalik/setup-cpp-compiler@master diff --git a/include/mbgl/util/image.hpp b/include/mbgl/util/image.hpp index dc8254749870..fad8b7ee022a 100644 --- a/include/mbgl/util/image.hpp +++ b/include/mbgl/util/image.hpp @@ -88,11 +88,15 @@ class Image : private util::noncopyable { return; } Image newImage(size_); - if (valid()) { + if (!size_.isEmpty() && valid()) { assert(bytes()); // gcc12 bug newImage.fill(0); + copy(*this, + newImage, + {0, 0}, + {0, 0}, + {std::min(size.width, size_.width), std::min(size.height, size_.height)}); } - copy(*this, newImage, {0, 0}, {0, 0}, {std::min(size.width, size_.width), std::min(size.height, size_.height)}); operator=(std::move(newImage)); } From db6fb9134cdb5975fdfb6977e89324f8bc4d3a16 Mon Sep 17 00:00:00 2001 From: Michael Schmitz Date: Tue, 24 Jun 2025 19:12:11 +0200 Subject: [PATCH 243/339] add bounds to rendering cli (#3435) --- bin/render.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/bin/render.cpp b/bin/render.cpp index 6520f7baff1a..396742cff8ce 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -29,10 +29,17 @@ int main(int argc, char* argv[]) { args::ValueFlag pixelRatioValue(argumentParser, "number", "Image scale factor", {'r', "ratio"}); - args::ValueFlag zoomValue(argumentParser, "number", "Zoom level", {'z', "zoom"}); + // grouping ensures either bounds or center based position is used + args::Group boundsOrCenterZoom(argumentParser, "Position (either one):", args::Group::Validators::AtMostOne); + + args::NargsValueFlag boundsValue( + boundsOrCenterZoom, "degrees: north west south east", "Bounds of rendered map", {"bounds"}, 4); + + args::Group centerGroup(boundsOrCenterZoom, "Center:", args::Group::Validators::AtLeastOne); + args::ValueFlag zoomValue(centerGroup, "number", "Zoom level", {'z', "zoom"}); + args::ValueFlag lonValue(centerGroup, "degrees", "Longitude", {'x', "lon"}); + args::ValueFlag latValue(centerGroup, "degrees", "Latitude", {'y', "lat"}); - args::ValueFlag lonValue(argumentParser, "degrees", "Longitude", {'x', "lon"}); - args::ValueFlag latValue(argumentParser, "degrees", "Latitude", {'y', "lat"}); args::ValueFlag bearingValue(argumentParser, "degrees", "Bearing", {'b', "bearing"}); args::ValueFlag pitchValue(argumentParser, "degrees", "Pitch", {'p', "pitch"}); args::ValueFlag widthValue(argumentParser, "pixels", "Image width", {'w', "width"}); @@ -108,7 +115,13 @@ int main(int argc, char* argv[]) { } map.getStyle().loadURL(style); - map.jumpTo(CameraOptions().withCenter(LatLng{lat, lon}).withZoom(zoom).withBearing(bearing).withPitch(pitch)); + std::vector bounds = args::get(boundsValue); + if (bounds.size() == 4) { + LatLngBounds boundingBox = LatLngBounds::hull(LatLng(bounds[0], bounds[1]), LatLng(bounds[2], bounds[3])); + map.jumpTo(map.cameraForLatLngBounds(boundingBox, EdgeInsets(), bearing, pitch)); + } else { + map.jumpTo(CameraOptions().withCenter(LatLng{lat, lon}).withZoom(zoom).withBearing(bearing).withPitch(pitch)); + } if (debug) { map.setDebug(debug ? mbgl::MapDebugOptions::TileBorders | mbgl::MapDebugOptions::ParseStatus From 753b7ae79563a1d5da27135d0f496fdce6aeb651 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 25 Jun 2025 12:10:07 +0000 Subject: [PATCH 244/339] Bump version MapLibre Gestures Android (#3583) --- platform/android/CHANGELOG.md | 14 ++++++++++++++ platform/android/VERSION | 2 +- platform/android/gradle/libs.versions.toml | 7 +------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index b5f65b787c3b..f90e252c58f8 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog MapLibre Native for Android +## 11.11.0 + +### ✨ Features and improvements + +- Improve the logic to let source peers be consistent with C++ peers ([#3561](https://github.com/maplibre/maplibre-native/pull/3561)). +- set default move gesture threshold to a small non-zero value ([#3573](https://github.com/maplibre/maplibre-native/pull/3573)). +- Bump version of MapLibre Gestures Android to 0.0.4 ([#3583](https://github.com/maplibre/maplibre-native/pull/3583)). +- Expose sync methods in GeoJsonSource ([#3560](https://github.com/maplibre/maplibre-native/pull/3560)). + +### 🐞 Bug fixes + +- Prevent `Style.validateState()` exception on location state updates ([#3574](https://github.com/maplibre/maplibre-native/pull/3574)). +- Fix the symbol blink issue by only placing the symbol in current level ([#3534](https://github.com/maplibre/maplibre-native/pull/3534)). + ## 11.10.3 ### 🐞 Bug fixes diff --git a/platform/android/VERSION b/platform/android/VERSION index d5b7da553866..4b8f587696e7 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.10.3 +11.11.0 diff --git a/platform/android/gradle/libs.versions.toml b/platform/android/gradle/libs.versions.toml index 026c6f7bed9b..9f1b79c5c9c4 100644 --- a/platform/android/gradle/libs.versions.toml +++ b/platform/android/gradle/libs.versions.toml @@ -1,6 +1,5 @@ [versions] mapLibreServices = "6.0.1" -appCompat = "1.7.0" constraintLayout = "2.1.4" interpolator = "1.0.0" recyclerView = "1.3.2" @@ -26,10 +25,6 @@ commonsIO = "2.16.1" assertj = "3.26.3" gradleNexus = "2.0.0" multidex = "2.0.1" - -androidxTestExtJUnit = "1.1.5" -androidxTestCoreKtx = "1.5.0" -kotlinxSerializationJson = "1.6.0" kotlinxCoroutines = { strictly = "[1.0, 2.0[" } androidGradlePlugin = "8.6.0" @@ -39,7 +34,7 @@ kotlinxCoroutinesCore = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-cor kotlinxCoroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinxCoroutinesAndroid = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } maplibreJavaGeoJSON = { group = "org.maplibre.gl", name = "android-sdk-geojson", version.ref = "mapLibreServices" } -maplibreGestures = { group = "org.maplibre.gl", name = "maplibre-android-gestures", version = "0.0.3" } +maplibreGestures = { group = "org.maplibre.gl", name = "maplibre-android-gestures", version = "0.0.4" } maplibreJavaTurf = { group = "org.maplibre.gl", name = "android-sdk-turf", version.ref = "mapLibreServices" } junit = { group = "junit", name = "junit", version.ref = "junit" } From 779b89346816b804af78eeae88933ca130858328 Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Wed, 25 Jun 2025 16:09:11 -0400 Subject: [PATCH 245/339] Reduce duplicate GPU buffer uploads (#3577) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- include/mbgl/mtl/render_pass.hpp | 5 +++++ src/mbgl/mtl/buffer_resource.cpp | 11 +++++++++-- src/mbgl/mtl/drawable.cpp | 2 +- src/mbgl/mtl/render_pass.cpp | 9 +++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/mbgl/mtl/render_pass.hpp b/include/mbgl/mtl/render_pass.hpp index a86788fcd4b7..c7a94821b183 100644 --- a/include/mbgl/mtl/render_pass.hpp +++ b/include/mbgl/mtl/render_pass.hpp @@ -41,6 +41,9 @@ class RenderPass final : public gfx::RenderPass { /// Set the sampler for a texture binding void setFragmentSamplerState(const MTLSamplerStatePtr&, int32_t location); + /// Set the render pipeline state + void setRenderPipelineState(const MTLRenderPipelineStatePtr&); + void endEncoding(); /// Resets the states and bindings of the render pass to deal @@ -69,6 +72,8 @@ class RenderPass final : public gfx::RenderPass { mtl::CommandEncoder& commandEncoder; MTLRenderCommandEncoderPtr encoder; MTLDepthStencilStatePtr currentDepthStencilState; + MTLRenderPipelineStatePtr currentPipelineState; + int32_t currentStencilReferenceValue = 0; std::vector> debugGroups; diff --git a/src/mbgl/mtl/buffer_resource.cpp b/src/mbgl/mtl/buffer_resource.cpp index a2d2db61eb3f..ab2f75174529 100644 --- a/src/mbgl/mtl/buffer_resource.cpp +++ b/src/mbgl/mtl/buffer_resource.cpp @@ -103,15 +103,22 @@ void BufferResource::update(const void* newData, std::size_t updateSize, std::si // Until we can be sure that the buffer is not still in use to render the // previous frame, replace it with a new buffer instead of updating it. - auto& device = context.getBackend().getDevice(); const uint8_t* newBufferSource = nullptr; std::unique_ptr tempBuffer; + const bool updateIsEntireBuffer = (offset == 0 && updateSize == size); + + // If the entire buffer is being updated, make sure it's changed + if (updateIsEntireBuffer) { + if (memcmp(buffer->contents(), newData, updateSize) == 0) { + return; + } + } + auto& device = context.getBackend().getDevice(); // `[MTLBuffer contents]` may involve memory mapping and/or synchronization. If the entire // buffer is being replaced, avoid accessing the old one by creating the new buffer directly // from the given data. If it's just being updated, apply the update to a local buffer to // avoid needing to access the new buffer. - const bool updateIsEntireBuffer = (offset == 0 && updateSize == size); if (updateIsEntireBuffer) { newBufferSource = static_cast(newData); } else { diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index 0472ed9aff53..f41d84d5c8c2 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -223,7 +223,7 @@ void Drawable::draw(PaintParameters& parameters) const { mbgl::util::hash(getColorMode().hash(), impl->vertexDescHash)); } if (impl->pipelineState) { - encoder->setRenderPipelineState(impl->pipelineState.get()); + renderPass.setRenderPipelineState(impl->pipelineState); } else { assert(!"Failed to create render pipeline state"); return; diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index 4c8ac237a746..d053016a9356 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -66,6 +66,7 @@ void RenderPass::endEncoding() { } void RenderPass::resetState() { + currentPipelineState.reset(); currentDepthStencilState.reset(); currentStencilReferenceValue = 0; for (int i = 0; i < maxBinds; ++i) { @@ -193,6 +194,14 @@ void RenderPass::setFragmentSamplerState(const MTLSamplerStatePtr& state, int32_ } } +/// Set the render pipeline state +void RenderPass::setRenderPipelineState(const MTLRenderPipelineStatePtr& pipelineState) { + if (pipelineState != currentPipelineState) { + currentPipelineState = pipelineState; + encoder->setRenderPipelineState(currentPipelineState.get()); + } +} + void RenderPass::setCullMode(const MTL::CullMode mode) { if (mode != currentCullMode) { encoder->setCullMode(mode); From 5171f6b966f3c373a7e0fcfc0085201452265d06 Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Thu, 26 Jun 2025 00:27:32 -0400 Subject: [PATCH 246/339] Add run-time plug-in layer support to iOS (#3430) --- BUILD.bazel | 7 +- CMakeLists.txt | 13 + bazel/core.bzl | 16 + include/mbgl/layermanager/layer_manager.hpp | 9 + include/mbgl/style/layer.hpp | 4 + platform/BUILD.bazel | 4 + platform/darwin/BUILD.bazel | 6 + platform/darwin/app/PluginLayerExample.h | 9 + platform/darwin/app/PluginLayerExample.mm | 30 + .../app/PluginLayerExampleMetalRendering.h | 17 + .../app/PluginLayerExampleMetalRendering.mm | 233 ++ platform/darwin/app/PluginLayerTestStyle.json | 2124 +++++++++++++++++ platform/darwin/bazel/files.bzl | 7 + platform/darwin/darwin.cmake | 2 + platform/darwin/src/MLNMapOptions.h | 5 + platform/darwin/src/MLNMapOptions.mm | 1 + platform/darwin/src/MLNPluginLayer.h | 109 + platform/darwin/src/MLNPluginLayer.mm | 80 + platform/darwin/src/MLNPluginStyleLayer.h | 13 + platform/darwin/src/MLNPluginStyleLayer.mm | 35 + .../darwin/src/MLNPluginStyleLayer_Private.h | 25 + platform/darwin/src/MLNStyleLayerManager.h | 17 +- platform/darwin/src/MLNStyleLayerManager.mm | 5 +- .../src/mbgl/layermanager/layer_manager.cpp | 15 +- platform/ios/BUILD.bazel | 1 + platform/ios/MapLibre.docc/MapLibre.md | 1 + platform/ios/MapLibre.docc/PluginLayers.md | 148 ++ platform/ios/app/MBXViewController.mm | 25 + platform/ios/bazel/files.bzl | 2 +- platform/ios/src/MLNMapView.h | 6 + platform/ios/src/MLNMapView.mm | 159 ++ src/mbgl/layermanager/layer_manager.cpp | 2 + src/mbgl/plugin/plugin_layer.cpp | 84 + src/mbgl/plugin/plugin_layer.hpp | 45 + src/mbgl/plugin/plugin_layer_factory.cpp | 188 ++ src/mbgl/plugin/plugin_layer_factory.hpp | 45 + src/mbgl/plugin/plugin_layer_impl.cpp | 99 + src/mbgl/plugin/plugin_layer_impl.hpp | 122 + src/mbgl/plugin/plugin_layer_properties.cpp | 22 + src/mbgl/plugin/plugin_layer_properties.hpp | 21 + src/mbgl/plugin/plugin_layer_render.cpp | 199 ++ src/mbgl/plugin/plugin_layer_render.hpp | 72 + src/mbgl/style/layer.cpp | 8 + test/CMakeLists.txt | 1 + test/plugin/plugin.test.cpp | 236 ++ 45 files changed, 4259 insertions(+), 13 deletions(-) create mode 100644 platform/darwin/app/PluginLayerExample.h create mode 100644 platform/darwin/app/PluginLayerExample.mm create mode 100644 platform/darwin/app/PluginLayerExampleMetalRendering.h create mode 100644 platform/darwin/app/PluginLayerExampleMetalRendering.mm create mode 100644 platform/darwin/app/PluginLayerTestStyle.json create mode 100644 platform/darwin/src/MLNPluginLayer.h create mode 100644 platform/darwin/src/MLNPluginLayer.mm create mode 100644 platform/darwin/src/MLNPluginStyleLayer.h create mode 100644 platform/darwin/src/MLNPluginStyleLayer.mm create mode 100644 platform/darwin/src/MLNPluginStyleLayer_Private.h create mode 100644 platform/ios/MapLibre.docc/PluginLayers.md create mode 100644 src/mbgl/plugin/plugin_layer.cpp create mode 100644 src/mbgl/plugin/plugin_layer.hpp create mode 100644 src/mbgl/plugin/plugin_layer_factory.cpp create mode 100644 src/mbgl/plugin/plugin_layer_factory.hpp create mode 100644 src/mbgl/plugin/plugin_layer_impl.cpp create mode 100644 src/mbgl/plugin/plugin_layer_impl.hpp create mode 100644 src/mbgl/plugin/plugin_layer_properties.cpp create mode 100644 src/mbgl/plugin/plugin_layer_properties.hpp create mode 100644 src/mbgl/plugin/plugin_layer_render.cpp create mode 100644 src/mbgl/plugin/plugin_layer_render.hpp create mode 100644 test/plugin/plugin.test.cpp diff --git a/BUILD.bazel b/BUILD.bazel index 8ec90d818947..ab6d783cf37e 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -4,6 +4,8 @@ load("@npm//:defs.bzl", "npm_link_all_packages") load("@rules_cc//cc:defs.bzl", "cc_library") load( "//bazel:core.bzl", + "MLN_LAYER_PLUGIN_HEADERS", + "MLN_LAYER_PLUGIN_SOURCE", "MLN_CORE_HEADERS", "MLN_CORE_SOURCE", "MLN_DRAWABLES_GL_HEADERS", @@ -76,14 +78,15 @@ cc_library( # the prefix from the path. cc_library( name = "mbgl-core", - srcs = MLN_CORE_SOURCE + + srcs = MLN_LAYER_PLUGIN_SOURCE + + MLN_CORE_SOURCE + MLN_GENERATED_SHADER_SOURCE + MLN_GENERATED_STYLE_SOURCE + select({ ":drawable_renderer": MLN_OPENGL_SOURCE + MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_GL_SOURCE, ":metal_renderer": MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_MTL_SOURCE, "//conditions:default": [], }), - hdrs = MLN_CORE_HEADERS + select({ + hdrs = MLN_LAYER_PLUGIN_HEADERS + MLN_CORE_HEADERS + select({ ":drawable_renderer": MLN_OPENGL_HEADERS + MLN_DRAWABLES_HEADERS + MLN_DRAWABLES_GL_HEADERS, ":metal_renderer": MLN_DRAWABLES_HEADERS + MLN_DRAWABLES_MTL_HEADERS, "//conditions:default": [], diff --git a/CMakeLists.txt b/CMakeLists.txt index adfbadd6cd0c..eafae983ad03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -966,6 +966,19 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/util/version.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/work_request.cpp ) +list(APPEND SRC_FILES + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_render.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_properties.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_render.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_properties.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/plugin/plugin_layer_factory.cpp +) + if(MLN_WITH_OPENGL) message(STATUS "Configuring GL-Native with OpenGL renderer backend") diff --git a/bazel/core.bzl b/bazel/core.bzl index 479b9484178b..b27bbd8d925b 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -1,3 +1,19 @@ +MLN_LAYER_PLUGIN_HEADERS = [ + "src/mbgl/plugin/plugin_layer.hpp", + "src/mbgl/plugin/plugin_layer_factory.hpp", + "src/mbgl/plugin/plugin_layer_impl.hpp", + "src/mbgl/plugin/plugin_layer_render.hpp", + "src/mbgl/plugin/plugin_layer_properties.hpp", +] + +MLN_LAYER_PLUGIN_SOURCE = [ + "src/mbgl/plugin/plugin_layer.cpp", + "src/mbgl/plugin/plugin_layer_factory.cpp", + "src/mbgl/plugin/plugin_layer_impl.cpp", + "src/mbgl/plugin/plugin_layer_render.cpp", + "src/mbgl/plugin/plugin_layer_properties.cpp", +] + MLN_PUBLIC_GENERATED_STYLE_HEADERS = [ "include/mbgl/style/layers/circle_layer.hpp", "include/mbgl/style/layers/fill_layer.hpp", diff --git a/include/mbgl/layermanager/layer_manager.hpp b/include/mbgl/layermanager/layer_manager.hpp index fb7b980312e0..f3bd94e6a489 100644 --- a/include/mbgl/layermanager/layer_manager.hpp +++ b/include/mbgl/layermanager/layer_manager.hpp @@ -67,6 +67,15 @@ class LayerManager { */ static const bool annotationsEnabled; + /** + * Enables a layer type for JSON style only. + * + * We might not want to expose runtime API for some layer types + * in order to save binary size (the corresponding SDK layer wrappers + * should be excluded from the project build). + */ + virtual void addLayerTypeCoreOnly(std::unique_ptr); + protected: virtual ~LayerManager() = default; virtual LayerFactory* getFactory(const std::string& type) noexcept = 0; diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp index af75b755a63f..36e8db1748b1 100644 --- a/include/mbgl/style/layer.hpp +++ b/include/mbgl/style/layer.hpp @@ -90,6 +90,10 @@ struct LayerTypeInfo { } tileKind; }; +// Added this to support plugins and that their LayerTypeInfo isn't the same point +// across the board +bool layerTypeInfoEquals(const mbgl::style::LayerTypeInfo* one, const mbgl::style::LayerTypeInfo* other); + /** * The runtime representation of a [layer](https://maplibre.org/maplibre-style-spec/#layers) * from the MapLibre Style Spec. diff --git a/platform/BUILD.bazel b/platform/BUILD.bazel index 3841ca31eef7..f39d31d1ee8e 100644 --- a/platform/BUILD.bazel +++ b/platform/BUILD.bazel @@ -266,6 +266,10 @@ objc_library( objc_library( name = "iosapp", srcs = [ + "//platform/darwin:app/PluginLayerExample.h", + "//platform/darwin:app/PluginLayerExample.mm", + "//platform/darwin:app/PluginLayerExampleMetalRendering.h", + "//platform/darwin:app/PluginLayerExampleMetalRendering.mm", "//platform/darwin:app/CustomStyleLayerExample.h", "//platform/darwin:app/CustomStyleLayerExample.m", "//platform/ios:ios_app_srcs", diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index 6948b827b9e4..dcc0a8bcbac4 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -174,6 +174,7 @@ swift_library( data = [ "test/amsterdam.geojson", "test/one-liner.json", + "app/PluginLayerTestStyle.json", ], visibility = [ "//platform/ios/test:__pkg__", @@ -297,6 +298,11 @@ objc_library( exports_files( [ + "app/PluginLayerTestStyle.json", + "app/PluginLayerExample.h", + "app/PluginLayerExample.mm", + "app/PluginLayerExampleMetalRendering.h", + "app/PluginLayerExampleMetalRendering.mm", "test/amsterdam.geojson", "test/MLNSDKTestHelpers.swift", "app/CustomStyleLayerExample.h", diff --git a/platform/darwin/app/PluginLayerExample.h b/platform/darwin/app/PluginLayerExample.h new file mode 100644 index 000000000000..858ba15a9c0a --- /dev/null +++ b/platform/darwin/app/PluginLayerExample.h @@ -0,0 +1,9 @@ +#import +#import "MLNPluginLayer.h" +NS_ASSUME_NONNULL_BEGIN + +@interface PluginLayerExample : MLNPluginLayer + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/app/PluginLayerExample.mm b/platform/darwin/app/PluginLayerExample.mm new file mode 100644 index 000000000000..0cb01054d155 --- /dev/null +++ b/platform/darwin/app/PluginLayerExample.mm @@ -0,0 +1,30 @@ +#import "PluginLayerExample.h" + +@implementation PluginLayerExample + + +// This is the layer type in the style that is used ++(MLNPluginLayerCapabilities *)layerCapabilities { + + MLNPluginLayerCapabilities *tempResult = [[MLNPluginLayerCapabilities alloc] init]; + tempResult.layerID = @"plugin-layer-test"; + tempResult.requiresPass3D = YES; + return tempResult; + +} + +// The overrides +-(void)onRenderLayer { + NSLog(@"PluginLayerExample: On Render Layer"); + +} + +-(void)onUpdateLayer { + +} + +-(void)onUpdateLayerProperties:(NSDictionary *)layerProperties { + // NSLog(@"Layer Properties: %@", layerProperties); +} + +@end diff --git a/platform/darwin/app/PluginLayerExampleMetalRendering.h b/platform/darwin/app/PluginLayerExampleMetalRendering.h new file mode 100644 index 000000000000..9ff1455a70ce --- /dev/null +++ b/platform/darwin/app/PluginLayerExampleMetalRendering.h @@ -0,0 +1,17 @@ +/* + PluginLayerExampleMetalRendering + + This is a port lf the CustomStyleLayerExample into the plug-in architecture. It assumes + that the rendering is being done in metal since it's added to the core via a darwin method + + */ + +#import "MLNPluginLayer.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface PluginLayerExampleMetalRendering : MLNPluginLayer + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/app/PluginLayerExampleMetalRendering.mm b/platform/darwin/app/PluginLayerExampleMetalRendering.mm new file mode 100644 index 000000000000..1fe951e14324 --- /dev/null +++ b/platform/darwin/app/PluginLayerExampleMetalRendering.mm @@ -0,0 +1,233 @@ +/* + PluginLayerExampleMetalRendering + + This is a port lf the CustomStyleLayerExample into the plug-in architecture. It assumes + that the rendering is being done in metal since it's added to the core via a darwin method + + */ + +#import "PluginLayerExampleMetalRendering.h" +#import +#import "Mapbox.h" + +typedef struct +{ + vector_float2 position; + vector_float4 color; +} Vertex; + +@interface PluginLayerExampleMetalRendering () { + // The render pipeline state + id _pipelineState; + id _depthStencilStateWithoutStencil; + + // Properties + float _offsetX; + float _offsetY; + float _scale; + float _r, _g, _b, _a; + + +} + +@end + + +@implementation PluginLayerExampleMetalRendering + + +// This is a static class method that is used by the MLNMapView to create the +// required marshalling classes to interface with the MapLibre core. ++(MLNPluginLayerCapabilities *)layerCapabilities { + + MLNPluginLayerCapabilities *tempResult = [[MLNPluginLayerCapabilities alloc] init]; + tempResult.layerID = @"plugin-layer-metal-rendering"; + tempResult.requiresPass3D = YES; + + // Define the paint properties that this layer implements and + // what types they are + tempResult.layerProperties = @[ + // The scale property + [MLNPluginLayerProperty propertyWithName:@"scale" + propertyType:MLNPluginLayerPropertyTypeSingleFloat + defaultValue:@(1.0)], + + // The fill color property + [MLNPluginLayerProperty propertyWithName:@"fill-color" + propertyType:MLNPluginLayerPropertyTypeColor + defaultValue:[UIColor blueColor]] + + ]; + + return tempResult; + +} + +- (void)createShaders:(MLNMapView *)mapView { + MLNBackendResource* resource = [mapView backendResource]; + + NSString *shaderSource = @ +" #include \n" +" using namespace metal;\n" +" typedef struct\n" +" {\n" +" vector_float2 position;\n" +" vector_float4 color;\n" +" } Vertex;\n" +" struct RasterizerData\n" +" {\n" +" float4 position [[position]];\n" +" float4 color;\n" +" };\n" +" vertex RasterizerData\n" +" vertexShader(uint vertexID [[vertex_id]],\n" +" constant Vertex *vertices [[buffer(0)]],\n" +" constant vector_uint2 *viewportSizePointer [[buffer(1)]])\n" +" {\n" +" RasterizerData out;\n" +" float2 pixelSpacePosition = vertices[vertexID].position.xy;\n" +" vector_float2 viewportSize = vector_float2(*viewportSizePointer);\n" +" out.position = vector_float4(0.0, 0.0, 0.0, 1.0);\n" +" out.position.xy = pixelSpacePosition / (viewportSize / 2.0);\n" +" out.color = vertices[vertexID].color;\n" +" return out;\n" +" }\n" +" fragment float4 fragmentShader(RasterizerData in [[stage_in]])\n" +" {\n" +" return in.color;\n" +" }\n"; + + + NSError *error = nil; + id _device = resource.device; + id library = [_device newLibraryWithSource:shaderSource options:nil error:&error]; + NSAssert(library, @"Error compiling shaders: %@", error); + id vertexFunction = [library newFunctionWithName:@"vertexShader"]; + id fragmentFunction = [library newFunctionWithName:@"fragmentShader"]; + + // Configure a pipeline descriptor that is used to create a pipeline state. + MTLRenderPipelineDescriptor *pipelineStateDescriptor = [[MTLRenderPipelineDescriptor alloc] init]; + pipelineStateDescriptor.label = @"Simple Pipeline"; + pipelineStateDescriptor.vertexFunction = vertexFunction; + pipelineStateDescriptor.fragmentFunction = fragmentFunction; + pipelineStateDescriptor.colorAttachments[0].pixelFormat = resource.mtkView.colorPixelFormat; + pipelineStateDescriptor.depthAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; + pipelineStateDescriptor.stencilAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; + + _pipelineState = [_device newRenderPipelineStateWithDescriptor:pipelineStateDescriptor + error:&error]; + NSAssert(_pipelineState, @"Failed to create pipeline state: %@", error); + + // Notice that we don't configure the stencilTest property, leaving stencil testing disabled + MTLDepthStencilDescriptor *depthStencilDescriptor = [[MTLDepthStencilDescriptor alloc] init]; + depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways; // Or another value as needed + depthStencilDescriptor.depthWriteEnabled = NO; + + _depthStencilStateWithoutStencil = [_device newDepthStencilStateWithDescriptor:depthStencilDescriptor]; + +} + + +// Setup the rendering environment +-(void)setupRendering:(MLNMapView *)mapView { + [self createShaders:mapView]; + if (_scale == 0) { + _scale = 1; + } + // Set the initial + _a = 1; + +} + +// The overrides +-(void)onRenderLayer:(MLNMapView *)mapView + renderEncoder:(id)renderEncoder { + + MLNBackendResource* resource = [mapView backendResource]; + + if (_pipelineState == nil) { + [self setupRendering:mapView]; + } + + if (renderEncoder == nil) { + return; + } + + + vector_uint2 _viewportSize; + _viewportSize.x = resource.mtkView.drawableSize.width; + _viewportSize.y = resource.mtkView.drawableSize.height; + + Vertex triangleVerticesWithColor[] = { + // 2D positions, RGBA colors + { { (250 + _offsetX) * _scale, (-250 + _offsetY) * _scale }, { 1, 1, 1, _a } }, + { { (-250 + _offsetX) * _scale, (-250 + _offsetY) * _scale }, { 1, 1, 1, _a} }, + { { (0 + _offsetX) * _scale, (250 + _offsetY) * _scale }, { _r, _g, _b, _a } }, + }; + + [renderEncoder setRenderPipelineState:_pipelineState]; + [renderEncoder setDepthStencilState:_depthStencilStateWithoutStencil]; + + // Pass in the parameter data. + [renderEncoder setVertexBytes:triangleVerticesWithColor + length:sizeof(triangleVerticesWithColor) + atIndex:0]; + + [renderEncoder setVertexBytes:&_viewportSize + length:sizeof(_viewportSize) + atIndex:1]; + + // Draw the triangle. + [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle + vertexStart:0 + vertexCount:3]; +} + +-(void)onUpdateLayer:(MLNPluginLayerDrawingContext)drawingContext { + // This is called before the render call and is a place where + // any animations/etc can be updated +} + +-(void)onUpdateLayerProperties:(NSDictionary *)layerProperties { + //NSLog(@"Metal Layer Rendering Properties: %@", layerProperties); + + // These two properties are in the "properties" section of the style sheet and + // are passed in at layer creation. These are not expression based properties + NSNumber *offsetX = [layerProperties objectForKey:@"offset-x"]; + if (offsetX) { + _offsetX = [[layerProperties objectForKey:@"offset-x"] floatValue]; + } + + NSNumber *offsetY = [layerProperties objectForKey:@"offset-y"]; + if (offsetY) { + _offsetY = [[layerProperties objectForKey:@"offset-y"] floatValue]; + } + + // These are the paint properties and can be updated each frame or zoom level + // change/etc depending on if they are static or expression based/etc. + NSNumber *scale = [layerProperties objectForKey:@"scale"]; + if (scale) { + if ([scale isKindOfClass:[NSNumber class]]) { + _scale = [scale floatValue]; + } + } + + NSString *fillColor = [layerProperties objectForKey:@"fill-color"]; + if (fillColor) { + //NSLog(@"Fill Color: %@", fillColor); + fillColor = [fillColor stringByReplacingOccurrencesOfString:@"rgba(" withString:@""]; + fillColor = [fillColor stringByReplacingOccurrencesOfString:@")" withString:@""]; + NSArray *components = [fillColor componentsSeparatedByString:@","]; + if ([components count] == 4) { + // Convert to float since they come in as 0..255 + _r = [[components objectAtIndex:0] floatValue] / 255.0; + _g = [[components objectAtIndex:1] floatValue] / 255.0; + _b = [[components objectAtIndex:2] floatValue] / 255.0; + _a = [[components objectAtIndex:3] floatValue]; + } + + } + +} + +@end diff --git a/platform/darwin/app/PluginLayerTestStyle.json b/platform/darwin/app/PluginLayerTestStyle.json new file mode 100644 index 000000000000..25ce408bd77f --- /dev/null +++ b/platform/darwin/app/PluginLayerTestStyle.json @@ -0,0 +1,2124 @@ +{ + "comment":"this is based on the URL in the app, but copied here in its entirety to add the plugin layer metadata", + + "id": "43f36e14-e3f5-43c1-84c0-50a9c80dc5c7", + "name": "MapLibre", + "zoom": 0.8619833357855968, + "pitch": 0, + "center": [ + 17.65431710431244, + 32.954120326746775 + ], + "glyphs": "https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#D8F2FF" + }, + "filter": [ + "all" + ], + "layout": { + "visibility": "visible" + }, + "maxzoom": 24 + }, + { + "id": "coastline", + "type": "line", + "paint": { + "line-blur": 0.5, + "line-color": "#198EC8", + "line-width": { + "stops": [ + [ + 0, + 2 + ], + [ + 6, + 6 + ], + [ + 14, + 9 + ], + [ + 22, + 18 + ] + ] + } + }, + "filter": [ + "all" + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "source": "maplibre", + "maxzoom": 24, + "minzoom": 0, + "source-layer": "countries" + }, + { + "id": "countries-fill", + "type": "fill", + "paint": { + "fill-color": [ + "match", + [ + "get", + "ADM0_A3" + ], + [ + "ARM", + "ATG", + "AUS", + "BTN", + "CAN", + "COG", + "CZE", + "GHA", + "GIN", + "HTI", + "ISL", + "JOR", + "KHM", + "KOR", + "LVA", + "MLT", + "MNE", + "MOZ", + "PER", + "SAH", + "SGP", + "SLV", + "SOM", + "TJK", + "TUV", + "UKR", + "WSM" + ], + "#D6C7FF", + [ + "AZE", + "BGD", + "CHL", + "CMR", + "CSI", + "DEU", + "DJI", + "GUY", + "HUN", + "IOA", + "JAM", + "LBN", + "LBY", + "LSO", + "MDG", + "MKD", + "MNG", + "MRT", + "NIU", + "NZL", + "PCN", + "PYF", + "SAU", + "SHN", + "STP", + "TTO", + "UGA", + "UZB", + "ZMB" + ], + "#EBCA8A", + [ + "AGO", + "ASM", + "ATF", + "BDI", + "BFA", + "BGR", + "BLZ", + "BRA", + "CHN", + "CRI", + "ESP", + "HKG", + "HRV", + "IDN", + "IRN", + "ISR", + "KNA", + "LBR", + "LCA", + "MAC", + "MUS", + "NOR", + "PLW", + "POL", + "PRI", + "SDN", + "TUN", + "UMI", + "USA", + "USG", + "VIR", + "VUT" + ], + "#C1E599", + [ + "ARE", + "ARG", + "BHS", + "CIV", + "CLP", + "DMA", + "ETH", + "GAB", + "GRD", + "HMD", + "IND", + "IOT", + "IRL", + "IRQ", + "ITA", + "KOS", + "LUX", + "MEX", + "NAM", + "NER", + "PHL", + "PRT", + "RUS", + "SEN", + "SUR", + "TZA", + "VAT" + ], + "#E7E58F", + [ + "AUT", + "BEL", + "BHR", + "BMU", + "BRB", + "CYN", + "DZA", + "EST", + "FLK", + "GMB", + "GUM", + "HND", + "JEY", + "KGZ", + "LIE", + "MAF", + "MDA", + "NGA", + "NRU", + "SLB", + "SOL", + "SRB", + "SWZ", + "THA", + "TUR", + "VEN", + "VGB" + ], + "#98DDA1", + [ + "AIA", + "BIH", + "BLM", + "BRN", + "CAF", + "CHE", + "COM", + "CPV", + "CUB", + "ECU", + "ESB", + "FSM", + "GAZ", + "GBR", + "GEO", + "KEN", + "LTU", + "MAR", + "MCO", + "MDV", + "NFK", + "NPL", + "PNG", + "PRY", + "QAT", + "SLE", + "SPM", + "SYC", + "TCA", + "TKM", + "TLS", + "VNM", + "WEB", + "WSB", + "YEM", + "ZWE" + ], + "#83D5F4", + [ + "ABW", + "ALB", + "AND", + "ATC", + "BOL", + "COD", + "CUW", + "CYM", + "CYP", + "EGY", + "FJI", + "GGY", + "IMN", + "KAB", + "KAZ", + "KWT", + "LAO", + "MLI", + "MNP", + "MSR", + "MYS", + "NIC", + "NLD", + "PAK", + "PAN", + "PRK", + "ROU", + "SGS", + "SVN", + "SWE", + "TGO", + "TWN", + "VCT", + "ZAF" + ], + "#B1BBF9", + [ + "ATA", + "GRL" + ], + "#FFFFFF", + "#EAB38F" + ] + }, + "filter": [ + "all" + ], + "layout": { + "visibility": "visible" + }, + "source": "maplibre", + "maxzoom": 24, + "source-layer": "countries" + }, + { + "id": "countries-boundary", + "type": "line", + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-width": { + "stops": [ + [ + 1, + 1 + ], + [ + 6, + 2 + ], + [ + 14, + 6 + ], + [ + 22, + 12 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 3, + 0.5 + ], + [ + 6, + 1 + ] + ] + } + }, + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "source": "maplibre", + "maxzoom": 24, + "source-layer": "countries" + }, + { + "id": "geolines", + "type": "line", + "paint": { + "line-color": "#1077B0", + "line-opacity": 1, + "line-dasharray": [ + 3, + 3 + ] + }, + "filter": [ + "all", + [ + "!=", + "name", + "International Date Line" + ] + ], + "layout": { + "visibility": "visible" + }, + "source": "maplibre", + "maxzoom": 24, + "source-layer": "geolines" + }, + { + "id": "geolines-label", + "type": "symbol", + "paint": { + "text-color": "#1077B0", + "text-halo-blur": 1, + "text-halo-color": "rgba(255, 255, 255, 1)", + "text-halo-width": 1 + }, + "filter": [ + "all", + [ + "!=", + "name", + "International Date Line" + ] + ], + "layout": { + "text-font": [ + "Open Sans Semibold" + ], + "text-size": { + "stops": [ + [ + 2, + 12 + ], + [ + 6, + 16 + ] + ] + }, + "text-field": "{name}", + "visibility": "visible", + "symbol-placement": "line" + }, + "source": "maplibre", + "maxzoom": 24, + "minzoom": 1, + "source-layer": "geolines" + }, + { + "id": "countries-label", + "type": "symbol", + "paint": { + "text-color": "rgba(8, 37, 77, 1)", + "text-halo-blur": { + "stops": [ + [ + 2, + 0.2 + ], + [ + 6, + 0 + ] + ] + }, + "text-halo-color": "rgba(255, 255, 255, 1)", + "text-halo-width": { + "stops": [ + [ + 2, + 1 + ], + [ + 6, + 1.6 + ] + ] + } + }, + "filter": [ + "all" + ], + "layout": { + "text-font": [ + "Open Sans Semibold" + ], + "text-size": { + "stops": [ + [ + 2, + 10 + ], + [ + 4, + 12 + ], + [ + 6, + 16 + ] + ] + }, + "text-field": { + "stops": [ + [ + 2, + "{ABBREV}" + ], + [ + 4, + "{NAME}" + ] + ] + }, + "visibility": "visible", + "text-max-width": 10, + "text-transform": { + "stops": [ + [ + 0, + "uppercase" + ], + [ + 2, + "none" + ] + ] + } + }, + "source": "maplibre", + "maxzoom": 24, + "minzoom": 2, + "source-layer": "centroids" + }, + { "id": "metal-rendering-layer-1", + "type": "plugin-layer-metal-rendering", + "properties": { + "color1":"#FFAADD", + "offset-x": -300, + "offset-y": -300 + }, + "paint": { + "scale": 2.5 + } + }, + { "id": "metal-rendering-layer-2", + "type": "plugin-layer-metal-rendering", + "properties": { + "color1":"#FFAADD", + "offset-x": -300 + }, + "paint": { + "scale": [ + "interpolate", + ["linear"], + ["zoom"], + 5, + 0.5, + 15, + 3.0 + ] + } + }, + { "id": "metal-rendering-layer-3", + "type": "plugin-layer-metal-rendering", + "properties": { + "color1":"#DDAAFF", + "offset-x": 300 + }, + "paint": { + "scale": [ + "interpolate", + ["linear"], + ["zoom"], + 5, + 3.0, + 15, + 0.5 + ], + "fill-color": [ + "interpolate", + ["linear"], + ["zoom"], + 1, + "#ff0000", + 22, + "#00ff00" + ] + } + }, + { + "id": "crimea-fill", + "type": "fill", + "source": "crimea", + "paint": { + "fill-color": "#D6C7FF" + } + } + ], + "bearing": 0, + "sources": { + "maplibre": { + "url": "https://demotiles.maplibre.org/tiles/tiles.json", + "type": "vector" + }, + "crimea": { + "type": "geojson", + "data": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 34.00905273547181, + 46.55925987559425 + ], + [ + 33.64325260204026, + 46.34533545368038 + ], + [ + 33.628682598560204, + 46.12569762665683 + ], + [ + 33.64292861730951, + 46.10476396128129 + ], + [ + 33.648473474905984, + 46.09033047763651 + ], + [ + 33.63876482059936, + 46.077976784785335 + ], + [ + 33.62782672238245, + 46.06747935719011 + ], + [ + 33.62911357645072, + 46.05708111413949 + ], + [ + 33.642686868727424, + 46.02192963417187 + ], + [ + 33.6429723910654, + 46.01521185644708 + ], + [ + 33.636224138774026, + 46.006705833212465 + ], + [ + 33.63052626465907, + 45.99692992186792 + ], + [ + 33.63193836679693, + 45.988472992911284 + ], + [ + 33.64276684834442, + 45.984575360297384 + ], + [ + 33.646928693041986, + 45.97981936210982 + ], + [ + 33.638745893564305, + 45.96829769147004 + ], + [ + 33.61958133326394, + 45.951176418494185 + ], + [ + 33.63181380398527, + 45.9445404758078 + ], + [ + 33.638921676216, + 45.94737012930554 + ], + [ + 33.64561542516918, + 45.95403251372139 + ], + [ + 33.65666403976448, + 45.95687114427736 + ], + [ + 33.6825817382811, + 45.95878100879199 + ], + [ + 33.738791807037614, + 45.94836945227263 + ], + [ + 33.758180142697, + 45.94072970008301 + ], + [ + 33.77735917288169, + 45.92923970233858 + ], + [ + 33.75927796793485, + 45.92241179584471 + ], + [ + 33.72529865009221, + 45.91587363154565 + ], + [ + 33.70875012326826, + 45.91008760988058 + ], + [ + 33.69378857293381, + 45.91480850795665 + ], + [ + 33.69092650243843, + 45.89657370898402 + ], + [ + 33.693592356906805, + 45.87271465766318 + ], + [ + 33.69226765972388, + 45.86041392418218 + ], + [ + 33.6704813511748, + 45.8584273836251 + ], + [ + 33.65936345808916, + 45.85944682601249 + ], + [ + 33.653870582376726, + 45.86425922279372 + ], + [ + 33.65107345584843, + 45.87089907254003 + ], + [ + 33.63067378180233, + 45.88040685247182 + ], + [ + 33.61945300059696, + 45.88147266102649 + ], + [ + 33.60987421595539, + 45.88048951126686 + ], + [ + 33.59906957603934, + 45.877610457390375 + ], + [ + 33.57828877687868, + 45.86810261756233 + ], + [ + 33.55357394560386, + 45.84700625141778 + ], + [ + 33.530220674480375, + 45.84221983655459 + ], + [ + 33.5192297395441, + 45.84121682367507 + ], + [ + 33.50832088442496, + 45.84313067048083 + ], + [ + 33.48901101848409, + 45.85268298292175 + ], + [ + 33.482152996405716, + 45.854578171799005 + ], + [ + 33.46719955896293, + 45.849912739405056 + ], + [ + 33.42447496599681, + 45.83075886348303 + ], + [ + 33.40940172404095, + 45.82691953557702 + ], + [ + 33.37918350072067, + 45.802867525073566 + ], + [ + 33.37362145339398, + 45.79619281922518 + ], + [ + 33.33805543634864, + 45.78577808972071 + ], + [ + 33.26498872665803, + 45.75410774187094 + ], + [ + 33.22887541283427, + 45.75131270772724 + ], + [ + 33.19548267281132, + 45.7644887297206 + ], + [ + 33.1789202379222, + 45.78010311364778 + ], + [ + 33.1688456078636, + 45.78470227904205 + ], + [ + 33.161012432811674, + 45.77921593899549 + ], + [ + 33.15951585299757, + 45.76864464913777 + ], + [ + 33.165962301438725, + 45.762685940125465 + ], + [ + 33.1750888126426, + 45.759218220695715 + ], + [ + 33.181464829753, + 45.75490447884948 + ], + [ + 33.17613930782352, + 45.7437961960276 + ], + [ + 33.16369168844906, + 45.735912015025065 + ], + [ + 32.93692665480876, + 45.662114646778264 + ], + [ + 32.86839112407645, + 45.63044340698664 + ], + [ + 32.83803944575723, + 45.60834075026611 + ], + [ + 32.82702772424804, + 45.59576101516498 + ], + [ + 32.82433467080986, + 45.58705137380335 + ], + [ + 32.82563941622885, + 45.579605763895614 + ], + [ + 32.82993674258438, + 45.56978311819469 + ], + [ + 32.82851940940563, + 45.56227808675749 + ], + [ + 32.813310142795274, + 45.55930933158257 + ], + [ + 32.80213583657516, + 45.560145780074464 + ], + [ + 32.78258622159436, + 45.565158335073846 + ], + [ + 32.77333922465823, + 45.56689313356526 + ], + [ + 32.758306734735356, + 45.565030173463356 + ], + [ + 32.750177256846115, + 45.55943726334968 + ], + [ + 32.74340732630185, + 45.55261895849793 + ], + [ + 32.73524549539499, + 45.54598788110354 + ], + [ + 32.72031700779701, + 45.53735927760957 + ], + [ + 32.70536040418847, + 45.53169142131733 + ], + [ + 32.68589438933773, + 45.52663379187257 + ], + [ + 32.66370583186284, + 45.52563107058867 + ], + [ + 32.64312077736798, + 45.52188979044979 + ], + [ + 32.525284074162556, + 45.45838108691365 + ], + [ + 32.49490411219156, + 45.43524910229854 + ], + [ + 32.48107654411925, + 45.408986638827514 + ], + [ + 32.48514589713025, + 45.39458067125969 + ], + [ + 32.51256939517424, + 45.34060655033625 + ], + [ + 32.535915460470335, + 45.33777248012882 + ], + [ + 32.57027153843481, + 45.32510892683359 + ], + [ + 32.590830644991826, + 45.32038723212662 + ], + [ + 32.66380378113439, + 45.320421746458976 + ], + [ + 32.67760722618917, + 45.32609231279554 + ], + [ + 32.71316246802607, + 45.353283572618125 + ], + [ + 32.72817188836078, + 45.36074681043402 + ], + [ + 32.750518060251466, + 45.36371725645313 + ], + [ + 32.89973931692998, + 45.35412322462227 + ], + [ + 32.941197846443885, + 45.34245505845169 + ], + [ + 32.97701667405008, + 45.32596743563991 + ], + [ + 33.04296090827762, + 45.2853982930032 + ], + [ + 33.05274355585479, + 45.28154273654923 + ], + [ + 33.06850284417635, + 45.27703461892352 + ], + [ + 33.07825272648239, + 45.272210805127315 + ], + [ + 33.089426322403455, + 45.25656353201492 + ], + [ + 33.09897492343546, + 45.247820101667884 + ], + [ + 33.12384611720435, + 45.238235755071685 + ], + [ + 33.15767197859745, + 45.20755227709648 + ], + [ + 33.172959979330074, + 45.19681657531794 + ], + [ + 33.21837666514142, + 45.187878368659824 + ], + [ + 33.24017433636709, + 45.180191106261134 + ], + [ + 33.248571989896675, + 45.16588271012458 + ], + [ + 33.259649216030766, + 45.155918961282026 + ], + [ + 33.28309785485047, + 45.16064860772312 + ], + [ + 33.31767999550894, + 45.17535522412791 + ], + [ + 33.35458473323109, + 45.18598673360148 + ], + [ + 33.39725661527919, + 45.18973663076909 + ], + [ + 33.41344561756824, + 45.18490731877088 + ], + [ + 33.468468576977216, + 45.149132412229676 + ], + [ + 33.537128652906205, + 45.11719769268973 + ], + [ + 33.56161328289443, + 45.094099022711475 + ], + [ + 33.57837628774928, + 45.053145935448015 + ], + [ + 33.58247744978442, + 45.027377243150454 + ], + [ + 33.5851414316958, + 45.01816461606674 + ], + [ + 33.6031021265521, + 44.993103583251695 + ], + [ + 33.605922209331794, + 44.986905272229734 + ], + [ + 33.60843524291815, + 44.97039962759274 + ], + [ + 33.61943161357851, + 44.93184946652454 + ], + [ + 33.619484500808824, + 44.90819321920554 + ], + [ + 33.61549738593425, + 44.88894092276257 + ], + [ + 33.608561183117274, + 44.871288478948514 + ], + [ + 33.59889474705494, + 44.859790298912856 + ], + [ + 33.55904244709464, + 44.850057575124595 + ], + [ + 33.54667558363471, + 44.83724531175508 + ], + [ + 33.53701832136994, + 44.81871953508235 + ], + [ + 33.5303157846202, + 44.798338017069625 + ], + [ + 33.5249116915937, + 44.78918633101301 + ], + [ + 33.51669091675143, + 44.784809980590666 + ], + [ + 33.524785531609865, + 44.77183212449111 + ], + [ + 33.5302902535075, + 44.75724515985675 + ], + [ + 33.53710734694323, + 44.73034290771247 + ], + [ + 33.54650992495621, + 44.70989226909535 + ], + [ + 33.5481286806762, + 44.699106546699085 + ], + [ + 33.543995566510915, + 44.68230506537358 + ], + [ + 33.53580273994743, + 44.6726082589706 + ], + [ + 33.52337411931097, + 44.661863083605255 + ], + [ + 33.515320778874354, + 44.6491266698327 + ], + [ + 33.516377841582795, + 44.63464990118433 + ], + [ + 33.52466971637648, + 44.62863961572572 + ], + [ + 33.557474298027785, + 44.62473000923737 + ], + [ + 33.5710648827386, + 44.620853511273225 + ], + [ + 33.55105839203679, + 44.61506440493406 + ], + [ + 33.499905706797676, + 44.61452599304897 + ], + [ + 33.48451102966331, + 44.60992438254493 + ], + [ + 33.47658499621011, + 44.60714391514574 + ], + [ + 33.46705078205747, + 44.60616254193252 + ], + [ + 33.44476599234898, + 44.607062134677875 + ], + [ + 33.4353466482458, + 44.60509936890821 + ], + [ + 33.413591053005575, + 44.593500212748125 + ], + [ + 33.40543527945235, + 44.59055535193136 + ], + [ + 33.37510958624222, + 44.58564691897425 + ], + [ + 33.37074452434078, + 44.58851022190515 + ], + [ + 33.372237834990756, + 44.576810695127364 + ], + [ + 33.37913003799301, + 44.56412673079859 + ], + [ + 33.48759131590526, + 44.51024086451031 + ], + [ + 33.50011215135888, + 44.50041002882833 + ], + [ + 33.517917009115365, + 44.49074142372788 + ], + [ + 33.53836387802215, + 44.49164280212756 + ], + [ + 33.56041892763031, + 44.4966411022441 + ], + [ + 33.57822378538677, + 44.497542389459795 + ], + [ + 33.59062975079095, + 44.48975808594983 + ], + [ + 33.619577003408466, + 44.46229988129974 + ], + [ + 33.62635433636015, + 44.45336293328907 + ], + [ + 33.63175322871038, + 44.434828756313124 + ], + [ + 33.645537634715026, + 44.42498521035591 + ], + [ + 33.721007257593925, + 44.39946630464436 + ], + [ + 33.74168386660085, + 44.39560878121904 + ], + [ + 33.80727466517129, + 44.39454176175843 + ], + [ + 33.81841706002561, + 44.39552670349164 + ], + [ + 33.83909366903248, + 44.40143600575672 + ], + [ + 33.85149963444792, + 44.40143600575945 + ], + [ + 33.91467816197718, + 44.38387049706651 + ], + [ + 33.938111652185, + 44.38083293528811 + ], + [ + 33.957065210440874, + 44.38272116790142 + ], + [ + 34.06614966692763, + 44.42019923628979 + ], + [ + 34.088893936836286, + 44.42200415824283 + ], + [ + 34.10279321289039, + 44.42487551014821 + ], + [ + 34.135933345669, + 44.44163597968952 + ], + [ + 34.14696087047267, + 44.44959070749778 + ], + [ + 34.16058918507403, + 44.466287285335795 + ], + [ + 34.170123399227776, + 44.48186111741296 + ], + [ + 34.182759104731986, + 44.49267838558103 + ], + [ + 34.22923417224524, + 44.49949719774551 + ], + [ + 34.24301857824986, + 44.50744404277697 + ], + [ + 34.263903954150294, + 44.53186886058606 + ], + [ + 34.26631622520165, + 44.53555362837611 + ], + [ + 34.26631622520165, + 44.54153064468656 + ], + [ + 34.27033667695244, + 44.545378535987936 + ], + [ + 34.2757355693048, + 44.54644280144541 + ], + [ + 34.285384653508004, + 44.54562413743594 + ], + [ + 34.299973149863405, + 44.54554227040174 + ], + [ + 34.32260254971496, + 44.543577427039224 + ], + [ + 34.3308731933177, + 44.54546040325087 + ], + [ + 34.340292537420794, + 44.55798473830754 + ], + [ + 34.38042135640006, + 44.631830317636684 + ], + [ + 34.41495238900856, + 44.673669777529994 + ], + [ + 34.424193090575585, + 44.68239452736094 + ], + [ + 34.42959198292681, + 44.68884644523774 + ], + [ + 34.469399167794535, + 44.730194532749294 + ], + [ + 34.47376422969597, + 44.73011292571252 + ], + [ + 34.47376422969597, + 44.72635887754967 + ], + [ + 34.475142670296464, + 44.723502373339585 + ], + [ + 34.499724861011515, + 44.74292382044041 + ], + [ + 34.532800295801195, + 44.752620844929055 + ], + [ + 34.61217550038418, + 44.76534519537847 + ], + [ + 34.65065696715081, + 44.777088262503725 + ], + [ + 34.72084256772871, + 44.811080759265764 + ], + [ + 34.756796893391225, + 44.82094054159748 + ], + [ + 34.82646979041766, + 44.81208604604609 + ], + [ + 34.84289620758207, + 44.816893835303176 + ], + [ + 34.856910353686715, + 44.82373813182468 + ], + [ + 34.889648317948144, + 44.817871641692506 + ], + [ + 34.90733830566026, + 44.820886440346584 + ], + [ + 34.922960632465504, + 44.83050015059965 + ], + [ + 34.92950822531711, + 44.83652826953224 + ], + [ + 34.94179932067178, + 44.84019370922482 + ], + [ + 34.95282684547897, + 44.841415470643284 + ], + [ + 34.98567967978991, + 44.840275160795755 + ], + [ + 35.0053224583441, + 44.83538786296728 + ], + [ + 35.017958163849414, + 44.82219008824552 + ], + [ + 35.02703289780189, + 44.80890779582285 + ], + [ + 35.037933245998005, + 44.79869792240089 + ], + [ + 35.08073333784134, + 44.793525442788905 + ], + [ + 35.1080207326404, + 44.824553365795765 + ], + [ + 35.130368105574235, + 44.86879838545747 + ], + [ + 35.15485200090768, + 44.90071251697748 + ], + [ + 35.17111229780758, + 44.90746386008772 + ], + [ + 35.21522068940149, + 44.91421441031795 + ], + [ + 35.233163085981715, + 44.925728224907715 + ], + [ + 35.25636688416236, + 44.95896657181197 + ], + [ + 35.27300098099195, + 44.96690119386028 + ], + [ + 35.29748487632534, + 44.95605693543271 + ], + [ + 35.30496087491386, + 44.96121482614441 + ], + [ + 35.315240372954605, + 44.965711070514175 + ], + [ + 35.31935217217088, + 44.96941359539801 + ], + [ + 35.36757236298112, + 44.94362319076086 + ], + [ + 35.36103086422793, + 44.97364475976596 + ], + [ + 35.362152264014156, + 44.98593980935419 + ], + [ + 35.374674561627444, + 44.997835734117416 + ], + [ + 35.389439658813274, + 45.00180049366759 + ], + [ + 35.42270785247763, + 45.00087540764923 + ], + [ + 35.43504325012745, + 45.00470780964241 + ], + [ + 35.43504325012745, + 45.011446929213974 + ], + [ + 35.40631957913584, + 45.02015821022701 + ], + [ + 35.40089948016896, + 45.025046135473445 + ], + [ + 35.39790908073891, + 45.03482073400548 + ], + [ + 35.40052568024015, + 45.042216617888045 + ], + [ + 35.40631957913584, + 45.051328088783805 + ], + [ + 35.40744097892215, + 45.06294640963205 + ], + [ + 35.41734667704213, + 45.0708666385693 + ], + [ + 35.469304867139925, + 45.10068964922732 + ], + [ + 35.5070260597534, + 45.113341616151644 + ], + [ + 35.54758335202416, + 45.12019982412133 + ], + [ + 35.59019654390909, + 45.11993606213795 + ], + [ + 35.63411803553862, + 45.11439677872579 + ], + [ + 35.70669729572677, + 45.09480210570922 + ], + [ + 35.771782422456766, + 45.06572995732262 + ], + [ + 35.78430472007, + 45.057941041321754 + ], + [ + 35.81250040352472, + 45.031852200991295 + ], + [ + 35.81941570220667, + 45.021152336906454 + ], + [ + 35.82763930064016, + 44.99895365027004 + ], + [ + 35.848198296721705, + 44.99208088455586 + ], + [ + 35.916977483614176, + 45.00172895661731 + ], + [ + 35.99360646900681, + 44.997896355361604 + ], + [ + 36.00893226608571, + 45.00926125333629 + ], + [ + 36.02539976723364, + 45.03288661039673 + ], + [ + 36.047827762958946, + 45.048074065419456 + ], + [ + 36.078666257082034, + 45.03883000769565 + ], + [ + 36.079137312377895, + 45.046610970582435 + ], + [ + 36.135020401727616, + 45.02125162210126 + ], + [ + 36.2241716847341, + 45.00751061631556 + ], + [ + 36.24398308095806, + 45.011474706353084 + ], + [ + 36.24828178013877, + 45.01649549321965 + ], + [ + 36.25332807917695, + 45.03247980324494 + ], + [ + 36.25743987839326, + 45.03842324279259 + ], + [ + 36.267158676549116, + 45.043573724415154 + ], + [ + 36.2783726744118, + 45.04555455542638 + ], + [ + 36.36740852558336, + 45.04833265291825 + ], + [ + 36.44029951169139, + 45.06787222615526 + ], + [ + 36.45375630913995, + 45.07631970334319 + ], + [ + 36.455251508854985, + 45.09202341204062 + ], + [ + 36.44142091149291, + 45.10709638287736 + ], + [ + 36.41432041665814, + 45.12872568311289 + ], + [ + 36.40852651776157, + 45.149160473330085 + ], + [ + 36.409997342308856, + 45.171615955386955 + ], + [ + 36.418312796420764, + 45.23001671705953 + ], + [ + 36.42672329481775, + 45.25186253492981 + ], + [ + 36.43756477765089, + 45.27227491599612 + ], + [ + 36.4497132753354, + 45.28542626329343 + ], + [ + 36.45905827355429, + 45.28753019598713 + ], + [ + 36.4814862692796, + 45.28845064200263 + ], + [ + 36.4909554290368, + 45.29213135137758 + ], + [ + 36.49637552800283, + 45.300940007322055 + ], + [ + 36.49394582846682, + 45.305015191082816 + ], + [ + 36.48871262946426, + 45.30935296803605 + ], + [ + 36.48460083024801, + 45.315924724862185 + ], + [ + 36.489647129296515, + 45.336413860372005 + ], + [ + 36.502169426909745, + 45.34731734941451 + ], + [ + 36.52104632331191, + 45.35033842661815 + ], + [ + 36.544281237819945, + 45.34731734942025 + ], + [ + 36.57455903204905, + 45.33601971904315 + ], + [ + 36.585399229982954, + 45.333917585593355 + ], + [ + 36.59810088537549, + 45.334837278577254 + ], + [ + 36.630808379142394, + 45.34048649352954 + ], + [ + 36.637536777859964, + 45.3511265071989 + ], + [ + 36.63099527910589, + 45.3741073632589 + ], + [ + 36.61359545390113, + 45.40895280985421 + ], + [ + 36.59845655678569, + 45.421547717459106 + ], + [ + 36.58331765967199, + 45.42731944465129 + ], + [ + 36.566309762912795, + 45.42548305000767 + ], + [ + 36.54836736633254, + 45.41210180010589 + ], + [ + 36.53285466928139, + 45.4090840212946 + ], + [ + 36.51565987255873, + 45.41957994832251 + ], + [ + 36.49117597722616, + 45.44279525429408 + ], + [ + 36.47043008117939, + 45.4458112314303 + ], + [ + 36.411182792482634, + 45.43610707766504 + ], + [ + 36.391371396258705, + 45.43991025572652 + ], + [ + 36.35959840231365, + 45.45407156049933 + ], + [ + 36.33960010612526, + 45.45695583486963 + ], + [ + 36.33025510790637, + 45.454464879327446 + ], + [ + 36.32053630976225, + 45.44856480887407 + ], + [ + 36.31156511147125, + 45.4438443081136 + ], + [ + 36.29885591389362, + 45.442795254299995 + ], + [ + 36.3072664122906, + 45.46115087970253 + ], + [ + 36.30016421364425, + 45.47320989503609 + ], + [ + 36.283717016779036, + 45.476355300848866 + ], + [ + 36.267082919949445, + 45.46704963343626 + ], + [ + 36.25213092279836, + 45.46115087970253 + ], + [ + 36.13681364478941, + 45.46219959214511 + ], + [ + 36.11700224855986, + 45.45721803432335 + ], + [ + 36.097003952371466, + 45.441483909606006 + ], + [ + 36.06952965760803, + 45.43046741078453 + ], + [ + 36.0655449627526, + 45.42553028973455 + ], + [ + 36.05134056545904, + 45.39535242162091 + ], + [ + 36.022557970944945, + 45.368441166003805 + ], + [ + 35.986486277818386, + 45.362926059418186 + ], + [ + 35.94723728529826, + 45.372380198658874 + ], + [ + 35.87220216002379, + 45.404075760536614 + ], + [ + 35.85388596351393, + 45.413916621802144 + ], + [ + 35.84715756479628, + 45.426379251448395 + ], + [ + 35.8524047739447, + 45.44386497541683 + ], + [ + 35.85950697259193, + 45.45933624762881 + ], + [ + 35.857824872912545, + 45.469953901705 + ], + [ + 35.83278027768503, + 45.47087138287168 + ], + [ + 35.8167068807486, + 45.46392436820739 + ], + [ + 35.80362388324218, + 45.44963442058864 + ], + [ + 35.79469305616038, + 45.42980210462429 + ], + [ + 35.791889556694684, + 45.41209230278156 + ], + [ + 35.772265060435046, + 45.39214572935421 + ], + [ + 35.767405661361295, + 45.38873311015669 + ], + [ + 35.75189296431793, + 45.386632934388984 + ], + [ + 35.7481549650407, + 45.379938103368545 + ], + [ + 35.746846665290036, + 45.369960021421576 + ], + [ + 35.74423006578874, + 45.36076812520648 + ], + [ + 35.71619507113218, + 45.34040932557082 + ], + [ + 35.69451467527287, + 45.32989869277279 + ], + [ + 35.51720627467216, + 45.29506847418358 + ], + [ + 35.48038698168983, + 45.2979608697527 + ], + [ + 35.33194061536096, + 45.371562726652314 + ], + [ + 35.04491375777232, + 45.669545248704424 + ], + [ + 35.00230056589345, + 45.7290693869553 + ], + [ + 34.70631294999043, + 46.024929846739866 + ], + [ + 34.35868883309806, + 46.106725558140795 + ], + [ + 34.00905273547181, + 46.55925987559425 + ] + ] + ] + } + } + } + }, + "version": 8, + "metadata": { + "maptiler:copyright": "This style was generated on MapTiler Cloud. Usage is governed by the license terms in https://github.com/maplibre/demotiles/blob/gh-pages/LICENSE", + "openmaptiles:version": "3.x" + } +} diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index 4db2748fb7b1..560189cd69c0 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -106,6 +106,8 @@ MLN_DARWIN_OBJC_HEADERS = [ "src/NSExpression+MLNAdditions.h", "src/NSPredicate+MLNAdditions.h", "src/NSValue+MLNAdditions.h", + "src/MLNPluginLayer.h", + "src/MLNPluginStyleLayer.h", ] MLN_DARWIN_OBJCPP_HEADERS = [ @@ -163,6 +165,8 @@ MLN_DARWIN_PRIVATE_HEADERS = [ "src/MLNVectorTileSource_Private.h", "src/NSExpression+MLNPrivateAdditions.h", "src/NSPredicate+MLNPrivateAdditions.h", + "src/MLNPluginStyleLayer_Private.h" + ] MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ @@ -217,6 +221,9 @@ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ "src/NSExpression+MLNAdditions.mm", "src/NSPredicate+MLNAdditions.mm", "src/NSValue+MLNStyleAttributeAdditions.mm", + "src/MLNPluginLayer.mm", + "src/MLNPluginStyleLayer.mm" + ] MLN_DARWIN_PUBLIC_OBJCPP_CUSTOM_DRAWABLE_SOURCE = [ "src/MLNCustomDrawableStyleLayer_Private.h", diff --git a/platform/darwin/darwin.cmake b/platform/darwin/darwin.cmake index de3bab2ceddc..4217aa752bd5 100644 --- a/platform/darwin/darwin.cmake +++ b/platform/darwin/darwin.cmake @@ -162,6 +162,8 @@ add_library( EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/app/ExampleCustomDrawableStyleLayer.mm" "${CMAKE_CURRENT_LIST_DIR}/app/CustomStyleLayerExample.m" + "${CMAKE_CURRENT_LIST_DIR}/app/PluginLayerExample.mm" + "${CMAKE_CURRENT_LIST_DIR}/app/PluginLayerExampleMetalRendering.mm" ) target_link_libraries( diff --git a/platform/darwin/src/MLNMapOptions.h b/platform/darwin/src/MLNMapOptions.h index 48267467c45b..89ce52eb0056 100644 --- a/platform/darwin/src/MLNMapOptions.h +++ b/platform/darwin/src/MLNMapOptions.h @@ -32,6 +32,11 @@ MLN_EXPORT */ @property (nonatomic, nonnull) MLNActionJournalOptions *actionJournalOptions; +/** + List of plugin classes + */ +@property NSArray *pluginLayers; + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNMapOptions.mm b/platform/darwin/src/MLNMapOptions.mm index d9ddabbc355a..6c24047cd78f 100644 --- a/platform/darwin/src/MLNMapOptions.mm +++ b/platform/darwin/src/MLNMapOptions.mm @@ -13,6 +13,7 @@ -(instancetype _Nonnull)init { _styleURL = nil; _styleJSON = nil; + _pluginLayers = nil; _actionJournalOptions = [[MLNActionJournalOptions alloc] init]; } diff --git a/platform/darwin/src/MLNPluginLayer.h b/platform/darwin/src/MLNPluginLayer.h new file mode 100644 index 000000000000..b188e4fb2376 --- /dev/null +++ b/platform/darwin/src/MLNPluginLayer.h @@ -0,0 +1,109 @@ +#import +#import +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +#import "MLNFoundation.h" +#import "MLNGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef enum { + MLNPluginLayerPropertyTypeUnknown, + MLNPluginLayerPropertyTypeSingleFloat, + MLNPluginLayerPropertyTypeColor +} MLNPluginLayerPropertyType; + +MLN_EXPORT +@interface MLNPluginLayerProperty : NSObject + ++ (MLNPluginLayerProperty *)propertyWithName:(NSString *)propertyName + propertyType:(MLNPluginLayerPropertyType)propertyType + defaultValue:(id)defaultValue; + +// The name of the property +@property (copy) NSString *propertyName; + +// The type of property +@property MLNPluginLayerPropertyType propertyType; + +// Single float default value +@property float singleFloatDefaultValue; + +// Color default value +#if TARGET_OS_IPHONE +@property (copy) UIColor *colorDefaultValue; +#else +@property NSColor *colorDefaultValue; +#endif + +@end + +typedef enum { + MLNPluginLayerTileKindGeometry, + MLNPluginLayerTileKindRaster, + MLNPluginLayerTileKindRasterDEM, + MLNPluginLayerTileKindNotRequired +} MLNPluginLayerTileKind; + +MLN_EXPORT +@interface MLNPluginLayerCapabilities : NSObject + +@property (copy) NSString *layerID; +@property BOOL requiresPass3D; + +//! This is a list of layer properties that this layer supports. +@property (copy) NSArray *layerProperties; + +@end + +@class MLNMapView; + +// Copied initially from MLNStyleLayerDrawingContext. Decided to copy instead of use since we +// might add additional properties here +/// A structure containing context needed to draw a frame in an ``MLNCustomStyleLayer``. +typedef struct MLNPluginLayerDrawingContext { + /// The size of the drawable area, in points. + CGSize size; + /// The center coordinate of the map view. + CLLocationCoordinate2D centerCoordinate; + /// The current zoom level of the map view. + double zoomLevel; + /// The heading (direction) in degrees clockwise from true north. + CLLocationDirection direction; + /// The current pitch of the map view in degrees, measured from the map plane. + CGFloat pitch; + /// The vertical field of view, in degrees, for the map’s perspective. + CGFloat fieldOfView; + /// A 4×4 matrix representing the map view’s current projection state. + MLNMatrix4 projectionMatrix; +} MLNPluginLayerDrawingContext; + +MLN_EXPORT +@interface MLNPluginLayer : NSObject + +/// Returns the layer capabilities of the plugin layer. +/// This must be overridden by the plug-in layer and return a set of capabilities ++ (MLNPluginLayerCapabilities *)layerCapabilities; + +// These are public methods that can be overridden by the plugin layer +/// Called when the layer is rendered +- (void)onRenderLayer:(MLNMapView *)mapView + renderEncoder:(id)renderEncoder; + +/// Called when the layer is updated in the render loop. This would update animations/etc +- (void)onUpdateLayer:(MLNPluginLayerDrawingContext)drawingContext; + +/// Called when the layer properties are updated. Can be on initial load from the JSON or when +/// dynamic properties are updated +- (void)onUpdateLayerProperties:(NSDictionary *)layerProperties; + +/// Added to a map view +- (void)didMoveToMapView:(MLNMapView *)mapView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNPluginLayer.mm b/platform/darwin/src/MLNPluginLayer.mm new file mode 100644 index 000000000000..cff0044d05ac --- /dev/null +++ b/platform/darwin/src/MLNPluginLayer.mm @@ -0,0 +1,80 @@ +#import "MLNPluginLayer.h" + +@implementation MLNPluginLayerProperty + ++(MLNPluginLayerProperty *)propertyWithName:(NSString *)propertyName + propertyType:(MLNPluginLayerPropertyType)propertyType + defaultValue:(id)defaultValue { + MLNPluginLayerProperty *tempResult = [[MLNPluginLayerProperty alloc] init]; + tempResult.propertyName = propertyName; + tempResult.propertyType = propertyType; + + if (propertyType == MLNPluginLayerPropertyTypeSingleFloat) { + if ([defaultValue isKindOfClass:[NSNumber class]]) { + tempResult.singleFloatDefaultValue = [defaultValue floatValue]; + } + } else if (propertyType == MLNPluginLayerPropertyTypeColor) { +#if TARGET_OS_IPHONE + if ([defaultValue isKindOfClass:[UIColor class]]) { +#else + if ([defaultValue isKindOfClass:[NSColor class]]) { +#endif + tempResult.colorDefaultValue = defaultValue; + } + } + + return tempResult; +} + + +-(id)init { + // Base class implemenation + if (self = [super init]) { + // Default setup + self.propertyType = MLNPluginLayerPropertyTypeUnknown; + self.propertyName = @"unknown"; + + // Default values for the various types + self.singleFloatDefaultValue = 1.0; + } + return self; +} + +@end + +@implementation MLNPluginLayer + +// This is the layer type in the style that is used ++(MLNPluginLayerCapabilities *)layerCapabilities { + + // Base class returns the class name just to return something + // TODO: Add an assert/etc or something to notify the developer that this needs to be overridden + return nil; + +} + +- (void)onRenderLayer:(MLNMapView *)mapView + renderEncoder:(id)renderEncoder { + // Base class does nothing +} + +- (void)onUpdateLayer:(MLNPluginLayerDrawingContext)drawingContext { + // Base class does nothing +} + +-(void)onUpdateLayerProperties:(NSDictionary *)layerProperties { + // Base class does nothing +} + +/// Added to a map view +- (void)didMoveToMapView:(MLNMapView *)mapView { + // Base class does nothing +} + + +@end + + + +@implementation MLNPluginLayerCapabilities +@end diff --git a/platform/darwin/src/MLNPluginStyleLayer.h b/platform/darwin/src/MLNPluginStyleLayer.h new file mode 100644 index 000000000000..eaf7d86521b3 --- /dev/null +++ b/platform/darwin/src/MLNPluginStyleLayer.h @@ -0,0 +1,13 @@ +#import "MLNStyleLayer.h" + +NS_ASSUME_NONNULL_BEGIN + +@class MLNPluginLayer; + +@interface MLNPluginStyleLayer : MLNStyleLayer + +- (MLNPluginLayer *)pluginLayer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MLNPluginStyleLayer.mm b/platform/darwin/src/MLNPluginStyleLayer.mm new file mode 100644 index 000000000000..c8dc037789c3 --- /dev/null +++ b/platform/darwin/src/MLNPluginStyleLayer.mm @@ -0,0 +1,35 @@ +#import "MLNPluginStyleLayer.h" +#import "MLNPluginStyleLayer_Private.h" +#import +#import +#import "MLNPluginLayer.h" + +@implementation MLNPluginStyleLayer + +-(void)getStats { + + mbgl::style::PluginLayer *l = (mbgl::style::PluginLayer *)self.rawLayer; + auto pl = l->impl(); + +} + +-(MLNPluginLayer *)pluginLayer { + + mbgl::style::PluginLayer *l = (mbgl::style::PluginLayer *)self.rawLayer; + if (l->_platformReference) { + MLNPluginLayer *pl = (__bridge MLNPluginLayer *)l->_platformReference; + return pl; + } + + return nil; + +} + + +@end + + +MLNStyleLayer* mbgl::PluginLayerPeerFactory::createPeer(style::Layer *rawLayer) { + return [[MLNPluginStyleLayer alloc] initWithRawLayer:rawLayer]; + +} diff --git a/platform/darwin/src/MLNPluginStyleLayer_Private.h b/platform/darwin/src/MLNPluginStyleLayer_Private.h new file mode 100644 index 000000000000..f72b0ea2c1cb --- /dev/null +++ b/platform/darwin/src/MLNPluginStyleLayer_Private.h @@ -0,0 +1,25 @@ +#pragma once + +#include "MLNStyleLayer_Private.h" + +#include + +namespace mbgl { + +class PluginLayerPeerFactory : public LayerPeerFactory, public mbgl::PluginLayerFactory { +public: + PluginLayerPeerFactory(std::string& layerType, + mbgl::style::LayerTypeInfo::Source source, + mbgl::style::LayerTypeInfo::Pass3D pass3D, + mbgl::style::LayerTypeInfo::Layout layout, + mbgl::style::LayerTypeInfo::FadingTiles fadingTiles, + mbgl::style::LayerTypeInfo::CrossTileIndex crossTileIndex, + mbgl::style::LayerTypeInfo::TileKind tileKind) + : mbgl::PluginLayerFactory(layerType, source, pass3D, layout, fadingTiles, crossTileIndex, tileKind) {} + + // LayerPeerFactory overrides. + LayerFactory* getCoreLayerFactory() final { return this; } + virtual MLNStyleLayer* createPeer(style::Layer*) final; +}; + +} // namespace mbgl diff --git a/platform/darwin/src/MLNStyleLayerManager.h b/platform/darwin/src/MLNStyleLayerManager.h index 0820175adea0..aab007db532e 100644 --- a/platform/darwin/src/MLNStyleLayerManager.h +++ b/platform/darwin/src/MLNStyleLayerManager.h @@ -18,12 +18,7 @@ class LayerManagerDarwin : public LayerManager { MLNStyleLayer* createPeer(style::Layer*); -private: - LayerManagerDarwin(); - /** - * Enables a layer type for both JSON style and runtime API. - */ - void addLayerType(std::unique_ptr); +public: /** * Enables a layer type for JSON style only. * @@ -31,7 +26,15 @@ class LayerManagerDarwin : public LayerManager { * in order to save binary size (the corresponding SDK layer wrappers * should be excluded from the project build). */ - void addLayerTypeCoreOnly(std::unique_ptr); + void addLayerTypeCoreOnly(std::unique_ptr) override; + + /** + * Enables a layer type for both JSON style and runtime API. + */ + void addLayerType(std::unique_ptr); + +private: + LayerManagerDarwin(); void registerCoreFactory(LayerFactory*); LayerPeerFactory* getPeerFactory(const style::LayerTypeInfo* typeInfo); diff --git a/platform/darwin/src/MLNStyleLayerManager.mm b/platform/darwin/src/MLNStyleLayerManager.mm index cb6fcbe08813..4f5e0822b1ff 100644 --- a/platform/darwin/src/MLNStyleLayerManager.mm +++ b/platform/darwin/src/MLNStyleLayerManager.mm @@ -109,7 +109,7 @@ LayerPeerFactory* LayerManagerDarwin::getPeerFactory(const mbgl::style::LayerTypeInfo* typeInfo) { for (const auto& factory: peerFactories) { - if (factory->getCoreLayerFactory()->getTypeInfo() == typeInfo) { + if (layerTypeInfoEquals(factory->getCoreLayerFactory()->getTypeInfo(), typeInfo)) { return factory.get(); } } @@ -127,7 +127,8 @@ } for (const auto& factory: coreFactories) { - if (factory->getTypeInfo() == info) { + if (layerTypeInfoEquals(factory->getTypeInfo(), info)) { + // if (factory->getTypeInfo() == info) { return factory.get(); } } diff --git a/platform/default/src/mbgl/layermanager/layer_manager.cpp b/platform/default/src/mbgl/layermanager/layer_manager.cpp index bad94e9b79ff..988c105eba48 100644 --- a/platform/default/src/mbgl/layermanager/layer_manager.cpp +++ b/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -24,6 +24,15 @@ class LayerManagerDefault final : public LayerManager { public: LayerManagerDefault(); + /** + * Enables a layer type for JSON style only. + * + * We might not want to expose runtime API for some layer types + * in order to save binary size (the corresponding SDK layer wrappers + * should be excluded from the project build). + */ + void addLayerTypeCoreOnly(std::unique_ptr) override; + private: void addLayerType(std::unique_ptr); // LayerManager overrides. @@ -34,6 +43,10 @@ class LayerManagerDefault final : public LayerManager { std::map typeToFactory; }; +void LayerManagerDefault::addLayerTypeCoreOnly(std::unique_ptr layerFactory) { + addLayerType(std::move(layerFactory)); +} + LayerManagerDefault::LayerManagerDefault() { #if !defined(MBGL_LAYER_FILL_DISABLE_ALL) addLayerType(std::make_unique()); @@ -90,7 +103,7 @@ void LayerManagerDefault::addLayerType(std::unique_ptr factory) { LayerFactory* LayerManagerDefault::getFactory(const mbgl::style::LayerTypeInfo* typeInfo) noexcept { assert(typeInfo); for (const auto& factory : factories) { - if (factory->getTypeInfo() == typeInfo) { + if (layerTypeInfoEquals(factory->getTypeInfo(), typeInfo)) { return factory.get(); } } diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index b818510d755d..fa83c9af8f59 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -189,6 +189,7 @@ _IOS_APPLICATION_RESOURCES = [ "app/LaunchScreen.storyboard", "app/simple_route.json", "app/fill_filter_style.json", + "//platform/darwin:app/PluginLayerTestStyle.json", "//platform/darwin:test/amsterdam.geojson", ] + glob([ "app/*.lproj/**", diff --git a/platform/ios/MapLibre.docc/MapLibre.md b/platform/ios/MapLibre.docc/MapLibre.md index 8004db5db652..32966f7627e0 100644 --- a/platform/ios/MapLibre.docc/MapLibre.md +++ b/platform/ios/MapLibre.docc/MapLibre.md @@ -58,6 +58,7 @@ Powerful, free and open-source mapping toolkit with full control over data sourc - - +- ### Other Articles diff --git a/platform/ios/MapLibre.docc/PluginLayers.md b/platform/ios/MapLibre.docc/PluginLayers.md new file mode 100644 index 000000000000..142a1e13720c --- /dev/null +++ b/platform/ios/MapLibre.docc/PluginLayers.md @@ -0,0 +1,148 @@ +# Plugin Layers + +Plugin Layers are a way to add layer types that render themselves into the style parsing engine at runtime. It is a way to dynamically link new layer types to the MapLibre core -- and styling language -- without having to compile them into the library itself. + +Because the layers are bound at runtime, one or more different types of specialized layers can be added and different versions of layer types can be added. + +Currently Plugin Layers are only available on iOS/Darwin using the Metal Rendering pipeline. + + +## Creating a Plugin Layer + +Plugin Layers can be created by creating a descendant from MLNPluginLayer and add the class type to an instance of MLNMapView. The layer is self describing (e.g. the layer type, what properties are available, etc) and that information will be registered with the MapLibre core. When the plugin layer type is found in the style, the core will automatically instantiate it, pass along initial properties and manage the rendering of the layer. + +### Defining a layer's capabilities +The newly created layer class should override the layerCapabilites class method. Please note that this is a class method and not an instance method, so make sure it's prefaced with a + and not a -. + +The object that is returned from this method defines the layer type and the propeties that the layer expects. + +The triangle example (platform/darwin/app/PluginLayerExampleMetalRendering.mm) defines it's layer type "plugin-layer-metal-rendering" and two paint properties (scale and fill-color). These properties can be expression based. It's important to define the type of property (single float or color) and a default value. The properties returned by layerCapabilities will correspond to any properties in the "paint": part of the style. + +Initialization properties can also be added to the "properties": section of the layer style. + +```objc ++(MLNPluginLayerCapabilities *)layerCapabilities { + + MLNPluginLayerCapabilities *tempResult = [[MLNPluginLayerCapabilities alloc] init]; + tempResult.layerID = @"plugin-layer-metal-rendering"; + tempResult.requiresPass3D = YES; + + // Define the paint properties that this layer implements and + // what types they are + tempResult.layerProperties = @[ + // The scale property + [MLNPluginLayerProperty propertyWithName:@"scale" + propertyType:MLNPluginLayerPropertyTypeSingleFloat + defaultValue:@(1.0)], + + // The fill color property + [MLNPluginLayerProperty propertyWithName:@"fill-color" + propertyType:MLNPluginLayerPropertyTypeColor + defaultValue:[UIColor blueColor]] + + ]; + + return tempResult; + +} +``` + +For the triangle example, there are two initialization properties (offset-x and offset-y) for positioning and two paint properties, scale and fill-color. Here are three different instances of the plugin layer being added to the style. One that has a static scale (and uses the default color), one that has an expression based scale (and uses the default scale) and one that has an expression based scale and fill color. + + +```json +{ + "id": "metal-rendering-layer-1", + "type": "plugin-layer-metal-rendering", + "properties": { + "offset-x": -300, + "offset-y": -300 + }, + "paint": { + "scale": 2.5 + } +}, +{ + "id": "metal-rendering-layer-2", + "type": "plugin-layer-metal-rendering", + "properties": { + "offset-x": -300 + }, + "paint": { + "scale": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 5, + 0.5, + 15, + 3 + ] + } +}, +{ + "id": "metal-rendering-layer-3", + "type": "plugin-layer-metal-rendering", + "properties": { + "color1": "#DDAAFF", + "offset-x": 300 + }, + "paint": { + "scale": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 5, + 3, + 15, + 0.5 + ], + "fill-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + "#ff0000", + 22, + "#00ff00" + ] + } +} +``` +![](PluginLayer.png) + +## Example 2: GLTF Plugin Layer + +In [this repository](https://github.com/AtlasProgramming/maplibre-gltf-models-plugin) you can find an example of a plugin layer that allows adding GLTF models. The following JSON is added to the style. + +``` +{ + "id": "model-layer", + "type": "hudhud::gltf-model-layer", + "properties": { + "model-source-resource":"models.json" + }, + "paint": { + "scale": 1.0 + } +} +``` + +@Video( + source: "gltfplugin.mp4", + poster: "gltfplugin.png", + alt: "GLTF Plugin in action.") { + GLTF Plugin showing 3D models of the Arc de Triomphe and the Eifel Tower. +} diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index b219244cd6b6..4c13a767ea51 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -23,6 +23,11 @@ #import "MLNMapView_Experimental.h" #import +// Plug In Examples +#import "PluginLayerExample.h" +#import "PluginLayerExampleMetalRendering.h" +#import "MLNPluginStyleLayer.h" + static const CLLocationCoordinate2D WorldTourDestinations[] = { { .latitude = 38.8999418, .longitude = -77.033996 }, { .latitude = 37.7884307, .longitude = -122.3998631 }, @@ -270,10 +275,21 @@ - (instancetype)init { return self; } +// This will add the plug-in layers. This is a demo of how +// extensible layers for the style can be added to the map view +-(void)addPluginLayers { + + [self.mapView addPluginLayerType:[PluginLayerExample class]]; + [self.mapView addPluginLayerType:[PluginLayerExampleMetalRendering class]]; + +} + - (void)viewDidLoad { [super viewDidLoad]; + [self addPluginLayers]; + // Keep track of current map state and debug preferences, // saving and restoring when the application's state changes. self.currentState = [MBXStateManager sharedManager].currentState; @@ -2314,10 +2330,19 @@ - (void)setStyles self.styleNames = [NSMutableArray array]; self.styleURLs = [NSMutableArray array]; + + + /// Style that does not require an `apiKey` nor any further configuration [self.styleNames addObject:@"MapLibre Basic"]; [self.styleURLs addObject:[NSURL URLWithString:@"https://demotiles.maplibre.org/style.json"]]; + /// This is hte same style as above but copied locally and the three instances of the metal plug-in layer added to the style + /// Look for "type": "plugin-layer-metal-rendering" in the PluginLayerTestStyle.json for an example of how the layer is defined + [self.styleNames addObject:@"MapLibre Basic - Local With Plugin"]; + NSURL *url = [[NSBundle mainBundle] URLForResource:@"PluginLayerTestStyle.json" withExtension:nil]; + [self.styleURLs addObject:url]; + /// Add MapLibre Styles if an `apiKey` exists NSString* apiKey = [MLNSettings apiKey]; if (apiKey.length) diff --git a/platform/ios/bazel/files.bzl b/platform/ios/bazel/files.bzl index 4667a1da83ed..bf9d220cdfce 100644 --- a/platform/ios/bazel/files.bzl +++ b/platform/ios/bazel/files.bzl @@ -11,7 +11,7 @@ MLN_IOS_SDK_HEADERS = [ "src/MLNUserLocation.h", "src/MLNUserLocationAnnotationView.h", "src/MLNUserLocationAnnotationViewStyle.h", - "src/MLNScaleBar.h", + "src/MLNScaleBar.h" ] MLN_IOS_PUBLIC_HEADERS = [ diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index f8455efe35fd..05107dac0cf3 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -19,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN @class MLNPolygon; @class MLNScaleBar; @class MLNShape; +@class MLNPluginLayer; @protocol MLNMapViewDelegate; @protocol MLNAnnotation; @@ -2252,6 +2253,11 @@ vertically on the map. */ - (void)triggerRepaint; +/** + Adds a plug-in layer that is external to this library + */ +- (void)addPluginLayerType:(Class)pluginLayerClass; + @end NS_ASSUME_NONNULL_END diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 56de8dc12685..16acd1925826 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -26,6 +26,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include #import "Mapbox.h" #import "MLNShape_Private.h" @@ -72,6 +79,9 @@ #import "MLNSettings_Private.h" #import "MLNActionJournalOptions_Private.h" #import "MLNMapProjection.h" +#import "MLNPluginLayer.h" +#import "MLNStyleLayerManager.h" +#include "MLNPluginStyleLayer_Private.h" #include #include @@ -442,6 +452,9 @@ @interface MLNMapView () triggerRepaint(); } +/** + Adds a plug-in layer that is external to this library + */ +-(void)addPluginLayerType:(Class)pluginLayerClass { + + auto layerManager = mbgl::LayerManager::get(); + auto darwinLayerManager = (mbgl::LayerManagerDarwin *)layerManager; + + MLNPluginLayerCapabilities *capabilities = [pluginLayerClass layerCapabilities]; + + std::string layerType = [capabilities.layerID UTF8String]; + + // Default values + mbgl::style::LayerTypeInfo::Source source = mbgl::style::LayerTypeInfo::Source::NotRequired; + mbgl::style::LayerTypeInfo::TileKind tileKind = mbgl::style::LayerTypeInfo::TileKind::NotRequired; + mbgl::style::LayerTypeInfo::FadingTiles fadingTiles = mbgl::style::LayerTypeInfo::FadingTiles::NotRequired; + mbgl::style::LayerTypeInfo::Layout layout = mbgl::style::LayerTypeInfo::Layout::NotRequired; + mbgl::style::LayerTypeInfo::CrossTileIndex crossTileIndex = mbgl::style::LayerTypeInfo::CrossTileIndex::NotRequired; + + mbgl::style::LayerTypeInfo::Pass3D pass3D = mbgl::style::LayerTypeInfo::Pass3D::NotRequired; + if (capabilities.requiresPass3D) { + pass3D = mbgl::style::LayerTypeInfo::Pass3D::Required; + } + + auto factory = std::make_unique(layerType, + source, + pass3D, + layout, + fadingTiles, + crossTileIndex, + tileKind); + + __weak MLNMapView *weakMapView = self; + + Class layerClass = pluginLayerClass; + factory->setOnLayerCreatedEvent([layerClass, weakMapView, pluginLayerClass](mbgl::style::PluginLayer *pluginLayer) { + + //NSLog(@"Creating Plugin Layer: %@", layerClass); + MLNPluginLayer *layer = [[layerClass alloc] init]; + if (!weakMapView.pluginLayers) { + weakMapView.pluginLayers = [NSMutableArray array]; + } + [weakMapView.pluginLayers addObject:layer]; + + // Use weak here so there isn't a retain cycle + MLNPluginLayer *weakPlugInLayer = layer; + + pluginLayer->_platformReference = (__bridge void *)layer; + + MLNPluginLayerCapabilities *capabilities = [pluginLayerClass layerCapabilities]; + auto pluginLayerImpl = (mbgl::style::PluginLayer::Impl *)pluginLayer->baseImpl.get(); + auto & pm = pluginLayerImpl->_propertyManager; + for (MLNPluginLayerProperty *property in capabilities.layerProperties) { + mbgl::style::PluginLayerProperty *p = new mbgl::style::PluginLayerProperty(); + switch (property.propertyType) { + case MLNPluginLayerPropertyTypeSingleFloat: + p->_propertyType = mbgl::style::PluginLayerProperty::PropertyType::SingleFloat; + p->_defaultSingleFloatValue = property.singleFloatDefaultValue; + break; + case MLNPluginLayerPropertyTypeColor: + { + p->_propertyType = mbgl::style::PluginLayerProperty::PropertyType::Color; + if (property.colorDefaultValue) { + CGFloat r, g, b, a; + [property.colorDefaultValue getRed:&r green:&g blue:&b alpha:&a]; + p->_defaultColorValue = mbgl::Color(r, g, b, a); + } + } + break; + default: + p->_propertyType = mbgl::style::PluginLayerProperty::PropertyType::Unknown; + break; + } + p->_propertyName = [property.propertyName UTF8String]; + pm.addProperty(p); + } + + // Set the render function + auto renderFunction = [weakPlugInLayer, weakMapView](mbgl::PaintParameters& paintParameters){ + + const mbgl::mtl::RenderPass& renderPass = static_cast(*paintParameters.renderPass); + id encoder = (__bridge id)renderPass.getMetalEncoder().get(); + + MLNMapView *strongMapView = weakMapView; + + const mbgl::TransformState& state = paintParameters.state; + + MLNPluginLayerDrawingContext drawingContext; + drawingContext.size = CGSizeMake(state.getSize().width, + state.getSize().height); + drawingContext.centerCoordinate = CLLocationCoordinate2DMake(state.getLatLng().latitude(), + state.getLatLng().longitude()); + drawingContext.zoomLevel = state.getZoom(); + drawingContext.direction = mbgl::util::rad2deg(-state.getBearing()); + drawingContext.pitch = state.getPitch(); + drawingContext.fieldOfView = state.getFieldOfView(); + mbgl::mat4 projMatrix; + state.getProjMatrix(projMatrix); + drawingContext.projectionMatrix = MLNMatrix4Make(projMatrix); + + //NSLog(@"Rendering"); + + // Call update with the scene state variables + [weakPlugInLayer onUpdateLayer:drawingContext]; + + // Call render + [weakPlugInLayer onRenderLayer:strongMapView + renderEncoder:encoder]; + }; + + // Set the lambdas + //auto pluginLayerImpl = (mbgl::style::PluginLayer::Impl *)pluginLayer->baseImpl.get(); + pluginLayerImpl->setRenderFunction(renderFunction); + + // Set the update properties function + pluginLayerImpl->setUpdatePropertiesFunction([weakPlugInLayer](const std::string & jsonProperties) { + // Use autorelease pools in lambdas + @autoreleasepool { + // Just wrap the string with NSData so it can be run through properties + NSData *d = [NSData dataWithBytesNoCopy:(void *)jsonProperties.data() length:jsonProperties.length() freeWhenDone:NO]; + NSError *error = nil; + NSDictionary *properties = [NSJSONSerialization JSONObjectWithData:d + options:0 + error:&error]; + if (error) { + // TODO: What should we do here? + } + [weakPlugInLayer onUpdateLayerProperties:properties]; + } + }); + + }); + + // TODO: Same question as above. Do we ever want to have a core only layer type? + // This could actually be something that we could set in the layer capabilities class + darwinLayerManager->addLayerType(std::move(factory)); + //darwinLayerManager->addLayerTypeCoreOnly(std::move(factory)); + +} + - (NSArray*)getActionJournalLogFiles { const auto& actionJournal = _mbglMap->getActionJournal(); diff --git a/src/mbgl/layermanager/layer_manager.cpp b/src/mbgl/layermanager/layer_manager.cpp index 26c0e7413506..5dfeda299105 100644 --- a/src/mbgl/layermanager/layer_manager.cpp +++ b/src/mbgl/layermanager/layer_manager.cpp @@ -11,6 +11,8 @@ namespace mbgl { +void LayerManager::addLayerTypeCoreOnly(std::unique_ptr) {} + std::unique_ptr LayerManager::createLayer(const std::string& type, const std::string& id, const style::conversion::Convertible& value, diff --git a/src/mbgl/plugin/plugin_layer.cpp b/src/mbgl/plugin/plugin_layer.cpp new file mode 100644 index 000000000000..d976b83577bc --- /dev/null +++ b/src/mbgl/plugin/plugin_layer.cpp @@ -0,0 +1,84 @@ +#include +#include + +#include + +namespace mbgl { +namespace style { + +PluginLayer::PluginLayer(const std::string& layerID, + const std::string& sourceID, + const style::LayerTypeInfo layerTypeInfo, + const std::string& layerProperties + + //,const style::conversion::Convertible& layerProperties + ) + : Layer(makeMutable(layerID, sourceID, layerTypeInfo, layerProperties)) {} + +PluginLayer::PluginLayer(Immutable impl_) + : Layer(std::move(impl_)) {} + +PluginLayer::~PluginLayer() = default; + +const PluginLayer::Impl& PluginLayer::impl() const { + return static_cast(*baseImpl); +} + +Mutable PluginLayer::mutableImpl() const { + return makeMutable(impl()); +} + +std::unique_ptr PluginLayer::cloneRef(const std::string& id_) const { + auto impl_ = mutableImpl(); + impl_->id = id_; + return std::make_unique(std::move(impl_)); +} + +void PluginLayer::Impl::stringifyLayout(rapidjson::Writer&) const {} + +Value PluginLayer::serialize() const { + auto result = Layer::serialize(); + return result; +} + +std::optional PluginLayer::setPropertyInternal(const std::string& name, + const conversion::Convertible& value) { + auto i = static_cast(baseImpl.get()); + auto pm = i->_propertyManager; + + // The properties should be defined when the plugin layer is created + PluginLayerProperty* property = pm.getProperty(name); // i->_propertyManager.getProperty(name); + if (property == nullptr) { + return Error{"layer doesn't support this property"}; + } + + Error error; + if (property->_propertyType == PluginLayerProperty::PropertyType::SingleFloat) { + const auto& tempValue = convert>(value, error, false, false); + if (!tempValue) { + return error; + } + property->setSingleFloat(tempValue.value()); + } else if (property->_propertyType == PluginLayerProperty::PropertyType::Color) { + const auto& tempValue = convert>(value, error, false, false); + if (!tempValue) { + return error; + } + property->setColor(tempValue.value()); + } + + return std::nullopt; +} + +StyleProperty PluginLayer::getProperty([[maybe_unused]] const std::string& name) const { + // TODO: Implement this via callback + // return getLayerProperty(*this, name); + return {}; +} + +Mutable PluginLayer::mutableBaseImpl() const { + return staticMutableCast(mutableImpl()); +} + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer.hpp b/src/mbgl/plugin/plugin_layer.hpp new file mode 100644 index 000000000000..f8f95a4c4c70 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +namespace style { + +class PluginLayer final : public Layer { +public: + PluginLayer(const std::string& layerID, + const std::string& sourceID, + const style::LayerTypeInfo layerTypeInfo, + const std::string& layerProperties); + ~PluginLayer() override; + + // Private implementation + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + PluginLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; + +public: + using OnRenderLayer = std::function; + using OnUpdateLayer = std::function; + using OnUpdateLayerProperties = std::function; + + void* _platformReference = nullptr; + +protected: + std::optional setPropertyInternal(const std::string& name, + const conversion::Convertible& value) final; + + StyleProperty getProperty(const std::string& name) const final; + Value serialize() const final; + + Mutable mutableBaseImpl() const final; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_factory.cpp b/src/mbgl/plugin/plugin_layer_factory.cpp new file mode 100644 index 000000000000..f33fb701f29f --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_factory.cpp @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + +namespace plugins { + +// This is really hacky, but wanted to do it here to discuss if the +// const can be removed from teh regular LayerTypeInfo +struct NonConstLayerTypeInfo { + const char* type; + enum class Source { + Required, + NotRequired + } source; + enum class Pass3D { + Required, + NotRequired + } pass3d; + enum class Layout { + Required, + NotRequired + } layout; + enum class FadingTiles { + Required, + NotRequired + } fadingTiles; + enum class CrossTileIndex { + Required, + NotRequired + } crossTileIndex; + enum class TileKind : uint8_t { + Geometry, + Raster, + RasterDEM, + NotRequired + } tileKind; +}; + +} // namespace plugins + +style::LayerTypeInfo getDefaultInfo() { + style::LayerTypeInfo tempResult = {.type = "unknown", + .source = style::LayerTypeInfo::Source::Required, + .pass3d = style::LayerTypeInfo::Pass3D::Required, + .layout = style::LayerTypeInfo::Layout::NotRequired, + .fadingTiles = style::LayerTypeInfo::FadingTiles::NotRequired, + .crossTileIndex = style::LayerTypeInfo::CrossTileIndex::NotRequired, + .tileKind = style::LayerTypeInfo::TileKind::Geometry}; + return tempResult; +} + +PluginLayerFactory::PluginLayerFactory(std::string& layerType, + mbgl::style::LayerTypeInfo::Source source, + mbgl::style::LayerTypeInfo::Pass3D pass3D, + mbgl::style::LayerTypeInfo::Layout layout, + mbgl::style::LayerTypeInfo::FadingTiles fadingTiles, + mbgl::style::LayerTypeInfo::CrossTileIndex crossTileIndex, + mbgl::style::LayerTypeInfo::TileKind tileKind) + : _layerTypeInfo(getDefaultInfo()), + _layerType(layerType) { + _layerTypeInfo.type = layerType.c_str(); + plugins::NonConstLayerTypeInfo* lti = (plugins::NonConstLayerTypeInfo*)&_layerTypeInfo; + lti->source = (plugins::NonConstLayerTypeInfo::Source)((int)source); + lti->pass3d = (plugins::NonConstLayerTypeInfo::Pass3D)((int)pass3D); + lti->layout = (plugins::NonConstLayerTypeInfo::Layout)((int)layout); + lti->fadingTiles = (plugins::NonConstLayerTypeInfo::FadingTiles)((int)fadingTiles); + lti->crossTileIndex = (plugins::NonConstLayerTypeInfo::CrossTileIndex)((int)crossTileIndex); + lti->tileKind = (plugins::NonConstLayerTypeInfo::TileKind)((int)tileKind); +} + +const style::LayerTypeInfo* PluginLayerFactory::getTypeInfo() const noexcept { + return &_layerTypeInfo; +} + +void jsonStringFromConvertible(const style::conversion::Convertible& value, std::string& output) { + if (isObject(value)) { + output.append("{"); + bool firstItem = true; + eachMember(value, + [&output, &firstItem](const std::string& name, const style::conversion::Convertible& paramValue) + -> std::optional { + if (!firstItem) { + output.append(","); + } + firstItem = false; + output.append("\""); + output.append(name); + output.append("\":"); + + jsonStringFromConvertible(paramValue, output); + + return std::nullopt; + }); + output.append("}"); + } else if (isArray(value)) { + output.append("["); + bool firstItem = true; + + for (size_t i = 0; i < arrayLength(value); i++) { + if (!firstItem) { + output.append(","); + } + firstItem = false; + + auto itemValue = arrayMember(value, i); + jsonStringFromConvertible(itemValue, output); + } + + output.append("]"); + } else { + auto v = toValue(value); + if (auto iVal = v.value().getInt()) { + std::string tempResult = std::to_string(*iVal); + output.append(tempResult); + } else if (auto uIVal = v.value().getUint()) { + std::string tempResult = std::to_string(*uIVal); + output.append(tempResult); + + } else if (auto s = v.value().getString()) { + output.append("\""); + output.append(s->c_str()); + output.append("\""); + + } else if (auto d = v.value().getDouble()) { + output.append(std::to_string(*d)); + } + } +} + +std::unique_ptr PluginLayerFactory::createLayer(const std::string& id, + const style::conversion::Convertible& value) noexcept { + std::string layerProperties; + + if (auto memberValue = objectMember(value, "properties")) { + jsonStringFromConvertible(*memberValue, layerProperties); + if (isObject(*memberValue)) { + eachMember(*memberValue, + []([[maybe_unused]] const std::string& name, + [[maybe_unused]] const style::conversion::Convertible& paramValue) + -> std::optional { return std::nullopt; }); + } + } + + std::string source = "source"; + + auto tempResult = std::unique_ptr(new (std::nothrow) + style::PluginLayer(id, source, _layerTypeInfo, layerProperties + //,*customProperties + )); + + if (_onLayerCreated != nullptr) { + auto layerRaw = tempResult.get(); + auto pluginLayer = static_cast(layerRaw); + _onLayerCreated(pluginLayer); + auto pluginLayerImpl = (mbgl::style::PluginLayer::Impl*)pluginLayer->baseImpl.get(); + if (pluginLayerImpl->_updateLayerPropertiesFunction != nullptr) { + pluginLayerImpl->_updateLayerPropertiesFunction(layerProperties); + } + } + + return tempResult; +} + +std::unique_ptr PluginLayerFactory::createBucket( + [[maybe_unused]] const BucketParameters& parameters, + [[maybe_unused]] const std::vector>& layers) noexcept { + // Returning null for now. Not using buckets in plug-ins yet. + return nullptr; +} + +std::unique_ptr PluginLayerFactory::createRenderLayer(Immutable impl) noexcept { + auto localImpl = staticImmutableCast(impl); + auto tempResult = std::make_unique(staticImmutableCast(impl)); + tempResult->setRenderFunction(localImpl->_renderFunction); + tempResult->setUpdateFunction(localImpl->_updateFunction); + tempResult->setUpdatePropertiesFunction(localImpl->_updateLayerPropertiesFunction); + return tempResult; +} + +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_factory.hpp b/src/mbgl/plugin/plugin_layer_factory.hpp new file mode 100644 index 000000000000..0a976b37a9f1 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_factory.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include + +#include +#include + +namespace mbgl { + +namespace style { +// Forward +class PluginLayer; + +} // namespace style + +class PluginLayerFactory : public LayerFactory { +public: + PluginLayerFactory(std::string& layerType, + mbgl::style::LayerTypeInfo::Source source, + mbgl::style::LayerTypeInfo::Pass3D pass3D, + mbgl::style::LayerTypeInfo::Layout layout, + mbgl::style::LayerTypeInfo::FadingTiles fadingTiles, + mbgl::style::LayerTypeInfo::CrossTileIndex crossTileIndex, + mbgl::style::LayerTypeInfo::TileKind tileKind); + + using OnLayerCreatedEvent = std::function; + void setOnLayerCreatedEvent(OnLayerCreatedEvent onLayerCreated) { _onLayerCreated = onLayerCreated; } + +protected: + const style::LayerTypeInfo* getTypeInfo() const noexcept final; + std::unique_ptr createLayer(const std::string& id, + const style::conversion::Convertible& value) noexcept final; + std::unique_ptr createBucket(const BucketParameters&, + const std::vector>&) noexcept final; + std::unique_ptr createRenderLayer(Immutable) noexcept final; + +private: + // These is the layer type info that is setup during factory creation and returned in the getTypeInfo method + style::LayerTypeInfo _layerTypeInfo; + std::string _layerType; + + OnLayerCreatedEvent _onLayerCreated; +}; + +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_impl.cpp b/src/mbgl/plugin/plugin_layer_impl.cpp new file mode 100644 index 000000000000..d642d4809768 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_impl.cpp @@ -0,0 +1,99 @@ +#include + +#include + +namespace mbgl { +namespace style { + +PluginLayer::Impl::Impl(std::string layerID, + std::string sourceID, + LayerTypeInfo layerTypeInfo, + const std::string& layerProperties) + : Layer::Impl(layerID, sourceID), + _layerTypeInfo(layerTypeInfo), + _layerProperties(layerProperties) {} + +bool PluginLayer::Impl::hasLayoutDifference([[maybe_unused]] const Layer::Impl& other) const { + return false; +} + +// Return this property as json +std::string PluginLayerProperty::asJSON() { + std::string tempResult; + + if (_propertyType == PropertyType::SingleFloat) { + tempResult = "\"" + _propertyName + "\":" + std::to_string(_singleFloatValue); + } else if (_propertyType == PropertyType::Color) { + // In RGBA format + tempResult = "\"" + _propertyName + "\":\"" + _dataDrivenColorValue.stringify() + "\""; + } + + return tempResult; +} + +void PluginLayerProperty::setPropertyValue([[maybe_unused]] const conversion::Convertible& value) {} + +const PropertyValue& PluginLayerProperty::getSingleFloat() const { + return _singleFloatProperty; +} + +void PluginLayerProperty::setSingleFloat(const PropertyValue& value) { + _singleFloatProperty = std::move(value); +} + +void PluginLayerProperty::setCurrentSingleFloatValue(float value) { + _singleFloatValue = value; +} + +PluginLayerProperty* PluginLayerPropertyManager::getProperty(const std::string& propertyName) { + if (_properties.count(propertyName) > 0) { + return _properties[propertyName]; + } + return nullptr; +} + +void PluginLayerPropertyManager::addProperty(PluginLayerProperty* property) { + _properties[property->_propertyName] = property; +} + +std::string PluginLayerPropertyManager::propertiesAsJSON() { + std::string tempResult = "{"; + + bool firstItem = true; + for (auto d : _properties) { + if (!firstItem) { + tempResult.append(", "); + } + firstItem = false; + tempResult.append(d.second->asJSON()); + } + tempResult.append("}"); + + return tempResult; +} + +std::vector PluginLayerPropertyManager::getProperties() { + std::vector tempResult; + tempResult.reserve(_properties.size()); + for (auto it = _properties.begin(); it != _properties.end(); ++it) { + tempResult.push_back(it->second); + } + return tempResult; +} + +const PropertyValue& PluginLayerProperty::getColor() const { + return _dataDrivenColorProperty; +} + +void PluginLayerProperty::setColor(const PropertyValue& value) { + _dataDrivenColorProperty = std::move(value); +} + +void PluginLayerProperty::setCurrentColorValue(mbgl::Color value) { + _dataDrivenColorValue = value; +} + +namespace conversion {} // namespace conversion + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_impl.hpp b/src/mbgl/plugin/plugin_layer_impl.hpp new file mode 100644 index 000000000000..512cec427a33 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_impl.hpp @@ -0,0 +1,122 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { + +using namespace conversion; + +struct DataDrivenSingleFloatProperty : DataDrivenPaintProperty { + static float defaultValue() { return 1.f; } +}; + +struct DataDrivenColorProperty : DataDrivenPaintProperty { + static mbgl::Color defaultValue() { return mbgl::Color::black(); } + static constexpr auto expressionType() { return expression::type::ColorType{}; }; + using EvaluatorType = DataDrivenPropertyEvaluator; +}; + +class PluginLayerProperty { +public: + enum class PropertyType { + Unknown, + SingleFloat, + Color + }; + +public: + PropertyType _propertyType = PropertyType::Unknown; + std::string _propertyName; + void setPropertyValue(const conversion::Convertible& value); + +public: + const PropertyValue& getSingleFloat() const; + void setSingleFloat(const PropertyValue& value); + float _defaultSingleFloatValue = 1.0; + float _singleFloatValue = 0; + PropertyValue _singleFloatProperty; + void setCurrentSingleFloatValue(float value); + + // Color + const PropertyValue& getColor() const; + void setColor(const PropertyValue& value); + mbgl::Color _defaultColorValue = mbgl::Color::black(); + mbgl::Color _dataDrivenColorValue = mbgl::Color::black(); + PropertyValue _dataDrivenColorProperty; + void setCurrentColorValue(mbgl::Color value); + + // Return this property as json + std::string asJSON(); + +private: +}; + +class PluginLayerPropertyManager { +public: + PluginLayerProperty* getProperty(const std::string& propertyName); + void addProperty(PluginLayerProperty* property); + + std::string propertiesAsJSON(); + + std::vector getProperties(); + +private: + std::map _properties; +}; + +class PluginLayer::Impl : public Layer::Impl { +public: + Impl(std::string layerID, std::string sourceID, LayerTypeInfo layerTypeInfo, const std::string& layerProperties); + + using Layer::Impl::Impl; + + bool hasLayoutDifference(const Layer::Impl&) const override; + void stringifyLayout(rapidjson::Writer&) const override; + + const LayerTypeInfo* getTypeInfo() const noexcept final { return &_layerTypeInfo; } + + void setRenderFunction(OnRenderLayer renderFunction) { _renderFunction = renderFunction; } + + void setUpdateFunction(OnUpdateLayer updateFunction) { _updateFunction = updateFunction; } + + void setUpdatePropertiesFunction(OnUpdateLayerProperties updateLayerPropertiesFunction) { + _updateLayerPropertiesFunction = updateLayerPropertiesFunction; + } + + //! The property manager handles all of the custom properties for this layer type / instance + PluginLayerPropertyManager _propertyManager; + + //! Optional: Called when the layer is expected to render itself. + OnRenderLayer _renderFunction; + + //! Optional: Called when the layer is expected to update it's animations/etc. + // TODO: Does this need to be here or can it be done via the render function. Potentially, we could + // have this method called on a background thread/etc or use another way to parallalize work + OnUpdateLayer _updateFunction; + + //! Optional: Called when the layer properties change. The properties are passed as JSON for now + OnUpdateLayerProperties _updateLayerPropertiesFunction; + +private: + LayerTypeInfo _layerTypeInfo; + std::string _layerProperties; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_properties.cpp b/src/mbgl/plugin/plugin_layer_properties.cpp new file mode 100644 index 000000000000..bbf7a13304e1 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_properties.cpp @@ -0,0 +1,22 @@ + +#include +#include + +namespace mbgl { +namespace style { + +PluginLayerProperties::PluginLayerProperties(Immutable impl_) + : LayerProperties(std::move(impl_)) {} + +PluginLayerProperties::~PluginLayerProperties() = default; + +unsigned long PluginLayerProperties::constantsMask() const { + return 0; +} + +expression::Dependency PluginLayerProperties::getDependencies() const noexcept { + return expression::Dependency::None; +} + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_properties.hpp b/src/mbgl/plugin/plugin_layer_properties.hpp new file mode 100644 index 000000000000..68197468cbd7 --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_properties.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { + +class PluginLayerProperties final : public LayerProperties { +public: + PluginLayerProperties(Immutable); + ~PluginLayerProperties() override; + + unsigned long constantsMask() const override; + + expression::Dependency getDependencies() const noexcept override; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/plugin/plugin_layer_render.cpp b/src/mbgl/plugin/plugin_layer_render.cpp new file mode 100644 index 000000000000..5021fa33f82f --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_render.cpp @@ -0,0 +1,199 @@ +#include +#include +#include +#include +#include +#if MLN_RENDER_BACKEND_METAL +#include +#include +#else +#include +#endif +#include +#include +#include +#include + +#include + +using namespace mbgl; + +namespace mbgl { +namespace gfx { +class Drawable; +} +} // namespace mbgl + +class RenderPluginLayerTweaker : public mbgl::gfx::DrawableTweaker { +public: + RenderPluginLayerTweaker(RenderPluginLayer* plugInRenderer) + : _plugInRenderer(plugInRenderer) {} + ~RenderPluginLayerTweaker() override = default; + + void init(mbgl::gfx::Drawable&) override; + + void execute(mbgl::gfx::Drawable&, mbgl::PaintParameters&) override; + +protected: + RenderPluginLayer* _plugInRenderer = nullptr; +}; + +void RenderPluginLayerTweaker::init([[maybe_unused]] mbgl::gfx::Drawable& drawablee) { + +}; + +void RenderPluginLayerTweaker::execute([[maybe_unused]] mbgl::gfx::Drawable& drawable, + [[maybe_unused]] mbgl::PaintParameters& paintParameters) { + // custom drawing + auto& context = paintParameters.context; + context.resetState(paintParameters.depthModeForSublayer(0, mbgl::gfx::DepthMaskType::ReadOnly), + paintParameters.colorModeForRenderPass()); + +#if MLN_RENDER_BACKEND_METAL + const auto& mtlRenderPass = static_cast(paintParameters.renderPass.get()); + mtlRenderPass->resetState(); + + style::mtl::CustomLayerRenderParameters parameters(paintParameters); +#else + style::CustomLayerRenderParameters parameters(paintParameters); +#endif + + _plugInRenderer->render(paintParameters); + + // Reset the view back to our original one, just in case the CustomLayer + // changed the viewport or Framebuffer. + paintParameters.backend.getDefaultRenderable().getResource().bind(); + + context.setDirtyState(); + context.bindGlobalUniformBuffers(*paintParameters.renderPass); +} + +RenderPluginLayer::RenderPluginLayer(Immutable _impl) + : RenderLayer(makeMutable(std::move(_impl))) {} + +RenderPluginLayer::~RenderPluginLayer() = default; + +void RenderPluginLayer::markLayerRenderable([[maybe_unused]] bool willRender, + [[maybe_unused]] UniqueChangeRequestVec& changes) { + isRenderable = true; +} + +/// Generate any changes needed by the layer +void RenderPluginLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaderRegistery, + [[maybe_unused]] gfx::Context& context, + [[maybe_unused]] const TransformState& transformState, + [[maybe_unused]] const std::shared_ptr& updateParameters, + [[maybe_unused]] const RenderTree& renderTree, + [[maybe_unused]] UniqueChangeRequestVec& changes) { + // create layer group + if (!layerGroup) { + if (auto layerGroup_ = context.createLayerGroup(layerIndex, /*initialCapacity=*/1, getID())) { + setLayerGroup(std::move(layerGroup_), changes); + } + } + + auto* localLayerGroup = static_cast(layerGroup.get()); + + // TODO: Implement this + bool hostChanged = false; + + // create drawable + if (localLayerGroup->getDrawableCount() == 0 || hostChanged) { + localLayerGroup->clearDrawables(); + + // create tweaker + auto tweaker = std::make_shared(this); + + // create empty drawable using a builder + std::unique_ptr builder = context.createDrawableBuilder(getID()); + auto& drawable = builder->getCurrentDrawable(true); + drawable->setIsCustom(true); + drawable->setRenderPass(RenderPass::Translucent); + + // assign tweaker to drawable + drawable->addTweaker(tweaker); + + // add drawable to layer group + localLayerGroup->addDrawable(std::move(drawable)); + ++stats.drawablesAdded; + } +} + +void RenderPluginLayer::upload([[maybe_unused]] gfx::UploadPass& uploadPass) {} + +void RenderPluginLayer::render(PaintParameters& paintParameters) { + if (_renderFunction) { + _renderFunction(paintParameters); + } +} + +void RenderPluginLayer::prepare(const LayerPrepareParameters& layerParameters) { + if (_updateFunction) { + _updateFunction(layerParameters); + } +} + +// --- Private methods +void RenderPluginLayer::transition([[maybe_unused]] const TransitionParameters& parameters) { + // Called when switching between styles +} + +void RenderPluginLayer::evaluate(const PropertyEvaluationParameters& parameters) { + auto i = static_cast(baseImpl.get()); + + auto pm = i->_propertyManager; + for (auto property : pm.getProperties()) { + if (property->_propertyType == style::PluginLayerProperty::PropertyType::SingleFloat) { + auto& f = property->getSingleFloat(); + using Evaluator = typename style::DataDrivenSingleFloatProperty::EvaluatorType; + auto df = property->_defaultSingleFloatValue; + auto newF = f.evaluate(Evaluator(parameters, df), parameters.now); + auto v = newF.constant().value(); + property->setCurrentSingleFloatValue(v); + } else if (property->_propertyType == style::PluginLayerProperty::PropertyType::Color) { + auto& f = property->getColor(); + using Evaluator = typename style::DataDrivenColorProperty::EvaluatorType; + auto df = property->_defaultColorValue; + auto newF = f.evaluate(Evaluator(parameters, df), parameters.now); + auto v = newF.constant().value(); + property->setCurrentColorValue(v); + } + } + + std::string jsonProperties = pm.propertiesAsJSON(); + + i->_updateLayerPropertiesFunction(jsonProperties); +} + +bool RenderPluginLayer::hasTransition() const { + return true; +} + +bool RenderPluginLayer::hasCrossfade() const { + return false; +} +bool RenderPluginLayer::queryIntersectsFeature([[maybe_unused]] const GeometryCoordinates&, + [[maybe_unused]] const GeometryTileFeature&, + [[maybe_unused]] float, + [[maybe_unused]] const TransformState&, + [[maybe_unused]] float, + [[maybe_unused]] const mat4&, + [[maybe_unused]] const FeatureState&) const { + return false; +} + +void RenderPluginLayer::layerChanged([[maybe_unused]] const TransitionParameters& parameters, + [[maybe_unused]] const Immutable& impl, + [[maybe_unused]] UniqueChangeRequestVec& changes) {} + +/// Remove all drawables for the tile from the layer group +/// @return The number of drawables actually removed. +std::size_t RenderPluginLayer::removeTile([[maybe_unused]] RenderPass, [[maybe_unused]] const OverscaledTileID&) { + return 0; +} + +/// Remove all the drawables for tiles +/// @return The number of drawables actually removed. +std::size_t RenderPluginLayer::removeAllDrawables() { + return 0; +} diff --git a/src/mbgl/plugin/plugin_layer_render.hpp b/src/mbgl/plugin/plugin_layer_render.hpp new file mode 100644 index 000000000000..cc2ea2db7a6e --- /dev/null +++ b/src/mbgl/plugin/plugin_layer_render.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { + +class RenderPluginLayer final : public RenderLayer { +public: + explicit RenderPluginLayer(Immutable); + ~RenderPluginLayer() override; + + void markLayerRenderable(bool willRender, UniqueChangeRequestVec& changes) override; + + /// Generate any changes needed by the layer + void update(gfx::ShaderRegistry&, + gfx::Context&, + const TransformState&, + const std::shared_ptr&, + const RenderTree&, + UniqueChangeRequestVec&) override; + + void prepare(const LayerPrepareParameters&) override; + + void upload(gfx::UploadPass&) override; + void render(PaintParameters&) override; + + void setRenderFunction(style::PluginLayer::OnRenderLayer renderFunction) { _renderFunction = renderFunction; } + void setUpdateFunction(style::PluginLayer::OnUpdateLayer updateFunction) { _updateFunction = updateFunction; } + void setUpdatePropertiesFunction(style::PluginLayer::OnUpdateLayerProperties updateLayerPropertiesFunction) { + _updateLayerPropertiesFunction = updateLayerPropertiesFunction; + } + +private: + void transition(const TransitionParameters&) override; + void evaluate(const PropertyEvaluationParameters&) override; + bool hasTransition() const override; + bool hasCrossfade() const override; + bool queryIntersectsFeature(const GeometryCoordinates&, + const GeometryTileFeature&, + float, + const TransformState&, + float, + const mat4&, + const FeatureState&) const override; + void updateColorRamp(); + + void layerChanged(const TransitionParameters& parameters, + const Immutable& impl, + UniqueChangeRequestVec& changes) override; + + /// Remove all drawables for the tile from the layer group + /// @return The number of drawables actually removed. + std::size_t removeTile(RenderPass, const OverscaledTileID&) override; + + /// Remove all the drawables for tiles + /// @return The number of drawables actually removed. + std::size_t removeAllDrawables() override; + + // The render methods + style::PluginLayer::OnRenderLayer _renderFunction = nullptr; + + style::PluginLayer::OnUpdateLayer _updateFunction = nullptr; + + style::PluginLayer::OnUpdateLayerProperties _updateLayerPropertiesFunction = nullptr; +}; + +} // namespace mbgl diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index 2b7f7013204a..121a637bcf73 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -12,6 +12,14 @@ namespace mbgl { namespace style { +// Added this to support plugins and that their LayerTypeInfo isn't the same point +// across the board +bool layerTypeInfoEquals(const mbgl::style::LayerTypeInfo* one, const mbgl::style::LayerTypeInfo* other) { + return ((strcmp(one->type, other->type) == 0) && (one->source == other->source) && (one->pass3d == other->pass3d) && + (one->layout == other->layout) && (one->fadingTiles == other->fadingTiles) && + (one->crossTileIndex == other->crossTileIndex) && (one->tileKind == other->tileKind)); +}; + static_assert(mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(LayerTypeInfo::TileKind::Geometry), "tile kind error"); static_assert(mbgl::underlying_type(Tile::Kind::Raster) == mbgl::underlying_type(LayerTypeInfo::TileKind::Raster), diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 940c1e658504..162caf3a7868 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,6 +18,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/math/minmax.test.cpp ${PROJECT_SOURCE_DIR}/test/math/wrap.test.cpp ${PROJECT_SOURCE_DIR}/test/platform/settings.test.cpp + ${PROJECT_SOURCE_DIR}/test/plugin/plugin.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/image_manager.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/pattern_atlas.test.cpp ${PROJECT_SOURCE_DIR}/test/renderer/shader_registry.test.cpp diff --git a/test/plugin/plugin.test.cpp b/test/plugin/plugin.test.cpp new file mode 100644 index 000000000000..319218ae3d6f --- /dev/null +++ b/test/plugin/plugin.test.cpp @@ -0,0 +1,236 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +using namespace mbgl; +using namespace mbgl::style; +using namespace std::literals::string_literals; + +template +class MapTest { +public: + util::RunLoop runLoop; + std::shared_ptr fileSource; + StubMapObserver observer; + Frontend frontend; + MapAdapter map; + + MapTest(float pixelRatio = 1, MapMode mode = MapMode::Static) + : fileSource(std::make_shared(ResourceOptions::Default(), ClientOptions())), + frontend(pixelRatio), + map(frontend, + observer, + fileSource, + MapOptions().withMapMode(mode).withSize(frontend.getSize()).withPixelRatio(pixelRatio)) {} + + explicit MapTest(MapOptions options) + : fileSource(std::make_shared()), + frontend(options.pixelRatio()), + map(frontend, observer, fileSource, options.withSize(frontend.getSize())) {} + + template + MapTest(const std::string& cachePath, + const std::string& assetPath, + float pixelRatio = 1, + MapMode mode = MapMode::Static, + typename std::enable_if_t>* = nullptr) + : fileSource(std::make_shared(ResourceOptions().withCachePath(cachePath).withAssetPath(assetPath), + ClientOptions())), + frontend(pixelRatio), + map(frontend, + observer, + fileSource, + MapOptions().withMapMode(mode).withSize(frontend.getSize()).withPixelRatio(pixelRatio)) {} + + template + MapTest(const ResourceOptions& resourceOptions, + const ClientOptions& clientOptions = ClientOptions(), + float pixelRatio = 1, + MapMode mode = MapMode::Static) + : fileSource(std::make_shared(resourceOptions, clientOptions)), + frontend(pixelRatio), + map(frontend, + observer, + fileSource, + MapOptions().withMapMode(mode).withSize(frontend.getSize()).withPixelRatio(pixelRatio)) {} +}; + +TEST(Plugin, PluginLayerProperty) { + bool _singleFloatValid = false; + bool _colorValid = false; + + std::cout << "Test: Plugin.PluginLayerProperty\n"; + + { + PluginLayerProperty p; + p._propertyType = PluginLayerProperty::PropertyType::SingleFloat; + p._singleFloatValue = 1.0; + auto json = p.asJSON(); + std::string testValue = R"("":1.000000)"; + std::cout << " _singleFloatValid: " << json << ";|" << testValue << "|\n"; + _singleFloatValid = json == testValue; + EXPECT_STREQ(testValue.c_str(), json.c_str()); + } + + { + PluginLayerProperty p; + p._propertyType = PluginLayerProperty::PropertyType::Color; + p._dataDrivenColorValue = Color(1, 1, 1, 1); + auto json = p.asJSON(); + std::string testValue = R"JSON("":"rgba(255,255,255,1)")JSON"; + std::cout << " _colorValid: |" << json << "|;|" << testValue << "|\n"; + _colorValid = json == testValue; + EXPECT_STREQ(testValue.c_str(), json.c_str()); + } + + ASSERT_TRUE(_colorValid); + ASSERT_TRUE(_singleFloatValid); +} + +TEST(Plugin, PluginLayerPropertyManager) { + PluginLayerPropertyManager pm; + PluginLayerProperty* p1 = new PluginLayerProperty(); + p1->_propertyType = PluginLayerProperty::PropertyType::SingleFloat; + p1->_propertyName = "float"; + p1->_singleFloatValue = 1.0; + pm.addProperty(p1); + + PluginLayerProperty* p2 = new PluginLayerProperty(); + p2->_propertyType = PluginLayerProperty::PropertyType::Color; + p2->_propertyName = "color"; + p2->_dataDrivenColorValue = Color(1, 1, 1, 1); + pm.addProperty(p2); + + auto json = pm.propertiesAsJSON(); + + std::cout << "Test: Plugin.PluginLayerPropertyManager\n"; + std::string testValue = R"JSON({"color":"rgba(255,255,255,1)", "float":1.000000})JSON"; + std::cout << " JSON: |" << json << "|;|" << testValue << "|\n"; + EXPECT_STREQ(testValue.c_str(), json.c_str()); + + bool _jsonValid = (json == testValue); + ASSERT_TRUE(_jsonValid); +} + +TEST(Plugin, PluginLayer) { + bool _layerCreated = false; + bool _initialPropertiesFound = false; + bool _layerRendered = false; + bool _paintPropertiesFound = false; + + // Create the plug-in layer type + std::string layerType = "plugin-layer-test"; + auto pluginLayerFactory = std::make_unique( + layerType, + mbgl::style::LayerTypeInfo::Source::NotRequired, + mbgl::style::LayerTypeInfo::Pass3D::NotRequired, + mbgl::style::LayerTypeInfo::Layout::NotRequired, + mbgl::style::LayerTypeInfo::FadingTiles::NotRequired, + mbgl::style::LayerTypeInfo::CrossTileIndex::NotRequired, + mbgl::style::LayerTypeInfo::TileKind::NotRequired); + pluginLayerFactory->setOnLayerCreatedEvent( + [&_layerRendered, &_layerCreated, &_initialPropertiesFound, &_paintPropertiesFound]( + mbgl::style::PluginLayer* pluginLayer) { + // std::cout << "On Layer Created\n"; + _layerCreated = true; + + auto pluginLayerImpl = (mbgl::style::PluginLayer::Impl*)pluginLayer->baseImpl.get(); + auto& pm = pluginLayerImpl->_propertyManager; + PluginLayerProperty* p = new PluginLayerProperty(); + p->_propertyName = "scale"; + p->_propertyType = PluginLayerProperty::PropertyType::SingleFloat; + p->_defaultSingleFloatValue = 1.0; + pm.addProperty(p); + pluginLayerImpl->setRenderFunction([&_layerRendered]([[maybe_unused]] PaintParameters& paintParameters) { + // std::cout << "On Layer Rendered\n"; + // std::cout << " Paint Properties.currentLayer: " << paintParameters.currentLayer << + // "\n"; + _layerRendered = true; + }); + + pluginLayerImpl->setUpdatePropertiesFunction( + [&_initialPropertiesFound, &_paintPropertiesFound](const std::string& properties) { + // std::cout << "On Layer Update Properties\n"; + // std::cout << " -> " << properties << "\n"; + + auto propertiesCheck = R"({"custom-property1":"custom-property-value1"})"; + if (properties == propertiesCheck) { + _initialPropertiesFound = true; + } + if (properties.find("scale") > 0) { + _paintPropertiesFound = true; + } + }); + }); + + auto lm = LayerManager::get(); + lm->addLayerTypeCoreOnly(std::move(pluginLayerFactory)); + + MapTest<> test{1, MapMode::Continuous}; + test.map.getStyle().loadJSON(R"STYLE({ + "version": 8, + "layers": [{ + "id": "plugin-layer-1", + "type": "plugin-layer-test", + "properties": { + "custom-property1":"custom-property-value1" + }, + "paint": {"scale": 1.0 } + }] + })STYLE"); + + for (int i = 0; i < 10; i++) { + test.runLoop.runOnce(); + } + + ASSERT_TRUE(_layerCreated); + ASSERT_TRUE(_initialPropertiesFound); + ASSERT_TRUE(_layerRendered); + ASSERT_TRUE(_paintPropertiesFound); +} From ec531339266acf2b8439ab377e6bb77e8ccc849c Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Thu, 26 Jun 2025 08:44:15 -0400 Subject: [PATCH 247/339] Symbol Shader Performance Improvments (#3576) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- include/mbgl/shaders/mtl/symbol.hpp | 67 +++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/include/mbgl/shaders/mtl/symbol.hpp b/include/mbgl/shaders/mtl/symbol.hpp index 118eb5b61d91..fc6bdcb080f8 100644 --- a/include/mbgl/shaders/mtl/symbol.hpp +++ b/include/mbgl/shaders/mtl/symbol.hpp @@ -70,6 +70,8 @@ struct alignas(16) SymbolEvaluatedPropsUBO { }; static_assert(sizeof(SymbolEvaluatedPropsUBO) == 6 * 16, "wrong size"); +#define c_offscreen_degenerate_triangle_location -2.0 + )"; template <> @@ -117,6 +119,26 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + const float2 raw_fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + const float fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); + +#if defined(HAS_UNIFORM_u_opacity) + const half fo = half(fade_opacity); +#else + const half fo = half(unpack_mix_float(vertx.opacity, drawable.opacity_t) * fade_opacity); +#endif + + // This will check to see if the opacity is zero and push the triangle offscreen if it is + // so the GPU will cull the vertex and never send it to the fragment shader + if (fo == 0.0) { + return { + .position = float4(c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, 1.0), + }; + } + const float2 a_pos = vertx.pos_offset.xy; const float2 a_offset = vertx.pos_offset.zw; @@ -172,17 +194,13 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], const float2 posOffset = a_offset * max(a_minFontScale, fontScale) / 32.0 + a_pxoffset / 16.0; const float4 position = drawable.coord_matrix * float4(pos0 + rotation_matrix * posOffset, 0.0, 1.0); - const float2 raw_fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = raw_fade_opacity[1] > 0.5 ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; - const float fade_opacity = max(0.0, min(1.0, raw_fade_opacity[0] + fade_change)); - return { .position = position, .tex = half2(a_tex / drawable.texsize), #if defined(HAS_UNIFORM_u_opacity) - .fade_opacity = half(fade_opacity), + .fade_opacity = fo, #else - .opacity = half(unpack_mix_float(vertx.opacity, drawable.opacity_t) * fade_opacity), + .opacity = fo, #endif }; } @@ -280,6 +298,20 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + const half fo = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))); + + // This will check to see if the opacity is zero and push the triangle offscreen if it is + // so the GPU will cull the vertex and never send it to the fragment shader + if (fo == 0.0) { + return { + .position = float4(c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, 1.0), + }; + } + const float2 a_pos = vertx.pos_offset.xy; const float2 a_offset = vertx.pos_offset.zw; @@ -340,8 +372,6 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], const float2 pos_rot = a_offset / 32.0 * fontScale + a_pxoffset; const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); - const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; return { .position = position, @@ -363,7 +393,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .tex = half2(a_tex / drawable.texsize), .gamma_scale = half(position.w), .fontScale = half(fontScale), - .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), + .fade_opacity = fo, }; } @@ -493,6 +523,20 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], device const SymbolDrawableUBO& drawable = drawableVector[uboIndex]; + const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); + const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; + const half fo = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))); + + // This will check to see if the opacity is zero and push the triangle offscreen if it is + // so the GPU will cull the vertex and never send it to the fragment shader + if (fo == 0.0) { + return { + .position = float4(c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, + c_offscreen_degenerate_triangle_location, 1.0), + }; + } + const float2 a_pos = vertx.pos_offset.xy; const float2 a_offset = vertx.pos_offset.zw; @@ -555,9 +599,6 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], const float2 pos0 = projected_pos.xy / projected_pos.w + rotation_matrix * pos_rot; const float4 position = drawable.coord_matrix * float4(pos0, 0.0, 1.0); const float gamma_scale = position.w; - - const float2 fade_opacity = unpack_opacity(vertx.fade_opacity); - const float fade_change = (fade_opacity[1] > 0.5) ? paintParams.symbol_fade_change : -paintParams.symbol_fade_change; const bool is_icon = (is_sdf == ICON); return { @@ -565,7 +606,7 @@ FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], .tex = half2(a_tex / (is_icon ? drawable.texsize_icon : drawable.texsize)), .gamma_scale = half(gamma_scale), .fontScale = half(fontScale), - .fade_opacity = half(max(0.0, min(1.0, fade_opacity[0] + fade_change))), + .fade_opacity = fo, .is_icon = is_icon, #if !defined(HAS_UNIFORM_u_fill_color) From 096c0265402e8e9dc6471f86daefd4ce5a47c92d Mon Sep 17 00:00:00 2001 From: petrjanda72 <86776763+petrjanda72@users.noreply.github.com> Date: Sat, 28 Jun 2025 00:06:00 +0200 Subject: [PATCH 248/339] Add an option to reverse the direction of the quick zoom gesture (#3587) --- platform/ios/src/MLNMapView.h | 9 +++++++++ platform/ios/src/MLNMapView.mm | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index 05107dac0cf3..d380ee80e80f 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -768,6 +768,15 @@ MLN_EXPORT */ @property (nonatomic, getter=isZoomEnabled) BOOL zoomEnabled; +/** + A boolean value that reverses the direction of the quick zoom gesture. + + When this property is set, the zoom-in and zoom-out behavior during the quick + zoom gesture (also called one-finger zoom) is reversed, aligning with the + behavior in Apple Maps. The default value is `NO`. + */ +@property (nonatomic, getter=isQuickZoomReversed) BOOL quickZoomReversed; + /** A Boolean value that determines whether the user may scroll around the map, changing the center coordinate. diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 16acd1925826..1337f0c6bd36 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -861,6 +861,7 @@ - (void)commonInitWithOptions:(MLNMapOptions*)mlnMapoptions _pinch.delegate = self; [self addGestureRecognizer:_pinch]; _zoomEnabled = YES; + _quickZoomReversed = NO; #if TARGET_IPHONE_SIMULATOR & (TARGET_CPU_X86 | TARGET_CPU_X86_64) if (isM1Simulator) { @@ -2667,6 +2668,8 @@ - (void)handleQuickZoomGesture:(UILongPressGestureRecognizer *)quickZoom { CGFloat distance = [quickZoom locationInView:quickZoom.view].y - self.quickZoomStart; + if (self.isQuickZoomReversed) distance = - distance; + CGFloat newZoom = MAX(log2f(self.scale) + (distance / 75), *self.mbglMap.getBounds().minZoom); if ([self zoomLevel] == newZoom) return; @@ -3183,6 +3186,12 @@ - (void)setZoomEnabled:(BOOL)zoomEnabled self.twoFingerTap.enabled = zoomEnabled; } +- (void)setQuickZoomReversed:(BOOL)quickZoomReversed +{ + MLNLogDebug(@"Setting quickZoomReversed: %@", MLNStringFromBOOL(quickZoomReversed)); + _quickZoomReversed = quickZoomReversed; +} + - (void)setScrollEnabled:(BOOL)scrollEnabled { MLNLogDebug(@"Setting scrollEnabled: %@", MLNStringFromBOOL(scrollEnabled)); From 1826e61338d8a99cc92f1ebe56a6fa9b659541f3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 28 Jun 2025 01:54:02 +0200 Subject: [PATCH 249/339] Release MapLibre iOS 6.16.0 (#3588) --- platform/ios/CHANGELOG.md | 13 +++++++++++++ platform/ios/VERSION | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index dd57e29c3e51..c2214d05105c 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,19 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.16.0 + +- Add run-time plug-in layer support to iOS ([#3430](https://github.com/maplibre/maplibre-native/pull/3430)). + Documentation: https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre-native-for-ios/pluginlayers + +- Fix nullability of attributionHtmlString ([#3551](https://github.com/maplibre/maplibre-native/pull/3551)). +- Fix the symbol blink issue by only placing the symbol in current level ([#3534](https://github.com/maplibre/maplibre-native/pull/3534)). +- add functionality to metal render pass to cache winding order and cull mode ([#3566](https://github.com/maplibre/maplibre-native/pull/3566)). +- Add polylines with geographic coordinates for custom drawables ([#3547](https://github.com/maplibre/maplibre-native/pull/3547)). +- Reduce duplicate GPU buffer uploads ([#3577](https://github.com/maplibre/maplibre-native/pull/3577)). +- Symbol Shader Performance Improvments ([#3576](https://github.com/maplibre/maplibre-native/pull/3576)). +- Add an option to reverse the direction of the quick zoom gesture ([#3587](https://github.com/maplibre/maplibre-native/pull/3587)). + ## 6.15.0 - Add action journal ([#3409](https://github.com/maplibre/maplibre-native/pull/3409)). Documentation: https://maplibre.org/maplibre-native/ios/latest/documentation/maplibre-native-for-ios/actionjournalexample diff --git a/platform/ios/VERSION b/platform/ios/VERSION index a3748c562100..bfec95bf0e14 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.15.0 +6.16.0 From f7eab2059027aa2b1ea8ba1a9f37e9b8bcebf507 Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Fri, 4 Jul 2025 12:37:38 -0400 Subject: [PATCH 250/339] Fix render pipeline state bug (#3598) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”> --- src/mbgl/mtl/context.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index 81f13ada1cb1..d7d276eeb43e 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -382,7 +382,7 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, } } if (clipMaskPipelineState) { - encoder->setRenderPipelineState(clipMaskPipelineState.get()); + mtlRenderPass.setRenderPipelineState(clipMaskPipelineState); } else { assert(!"Failed to create render pipeline state for clip masking"); return false; From 9ae85e6eb65e54bfb04af229eeb68e66a28e9ae0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 4 Jul 2025 20:47:44 +0200 Subject: [PATCH 251/339] Publish MapLibre Android to Maven Central (#3603) --- .github/workflows/android-release.yml | 4 ++-- platform/android/build.gradle.kts | 8 ++++---- .../src/main/kotlin/maplibre.publish-root.gradle.kts | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index bd37deb13a93..9ed48c732edb 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -146,8 +146,8 @@ jobs: ./gradlew :MapLibreAndroid:publishVulkan${{ env.buildtype }}PublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository fi env: - OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} diff --git a/platform/android/build.gradle.kts b/platform/android/build.gradle.kts index c830ffbd021f..a992c50ae1bd 100644 --- a/platform/android/build.gradle.kts +++ b/platform/android/build.gradle.kts @@ -12,10 +12,10 @@ nexusPublishing { repositories { sonatype { stagingProfileId.set(extra["sonatypeStagingProfileId"] as String?) - username.set(extra["ossrhUsername"] as String?) - password.set(extra["ossrhPassword"] as String?) - nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/")) - snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")) + username.set(extra["mavenCentralUsername"] as String?) + password.set(extra["mavenCentralPassword"] as String?) + nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) + snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) } } } diff --git a/platform/android/buildSrc/src/main/kotlin/maplibre.publish-root.gradle.kts b/platform/android/buildSrc/src/main/kotlin/maplibre.publish-root.gradle.kts index 850a72588d56..e70c2a3f08a6 100644 --- a/platform/android/buildSrc/src/main/kotlin/maplibre.publish-root.gradle.kts +++ b/platform/android/buildSrc/src/main/kotlin/maplibre.publish-root.gradle.kts @@ -1,6 +1,6 @@ extra["signing.keyId"] = System.getenv("SIGNING_KEY_ID") extra["signing.password"] = System.getenv("SIGNING_PASSWORD") extra["signing.secretKeyRingFile"] = "${projectDir}/../signing-key.gpg" -extra["ossrhUsername"] = System.getenv("OSSRH_USERNAME") -extra["ossrhPassword"] = System.getenv("OSSRH_PASSWORD") +extra["mavenCentralUsername"] = System.getenv("MAVEN_CENTRAL_USERNAME") +extra["mavenCentralPassword"] = System.getenv("MAVEN_CENTRAL_PASSWORD") extra["sonatypeStagingProfileId"] = System.getenv("SONATYPE_STAGING_PROFILE_ID") From 2f617962999282c8beaf1d90b9db64918a7780a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 18:56:13 +0000 Subject: [PATCH 252/339] Update dependency gradle to v8.14.3 (#3442) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- benchmark/android/gradlew | 4 ++-- benchmark/android/gradlew.bat | 4 ++-- .../gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- platform/android/MapLibrePlugin/gradlew | 4 ++-- platform/android/MapLibrePlugin/gradlew.bat | 4 ++-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradlew | 4 ++-- render-test/android/gradlew.bat | 4 ++-- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- test/android/gradlew | 4 ++-- test/android/gradlew.bat | 4 ++-- 17 files changed, 21 insertions(+), 21 deletions(-) diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.jar b/benchmark/android/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.properties b/benchmark/android/gradle/wrapper/gradle-wrapper.properties index ed4c299adbd5..7705927e949f 100644 --- a/benchmark/android/gradle/wrapper/gradle-wrapper.properties +++ b/benchmark/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/benchmark/android/gradlew b/benchmark/android/gradlew index faf93008b77e..23d15a936707 100755 --- a/benchmark/android/gradlew +++ b/benchmark/android/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/benchmark/android/gradlew.bat b/benchmark/android/gradlew.bat index 9b42019c7915..5eed7ee84528 100644 --- a/benchmark/android/gradlew.bat +++ b/benchmark/android/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.jar b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties index 37f853b1c84d..d4081da476bb 100644 --- a/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/MapLibrePlugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/platform/android/MapLibrePlugin/gradlew b/platform/android/MapLibrePlugin/gradlew index faf93008b77e..23d15a936707 100755 --- a/platform/android/MapLibrePlugin/gradlew +++ b/platform/android/MapLibrePlugin/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/platform/android/MapLibrePlugin/gradlew.bat b/platform/android/MapLibrePlugin/gradlew.bat index 9b42019c7915..5eed7ee84528 100644 --- a/platform/android/MapLibrePlugin/gradlew.bat +++ b/platform/android/MapLibrePlugin/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/platform/android/gradle/wrapper/gradle-wrapper.properties b/platform/android/gradle/wrapper/gradle-wrapper.properties index 37f853b1c84d..d4081da476bb 100644 --- a/platform/android/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradle/wrapper/gradle-wrapper.jar b/render-test/android/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/render-test/android/gradle/wrapper/gradle-wrapper.properties b/render-test/android/gradle/wrapper/gradle-wrapper.properties index ed4c299adbd5..7705927e949f 100644 --- a/render-test/android/gradle/wrapper/gradle-wrapper.properties +++ b/render-test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradlew b/render-test/android/gradlew index faf93008b77e..23d15a936707 100755 --- a/render-test/android/gradlew +++ b/render-test/android/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/render-test/android/gradlew.bat b/render-test/android/gradlew.bat index 9b42019c7915..5eed7ee84528 100644 --- a/render-test/android/gradlew.bat +++ b/render-test/android/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/test/android/gradle/wrapper/gradle-wrapper.jar b/test/android/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/test/android/gradle/wrapper/gradle-wrapper.properties b/test/android/gradle/wrapper/gradle-wrapper.properties index ed4c299adbd5..7705927e949f 100644 --- a/test/android/gradle/wrapper/gradle-wrapper.properties +++ b/test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/test/android/gradlew b/test/android/gradlew index faf93008b77e..23d15a936707 100755 --- a/test/android/gradlew +++ b/test/android/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/test/android/gradlew.bat b/test/android/gradlew.bat index 9b42019c7915..5eed7ee84528 100644 --- a/test/android/gradlew.bat +++ b/test/android/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 617de029fadea3d0c9e0ba1c6b522703c85fe36f Mon Sep 17 00:00:00 2001 From: AtlasProgramming Date: Fri, 4 Jul 2025 15:52:12 -0400 Subject: [PATCH 253/339] Added the nearClippedProjMatrix to the drawing context (#3599) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”> Co-authored-by: Bart Louwers --- platform/darwin/src/MLNPluginLayer.h | 3 +++ platform/ios/src/MLNMapView.mm | 7 ++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/darwin/src/MLNPluginLayer.h b/platform/darwin/src/MLNPluginLayer.h index b188e4fb2376..2e977b8d09c7 100644 --- a/platform/darwin/src/MLNPluginLayer.h +++ b/platform/darwin/src/MLNPluginLayer.h @@ -80,6 +80,9 @@ typedef struct MLNPluginLayerDrawingContext { CGFloat fieldOfView; /// A 4×4 matrix representing the map view’s current projection state. MLNMatrix4 projectionMatrix; + /// A 4×4 matrix representing the map view’s current near clip projection state. + MLNMatrix4 nearClippedProjMatrix; + } MLNPluginLayerDrawingContext; MLN_EXPORT diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 1337f0c6bd36..4834869746e3 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -7748,11 +7748,8 @@ -(void)addPluginLayerType:(Class)pluginLayerClass { drawingContext.direction = mbgl::util::rad2deg(-state.getBearing()); drawingContext.pitch = state.getPitch(); drawingContext.fieldOfView = state.getFieldOfView(); - mbgl::mat4 projMatrix; - state.getProjMatrix(projMatrix); - drawingContext.projectionMatrix = MLNMatrix4Make(projMatrix); - - //NSLog(@"Rendering"); + drawingContext.projectionMatrix = MLNMatrix4Make(paintParameters.transformParams.projMatrix); + drawingContext.nearClippedProjMatrix = MLNMatrix4Make(paintParameters.transformParams.nearClippedProjMatrix); // Call update with the scene state variables [weakPlugInLayer onUpdateLayer:drawingContext]; From 155e9477a9ae322abd407367ce45fb4e7514e98f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 4 Jul 2025 21:52:35 +0200 Subject: [PATCH 254/339] Update MapLibre logo README.md (#3590) --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 76b121e48f78..fc77c0b33635 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -[![MapLibre Logo](https://maplibre.org/img/maplibre-logo-big.svg)](https://maplibre.org/) +

+ MapLibre Logo + MapLibre Logo +

# MapLibre Native @@ -21,7 +24,7 @@ Add [the latest version](https://central.sonatype.com/artifact/org.maplibre.gl/a ```gradle dependencies { ... - implementation 'org.maplibre.gl:android-sdk:11.8.5' + implementation 'org.maplibre.gl:android-sdk:11.11.0' ... } ``` From 113739099b8d217399c7684c5fe0c2303ca037b2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 7 Jul 2025 13:45:14 +0200 Subject: [PATCH 255/339] Fix GeoJSONClusteringActivity (#3604) --- .../testapp/activity/style/GeoJsonClusteringActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt index c349baa3bce3..c95745646a68 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt @@ -222,7 +222,8 @@ class GeoJsonClusteringActivity : AppCompatActivity() { PropertyFactory.textSize(12f), PropertyFactory.textColor(Color.WHITE), PropertyFactory.textIgnorePlacement(true), - PropertyFactory.textAllowOverlap(true) + PropertyFactory.textAllowOverlap(true), + PropertyFactory.textFont(arrayOf("Noto Sans Regular")) ) } From 309c33f784af15ba684e456e42774a7c4d1652a0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 23:51:33 +0200 Subject: [PATCH 256/339] [pre-commit.ci] pre-commit autoupdate (#3606) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 73dffddc5d91..e7cc7f307a89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,14 +19,14 @@ repos: exclude: '(platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$)|(platform/windows/vendor/.*)' - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.5 + rev: v20.1.7 hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' exclude: 'vendor/.*' - repo: https://github.com/keith/pre-commit-buildifier - rev: 8.0.3 + rev: 8.2.0 hooks: - id: buildifier @@ -37,7 +37,7 @@ repos: additional_dependencies: [ shellcheck-py ] - repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.56.2" + rev: "0.56.4" hooks: - id: swiftformat args: [ --swiftversion, "5.8" ] From 1927247c0c910f6e13ba24e874810621550a6e30 Mon Sep 17 00:00:00 2001 From: Markus Wendorf Date: Tue, 8 Jul 2025 15:26:43 +0200 Subject: [PATCH 257/339] feat: add clusterMinPoints option Android and iOS (#3601) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- include/mbgl/style/sources/geojson_source.hpp | 1 + .../maplibre/android/style/sources/GeoJsonOptions.kt | 11 +++++++++++ .../activity/style/GeoJsonClusteringActivity.kt | 1 + platform/darwin/src/MLNShapeSource.h | 11 ++++++++++- platform/darwin/src/MLNShapeSource.mm | 9 +++++++++ platform/darwin/test/MLNShapeSourceTests.mm | 2 ++ platform/ios/MapLibre.docc/For_Style_Authors.md | 1 + src/mbgl/style/conversion/geojson_options.cpp | 10 ++++++++++ src/mbgl/style/sources/geojson_source_impl.cpp | 2 ++ test/style/conversion/geojson_options.test.cpp | 3 +++ 10 files changed, 50 insertions(+), 1 deletion(-) diff --git a/include/mbgl/style/sources/geojson_source.hpp b/include/mbgl/style/sources/geojson_source.hpp index fe3524988637..0958ebd7824d 100644 --- a/include/mbgl/style/sources/geojson_source.hpp +++ b/include/mbgl/style/sources/geojson_source.hpp @@ -29,6 +29,7 @@ struct GeoJSONOptions { bool cluster = false; uint16_t clusterRadius = 50; uint8_t clusterMaxZoom = 17; + size_t clusterMinPoints = 2; using ClusterExpression = std::pair, std::shared_ptr>; using ClusterProperties = std::map; diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonOptions.kt b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonOptions.kt index bbe8466fd6b9..773fb3311937 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonOptions.kt +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/GeoJsonOptions.kt @@ -100,6 +100,17 @@ class GeoJsonOptions : HashMap() { return this } + /** + * Minimum number of points to form a cluster + * + * @param clusterMinPoints minimum number of points to form a cluster - Defaults to 2 + * @return the current instance for chaining + */ + fun withClusterMinPoints(clusterMinPoints: Int): GeoJsonOptions { + this["clusterMinPoints"] = clusterMinPoints + return this + } + /** * An object defining custom properties on the generated clusters if clustering is enabled, * aggregating values from clustered points. Has the form {"property_name": [operator, [map_expression]]} or diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt index c95745646a68..4b77d9a933b0 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GeoJsonClusteringActivity.kt @@ -139,6 +139,7 @@ class GeoJsonClusteringActivity : AppCompatActivity() { .withCluster(true) .withClusterMaxZoom(14) .withClusterRadius(50) + .withClusterMinPoints(3) .withClusterProperty( "max", Expression.max(Expression.accumulated(), Expression.get("max")), diff --git a/platform/darwin/src/MLNShapeSource.h b/platform/darwin/src/MLNShapeSource.h index c5e981eb2bf4..2b6188ac82aa 100644 --- a/platform/darwin/src/MLNShapeSource.h +++ b/platform/darwin/src/MLNShapeSource.h @@ -44,6 +44,15 @@ FOUNDATION_EXTERN MLN_EXPORT const MLNShapeSourceOption MLNShapeSourceOptionClus */ FOUNDATION_EXTERN MLN_EXPORT const MLNShapeSourceOption MLNShapeSourceOptionClusterRadius; +/** + An `NSNumber` object containing an integer; specifies the minimum number of points to form a + cluster if clustering is enabled. The default value is 2. + + This option only affects point features within an ``MLNShapeSource`` object; it + is ignored when creating an ``MLNComputedShapeSource`` object. + */ +FOUNDATION_EXTERN MLN_EXPORT const MLNShapeSourceOption MLNShapeSourceOptionClusterMinPoints; + /** An `NSDictionary` object where the key is an `NSString`. The dictionary key will be the feature attribute key. The resulting attribute value is @@ -233,7 +242,7 @@ MLN_EXPORT for the source. This class supports the following options: ``MLNShapeSourceOptionClustered``, - ``MLNShapeSourceOptionClusterRadius``, + ``MLNShapeSourceOptionClusterRadius``, ``MLNShapeSourceOptionClusterMinPoints``, ``MLNShapeSourceOptionMaximumZoomLevelForClustering``, ``MLNShapeSourceOptionMinimumZoomLevel``, ``MLNShapeSourceOptionMinimumZoomLevel``, ``MLNShapeSourceOptionBuffer``, and diff --git a/platform/darwin/src/MLNShapeSource.mm b/platform/darwin/src/MLNShapeSource.mm index d207ace48c62..d93442013e5d 100644 --- a/platform/darwin/src/MLNShapeSource.mm +++ b/platform/darwin/src/MLNShapeSource.mm @@ -19,6 +19,7 @@ const MLNShapeSourceOption MLNShapeSourceOptionBuffer = @"MLNShapeSourceOptionBuffer"; const MLNShapeSourceOption MLNShapeSourceOptionClusterRadius = @"MLNShapeSourceOptionClusterRadius"; +const MLNShapeSourceOption MLNShapeSourceOptionClusterMinPoints = @"MLNShapeSourceOptionClusterMinPoints"; const MLNShapeSourceOption MLNShapeSourceOptionClustered = @"MLNShapeSourceOptionClustered"; const MLNShapeSourceOption MLNShapeSourceOptionClusterProperties = @"MLNShapeSourceOptionClusterProperties"; const MLNShapeSourceOption MLNShapeSourceOptionMaximumZoomLevel = @"MLNShapeSourceOptionMaximumZoomLevel"; @@ -70,6 +71,14 @@ geoJSONOptions->clusterRadius = value.integerValue; } + if (NSNumber *value = options[MLNShapeSourceOptionClusterMinPoints]) { + if (![value isKindOfClass:[NSNumber class]]) { + [NSException raise:NSInvalidArgumentException + format:@"MLNShapeSourceOptionClusterMinPoints must be an NSNumber."]; + } + geoJSONOptions->clusterMinPoints = value.integerValue; + } + if (NSNumber *value = options[MLNShapeSourceOptionMaximumZoomLevelForClustering]) { if (![value isKindOfClass:[NSNumber class]]) { [NSException raise:NSInvalidArgumentException diff --git a/platform/darwin/test/MLNShapeSourceTests.mm b/platform/darwin/test/MLNShapeSourceTests.mm index 5c7d9553697f..4dd18ed611cb 100644 --- a/platform/darwin/test/MLNShapeSourceTests.mm +++ b/platform/darwin/test/MLNShapeSourceTests.mm @@ -18,6 +18,7 @@ - (void)testGeoJSONOptionsFromDictionary { NSArray *clusterPropertyArray = @[reduceExpression, mapExpression]; NSDictionary *options = @{MLNShapeSourceOptionClustered: @YES, MLNShapeSourceOptionClusterRadius: @42, + MLNShapeSourceOptionClusterMinPoints: @3, MLNShapeSourceOptionClusterProperties: @{@"sumValue": clusterPropertyArray}, MLNShapeSourceOptionMaximumZoomLevelForClustering: @98, MLNShapeSourceOptionMaximumZoomLevel: @99, @@ -29,6 +30,7 @@ - (void)testGeoJSONOptionsFromDictionary { XCTAssertTrue(mbglOptions->cluster); XCTAssertEqual(mbglOptions->clusterRadius, 42); XCTAssertEqual(mbglOptions->clusterMaxZoom, 98); + XCTAssertEqual(mbglOptions->clusterMinPoints, 3UL); XCTAssertEqual(mbglOptions->maxzoom, 99); XCTAssertEqual(mbglOptions->buffer, 1976); XCTAssertEqual(mbglOptions->tolerance, 0.42); diff --git a/platform/ios/MapLibre.docc/For_Style_Authors.md b/platform/ios/MapLibre.docc/For_Style_Authors.md index 966727762b50..3d996e3e087a 100644 --- a/platform/ios/MapLibre.docc/For_Style_Authors.md +++ b/platform/ios/MapLibre.docc/For_Style_Authors.md @@ -150,6 +150,7 @@ In style JSON | In the SDK `tolerance` | `MLNShapeSourceOptionSimplificationTolerance` `cluster` | `MLNShapeSourceOptionClustered` `clusterRadius` | `MLNShapeSourceOptionClusterRadius` +`clusterMinPoints` | `MLNShapeSourceOptionClusterMinPoints` `clusterMaxZoom` | `MLNShapeSourceOptionMaximumZoomLevelForClustering` `lineMetrics` | `MLNShapeSourceOptionLineDistanceMetrics` diff --git a/src/mbgl/style/conversion/geojson_options.cpp b/src/mbgl/style/conversion/geojson_options.cpp index 7a7ceb97df36..f6876143a6a9 100644 --- a/src/mbgl/style/conversion/geojson_options.cpp +++ b/src/mbgl/style/conversion/geojson_options.cpp @@ -81,6 +81,16 @@ std::optional Converter::operator()(const Conver } } + const auto clusterMinPointsValue = objectMember(value, "clusterMinPoints"); + if (clusterMinPointsValue) { + if (toNumber(*clusterMinPointsValue)) { + options.clusterMinPoints = static_cast(*toNumber(*clusterMinPointsValue)); + } else { + error.message = "GeoJSON source clusterMinPoints value must be a number"; + return std::nullopt; + } + } + const auto lineMetricsValue = objectMember(value, "lineMetrics"); if (lineMetricsValue) { if (toBool(*lineMetricsValue)) { diff --git a/src/mbgl/style/sources/geojson_source_impl.cpp b/src/mbgl/style/sources/geojson_source_impl.cpp index ae81f0855534..db6469ee4562 100644 --- a/src/mbgl/style/sources/geojson_source_impl.cpp +++ b/src/mbgl/style/sources/geojson_source_impl.cpp @@ -99,6 +99,8 @@ std::shared_ptr GeoJSONData::create(const GeoJSON& geoJSON, clusterOptions.maxZoom = options->clusterMaxZoom; clusterOptions.extent = util::EXTENT; clusterOptions.radius = static_cast(::round(scale * options->clusterRadius)); + clusterOptions.minPoints = options->clusterMinPoints; + auto feature = std::make_shared(); clusterOptions.map = [feature, options](const PropertyMap& properties) -> PropertyMap { PropertyMap ret{}; diff --git a/test/style/conversion/geojson_options.test.cpp b/test/style/conversion/geojson_options.test.cpp index 0832255dccf9..192d30f73473 100644 --- a/test/style/conversion/geojson_options.test.cpp +++ b/test/style/conversion/geojson_options.test.cpp @@ -40,6 +40,7 @@ TEST(GeoJSONOptions, RetainsDefaults) { ASSERT_EQ(converted.cluster, defaults.cluster); ASSERT_EQ(converted.clusterRadius, defaults.clusterRadius); ASSERT_EQ(converted.clusterMaxZoom, defaults.clusterMaxZoom); + ASSERT_EQ(converted.clusterMinPoints, defaults.clusterMinPoints); ASSERT_TRUE(converted.clusterProperties.empty()); } @@ -53,6 +54,7 @@ TEST(GeoJSONOptions, FullConversion) { "cluster": true, "clusterRadius": 4, "clusterMaxZoom": 5, + "clusterMinPoints": 6, "lineMetrics": true, "clusterProperties": { "max": ["max", ["get", "scalerank"]], @@ -73,6 +75,7 @@ TEST(GeoJSONOptions, FullConversion) { ASSERT_EQ(converted.cluster, true); ASSERT_EQ(converted.clusterRadius, 4); ASSERT_EQ(converted.clusterMaxZoom, 5); + ASSERT_EQ(converted.clusterMinPoints, 6); ASSERT_EQ(converted.clusterProperties.size(), 3); ASSERT_EQ(converted.clusterProperties.count("max"), 1); ASSERT_EQ(converted.clusterProperties.count("sum"), 1); From f457c2e0193b2ebab0e07d1007d0963e70139107 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 8 Jul 2025 20:07:38 +0200 Subject: [PATCH 258/339] Release MapLibre Android 11.12.0 (#3607) --- platform/android/CHANGELOG.md | 6 ++++++ platform/android/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index f90e252c58f8..b89da0953a18 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog MapLibre Native for Android +## 11.12.0 + +### ✨ Features and improvements + +- feat: add clusterMinPoints option Android and iOS ([#3601](https://github.com/maplibre/maplibre-native/pull/3601)). + ## 11.11.0 ### ✨ Features and improvements diff --git a/platform/android/VERSION b/platform/android/VERSION index 4b8f587696e7..a0980739e20b 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.11.0 +11.12.0 From 68fe71aa2a640870af12657b92e01984763548be Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 9 Jul 2025 14:37:30 +0200 Subject: [PATCH 259/339] Release MapLibre iOS 6.17.0 (#3609) --- platform/ios/CHANGELOG.md | 6 ++++++ platform/ios/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index c2214d05105c..3e86baf17506 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,12 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.17.0 + +- Fix render pipeline state bug ([#3598](https://github.com/maplibre/maplibre-native/pull/3598)). +- Added the nearClippedProjMatrix to the drawing context ([#3599](https://github.com/maplibre/maplibre-native/pull/3599)). +- feat: add clusterMinPoints option Android and iOS ([#3601](https://github.com/maplibre/maplibre-native/pull/3601)). + ## 6.16.0 - Add run-time plug-in layer support to iOS ([#3430](https://github.com/maplibre/maplibre-native/pull/3430)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index bfec95bf0e14..1980a78f2054 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.16.0 +6.17.0 From c56fa9ff926cc6879b201bda404e67f3574df738 Mon Sep 17 00:00:00 2001 From: Markus Wendorf Date: Wed, 9 Jul 2025 18:51:26 +0200 Subject: [PATCH 260/339] Add ios clustering example (#3608) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bart Louwers --- .../ios/app-swift/Data/earthquakes.geojson | 6113 +++++++++++++++++ .../app-swift/Sources/ClusteringExample.swift | 71 + .../Sources/MapLibreNavigationView.swift | 3 + 3 files changed, 6187 insertions(+) create mode 100644 platform/ios/app-swift/Data/earthquakes.geojson create mode 100644 platform/ios/app-swift/Sources/ClusteringExample.swift diff --git a/platform/ios/app-swift/Data/earthquakes.geojson b/platform/ios/app-swift/Data/earthquakes.geojson new file mode 100644 index 000000000000..7c1f7c11a7df --- /dev/null +++ b/platform/ios/app-swift/Data/earthquakes.geojson @@ -0,0 +1,6113 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "id": "ak16994521", "mag": 2.3, "time": 1507425650893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5129, 63.1016, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994519", "mag": 1.7, "time": 1507425289659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4048, 63.1224, 105.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994517", "mag": 1.6, "time": 1507424832518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3597, 63.0781, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021336", "mag": 1.42, "time": 1507423898710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.497, 34.299667, 7.64 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2nn", "mag": 4.2, "time": 1507422626990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.6901, 12.0623, 46.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994510", "mag": 1.6, "time": 1507422449194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5053, 63.0719, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2nb", "mag": 4.6, "time": 1507420784440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4576, -20.2873, 614.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994298", "mag": 2.4, "time": 1507419370097, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.789, 63.1725, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905861", "mag": 1.39, "time": 1507418785100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.993164, 36.421833, 6.37 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021304", "mag": 1.11, "time": 1507418426010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0155, 33.656333, 12.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994293", "mag": 1.5, "time": 1507417256497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.512, 63.0879, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994287", "mag": 2.0, "time": 1507413903714, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4378, 63.0933, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994285", "mag": 1.5, "time": 1507413670029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6538, 63.2272, 96.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994283", "mag": 1.4, "time": 1507413587442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5325, 63.0844, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994280", "mag": 1.3, "time": 1507413266231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4752, 61.8518, 54.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994278", "mag": 1.8, "time": 1507413195076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8597, 61.6214, 50.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994274", "mag": 1.9, "time": 1507412827617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7142, 62.9656, 93.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994273", "mag": 1.2, "time": 1507411925999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2484, 61.2705, 69.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994270", "mag": 2.0, "time": 1507411814209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0732, 65.5942, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2ly", "mag": 4.1, "time": 1507411448780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.5445, 13.5146, 54.36 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905841", "mag": 1.38, "time": 1507411214450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819504, 37.605499, 4.14 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905836", "mag": 1.4, "time": 1507410206440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.930168, 37.636833, -0.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021272", "mag": 1.34, "time": 1507408122250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.509167, 34.1555, 16.34 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021264", "mag": 1.0, "time": 1507407938100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.5115, 5.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993963", "mag": 1.4, "time": 1507407100665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9126, 63.1812, 150.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61936851", "mag": 2.55, "time": 1507406278360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.078659, 19.374167, 2.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993960", "mag": 1.4, "time": 1507405129739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3106, 61.5726, 26.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993952", "mag": 1.7, "time": 1507403679922, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5846, 60.2607, 34.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021224", "mag": 1.04, "time": 1507401391710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.929, 34.254833, 18.27 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993752", "mag": 1.3, "time": 1507401212982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5065, 63.0847, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993746", "mag": 1.3, "time": 1507399350671, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8929, 63.5257, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2jk", "mag": 4.6, "time": 1507398878400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.7258, -18.9821, 195.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993741", "mag": 1.6, "time": 1507398797233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3473, 63.0775, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905766", "mag": 2.64, "time": 1507397278960, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.137497, 36.579834, 7.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993738", "mag": 1.4, "time": 1507396778206, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1075, 61.8312, 71.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993736", "mag": 1.2, "time": 1507396542471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3769, 63.0621, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2ii", "mag": 4.3, "time": 1507395765330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8319, 16.7195, 58.84 ] } }, +{ "type": "Feature", "properties": { "id": "uw61339006", "mag": 1.91, "time": 1507395622730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.689833, 47.049167, 5.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993732", "mag": 1.7, "time": 1507395602456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5283, 63.0785, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993720", "mag": 2.5, "time": 1507394741482, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6683, 60.7696, 67.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993714", "mag": 1.6, "time": 1507394402896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7591, 61.6478, 30.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993710", "mag": 1.5, "time": 1507393418705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3458, 63.0633, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993699", "mag": 1.6, "time": 1507392875390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4669, 63.0675, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993695", "mag": 1.3, "time": 1507392837463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5169, 63.083, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993692", "mag": 2.3, "time": 1507392657193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4771, 63.0742, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993486", "mag": 4.2, "time": 1507392435159, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.458, 63.1276, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2hz", "mag": 4.3, "time": 1507392287310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9686, 16.6087, 69.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905751", "mag": 1.21, "time": 1507391530870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.023666, 37.605335, 1.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021056", "mag": 1.95, "time": 1507390783500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.493, 3.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci38021048", "mag": 1.02, "time": 1507388708760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.225, 34.0335, 0.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993303", "mag": 1.9, "time": 1507385638408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0033, 63.2623, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2hc", "mag": 4.9, "time": 1507385606770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.3179, -30.4302, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993301", "mag": 2.1, "time": 1507383291943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1913, 58.5727, 85.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251607", "mag": 3.09, "time": 1507383200950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.140503, 38.030666, 7.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905716", "mag": 1.07, "time": 1507382878240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.765663, 38.789166, 2.09 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905711", "mag": 1.17, "time": 1507382428800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.678001, 37.621498, 4.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993140", "mag": 1.9, "time": 1507381096302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8813, 63.1738, 75.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993128", "mag": 1.6, "time": 1507378828395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.531, 61.7978, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61936621", "mag": 1.98, "time": 1507378497820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.423492, 19.223499, 34.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993119", "mag": 1.5, "time": 1507378014192, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.8317, 59.7754, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905681", "mag": 1.39, "time": 1507377675100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.8255, 2.24 ] } }, +{ "type": "Feature", "properties": { "id": "hv61936531", "mag": 2.66, "time": 1507377140600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.32016, 19.338667, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992960", "mag": 1.9, "time": 1507376759252, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4264, 67.7636, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992953", "mag": 2.1, "time": 1507376626801, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5725, 59.8372, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2fz", "mag": 4.1, "time": 1507372645200, "felt": 103, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.7814, -32.4981, 23.29 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608370", "mag": 1.3, "time": 1507370926907, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9711, 36.3094, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992628", "mag": 1.5, "time": 1507369548317, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8046, 65.9499, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992625", "mag": 1.4, "time": 1507369466929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8309, 63.376, 82.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905641", "mag": 1.22, "time": 1507368529650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.724167, 38.760334, 1.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2fc", "mag": 5.1, "time": 1507368374110, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.9778, -1.6647, 147.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992611", "mag": 2.1, "time": 1507366872675, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3324, 62.9966, 88.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992607", "mag": 1.8, "time": 1507366536698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4858, 64.7593, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2et", "mag": 4.9, "time": 1507365487800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7469, -33.0092, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992603", "mag": 2.2, "time": 1507364931625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8133, 59.8473, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020960", "mag": 1.0, "time": 1507363084310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.673833, 33.904333, 35.76 ] } }, +{ "type": "Feature", "properties": { "id": "hv61936261", "mag": 1.72, "time": 1507362853030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.382172, 19.23, 34.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992451", "mag": 1.8, "time": 1507362228460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.427, 66.3947, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020944", "mag": 1.0, "time": 1507362158010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.457667, 34.326, 2.73 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259564", "mag": 1.03, "time": 1507361004730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.865833, 9.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905606", "mag": 1.19, "time": 1507358854330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.791832, 38.834835, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608387", "mag": 1.0, "time": 1507358249243, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9071, 38.405, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020896", "mag": 1.89, "time": 1507358144340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.486833, 4.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2dx", "mag": 4.5, "time": 1507357181260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.1291, -6.3628, 156.49 ] } }, +{ "type": "Feature", "properties": { "id": "se60208171", "mag": 2.4, "time": 1507353902490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.749833, 36.150333, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905576", "mag": 1.77, "time": 1507352706600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.900833, 36.327168, 6.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992147", "mag": 1.4, "time": 1507351430424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0276, 62.5667, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16992146", "mag": 1.8, "time": 1507351047849, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.5063, 59.957, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905556", "mag": 1.77, "time": 1507350586140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792, 38.834835, 1.77 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259559", "mag": 1.46, "time": 1507350177430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530833, 46.869333, 10.71 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2d1", "mag": 4.7, "time": 1507347862040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.504, -16.7961, 178.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905531", "mag": 1.48, "time": 1507346675870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831169, 37.4585, 2.53 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259549", "mag": 1.08, "time": 1507345321240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.516333, 46.8755, 11.43 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905521", "mag": 1.46, "time": 1507345267910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816666, 37.603832, 4.04 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020824", "mag": 2.12, "time": 1507344823940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.655333, 34.632, 5.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991857", "mag": 2.3, "time": 1507344587124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8808, 51.3254, 31.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608359", "mag": 1.1, "time": 1507344387447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1285, 37.4041, 0.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905511", "mag": 1.27, "time": 1507344302520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817169, 37.604168, 4.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2cx", "mag": 4.9, "time": 1507343887900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.1471, -23.7671, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905496", "mag": 1.94, "time": 1507341324260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.101166, 40.842499, 6.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2cc", "mag": 5.0, "time": 1507340745260, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.668, 1.1151, 7.01 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020800", "mag": 1.46, "time": 1507340726000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.462667, 33.466333, 5.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991706", "mag": 1.7, "time": 1507339655320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2596, 60.2328, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991711", "mag": 1.6, "time": 1507339653625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2013, 60.2021, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991704", "mag": 1.7, "time": 1507338343941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7575, 62.4396, 50.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991697", "mag": 2.1, "time": 1507336466527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3178, 60.5797, 88.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020768", "mag": 1.56, "time": 1507336119080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.460167, 34.3335, 2.89 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020760", "mag": 1.22, "time": 1507335982510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.468167, 34.333167, 2.87 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020752", "mag": 1.81, "time": 1507335765850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793, 33.490333, 4.58 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020744", "mag": 1.76, "time": 1507335646140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.566333, 35.339667, 7.86 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2c0", "mag": 5.3, "time": 1507335391250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3171, -33.0297, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905461", "mag": 1.16, "time": 1507333007350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795998, 38.826, 2.32 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608334", "mag": 1.1, "time": 1507331333919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1247, 37.3789, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991557", "mag": 1.4, "time": 1507331263084, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2293, 64.9749, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2ba", "mag": 4.4, "time": 1507331102840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.3636, -10.0109, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2b9", "mag": 4.2, "time": 1507331091160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 73.3529, 39.6124, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991437", "mag": 2.0, "time": 1507330383962, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4583, 60.3395, 72.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2av", "mag": 4.3, "time": 1507329021540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 138.9649, 43.0121, 217.94 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608329", "mag": 1.3, "time": 1507328136999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1198, 37.3861, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020720", "mag": 1.45, "time": 1507327306610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.955667, 34.34, -0.29 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338531", "mag": 1.37, "time": 1507326914640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.991667, 46.572333, -0.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608354", "mag": 1.0, "time": 1507326343697, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.747, 39.8477, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905451", "mag": 1.47, "time": 1507326329600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.753833, 39.8485, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905441", "mag": 1.23, "time": 1507325408690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.127, 36.566667, 9.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b29t", "mag": 4.5, "time": 1507325144410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.6471, 17.7456, 196.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2ab", "mag": 2.6, "time": 1507324395860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.8949, 32.7663, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905436", "mag": 1.41, "time": 1507323505830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.155667, 36.5565, 6.94 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020712", "mag": 1.19, "time": 1507323492150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.991, 32.578667, 2.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b289", "mag": 2.4, "time": 1507321230800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7321, 36.481, 5.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905431", "mag": 1.0, "time": 1507321021480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.178833, 38.107, -0.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991182", "mag": 1.0, "time": 1507320721326, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1644, 62.2007, 15.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991178", "mag": 1.8, "time": 1507320357991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5804, 63.1717, 121.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905426", "mag": 1.24, "time": 1507320241050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.688667, 37.5335, 6.91 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020680", "mag": 1.5, "time": 1507320090270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.516, 33.860833, 0.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991069", "mag": 1.8, "time": 1507318145350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6965, 59.7754, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b27a", "mag": 2.4, "time": 1507317641850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.2269, 36.6265, 5.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991058", "mag": 2.6, "time": 1507317554328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3172, 63.6837, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020656", "mag": 1.03, "time": 1507317548410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.646667, 36.148333, 0.93 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020648", "mag": 1.08, "time": 1507317476900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1915, 35.0025, -0.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905416", "mag": 1.19, "time": 1507317386760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803333, 37.457667, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338426", "mag": 1.65, "time": 1507316609360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7105, 43.553333, 7.02 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259489", "mag": 1.66, "time": 1507316359200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.477167, 45.9945, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020624", "mag": 1.22, "time": 1507316271630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362, 32.941333, 10.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16991011", "mag": 2.0, "time": 1507315584886, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9279, 62.7834, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b26p", "mag": 4.7, "time": 1507315424010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 68.9568, -49.2119, 13.54 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251447", "mag": 2.18, "time": 1507314096180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457, 42.633167, 4.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905411", "mag": 1.24, "time": 1507313481610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.962333, 37.920333, -0.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b260", "mag": 4.4, "time": 1507311862190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 86.7487, 30.0165, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020552", "mag": 1.28, "time": 1507311788210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.351667, 35.052833, -1.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b25h", "mag": 5.5, "time": 1507311683180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -15.5503, -35.3171, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990870", "mag": 1.8, "time": 1507310931075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9372, 62.1214, 48.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608306", "mag": 1.9, "time": 1507310059424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.6177, 38.5802, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b24c", "mag": 4.6, "time": 1507309684550, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.7841, 37.4191, 31.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259479", "mag": 1.25, "time": 1507309316470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5305, 46.867167, 12.62 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251412", "mag": 2.1, "time": 1507308318150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.460333, 42.602667, 6.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905346", "mag": 2.33, "time": 1507308237260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803333, 37.457333, 0.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020512", "mag": 1.61, "time": 1507308155060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2815, 35.633833, 6.15 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020480", "mag": 1.04, "time": 1507307612510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.314167, 34.0145, 2.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990671", "mag": 1.6, "time": 1507307067130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0099, 66.2332, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905326", "mag": 1.17, "time": 1507305678060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.706, 38.783667, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259459", "mag": 0.95, "time": 1507305300890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5315, 46.8575, 12.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020408", "mag": 1.2, "time": 1507302977930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.019833, 33.876, -0.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990501", "mag": 2.8, "time": 1507302735109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2441, 60.1679, 148.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b20f", "mag": 5.4, "time": 1507301800580, "felt": 169, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.1969, 37.0997, 47.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990465", "mag": 1.7, "time": 1507301707708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.519, 67.5663, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020392", "mag": 2.6, "time": 1507301676460, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.894167, 31.614, 5.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990463", "mag": 1.6, "time": 1507300956103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1925, 59.8037, 20.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251397", "mag": 1.18, "time": 1507300478100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.436333, 42.554833, 9.68 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608296", "mag": 1.1, "time": 1507299948387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9267, 39.4223, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020376", "mag": 1.4, "time": 1507299919340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.476667, 35.752167, 2.24 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608295", "mag": 2.0, "time": 1507298898804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9217, 38.4131, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1zv", "mag": 5.1, "time": 1507298433140, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.0977, 12.0039, 21.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990379", "mag": 2.0, "time": 1507296668722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4456, 63.3167, 112.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990317", "mag": 2.4, "time": 1507295355033, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6485, 60.9026, 21.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905256", "mag": 1.69, "time": 1507295344860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7755, 38.805167, 0.72 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020296", "mag": 0.98, "time": 1507294899000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.445, 34.226167, 12.35 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905246", "mag": 1.14, "time": 1507294685610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797333, 38.813499, 2.36 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905241", "mag": 1.27, "time": 1507294429860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806167, 38.822333, 1.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990306", "mag": 1.6, "time": 1507293337500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.164, 63.5211, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905231", "mag": 1.31, "time": 1507293268040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.600333, 38.771667, 0.05 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259449", "mag": 1.29, "time": 1507293189490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.557667, 46.894167, 9.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905226", "mag": 1.25, "time": 1507291334810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.798333, 37.565333, -0.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020256", "mag": 2.0, "time": 1507290973570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.757833, 34.172833, 6.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020240", "mag": 1.05, "time": 1507290356170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.355667, 35.822833, 16.75 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1xz", "mag": 5.2, "time": 1507289341850, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 155.9405, -6.8684, 106.51 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338256", "mag": 1.22, "time": 1507287741010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.509333, 45.6895, 9.57 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020232", "mag": 1.4, "time": 1507287412090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8455, 34.000333, 9.47 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259444", "mag": 1.6, "time": 1507286758530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5795, 44.259167, 3.88 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259434", "mag": 1.18, "time": 1507286693390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.322167, 43.681333, 9.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990167", "mag": 3.0, "time": 1507285562299, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2949, 51.2318, 28.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990162", "mag": 3.2, "time": 1507285408267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0402, 65.2966, 0.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61935226", "mag": 1.78, "time": 1507284229580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.42366, 19.2805, 7.76 ] } }, +{ "type": "Feature", "properties": { "id": "hv61935131", "mag": 1.67, "time": 1507283791470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.248833, 18.876833, 12.183 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990109", "mag": 1.9, "time": 1507282869514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1519, 63.251, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1xd", "mag": 4.4, "time": 1507281825250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.9639, -0.4925, 44.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990102", "mag": 1.6, "time": 1507281420124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7545, 61.5105, 70.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61935091", "mag": 2.94, "time": 1507279304370, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2205, 19.380333, 14.051 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608291", "mag": 1.6, "time": 1507279195578, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.2224, 39.4096, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905186", "mag": 0.99, "time": 1507278858510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8245, 37.483833, 5.31 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1v8", "mag": 6.0, "time": 1507276773110, "felt": 108, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.9537, 37.485, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251377", "mag": 1.43, "time": 1507274976970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444, 42.660667, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989976", "mag": 3.1, "time": 1507274375943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7235, 59.8808, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259414", "mag": 1.86, "time": 1507273645130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.997833, 47.455667, 1.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1v0", "mag": 4.7, "time": 1507273552100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6145, 13.8504, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989973", "mag": 1.3, "time": 1507272833815, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7833, 64.8537, 19.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b2dh", "mag": 3.3, "time": 1507270603000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.92, 49.06, 22.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989967", "mag": 1.9, "time": 1507270303410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3206, 61.7195, 41.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020152", "mag": 1.08, "time": 1507270230410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.557333, 32.948833, 3.78 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1um", "mag": 2.7, "time": 1507269804040, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4493, 42.6517, 7.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905156", "mag": 1.79, "time": 1507269478010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801167, 38.822, 2.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107634", "mag": 1.13, "time": 1507269413290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.478167, 38.6015, 12.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1un", "mag": 4.3, "time": 1507269388630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4985, 51.6139, 71.76 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251357", "mag": 1.47, "time": 1507268672130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455333, 42.652833, 2.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989960", "mag": 1.1, "time": 1507268319981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2116, 64.2744, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61935031", "mag": 1.75, "time": 1507267817920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.428833, 19.329, 10.185 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905151", "mag": 1.08, "time": 1507267299070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.607, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259404", "mag": 1.03, "time": 1507266753410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532167, 46.873, 11.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1u8", "mag": 4.6, "time": 1507265974560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.1261, -17.5702, 36.33 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020112", "mag": 1.06, "time": 1507265623210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.434833, 33.0315, 3.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905146", "mag": 1.56, "time": 1507265461960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7915, 38.8195, 1.42 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338091", "mag": 1.62, "time": 1507265317630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2, 47.583333, 23.03 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338086", "mag": 1.33, "time": 1507265080940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.200333, 47.583833, 23.12 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251347", "mag": 1.61, "time": 1507264823080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.494833, 42.639667, 0.79 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107639", "mag": 1.32, "time": 1507263429870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9235, 39.599833, 20.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905131", "mag": 1.06, "time": 1507263391130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831, 37.5295, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905121", "mag": 1.41, "time": 1507263129660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.403, 38.364167, 8.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1tr", "mag": 4.8, "time": 1507262599510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.9528, -10.3953, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989915", "mag": 1.5, "time": 1507260314998, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3718, 63.0764, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61338061", "mag": 1.26, "time": 1507260032120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.744833, 47.490167, 16.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989910", "mag": 2.1, "time": 1507259762026, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6057, 63.4194, 106.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905106", "mag": 1.0, "time": 1507258246340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822, 38.814833, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905101", "mag": 2.97, "time": 1507257072490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.777167, 41.2375, 7.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989906", "mag": 1.6, "time": 1507256091995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.063, 65.8813, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020032", "mag": 1.89, "time": 1507255962830, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7975, 33.5, 5.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci38020024", "mag": 1.53, "time": 1507255628970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.875167, 33.957, 3.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1t0", "mag": 4.8, "time": 1507255428530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.496, 0.9934, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1sv", "mag": 4.6, "time": 1507253577740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.1867, -9.9486, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251342", "mag": 1.12, "time": 1507252828550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414167, 42.5485, 6.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905066", "mag": 0.98, "time": 1507251331760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9395, 37.636, 5.66 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608277", "mag": 1.5, "time": 1507251023072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.857, 37.3396, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251327", "mag": 1.16, "time": 1507250350380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.672333, 39.4485, 12.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989868", "mag": 1.6, "time": 1507249990990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6081, 61.1327, 14.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019984", "mag": 1.38, "time": 1507249506910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.598667, 33.450667, 7.77 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608273", "mag": 1.0, "time": 1507249499810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0539, 37.1082, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019976", "mag": 1.92, "time": 1507249308880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.377167, 34.427, 9.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1s9", "mag": 4.0, "time": 1507248914000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.348, -29.925, 48.8 ] } }, +{ "type": "Feature", "properties": { "id": "uw61337986", "mag": 1.12, "time": 1507245979370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.395167, 45.685667, -0.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905011", "mag": 2.81, "time": 1507244867710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8105, 37.472, 6.12 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905016", "mag": 1.36, "time": 1507244847860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7825, 38.7915, 0.56 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259379", "mag": 0.99, "time": 1507244598420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.871167, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989827", "mag": 1.4, "time": 1507244539965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2289, 64.9761, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989825", "mag": 1.8, "time": 1507243916881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1245, 62.4971, 81.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905001", "mag": 1.65, "time": 1507243472580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808, 38.822, 1.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904996", "mag": 2.14, "time": 1507243164460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.588667, 40.652333, 25.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989822", "mag": 1.5, "time": 1507242888109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.857, 61.9122, 45.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1rh", "mag": 4.6, "time": 1507242807430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.6063, 21.8848, 100.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989815", "mag": 2.5, "time": 1507240652193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.192, 61.0044, 106.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989811", "mag": 1.8, "time": 1507240498324, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.939, 62.7658, 79.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251317", "mag": 1.66, "time": 1507240484300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418167, 42.544333, 6.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1px", "mag": 2.6, "time": 1507239146260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4355, 42.5495, 8.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259359", "mag": 1.17, "time": 1507238290040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.965, 43.357333, 5.92 ] } }, +{ "type": "Feature", "properties": { "id": "uw61337951", "mag": 2.3, "time": 1507238213550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.549833, 49.328833, -0.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989718", "mag": 1.4, "time": 1507237904044, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5289, 61.2012, 0.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989717", "mag": 1.9, "time": 1507237796189, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.701, 59.032, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61337946", "mag": 2.27, "time": 1507237659430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.817167, 47.392167, -0.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904961", "mag": 0.97, "time": 1507237420050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.482833, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989714", "mag": 1.7, "time": 1507235850265, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0124, 65.8954, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019864", "mag": 1.0, "time": 1507235571440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794167, 33.508667, 6.47 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259334", "mag": 1.45, "time": 1507235042560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525667, 46.872833, 11.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989709", "mag": 1.6, "time": 1507234798667, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.3071, 63.3209, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989702", "mag": 2.5, "time": 1507234198600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.414, 63.3343, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989701", "mag": 1.8, "time": 1507234162044, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0004, 65.8966, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989699", "mag": 1.7, "time": 1507234036518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6575, 60.1339, 106.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904941", "mag": 1.63, "time": 1507233857390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810167, 38.8205, 2.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904936", "mag": 3.14, "time": 1507233758820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.192, 40.163167, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "hv61934246", "mag": 1.02, "time": 1507233403750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.289833, 19.374, 1.772 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989698", "mag": 1.7, "time": 1507233388591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0126, 65.8742, 0.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989695", "mag": 1.9, "time": 1507232812188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9865, 65.9098, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904926", "mag": 1.29, "time": 1507232594330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.837167, 37.504167, 0.07 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019816", "mag": 1.31, "time": 1507231819600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.491, 33.846167, -0.48 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904891", "mag": 1.41, "time": 1507229918140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104833, 37.324833, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989694", "mag": 1.5, "time": 1507229700025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7663, 63.5209, 14.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904886", "mag": 2.03, "time": 1507229279930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3835, 40.709833, 19.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989692", "mag": 1.6, "time": 1507228866480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0051, 65.8735, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904881", "mag": 1.48, "time": 1507228723050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.194667, 40.598333, 15.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019744", "mag": 1.44, "time": 1507226134710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.072333, 33.020667, -0.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989683", "mag": 2.4, "time": 1507225956631, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.785, 60.8774, 34.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019728", "mag": 1.0, "time": 1507225418070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.720667, 36.004, 2.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904846", "mag": 1.87, "time": 1507224165330, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8105, 38.821167, 1.64 ] } }, +{ "type": "Feature", "properties": { "id": "hv61934126", "mag": 1.58, "time": 1507223732510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.252167, 18.903833, 12.692 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989680", "mag": 2.5, "time": 1507223654781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.5871, 67.3896, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989626", "mag": 1.5, "time": 1507223506919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1613, 62.9421, 105.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251267", "mag": 1.3, "time": 1507222702710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.711, 37.088833, 8.72 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251262", "mag": 2.09, "time": 1507221444340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413167, 42.600333, 6.09 ] } }, +{ "type": "Feature", "properties": { "id": "hv61934021", "mag": 1.71, "time": 1507221215150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.600174, 19.477667, 2.61 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259309", "mag": 0.99, "time": 1507220291830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4755, 46.855833, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904766", "mag": 1.2, "time": 1507219571830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817667, 37.607833, 4.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1ip", "mag": 4.3, "time": 1507219416430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.6953, -3.0506, 46.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989556", "mag": 1.8, "time": 1507219027423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1068, 64.723, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904761", "mag": 1.28, "time": 1507218469040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.786667, 35.167, 4.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989554", "mag": 1.8, "time": 1507217831958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9487, 67.1103, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019560", "mag": 1.18, "time": 1507217071900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2355, 35.399833, 11.83 ] } }, +{ "type": "Feature", "properties": { "id": "ld60143826", "mag": 1.25, "time": 1507215008870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -75.237833, 44.094, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904741", "mag": 1.17, "time": 1507213799120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883667, 37.539333, 2.63 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314897", "mag": 1.26, "time": 1507213038640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.924167, 46.832167, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61933821", "mag": 2.22, "time": 1507211808310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.427667, 19.767167, 23.499 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259289", "mag": 1.11, "time": 1507209951340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.482833, 46.8195, 2.22 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019464", "mag": 2.55, "time": 1507209518050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.010667, 33.179667, 8.09 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251247", "mag": 1.23, "time": 1507208707300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.086833, 44.772167, 11.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989517", "mag": 1.3, "time": 1507208506436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3491, 63.087, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019448", "mag": 1.15, "time": 1507207944620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.294333, 34.679333, 2.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989485", "mag": 1.9, "time": 1507207780001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6654, 67.5326, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904706", "mag": 1.66, "time": 1507207659710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798167, 38.793833, 3.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989482", "mag": 1.4, "time": 1507206716138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4807, 64.7367, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314867", "mag": 1.16, "time": 1507206461330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.192333, 47.183667, 14.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989481", "mag": 2.6, "time": 1507206068023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1435, 51.4576, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904681", "mag": 2.64, "time": 1507204013350, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8035, 38.791333, 3.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1f7", "mag": 5.0, "time": 1507202248310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.4874, 7.3643, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259279", "mag": 1.25, "time": 1507201170830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.476333, 44.006167, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989448", "mag": 1.0, "time": 1507200035021, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9384, 64.5888, 18.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1dj", "mag": 4.7, "time": 1507198268580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 49.1899, 31.277, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259274", "mag": 1.3, "time": 1507198163850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.318333, 46.1425, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259269", "mag": 2.63, "time": 1507197824690, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.317333, 46.126333, 14.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019328", "mag": 2.0, "time": 1507197738510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.290167, 34.678, 2.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1da", "mag": 4.5, "time": 1507196589420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5051, -25.068, 564.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019312", "mag": 1.27, "time": 1507196570560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.412333, 35.621833, 7.71 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259264", "mag": 1.58, "time": 1507195834720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.989667, 43.0535, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989416", "mag": 1.9, "time": 1507192569868, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8165, 59.7884, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259259", "mag": 1.73, "time": 1507192054540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.3, 46.1355, 13.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989388", "mag": 2.2, "time": 1507191783280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8358, 59.8781, 1.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1c3", "mag": 5.4, "time": 1507191096920, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.5742, -22.4118, 112.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904646", "mag": 2.52, "time": 1507190856940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.472, 40.616833, 21.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989386", "mag": 1.8, "time": 1507190760834, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.611, 63.1832, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37167708", "mag": 1.38, "time": 1507190349370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.7095, 33.2065, 10.46 ] } }, +{ "type": "Feature", "properties": { "id": "hv61933706", "mag": 1.21, "time": 1507190060680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2125, 19.363, 1.776 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904641", "mag": 1.23, "time": 1507189755650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.236667, 37.334333, 8.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019264", "mag": 1.99, "time": 1507188934660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2315, 32.416667, 18.41 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251227", "mag": 1.34, "time": 1507188766440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.442667, 42.578833, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259244", "mag": 1.28, "time": 1507188159830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.866167, 12.04 ] } }, +{ "type": "Feature", "properties": { "id": "hv61933701", "mag": 2.09, "time": 1507187842930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.470673, 19.211, 37.73 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904626", "mag": 0.96, "time": 1507187453970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.572333, 39.013167, -0.67 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251207", "mag": 1.35, "time": 1507187087800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.301167, 39.1075, 2.75 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019256", "mag": 2.06, "time": 1507186145760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.372167, 33.358833, 11.42 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019248", "mag": 1.49, "time": 1507186142240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.366, 33.357667, 11.67 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314807", "mag": 1.16, "time": 1507185870880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.191167, 47.179833, 15.66 ] } }, +{ "type": "Feature", "properties": { "id": "se60045413", "mag": 1.81, "time": 1507185703120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.742167, 35.985167, 18.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904601", "mag": 0.95, "time": 1507185126040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819, 37.603333, 3.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019240", "mag": 1.25, "time": 1507185093960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.394, 35.618833, 8.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989380", "mag": 1.9, "time": 1507184561453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3822, 60.6535, 53.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989379", "mag": 1.0, "time": 1507183395241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2677, 63.314, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019200", "mag": 1.99, "time": 1507181070780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.806833, 36.043833, 1.22 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019192", "mag": 1.69, "time": 1507180426220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.807333, 36.043167, 1.21 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904556", "mag": 1.22, "time": 1507178909260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7625, 38.821667, 1.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019184", "mag": 1.33, "time": 1507178811140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.319833, 33.886333, 15.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989373", "mag": 2.2, "time": 1507178319160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0253, 59.7752, 99.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989370", "mag": 2.0, "time": 1507178108703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9621, 62.3999, 67.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107619", "mag": 2.37, "time": 1507175814060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793167, 38.814333, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904521", "mag": 2.61, "time": 1507175806240, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792, 38.813833, 3.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989344", "mag": 1.8, "time": 1507174164228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5816, 59.9877, 48.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314692", "mag": 1.1, "time": 1507174062970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.048833, 48.836333, 3.53 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259229", "mag": 1.6, "time": 1507174016680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526667, 46.874333, 12.15 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251182", "mag": 2.38, "time": 1507172461010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415167, 42.5495, 8.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019104", "mag": 1.08, "time": 1507172395710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.846167, 33.711167, 14.99 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314677", "mag": 1.65, "time": 1507171780320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.027667, 48.845833, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251177", "mag": 1.51, "time": 1507171597620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.880667, 37.041, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904476", "mag": 1.12, "time": 1507171050970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7565, 38.782501, 0.82 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904471", "mag": 1.34, "time": 1507170987390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.753167, 38.775667, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989336", "mag": 1.2, "time": 1507169863981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2568, 63.5162, 8.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904466", "mag": 1.16, "time": 1507169797040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.808667, 37.467667, 1.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci37167548", "mag": 1.21, "time": 1507169669520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3645, 33.350667, 11.33 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019080", "mag": 1.35, "time": 1507169663590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3545, 33.3525, 12.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989295", "mag": 4.3, "time": 1507169038804, "felt": 3, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -152.901, 58.3623, 46.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38019056", "mag": 2.12, "time": 1507167035520, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805167, 36.042, 1.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989291", "mag": 1.7, "time": 1507165460879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1162, 61.3056, 37.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608181", "mag": 1.2, "time": 1507165236408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7192, 37.7977, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b190", "mag": 2.6, "time": 1507164698800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7663, 36.4461, 6.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989285", "mag": 2.3, "time": 1507164594638, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5337, 60.8331, 35.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018992", "mag": 1.21, "time": 1507164594280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.435667, 33.033167, 6.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905406", "mag": 1.37, "time": 1507163603630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.975, 40.912333, 6.11 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989282", "mag": 2.6, "time": 1507162971426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.8816, 53.7666, 69.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b185", "mag": 3.4, "time": 1507162321850, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.755, 36.45, 7.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018976", "mag": 1.34, "time": 1507162296820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6665, 33.961333, 15.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904421", "mag": 1.81, "time": 1507162198800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.311667, 40.594833, 17.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989280", "mag": 2.0, "time": 1507162092700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.2549, 67.5542, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259214", "mag": 1.11, "time": 1507161815690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.873667, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608178", "mag": 1.2, "time": 1507161066465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.8195, 37.303, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018944", "mag": 1.13, "time": 1507160279190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.801333, 36.0425, 0.57 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018936", "mag": 1.06, "time": 1507160033160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.352833, 33.1335, 7.01 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018928", "mag": 0.95, "time": 1507159919230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.758833, 33.67, 13.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989265", "mag": 2.4, "time": 1507159550480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7536, 62.8345, 98.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989262", "mag": 1.2, "time": 1507158170981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4466, 64.9696, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989256", "mag": 2.1, "time": 1507157336866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3316, 62.6072, 87.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b16h", "mag": 4.5, "time": 1507156394080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7169, -23.9861, 195.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259199", "mag": 1.02, "time": 1507156049410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531, 46.862667, 9.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989147", "mag": 1.8, "time": 1507155523233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2126, 62.1419, 50.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259194", "mag": 2.1, "time": 1507155343850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.326833, 46.116, 15.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b15z", "mag": 3.5, "time": 1507154804460, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7425, 36.4507, 4.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989143", "mag": 1.6, "time": 1507154781579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2414, 61.1185, 60.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018808", "mag": 0.95, "time": 1507153541570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.803667, 36.042, 1.12 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259184", "mag": 2.43, "time": 1507153540560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.875, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018800", "mag": 1.11, "time": 1507153075770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805667, 36.044667, 1.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904366", "mag": 2.17, "time": 1507152989540, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.603167, 4.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904361", "mag": 2.03, "time": 1507152804460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.819667, 3.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018776", "mag": 1.23, "time": 1507152409830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796667, 33.506833, 4.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018760", "mag": 1.23, "time": 1507152333150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805333, 36.044167, 1.08 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018752", "mag": 1.02, "time": 1507152229710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.803833, 36.0435, 1.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904356", "mag": 1.39, "time": 1507151361960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.986333, 37.451833, 11.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b152", "mag": 4.2, "time": 1507151144560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5193, 15.6807, 43.81 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259179", "mag": 1.09, "time": 1507150593920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.249667, 45.922167, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608141", "mag": 1.4, "time": 1507150245096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5709, 37.2677, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314607", "mag": 2.13, "time": 1507149876900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.029167, 48.8415, 0.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989132", "mag": 3.2, "time": 1507149758758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.904, 54.6732, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018704", "mag": 1.42, "time": 1507149228410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.937167, 32.9105, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61932706", "mag": 2.34, "time": 1507148766410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0805, 19.384667, 3.233 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018696", "mag": 1.43, "time": 1507148649160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.469333, 33.481, 7.42 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018688", "mag": 1.23, "time": 1507148125030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7775, 34.859167, -1.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989124", "mag": 2.3, "time": 1507147085613, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9048, 62.8046, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989120", "mag": 1.9, "time": 1507146960353, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3904, 61.7684, 33.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904326", "mag": 1.4, "time": 1507146844270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.6255, 3.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018648", "mag": 1.34, "time": 1507146046240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.282833, 33.307, 10.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b12w", "mag": 4.1, "time": 1507145834470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.5682, 23.7468, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61314577", "mag": 2.31, "time": 1507145284260, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.101667, 47.519667, 24.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989116", "mag": 2.0, "time": 1507144999479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9792, 59.2967, 30.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904301", "mag": 1.44, "time": 1507144400690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.590333, 37.9535, 3.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904291", "mag": 0.97, "time": 1507144116270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807335, 38.823166, 0.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018592", "mag": 0.98, "time": 1507144088190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.191, 34.995667, -0.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107609", "mag": 1.42, "time": 1507143933230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8315, 37.459167, 2.81 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904286", "mag": 2.01, "time": 1507143903920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.127667, 36.540667, 3.02 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259164", "mag": 1.54, "time": 1507143801870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.466667, 46.003833, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989114", "mag": 1.5, "time": 1507143799499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2987, 62.9001, 136.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904276", "mag": 2.19, "time": 1507143670520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125833, 36.539667, 3.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989112", "mag": 1.5, "time": 1507143346025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9517, 60.4284, 76.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989109", "mag": 1.6, "time": 1507142888288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4575, 68.4924, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us1000alvi", "mag": 4.8, "time": 1507142880510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.2314, -22.7343, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b11q", "mag": 4.3, "time": 1507142721780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0179, 16.6332, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608130", "mag": 2.0, "time": 1507142028227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6247, 38.6437, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018568", "mag": 1.17, "time": 1507141815580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.480167, 33.8245, -0.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904241", "mag": 1.13, "time": 1507141805960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.843333, 37.550333, -1.19 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107614", "mag": 1.26, "time": 1507141794500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9105, 37.975, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904226", "mag": 1.44, "time": 1507141566380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.839167, 37.554167, -0.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904231", "mag": 0.95, "time": 1507141526700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.848, 37.565167, -0.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989106", "mag": 1.6, "time": 1507141095901, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5043, 63.2003, 100.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608125", "mag": 1.1, "time": 1507140434096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0698, 39.2152, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251107", "mag": 2.02, "time": 1507140276970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438667, 42.623, -0.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989101", "mag": 1.7, "time": 1507139784743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7521, 62.788, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70236238", "mag": 1.83, "time": 1507139648960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.036, 37.001167, 5.77 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018464", "mag": 0.95, "time": 1507138418030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.469667, 34.0245, -0.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904196", "mag": 1.0, "time": 1507136805190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.407833, 36.764667, 10.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989095", "mag": 1.5, "time": 1507135541282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2816, 62.4313, 44.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018408", "mag": 1.57, "time": 1507134824880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.499, 4.25 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608107", "mag": 2.1, "time": 1507134616795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9268, 38.3958, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904171", "mag": 1.38, "time": 1507133031670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.614333, 36.881, 6.94 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904166", "mag": 2.71, "time": 1507132718170, "felt": 28, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609333, 36.8815, 6.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989087", "mag": 1.4, "time": 1507131238883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.032, 63.5134, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0yw", "mag": 4.4, "time": 1507130270240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7831, 15.8774, 9.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989083", "mag": 2.0, "time": 1507129786603, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5468, 62.9914, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989080", "mag": 1.7, "time": 1507129070012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8528, 63.1143, 130.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b14r", "mag": 2.9, "time": 1507127377130, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.3466, -0.2479, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608088", "mag": 1.1, "time": 1507126739396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8623, 39.6344, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0xy", "mag": 4.3, "time": 1507120048520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.219, 14.9246, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018272", "mag": 1.04, "time": 1507119983420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.979333, 33.952, 16.95 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018264", "mag": 1.21, "time": 1507118298180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.153667, 33.576, 12.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988954", "mag": 1.4, "time": 1507117165370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0651, 59.0371, 113.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988951", "mag": 1.7, "time": 1507117164179, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7431, 61.7579, 50.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988955", "mag": 1.2, "time": 1507117137925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2404, 63.315, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018256", "mag": 1.97, "time": 1507116401470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.047667, 33.9995, 14.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988947", "mag": 1.3, "time": 1507116091533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.038, 61.8748, 115.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988943", "mag": 2.6, "time": 1507115904863, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.3287, 60.8439, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259149", "mag": 1.42, "time": 1507115359390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.520833, 46.866833, 12.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988941", "mag": 2.0, "time": 1507115138670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7265, 59.549, 35.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988937", "mag": 1.7, "time": 1507114508883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.561, 63.6903, 125.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904051", "mag": 1.09, "time": 1507113834280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793, 38.8355, 1.85 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018224", "mag": 1.17, "time": 1507113370200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.608833, 33.080833, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904041", "mag": 1.12, "time": 1507113327750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.942, 36.506, 4.31 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251097", "mag": 2.09, "time": 1507111719760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414333, 42.55, 7.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904031", "mag": 0.97, "time": 1507110773350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.365667, 36.7845, 3.47 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259134", "mag": 2.46, "time": 1507108546600, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.867833, 13.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018200", "mag": 1.17, "time": 1507108523230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5975, 34.0275, 11.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904011", "mag": 1.65, "time": 1507108226290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.59, 39.034, 1.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988931", "mag": 1.6, "time": 1507107916290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4053, 65.8348, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018192", "mag": 1.04, "time": 1507107119810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.243833, 34.561167, 7.55 ] } }, +{ "type": "Feature", "properties": { "id": "uw61337191", "mag": 1.11, "time": 1507106498380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3995, 47.466167, 20.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988930", "mag": 1.5, "time": 1507105167087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3314, 63.0932, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903991", "mag": 1.0, "time": 1507105008930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.831667, 37.479167, 7.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0vg", "mag": 4.8, "time": 1507102453200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0265, 15.081, 39.52 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251092", "mag": 1.15, "time": 1507102301120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.109167, 37.453, 7.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903961", "mag": 0.99, "time": 1507102290690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.886, 37.634, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903951", "mag": 1.13, "time": 1507102067530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.873, 37.655, 2.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988890", "mag": 2.1, "time": 1507101218109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6853, 59.7843, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903941", "mag": 1.93, "time": 1507099899370, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.174833, 36.7355, 8.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988888", "mag": 2.1, "time": 1507099796449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.599, 58.1927, 18.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988886", "mag": 1.1, "time": 1507099794659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1044, 65.1213, 20.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61932126", "mag": 2.54, "time": 1507098254160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471, 19.958167, 34.056 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018128", "mag": 1.48, "time": 1507095935630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.237333, 33.3585, 9.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988874", "mag": 2.0, "time": 1507095643589, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4213, 59.0929, 75.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259124", "mag": 1.12, "time": 1507094472670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5195, 46.889167, 10.71 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0ue", "mag": 4.7, "time": 1507093737820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.7448, 18.3756, 172.11 ] } }, +{ "type": "Feature", "properties": { "id": "hv61932021", "mag": 1.47, "time": 1507093555340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7645, 19.608333, 19.406 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251087", "mag": 1.84, "time": 1507092267430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.456667, 42.600833, 1.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988835", "mag": 1.4, "time": 1507091990426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8997, 62.5624, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988834", "mag": 2.0, "time": 1507091511196, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6239, 61.9391, 35.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61931981", "mag": 2.06, "time": 1507091217900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6845, 18.778833, 34.132 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988831", "mag": 1.7, "time": 1507090320674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0205, 61.3011, 30.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988828", "mag": 1.6, "time": 1507090167802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1141, 63.8125, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018104", "mag": 0.97, "time": 1507089080620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.364, 33.395667, 5.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018096", "mag": 1.15, "time": 1507088756230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.118, 33.743333, 14.37 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0th", "mag": 5.0, "time": 1507087351060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1517, -31.5827, 35.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903886", "mag": 1.89, "time": 1507087145860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157333, 36.593167, 6.68 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903881", "mag": 1.09, "time": 1507086787130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.718666, 38.771667, 2.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0t5", "mag": 5.2, "time": 1507086128100, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.1988, -23.1056, 126.96 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608095", "mag": 1.8, "time": 1507085141975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2313, 37.1571, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988758", "mag": 1.7, "time": 1507084302637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3056, 61.634, 42.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903856", "mag": 1.42, "time": 1507084182620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.847167, 37.6515, 3.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988756", "mag": 1.9, "time": 1507083972695, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8168, 61.2547, 28.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018048", "mag": 1.01, "time": 1507081338310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.112167, 34.101167, 8.93 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259119", "mag": 1.6, "time": 1507080820140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521833, 46.872833, 10.74 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259154", "mag": 1.65, "time": 1507080779330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5265, 46.876167, 11.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988720", "mag": 2.3, "time": 1507079042841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4064, 60.3952, 12.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608069", "mag": 1.7, "time": 1507077765338, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5495, 40.2609, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988717", "mag": 1.6, "time": 1507077365759, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3311, 63.2608, 0.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61931706", "mag": 1.47, "time": 1507077049100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6385, 19.553667, 11.424 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018040", "mag": 0.98, "time": 1507076389190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.269, 34.0685, 15.7 ] } }, +{ "type": "Feature", "properties": { "id": "uw61337006", "mag": 0.96, "time": 1507074699210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751333, 47.996333, 14.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0rt", "mag": 4.2, "time": 1507074238890, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.7745, 8.5663, 30.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018024", "mag": 1.57, "time": 1507073295750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.681, 35.0345, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988594", "mag": 2.0, "time": 1507073162743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2617, 62.1345, 75.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988588", "mag": 1.3, "time": 1507072732101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2839, 61.0371, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336986", "mag": 1.86, "time": 1507072508440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.616667, 48.275333, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336981", "mag": 1.89, "time": 1507072212820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.6095, 48.259, 5.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988584", "mag": 1.0, "time": 1507071678363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3354, 64.9934, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903836", "mag": 1.12, "time": 1507071527650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.805, 38.822667, 2.85 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903831", "mag": 1.06, "time": 1507071133930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808998, 38.823166, 1.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994062", "mag": 1.2, "time": 1507071050929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8464, 63.0394, 121.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608062", "mag": 1.5, "time": 1507069440991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.445, 37.5469, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903806", "mag": 1.23, "time": 1507069427950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.739333, 38.805667, 1.44 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336956", "mag": 1.0, "time": 1507069356480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.319167, 46.078167, -1.11 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988555", "mag": 2.0, "time": 1507069258013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.1558, 67.7665, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988552", "mag": 1.6, "time": 1507069137803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3107, 61.1448, 20.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0q2", "mag": 4.2, "time": 1507068153470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2992, 15.6198, 60.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38018000", "mag": 1.69, "time": 1507067212670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.446333, 34.153333, 6.34 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259099", "mag": 1.07, "time": 1507067005720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.4045, 43.682, 5.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988545", "mag": 1.7, "time": 1507066676846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6733, 65.2302, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608050", "mag": 1.7, "time": 1507066159273, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0874, 39.024, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017984", "mag": 1.71, "time": 1507065949300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.347667, 33.392, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251062", "mag": 1.76, "time": 1507065772640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.412333, 42.583667, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988519", "mag": 2.6, "time": 1507065657270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2687, 57.0749, 82.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988491", "mag": 1.6, "time": 1507065428977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3929, 65.0131, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988489", "mag": 1.2, "time": 1507065333200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6212, 63.3407, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988484", "mag": 2.3, "time": 1507065014972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0452, 62.216, 67.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72905396", "mag": 1.11, "time": 1507064824530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.4595, 41.531833, 2.93 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251057", "mag": 2.05, "time": 1507064724100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.399, 42.521333, 8.16 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017976", "mag": 1.59, "time": 1507064335800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.445833, 34.1535, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903776", "mag": 1.19, "time": 1507063701570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8805, 37.529167, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0nr", "mag": 5.7, "time": 1507063144760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -49.3194, 13.4552, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903771", "mag": 2.49, "time": 1507062907080, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.767, 38.799167, 0.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988466", "mag": 1.3, "time": 1507062241011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5134, 62.1795, 23.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988439", "mag": 2.2, "time": 1507061510846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8761, 60.5934, 142.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0n8", "mag": 4.5, "time": 1507061510710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.7231, 55.3488, 28.06 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017952", "mag": 1.07, "time": 1507061299680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4405, 34.156167, 8.27 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988437", "mag": 1.3, "time": 1507061230777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0856, 61.3457, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988435", "mag": 1.5, "time": 1507060035702, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9837, 61.6046, 61.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903741", "mag": 1.18, "time": 1507059288800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764831, 38.788502, -0.61 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017936", "mag": 1.69, "time": 1507059189120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7955, 33.4895, 4.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994048", "mag": 1.6, "time": 1507059099655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6496, 59.6816, 88.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994047", "mag": 1.4, "time": 1507058879703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6613, 58.3127, 61.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608048", "mag": 1.1, "time": 1507058710135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9271, 40.1731, 13.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017912", "mag": 1.43, "time": 1507058424320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.440833, 34.1545, 6.88 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017904", "mag": 1.19, "time": 1507057846620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1795, 35.002, -0.83 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017896", "mag": 1.26, "time": 1507057788590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.941667, 32.908, -0.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0lw", "mag": 5.2, "time": 1507057466210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.8364, -55.2702, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259069", "mag": 1.71, "time": 1507056294930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.503, 46.830333, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988418", "mag": 1.8, "time": 1507056127213, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6502, 57.4998, 47.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903726", "mag": 1.14, "time": 1507056074240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.84, 37.503833, 0.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988415", "mag": 1.4, "time": 1507055512017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8175, 61.6607, 28.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61931361", "mag": 2.65, "time": 1507055057800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.324, 19.406667, 7.018 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017848", "mag": 1.04, "time": 1507054498390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.44, 34.157667, 8.94 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251037", "mag": 1.12, "time": 1507053937840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424333, 42.592167, 6.15 ] } }, +{ "type": "Feature", "properties": { "id": "hv61931346", "mag": 2.16, "time": 1507053691890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.373667, 20.034833, 13.532 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259064", "mag": 1.12, "time": 1507053599620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.609167, 46.334833, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988394", "mag": 1.6, "time": 1507052715999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9718, 60.8946, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988390", "mag": 1.9, "time": 1507052122028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3579, 61.0247, 111.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903716", "mag": 2.07, "time": 1507052014050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.787667, 37.598833, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994042", "mag": 2.0, "time": 1507051700735, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4244, 59.8428, 129.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0jm", "mag": 4.6, "time": 1507050191000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.1126, -2.5625, 21.57 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017808", "mag": 1.9, "time": 1507049580810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.445167, 33.264333, 2.22 ] } }, +{ "type": "Feature", "properties": { "id": "nn00608002", "mag": 1.2, "time": 1507049448566, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.2901, 37.8049, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60251027", "mag": 1.41, "time": 1507048713320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.760333, 39.998667, 8.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988364", "mag": 1.1, "time": 1507048704427, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9116, 61.1262, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988361", "mag": 1.8, "time": 1507048669896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1084, 64.9183, 18.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017800", "mag": 0.98, "time": 1507048261760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.446833, 34.154333, 7.94 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903676", "mag": 1.69, "time": 1507047264490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8285, 37.455833, 2.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903671", "mag": 1.3, "time": 1507047173830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5795, 37.287833, 7.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017744", "mag": 1.05, "time": 1507046707770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.136833, 34.054167, 9.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903666", "mag": 2.58, "time": 1507046582120, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.464333, 36.750833, 7.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988359", "mag": 1.4, "time": 1507045972022, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1249, 62.9454, 112.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988358", "mag": 1.6, "time": 1507045690910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2536, 60.0003, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994035", "mag": 1.7, "time": 1507044159018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6674, 59.3569, 72.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988345", "mag": 2.7, "time": 1507043705635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0117, 59.5043, 89.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903631", "mag": 1.33, "time": 1507043277890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.820167, 3.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994033", "mag": 1.6, "time": 1507043019584, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3814, 58.3192, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988343", "mag": 2.7, "time": 1507042999732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3915, 51.6134, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994031", "mag": 1.7, "time": 1507042763401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1107, 59.3023, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994030", "mag": 1.3, "time": 1507042659104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9147, 62.9235, 104.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994029", "mag": 1.6, "time": 1507042166290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0354, 59.6428, 85.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0gv", "mag": 2.1, "time": 1507041358070, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.8228, 36.4458, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988332", "mag": 1.4, "time": 1507041247450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2842, 62.1118, 75.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017688", "mag": 1.7, "time": 1507041034810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.665167, 35.975833, 2.12 ] } }, +{ "type": "Feature", "properties": { "id": "hv61931251", "mag": 2.87, "time": 1507040757870, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.370833, 20.027333, 12.259 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0gr", "mag": 4.6, "time": 1507040383740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 175.9616, -39.6706, 78.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903611", "mag": 1.04, "time": 1507039230370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.979333, 37.537333, 3.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988330", "mag": 1.8, "time": 1507038947118, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.8047, 53.5035, 24.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0k7", "mag": 2.6, "time": 1507038712390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1971, 51.3674, 18.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0gm", "mag": 4.5, "time": 1507038514350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.7848, 25.0488, 74.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988328", "mag": 1.3, "time": 1507038483396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5284, 62.2253, 16.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994023", "mag": 1.9, "time": 1507038160436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.9795, 54.3692, 39.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994021", "mag": 1.3, "time": 1507037424410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3659, 61.871, 45.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017640", "mag": 0.99, "time": 1507035054330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.962167, 34.044333, 11.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994019", "mag": 2.4, "time": 1507034930692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8074, 51.67, 77.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988323", "mag": 2.5, "time": 1507033401817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.3851, 54.2478, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988320", "mag": 1.8, "time": 1507033125169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8594, 61.9955, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903576", "mag": 1.25, "time": 1507033081250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.496833, 35.946833, 9.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988318", "mag": 1.5, "time": 1507032487878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.705, 62.0401, 40.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903571", "mag": 1.19, "time": 1507032219730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.973167, 37.635667, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988315", "mag": 1.6, "time": 1507031200996, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1077, 57.8662, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903561", "mag": 1.07, "time": 1507031172540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802002, 38.825832, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988314", "mag": 1.7, "time": 1507031152426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0389, 60.0214, 78.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259049", "mag": 2.51, "time": 1507030950500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.353833, 43.520167, 3.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903556", "mag": 1.59, "time": 1507030601280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.887667, 37.630333, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017616", "mag": 1.23, "time": 1507030424420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.812833, 34.096833, 13.63 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017608", "mag": 1.47, "time": 1507030255050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.808167, 34.092333, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903546", "mag": 1.09, "time": 1507029639750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.82267, 38.807835, 1.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988306", "mag": 2.7, "time": 1507027595732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4068, 51.6479, 12.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903531", "mag": 1.14, "time": 1507027098870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.763168, 38.789001, 0.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988304", "mag": 1.4, "time": 1507026885090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5708, 61.3679, 26.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994008", "mag": 1.6, "time": 1507025162686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.958, 61.2532, 105.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16994007", "mag": 1.2, "time": 1507024176706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1195, 62.8909, 99.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988295", "mag": 2.1, "time": 1507023250156, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3958, 51.6323, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988294", "mag": 1.3, "time": 1507023225669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7855, 61.7554, 59.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988292", "mag": 2.6, "time": 1507022763592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7772, 53.1343, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988287", "mag": 1.2, "time": 1507022053291, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.872, 64.5325, 18.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988284", "mag": 1.3, "time": 1507021950836, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.929, 64.5216, 18.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988282", "mag": 1.4, "time": 1507021938525, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8923, 58.4847, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017544", "mag": 1.28, "time": 1507021318130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791333, 33.687167, 16.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988279", "mag": 2.0, "time": 1507020554043, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2158, 61.698, 77.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259034", "mag": 1.18, "time": 1507020432130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.873, 11.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0fa", "mag": 4.2, "time": 1507019233190, "felt": 43, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.0212, -33.014, 17.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988271", "mag": 1.8, "time": 1507019136375, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1655, 60.4739, 86.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250997", "mag": 1.69, "time": 1507019083210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.137833, 42.522333, -0.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993998", "mag": 1.8, "time": 1507018712322, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0756, 60.1685, 13.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903491", "mag": 1.22, "time": 1507017869360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.486, 36.378, 5.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017536", "mag": 1.46, "time": 1507016252180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.479, 32.737333, 7.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988268", "mag": 1.4, "time": 1507015945802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0368, 61.1636, 0.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988267", "mag": 1.2, "time": 1507015806607, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4998, 63.1031, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017504", "mag": 1.41, "time": 1507014429310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.363333, 34.832, 3.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988254", "mag": 4.1, "time": 1507013968245, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3923, 54.6037, 20.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988252", "mag": 1.7, "time": 1507013732258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7964, 59.8936, 15.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80259004", "mag": 1.07, "time": 1507013501160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523, 46.877333, 10.49 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607998", "mag": 1.1, "time": 1507013301155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.3199, 37.7813, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993990", "mag": 1.4, "time": 1507012650027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.264, 62.5244, 86.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988247", "mag": 2.1, "time": 1507012115547, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4061, 51.6742, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988245", "mag": 1.0, "time": 1507011961646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.539, 63.1068, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017496", "mag": 1.24, "time": 1507011934810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.013833, 33.662167, 11.95 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017488", "mag": 1.25, "time": 1507011688900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.047333, 33.171, 5.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993987", "mag": 1.9, "time": 1507011535768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.4878, 51.73, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993986", "mag": 2.3, "time": 1507011386112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3903, 51.6732, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017472", "mag": 1.5, "time": 1507010945840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.936833, 33.147, 7.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988244", "mag": 1.2, "time": 1507010895307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6337, 63.3262, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017464", "mag": 1.4, "time": 1507008876900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4845, 32.748667, 13.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017456", "mag": 1.19, "time": 1507008741980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.783833, 33.267833, 11.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0ef", "mag": 4.9, "time": 1507008633680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9398, 15.4089, 62.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258984", "mag": 1.01, "time": 1507006889790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.430667, 43.6785, 7.63 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258979", "mag": 1.31, "time": 1507006468040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5225, 46.871167, 10.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988238", "mag": 2.4, "time": 1507005858917, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.1659, 51.8129, 90.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993983", "mag": 1.4, "time": 1507004701069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7077, 62.778, 79.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017432", "mag": 1.1, "time": 1507003677250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790667, 33.485333, 4.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988237", "mag": 1.5, "time": 1507003090709, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0237, 61.1529, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258949", "mag": 1.2, "time": 1507002724530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.869, 10.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988235", "mag": 2.7, "time": 1507001740915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.6571, 52.9982, 32.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607958", "mag": 1.2, "time": 1507001239948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3057, 38.4484, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988229", "mag": 1.6, "time": 1506999699601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3039, 62.7285, 79.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988225", "mag": 1.7, "time": 1506999179710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.178, 66.888, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258939", "mag": 1.1, "time": 1506998768510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.860333, 12.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988222", "mag": 2.7, "time": 1506998450736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4948, 53.5386, 57.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988221", "mag": 1.2, "time": 1506998296606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3526, 63.268, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988218", "mag": 1.0, "time": 1506997994823, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5335, 53.8446, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988217", "mag": 2.2, "time": 1506997972933, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6125, 58.9289, 125.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903391", "mag": 1.03, "time": 1506997840780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.847336, 38.829834, 1.06 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903396", "mag": 1.23, "time": 1506997715100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.315667, 37.487833, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017400", "mag": 1.05, "time": 1506997467730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.334333, 33.346333, 9.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993974", "mag": 1.4, "time": 1506996608838, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2536, 62.5803, 93.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988215", "mag": 1.6, "time": 1506996320652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.155, 61.9755, 70.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993972", "mag": 1.6, "time": 1506995513010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7768, 60.1335, 76.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993971", "mag": 1.2, "time": 1506995387104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6738, 61.6682, 50.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61930601", "mag": 2.1, "time": 1506994522010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.565506, 19.795834, 15.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16993970", "mag": 1.1, "time": 1506994269143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0156, 64.7374, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903381", "mag": 1.16, "time": 1506991878630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.803169, 38.824001, 2.33 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017368", "mag": 1.36, "time": 1506989712460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.168667, 34.0055, 13.99 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336686", "mag": 1.47, "time": 1506988725560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.044167, 49.145, -1.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988200", "mag": 2.8, "time": 1506988653897, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6324, 61.3885, 39.1 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207781", "mag": 1.99, "time": 1506988371180, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.444833, 36.088167, 13.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000az70", "mag": 4.7, "time": 1506987102640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.8995, 12.8626, 27.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017360", "mag": 1.72, "time": 1506986970860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.674, 35.035333, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000azc7", "mag": 2.4, "time": 1506986577400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6124, 36.8167, 5.123 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207771", "mag": 1.11, "time": 1506984309110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.517167, 36.232667, 8.34 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017336", "mag": 1.0, "time": 1506984123180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2705, 33.975833, 4.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903356", "mag": 1.77, "time": 1506983102870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.991833, 40.153833, 4.17 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336646", "mag": 1.36, "time": 1506982150130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.4015, 46.173833, -0.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayh7", "mag": 4.4, "time": 1506982074330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7039, -22.2431, 108.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336631", "mag": 1.27, "time": 1506980575160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.930333, 48.1035, -1.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aya0", "mag": 5.3, "time": 1506980277150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.7345, -19.4817, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903316", "mag": 1.65, "time": 1506979898940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.824833, 2.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903311", "mag": 1.09, "time": 1506979301540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.531667, 37.139833, 8.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903306", "mag": 1.08, "time": 1506978484410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.444667, 36.959667, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903301", "mag": 1.46, "time": 1506978005870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.351667, 39.5165, 4.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258889", "mag": 2.36, "time": 1506975888040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.9055, 47.358667, 13.73 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903286", "mag": 0.97, "time": 1506975385450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946833, 37.590333, 0.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017200", "mag": 0.96, "time": 1506974805670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.503167, 33.8695, -0.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axzc", "mag": 2.8, "time": 1506974101570, "felt": 18, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -102.3612, 35.5909, 5.45 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903271", "mag": 2.25, "time": 1506973045100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609167, 36.880667, 6.31 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258884", "mag": 1.4, "time": 1506972979050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5355, 46.8805, 12.28 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903261", "mag": 1.85, "time": 1506971674240, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831833, 37.455667, 1.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017136", "mag": 1.08, "time": 1506971129830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.192, 34.993167, -0.84 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258874", "mag": 1.49, "time": 1506970982010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4715, 45.995667, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017120", "mag": 0.99, "time": 1506970881590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.649167, 35.932833, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903251", "mag": 1.78, "time": 1506970847010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.308833, 40.750667, -0.79 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903246", "mag": 1.41, "time": 1506970631190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.932667, 35.639, 4.96 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903241", "mag": 1.21, "time": 1506970286520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.679167, 38.533833, 5.88 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017104", "mag": 1.66, "time": 1506970188840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.133167, 34.279, 6.09 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axxi", "mag": 4.6, "time": 1506969995010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 102.3915, -7.056, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258869", "mag": 1.46, "time": 1506969854670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523167, 46.87, 10.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci38017064", "mag": 1.26, "time": 1506968962060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.623333, 33.912167, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903226", "mag": 0.96, "time": 1506968036980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880333, 37.530667, 2.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axwl", "mag": 4.6, "time": 1506968031500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.5291, 21.4218, 96.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904986", "mag": 1.14, "time": 1506968001000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.718167, 40.935167, 12.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988088", "mag": 2.2, "time": 1506967247502, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9366, 59.642, 98.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607868", "mag": 1.0, "time": 1506966403731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4944, 37.2386, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903211", "mag": 0.98, "time": 1506965951300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833, 37.457667, 1.76 ] } }, +{ "type": "Feature", "properties": { "id": "ci37167228", "mag": 1.57, "time": 1506964185870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4615, 34.328667, 3.74 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016984", "mag": 1.25, "time": 1506964183390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.466833, 34.3255, 4.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903196", "mag": 1.36, "time": 1506963756010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827833, 37.456667, 2.57 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258854", "mag": 1.03, "time": 1506962682500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528667, 46.8625, 13.48 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903176", "mag": 1.21, "time": 1506962394170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827833, 37.457167, 2.28 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903166", "mag": 1.88, "time": 1506961834060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827167, 37.4555, 1.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903156", "mag": 1.69, "time": 1506961396620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8265, 37.456333, 2.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903146", "mag": 3.02, "time": 1506961086740, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.829, 37.453667, 2.61 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016888", "mag": 1.17, "time": 1506960224640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0325, 33.879333, -0.97 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903131", "mag": 1.08, "time": 1506959715450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.371333, 35.706833, 1.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988071", "mag": 1.4, "time": 1506959208997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9837, 67.1697, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607854", "mag": 1.7, "time": 1506958960926, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.8425, 36.5559, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250907", "mag": 2.05, "time": 1506957621760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4145, 42.546333, 7.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903111", "mag": 1.41, "time": 1506957279300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.997333, 36.462667, 5.69 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207666", "mag": 2.19, "time": 1506957159610, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.8025, 36.5505, 12.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988065", "mag": 2.7, "time": 1506956391417, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8151, 61.2492, 19.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258839", "mag": 1.19, "time": 1506955175250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526167, 46.870333, 10.04 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axtv", "mag": 4.7, "time": 1506953290020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.1289, 2.6798, 25.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903096", "mag": 1.04, "time": 1506952925800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822667, 37.513833, 8.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16987055", "mag": 1.1, "time": 1506952513029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2609, 64.6409, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903081", "mag": 1.18, "time": 1506950851670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751663, 38.832832, 0.68 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axtl", "mag": 4.7, "time": 1506950716850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 51.6372, 28.6895, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258829", "mag": 1.08, "time": 1506950613020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.868167, 9.75 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258824", "mag": 1.16, "time": 1506950147300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.866667, 11.08 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250902", "mag": 1.34, "time": 1506949268120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.084, 44.7795, 11.23 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258814", "mag": 1.19, "time": 1506949148400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.855833, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61929981", "mag": 2.4, "time": 1506948942340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.592667, 19.465333, 0.033 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axsh", "mag": 2.6, "time": 1506947996150, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5037, 36.2851, 3.93 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258799", "mag": 1.69, "time": 1506947507620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.869833, 10.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16987046", "mag": 1.5, "time": 1506947130357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1189, 63.1205, 16.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903071", "mag": 1.5, "time": 1506946592080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.885667, 36.3165, 6.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axs4", "mag": 4.3, "time": 1506946114440, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -61.2682, 13.209, 136.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axsa", "mag": 4.3, "time": 1506945001990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 176.4854, -37.3176, 354.86 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258789", "mag": 2.2, "time": 1506944699010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533, 46.869833, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250897", "mag": 1.6, "time": 1506943796070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.218667, 42.571667, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16986042", "mag": 1.3, "time": 1506943225411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.912, 63.0196, 66.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16986039", "mag": 1.4, "time": 1506941366267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.3257, 63.3321, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016776", "mag": 1.44, "time": 1506940900650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.510667, 34.2985, 9.93 ] } }, +{ "type": "Feature", "properties": { "id": "hv61929926", "mag": 2.13, "time": 1506940825170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.524002, 19.919001, 20.11 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258769", "mag": 1.48, "time": 1506940203900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.33, 46.119833, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axrm", "mag": 4.9, "time": 1506939736050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.2184, 12.3486, 35.55 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016768", "mag": 1.12, "time": 1506938746370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.067167, 34.208333, 2.04 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016760", "mag": 1.75, "time": 1506938502900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.064833, 34.207833, 2.06 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903041", "mag": 1.87, "time": 1506938425810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.908833, 36.368667, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16985035", "mag": 1.7, "time": 1506938303105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1495, 63.1057, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016752", "mag": 1.08, "time": 1506938024070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.448833, 33.481, 8.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16985032", "mag": 1.1, "time": 1506937259442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8806, 64.6842, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207636", "mag": 1.71, "time": 1506936707930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.1365, 35.88, 10.55 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250892", "mag": 1.5, "time": 1506936161680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.480833, 42.384833, 5.67 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258764", "mag": 2.37, "time": 1506936112630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534333, 46.8675, 13.36 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258759", "mag": 3.08, "time": 1506934838560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529167, 46.872333, 11.44 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016728", "mag": 1.01, "time": 1506934828760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.065667, 34.2065, 1.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axr0", "mag": 4.3, "time": 1506933668380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8824, 16.708, 65.53 ] } }, +{ "type": "Feature", "properties": { "id": "ci37398445", "mag": 0.97, "time": 1506933339570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.460667, 34.332333, 5.88 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903031", "mag": 1.45, "time": 1506933218670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.812667, 38.805, 2.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0e8", "mag": 1.4, "time": 1506931958320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.32, 43.6653, 7.15 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250882", "mag": 1.44, "time": 1506931830720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4165, 42.520333, 8.15 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250877", "mag": 1.13, "time": 1506930804620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414333, 42.544333, 7.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016688", "mag": 1.28, "time": 1506929655950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.003333, 33.1775, 4.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16985021", "mag": 2.3, "time": 1506927665686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5448, 63.1998, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16985020", "mag": 1.7, "time": 1506927499500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4204, 67.3068, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258749", "mag": 1.94, "time": 1506926930660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.874, 11.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16985018", "mag": 1.1, "time": 1506926698712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.829, 65.5759, 9.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61929841", "mag": 1.98, "time": 1506926298850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.412338, 19.245501, 33.84 ] } }, +{ "type": "Feature", "properties": { "id": "se60045313", "mag": 1.9, "time": 1506925923790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.894667, 34.9895, 0.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16984019", "mag": 1.1, "time": 1506925731082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5467, 65.155, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258744", "mag": 1.32, "time": 1506925562230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.867167, 11.58 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016672", "mag": 0.97, "time": 1506925004450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.422833, 33.04, 10.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16984018", "mag": 1.4, "time": 1506924871383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2817, 61.9608, 23.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250872", "mag": 1.58, "time": 1506924776930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.033833, 38.600333, 7.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16984009", "mag": 3.0, "time": 1506924381290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1032, 58.7701, 99.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250867", "mag": 1.58, "time": 1506924167170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.409667, 42.562167, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axq4", "mag": 4.2, "time": 1506924037060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 174.3565, -41.7636, 24.13 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016664", "mag": 1.49, "time": 1506923205850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.589167, 32.780833, 12.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016656", "mag": 2.39, "time": 1506923145240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.009833, 33.179833, 9.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axq3", "mag": 4.7, "time": 1506923126070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.4587, -21.8514, 582.95 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016648", "mag": 2.46, "time": 1506922959220, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.010167, 33.179, 8.89 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336471", "mag": 3.25, "time": 1506922219710, "felt": 66, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8935, 47.887833, 54.22 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207631", "mag": 1.51, "time": 1506922179830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.527833, 36.243667, 7.74 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607885", "mag": 1.0, "time": 1506921346217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0518, 37.0814, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axpv", "mag": 4.8, "time": 1506921205270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 72.4324, 38.1132, 115.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16983007", "mag": 1.4, "time": 1506919945331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5212, 66.5767, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902986", "mag": 1.91, "time": 1506919685230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.524833, 35.967333, 10.71 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axpm", "mag": 2.2, "time": 1506919604410, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5118, 36.9048, 4.52 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336446", "mag": 1.27, "time": 1506919122930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.245667, 46.345833, 7.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016584", "mag": 2.31, "time": 1506918555650, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7985, 33.500167, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250862", "mag": 1.41, "time": 1506917347110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411167, 42.640167, -1.04 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016576", "mag": 1.0, "time": 1506916919110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.43, 33.028833, 3.21 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016568", "mag": 1.08, "time": 1506916645840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.048333, 33.2415, 5.47 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250857", "mag": 1.42, "time": 1506916237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.446167, 42.608333, 6.68 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016552", "mag": 1.32, "time": 1506915577280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.482167, 35.754, 3.27 ] } }, +{ "type": "Feature", "properties": { "id": "hv61929701", "mag": 2.26, "time": 1506915466040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.021835, 19.397499, 0.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axp9", "mag": 2.5, "time": 1506915178660, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5196, 36.2819, 4.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16982006", "mag": 3.4, "time": 1506913363596, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9176, 55.7636, 20.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axp5", "mag": 2.7, "time": 1506913350820, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5073, 46.8582, 10.64 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258724", "mag": 1.27, "time": 1506912496350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.017333, 44.484667, 7.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902956", "mag": 1.67, "time": 1506912463450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4705, 40.704167, 17.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250847", "mag": 1.01, "time": 1506911908120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418333, 42.516667, 6.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16982001", "mag": 1.1, "time": 1506909373983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8167, 61.2439, 26.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250837", "mag": 1.18, "time": 1506909364560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411833, 42.520667, 7.35 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258714", "mag": 1.56, "time": 1506908562340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523167, 46.872833, 12.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16981996", "mag": 1.3, "time": 1506908205944, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5285, 63.1691, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16982000", "mag": 1.4, "time": 1506908156528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6012, 59.5948, 56.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axnx", "mag": 2.6, "time": 1506907742490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4159, 42.5178, 6.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16981992", "mag": 1.8, "time": 1506907678571, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2312, 63.3329, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902936", "mag": 1.52, "time": 1506905787330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.426, 38.404, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250827", "mag": 1.35, "time": 1506905780190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4175, 42.518833, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250822", "mag": 1.43, "time": 1506905571670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422333, 42.512667, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61929496", "mag": 1.71, "time": 1506905364520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.584503, 19.484333, 2.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16981986", "mag": 1.5, "time": 1506903663272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7914, 61.5177, 34.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016496", "mag": 1.6, "time": 1506903468250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793667, 33.502333, 5.16 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016488", "mag": 1.3, "time": 1506903227250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.5175, 34.2865, 7.02 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607841", "mag": 2.5, "time": 1506901760242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.7954, 37.1971, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902911", "mag": 2.66, "time": 1506901676700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.506167, 40.3085, 21.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16981979", "mag": 2.0, "time": 1506901404559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6022, 63.105, 120.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990868", "mag": 2.0, "time": 1506900397361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1198, 58.9916, 108.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980981", "mag": 1.3, "time": 1506899671796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.1479, 60.8928, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016456", "mag": 1.6, "time": 1506899253540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2755, 33.976333, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902901", "mag": 1.02, "time": 1506898875730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810165, 38.816834, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258679", "mag": 1.05, "time": 1506897817900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.891833, 12.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980976", "mag": 1.1, "time": 1506897164997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.9167, 60.5402, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980971", "mag": 1.8, "time": 1506896659586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1362, 61.9345, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980968", "mag": 2.0, "time": 1506896402168, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9985, 65.5166, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980965", "mag": 1.5, "time": 1506895579977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6538, 59.9364, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016448", "mag": 1.52, "time": 1506895319020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.830833, 33.712, 16.9 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70236163", "mag": 2.36, "time": 1506894257160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.905833, 36.996333, 9.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990861", "mag": 1.1, "time": 1506893923115, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3425, 61.0789, 57.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607826", "mag": 1.4, "time": 1506893733690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6519, 39.1963, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980964", "mag": 1.2, "time": 1506892711109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8709, 61.4311, 46.5 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336341", "mag": 1.82, "time": 1506892129610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.567667, 49.3235, -1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990859", "mag": 1.9, "time": 1506891719402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8509, 57.8862, 54.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980963", "mag": 1.2, "time": 1506891059795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5477, 60.1976, 34.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258669", "mag": 1.06, "time": 1506890613170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.515667, 46.8785, 11.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980956", "mag": 2.1, "time": 1506890459542, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.2618, 53.748, 49.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980945", "mag": 1.5, "time": 1506890359030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5485, 59.782, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980939", "mag": 2.7, "time": 1506890337968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2691, 59.2151, 55.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980943", "mag": 2.0, "time": 1506890332904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1083, 61.5648, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axlg", "mag": 2.5, "time": 1506890067740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7952, 35.9855, 3.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902871", "mag": 1.2, "time": 1506890044550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.619333, 36.969667, 5.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980936", "mag": 1.3, "time": 1506889965804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4052, 62.336, 46.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16980933", "mag": 1.6, "time": 1506888599699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5246, 51.8512, 19.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258664", "mag": 1.08, "time": 1506888514540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.889833, 12.19 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902866", "mag": 1.72, "time": 1506888000180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3795, 40.710333, 18.86 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axkq", "mag": 3.3, "time": 1506887023210, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.4467, 36.1992, 5.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axkh", "mag": 4.4, "time": 1506885748640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3923, 15.6065, 68.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axkg", "mag": 4.7, "time": 1506885628670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 131.0709, 30.4016, 52.09 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902851", "mag": 1.6, "time": 1506885379850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806167, 38.816833, 2.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16979941", "mag": 1.1, "time": 1506885213719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2184, 62.3649, 80.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902846", "mag": 1.16, "time": 1506883965960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.676, 37.612, 3.61 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607803", "mag": 1.2, "time": 1506883429003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7983, 37.0626, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990850", "mag": 1.4, "time": 1506881346159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4695, 60.2829, 104.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902836", "mag": 1.01, "time": 1506881205680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800835, 38.831833, 1.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16979936", "mag": 1.1, "time": 1506880968876, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7414, 62.1039, 54.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607807", "mag": 1.1, "time": 1506880810251, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1156, 38.2725, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928951", "mag": 2.13, "time": 1506880210700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.408493, 19.198166, 32.85 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607796", "mag": 1.4, "time": 1506880150990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7769, 37.082, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16979932", "mag": 1.3, "time": 1506879650012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5344, 59.9497, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16979928", "mag": 1.4, "time": 1506878561352, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7881, 59.4532, 86.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axj4", "mag": 4.9, "time": 1506877281250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6588, -24.2867, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336301", "mag": 1.08, "time": 1506877137600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.289333, 46.525667, 12.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axiu", "mag": 4.8, "time": 1506876485410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.1816, -45.7692, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902831", "mag": 2.39, "time": 1506876142050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.5015, 0.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16978937", "mag": 1.2, "time": 1506875682364, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0123, 63.225, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990844", "mag": 1.0, "time": 1506875638383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3476, 60.399, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16978936", "mag": 1.3, "time": 1506875438694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1025, 62.0191, 64.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990842", "mag": 1.6, "time": 1506873845866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.7815, 51.9812, 27.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16977948", "mag": 2.0, "time": 1506871550948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.142, 60.236, 132.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axi9", "mag": 4.2, "time": 1506870604300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8183, -18.2769, 600.28 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902801", "mag": 1.08, "time": 1506869234490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.736333, 37.427833, 11.17 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902796", "mag": 0.97, "time": 1506869005720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80983, 38.822666, 2.38 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902791", "mag": 1.02, "time": 1506868646100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.018, 37.4345, 4.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axi8", "mag": 4.5, "time": 1506868536330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.3426, 12.898, 30.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902781", "mag": 1.48, "time": 1506867941180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.033833, 37.4125, 0.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axhz", "mag": 4.5, "time": 1506867628470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.306, 40.1598, 57.26 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336271", "mag": 1.68, "time": 1506867619960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.078833, 44.103667, -0.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990839", "mag": 1.7, "time": 1506867169462, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3848, 56.4945, 79.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axhv", "mag": 5.0, "time": 1506866880330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5287, -22.8028, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16976960", "mag": 1.2, "time": 1506866784677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7487, 60.0824, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250707", "mag": 2.06, "time": 1506866738590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.650333, 2.93 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258644", "mag": 1.07, "time": 1506866437550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.866, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928751", "mag": 1.73, "time": 1506865813980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.633499, 19.408501, 4.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16976951", "mag": 1.0, "time": 1506864160172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.909, 58.2689, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16976949", "mag": 1.0, "time": 1506864011046, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6138, 60.5977, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990832", "mag": 1.4, "time": 1506863730810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1725, 60.1804, 135.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16975974", "mag": 1.1, "time": 1506862307453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3672, 61.3015, 47.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axhf", "mag": 4.6, "time": 1506862144080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.9129, 12.7332, 25.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16975970", "mag": 1.3, "time": 1506861392092, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0328, 59.3749, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16975965", "mag": 1.4, "time": 1506860447567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3802, 59.7999, 122.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16975961", "mag": 1.9, "time": 1506860241377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3702, 58.1855, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016296", "mag": 0.97, "time": 1506860065660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.200333, 33.034167, 6.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902736", "mag": 1.01, "time": 1506859858880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.812668, 3.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16975960", "mag": 2.0, "time": 1506859830456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.5366, 51.4282, 50.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974988", "mag": 1.1, "time": 1506859403703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7216, 57.888, 61.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607763", "mag": 2.0, "time": 1506858283945, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6834, 40.0949, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974986", "mag": 1.5, "time": 1506857978595, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6219, 59.7494, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016272", "mag": 1.31, "time": 1506857701950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.46, 34.330833, 3.08 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258619", "mag": 1.22, "time": 1506857080460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.509667, 46.908167, 15.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974980", "mag": 2.0, "time": 1506856935435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4679, 51.6302, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974977", "mag": 1.7, "time": 1506856591674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0171, 58.9928, 112.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990818", "mag": 1.6, "time": 1506856352544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6069, 60.035, 157.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902701", "mag": 1.04, "time": 1506856284600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.718, 38.742333, 1.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974975", "mag": 1.2, "time": 1506856083450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5011, 64.299, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974972", "mag": 1.5, "time": 1506855936313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5182, 59.9216, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016224", "mag": 1.28, "time": 1506855241040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.731167, 33.649, 12.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990815", "mag": 2.8, "time": 1506854643419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4705, 51.8814, 165.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928636", "mag": 2.82, "time": 1506854300970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.485667, 20.355333, 14.282 ] } }, +{ "type": "Feature", "properties": { "id": "ak16974969", "mag": 1.4, "time": 1506854297360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6332, 59.9863, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902676", "mag": 1.69, "time": 1506853476410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.984, 37.5295, 2.12 ] } }, +{ "type": "Feature", "properties": { "id": "ak16973994", "mag": 1.0, "time": 1506853292474, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0636, 62.2825, 41.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607794", "mag": 1.1, "time": 1506852962371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9213, 38.3646, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016200", "mag": 1.06, "time": 1506852815200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791833, 33.502167, 4.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axgb", "mag": 5.1, "time": 1506852415110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.6916, -24.4751, 87.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016192", "mag": 1.27, "time": 1506852211900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.464167, 36.311167, 0.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990809", "mag": 1.3, "time": 1506851397558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4428, 58.7981, 124.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16973987", "mag": 1.3, "time": 1506850332700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1498, 59.6631, 104.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902646", "mag": 1.37, "time": 1506850223860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.452, 37.402167, 4.64 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axfz", "mag": 4.0, "time": 1506849733290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8612, 14.9405, 53.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16973981", "mag": 1.6, "time": 1506849720561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2003, 60.1713, 129.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16973012", "mag": 1.1, "time": 1506849332753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7558, 59.8604, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axfu", "mag": 4.4, "time": 1506848263400, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.7814, 18.4858, 79.09 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016176", "mag": 1.75, "time": 1506848220800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.651333, 35.934333, 2.81 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016160", "mag": 1.37, "time": 1506846375610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.908333, 35.5955, 1.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990805", "mag": 2.5, "time": 1506845582617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.7071, 51.7987, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16972044", "mag": 1.1, "time": 1506843571095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4859, 61.0501, 21.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axfi", "mag": 4.1, "time": 1506843463030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.5019, -1.5006, 197.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16972038", "mag": 1.5, "time": 1506842124989, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6539, 62.7976, 71.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16972036", "mag": 1.2, "time": 1506841940900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8258, 61.6968, 61.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258604", "mag": 1.59, "time": 1506841735050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.459167, 46.866, 10.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016112", "mag": 1.44, "time": 1506840801230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2085, 34.452833, 11.88 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70236143", "mag": 1.72, "time": 1506840567300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7785, 37.328333, 4.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990799", "mag": 1.1, "time": 1506840419377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7218, 59.2315, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16971064", "mag": 2.6, "time": 1506838204059, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5055, 59.3191, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axek", "mag": 3.2, "time": 1506836917300, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7711, 36.4532, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16970116", "mag": 2.7, "time": 1506836847043, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9474, 62.6019, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902586", "mag": 1.42, "time": 1506836822020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.604, 4.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902581", "mag": 1.71, "time": 1506836766960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.604333, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928476", "mag": 1.81, "time": 1506836276760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.631836, 19.188999, 0.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16970114", "mag": 1.3, "time": 1506835946408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.345, 60.1863, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250622", "mag": 2.13, "time": 1506835247610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.578, 38.7305, -0.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axe4", "mag": 4.2, "time": 1506834536440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.1269, -6.2836, 59.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axdz", "mag": 4.1, "time": 1506833874150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -85.5987, 9.126, 39.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16970083", "mag": 2.0, "time": 1506833288717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6914, 61.3678, 29.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16969148", "mag": 1.9, "time": 1506832174570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9412, 51.6192, 50.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16969146", "mag": 1.0, "time": 1506831622152, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.577, 62.7735, 79.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016048", "mag": 1.04, "time": 1506831472900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.833167, 33.669167, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38016040", "mag": 1.1, "time": 1506831149410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.485, 36.3695, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258549", "mag": 1.59, "time": 1506830710300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5235, 46.889833, 13.14 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928346", "mag": 2.95, "time": 1506829826670, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.095333, 19.715167, 33.794 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990790", "mag": 1.0, "time": 1506829471423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2898, 60.1429, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902546", "mag": 1.45, "time": 1506828244030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157167, 36.626, 8.14 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258544", "mag": 1.11, "time": 1506828010380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.871, 10.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902531", "mag": 1.44, "time": 1506827498200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.228833, 36.619333, 4.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16968180", "mag": 2.0, "time": 1506827492404, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.739, 61.1833, 86.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axpk", "mag": 1.6, "time": 1506827393900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.9053, 41.6481, 6.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015992", "mag": 1.15, "time": 1506827015230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3845, 35.111667, 5.93 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928261", "mag": 2.05, "time": 1506825377030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.476502, 19.216, 37.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990784", "mag": 1.4, "time": 1506825243899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2232, 51.7576, 46.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61336131", "mag": 1.16, "time": 1506825168050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9095, 48.316167, 1.09 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258539", "mag": 1.53, "time": 1506824807150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.877, 11.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16967237", "mag": 1.8, "time": 1506824784256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7866, 53.1332, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990782", "mag": 2.0, "time": 1506823956350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.6834, 51.2465, 35.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990781", "mag": 1.3, "time": 1506823856677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.521, 59.9658, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902506", "mag": 1.22, "time": 1506821920520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7125, 37.351167, 7.83 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axct", "mag": 5.1, "time": 1506821726490, "felt": 125, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.1491, 7.5135, 142.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015920", "mag": 1.75, "time": 1506821149880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.354833, 33.961167, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axcn", "mag": 4.9, "time": 1506821107970, "felt": 24, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5685, 36.9167, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990780", "mag": 2.5, "time": 1506821107760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8117, 51.8357, 61.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015912", "mag": 1.0, "time": 1506820492420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.119167, 33.9365, 14.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990779", "mag": 1.3, "time": 1506819992776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8841, 57.2184, 46.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990778", "mag": 1.0, "time": 1506819499573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4019, 63.1122, 97.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902491", "mag": 1.79, "time": 1506819103020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.939, 37.635333, 5.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16966268", "mag": 1.8, "time": 1506818601975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9252, 60.1498, 112.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16966264", "mag": 1.5, "time": 1506818511725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4432, 51.7288, 13.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16966263", "mag": 2.1, "time": 1506818242272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7041, 52.7581, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990774", "mag": 1.5, "time": 1506818099252, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4546, 51.7076, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16990772", "mag": 2.7, "time": 1506817440647, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.6939, 51.8802, 15.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axc3", "mag": 4.5, "time": 1506817163710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.9456, 7.2071, 68.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16965336", "mag": 1.9, "time": 1506816635445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9899, 60.0896, 71.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16965329", "mag": 1.2, "time": 1506816385660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3486, 64.9885, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axbx", "mag": 4.3, "time": 1506816328880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.9474, 51.9828, 27.38 ] } }, +{ "type": "Feature", "properties": { "id": "hv61928136", "mag": 2.02, "time": 1506816129630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.123672, 19.313999, 2.22 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250512", "mag": 2.38, "time": 1506814998100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.459167, 42.663667, 2.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axbj", "mag": 3.2, "time": 1506814776660, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4566, 42.652, 6.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axba", "mag": 2.8, "time": 1506814745510, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4606, 42.6545, 4.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axb6", "mag": 2.7, "time": 1506814557760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.473, 42.6754, 3.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16964389", "mag": 1.2, "time": 1506813911112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5092, 62.3699, 51.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015880", "mag": 1.87, "time": 1506813831910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.455333, 34.324167, 2.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000axas", "mag": 5.5, "time": 1506813329570, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.5426, 3.9405, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16964388", "mag": 1.6, "time": 1506812976279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5291, 59.2674, 85.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989805", "mag": 1.4, "time": 1506812398891, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7509, 60.014, 105.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16964387", "mag": 1.0, "time": 1506812112182, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1116, 62.3522, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16964380", "mag": 1.0, "time": 1506811899089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6933, 62.6659, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607730", "mag": 1.0, "time": 1506811774166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9049, 37.2915, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607738", "mag": 1.0, "time": 1506811292528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8999, 37.2878, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607737", "mag": 1.1, "time": 1506811240125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9056, 37.279, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607728", "mag": 1.1, "time": 1506811230164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9061, 37.2885, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250442", "mag": 2.43, "time": 1506810599500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4515, 42.661, 2.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16963468", "mag": 1.2, "time": 1506810291866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5204, 63.352, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607721", "mag": 1.4, "time": 1506807445148, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6755, 40.2201, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16963443", "mag": 1.1, "time": 1506806484011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3476, 61.4217, 25.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16963413", "mag": 2.3, "time": 1506806152613, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.0067, 60.9307, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16962501", "mag": 4.2, "time": 1506806106026, "felt": 17, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -152.2422, 59.621, 83.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989798", "mag": 1.1, "time": 1506805696616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7955, 61.7318, 98.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax9r", "mag": 4.7, "time": 1506805651800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.9751, 27.653, 485.8 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335981", "mag": 1.82, "time": 1506805100680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.056833, 48.412333, 50.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902471", "mag": 2.5, "time": 1506804691550, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2745, 38.558167, 6.21 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107604", "mag": 0.96, "time": 1506804690650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.780167, 35.5105, 3.92 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015856", "mag": 1.0, "time": 1506804008820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791, 33.512, 6.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax9d", "mag": 4.1, "time": 1506803686610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.7108, -8.0939, 216.64 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax9h", "mag": 3.5, "time": 1506803627030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.5125, 17.7855, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61927906", "mag": 3.49, "time": 1506803617560, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.469, 19.209667, 35.947 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax99", "mag": 4.7, "time": 1506802488710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.8145, 21.6564, 64.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015848", "mag": 1.38, "time": 1506802371860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.363167, 33.357333, 10.38 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902466", "mag": 1.77, "time": 1506801988210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.781, 38.796667, 3.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16962490", "mag": 1.1, "time": 1506800090127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1783, 59.7871, 69.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16962484", "mag": 1.5, "time": 1506799366659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6852, 63.5864, 3.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607710", "mag": 1.2, "time": 1506799171022, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1362, 38.2888, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16962480", "mag": 3.0, "time": 1506798820424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1572, 55.8639, 11.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989794", "mag": 1.9, "time": 1506798785904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2132, 52.0688, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258414", "mag": 1.87, "time": 1506798465250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525333, 46.872833, 11.78 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax8b", "mag": 2.5, "time": 1506797682590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4618, 42.6659, 3.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16962476", "mag": 1.4, "time": 1506797627539, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5093, 61.3123, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961588", "mag": 1.1, "time": 1506797036668, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7901, 63.2441, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0d3", "mag": 4.1, "time": 1506796297940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8027, 15.4984, 19.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015776", "mag": 1.28, "time": 1506796206280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.89, 34.349167, 2.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961586", "mag": 2.0, "time": 1506795961720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8619, 51.4801, 41.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961585", "mag": 1.1, "time": 1506795458511, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5581, 61.5616, 72.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015752", "mag": 1.52, "time": 1506795424490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.160667, 34.4365, 4.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax7s", "mag": 4.8, "time": 1506795349220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9189, 16.1602, 51.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904876", "mag": 1.25, "time": 1506795206390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.484167, 40.699167, 11.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961582", "mag": 1.1, "time": 1506794436503, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6079, 60.1354, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961580", "mag": 1.1, "time": 1506794299451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5942, 60.1565, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16961575", "mag": 1.6, "time": 1506793157002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.119, 51.4689, 25.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax76", "mag": 4.9, "time": 1506789944160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.9767, 1.0533, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902376", "mag": 1.84, "time": 1506788771420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8085, 38.817833, 3.12 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902381", "mag": 1.19, "time": 1506788628860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3415, 37.8225, -0.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16960680", "mag": 2.9, "time": 1506788491228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9778, 51.4147, 57.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989782", "mag": 1.1, "time": 1506788345464, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7866, 57.4545, 53.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902371", "mag": 1.16, "time": 1506786770930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.691, 38.7405, 1.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax6w", "mag": 2.6, "time": 1506785489440, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5446, 36.2305, 5.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16959801", "mag": 1.0, "time": 1506785312713, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7001, 61.542, 58.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258389", "mag": 1.27, "time": 1506783781070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531167, 46.8685, 11.42 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015696", "mag": 2.28, "time": 1506783542670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.492667, 34.216, 5.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16959795", "mag": 1.6, "time": 1506783111232, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5985, 59.916, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902346", "mag": 1.53, "time": 1506782817930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.249667, 37.864833, 5.03 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902336", "mag": 1.34, "time": 1506782106540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819833, 37.603833, 4.12 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015672", "mag": 1.46, "time": 1506781658250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2715, 34.059333, 15.26 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335861", "mag": 1.05, "time": 1506780581040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.452333, 48.382667, 22.31 ] } }, +{ "type": "Feature", "properties": { "id": "hv61927751", "mag": 2.29, "time": 1506780487200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.627833, 19.405333, 3.602 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958915", "mag": 1.1, "time": 1506779690755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.5599, 60.3017, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958913", "mag": 1.2, "time": 1506779388174, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6949, 63.8592, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989774", "mag": 1.1, "time": 1506778517082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4836, 62.981, 94.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015648", "mag": 1.53, "time": 1506777358020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.461667, 34.329167, 3.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958909", "mag": 1.8, "time": 1506777347886, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2124, 67.8158, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015640", "mag": 2.0, "time": 1506777335770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.658167, 31.867, 1.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015616", "mag": 1.28, "time": 1506776191250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.768833, 33.326833, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958907", "mag": 1.2, "time": 1506775842000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4069, 62.3275, 86.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902306", "mag": 1.41, "time": 1506775748110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.605333, 4.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958905", "mag": 2.0, "time": 1506775349934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7202, 67.3687, 4.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607651", "mag": 1.2, "time": 1506775034180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8976, 38.3688, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958026", "mag": 2.8, "time": 1506774114627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7286, 67.3815, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250312", "mag": 2.59, "time": 1506774047790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.635, 37.764167, 13.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958023", "mag": 1.6, "time": 1506773722633, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6494, 63.1022, 115.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989768", "mag": 1.6, "time": 1506773709105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8697, 59.0106, 105.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902286", "mag": 1.55, "time": 1506773378420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898833, 37.522667, 12.57 ] } }, +{ "type": "Feature", "properties": { "id": "ld60143701", "mag": 0.98, "time": 1506773153350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.5095, 40.809333, 11.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16958020", "mag": 1.2, "time": 1506771142867, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0654, 62.1893, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16957154", "mag": 1.4, "time": 1506770413805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3117, 61.0872, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015552", "mag": 1.58, "time": 1506769732230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.155, 34.5615, 2.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989763", "mag": 1.5, "time": 1506768979985, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1722, 60.0493, 117.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250297", "mag": 1.97, "time": 1506768169440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4255, 42.547, 7.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16957134", "mag": 1.5, "time": 1506768169245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9682, 61.4708, 39.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax5m", "mag": 5.2, "time": 1506767402460, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.7797, 1.8973, 37.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989760", "mag": 1.1, "time": 1506766077754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8184, 60.0072, 67.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902251", "mag": 1.22, "time": 1506766057090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800833, 38.792667, 2.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16956252", "mag": 1.6, "time": 1506765146662, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3164, 61.6465, 25.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax55", "mag": 4.4, "time": 1506764918800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0971, 15.3765, 35.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16956250", "mag": 3.1, "time": 1506764602367, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3876, 51.6362, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250277", "mag": 1.1, "time": 1506764348800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411333, 38.962833, -1.36 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902211", "mag": 2.24, "time": 1506763678540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.1355, 37.688333, 25.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16955383", "mag": 2.0, "time": 1506763079790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7222, 59.2509, 16.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16955380", "mag": 1.1, "time": 1506762584802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0664, 61.8814, 35.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902196", "mag": 1.37, "time": 1506761418100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7435, 38.788, 0.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax4r", "mag": 2.5, "time": 1506761330980, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5543, 36.2286, 1.38 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015488", "mag": 1.48, "time": 1506761301510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3055, 33.255167, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015480", "mag": 1.54, "time": 1506760683740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.638333, 33.165167, 2.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16955371", "mag": 2.5, "time": 1506760322340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9144, 51.2732, 19.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902186", "mag": 1.08, "time": 1506759358360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.750832, 38.806835, 0.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902176", "mag": 1.52, "time": 1506758934270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.270833, 39.463167, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16955365", "mag": 2.3, "time": 1506758896299, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.4581, 50.7723, 29.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16955363", "mag": 1.2, "time": 1506758873795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2563, 61.2042, 65.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902161", "mag": 1.43, "time": 1506758269830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820833, 37.604167, 3.89 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902151", "mag": 1.08, "time": 1506757752200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.095167, 36.564333, 8.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16954507", "mag": 1.7, "time": 1506757551919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4734, 51.7808, 63.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16954502", "mag": 1.5, "time": 1506757337943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7203, 60.1564, 96.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16954501", "mag": 1.2, "time": 1506757146790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0463, 62.4859, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16954494", "mag": 1.2, "time": 1506755657374, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4986, 59.9398, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989746", "mag": 1.4, "time": 1506755147399, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4214, 51.6622, 47.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902146", "mag": 1.49, "time": 1506754443300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7965, 38.821167, 2.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16953640", "mag": 1.8, "time": 1506754020475, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3389, 63.5229, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015432", "mag": 1.45, "time": 1506753848290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.784, 34.512167, 18.77 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902141", "mag": 1.71, "time": 1506753528720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9575, 37.590333, -0.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax3z", "mag": 5.0, "time": 1506753276470, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.7893, -37.146, 51.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax3x", "mag": 4.0, "time": 1506752562800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1802, 15.1606, 44.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax3v", "mag": 5.5, "time": 1506752076970, "felt": 45, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 105.0015, 32.3196, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902116", "mag": 1.62, "time": 1506750865330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.599667, 37.407833, 9.53 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015368", "mag": 1.67, "time": 1506750508810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.076333, 36.188833, 2.55 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258359", "mag": 1.02, "time": 1506750398880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.9725, 47.5955, 16.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax3j", "mag": 2.7, "time": 1506750040910, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.2913, 46.8038, 7.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16952767", "mag": 1.8, "time": 1506749904921, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3454, 60.3536, 81.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16952766", "mag": 2.3, "time": 1506749189648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.3954, 52.6671, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax39", "mag": 4.5, "time": 1506748759440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.5825, -6.071, 46.79 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902081", "mag": 1.59, "time": 1506748525170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.603833, 3.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989740", "mag": 1.2, "time": 1506747601510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7455, 63.2374, 127.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250227", "mag": 1.55, "time": 1506747254170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.416167, 42.576, 7.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989738", "mag": 2.1, "time": 1506746345789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.3938, 52.2402, 166.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax2y", "mag": 2.0, "time": 1506744973730, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.5373, 31.4264, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax2z", "mag": 4.2, "time": 1506744770640, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 56.8179, 27.8699, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16951924", "mag": 1.9, "time": 1506744732618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0884, 59.736, 45.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72902041", "mag": 1.11, "time": 1506744250250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833, 37.493667, -0.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989735", "mag": 1.2, "time": 1506741220731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9578, 61.9828, 69.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16951083", "mag": 2.6, "time": 1506741030111, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6653, 59.3044, 110.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989733", "mag": 1.9, "time": 1506739580500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7167, 57.5293, 92.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax2n", "mag": 4.5, "time": 1506739554570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 136.7409, -3.3243, 53.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16951081", "mag": 1.2, "time": 1506738073140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.643, 59.7863, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015232", "mag": 1.78, "time": 1506737478680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.242833, 34.689, 2.49 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207556", "mag": 1.6, "time": 1506737274410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.540333, 36.441167, 8.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16951079", "mag": 1.0, "time": 1506737168134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6248, 59.7789, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989730", "mag": 1.0, "time": 1506736917340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3855, 61.2392, 35.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16951077", "mag": 2.7, "time": 1506736523109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.4182, 51.6603, 65.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607629", "mag": 1.3, "time": 1506736488217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2269, 38.6102, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989728", "mag": 1.8, "time": 1506734962617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4354, 59.672, 120.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax2c", "mag": 4.2, "time": 1506734849800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1267, 15.2552, 35.18 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015192", "mag": 1.59, "time": 1506734841110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.231333, 34.69, 2.26 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901986", "mag": 1.53, "time": 1506733264430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.604833, 4.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16950243", "mag": 1.5, "time": 1506732735872, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8027, 59.8685, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989726", "mag": 1.2, "time": 1506732275435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7993, 62.6213, 100.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b217", "mag": 4.4, "time": 1506731641840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5238, -17.429, 578.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901976", "mag": 1.18, "time": 1506731621270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.608667, 4.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16950242", "mag": 1.2, "time": 1506731391196, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6362, 63.7125, 120.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989723", "mag": 1.7, "time": 1506730448510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6879, 60.1242, 106.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015160", "mag": 1.92, "time": 1506730343820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0465, 33.1715, 3.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16950224", "mag": 2.7, "time": 1506729701559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9689, 62.8827, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015152", "mag": 2.71, "time": 1506729570740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.046167, 33.172833, 9.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989254", "mag": 1.6, "time": 1506729481572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2839, 51.9212, 67.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16950219", "mag": 1.3, "time": 1506729013003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9672, 64.4141, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16950216", "mag": 1.6, "time": 1506728300228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1933, 61.9028, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax17", "mag": 4.7, "time": 1506727132760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.696, 13.6996, 135.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949390", "mag": 2.0, "time": 1506727039137, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6767, 61.5138, 15.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949386", "mag": 1.2, "time": 1506726713734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3628, 64.9795, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901936", "mag": 1.7, "time": 1506726391160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604667, 4.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015128", "mag": 1.14, "time": 1506725917420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794167, 33.499833, 4.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax0h", "mag": 4.3, "time": 1506725523560, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.9693, 6.7514, 162.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901926", "mag": 1.27, "time": 1506725219450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.6045, 3.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989247", "mag": 1.4, "time": 1506725194385, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2194, 60.3483, 70.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901921", "mag": 1.68, "time": 1506724972140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7985, 38.0515, 10.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0b0", "mag": 4.2, "time": 1506724750370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7775, 14.8225, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awzq", "mag": 4.2, "time": 1506724590080, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.1967, -31.7027, 34.99 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250212", "mag": 1.71, "time": 1506723678770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.33, 44.419, 8.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16948452", "mag": 1.0, "time": 1506723638356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5236, 61.0736, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250207", "mag": 0.97, "time": 1506723591620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.331, 44.419667, 7.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16948450", "mag": 2.2, "time": 1506723243356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3899, 51.6225, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989243", "mag": 1.8, "time": 1506723039650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6224, 58.8526, 127.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015088", "mag": 2.26, "time": 1506722552150, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2355, 34.1175, 22.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awz1", "mag": 4.9, "time": 1506721850800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0878, 15.2008, 58.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awyk", "mag": 3.0, "time": 1506721368710, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.71, 43.4329, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awyj", "mag": 2.5, "time": 1506721170670, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8727, 36.4662, 8.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16948433", "mag": 1.1, "time": 1506720878279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3481, 63.5145, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015064", "mag": 1.38, "time": 1506720751740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9775, 33.998333, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901896", "mag": 1.79, "time": 1506720632350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604667, 3.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16948427", "mag": 2.1, "time": 1506720336314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3588, 61.6517, 20.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901891", "mag": 2.87, "time": 1506720104700, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.352667, 38.643167, 5.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax7e", "mag": 2.5, "time": 1506719402880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.5572, 49.4225, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awxt", "mag": 4.4, "time": 1506718802820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8406, 16.1453, 55.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901871", "mag": 1.92, "time": 1506717945880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878667, 37.535, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015016", "mag": 1.05, "time": 1506717237070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.142333, 33.336167, -0.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awx6", "mag": 4.7, "time": 1506717060150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3377, 14.7629, 21.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901856", "mag": 1.02, "time": 1506716541140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.722, 38.777668, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258329", "mag": 1.68, "time": 1506716143860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.210167, 46.588333, 0.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989238", "mag": 1.6, "time": 1506715318085, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.6762, 51.2251, 46.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38015000", "mag": 1.05, "time": 1506715194050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.174667, 33.223167, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989237", "mag": 1.3, "time": 1506715107803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4109, 51.6654, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989236", "mag": 1.8, "time": 1506714300796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0656, 51.6073, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16946778", "mag": 1.8, "time": 1506713921345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0358, 59.8156, 103.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awvi", "mag": 4.7, "time": 1506713408290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8244, 14.6951, 25.26 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awvc", "mag": 5.3, "time": 1506713101350, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 160.0808, 53.2159, 47.81 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901811", "mag": 1.13, "time": 1506712684050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.839833, 37.5695, 1.15 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014936", "mag": 1.22, "time": 1506711284740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.962833, 36.582167, 5.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945947", "mag": 1.1, "time": 1506711226973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7372, 61.7159, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335536", "mag": 1.21, "time": 1506711131520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.5445, 46.492667, -1.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901801", "mag": 1.03, "time": 1506711093580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.840332, 38.841, 1.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014904", "mag": 1.27, "time": 1506710840540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.351833, 35.050333, -1.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901786", "mag": 1.25, "time": 1506710565410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.638, 38.771, 3.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901781", "mag": 1.14, "time": 1506710562310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.813333, 37.477, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax1j", "mag": 2.6, "time": 1506708957540, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.9812, 40.4991, 10.41 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250167", "mag": 1.43, "time": 1506708811550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408333, 42.627833, 0.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945940", "mag": 2.2, "time": 1506708598408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1805, 65.8694, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awu0", "mag": 4.4, "time": 1506708535930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.7041, -29.9428, 24.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989230", "mag": 1.2, "time": 1506708266694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5133, 51.924, 29.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901741", "mag": 0.97, "time": 1506707146210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.608833, 3.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945938", "mag": 1.3, "time": 1506706984307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5563, 65.3108, 1.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945133", "mag": 1.4, "time": 1506706312872, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5157, 60.0338, 76.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945129", "mag": 1.8, "time": 1506705516485, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4094, 62.2086, 43.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901691", "mag": 1.19, "time": 1506705001740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819833, 37.604, 4.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945122", "mag": 2.7, "time": 1506704480054, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3979, 51.6138, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945116", "mag": 1.6, "time": 1506703818483, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7333, 62.8722, 95.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901686", "mag": 1.37, "time": 1506703671060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.763167, 38.815, 1.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989222", "mag": 1.3, "time": 1506703480244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.9223, 60.0784, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aws4", "mag": 4.2, "time": 1506703454020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2978, -24.5018, 178.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945111", "mag": 1.4, "time": 1506703443591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3415, 60.1469, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aws9", "mag": 2.8, "time": 1506703434610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.561, 46.8309, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945098", "mag": 2.9, "time": 1506703414975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2265, 52.0599, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901676", "mag": 1.08, "time": 1506702827030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8685, 37.573667, 2.96 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014752", "mag": 1.38, "time": 1506702364640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9525, 33.161667, 8.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901666", "mag": 2.1, "time": 1506702098440, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604167, 4.23 ] } }, +{ "type": "Feature", "properties": { "id": "hv61926636", "mag": 2.18, "time": 1506702014920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.601833, 20.052667, 34.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944301", "mag": 1.2, "time": 1506702004530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4859, 61.9357, 38.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awn9", "mag": 4.6, "time": 1506701320270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 30.6565, 36.9513, 89.38 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901651", "mag": 1.66, "time": 1506701302480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.628333, 36.892667, -0.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awp8", "mag": 5.0, "time": 1506701291670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.8294, 21.3911, 69.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944298", "mag": 1.9, "time": 1506700558070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3591, 59.6184, 107.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944296", "mag": 1.5, "time": 1506699999652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.347, 60.6887, 39.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944295", "mag": 2.3, "time": 1506699741265, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.4266, 51.6803, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944283", "mag": 3.0, "time": 1506699614700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.523, 51.6975, 12.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989214", "mag": 1.4, "time": 1506699333969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5572, 51.8006, 17.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944280", "mag": 1.6, "time": 1506699330322, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4554, 63.4968, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awju", "mag": 4.4, "time": 1506698634990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.674, 15.7931, 74.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901616", "mag": 1.45, "time": 1506698546300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.190833, 36.066, 9.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901611", "mag": 1.16, "time": 1506698374110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820167, 37.606167, 4.24 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250142", "mag": 1.31, "time": 1506698139210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.502167, 42.0255, -0.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989212", "mag": 1.5, "time": 1506697780188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1692, 61.0412, 92.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901601", "mag": 1.58, "time": 1506697356900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8215, 37.603833, 3.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16944278", "mag": 1.3, "time": 1506696524699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2498, 63.4064, 80.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16943485", "mag": 1.7, "time": 1506695993154, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7332, 58.8106, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16943478", "mag": 1.7, "time": 1506695477590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7502, 58.8134, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awj3", "mag": 2.5, "time": 1506695343600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.0981, 36.3324, 6.543 ] } }, +{ "type": "Feature", "properties": { "id": "ak16943471", "mag": 2.5, "time": 1506695221683, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9597, 58.9824, 104.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250137", "mag": 1.65, "time": 1506694436450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.506667, 42.031167, 2.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16943466", "mag": 1.3, "time": 1506694161233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3879, 63.5817, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989205", "mag": 2.0, "time": 1506693991548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2136, 52.0676, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901566", "mag": 2.08, "time": 1506693960730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.862333, 37.5625, 4.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16943439", "mag": 1.3, "time": 1506693558920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0206, 61.729, 33.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014568", "mag": 2.51, "time": 1506693023860, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.270167, 33.67, 4.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awib", "mag": 5.0, "time": 1506692997440, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 67.9437, 39.8728, 20.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901551", "mag": 1.74, "time": 1506692955010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821167, 37.605667, 4.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901546", "mag": 2.76, "time": 1506692724780, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.606167, 4.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16942648", "mag": 1.5, "time": 1506692473989, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3697, 60.1847, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250132", "mag": 1.79, "time": 1506692243980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.431, 42.543833, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258279", "mag": 1.06, "time": 1506691959070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531833, 46.8625, 13.38 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901536", "mag": 1.82, "time": 1506691724930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.605667, 4.02 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607504", "mag": 1.8, "time": 1506690215490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7002, 37.7048, 16.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16942645", "mag": 2.8, "time": 1506689890335, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2102, 52.0495, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61926461", "mag": 1.62, "time": 1506689375520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.457667, 19.1075, 28.777 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014488", "mag": 1.71, "time": 1506688966950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.030167, 36.589833, 2.83 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250122", "mag": 1.68, "time": 1506688495310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.410833, 42.548333, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014464", "mag": 1.51, "time": 1506688363340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.292833, 33.924, 11.12 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250117", "mag": 1.2, "time": 1506688147640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.451, 42.651167, 3.75 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607501", "mag": 1.5, "time": 1506687351344, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1244, 38.2711, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258269", "mag": 1.01, "time": 1506686927230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.712667, 47.670333, 12.54 ] } }, +{ "type": "Feature", "properties": { "id": "hv61926436", "mag": 2.78, "time": 1506686302190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.030667, 19.839833, 12.705 ] } }, +{ "type": "Feature", "properties": { "id": "ak16941853", "mag": 1.9, "time": 1506685697166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2959, 57.1271, 73.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awh4", "mag": 4.5, "time": 1506685520260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0117, 15.1312, 54.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16941849", "mag": 1.4, "time": 1506685238756, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2101, 65.8679, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awh2", "mag": 3.2, "time": 1506684953300, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -105.3739, 35.8708, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901446", "mag": 1.81, "time": 1506683864270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8685, 37.5745, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989195", "mag": 2.8, "time": 1506683238639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.2168, 53.4134, 215.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16941846", "mag": 2.8, "time": 1506683013276, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4342, 51.6411, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014408", "mag": 1.09, "time": 1506682934740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.248167, 34.684167, 3.67 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014400", "mag": 1.41, "time": 1506682423780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6475, 32.295833, 17.59 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335391", "mag": 1.31, "time": 1506682259150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.713833, 45.779, 4.47 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607493", "mag": 1.3, "time": 1506681999912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1157, 38.2921, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awgp", "mag": 4.0, "time": 1506681630910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.1308, 51.5953, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014376", "mag": 2.27, "time": 1506680323320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.236167, 34.686333, 2.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901411", "mag": 1.72, "time": 1506679482310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.606833, 4.18 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250092", "mag": 1.5, "time": 1506678952480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408833, 42.556667, 7.57 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901396", "mag": 1.23, "time": 1506677982920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0275, 36.556333, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014304", "mag": 1.52, "time": 1506677845800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798333, 33.502667, 4.26 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250087", "mag": 1.18, "time": 1506677776470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.772667, 41.2685, 12.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awgf", "mag": 4.7, "time": 1506677102490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.7467, 21.3618, 39.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989192", "mag": 1.2, "time": 1506676690210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7405, 63.338, 95.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014288", "mag": 1.53, "time": 1506676635710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.671, 33.215333, 3.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901376", "mag": 1.15, "time": 1506676399250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.721832, 38.776001, 1.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901366", "mag": 1.25, "time": 1506676178310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838167, 37.489833, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607489", "mag": 1.9, "time": 1506676166910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2245, 38.4923, 40.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989191", "mag": 1.8, "time": 1506675279572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0102, 58.492, 85.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989190", "mag": 1.3, "time": 1506674952846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1298, 60.9057, 47.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awfl", "mag": 4.4, "time": 1506674809710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.929, 14.9856, 43.22 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250082", "mag": 1.77, "time": 1506674053050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.7785, 38.186667, 4.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989188", "mag": 1.8, "time": 1506673945397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.291, 51.5518, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16940268", "mag": 1.1, "time": 1506673847917, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1687, 63.2488, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901291", "mag": 1.25, "time": 1506673221590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898667, 37.523167, 12.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16940267", "mag": 1.0, "time": 1506672847451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5017, 66.1069, 17.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014192", "mag": 1.18, "time": 1506671965070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4335, 34.163833, 7.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awf5", "mag": 4.2, "time": 1506671826720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 90.3467, 33.9272, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607584", "mag": 1.4, "time": 1506671521193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1177, 38.2758, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014184", "mag": 2.46, "time": 1506671466000, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.978833, 33.994167, 4.88 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607484", "mag": 1.8, "time": 1506671441804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1188, 38.2704, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901256", "mag": 1.15, "time": 1506670814700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8105, 38.808833, 0.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901241", "mag": 1.25, "time": 1506670284580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.989667, 36.427667, 2.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901231", "mag": 1.07, "time": 1506669441060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.540833, 37.406667, 8.01 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335361", "mag": 1.94, "time": 1506668594230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.733667, 47.824, 24.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awej", "mag": 4.2, "time": 1506668295660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 55.3123, 28.2886, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901196", "mag": 0.96, "time": 1506668052570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.571833, 36.012667, 3.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16940266", "mag": 1.2, "time": 1506668048758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5877, 62.1976, 22.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901186", "mag": 1.14, "time": 1506667805720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.848167, 37.6535, 2.83 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901176", "mag": 1.25, "time": 1506667100210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838333, 37.506167, 0.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901171", "mag": 2.27, "time": 1506666779210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835333, 37.507167, -1.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16940265", "mag": 1.4, "time": 1506666562961, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3945, 61.6303, 33.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16940263", "mag": 1.0, "time": 1506666497414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1712, 62.2695, 52.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901166", "mag": 1.28, "time": 1506666202970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.5065, 0.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awe6", "mag": 2.6, "time": 1506666160200, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6816, 35.8653, 6.569 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607469", "mag": 1.0, "time": 1506665961601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.5308, 38.52, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38014104", "mag": 1.28, "time": 1506665954550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.982833, 33.1725, 3.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989182", "mag": 1.1, "time": 1506665936336, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.485, 62.1641, 22.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901156", "mag": 2.23, "time": 1506665326530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8385, 37.505167, 1.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901146", "mag": 3.34, "time": 1506665130490, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8355, 37.5055, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989181", "mag": 1.9, "time": 1506664620963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.5107, 52.4839, 24.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901116", "mag": 1.16, "time": 1506664498090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.824833, 37.605667, 4.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16939483", "mag": 1.1, "time": 1506663985990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9358, 61.1521, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901106", "mag": 1.19, "time": 1506663736480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.78717, 38.829334, 1.02 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207436", "mag": 1.74, "time": 1506663708600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.653833, 36.539667, 9.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awdv", "mag": 4.5, "time": 1506663030100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.5233, -24.0812, 546.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16939475", "mag": 1.7, "time": 1506662432885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8708, 60.1234, 43.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250077", "mag": 1.14, "time": 1506662404800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.55, 41.1085, 19.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901046", "mag": 1.46, "time": 1506661869950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.846833, 37.647833, 3.02 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013856", "mag": 2.0, "time": 1506660542280, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.978, 33.995, 4.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989177", "mag": 1.2, "time": 1506660008320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4686, 63.102, 104.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945113", "mag": 2.3, "time": 1506659927913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0654, 53.6407, 46.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awd5", "mag": 5.0, "time": 1506659595610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1021, 14.8894, 24.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72901021", "mag": 1.62, "time": 1506659436560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826833, 38.814, 1.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awd1", "mag": 3.0, "time": 1506658713990, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6968, 35.8549, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258249", "mag": 2.26, "time": 1506658662520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.514, 46.840833, 13.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013816", "mag": 1.03, "time": 1506658457830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.02, 34.015, 13.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16938672", "mag": 1.1, "time": 1506657671332, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.311, 64.8546, 17.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awcv", "mag": 5.6, "time": 1506657622320, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0465, 14.9039, 21.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16945097", "mag": 2.0, "time": 1506657417279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.3696, 53.5031, 41.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900986", "mag": 1.05, "time": 1506657208460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.502333, -0.01 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235973", "mag": 1.64, "time": 1506657154290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887333, 37.201833, 5.03 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900981", "mag": 1.98, "time": 1506656801880, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8045, 38.832333, 1.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900976", "mag": 1.12, "time": 1506656629400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.758667, 38.793499, 0.77 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013768", "mag": 1.6, "time": 1506656062720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.976, 33.995833, 3.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937888", "mag": 1.8, "time": 1506653782695, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9369, 62.1991, 64.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989171", "mag": 1.9, "time": 1506653188688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5129, 51.845, 110.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61925851", "mag": 0.95, "time": 1506653113010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.463667, 19.481, 6.56 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013744", "mag": 1.0, "time": 1506653104110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.302333, 34.099, 15.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awce", "mag": 4.4, "time": 1506652310280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7803, 35.9821, 42.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013736", "mag": 2.07, "time": 1506652304260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.259833, 32.454333, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013720", "mag": 2.39, "time": 1506651375080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.569, 31.324, 4.82 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013712", "mag": 1.12, "time": 1506651359620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924833, 33.976167, 6.34 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607452", "mag": 1.0, "time": 1506651336185, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1923, 35.5727, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013704", "mag": 0.97, "time": 1506651243970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7885, 33.494833, 5.39 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013688", "mag": 1.05, "time": 1506650990920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791167, 33.5105, 6.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937883", "mag": 2.4, "time": 1506650514315, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9834, 51.7396, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900931", "mag": 1.16, "time": 1506649983200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720497, 38.775501, 1.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937869", "mag": 2.6, "time": 1506649468698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8838, 61.8075, 66.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60013219", "mag": 1.32, "time": 1506648472160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.687, 41.150667, 12.61 ] } }, +{ "type": "Feature", "properties": { "id": "uu60250062", "mag": 2.53, "time": 1506648435990, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.936667, 38.921333, 10.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awbw", "mag": 4.5, "time": 1506648405500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.976, 52.0498, 29.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awbq", "mag": 4.9, "time": 1506648161110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.1717, 52.3421, 33.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937823", "mag": 1.0, "time": 1506648034498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0631, 63.4906, 4.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989160", "mag": 1.6, "time": 1506646713769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.579, 51.7059, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900911", "mag": 1.15, "time": 1506646505210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834333, 37.504, -0.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013672", "mag": 2.61, "time": 1506646378780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.570333, 31.324667, 4.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937047", "mag": 1.0, "time": 1506646107258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4881, 63.0417, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937045", "mag": 1.9, "time": 1506646058692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.135, 67.8468, 16.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900906", "mag": 1.03, "time": 1506645880090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.876831, 38.8405, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900886", "mag": 1.63, "time": 1506645570060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818333, 38.816667, 2.21 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013656", "mag": 2.24, "time": 1506645489800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.313, 34.094167, 17.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013632", "mag": 1.51, "time": 1506645195410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7955, 33.502667, 3.76 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900876", "mag": 1.03, "time": 1506644780060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818, 37.470667, 1.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900871", "mag": 1.62, "time": 1506644672730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.585667, 37.234667, 6.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937041", "mag": 1.3, "time": 1506644621941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3267, 62.8222, 57.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937039", "mag": 1.7, "time": 1506644576562, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.2144, 60.0462, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937037", "mag": 1.1, "time": 1506644052798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3512, 58.196, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989154", "mag": 1.6, "time": 1506643362489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3692, 51.6466, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16937036", "mag": 1.4, "time": 1506643250597, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7379, 61.4006, 18.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awbb", "mag": 4.9, "time": 1506643017480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.7489, 19.052, 30.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989677", "mag": 1.5, "time": 1506642839250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8862, 61.8988, 105.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16936268", "mag": 1.2, "time": 1506642106483, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9604, 62.3327, 42.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607431", "mag": 1.9, "time": 1506641437450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5187, 36.978, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900841", "mag": 1.93, "time": 1506641348540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.606667, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900846", "mag": 1.13, "time": 1506641325970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818833, 37.608333, 4.24 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904266", "mag": 0.96, "time": 1506641269180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0985, 41.357, -1.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989674", "mag": 1.6, "time": 1506641141934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9034, 59.5213, 94.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awa2", "mag": 4.4, "time": 1506640604400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.6403, 51.5228, 41.23 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607821", "mag": 1.1, "time": 1506640364409, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9062, 38.3722, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw9p", "mag": 5.4, "time": 1506640275740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.7911, -24.8725, 440.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1wl", "mag": 4.8, "time": 1506639694670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.5676, 1.0849, 4.38 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw9e", "mag": 4.7, "time": 1506639688220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 133.3331, 2.9053, 15.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989671", "mag": 1.7, "time": 1506639639127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3134, 59.6717, 111.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16936241", "mag": 2.5, "time": 1506639635527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1768, 68.4586, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900821", "mag": 1.1, "time": 1506639127150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834833, 37.500333, -1.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw90", "mag": 5.1, "time": 1506638831750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5949, -34.0499, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw8l", "mag": 4.3, "time": 1506638537770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.4998, -6.5326, 108.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900811", "mag": 2.32, "time": 1506638416610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1135, 35.6885, 5.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900806", "mag": 1.35, "time": 1506638081190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878833, 37.534, 2.41 ] } }, +{ "type": "Feature", "properties": { "id": "uw61335056", "mag": 1.84, "time": 1506638058160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.417833, 45.624333, -1.28 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258209", "mag": 1.37, "time": 1506637878310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.910833, 10.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935473", "mag": 1.9, "time": 1506637576311, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.5454, 67.5431, 1.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935469", "mag": 2.0, "time": 1506637236181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4826, 58.8115, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989667", "mag": 2.0, "time": 1506636836791, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4008, 59.8707, 143.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989666", "mag": 1.1, "time": 1506636594038, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2636, 62.56, 91.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900796", "mag": 1.35, "time": 1506636488490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.710833, 38.743, 2.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935467", "mag": 1.1, "time": 1506635722873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2148, 64.8337, 24.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989663", "mag": 1.2, "time": 1506634878192, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0761, 62.868, 105.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw7x", "mag": 3.3, "time": 1506634428280, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 19.9413, 39.9063, 10.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989662", "mag": 1.3, "time": 1506634090975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8044, 63.1677, 125.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1wj", "mag": 4.0, "time": 1506633989680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.778, 49.1768, 363.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935454", "mag": 2.6, "time": 1506633516577, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9288, 61.8846, 49.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935459", "mag": 2.8, "time": 1506633516034, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7041, 61.8689, 59.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607410", "mag": 2.0, "time": 1506633382650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9234, 38.4032, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935451", "mag": 1.7, "time": 1506632963331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6029, 62.2054, 19.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013352", "mag": 1.79, "time": 1506632691350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.990833, 33.765333, 14.42 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607723", "mag": 1.0, "time": 1506632347835, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1182, 38.2802, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61925221", "mag": 1.37, "time": 1506631999030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.430333, 19.4155, 3.336 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935443", "mag": 2.3, "time": 1506631969817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.484, 61.7831, 31.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw54", "mag": 2.4, "time": 1506631716330, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.3897, 35.6755, 5.86 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw51", "mag": 4.7, "time": 1506631326570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.2381, -7.2814, 142.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989658", "mag": 1.3, "time": 1506630830832, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5815, 63.2958, 125.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935439", "mag": 1.8, "time": 1506629924653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1989, 60.9639, 35.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013336", "mag": 1.94, "time": 1506629828900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.131167, 32.218833, 17.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989656", "mag": 1.2, "time": 1506629660078, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0033, 63.1036, 120.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258194", "mag": 1.36, "time": 1506628850530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.870167, 10.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989655", "mag": 1.6, "time": 1506628609513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2274, 59.9548, 119.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989654", "mag": 1.5, "time": 1506627145969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4925, 59.606, 72.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900741", "mag": 1.19, "time": 1506626419400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.631667, 36.039167, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989653", "mag": 1.4, "time": 1506626367074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3296, 60.9023, 42.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aw2q", "mag": 4.9, "time": 1506625864960, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -84.1381, 3.222, 33.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249967", "mag": 1.41, "time": 1506625553170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457167, 42.614667, 6.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933835", "mag": 2.9, "time": 1506625397763, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.0327, 52.1592, 53.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013288", "mag": 1.11, "time": 1506625160340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.118167, 33.2435, 12.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989651", "mag": 1.3, "time": 1506624662212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6565, 62.7268, 75.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607390", "mag": 1.2, "time": 1506624316884, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0954, 35.994, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933797", "mag": 2.1, "time": 1506623643983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.596, 60.994, 73.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933794", "mag": 1.9, "time": 1506623613173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8361, 62.7886, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013264", "mag": 1.24, "time": 1506622262550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.530333, 35.347, 5.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989648", "mag": 1.6, "time": 1506621791811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5986, 59.752, 76.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61924821", "mag": 2.4, "time": 1506621499160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.122167, 19.331, 7.032 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933793", "mag": 1.6, "time": 1506621344909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8725, 59.9048, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900701", "mag": 1.21, "time": 1506621263930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.129833, 36.62, 9.54 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258169", "mag": 1.95, "time": 1506620957630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.495833, 46.896167, 10.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989646", "mag": 1.2, "time": 1506620810224, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5002, 61.5482, 31.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900691", "mag": 1.44, "time": 1506620029980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995833, 39.427167, 0.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989645", "mag": 1.5, "time": 1506619134173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0379, 60.1776, 121.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38013232", "mag": 1.17, "time": 1506618737450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.506833, 5.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avzh", "mag": 4.6, "time": 1506618485320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.5691, 2.1483, 97.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avzb", "mag": 4.9, "time": 1506617586500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.0401, 6.0164, 50.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933018", "mag": 1.2, "time": 1506617374262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7645, 61.7278, 64.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61924676", "mag": 1.37, "time": 1506617124930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.142167, 19.3215, 5.152 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989643", "mag": 1.6, "time": 1506616564611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8062, 60.4189, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989642", "mag": 1.4, "time": 1506615776447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9273, 61.5228, 95.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989641", "mag": 1.3, "time": 1506615666771, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3551, 60.8947, 43.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avyw", "mag": 2.7, "time": 1506615478140, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4394, 42.5767, 8.98 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900646", "mag": 1.38, "time": 1506615468050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0045, 36.4415, 0.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989640", "mag": 1.3, "time": 1506615161794, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0408, 63.589, 132.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989639", "mag": 1.2, "time": 1506615119980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3231, 63.0526, 91.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933017", "mag": 2.0, "time": 1506614678900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.3488, 68.1439, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989637", "mag": 2.0, "time": 1506614163379, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1177, 57.8245, 115.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900616", "mag": 1.97, "time": 1506613917930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833833, 37.506167, 0.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16933016", "mag": 1.5, "time": 1506613537003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1247, 62.197, 80.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900606", "mag": 1.53, "time": 1506612805340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.996667, 39.425333, 0.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989634", "mag": 1.6, "time": 1506612409300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4495, 58.785, 109.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989633", "mag": 1.3, "time": 1506612360069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6854, 61.515, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avy5", "mag": 2.4, "time": 1506612136390, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1391, 37.351, 10.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932254", "mag": 1.6, "time": 1506612041072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9819, 62.3692, 40.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avxu", "mag": 2.3, "time": 1506611699680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3926, 36.3885, 15.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932252", "mag": 1.4, "time": 1506611616543, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7975, 61.8375, 20.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900586", "mag": 1.03, "time": 1506611392120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821335, 38.808834, 2.14 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900581", "mag": 1.68, "time": 1506611003850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995167, 39.428167, 0.76 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900571", "mag": 3.21, "time": 1506610414710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.1635, 40.137833, 15.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932251", "mag": 2.9, "time": 1506610104421, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9091, 51.7632, 40.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249947", "mag": 1.1, "time": 1506608975840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.421333, 42.593667, 5.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900556", "mag": 1.09, "time": 1506608575910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.6065, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249942", "mag": 1.52, "time": 1506608341480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415667, 42.591167, 5.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932247", "mag": 2.1, "time": 1506608150712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4995, 59.282, 98.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989627", "mag": 1.2, "time": 1506607597338, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5495, 63.4604, 104.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989625", "mag": 1.6, "time": 1506607488149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3463, 61.0393, 106.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932246", "mag": 1.4, "time": 1506606933995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1075, 61.1056, 49.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932241", "mag": 2.4, "time": 1506606217414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3566, 59.8225, 132.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607373", "mag": 1.4, "time": 1506605920785, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4887, 38.6992, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989622", "mag": 1.0, "time": 1506605668248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.09, 62.8911, 77.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16932239", "mag": 1.5, "time": 1506605540122, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5382, 63.0052, 72.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900531", "mag": 1.45, "time": 1506605237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.023333, 37.519667, 2.73 ] } }, +{ "type": "Feature", "properties": { "id": "uw61334636", "mag": 1.41, "time": 1506604992060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.905, 48.235833, 11.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989620", "mag": 1.1, "time": 1506604766781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9752, 64.7557, 17.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900521", "mag": 1.23, "time": 1506604242090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.078, 37.663333, 7.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989619", "mag": 1.3, "time": 1506603071727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.42, 61.0462, 108.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249937", "mag": 2.05, "time": 1506602964450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440333, 42.584, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16931481", "mag": 1.0, "time": 1506601991313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.596, 66.821, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989616", "mag": 1.3, "time": 1506601744056, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1565, 57.9069, 53.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989615", "mag": 1.2, "time": 1506601651411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3908, 68.9058, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16931479", "mag": 1.4, "time": 1506601472327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4079, 61.6728, 40.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16931477", "mag": 1.1, "time": 1506601302752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8998, 65.8646, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900496", "mag": 1.36, "time": 1506601178090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.88, 37.535, 2.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16931475", "mag": 1.2, "time": 1506600842484, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.174, 61.7151, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900446", "mag": 2.75, "time": 1506598677940, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.825333, 38.840167, 1.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16930710", "mag": 2.2, "time": 1506598490657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4189, 62.1612, 87.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avvw", "mag": 5.3, "time": 1506598185690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.558, 28.7786, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989610", "mag": 1.2, "time": 1506597726479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1805, 63.0271, 90.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900431", "mag": 1.92, "time": 1506596753080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.485667, 38.5015, 5.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989609", "mag": 1.5, "time": 1506596722964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1313, 51.5863, 44.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16930709", "mag": 1.4, "time": 1506596180091, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9834, 61.0931, 56.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16930708", "mag": 3.1, "time": 1506595515294, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 176.7195, 51.6195, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989606", "mag": 1.5, "time": 1506595427986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.5238, 51.5739, 68.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900416", "mag": 1.17, "time": 1506594935360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.096, 36.553167, 9.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16930706", "mag": 1.2, "time": 1506593895889, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.338, 63.1851, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012984", "mag": 1.12, "time": 1506593315340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6855, 35.838833, 4.14 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900391", "mag": 1.49, "time": 1506592222290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823333, 37.607, 4.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16930705", "mag": 1.1, "time": 1506591630653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3689, 61.3755, 23.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012952", "mag": 1.31, "time": 1506591135600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.834333, 32.734667, 5.37 ] } }, +{ "type": "Feature", "properties": { "id": "hv61924526", "mag": 1.45, "time": 1506590418070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.421333, 19.392167, 9.534 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900381", "mag": 1.63, "time": 1506590284210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2205, 38.063167, 9.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avu4", "mag": 4.4, "time": 1506589563580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.6261, -23.7242, 196.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989602", "mag": 2.7, "time": 1506589434755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4192, 52.1877, 22.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012928", "mag": 1.18, "time": 1506589107820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7675, 33.325167, 12.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989601", "mag": 1.5, "time": 1506589104993, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4957, 51.6758, 15.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929945", "mag": 2.3, "time": 1506588754779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7058, 62.131, 34.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929940", "mag": 2.6, "time": 1506588542400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6191, 66.8364, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607351", "mag": 1.4, "time": 1506588343442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9118, 38.3801, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929936", "mag": 2.0, "time": 1506587984225, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4437, 61.9903, 29.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258129", "mag": 1.62, "time": 1506587784100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.868167, 10.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900351", "mag": 1.19, "time": 1506586386820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880833, 37.536333, 3.07 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avte", "mag": 4.7, "time": 1506586379850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 117.1706, -10.7291, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avtg", "mag": 5.3, "time": 1506586316130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.2449, 20.2657, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929174", "mag": 2.3, "time": 1506586272361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7694, 61.6101, 47.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900346", "mag": 1.18, "time": 1506586053100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823, 37.610167, 4.21 ] } }, +{ "type": "Feature", "properties": { "id": "uw61334586", "mag": 2.19, "time": 1506585933680, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.6315, 48.074, -0.77 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607345", "mag": 1.8, "time": 1506585602623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6237, 38.7874, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929171", "mag": 1.6, "time": 1506585414754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1681, 58.2365, 0.7 ] } }, +{ "type": "Feature", "properties": { "id": "hv61924441", "mag": 1.7, "time": 1506585350220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.865167, 19.430333, 13.243 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900326", "mag": 1.41, "time": 1506585322460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751, 38.783, 2.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929167", "mag": 2.4, "time": 1506585219017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.0108, 65.3932, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929164", "mag": 1.6, "time": 1506585151006, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7632, 61.6155, 48.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607342", "mag": 1.4, "time": 1506584922597, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6325, 38.7911, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16929162", "mag": 1.5, "time": 1506584839080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6957, 59.8727, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258114", "mag": 1.59, "time": 1506584469140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.867333, 10.81 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258109", "mag": 1.16, "time": 1506584073450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.53, 46.878167, 13.02 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012872", "mag": 1.17, "time": 1506583959450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817833, 34.8665, 6.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989588", "mag": 1.8, "time": 1506583466047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2642, 60.2053, 132.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awdi", "mag": 1.5, "time": 1506583342200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.1659, 45.241, 4.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avsq", "mag": 4.8, "time": 1506582689240, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.4054, 37.4649, 44.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16928412", "mag": 1.8, "time": 1506582059678, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6189, 67.5652, 16.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16928397", "mag": 2.0, "time": 1506580602424, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1188, 61.1485, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16928399", "mag": 1.1, "time": 1506580596261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8057, 66.0421, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900281", "mag": 1.14, "time": 1506579131440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.88, 37.5365, 3.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16928394", "mag": 1.6, "time": 1506578908430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0895, 61.7515, 17.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012840", "mag": 0.96, "time": 1506578825230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767667, 36.025167, 1.05 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012832", "mag": 1.0, "time": 1506578679490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.884833, 33.846833, 11.18 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249902", "mag": 1.26, "time": 1506578472190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.285833, 41.514167, 1.58 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249897", "mag": 1.56, "time": 1506578161990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4205, 42.5195, 5.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989578", "mag": 1.2, "time": 1506577617968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0285, 60.9615, 99.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16927642", "mag": 2.5, "time": 1506576956542, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4519, 60.4702, 49.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16927639", "mag": 1.1, "time": 1506575989243, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9371, 64.4345, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avrg", "mag": 4.2, "time": 1506575321430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9228, 16.6784, 58.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16927634", "mag": 1.4, "time": 1506574806948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9601, 61.6771, 57.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avr9", "mag": 3.0, "time": 1506574593800, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8025, 35.9915, 5.225 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900251", "mag": 1.08, "time": 1506573201460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.876833, 37.531833, 2.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989573", "mag": 1.0, "time": 1506573124099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1846, 68.5953, 17.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900241", "mag": 2.37, "time": 1506572664450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8255, 37.454833, 2.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900236", "mag": 1.11, "time": 1506572038110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.088333, 36.5915, 6.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16927631", "mag": 2.2, "time": 1506572029624, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6248, 51.535, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989570", "mag": 1.3, "time": 1506571605724, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1124, 61.418, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avr1", "mag": 2.8, "time": 1506571358890, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1712, 37.3741, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avqw", "mag": 3.2, "time": 1506571014630, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1535, 37.3739, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avr2", "mag": 4.9, "time": 1506570988200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.8102, -5.2471, 64.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900206", "mag": 1.12, "time": 1506569953990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878833, 37.5315, 2.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900201", "mag": 1.78, "time": 1506569868050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.191167, 36.174833, 16.31 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258089", "mag": 0.96, "time": 1506568483250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.872833, 14.45 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900166", "mag": 1.94, "time": 1506568350160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.970833, 36.399167, 0.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900156", "mag": 1.95, "time": 1506567041430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8805, 37.535167, 2.92 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607321", "mag": 1.0, "time": 1506566989487, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0173, 39.5809, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012696", "mag": 1.54, "time": 1506566359150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3855, 33.309667, 7.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926883", "mag": 1.4, "time": 1506564828219, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7449, 64.3314, 9.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926881", "mag": 1.6, "time": 1506563449576, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7299, 60.5992, 21.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avqf", "mag": 3.5, "time": 1506563003590, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -1.5206, 47.8948, 7.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avq4", "mag": 3.4, "time": 1506562916490, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.8862, 9.972, 12.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926876", "mag": 1.5, "time": 1506562750811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2038, 62.3276, 80.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989563", "mag": 2.4, "time": 1506562282380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5433, 52.3165, 175.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012648", "mag": 1.44, "time": 1506561221540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9255, 33.975833, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989561", "mag": 1.2, "time": 1506560682030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3529, 60.5442, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249877", "mag": 2.9, "time": 1506560508370, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.946, 38.905, 8.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012624", "mag": 1.0, "time": 1506559691050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.812, 36.016833, 1.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012616", "mag": 1.66, "time": 1506559333880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.939667, 33.686667, 9.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926874", "mag": 1.3, "time": 1506559196699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5701, 61.4562, 64.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900121", "mag": 1.32, "time": 1506558055260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.2635, 39.396667, 0.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16989559", "mag": 1.0, "time": 1506557933118, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9128, 61.7015, 46.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012608", "mag": 1.47, "time": 1506557437030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.089667, 35.6985, 2.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900106", "mag": 1.15, "time": 1506556889810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.794, 38.821167, 2.63 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607313", "mag": 1.3, "time": 1506556883650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1041, 37.378, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258084", "mag": 1.57, "time": 1506556538250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.874833, 14.66 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607310", "mag": 1.6, "time": 1506556172753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.059, 37.1112, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926873", "mag": 1.3, "time": 1506556116361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4042, 53.8015, 12.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900096", "mag": 1.12, "time": 1506556022400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.731667, 38.760166, 1.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988195", "mag": 1.9, "time": 1506555035171, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0633, 60.0089, 114.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avn9", "mag": 4.2, "time": 1506555004800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.4365, -8.2451, 154.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900086", "mag": 1.16, "time": 1506554882180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.738335, 38.755333, 0.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926134", "mag": 1.1, "time": 1506554881350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2845, 60.8545, 21.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988193", "mag": 1.0, "time": 1506554670593, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1097, 62.4437, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926036", "mag": 1.3, "time": 1506554241873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6125, 61.555, 35.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900081", "mag": 1.22, "time": 1506554024900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832, 37.5385, 4.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012576", "mag": 1.27, "time": 1506553539380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.392833, 34.878667, 4.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926028", "mag": 1.6, "time": 1506553116940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5885, 67.5732, 17.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012568", "mag": 1.61, "time": 1506552976740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.758833, 33.666667, 13.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926026", "mag": 1.6, "time": 1506552344260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6143, 63.0496, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988188", "mag": 1.0, "time": 1506552342400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0102, 64.7419, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926025", "mag": 1.7, "time": 1506551886678, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4287, 51.666, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249842", "mag": 1.14, "time": 1506551770950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.297667, 41.517833, 3.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926021", "mag": 1.0, "time": 1506550963839, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7318, 63.2463, 16.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012528", "mag": 1.36, "time": 1506549674520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.505667, 5.04 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avlw", "mag": 4.5, "time": 1506549399140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 123.4716, 24.998, 125.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988184", "mag": 1.9, "time": 1506549387020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4366, 51.4823, 54.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900041", "mag": 1.15, "time": 1506549261590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745331, 38.788502, 0.88 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249832", "mag": 1.22, "time": 1506548944800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.294333, 41.516333, 2.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avm6", "mag": 4.7, "time": 1506548861390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5824, 28.7476, 33.11 ] } }, +{ "type": "Feature", "properties": { "id": "hv61923721", "mag": 1.68, "time": 1506548248460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.233167, 19.411667, 26.335 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988183", "mag": 1.1, "time": 1506547027410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5065, 62.8856, 85.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988182", "mag": 1.3, "time": 1506546817449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3499, 60.4052, 65.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avkb", "mag": 4.8, "time": 1506546638200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5529, 28.769, 38.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avk0", "mag": 4.4, "time": 1506545901120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.9242, -10.8691, 104.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900011", "mag": 1.24, "time": 1506545494440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7435, 38.775167, 0.33 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258059", "mag": 1.99, "time": 1506545099310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533833, 46.865333, 12.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988181", "mag": 1.9, "time": 1506544970602, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5993, 58.8739, 125.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107599", "mag": 1.73, "time": 1506544649060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.852333, 36.770333, 5.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72900001", "mag": 1.02, "time": 1506544641500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.307333, 35.890833, 9.61 ] } }, +{ "type": "Feature", "properties": { "id": "uw61334351", "mag": 1.62, "time": 1506543856900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.103667, 46.818167, -0.37 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avim", "mag": 4.5, "time": 1506542712990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.6095, -15.1614, 131.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16924547", "mag": 1.3, "time": 1506542654107, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6538, 61.2784, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899976", "mag": 1.46, "time": 1506542639270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.024, 37.520333, 2.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988179", "mag": 1.4, "time": 1506542327610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9637, 61.5729, 96.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988178", "mag": 1.2, "time": 1506541938004, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1366, 60.2787, 53.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16924544", "mag": 1.5, "time": 1506541523210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1298, 59.8511, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16924540", "mag": 3.0, "time": 1506540667871, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8525, 51.0507, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16924539", "mag": 1.3, "time": 1506540652841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.178, 61.5488, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012400", "mag": 0.98, "time": 1506540581720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.481833, 33.471167, 13.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988174", "mag": 1.1, "time": 1506540333948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.501, 61.2429, 47.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012384", "mag": 1.3, "time": 1506539422810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.197, 34.992, -0.84 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258049", "mag": 1.59, "time": 1506539240620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.472833, 46.002167, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899931", "mag": 1.55, "time": 1506538588360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4435, 38.569833, 7.29 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012368", "mag": 1.32, "time": 1506538425860, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.193167, 34.018167, 9.75 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012360", "mag": 1.78, "time": 1506537986730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.929, 33.395, 16.07 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258044", "mag": 1.34, "time": 1506537974910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524833, 46.870667, 11.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258039", "mag": 1.67, "time": 1506537644220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525, 46.873167, 11.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012352", "mag": 1.26, "time": 1506537396500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.313333, 35.0755, -0.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988173", "mag": 2.5, "time": 1506536259670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2174, 55.267, 28.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923724", "mag": 1.8, "time": 1506535852212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.5095, 57.4219, 64.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012280", "mag": 1.04, "time": 1506535593850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8595, 37.1805, -1.52 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258024", "mag": 1.14, "time": 1506535428310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.542833, 46.867, 15.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923723", "mag": 1.8, "time": 1506535251777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8081, 59.8933, 18.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899896", "mag": 1.43, "time": 1506534720980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1055, 37.325167, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607242", "mag": 1.3, "time": 1506533616061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.8105, 37.3086, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922991", "mag": 1.3, "time": 1506533488405, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0074, 62.0045, 73.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922987", "mag": 1.8, "time": 1506533174170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1276, 62.1421, 107.7 ] } }, +{ "type": "Feature", "properties": { "id": "mb80258019", "mag": 1.36, "time": 1506533071220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.9895, 46.553167, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012256", "mag": 1.4, "time": 1506532727840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796333, 33.501667, 4.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922978", "mag": 3.9, "time": 1506532451736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.5261, 52.9317, 19.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922973", "mag": 1.3, "time": 1506532279574, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0546, 62.1579, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922968", "mag": 2.2, "time": 1506532267245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0431, 59.4743, 92.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922975", "mag": 1.9, "time": 1506532266486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1368, 59.6598, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922963", "mag": 1.1, "time": 1506530768012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1018, 64.1209, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16924550", "mag": 2.4, "time": 1506530256430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6494, 52.9731, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avec", "mag": 2.6, "time": 1506529974600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.0737, 44.3257, 12.14 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899871", "mag": 1.08, "time": 1506529473980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.836, 37.569167, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012176", "mag": 1.03, "time": 1506529247980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795833, 33.502, 4.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16922238", "mag": 1.6, "time": 1506529055903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7065, 67.422, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899866", "mag": 1.85, "time": 1506528932600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995833, 39.432667, 3.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ave0", "mag": 4.1, "time": 1506528488760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.9926, -7.5373, 611.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avdr", "mag": 4.1, "time": 1506527126210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.0234, -7.2935, 121.06 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899831", "mag": 1.23, "time": 1506526130580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.231667, 35.611, 3.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988160", "mag": 1.6, "time": 1506525379416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9254, 58.9648, 66.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257999", "mag": 1.8, "time": 1506524825390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533333, 46.866, 13.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899816", "mag": 1.11, "time": 1506524218360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.989167, 37.558167, 1.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988159", "mag": 1.2, "time": 1506524092965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7404, 58.8609, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012112", "mag": 1.73, "time": 1506523530510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.417833, 34.440833, 0.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899796", "mag": 0.95, "time": 1506523499180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8715, 37.492667, 3.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16921504", "mag": 1.8, "time": 1506522635679, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3466, 59.8103, 47.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988157", "mag": 1.5, "time": 1506522267480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.561, 57.6875, 76.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311512", "mag": 1.06, "time": 1506522173600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.941333, 47.1825, 15.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920785", "mag": 2.4, "time": 1506522058371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3316, 56.7652, 41.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920784", "mag": 1.4, "time": 1506521703637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.533, 60.0761, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61923421", "mag": 1.78, "time": 1506521436470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.401167, 19.199167, 32.961 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920775", "mag": 2.0, "time": 1506520826084, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.649, 61.9693, 57.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920772", "mag": 2.0, "time": 1506520439615, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2196, 59.6108, 85.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920758", "mag": 2.9, "time": 1506520230887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3755, 61.9643, 42.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257989", "mag": 1.28, "time": 1506520220400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.870167, 11.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920757", "mag": 1.0, "time": 1506520046138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5503, 65.1678, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607209", "mag": 1.5, "time": 1506519994705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7233, 40.1708, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38012040", "mag": 1.13, "time": 1506519953180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.935333, 34.4565, 9.26 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899776", "mag": 1.01, "time": 1506519567480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840667, 37.5315, -1.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899766", "mag": 1.77, "time": 1506519075660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.243667, 39.398333, 12.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899761", "mag": 1.35, "time": 1506518981970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745833, 38.784333, 1.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avce", "mag": 2.7, "time": 1506518011840, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.555, 46.8463, 8.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920754", "mag": 2.5, "time": 1506517941863, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4288, 51.3519, 42.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920753", "mag": 1.2, "time": 1506517783977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1318, 60.4494, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920743", "mag": 2.6, "time": 1506516302533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0235, 61.6238, 41.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988145", "mag": 1.2, "time": 1506515748862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9213, 61.1389, 61.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257979", "mag": 1.95, "time": 1506514222430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528667, 46.869667, 13.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920741", "mag": 1.4, "time": 1506513863630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4582, 62.4107, 39.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920740", "mag": 2.1, "time": 1506513265227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.2773, 65.177, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920737", "mag": 1.4, "time": 1506513028050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1779, 58.0206, 30.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920020", "mag": 1.9, "time": 1506512934355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.4027, 59.1963, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920019", "mag": 1.3, "time": 1506511124207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9174, 59.9564, 76.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011952", "mag": 1.07, "time": 1506511069520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.789667, 33.489167, 5.35 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257974", "mag": 1.33, "time": 1506510967360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526833, 46.881, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avaw", "mag": 2.7, "time": 1506509852090, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2764, 31.1697, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899726", "mag": 1.29, "time": 1506508915160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809, 38.828833, 0.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899721", "mag": 1.52, "time": 1506508865060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.074167, 36.490333, 6.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920017", "mag": 1.5, "time": 1506508671618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.664, 59.7325, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899716", "mag": 1.33, "time": 1506507368050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.621833, 36.9715, 5.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988138", "mag": 1.5, "time": 1506506488102, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3194, 60.198, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899711", "mag": 1.1, "time": 1506506346060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.830667, 37.480333, -1.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920009", "mag": 1.7, "time": 1506506054796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8154, 59.9932, 104.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988136", "mag": 1.4, "time": 1506505999692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1528, 59.8387, 71.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920005", "mag": 1.7, "time": 1506505194635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0126, 61.1428, 12.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16920003", "mag": 1.3, "time": 1506504555844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6373, 60.4592, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61923186", "mag": 1.49, "time": 1506503971290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2035, 19.597167, 24.581 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607200", "mag": 1.3, "time": 1506503935311, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2622, 38.0846, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av9q", "mag": 3.0, "time": 1506503712310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2693, 31.1511, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899701", "mag": 1.06, "time": 1506503394340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819167, 37.604333, 4.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257964", "mag": 1.06, "time": 1506503136100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529667, 46.8705, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249807", "mag": 1.65, "time": 1506503101030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.067, 42.665833, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011904", "mag": 1.21, "time": 1506502961890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0485, 33.171333, 5.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av9i", "mag": 4.2, "time": 1506502867800, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3374, -29.45, 38.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16919291", "mag": 2.0, "time": 1506502630723, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.4344, 59.1851, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249797", "mag": 1.72, "time": 1506502497570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.061667, 42.664667, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011896", "mag": 1.37, "time": 1506502201400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.052, 33.172, 6.03 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011880", "mag": 1.16, "time": 1506501606110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.542667, 32.944667, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av94", "mag": 4.6, "time": 1506500888720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.1871, 28.1091, 45.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16919288", "mag": 1.0, "time": 1506500817789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4269, 65.2147, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988130", "mag": 2.0, "time": 1506500078029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5053, 51.0555, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107564", "mag": 1.29, "time": 1506499044330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.570833, 38.927167, 9.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av8z", "mag": 4.3, "time": 1506498944880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1801, -21.2747, 610.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899666", "mag": 1.1, "time": 1506498551180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8395, 37.568167, 1.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16918579", "mag": 1.9, "time": 1506498372082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5535, 59.8103, 129.5 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235883", "mag": 1.79, "time": 1506498339870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.776167, 37.332333, 4.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899656", "mag": 1.07, "time": 1506497879900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818169, 38.816334, 2.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988128", "mag": 1.7, "time": 1506497626569, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5074, 58.9707, 125.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607194", "mag": 1.4, "time": 1506496907372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0035, 38.4922, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16918577", "mag": 2.4, "time": 1506495198173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3064, 51.5599, 38.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607192", "mag": 1.3, "time": 1506495045147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1202, 38.2811, 9.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917880", "mag": 1.4, "time": 1506494125518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4062, 59.5783, 46.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011824", "mag": 2.15, "time": 1506493452570, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.377, 34.425667, 6.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917877", "mag": 1.0, "time": 1506493181446, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.74, 66.8722, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988124", "mag": 2.0, "time": 1506492309885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.6222, 51.5723, 70.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917874", "mag": 1.0, "time": 1506491782705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3009, 62.1686, 20.4 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235878", "mag": 1.72, "time": 1506491740260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.966167, 37.277667, 3.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917871", "mag": 2.2, "time": 1506491690990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.227, 67.4203, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257949", "mag": 1.15, "time": 1506491507770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.53, 46.8695, 10.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917866", "mag": 2.4, "time": 1506491501818, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2772, 62.1792, 19.3 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235873", "mag": 2.14, "time": 1506491075330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.886, 37.201833, 5.78 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257939", "mag": 1.58, "time": 1506490489800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536833, 46.867667, 13.76 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607189", "mag": 1.5, "time": 1506490367737, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.114, 38.2859, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011800", "mag": 2.36, "time": 1506490230430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3735, 34.4205, 2.68 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011808", "mag": 1.19, "time": 1506490229680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.296833, 33.257333, 11.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899631", "mag": 1.3, "time": 1506489660140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.492333, 37.643167, 10.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011776", "mag": 1.48, "time": 1506489097510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.050333, 33.1715, 3.79 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011760", "mag": 1.09, "time": 1506488442000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1045, 34.032667, 6.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917162", "mag": 1.2, "time": 1506488287570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7916, 59.8749, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16917160", "mag": 1.7, "time": 1506488119627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8594, 59.8596, 52.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011736", "mag": 1.35, "time": 1506488015210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.011667, 33.275333, 2.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011728", "mag": 1.28, "time": 1506487875520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796667, 33.492, 4.46 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011720", "mag": 2.62, "time": 1506487715700, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.372333, 34.4215, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249762", "mag": 1.11, "time": 1506487228770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.7735, 44.765667, 7.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899586", "mag": 2.03, "time": 1506485795570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784333, 38.836667, 1.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av7z", "mag": 5.3, "time": 1506485581610, "felt": 2, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 139.7504, -3.5926, 60.39 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607179", "mag": 1.2, "time": 1506485505469, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6245, 38.788, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av80", "mag": 5.0, "time": 1506485392430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -43.5388, 28.7234, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av7x", "mag": 2.7, "time": 1506485373140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2078, 31.1233, 1.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899571", "mag": 1.02, "time": 1506485084470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.004333, 37.796167, 1.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988118", "mag": 1.8, "time": 1506483937222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.399, 51.7067, 17.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16916451", "mag": 1.9, "time": 1506483073029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0454, 59.6347, 103.9 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311302", "mag": 2.23, "time": 1506482912030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.555, 44.547167, 12.72 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311297", "mag": 1.11, "time": 1506482481740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.683, 45.372667, -1.63 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011704", "mag": 1.57, "time": 1506482455900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.519833, 32.888, 10.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988116", "mag": 2.0, "time": 1506482397355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3801, 51.6434, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899551", "mag": 1.76, "time": 1506481720510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.880667, 38.659333, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915757", "mag": 1.4, "time": 1506480400030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6852, 64.9151, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607173", "mag": 1.2, "time": 1506479979561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4858, 38.7006, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av7a", "mag": 2.7, "time": 1506479406560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.8806, 37.2184, 2.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988114", "mag": 1.6, "time": 1506479371570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.3827, 51.4303, 27.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011664", "mag": 1.8, "time": 1506478585030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.628167, 35.076167, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915754", "mag": 2.0, "time": 1506478364486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3878, 61.6649, 31.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915750", "mag": 1.2, "time": 1506477958824, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6683, 62.8518, 73.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915745", "mag": 1.8, "time": 1506477442438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6565, 53.4796, 20.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av70", "mag": 4.7, "time": 1506476740040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.4332, -21.409, 120.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915060", "mag": 1.3, "time": 1506476367132, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7491, 63.2266, 126.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av6x", "mag": 4.7, "time": 1506475551840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.6287, 4.6053, 83.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915057", "mag": 2.4, "time": 1506475504238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2738, 57.0675, 69.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011648", "mag": 2.25, "time": 1506474971480, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7765, 33.325667, 11.63 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207341", "mag": 1.82, "time": 1506473928680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.549667, 36.4815, 9.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988107", "mag": 1.9, "time": 1506471772798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4471, 51.7337, 16.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988106", "mag": 1.6, "time": 1506471697831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0762, 58.2594, 21.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b1dn", "mag": 4.3, "time": 1506471581400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.4161, 40.39, 49.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16915048", "mag": 1.6, "time": 1506471507429, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7558, 60.1282, 31.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16914368", "mag": 1.9, "time": 1506469962223, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0546, 60.9937, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av6e", "mag": 4.8, "time": 1506469452030, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.0971, 14.1324, 113.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16914364", "mag": 1.0, "time": 1506469276260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0231, 64.8914, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011608", "mag": 1.21, "time": 1506468838030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.506, 6.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949369", "mag": 1.0, "time": 1506468623879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2412, 61.8508, 14.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899501", "mag": 0.98, "time": 1506468157640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.873833, 37.624833, 2.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011600", "mag": 1.67, "time": 1506468079690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.679333, 35.033667, -0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b02y", "mag": 4.2, "time": 1506467949880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2432, 15.0466, 41.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16914361", "mag": 1.9, "time": 1506467622189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6178, 65.1477, 10.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257914", "mag": 1.23, "time": 1506467597640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.632, 46.8715, 5.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16914358", "mag": 1.0, "time": 1506466926514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3996, 64.9811, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16914359", "mag": 1.0, "time": 1506466913331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0673, 63.4886, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899481", "mag": 1.12, "time": 1506466887280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808502, 38.832001, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949365", "mag": 1.7, "time": 1506466403289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9009, 59.9001, 97.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607152", "mag": 1.1, "time": 1506466364846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6252, 38.7877, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av5w", "mag": 4.8, "time": 1506465046570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.6494, -2.0113, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311237", "mag": 2.77, "time": 1506464518680, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.953167, 44.251833, 24.14 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011536", "mag": 1.75, "time": 1506464439110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.304167, 33.253667, 10.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011520", "mag": 1.59, "time": 1506463692350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.216, 33.010333, 6.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av56", "mag": 4.2, "time": 1506463598300, "felt": 37, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.2376, -31.7843, 7.09 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607136", "mag": 2.8, "time": 1506462799119, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6217, 38.7826, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011488", "mag": 1.81, "time": 1506462726380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750667, 33.516333, 3.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899441", "mag": 2.97, "time": 1506462683270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.0155, 40.263833, 11.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949362", "mag": 1.6, "time": 1506462418457, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0128, 59.6612, 95.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949359", "mag": 1.6, "time": 1506461654966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3493, 59.8886, 123.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av40", "mag": 5.4, "time": 1506461346270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9476, -23.5856, 538.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899416", "mag": 1.3, "time": 1506461324290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810333, 38.8215, 0.97 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257904", "mag": 0.95, "time": 1506461125950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.496, 46.8605, 16.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16913020", "mag": 1.1, "time": 1506460729533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0111, 65.8632, 12.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257894", "mag": 1.08, "time": 1506460594630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.515167, 43.545833, 12.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16913017", "mag": 1.8, "time": 1506459899986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.56, 59.8031, 16.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16913011", "mag": 1.9, "time": 1506459063460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6788, 61.3357, 16.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899391", "mag": 1.35, "time": 1506458512440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735333, 38.789833, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "hv61922451", "mag": 1.7, "time": 1506458350950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471167, 19.227667, 34.865 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899386", "mag": 1.89, "time": 1506458341570, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609667, 36.888333, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av31", "mag": 5.8, "time": 1506457331560, "felt": 45, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.4059, 40.3206, 36.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949355", "mag": 1.3, "time": 1506457099270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1826, 62.1538, 80.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av2y", "mag": 2.6, "time": 1506456843780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9668, 37.2773, 4.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16912327", "mag": 2.1, "time": 1506456421978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8619, 59.5574, 79.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16912325", "mag": 1.6, "time": 1506456406002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0714, 61.2493, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16912323", "mag": 1.4, "time": 1506455786083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6417, 63.0711, 110.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899366", "mag": 1.19, "time": 1506455697960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.989167, 35.677333, -0.35 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257869", "mag": 1.78, "time": 1506455523560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4975, 46.900667, 11.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899361", "mag": 1.14, "time": 1506455417130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.6625, 36.100833, 0.94 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311182", "mag": 1.51, "time": 1506454723910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.398833, 46.488167, 17.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011384", "mag": 1.37, "time": 1506454231340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.897333, 32.7725, -0.37 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257864", "mag": 1.46, "time": 1506454190410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413167, 45.912833, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011376", "mag": 1.05, "time": 1506454146060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.509, 6.71 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607108", "mag": 1.0, "time": 1506454067433, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.4885, 38.5144, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16912305", "mag": 1.2, "time": 1506453243306, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4352, 61.6115, 33.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av22", "mag": 5.4, "time": 1506452898220, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.7412, 1.2169, 17.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899341", "mag": 0.98, "time": 1506452133100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.783165, 38.837833, 0.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000av1t", "mag": 4.3, "time": 1506452028320, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6352, 16.5993, 104.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911656", "mag": 1.1, "time": 1506451444842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9798, 65.8633, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257849", "mag": 1.17, "time": 1506451369960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531667, 46.869333, 10.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911652", "mag": 1.7, "time": 1506451256386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2303, 62.9438, 64.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899331", "mag": 1.39, "time": 1506451169180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.46, 37.983333, -0.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949348", "mag": 1.2, "time": 1506450622498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9789, 62.4498, 80.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899311", "mag": 1.66, "time": 1506450429900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811, 38.812, 2.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011328", "mag": 1.82, "time": 1506450379870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.5035, 6.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011320", "mag": 1.66, "time": 1506450370460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.948, 35.292167, 17.31 ] } }, +{ "type": "Feature", "properties": { "id": "hv61922336", "mag": 3.25, "time": 1506450097970, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.231, 19.290833, 8.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949347", "mag": 1.4, "time": 1506449901001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1914, 59.4295, 70.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011304", "mag": 1.2, "time": 1506449584430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.813667, 36.025833, 1.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011296", "mag": 0.98, "time": 1506449444340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8115, 36.028167, 0.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911638", "mag": 2.2, "time": 1506449441975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1385, 62.9479, 63.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257844", "mag": 1.11, "time": 1506448956940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532, 46.8605, 12.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949345", "mag": 1.5, "time": 1506448347584, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8207, 61.1514, 89.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61311142", "mag": 1.41, "time": 1506448094510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.884, 43.419667, -0.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899291", "mag": 1.2, "time": 1506447644460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.291667, 36.660333, 3.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949344", "mag": 2.0, "time": 1506446368069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.7955, 55.6327, 123.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257839", "mag": 1.6, "time": 1506446229250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530333, 46.872167, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949343", "mag": 1.8, "time": 1506445879278, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0092, 56.5802, 60.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910871", "mag": 2.2, "time": 1506445763160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3757, 60.912, 119.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910870", "mag": 1.2, "time": 1506445355025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.837, 62.5503, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949340", "mag": 1.4, "time": 1506445236601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4629, 59.6817, 72.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910864", "mag": 1.6, "time": 1506444383456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3694, 61.142, 20.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910865", "mag": 1.1, "time": 1506444338515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0798, 62.3953, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910858", "mag": 2.0, "time": 1506443746387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5248, 63.5317, 72.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249707", "mag": 1.38, "time": 1506443129640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.442, 42.558833, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011192", "mag": 1.03, "time": 1506442702510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.823833, 33.4855, 7.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899266", "mag": 1.49, "time": 1506442696750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.809833, 37.472833, 3.95 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257829", "mag": 1.46, "time": 1506441830940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.498, 46.901167, 10.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903841", "mag": 1.48, "time": 1506440751200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.182167, 40.8515, 3.06 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249692", "mag": 1.82, "time": 1506439249930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.139833, 42.7365, 4.13 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011112", "mag": 2.13, "time": 1506439108770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.289833, 33.302833, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auyd", "mag": 2.6, "time": 1506439089180, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.61, 9.35 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899236", "mag": 2.73, "time": 1506439073310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.6035, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61922126", "mag": 1.89, "time": 1506438530250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.504837, 19.188499, 37.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16910217", "mag": 1.3, "time": 1506438468368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3857, 61.4705, 26.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249677", "mag": 1.01, "time": 1506437975140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.090667, 41.940333, 4.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16909586", "mag": 1.8, "time": 1506436541694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9329, 61.1528, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16909585", "mag": 1.5, "time": 1506436508165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.6533, 59.6178, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249672", "mag": 1.15, "time": 1506436401660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.9865, 44.768833, 6.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949332", "mag": 2.7, "time": 1506436259231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 177.8212, 50.3055, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949331", "mag": 1.5, "time": 1506435973793, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5906, 57.0801, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61922056", "mag": 1.6, "time": 1506435671030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.617667, 19.403833, 11.352 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899211", "mag": 1.32, "time": 1506435393920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.617833, 36.045, 5.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949330", "mag": 2.3, "time": 1506435252977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7207, 53.0759, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auxj", "mag": 4.2, "time": 1506434841590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3743, -28.3432, 19.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16909580", "mag": 1.0, "time": 1506433271780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9281, 62.7345, 65.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011056", "mag": 2.34, "time": 1506433147890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.097167, 32.109167, 21.13 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011048", "mag": 1.64, "time": 1506433002700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.275333, 33.9755, 2.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16909574", "mag": 2.4, "time": 1506432197049, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1982, 63.4664, 63.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899196", "mag": 2.34, "time": 1506431642070, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2285, 36.1555, 11.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci38011032", "mag": 1.31, "time": 1506431195640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.599833, 33.196, 3.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949325", "mag": 1.3, "time": 1506430179945, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5507, 57.5978, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908944", "mag": 1.5, "time": 1506430094548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7286, 62.9807, 109.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949323", "mag": 1.4, "time": 1506429667875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -132.545, 57.8313, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908941", "mag": 1.9, "time": 1506428870068, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9939, 51.4819, 42.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949321", "mag": 2.3, "time": 1506428515529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9246, 51.994, 156.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auwv", "mag": 4.8, "time": 1506428086930, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1449, -37.4108, 11.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949320", "mag": 1.7, "time": 1506428031233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.8671, 57.0274, 77.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899171", "mag": 1.37, "time": 1506428015870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.786167, 37.594333, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949319", "mag": 1.6, "time": 1506427960144, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0976, 58.7839, 68.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61921941", "mag": 1.75, "time": 1506427855790, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.293667, 19.364833, 29.473 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257779", "mag": 1.22, "time": 1506426612780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.871167, 11.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908309", "mag": 2.6, "time": 1506426273590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0017, 63.0698, 125.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908307", "mag": 1.4, "time": 1506425656703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0459, 60.021, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899161", "mag": 1.33, "time": 1506425143350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737833, 38.803333, 1.75 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auwh", "mag": 4.6, "time": 1506424969320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 168.1159, -17.1048, 50.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908306", "mag": 1.2, "time": 1506424570466, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.412, 53.8051, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908302", "mag": 1.9, "time": 1506424147684, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7411, 59.5065, 69.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249657", "mag": 1.69, "time": 1506424086980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4815, 38.756167, 9.29 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257774", "mag": 1.11, "time": 1506422972160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.387167, 44.8185, 11.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908296", "mag": 1.6, "time": 1506420872410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9572, 61.1571, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607058", "mag": 1.0, "time": 1506420232880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8963, 38.401, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949310", "mag": 1.6, "time": 1506419827018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2644, 60.0718, 129.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899136", "mag": 1.49, "time": 1506419498990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.041333, 37.633667, -1.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908294", "mag": 1.4, "time": 1506419088568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8181, 63.4737, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949308", "mag": 1.7, "time": 1506418915220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9641, 60.3111, 134.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010936", "mag": 1.35, "time": 1506418490150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.104333, 34.0325, 5.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899131", "mag": 1.28, "time": 1506417966210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.931833, 37.595833, 0.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908292", "mag": 1.7, "time": 1506417940616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8017, 59.9121, 74.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16908290", "mag": 1.7, "time": 1506417796960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.402, 60.1704, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949304", "mag": 1.7, "time": 1506416080631, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.871, 57.3937, 48.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949303", "mag": 1.2, "time": 1506415360742, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6564, 63.2669, 130.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607053", "mag": 3.4, "time": 1506415206305, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8949, 38.3653, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899106", "mag": 1.38, "time": 1506414957350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0225, 37.5205, 2.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auvr", "mag": 4.4, "time": 1506414806850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.3187, -5.8706, 42.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899101", "mag": 1.35, "time": 1506414495100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.810667, 37.473333, 3.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0x1", "mag": 4.0, "time": 1506414428310, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 115.4547, -8.3437, 7.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907660", "mag": 2.5, "time": 1506414139904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2525, 63.3098, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auvl", "mag": 4.9, "time": 1506413746400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.8693, -24.5502, 549.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907657", "mag": 1.7, "time": 1506413744657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.558, 61.3722, 73.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607084", "mag": 1.1, "time": 1506413686395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8996, 38.399, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ax0p", "mag": 3.0, "time": 1506413645840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.222, 52.6448, 36.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010856", "mag": 1.11, "time": 1506413205840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4375, 33.438833, 9.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907655", "mag": 1.3, "time": 1506412718967, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6643, 61.4913, 19.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907652", "mag": 1.7, "time": 1506412362070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6643, 61.6414, 22.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907651", "mag": 1.5, "time": 1506411582373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2404, 59.9305, 72.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949296", "mag": 1.3, "time": 1506411274342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6597, 58.8354, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899096", "mag": 1.03, "time": 1506410824310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.914, 37.573833, -1.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899091", "mag": 1.42, "time": 1506410795100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807833, 38.8245, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907650", "mag": 2.0, "time": 1506410193440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8603, 66.702, 16.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949292", "mag": 1.6, "time": 1506409745435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.82, 59.4363, 78.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907646", "mag": 1.1, "time": 1506408445621, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.778, 62.2517, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249632", "mag": 2.87, "time": 1506407470180, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.651333, 44.820667, 6.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16907641", "mag": 2.2, "time": 1506407401881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1721, 59.3036, 66.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949289", "mag": 1.7, "time": 1506406926287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.737, 59.5006, 82.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010824", "mag": 1.17, "time": 1506406440560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.498833, 34.926833, 12.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auv4", "mag": 4.9, "time": 1506404788280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.3356, -5.7378, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auv3", "mag": 5.0, "time": 1506404673850, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5505, -21.3378, 232.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257744", "mag": 1.03, "time": 1506404152920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522667, 46.9085, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auuz", "mag": 4.6, "time": 1506404004140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9602, 15.0621, 55.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949287", "mag": 1.5, "time": 1506403834555, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1229, 59.9191, 124.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899076", "mag": 0.97, "time": 1506403715720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825667, 37.454833, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899066", "mag": 0.96, "time": 1506402794840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798332, 38.824833, 2.56 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257739", "mag": 1.14, "time": 1506402535080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5275, 46.880667, 10.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010800", "mag": 1.46, "time": 1506401555090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.061, 34.207167, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010792", "mag": 1.16, "time": 1506401392950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.064333, 34.207333, 2.74 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607042", "mag": 1.5, "time": 1506400440104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0413, 37.0804, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906991", "mag": 2.7, "time": 1506400345749, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.4106, 60.9055, 24.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000autd", "mag": 6.4, "time": 1506399600760, "felt": 2, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -176.9366, -23.7135, 98.07 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257724", "mag": 1.75, "time": 1506399115590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.8815, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949284", "mag": 1.4, "time": 1506398641123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.643, 58.8409, 11.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949283", "mag": 1.3, "time": 1506398319488, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6304, 58.8355, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906355", "mag": 2.3, "time": 1506398227222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8611, 62.7984, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899031", "mag": 1.73, "time": 1506396860580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823667, 37.455333, 2.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899036", "mag": 1.13, "time": 1506396779490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764167, 38.956, 1.48 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249592", "mag": 1.7, "time": 1506396582400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.943167, 39.753833, 3.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949281", "mag": 1.5, "time": 1506396506568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7269, 58.5151, 73.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906353", "mag": 1.3, "time": 1506396340348, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2988, 62.3609, 81.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61310902", "mag": 1.38, "time": 1506395899750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737167, 47.576333, 17.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906350", "mag": 2.1, "time": 1506395022337, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6717, 59.8577, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235803", "mag": 1.67, "time": 1506394171170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.620667, 37.161167, 4.48 ] } }, +{ "type": "Feature", "properties": { "id": "nc72899026", "mag": 1.36, "time": 1506393508660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823833, 37.4545, 2.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906345", "mag": 1.8, "time": 1506393385073, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5638, 59.8105, 0.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906344", "mag": 1.2, "time": 1506393361198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4631, 62.5638, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906343", "mag": 1.2, "time": 1506392589335, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2072, 61.6959, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "uw61310887", "mag": 1.1, "time": 1506392466960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9235, 46.755833, 4.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906342", "mag": 1.8, "time": 1506392061053, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9619, 58.719, 83.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16906341", "mag": 1.1, "time": 1506391622110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.393, 62.6136, 80.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905725", "mag": 2.0, "time": 1506390933341, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6474, 61.5055, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aus0", "mag": 5.1, "time": 1506390162180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2892, -18.0618, 578.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905719", "mag": 1.0, "time": 1506388357140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8119, 61.2841, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16949271", "mag": 1.1, "time": 1506387919524, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.616, 62.8641, 85.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avl1", "mag": 4.1, "time": 1506387869490, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.2679, -38.2792, 18.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905595", "mag": 1.0, "time": 1506387645089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7961, 60.4358, 8.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aur8", "mag": 3.9, "time": 1506387254290, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.6296, -12.1347, 37.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905592", "mag": 1.5, "time": 1506385892986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6406, 61.6796, 57.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905589", "mag": 1.7, "time": 1506385708409, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0359, 62.3774, 41.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898986", "mag": 1.94, "time": 1506385192120, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.759667, 38.955667, 4.16 ] } }, +{ "type": "Feature", "properties": { "id": "nn00607067", "mag": 1.1, "time": 1506385008302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0721, 39.3599, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hk", "mag": 4.4, "time": 1506383865610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.4109, -4.9919, 96.04 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hl", "mag": 4.5, "time": 1506383851620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 3.755, 79.5651, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905583", "mag": 2.0, "time": 1506383021414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7759, 59.8203, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61921341", "mag": 2.37, "time": 1506382999970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.826167, 19.509167, 12.397 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898971", "mag": 1.13, "time": 1506382612420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7125, 38.7455, 1.45 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898966", "mag": 1.63, "time": 1506382205240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.579, 36.013, 4.29 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010640", "mag": 1.0, "time": 1506381899530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.508833, 4.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010624", "mag": 1.86, "time": 1506381762630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.681667, 35.033833, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898956", "mag": 1.13, "time": 1506381482700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.320667, 37.6445, 0.55 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257694", "mag": 1.58, "time": 1506381447950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523833, 46.872833, 11.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hj", "mag": 4.3, "time": 1506380384190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 115.85, -10.6682, 39.69 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010616", "mag": 1.42, "time": 1506380222440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0935, 33.013167, -0.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898946", "mag": 1.13, "time": 1506379343550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7885, 38.832167, 1.97 ] } }, +{ "type": "Feature", "properties": { "id": "ld60143416", "mag": 1.71, "time": 1506378906690, "felt": 170, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.513833, 40.798667, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988709", "mag": 1.6, "time": 1506378800677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4035, 60.0163, 139.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257689", "mag": 1.5, "time": 1506378570060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.865833, 11.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aunr", "mag": 2.5, "time": 1506378435420, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.154, 37.3519, 3.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988708", "mag": 1.0, "time": 1506378350972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.034, 64.3489, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aunh", "mag": 5.0, "time": 1506377223500, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 124.3318, 0.8223, 219.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249557", "mag": 1.72, "time": 1506377199600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.460833, 42.646667, 2.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hh", "mag": 4.3, "time": 1506376802200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4659, -19.6395, 545.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905558", "mag": 1.3, "time": 1506376658938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.4807, 65.756, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010544", "mag": 1.52, "time": 1506375768450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792333, 33.492, 4.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333756", "mag": 1.11, "time": 1506375211030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.748833, 46.851167, 1.54 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010536", "mag": 1.15, "time": 1506374622610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.200667, 33.034833, 4.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898906", "mag": 1.32, "time": 1506373159300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.887667, 37.572333, 1.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904952", "mag": 1.2, "time": 1506373039217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2776, 63.8003, 116.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904950", "mag": 1.1, "time": 1506372955267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1161, 63.268, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898901", "mag": 1.01, "time": 1506372828820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.791667, 37.454333, 7.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904346", "mag": 1.5, "time": 1506372342933, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0547, 61.007, 13.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010512", "mag": 1.25, "time": 1506372237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.492167, 33.822333, -0.52 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010488", "mag": 3.1, "time": 1506371483300, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.220833, 32.220833, 20.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aulg", "mag": 5.9, "time": 1506371363480, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 152.7133, -6.2113, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "hv61921136", "mag": 1.72, "time": 1506370768560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.421333, 19.223333, 34.311 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257664", "mag": 1.07, "time": 1506370613150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526, 46.868, 10.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aukx", "mag": 2.6, "time": 1506370456500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.1495, 36.4119, 5.948 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auky", "mag": 4.2, "time": 1506370103510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 107.7299, -5.8793, 306.63 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257659", "mag": 1.44, "time": 1506369980640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530333, 46.8795, 12.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904319", "mag": 1.4, "time": 1506369740689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5073, 60.0082, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904318", "mag": 1.1, "time": 1506369510333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5651, 61.4244, 63.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904316", "mag": 1.1, "time": 1506368211425, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7001, 61.5145, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aukb", "mag": 4.3, "time": 1506368143480, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.1586, 40.3587, 11.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16904315", "mag": 1.2, "time": 1506367996393, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8124, 59.8382, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898871", "mag": 1.41, "time": 1506367887720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.785167, 38.8375, 1.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988695", "mag": 2.2, "time": 1506366990125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.3689, 51.4218, 56.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37166748", "mag": 1.04, "time": 1506366454300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.018667, 33.163167, -0.77 ] } }, +{ "type": "Feature", "properties": { "id": "hv61921056", "mag": 2.06, "time": 1506366154290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.950667, 19.540833, 15.491 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903722", "mag": 2.0, "time": 1506365944635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.478, 51.697, 15.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010408", "mag": 1.27, "time": 1506365436790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4445, 35.5745, 10.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010416", "mag": 1.17, "time": 1506365362690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.862667, 34.343333, -1.71 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249527", "mag": 1.29, "time": 1506365138370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.712833, 41.8725, 4.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903609", "mag": 2.1, "time": 1506365025587, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8085, 63.1578, 132.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010400", "mag": 1.04, "time": 1506364534100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790833, 33.495667, 4.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606969", "mag": 1.1, "time": 1506364516065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.689, 40.0864, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903599", "mag": 2.5, "time": 1506364456407, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8848, 59.5329, 96.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257649", "mag": 1.4, "time": 1506364202040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5255, 46.866667, 10.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898846", "mag": 1.62, "time": 1506364136870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.781833, 36.209, 7.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903591", "mag": 1.5, "time": 1506363943453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7347, 60.3302, 112.7 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257644", "mag": 1.05, "time": 1506363692190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.8665, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010376", "mag": 1.42, "time": 1506363664230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.4945, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aufz", "mag": 5.1, "time": 1506363043200, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 106.3876, -5.9298, 150.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898836", "mag": 1.32, "time": 1506362896010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104, 37.324, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903584", "mag": 1.0, "time": 1506362694028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.2167, 63.9342, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257639", "mag": 1.36, "time": 1506362284340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.615667, 46.316833, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903579", "mag": 2.0, "time": 1506362237262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1637, 59.6819, 106.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898821", "mag": 1.99, "time": 1506361978590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.778667, 36.215667, 8.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000auf8", "mag": 3.0, "time": 1506361091820, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.3303, 40.4414, 11.43 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010336", "mag": 2.11, "time": 1506360496580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.486667, 3.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988686", "mag": 1.5, "time": 1506360479843, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.7769, 51.9886, 24.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010328", "mag": 1.51, "time": 1506359920880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.977, 33.995333, 18.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988684", "mag": 1.6, "time": 1506359020522, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4355, 59.7613, 127.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898791", "mag": 1.48, "time": 1506357667280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.679333, 40.288667, 4.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898786", "mag": 1.55, "time": 1506357321970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.322, 35.752333, 11.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898781", "mag": 1.12, "time": 1506356229990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811333, 38.794833, 2.79 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010256", "mag": 1.04, "time": 1506354566340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.858833, 33.8575, 16.19 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010272", "mag": 2.41, "time": 1506354509850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9285, 31.688833, 11.63 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257609", "mag": 1.3, "time": 1506354504500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534667, 46.896, 11.48 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257604", "mag": 1.12, "time": 1506354406140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531833, 46.867, 11.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16902391", "mag": 1.7, "time": 1506354336298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8601, 62.0271, 60.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16902390", "mag": 1.1, "time": 1506354175816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3984, 60.1663, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901812", "mag": 1.4, "time": 1506353222973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1565, 60.3908, 0.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901813", "mag": 1.3, "time": 1506353183037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6264, 58.8255, 1.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901809", "mag": 2.0, "time": 1506352267382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0949, 59.636, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aucr", "mag": 4.6, "time": 1506352047620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.4691, -14.8531, 132.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901806", "mag": 1.8, "time": 1506351538258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8449, 59.8126, 1.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257594", "mag": 0.98, "time": 1506349616550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.870833, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010208", "mag": 1.21, "time": 1506348868740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.552, 33.526167, 13.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901226", "mag": 1.1, "time": 1506348768479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2671, 59.9538, 54.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aubr", "mag": 4.6, "time": 1506348737440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.0258, -12.6224, 229.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010200", "mag": 1.19, "time": 1506348702870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.953833, 34.8405, 11.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aubf", "mag": 4.4, "time": 1506348571430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1777, 15.5423, 60.99 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898721", "mag": 1.03, "time": 1506348240990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.838333, 38.837334, 1.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901214", "mag": 2.7, "time": 1506348231637, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0448, 63.3492, 76.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aub9", "mag": 4.3, "time": 1506347727000, "felt": 65, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.99, -32.683, 24.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898706", "mag": 1.78, "time": 1506347531490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.838, 38.837833, 1.83 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010176", "mag": 0.96, "time": 1506346983830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.271667, 33.976667, 5.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aubt", "mag": 4.7, "time": 1506346771440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6657, -38.3887, 23.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988672", "mag": 1.9, "time": 1506346449512, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.0765, 51.5898, 46.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901206", "mag": 2.2, "time": 1506346185448, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7016, 61.5212, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901204", "mag": 1.6, "time": 1506346082012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4545, 63.1289, 110.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898686", "mag": 1.5, "time": 1506345854120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.787167, 36.211667, 7.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988669", "mag": 1.8, "time": 1506344531244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.2595, 53.699, 44.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16901203", "mag": 1.5, "time": 1506343558401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1793, 57.6776, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898666", "mag": 1.04, "time": 1506343096950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.862667, 37.613167, 7.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16900637", "mag": 2.0, "time": 1506342621159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2424, 60.321, 83.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010152", "mag": 1.32, "time": 1506342413630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.241667, 34.439, 7.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aua8", "mag": 4.6, "time": 1506342291600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.282, -28.2916, 30.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898661", "mag": 1.86, "time": 1506342035450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.000167, 36.431, -0.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010136", "mag": 1.46, "time": 1506341314650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.559, 35.341833, 7.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16900622", "mag": 1.0, "time": 1506340661643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.7013, 64.8764, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0h7", "mag": 4.2, "time": 1506340490190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 138.5087, 34.8799, 210.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898636", "mag": 1.46, "time": 1506340210490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.256667, 36.100167, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hp", "mag": 4.2, "time": 1506340162430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4582, -17.8551, 595.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au9u", "mag": 4.6, "time": 1506340077990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4978, -17.9975, 539.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988664", "mag": 1.8, "time": 1506339965395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4489, 51.676, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61920741", "mag": 2.06, "time": 1506339899560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.473667, 19.201667, 36.657 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010120", "mag": 0.99, "time": 1506339434380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.471167, 34.247833, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16900621", "mag": 1.0, "time": 1506338627047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3115, 62.9535, 74.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898616", "mag": 2.36, "time": 1506338018430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.938333, 37.838667, 4.07 ] } }, +{ "type": "Feature", "properties": { "id": "hv61920671", "mag": 1.81, "time": 1506336741780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.023667, 19.815, 11.479 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257584", "mag": 1.42, "time": 1506336624590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521667, 46.869333, 11.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16900062", "mag": 1.8, "time": 1506336050720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8893, 60.3211, 15.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010104", "mag": 1.06, "time": 1506335970890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7915, 33.506667, 6.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898601", "mag": 0.95, "time": 1506335637390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.6475, 37.476667, 8.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898596", "mag": 1.23, "time": 1506335593850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2805, 36.094, 6.76 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898591", "mag": 1.04, "time": 1506335405570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.839333, 38.843166, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au8v", "mag": 4.9, "time": 1506334920720, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.9741, -3.5898, 72.65 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606909", "mag": 1.4, "time": 1506334911790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.943, 37.551, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257579", "mag": 1.3, "time": 1506333510580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523833, 46.872333, 11.79 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257574", "mag": 0.99, "time": 1506333384010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523, 46.875167, 11.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au8b", "mag": 5.0, "time": 1506332531610, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 154.0023, -5.3939, 63.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899481", "mag": 1.2, "time": 1506332463619, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8097, 60.337, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899478", "mag": 2.7, "time": 1506332457083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9674, 51.7565, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899480", "mag": 2.7, "time": 1506332456973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9649, 51.7427, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898561", "mag": 1.34, "time": 1506332073270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.401667, 37.650667, 3.17 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257569", "mag": 2.91, "time": 1506332057970, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.879333, 11.49 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606905", "mag": 1.5, "time": 1506331668203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9249, 38.3947, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010072", "mag": 1.11, "time": 1506331415690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790167, 33.497667, 5.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988657", "mag": 1.9, "time": 1506331001341, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4079, 51.6208, 15.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899468", "mag": 1.4, "time": 1506330891437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3579, 60.2131, 58.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899467", "mag": 1.1, "time": 1506330692323, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4142, 68.5865, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899465", "mag": 1.0, "time": 1506330113229, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.991, 61.1695, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606904", "mag": 2.5, "time": 1506329813575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1098, 39.0988, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16899462", "mag": 1.3, "time": 1506329610880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9036, 64.8595, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010048", "mag": 1.15, "time": 1506329091670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.815, 33.9555, 13.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au7c", "mag": 3.5, "time": 1506329082460, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5238, 46.8486, 10.68 ] } }, +{ "type": "Feature", "properties": { "id": "ci38010040", "mag": 1.01, "time": 1506328796420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.568, 35.1735, 8.56 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606901", "mag": 1.2, "time": 1506328748981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8911, 38.3811, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16898909", "mag": 1.4, "time": 1506327817672, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2932, 60.6736, 39.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988651", "mag": 1.6, "time": 1506327629626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8348, 59.5881, 89.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249397", "mag": 2.17, "time": 1506327209020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448333, 38.993, -0.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16898901", "mag": 1.1, "time": 1506326924743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6407, 58.3143, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au6h", "mag": 4.7, "time": 1506326546500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.4008, -4.8417, 219.24 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249392", "mag": 1.79, "time": 1506326456200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448, 42.620667, 6.55 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235773", "mag": 2.04, "time": 1506326285610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.968667, 37.281833, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au5z", "mag": 4.4, "time": 1506325840560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7801, 14.8764, 57.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898491", "mag": 0.95, "time": 1506325310440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818667, 37.478667, 0.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898486", "mag": 1.27, "time": 1506324949470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8175, 37.479333, 0.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16898346", "mag": 2.1, "time": 1506324898662, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.5224, 64.5882, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au5p", "mag": 4.4, "time": 1506324432650, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.5244, -30.022, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au5l", "mag": 4.5, "time": 1506324225060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1793, 15.5215, 66.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898461", "mag": 1.64, "time": 1506323849520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818167, 37.478667, 0.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au5i", "mag": 4.6, "time": 1506323785060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 106.9645, -8.3755, 34.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898456", "mag": 1.01, "time": 1506323761220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818833, 37.478167, 0.69 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606939", "mag": 1.6, "time": 1506320868071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5993, 41.6963, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988646", "mag": 1.6, "time": 1506320845663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7721, 59.5535, 80.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009968", "mag": 1.23, "time": 1506320510170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.738333, 33.655, 17.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au57", "mag": 5.0, "time": 1506320285610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.7407, -59.0289, 23.15 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606937", "mag": 1.7, "time": 1506320281288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.604, 41.7004, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257544", "mag": 1.02, "time": 1506320165840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.538333, 46.891333, 11.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897784", "mag": 1.7, "time": 1506319825200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9967, 59.5158, 86.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897782", "mag": 1.0, "time": 1506319406475, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2438, 65.7781, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897779", "mag": 1.8, "time": 1506318873463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4148, 69.0584, 10.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898431", "mag": 2.32, "time": 1506318557110, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.909, 37.334167, 8.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898406", "mag": 1.9, "time": 1506317549980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.705833, 39.697, 8.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988640", "mag": 1.4, "time": 1506317208929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0479, 57.5544, 76.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988639", "mag": 1.2, "time": 1506316463527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9489, 61.4034, 66.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606934", "mag": 1.4, "time": 1506315296099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8855, 37.2234, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000b0hn", "mag": 4.2, "time": 1506314791590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -27.4466, -60.0959, 87.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898391", "mag": 0.97, "time": 1506314750800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80867, 38.800999, 1.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898386", "mag": 2.07, "time": 1506314732630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810833, 38.797667, 3.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898381", "mag": 1.3, "time": 1506314425330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1325, 38.050167, 2.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897226", "mag": 1.1, "time": 1506314336648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.1369, 63.4162, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au3u", "mag": 4.3, "time": 1506313752770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7839, 15.5489, 36.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897223", "mag": 1.5, "time": 1506313722965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5906, 61.3427, 45.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897221", "mag": 1.1, "time": 1506313193707, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.457, 63.4294, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988635", "mag": 1.2, "time": 1506312840546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0928, 61.1303, 26.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988634", "mag": 1.1, "time": 1506312758288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7179, 62.8463, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898366", "mag": 1.09, "time": 1506312288130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797501, 38.824165, 1.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16897219", "mag": 1.1, "time": 1506311801540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8303, 63.2243, 16.3 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333436", "mag": 1.41, "time": 1506311554000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.943833, 48.589333, 4.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896672", "mag": 2.4, "time": 1506311539840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6826, 63.2689, 133.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009904", "mag": 1.71, "time": 1506311193160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.813167, 34.048833, 13.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896671", "mag": 1.0, "time": 1506310652342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6095, 62.9432, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009840", "mag": 1.15, "time": 1506308854410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.765333, 33.325667, 12.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896670", "mag": 1.3, "time": 1506308756498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6787, 59.995, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896669", "mag": 1.3, "time": 1506308490557, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.667, 59.9936, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61920451", "mag": 2.11, "time": 1506307247260, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.050167, 19.765, 47.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896663", "mag": 1.7, "time": 1506306347139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.57, 59.4416, 74.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896659", "mag": 1.5, "time": 1506306011000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5629, 61.3391, 37.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896656", "mag": 1.3, "time": 1506306004481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1978, 60.2569, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896653", "mag": 1.8, "time": 1506305432732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6915, 61.3592, 87.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988622", "mag": 2.2, "time": 1506305398552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4539, 55.424, 127.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898321", "mag": 0.97, "time": 1506303023560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.470667, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009824", "mag": 1.77, "time": 1506302722490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.721333, 32.171167, -0.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au34", "mag": 4.2, "time": 1506301011430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6458, 15.9582, 41.89 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898311", "mag": 1.53, "time": 1506300409700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.760333, 38.787333, 2.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898316", "mag": 1.17, "time": 1506300389070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.902833, 37.434167, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249337", "mag": 1.05, "time": 1506300187150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.028, 44.797667, 10.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16896106", "mag": 1.8, "time": 1506299319432, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0832, 61.9049, 66.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895566", "mag": 1.9, "time": 1506298140072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9051, 57.7026, 76.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16988619", "mag": 1.6, "time": 1506298131890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9559, 60.0816, 113.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606884", "mag": 1.4, "time": 1506297047630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0863, 37.3768, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au2t", "mag": 4.6, "time": 1506295898530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.3868, 31.2471, 159.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au2s", "mag": 4.7, "time": 1506295771740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3651, 15.6767, 54.03 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249317", "mag": 2.04, "time": 1506295039370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.575667, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935438", "mag": 1.4, "time": 1506294396969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.934, 60.3588, 65.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898291", "mag": 1.5, "time": 1506294312930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.799167, 37.544833, 8.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895561", "mag": 1.1, "time": 1506294004090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0019, 62.1675, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895559", "mag": 1.7, "time": 1506293152617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9808, 60.2626, 58.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898281", "mag": 1.51, "time": 1506291814030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.123, 38.044833, 2.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895553", "mag": 2.2, "time": 1506291209658, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9667, 58.2749, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249297", "mag": 2.2, "time": 1506289719780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.027, 44.7975, 11.07 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898251", "mag": 1.06, "time": 1506289376180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80867, 38.824501, 1.89 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606863", "mag": 1.6, "time": 1506289302497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1188, 37.3786, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895018", "mag": 1.1, "time": 1506289187928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5309, 62.2207, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898246", "mag": 1.11, "time": 1506288942820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.474667, -0.27 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898241", "mag": 1.11, "time": 1506288826190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.477167, 0.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935433", "mag": 1.6, "time": 1506288360789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4754, 58.4123, 46.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935432", "mag": 2.5, "time": 1506287912932, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0291, 52.8069, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16895001", "mag": 2.4, "time": 1506287325387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3822, 59.9552, 133.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107574", "mag": 1.82, "time": 1506286958930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.1525, 38.965833, 3.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898236", "mag": 1.93, "time": 1506286874150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.849, 36.277667, 7.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16894980", "mag": 2.3, "time": 1506286457929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5039, 61.3116, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au0x", "mag": 4.1, "time": 1506285951620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 137.7689, 33.0106, 343.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16894459", "mag": 1.4, "time": 1506285529465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7694, 59.8585, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16894458", "mag": 3.5, "time": 1506285383201, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4213, 51.6336, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919931", "mag": 1.61, "time": 1506285094170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2325, 19.4085, 26.679 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207286", "mag": 1.46, "time": 1506284271340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.900667, 36.601833, 4.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898226", "mag": 1.94, "time": 1506284238360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819, 37.476167, 0.74 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919891", "mag": 2.03, "time": 1506284234210, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.278503, 19.407, 0.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000au0l", "mag": 5.0, "time": 1506283809180, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 102.0863, -3.3959, 96.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16894448", "mag": 1.6, "time": 1506283718319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1504, 61.1564, 63.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898216", "mag": 1.02, "time": 1506283590520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826836, 38.841167, 1.21 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898211", "mag": 1.57, "time": 1506283158900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.113333, 38.042667, 2.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16894439", "mag": 2.3, "time": 1506283079762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.7022, 51.6829, 87.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898206", "mag": 1.24, "time": 1506283017210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.777, 35.512, 0.74 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009648", "mag": 0.95, "time": 1506282824500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.909333, 33.494, 13.21 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898196", "mag": 1.08, "time": 1506282126770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.81, 38.806833, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16893920", "mag": 1.6, "time": 1506281844692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.421, 62.907, 126.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898191", "mag": 1.6, "time": 1506281467240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.010167, 37.8015, 1.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898186", "mag": 2.26, "time": 1506281041390, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8185, 37.474833, -0.18 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333306", "mag": 1.11, "time": 1506280827540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.812333, 48.284667, 12.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009608", "mag": 1.3, "time": 1506280518180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.038, 33.0905, 2.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898176", "mag": 2.1, "time": 1506280314320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818333, 37.475833, 0.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935422", "mag": 1.6, "time": 1506280296755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7731, 59.4501, 75.7 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919726", "mag": 1.9, "time": 1506279270940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4185, 19.110833, 41.621 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935421", "mag": 1.7, "time": 1506279143123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5363, 51.7438, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16893907", "mag": 2.1, "time": 1506278978748, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4135, 66.1088, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333296", "mag": 1.51, "time": 1506278869250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.581833, 47.593, 24.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898171", "mag": 1.13, "time": 1506278629370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.543167, 38.264833, 8.24 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606834", "mag": 1.5, "time": 1506278416314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.885, 38.3509, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009568", "mag": 1.23, "time": 1506278315340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.492333, 35.604833, 5.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16893391", "mag": 2.3, "time": 1506277628203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1998, 53.9184, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16893390", "mag": 1.1, "time": 1506277025981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1933, 68.4549, 18.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16893388", "mag": 1.5, "time": 1506276710660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.3135, 68.0219, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935416", "mag": 1.8, "time": 1506276357546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.0551, 51.7225, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898146", "mag": 1.54, "time": 1506276015270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810333, 38.836, 1.98 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606827", "mag": 1.3, "time": 1506274049277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6642, 36.4428, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333281", "mag": 2.14, "time": 1506273261550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.502167, 49.447833, -0.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atz0", "mag": 4.3, "time": 1506273226630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.369, -22.6476, 261.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009520", "mag": 2.39, "time": 1506272765060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.032333, 33.096333, 9.36 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898121", "mag": 1.18, "time": 1506272385880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880667, 37.538167, 3.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atyw", "mag": 4.9, "time": 1506272236140, "felt": 49, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 27.2871, 36.912, 8.66 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333276", "mag": 0.97, "time": 1506272212660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.677, 48.245, 8.69 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009504", "mag": 1.59, "time": 1506272197880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0285, 33.096, 10.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935414", "mag": 1.3, "time": 1506271871925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3105, 62.8907, 109.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16892357", "mag": 1.5, "time": 1506271104455, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2217, 60.9895, 43.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16892356", "mag": 1.0, "time": 1506270748541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7754, 66.4015, 0.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606816", "mag": 1.3, "time": 1506270455535, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3547, 38.3427, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16892349", "mag": 2.1, "time": 1506269387778, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9052, 64.2272, 113.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16892348", "mag": 1.2, "time": 1506269350233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0305, 61.1531, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249237", "mag": 1.72, "time": 1506268839820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.899, 38.3125, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898066", "mag": 2.26, "time": 1506268374330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.604333, 4.11 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919541", "mag": 2.2, "time": 1506268362680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.553, 19.106833, 58.134 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898071", "mag": 1.35, "time": 1506268343880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.978833, 37.602333, 0.75 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333251", "mag": 0.99, "time": 1506267835060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7565, 46.8405, 0.46 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249227", "mag": 1.55, "time": 1506267791100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.045667, 38.595, 10.17 ] } }, +{ "type": "Feature", "properties": { "id": "nc72898046", "mag": 1.31, "time": 1506267662950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.359333, 36.063833, 13.03 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333241", "mag": 1.02, "time": 1506266858960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7535, 46.835833, -0.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atyb", "mag": 4.2, "time": 1506265370020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9623, 16.5258, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16891829", "mag": 1.1, "time": 1506265012702, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7832, 60.3293, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333221", "mag": 2.23, "time": 1506264885990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.458, 41.843167, 29.32 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009392", "mag": 2.47, "time": 1506263949730, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.965667, 33.074, 3.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16891827", "mag": 1.6, "time": 1506263040480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.0762, 68.8735, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935406", "mag": 1.9, "time": 1506262994682, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4328, 58.9133, 119.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249217", "mag": 1.98, "time": 1506261948290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.8955, 38.308167, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333201", "mag": 1.01, "time": 1506261154820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.757333, 46.836833, 0.83 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606861", "mag": 1.0, "time": 1506260845911, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9076, 39.4306, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16891323", "mag": 1.6, "time": 1506260101784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2725, 63.8369, 122.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935404", "mag": 1.9, "time": 1506259949572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9271, 51.4777, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16891318", "mag": 1.4, "time": 1506258938436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1228, 60.1784, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935403", "mag": 1.5, "time": 1506258927685, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.537, 59.7654, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awkh", "mag": 4.5, "time": 1506257940620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.6787, -21.4068, 6.58 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009360", "mag": 1.01, "time": 1506257616920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6935, 33.4475, 13.86 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919476", "mag": 2.71, "time": 1506257049620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.326172, 19.400499, 6.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000azwe", "mag": 4.0, "time": 1506256906900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0503, 15.0164, 47.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935402", "mag": 1.3, "time": 1506256449894, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1247, 62.5252, 67.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atx8", "mag": 4.5, "time": 1506256396240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2151, 16.4456, 23.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awke", "mag": 4.3, "time": 1506254896510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.7664, -36.2005, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atx1", "mag": 4.3, "time": 1506253816940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8221, 15.5422, 39.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897966", "mag": 1.94, "time": 1506252917940, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.353833, 38.334333, 8.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16890316", "mag": 1.9, "time": 1506251419309, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7084, 53.1628, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935399", "mag": 2.2, "time": 1506251253254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9705, 58.4119, 157.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awkb", "mag": 4.4, "time": 1506250943050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.3134, -22.0133, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009336", "mag": 1.4, "time": 1506250687150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.573, 33.198833, 3.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935398", "mag": 1.7, "time": 1506250678217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.541, 51.1205, 34.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37166588", "mag": 1.39, "time": 1506250675520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.547333, 33.281167, 1.13 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009328", "mag": 1.47, "time": 1506250567750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.565833, 33.2015, 2.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000azw4", "mag": 4.0, "time": 1506250079340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2354, 15.2643, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897961", "mag": 1.0, "time": 1506249470110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771164, 38.839333, 1.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16890295", "mag": 3.1, "time": 1506249009854, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4939, 58.556, 142.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009320", "mag": 1.29, "time": 1506248967650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.577833, 33.1915, 3.45 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awka", "mag": 4.5, "time": 1506248797510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.4422, -3.5379, 76.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889805", "mag": 1.1, "time": 1506248542391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6804, 65.8304, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889804", "mag": 1.4, "time": 1506248465317, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0578, 61.0579, 16.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919431", "mag": 2.09, "time": 1506248237750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.282165, 19.41, 0.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atwe", "mag": 5.8, "time": 1506247572180, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0996, 15.3335, 55.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889794", "mag": 1.8, "time": 1506247473558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2731, 60.4252, 19.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889792", "mag": 1.2, "time": 1506245981072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4789, 61.3979, 20.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935392", "mag": 2.2, "time": 1506245821194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.1457, 52.299, 147.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61333151", "mag": 1.32, "time": 1506245720210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3825, 46.455, 17.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atw1", "mag": 4.3, "time": 1506245575860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -86.8213, 11.9773, 72.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889787", "mag": 1.5, "time": 1506245559319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1034, 61.6735, 30.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897941", "mag": 1.12, "time": 1506245298510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880333, 37.529333, 3.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889785", "mag": 1.4, "time": 1506245231368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6899, 61.5181, 15.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atvx", "mag": 4.0, "time": 1506245211400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2276, 16.4152, 5.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889300", "mag": 1.5, "time": 1506244274159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0562, 62.8873, 108.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889299", "mag": 1.7, "time": 1506243971468, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.0331, 60.0823, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889298", "mag": 1.2, "time": 1506242695770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7525, 61.9971, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919256", "mag": 2.47, "time": 1506242595490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.234167, 19.416667, 25.716 ] } }, +{ "type": "Feature", "properties": { "id": "ak16889296", "mag": 1.5, "time": 1506242565319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7169, 65.857, 21.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897921", "mag": 1.06, "time": 1506242001250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8435, 37.469667, 2.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897911", "mag": 2.08, "time": 1506241606310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.552333, 36.824833, 5.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16888862", "mag": 1.4, "time": 1506241109945, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2949, 62.9113, 106.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009280", "mag": 1.11, "time": 1506240906400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0385, 33.996167, 14.68 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atvi", "mag": 2.6, "time": 1506240803150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4513, 42.6043, 5.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atvl", "mag": 4.0, "time": 1506239983840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9034, 16.4793, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16888812", "mag": 1.7, "time": 1506239643860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1541, 59.6562, 69.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935382", "mag": 1.8, "time": 1506239506704, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5249, 57.6124, 45.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257374", "mag": 1.2, "time": 1506238135570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.868, 11.76 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606790", "mag": 1.5, "time": 1506237560657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.1999, 42.1841, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atv2", "mag": 4.3, "time": 1506236966640, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.864, -35.1565, 48.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16888374", "mag": 1.9, "time": 1506236724000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8397, 62.9467, 106.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16888373", "mag": 1.0, "time": 1506236683719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1115, 61.3903, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249142", "mag": 1.26, "time": 1506236544020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.028333, 44.8, 10.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897871", "mag": 1.79, "time": 1506236124510, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.845333, 35.541667, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897866", "mag": 2.12, "time": 1506235870210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3545, 38.341333, 8.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935379", "mag": 1.6, "time": 1506235725999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.5436, 51.4418, 21.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atuj", "mag": 4.6, "time": 1506235179700, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -75.5466, -14.3043, 33.52 ] } }, +{ "type": "Feature", "properties": { "id": "nc72903821", "mag": 1.02, "time": 1506234997060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.948167, 41.046333, 9.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897856", "mag": 1.71, "time": 1506234937540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8185, 37.471333, 1.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935378", "mag": 1.3, "time": 1506234863595, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9435, 61.261, 59.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009240", "mag": 0.99, "time": 1506234721960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.828167, 33.977667, 16.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935377", "mag": 3.3, "time": 1506234648623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3164, 50.4387, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16888327", "mag": 1.1, "time": 1506234051194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0067, 67.8619, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919146", "mag": 1.76, "time": 1506233551670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.438667, 19.110833, 40.565 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897836", "mag": 1.19, "time": 1506233494190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.879667, 37.536833, 3.32 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897831", "mag": 1.19, "time": 1506233212800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880167, 37.536833, 3.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935375", "mag": 1.1, "time": 1506232927752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.625, 63.077, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16887898", "mag": 1.9, "time": 1506232339124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4442, 51.588, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atud", "mag": 4.6, "time": 1506232184760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.3102, 23.9217, 19.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16887893", "mag": 1.8, "time": 1506231025885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6676, 61.5229, 16.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000attv", "mag": 3.2, "time": 1506230915380, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4686, 42.6086, 5.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009080", "mag": 1.1, "time": 1506230493370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.65, 35.937333, 3.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897801", "mag": 1.86, "time": 1506230402950, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880833, 37.5355, 3.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000attk", "mag": 4.4, "time": 1506229834430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9698, 16.526, 14.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16887845", "mag": 2.2, "time": 1506229788458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3609, 60.3798, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009064", "mag": 2.54, "time": 1506229471590, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.708833, 34.611167, -0.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16887419", "mag": 2.5, "time": 1506228712730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1558, 57.6827, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249092", "mag": 1.45, "time": 1506228417670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.041833, 38.6065, 7.11 ] } }, +{ "type": "Feature", "properties": { "id": "uu60013144", "mag": 2.65, "time": 1506227971910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.063667, 38.596667, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249087", "mag": 3.34, "time": 1506227924130, "felt": 52, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.056, 38.615, 7.09 ] } }, +{ "type": "Feature", "properties": { "id": "ci38009040", "mag": 1.66, "time": 1506227707260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.754667, 32.691333, 7.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16887417", "mag": 1.4, "time": 1506227635748, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4813, 59.9807, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61919026", "mag": 1.76, "time": 1506225952210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.284164, 19.394167, 2.71 ] } }, +{ "type": "Feature", "properties": { "id": "hv61918996", "mag": 1.99, "time": 1506224898090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28067, 19.403999, 1.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atsq", "mag": 4.1, "time": 1506223896740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.2705, -18.0175, 148.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935368", "mag": 2.3, "time": 1506222958411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4834, 51.3236, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16886952", "mag": 1.2, "time": 1506222874628, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.387, 59.9979, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207271", "mag": 1.17, "time": 1506222175440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.522833, 36.477167, 7.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897746", "mag": 1.28, "time": 1506221915120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720833, 38.788, 2.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16886490", "mag": 1.1, "time": 1506220290807, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3418, 62.9812, 77.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atse", "mag": 4.6, "time": 1506220200040, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.2801, -27.8834, 30.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935365", "mag": 1.8, "time": 1506220032447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1268, 57.8123, 70.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897736", "mag": 1.07, "time": 1506219512840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8245, 37.478833, 1.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935364", "mag": 2.4, "time": 1506219397177, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8092, 52.1986, 20.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897726", "mag": 2.48, "time": 1506219108260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.023333, 40.3465, 9.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atsa", "mag": 4.2, "time": 1506218615340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8425, 16.574, 39.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16935363", "mag": 1.0, "time": 1506217950145, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5769, 68.6004, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897701", "mag": 1.48, "time": 1506217326030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819333, 37.475, -0.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897696", "mag": 1.19, "time": 1506216792400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125, 36.5355, 3.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16886371", "mag": 2.1, "time": 1506216606733, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.8852, 51.4616, 53.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atrn", "mag": 3.8, "time": 1506215497620, "felt": 67, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1371, 36.3727, 2.82 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897686", "mag": 2.17, "time": 1506215076790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.141167, 36.555, 2.89 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008976", "mag": 1.32, "time": 1506215071310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.450333, 34.2865, 7.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atrk", "mag": 5.0, "time": 1506214584220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.7808, -10.6598, 47.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885992", "mag": 2.0, "time": 1506214179876, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6803, 63.2188, 129.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008968", "mag": 1.0, "time": 1506214163490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8005, 33.996, 18.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885991", "mag": 1.4, "time": 1506214156491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6167, 63.06, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885975", "mag": 2.0, "time": 1506213434632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5807, 63.0643, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885911", "mag": 1.9, "time": 1506213142249, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5965, 63.0635, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atre", "mag": 4.4, "time": 1506212946200, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.7877, 12.9849, 60.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897676", "mag": 1.44, "time": 1506212851640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.836167, 37.574667, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008928", "mag": 1.02, "time": 1506212597460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.178333, 33.195833, 6.76 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008920", "mag": 1.07, "time": 1506212251010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.430333, 34.0525, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885578", "mag": 1.8, "time": 1506211566495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6255, 61.4518, 71.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885576", "mag": 1.5, "time": 1506211049943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5978, 61.5229, 17.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885547", "mag": 1.3, "time": 1506210780241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6346, 63.8335, 106.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885533", "mag": 1.6, "time": 1506209676573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5334, 61.8507, 43.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897656", "mag": 1.03, "time": 1506208996140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7145, 38.772667, 2.47 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008912", "mag": 1.4, "time": 1506208905320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.801167, 33.9745, 17.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008904", "mag": 1.35, "time": 1506208456300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924333, 33.9845, 4.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atqq", "mag": 4.5, "time": 1506207994550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9873, 16.6593, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16885149", "mag": 1.0, "time": 1506207804984, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3702, 64.9969, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60249057", "mag": 2.12, "time": 1506207074140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.304, 44.720667, 6.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897646", "mag": 1.23, "time": 1506206872800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735333, 38.787167, 1.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atq4", "mag": 4.6, "time": 1506204121620, "felt": 194, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.616, -33.7421, 44.72 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008864", "mag": 1.58, "time": 1506203611410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609, 33.181333, 2.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16884706", "mag": 3.1, "time": 1506202930250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.1771, 51.8267, 132.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atpq", "mag": 4.9, "time": 1506201617890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.82, 7.5438, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atpp", "mag": 4.9, "time": 1506201494980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.8199, 7.5946, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16884645", "mag": 1.0, "time": 1506201077397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.96, 64.7531, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atpb", "mag": 5.7, "time": 1506199628760, "felt": 53, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.8736, 7.6285, 31.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16884300", "mag": 2.8, "time": 1506199486287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.6652, 52.5903, 67.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897611", "mag": 1.26, "time": 1506199458450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821667, 37.604333, 4.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16884298", "mag": 1.2, "time": 1506198439700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5445, 59.7818, 0.1 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332966", "mag": 1.38, "time": 1506197756870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.684333, 48.248, 9.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16884247", "mag": 2.2, "time": 1506197594492, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.0461, 51.8485, 92.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883936", "mag": 1.0, "time": 1506196999226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8099, 64.7452, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008816", "mag": 1.2, "time": 1506196919720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.403833, 34.223333, 11.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897586", "mag": 2.51, "time": 1506196446140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.396167, 40.494333, 25.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897566", "mag": 2.07, "time": 1506194792800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.572667, 1.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897561", "mag": 1.83, "time": 1506194678430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.574, 1.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883864", "mag": 2.8, "time": 1506194224396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8992, 51.3293, 31.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883866", "mag": 1.0, "time": 1506193955730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8833, 59.8983, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897541", "mag": 1.74, "time": 1506193009290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820833, 37.6045, 4.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883553", "mag": 1.2, "time": 1506192900100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4017, 65.5315, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883554", "mag": 1.2, "time": 1506192680980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0611, 67.1099, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atnx", "mag": 2.6, "time": 1506192601240, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4214, 42.5566, 9.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883552", "mag": 1.1, "time": 1506192410113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.197, 60.3011, 0.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897531", "mag": 2.28, "time": 1506191594770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821667, 37.604, 4.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000augr", "mag": 4.5, "time": 1506191531170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.4442, -11.942, 15.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008760", "mag": 1.23, "time": 1506190682920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.415167, 33.1465, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008752", "mag": 1.14, "time": 1506190401470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.972, 33.217167, 7.81 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897521", "mag": 1.68, "time": 1506190013010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811833, 38.821167, 1.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883482", "mag": 1.4, "time": 1506189726896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.742, 64.4224, 18.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923786", "mag": 2.7, "time": 1506189654902, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1544, 53.4208, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61918336", "mag": 2.94, "time": 1506189242240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.611167, 19.4215, 2.482 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atn1", "mag": 4.4, "time": 1506188901480, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.1457, 7.0739, 96.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897511", "mag": 1.1, "time": 1506188786860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7965, 37.484667, 7.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16883178", "mag": 2.9, "time": 1506188673480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5715, 58.1668, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923784", "mag": 1.7, "time": 1506187667099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6425, 60.6215, 67.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atms", "mag": 5.0, "time": 1506187553100, "felt": 30, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.9096, -30.7535, 117.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008720", "mag": 1.14, "time": 1506187127550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4515, 34.231833, 12.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897476", "mag": 2.49, "time": 1506186613660, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3425, 36.714, -0.57 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897471", "mag": 1.19, "time": 1506186452260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.773834, 38.833832, 1.91 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008696", "mag": 1.09, "time": 1506186268310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.848333, 36.183167, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008688", "mag": 1.35, "time": 1506185983910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.845167, 36.179667, 2.43 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897466", "mag": 1.85, "time": 1506185948480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.807, 38.052667, 0.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atmg", "mag": 4.4, "time": 1506185133990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 71.1291, 36.4703, 91.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atmf", "mag": 4.5, "time": 1506184783190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.21, -28.772, 131.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897451", "mag": 1.44, "time": 1506184758630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.9955, 36.407667, 6.86 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008672", "mag": 2.68, "time": 1506184689590, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8015, 33.498333, 5.63 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008664", "mag": 1.11, "time": 1506184563870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.261167, 34.006833, 14.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atmc", "mag": 2.7, "time": 1506184527900, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4447, 42.5711, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atma", "mag": 4.4, "time": 1506183893420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7171, 16.8156, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897441", "mag": 1.31, "time": 1506183491090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.606833, 37.170833, 12.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897436", "mag": 1.56, "time": 1506183390100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.606833, 37.198667, 10.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16882778", "mag": 2.6, "time": 1506183338101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.6342, 57.1033, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923782", "mag": 2.0, "time": 1506182696586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8058, 59.0921, 75.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16882769", "mag": 3.1, "time": 1506182496691, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0149, 52.3026, 176.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atm1", "mag": 4.3, "time": 1506182042160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 62.7519, 26.1798, 45.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16882474", "mag": 1.9, "time": 1506181429544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7141, 61.0689, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16882473", "mag": 1.1, "time": 1506181415825, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5959, 60.5708, 14.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897426", "mag": 1.24, "time": 1506180532690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.623667, 37.188167, 10.74 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008584", "mag": 1.58, "time": 1506180105990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.444, 33.030667, 2.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atlk", "mag": 3.8, "time": 1506180000610, "felt": 14, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4292, 42.5433, 9.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atlf", "mag": 4.2, "time": 1506179194220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0107, 16.603, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257194", "mag": 1.15, "time": 1506178837080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.886, 12.66 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606739", "mag": 1.0, "time": 1506178325112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0924, 40.2311, 5.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008536", "mag": 1.59, "time": 1506177881730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795667, 33.495667, 3.67 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atkr", "mag": 4.9, "time": 1506177106540, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8831, 16.6905, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atku", "mag": 4.2, "time": 1506176872070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.97, 16.7939, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897386", "mag": 1.06, "time": 1506176360420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811667, 38.818667, 2.57 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008512", "mag": 2.34, "time": 1506176315810, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0575, 34.503333, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atkn", "mag": 4.4, "time": 1506176300040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1269, 16.7434, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16882104", "mag": 1.1, "time": 1506175629079, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8075, 60.3407, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897361", "mag": 0.96, "time": 1506174820850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.612, 37.392833, 13.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881826", "mag": 2.5, "time": 1506174802909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6324, 58.8539, 123.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008496", "mag": 1.78, "time": 1506174424760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817167, 34.867667, 4.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881795", "mag": 1.1, "time": 1506173527174, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8881, 64.8661, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atke", "mag": 5.1, "time": 1506173434140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.8176, 13.6704, 193.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atk8", "mag": 4.8, "time": 1506173052110, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9123, 16.7308, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881771", "mag": 1.2, "time": 1506172200912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8726, 64.8605, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881749", "mag": 1.6, "time": 1506171778198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8844, 64.8563, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atjy", "mag": 4.3, "time": 1506171499860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.9043, -2.9658, 44.93 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248857", "mag": 1.35, "time": 1506171338590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.890833, 37.000833, 18.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atjv", "mag": 6.1, "time": 1506171182420, "felt": 203, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9509, 16.7732, 9.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881467", "mag": 1.4, "time": 1506170949832, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8768, 64.9158, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881459", "mag": 1.7, "time": 1506170669236, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6941, 64.6752, 17.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881453", "mag": 1.5, "time": 1506170369239, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9047, 64.8585, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atjm", "mag": 4.6, "time": 1506169519350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.1923, 31.1823, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avhc", "mag": 2.6, "time": 1506167877970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.84, 52.2553, 189.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881171", "mag": 2.3, "time": 1506167030162, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8612, 51.6605, 44.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248832", "mag": 1.05, "time": 1506167017860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.340667, 40.274333, 3.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000augc", "mag": 4.6, "time": 1506166612290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 154.9573, -5.8521, 181.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881170", "mag": 1.2, "time": 1506166372386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7852, 62.5649, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881168", "mag": 1.3, "time": 1506166038103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5567, 63.2977, 0.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897346", "mag": 1.79, "time": 1506165696260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.112333, 37.231, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avha", "mag": 3.4, "time": 1506165671380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4308, 52.2784, 36.52 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008448", "mag": 1.41, "time": 1506165347360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.561667, 32.957167, 8.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881165", "mag": 1.3, "time": 1506165145820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3968, 60.1913, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16881154", "mag": 1.7, "time": 1506164474729, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4355, 60.0468, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923760", "mag": 1.5, "time": 1506164269172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.3627, 51.5307, 19.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atis", "mag": 5.8, "time": 1506163088980, "felt": 26, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1625, 15.6979, 74.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880880", "mag": 2.0, "time": 1506162923314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4514, 58.8323, 121.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880879", "mag": 1.5, "time": 1506162509845, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4379, 59.9894, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897331", "mag": 1.09, "time": 1506162381540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827, 37.610667, 4.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880874", "mag": 1.6, "time": 1506161778674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9513, 62.6833, 55.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880872", "mag": 2.2, "time": 1506161709130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2999, 57.8298, 119.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880868", "mag": 1.9, "time": 1506161335096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0011, 60.342, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880864", "mag": 1.5, "time": 1506160533641, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2829, 64.8808, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897316", "mag": 1.12, "time": 1506160300400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.288667, 36.670833, 2.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ati0", "mag": 4.5, "time": 1506158356450, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.7746, 9.1385, 52.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897301", "mag": 3.32, "time": 1506157219710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.0845, 40.348333, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332771", "mag": 1.35, "time": 1506157207660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.313333, 47.606333, 8.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897271", "mag": 1.14, "time": 1506156362630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.254167, 36.643167, 6.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880667", "mag": 1.1, "time": 1506155808049, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5764, 61.5311, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ati7", "mag": 3.5, "time": 1506155357560, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.0524, 41.3116, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atht", "mag": 4.7, "time": 1506154802240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.0272, 44.3731, 31.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880659", "mag": 1.0, "time": 1506154668324, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1159, 65.4383, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880589", "mag": 2.0, "time": 1506153946841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6279, 61.5946, 79.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897246", "mag": 1.31, "time": 1506153823970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.762, 38.794, 0.72 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008352", "mag": 1.63, "time": 1506153604550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4425, 33.0265, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606675", "mag": 1.2, "time": 1506152057931, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9167, 38.4054, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880394", "mag": 3.6, "time": 1506152017544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.3853, 52.2081, 31.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923747", "mag": 1.9, "time": 1506151958661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4175, 51.6761, 16.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008344", "mag": 1.48, "time": 1506151638300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.324167, 33.310833, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248802", "mag": 2.41, "time": 1506151450100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.419667, 42.565833, 9.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ath8", "mag": 4.1, "time": 1506151137510, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2976, 15.8203, 61.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897236", "mag": 1.32, "time": 1506151113910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898167, 37.524833, 12.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ath6", "mag": 4.1, "time": 1506150769430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3958, 15.2768, 10.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008328", "mag": 1.27, "time": 1506150100050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.200167, 33.893167, 7.86 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606672", "mag": 1.5, "time": 1506150086518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2696, 38.2952, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000augd", "mag": 4.4, "time": 1506150000550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.8812, 20.1804, 76.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008320", "mag": 1.19, "time": 1506149119830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9395, 33.982167, 4.39 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atgz", "mag": 4.2, "time": 1506149095090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.0247, 10.6523, 19.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880326", "mag": 2.0, "time": 1506149068802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0613, 61.3779, 34.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ath2", "mag": 4.7, "time": 1506149033340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.7584, -3.0863, 34.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880327", "mag": 1.1, "time": 1506149006055, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2865, 68.6023, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332671", "mag": 1.77, "time": 1506147857710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.281667, 47.7015, 25.73 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897231", "mag": 2.11, "time": 1506147638730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6555, 36.061833, 9.09 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aug5", "mag": 4.5, "time": 1506146537200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8683, -24.2891, 524.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008296", "mag": 1.25, "time": 1506146485640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.616, 33.586167, 13.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16880116", "mag": 1.8, "time": 1506145682289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.2213, 66.2475, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606730", "mag": 1.3, "time": 1506145648978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1876, 38.2127, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008288", "mag": 1.58, "time": 1506145525140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4415, 32.5255, 16.12 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606667", "mag": 1.5, "time": 1506145236843, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.917, 38.3346, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atgp", "mag": 4.5, "time": 1506143865490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.7175, 9.7486, 52.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000athl", "mag": 4.4, "time": 1506143271620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 108.9322, -8.2399, 66.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897216", "mag": 1.88, "time": 1506142958730, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9835, 40.89, 15.76 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897211", "mag": 1.17, "time": 1506142616000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827667, 38.837166, 1.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897201", "mag": 0.95, "time": 1506142430900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.848, 38.839168, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897191", "mag": 1.9, "time": 1506141940330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177333, 40.264333, 3.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879870", "mag": 2.3, "time": 1506141876996, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6246, 59.199, 103.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879869", "mag": 1.3, "time": 1506141297637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7807, 60.3298, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606723", "mag": 1.0, "time": 1506140560559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2867, 38.4929, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008224", "mag": 0.95, "time": 1506140386650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.208667, 33.3405, 11.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879830", "mag": 1.4, "time": 1506140318328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2827, 60.4409, 47.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606722", "mag": 1.2, "time": 1506140002001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9021, 38.3867, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606720", "mag": 1.1, "time": 1506139980519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2929, 38.489, 10.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897176", "mag": 1.78, "time": 1506139907070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.285333, 38.488, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897171", "mag": 1.19, "time": 1506139518870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735336, 38.790001, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897166", "mag": 2.9, "time": 1506138206720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.992667, 40.335333, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atgc", "mag": 4.2, "time": 1506137667560, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9729, 15.6003, 33.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897161", "mag": 3.28, "time": 1506137168410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.014, 40.471167, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879595", "mag": 2.4, "time": 1506137087441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8458, 58.348, 0.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923736", "mag": 1.3, "time": 1506135643558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0957, 61.7127, 43.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879403", "mag": 1.0, "time": 1506135058360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4982, 63.0889, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923734", "mag": 2.5, "time": 1506133328382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.4425, 54.2787, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879357", "mag": 2.6, "time": 1506132937319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3477, 59.8339, 130.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879346", "mag": 2.2, "time": 1506132165090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.4939, 67.7172, 16.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879344", "mag": 2.6, "time": 1506132016431, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.1196, 54.9637, 82.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606656", "mag": 1.3, "time": 1506130971840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3283, 38.6945, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897141", "mag": 2.05, "time": 1506130087910, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.4195, 40.470333, 27.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879132", "mag": 1.4, "time": 1506129632041, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0373, 62.0301, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atfh", "mag": 2.6, "time": 1506129518070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4417, 42.5563, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897136", "mag": 1.16, "time": 1506129465180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.888333, 36.006167, 8.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16879131", "mag": 1.2, "time": 1506128472934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7081, 62.2652, 36.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897126", "mag": 2.19, "time": 1506127820390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.640167, 36.048667, 19.79 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aug3", "mag": 4.3, "time": 1506127768780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.2316, -6.5899, 129.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atfc", "mag": 4.4, "time": 1506126533850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4878, -17.8955, 579.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878940", "mag": 1.3, "time": 1506126488960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4306, 62.433, 39.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923727", "mag": 1.8, "time": 1506125768611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7156, 59.1725, 89.1 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332606", "mag": 1.37, "time": 1506125724350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8475, 47.767167, 17.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atf6", "mag": 4.6, "time": 1506125651480, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 74.5944, 34.2131, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16923726", "mag": 1.0, "time": 1506125523162, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4554, 62.0263, 40.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926133", "mag": 2.1, "time": 1506124308750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1191, 56.3855, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606641", "mag": 1.1, "time": 1506124233235, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9048, 38.3823, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atex", "mag": 5.3, "time": 1506124170400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.0234, 31.3473, 31.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878728", "mag": 1.1, "time": 1506123741185, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3949, 64.9801, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332586", "mag": 1.03, "time": 1506123697550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.176833, 48.224167, 9.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926129", "mag": 1.4, "time": 1506123469629, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8468, 66.6906, 13.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878722", "mag": 1.4, "time": 1506123273253, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.5552, 60.2789, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awr8", "mag": 4.2, "time": 1506122891910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.1488, -4.6487, 111.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ateh", "mag": 4.9, "time": 1506122747420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.6233, -7.7533, 37.28 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332576", "mag": 1.22, "time": 1506122597830, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.362, 45.695667, -0.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926127", "mag": 1.8, "time": 1506122331683, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.4507, 53.4966, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897116", "mag": 3.91, "time": 1506122239050, "felt": 60, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.417333, 40.495333, 26.88 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897111", "mag": 2.5, "time": 1506122222600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.119, 36.5365, 3.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878700", "mag": 1.8, "time": 1506121093447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.734, 61.0547, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awr7", "mag": 4.8, "time": 1506120979560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -35.8191, 7.4851, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257104", "mag": 0.96, "time": 1506120805630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.649833, 45.463833, 2.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008136", "mag": 1.88, "time": 1506120529920, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8015, 33.496833, 4.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897096", "mag": 1.12, "time": 1506120001160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.939167, 37.600667, 1.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awra", "mag": 4.0, "time": 1506119896150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.7982, -5.8817, 310.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926125", "mag": 2.1, "time": 1506118947000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1588, 60.2166, 143.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008120", "mag": 1.02, "time": 1506118476380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0015, 34.316333, 6.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897091", "mag": 1.46, "time": 1506118411060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8605, 39.795333, 0.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926124", "mag": 1.8, "time": 1506118096316, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2941, 60.3659, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897081", "mag": 1.12, "time": 1506117239720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.262833, 36.6425, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897086", "mag": 2.87, "time": 1506117196030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.983667, 40.3995, 16.96 ] } }, +{ "type": "Feature", "properties": { "id": "hv61917311", "mag": 1.89, "time": 1506116007530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.434662, 19.227833, 33.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926123", "mag": 1.1, "time": 1506115983704, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6992, 61.5094, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926121", "mag": 1.9, "time": 1506115445859, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1112, 60.0903, 117.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926120", "mag": 1.1, "time": 1506115334031, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0777, 62.5847, 77.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awr9", "mag": 4.3, "time": 1506115308090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1151, -17.7862, 593.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926119", "mag": 2.3, "time": 1506114986922, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0025, 54.0581, 74.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926118", "mag": 1.7, "time": 1506114971248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8129, 59.8684, 52.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897066", "mag": 0.96, "time": 1506114595240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.820167, 2.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atdb", "mag": 2.4, "time": 1506114466770, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7172, 36.3761, 4.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926117", "mag": 2.5, "time": 1506113979958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.1399, 56.7494, 112.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878294", "mag": 1.9, "time": 1506113817766, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1371, 60.4549, 78.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878292", "mag": 1.4, "time": 1506113608674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3651, 61.5158, 28.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878288", "mag": 2.0, "time": 1506113191350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6595, 59.6404, 74.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61917256", "mag": 1.43, "time": 1506112916300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.825667, 19.312167, 8.904 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atcg", "mag": 3.0, "time": 1506112409690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.6543, 40.4678, 10.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878117", "mag": 1.1, "time": 1506111493188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4364, 62.2279, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16878112", "mag": 1.8, "time": 1506111203565, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6978, 58.82, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207231", "mag": 0.97, "time": 1506111124010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.499167, 36.239, 6.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atbf", "mag": 5.7, "time": 1506109815030, "felt": 112, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -126.8342, 40.4144, 11.01 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606606", "mag": 1.7, "time": 1506109275519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0338, 40.677, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897011", "mag": 1.34, "time": 1506108443760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.041, 35.58, -0.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877921", "mag": 1.1, "time": 1506108429374, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.752, 61.522, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008072", "mag": 1.35, "time": 1506108266330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.202333, 34.987667, -0.83 ] } }, +{ "type": "Feature", "properties": { "id": "nc72897001", "mag": 1.91, "time": 1506107768510, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7205, 38.773333, 1.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877871", "mag": 1.9, "time": 1506107175373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7465, 59.9075, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257054", "mag": 1.62, "time": 1506107025590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.474333, 46.006833, -2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877869", "mag": 1.6, "time": 1506107008752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4734, 63.1712, 116.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38008032", "mag": 1.22, "time": 1506106977520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.345, 35.0535, -1.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atab", "mag": 4.5, "time": 1506106483030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 163.2943, 54.9226, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896976", "mag": 1.19, "time": 1506105877560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816833, 37.4545, 1.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896966", "mag": 1.64, "time": 1506105469690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.945833, 41.046833, 10.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896961", "mag": 1.88, "time": 1506105394080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.951833, 41.047667, 13.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926108", "mag": 2.2, "time": 1506105113528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.5222, 56.3354, 50.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248707", "mag": 1.68, "time": 1506104631990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.397333, 42.534833, 3.76 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007992", "mag": 1.55, "time": 1506104354710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9245, 35.899167, 6.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926107", "mag": 1.2, "time": 1506103639337, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7358, 61.509, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61917106", "mag": 1.63, "time": 1506102792120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.303667, 18.980667, 12.732 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877700", "mag": 1.7, "time": 1506102481165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8203, 53.8611, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877698", "mag": 1.6, "time": 1506102300688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8262, 53.8452, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61332361", "mag": 1.6, "time": 1506102282810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8865, 47.171, 14.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877680", "mag": 1.9, "time": 1506102017646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8735, 62.7643, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248702", "mag": 1.26, "time": 1506101951970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.430167, 42.589833, 6.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926103", "mag": 2.3, "time": 1506101692988, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9282, 51.3815, 44.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248697", "mag": 2.15, "time": 1506100947090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4775, 42.630333, 2.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926102", "mag": 1.9, "time": 1506100904987, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2736, 59.4158, 101.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877679", "mag": 1.1, "time": 1506100453436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9781, 63.2957, 76.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257039", "mag": 1.48, "time": 1506100139660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.555833, 46.892333, 9.34 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007944", "mag": 1.7, "time": 1506100079090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.656667, 34.638, 3.99 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248692", "mag": 1.13, "time": 1506099922660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408833, 42.514, 6.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877641", "mag": 3.4, "time": 1506099810694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7965, 62.8041, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896921", "mag": 1.1, "time": 1506099607680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.816333, 38.808833, 2.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896916", "mag": 3.01, "time": 1506099251650, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.362167, 40.3915, 25.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877640", "mag": 1.4, "time": 1506099120563, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.4377, 69.5097, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61917081", "mag": 2.14, "time": 1506099100410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.043667, 19.653667, 42.069 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926098", "mag": 1.7, "time": 1506099097278, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9448, 59.8191, 95.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37166268", "mag": 1.03, "time": 1506097971820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.496667, 33.561167, -0.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007912", "mag": 1.01, "time": 1506097946840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.406, 33.502167, 13.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926097", "mag": 1.6, "time": 1506097726880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.164, 62.5769, 121.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896896", "mag": 0.95, "time": 1506097561860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.062, 35.522667, 1.15 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248682", "mag": 1.11, "time": 1506097353810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413333, 42.546167, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248677", "mag": 1.32, "time": 1506097004840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.595, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896881", "mag": 1.04, "time": 1506096955860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.874667, 37.619833, 8.25 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896886", "mag": 3.06, "time": 1506096897270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.211833, 40.581333, 16.62 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248672", "mag": 1.72, "time": 1506096443230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.59, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007888", "mag": 1.36, "time": 1506095052550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.495167, 4.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877477", "mag": 1.5, "time": 1506094830892, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0265, 62.027, 12.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248667", "mag": 1.93, "time": 1506094359510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4395, 42.584333, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606574", "mag": 1.6, "time": 1506094148428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9043, 38.3654, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61917031", "mag": 1.65, "time": 1506094079130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279333, 18.952333, 12.363 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248662", "mag": 2.05, "time": 1506093605010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.456167, 42.602333, 3.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at3w", "mag": 2.6, "time": 1506093461490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4231, 36.6952, 7.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877317", "mag": 1.7, "time": 1506093374261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3603, 60.6882, 68.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926094", "mag": 2.1, "time": 1506093004583, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8719, 54.5409, 50.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877316", "mag": 1.4, "time": 1506092949248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2867, 67.5064, 1.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606471", "mag": 1.3, "time": 1506092280598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1113, 38.2958, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awqu", "mag": 4.3, "time": 1506092048390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.5573, 18.5841, 62.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926092", "mag": 1.3, "time": 1506091602226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7703, 57.7311, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877311", "mag": 1.7, "time": 1506091080231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9318, 61.3129, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awqt", "mag": 4.5, "time": 1506090800020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.4373, -23.752, 560.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72904206", "mag": 1.3, "time": 1506089865090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.585167, 40.4755, 15.05 ] } }, +{ "type": "Feature", "properties": { "id": "uw61309452", "mag": 2.05, "time": 1506089062880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.375333, 45.841833, -0.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926090", "mag": 1.6, "time": 1506088685970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6016, 61.227, 75.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877153", "mag": 1.3, "time": 1506088314826, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7156, 61.5096, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007840", "mag": 1.07, "time": 1506088185480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7945, 33.498167, 6.09 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896831", "mag": 1.6, "time": 1506088032960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.772667, 38.806833, -0.28 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896826", "mag": 1.03, "time": 1506088021950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822502, 38.836666, -0.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877151", "mag": 1.7, "time": 1506087613938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3362, 62.1574, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awqs", "mag": 4.3, "time": 1506087606500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5624, -22.5585, 578.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877148", "mag": 1.9, "time": 1506087297503, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1731, 59.963, 87.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606565", "mag": 1.4, "time": 1506087185810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2162, 38.2627, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at3c", "mag": 4.4, "time": 1506086932700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.2264, -0.3969, 83.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at3j", "mag": 4.5, "time": 1506086850810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4418, -19.1856, 573.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16877147", "mag": 1.0, "time": 1506086078366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0434, 64.7457, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876989", "mag": 2.3, "time": 1506085118552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6021, 60.5947, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896781", "mag": 1.59, "time": 1506084858350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.773167, 38.807167, -0.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926084", "mag": 2.4, "time": 1506084692420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.7372, 51.5859, 56.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896771", "mag": 1.74, "time": 1506084487230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771667, 38.808833, 0.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876986", "mag": 1.4, "time": 1506084219307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7611, 61.5102, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916896", "mag": 1.74, "time": 1506083571850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.465667, 19.190833, 35.257 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007816", "mag": 1.33, "time": 1506082333690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362833, 33.373333, 6.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876984", "mag": 1.5, "time": 1506082188790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7152, 61.5125, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876981", "mag": 1.8, "time": 1506082118329, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7017, 61.5113, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876980", "mag": 2.2, "time": 1506081950238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1633, 59.909, 114.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007792", "mag": 1.19, "time": 1506081499660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.503333, 35.304167, 5.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876977", "mag": 1.9, "time": 1506081250212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1121, 59.2751, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876978", "mag": 1.2, "time": 1506081151639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9729, 61.6318, 32.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257019", "mag": 1.05, "time": 1506080783790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526167, 46.879833, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896746", "mag": 1.05, "time": 1506079850700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.73983, 38.763668, 1.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896741", "mag": 1.1, "time": 1506078851480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806, 38.8165, 3.19 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248647", "mag": 1.45, "time": 1506078497740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.561833, 8.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926075", "mag": 1.9, "time": 1506078386128, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8777, 58.9992, 112.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876823", "mag": 1.1, "time": 1506078261719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8636, 62.788, 13.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876821", "mag": 1.4, "time": 1506077123303, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.923, 64.7739, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606454", "mag": 2.6, "time": 1506077002610, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.5007, 36.7388, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80257004", "mag": 1.43, "time": 1506075410640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5235, 46.871, 11.97 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896721", "mag": 1.39, "time": 1506074864460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.841333, 38.844167, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606522", "mag": 1.1, "time": 1506074180637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 38.8303, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007728", "mag": 1.52, "time": 1506073924220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.848, 36.181833, 2.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926070", "mag": 1.6, "time": 1506073391784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.2241, 61.5539, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876665", "mag": 1.6, "time": 1506072332786, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3288, 63.1852, 90.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916851", "mag": 2.09, "time": 1506072148400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.868333, 20.063333, 23.409 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876664", "mag": 1.4, "time": 1506072136495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5912, 61.9919, 28.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926067", "mag": 1.3, "time": 1506071322182, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.632, 62.4195, 64.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248637", "mag": 1.3, "time": 1506070695930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.437167, 42.637667, 5.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at26", "mag": 4.5, "time": 1506070497460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.9846, 3.8293, 107.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926066", "mag": 1.6, "time": 1506069293924, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7084, 58.832, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248632", "mag": 2.03, "time": 1506068604640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.901833, 38.286167, 1.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876662", "mag": 1.9, "time": 1506067828515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4502, 59.8034, 55.7 ] } }, +{ "type": "Feature", "properties": { "id": "nm60044913", "mag": 2.21, "time": 1506067533090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -92.239, 35.7905, 11.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876658", "mag": 3.5, "time": 1506066694779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.9518, 54.8173, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896676", "mag": 1.45, "time": 1506066561830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764833, 38.786167, 0.53 ] } }, +{ "type": "Feature", "properties": { "id": "uw61309412", "mag": 1.49, "time": 1506066402670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.402833, 49.2735, 17.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896671", "mag": 1.2, "time": 1506066223530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8225, 37.524667, 2.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876647", "mag": 1.9, "time": 1506065065953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1147, 59.229, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248627", "mag": 1.79, "time": 1506064954410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417833, 42.575667, 8.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876640", "mag": 1.0, "time": 1506063798789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9184, 63.4232, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256994", "mag": 1.71, "time": 1506063538810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.338833, 46.125333, 6.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at1d", "mag": 4.4, "time": 1506062755300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.9837, 45.5973, 22.46 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606510", "mag": 1.0, "time": 1506062740733, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9097, 38.416, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876497", "mag": 2.9, "time": 1506062332060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4396, 55.4155, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876499", "mag": 1.5, "time": 1506062314773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1276, 62.6705, 84.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926058", "mag": 2.5, "time": 1506062164434, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.9814, 52.5733, 21.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916751", "mag": 1.88, "time": 1506061487210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4615, 19.287167, 7.924 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926055", "mag": 2.4, "time": 1506060569450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4546, 56.5041, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248622", "mag": 1.34, "time": 1506060334660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.622833, 5.33 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606434", "mag": 1.2, "time": 1506060248714, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 38.8296, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007696", "mag": 1.17, "time": 1506059325210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.648333, 35.934, 3.86 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007680", "mag": 1.8, "time": 1506058671480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.570833, 35.360833, 4.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at0m", "mag": 5.5, "time": 1506058424310, "felt": 37, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.7724, 23.5614, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at0v", "mag": 4.5, "time": 1506056644580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.4959, 54.788, 131.21 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256984", "mag": 1.12, "time": 1506056537920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5285, 46.885167, 14.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926054", "mag": 1.3, "time": 1506056097918, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7519, 60.0539, 56.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876343", "mag": 1.1, "time": 1506055943779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.827, 62.7929, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896616", "mag": 2.0, "time": 1506055463630, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788667, 37.456333, 7.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926049", "mag": 2.0, "time": 1506055458648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9681, 59.782, 98.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at08", "mag": 4.7, "time": 1506054886300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.1483, -6.3489, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896606", "mag": 0.97, "time": 1506054333450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.5205, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aszw", "mag": 4.2, "time": 1506054023580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 26.2553, 39.1304, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896586", "mag": 1.98, "time": 1506053997570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883167, 37.538333, 2.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007648", "mag": 1.64, "time": 1506053954570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.495167, 4.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896591", "mag": 1.12, "time": 1506053943320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.789333, 37.455, 7.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aszh", "mag": 2.9, "time": 1506053328020, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.682, 35.846, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876210", "mag": 1.2, "time": 1506052567199, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7614, 63.1414, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876208", "mag": 1.0, "time": 1506051888104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3642, 64.8396, 21.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876202", "mag": 2.8, "time": 1506051238210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6975, 59.8426, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007640", "mag": 1.04, "time": 1506050700240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.074333, 32.868, 9.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876199", "mag": 1.6, "time": 1506050508752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1502, 60.9709, 20.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876069", "mag": 1.7, "time": 1506048854655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6692, 62.5598, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16876067", "mag": 2.1, "time": 1506048427026, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7111, 59.884, 14.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896561", "mag": 1.78, "time": 1506048332800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.779667, 37.392333, -2.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896556", "mag": 1.29, "time": 1506047940540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0265, 36.559833, 6.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16926041", "mag": 2.5, "time": 1506047556201, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.992, 51.8656, 16.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248522", "mag": 1.34, "time": 1506047158170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.026833, 44.7755, 7.13 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256979", "mag": 1.73, "time": 1506043831850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.558333, 46.402, 3.35 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896531", "mag": 1.92, "time": 1506043357560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.780833, 37.389167, -2.29 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256969", "mag": 2.09, "time": 1506042441670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.930333, 44.292833, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875940", "mag": 1.1, "time": 1506041862266, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0885, 63.2553, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awqf", "mag": 4.2, "time": 1506041406940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 165.3116, -15.6295, 57.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asyh", "mag": 4.6, "time": 1506041280550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.2095, 43.8815, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235693", "mag": 1.82, "time": 1506040783670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6825, 37.184, 4.37 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007600", "mag": 2.86, "time": 1506040660680, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.171833, 34.730667, 1.72 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916496", "mag": 1.7, "time": 1506040069030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.755667, 19.862667, 13.433 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awqd", "mag": 4.6, "time": 1506040066970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 90.3605, 2.1475, 15.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875841", "mag": 1.4, "time": 1506039676822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7004, 63.8605, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000atbx", "mag": 2.6, "time": 1506039659260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5671, 46.8969, 11.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avmv", "mag": 2.8, "time": 1506039531410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0769, 52.3761, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256959", "mag": 1.07, "time": 1506038377030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.445667, 43.5435, 11.24 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007584", "mag": 1.19, "time": 1506037977370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.764667, 33.324167, 13.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875834", "mag": 1.4, "time": 1506037872803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.518, 61.5639, 31.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896516", "mag": 1.31, "time": 1506037721390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.669, 37.2905, 3.04 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256954", "mag": 1.13, "time": 1506037549780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4995, 46.8705, 10.41 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awq8", "mag": 4.4, "time": 1506037384370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.5809, 38.0785, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875828", "mag": 2.4, "time": 1506037110228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8706, 62.7902, 14.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875826", "mag": 1.7, "time": 1506036232042, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4937, 61.5906, 31.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asx4", "mag": 2.7, "time": 1506036218800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5127, 36.2915, 7.461 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007544", "mag": 3.0, "time": 1506035447270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.397167, 32.383, 12.07 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007552", "mag": 1.61, "time": 1506035381320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.115667, 34.625667, -1.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875823", "mag": 1.6, "time": 1506035182231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5062, 64.6747, 9.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248487", "mag": 2.1, "time": 1506035003920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420167, 42.525833, 7.93 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256939", "mag": 1.72, "time": 1506034952670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.8665, 11.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875817", "mag": 1.5, "time": 1506034226408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.0329, 53.5528, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awq7", "mag": 4.3, "time": 1506034167940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.929, -23.7349, 550.89 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896506", "mag": 1.29, "time": 1506033952800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821, 38.814833, 2.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875815", "mag": 1.5, "time": 1506033878487, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5575, 60.0344, 58.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875810", "mag": 1.2, "time": 1506033325458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4889, 59.8624, 47.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875800", "mag": 1.4, "time": 1506032434891, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7482, 66.977, 12.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875653", "mag": 4.2, "time": 1506032120973, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8756, 62.7831, 20.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896496", "mag": 1.85, "time": 1506031741740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5285, 36.803333, 3.27 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896486", "mag": 1.45, "time": 1506031445490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.526667, 36.809667, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256934", "mag": 2.12, "time": 1506031400210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.9225, 44.303333, 10.34 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256929", "mag": 1.26, "time": 1506030770930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.747833, 45.079167, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007528", "mag": 1.87, "time": 1506030349230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.650167, 35.935333, 2.69 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916321", "mag": 2.02, "time": 1506029779130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.552333, 19.137667, 49.513 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007520", "mag": 1.21, "time": 1506029730430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.157, 33.634167, -0.52 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916316", "mag": 1.88, "time": 1506029586250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.419833, 19.099167, 42.057 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916311", "mag": 1.76, "time": 1506029522880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.437167, 19.160333, 37.287 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606376", "mag": 1.1, "time": 1506029276288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.9551, 40.0739, 10.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916301", "mag": 1.85, "time": 1506029141190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.439167, 19.1175, 39.677 ] } }, +{ "type": "Feature", "properties": { "id": "ci37166108", "mag": 1.81, "time": 1506028904370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.241667, 32.920333, 11.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007512", "mag": 1.83, "time": 1506028897230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.241167, 32.916667, 7.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875651", "mag": 1.4, "time": 1506028324426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8843, 61.2141, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606357", "mag": 2.6, "time": 1506028168100, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6985, 39.7645, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606355", "mag": 1.1, "time": 1506027762688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.189, 38.4602, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007480", "mag": 1.75, "time": 1506026384090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.371167, 35.054, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875645", "mag": 1.7, "time": 1506026360117, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.75, 60.0811, 100.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896461", "mag": 1.53, "time": 1506026136260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827333, 38.841167, 1.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911613", "mag": 1.9, "time": 1506025569386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0904, 58.6739, 124.2 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235678", "mag": 2.5, "time": 1506025487250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.888333, 37.204167, 6.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007472", "mag": 1.24, "time": 1506025368620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.488667, 33.850333, -0.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ass7", "mag": 4.8, "time": 1506025352080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8962, 15.2536, 65.44 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007464", "mag": 1.18, "time": 1506025134310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.882167, 33.977333, 19.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875518", "mag": 1.7, "time": 1506024448536, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5203, 61.3055, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asr5", "mag": 2.8, "time": 1506024284460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4191, 42.5686, 11.52 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007448", "mag": 1.54, "time": 1506024073190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.493667, 33.846667, -0.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asqw", "mag": 4.5, "time": 1506023938000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.359, -24.593, 89.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896441", "mag": 0.97, "time": 1506023932370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818337, 38.807335, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911611", "mag": 2.0, "time": 1506023546957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8314, 53.8887, 16.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875513", "mag": 2.1, "time": 1506022669821, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6752, 67.929, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875511", "mag": 1.6, "time": 1506022479067, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0122, 60.6265, 55.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896431", "mag": 1.59, "time": 1506022296440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.606, 4.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asq8", "mag": 4.5, "time": 1506022120080, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 57.3957, 30.689, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875508", "mag": 2.8, "time": 1506022088454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5339, 56.4471, 34.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875497", "mag": 2.8, "time": 1506021225649, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3633, 62.2263, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875489", "mag": 2.0, "time": 1506019153622, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5458, 60.2285, 104.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007432", "mag": 0.97, "time": 1506018755920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4305, 33.027167, 7.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896416", "mag": 1.32, "time": 1506018676310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.105167, 37.325333, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875470", "mag": 3.4, "time": 1506018115237, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3313, 62.0747, 82.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007408", "mag": 1.52, "time": 1506017937430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.240833, 33.339, 3.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci37165948", "mag": 1.22, "time": 1506017934430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.238, 33.341, 5.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911603", "mag": 2.2, "time": 1506016859139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.198, 56.7455, 55.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896411", "mag": 1.56, "time": 1506016054120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.955667, 36.390833, 1.45 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ask8", "mag": 5.2, "time": 1506015812780, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 153.792, -5.2273, 42.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875367", "mag": 1.0, "time": 1506015790628, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3293, 61.4367, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896401", "mag": 1.29, "time": 1506015349390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.136833, 36.591, 7.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896396", "mag": 1.65, "time": 1506015154000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.830667, 38.841833, 1.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875364", "mag": 1.7, "time": 1506014707392, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9511, 61.182, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asjm", "mag": 4.1, "time": 1506014582020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1412, 14.9651, 31.77 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896391", "mag": 1.65, "time": 1506014547620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.522667, 37.119333, 6.68 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896386", "mag": 2.74, "time": 1506013969600, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.523, 37.119333, 7.11 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248457", "mag": 1.24, "time": 1506013292240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.416833, 42.5455, 6.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896381", "mag": 1.42, "time": 1506013025480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7985, 38.024167, 4.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875337", "mag": 1.5, "time": 1506012889205, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8562, 59.8876, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875335", "mag": 1.5, "time": 1506012588856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.43, 69.5255, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875333", "mag": 1.4, "time": 1506012078477, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7448, 65.4677, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asj3", "mag": 4.4, "time": 1506011673160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.8925, 24.9992, 82.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875233", "mag": 2.0, "time": 1506011166366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0389, 62.6945, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61916021", "mag": 1.65, "time": 1506010758380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.606333, 19.988, 0.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896356", "mag": 1.08, "time": 1506008853280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736, 38.789501, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007344", "mag": 1.64, "time": 1506006904290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.040833, 34.932167, 7.95 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248432", "mag": 1.93, "time": 1506005934630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.899167, 38.2825, 1.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896351", "mag": 1.05, "time": 1506005402280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.872833, 37.542167, 5.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875225", "mag": 2.6, "time": 1506004864279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7558, 56.7802, 85.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606271", "mag": 1.4, "time": 1506004765898, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9071, 38.404, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911592", "mag": 1.8, "time": 1506004687871, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.776, 59.9457, 96.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875224", "mag": 1.0, "time": 1506004284441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1472, 58.225, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asgp", "mag": 3.1, "time": 1506004160400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5341, 7.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875128", "mag": 1.2, "time": 1506003424957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1414, 61.9718, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875123", "mag": 2.2, "time": 1506003380008, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.406, 61.1636, 56.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875122", "mag": 1.5, "time": 1506003168025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6121, 60.6288, 27.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asgl", "mag": 4.5, "time": 1506003018350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.7163, -5.3996, 143.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911587", "mag": 2.0, "time": 1506002992795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.2107, 54.658, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875121", "mag": 1.3, "time": 1506002287075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7877, 63.0935, 115.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875120", "mag": 1.3, "time": 1506002190951, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3702, 60.2093, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896346", "mag": 1.58, "time": 1506001285170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.046, 37.631, -2.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875118", "mag": 1.5, "time": 1506001054310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4947, 65.9329, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875115", "mag": 1.2, "time": 1506000273641, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8273, 59.8914, 16.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875114", "mag": 1.0, "time": 1505999744527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.927, 63.1123, 88.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875113", "mag": 1.0, "time": 1505999509220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8959, 53.8648, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896326", "mag": 1.49, "time": 1505998900750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.040833, 37.6325, -1.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896316", "mag": 1.09, "time": 1505998199150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.854333, 37.553667, -1.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896306", "mag": 1.43, "time": 1505997631810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.009333, 37.578833, 2.18 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207176", "mag": 1.81, "time": 1505997033100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.530833, 36.304833, 9.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875021", "mag": 1.2, "time": 1505996145934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8383, 65.938, 13.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875018", "mag": 1.2, "time": 1505995669198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.912, 65.5133, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896296", "mag": 1.47, "time": 1505995317350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.196833, 37.9145, 9.67 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207166", "mag": 1.64, "time": 1505994488630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.4975, 36.289667, 7.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asex", "mag": 4.8, "time": 1505994269370, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2903, 15.7805, 100.11 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606244", "mag": 1.4, "time": 1505993181062, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2534, 40.7726, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248402", "mag": 1.76, "time": 1505993050130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.834, 37.5, 12.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911577", "mag": 1.8, "time": 1505992688210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7102, 59.2193, 101.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896276", "mag": 1.87, "time": 1505990638730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821833, 38.807833, 2.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911575", "mag": 1.4, "time": 1505990312220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1289, 60.9457, 91.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007296", "mag": 1.16, "time": 1505989019560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.893333, 33.8875, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874826", "mag": 2.4, "time": 1505988598717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0672, 60.3368, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874821", "mag": 3.9, "time": 1505988559362, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.0266, 58.0197, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asdx", "mag": 3.2, "time": 1505987188740, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5809, 9.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896231", "mag": 1.31, "time": 1505985984190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7595, 39.290333, 11.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874817", "mag": 1.2, "time": 1505985541058, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7623, 63.2246, 123.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896221", "mag": 1.81, "time": 1505985066080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8215, 37.605333, 4.11 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911571", "mag": 1.2, "time": 1505984945428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6774, 60.3679, 51.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000astb", "mag": 3.2, "time": 1505984479950, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 30.4877, 39.7496, 7.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874735", "mag": 1.1, "time": 1505984351439, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1345, 61.0202, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874733", "mag": 1.8, "time": 1505984244290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.6331, 69.6221, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911567", "mag": 1.4, "time": 1505983878943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6066, 58.3406, 70.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874730", "mag": 1.6, "time": 1505983557544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6496, 63.2391, 128.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874715", "mag": 3.0, "time": 1505983090867, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9585, 60.2394, 134.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874713", "mag": 1.8, "time": 1505982752561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3398, 60.0395, 62.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874708", "mag": 1.6, "time": 1505981986749, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5434, 62.0196, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007280", "mag": 1.01, "time": 1505981662400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.966, 33.952667, 12.57 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896186", "mag": 1.8, "time": 1505981520300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764333, 38.786167, 0.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874635", "mag": 1.2, "time": 1505980470681, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9567, 61.1836, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256854", "mag": 1.19, "time": 1505980355400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540333, 46.865833, 13.58 ] } }, +{ "type": "Feature", "properties": { "id": "hv61915846", "mag": 2.23, "time": 1505980220010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471833, 19.187167, 6.497 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896176", "mag": 1.82, "time": 1505979900900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.789167, 37.455, 8.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874613", "mag": 2.5, "time": 1505979347188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6995, 61.302, 18.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896141", "mag": 1.44, "time": 1505978529860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0545, 37.976333, 16.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asd1", "mag": 4.8, "time": 1505977959710, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.683, -37.9104, 6.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896116", "mag": 1.08, "time": 1505977815960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784164, 38.838165, 0.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007272", "mag": 1.44, "time": 1505977166870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.235667, 34.473, 10.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874540", "mag": 1.8, "time": 1505976691446, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5178, 59.5615, 114.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007264", "mag": 1.35, "time": 1505976496140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8585, 33.885833, 13.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874539", "mag": 1.4, "time": 1505975897075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7553, 60.3904, 17.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911557", "mag": 1.9, "time": 1505975896384, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7415, 56.6876, 60.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874533", "mag": 2.4, "time": 1505975550653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4341, 54.7916, 41.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874531", "mag": 1.6, "time": 1505973877209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0439, 60.1347, 121.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896081", "mag": 0.98, "time": 1505973711190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.775002, 38.797669, 2.77 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896076", "mag": 2.49, "time": 1505973410410, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.785833, 37.46, 8.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874465", "mag": 1.3, "time": 1505973344875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.0133, 60.1082, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911553", "mag": 1.4, "time": 1505972962694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3138, 59.699, 53.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911552", "mag": 1.2, "time": 1505972745844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4845, 60.1615, 61.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606219", "mag": 1.3, "time": 1505972571887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1193, 38.2806, 9.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911551", "mag": 1.8, "time": 1505972563999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.15, 51.5531, 43.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606295", "mag": 1.0, "time": 1505972403264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6227, 38.8065, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248342", "mag": 1.16, "time": 1505971839680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427333, 42.584333, 6.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874458", "mag": 1.0, "time": 1505971795387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1789, 60.7931, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606215", "mag": 1.1, "time": 1505970724921, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9138, 38.4144, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606292", "mag": 1.2, "time": 1505969821916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9096, 38.3591, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874386", "mag": 2.2, "time": 1505966674333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1806, 62.1688, 58.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874381", "mag": 1.5, "time": 1505966192127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.3423, 67.4818, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606289", "mag": 1.1, "time": 1505965897622, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.612, 39.7777, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874378", "mag": 1.4, "time": 1505965635289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6084, 59.8249, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007240", "mag": 1.33, "time": 1505964848260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.392833, 34.0695, 3.63 ] } }, +{ "type": "Feature", "properties": { "id": "uw61309117", "mag": 1.41, "time": 1505964727680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.537333, 45.623, 3.45 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asac", "mag": 2.3, "time": 1505963189900, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6319, 35.02, 3.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896016", "mag": 1.0, "time": 1505962244660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.777664, 38.821335, 1.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874313", "mag": 1.6, "time": 1505961692924, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.4015, 58.981, 9.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896006", "mag": 2.63, "time": 1505961234600, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.778, 38.822333, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874294", "mag": 1.4, "time": 1505960998663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7592, 62.4966, 63.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911541", "mag": 1.2, "time": 1505959763113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0959, 69.101, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72896001", "mag": 2.06, "time": 1505958864360, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.541, 35.984333, 10.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007216", "mag": 1.05, "time": 1505958019680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.250167, 34.038167, 14.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874254", "mag": 3.1, "time": 1505957941327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4863, 51.2677, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874229", "mag": 1.1, "time": 1505957058757, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7027, 61.7499, 26.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874215", "mag": 1.1, "time": 1505956445202, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6955, 63.1111, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007208", "mag": 1.4, "time": 1505955985550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.416, 33.868667, 14.65 ] } }, +{ "type": "Feature", "properties": { "id": "hv61915531", "mag": 1.72, "time": 1505955195430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279833, 19.405667, 1.328 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874182", "mag": 2.0, "time": 1505954859125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6742, 63.0988, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as95", "mag": 4.5, "time": 1505954623610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9506, -18.3191, 525.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874180", "mag": 1.0, "time": 1505954368489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6875, 63.1114, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256829", "mag": 1.22, "time": 1505954178230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.729167, 46.9255, 15.18 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007192", "mag": 2.27, "time": 1505953985850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.389333, 34.875667, 4.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16911531", "mag": 3.1, "time": 1505953036619, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8238, 52.2316, 212.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874133", "mag": 1.9, "time": 1505952707526, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3476, 61.7239, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895971", "mag": 2.7, "time": 1505952459520, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.065833, 37.977333, 16.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as7z", "mag": 5.0, "time": 1505952320920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3417, -18.3348, 223.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874122", "mag": 1.3, "time": 1505952267890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.1071, 68.0646, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874119", "mag": 1.3, "time": 1505952216610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9186, 60.9563, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as7r", "mag": 5.7, "time": 1505951964840, "felt": 7, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 113.0028, -6.141, 588.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007168", "mag": 1.0, "time": 1505951908320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.513, 33.929833, 3.12 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874078", "mag": 1.5, "time": 1505949607121, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.307, 64.9865, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895936", "mag": 2.34, "time": 1505948330470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.830833, 38.8385, 2.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as71", "mag": 4.4, "time": 1505948258880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.8955, -19.9851, 13.88 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007144", "mag": 2.26, "time": 1505947525530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.600667, 32.8185, 11.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as6n", "mag": 4.7, "time": 1505946967130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.002, -5.1396, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16874025", "mag": 1.8, "time": 1505946583777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5728, 63.1811, 118.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as5y", "mag": 5.2, "time": 1505945844590, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 147.9821, -5.1384, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as5x", "mag": 5.9, "time": 1505945616140, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 147.8337, -5.11, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873995", "mag": 1.3, "time": 1505944353830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7194, 63.0772, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895916", "mag": 1.33, "time": 1505944123270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 37.532, 3.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903715", "mag": 1.5, "time": 1505944050318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7597, 60.286, 105.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873983", "mag": 1.6, "time": 1505944038560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2822, 60.1956, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873980", "mag": 1.5, "time": 1505943645116, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7128, 62.2758, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895911", "mag": 1.05, "time": 1505943458060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817497, 38.818165, 1.98 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256764", "mag": 1.19, "time": 1505942553810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.3355, 46.855167, 12.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873969", "mag": 1.0, "time": 1505941809382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8648, 61.3084, 14.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903709", "mag": 1.3, "time": 1505940388991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1675, 59.8496, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61915241", "mag": 2.0, "time": 1505940250470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.695496, 19.176666, 1.78 ] } }, +{ "type": "Feature", "properties": { "id": "uw61309057", "mag": 2.31, "time": 1505940000150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.92, 47.376, -0.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873814", "mag": 1.4, "time": 1505938885178, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4385, 61.7606, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873808", "mag": 1.1, "time": 1505938683669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6592, 62.5852, 59.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895876", "mag": 1.45, "time": 1505938357840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.59, 36.021667, 3.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873804", "mag": 1.4, "time": 1505938263457, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3926, 60.1466, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as2f", "mag": 6.4, "time": 1505938189810, "felt": 16, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 169.0947, -18.7978, 200.19 ] } }, +{ "type": "Feature", "properties": { "id": "hv61915206", "mag": 2.51, "time": 1505938077390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.033667, 19.2375, 39.578 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007104", "mag": 1.0, "time": 1505937649230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0765, 32.813833, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873801", "mag": 2.0, "time": 1505937512139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8359, 53.871, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as1w", "mag": 2.5, "time": 1505937361300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.0579, 36.6187, 5.828 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873782", "mag": 1.2, "time": 1505936869830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8873, 62.1092, 41.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256709", "mag": 1.79, "time": 1505935321500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.451, 43.543667, 10.41 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606121", "mag": 1.5, "time": 1505934916827, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1139, 37.3666, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007096", "mag": 1.15, "time": 1505934203280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.751, 34.839333, -1.28 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606180", "mag": 1.3, "time": 1505934149532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1164, 38.3161, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895851", "mag": 1.27, "time": 1505934073910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.592833, 39.610333, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873739", "mag": 2.2, "time": 1505933777306, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4033, 69.0735, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873736", "mag": 1.7, "time": 1505933267549, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2132, 61.1317, 38.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007072", "mag": 2.71, "time": 1505931747440, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.389167, 32.380167, 15.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895826", "mag": 1.69, "time": 1505931012940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.428333, 36.582667, 0.68 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248192", "mag": 1.44, "time": 1505930780280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.474333, 42.6455, 0.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895816", "mag": 2.1, "time": 1505929719570, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9675, 40.890167, 14.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873728", "mag": 1.2, "time": 1505929479491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.582, 62.6618, 78.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873142", "mag": 1.5, "time": 1505927860541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2216, 61.5685, 73.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895806", "mag": 3.65, "time": 1505927408630, "felt": 119, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.983667, 40.891333, 16.86 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895796", "mag": 3.18, "time": 1505926479240, "felt": 56, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.546833, 36.829167, 3.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873012", "mag": 1.4, "time": 1505926389012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6968, 59.7895, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arxv", "mag": 6.1, "time": 1505925436360, "felt": 102, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.6601, 37.9814, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16872904", "mag": 1.0, "time": 1505925010295, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5787, 62.1577, 21.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arxl", "mag": 5.3, "time": 1505924711310, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 118.8822, -10.1961, 10.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arxs", "mag": 4.4, "time": 1505923365600, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 135.4357, 33.9578, 44.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16872233", "mag": 1.2, "time": 1505923328725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1746, 60.1861, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007024", "mag": 0.95, "time": 1505922246000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.593333, 34.202833, 4.57 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arwt", "mag": 4.9, "time": 1505921548830, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.9265, -14.913, 39.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arwd", "mag": 2.4, "time": 1505921250610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.783, 37.3255, 5.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awnu", "mag": 4.6, "time": 1505921168060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.7481, 43.6321, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248182", "mag": 1.14, "time": 1505920908550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455667, 42.606, 5.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arw1", "mag": 4.4, "time": 1505920105280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 70.9001, 36.5943, 194.83 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awp1", "mag": 4.1, "time": 1505919984040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.8639, 5.1272, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903689", "mag": 2.1, "time": 1505918855154, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5285, 56.3302, 52.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16871415", "mag": 1.5, "time": 1505918684626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5508, 61.18, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arvu", "mag": 5.0, "time": 1505918528120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.1207, -17.9346, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38007016", "mag": 1.44, "time": 1505918468750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.514, 33.93, 3.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895731", "mag": 2.2, "time": 1505918095770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.179, 40.2545, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arvi", "mag": 5.3, "time": 1505917796770, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.7572, 23.2931, 22.03 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895726", "mag": 2.76, "time": 1505917745400, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.182833, 40.246333, 11.38 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248172", "mag": 2.13, "time": 1505916637780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.592833, 6.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16870720", "mag": 2.0, "time": 1505915942888, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.6193, 67.4066, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16870653", "mag": 1.8, "time": 1505915336300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2998, 61.7353, 47.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256619", "mag": 1.37, "time": 1505914951120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.886167, 13.87 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006992", "mag": 1.47, "time": 1505914753140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.453667, 34.324833, 9.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895721", "mag": 2.38, "time": 1505913728570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6465, 36.06, 20.18 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006968", "mag": 1.06, "time": 1505913698350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.79, 36.101, 8.43 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006952", "mag": 2.21, "time": 1505911740560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.197667, 32.419333, 10.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16869931", "mag": 1.0, "time": 1505911683814, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0983, 64.9958, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16869929", "mag": 1.1, "time": 1505910877864, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9571, 64.0729, 125.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arkq", "mag": 5.0, "time": 1505910355700, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.5848, 1.0854, 36.12 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248167", "mag": 1.05, "time": 1505910339650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.078167, 44.806167, 7.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arkf", "mag": 2.7, "time": 1505910255780, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4578, 42.6105, 7.92 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914931", "mag": 1.25, "time": 1505910251630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.624833, 19.4175, 3.162 ] } }, +{ "type": "Feature", "properties": { "id": "ak16869355", "mag": 1.3, "time": 1505910194393, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4867, 61.3624, 40.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248157", "mag": 1.62, "time": 1505909926720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418333, 42.6315, 2.43 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606071", "mag": 1.9, "time": 1505909820104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6351, 40.2652, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006936", "mag": 1.08, "time": 1505907735210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.542167, 33.157167, 16.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895696", "mag": 1.65, "time": 1505907470630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.887667, 39.9645, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248147", "mag": 1.97, "time": 1505907452270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426833, 42.575667, 8.53 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914886", "mag": 2.38, "time": 1505907343420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.275162, 19.410833, 10.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903676", "mag": 1.3, "time": 1505907050579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6927, 60.366, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16869212", "mag": 1.1, "time": 1505906705387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0351, 61.9136, 37.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895691", "mag": 1.89, "time": 1505906617690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.802667, 36.023667, 14.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903672", "mag": 2.7, "time": 1505906309964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8205, 51.5611, 26.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895686", "mag": 1.58, "time": 1505906251960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.257833, 39.404167, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16868636", "mag": 1.1, "time": 1505905797402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4101, 61.9294, 46.0 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207096", "mag": 1.74, "time": 1505905515890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.502, 36.239333, 7.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16868555", "mag": 1.6, "time": 1505904607416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.81, 59.8821, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arj1", "mag": 4.7, "time": 1505903968940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.4191, 15.2723, 57.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006912", "mag": 1.07, "time": 1505903473810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.495167, 35.975167, 6.03 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248142", "mag": 1.89, "time": 1505903157450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424333, 42.560333, 7.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16868496", "mag": 2.0, "time": 1505903116550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9125, 61.7794, 102.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16868494", "mag": 1.5, "time": 1505903092907, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2214, 61.9475, 35.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903665", "mag": 1.3, "time": 1505902710790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7292, 62.9468, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16867924", "mag": 1.2, "time": 1505902608214, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7213, 59.8967, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606156", "mag": 1.0, "time": 1505901862661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6593, 38.6914, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895661", "mag": 1.05, "time": 1505901620810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810837, 38.818668, 2.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903662", "mag": 1.0, "time": 1505901509250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8825, 63.8483, 113.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914831", "mag": 1.76, "time": 1505901369660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.477661, 19.182333, 34.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16867848", "mag": 1.1, "time": 1505900653451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4004, 63.1493, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arir", "mag": 3.7, "time": 1505900227020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.1086, 55.2931, 60.27 ] } }, +{ "type": "Feature", "properties": { "id": "uw61331666", "mag": 1.1, "time": 1505898593660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.672, 48.548667, -0.01 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006880", "mag": 2.13, "time": 1505898547760, "felt": 137, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.512, 33.929167, 3.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arig", "mag": 4.9, "time": 1505898116470, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.0335, 30.5728, 51.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16867217", "mag": 1.6, "time": 1505898082784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4786, 59.9819, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16867146", "mag": 1.1, "time": 1505897266615, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.8777, 60.4396, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006872", "mag": 1.46, "time": 1505897209710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797667, 33.493667, 4.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16867139", "mag": 2.2, "time": 1505896599575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3632, 62.9389, 110.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895641", "mag": 1.43, "time": 1505896494260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840333, 37.569333, 1.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903656", "mag": 1.6, "time": 1505896455015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6591, 59.7355, 84.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248127", "mag": 1.21, "time": 1505896112670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.409833, 42.577333, 5.18 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248122", "mag": 1.04, "time": 1505896073990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420167, 42.597, 5.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ari7", "mag": 2.8, "time": 1505895800120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4288, 42.5861, 7.69 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914791", "mag": 2.56, "time": 1505895324160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2775, 19.387833, 2.782 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248112", "mag": 2.6, "time": 1505895001440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426333, 42.581333, 7.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903653", "mag": 1.4, "time": 1505894006715, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1734, 57.6592, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895626", "mag": 1.53, "time": 1505893505020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.731, 35.610333, 5.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16866448", "mag": 1.5, "time": 1505893091784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2468, 62.4591, 77.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60013094", "mag": 1.81, "time": 1505893039830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445667, 42.595833, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006824", "mag": 1.12, "time": 1505893038610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.764667, 36.027, 1.93 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248107", "mag": 1.76, "time": 1505893022850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.600667, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914781", "mag": 1.67, "time": 1505892711130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6165, 19.4305, 3.542 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903651", "mag": 3.0, "time": 1505892680068, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4523, 53.0789, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248102", "mag": 1.36, "time": 1505892622540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.435667, 42.589167, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16866421", "mag": 1.6, "time": 1505892318030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3481, 59.8279, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16866396", "mag": 2.2, "time": 1505891995067, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4096, 54.4777, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914776", "mag": 1.93, "time": 1505891884110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.875167, 19.494, 13.771 ] } }, +{ "type": "Feature", "properties": { "id": "ak16866395", "mag": 1.1, "time": 1505891525159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5895, 59.7855, 1.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865784", "mag": 1.7, "time": 1505890304255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8219, 63.9434, 110.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903645", "mag": 1.5, "time": 1505889690090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8317, 59.5969, 83.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248092", "mag": 1.25, "time": 1505889314510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4045, 42.559, 7.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903644", "mag": 1.6, "time": 1505888156227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1233, 56.6112, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903642", "mag": 1.1, "time": 1505887874395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5943, 62.8332, 79.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arhc", "mag": 2.7, "time": 1505887339310, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7528, 35.56, 6.78 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606041", "mag": 1.5, "time": 1505886348191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1044, 37.3927, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865084", "mag": 2.3, "time": 1505886195952, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.96, 68.8119, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865080", "mag": 1.0, "time": 1505886128688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.8653, 65.3778, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865073", "mag": 2.0, "time": 1505885821473, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.5664, 57.7913, 90.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865048", "mag": 1.0, "time": 1505885371718, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9661, 63.2402, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arh1", "mag": 5.3, "time": 1505885168970, "felt": 29, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3157, -16.2747, 92.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arha", "mag": 4.8, "time": 1505884561830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.9933, 44.304, 47.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16865027", "mag": 1.7, "time": 1505884405432, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8016, 59.167, 62.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903636", "mag": 2.1, "time": 1505884147575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2848, 54.6322, 28.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16864392", "mag": 1.4, "time": 1505881969592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3599, 61.7927, 48.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606034", "mag": 1.2, "time": 1505881284660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8997, 38.3821, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903634", "mag": 1.9, "time": 1505881021363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3362, 59.9873, 134.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16864345", "mag": 1.4, "time": 1505880564938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7317, 59.9227, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16864341", "mag": 1.9, "time": 1505880299039, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2295, 62.4633, 79.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903630", "mag": 1.6, "time": 1505878577379, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2105, 59.7151, 108.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006744", "mag": 1.15, "time": 1505878429650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3295, 36.066833, 4.96 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248077", "mag": 1.22, "time": 1505878406660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422667, 42.523667, 7.06 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006752", "mag": 1.09, "time": 1505878374600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.328333, 36.063333, 2.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16863731", "mag": 2.4, "time": 1505878347669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1296, 60.1348, 9.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903628", "mag": 1.7, "time": 1505878317110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2703, 59.8732, 126.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16863732", "mag": 1.2, "time": 1505878286762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9406, 59.985, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006736", "mag": 1.86, "time": 1505878275980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.331167, 36.0625, 4.96 ] } }, +{ "type": "Feature", "properties": { "id": "ci37165628", "mag": 1.61, "time": 1505878262700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3305, 36.062833, 2.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16863728", "mag": 1.3, "time": 1505878130865, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3801, 60.7066, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000argd", "mag": 4.6, "time": 1505878085370, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8719, 16.1444, 48.73 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248072", "mag": 2.35, "time": 1505878084670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.423167, 42.581333, 8.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16863729", "mag": 2.5, "time": 1505878081761, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4258, 51.6886, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895536", "mag": 1.94, "time": 1505877892960, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.286167, 36.776667, 10.03 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006720", "mag": 1.07, "time": 1505877439420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.752, 33.713, 15.96 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248067", "mag": 1.47, "time": 1505877309800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.617667, 6.11 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006712", "mag": 1.07, "time": 1505875949770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750333, 33.961833, 15.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awn6", "mag": 4.0, "time": 1505875623990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.7511, -25.3193, 527.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arfw", "mag": 4.9, "time": 1505875330110, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 174.3444, -41.5073, 24.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arfs", "mag": 4.9, "time": 1505875055560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.9075, 14.5711, 178.93 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017263000", "mag": 2.75, "time": 1505873919890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.3401, 18.9298, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16863060", "mag": 1.9, "time": 1505873560207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1132, 59.1631, 57.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895516", "mag": 1.58, "time": 1505873402400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.522667, 35.964833, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arf6", "mag": 2.7, "time": 1505873292330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6365, 59.7836, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arfq", "mag": 2.8, "time": 1505872583380, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -2.1386, 37.4306, 7.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895506", "mag": 1.14, "time": 1505872092600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.103, 36.606333, 9.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arel", "mag": 6.1, "time": 1505871807940, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.614, -50.7145, 19.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16862483", "mag": 2.0, "time": 1505871449331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.323, 61.0377, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16862466", "mag": 1.1, "time": 1505870969313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0763, 60.3456, 0.4 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256529", "mag": 1.31, "time": 1505870488260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528, 46.8965, 11.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895486", "mag": 1.47, "time": 1505870467130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.586, 36.020333, 4.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000are4", "mag": 4.5, "time": 1505868292650, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.5418, -3.912, 43.33 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248037", "mag": 2.04, "time": 1505868182810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.450167, 42.612833, 6.23 ] } }, +{ "type": "Feature", "properties": { "id": "uu60248032", "mag": 1.14, "time": 1505868031480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415833, 42.508, 5.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000are1", "mag": 2.5, "time": 1505867820700, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7971, 36.457, 5.777 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895456", "mag": 1.52, "time": 1505867731230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.668833, 37.291667, 4.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ardv", "mag": 5.0, "time": 1505866095740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 57.4066, 30.7208, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903617", "mag": 1.9, "time": 1505866055349, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.744, 56.8763, 33.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903616", "mag": 1.8, "time": 1505865710189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5947, 55.8757, 101.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16903615", "mag": 1.8, "time": 1505865589920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0266, 60.2087, 122.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ass3", "mag": 2.5, "time": 1505864736500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.8008, 36.4519, 6.233 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256499", "mag": 1.38, "time": 1505864394760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.407833, 45.589, 4.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arcp", "mag": 3.0, "time": 1505863612870, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4223, 42.5909, 9.63 ] } }, +{ "type": "Feature", "properties": { "id": "uw61331476", "mag": 1.93, "time": 1505863558820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.772333, 46.652333, -0.79 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arcv", "mag": 4.6, "time": 1505863376420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 123.9102, 6.3611, 38.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arck", "mag": 2.6, "time": 1505863101700, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9891, 36.9623, 5.329 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arch", "mag": 4.6, "time": 1505862692240, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8625, 16.2348, 45.26 ] } }, +{ "type": "Feature", "properties": { "id": "uw61331461", "mag": 1.43, "time": 1505862649350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.194333, 46.983167, -0.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861101", "mag": 1.0, "time": 1505862438423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3714, 64.9781, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arca", "mag": 4.7, "time": 1505862303600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4478, -36.2513, 47.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860573", "mag": 1.3, "time": 1505861271657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6706, 62.0713, 0.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arbk", "mag": 2.4, "time": 1505861097180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4595, 42.608, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aray", "mag": 3.2, "time": 1505859699230, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7506, 36.4396, 1.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arar", "mag": 2.6, "time": 1505859474460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7831, 36.4511, 2.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006608", "mag": 0.96, "time": 1505859334750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.475333, 33.486667, 14.73 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247982", "mag": 1.65, "time": 1505858965080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420667, 42.524833, 7.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859929", "mag": 1.1, "time": 1505857928856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6104, 61.9413, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605999", "mag": 1.5, "time": 1505856979033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7943, 38.658, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875936", "mag": 1.7, "time": 1505856840827, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.652, 53.3989, 20.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606301", "mag": 1.4, "time": 1505856837357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7768, 38.66, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606300", "mag": 1.4, "time": 1505856822494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7817, 38.6647, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859863", "mag": 1.4, "time": 1505856383099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.06, 61.1692, 19.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247972", "mag": 1.74, "time": 1505856071750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4475, 42.619, 6.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859852", "mag": 1.7, "time": 1505856067799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.5801, 68.0241, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859850", "mag": 1.3, "time": 1505856055065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2245, 61.5244, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605994", "mag": 1.2, "time": 1505855929391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1076, 37.3659, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar96", "mag": 4.9, "time": 1505855599810, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5112, 15.3218, 46.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006584", "mag": 1.62, "time": 1505855343650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8445, 36.1795, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605990", "mag": 1.4, "time": 1505855191998, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3633, 38.1896, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859325", "mag": 2.3, "time": 1505854928991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9168, 61.6291, 63.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895401", "mag": 1.19, "time": 1505854923520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.721832, 38.778832, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859316", "mag": 1.9, "time": 1505854153817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2675, 59.6779, 106.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar87", "mag": 4.0, "time": 1505854089550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.0339, -20.6057, 107.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859309", "mag": 2.3, "time": 1505853828556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9751, 62.3114, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859297", "mag": 2.2, "time": 1505853447611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.476, 59.9101, 122.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859290", "mag": 3.0, "time": 1505853445730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.8511, 55.6543, 46.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859292", "mag": 3.6, "time": 1505853411703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.4847, 57.8969, 244.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895391", "mag": 2.22, "time": 1505852777640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.194167, 40.744, 31.83 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247942", "mag": 1.28, "time": 1505852539380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.439833, 42.608667, 6.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859266", "mag": 1.1, "time": 1505852431345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5411, 60.0259, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar6z", "mag": 5.2, "time": 1505852287190, "felt": 32, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7668, 37.2998, 35.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar6y", "mag": 5.2, "time": 1505852058100, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 150.8423, -5.5637, 99.91 ] } }, +{ "type": "Feature", "properties": { "id": "ak16859257", "mag": 1.1, "time": 1505851589002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.171, 64.5345, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006552", "mag": 1.38, "time": 1505851374120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.498833, 33.866667, -0.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895381", "mag": 1.43, "time": 1505851273540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.729333, 36.3275, 5.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875922", "mag": 1.3, "time": 1505850452543, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3232, 58.1622, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875921", "mag": 2.9, "time": 1505849966730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4901, 52.1476, 24.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247932", "mag": 1.44, "time": 1505849337250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.421, 42.579, 5.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875920", "mag": 1.3, "time": 1505849251567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6328, 59.921, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16858730", "mag": 1.2, "time": 1505848519202, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9009, 61.545, 3.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914226", "mag": 1.85, "time": 1505848191950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.283829, 19.389834, 2.69 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006520", "mag": 1.05, "time": 1505847392530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7695, 36.0195, 2.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006512", "mag": 1.61, "time": 1505847142180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767, 36.0195, 2.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006496", "mag": 3.65, "time": 1505846743780, "felt": 24, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.769833, 36.019333, 1.78 ] } }, +{ "type": "Feature", "properties": { "id": "hv61914191", "mag": 1.84, "time": 1505846559260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.249161, 19.378334, 1.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875918", "mag": 2.8, "time": 1505846556982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8186, 52.0581, 213.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895351", "mag": 1.32, "time": 1505846239310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104167, 37.325333, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895341", "mag": 2.76, "time": 1505846072870, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.359001, 36.981335, 8.57 ] } }, +{ "type": "Feature", "properties": { "id": "ci38006480", "mag": 3.19, "time": 1505846053020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767333, 36.019, 1.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895286", "mag": 1.33, "time": 1505844883780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.572167, 35.430667, -0.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar1y", "mag": 4.6, "time": 1505844881000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1913, -37.2281, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar20", "mag": 7.1, "time": 1505844878420, "felt": 2048, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4952, 18.5539, 51.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16858135", "mag": 1.6, "time": 1505844133798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.026, 67.0927, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766871", "mag": 1.54, "time": 1505844053390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.846, 36.179167, 2.24 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766863", "mag": 1.44, "time": 1505843932610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.768, 36.018667, 1.61 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207061", "mag": 1.72, "time": 1505843783380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.646167, 36.5445, 7.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqyy", "mag": 4.5, "time": 1505843446640, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.6161, -31.7548, 29.84 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235603", "mag": 1.89, "time": 1505842614490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.682, 37.184833, 3.97 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895271", "mag": 1.15, "time": 1505841330820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.259833, 36.753, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqxe", "mag": 4.6, "time": 1505841149400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1444, -7.5033, 158.11 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247882", "mag": 1.62, "time": 1505841064700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426167, 42.5295, 8.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895256", "mag": 1.32, "time": 1505840661480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.598167, 36.752, -0.32 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766807", "mag": 2.45, "time": 1505840210530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.766, 36.02, 1.86 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247877", "mag": 2.11, "time": 1505840158690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448833, 42.606, 3.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857619", "mag": 2.1, "time": 1505840007502, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8949, 63.2912, 101.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247872", "mag": 1.62, "time": 1505839724910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.458833, 42.607, 3.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqvm", "mag": 2.7, "time": 1505839542100, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.469, 42.6077, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895246", "mag": 1.35, "time": 1505839417090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.485667, 35.221333, 6.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875914", "mag": 1.9, "time": 1505839174472, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4077, 58.8832, 118.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766791", "mag": 1.22, "time": 1505838919650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3645, 33.1855, 10.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857617", "mag": 1.6, "time": 1505838902519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9995, 67.1881, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247852", "mag": 2.07, "time": 1505838746530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4455, 42.613833, 1.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857602", "mag": 1.1, "time": 1505837962181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5253, 60.121, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857600", "mag": 1.9, "time": 1505837841567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.1883, 53.9422, 44.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895231", "mag": 2.9, "time": 1505837729840, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833667, 37.507667, 1.79 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ary5", "mag": 2.9, "time": 1505837727410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4431, 42.6149, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247822", "mag": 2.11, "time": 1505837448870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455167, 42.616, 1.41 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqtm", "mag": 3.1, "time": 1505837140170, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4706, 42.6154, 8.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875909", "mag": 2.2, "time": 1505836969879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4914, 51.7473, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857094", "mag": 1.1, "time": 1505836528626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6176, 61.14, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875907", "mag": 1.5, "time": 1505835821169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.259, 60.5626, 90.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqsj", "mag": 2.6, "time": 1505835755980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5135, 36.2854, 4.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqsk", "mag": 2.5, "time": 1505835732030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4724, 42.6121, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857093", "mag": 2.6, "time": 1505835424846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4652, 51.7084, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqsh", "mag": 3.0, "time": 1505835309120, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4508, 42.6064, 4.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857091", "mag": 1.3, "time": 1505835219788, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0197, 66.1072, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqs7", "mag": 3.5, "time": 1505834833670, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4429, 42.6135, 8.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqwu", "mag": 2.5, "time": 1505834816200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7965, 36.4516, 6.125 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875904", "mag": 1.6, "time": 1505834730734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9141, 57.1404, 29.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766767", "mag": 1.14, "time": 1505834129200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.763833, 36.020667, 1.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16857088", "mag": 1.5, "time": 1505834082762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0429, 60.6104, 77.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqrc", "mag": 4.8, "time": 1505832575280, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 178.0168, 52.0275, 131.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875901", "mag": 1.4, "time": 1505831619582, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.534, 58.7008, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766711", "mag": 1.96, "time": 1505831425050, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.765667, 36.018833, 1.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766703", "mag": 1.15, "time": 1505831411750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.764833, 36.019667, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqqm", "mag": 4.5, "time": 1505831278930, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.4084, -31.8109, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856556", "mag": 1.3, "time": 1505831243282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7313, 59.8087, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606015", "mag": 1.3, "time": 1505831170459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8959, 38.3975, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856551", "mag": 1.9, "time": 1505831042494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6819, 63.0946, 10.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875898", "mag": 1.7, "time": 1505829915600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2865, 59.7628, 116.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856544", "mag": 1.6, "time": 1505829548541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3607, 61.0755, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895191", "mag": 1.4, "time": 1505828746900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799667, 38.815333, 3.57 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895181", "mag": 1.21, "time": 1505828239020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.96, 37.587, -0.68 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017262003", "mag": 3.12, "time": 1505828003180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.596, 19.2688, 38.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqpx", "mag": 5.1, "time": 1505827570500, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 53.9953, 27.9548, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895166", "mag": 2.1, "time": 1505827334280, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801333, 38.709667, 3.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856036", "mag": 1.5, "time": 1505826795043, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9795, 61.8762, 43.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856032", "mag": 1.6, "time": 1505825636722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1838, 62.582, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766679", "mag": 0.96, "time": 1505825558280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.804167, 33.865333, 14.31 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqp7", "mag": 4.4, "time": 1505825308910, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.7564, -2.1725, 112.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856030", "mag": 3.0, "time": 1505825190453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1381, 51.2155, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605924", "mag": 1.0, "time": 1505824470372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0787, 37.3317, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856028", "mag": 1.3, "time": 1505824029137, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5369, 59.9737, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856023", "mag": 1.7, "time": 1505823902403, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0502, 66.1255, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856015", "mag": 2.2, "time": 1505823557445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.013, 66.1279, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856014", "mag": 1.1, "time": 1505823327376, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3053, 64.2153, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856012", "mag": 1.2, "time": 1505823307912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2687, 63.3135, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16856011", "mag": 2.3, "time": 1505823122176, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.4683, 54.3778, 12.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895111", "mag": 1.33, "time": 1505822407460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809833, 38.802, 3.64 ] } }, +{ "type": "Feature", "properties": { "id": "nm60207021", "mag": 3.8, "time": 1505821648710, "felt": 1485, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.909833, 38.423833, 11.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855511", "mag": 1.6, "time": 1505821526245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7265, 65.4529, 0.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875885", "mag": 2.4, "time": 1505821066912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.3853, 52.1246, 33.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895086", "mag": 1.5, "time": 1505820901510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811333, 38.8115, 2.81 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605917", "mag": 1.0, "time": 1505819713127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0296, 37.3121, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766663", "mag": 1.51, "time": 1505819310540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.197333, 34.085167, 9.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875884", "mag": 2.8, "time": 1505819249763, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.074, 52.1917, 55.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqlv", "mag": 4.4, "time": 1505818453350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.3742, -31.7199, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855501", "mag": 3.4, "time": 1505818346973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7971, 56.0595, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855500", "mag": 2.9, "time": 1505817985167, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.3494, 51.1124, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895061", "mag": 1.78, "time": 1505817758790, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.178833, 36.5795, 5.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72895056", "mag": 2.12, "time": 1505817518530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177333, 36.582833, 3.53 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247712", "mag": 1.36, "time": 1505817061570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.018167, 44.796, 9.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875881", "mag": 1.6, "time": 1505816115601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2511, 57.9599, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855499", "mag": 1.3, "time": 1505815877713, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8298, 61.5636, 56.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855498", "mag": 2.3, "time": 1505815751742, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.7444, 52.8226, 62.9 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017262002", "mag": 3.05, "time": 1505815582890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.7015, 19.0933, 25.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875878", "mag": 2.3, "time": 1505815056638, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6299, 51.8122, 76.9 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017262001", "mag": 3.03, "time": 1505814906490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.723, 19.2006, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqkv", "mag": 3.1, "time": 1505814230020, "felt": 19, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8094, 35.9883, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605909", "mag": 2.0, "time": 1505812861822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0799, 37.3335, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766575", "mag": 1.76, "time": 1505810653690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.489167, 32.91, 3.69 ] } }, +{ "type": "Feature", "properties": { "id": "hv61913891", "mag": 1.46, "time": 1505809604540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2385, 19.383667, 3.069 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awmg", "mag": 4.7, "time": 1505809455110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.925, -10.7783, 56.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asy2", "mag": 3.0, "time": 1505809273830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.747, 56.8207, 54.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16855496", "mag": 1.1, "time": 1505809181592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6103, 61.758, 29.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766567", "mag": 2.63, "time": 1505808839560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.053, 33.079333, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16854995", "mag": 1.3, "time": 1505808496915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.3955, 61.6352, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awn2", "mag": 4.8, "time": 1505807930800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8135, 15.201, 45.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqji", "mag": 5.5, "time": 1505807596650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0446, 15.1414, 38.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875872", "mag": 2.1, "time": 1505807457953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.2219, 51.3226, 34.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894976", "mag": 1.17, "time": 1505806773770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792335, 38.809666, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766551", "mag": 1.92, "time": 1505806527540, "felt": 28, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.473833, 34.086, 9.44 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605996", "mag": 1.0, "time": 1505804591858, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.786, 38.6641, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqiw", "mag": 4.9, "time": 1505804582700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5541, 15.6968, 62.85 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894951", "mag": 2.38, "time": 1505803512250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.804667, 38.658333, -1.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqim", "mag": 4.9, "time": 1505803059440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.5306, -11.0433, 31.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16858212", "mag": 1.9, "time": 1505803043301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8602, 60.3455, 116.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16854482", "mag": 1.5, "time": 1505802327547, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6967, 63.0934, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766535", "mag": 3.61, "time": 1505802044370, "felt": 9002, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.475667, 34.086667, 10.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766527", "mag": 1.21, "time": 1505801932130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.774833, 34.169667, 4.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875868", "mag": 1.8, "time": 1505801903580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.8368, 51.4427, 38.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16854479", "mag": 1.1, "time": 1505801695119, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7029, 61.7782, 46.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875866", "mag": 1.4, "time": 1505801525136, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4992, 53.7654, 79.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61331061", "mag": 2.06, "time": 1505797453620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.194667, 46.453167, 40.56 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766503", "mag": 1.67, "time": 1505797300060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.486333, 32.916167, 3.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16854474", "mag": 1.9, "time": 1505797038222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0668, 60.2297, 58.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16853980", "mag": 1.1, "time": 1505796127101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3206, 62.3117, 31.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330981", "mag": 1.13, "time": 1505795983940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.682, 46.13, 13.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16853978", "mag": 1.3, "time": 1505795947149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1655, 62.2572, 56.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605993", "mag": 1.1, "time": 1505795780711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1363, 37.4312, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894911", "mag": 1.31, "time": 1505795498990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7385, 38.757333, 2.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875861", "mag": 1.1, "time": 1505795298437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.2708, 60.1059, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017262000", "mag": 3.54, "time": 1505794257010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.6603, 17.4281, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875860", "mag": 2.4, "time": 1505793870359, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.7298, 54.4321, 27.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875859", "mag": 1.7, "time": 1505793327250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1948, 59.7387, 99.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16853975", "mag": 1.6, "time": 1505792759926, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4718, 53.5765, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894906", "mag": 1.57, "time": 1505792076170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7735, 38.656833, -0.04 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766479", "mag": 1.69, "time": 1505792016930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.486333, 32.9165, 3.74 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766487", "mag": 1.34, "time": 1505791878570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.484833, 32.910667, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766471", "mag": 1.85, "time": 1505791676460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4825, 32.916333, 3.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894886", "mag": 1.72, "time": 1505789062930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840667, 37.569167, 0.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16853477", "mag": 1.0, "time": 1505787688094, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.1719, 66.2583, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875853", "mag": 1.7, "time": 1505787600292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3919, 59.6211, 106.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16875852", "mag": 1.1, "time": 1505786552106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5941, 61.448, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256309", "mag": 1.39, "time": 1505786055440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526833, 46.8665, 12.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16853476", "mag": 1.1, "time": 1505785818136, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8501, 59.9025, 11.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852984", "mag": 1.1, "time": 1505784566645, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6396, 62.818, 76.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqg7", "mag": 4.1, "time": 1505784206570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4373, 15.5332, 46.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247557", "mag": 1.04, "time": 1505784051560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.714, 41.274333, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247547", "mag": 1.47, "time": 1505783841160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.707167, 41.273, 13.52 ] } }, +{ "type": "Feature", "properties": { "id": "hv61913526", "mag": 1.76, "time": 1505783827370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.457833, 19.1825, 36.457 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247542", "mag": 2.67, "time": 1505783530250, "felt": 53, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.715333, 41.2735, 12.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852978", "mag": 2.3, "time": 1505783525625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6267, 63.2162, 130.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852863", "mag": 2.5, "time": 1505781518245, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0202, 60.2096, 73.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894856", "mag": 0.99, "time": 1505781008310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827331, 38.841667, 1.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852858", "mag": 1.1, "time": 1505780482987, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8182, 61.2069, 27.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894851", "mag": 1.36, "time": 1505780335820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7775, 38.816, 2.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852857", "mag": 1.6, "time": 1505780229532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4, 60.0341, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852855", "mag": 1.5, "time": 1505779887968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8629, 61.2326, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766415", "mag": 1.9, "time": 1505779853200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.489333, 32.905167, 5.38 ] } }, +{ "type": "Feature", "properties": { "id": "ci37165308", "mag": 1.73, "time": 1505779842240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.488, 32.911333, 4.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852849", "mag": 1.7, "time": 1505779013710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9564, 61.0148, 51.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852847", "mag": 1.4, "time": 1505778755901, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7113, 59.8038, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852839", "mag": 1.8, "time": 1505778454412, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4318, 51.6727, 27.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852350", "mag": 2.0, "time": 1505777928661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5948, 59.4167, 88.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766399", "mag": 1.34, "time": 1505777787740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.855667, 36.109333, 3.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905714", "mag": 1.0, "time": 1505777724697, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9455, 64.7711, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766391", "mag": 0.98, "time": 1505777305130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.852333, 36.108833, 4.09 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766383", "mag": 1.52, "time": 1505777027970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.673833, 35.0495, -0.79 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605852", "mag": 1.0, "time": 1505777021809, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.5662, 37.4193, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852327", "mag": 1.3, "time": 1505776382741, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3544, 64.9878, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894836", "mag": 1.11, "time": 1505776268170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826164, 38.803165, -0.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852320", "mag": 2.2, "time": 1505774485259, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6811, 59.3157, 121.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330861", "mag": 1.73, "time": 1505774113220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.3385, 46.609, -0.26 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awm5", "mag": 4.3, "time": 1505773697460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.1858, 46.1638, 102.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqck", "mag": 3.9, "time": 1505773335560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2122, -24.1635, 187.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894811", "mag": 1.66, "time": 1505773221810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814667, 38.797333, 2.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aurg", "mag": 3.7, "time": 1505773151260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.33, 54.9516, 64.12 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851830", "mag": 1.1, "time": 1505773086095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3969, 60.1593, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766351", "mag": 2.36, "time": 1505772988180, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.856, 36.108833, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqc4", "mag": 4.3, "time": 1505772810860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7554, 15.1768, 26.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905709", "mag": 1.9, "time": 1505772157260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3386, 60.1473, 141.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894806", "mag": 1.27, "time": 1505771972190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.114667, 39.267, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905707", "mag": 2.2, "time": 1505771817995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.2489, 54.4702, 80.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894796", "mag": 2.0, "time": 1505771179880, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.128, 39.249833, 8.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851826", "mag": 1.4, "time": 1505770110538, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6751, 61.3285, 49.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766303", "mag": 1.45, "time": 1505769920400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605, 32.830833, 11.11 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766295", "mag": 1.71, "time": 1505769761910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.604667, 32.8245, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766287", "mag": 2.17, "time": 1505769684730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.606, 32.822667, 12.54 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017261003", "mag": 2.77, "time": 1505769603950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.496, 19.0255, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851820", "mag": 1.8, "time": 1505768968360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5226, 60.8929, 114.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851818", "mag": 1.8, "time": 1505768967170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6844, 60.3627, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61913136", "mag": 2.13, "time": 1505768803830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.602167, 19.474, 2.169 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766271", "mag": 1.2, "time": 1505768642090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.024833, 34.482, 7.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766255", "mag": 1.05, "time": 1505767837000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.472833, 34.117167, 12.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq9e", "mag": 4.0, "time": 1505767497800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.084, -30.3511, 16.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851331", "mag": 3.1, "time": 1505767490141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4781, 55.9976, 142.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851328", "mag": 1.1, "time": 1505767149947, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8292, 66.9662, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766231", "mag": 0.99, "time": 1505765477990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.581833, 34.027833, 15.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16851294", "mag": 1.2, "time": 1505764980957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5833, 61.5338, 35.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330806", "mag": 1.54, "time": 1505764971380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.54, 46.3245, -0.47 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605816", "mag": 1.4, "time": 1505764963953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1157, 37.3834, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605865", "mag": 1.1, "time": 1505764655295, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1142, 38.3008, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894761", "mag": 1.86, "time": 1505764383660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.543667, 3.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq7z", "mag": 4.9, "time": 1505764292580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6427, 15.3134, 31.07 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766191", "mag": 0.97, "time": 1505763617780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.450667, 34.371167, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq71", "mag": 2.7, "time": 1505763144440, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4497, 42.6436, 9.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766183", "mag": 1.36, "time": 1505762589870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1565, 35.016333, -1.02 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256274", "mag": 1.49, "time": 1505762568370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536167, 46.875, 12.74 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605809", "mag": 1.3, "time": 1505762272549, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6987, 37.801, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850796", "mag": 1.9, "time": 1505761948762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4688, 62.7498, 82.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605855", "mag": 1.3, "time": 1505761056131, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1168, 37.3993, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766175", "mag": 1.17, "time": 1505760720620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9445, 34.324333, -1.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894741", "mag": 1.25, "time": 1505760426930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8455, 38.818, 2.33 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247432", "mag": 1.19, "time": 1505760132640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.613667, 40.6905, 8.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850168", "mag": 2.1, "time": 1505759367705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.838, 63.3882, 112.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766167", "mag": 3.51, "time": 1505759058190, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.656502, 31.030666, 5.16 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605797", "mag": 1.7, "time": 1505758994627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1288, 37.4056, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850165", "mag": 1.4, "time": 1505758989527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4112, 62.8303, 102.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905692", "mag": 1.1, "time": 1505758393925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8004, 59.9261, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37766159", "mag": 1.12, "time": 1505757568700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.635, 33.146167, 7.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894726", "mag": 0.98, "time": 1505757550510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.418667, 37.284667, 6.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905691", "mag": 1.4, "time": 1505757310878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9735, 60.9138, 37.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850161", "mag": 1.0, "time": 1505757088256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0018, 62.0064, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905689", "mag": 1.2, "time": 1505757035772, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8926, 61.2214, 62.6 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017261002", "mag": 2.83, "time": 1505756997070, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5011, 19.09, 29.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq4m", "mag": 4.3, "time": 1505756979200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2066, 15.6332, 53.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16849685", "mag": 1.4, "time": 1505755775657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6398, 58.3116, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605793", "mag": 2.1, "time": 1505755747277, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0899, 37.3433, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq3v", "mag": 4.1, "time": 1505755544410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8487, 15.9949, 55.32 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247422", "mag": 3.28, "time": 1505755278460, "felt": 662, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.609167, 40.700833, 10.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16849675", "mag": 1.0, "time": 1505754649061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0364, 64.4942, 19.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894701", "mag": 1.54, "time": 1505754599760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.869, 36.443167, 15.01 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235573", "mag": 2.16, "time": 1505754215540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.819333, 37.204, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894696", "mag": 1.11, "time": 1505753360080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.779167, 38.816834, 1.68 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894681", "mag": 2.71, "time": 1505753271320, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.776833, 38.818833, 1.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq1c", "mag": 4.3, "time": 1505753232560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 19.9297, 40.1065, 16.32 ] } }, +{ "type": "Feature", "properties": { "id": "hv61912961", "mag": 1.88, "time": 1505752987740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.220333, 19.426333, 30.266 ] } }, +{ "type": "Feature", "properties": { "id": "ak16849646", "mag": 1.9, "time": 1505752045532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8846, 59.8511, 56.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905682", "mag": 2.1, "time": 1505751893024, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9783, 51.5536, 48.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905681", "mag": 1.4, "time": 1505751513529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5148, 59.7419, 92.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq9y", "mag": 3.0, "time": 1505751460390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.173, 52.0554, 121.43 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247412", "mag": 1.56, "time": 1505751055750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.8355, 39.743833, 1.73 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605780", "mag": 1.0, "time": 1505750947574, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0248, 38.8721, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894651", "mag": 1.22, "time": 1505750864240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8995, 37.521833, -0.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apzi", "mag": 4.5, "time": 1505750058850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 77.1478, 40.9769, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905679", "mag": 1.0, "time": 1505749750880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3078, 62.9046, 85.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16849178", "mag": 1.3, "time": 1505749184927, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5131, 62.8898, 90.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apyu", "mag": 4.3, "time": 1505748920580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.1652, -31.8057, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16849177", "mag": 3.5, "time": 1505748318594, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7225, 51.7093, 41.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894631", "mag": 1.04, "time": 1505748063110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.787498, 38.798832, -0.32 ] } }, +{ "type": "Feature", "properties": { "id": "hv61912826", "mag": 1.1, "time": 1505748041950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.431667, 19.343833, 9.245 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605847", "mag": 1.0, "time": 1505747832897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1332, 37.421, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apya", "mag": 4.7, "time": 1505747639290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5858, 15.1833, 36.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16848711", "mag": 1.3, "time": 1505747504037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7568, 59.8878, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905675", "mag": 2.1, "time": 1505746990876, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.9195, 57.1996, 98.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894616", "mag": 2.19, "time": 1505746390770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.149, 40.217, 6.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16848704", "mag": 2.3, "time": 1505746286875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7477, 53.6076, 54.8 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017261001", "mag": 2.61, "time": 1505746245880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.7745, 18.8611, 60.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16848698", "mag": 2.1, "time": 1505746048831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6658, 61.6841, 99.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq9s", "mag": 4.1, "time": 1505745176040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3907, 51.552, 15.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apxn", "mag": 4.9, "time": 1505745090220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.9092, -17.3471, 45.41 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apxj", "mag": 4.3, "time": 1505744936080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.2186, -31.8431, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605771", "mag": 1.4, "time": 1505744651408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1135, 37.3693, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apx5", "mag": 5.6, "time": 1505744352870, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5576, 15.2537, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905668", "mag": 2.5, "time": 1505742582241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8697, 55.3906, 161.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apwd", "mag": 5.8, "time": 1505742416590, "felt": 129, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.147, -31.82, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apz2", "mag": 2.7, "time": 1505742004420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.8389, 9.05 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605759", "mag": 1.7, "time": 1505741994692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.124, 38.2695, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apw7", "mag": 4.6, "time": 1505741142110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.9613, 54.8175, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905665", "mag": 1.6, "time": 1505741113018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6727, 58.1121, 86.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905664", "mag": 1.1, "time": 1505740639920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4494, 63.2584, 114.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894591", "mag": 2.07, "time": 1505739410930, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0555, 37.236667, 7.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16848204", "mag": 1.1, "time": 1505739204689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9796, 60.2252, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256214", "mag": 2.14, "time": 1505739119730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5825, 46.902333, 13.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894586", "mag": 2.01, "time": 1505738526550, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.378, 36.3415, 3.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16847753", "mag": 1.3, "time": 1505737613815, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1555, 60.2089, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apvj", "mag": 5.0, "time": 1505736665230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9085, -30.4189, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apva", "mag": 4.9, "time": 1505736421580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9784, 16.2017, 42.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894571", "mag": 1.07, "time": 1505736271580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784332, 38.838333, 0.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894556", "mag": 0.97, "time": 1505736021180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818001, 38.813499, 2.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16847743", "mag": 2.1, "time": 1505735884769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3712, 59.8705, 71.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16847742", "mag": 1.0, "time": 1505735834346, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8742, 61.715, 45.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905659", "mag": 1.3, "time": 1505735311381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8392, 63.0532, 129.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256209", "mag": 1.05, "time": 1505734177450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.518, 46.853667, 12.03 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256199", "mag": 1.81, "time": 1505733980660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.487833, 46.873667, 12.76 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894526", "mag": 1.16, "time": 1505733885060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8005, 38.805833, 2.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16847290", "mag": 1.5, "time": 1505733696824, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5693, 64.3804, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894516", "mag": 1.04, "time": 1505733506920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814163, 38.801998, 2.32 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aur7", "mag": 3.1, "time": 1505733485810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.7034, 52.2855, 34.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16847284", "mag": 1.4, "time": 1505732610976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6388, 61.2241, 50.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765935", "mag": 1.95, "time": 1505732049210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924667, 34.9205, 5.15 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765927", "mag": 1.35, "time": 1505731803760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3425, 35.462, 3.59 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894501", "mag": 1.64, "time": 1505731051670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.950333, 41.046833, 9.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905652", "mag": 2.0, "time": 1505729940504, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5491, 54.9912, 67.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846821", "mag": 3.6, "time": 1505729929794, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5426, 63.5414, 107.9 ] } }, +{ "type": "Feature", "properties": { "id": "hv61912566", "mag": 1.91, "time": 1505728760570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.608167, 19.4375, 2.822 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846819", "mag": 1.2, "time": 1505728039731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.773, 63.2917, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017261000", "mag": 2.03, "time": 1505727803000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2451, 18.1321, 32.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765911", "mag": 1.15, "time": 1505727350640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.034667, 34.574333, 8.17 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894496", "mag": 1.16, "time": 1505727178720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.815002, 38.806999, 3.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846817", "mag": 1.3, "time": 1505726686491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5195, 61.7191, 48.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894491", "mag": 1.99, "time": 1505726671730, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177167, 36.580167, 5.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846815", "mag": 1.4, "time": 1505726488235, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0878, 61.0048, 19.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846813", "mag": 1.3, "time": 1505726256030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0016, 62.7051, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846811", "mag": 1.2, "time": 1505725663332, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7382, 59.7002, 39.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605720", "mag": 1.9, "time": 1505725520932, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0964, 37.3646, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905644", "mag": 1.4, "time": 1505724853854, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3038, 57.9653, 66.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894486", "mag": 1.37, "time": 1505724683560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.892833, 39.342333, 17.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905643", "mag": 1.3, "time": 1505724218199, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9106, 60.4014, 74.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846810", "mag": 1.2, "time": 1505724188489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4141, 63.186, 102.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846807", "mag": 2.8, "time": 1505723956077, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0917, 53.5664, 54.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846803", "mag": 1.3, "time": 1505723952516, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.705, 62.5617, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846799", "mag": 1.9, "time": 1505723888518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5274, 59.9845, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846358", "mag": 1.3, "time": 1505723457765, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9157, 63.5359, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894456", "mag": 1.22, "time": 1505721765430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157, 36.5615, 3.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905637", "mag": 1.8, "time": 1505721695198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5368, 53.884, 45.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846355", "mag": 1.3, "time": 1505721374282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8253, 64.8958, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846352", "mag": 1.3, "time": 1505721334563, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8755, 64.8906, 14.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16846351", "mag": 1.4, "time": 1505720984307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6407, 59.7861, 56.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905633", "mag": 1.2, "time": 1505720070282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2909, 61.9803, 75.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905632", "mag": 1.3, "time": 1505720064076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7225, 60.6284, 40.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765871", "mag": 0.96, "time": 1505719770880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790667, 33.495, 4.99 ] } }, +{ "type": "Feature", "properties": { "id": "hv61912506", "mag": 1.73, "time": 1505719651510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.218167, 19.4285, 29.836 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894436", "mag": 1.05, "time": 1505719249700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0175, 37.221333, 9.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894411", "mag": 1.53, "time": 1505718670360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827167, 38.8125, 1.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845911", "mag": 1.3, "time": 1505718573027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.2238, 64.9935, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894406", "mag": 1.22, "time": 1505718182950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.180167, 36.585333, 5.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845908", "mag": 1.1, "time": 1505717899889, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0029, 61.1046, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845905", "mag": 2.8, "time": 1505717405495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0451, 53.5595, 58.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256179", "mag": 2.84, "time": 1505717382030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.576167, 48.519, 10.89 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765839", "mag": 1.11, "time": 1505716385670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6075, 32.833667, 11.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905628", "mag": 1.2, "time": 1505716158469, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5838, 63.1688, 113.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905627", "mag": 1.2, "time": 1505715377323, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6661, 60.0063, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845901", "mag": 1.6, "time": 1505714845138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4484, 61.3659, 46.1 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256174", "mag": 1.81, "time": 1505714255290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.9025, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845458", "mag": 1.9, "time": 1505713543034, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4235, 61.487, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845453", "mag": 3.2, "time": 1505712925929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0259, 53.5803, 50.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apru", "mag": 5.7, "time": 1505712483490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -12.7162, -18.5262, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605697", "mag": 1.0, "time": 1505711755570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9167, 38.4153, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845450", "mag": 2.7, "time": 1505711653057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4353, 51.7384, 88.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845451", "mag": 1.4, "time": 1505711579811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0383, 61.8395, 66.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894331", "mag": 2.68, "time": 1505711256010, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.213167, 41.036, 15.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apre", "mag": 3.6, "time": 1505710149350, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457, 42.6072, 5.27 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247312", "mag": 1.94, "time": 1505709538260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.024833, 44.791, 10.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845447", "mag": 1.6, "time": 1505709232112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.234, 53.4469, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765759", "mag": 1.11, "time": 1505708432940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797, 33.496667, 4.85 ] } }, +{ "type": "Feature", "properties": { "id": "nm60206976", "mag": 2.5, "time": 1505708310780, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.764167, 36.103833, 7.78 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894281", "mag": 1.78, "time": 1505708211260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.583, 36.899833, 6.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845444", "mag": 1.6, "time": 1505708018964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0127, 61.0975, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845440", "mag": 1.7, "time": 1505706867753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5639, 63.255, 126.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845438", "mag": 3.0, "time": 1505706621950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0175, 55.7675, 33.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765751", "mag": 1.44, "time": 1505706060150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797, 33.6865, 17.69 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247287", "mag": 2.42, "time": 1505704855680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.429167, 42.593667, 7.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845431", "mag": 2.4, "time": 1505704484262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8583, 58.216, 42.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845430", "mag": 1.1, "time": 1505704418776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2714, 58.1899, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256144", "mag": 1.01, "time": 1505704182270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.8725, 13.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905611", "mag": 1.0, "time": 1505704113848, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9313, 61.6519, 67.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894211", "mag": 1.84, "time": 1505703109320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.735167, 37.656, 5.91 ] } }, +{ "type": "Feature", "properties": { "id": "ak16845426", "mag": 1.6, "time": 1505702885799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6172, 61.5636, 14.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765687", "mag": 1.59, "time": 1505702779150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.919833, 33.9785, 4.46 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605680", "mag": 1.4, "time": 1505702728608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.713, 38.8287, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844993", "mag": 1.3, "time": 1505701093513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5107, 62.1708, 21.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awky", "mag": 4.1, "time": 1505700898950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3513, 15.0304, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765671", "mag": 1.43, "time": 1505700367060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.172167, 34.033667, 5.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905606", "mag": 1.2, "time": 1505699859087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8715, 60.6663, 44.3 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330596", "mag": 1.49, "time": 1505699530930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.847333, 47.759167, 17.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apq2", "mag": 4.2, "time": 1505699407130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2351, 15.3068, 42.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awly", "mag": 4.2, "time": 1505698782750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1304, 14.9812, 38.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905605", "mag": 1.0, "time": 1505698554304, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5172, 62.1736, 24.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894176", "mag": 2.03, "time": 1505698095820, "felt": 171, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.295333, 37.912, 2.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000appq", "mag": 4.5, "time": 1505697812820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.3367, 53.381, 85.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765639", "mag": 1.01, "time": 1505697641450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7125, 33.986833, 15.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000appj", "mag": 4.2, "time": 1505697430690, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.5275, -17.5255, 167.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844988", "mag": 1.0, "time": 1505697245375, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1193, 62.3401, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765631", "mag": 1.87, "time": 1505697080810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.650333, 36.996833, -0.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16905602", "mag": 1.4, "time": 1505696884087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1499, 61.9617, 114.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844556", "mag": 1.5, "time": 1505696691069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.8744, 60.2484, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000azbk", "mag": 4.0, "time": 1505696468620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5206, 14.824, 18.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844553", "mag": 1.3, "time": 1505696463448, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4081, 64.6136, 20.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894161", "mag": 1.21, "time": 1505695849630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.818833, 37.41, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "us2000awku", "mag": 4.1, "time": 1505694807240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.306, 19.0286, 202.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000app7", "mag": 4.4, "time": 1505694748030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.3564, -8.1346, 41.72 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605668", "mag": 1.2, "time": 1505694738920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.3624, 37.0509, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844544", "mag": 2.0, "time": 1505694295643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7281, 60.3555, 46.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844543", "mag": 1.8, "time": 1505694278381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7896, 59.8626, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894151", "mag": 1.42, "time": 1505693902060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.912833, 37.621667, 2.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844541", "mag": 1.3, "time": 1505693551555, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.791, 61.7452, 48.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256109", "mag": 1.41, "time": 1505690846740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522, 46.869667, 12.91 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765583", "mag": 1.3, "time": 1505690496480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.673167, 35.042833, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873959", "mag": 1.1, "time": 1505690288149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4144, 67.2216, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844094", "mag": 1.9, "time": 1505690276630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.3972, 53.7854, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apnm", "mag": 4.9, "time": 1505689940400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.5672, -4.6379, 588.19 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256099", "mag": 2.34, "time": 1505689339390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5195, 46.899167, 12.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844091", "mag": 1.5, "time": 1505688162418, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5592, 60.9727, 72.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256084", "mag": 1.49, "time": 1505688150190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.8165, 46.9305, 13.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894131", "mag": 0.95, "time": 1505687822870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.026667, 36.453333, 2.98 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894126", "mag": 1.46, "time": 1505687740270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.618333, 36.970833, 5.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844087", "mag": 1.3, "time": 1505686236328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3499, 60.4807, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844084", "mag": 1.7, "time": 1505686047172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7406, 64.6981, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16844079", "mag": 2.1, "time": 1505685489298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3304, 60.4706, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330461", "mag": 2.46, "time": 1505684983130, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.725333, 47.439333, 22.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873952", "mag": 2.2, "time": 1505684866449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.006, 52.386, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894116", "mag": 1.14, "time": 1505684450170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.571833, 37.947167, 8.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873951", "mag": 1.3, "time": 1505684432066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6357, 60.5724, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16843656", "mag": 1.6, "time": 1505683789980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1167, 59.7703, 41.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16843652", "mag": 1.6, "time": 1505683291823, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4894, 61.5289, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894101", "mag": 1.41, "time": 1505682978360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834, 37.496, 1.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16843651", "mag": 2.6, "time": 1505682712646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4711, 51.686, 75.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894096", "mag": 0.99, "time": 1505682599530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816167, 37.455833, 1.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16843650", "mag": 1.2, "time": 1505682068077, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5842, 61.7746, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894086", "mag": 1.35, "time": 1505681812610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.973667, 36.395167, 4.69 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894081", "mag": 1.91, "time": 1505681477080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809167, 38.797667, 3.52 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894076", "mag": 1.47, "time": 1505681470510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810167, 38.799167, 3.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873946", "mag": 1.4, "time": 1505680958230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1812, 62.2538, 76.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apkx", "mag": 4.9, "time": 1505680147260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9501, -18.9829, 129.26 ] } }, +{ "type": "Feature", "properties": { "id": "ak16843225", "mag": 1.3, "time": 1505680062920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5209, 60.1956, 82.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765519", "mag": 1.42, "time": 1505680024130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.293, 35.488167, 2.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873944", "mag": 1.3, "time": 1505679233862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2975, 62.163, 79.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873943", "mag": 1.8, "time": 1505678992249, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8219, 51.8825, 86.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330431", "mag": 1.0, "time": 1505678333060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.5365, 47.603667, 19.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765487", "mag": 1.12, "time": 1505676865320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.608667, 32.830167, 11.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apke", "mag": 4.1, "time": 1505676865110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.5905, 12.0757, 53.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apkd", "mag": 3.9, "time": 1505676791370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.2379, -31.7388, 121.68 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765479", "mag": 1.54, "time": 1505676576290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605333, 32.8245, 11.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apkc", "mag": 2.5, "time": 1505676527950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4244, 42.5958, 5.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605653", "mag": 1.3, "time": 1505676457309, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.12, 38.2855, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894061", "mag": 1.21, "time": 1505675373140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.059667, 36.477833, 6.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apk4", "mag": 3.1, "time": 1505674381070, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.9818, 35.7788, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16842798", "mag": 1.4, "time": 1505672288384, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7121, 63.5719, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16842797", "mag": 2.7, "time": 1505669173773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4976, 51.6544, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80256039", "mag": 1.09, "time": 1505668834370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.6775, 46.891833, 15.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873938", "mag": 1.2, "time": 1505668625975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5592, 62.857, 82.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765423", "mag": 1.4, "time": 1505668324590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.831333, 32.775833, 2.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16842795", "mag": 1.1, "time": 1505668022720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4003, 64.8531, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72894026", "mag": 1.3, "time": 1505667983860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.734667, 38.788167, 1.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873936", "mag": 1.6, "time": 1505667107903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0584, 57.21, 33.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765415", "mag": 1.52, "time": 1505666643390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.833167, 32.781833, 2.39 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765407", "mag": 0.98, "time": 1505666358680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.273667, 33.981333, 6.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5v", "mag": 4.3, "time": 1505665820280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.2591, 0.908, 157.83 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017260000", "mag": 2.31, "time": 1505665148110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9698, 19.0821, 23.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apj3", "mag": 2.6, "time": 1505664664460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4059, 42.5497, 11.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apj0", "mag": 2.7, "time": 1505663998840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4107, 42.5429, 8.67 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330391", "mag": 1.11, "time": 1505663462920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.04, 46.880167, 6.02 ] } }, +{ "type": "Feature", "properties": { "id": "uu60247022", "mag": 1.06, "time": 1505663122580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.025833, 44.790333, 9.98 ] } }, +{ "type": "Feature", "properties": { "id": "nn00606540", "mag": 1.3, "time": 1505663040033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0921, 41.885, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873932", "mag": 1.9, "time": 1505662296127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8489, 51.9624, 111.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5n", "mag": 4.5, "time": 1505662282900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.7612, 44.1688, 33.57 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255969", "mag": 2.04, "time": 1505662108810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.516, 46.881333, 14.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5p", "mag": 4.5, "time": 1505662091100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.0118, -6.3464, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873931", "mag": 1.4, "time": 1505662034661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.362, 63.1318, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at68", "mag": 4.3, "time": 1505661360280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.9733, -6.4551, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841969", "mag": 1.1, "time": 1505661169528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6029, 66.5697, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255949", "mag": 1.49, "time": 1505659897070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.519, 46.855, 14.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apij", "mag": 5.4, "time": 1505659803240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.6428, -16.6386, 30.39 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5x", "mag": 5.0, "time": 1505659691430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.0846, 12.809, 27.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765367", "mag": 1.03, "time": 1505659458990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.19, 33.2585, 9.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893976", "mag": 1.19, "time": 1505659223910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825, 37.453, 1.57 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5m", "mag": 4.9, "time": 1505658989080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.1591, -6.3567, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apie", "mag": 4.5, "time": 1505658574670, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 24.0015, 39.2721, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841552", "mag": 1.3, "time": 1505658549717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9309, 62.6606, 59.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apif", "mag": 5.7, "time": 1505658367620, "felt": 0, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 148.8708, -6.3113, 18.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5l", "mag": 4.3, "time": 1505658365190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -17.9505, 64.5019, 9.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aza1", "mag": 4.2, "time": 1505658191320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5959, 15.2169, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at6b", "mag": 4.6, "time": 1505658184020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -17.6137, 64.4904, 8.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841550", "mag": 1.4, "time": 1505657865000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8499, 59.8804, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765335", "mag": 1.11, "time": 1505657294840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.367, 33.357167, 9.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841549", "mag": 1.4, "time": 1505657219284, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.0876, 69.5184, 4.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893941", "mag": 1.51, "time": 1505657160730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818333, 38.818167, 2.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893946", "mag": 1.02, "time": 1505657152440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817001, 38.8185, 2.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873926", "mag": 1.7, "time": 1505656923604, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8082, 60.1773, 106.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873925", "mag": 1.9, "time": 1505656654419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6293, 59.5728, 120.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765327", "mag": 2.88, "time": 1505656629430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.882333, 31.6215, 9.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5k", "mag": 4.1, "time": 1505656609750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.5305, 1.7746, 37.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893936", "mag": 0.98, "time": 1505656502420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125667, 36.566167, 8.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5i", "mag": 4.4, "time": 1505655648380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.9394, -17.3298, 553.92 ] } }, +{ "type": "Feature", "properties": { "id": "se60044613", "mag": 2.03, "time": 1505655579030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -85.053333, 35.561333, 15.47 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765311", "mag": 1.07, "time": 1505655296260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.090333, 33.473833, 14.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841547", "mag": 1.9, "time": 1505655282227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7794, 63.9496, 114.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5r", "mag": 4.9, "time": 1505655030310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.7611, -21.01, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as44", "mag": 2.6, "time": 1505654924870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7236, 51.4933, 34.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841538", "mag": 2.3, "time": 1505654819006, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6722, 62.9044, 66.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765303", "mag": 0.97, "time": 1505654141860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.922167, 33.9755, 4.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aphx", "mag": 4.0, "time": 1505653928680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4533, 15.5042, 7.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841537", "mag": 1.0, "time": 1505653531820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3466, 61.07, 12.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893916", "mag": 0.99, "time": 1505653446980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.479333, 0.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841536", "mag": 1.4, "time": 1505653266021, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6794, 67.9633, 14.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841136", "mag": 1.5, "time": 1505652267061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.9646, 53.8971, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605626", "mag": 1.0, "time": 1505652081143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2815, 36.537, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841133", "mag": 1.8, "time": 1505651930739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7652, 62.1126, 23.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841130", "mag": 2.2, "time": 1505651632523, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.454, 59.2923, 97.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765271", "mag": 1.39, "time": 1505650827610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.021167, 33.921, 2.44 ] } }, +{ "type": "Feature", "properties": { "id": "hv61911226", "mag": 1.91, "time": 1505650411260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.478668, 19.212334, 38.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16841124", "mag": 2.1, "time": 1505649687852, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7865, 65.3345, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893881", "mag": 1.23, "time": 1505648682040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.543833, 37.339667, 10.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840722", "mag": 3.2, "time": 1505648575230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7144, 57.2975, 42.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5g", "mag": 4.3, "time": 1505647937400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.6171, -11.7459, 251.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873911", "mag": 2.6, "time": 1505647578270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.7891, 66.3882, 37.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873910", "mag": 2.0, "time": 1505647575716, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.55, 57.7487, 89.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873909", "mag": 2.8, "time": 1505647412246, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.7412, 66.3682, 34.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840719", "mag": 2.1, "time": 1505647228188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4607, 60.5815, 14.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765239", "mag": 1.03, "time": 1505646849520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.920667, 33.972167, 5.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aph6", "mag": 4.2, "time": 1505646653440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3399, -21.9058, 192.78 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aph5", "mag": 4.7, "time": 1505646260660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.0437, 3.6252, 68.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873907", "mag": 2.2, "time": 1505645846935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4823, 51.6608, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873906", "mag": 1.2, "time": 1505645773090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.3827, 53.8702, 12.1 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330311", "mag": 1.94, "time": 1505644617240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041167, 46.879167, 6.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840715", "mag": 1.5, "time": 1505644280463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.605, 61.6723, 29.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765223", "mag": 1.02, "time": 1505644185880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.465667, 34.376833, 9.74 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765215", "mag": 1.28, "time": 1505644151980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.358167, 33.415667, 12.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5e", "mag": 4.5, "time": 1505644031790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.0628, 12.7773, 33.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873903", "mag": 1.4, "time": 1505643609236, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5971, 61.5891, 59.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840713", "mag": 1.9, "time": 1505643118540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.0384, 63.1445, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61911016", "mag": 2.48, "time": 1505641665420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.593167, 19.476, 2.731 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840350", "mag": 1.1, "time": 1505641100972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8915, 64.848, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5c", "mag": 4.7, "time": 1505640684330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -26.4288, -59.7896, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840314", "mag": 2.8, "time": 1505640505656, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6831, 60.3761, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apgy", "mag": 4.9, "time": 1505640302130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.2485, 37.3415, 54.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at65", "mag": 4.6, "time": 1505640090990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -13.5314, -7.0219, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000as3y", "mag": 2.7, "time": 1505639953270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.1147, 51.5611, 45.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at5a", "mag": 4.8, "time": 1505639681290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -13.1689, -7.0877, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840312", "mag": 2.1, "time": 1505638931288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0719, 60.2719, 130.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16840302", "mag": 2.8, "time": 1505638686114, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2164, 60.4788, 97.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246942", "mag": 1.01, "time": 1505637537950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.025833, 44.786167, 7.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893791", "mag": 1.48, "time": 1505637347930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.879167, 37.109167, 2.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16839942", "mag": 1.9, "time": 1505637129909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8564, 60.3231, 63.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893786", "mag": 1.14, "time": 1505636971290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737335, 38.786167, 0.85 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893781", "mag": 2.61, "time": 1505636516400, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.117, 36.594333, 6.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apg4", "mag": 4.6, "time": 1505636241220, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.1696, 7.5057, 23.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16839932", "mag": 1.1, "time": 1505636239228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8157, 63.2668, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apg0", "mag": 4.1, "time": 1505634585840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7666, -23.8893, 236.18 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765143", "mag": 2.2, "time": 1505634363500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.373667, 32.9405, 7.78 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605603", "mag": 1.8, "time": 1505634209242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8894, 38.3778, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apfv", "mag": 2.4, "time": 1505634047190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4463, 42.5857, 4.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16839551", "mag": 1.9, "time": 1505633391424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7184, 59.603, 74.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893741", "mag": 1.84, "time": 1505633100770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.493833, 1.09 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apft", "mag": 2.6, "time": 1505632181750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4391, 42.6077, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765127", "mag": 0.98, "time": 1505632149420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605167, 32.828333, 10.94 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893701", "mag": 1.35, "time": 1505631284810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.952833, 37.588167, 1.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apfk", "mag": 4.3, "time": 1505630160580, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.6223, -35.7292, 85.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16839518", "mag": 2.0, "time": 1505629372703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7555, 60.0405, 18.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893646", "mag": 1.36, "time": 1505628925460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736667, 38.757, 1.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873889", "mag": 2.9, "time": 1505628904808, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5935, 53.8081, 78.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apfd", "mag": 2.9, "time": 1505628801990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4531, 42.5908, 5.17 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246882", "mag": 1.05, "time": 1505628704550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.836, 44.307333, 7.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873888", "mag": 1.1, "time": 1505628661963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5848, 64.1727, 10.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apfa", "mag": 4.9, "time": 1505628478300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9805, 16.0409, 45.23 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246872", "mag": 1.16, "time": 1505628425450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.817667, 44.294, 7.61 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246867", "mag": 1.13, "time": 1505628332210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.828167, 44.305167, 7.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apf6", "mag": 4.5, "time": 1505628213110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0121, 16.1058, 52.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16839149", "mag": 1.6, "time": 1505628012027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2, 62.1778, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apf5", "mag": 4.3, "time": 1505627809940, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.5423, 14.4117, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765039", "mag": 1.19, "time": 1505627007650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0955, 36.761167, 1.69 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246847", "mag": 3.15, "time": 1505626724050, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.841667, 44.302333, 7.53 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246837", "mag": 2.04, "time": 1505626455220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.822333, 44.293667, 7.53 ] } }, +{ "type": "Feature", "properties": { "id": "ci37765023", "mag": 1.52, "time": 1505626163830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797833, 33.501167, 4.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apeu", "mag": 4.4, "time": 1505625898530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -86.4078, 10.7018, 35.32 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893621", "mag": 1.12, "time": 1505625800310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810165, 38.820499, 1.92 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764991", "mag": 1.62, "time": 1505625396010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.928167, 35.9015, 5.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764983", "mag": 1.96, "time": 1505624889150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.181, 33.187833, 5.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838778", "mag": 1.4, "time": 1505624855438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4712, 59.8595, 42.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893601", "mag": 1.37, "time": 1505624608110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8885, 37.105, 1.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838775", "mag": 3.2, "time": 1505624284096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1812, 54.0118, 9.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apeh", "mag": 4.3, "time": 1505624194760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -105.7123, 17.7366, 31.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838774", "mag": 1.8, "time": 1505623546848, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7399, 59.8813, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838756", "mag": 1.2, "time": 1505622986310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8141, 63.2696, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838752", "mag": 1.7, "time": 1505622626171, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.3598, 64.3838, 13.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764967", "mag": 0.95, "time": 1505622039760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1755, 33.965, 15.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873881", "mag": 2.7, "time": 1505621586321, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8861, 52.4075, 59.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873880", "mag": 1.0, "time": 1505621507758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3176, 61.144, 19.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838400", "mag": 1.9, "time": 1505621153075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1301, 60.8625, 64.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838393", "mag": 2.5, "time": 1505620853506, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8794, 60.7582, 60.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838388", "mag": 2.8, "time": 1505620146422, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7851, 59.8817, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893571", "mag": 1.03, "time": 1505619694280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821167, 38.807999, 1.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838386", "mag": 2.2, "time": 1505619628700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.9053, 67.6564, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893561", "mag": 1.07, "time": 1505619296320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822502, 38.808998, 1.93 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764903", "mag": 1.12, "time": 1505618790010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.147333, 34.5405, 9.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838042", "mag": 1.6, "time": 1505617352105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5056, 61.4142, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838020", "mag": 1.2, "time": 1505616366369, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6618, 60.5653, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16838003", "mag": 1.0, "time": 1505615565391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2146, 64.7331, 17.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764863", "mag": 1.1, "time": 1505613255300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.709667, 33.653333, 15.82 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764847", "mag": 1.21, "time": 1505612591880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.687167, 33.6285, 12.15 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764839", "mag": 1.47, "time": 1505612490180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.927167, 33.971833, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16837647", "mag": 1.8, "time": 1505611875649, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.771, 59.8672, 1.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16873869", "mag": 1.7, "time": 1505609079690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.474, 51.671, 16.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61910741", "mag": 2.42, "time": 1505608202930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.177667, 19.442, 41.639 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836972", "mag": 2.6, "time": 1505606832814, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3048, 51.6525, 97.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764815", "mag": 0.95, "time": 1505606822450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.746333, 33.887, 16.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836965", "mag": 2.3, "time": 1505606388180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7659, 59.8663, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836961", "mag": 2.4, "time": 1505606178328, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7941, 59.8509, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836957", "mag": 1.8, "time": 1505606050093, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.89, 59.8885, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860570", "mag": 1.4, "time": 1505605718038, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8821, 59.8989, 17.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860569", "mag": 1.6, "time": 1505605674005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8902, 59.9059, 15.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860568", "mag": 1.9, "time": 1505605456859, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8916, 59.9103, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860567", "mag": 2.3, "time": 1505605410411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.9, 59.889, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61330071", "mag": 2.57, "time": 1505605382130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.863333, 45.526833, 36.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apcc", "mag": 5.1, "time": 1505605083280, "felt": 218, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -136.7498, 59.9037, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apbv", "mag": 3.9, "time": 1505604419110, "felt": 198, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6989, 35.8586, 2.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836912", "mag": 2.9, "time": 1505604383308, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6017, 51.905, 128.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61329986", "mag": 1.23, "time": 1505604005810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.754167, 46.857333, 1.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apbu", "mag": 4.7, "time": 1505603696310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -14.0114, -17.7554, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860564", "mag": 1.6, "time": 1505603516964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1524, 61.3778, 62.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apbm", "mag": 4.5, "time": 1505603442050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1822, 15.4761, 67.03 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893446", "mag": 2.29, "time": 1505603337140, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.616833, 36.971, 4.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860563", "mag": 1.5, "time": 1505603223363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.5667, 57.9908, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860562", "mag": 1.6, "time": 1505602163820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0011, 60.0807, 110.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836589", "mag": 1.7, "time": 1505601390855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7769, 62.4045, 59.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893436", "mag": 1.34, "time": 1505600967450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.493, 0.66 ] } }, +{ "type": "Feature", "properties": { "id": "uw61329976", "mag": 1.03, "time": 1505600388700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.491167, 46.067333, 18.24 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764791", "mag": 1.29, "time": 1505599746390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.431333, 33.040167, 10.42 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893421", "mag": 1.75, "time": 1505599309380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.164333, 35.816, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apln", "mag": 3.8, "time": 1505599105290, "felt": 27, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.4711, 35.839, 65.43 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893416", "mag": 2.39, "time": 1505598962550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.606167, 40.391, 23.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16836269", "mag": 2.6, "time": 1505598312964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1504, 57.6803, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apay", "mag": 4.1, "time": 1505597546760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4078, 15.1552, 27.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860558", "mag": 1.5, "time": 1505597186774, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8073, 63.0653, 123.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893411", "mag": 1.07, "time": 1505596690170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.805332, 0.54 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764743", "mag": 1.25, "time": 1505596431740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.179, 33.192167, 7.19 ] } }, +{ "type": "Feature", "properties": { "id": "us2000apa3", "mag": 5.2, "time": 1505595657570, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.8208, 52.9335, 55.59 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893406", "mag": 1.68, "time": 1505595567120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832833, 37.5715, 2.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16835937", "mag": 1.2, "time": 1505594309155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7782, 63.4422, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16835935", "mag": 1.3, "time": 1505593468147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0825, 63.2217, 0.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764719", "mag": 1.01, "time": 1505593021350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.509667, 36.069667, 3.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764711", "mag": 1.86, "time": 1505592937400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.217, 32.373167, 19.88 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap9e", "mag": 4.2, "time": 1505592897770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.6768, -23.7075, 201.03 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605530", "mag": 1.0, "time": 1505591425440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9, 39.4039, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893386", "mag": 1.01, "time": 1505591244480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.504167, 37.923833, 7.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap8u", "mag": 5.1, "time": 1505590529510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.552, 15.3031, 17.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16835905", "mag": 2.1, "time": 1505590055161, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0556, 59.9293, 124.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246652", "mag": 1.36, "time": 1505589841530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.020833, 44.802, 10.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764687", "mag": 1.0, "time": 1505588714630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.973333, 33.989, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16835606", "mag": 2.1, "time": 1505588651481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.7021, 67.8201, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764679", "mag": 1.11, "time": 1505588640970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2045, 34.993167, -0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap88", "mag": 4.3, "time": 1505588283560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7095, 15.6575, 33.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860552", "mag": 2.1, "time": 1505587762267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2692, 60.1941, 137.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860551", "mag": 1.2, "time": 1505586754071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2984, 62.5136, 52.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764631", "mag": 1.09, "time": 1505586635400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791667, 33.507667, 4.61 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764623", "mag": 1.32, "time": 1505586305110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.975667, 33.992333, 5.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893361", "mag": 1.14, "time": 1505585751450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8095, 38.823167, 1.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16835287", "mag": 2.1, "time": 1505584069266, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.8156, 57.4983, 73.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap76", "mag": 4.0, "time": 1505583967320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.5572, 15.6925, 24.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap74", "mag": 4.7, "time": 1505583533380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.7408, 24.878, 57.27 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860549", "mag": 1.4, "time": 1505583090155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0305, 61.8843, 68.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764599", "mag": 1.28, "time": 1505582839910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.878167, 35.360667, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap78", "mag": 4.9, "time": 1505582156450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.507, -10.1846, 49.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap6d", "mag": 3.0, "time": 1505582077650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4285, 42.5847, 7.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap6b", "mag": 4.6, "time": 1505581929340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1918, -37.2167, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap64", "mag": 4.5, "time": 1505581636660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0682, 16.1115, 35.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893331", "mag": 1.49, "time": 1505581158890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.337833, 37.820167, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860548", "mag": 2.1, "time": 1505580632689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7764, 56.9377, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893326", "mag": 1.43, "time": 1505580258840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.711, 38.750833, 1.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893316", "mag": 1.6, "time": 1505579747930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.717167, 38.752667, 1.24 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893306", "mag": 1.39, "time": 1505579471580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0075, 37.570667, 2.07 ] } }, +{ "type": "Feature", "properties": { "id": "hv61910186", "mag": 1.68, "time": 1505579377040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.611, 19.430167, 2.332 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764559", "mag": 1.5, "time": 1505579023330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.801833, 34.514833, 12.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834974", "mag": 1.6, "time": 1505578926267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7481, 62.8102, 9.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834965", "mag": 2.6, "time": 1505578647951, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7871, 61.8971, 60.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255754", "mag": 1.22, "time": 1505578208020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.489667, 44.705667, 13.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893286", "mag": 1.35, "time": 1505577465010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.047, 36.467, 7.96 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605503", "mag": 1.0, "time": 1505577266743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.9133, 37.0358, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834664", "mag": 2.4, "time": 1505577104470, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.431, 64.4709, 16.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap48", "mag": 2.5, "time": 1505575595120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4328, 42.5757, 6.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893281", "mag": 1.04, "time": 1505575420020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.895333, 37.565, -1.35 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap45", "mag": 2.6, "time": 1505574778570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5771, 8.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834651", "mag": 1.1, "time": 1505574443625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8572, 64.7619, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893271", "mag": 1.41, "time": 1505574428990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946833, 37.638167, 2.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860541", "mag": 2.0, "time": 1505574078688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3496, 59.7545, 127.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764535", "mag": 1.64, "time": 1505573652280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1775, 33.193, 4.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834350", "mag": 1.4, "time": 1505572849209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9009, 64.7582, 0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap3f", "mag": 2.7, "time": 1505571851260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424, 42.5936, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834332", "mag": 2.5, "time": 1505571656570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9804, 59.5744, 87.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap3b", "mag": 5.4, "time": 1505571537070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9072, 16.226, 27.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860538", "mag": 1.3, "time": 1505570434361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2424, 62.5449, 91.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61329766", "mag": 1.85, "time": 1505569264490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0445, 46.876833, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16834028", "mag": 1.9, "time": 1505568376976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1823, 62.4985, 43.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893206", "mag": 1.29, "time": 1505567825160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.931167, 37.587167, 0.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764455", "mag": 2.74, "time": 1505566718480, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.162, 34.381, 19.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860534", "mag": 1.8, "time": 1505566502565, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1816, 59.9775, 117.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893196", "mag": 1.67, "time": 1505566233320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7105, 38.752667, 1.06 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017259001", "mag": 2.53, "time": 1505566066240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1556, 17.5196, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605483", "mag": 1.9, "time": 1505565978805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5538, 38.7481, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764447", "mag": 1.73, "time": 1505565806200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609667, 33.184833, 2.89 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235458", "mag": 2.43, "time": 1505565729090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.570167, 37.344833, 5.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap2h", "mag": 5.1, "time": 1505565414430, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 154.9693, -6.4027, 84.07 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893191", "mag": 1.22, "time": 1505565031030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840833, 37.499667, 1.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893176", "mag": 1.02, "time": 1505564232460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827667, 38.837502, 1.89 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893171", "mag": 1.16, "time": 1505563869000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.124, 36.5485, 6.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893166", "mag": 1.98, "time": 1505563826250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.96, 36.383333, 5.84 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860533", "mag": 2.3, "time": 1505563620965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2643, 51.2858, 23.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16833723", "mag": 1.8, "time": 1505563033811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0307, 59.9768, 107.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16833722", "mag": 1.0, "time": 1505562940424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5632, 63.5373, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap1y", "mag": 2.6, "time": 1505562746670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.3487, 38.1953, 7.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16833715", "mag": 1.4, "time": 1505562545553, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0358, 63.0385, 119.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap1n", "mag": 4.9, "time": 1505561075850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.2793, -17.0456, 538.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap1h", "mag": 4.9, "time": 1505561004690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0304, 14.9269, 46.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893161", "mag": 1.71, "time": 1505560933840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.120167, 35.9645, 23.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at4t", "mag": 4.2, "time": 1505560744440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.8254, -7.4355, 134.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16833426", "mag": 1.4, "time": 1505560633966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4578, 61.5042, 28.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap1d", "mag": 2.4, "time": 1505560442800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8006, 35.9908, 5.836 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893146", "mag": 1.21, "time": 1505560059470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.829167, 37.4595, 2.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap17", "mag": 4.2, "time": 1505558287960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.162, 15.1165, 61.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255689", "mag": 1.86, "time": 1505557588190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1525, 48.101667, 7.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893131", "mag": 1.55, "time": 1505557460780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826, 38.836333, 2.51 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap0t", "mag": 4.5, "time": 1505557108730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2297, 14.9414, 30.52 ] } }, +{ "type": "Feature", "properties": { "id": "uw61329606", "mag": 1.52, "time": 1505556991880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.998833, 47.691333, 5.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap0r", "mag": 5.4, "time": 1505556693470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 83.5155, 42.2053, 16.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893116", "mag": 1.84, "time": 1505556472360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.136, 35.962667, 25.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at4a", "mag": 4.0, "time": 1505555867920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.1193, -10.8831, 38.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893106", "mag": 2.2, "time": 1505555321940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.918167, 38.061667, 8.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764391", "mag": 3.37, "time": 1505555150630, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.616167, 33.169667, 8.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16833112", "mag": 1.5, "time": 1505554903991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7489, 59.845, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832833", "mag": 1.9, "time": 1505554129377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7145, 60.2604, 9.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832826", "mag": 1.1, "time": 1505553506665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3921, 63.5231, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832818", "mag": 2.0, "time": 1505552113865, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4792, 63.0863, 5.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860523", "mag": 1.1, "time": 1505550954800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5868, 63.8926, 99.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ap0a", "mag": 4.0, "time": 1505550836160, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 27.685, 37.0689, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764359", "mag": 1.53, "time": 1505550124480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9555, 33.145833, 9.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764335", "mag": 1.72, "time": 1505549627950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.053167, 36.123167, 1.12 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764327", "mag": 1.0, "time": 1505549298090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.920833, 33.975167, 6.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832531", "mag": 1.9, "time": 1505548305568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9221, 64.7554, 18.3 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017259000", "mag": 3.64, "time": 1505548231440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.0526, 18.4531, 34.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605447", "mag": 1.3, "time": 1505548133652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0331, 40.436, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860520", "mag": 1.3, "time": 1505547550857, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9184, 62.2903, 70.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764303", "mag": 0.95, "time": 1505546199690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.922833, 33.978, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832252", "mag": 3.1, "time": 1505545940675, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5336, 51.3744, 18.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893051", "mag": 1.0, "time": 1505544999790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8995, 37.518833, 0.05 ] } }, +{ "type": "Feature", "properties": { "id": "hv61909871", "mag": 3.66, "time": 1505544037320, "felt": 734, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.487667, 21.642167, 10.046 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832238", "mag": 2.6, "time": 1505543981141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.591, 58.4419, 63.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860517", "mag": 1.9, "time": 1505543962894, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4461, 59.504, 85.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764247", "mag": 0.97, "time": 1505543854670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.918833, 33.976667, 6.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16832235", "mag": 1.7, "time": 1505543819625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8364, 61.486, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anze", "mag": 4.4, "time": 1505543417100, "felt": 29, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.4791, 13.6017, 52.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893026", "mag": 0.96, "time": 1505543269370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8325, 37.540333, 4.97 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893021", "mag": 1.36, "time": 1505543240340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.181833, 37.775667, 14.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831965", "mag": 1.2, "time": 1505542824882, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1125, 62.0856, 43.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893011", "mag": 1.57, "time": 1505541411490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8025, 38.706667, 3.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831959", "mag": 1.0, "time": 1505541221769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4333, 66.2529, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831957", "mag": 1.8, "time": 1505541032598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4004, 57.5066, 48.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anz4", "mag": 4.4, "time": 1505540612950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -60.854, 17.4925, 32.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anz2", "mag": 4.1, "time": 1505540153920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.143, 15.2335, 36.21 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764183", "mag": 1.57, "time": 1505539498920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924667, 33.976667, 6.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anyv", "mag": 3.7, "time": 1505539256530, "felt": 22, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4153, 42.5716, 8.12 ] } }, +{ "type": "Feature", "properties": { "id": "nc72893001", "mag": 1.74, "time": 1505539200450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.266667, 39.366833, -0.52 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605425", "mag": 1.2, "time": 1505536942149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.719, 36.6783, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764071", "mag": 3.03, "time": 1505536766220, "felt": 99, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.926333, 33.9745, 5.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anyf", "mag": 4.6, "time": 1505535666910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.9491, -1.4664, 157.52 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892991", "mag": 1.09, "time": 1505535129720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.777833, 39.807833, 8.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000any5", "mag": 4.3, "time": 1505534256750, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.7094, 13.2544, 54.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831411", "mag": 1.0, "time": 1505534077361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8446, 61.8774, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605540", "mag": 1.1, "time": 1505533644071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5347, 38.3939, 14.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764039", "mag": 1.68, "time": 1505533494970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.682, 35.141167, 11.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764031", "mag": 1.75, "time": 1505533234710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.516833, 32.862, 5.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831410", "mag": 1.3, "time": 1505532137489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8143, 61.3719, 31.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892971", "mag": 0.98, "time": 1505532054400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8735, 37.542, 7.25 ] } }, +{ "type": "Feature", "properties": { "id": "nm60206921", "mag": 1.9, "time": 1505531769960, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.3315, 35.6915, 12.51 ] } }, +{ "type": "Feature", "properties": { "id": "ci37764007", "mag": 1.33, "time": 1505531552680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.105667, 34.034, 6.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860509", "mag": 1.7, "time": 1505530441142, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2233, 59.405, 90.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831409", "mag": 2.6, "time": 1505529914916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7519, 54.2192, 117.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763991", "mag": 1.37, "time": 1505528713010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.179, 33.193833, 7.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763983", "mag": 1.44, "time": 1505528615710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793333, 33.493667, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anxt", "mag": 4.3, "time": 1505528560360, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -100.0309, 17.2785, 69.28 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892956", "mag": 1.06, "time": 1505527887720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.904167, 37.519667, -0.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831144", "mag": 1.1, "time": 1505526547318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6449, 63.5861, 5.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831140", "mag": 1.8, "time": 1505526295378, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4346, 59.0192, 66.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892946", "mag": 1.02, "time": 1505525854460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764168, 38.786999, 0.87 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763959", "mag": 1.17, "time": 1505525787900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.395167, 34.877167, 11.59 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892941", "mag": 1.34, "time": 1505525721400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.772833, 38.807167, -0.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892936", "mag": 1.51, "time": 1505525691180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819167, 37.545, 3.75 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anxl", "mag": 4.6, "time": 1505525689580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5872, 52.0486, 37.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831132", "mag": 1.8, "time": 1505525666712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6913, 63.5749, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16831131", "mag": 1.1, "time": 1505525600973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6368, 63.6017, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892931", "mag": 1.16, "time": 1505524996900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.806167, 36.224833, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830868", "mag": 2.0, "time": 1505523996780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.276, 57.4142, 39.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16860501", "mag": 1.8, "time": 1505523576256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.099, 59.7523, 100.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830864", "mag": 1.0, "time": 1505522724047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.3705, 66.2593, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830862", "mag": 1.4, "time": 1505522720015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8357, 63.5631, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at41", "mag": 4.6, "time": 1505522674060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.6259, -23.9788, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anwt", "mag": 4.3, "time": 1505522470090, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.2357, -37.2039, 9.72 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246252", "mag": 1.18, "time": 1505521902190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4075, 42.596, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830861", "mag": 1.2, "time": 1505521740882, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7991, 61.6212, 38.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830860", "mag": 1.0, "time": 1505521253411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9628, 64.7584, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830858", "mag": 1.6, "time": 1505521010086, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3459, 62.5868, 57.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000at4p", "mag": 4.6, "time": 1505520028160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -30.9669, 2.8319, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830852", "mag": 2.5, "time": 1505519615949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8797, 64.7729, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830848", "mag": 3.4, "time": 1505519352423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.9613, 56.0051, 45.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830585", "mag": 2.2, "time": 1505518242769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9245, 64.7851, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830502", "mag": 1.5, "time": 1505517724005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3927, 62.7723, 62.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61909476", "mag": 1.46, "time": 1505517626230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6105, 19.420833, 2.212 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anvi", "mag": 4.9, "time": 1505517194700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.9781, 67.621, 14.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852972", "mag": 2.3, "time": 1505516822454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.046, 51.6929, 12.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asms", "mag": 4.2, "time": 1505515397660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.5667, -4.6769, 135.04 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830490", "mag": 2.1, "time": 1505515348546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2666, 60.2335, 149.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anza", "mag": 4.2, "time": 1505515078190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.9514, 12.8959, 27.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852968", "mag": 1.7, "time": 1505514517165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1028, 59.5574, 89.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830486", "mag": 1.5, "time": 1505514413181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8103, 64.7863, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852966", "mag": 1.7, "time": 1505514284700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1862, 59.9258, 120.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892896", "mag": 1.71, "time": 1505514238180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.848, 40.281, 4.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqg1", "mag": 3.2, "time": 1505514207940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4161, 53.6697, 25.19 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892891", "mag": 1.42, "time": 1505514193630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7085, 38.747, 1.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000antx", "mag": 2.8, "time": 1505513431240, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9688, 37.279, 4.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830471", "mag": 1.3, "time": 1505513126878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0818, 58.2131, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqg0", "mag": 2.6, "time": 1505512544140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6723, 51.5577, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000antf", "mag": 4.6, "time": 1505512126220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.5618, -5.9077, 108.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830466", "mag": 1.7, "time": 1505511266504, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7109, 60.4891, 8.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asmu", "mag": 4.3, "time": 1505510611600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 137.0445, 34.5022, 328.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anrz", "mag": 3.1, "time": 1505510517900, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4379, 42.6057, 6.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830211", "mag": 3.0, "time": 1505510263990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8926, 64.7765, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852960", "mag": 1.5, "time": 1505509916511, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1722, 61.1116, 68.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852959", "mag": 2.0, "time": 1505509441508, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4835, 51.7117, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892861", "mag": 1.56, "time": 1505509197990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.217167, 35.152667, 7.27 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605401", "mag": 1.3, "time": 1505508712532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5746, 38.7781, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anqp", "mag": 4.4, "time": 1505508340380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.6832, 12.6788, 125.94 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605391", "mag": 1.0, "time": 1505508003630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3614, 38.5819, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763831", "mag": 1.45, "time": 1505507271630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.356667, 34.4865, 9.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830197", "mag": 2.1, "time": 1505507006348, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8768, 60.2433, 18.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892846", "mag": 2.43, "time": 1505506978320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.075333, 36.496667, 4.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000annp", "mag": 2.3, "time": 1505506905940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4277, 42.5599, 9.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829946", "mag": 2.6, "time": 1505506584731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9781, 57.0654, 81.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892841", "mag": 1.21, "time": 1505506558180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801833, 38.823167, 2.59 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763815", "mag": 1.6, "time": 1505506434580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.772667, 33.326167, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829942", "mag": 2.0, "time": 1505506388550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6381, 59.7681, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829939", "mag": 1.3, "time": 1505506296730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3557, 64.9805, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829919", "mag": 3.2, "time": 1505506091028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8331, 59.8732, 91.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829917", "mag": 1.1, "time": 1505506034459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1896, 63.4641, 20.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892821", "mag": 1.26, "time": 1505506033580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.407667, 37.504333, 1.03 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258005", "mag": 3.43, "time": 1505505501670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.6295, 19.1915, 40.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829915", "mag": 1.5, "time": 1505505395135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6711, 60.3885, 41.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829913", "mag": 2.1, "time": 1505505235226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.0254, 58.4988, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829904", "mag": 1.1, "time": 1505503708373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5162, 63.4918, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892806", "mag": 1.03, "time": 1505503474580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.488333, 37.450833, 4.91 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763759", "mag": 1.72, "time": 1505502131450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796, 33.503167, 6.45 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anjp", "mag": 5.5, "time": 1505501282460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.3292, -55.4644, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892771", "mag": 1.05, "time": 1505500911720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.725334, 38.757, 1.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anjh", "mag": 4.5, "time": 1505500904740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.72, 54.0122, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61308057", "mag": 0.97, "time": 1505500854880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.858667, 48.515, 37.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829625", "mag": 1.6, "time": 1505499922143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3749, 60.4419, 18.3 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246132", "mag": 1.51, "time": 1505499901840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420667, 42.537167, 7.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892766", "mag": 2.33, "time": 1505499839660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.49, 37.447667, 5.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892756", "mag": 1.0, "time": 1505499395080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.799667, 37.462333, 0.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892761", "mag": 1.02, "time": 1505499284680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.445, 37.379333, 14.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829622", "mag": 1.1, "time": 1505498936272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4458, 61.0059, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anhz", "mag": 4.2, "time": 1505498539950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9892, 15.1825, 46.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829378", "mag": 1.9, "time": 1505498347271, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7292, 60.4845, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763719", "mag": 1.44, "time": 1505498108300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.178169, 35.602833, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anhd", "mag": 5.0, "time": 1505497546880, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 28.8132, -2.7314, 12.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763711", "mag": 1.02, "time": 1505497385540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.102833, 33.170333, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829370", "mag": 1.8, "time": 1505496661795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3298, 60.0961, 93.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892746", "mag": 1.22, "time": 1505496479100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.641667, 37.477167, 6.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000angr", "mag": 4.6, "time": 1505496373980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 160.527, 53.8618, 60.06 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763679", "mag": 1.04, "time": 1505495567950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.808, 36.012167, 1.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829365", "mag": 1.4, "time": 1505494067842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3827, 63.102, 108.2 ] } }, +{ "type": "Feature", "properties": { "id": "uw61308032", "mag": 1.41, "time": 1505493000220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.048333, 47.3965, 13.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892711", "mag": 1.1, "time": 1505492830650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807, 38.822667, 2.57 ] } }, +{ "type": "Feature", "properties": { "id": "uw61308027", "mag": 1.17, "time": 1505492391290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0485, 47.395833, 13.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829360", "mag": 2.9, "time": 1505491697051, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4354, 53.7237, 49.7 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258004", "mag": 1.98, "time": 1505491060700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7353, 18.0013, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829358", "mag": 1.6, "time": 1505491027770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6843, 60.3013, 49.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000angc", "mag": 4.7, "time": 1505490910540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.4948, -51.951, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829355", "mag": 3.2, "time": 1505490508935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4074, 55.3684, 134.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60246117", "mag": 1.78, "time": 1505490038910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438833, 42.587833, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763607", "mag": 1.3, "time": 1505489472220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.491167, 33.8525, -0.5 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235413", "mag": 2.08, "time": 1505488486050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.96, 37.276667, 2.46 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829351", "mag": 1.4, "time": 1505488175090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4615, 63.0908, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61908956", "mag": 2.13, "time": 1505487142110, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.862333, 19.450333, 1.074 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829348", "mag": 2.3, "time": 1505486994801, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.5994, 64.2424, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852936", "mag": 1.5, "time": 1505485797408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5105, 60.533, 54.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829346", "mag": 1.6, "time": 1505485726963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8399, 59.9528, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255559", "mag": 1.54, "time": 1505485070000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528, 46.898, 12.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asmd", "mag": 4.0, "time": 1505484479350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 118.2763, -7.0257, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763559", "mag": 1.43, "time": 1505483064830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6045, 33.127833, 7.81 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763535", "mag": 1.14, "time": 1505482307640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.736833, 33.222833, 12.21 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763527", "mag": 1.65, "time": 1505482113260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.742833, 33.223833, 11.67 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763511", "mag": 2.98, "time": 1505481739410, "felt": 62, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750167, 33.221833, 11.54 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605319", "mag": 1.4, "time": 1505481612897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.536, 39.4025, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829343", "mag": 1.1, "time": 1505481511288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.734, 60.477, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829342", "mag": 1.1, "time": 1505481115042, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.6866, 60.4978, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an8y", "mag": 3.0, "time": 1505480692500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9665, 37.2798, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aqfs", "mag": 4.0, "time": 1505480677660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 177.1015, 51.6899, 62.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892656", "mag": 1.2, "time": 1505479917850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.478833, 36.923833, 5.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852930", "mag": 2.2, "time": 1505479857860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6735, 54.2139, 72.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852929", "mag": 1.3, "time": 1505479424949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8074, 61.6789, 63.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763455", "mag": 1.43, "time": 1505479133890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.172833, 33.1885, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an8s", "mag": 5.0, "time": 1505479021440, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 99.4856, 1.5915, 160.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852928", "mag": 2.1, "time": 1505478896521, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6795, 51.3691, 28.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307972", "mag": 0.95, "time": 1505478878910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.588, 45.973333, 13.92 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255544", "mag": 1.19, "time": 1505478239910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527, 46.868167, 11.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852925", "mag": 2.1, "time": 1505477897255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.3237, 54.8499, 18.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892641", "mag": 1.01, "time": 1505477523520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799667, 38.833832, 2.01 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an8e", "mag": 2.7, "time": 1505477274970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525, 46.8611, 10.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852924", "mag": 1.4, "time": 1505476792218, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5946, 57.6534, 29.9 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258003", "mag": 2.18, "time": 1505476739060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7808, 18.0135, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852923", "mag": 2.0, "time": 1505476493650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.7994, 54.9781, 25.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an7z", "mag": 3.8, "time": 1505475906360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.753, 54.3697, 28.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892636", "mag": 2.0, "time": 1505475684320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.723167, 38.750667, 1.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829087", "mag": 1.6, "time": 1505475033163, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.6709, 67.7999, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829082", "mag": 1.8, "time": 1505474984470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9722, 63.0999, 131.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16829079", "mag": 1.4, "time": 1505474678706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7297, 60.4779, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an7j", "mag": 2.7, "time": 1505474631800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4441, 42.568, 7.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892626", "mag": 1.04, "time": 1505474439810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.804667, 37.458833, 0.13 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763407", "mag": 3.23, "time": 1505473976550, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.303167, 35.032833, 11.48 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605300", "mag": 1.1, "time": 1505473795002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7828, 38.6088, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828841", "mag": 1.7, "time": 1505473634732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.54, 59.9657, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307932", "mag": 1.91, "time": 1505473610560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.044333, 46.870333, 5.23 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307927", "mag": 2.04, "time": 1505473528440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.040667, 46.874167, 5.89 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an74", "mag": 4.6, "time": 1505473111350, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -60.5703, 14.9752, 55.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828838", "mag": 2.3, "time": 1505473096912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7454, 57.1664, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235273", "mag": 1.73, "time": 1505472377400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7775, 37.328833, 5.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828836", "mag": 1.2, "time": 1505472358115, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0141, 62.1581, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an6x", "mag": 3.0, "time": 1505471961060, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4507, 42.5991, 6.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828834", "mag": 1.6, "time": 1505471035679, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5654, 60.6122, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258002", "mag": 3.3, "time": 1505471012430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -65.039, 18.7165, 49.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892606", "mag": 2.13, "time": 1505469780960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.106167, 36.291833, 27.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852912", "mag": 1.9, "time": 1505469324601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0438, 60.2245, 124.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828830", "mag": 2.7, "time": 1505468486908, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.378, 53.6654, 25.8 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258001", "mag": 3.31, "time": 1505468158660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9741, 18.1111, 53.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828827", "mag": 1.9, "time": 1505468029663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1086, 60.3742, 87.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an6e", "mag": 2.1, "time": 1505467401730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4369, 42.5723, 4.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763367", "mag": 1.32, "time": 1505466931820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.601167, 35.792, 0.88 ] } }, +{ "type": "Feature", "properties": { "id": "hv61908811", "mag": 1.86, "time": 1505466749280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.473328, 19.201, 34.94 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017258000", "mag": 2.64, "time": 1505466025100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.746, 17.9996, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an5j", "mag": 3.6, "time": 1505463761200, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4416, 42.5753, 5.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852908", "mag": 1.3, "time": 1505463469458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.2829, 57.3488, 39.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605283", "mag": 1.7, "time": 1505461873940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4437, 37.5652, 30.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892591", "mag": 2.34, "time": 1505461865770, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.815833, 37.416, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892576", "mag": 1.69, "time": 1505460536470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.027667, 35.933167, 12.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828820", "mag": 1.4, "time": 1505460317106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3735, 59.7943, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852903", "mag": 1.3, "time": 1505459205027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8448, 60.0925, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828585", "mag": 1.4, "time": 1505458631465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0593, 61.7131, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an4v", "mag": 4.4, "time": 1505458308660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5767, -21.9172, 640.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828584", "mag": 1.4, "time": 1505458006745, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7132, 60.0014, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828563", "mag": 2.8, "time": 1505456528325, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4989, 60.1125, 151.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828570", "mag": 2.5, "time": 1505456526893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2519, 60.1326, 152.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892551", "mag": 2.6, "time": 1505456369610, "felt": 148, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.814333, 37.412167, -0.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828560", "mag": 1.1, "time": 1505456105481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0298, 65.3407, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763319", "mag": 1.07, "time": 1505455402480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7685, 33.327833, 13.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828558", "mag": 1.4, "time": 1505455356648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3726, 61.4994, 31.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852896", "mag": 1.9, "time": 1505455322292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2513, 60.1603, 135.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892546", "mag": 1.03, "time": 1505455248140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810667, 38.83, 2.09 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828556", "mag": 1.6, "time": 1505455168783, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9297, 60.9306, 19.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763311", "mag": 1.21, "time": 1505454701910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.190167, 33.332667, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852894", "mag": 1.7, "time": 1505453971264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8667, 60.0997, 103.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an3z", "mag": 4.6, "time": 1505453216820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.4676, -42.4862, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852893", "mag": 1.1, "time": 1505452792257, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4902, 57.7349, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828554", "mag": 1.4, "time": 1505452679971, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3948, 61.1147, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852891", "mag": 1.6, "time": 1505451604059, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9039, 61.8273, 105.7 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235253", "mag": 1.62, "time": 1505451601330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7765, 37.333333, 5.53 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892536", "mag": 2.78, "time": 1505451572070, "felt": 348, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.804667, 37.415, 2.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828322", "mag": 1.1, "time": 1505451186525, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7346, 60.4761, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anyw", "mag": 2.0, "time": 1505450267000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.42, 45.73, 18.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892526", "mag": 1.26, "time": 1505449157230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802333, 38.8245, 1.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828321", "mag": 1.4, "time": 1505448965816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0369, 60.3155, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an31", "mag": 4.3, "time": 1505448638800, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.4066, -11.9189, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255479", "mag": 1.23, "time": 1505447369570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.896667, 13.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828316", "mag": 2.0, "time": 1505447351856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1687, 59.8152, 101.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828314", "mag": 1.7, "time": 1505447232655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4451, 60.022, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892516", "mag": 1.1, "time": 1505446837720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.730835, 38.793999, 1.32 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245937", "mag": 2.38, "time": 1505446750290, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.831833, 40.139667, 5.96 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605251", "mag": 1.0, "time": 1505446468632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9033, 38.4011, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307757", "mag": 1.87, "time": 1505444885110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.039, 46.879667, 6.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828311", "mag": 1.7, "time": 1505444727120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9607, 69.4522, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828309", "mag": 1.6, "time": 1505444714123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2585, 60.8639, 35.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16828078", "mag": 1.7, "time": 1505444473211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9441, 60.8403, 88.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16852882", "mag": 1.6, "time": 1505443841428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.2335, 53.7145, 69.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an1z", "mag": 4.4, "time": 1505443535780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5573, 15.2748, 63.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892506", "mag": 1.02, "time": 1505442684550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883667, 37.553, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "hv61908531", "mag": 3.04, "time": 1505439944520, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.466833, 19.197667, 35.437 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827839", "mag": 1.5, "time": 1505439822541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4032, 62.4253, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763231", "mag": 1.55, "time": 1505439516220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.3195, 34.068167, 18.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an15", "mag": 5.2, "time": 1505439500860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5689, -26.6333, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an0z", "mag": 4.8, "time": 1505439407990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.866, 18.8304, 42.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892491", "mag": 1.99, "time": 1505438838520, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.813833, 37.412167, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892486", "mag": 3.28, "time": 1505438267780, "felt": 1110, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.805667, 37.414, -0.21 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307737", "mag": 1.35, "time": 1505438193040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.260833, 45.950833, -0.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an0d", "mag": 2.7, "time": 1505437987460, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5868, 37.2136, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000an0g", "mag": 4.3, "time": 1505437868680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4079, 15.6978, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827837", "mag": 1.3, "time": 1505437000881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7, 64.3159, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aslu", "mag": 4.1, "time": 1505436496140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8507, -18.1469, 603.85 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763199", "mag": 1.36, "time": 1505435921800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.729667, 33.651667, 14.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892481", "mag": 1.05, "time": 1505435403940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1895, 36.589667, 2.71 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aslz", "mag": 4.4, "time": 1505434827610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.716, 24.4725, 93.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amzk", "mag": 4.1, "time": 1505434054870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3134, -31.912, 136.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827738", "mag": 1.1, "time": 1505433675781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4097, 60.0357, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307717", "mag": 1.13, "time": 1505433139350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.677167, 47.835167, -0.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892476", "mag": 1.21, "time": 1505432696710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.828167, 37.448333, 11.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827737", "mag": 2.4, "time": 1505432573787, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.6213, 54.0704, 37.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amz3", "mag": 4.1, "time": 1505431969130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.671, 15.2225, 53.79 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892471", "mag": 1.5, "time": 1505431533120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4815, 38.607167, 11.47 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892466", "mag": 1.83, "time": 1505431346810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8125, 37.417833, 0.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827381", "mag": 2.1, "time": 1505430963793, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5301, 63.0381, 100.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amyn", "mag": 4.7, "time": 1505430410000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.7418, -15.3348, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892451", "mag": 1.34, "time": 1505430316610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.842333, 38.821, 2.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827378", "mag": 1.7, "time": 1505430242693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6605, 59.9169, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827376", "mag": 1.4, "time": 1505430223593, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3686, 64.993, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235238", "mag": 1.58, "time": 1505429674020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887667, 37.203667, 6.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827373", "mag": 1.9, "time": 1505429324646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.3648, 60.031, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827371", "mag": 1.2, "time": 1505429076761, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7478, 61.0185, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amx5", "mag": 4.0, "time": 1505428206900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2168, 15.3544, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892426", "mag": 2.04, "time": 1505428077100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.454833, 37.434333, 10.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861216", "mag": 1.9, "time": 1505427925219, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.0714, 56.1589, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827036", "mag": 2.0, "time": 1505427923919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0766, 61.1472, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amww", "mag": 5.2, "time": 1505427661920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.1022, -13.8345, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763135", "mag": 1.49, "time": 1505427523820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.866, 34.011167, 16.92 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605229", "mag": 2.2, "time": 1505427385689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0155, 38.8648, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000askz", "mag": 4.1, "time": 1505426291450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.1685, -7.2026, 147.79 ] } }, +{ "type": "Feature", "properties": { "id": "hv61908231", "mag": 2.43, "time": 1505426012270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.012665, 19.708, 2.82 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245817", "mag": 1.37, "time": 1505425437900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.738, 38.746667, 7.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827032", "mag": 1.7, "time": 1505425052822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4453, 59.9712, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827035", "mag": 2.3, "time": 1505424622002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6154, 53.6195, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asl6", "mag": 4.4, "time": 1505424366710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.1651, -12.9278, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257005", "mag": 3.03, "time": 1505423754820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.8618, 18.9605, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amub", "mag": 2.8, "time": 1505423589100, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1847, 37.3761, 9.38 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892386", "mag": 1.71, "time": 1505423524180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.993, 37.849, 7.27 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307597", "mag": 1.91, "time": 1505423420600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.516333, 49.4855, -1.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827021", "mag": 2.6, "time": 1505422812693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9235, 64.0866, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257004", "mag": 3.1, "time": 1505421809880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.5351, 18.7848, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307587", "mag": 2.41, "time": 1505421654690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.038167, 46.8785, 6.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763103", "mag": 1.09, "time": 1505421634220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.484667, 33.852667, -0.55 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763095", "mag": 2.06, "time": 1505421264070, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.377, 34.075, 2.89 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763087", "mag": 1.19, "time": 1505421203990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9245, 33.981667, 6.59 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307577", "mag": 2.03, "time": 1505420251860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041833, 46.875667, 6.94 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763071", "mag": 1.01, "time": 1505420033530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.481, 33.8295, -0.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amr0", "mag": 3.2, "time": 1505419914220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2947, 31.1684, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826805", "mag": 1.7, "time": 1505419715229, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.541, 59.9804, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255399", "mag": 3.06, "time": 1505419221280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5865, 48.5185, 11.24 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245777", "mag": 2.41, "time": 1505419186750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.829333, 40.126, 5.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826800", "mag": 1.6, "time": 1505419140835, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9798, 59.9221, 1.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892321", "mag": 1.03, "time": 1505418518980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838833, 37.542333, 4.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861208", "mag": 1.9, "time": 1505418243673, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0345, 59.5576, 91.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892316", "mag": 1.93, "time": 1505418215210, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825833, 37.479167, 0.95 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307562", "mag": 1.61, "time": 1505417734660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.201667, 47.657667, 24.36 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892311", "mag": 2.58, "time": 1505417475310, "felt": 83, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.815167, 37.412167, -0.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826593", "mag": 3.3, "time": 1505417123986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.9114, 52.3919, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "ld60143041", "mag": 1.13, "time": 1505416429790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.886167, 43.172167, 4.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amnb", "mag": 3.0, "time": 1505416249190, "felt": 10, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5193, 36.2853, 5.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826590", "mag": 1.5, "time": 1505416113279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1135, 61.6397, 76.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826581", "mag": 3.0, "time": 1505415978301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7549, 53.141, 25.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826576", "mag": 2.1, "time": 1505415492270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9009, 60.0386, 108.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826575", "mag": 1.4, "time": 1505414640813, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4567, 60.0012, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892281", "mag": 1.22, "time": 1505414516760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.106667, 37.328833, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826369", "mag": 1.5, "time": 1505413533625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2439, 60.5671, 11.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826365", "mag": 2.1, "time": 1505413453164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2344, 60.5666, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826364", "mag": 1.2, "time": 1505413265164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6599, 59.9119, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37763023", "mag": 1.39, "time": 1505413136790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.316167, 35.0525, -0.97 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307532", "mag": 1.1, "time": 1505412859730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3855, 45.629833, -1.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892266", "mag": 0.96, "time": 1505412496280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.5355, 0.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892261", "mag": 1.1, "time": 1505411783250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808166, 38.800167, 2.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826335", "mag": 1.2, "time": 1505411310289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0556, 61.0558, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826330", "mag": 1.6, "time": 1505411005327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8642, 60.9198, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amk5", "mag": 5.8, "time": 1505410888670, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.732, 18.6699, 173.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892241", "mag": 3.28, "time": 1505410337330, "felt": 1346, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8135, 37.411667, -0.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amw9", "mag": 2.9, "time": 1505410106220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.434, 42.5971, 8.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762975", "mag": 1.37, "time": 1505410085790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795333, 33.494833, 5.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amja", "mag": 3.2, "time": 1505409999020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4403, 42.586, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307502", "mag": 2.03, "time": 1505409449050, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.775333, 47.590667, 26.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amis", "mag": 4.1, "time": 1505408885650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3313, 15.7247, 66.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826120", "mag": 2.2, "time": 1505408670072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8183, 60.7702, 77.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amhu", "mag": 2.5, "time": 1505407539000, "felt": 179, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.0236, 32.7967, 6.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16826109", "mag": 3.4, "time": 1505406315703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.9733, 53.4109, 37.9 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257003", "mag": 1.93, "time": 1505405250720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1335, 18.0533, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825909", "mag": 3.0, "time": 1505405033445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4291, 57.7254, 15.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861191", "mag": 2.2, "time": 1505404726740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.4598, 52.5561, 41.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amga", "mag": 4.5, "time": 1505404343560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.122, -6.0228, 63.06 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245622", "mag": 1.46, "time": 1505403828660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.640167, 41.675, 10.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762935", "mag": 1.53, "time": 1505403471570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7005, 36.071833, 0.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861190", "mag": 1.9, "time": 1505403359391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3367, 58.804, 116.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762927", "mag": 1.08, "time": 1505403357540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6365, 33.9595, 15.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825908", "mag": 1.4, "time": 1505402885768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5012, 61.3116, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825714", "mag": 2.2, "time": 1505399922942, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5211, 53.4862, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892201", "mag": 2.8, "time": 1505399703490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8115, 37.473, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825708", "mag": 2.5, "time": 1505399664156, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3242, 59.9299, 129.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amdz", "mag": 4.3, "time": 1505399623950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8439, 15.4623, 51.01 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235213", "mag": 2.12, "time": 1505398747570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.888167, 37.203167, 5.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825704", "mag": 1.0, "time": 1505398436381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6928, 63.8584, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762895", "mag": 1.82, "time": 1505398376370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.448167, 33.465, 11.86 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255329", "mag": 1.87, "time": 1505398289770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534833, 46.870333, 11.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825519", "mag": 1.8, "time": 1505397944345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.464, 59.9879, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amcx", "mag": 2.4, "time": 1505397840240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4117, 42.6047, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257002", "mag": 3.32, "time": 1505397292070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.3985, 17.9023, 89.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861180", "mag": 2.0, "time": 1505397099289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7867, 53.5505, 48.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861178", "mag": 1.1, "time": 1505394745904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8149, 59.8173, 16.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892181", "mag": 0.97, "time": 1505394542400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833667, 37.603833, 3.53 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605167", "mag": 1.1, "time": 1505394484720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9328, 38.4065, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825327", "mag": 1.8, "time": 1505394377057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5142, 60.0065, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825325", "mag": 1.1, "time": 1505393895767, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0247, 61.1655, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825323", "mag": 1.3, "time": 1505393727514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0737, 61.1407, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ambm", "mag": 2.8, "time": 1505393579230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5276, 8.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892176", "mag": 1.12, "time": 1505393008100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8295, 37.486167, 1.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825308", "mag": 2.8, "time": 1505392115017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1037, 58.6121, 140.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892171", "mag": 1.95, "time": 1505392014690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.811, 37.47, 1.05 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762879", "mag": 2.48, "time": 1505391903440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.03, 34.269167, 1.91 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907846", "mag": 1.74, "time": 1505391154930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.801498, 20.135166, 20.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825129", "mag": 1.8, "time": 1505390600450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6941, 53.4145, 21.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245547", "mag": 1.86, "time": 1505390326640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.506167, 37.5615, 15.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825126", "mag": 1.4, "time": 1505389290941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5082, 60.1407, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825125", "mag": 1.0, "time": 1505389269829, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3654, 61.4964, 18.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861166", "mag": 1.9, "time": 1505388913353, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3862, 51.6162, 20.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825120", "mag": 2.1, "time": 1505388602725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.7931, 54.8482, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825116", "mag": 1.5, "time": 1505388522841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3442, 61.3489, 49.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16825115", "mag": 1.2, "time": 1505388281614, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5528, 61.7241, 28.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824940", "mag": 1.2, "time": 1505387093135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3758, 61.1701, 24.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892141", "mag": 1.22, "time": 1505386514410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.131, 36.571833, 9.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824937", "mag": 2.5, "time": 1505385684936, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.0082, 52.3291, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824932", "mag": 1.6, "time": 1505384400903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5379, 59.9886, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824930", "mag": 1.2, "time": 1505383839558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.3238, 66.4782, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861154", "mag": 1.9, "time": 1505383026342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.851, 54.0129, 69.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907791", "mag": 1.61, "time": 1505382391650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.223667, 18.879, 14.409 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824762", "mag": 1.4, "time": 1505381878343, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4212, 60.1553, 64.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824759", "mag": 2.0, "time": 1505381875397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7269, 61.5265, 60.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892131", "mag": 0.97, "time": 1505381710130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720001, 38.778168, 1.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824756", "mag": 2.0, "time": 1505380861272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0471, 60.1915, 70.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861150", "mag": 2.6, "time": 1505380391671, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8518, 53.4455, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824753", "mag": 2.6, "time": 1505380263376, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.1582, 56.2796, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245457", "mag": 2.53, "time": 1505379272870, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.827333, 40.120667, -3.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762823", "mag": 2.96, "time": 1505378281630, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.181833, 31.831667, 18.32 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892121", "mag": 1.02, "time": 1505377845780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.717499, 38.774666, 2.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892116", "mag": 1.11, "time": 1505377833950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.714333, 38.776667, 1.68 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am81", "mag": 4.6, "time": 1505377166860, "felt": 66, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.4481, -11.977, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235208", "mag": 1.81, "time": 1505376928150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.570333, 37.345667, 5.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824583", "mag": 1.6, "time": 1505376729312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4585, 60.3656, 97.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892106", "mag": 1.19, "time": 1505376712450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799833, 38.712667, 4.08 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762815", "mag": 1.04, "time": 1505374690080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.221833, 32.924167, 12.12 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824572", "mag": 1.6, "time": 1505374660381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7598, 65.436, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am75", "mag": 4.4, "time": 1505372640680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.6754, -34.2973, 1.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824419", "mag": 1.8, "time": 1505372310107, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5103, 60.0002, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762807", "mag": 1.14, "time": 1505372248820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.872333, 36.502833, 6.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824418", "mag": 1.0, "time": 1505372093089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8634, 59.8384, 41.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824415", "mag": 1.3, "time": 1505371860862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4454, 63.0596, 8.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762783", "mag": 1.64, "time": 1505371108250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.625167, 32.844, 11.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824411", "mag": 1.3, "time": 1505371053195, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1765, 60.359, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aywv", "mag": 4.0, "time": 1505370268660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6903, 15.5507, 43.43 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762759", "mag": 1.32, "time": 1505370002700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.733, 33.668167, 13.69 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907731", "mag": 1.75, "time": 1505369997330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.382, 19.236, 32.221 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762751", "mag": 0.96, "time": 1505369947950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.731167, 33.674333, 14.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aywt", "mag": 4.0, "time": 1505369661520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2582, 14.9559, 25.35 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892081", "mag": 1.08, "time": 1505369496760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1615, 36.5675, 3.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am6i", "mag": 4.5, "time": 1505369450740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3229, 15.1323, 35.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am6b", "mag": 4.4, "time": 1505369156780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7112, 15.4856, 25.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am61", "mag": 3.0, "time": 1505368177800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3656, 36.7402, 7.992 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907641", "mag": 2.26, "time": 1505367585250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.425667, 19.294167, 8.845 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arcx", "mag": 3.2, "time": 1505367393080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4046, 51.5999, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am5i", "mag": 4.2, "time": 1505366427980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0841, 14.4266, 49.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amaf", "mag": 4.7, "time": 1505366112080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.0489, -1.356, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892391", "mag": 1.0, "time": 1505365754150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.669167, 40.386833, 6.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am56", "mag": 4.7, "time": 1505365399680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0709, 14.4637, 52.71 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255284", "mag": 0.98, "time": 1505365218550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522, 46.8975, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861140", "mag": 1.2, "time": 1505365047321, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0097, 62.5721, 78.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762615", "mag": 0.95, "time": 1505364900090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.405833, 33.049333, 3.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892056", "mag": 1.38, "time": 1505364695740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834, 37.54, 4.68 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307352", "mag": 1.78, "time": 1505364485340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.942833, 46.866667, 10.19 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824230", "mag": 1.9, "time": 1505364358950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.959, 59.8075, 60.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762599", "mag": 1.23, "time": 1505364106870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.992833, 33.957167, 16.75 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762591", "mag": 2.12, "time": 1505363550640, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.864667, 34.336333, 2.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892041", "mag": 1.83, "time": 1505363410540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.540667, 4.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16824097", "mag": 1.0, "time": 1505363016608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1668, 62.6309, 61.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am4b", "mag": 3.2, "time": 1505362481060, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9406, 37.3096, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823967", "mag": 2.0, "time": 1505361191283, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2972, 61.0176, 70.0 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257000", "mag": 4.32, "time": 1505360450920, "felt": 14, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.791, 18.2223, 133.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am3s", "mag": 3.3, "time": 1505360430180, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5112, 36.2854, 3.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762583", "mag": 1.43, "time": 1505358534420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6335, 37.005167, 1.55 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762575", "mag": 1.39, "time": 1505358219310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.606667, 32.828, 12.41 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762567", "mag": 1.41, "time": 1505358109150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.427667, 34.225833, 13.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amd4", "mag": 3.2, "time": 1505357901130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4442, 42.5241, 6.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amd0", "mag": 3.1, "time": 1505357873450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4212, 42.5232, 8.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am2z", "mag": 4.0, "time": 1505357591000, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4618, 42.5096, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245162", "mag": 3.43, "time": 1505357581000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426833, 42.522333, 7.86 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861134", "mag": 1.6, "time": 1505356675370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8887, 59.6609, 90.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823826", "mag": 1.2, "time": 1505356643722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.394, 60.1683, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am28", "mag": 2.4, "time": 1505356555350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4263, 42.5303, 6.85 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605135", "mag": 1.0, "time": 1505356439739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8899, 37.3603, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823823", "mag": 1.2, "time": 1505356197786, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8776, 62.7371, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892031", "mag": 0.98, "time": 1505355727940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737663, 38.785168, 2.12 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892026", "mag": 1.09, "time": 1505355720450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.746833, 38.787833, 0.11 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861131", "mag": 1.7, "time": 1505355503652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2915, 59.077, 76.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72892021", "mag": 1.67, "time": 1505355378570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.139667, 37.139, 11.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823809", "mag": 1.2, "time": 1505354254705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3285, 60.1933, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am21", "mag": 3.2, "time": 1505353999720, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 22.899, 42.6704, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762543", "mag": 1.21, "time": 1505353838790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.543667, 34.513833, 6.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am1y", "mag": 2.6, "time": 1505353481360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4312, 42.6014, 6.92 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823693", "mag": 1.0, "time": 1505351348552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.644, 62.6994, 58.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823694", "mag": 2.1, "time": 1505351146642, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.5002, 54.7664, 27.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823688", "mag": 1.1, "time": 1505350854568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6619, 59.8124, 15.7 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017257001", "mag": 1.33, "time": 1505350270080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.141, 18.0321, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823577", "mag": 2.7, "time": 1505349755149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3635, 54.4582, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861124", "mag": 1.1, "time": 1505349382106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2989, 65.668, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am0x", "mag": 4.6, "time": 1505348843700, "felt": 139, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.6152, 35.7719, 48.83 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762495", "mag": 1.0, "time": 1505347877510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3345, 33.3545, 11.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823574", "mag": 2.8, "time": 1505347636545, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.3466, 52.1109, 79.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823573", "mag": 2.3, "time": 1505347560653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4123, 51.617, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762487", "mag": 1.28, "time": 1505347417680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2715, 33.976667, 5.05 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907326", "mag": 1.75, "time": 1505347375860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.394165, 19.238333, 32.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16861121", "mag": 1.7, "time": 1505347241023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4, 51.6505, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907236", "mag": 2.19, "time": 1505347011230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3835, 19.243, 32.131 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891986", "mag": 1.15, "time": 1505346581750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5475, 37.143167, 3.07 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307262", "mag": 1.18, "time": 1505346312450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.458833, 45.814167, -0.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823443", "mag": 1.7, "time": 1505346090013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3313, 60.824, 55.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762463", "mag": 2.21, "time": 1505345845770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.610333, 32.834, 14.54 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762455", "mag": 1.23, "time": 1505345794660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.613333, 32.828, 12.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823442", "mag": 1.4, "time": 1505345681125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1366, 63.4085, 115.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255184", "mag": 0.99, "time": 1505345517200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.161833, 48.091333, 6.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823441", "mag": 1.4, "time": 1505345131416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9358, 61.9565, 65.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alzg", "mag": 4.2, "time": 1505344897150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.4183, -18.058, 145.27 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823332", "mag": 2.8, "time": 1505344031893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3482, 51.3154, 44.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823330", "mag": 1.3, "time": 1505343882913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3403, 64.9963, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alyy", "mag": 3.2, "time": 1505343206750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5646, 46.8793, 10.55 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307247", "mag": 1.57, "time": 1505343065140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.347833, 44.090833, -1.55 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762423", "mag": 2.63, "time": 1505342925380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6105, 32.832833, 13.39 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235168", "mag": 1.72, "time": 1505342816860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.966333, 37.277833, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245097", "mag": 1.4, "time": 1505342728590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.0425, 44.6825, 13.02 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762407", "mag": 1.11, "time": 1505342669930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2705, 33.978, 5.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830577", "mag": 2.2, "time": 1505342546550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6253, 55.5692, 53.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762415", "mag": 1.75, "time": 1505342494590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.999333, 33.073, -0.12 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605103", "mag": 1.1, "time": 1505342257553, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.367, 38.5022, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762399", "mag": 1.66, "time": 1505342009270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.612333, 32.834667, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762391", "mag": 1.75, "time": 1505341937760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.613, 32.838667, 12.07 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762383", "mag": 1.83, "time": 1505341540510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.614, 32.8335, 12.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762367", "mag": 3.47, "time": 1505341287040, "felt": 39, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.615833, 32.843833, 15.23 ] } }, +{ "type": "Feature", "properties": { "id": "hv61907176", "mag": 1.67, "time": 1505340803980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.213667, 19.3035, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823316", "mag": 2.5, "time": 1505340733287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3859, 61.6698, 29.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891951", "mag": 1.45, "time": 1505340188960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.841667, 37.532167, -1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830575", "mag": 1.5, "time": 1505340177499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5229, 57.7401, 52.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762359", "mag": 1.73, "time": 1505340060360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.274, 33.976333, 5.08 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762351", "mag": 3.26, "time": 1505339982500, "felt": 19, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.276, 33.975333, 3.91 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830574", "mag": 1.6, "time": 1505339727053, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4531, 53.5386, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823310", "mag": 1.1, "time": 1505339360762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5682, 53.9212, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762343", "mag": 1.12, "time": 1505339170890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795167, 33.507167, 4.82 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255169", "mag": 1.13, "time": 1505339091750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.622667, 46.909667, 10.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alwi", "mag": 4.7, "time": 1505338937260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0086, 15.1566, 38.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762335", "mag": 1.17, "time": 1505338520010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.614667, 32.832167, 10.18 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762327", "mag": 1.59, "time": 1505338477140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.615333, 32.843, 15.01 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245082", "mag": 1.54, "time": 1505338298430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.043833, 44.678167, 13.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alvq", "mag": 5.0, "time": 1505338251370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9904, 15.7092, 39.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891936", "mag": 1.29, "time": 1505338239110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.017333, 37.5655, -0.37 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762303", "mag": 1.69, "time": 1505337757160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.504167, 5.32 ] } }, +{ "type": "Feature", "properties": { "id": "uu60245072", "mag": 1.82, "time": 1505336663200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.075667, 44.674, 5.83 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762287", "mag": 1.49, "time": 1505336435640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.498833, 33.8575, -0.61 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255154", "mag": 2.29, "time": 1505335433020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.7145, 46.9035, 15.16 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891916", "mag": 1.11, "time": 1505334220120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7985, 38.833168, 1.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891911", "mag": 1.01, "time": 1505333988430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811165, 38.815666, 2.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823196", "mag": 1.7, "time": 1505333862556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2791, 60.1339, 58.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891901", "mag": 1.64, "time": 1505333181410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814, 38.8085, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891896", "mag": 1.52, "time": 1505332739060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817667, 37.481167, 0.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762231", "mag": 1.56, "time": 1505331922920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.381833, 35.980833, 4.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alqh", "mag": 4.6, "time": 1505331447000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 112.9501, -6.0986, 590.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alq6", "mag": 3.0, "time": 1505331233180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4525, 42.6029, 6.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823083", "mag": 1.8, "time": 1505330838320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.8987, 61.0912, 0.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823082", "mag": 1.3, "time": 1505330810883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7682, 61.1384, 6.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823080", "mag": 1.9, "time": 1505329947650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7636, 59.6753, 80.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762215", "mag": 1.01, "time": 1505329786970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1445, 33.667, -0.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891881", "mag": 1.2, "time": 1505329775160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.850167, 37.644667, 5.63 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762207", "mag": 1.15, "time": 1505329688010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.187167, 34.993167, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830566", "mag": 2.0, "time": 1505328672149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.302, 51.3949, 36.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822979", "mag": 1.3, "time": 1505328502909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3078, 61.2967, 15.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891876", "mag": 1.1, "time": 1505327236230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745666, 38.787834, 1.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822977", "mag": 1.3, "time": 1505326599778, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0157, 63.5538, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891871", "mag": 2.5, "time": 1505325897250, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0595, 40.449667, 16.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891866", "mag": 1.77, "time": 1505325532440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0005, 35.943167, 17.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891861", "mag": 1.4, "time": 1505325215290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.600167, 35.482, -0.46 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762175", "mag": 1.47, "time": 1505324991750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609, 32.840667, 14.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822975", "mag": 1.2, "time": 1505324283732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2438, 62.4485, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891851", "mag": 1.07, "time": 1505324016940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.841167, 37.491667, -0.1 ] } }, +{ "type": "Feature", "properties": { "id": "se60179327", "mag": 3.2, "time": 1505323990930, "felt": 525, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -80.703, 37.472833, 17.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822973", "mag": 1.1, "time": 1505323870033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7446, 59.8908, 41.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830561", "mag": 1.8, "time": 1505323399318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9553, 59.6095, 109.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830560", "mag": 2.0, "time": 1505322404855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5059, 60.1768, 153.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alkc", "mag": 4.4, "time": 1505321962400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6803, 15.7969, 43.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830559", "mag": 1.8, "time": 1505321554841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8197, 51.97, 7.3 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891831", "mag": 2.56, "time": 1505318816290, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.704667, 40.484, 16.91 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822799", "mag": 1.8, "time": 1505318719906, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.4098, 51.7491, 29.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822798", "mag": 1.1, "time": 1505318596103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8143, 62.8428, 67.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906796", "mag": 2.1, "time": 1505317840280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.485504, 19.219, 36.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822695", "mag": 1.3, "time": 1505316869586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4592, 63.3484, 0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asbr", "mag": 4.3, "time": 1505316791790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.1284, -4.88, 54.06 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906781", "mag": 1.87, "time": 1505316745210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.889333, 19.9115, 24.592 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alhx", "mag": 5.0, "time": 1505316098600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.9266, -10.7647, 46.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822692", "mag": 2.1, "time": 1505315572825, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2966, 59.7717, 67.1 ] } }, +{ "type": "Feature", "properties": { "id": "nm60179312", "mag": 1.77, "time": 1505315298800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.672667, 36.156667, 9.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822691", "mag": 1.8, "time": 1505315111913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8055, 59.8229, 63.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822689", "mag": 1.5, "time": 1505313796189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.627, 60.7945, 30.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762039", "mag": 1.34, "time": 1505312641900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.791, 36.012167, 1.22 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605012", "mag": 1.1, "time": 1505309502885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9116, 38.3879, 15.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830551", "mag": 1.1, "time": 1505309158928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8896, 60.3719, 15.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822590", "mag": 1.1, "time": 1505309077336, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.3908, 66.2048, 11.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255099", "mag": 1.92, "time": 1505309076210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.547833, 44.257, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891776", "mag": 1.02, "time": 1505308975510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.918167, 37.593167, 0.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822588", "mag": 1.4, "time": 1505308950441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4711, 65.4989, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604990", "mag": 2.3, "time": 1505308914949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818, 38.8311, 8.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37762007", "mag": 2.3, "time": 1505308483530, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.585667, 35.139667, 1.62 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761999", "mag": 1.26, "time": 1505308208470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6185, 32.838, 13.81 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906676", "mag": 1.95, "time": 1505307948740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.298996, 19.424334, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761983", "mag": 1.11, "time": 1505307567020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.623, 32.839333, 10.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alfh", "mag": 4.5, "time": 1505306912090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7023, 15.8472, 95.22 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255094", "mag": 1.19, "time": 1505305625190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.642667, 46.956667, 13.27 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761967", "mag": 0.99, "time": 1505305387220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.587333, 36.179667, 0.99 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891766", "mag": 1.15, "time": 1505305306770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.820333, 38.804, 2.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anw3", "mag": 2.5, "time": 1505305272030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.6774, 53.9359, 13.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761959", "mag": 1.4, "time": 1505304763660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.829167, 32.782333, 3.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asbk", "mag": 4.1, "time": 1505303510580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1783, 2.9917, 58.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891751", "mag": 0.99, "time": 1505303358450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.082167, 35.707667, 6.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822583", "mag": 1.1, "time": 1505302645910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3182, 60.2384, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822582", "mag": 2.3, "time": 1505302558389, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.6566, 51.5758, 56.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alew", "mag": 3.9, "time": 1505302030040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2516, 14.855, 22.24 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255084", "mag": 1.07, "time": 1505300960250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.511667, 46.9035, 5.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822577", "mag": 1.5, "time": 1505300414194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9212, 64.7545, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alee", "mag": 3.3, "time": 1505299970430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6225, 59.7836, 5.44 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244877", "mag": 2.35, "time": 1505299838240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.8535, 44.770833, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891746", "mag": 1.53, "time": 1505299590270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793, 38.8215, 3.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830540", "mag": 1.9, "time": 1505298481141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1134, 57.8805, 76.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000anw1", "mag": 3.0, "time": 1505298226550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.0008, 50.1653, 25.9 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604987", "mag": 1.7, "time": 1505298050456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8103, 39.3643, 9.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822473", "mag": 1.2, "time": 1505297484913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4897, 63.0467, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822472", "mag": 2.4, "time": 1505297294726, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0416, 53.5692, 24.5 ] } }, +{ "type": "Feature", "properties": { "id": "uw61307017", "mag": 1.34, "time": 1505297037790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.764333, 48.271333, 1.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830536", "mag": 1.2, "time": 1505297029108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7778, 60.5002, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244867", "mag": 2.44, "time": 1505296698750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422, 42.567833, 7.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aldk", "mag": 4.3, "time": 1505296627560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9055, 15.639, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761935", "mag": 1.02, "time": 1505296379600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6215, 32.831333, 10.19 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aldd", "mag": 4.5, "time": 1505295980580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7401, 15.5449, 31.41 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ald3", "mag": 2.4, "time": 1505295918600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9039, 36.2089, 4.448 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822468", "mag": 2.5, "time": 1505295654705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2898, 58.6446, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ald0", "mag": 4.3, "time": 1505295123840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5523, -23.5684, 541.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822374", "mag": 2.1, "time": 1505294583800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5476, 52.7346, 39.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alcs", "mag": 3.9, "time": 1505294302600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2348, 15.2732, 42.03 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906586", "mag": 2.11, "time": 1505294188360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.356003, 19.467167, 4.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891726", "mag": 1.09, "time": 1505293695870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793831, 38.822334, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alcf", "mag": 2.6, "time": 1505292526080, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4275, 42.596, 6.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822373", "mag": 1.5, "time": 1505292217097, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4702, 60.5679, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604985", "mag": 1.6, "time": 1505292088777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.548, 37.4198, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891721", "mag": 1.57, "time": 1505290933360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.889333, 39.366167, 10.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822371", "mag": 1.4, "time": 1505290808147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8609, 62.2453, 3.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822294", "mag": 1.5, "time": 1505289269698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7566, 62.9227, 94.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822278", "mag": 1.1, "time": 1505287972451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7433, 64.7476, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822251", "mag": 3.4, "time": 1505287366858, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5871, 61.6459, 24.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822240", "mag": 4.2, "time": 1505287337046, "felt": 42, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9213, 62.8983, 79.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000albc", "mag": 2.3, "time": 1505286819380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4494, 42.6632, 10.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830527", "mag": 1.8, "time": 1505286603893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0388, 59.8755, 109.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822236", "mag": 1.3, "time": 1505286374065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3111, 60.5579, 12.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891681", "mag": 1.39, "time": 1505286150510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8285, 37.467, -1.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822233", "mag": 1.6, "time": 1505285865490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8651, 62.2629, 96.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alb7", "mag": 2.6, "time": 1505285839040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4177, 42.5618, 8.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830523", "mag": 1.7, "time": 1505285675768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.1432, 53.7072, 69.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alb2", "mag": 4.5, "time": 1505284765560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.084, -22.1327, 549.09 ] } }, +{ "type": "Feature", "properties": { "id": "nn00605030", "mag": 1.1, "time": 1505284250632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9094, 38.3681, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830521", "mag": 1.2, "time": 1505284146176, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8175, 60.5189, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alax", "mag": 4.7, "time": 1505283996200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.6079, 13.4506, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891656", "mag": 2.62, "time": 1505283657320, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803833, 37.486167, 2.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761831", "mag": 1.06, "time": 1505283115050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795667, 33.5045, 6.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822160", "mag": 1.4, "time": 1505282783934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9732, 60.9785, 5.5 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255029", "mag": 1.01, "time": 1505281846410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5335, 46.862167, 10.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822085", "mag": 1.5, "time": 1505279524459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.8464, 60.3009, 18.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ala9", "mag": 4.5, "time": 1505279374230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.453, 15.3914, 72.28 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761799", "mag": 0.97, "time": 1505279080610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.108167, 34.0375, 6.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16830517", "mag": 1.1, "time": 1505278511333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4202, 60.2062, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255024", "mag": 0.95, "time": 1505278401320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.864167, 11.03 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891626", "mag": 1.1, "time": 1505277590570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.657667, 37.1885, 3.74 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891621", "mag": 1.74, "time": 1505277415750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.886167, 39.3655, 10.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822082", "mag": 1.6, "time": 1505275993590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0455, 67.102, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891611", "mag": 1.07, "time": 1505275610780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795, 38.834667, 1.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822080", "mag": 3.5, "time": 1505275475357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4947, 51.6652, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891606", "mag": 2.64, "time": 1505275168490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793833, 38.835667, 1.89 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255014", "mag": 0.96, "time": 1505274355010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.537, 46.87, 9.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891581", "mag": 0.95, "time": 1505273207520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795166, 38.836666, 1.37 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255009", "mag": 1.36, "time": 1505273099690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536167, 46.872333, 11.58 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017256002", "mag": 2.65, "time": 1505272611930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.4988, 19.1065, 25.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891561", "mag": 0.95, "time": 1505272540610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.796669, 38.836834, 1.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891556", "mag": 1.43, "time": 1505272430980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798333, 38.835167, 1.85 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891551", "mag": 2.57, "time": 1505272400990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795667, 38.835, 1.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al90", "mag": 4.7, "time": 1505272023240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.0946, 9.5711, 124.17 ] } }, +{ "type": "Feature", "properties": { "id": "mb80255004", "mag": 1.06, "time": 1505270988240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532, 46.864667, 11.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al8v", "mag": 4.4, "time": 1505270586710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5721, 15.2889, 34.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761727", "mag": 1.4, "time": 1505270305170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.643667, 34.5065, 17.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16822007", "mag": 1.0, "time": 1505269102037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6691, 63.5608, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017256000", "mag": 3.12, "time": 1505269072880, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5123, 19.091, 21.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891541", "mag": 1.06, "time": 1505268817240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.517833, 36.804167, 4.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821999", "mag": 1.7, "time": 1505268378179, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2198, 61.7575, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al86", "mag": 5.0, "time": 1505268098300, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5276, 15.1558, 14.07 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254989", "mag": 1.38, "time": 1505267929610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540667, 46.872333, 11.48 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254984", "mag": 0.99, "time": 1505267728460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5535, 46.8885, 10.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821934", "mag": 1.1, "time": 1505267091152, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2406, 64.8451, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891516", "mag": 1.94, "time": 1505266613010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.366833, 40.4805, 29.25 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017256001", "mag": 3.05, "time": 1505266581450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5053, 19.0955, 25.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761639", "mag": 2.16, "time": 1505265949130, "felt": 80, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.768667, 33.774833, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821933", "mag": 1.0, "time": 1505265920217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4031, 60.2216, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761631", "mag": 1.35, "time": 1505265794450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.333667, 32.933167, 11.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821931", "mag": 1.3, "time": 1505265469603, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5511, 61.3707, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al7y", "mag": 4.1, "time": 1505265414270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4234, 15.3254, 35.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821926", "mag": 2.1, "time": 1505265047390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5313, 60.6712, 14.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821924", "mag": 1.7, "time": 1505264772966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.5006, 65.2775, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al7s", "mag": 4.1, "time": 1505263876510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.3188, 15.5954, 29.98 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906111", "mag": 1.46, "time": 1505262900730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.538167, 19.256333, 8.429 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891421", "mag": 1.92, "time": 1505262602400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.273167, 36.148167, 8.47 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906101", "mag": 2.02, "time": 1505262046800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.276672, 19.404333, 0.19 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891406", "mag": 1.7, "time": 1505261981400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.865667, 36.439667, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al7a", "mag": 3.9, "time": 1505261942310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.399, 14.9659, 29.81 ] } }, +{ "type": "Feature", "properties": { "id": "hv61906081", "mag": 1.94, "time": 1505261244650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.535, 19.849, 23.752 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761535", "mag": 1.56, "time": 1505261179000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165833, 34.0375, 5.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850793", "mag": 2.2, "time": 1505260675964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4757, 53.3828, 38.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821817", "mag": 1.0, "time": 1505258496556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.5762, 67.0334, 2.1 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306902", "mag": 1.1, "time": 1505258286020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.374667, 45.693833, -0.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al6d", "mag": 4.9, "time": 1505257835180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4621, 58.0975, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761503", "mag": 1.49, "time": 1505257449290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.675833, 35.043, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821811", "mag": 1.3, "time": 1505256864247, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3463, 64.994, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61905981", "mag": 1.81, "time": 1505256516770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.543333, 19.851167, 24.833 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821806", "mag": 2.7, "time": 1505256286618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4621, 65.79, 5.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821804", "mag": 1.5, "time": 1505255958164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3411, 61.6898, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al5m", "mag": 4.0, "time": 1505255324930, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.8843, -20.2485, 15.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al5h", "mag": 4.8, "time": 1505254407650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.3543, 58.0241, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891326", "mag": 1.22, "time": 1505251854350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.794833, 38.819333, 2.91 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761407", "mag": 1.17, "time": 1505251524970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.193167, 34.9985, -0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al44", "mag": 4.6, "time": 1505250860230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4259, 58.0753, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821734", "mag": 1.5, "time": 1505250673775, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.907, 60.3564, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al3g", "mag": 4.9, "time": 1505250247360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4208, 58.165, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891306", "mag": 1.1, "time": 1505250244890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819333, 37.604167, 3.81 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761383", "mag": 1.74, "time": 1505250166450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.805333, 33.691833, 15.39 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761375", "mag": 1.49, "time": 1505248746150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3685, 33.956333, 12.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761367", "mag": 1.03, "time": 1505248730160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.575167, 33.465333, 9.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al2x", "mag": 4.8, "time": 1505248700330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.19, -15.0799, 144.26 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891286", "mag": 2.07, "time": 1505247727770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5795, 39.603833, -0.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821575", "mag": 1.5, "time": 1505247191039, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9811, 64.7032, 15.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al1n", "mag": 2.7, "time": 1505247025290, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3683, 36.7446, 14.63 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891281", "mag": 1.59, "time": 1505246933110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827333, 38.839, 2.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al1t", "mag": 4.3, "time": 1505246854930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4239, 15.7169, 52.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891276", "mag": 1.98, "time": 1505246713670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.876833, 37.8095, 14.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850781", "mag": 1.8, "time": 1505246486363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5902, 57.2026, 44.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761335", "mag": 0.96, "time": 1505246263650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.759333, 33.8575, 5.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761319", "mag": 2.18, "time": 1505245563030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.385, 32.3285, 10.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850780", "mag": 3.0, "time": 1505245054736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5817, 52.3665, 32.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821568", "mag": 1.3, "time": 1505244764083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4179, 63.5705, 4.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891271", "mag": 2.16, "time": 1505244492580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.146667, 40.211833, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891266", "mag": 1.1, "time": 1505244145950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.875667, 38.839667, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al0z", "mag": 4.4, "time": 1505243754080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7715, -21.9227, 347.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821516", "mag": 1.4, "time": 1505243650979, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5267, 60.0018, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821564", "mag": 1.6, "time": 1505243467122, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2171, 59.7927, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akzt", "mag": 4.7, "time": 1505243351270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.2455, 58.0337, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akzf", "mag": 4.3, "time": 1505243172030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6417, 15.6677, 51.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akyq", "mag": 4.4, "time": 1505241724530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9743, 16.3622, 66.45 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891231", "mag": 1.19, "time": 1505241397800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.244667, 39.3805, 3.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akyh", "mag": 4.4, "time": 1505241368140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5996, 15.3334, 74.72 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aky8", "mag": 4.6, "time": 1505240973270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0643, 15.2212, 44.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850775", "mag": 1.7, "time": 1505240703529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2159, 59.366, 81.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akxq", "mag": 2.8, "time": 1505240585080, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4572, 42.5165, 8.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821457", "mag": 1.1, "time": 1505238948365, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1631, 60.0754, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850772", "mag": 1.0, "time": 1505238898070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2683, 61.5446, 35.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61905641", "mag": 2.1, "time": 1505238187460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.247667, 19.393167, 36.582 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq68", "mag": 2.8, "time": 1505237765880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.9785, 55.7766, 56.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akwr", "mag": 4.3, "time": 1505237620800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.6779, -5.2108, 218.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821449", "mag": 2.3, "time": 1505236529463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4402, 53.5209, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821379", "mag": 2.4, "time": 1505235536293, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4636, 60.5717, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akvp", "mag": 4.5, "time": 1505235493410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2449, 15.2798, 73.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq63", "mag": 3.1, "time": 1505235473870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.5043, 53.6304, 25.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821334", "mag": 1.0, "time": 1505235138364, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.7095, 60.5946, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891191", "mag": 1.63, "time": 1505235102110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.444167, 37.384167, 12.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akwm", "mag": 4.6, "time": 1505234310180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -58.4081, 13.9047, 20.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821326", "mag": 1.9, "time": 1505234239386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7021, 63.9919, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761199", "mag": 1.12, "time": 1505233979950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.139333, 35.857167, 3.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821324", "mag": 1.0, "time": 1505233378354, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8118, 65.9855, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821323", "mag": 2.3, "time": 1505232589454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.3915, 52.0051, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891166", "mag": 1.17, "time": 1505232534860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.976167, 37.596833, 8.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akua", "mag": 4.5, "time": 1505231911880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.3156, -7.5665, 115.97 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761183", "mag": 1.38, "time": 1505231682740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.031667, 33.866, 11.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891131", "mag": 1.13, "time": 1505231490780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821167, 37.605, 4.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq60", "mag": 3.4, "time": 1505230949090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.7818, 52.0274, 61.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akty", "mag": 4.1, "time": 1505230831380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0909, 55.1751, 22.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asax", "mag": 4.2, "time": 1505230532990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.919, -24.5557, 553.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aktu", "mag": 5.0, "time": 1505230101200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9204, 15.0356, 34.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761159", "mag": 0.99, "time": 1505229927560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794, 33.505667, 4.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akts", "mag": 4.4, "time": 1505229916500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4589, 15.8693, 40.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850759", "mag": 2.0, "time": 1505229684203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4729, 57.3614, 66.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asau", "mag": 4.5, "time": 1505228968140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.2892, -30.4261, 12.38 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akt9", "mag": 4.7, "time": 1505227714260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.6472, -14.1046, 43.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821264", "mag": 1.4, "time": 1505227661290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5591, 61.6356, 28.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821262", "mag": 1.8, "time": 1505227098718, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5176, 60.4846, 107.4 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255006", "mag": 3.11, "time": 1505226988680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.8866, 18.066, 112.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821260", "mag": 1.3, "time": 1505226855029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.482, 62.559, 83.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761111", "mag": 1.33, "time": 1505226544460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166, 34.036, 5.82 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891096", "mag": 1.34, "time": 1505226449930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7255, 38.788667, 1.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850755", "mag": 1.5, "time": 1505226255965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5898, 60.4951, 99.5 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244417", "mag": 1.65, "time": 1505226014340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.334667, 44.621667, 2.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq5x", "mag": 3.1, "time": 1505225597950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.3403, 52.1694, 67.96 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244407", "mag": 1.34, "time": 1505225495130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.467, 42.663667, 3.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821259", "mag": 1.2, "time": 1505225438730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3559, 60.1768, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821258", "mag": 1.2, "time": 1505225170339, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1399, 60.3035, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821221", "mag": 1.0, "time": 1505223846302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7846, 53.7799, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821217", "mag": 1.4, "time": 1505223357390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7209, 60.3452, 65.8 ] } }, +{ "type": "Feature", "properties": { "id": "hv61905526", "mag": 1.72, "time": 1505223290340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.929167, 19.870667, 12.697 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821215", "mag": 1.4, "time": 1505223177976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.314, 60.1844, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244352", "mag": 2.41, "time": 1505222826990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.443167, 42.595, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821210", "mag": 1.0, "time": 1505222200792, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0089, 61.3182, 28.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akri", "mag": 2.9, "time": 1505221931200, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9201, 36.2062, 6.163 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821207", "mag": 2.0, "time": 1505221802809, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9996, 62.229, 72.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akrz", "mag": 2.5, "time": 1505220235620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5432, 46.8852, 12.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821169", "mag": 1.1, "time": 1505219786301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9544, 67.3188, 9.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821166", "mag": 1.0, "time": 1505219272070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.0159, 59.8987, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891076", "mag": 1.16, "time": 1505219059140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.602667, 4.12 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761079", "mag": 1.06, "time": 1505218941580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.819667, 33.71, 15.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850742", "mag": 2.4, "time": 1505218654701, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4252, 51.6857, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821165", "mag": 1.0, "time": 1505218329490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4876, 60.0043, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821163", "mag": 1.3, "time": 1505217760897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4102, 62.0418, 78.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891061", "mag": 0.96, "time": 1505217348960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.826333, 37.602833, 3.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821126", "mag": 1.3, "time": 1505216937519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1452, 62.8895, 56.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821125", "mag": 1.1, "time": 1505216743699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6326, 60.2201, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821120", "mag": 1.7, "time": 1505216018269, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0049, 60.6518, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821119", "mag": 1.5, "time": 1505215652902, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8093, 53.7706, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akpn", "mag": 4.7, "time": 1505215606400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.7514, 27.9618, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850734", "mag": 1.1, "time": 1505215354092, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0512, 61.2674, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akpc", "mag": 4.2, "time": 1505214378050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8032, 16.1985, 37.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244277", "mag": 1.7, "time": 1505214238510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.430167, 38.334333, 2.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821114", "mag": 1.9, "time": 1505213809149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8883, 61.2794, 95.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891031", "mag": 1.31, "time": 1505213535320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.861167, 37.426667, 3.97 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244252", "mag": 1.02, "time": 1505213356870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.007333, 44.7855, 7.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821079", "mag": 1.4, "time": 1505212565937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7135, 59.8217, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72891026", "mag": 1.86, "time": 1505212446760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.801833, 35.832333, 9.72 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306757", "mag": 1.64, "time": 1505211458410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.728833, 46.841667, -2.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821074", "mag": 1.9, "time": 1505210888686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7981, 61.0848, 49.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37761007", "mag": 0.97, "time": 1505210308130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.34, 33.3915, 3.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821073", "mag": 1.0, "time": 1505210226661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8733, 61.5592, 31.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aknn", "mag": 4.7, "time": 1505209925680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.31, -20.0675, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850728", "mag": 1.6, "time": 1505209600286, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4588, 61.074, 107.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244207", "mag": 2.1, "time": 1505209143550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.465333, 42.608333, 2.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850727", "mag": 1.6, "time": 1505208401509, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2489, 60.3172, 132.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821071", "mag": 1.7, "time": 1505208310612, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6819, 58.4203, 78.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aknb", "mag": 4.4, "time": 1505208006490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7329, 15.7927, 47.14 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821038", "mag": 1.4, "time": 1505207062279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7269, 62.2754, 47.5 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255004", "mag": 3.01, "time": 1505207032870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.6503, 18.1753, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821031", "mag": 2.4, "time": 1505206694908, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4161, 60.188, 103.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61905311", "mag": 2.02, "time": 1505206056030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.975333, 19.557, 44.801 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821027", "mag": 2.1, "time": 1505205093842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4164, 57.0134, 65.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq5l", "mag": 3.0, "time": 1505204765080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2778, 52.1101, 228.97 ] } }, +{ "type": "Feature", "properties": { "id": "nm60179282", "mag": 1.12, "time": 1505204172200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.554167, 36.472, 8.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asam", "mag": 4.1, "time": 1505203793240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.4651, -4.9334, 167.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821023", "mag": 1.4, "time": 1505203680731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1732, 61.3766, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq5k", "mag": 2.8, "time": 1505203540370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5128, 54.8119, 22.77 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760911", "mag": 1.29, "time": 1505202683830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.019667, 34.347833, 1.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821022", "mag": 1.1, "time": 1505201992117, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4302, 65.4772, 14.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aq5j", "mag": 3.4, "time": 1505201513110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.335, 52.1151, 36.52 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604832", "mag": 1.5, "time": 1505201175706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.919, 38.3871, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821017", "mag": 1.4, "time": 1505201121331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8746, 64.7668, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akm6", "mag": 4.0, "time": 1505200774070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6261, 15.7276, 39.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821016", "mag": 1.1, "time": 1505200723657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6326, 59.9341, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890911", "mag": 1.14, "time": 1505200493800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.502, -0.69 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255005", "mag": 3.62, "time": 1505200390090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7348, 17.4213, 58.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000asal", "mag": 4.5, "time": 1505200235050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 175.9237, -40.6778, 35.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821015", "mag": 1.0, "time": 1505200050481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0733, 62.8571, 78.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890906", "mag": 1.85, "time": 1505199341840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.959667, 36.079833, 11.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820976", "mag": 4.5, "time": 1505198623340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0626, 55.2018, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820951", "mag": 1.3, "time": 1505198176732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6431, 63.3655, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604828", "mag": 1.4, "time": 1505197517767, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0826, 39.1124, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604827", "mag": 2.8, "time": 1505197059215, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.294, 37.806, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akla", "mag": 4.9, "time": 1505196044760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 70.8701, -26.0946, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760839", "mag": 1.35, "time": 1505195823730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.070833, 34.124, 7.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850710", "mag": 1.4, "time": 1505195695881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9514, 59.3304, 53.9 ] } }, +{ "type": "Feature", "properties": { "id": "uu60244052", "mag": 1.22, "time": 1505195536580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.435667, 42.555167, 6.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akkz", "mag": 4.4, "time": 1505195184110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3657, 15.4552, 61.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820948", "mag": 1.9, "time": 1505194916797, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7632, 53.2354, 44.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850708", "mag": 1.2, "time": 1505194707074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5938, 63.2379, 122.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254859", "mag": 1.15, "time": 1505194171440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.863, 11.45 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890836", "mag": 1.09, "time": 1505193911680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735833, 38.760833, 1.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akkp", "mag": 4.6, "time": 1505193612080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8716, 15.0886, 57.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820908", "mag": 2.5, "time": 1505193453186, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7231, 53.1426, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akkk", "mag": 5.3, "time": 1505192927120, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.832, 15.182, 60.95 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254849", "mag": 1.28, "time": 1505192738900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5175, 46.899833, 10.92 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254844", "mag": 1.54, "time": 1505192475320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.973833, 43.2425, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820905", "mag": 1.1, "time": 1505191714754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4231, 60.1297, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890796", "mag": 1.14, "time": 1505190808830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.502667, -0.15 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890791", "mag": 1.45, "time": 1505190617760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788, 37.455, 7.56 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255003", "mag": 1.94, "time": 1505190564980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3923, 18.5168, 23.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850705", "mag": 1.4, "time": 1505190149086, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3144, 60.1274, 78.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850704", "mag": 1.8, "time": 1505189303211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.0362, 56.0678, 8.4 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243967", "mag": 1.29, "time": 1505189093580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.059333, 40.568667, 7.12 ] } }, +{ "type": "Feature", "properties": { "id": "hv61905031", "mag": 2.8, "time": 1505189080390, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.320667, 21.633833, 8.469 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255001", "mag": 2.63, "time": 1505188852110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3921, 18.5325, 19.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254839", "mag": 2.17, "time": 1505188197080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530167, 46.8705, 12.49 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70235033", "mag": 2.06, "time": 1505188185670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.492167, 37.299667, 4.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890766", "mag": 2.21, "time": 1505187928020, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.319833, 40.4865, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760735", "mag": 1.81, "time": 1505187547790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.287333, 34.079667, 14.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850702", "mag": 1.3, "time": 1505187086661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8075, 61.2964, 89.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850701", "mag": 1.4, "time": 1505186992230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2832, 60.1725, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254834", "mag": 1.19, "time": 1505186273780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.863667, 13.34 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760703", "mag": 1.89, "time": 1505185679940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797333, 33.494667, 4.01 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255002", "mag": 2.13, "time": 1505185260690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.0131, 19.0945, 24.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890706", "mag": 2.85, "time": 1505184989380, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.6055, 4.17 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890701", "mag": 1.11, "time": 1505184817490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.468667, -0.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890691", "mag": 2.54, "time": 1505184593110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.502, 40.2965, 19.04 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760663", "mag": 0.96, "time": 1505184048300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1715, 34.0385, 5.42 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890681", "mag": 1.03, "time": 1505183875680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.4715, -1.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820879", "mag": 1.6, "time": 1505183679937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3232, 62.0502, 60.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850697", "mag": 1.5, "time": 1505183127519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0397, 60.1249, 106.2 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017255000", "mag": 3.99, "time": 1505182040830, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7961, 18.688, 102.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akii", "mag": 2.5, "time": 1505181688510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.5935, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16850696", "mag": 1.4, "time": 1505181679899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6734, 59.8319, 93.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820869", "mag": 1.9, "time": 1505181012974, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.001, 59.4008, 36.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820867", "mag": 1.9, "time": 1505180308488, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5196, 59.9375, 123.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820865", "mag": 1.6, "time": 1505179834308, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8744, 63.0936, 89.7 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243827", "mag": 1.28, "time": 1505179319200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414167, 42.53, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890631", "mag": 0.96, "time": 1505179150280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816, 37.475, 1.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760623", "mag": 1.18, "time": 1505178887000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.025, 36.311333, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890616", "mag": 1.11, "time": 1505178809900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820167, 37.474167, -0.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akhk", "mag": 5.1, "time": 1505178756750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.097, 15.4421, 48.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820847", "mag": 1.9, "time": 1505178590464, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8044, 60.0035, 75.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890606", "mag": 2.1, "time": 1505178296120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.471, -0.04 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akhe", "mag": 4.8, "time": 1505178017830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2744, 15.0853, 44.38 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akhb", "mag": 2.4, "time": 1505177859710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4236, 42.5422, 5.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760607", "mag": 1.78, "time": 1505177706210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796167, 33.491167, 3.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akh7", "mag": 2.8, "time": 1505177557480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4213, 42.5825, 7.47 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890576", "mag": 2.34, "time": 1505177324250, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.473, 0.51 ] } }, +{ "type": "Feature", "properties": { "id": "hv61904866", "mag": 1.99, "time": 1505176986190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.857, 19.358667, 41.774 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820845", "mag": 1.3, "time": 1505176784517, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3458, 60.155, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890561", "mag": 1.42, "time": 1505176270180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8195, 37.4765, -0.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820836", "mag": 2.9, "time": 1505175684396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1737, 62.7988, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243772", "mag": 1.28, "time": 1505175463030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.450167, 42.593667, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akgt", "mag": 2.7, "time": 1505175275390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.45, 42.6006, 6.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akgp", "mag": 3.1, "time": 1505174426060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4619, 42.5922, 9.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amy6", "mag": 3.4, "time": 1505174223950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0579, 52.772, 207.41 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amy5", "mag": 3.3, "time": 1505173482210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.0407, 51.8595, 146.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16820045", "mag": 1.1, "time": 1505171834061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9121, 61.9185, 44.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akg3", "mag": 4.4, "time": 1505171543900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3251, 15.4699, 53.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890511", "mag": 1.3, "time": 1505171391890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.012, 37.426833, 3.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akfs", "mag": 4.2, "time": 1505169617100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6345, 15.6178, 38.83 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akfr", "mag": 2.8, "time": 1505169599030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4698, 42.6061, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827363", "mag": 2.0, "time": 1505169544066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4581, 51.6497, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16819990", "mag": 1.0, "time": 1505169272029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1659, 59.9838, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827361", "mag": 1.5, "time": 1505168696545, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2029, 59.1798, 77.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760423", "mag": 1.26, "time": 1505168688630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3355, 32.933, 10.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akf8", "mag": 5.0, "time": 1505168453040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9567, 15.7603, 48.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16819215", "mag": 1.5, "time": 1505167702707, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4466, 62.4273, 81.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar1k", "mag": 4.4, "time": 1505167046570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.2966, -4.9444, 49.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890491", "mag": 1.11, "time": 1505166863970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.544833, 37.529, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akeb", "mag": 5.1, "time": 1505166728910, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -178.3593, 51.5235, 54.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16819167", "mag": 1.4, "time": 1505166664445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3213, 60.2363, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akdz", "mag": 4.3, "time": 1505166482960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.1669, 15.1965, 62.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akdq", "mag": 2.6, "time": 1505166481930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4105, 42.5306, 6.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827357", "mag": 2.3, "time": 1505165942611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.8283, 55.1229, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306477", "mag": 1.21, "time": 1505165549480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1755, 46.198833, 3.06 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890461", "mag": 2.23, "time": 1505164836450, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.939, 35.641167, 4.35 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayll", "mag": 4.1, "time": 1505164739710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6724, 15.4385, 31.22 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760359", "mag": 2.29, "time": 1505164180230, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.940167, 35.427833, 21.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akcq", "mag": 5.5, "time": 1505164150350, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0139, 14.9074, 27.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akch", "mag": 2.4, "time": 1505164053450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4202, 42.5566, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827356", "mag": 1.9, "time": 1505163754769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.4142, 51.8321, 32.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760351", "mag": 1.47, "time": 1505163661880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9785, 32.6095, -0.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827355", "mag": 1.0, "time": 1505163537708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7591, 65.4356, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604742", "mag": 1.3, "time": 1505163193915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9149, 38.3846, 5.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akbz", "mag": 4.1, "time": 1505162450200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.477, 52.2896, 65.69 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254709", "mag": 1.54, "time": 1505162126870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.327667, 46.1355, 6.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16818311", "mag": 2.4, "time": 1505162030333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.0, 53.2916, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16818304", "mag": 2.2, "time": 1505161796041, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.8204, 65.319, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16818297", "mag": 2.0, "time": 1505161193751, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8659, 62.8899, 99.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16818278", "mag": 3.2, "time": 1505160763887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.115, 63.145, 108.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254694", "mag": 1.38, "time": 1505160716790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540833, 46.904833, 11.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akaa", "mag": 2.5, "time": 1505159932140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4306, 42.5727, 7.14 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254684", "mag": 1.16, "time": 1505159186030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524833, 46.8675, 11.01 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827348", "mag": 1.2, "time": 1505158596706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2022, 60.4231, 48.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16817479", "mag": 2.9, "time": 1505158124591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5505, 65.8017, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16817476", "mag": 3.0, "time": 1505158119494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2439, 66.0161, 16.1 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604719", "mag": 1.3, "time": 1505157785095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8838, 38.8119, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890441", "mag": 1.74, "time": 1505157705880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.778, 38.7915, 3.48 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak9n", "mag": 3.0, "time": 1505157604550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.471, 42.609, 7.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16817472", "mag": 1.1, "time": 1505156621773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3067, 62.9071, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827345", "mag": 1.6, "time": 1505156304521, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3368, 59.849, 84.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16816710", "mag": 1.0, "time": 1505155839711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7252, 63.4914, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827343", "mag": 1.6, "time": 1505155190108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9414, 58.9343, 71.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243377", "mag": 2.04, "time": 1505154917000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.423167, 42.524333, 7.67 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak8v", "mag": 4.8, "time": 1505154337990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.9192, 10.9561, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827342", "mag": 1.4, "time": 1505154205074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0563, 59.7893, 104.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akih", "mag": 3.5, "time": 1505153371450, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -8.5745, 37.1247, 19.99 ] } }, +{ "type": "Feature", "properties": { "id": "ak16816675", "mag": 2.0, "time": 1505153241938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1793, 60.2771, 148.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604702", "mag": 1.1, "time": 1505152546779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8175, 38.8318, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890416", "mag": 1.57, "time": 1505151412520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.474, -0.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak7u", "mag": 5.7, "time": 1505151309620, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.3373, 23.9529, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak7m", "mag": 2.5, "time": 1505151089130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4259, 42.5401, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254649", "mag": 1.0, "time": 1505150945110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.515833, 46.859, 13.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16815885", "mag": 1.4, "time": 1505150387657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8119, 60.5833, 13.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760231", "mag": 1.15, "time": 1505150078250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.339833, 33.717167, -0.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar17", "mag": 4.5, "time": 1505148873550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -27.1014, -58.1449, 29.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar14", "mag": 4.7, "time": 1505148316830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7999, 10.8571, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak6r", "mag": 4.4, "time": 1505148294180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 93.763, 11.1912, 135.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar16", "mag": 4.3, "time": 1505147708500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 105.5216, 28.9426, 37.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak65", "mag": 5.0, "time": 1505146815920, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 21.5733, 39.2104, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60012999", "mag": 2.37, "time": 1505146629690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.425833, 42.545833, 6.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak62", "mag": 3.2, "time": 1505146591940, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4221, 42.5774, 8.61 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760191", "mag": 1.27, "time": 1505146302070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.870333, 36.5125, 7.71 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar11", "mag": 4.2, "time": 1505146234900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.8301, -18.5966, 222.96 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760183", "mag": 1.04, "time": 1505146087980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.721333, 33.538833, 2.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak5l", "mag": 4.4, "time": 1505145120270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9232, 15.0128, 54.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827338", "mag": 1.8, "time": 1505144756285, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3358, 57.9354, 144.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak5f", "mag": 4.3, "time": 1505144492050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0414, 15.1729, 45.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16815056", "mag": 1.9, "time": 1505144205558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6743, 59.7685, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak58", "mag": 3.1, "time": 1505144033150, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4647, 42.6086, 4.31 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243162", "mag": 1.47, "time": 1505143989150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.462833, 42.578167, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16815038", "mag": 1.9, "time": 1505143851904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7738, 62.154, 53.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16815036", "mag": 1.9, "time": 1505143815664, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0859, 60.2049, 139.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak57", "mag": 4.8, "time": 1505143793430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.1802, 54.2242, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak55", "mag": 4.3, "time": 1505143224640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6506, -2.821, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak4j", "mag": 3.0, "time": 1505142692750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4148, 42.5413, 9.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak4f", "mag": 4.4, "time": 1505142409640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0513, 14.8747, 44.09 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak40", "mag": 5.0, "time": 1505141758490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3653, 15.3524, 32.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar1h", "mag": 4.9, "time": 1505141691760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.0928, -23.8876, 37.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak3s", "mag": 4.2, "time": 1505141169530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7122, 15.3112, 28.67 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254604", "mag": 1.16, "time": 1505141014400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532333, 46.8915, 13.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890356", "mag": 0.96, "time": 1505141002070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.819168, 38.845001, -0.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16814255", "mag": 2.0, "time": 1505140885717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2937, 51.4307, 40.1 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306377", "mag": 1.82, "time": 1505140831500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.526167, 45.054, 14.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak3q", "mag": 4.2, "time": 1505140745590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4233, 15.4024, 50.36 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760143", "mag": 1.15, "time": 1505140731290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.260667, 32.865667, 12.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890351", "mag": 1.47, "time": 1505140721900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.98, 37.905667, 7.94 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017254001", "mag": 1.99, "time": 1505140527660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1661, 18.2745, 22.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak3b", "mag": 2.7, "time": 1505140375620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4329, 42.6048, 10.74 ] } }, +{ "type": "Feature", "properties": { "id": "uu60243057", "mag": 2.26, "time": 1505140157270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.570833, 6.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak35", "mag": 2.8, "time": 1505139740960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4268, 42.5293, 6.86 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar1f", "mag": 4.4, "time": 1505139719640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.2097, 57.3966, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak30", "mag": 2.8, "time": 1505139413770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4261, 42.5344, 6.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak2x", "mag": 2.8, "time": 1505139156090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4192, 42.5317, 7.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890336", "mag": 1.18, "time": 1505138783780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788833, 37.4565, 7.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak5e", "mag": 3.4, "time": 1505138730330, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4143, 42.5438, 7.19 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak2i", "mag": 2.7, "time": 1505138706230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4164, 42.5288, 7.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak2w", "mag": 4.2, "time": 1505138643370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.2941, 49.241, 567.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16813499", "mag": 2.0, "time": 1505138537316, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7415, 61.4216, 18.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak25", "mag": 2.7, "time": 1505138348200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4259, 42.5325, 7.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0y", "mag": 4.6, "time": 1505138171510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.9326, 17.4028, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16813481", "mag": 1.9, "time": 1505137989499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3857, 59.1724, 56.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak1y", "mag": 2.6, "time": 1505137521110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5419, 8.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak1r", "mag": 2.9, "time": 1505137114700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4362, 42.5456, 6.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak1m", "mag": 3.0, "time": 1505136985250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4366, 42.5476, 10.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0x", "mag": 4.6, "time": 1505136879610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.6908, 22.421, 111.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16813475", "mag": 2.1, "time": 1505136538402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.5913, 51.4481, 48.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak17", "mag": 4.7, "time": 1505136395640, "felt": 63, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4397, 42.547, 8.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar13", "mag": 4.3, "time": 1505136238290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.0316, -19.7635, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760103", "mag": 1.09, "time": 1505136097380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.293, 35.087333, 5.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16812727", "mag": 2.6, "time": 1505135732771, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9083, 64.6086, 14.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16812725", "mag": 1.1, "time": 1505135440719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9809, 60.2846, 15.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16812722", "mag": 1.3, "time": 1505135255673, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2227, 61.5128, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604646", "mag": 1.4, "time": 1505134420760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0108, 37.3174, 5.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890261", "mag": 1.53, "time": 1505134375000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.944, 37.596667, 2.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16812712", "mag": 1.2, "time": 1505134108855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0572, 63.3368, 5.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890256", "mag": 2.28, "time": 1505133958310, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.804, 37.487667, 2.35 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827325", "mag": 1.0, "time": 1505133922020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6291, 68.5279, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827324", "mag": 2.0, "time": 1505133892582, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5495, 51.3476, 48.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak0e", "mag": 2.5, "time": 1505133857280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4384, 42.5522, 4.67 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242837", "mag": 1.53, "time": 1505133790240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.5545, 3.92 ] } }, +{ "type": "Feature", "properties": { "id": "hv61904231", "mag": 1.21, "time": 1505133342610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6145, 19.417333, 2.362 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak05", "mag": 4.1, "time": 1505133270220, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4421, 42.5481, 9.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak03", "mag": 2.7, "time": 1505133174850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5648, 8.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16812710", "mag": 1.0, "time": 1505133166684, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8559, 62.6857, 65.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0u", "mag": 4.2, "time": 1505133047670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1594, -25.8043, 396.76 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604676", "mag": 1.2, "time": 1505132161656, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9061, 38.3603, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811973", "mag": 1.1, "time": 1505132086727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8547, 61.7247, 43.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811972", "mag": 1.5, "time": 1505132009437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3277, 62.9497, 102.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajzy", "mag": 2.5, "time": 1505131814160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4451, 42.6131, 6.65 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254459", "mag": 2.11, "time": 1505131462070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.591167, 48.595333, 11.25 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811969", "mag": 1.3, "time": 1505131136327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0317, 60.2939, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760055", "mag": 1.58, "time": 1505130502980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1345, 33.263, 3.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajzq", "mag": 3.0, "time": 1505130391090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5733, 9.58 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811954", "mag": 3.1, "time": 1505130323357, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1197, 60.1444, 17.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0t", "mag": 4.0, "time": 1505129120720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.0508, -16.1442, 368.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajzk", "mag": 4.5, "time": 1505129105150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1346, -37.5234, 25.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890236", "mag": 2.17, "time": 1505128675290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.459167, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827315", "mag": 2.3, "time": 1505128561623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8371, 52.7853, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811944", "mag": 1.3, "time": 1505128093436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0565, 64.7051, 17.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811204", "mag": 1.3, "time": 1505127768013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.9834, 54.7566, 4.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61904116", "mag": 2.16, "time": 1505127753700, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28183, 19.407, 0.02 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760031", "mag": 2.03, "time": 1505127492210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.712, 33.879333, 13.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827311", "mag": 1.5, "time": 1505127421795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.853, 59.6229, 96.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811203", "mag": 1.3, "time": 1505127015264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6217, 68.5348, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811201", "mag": 1.5, "time": 1505126914844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1251, 64.9961, 18.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811199", "mag": 1.6, "time": 1505125956806, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5218, 65.7316, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811198", "mag": 1.6, "time": 1505125657616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.3884, 53.8156, 54.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890226", "mag": 1.01, "time": 1505125359080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.753998, 38.790165, 3.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760023", "mag": 1.32, "time": 1505125346420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.25, 34.0295, 14.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci37760015", "mag": 1.79, "time": 1505125221750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.210667, 33.964, 14.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811192", "mag": 1.6, "time": 1505124596279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4191, 53.5639, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajy4", "mag": 3.0, "time": 1505124017240, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4438, 42.5496, 7.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811190", "mag": 1.5, "time": 1505123878146, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2865, 60.4132, 89.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811188", "mag": 1.0, "time": 1505123692728, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3358, 61.5763, 29.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890206", "mag": 0.98, "time": 1505123643110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.747167, 37.409167, 5.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16811186", "mag": 1.6, "time": 1505123476693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8224, 59.7877, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajxv", "mag": 2.9, "time": 1505123164250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4237, 42.5673, 7.37 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajxj", "mag": 4.3, "time": 1505122591560, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5544, 2.24 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242567", "mag": 2.2, "time": 1505122522080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4315, 42.546167, 6.37 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759983", "mag": 1.63, "time": 1505121892310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.268167, 34.059667, 16.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16810446", "mag": 2.6, "time": 1505121756650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4598, 60.9205, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16810443", "mag": 1.2, "time": 1505121065274, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.565, 68.8276, 0.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759967", "mag": 1.22, "time": 1505119075410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.577833, 33.463, 8.81 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306317", "mag": 1.48, "time": 1505118779800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.494333, 48.421333, 23.39 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242517", "mag": 2.59, "time": 1505118734680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -109.851333, 41.686167, 9.37 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017254000", "mag": 3.41, "time": 1505118382390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9758, 19.4726, 83.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809713", "mag": 1.0, "time": 1505117722024, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6659, 62.2481, 21.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809711", "mag": 3.4, "time": 1505116920134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.5449, 52.5632, 40.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajwn", "mag": 4.4, "time": 1505116663270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9806, 15.3004, 56.84 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759959", "mag": 1.14, "time": 1505116447350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2325, 33.327833, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajwc", "mag": 2.7, "time": 1505116217360, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4585, 42.6238, 8.02 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242452", "mag": 1.42, "time": 1505115184130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4215, 42.555167, 8.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajw6", "mag": 4.3, "time": 1505114696270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1399, -24.246, 215.32 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809708", "mag": 1.5, "time": 1505114006947, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8258, 60.1009, 45.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827294", "mag": 1.9, "time": 1505113098912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.8676, 59.0889, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254374", "mag": 1.5, "time": 1505112921190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.8645, 12.3 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759927", "mag": 2.02, "time": 1505112772010, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.403, 34.906, 11.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809693", "mag": 2.3, "time": 1505111147899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1691, 60.3968, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890121", "mag": 1.12, "time": 1505109941490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.819168, 38.807335, 2.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajvf", "mag": 2.9, "time": 1505109741010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.5774, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajva", "mag": 4.3, "time": 1505109063560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9711, 15.3853, 85.78 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890106", "mag": 1.68, "time": 1505108835910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.298667, 36.839667, 6.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809690", "mag": 2.3, "time": 1505108549578, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.9816, 56.0816, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajv3", "mag": 2.5, "time": 1505108046520, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4343, 42.6729, 8.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajuy", "mag": 4.3, "time": 1505107771280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0235, 15.4152, 96.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827288", "mag": 1.8, "time": 1505107165861, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.0716, 53.7182, 69.4 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306307", "mag": 1.9, "time": 1505107163540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.039333, 46.874833, 6.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890096", "mag": 1.14, "time": 1505106775000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0835, 41.351667, 6.69 ] } }, +{ "type": "Feature", "properties": { "id": "ak16809640", "mag": 2.4, "time": 1505106550298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8937, 61.0452, 165.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808961", "mag": 1.6, "time": 1505105485577, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1953, 59.1308, 77.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajuh", "mag": 4.0, "time": 1505105288350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1177, 14.9912, 39.36 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242387", "mag": 2.04, "time": 1505105195110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4145, 42.553333, 8.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759879", "mag": 1.88, "time": 1505105166860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.690333, 36.111167, 2.14 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242382", "mag": 1.62, "time": 1505105133670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.917167, 39.7665, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajua", "mag": 4.2, "time": 1505104652010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1678, 15.2785, 67.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aju8", "mag": 4.3, "time": 1505104387690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 134.2896, -4.2452, 11.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aju4", "mag": 4.2, "time": 1505104376590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8401, 15.5681, 47.06 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808959", "mag": 1.5, "time": 1505103598244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9778, 58.2872, 74.3 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306297", "mag": 2.04, "time": 1505103582560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041833, 46.873833, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306292", "mag": 2.25, "time": 1505103114370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041333, 46.872667, 6.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827283", "mag": 1.6, "time": 1505102962401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.439, 59.7864, 127.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827279", "mag": 1.3, "time": 1505101851739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7785, 59.9173, 97.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0i", "mag": 4.1, "time": 1505101626150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.4651, -10.314, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759855", "mag": 1.09, "time": 1505101001790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.693833, 36.111833, 2.19 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajtf", "mag": 3.6, "time": 1505100425300, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7392, 35.5637, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0g", "mag": 4.3, "time": 1505099718750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.3922, 57.1877, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808239", "mag": 1.2, "time": 1505099609741, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1984, 60.4559, 13.3 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254349", "mag": 1.33, "time": 1505099352010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536833, 46.868167, 13.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808202", "mag": 1.5, "time": 1505098597935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.3852, 59.9636, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808197", "mag": 1.0, "time": 1505098478421, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2252, 63.2571, 2.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808189", "mag": 2.2, "time": 1505098007693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.7551, 60.3801, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajt6", "mag": 3.1, "time": 1505097902820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.7475, 60.3735, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajt7", "mag": 5.1, "time": 1505097732030, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 134.3851, -4.1892, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16808181", "mag": 1.1, "time": 1505097584665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6756, 61.6922, 62.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajt5", "mag": 3.0, "time": 1505097294300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4685, 42.672, 9.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajt2", "mag": 2.8, "time": 1505097280810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4535, 42.6306, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0e", "mag": 4.3, "time": 1505096741600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.0697, 24.7471, 68.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsz", "mag": 4.7, "time": 1505096631090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9001, 15.6517, 51.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16807505", "mag": 1.3, "time": 1505096509471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9046, 61.531, 28.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16807502", "mag": 1.6, "time": 1505096282982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2586, 62.549, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890026", "mag": 1.21, "time": 1505096190960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.009667, 37.590833, -0.07 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsw", "mag": 4.2, "time": 1505095770400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.418, 15.8113, 56.97 ] } }, +{ "type": "Feature", "properties": { "id": "ak16807468", "mag": 1.2, "time": 1505095529647, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0357, 62.0888, 52.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759783", "mag": 2.05, "time": 1505095452510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.502333, 35.679, 6.19 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890021", "mag": 1.71, "time": 1505095034230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.535667, 37.632333, 19.33 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759775", "mag": 1.34, "time": 1505095022580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.507333, 34.488, 1.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsk", "mag": 4.6, "time": 1505093529680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.5451, 12.9836, 114.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827267", "mag": 1.3, "time": 1505093440775, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1537, 59.7401, 106.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759759", "mag": 1.69, "time": 1505093145730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798167, 33.493667, 3.61 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604614", "mag": 1.5, "time": 1505092989312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.6589, 37.3487, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar1r", "mag": 3.5, "time": 1505092806050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.8111, 53.8607, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ar0b", "mag": 4.2, "time": 1505092783010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.953, 17.3198, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903861", "mag": 1.26, "time": 1505092321650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.490333, 19.339667, 9.09 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsh", "mag": 4.1, "time": 1505092219210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.972, -6.9548, 134.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16806794", "mag": 1.3, "time": 1505092129494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3457, 60.4497, 89.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827265", "mag": 1.1, "time": 1505091880397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6719, 63.2902, 124.6 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242262", "mag": 2.47, "time": 1505091634360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.578333, 7.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsf", "mag": 2.3, "time": 1505091431720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.443, 42.5904, 7.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827264", "mag": 1.3, "time": 1505091007359, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0095, 58.5704, 86.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890011", "mag": 1.58, "time": 1505090685010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832333, 37.542333, 4.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759743", "mag": 1.01, "time": 1505090624240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.589167, 36.0335, 2.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amxb", "mag": 3.0, "time": 1505090296990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.554, 51.5916, 17.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72890001", "mag": 0.97, "time": 1505089976320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831, 37.541833, 4.79 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajsa", "mag": 4.9, "time": 1505089942200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9938, 15.3932, 58.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajs1", "mag": 3.2, "time": 1505088752720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4151, 42.563, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajrw", "mag": 4.4, "time": 1505087147130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.4901, 14.0924, 54.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16806048", "mag": 1.2, "time": 1505085946916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3481, 62.1328, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759727", "mag": 1.54, "time": 1505085941950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.663167, 35.044, -0.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajrn", "mag": 2.4, "time": 1505085758040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4372, 42.584, 3.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827727", "mag": 1.2, "time": 1505085448361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0012, 60.1398, 104.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajrh", "mag": 2.4, "time": 1505084625610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4614, 42.6018, 5.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajre", "mag": 3.0, "time": 1505084186000, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4583, 42.5935, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16805384", "mag": 1.3, "time": 1505084019928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9225, 60.1912, 51.8 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253006", "mag": 3.55, "time": 1505083663180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7241, 19.5025, 24.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759703", "mag": 1.47, "time": 1505083414820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.164, 34.038833, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759695", "mag": 2.37, "time": 1505083359860, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166167, 34.037667, 6.01 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759687", "mag": 1.26, "time": 1505083316070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166667, 34.039167, 6.08 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234968", "mag": 1.57, "time": 1505083207900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.877167, 37.229167, 3.02 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759679", "mag": 1.03, "time": 1505082787240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.290167, 35.090833, 2.62 ] } }, +{ "type": "Feature", "properties": { "id": "uu60242127", "mag": 1.52, "time": 1505082515530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.439, 42.5855, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16805375", "mag": 2.0, "time": 1505082468672, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2261, 62.1899, 53.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16805361", "mag": 2.4, "time": 1505082389962, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8636, 68.2355, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajq9", "mag": 3.3, "time": 1505081821360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4511, 42.5959, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889956", "mag": 1.01, "time": 1505081275110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.790333, 37.452833, 8.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16805341", "mag": 2.5, "time": 1505081090999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9101, 57.044, 46.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajpe", "mag": 5.9, "time": 1505079621210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.6765, 57.1272, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889936", "mag": 1.22, "time": 1505079295950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.937667, 37.601667, 1.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889931", "mag": 1.1, "time": 1505078962470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.806, 37.5175, -2.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajp8", "mag": 2.8, "time": 1505078892060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4509, 42.5792, 6.22 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306227", "mag": 1.13, "time": 1505078465000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.011167, 46.792, 5.12 ] } }, +{ "type": "Feature", "properties": { "id": "uu60241997", "mag": 1.44, "time": 1505078100230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422167, 42.554167, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827720", "mag": 1.0, "time": 1505077902054, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0938, 58.0932, 50.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889921", "mag": 1.74, "time": 1505077579730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.941333, 37.642833, 0.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889926", "mag": 1.62, "time": 1505077560070, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946167, 37.638667, -0.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889911", "mag": 0.99, "time": 1505077390170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.394833, 36.9325, 8.56 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253005", "mag": 2.52, "time": 1505077373570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.714, 18.0166, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889916", "mag": 0.95, "time": 1505077317230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.881833, 37.512333, -0.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16804640", "mag": 1.6, "time": 1505077302019, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5368, 58.8361, 122.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajnd", "mag": 4.5, "time": 1505076424950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2595, 15.0768, 55.96 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604604", "mag": 1.4, "time": 1505076297106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9555, 40.8314, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16803984", "mag": 1.3, "time": 1505076289998, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1907, 63.4845, 0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajms", "mag": 3.3, "time": 1505075535460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4239, 42.5436, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604570", "mag": 1.1, "time": 1505075507371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8807, 36.8036, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827715", "mag": 1.2, "time": 1505074869438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7422, 60.0074, 102.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16803877", "mag": 1.0, "time": 1505074842648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4194, 63.2783, 7.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajm5", "mag": 2.5, "time": 1505074494700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4599, 42.5711, 10.61 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903706", "mag": 1.86, "time": 1505074128010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.273331, 19.413166, 0.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajlx", "mag": 3.2, "time": 1505074034020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.42, 42.5453, 7.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16803869", "mag": 1.2, "time": 1505073920064, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7217, 63.3651, 4.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajls", "mag": 4.3, "time": 1505073807210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.114, -23.6018, 85.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajlp", "mag": 4.6, "time": 1505073492510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 13.2839, 42.1689, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759623", "mag": 1.13, "time": 1505073299090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.162, 34.035333, 6.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajlc", "mag": 2.7, "time": 1505072667200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6178, 36.1361, 5.301 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254244", "mag": 1.15, "time": 1505072506030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527667, 46.862667, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akfw", "mag": 3.1, "time": 1505072325000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4094, 42.5488, 7.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajl5", "mag": 2.7, "time": 1505072221960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4249, 42.5451, 9.42 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889901", "mag": 1.7, "time": 1505072189820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784833, 38.824667, 1.65 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889906", "mag": 1.54, "time": 1505072140190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.153, 37.129167, 12.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889891", "mag": 1.28, "time": 1505070945740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.891, 37.544167, 1.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16803197", "mag": 2.5, "time": 1505070454371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4505, 54.6854, 60.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajkd", "mag": 4.1, "time": 1505070312980, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4177, 42.5563, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889881", "mag": 1.58, "time": 1505069810220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.149, 37.1305, 12.32 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajkz", "mag": 2.4, "time": 1505069780800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4181, 42.5449, 7.46 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253004", "mag": 3.24, "time": 1505069521610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -65.0411, 19.2021, 48.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903656", "mag": 1.57, "time": 1505069138690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.104167, 19.329333, 5.178 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajjx", "mag": 2.9, "time": 1505068769580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4153, 42.5555, 7.28 ] } }, +{ "type": "Feature", "properties": { "id": "ak16802543", "mag": 1.6, "time": 1505068750842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6404, 58.5519, 66.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajju", "mag": 2.5, "time": 1505068746720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9924, 37.0464, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889876", "mag": 1.12, "time": 1505068188960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.315667, 36.955833, 7.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajjp", "mag": 2.3, "time": 1505068125580, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1711, 35.6565, 7.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajjl", "mag": 2.4, "time": 1505067921890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4388, 42.6003, 7.21 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759607", "mag": 1.53, "time": 1505067791950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169667, 34.037167, 4.29 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759599", "mag": 0.99, "time": 1505067584720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163333, 34.028, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajn9", "mag": 2.7, "time": 1505067322220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5732, 52.3355, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827705", "mag": 1.3, "time": 1505067315004, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7536, 59.2097, 68.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889866", "mag": 1.0, "time": 1505067136160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764168, 38.833, 0.66 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889861", "mag": 1.06, "time": 1505067131030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.759667, 38.833667, 1.17 ] } }, +{ "type": "Feature", "properties": { "id": "ak16802540", "mag": 1.3, "time": 1505066586033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3745, 62.1772, 42.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759591", "mag": 1.48, "time": 1505066404370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166333, 34.044667, 5.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759583", "mag": 1.53, "time": 1505066395290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163333, 34.041167, 5.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827703", "mag": 1.0, "time": 1505066200905, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7529, 58.6862, 17.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759567", "mag": 1.34, "time": 1505066082610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163833, 34.040667, 6.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16802539", "mag": 1.1, "time": 1505065957419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0268, 60.5262, 19.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajjb", "mag": 2.5, "time": 1505065916650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4209, 42.5639, 8.61 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759559", "mag": 1.32, "time": 1505065772840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2325, 34.474333, 11.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16802537", "mag": 1.3, "time": 1505065364910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2942, 63.1472, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759551", "mag": 1.1, "time": 1505065150010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.172667, 34.034333, 5.23 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759543", "mag": 1.69, "time": 1505064387890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.295, 35.088667, 4.44 ] } }, +{ "type": "Feature", "properties": { "id": "ak16802513", "mag": 1.5, "time": 1505064158942, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.1889, 65.0868, 19.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajj3", "mag": 4.4, "time": 1505063935670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 82.4969, 41.9157, 28.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajiy", "mag": 2.7, "time": 1505063902750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4577, 42.6058, 5.68 ] } }, +{ "type": "Feature", "properties": { "id": "uu60241602", "mag": 1.36, "time": 1505063711640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415333, 42.567, 9.66 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759535", "mag": 1.1, "time": 1505063618920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165167, 34.041667, 6.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889821", "mag": 1.62, "time": 1505063575750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157167, 37.135667, 10.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889816", "mag": 1.01, "time": 1505063492860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.774667, 35.547833, 5.09 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759527", "mag": 2.15, "time": 1505063398380, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.238167, 34.467833, 11.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajih", "mag": 2.5, "time": 1505062945810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4296, 42.5627, 11.62 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889806", "mag": 2.49, "time": 1505062781340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801833, 38.789333, 3.19 ] } }, +{ "type": "Feature", "properties": { "id": "uu60013054", "mag": 1.65, "time": 1505062641290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444, 42.594667, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "uu60241572", "mag": 2.02, "time": 1505062621720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.432167, 42.5965, 4.48 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759519", "mag": 1.59, "time": 1505062248460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167, 34.038667, 4.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759511", "mag": 1.92, "time": 1505062179580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165, 34.039333, 4.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759503", "mag": 1.57, "time": 1505062145210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.164167, 34.037667, 5.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759495", "mag": 1.42, "time": 1505061900480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165667, 34.038667, 5.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16801882", "mag": 1.1, "time": 1505061849133, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1509, 60.3803, 7.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759487", "mag": 1.49, "time": 1505061523920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.893, 35.343333, 5.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16801880", "mag": 1.5, "time": 1505061368254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.731, 60.0161, 6.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759471", "mag": 1.2, "time": 1505061266330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167333, 34.040167, 4.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajn8", "mag": 3.4, "time": 1505060976520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3264, 52.5377, 96.17 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759455", "mag": 1.41, "time": 1505060968220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8935, 35.3405, 5.83 ] } }, +{ "type": "Feature", "properties": { "id": "ak16801858", "mag": 1.5, "time": 1505060123211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4433, 51.6859, 21.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16801272", "mag": 1.1, "time": 1505059792074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1384, 63.4871, 1.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827692", "mag": 2.2, "time": 1505059542515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.3922, 52.3983, 21.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889781", "mag": 1.29, "time": 1505059412980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.943667, 37.596167, 2.31 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajqf", "mag": 4.6, "time": 1505058668170, "felt": 49, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.1945, 35.7377, 54.25 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889766", "mag": 1.32, "time": 1505058489100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.046333, 38.9295, 0.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajhi", "mag": 2.5, "time": 1505058212500, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7958, 35.9926, 4.398 ] } }, +{ "type": "Feature", "properties": { "id": "ak16801236", "mag": 1.4, "time": 1505058208151, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9025, 57.4691, 48.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759407", "mag": 1.83, "time": 1505057535880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3395, 34.014333, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artt", "mag": 4.2, "time": 1505057483820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.9272, 37.8866, 41.94 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827688", "mag": 1.7, "time": 1505057440690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7035, 58.208, 3.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajh6", "mag": 4.6, "time": 1505057331420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4383, 15.2976, 42.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajh4", "mag": 2.6, "time": 1505057207380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4289, 42.5593, 7.96 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827687", "mag": 1.5, "time": 1505057001386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4181, 51.7014, 6.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajh2", "mag": 4.2, "time": 1505056916120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2576, 14.9344, 12.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajgy", "mag": 2.5, "time": 1505056755330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7823, 37.3283, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827686", "mag": 1.1, "time": 1505056731493, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8679, 57.3821, 46.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajgx", "mag": 2.8, "time": 1505056639060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4498, 42.5804, 5.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827685", "mag": 1.2, "time": 1505056471867, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1402, 60.9584, 19.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajgu", "mag": 2.5, "time": 1505056401260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4462, 42.5738, 5.62 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajgm", "mag": 4.9, "time": 1505055545760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6784, 14.1109, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759383", "mag": 1.0, "time": 1505055131400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169167, 34.0425, 5.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajge", "mag": 3.4, "time": 1505054862840, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4185, 42.5625, 9.41 ] } }, +{ "type": "Feature", "properties": { "id": "ak16800620", "mag": 1.1, "time": 1505054600546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7386, 61.4915, 80.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajgc", "mag": 3.1, "time": 1505054298370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4151, 42.55, 7.52 ] } }, +{ "type": "Feature", "properties": { "id": "ak16800576", "mag": 2.5, "time": 1505054208776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9361, 60.2731, 64.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889746", "mag": 1.38, "time": 1505053809310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.442, 37.695667, 4.15 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253003", "mag": 2.17, "time": 1505052857240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2868, 18.1121, 18.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajg9", "mag": 2.9, "time": 1505052838460, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5162, 46.8743, 14.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889741", "mag": 1.38, "time": 1505052751930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.824333, 38.060667, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16799977", "mag": 1.0, "time": 1505052033903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8767, 61.5617, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254079", "mag": 1.59, "time": 1505051737640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.410667, 44.4485, 6.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16799971", "mag": 1.7, "time": 1505051381698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7235, 59.8179, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajfa", "mag": 4.3, "time": 1505051330480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.3498, 13.069, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajf7", "mag": 4.0, "time": 1505050961060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.3526, 52.4771, 237.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16799942", "mag": 1.7, "time": 1505050892677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6731, 59.5546, 120.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajf3", "mag": 4.6, "time": 1505050808670, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.529, 15.6631, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajf0", "mag": 4.5, "time": 1505050687090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4173, 15.2922, 52.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artu", "mag": 4.1, "time": 1505050610220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1836, -7.5542, 159.39 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajex", "mag": 4.3, "time": 1505049954620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.6306, 15.7653, 20.71 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759303", "mag": 1.26, "time": 1505049848270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7985, 33.504667, 4.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajeq", "mag": 2.8, "time": 1505049297970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4232, 42.5578, 7.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16799353", "mag": 1.3, "time": 1505049096103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6348, 59.8194, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajen", "mag": 3.0, "time": 1505048991180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4182, 42.5509, 7.02 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827673", "mag": 1.6, "time": 1505048796797, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.3116, 53.3278, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajej", "mag": 2.6, "time": 1505048615320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.6115, 6.14 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254034", "mag": 1.41, "time": 1505048540860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521667, 46.8615, 12.53 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254029", "mag": 1.23, "time": 1505048399750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521167, 46.853, 11.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16799346", "mag": 2.0, "time": 1505048306207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2292, 62.187, 56.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aje5", "mag": 4.4, "time": 1505047810980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.8604, 12.4905, 60.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aje3", "mag": 3.6, "time": 1505047519260, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4283, 42.5536, 6.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aje1", "mag": 2.8, "time": 1505047427230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4487, 42.6011, 5.82 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajdz", "mag": 2.5, "time": 1505047141140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4433, 42.6033, 3.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajm3", "mag": 3.4, "time": 1505046945740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.4897, 52.4554, 37.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajdq", "mag": 3.1, "time": 1505046464560, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4503, 42.6011, 4.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827668", "mag": 1.6, "time": 1505046395510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3819, 59.8907, 133.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajdf", "mag": 3.9, "time": 1505045951750, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4091, 42.5736, 10.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajdd", "mag": 3.1, "time": 1505045857190, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4617, 42.6284, 4.97 ] } }, +{ "type": "Feature", "properties": { "id": "uu60241107", "mag": 2.14, "time": 1505045641970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.59, 6.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16798742", "mag": 1.3, "time": 1505045327481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3496, 69.231, 1.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajd9", "mag": 4.3, "time": 1505045213250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1554, 14.0483, 13.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajd2", "mag": 4.5, "time": 1505044829750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4915, 15.8549, 21.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16798732", "mag": 2.6, "time": 1505044761546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.966, 59.8093, 102.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajcy", "mag": 2.6, "time": 1505044665510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.5652, 42.6019, 9.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artq", "mag": 4.4, "time": 1505044070510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.6016, 12.9144, 38.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827665", "mag": 1.6, "time": 1505043947734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3635, 51.6272, 0.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajci", "mag": 2.9, "time": 1505043647160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4487, 42.6201, 8.65 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827663", "mag": 2.1, "time": 1505043481292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.5488, 52.6471, 37.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajch", "mag": 2.9, "time": 1505043441680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4464, 42.565, 8.31 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604506", "mag": 1.1, "time": 1505043238904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2044, 38.3052, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajce", "mag": 2.6, "time": 1505042826200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4252, 42.5577, 5.15 ] } }, +{ "type": "Feature", "properties": { "id": "ak16798700", "mag": 1.7, "time": 1505042612937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2918, 69.235, 1.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajc9", "mag": 3.1, "time": 1505042537350, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4318, 42.5604, 7.18 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903466", "mag": 2.42, "time": 1505042508060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.211833, 19.916833, 13.349 ] } }, +{ "type": "Feature", "properties": { "id": "ak16798696", "mag": 1.3, "time": 1505042293807, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3271, 69.2374, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajbt", "mag": 4.7, "time": 1505041959050, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4701, 42.6074, 4.56 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajbp", "mag": 2.6, "time": 1505041798510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4553, 42.6057, 2.2 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604588", "mag": 1.0, "time": 1505041736983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8863, 39.0228, 11.8 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253002", "mag": 2.88, "time": 1505041375350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.305, 18.603, 82.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajbk", "mag": 3.1, "time": 1505040789630, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4404, 42.601, 4.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajbj", "mag": 2.6, "time": 1505040635620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4423, 42.5705, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759247", "mag": 1.02, "time": 1505040606370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.192167, 33.778, 3.52 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306142", "mag": 2.37, "time": 1505040308500, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.040167, 46.875333, 6.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827659", "mag": 2.3, "time": 1505040202211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8004, 51.946, 193.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajba", "mag": 2.5, "time": 1505040116970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4234, 42.6126, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234948", "mag": 1.52, "time": 1505039824000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.878333, 37.226333, 2.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajay", "mag": 2.5, "time": 1505039717650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4475, 42.5965, 6.66 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759239", "mag": 1.83, "time": 1505039190870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.297667, 34.7275, 4.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759231", "mag": 1.46, "time": 1505038960010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.206167, 33.030167, 5.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajah", "mag": 4.9, "time": 1505038459290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5926, 15.8657, 62.07 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajad", "mag": 2.8, "time": 1505038317850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4649, 42.5713, 2.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ajac", "mag": 2.8, "time": 1505038143220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.3389, 42.5698, 5.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aja1", "mag": 2.5, "time": 1505037892850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4134, 42.5966, 2.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889666", "mag": 2.44, "time": 1505037177900, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.680333, 36.934833, 10.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ak98", "mag": 2.7, "time": 1505037007800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9657, 36.5378, 5.921 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akbp", "mag": 3.5, "time": 1505036907810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4216, 42.6147, 2.61 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903376", "mag": 2.02, "time": 1505036885770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.244, 19.404333, 38.634 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj9i", "mag": 5.0, "time": 1505036830570, "felt": 222, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.5629, 9.83 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604494", "mag": 1.3, "time": 1505036614546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9198, 38.3864, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16797541", "mag": 2.3, "time": 1505036483755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.8674, 50.427, 38.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889656", "mag": 1.55, "time": 1505036419440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9445, 37.642333, -0.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artp", "mag": 4.7, "time": 1505036336060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.742, 44.4006, 89.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj9e", "mag": 4.1, "time": 1505036045120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8669, 15.7031, 37.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16797519", "mag": 3.3, "time": 1505035967489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9107, 62.993, 122.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16797515", "mag": 2.4, "time": 1505035289100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.6897, 53.169, 25.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827654", "mag": 1.4, "time": 1505034233691, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9911, 60.3931, 86.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796945", "mag": 2.3, "time": 1505033682313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0313, 60.3066, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889646", "mag": 1.08, "time": 1505033636850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818001, 38.801998, 2.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj8v", "mag": 2.4, "time": 1505033298010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.484, 42.6096, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amz2", "mag": 2.8, "time": 1505033251180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0563, 54.0093, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759175", "mag": 1.28, "time": 1505033174200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362167, 33.154333, 11.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796924", "mag": 1.8, "time": 1505033149645, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7762, 53.453, 28.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj8s", "mag": 5.5, "time": 1505033064540, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.8932, 41.7813, 45.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj8i", "mag": 5.2, "time": 1505032778170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5035, 15.7644, 57.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amz1", "mag": 2.8, "time": 1505032715690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8991, 53.5788, 15.9 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253749", "mag": 1.76, "time": 1505032545100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.889167, 14.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj87", "mag": 3.8, "time": 1505032481960, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9548, 37.0369, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artm", "mag": 4.4, "time": 1505032427640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.852, -18.159, 601.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj86", "mag": 4.2, "time": 1505032314990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 22.3039, 38.0722, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759159", "mag": 0.97, "time": 1505031839650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1615, 34.0365, 4.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artk", "mag": 3.8, "time": 1505031830730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.788, 53.8251, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000amyz", "mag": 2.6, "time": 1505031468470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4988, 51.6871, 9.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arti", "mag": 4.5, "time": 1505031463320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9123, -25.0133, 508.03 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903321", "mag": 1.9, "time": 1505031307020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.376, 19.109, 42.633 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759151", "mag": 2.32, "time": 1505031276490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.528667, 33.143833, 8.22 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889631", "mag": 1.68, "time": 1505031062020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1025, 35.652333, 4.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759127", "mag": 0.99, "time": 1505030565890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4795, 34.347667, 6.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796357", "mag": 1.6, "time": 1505029768799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6864, 61.2792, 33.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796347", "mag": 2.8, "time": 1505029738842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8811, 62.6834, 89.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796345", "mag": 1.1, "time": 1505029334941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9656, 62.9587, 88.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796343", "mag": 1.4, "time": 1505028430485, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3315, 60.2265, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759079", "mag": 1.03, "time": 1505028192380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.508, 4.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827644", "mag": 2.2, "time": 1505028185237, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9799, 52.0013, 156.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000artg", "mag": 4.2, "time": 1505027908500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9129, -24.5931, 503.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj7r", "mag": 4.5, "time": 1505027720310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5866, 15.1076, 24.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj7m", "mag": 3.3, "time": 1505027636400, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.804, 35.9918, 5.961 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj7l", "mag": 3.0, "time": 1505027344470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4316, 42.5611, 7.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796341", "mag": 1.6, "time": 1505026917606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9481, 51.2072, 22.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796340", "mag": 1.2, "time": 1505026743356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0079, 59.5892, 41.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796338", "mag": 1.3, "time": 1505026513369, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0949, 62.0857, 37.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759055", "mag": 1.58, "time": 1505026335940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798333, 33.501167, 3.42 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253734", "mag": 1.14, "time": 1505025721140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.170167, 47.328333, 19.23 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796336", "mag": 1.0, "time": 1505025668896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2865, 62.4037, 46.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16796333", "mag": 1.6, "time": 1505025496149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8107, 60.5943, 2.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889606", "mag": 1.8, "time": 1505025336300, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.260333, 36.150833, 8.23 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj7g", "mag": 4.3, "time": 1505024815920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5354, 15.0816, 39.42 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827636", "mag": 1.3, "time": 1505024434533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4031, 51.77, 19.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795777", "mag": 1.4, "time": 1505024355978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0051, 60.2926, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759039", "mag": 1.89, "time": 1505024281500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.871, 36.511333, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604470", "mag": 1.2, "time": 1505024158420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1219, 37.3848, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889576", "mag": 0.98, "time": 1505022995190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.766333, 37.576333, 4.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj75", "mag": 4.0, "time": 1505022687700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2661, 15.0962, 47.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827633", "mag": 1.4, "time": 1505022608119, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9863, 59.5419, 87.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795771", "mag": 1.7, "time": 1505022431855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7645, 61.916, 63.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795770", "mag": 1.2, "time": 1505022130505, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6083, 61.2662, 54.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604466", "mag": 1.4, "time": 1505021979344, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1529, 37.0254, 0.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795766", "mag": 1.7, "time": 1505021975648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1305, 61.3941, 3.7 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253001", "mag": 2.14, "time": 1505021553530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.0151, 18.2211, 26.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37759015", "mag": 1.41, "time": 1505021428240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1665, 34.037667, 5.07 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj6q", "mag": 2.8, "time": 1505020972500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6874, 36.6964, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758999", "mag": 1.58, "time": 1505020355730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.168833, 34.037667, 4.71 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889556", "mag": 1.12, "time": 1505019834580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.712167, 38.750333, 2.07 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306032", "mag": 2.05, "time": 1505019796720, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.038167, 46.874333, 6.38 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj6e", "mag": 4.1, "time": 1505019258690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3705, 67.5564, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj6c", "mag": 4.1, "time": 1505019032690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0925, 15.7467, 34.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayew", "mag": 4.2, "time": 1505018634430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9037, 15.4311, 74.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758959", "mag": 1.24, "time": 1505018324480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169833, 34.0395, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795206", "mag": 2.1, "time": 1505018157144, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4944, 60.3044, 178.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayer", "mag": 4.0, "time": 1505017700720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8225, 15.3927, 47.72 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758935", "mag": 1.14, "time": 1505017497720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169, 34.039333, 6.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795202", "mag": 1.4, "time": 1505017366860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3287, 63.2644, 12.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758927", "mag": 0.97, "time": 1505017113210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.034167, 34.268333, -0.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827627", "mag": 1.4, "time": 1505017084382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.915, 59.1941, 109.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758911", "mag": 1.67, "time": 1505016996470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167, 34.037833, 5.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795198", "mag": 1.2, "time": 1505016773648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4096, 62.1404, 0.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795193", "mag": 2.2, "time": 1505016672191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3522, 59.8641, 133.9 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234903", "mag": 1.63, "time": 1505016085390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.572167, 37.347167, 4.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795191", "mag": 1.2, "time": 1505016021415, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4153, 61.11, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj5p", "mag": 4.3, "time": 1505015407020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7252, 38.0198, 68.12 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795189", "mag": 1.3, "time": 1505014815822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7877, 59.5199, 52.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889511", "mag": 1.11, "time": 1505014765900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.711998, 38.755501, 2.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj5f", "mag": 4.1, "time": 1505014246310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7509, 15.2659, 43.51 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795181", "mag": 2.2, "time": 1505014149113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8561, 61.3045, 25.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16795185", "mag": 1.8, "time": 1505014144643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2491, 60.9757, 43.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj59", "mag": 4.1, "time": 1505013882540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.2187, 67.6427, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61306007", "mag": 1.81, "time": 1505013085820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.600667, 43.836167, 3.82 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253724", "mag": 1.18, "time": 1505012880400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.520333, 46.896167, 10.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj51", "mag": 5.8, "time": 1505012842340, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5278, 15.3896, 29.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16794614", "mag": 1.5, "time": 1505011941254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0253, 66.769, 24.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16794611", "mag": 1.9, "time": 1505011477433, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.452, 60.9238, 15.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16794610", "mag": 2.3, "time": 1505010496180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5196, 51.817, 106.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arv6", "mag": 4.0, "time": 1505010360400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9747, 15.1883, 59.97 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017253000", "mag": 2.65, "time": 1505009947880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1073, 18.2203, 79.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj4r", "mag": 4.3, "time": 1505009855470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.3515, 14.9239, 35.26 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj4q", "mag": 2.4, "time": 1505009730390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.403, 42.6058, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16794604", "mag": 1.5, "time": 1505009566066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5055, 61.4008, 14.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj4m", "mag": 3.2, "time": 1505008832850, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4779, 42.6737, 2.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aye7", "mag": 3.9, "time": 1505008653110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.442, 15.7739, 41.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj4i", "mag": 4.2, "time": 1505008285900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3811, 14.9456, 27.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827395", "mag": 1.0, "time": 1505008083507, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7452, 63.1544, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16794056", "mag": 1.8, "time": 1505007980655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.9725, 59.1241, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604443", "mag": 1.1, "time": 1505007942083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9112, 38.3937, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758839", "mag": 1.22, "time": 1505007033130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.383167, 33.193, 7.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827393", "mag": 1.2, "time": 1505006807930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6807, 59.9356, 95.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj47", "mag": 4.1, "time": 1505005871300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.689, 16.7045, 39.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj44", "mag": 4.3, "time": 1505005501920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7157, 15.408, 32.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj41", "mag": 4.3, "time": 1505005103690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5751, 15.5308, 63.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj3z", "mag": 4.4, "time": 1505004749280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4987, 15.3526, 47.21 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj3t", "mag": 3.3, "time": 1505004389150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.358, 44.2464, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793513", "mag": 2.3, "time": 1505004296412, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.3005, 58.2485, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793511", "mag": 2.0, "time": 1505004250005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3901, 51.6935, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj3m", "mag": 3.3, "time": 1505004159420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.0417, 44.4745, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827390", "mag": 1.5, "time": 1505004153873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9635, 59.4036, 98.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16827388", "mag": 1.4, "time": 1505003603974, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4592, 51.7361, 18.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793506", "mag": 1.5, "time": 1505003554878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5578, 62.0025, 41.6 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253689", "mag": 0.96, "time": 1505003169140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.508667, 46.879833, 9.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj3k", "mag": 4.7, "time": 1505002421890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.5775, -16.7183, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793503", "mag": 1.2, "time": 1505001653442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.0694, 51.6811, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj3c", "mag": 2.3, "time": 1505001525800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.5803, 7.86 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903041", "mag": 1.97, "time": 1505000788390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.501, 19.948333, 38.213 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793502", "mag": 2.1, "time": 1505000595653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5442, 56.1065, 5.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj36", "mag": 3.3, "time": 1505000090270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.0754, 44.3952, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889416", "mag": 1.43, "time": 1505000045060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.709167, 38.768333, 1.44 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889411", "mag": 1.18, "time": 1504999845050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.424167, 38.768, 7.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793501", "mag": 1.0, "time": 1504999793486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0175, 59.5958, 36.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793499", "mag": 1.5, "time": 1504999218478, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9885, 60.7112, 87.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823567", "mag": 1.5, "time": 1504999019129, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.3619, 57.7499, 9.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61903026", "mag": 1.83, "time": 1504999009760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28717, 19.4025, 1.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793495", "mag": 1.5, "time": 1504998539010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1873, 63.1024, 94.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793492", "mag": 1.9, "time": 1504998198191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4513, 66.9866, 0.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16793490", "mag": 1.1, "time": 1504998084010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3555, 64.9906, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am0g", "mag": 2.9, "time": 1504997864050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5776, 54.9813, 70.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am0f", "mag": 3.0, "time": 1504997382330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4861, 55.435, 25.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj2w", "mag": 2.6, "time": 1504996101810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4595, 42.6646, 8.07 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823560", "mag": 1.1, "time": 1504995586471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5516, 60.1674, 10.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj2g", "mag": 2.6, "time": 1504995580700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.3253, 36.95, 2.161 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889401", "mag": 1.53, "time": 1504995533070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.883167, 39.862333, 5.12 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj2p", "mag": 4.3, "time": 1504995471290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.6167, -36.1497, 25.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758743", "mag": 0.97, "time": 1504995032090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.927167, 35.897667, 6.49 ] } }, +{ "type": "Feature", "properties": { "id": "ak16792945", "mag": 1.9, "time": 1504994934423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6439, 60.0021, 159.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889396", "mag": 1.01, "time": 1504994309360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.744499, 38.774666, 1.39 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253659", "mag": 1.35, "time": 1504994237270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.767667, 45.618, 0.67 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889391", "mag": 1.15, "time": 1504994059680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.4355, 39.501833, 12.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayd8", "mag": 4.0, "time": 1504993547880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0655, 15.7772, 34.99 ] } }, +{ "type": "Feature", "properties": { "id": "uu60240502", "mag": 1.28, "time": 1504993388650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.014167, 44.781833, 8.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889381", "mag": 1.37, "time": 1504992621690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.732833, 38.768167, 0.83 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889376", "mag": 1.64, "time": 1504992347010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.879, 39.861333, 5.75 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889366", "mag": 0.99, "time": 1504990736460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.712667, 38.913333, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj18", "mag": 4.9, "time": 1504990247280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.6127, -27.7277, 147.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aksk", "mag": 2.8, "time": 1504990158400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8073, 35.9883, 6.228 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj13", "mag": 3.1, "time": 1504990070700, "felt": 18, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8015, 35.9914, 5.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arta", "mag": 4.2, "time": 1504989955640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0828, 15.537, 19.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16792284", "mag": 1.6, "time": 1504989907169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0546, 60.3983, 79.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889356", "mag": 0.96, "time": 1504989514010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.201333, 37.802667, 8.55 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823554", "mag": 1.4, "time": 1504989475242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8158, 59.9912, 96.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj0w", "mag": 2.8, "time": 1504989429400, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5041, 36.2908, 8.103 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902851", "mag": 1.98, "time": 1504989368750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279159, 19.391001, 0.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000art9", "mag": 4.4, "time": 1504989282650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5518, 15.0779, 35.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj0x", "mag": 4.2, "time": 1504989178220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8925, 15.5513, 33.85 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj1p", "mag": 2.3, "time": 1504988963860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4077, 55.6085, 30.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823552", "mag": 1.2, "time": 1504988912939, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7854, 60.1774, 76.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj0r", "mag": 4.8, "time": 1504988774940, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8055, 15.4862, 41.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823551", "mag": 1.5, "time": 1504988703567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6984, 60.153, 94.6 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902831", "mag": 2.68, "time": 1504988541740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.446, 20.027167, 8.137 ] } }, +{ "type": "Feature", "properties": { "id": "uu60240472", "mag": 1.31, "time": 1504988346800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.206, 39.282333, -3.32 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902821", "mag": 2.08, "time": 1504988052380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.281998, 19.411833, 2.05 ] } }, +{ "type": "Feature", "properties": { "id": "ak16791747", "mag": 1.2, "time": 1504986900345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4114, 60.0877, 56.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889346", "mag": 1.15, "time": 1504985576640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.723667, 38.753833, 1.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aizy", "mag": 4.4, "time": 1504984967070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.1285, 55.2452, 28.63 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823547", "mag": 2.3, "time": 1504984573262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2291, 50.8322, 17.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aizr", "mag": 2.3, "time": 1504983888120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4504, 42.6494, 10.91 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604425", "mag": 1.1, "time": 1504983732096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8284, 38.06, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16791198", "mag": 1.7, "time": 1504983607869, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5288, 51.7278, 12.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889341", "mag": 1.77, "time": 1504983196540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.881, 38.833667, 2.0 ] } }, +{ "type": "Feature", "properties": { "id": "uu60240427", "mag": 2.17, "time": 1504983086160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417167, 42.555833, 8.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aizg", "mag": 4.4, "time": 1504983043410, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4218, 15.787, 57.77 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902716", "mag": 1.45, "time": 1504983007260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.274333, 18.915833, 7.212 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823545", "mag": 1.7, "time": 1504982688397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.1975, 53.2518, 21.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604404", "mag": 2.1, "time": 1504981848383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9058, 38.3558, 8.8 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889331", "mag": 1.22, "time": 1504981774440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.480833, 38.843833, 10.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiz4", "mag": 4.4, "time": 1504981610170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 155.7383, 49.4785, 59.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16791190", "mag": 2.4, "time": 1504980782997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.857, 67.7643, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823543", "mag": 1.8, "time": 1504980266831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4071, 51.6082, 9.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758695", "mag": 1.06, "time": 1504980028730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.307667, 34.0925, 16.16 ] } }, +{ "type": "Feature", "properties": { "id": "ak16791189", "mag": 1.3, "time": 1504980002277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.043, 60.3576, 52.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiyg", "mag": 4.4, "time": 1504979697800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.459, 15.3004, 36.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823541", "mag": 1.5, "time": 1504978178608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8616, 58.3062, 104.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aycf", "mag": 4.2, "time": 1504977766490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1719, 15.1363, 19.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889311", "mag": 1.86, "time": 1504977631430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.621667, 39.523333, 4.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am0a", "mag": 2.9, "time": 1504977007380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3606, 51.5729, 20.05 ] } }, +{ "type": "Feature", "properties": { "id": "uw61305857", "mag": 1.96, "time": 1504976913320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.5835, 49.325, -0.06 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604394", "mag": 1.0, "time": 1504976713972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9184, 39.4189, 9.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604419", "mag": 1.0, "time": 1504976501919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9128, 38.3555, 7.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823539", "mag": 1.7, "time": 1504975843554, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3563, 51.6531, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "uu60240367", "mag": 1.09, "time": 1504975707090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.071, 44.717, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790653", "mag": 3.1, "time": 1504974617088, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3417, 51.6239, 10.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790654", "mag": 1.9, "time": 1504974537489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3148, 51.695, 47.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aix7", "mag": 4.4, "time": 1504974070040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1553, 15.4199, 68.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aix4", "mag": 2.7, "time": 1504973305730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4403, 42.5514, 9.99 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758639", "mag": 1.49, "time": 1504972882060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.274333, 33.977333, 4.89 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823535", "mag": 1.4, "time": 1504972779074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6619, 59.5746, 73.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790651", "mag": 1.4, "time": 1504972583759, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0742, 62.1419, 37.4 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902621", "mag": 1.3, "time": 1504971779440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.013167, 19.393333, 2.338 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758631", "mag": 1.6, "time": 1504971677250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.497167, 32.741, 8.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790130", "mag": 2.4, "time": 1504971409637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4283, 51.6859, 9.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiwm", "mag": 5.3, "time": 1504971008260, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8484, 15.8296, 39.05 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889281", "mag": 1.07, "time": 1504970982380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.944833, 37.598167, 1.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiwh", "mag": 4.8, "time": 1504970946650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5822, 15.0866, 46.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiwe", "mag": 4.6, "time": 1504970869530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9636, 15.3251, 65.27 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889276", "mag": 1.09, "time": 1504970812160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.855667, 37.658833, 2.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790123", "mag": 2.1, "time": 1504970292620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.13, 51.4897, 41.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16790120", "mag": 1.2, "time": 1504968778296, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3618, 61.0444, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiw3", "mag": 4.1, "time": 1504968358930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.193, 15.2562, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16789598", "mag": 2.5, "time": 1504968226307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7868, 63.1355, 123.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16789594", "mag": 1.9, "time": 1504968045372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7112, 60.6453, 16.4 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758615", "mag": 1.41, "time": 1504967951280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.275, 33.978333, 4.74 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823526", "mag": 1.9, "time": 1504967456812, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4388, 54.8237, 32.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aivy", "mag": 4.2, "time": 1504967440700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1556, 16.3217, 115.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823525", "mag": 1.4, "time": 1504967368293, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6252, 59.9753, 101.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823524", "mag": 1.7, "time": 1504966965980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7649, 56.8018, 3.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823523", "mag": 1.6, "time": 1504966219015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4826, 51.2597, 23.7 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889256", "mag": 1.03, "time": 1504966067680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.012333, 37.593667, 0.37 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604381", "mag": 2.3, "time": 1504966020076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3553, 40.6574, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758607", "mag": 1.15, "time": 1504965758050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.386667, 33.320333, 5.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aivs", "mag": 2.6, "time": 1504965349760, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.431, 42.5704, 9.32 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253559", "mag": 1.01, "time": 1504964725150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.785167, 43.612, -3.47 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823520", "mag": 2.0, "time": 1504964361277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4265, 54.015, 30.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823518", "mag": 1.4, "time": 1504963874108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0471, 60.762, 82.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16789076", "mag": 1.7, "time": 1504963420635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7554, 59.5701, 80.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aivg", "mag": 4.8, "time": 1504963319300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.118, 15.2555, 36.22 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiva", "mag": 4.7, "time": 1504963129400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9764, 15.3921, 63.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823516", "mag": 1.1, "time": 1504962479847, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.8765, 58.9325, 12.9 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234863", "mag": 1.66, "time": 1504961953310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.8555, 37.210833, 3.69 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiuu", "mag": 4.3, "time": 1504961286800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1507, 15.2159, 54.84 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889151", "mag": 1.59, "time": 1504961182210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2615, 36.143, 9.79 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823515", "mag": 1.3, "time": 1504960711273, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5542, 59.755, 14.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiud", "mag": 4.5, "time": 1504959908650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2891, 15.5969, 67.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823514", "mag": 2.3, "time": 1504959541727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2315, 55.4677, 18.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiu3", "mag": 3.5, "time": 1504959495530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.3875, 42.5392, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiu8", "mag": 4.9, "time": 1504959466540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4075, 16.1573, 92.03 ] } }, +{ "type": "Feature", "properties": { "id": "ak16788555", "mag": 1.8, "time": 1504958775607, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5009, 59.7863, 1.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823512", "mag": 1.2, "time": 1504958710011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6279, 61.013, 77.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aitr", "mag": 5.2, "time": 1504958620590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.1721, -22.4546, 222.22 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758559", "mag": 2.17, "time": 1504958517340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.871333, 36.511, 7.46 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889136", "mag": 1.89, "time": 1504958245210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.943333, 37.597, 2.4 ] } }, +{ "type": "Feature", "properties": { "id": "ak16788550", "mag": 1.2, "time": 1504957995087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7877, 61.7723, 59.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aita", "mag": 3.9, "time": 1504957968370, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4749, 42.5793, 8.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aitc", "mag": 4.9, "time": 1504957853960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4489, 15.7338, 63.09 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889131", "mag": 1.42, "time": 1504957844330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822667, 37.604833, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ait9", "mag": 3.1, "time": 1504957715430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4515, 42.5732, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ait3", "mag": 3.0, "time": 1504956895100, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7026, 36.641, 8.008 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am03", "mag": 2.5, "time": 1504956200380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0448, 53.9738, 19.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ait2", "mag": 4.0, "time": 1504956162220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.601, 15.854, 69.04 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aisv", "mag": 2.4, "time": 1504955702120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4242, 42.579, 6.95 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aisz", "mag": 4.5, "time": 1504955498600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.8292, 3.6504, 59.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889126", "mag": 1.04, "time": 1504955440550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832333, 37.5415, 4.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16788046", "mag": 2.3, "time": 1504954557233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3602, 51.5792, 17.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aisn", "mag": 4.2, "time": 1504953867200, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.2262, -15.3425, 224.81 ] } }, +{ "type": "Feature", "properties": { "id": "uu60240042", "mag": 1.27, "time": 1504953324130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.006167, 44.792, 10.46 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017252001", "mag": 2.09, "time": 1504953205290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2761, 18.0591, 19.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758511", "mag": 1.45, "time": 1504952800930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.930333, 35.903, 6.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayba", "mag": 4.1, "time": 1504952366970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5053, 15.7495, 68.22 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253459", "mag": 1.52, "time": 1504952233330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447, 46.021167, 0.93 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889121", "mag": 1.03, "time": 1504952209100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.871, 37.554833, 4.73 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758487", "mag": 1.12, "time": 1504952052150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.988, 36.408833, 5.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ais8", "mag": 4.3, "time": 1504951965100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.9766, 44.5128, 265.04 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604410", "mag": 1.1, "time": 1504951735991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.3876, 37.2486, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758471", "mag": 1.08, "time": 1504951652550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.931667, 34.0345, 15.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16787530", "mag": 1.1, "time": 1504951610158, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7897, 67.3419, 11.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ais3", "mag": 5.4, "time": 1504951518370, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 133.9356, -4.9459, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000airu", "mag": 4.6, "time": 1504951047220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.0237, -24.161, 169.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16787527", "mag": 1.5, "time": 1504950964134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1724, 62.5675, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16787525", "mag": 1.4, "time": 1504950309819, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6065, 60.0265, 7.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000am01", "mag": 3.8, "time": 1504950233710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0371, 53.9395, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889106", "mag": 1.8, "time": 1504950063660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.642667, 38.4305, 9.02 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayb4", "mag": 3.9, "time": 1504949950000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1532, 14.9116, 21.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889101", "mag": 1.84, "time": 1504949895770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.008833, 39.729667, 5.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823500", "mag": 1.6, "time": 1504949837453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.187, 59.0211, 72.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823499", "mag": 1.5, "time": 1504949724642, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0279, 61.4535, 96.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsy", "mag": 4.1, "time": 1504949643990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.3876, -19.5742, 213.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16787519", "mag": 1.4, "time": 1504949316312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0341, 61.6767, 50.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823497", "mag": 2.2, "time": 1504949226805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.3563, 55.6967, 21.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000airg", "mag": 2.3, "time": 1504948998980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4451, 42.6157, 5.99 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889066", "mag": 0.98, "time": 1504947621670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.982833, 37.917667, 10.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823496", "mag": 2.0, "time": 1504947486008, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.2987, 51.7726, 13.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16787403", "mag": 2.6, "time": 1504947413205, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5944, 59.4202, 75.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiqx", "mag": 4.1, "time": 1504946674160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5388, 15.3559, 54.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758415", "mag": 1.03, "time": 1504946346090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.892667, 32.718333, 8.72 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avsk", "mag": 2.8, "time": 1504946098400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4224, 42.5665, 6.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiqt", "mag": 2.6, "time": 1504946086710, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4255, 42.5806, 6.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000avsj", "mag": 2.7, "time": 1504945947000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4298, 42.5744, 7.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ampk", "mag": 3.3, "time": 1504945822720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4585, 42.6108, 6.88 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al9w", "mag": 3.6, "time": 1504945687860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4277, 42.5592, 9.39 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiur", "mag": 4.0, "time": 1504945641000, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.5631, 8.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823493", "mag": 1.8, "time": 1504945521703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5064, 51.8445, 13.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758407", "mag": 1.19, "time": 1504945503520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.470167, 34.3615, 1.96 ] } }, +{ "type": "Feature", "properties": { "id": "us2000akd5", "mag": 3.3, "time": 1504945430400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4221, 42.5799, 5.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000art2", "mag": 4.5, "time": 1504945418710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.5761, 18.7533, 262.64 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiq7", "mag": 4.1, "time": 1504945384770, "felt": 32, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4167, 42.5619, 7.19 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiql", "mag": 4.5, "time": 1504945169540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.0828, -6.9776, 133.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiq2", "mag": 3.3, "time": 1504944298530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.5842, 7.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aipz", "mag": 4.8, "time": 1504944096330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0129, 15.2713, 53.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsw", "mag": 4.7, "time": 1504943699570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.2724, -59.2757, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "hv61902241", "mag": 1.62, "time": 1504943455500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2485, 19.386833, 31.012 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj4h", "mag": 2.6, "time": 1504943362330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4304, 42.5789, 7.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aipn", "mag": 4.2, "time": 1504943316560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 74.9524, 38.8091, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aipm", "mag": 2.3, "time": 1504943304230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4353, 42.5792, 9.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aipl", "mag": 2.8, "time": 1504942989430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5726, 8.45 ] } }, +{ "type": "Feature", "properties": { "id": "us2000art3", "mag": 4.7, "time": 1504942625890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.7566, 13.8193, 16.98 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823489", "mag": 2.2, "time": 1504941981540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6119, 68.4897, 9.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16786898", "mag": 2.3, "time": 1504941973751, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6435, 68.4109, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aipa", "mag": 4.1, "time": 1504940445840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7031, 15.6436, 38.39 ] } }, +{ "type": "Feature", "properties": { "id": "ak16786512", "mag": 1.4, "time": 1504940146158, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6116, 61.8175, 55.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758383", "mag": 1.42, "time": 1504940130810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.027333, 34.440333, 12.46 ] } }, +{ "type": "Feature", "properties": { "id": "uw61305607", "mag": 1.15, "time": 1504939688980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.4665, 48.458667, 29.09 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604353", "mag": 1.1, "time": 1504939522222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9216, 38.3812, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayad", "mag": 4.2, "time": 1504939027620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4368, 15.1947, 59.18 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823487", "mag": 1.3, "time": 1504938992964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2717, 59.963, 19.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16786506", "mag": 2.6, "time": 1504938975370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5829, 68.5268, 13.9 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758359", "mag": 1.28, "time": 1504938780620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4375, 32.7105, 7.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ayac", "mag": 4.2, "time": 1504938734260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6092, 15.0415, 60.74 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aip9", "mag": 4.8, "time": 1504938495700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9169, 15.1747, 62.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aing", "mag": 5.0, "time": 1504938263510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7579, 15.8771, 50.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889046", "mag": 1.74, "time": 1504938239010, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.951833, 36.388167, 3.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758351", "mag": 1.69, "time": 1504938189230, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.433333, 32.708, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758343", "mag": 2.17, "time": 1504938036110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.650333, 32.557, 11.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsu", "mag": 4.2, "time": 1504937955720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.536, 15.7206, 33.37 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aya9", "mag": 4.1, "time": 1504937750680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4987, 15.6186, 49.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ain2", "mag": 4.5, "time": 1504937531380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2803, 15.4532, 53.46 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253349", "mag": 1.16, "time": 1504937527100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5255, 46.891167, 14.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aimz", "mag": 4.9, "time": 1504936574470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.7043, -59.8211, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aya4", "mag": 4.1, "time": 1504936122970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4429, 15.8428, 39.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823484", "mag": 1.2, "time": 1504936114606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7939, 63.1602, 125.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16786077", "mag": 1.2, "time": 1504935774238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9696, 65.5175, 9.8 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604400", "mag": 1.2, "time": 1504935386919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5673, 40.9452, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alzw", "mag": 3.4, "time": 1504935359040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4837, 52.2353, 39.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16786013", "mag": 1.4, "time": 1504934755508, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2112, 59.8068, 77.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aimb", "mag": 4.7, "time": 1504934538770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7033, 15.6728, 51.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arum", "mag": 4.3, "time": 1504934315700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6748, 15.2159, 35.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aim7", "mag": 4.0, "time": 1504934242180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7794, 15.3776, 67.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aim0", "mag": 4.3, "time": 1504933783810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0338, 15.1325, 37.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9t", "mag": 4.3, "time": 1504933351910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8516, 15.6769, 64.29 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785716", "mag": 1.3, "time": 1504933227428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6303, 68.5196, 9.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823479", "mag": 1.4, "time": 1504933167331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3862, 58.1118, 65.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823478", "mag": 1.9, "time": 1504932908497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2638, 51.342, 32.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ailq", "mag": 5.5, "time": 1504932892100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0613, 15.0808, 29.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ailp", "mag": 4.5, "time": 1504932819610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.1423, -8.6068, 144.45 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785656", "mag": 1.7, "time": 1504932712383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.238, 65.7544, 14.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72889011", "mag": 1.03, "time": 1504932679700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.051167, 36.471667, 6.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ailm", "mag": 2.9, "time": 1504932636140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.9441, 58.6028, 4.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9s", "mag": 4.1, "time": 1504932576140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6151, 15.175, 41.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ailg", "mag": 2.7, "time": 1504932451000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5107, 36.2919, 8.117 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253329", "mag": 1.19, "time": 1504932343290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.862667, 11.76 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758279", "mag": 1.67, "time": 1504932048030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.507167, 33.653, 1.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823475", "mag": 1.1, "time": 1504931942522, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2765, 60.0722, 83.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aila", "mag": 4.2, "time": 1504931645090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4593, 15.3365, 41.87 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758271", "mag": 1.52, "time": 1504931420370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8695, 34.238, 8.73 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785521", "mag": 1.4, "time": 1504931241910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.646, 68.5258, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785582", "mag": 1.0, "time": 1504931175076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1393, 61.7136, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ail5", "mag": 4.7, "time": 1504930943390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4341, 15.1257, 27.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785423", "mag": 1.8, "time": 1504930589594, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6499, 68.5284, 16.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785419", "mag": 2.0, "time": 1504930533977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1907, 61.6985, 2.3 ] } }, +{ "type": "Feature", "properties": { "id": "nm60179177", "mag": 3.06, "time": 1504930529110, "felt": 135, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.913, 38.425, 11.76 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253319", "mag": 1.63, "time": 1504930497770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.491667, 46.891833, 11.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9p", "mag": 4.1, "time": 1504930486630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9352, 15.3169, 41.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9n", "mag": 3.7, "time": 1504930165360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5559, 15.8989, 56.13 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785231", "mag": 2.5, "time": 1504929910494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6125, 68.5273, 8.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16785228", "mag": 2.4, "time": 1504929817958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6164, 68.5069, 15.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ail9", "mag": 4.2, "time": 1504929739110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2125, 15.079, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000alzs", "mag": 2.7, "time": 1504929498060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2368, 51.9836, 19.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823467", "mag": 1.5, "time": 1504929296944, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2744, 61.3017, 122.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9h", "mag": 3.8, "time": 1504928398040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0181, 16.0961, 38.88 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017252000", "mag": 3.08, "time": 1504928197450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.4461, 18.7428, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9g", "mag": 4.1, "time": 1504927088180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4711, 15.1531, 65.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784944", "mag": 1.8, "time": 1504927005991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3303, 60.1916, 78.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784941", "mag": 2.3, "time": 1504926969938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6189, 68.5221, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784938", "mag": 2.1, "time": 1504926585070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6431, 68.5555, 3.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aijy", "mag": 4.9, "time": 1504926495850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3472, 15.9092, 62.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9f", "mag": 4.0, "time": 1504926311940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.338, 15.4947, 53.82 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784757", "mag": 1.4, "time": 1504926151958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5619, 63.1355, 67.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9d", "mag": 4.0, "time": 1504926060810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.644, 15.4622, 58.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay9b", "mag": 4.0, "time": 1504925827780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0747, 15.195, 43.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aj03", "mag": 2.7, "time": 1504925336910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.2524, 54.0919, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aijm", "mag": 4.5, "time": 1504925090110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2748, -24.2322, 205.92 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aijl", "mag": 5.1, "time": 1504925024150, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7923, 15.6429, 57.68 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784618", "mag": 2.6, "time": 1504924922956, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6215, 68.5087, 13.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aij6", "mag": 4.9, "time": 1504924325880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2803, 15.0759, 19.62 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823460", "mag": 1.6, "time": 1504924009517, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6908, 68.536, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823459", "mag": 1.6, "time": 1504923856019, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1588, 59.9206, 119.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758231", "mag": 1.09, "time": 1504923480190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.197667, 33.036667, 6.54 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823458", "mag": 1.2, "time": 1504923376066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8869, 60.0725, 77.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784466", "mag": 1.3, "time": 1504922976851, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9394, 63.4575, 10.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758223", "mag": 1.64, "time": 1504922815610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.095167, 35.773167, 10.47 ] } }, +{ "type": "Feature", "properties": { "id": "uw61305517", "mag": 1.22, "time": 1504922472730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.234, 46.341167, 11.49 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758207", "mag": 0.96, "time": 1504922375210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.930333, 35.896833, 5.72 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823455", "mag": 1.1, "time": 1504921668573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5605, 58.7828, 14.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784171", "mag": 1.5, "time": 1504921324109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7065, 68.5298, 8.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay97", "mag": 4.2, "time": 1504921245860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8933, 15.7086, 79.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay95", "mag": 4.0, "time": 1504920659630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5492, 15.7942, 35.56 ] } }, +{ "type": "Feature", "properties": { "id": "ak16784114", "mag": 1.2, "time": 1504920524598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8278, 67.3421, 14.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823452", "mag": 1.3, "time": 1504919998366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.593, 58.7481, 11.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arv3", "mag": 4.3, "time": 1504919742200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.4369, 7.7941, 13.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiic", "mag": 4.1, "time": 1504919644420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.098, 15.37, 28.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888926", "mag": 1.51, "time": 1504919499600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797167, 38.8195, 2.74 ] } }, +{ "type": "Feature", "properties": { "id": "hv61901901", "mag": 2.49, "time": 1504919482270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.300507, 19.404333, 13.76 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay91", "mag": 4.1, "time": 1504919175710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5371, 15.6773, 67.69 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay90", "mag": 3.9, "time": 1504918842770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4561, 15.2969, 47.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888921", "mag": 1.43, "time": 1504918334270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.63, 40.262167, 3.32 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aiht", "mag": 4.4, "time": 1504918076900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5874, 15.6439, 12.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783729", "mag": 1.5, "time": 1504917773363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7901, 64.8033, 13.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823450", "mag": 1.8, "time": 1504917198075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.1288, 53.4202, 28.2 ] } }, +{ "type": "Feature", "properties": { "id": "uu60239577", "mag": 1.64, "time": 1504917186550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438333, 42.574167, 3.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823449", "mag": 1.6, "time": 1504917085381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.671, 59.1673, 61.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aihy", "mag": 4.1, "time": 1504916600330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3911, 16.0661, 39.18 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aih9", "mag": 2.8, "time": 1504916318430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4281, 42.5718, 5.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aih8", "mag": 2.5, "time": 1504916278870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4338, 42.5822, 5.38 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783588", "mag": 1.6, "time": 1504916071368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3277, 59.285, 86.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783586", "mag": 1.1, "time": 1504915994737, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.056, 67.2634, 8.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823446", "mag": 2.1, "time": 1504915956900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.713, 53.9765, 25.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758159", "mag": 1.56, "time": 1504915633570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2745, 33.978, 4.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsl", "mag": 4.3, "time": 1504915283460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6805, 16.8287, 106.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16823445", "mag": 1.2, "time": 1504915279966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6323, 59.8055, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783409", "mag": 1.6, "time": 1504915272065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.43, 61.3236, 75.8 ] } }, +{ "type": "Feature", "properties": { "id": "ci37164028", "mag": 1.71, "time": 1504915194240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.598333, 33.300667, 5.25 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758151", "mag": 2.09, "time": 1504915192060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.24, 32.322667, 6.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783408", "mag": 1.6, "time": 1504915154515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3632, 60.1661, 90.3 ] } }, +{ "type": "Feature", "properties": { "id": "hv61901846", "mag": 1.94, "time": 1504914308880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.314, 18.895833, 12.72 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888886", "mag": 1.0, "time": 1504914139040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.003833, 37.588667, 1.64 ] } }, +{ "type": "Feature", "properties": { "id": "ak16783243", "mag": 1.1, "time": 1504913564223, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2504, 62.3109, 15.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821920", "mag": 1.3, "time": 1504913498285, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1821, 58.2348, 101.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821919", "mag": 1.4, "time": 1504913414028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1655, 60.5722, 86.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821918", "mag": 1.1, "time": 1504913077516, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.597, 58.7696, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aigc", "mag": 4.1, "time": 1504912952040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1585, 15.0785, 47.75 ] } }, +{ "type": "Feature", "properties": { "id": "uu60239522", "mag": 1.86, "time": 1504912091450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417833, 42.557333, 7.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aifs", "mag": 4.4, "time": 1504911443790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 82.6815, 44.316, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782938", "mag": 1.1, "time": 1504911183072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3769, 64.9856, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782937", "mag": 1.1, "time": 1504910876129, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7587, 61.2722, 29.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782871", "mag": 1.5, "time": 1504910569120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4893, 60.1552, 7.8 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782868", "mag": 1.4, "time": 1504910467245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7194, 62.6908, 57.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821913", "mag": 1.7, "time": 1504910258777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0231, 58.2214, 149.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888801", "mag": 1.9, "time": 1504909953040, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8175, 37.486333, -0.46 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aif7", "mag": 2.5, "time": 1504909902600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5076, 36.2848, 8.171 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aif4", "mag": 4.8, "time": 1504909723200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8865, 15.3302, 30.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821912", "mag": 1.1, "time": 1504909705310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3127, 62.4824, 115.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aif0", "mag": 3.0, "time": 1504909701800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5069, 36.2872, 6.887 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253249", "mag": 1.02, "time": 1504909626120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.500333, 46.870333, 14.95 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888791", "mag": 1.37, "time": 1504909453970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.04, 37.6285, -2.07 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aier", "mag": 4.4, "time": 1504908895340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0113, 15.4861, 55.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821911", "mag": 1.3, "time": 1504908516343, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8637, 60.6448, 52.5 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758063", "mag": 1.18, "time": 1504908189370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.201167, 33.035167, 5.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888781", "mag": 1.42, "time": 1504907868300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.038667, 37.624833, -2.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aie8", "mag": 4.7, "time": 1504907825570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5854, 15.5735, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888776", "mag": 1.8, "time": 1504907588830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.040167, 37.63, -1.66 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aie6", "mag": 4.6, "time": 1504907582410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4976, 15.7473, 55.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aidm", "mag": 4.5, "time": 1504906777370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0707, 15.2209, 55.42 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aid9", "mag": 4.8, "time": 1504906287810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3905, 15.4318, 56.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888771", "mag": 1.19, "time": 1504906092960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.451, 37.990333, 1.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aicx", "mag": 4.3, "time": 1504906074440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2669, 15.5886, 57.93 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782412", "mag": 1.0, "time": 1504906074363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3787, 62.4883, 7.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782375", "mag": 2.3, "time": 1504905457780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.4787, 52.748, 40.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888756", "mag": 1.38, "time": 1504905314090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.756167, 39.273333, 4.85 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782374", "mag": 1.2, "time": 1504905292993, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8681, 59.9024, 67.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aicp", "mag": 4.2, "time": 1504905187950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4812, 15.6987, 35.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782334", "mag": 1.1, "time": 1504904835105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7621, 65.5089, 13.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16782328", "mag": 2.5, "time": 1504904826453, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.811, 61.2391, 56.6 ] } }, +{ "type": "Feature", "properties": { "id": "uw61305342", "mag": 1.93, "time": 1504904598280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.065167, 44.442833, -1.58 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888751", "mag": 1.54, "time": 1504903192860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7535, 39.279333, 8.66 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781999", "mag": 3.0, "time": 1504902403320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2239, 60.1717, 139.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781990", "mag": 2.9, "time": 1504902403227, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2392, 60.1979, 145.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay7u", "mag": 4.1, "time": 1504902279690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7805, 15.528, 44.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821902", "mag": 2.3, "time": 1504902127057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6706, 53.1595, 47.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253224", "mag": 1.28, "time": 1504901825890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.961667, 44.423667, 7.65 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758023", "mag": 1.23, "time": 1504901676790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.243333, 34.049667, 14.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsf", "mag": 4.8, "time": 1504901654190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.1397, -18.9749, 151.93 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aib4", "mag": 4.7, "time": 1504901358420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4084, 14.947, 20.03 ] } }, +{ "type": "Feature", "properties": { "id": "mb80254729", "mag": 1.15, "time": 1504901142840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5325, 46.863333, 12.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arse", "mag": 4.2, "time": 1504900520170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.6478, 18.4195, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781710", "mag": 1.5, "time": 1504900346639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5122, 61.5519, 57.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781709", "mag": 1.3, "time": 1504900242686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7722, 60.316, 70.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aibq", "mag": 2.5, "time": 1504899687060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4383, 42.5694, 8.27 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888741", "mag": 1.05, "time": 1504899640660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.013, 37.593167, 0.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aib3", "mag": 2.8, "time": 1504899556990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4363, 42.571, 9.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aia5", "mag": 2.6, "time": 1504899482480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4289, 42.5733, 13.75 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781595", "mag": 1.7, "time": 1504899244914, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1502, 60.3533, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781585", "mag": 3.9, "time": 1504899189169, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5601, 59.2544, 64.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37758007", "mag": 2.02, "time": 1504898829300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.561833, 31.0585, 5.61 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781550", "mag": 1.4, "time": 1504898282611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6296, 61.6699, 64.1 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757991", "mag": 1.52, "time": 1504897913130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.184167, 34.008167, 14.79 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757975", "mag": 1.23, "time": 1504897847890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.191833, 34.995167, -0.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai96", "mag": 4.7, "time": 1504897612480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1128, 15.0427, 38.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay7g", "mag": 4.5, "time": 1504897486190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6162, 15.5292, 52.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aku3", "mag": 2.7, "time": 1504897427450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4362, 42.5723, 6.2 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aruj", "mag": 4.0, "time": 1504897268300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.0589, 51.6006, 526.16 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai8x", "mag": 5.3, "time": 1504897044080, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9814, 16.231, 63.24 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ars7", "mag": 4.4, "time": 1504896441090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.9803, -12.2109, 239.13 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ars8", "mag": 4.2, "time": 1504895755810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4237, 15.0921, 33.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16781202", "mag": 1.1, "time": 1504895394318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.517, 62.887, 92.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai8l", "mag": 5.0, "time": 1504895053450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0247, 15.6158, 25.92 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888711", "mag": 1.13, "time": 1504894886190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.369, 37.616167, 3.76 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757951", "mag": 1.29, "time": 1504894538140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.34, 35.0645, -0.97 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604251", "mag": 1.1, "time": 1504893693579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5283, 37.177, 14.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888696", "mag": 1.24, "time": 1504893681000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9525, 37.9215, -0.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai89", "mag": 4.9, "time": 1504893629390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.339, 15.3801, 37.31 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780971", "mag": 2.0, "time": 1504893338524, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7656, 56.9755, 12.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai7x", "mag": 4.4, "time": 1504893167240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8739, 15.6809, 69.44 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757919", "mag": 1.09, "time": 1504892320190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792333, 33.504167, 6.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780872", "mag": 2.7, "time": 1504892251611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2184, 60.0235, 132.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai7w", "mag": 5.1, "time": 1504892136330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.7094, 14.7125, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780870", "mag": 1.9, "time": 1504892114398, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5364, 59.0829, 80.6 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604241", "mag": 1.7, "time": 1504892108096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8858, 39.5547, 16.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757903", "mag": 1.06, "time": 1504892000240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.084, 33.233167, 9.85 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253164", "mag": 0.95, "time": 1504891992150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5415, 46.8995, 11.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai7p", "mag": 4.3, "time": 1504891955840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.495, 15.1404, 36.22 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780841", "mag": 1.4, "time": 1504891846856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3249, 60.9139, 26.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsh", "mag": 4.5, "time": 1504891333730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 133.2388, -6.8416, 19.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay6x", "mag": 4.1, "time": 1504891315080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7297, 15.3343, 19.17 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ars4", "mag": 4.4, "time": 1504891219920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.7693, 14.6837, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780813", "mag": 1.5, "time": 1504891126668, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.153, 61.7092, 3.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888686", "mag": 1.23, "time": 1504891114230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1045, 37.325167, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757879", "mag": 2.31, "time": 1504890797650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.463833, 34.355833, 3.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai73", "mag": 4.9, "time": 1504890172380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6852, 15.6184, 20.97 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai6w", "mag": 4.8, "time": 1504890101520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3813, 15.1628, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai6n", "mag": 4.6, "time": 1504889103890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.804, -6.0426, 126.88 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai6c", "mag": 4.7, "time": 1504888948510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8822, 15.7603, 70.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai66", "mag": 3.1, "time": 1504888942660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.6127, 7.46 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757839", "mag": 1.07, "time": 1504888838380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.931, 35.8975, 5.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai5r", "mag": 5.0, "time": 1504887559080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1176, 15.3478, 50.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai7e", "mag": 2.6, "time": 1504887451250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8013, 51.3347, 33.06 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai5q", "mag": 4.8, "time": 1504887267930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.834, 15.2659, 31.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ars1", "mag": 4.4, "time": 1504887163560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.5842, 0.5634, 87.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai5f", "mag": 4.9, "time": 1504887145160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4164, 15.3325, 55.79 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aixn", "mag": 4.1, "time": 1504887139190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.237, 15.3669, 61.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821886", "mag": 1.0, "time": 1504887040916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7913, 61.8643, 40.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai53", "mag": 4.6, "time": 1504886882420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4908, 15.0663, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780437", "mag": 1.7, "time": 1504886789015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1717, 61.2338, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arsa", "mag": 4.8, "time": 1504886367500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -45.1832, 25.2517, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrz", "mag": 4.3, "time": 1504885790410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.1544, 13.7011, 115.66 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757791", "mag": 2.49, "time": 1504885701960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.863167, 36.514, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888591", "mag": 1.18, "time": 1504885591170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.029167, 37.64, 1.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay69", "mag": 4.3, "time": 1504884967040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8299, 15.2537, 51.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888561", "mag": 2.76, "time": 1504884687580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.4015, 40.656167, 4.61 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888556", "mag": 1.22, "time": 1504884477720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.594833, 36.036167, 3.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888551", "mag": 1.29, "time": 1504884449700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.600833, 36.033, 2.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai45", "mag": 4.4, "time": 1504884249230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 51.6373, 29.0196, 32.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai4f", "mag": 5.0, "time": 1504884005650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.4529, -15.2805, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757767", "mag": 1.56, "time": 1504883892090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.447333, 34.149, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888536", "mag": 1.66, "time": 1504883570470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.168167, 39.1465, -0.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrw", "mag": 4.2, "time": 1504882974870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7985, 15.5213, 35.36 ] } }, +{ "type": "Feature", "properties": { "id": "ak16779960", "mag": 1.8, "time": 1504882678981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0626, 62.8988, 105.6 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757743", "mag": 0.97, "time": 1504882082250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.499333, 33.723667, 12.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai3n", "mag": 5.3, "time": 1504881901650, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3384, 15.544, 53.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai3i", "mag": 5.0, "time": 1504881612700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4062, 15.406, 49.05 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai3c", "mag": 5.1, "time": 1504880703430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1626, 15.9178, 78.53 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821881", "mag": 1.9, "time": 1504880601665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7019, 53.1531, 4.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai3a", "mag": 4.6, "time": 1504880185590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9379, 15.4789, 51.37 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888511", "mag": 1.64, "time": 1504879933970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.805, 37.519, 0.63 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrt", "mag": 4.3, "time": 1504879797140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -92.5495, 15.2436, 49.04 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888506", "mag": 1.11, "time": 1504879682840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.807167, 37.5155, -1.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2x", "mag": 4.4, "time": 1504878550770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3291, 15.5119, 43.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2u", "mag": 4.5, "time": 1504878237250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3775, 15.3318, 55.57 ] } }, +{ "type": "Feature", "properties": { "id": "ak16779589", "mag": 2.1, "time": 1504878197682, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7176, 61.7913, 43.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888501", "mag": 1.4, "time": 1504877974600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826833, 38.884833, 0.43 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2s", "mag": 4.5, "time": 1504877794630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2597, 15.3155, 57.11 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2p", "mag": 4.3, "time": 1504877637550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3617, 15.3594, 72.43 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821879", "mag": 1.1, "time": 1504877280981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4859, 62.9279, 91.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2h", "mag": 4.3, "time": 1504877227420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2794, 15.5765, 57.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai2d", "mag": 4.9, "time": 1504877000620, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.4519, 39.5355, 14.54 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888491", "mag": 1.84, "time": 1504876384490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.493333, 38.505333, 9.95 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821878", "mag": 1.4, "time": 1504875984627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1326, 61.9648, 66.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821876", "mag": 2.2, "time": 1504875655387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.9923, 52.3567, 17.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888486", "mag": 2.07, "time": 1504875297970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.476833, 38.505667, 10.55 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888481", "mag": 2.29, "time": 1504875261290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.487833, 38.504167, 11.24 ] } }, +{ "type": "Feature", "properties": { "id": "ak16779354", "mag": 1.2, "time": 1504874899621, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8024, 62.2347, 27.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai1z", "mag": 4.7, "time": 1504874764610, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9526, 15.348, 66.08 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604198", "mag": 1.6, "time": 1504874486416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1528, 36.3422, 12.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16779312", "mag": 1.1, "time": 1504874405501, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.2249, 66.2606, 1.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821873", "mag": 1.7, "time": 1504874360732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.5174, 51.2619, 22.7 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604197", "mag": 1.1, "time": 1504874200883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.2814, 37.8092, 5.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888476", "mag": 1.21, "time": 1504873957930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.509333, 40.482667, 4.94 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757703", "mag": 1.39, "time": 1504873858920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.717833, 33.649333, 15.22 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757695", "mag": 1.17, "time": 1504872471560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.568167, 33.822667, 8.77 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai1k", "mag": 5.2, "time": 1504872379780, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4203, 15.4936, 64.61 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604195", "mag": 1.1, "time": 1504872342696, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0794, 39.7864, 6.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai1f", "mag": 4.5, "time": 1504872210290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.752, 15.6687, 34.52 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai17", "mag": 4.7, "time": 1504871509040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.251, 15.2604, 43.78 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757687", "mag": 1.13, "time": 1504871201290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5185, 33.500333, 13.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai11", "mag": 4.8, "time": 1504870992430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5788, 16.0581, 67.6 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888461", "mag": 1.42, "time": 1504869975320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.437833, 39.504833, 12.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai0u", "mag": 5.0, "time": 1504869955970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7875, 15.7988, 32.83 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888456", "mag": 1.91, "time": 1504869902080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.485667, 38.504833, 10.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai0r", "mag": 3.1, "time": 1504869744270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4645, 42.6225, 8.36 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai0n", "mag": 4.5, "time": 1504869089530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4825, 15.1089, 36.59 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai0k", "mag": 4.3, "time": 1504868775480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.798, 15.8932, 52.08 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778868", "mag": 2.4, "time": 1504868579816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6965, 62.1823, 44.5 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888446", "mag": 1.29, "time": 1504868153570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.486333, 38.5055, 8.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888436", "mag": 1.9, "time": 1504867751580, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.482833, 38.504333, 10.56 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888431", "mag": 1.71, "time": 1504867332410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.491833, 38.504667, 9.32 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888421", "mag": 1.08, "time": 1504867024130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.489, 38.504333, 8.33 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821868", "mag": 2.1, "time": 1504866678618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4655, 55.6664, 99.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821867", "mag": 1.4, "time": 1504866626331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0732, 60.0832, 7.7 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai08", "mag": 4.7, "time": 1504866065090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.9223, 5.4358, 106.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778797", "mag": 1.0, "time": 1504865774499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3276, 61.5525, 10.3 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604189", "mag": 1.2, "time": 1504865677094, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0784, 39.7853, 6.9 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888411", "mag": 1.53, "time": 1504865468770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.476167, 38.507167, 9.38 ] } }, +{ "type": "Feature", "properties": { "id": "hv61901161", "mag": 1.74, "time": 1504864814220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.466833, 19.2065, 36.007 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234788", "mag": 2.39, "time": 1504864780960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7805, 37.3255, 5.78 ] } }, +{ "type": "Feature", "properties": { "id": "ak16780611", "mag": 2.4, "time": 1504864612255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1592, 61.3969, 4.3 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778631", "mag": 2.2, "time": 1504864578261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1624, 61.4081, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "uw61305087", "mag": 2.01, "time": 1504864189490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.050833, 48.9275, 23.48 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821863", "mag": 1.7, "time": 1504863670078, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4879, 51.7374, 21.1 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821862", "mag": 1.8, "time": 1504862106783, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9215, 58.7206, 119.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahzn", "mag": 4.6, "time": 1504861954060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4387, 15.3946, 52.08 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888396", "mag": 1.27, "time": 1504861876770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8075, 37.512833, 1.14 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahzl", "mag": 4.5, "time": 1504861821720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4897, 15.3898, 66.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahzj", "mag": 4.5, "time": 1504861699670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5329, 15.609, 39.64 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757655", "mag": 1.16, "time": 1504861667220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.622833, 33.107167, 12.71 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778553", "mag": 1.9, "time": 1504861559880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5627, 66.997, 11.1 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888391", "mag": 2.09, "time": 1504860900670, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.456, 39.646667, 9.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay4f", "mag": 4.1, "time": 1504860843930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7484, 15.3716, 56.33 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888386", "mag": 2.1, "time": 1504860440750, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.938, 37.831333, 7.32 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay4d", "mag": 4.4, "time": 1504860354710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.834, 15.3232, 49.34 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrb", "mag": 4.6, "time": 1504860180930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0811, 15.785, 52.87 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahzq", "mag": 4.5, "time": 1504860168930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9132, 15.2837, 68.08 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahz5", "mag": 5.3, "time": 1504859674330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1725, 15.2148, 50.77 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821859", "mag": 2.1, "time": 1504859557955, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.0839, 54.9712, 35.5 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604302", "mag": 1.1, "time": 1504859552745, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4838, 37.3947, 8.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778352", "mag": 1.2, "time": 1504859550711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4759, 63.0882, 87.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahz3", "mag": 4.3, "time": 1504859478950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3904, 15.121, 30.23 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604182", "mag": 1.0, "time": 1504858881802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0405, 37.2978, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahz1", "mag": 4.3, "time": 1504858630350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6852, 15.833, 76.27 ] } }, +{ "type": "Feature", "properties": { "id": "uu60239147", "mag": 2.45, "time": 1504858591000, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444167, 42.664333, 8.83 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al72", "mag": 2.9, "time": 1504858190760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2139, 52.5352, 91.97 ] } }, +{ "type": "Feature", "properties": { "id": "uu60239137", "mag": 1.54, "time": 1504858110210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.647, 44.396167, 2.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arui", "mag": 4.2, "time": 1504858026090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4738, 14.8297, 45.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahyr", "mag": 4.3, "time": 1504857969210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0003, 15.7457, 35.1 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arul", "mag": 4.3, "time": 1504857669250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.801, 14.8524, 28.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahyk", "mag": 4.5, "time": 1504857596840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7758, 15.5339, 42.45 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604180", "mag": 1.2, "time": 1504857534482, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0136, 37.3074, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821856", "mag": 1.2, "time": 1504857418267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4697, 58.6313, 13.4 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604280", "mag": 1.0, "time": 1504857267736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7805, 38.6696, 7.4 ] } }, +{ "type": "Feature", "properties": { "id": "us2000aruq", "mag": 4.3, "time": 1504857079940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6759, 15.5537, 36.84 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahyf", "mag": 3.2, "time": 1504857069370, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4101, 42.5653, 6.35 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757631", "mag": 1.01, "time": 1504856868740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.778, 36.031333, 2.15 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay0x", "mag": 4.1, "time": 1504856777400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7738, 15.4661, 38.21 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821855", "mag": 1.3, "time": 1504856435979, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.538, 63.3273, 125.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahy9", "mag": 4.4, "time": 1504856316640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6365, 15.5777, 47.53 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahy5", "mag": 3.2, "time": 1504855878650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.446, 42.6598, 6.58 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahy6", "mag": 4.4, "time": 1504855839640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7956, 15.6082, 34.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrn", "mag": 4.1, "time": 1504855556590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2068, 15.1108, 51.65 ] } }, +{ "type": "Feature", "properties": { "id": "us2000al71", "mag": 3.0, "time": 1504855456090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0677, 53.8832, 50.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778144", "mag": 3.2, "time": 1504855447301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.611, 66.2631, 33.8 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arri", "mag": 4.2, "time": 1504855233030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9743, 15.126, 35.68 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888356", "mag": 1.89, "time": 1504854775740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3305, 41.068, 11.84 ] } }, +{ "type": "Feature", "properties": { "id": "mb80253029", "mag": 1.45, "time": 1504854704970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.500667, 45.881, 8.81 ] } }, +{ "type": "Feature", "properties": { "id": "ak16778123", "mag": 2.3, "time": 1504854630925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.7701, 57.7458, 12.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888351", "mag": 1.26, "time": 1504854591960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.882167, 37.522833, -2.2 ] } }, +{ "type": "Feature", "properties": { "id": "hv61901091", "mag": 1.09, "time": 1504854245900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.447167, 19.4775, 2.47 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay45", "mag": 4.2, "time": 1504854208800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7971, 14.6019, 44.25 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahxm", "mag": 4.2, "time": 1504854069790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8774, 14.8705, 34.98 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay43", "mag": 4.1, "time": 1504853757100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8976, 15.4459, 61.28 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahxh", "mag": 3.6, "time": 1504853614760, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9507, 36.9956, 6.27 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821851", "mag": 1.1, "time": 1504853435000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2544, 63.717, 83.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888336", "mag": 0.98, "time": 1504853065280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.982833, 37.5425, 1.67 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777966", "mag": 1.3, "time": 1504853023023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.715, 63.9895, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arut", "mag": 4.2, "time": 1504852684440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2381, 15.5108, 43.98 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757623", "mag": 0.96, "time": 1504852586240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.789, 33.501333, 5.44 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr6", "mag": 4.2, "time": 1504852477520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3508, 15.2654, 45.29 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888331", "mag": 1.19, "time": 1504852408190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736, 38.759167, 1.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr7", "mag": 4.0, "time": 1504852398530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7954, 14.8479, 70.92 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604169", "mag": 1.2, "time": 1504852379590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2104, 36.4921, 0.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahxc", "mag": 4.7, "time": 1504852332790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 3.8455, 72.6309, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888321", "mag": 1.8, "time": 1504852052730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8065, 38.792167, 2.94 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahx3", "mag": 4.3, "time": 1504851979140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.627, 15.4476, 46.76 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777937", "mag": 2.1, "time": 1504851258875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4392, 60.165, 78.3 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr1", "mag": 4.3, "time": 1504851196580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9103, 15.3461, 69.88 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821848", "mag": 1.5, "time": 1504851158790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7947, 60.1163, 106.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahwt", "mag": 4.6, "time": 1504850928420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5535, 15.437, 48.5 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr4", "mag": 4.3, "time": 1504850711370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9041, 15.1749, 40.34 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777931", "mag": 1.3, "time": 1504850655355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0257, 67.0569, 3.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr2", "mag": 4.2, "time": 1504850627530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1989, 15.0884, 40.99 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arrk", "mag": 4.2, "time": 1504850557880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7531, 15.4362, 36.4 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888301", "mag": 1.87, "time": 1504850251760, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802333, 38.820667, 3.26 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahwk", "mag": 4.6, "time": 1504850223990, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1219, 15.2941, 54.75 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahx1", "mag": 4.3, "time": 1504850059440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9647, 15.304, 72.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay3u", "mag": 4.2, "time": 1504849825570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.712, 15.4284, 47.14 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888296", "mag": 1.15, "time": 1504849761840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.847667, 0.54 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay3t", "mag": 4.4, "time": 1504849737970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8795, 15.668, 47.2 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888271", "mag": 1.56, "time": 1504849628820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8005, 38.846333, 0.64 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888266", "mag": 1.02, "time": 1504849513230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801666, 38.847332, 0.61 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahw5", "mag": 5.0, "time": 1504849467850, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7228, 15.5333, 34.69 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr3", "mag": 4.3, "time": 1504849426720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0216, 15.4454, 53.87 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888261", "mag": 0.99, "time": 1504849348500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.761002, 38.832501, 0.49 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604165", "mag": 2.1, "time": 1504849234193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.9828, 37.2854, 2.6 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arr0", "mag": 4.9, "time": 1504849156050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9438, 15.1471, 68.27 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay3s", "mag": 4.7, "time": 1504849019590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8391, 15.6629, 60.73 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arux", "mag": 5.1, "time": 1504848867960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0987, 14.9089, 42.35 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai3y", "mag": 2.5, "time": 1504848837100, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4714, 36.5024, 6.91 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahvy", "mag": 5.2, "time": 1504848817820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4082, 15.2843, 45.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arqy", "mag": 4.6, "time": 1504848547140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9331, 15.1504, 39.51 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888241", "mag": 1.03, "time": 1504848340890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800835, 38.847832, 0.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahvs", "mag": 5.2, "time": 1504848276840, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5946, 15.2029, 49.18 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888226", "mag": 1.48, "time": 1504848105550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.848167, 0.48 ] } }, +{ "type": "Feature", "properties": { "id": "nn00604164", "mag": 1.9, "time": 1504848096515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8669, 37.2911, 8.9 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ay3q", "mag": 4.8, "time": 1504848059390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6096, 15.9617, 41.51 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahvc", "mag": 5.3, "time": 1504847863090, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5672, 15.5726, 51.13 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107624", "mag": 2.16, "time": 1504847827370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.752167, 39.287167, 10.78 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888211", "mag": 1.01, "time": 1504847761210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.765663, 38.848667, 6.01 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888201", "mag": 1.17, "time": 1504847709790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80883, 38.829666, 0.99 ] } }, +{ "type": "Feature", "properties": { "id": "pr2017251000", "mag": 3.73, "time": 1504847643290, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.2905, 19.3283, 52.0 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arqw", "mag": 4.8, "time": 1504847625230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8789, 15.4565, 61.03 ] } }, +{ "type": "Feature", "properties": { "id": "us2000arqv", "mag": 5.0, "time": 1504847479550, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.5159, 2.4289, 235.24 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107629", "mag": 1.35, "time": 1504847454920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.805833, 38.815333, 2.23 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888186", "mag": 1.45, "time": 1504847378350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.766, 38.8255, 0.39 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888181", "mag": 2.28, "time": 1504847361610, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7555, 38.775667, 0.02 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888171", "mag": 1.83, "time": 1504847323920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7715, 38.817333, -0.11 ] } }, +{ "type": "Feature", "properties": { "id": "nc71107399", "mag": 1.12, "time": 1504847319000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771167, 38.819333, -0.31 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888156", "mag": 1.24, "time": 1504847297950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.556, 38.807, 15.91 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888151", "mag": 1.36, "time": 1504847289840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806, 38.822, 1.41 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888176", "mag": 1.79, "time": 1504847279970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.739667, 38.774, -0.49 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888146", "mag": 2.3, "time": 1504847258860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817833, 38.815167, 0.34 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888141", "mag": 2.42, "time": 1504847223340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.83, 1.81 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahv7", "mag": 5.7, "time": 1504846893100, "felt": 26, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2707, 15.1746, 35.87 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777708", "mag": 1.1, "time": 1504846594461, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0631, 61.4229, 6.8 ] } }, +{ "type": "Feature", "properties": { "id": "mb80252994", "mag": 1.72, "time": 1504846249390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.541833, 46.857167, 12.55 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahv0", "mag": 8.1, "time": 1504846160000, "felt": 2494, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -93.9067, 15.0356, 56.67 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ai6a", "mag": 2.5, "time": 1504846040410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.4753, 53.7845, 22.98 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888131", "mag": 1.2, "time": 1504845594500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8105, 37.463833, -1.37 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821844", "mag": 2.0, "time": 1504845256450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.621, 51.2706, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757591", "mag": 1.24, "time": 1504844674340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.899167, 34.321833, 9.91 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821842", "mag": 2.0, "time": 1504843966513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.0405, 51.3724, 44.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821841", "mag": 2.4, "time": 1504843627204, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0538, 52.2197, 10.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821840", "mag": 1.4, "time": 1504843458180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7807, 61.7731, 61.9 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821839", "mag": 1.1, "time": 1504843388032, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5616, 61.4081, 45.5 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777570", "mag": 1.9, "time": 1504843130740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.812, 51.8664, 11.6 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821837", "mag": 1.7, "time": 1504843122073, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.717, 58.7435, 117.7 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821836", "mag": 1.3, "time": 1504842507708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7323, 60.5323, 52.2 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757551", "mag": 1.47, "time": 1504841647940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7945, 33.496333, 3.33 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahus", "mag": 4.7, "time": 1504841042960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.0592, 52.1619, 10.0 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777419", "mag": 1.0, "time": 1504839731548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.81, 64.7157, 15.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777418", "mag": 2.4, "time": 1504839437977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.7414, 52.1837, 13.2 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821832", "mag": 2.4, "time": 1504839217735, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2407, 52.3318, 38.5 ] } }, +{ "type": "Feature", "properties": { "id": "hv61900746", "mag": 2.1, "time": 1504839173590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.978833, 19.772, 43.163 ] } }, +{ "type": "Feature", "properties": { "id": "ismpkansas70234763", "mag": 1.85, "time": 1504838718270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887167, 37.203, 6.15 ] } }, +{ "type": "Feature", "properties": { "id": "ci37757519", "mag": 1.49, "time": 1504838267430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.945167, 34.213667, 19.49 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahub", "mag": 4.3, "time": 1504837583700, "felt": 823, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.683, 36.6996, 6.073 ] } }, +{ "type": "Feature", "properties": { "id": "ak16777416", "mag": 1.3, "time": 1504836895690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6982, 63.5777, 11.7 ] } }, +{ "type": "Feature", "properties": { "id": "uw61304877", "mag": 1.15, "time": 1504836765080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.568333, 48.699167, 3.29 ] } }, +{ "type": "Feature", "properties": { "id": "us2000ahu8", "mag": 3.7, "time": 1504836433340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4569, 42.6238, 5.0 ] } }, +{ "type": "Feature", "properties": { "id": "nc72888096", "mag": 2.03, "time": 1504835142230, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.053667, 37.835167, 7.59 ] } }, +{ "type": "Feature", "properties": { "id": "ak16821829", "mag": 1.5, "time": 1504834613166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7652, 67.5597, 6.1 ] } }, +{ "type": "Feature", "properties": { "id": "hv61900626", "mag": 2.91, "time": 1504833891990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.011833, 19.399333, 2.609 ] } } +] +} diff --git a/platform/ios/app-swift/Sources/ClusteringExample.swift b/platform/ios/app-swift/Sources/ClusteringExample.swift new file mode 100644 index 000000000000..04de01733494 --- /dev/null +++ b/platform/ios/app-swift/Sources/ClusteringExample.swift @@ -0,0 +1,71 @@ +import MapLibre +import SwiftUI +import UIKit + +class ClusteringExampleUIKit: UIViewController, MLNMapViewDelegate { + override func viewDidLoad() { + super.viewDidLoad() + + let mapView = MLNMapView(frame: view.bounds) + mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + mapView.delegate = self + + mapView.setCenter(CLLocationCoordinate2D(latitude: 41.8864, longitude: -87.7135), zoomLevel: 2, animated: false) + view.addSubview(mapView) + } + + func mapView(_: MLNMapView, didFinishLoading style: MLNStyle) { + guard let earthquakesJson = Bundle.main.url(forResource: "earthquakes", withExtension: "geojson"), + let data = try? Data(contentsOf: earthquakesJson), + let shape = try? MLNShape(data: data, encoding: String.Encoding.utf8.rawValue) + else { + preconditionFailure("Failed to load local GeoJSON file earthquakes.json") + } + + let shapeSource = MLNShapeSource( + identifier: "earthquakes", + shape: shape, + options: [ + .clustered: true, + .clusterRadius: 50, + .clusterMinPoints: 10, + .maximumZoomLevelForClustering: 14, + ] + ) + + style.addSource(shapeSource) + + if let image = UIImage(named: "house-icon") { + style.setImage(image, forName: "home-symbol") + } + + let unclusteredLayer = MLNSymbolStyleLayer(identifier: "unclustered-symbols", source: shapeSource) + unclusteredLayer.iconImageName = NSExpression(forConstantValue: "home-symbol") + unclusteredLayer.iconScale = NSExpression(forConstantValue: 0.5) + unclusteredLayer.predicate = NSPredicate(format: "cluster != YES") + style.addLayer(unclusteredLayer) + + let clusterLayer = MLNCircleStyleLayer(identifier: "cluster-circles", source: shapeSource) + clusterLayer.circleColor = NSExpression(forConstantValue: UIColor.red) + clusterLayer.circleRadius = NSExpression(forConstantValue: 20) + clusterLayer.predicate = NSPredicate(format: "cluster == YES") + style.addLayer(clusterLayer) + + let clusterCountLayer = MLNSymbolStyleLayer(identifier: "cluster-counts", source: shapeSource) + clusterCountLayer.text = NSExpression(format: "CAST(point_count, 'NSString')") + clusterCountLayer.textColor = NSExpression(forConstantValue: UIColor.white) + clusterCountLayer.textFontSize = NSExpression(forConstantValue: 12) + clusterCountLayer.predicate = NSPredicate(format: "cluster == YES") + style.addLayer(clusterCountLayer) + } +} + +struct ClusteringExampleUIViewControllerRepresentable: UIViewControllerRepresentable { + typealias UIViewControllerType = ClusteringExampleUIKit + + func makeUIViewController(context _: Context) -> ClusteringExampleUIKit { + ClusteringExampleUIKit() + } + + func updateUIViewController(_: ClusteringExampleUIKit, context _: Context) {} +} diff --git a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift index e4dd3f371059..ed9b0cac3c35 100644 --- a/platform/ios/app-swift/Sources/MapLibreNavigationView.swift +++ b/platform/ios/app-swift/Sources/MapLibreNavigationView.swift @@ -34,6 +34,9 @@ struct MapLibreNavigationView: View { NavigationLink("AddMarkerExample") { AddMarkerSymbolExampleUIViewControllerRepresentable() } + NavigationLink("ClusteringExample") { + ClusteringExampleUIViewControllerRepresentable() + } NavigationLink("ObserverExample") { ObserverExampleViewUIViewControllerRepresentable() } From bcf636a91a0d4bd01744cd34a0432a36dcaaff7c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 9 Jul 2025 23:04:01 +0200 Subject: [PATCH 261/339] Revert "Fix the symbol blink issue by only placing the symbol in current level (#3534)" (#3610) --- platform/android/CHANGELOG.md | 6 ++++++ platform/android/VERSION | 2 +- platform/ios/CHANGELOG.md | 4 ++++ platform/ios/VERSION | 2 +- src/mbgl/text/placement.cpp | 6 ------ 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index b89da0953a18..d14954d28446 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog MapLibre Native for Android +## 11.12.1 + +### 🐞 Bug fixes + +- Revert "Fix the symbol blink issue by only placing the symbol in current level", as this was causing regressions ([#3610](https://github.com/maplibre/maplibre-native/pull/3610)). + ## 11.12.0 ### ✨ Features and improvements diff --git a/platform/android/VERSION b/platform/android/VERSION index a0980739e20b..4feb4470926b 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.12.0 +11.12.1 diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 3e86baf17506..78aaa5a4f1c8 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -4,6 +4,10 @@ MapLibre welcomes participation and contributions from everyone. Please read [`M ## main +## 6.17.1 + +- Revert "Fix the symbol blink issue by only placing the symbol in current level", as this was causing regressions ([#3610](https://github.com/maplibre/maplibre-native/pull/3610)). + ## 6.17.0 - Fix render pipeline state bug ([#3598](https://github.com/maplibre/maplibre-native/pull/3598)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 1980a78f2054..369689dd813e 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.17.0 +6.17.1 diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 71c2b92bf173..fe774da2e7c1 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -276,12 +276,6 @@ JointPlacement Placement::placeSymbol(const SymbolInstance& symbolInstance, cons // a parent tile that _should_ be placed. return kUnplaced; } - - // Place the symbol only at the current level to prevent it from blinking during the transition. - if (ctx.getOverscaledID().overscaledZ != int(placementZoom)) { - return kUnplaced; - } - const SymbolBucket& bucket = ctx.getBucket(); const mat4& posMatrix = ctx.getRenderTile().matrix; const auto& collisionGroup = ctx.collisionGroup; From c284e0baaeef08fb1f31c08bfe97a665c9b67b47 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 14 Jul 2025 17:53:30 +0200 Subject: [PATCH 262/339] Use --retry-on-errors flag for querying workflows (#3613) --- .github/workflows/android-device-test.yml | 2 +- .github/workflows/pr-bloaty-ios.yml | 2 +- .github/workflows/pr-linux-tests.yml | 2 +- .github/workflows/upload-coverage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index f9329669d6ca..b5802e062e70 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -77,7 +77,7 @@ jobs: - id: parent_workflow run: | - conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion') + conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion') was_skipped=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "was_skipped=$was_skipped" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index 700f423fc3f2..66dc7009eb04 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -21,7 +21,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "ios-build").conclusion') + conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "ios-build").conclusion') should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index 9a916ef2d816..0aa076d47b1c 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -24,7 +24,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-build-and-test").conclusion') + conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-build-and-test").conclusion') should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/upload-coverage.yml b/.github/workflows/upload-coverage.yml index 5cffd6324871..6bc94ea439f4 100644 --- a/.github/workflows/upload-coverage.yml +++ b/.github/workflows/upload-coverage.yml @@ -14,7 +14,7 @@ jobs: steps: - id: check_skip run: | - conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-coverage").conclusion') + conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-coverage").conclusion') should_run=$([[ "$conclusion" = "success" ]] && echo "true" || echo "false") echo "should_run=$should_run" >> "$GITHUB_OUTPUT" From 115043c8baef69c720ba0c4ede1ef6938dff1b6b Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 14 Jul 2025 21:41:45 +0200 Subject: [PATCH 263/339] Run Android instrumentation tests for Vulkan (#3614) --- .github/workflows/android-ci.yml | 29 +++++++++++++++++------ .github/workflows/android-device-test.yml | 17 +++++++++---- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 85cef8241c78..f0168d025f38 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -189,20 +189,35 @@ jobs: - if: github.event_name == 'pull_request' uses: ./.github/actions/save-pr-number - - name: Build Instrumentation Tests, copy to platform/android + - name: Build Instrumentation Tests (OpenGL), copy to platform/android run: | ./gradlew assembleOpenglDebug assembleOpenglDebugAndroidTest -PtestBuildType=debug - cp MapLibreAndroidTestApp/build/outputs/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk InstrumentationTestApp.apk - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/debug/MapLibreAndroidTestApp-opengl-debug-androidTest.apk InstrumentationTests.apk + cp MapLibreAndroidTestApp/build/outputs/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk InstrumentationTestAppOpenGL.apk + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/debug/MapLibreAndroidTestApp-opengl-debug-androidTest.apk InstrumentationTestsOpenGL.apk + + - name: Upload android-ui-test-opengl + uses: actions/upload-artifact@v4 + with: + if-no-files-found: error + name: android-ui-test-opengl + path: | + platform/android/InstrumentationTestAppOpenGL.apk + platform/android/InstrumentationTestsOpenGL.apk + + - name: Build Instrumentation Tests, copy to platform/android + run: | + ./gradlew assembleVulkanDebug assembleVulkanDebugAndroidTest -PtestBuildType=debug + cp MapLibreAndroidTestApp/build/outputs/apk/vulkan/debug/MapLibreAndroidTestApp-vulkan-debug.apk InstrumentationTestAppVulkan.apk + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/vulkan/debug/MapLibreAndroidTestApp-vulkan-debug-androidTest.apk InstrumentationTestsVulkan.apk - - name: Upload android-ui-test + - name: Upload android-ui-test-vulkan uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: android-ui-test + name: android-ui-test-vulkan path: | - platform/android/InstrumentationTestApp.apk - platform/android/InstrumentationTests.apk + platform/android/InstrumentationTestAppVulkan.apk + platform/android/InstrumentationTestsVulkan.apk android-build-cpp-test: runs-on: ubuntu-24.04 diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index b5802e062e70..c28e590aab4e 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -49,10 +49,19 @@ jobs: testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/14862afb-cf88-44aa-9f1e-5131cbb22f01" }, { - artifactName: android-ui-test, - testFile: InstrumentationTests.apk, - appFile: InstrumentationTestApp.apk, - name: "Android Instrumentation Tests", + artifactName: android-ui-test-opengl, + testFile: InstrumentationTestsOpenGL.apk, + appFile: InstrumentationTestAppOpenGL.apk, + name: "Android Instrumentation Tests (OpenGL)", + # Google Pixel 7 Pro + devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564", + testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/09e0738e-c91e-4c5f-81e6-06a06cc340d8" + }, + { + artifactName: android-ui-test-vulkan, + testFile: InstrumentationTestsVulkan.apk, + appFile: InstrumentationTestAppVulkan.apk, + name: "Android Instrumentation Tests (Vulkan)", # Google Pixel 7 Pro devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564", testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/09e0738e-c91e-4c5f-81e6-06a06cc340d8" From 2e53cfdc662b0666953bedcd3503a6f19a41276e Mon Sep 17 00:00:00 2001 From: yousifd Date: Tue, 15 Jul 2025 12:34:40 +0300 Subject: [PATCH 264/339] Fix calling completion callback for setContentInset in specific situation (#3605) --- platform/ios/src/MLNMapView.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 4834869746e3..f533b6250337 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -6339,7 +6339,8 @@ - (void)didUpdateLocationWithUserTrackingAnimated:(BOOL)animated completionHandl CLLocation *location = self.userLocation.location; if ( ! _showsUserLocation || ! location || ! CLLocationCoordinate2DIsValid(location.coordinate) - || self.userTrackingMode == MLNUserTrackingModeNone) + || self.userTrackingMode == MLNUserTrackingModeNone + || self.userTrackingState == MLNUserTrackingStateBegan) { if (completion) { From aeb1283614eb05bdd14d26509e5a1324e05a0228 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 15 Jul 2025 12:57:28 +0200 Subject: [PATCH 265/339] Use sccache in linux-ci (#3616) --- .github/workflows/linux-ci.yml | 47 ++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 8a6e9ea48bff..11b30c08104b 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -66,10 +66,6 @@ jobs: with: languages: cpp - - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }} - - name: Get latest CMake and Ninja uses: lukka/get-cmake@latest with: @@ -91,16 +87,49 @@ jobs: - if: matrix.renderer == 'vulkan' run: echo renderer_flag_cmake="-DMLN_WITH_VULKAN=ON -DMLN_WITH_OPENGL=OFF" >> "$GITHUB_ENV" + - name: Install sccache + run: | + curl -LO https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz + tar -xzf sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz + sudo mv sccache-v0.10.0-x86_64-unknown-linux-musl/sccache /usr/bin/sccache + sudo chmod +x /usr/bin/sccache + rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl + + - name: Configure AWS Credentials + if: vars.OIDC_AWS_ROLE_TO_ASSUME + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: us-west-2 + role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} + role-session-name: ${{ github.run_id }} + - name: Build MapLibre Native Core env: CI: 1 run: | cmake --version - cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMLN_WITH_COVERAGE=ON ${{ env.renderer_flag_cmake }} + + # sccache configuration + export SCCACHE_BUCKET=maplibre-native-sccache + export SCCACHE_REGION=eu-central-1 + + if [ -z "${AWS_SECRET_ACCESS_KEY}" ]; then + echo "AWS_SECRET_ACCESS_KEY not set; not uploading sccache cache to S3" + export SCCACHE_S3_NO_CREDENTIALS=1 + fi + + cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=sccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ + -DMLN_WITH_COVERAGE=ON \ + ${{ env.renderer_flag_cmake }} cmake --build build --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner # mbgl-render (used for size test) & mbgl-benchmark-runner + - name: Show sccache stats + run: sccache --show-stats + - name: Upload mbgl-render as artifact if: matrix.renderer == 'drawable' && github.event_name == 'pull_request' uses: actions/upload-artifact@v4 @@ -117,14 +146,6 @@ jobs: path: | build/mbgl-benchmark-runner - - name: Configure AWS Credentials - if: matrix.renderer == 'drawable' && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-region: us-west-2 - role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} - role-session-name: ${{ github.run_id }} - - name: Upload mbgl-render & mbgl-benchmark-runner to S3 if: matrix.renderer == 'drawable' && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME run: | From 3adf431b1961968dbc158e5696411b07c428c25a Mon Sep 17 00:00:00 2001 From: yousifd Date: Wed, 16 Jul 2025 12:08:07 +0300 Subject: [PATCH 266/339] add the ability to have ios camera animation durations dynamic during navigation (#3568) --- platform/ios/src/MLNMapView.h | 9 +++++++++ platform/ios/src/MLNMapView.mm | 31 +++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/platform/ios/src/MLNMapView.h b/platform/ios/src/MLNMapView.h index d380ee80e80f..1e800fafe188 100644 --- a/platform/ios/src/MLNMapView.h +++ b/platform/ios/src/MLNMapView.h @@ -550,6 +550,15 @@ MLN_EXPORT */ @property (nonatomic, assign) BOOL showsUserLocation; +/** + A boolean value indicating whether camera animation duration is set based + on the time difference between the last location update and the current one + or the default animation duration of 1 second. + + The default value of this property is `NO` + */ +@property (nonatomic, assign) BOOL dynamicNavigationCameraAnimationDuration; + /** A Boolean value indicating whether the map may request authorization to use location services. diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index f533b6250337..23313088fa14 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -951,6 +951,8 @@ - (void)commonInitWithOptions:(MLNMapOptions*)mlnMapoptions _targetCoordinate = kCLLocationCoordinate2DInvalid; _shouldRequestAuthorizationToUseLocationServices = YES; + + _dynamicNavigationCameraAnimationDuration = NO; } - (mbgl::Size)size @@ -6317,14 +6319,18 @@ - (void)locationManager:(__unused id)manager didUpdateLocati } } - [self didUpdateLocationWithUserTrackingAnimated:animated completionHandler:completion]; - - NSTimeInterval duration = MLNAnimationDuration; + NSTimeInterval userLocationDuration = MLNAnimationDuration; if (oldLocation && ! CGPointEqualToPoint(self.userLocationAnnotationView.center, CGPointZero)) { - duration = MIN([newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp], MLNUserLocationAnimationDuration); + userLocationDuration = MIN([newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp], MLNUserLocationAnimationDuration); + } + [self updateUserLocationAnnotationViewAnimatedWithDuration:userLocationDuration]; + + NSTimeInterval cameraDuration = MLNUserLocationAnimationDuration; + if (self.dynamicNavigationCameraAnimationDuration && oldLocation) { + cameraDuration = MIN([newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp], MLNUserLocationAnimationDuration); } - [self updateUserLocationAnnotationViewAnimatedWithDuration:duration]; + [self didUpdateLocationWithUserTrackingDuration:cameraDuration completionHandler:completion]; if (self.userTrackingMode == MLNUserTrackingModeNone && self.userLocationAnnotationView.accessibilityElementIsFocused && @@ -6335,6 +6341,11 @@ - (void)locationManager:(__unused id)manager didUpdateLocati } - (void)didUpdateLocationWithUserTrackingAnimated:(BOOL)animated completionHandler:(nullable void (^)(void))completion +{ + [self didUpdateLocationWithUserTrackingDuration:animated ? MLNUserLocationAnimationDuration : 0 completionHandler:completion]; +} + +- (void)didUpdateLocationWithUserTrackingDuration:(NSTimeInterval)duration completionHandler:(nullable void (^)(void))completion { CLLocation *location = self.userLocation.location; if ( ! _showsUserLocation || ! location @@ -6369,31 +6380,31 @@ - (void)didUpdateLocationWithUserTrackingAnimated:(BOOL)animated completionHandl if (self.userTrackingState != MLNUserTrackingStateBegan) { // Keep both the user and the destination in view. - [self didUpdateLocationWithTargetAnimated:animated completionHandler:completion]; + [self didUpdateLocationWithTargetAnimated:duration != 0 completionHandler:completion]; } } else if (self.userTrackingState == MLNUserTrackingStatePossible) { // The first location update is often a great distance away from the // current viewport, so fly there to provide additional context. - [self didUpdateLocationSignificantlyAnimated:animated completionHandler:completion]; + [self didUpdateLocationSignificantlyAnimated:duration != 0 completionHandler:completion]; } else if (self.userTrackingState == MLNUserTrackingStateChanged) { // Subsequent updates get a more subtle animation. - [self didUpdateLocationIncrementallyAnimated:animated completionHandler:completion]; + [self didUpdateLocationIncrementallyDuration:duration completionHandler:completion]; } [self unrotateIfNeededAnimated:YES]; } /// Changes the viewport based on an incremental location update. -- (void)didUpdateLocationIncrementallyAnimated:(BOOL)animated completionHandler:(nullable void (^)(void))completion +- (void)didUpdateLocationIncrementallyDuration:(NSTimeInterval)duration completionHandler:(nullable void (^)(void))completion { [self _setCenterCoordinate:self.userLocation.location.coordinate edgePadding:self.edgePaddingForFollowing zoomLevel:self.zoomLevel direction:self.directionByFollowingWithCourse - duration:animated ? MLNUserLocationAnimationDuration : 0 + duration:duration animationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear] completionHandler:completion]; } From a465aee324e42c7d25ac2485b6b5332df5dd68d0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 16 Jul 2025 13:37:40 +0200 Subject: [PATCH 267/339] Replace brittle inline script with Node.js script (#3619) --- .github/scripts/check-job-skipped.ts | 29 +++ .github/workflows/android-device-test.yml | 12 +- .github/workflows/typecheck-scripts.yml | 2 +- package-lock.json | 269 ++++++++++++++++++---- package.json | 1 + scripts/jsconfig.json => tsconfig.json | 8 +- 6 files changed, 267 insertions(+), 54 deletions(-) create mode 100644 .github/scripts/check-job-skipped.ts rename scripts/jsconfig.json => tsconfig.json (64%) diff --git a/.github/scripts/check-job-skipped.ts b/.github/scripts/check-job-skipped.ts new file mode 100644 index 000000000000..fe794bf95e2d --- /dev/null +++ b/.github/scripts/check-job-skipped.ts @@ -0,0 +1,29 @@ +import * as core from "@actions/core"; +import { Octokit } from "@octokit/rest"; + +async function run() { + const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); + + const run_id = process.env.TEST_RUN_ID; + if (!run_id) throw new Error("TEST_RUN_ID not set"); + + const { data } = await octokit.rest.actions.listJobsForWorkflowRun({ + owner: 'maplibre', + repo: 'maplibre-native', + run_id: parseInt(run_id) + }); + + const jobName = process.env.JOB_NAME; + if (!jobName) throw new Error("JOB_NAME not set"); + + const job = data.jobs.find(({name}) => name === jobName); + if (!job) throw new Error(`job with name ${jobName} not found in workflow run with id ${run_id}`); + + core.setOutput('was_skipped', job.conclusion === 'skipped'); +} + +try { + await run(); +} catch (err) { + core.setFailed(err instanceof Error ? err.message: `${err}`); +} diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index c28e590aab4e..54577617724d 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -84,11 +84,13 @@ jobs: with: node-version-file: '.nvmrc' - - id: parent_workflow - run: | - conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion') - was_skipped=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") - echo "was_skipped=$was_skipped" >> "$GITHUB_OUTPUT" + - name: Check if android-build was skipped + id: parent_workflow + run: node .github/scripts/check-job-skipped.ts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TEST_RUN_ID: ${{ github.event.workflow_run.jobs_url }} + JOB_NAME: android-build # get comment from PR diff --git a/.github/workflows/typecheck-scripts.yml b/.github/workflows/typecheck-scripts.yml index 9d0904bede88..e19cdd22ee00 100644 --- a/.github/workflows/typecheck-scripts.yml +++ b/.github/workflows/typecheck-scripts.yml @@ -13,4 +13,4 @@ jobs: - run: | npm install - npx tsc -p scripts/jsconfig.json + npx tsc -p tsconfig.json diff --git a/package-lock.json b/package-lock.json index aad56eeb7b83..3949b94ddb76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "5.4.0", "license": "BSD-2-Clause", "dependencies": { + "@actions/core": "^1.11.1", "@maplibre/maplibre-gl-style-spec": "^20.3.1", "minimatch": "^9.0.4", "npm-run-all": "^4.1.5", @@ -48,6 +49,41 @@ "xcode": "^3.0.1" } }, + "node_modules/@actions/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "license": "MIT", + "dependencies": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "license": "MIT", + "dependencies": { + "@actions/io": "^1.0.1" + } + }, + "node_modules/@actions/http-client": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", + "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", + "license": "MIT", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" + } + }, + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", + "license": "MIT" + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -1010,6 +1046,15 @@ "node": ">=6.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -1165,61 +1210,136 @@ } }, "node_modules/@octokit/auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.0.tgz", - "integrity": "sha512-JH+5PhVMjpbBuKlykiseCHa2uZdEd8Qm/N9Kpqncx4o/wkGF38gqVjIP2gZqfaP3nxFZPpg0FwGClKzBi6nS2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.1.tgz", - "integrity": "sha512-uVypPdnZV7YoEa69Ky2kTSw3neFLGT0PZ54OwUMDph7w6TmhF0ZnoVcvb/kYnjDHCFo2mfoeRDYifLKhLNasUg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz", + "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^3.0.2", + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.1", + "@octokit/request": "^10.0.2", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" + } + }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/core/node_modules/@octokit/request-error": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", + "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" } }, "node_modules/@octokit/endpoint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.0.tgz", - "integrity": "sha512-ogZ5uLMeGBZUzS32fNt9j+dNw3kkEn5CSw4CVkN1EvCNdFYWrQ5diQR6Hh52VrPR0oayIoYTqQFL/l8RqkV0qw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", + "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" } }, "node_modules/@octokit/graphql": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.0.tgz", - "integrity": "sha512-XDvj6GcUnQYgbCLXElt3vZDzNIPGvGiwxQO2XzsvfVUjebGh0E5eCD/1My9zUGSNKaGVZitVuO8LMziGmoFryg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", + "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^10.0.2", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" } }, "node_modules/@octokit/openapi-types": { @@ -1246,19 +1366,21 @@ } }, "node_modules/@octokit/request": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.0.1.tgz", - "integrity": "sha512-kL+cAcbSl3dctYLuJmLfx6Iku2MXXy0jszhaEIjQNaCp4zjHXrhVAHeuaRdNvJjW9qjl3u1MJ72+OuBP0YW/pg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", + "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^12.0.0", + "@octokit/endpoint": "^11.0.0", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/request-error": { @@ -1274,20 +1396,36 @@ } }, "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", "dev": true, + "license": "MIT", "peer": true }, + "node_modules/@octokit/request/node_modules/@octokit/request-error": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", + "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/openapi-types": "^25.1.0" } }, "node_modules/@octokit/rest": { @@ -2447,10 +2585,11 @@ } }, "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/big-integer": { @@ -3296,6 +3435,24 @@ "node >=0.6.0" ] }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5792,6 +5949,15 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5934,6 +6100,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -5957,10 +6135,11 @@ } }, "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/unpipe": { diff --git a/package.json b/package.json index f4c32fb1bc61..eff7631cc516 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "main": "index.js", "license": "BSD-2-Clause", "dependencies": { + "@actions/core": "^1.11.1", "@maplibre/maplibre-gl-style-spec": "^20.3.1", "minimatch": "^9.0.4", "npm-run-all": "^4.1.5", diff --git a/scripts/jsconfig.json b/tsconfig.json similarity index 64% rename from scripts/jsconfig.json rename to tsconfig.json index cb383ba3d345..fcbcfa6f6c3e 100644 --- a/scripts/jsconfig.json +++ b/tsconfig.json @@ -6,11 +6,13 @@ "module": "NodeNext", "skipLibCheck": true, "resolveJsonModule": true, - "maxNodeModuleJsDepth": 0 + "maxNodeModuleJsDepth": 0, + "noEmit": true }, "include": [ - "./**/*.mjs", - "**/*.d.ts" + ".github/scripts/**/*.ts", + "scripts/**/*.mjs", + "scripts/**/*.d.ts" ], "exclude": [ "node_modules" From 635c3727bbed092e7bb049ddd1506cbdbfe4fbe2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 16 Jul 2025 16:07:54 +0200 Subject: [PATCH 268/339] Write release notification comments to PRs (#3622) --- .github/scripts/notify-release-on-prs.ts | 155 ++++++++++++++++++++++ .github/workflows/android-device-test.yml | 2 + .github/workflows/android-release.yml | 13 ++ .github/workflows/ios-ci.yml | 17 ++- 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 .github/scripts/notify-release-on-prs.ts diff --git a/.github/scripts/notify-release-on-prs.ts b/.github/scripts/notify-release-on-prs.ts new file mode 100644 index 000000000000..991cd0fcc74e --- /dev/null +++ b/.github/scripts/notify-release-on-prs.ts @@ -0,0 +1,155 @@ +import { Octokit } from '@octokit/rest'; +import { parseArgs } from 'node:util'; +import * as core from "@actions/core"; + +const { values } = parseArgs({ + options: { + tag: { type: 'string', short: 't' } + }, + allowPositionals: false, + strict: true +}); + +function errMessage(err: unknown) { + return err instanceof Error ? err.message : `${err}`; +} + +const owner = 'maplibre'; +const repo = 'maplibre-native'; + +function extractPrNumbers(params: { + releaseBody: string; + owner: string; + repo: string; +}): Set { + const { releaseBody, owner, repo } = params; + const prs = new Set(); + + const esc = (s: string) => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'); + const urlRegex = new RegExp( + `https?:\\/\\/github\\.com\\/${esc(owner)}\\/${esc(repo)}\\/pull\\/(\\d+)`, + 'g' + ); + + for (const match of releaseBody.matchAll(urlRegex)) { + prs.add(Number(match[1])); + } + + return prs; +} + +async function createOrUpdateReleaseNotification({ + octokit, + prNumber, + tag, + owner, + repo +}: { + owner: string, + repo: string, + octokit: Octokit, + prNumber: number, + tag: string +}) { + + const m = tag.match(/^([A-Za-z0-9]+)-v(.+)$/i); + const platform = m?.[1]?.toLowerCase(); + const version = m?.[2] ?? ''; + + if (!platform || !version) { + throw new Error(`Failed to parse platform or version from ${tag}`); + } + + const MARKER = ``; + + function linkText() { + if (platform === 'ios') { + return `MapLibre iOS ${version}`; + } else if (platform === 'android') { + return `MapLibre Android ${version}`; + } + return tag; + } + + const { data: comments } = await octokit.issues.listComments({ + owner, + repo, + issue_number: prNumber + }); + + const existing = comments.find((({ body }) => body?.includes(MARKER))); + + const releaseUrl = `https://github.com/${owner}/${repo}/releases/tag/${tag}`; + releaseUrl + const body = ` +${MARKER} +🚀 This PR has been included in the [${linkText()}](${releaseUrl}) release. +`.trim(); + + if (existing) { + await octokit.issues.updateComment({ + owner, + repo, + comment_id: existing.id, + body + }); + console.log(`Updated comment on PR #${prNumber}`); + } else { + await octokit.issues.createComment({ + owner, + repo, + issue_number: prNumber, + body + }); + console.log(`Created comment on PR #${prNumber}`); + } +} + +try { + const { tag } = values; + + if (!tag) { + throw new Error("pass tag with --tag"); + } + + const token = process.env.GITHUB_TOKEN; + if (!token) { + throw new Error('GITHUB_TOKEN environment variable is required'); + } + + const octokit = new Octokit({ auth: token }); + + const release = await octokit.repos.getReleaseByTag({ owner, repo, tag }); + const releaseBody = release.data.body || ''; + + if (!releaseBody) { + throw new Error(`No release notes found for tag '${tag}'.`); + } + + const prs = extractPrNumbers({ + owner, + releaseBody, + repo + }); + + if (prs.size === 0) { + console.log(`No PR references found in release notes for tag '${tag}'.`); + process.exit(0); + } + + for (const prNumber of prs) { + try { + await createOrUpdateReleaseNotification({ + octokit, + owner, + prNumber, + repo, + tag + }); + } catch (err) { + console.error(`Failed to comment on PR #${prNumber}: ${errMessage(err)}`); + } + } +} catch (err) { + core.setFailed(errMessage(err)); +} diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 54577617724d..342156858341 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -84,6 +84,8 @@ jobs: with: node-version-file: '.nvmrc' + - run: npm install + - name: Check if android-build was skipped id: parent_workflow run: node .github/scripts/check-job-skipped.ts diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 9ed48c732edb..617ca0c63d1a 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -83,6 +83,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + - uses: actions/setup-java@v4 with: distribution: "temurin" @@ -151,3 +155,12 @@ jobs: SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} + + - run: npm install + working-directory: . + + - name: Write release notifications + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node .github/scripts/notify-release-on-prs.ts --tag ${{ needs.android-create-release.outputs.version_tag }} + working-directory: . diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index f30867325c0e..9fb1d863b282 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -29,6 +29,7 @@ on: permissions: id-token: write # needed for AWS contents: write # allow making a release + actions: write # for triggering ios-release-cocoapods.yml jobs: pre_job: @@ -244,6 +245,11 @@ jobs: (github.event_name == 'push' && steps.version-file-ios-changed.outputs.any_changed == 'true') run: echo make_release=true >> "$GITHUB_ENV" + - uses: actions/setup-node@v4 + if: env.make_release + with: + node-version-file: ".nvmrc" + - name: Build XCFramework if: env.make_release run: | @@ -348,12 +354,21 @@ jobs: "version":"${{ env.version }}", "download_url":"${{ fromJSON(steps.github_release.outputs.assets)[0].browser_download_url }}"}}' + - run: npm install + working-directory: . + - name: Release (CocoaPods) shell: bash -leo pipefail {0} # so pod is found if: env.make_release run: gh workflow run ios-release-cocoapods.yml --field version=${{ env.version }} env: - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Write release notifications + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node .github/scripts/notify-release-on-prs.ts --tag ios-v${{ env.version }} + working-directory: . ios-build-cmake: needs: pre_job From d350dc39e07540b041cbff7ca0872ba95db0f068 Mon Sep 17 00:00:00 2001 From: saleh-amazon Date: Wed, 16 Jul 2025 07:08:21 -0700 Subject: [PATCH 269/339] [addresses #2648] add Resource URL to HTTP response object in case of an error (#3427) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- platform/darwin/core/http_file_source.mm | 20 +++++++++++--------- test/storage/http_file_source.test.cpp | 14 ++++++++++---- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/platform/darwin/core/http_file_source.mm b/platform/darwin/core/http_file_source.mm index 62ced8e7d1f3..86d1820af75f 100644 --- a/platform/darwin/core/http_file_source.mm +++ b/platform/darwin/core/http_file_source.mm @@ -305,6 +305,8 @@ BOOL isValidMapboxEndpoint(NSURL *url) { Response response; using Error = Response::Error; + std::string stringResourceURL = " - Resource URL: " + resource.url; + if (error) { [MLNNativeNetworkManager.sharedManager errorLog:@"Requesting: %@ failed with error: %@", req.URL, error.debugDescription]; @@ -316,7 +318,8 @@ BOOL isValidMapboxEndpoint(NSURL *url) { switch ([error code]) { case NSURLErrorBadServerResponse: // 5xx errors response.error = std::make_unique( - Error::Reason::Server, [[error localizedDescription] UTF8String]); + Error::Reason::Server, std::string{ [[error localizedDescription] UTF8String]} + stringResourceURL); + break; case NSURLErrorNetworkConnectionLost: @@ -329,12 +332,12 @@ BOOL isValidMapboxEndpoint(NSURL *url) { case NSURLErrorDataNotAllowed: case NSURLErrorTimedOut: response.error = std::make_unique( - Error::Reason::Connection, [[error localizedDescription] UTF8String]); + Error::Reason::Connection, [[error localizedDescription] UTF8String] + stringResourceURL); break; default: response.error = std::make_unique( - Error::Reason::Other, [[error localizedDescription] UTF8String]); + Error::Reason::Other, [[error localizedDescription] UTF8String] + stringResourceURL); break; } } else if ([res isKindOfClass:[NSHTTPURLResponse class]]) { @@ -372,7 +375,7 @@ BOOL isValidMapboxEndpoint(NSURL *url) { response.notModified = true; } else if (responseCode == 404) { response.error = - std::make_unique(Error::Reason::NotFound, "HTTP status code 404"); + std::make_unique(Error::Reason::NotFound, "HTTP status code 404" + stringResourceURL); } else if (responseCode == 429) { // Get the standard header std::optional retryAfter; @@ -388,22 +391,22 @@ BOOL isValidMapboxEndpoint(NSURL *url) { xRateLimitReset = std::string([xReset UTF8String]); } - response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset)); + response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429" + stringResourceURL, http::parseRetryHeaders(retryAfter, xRateLimitReset)); } else if (responseCode >= 500 && responseCode < 600) { response.error = std::make_unique(Error::Reason::Server, std::string{ "HTTP status code " } + - std::to_string(responseCode)); + std::to_string(responseCode) + stringResourceURL); } else { response.error = std::make_unique(Error::Reason::Other, std::string{ "HTTP status code " } + - std::to_string(responseCode)); + std::to_string(responseCode) + stringResourceURL); } } else if ([url isFileURL]) { response.data = std::make_shared((const char *)[data bytes], [data length]); } else { // This should never happen. response.error = std::make_unique(Error::Reason::Other, - "Response class is not NSHTTPURLResponse"); + "Response class is not NSHTTPURLResponse" + stringResourceURL); } shared->notify(response); @@ -430,5 +433,4 @@ BOOL isValidMapboxEndpoint(NSURL *url) { ClientOptions HTTPFileSource::getClientOptions() { return impl->getClientOptions(); } - } diff --git a/test/storage/http_file_source.test.cpp b/test/storage/http_file_source.test.cpp index e17a9489a31e..652609df8632 100644 --- a/test/storage/http_file_source.test.cpp +++ b/test/storage/http_file_source.test.cpp @@ -62,10 +62,13 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP404)) { util::RunLoop loop; HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); - auto req = fs.request({Resource::Unknown, "http://127.0.0.1:3000/doesnotexist"}, [&](Response res) { + std::string stringResourceURL = "http://127.0.0.1:3000/doesnotexist"; + std::string resourceURLInterpolation = " - Resource URL: " + stringResourceURL; + + auto req = fs.request({Resource::Unknown, stringResourceURL}, [&](Response res) { ASSERT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::NotFound, res.error->reason); - EXPECT_EQ("HTTP status code 404", res.error->message); + EXPECT_EQ("HTTP status code 404" + resourceURLInterpolation, res.error->message + resourceURLInterpolation); EXPECT_FALSE(bool(res.data)); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(res.mustRevalidate); @@ -135,10 +138,13 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP500)) { util::RunLoop loop; HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); - auto req = fs.request({Resource::Unknown, "http://127.0.0.1:3000/permanent-error"}, [&](Response res) { + std::string stringResourceURL = "http://127.0.0.1:3000/permanent-error"; + std::string resourceURLInterpolation = " - Resource URL: " + stringResourceURL; + + auto req = fs.request({Resource::Unknown, stringResourceURL}, [&](Response res) { ASSERT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::Server, res.error->reason); - EXPECT_EQ("HTTP status code 500", res.error->message); + EXPECT_EQ("HTTP status code 500" + resourceURLInterpolation, res.error->message + resourceURLInterpolation); EXPECT_FALSE(bool(res.data)); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(res.mustRevalidate); From 52c17780cbb837df18213eb027b2cdcc71dff7c2 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 16 Jul 2025 19:22:57 +0200 Subject: [PATCH 270/339] Fix TEST_RUN_ID in android-device-test.yml (#3625) --- .github/workflows/android-device-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 342156858341..f22e96626e72 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -91,7 +91,7 @@ jobs: run: node .github/scripts/check-job-skipped.ts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TEST_RUN_ID: ${{ github.event.workflow_run.jobs_url }} + TEST_RUN_ID: ${{ github.event.workflow_run.id }} JOB_NAME: android-build # get comment from PR From d98381f943986cbe97f12184b63ad26ed13b3e24 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 17 Jul 2025 11:52:55 +0200 Subject: [PATCH 271/339] Use matrix in android-build for opengl/vulkan builds (#3623) --- .github/scripts/notify-release-on-prs.ts | 7 +++ .github/workflows/android-ci.yml | 74 ++++++++++-------------- platform/android/Makefile | 4 +- 3 files changed, 41 insertions(+), 44 deletions(-) diff --git a/.github/scripts/notify-release-on-prs.ts b/.github/scripts/notify-release-on-prs.ts index 991cd0fcc74e..2ef4032731b3 100644 --- a/.github/scripts/notify-release-on-prs.ts +++ b/.github/scripts/notify-release-on-prs.ts @@ -1,3 +1,10 @@ +/** + * This script should be run as node notify-release-on-prs.ts --tag . + * It will post a comment on each of the PRs included in the changelog of the specified release. + * The script can be ran multiple times for the same release_tag, it will not post a + * new comment but instead update the existing comment. + */ + import { Octokit } from '@octokit/rest'; import { parseArgs } from 'node:util'; import * as core from "@actions/core"; diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index f0168d025f38..c158711d4d78 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -39,6 +39,10 @@ jobs: needs: - pre_job if: needs.pre_job.outputs.should_skip != 'true' + strategy: + fail-fast: false + matrix: + renderer: [opengl, vulkan] defaults: run: working-directory: platform/android @@ -81,18 +85,6 @@ jobs: cmakeVersion: 3.24.1 ninjaVersion: latest - - name: Cache node modules - uses: actions/cache@v4 - env: - cache-name: cache-node-modules - with: - path: ~/.npm - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- - - uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" @@ -141,18 +133,21 @@ jobs: - ${{ env.cache-name }} - name: Check code style + if: matrix.renderer == 'opengl' run: make android-check - name: Run Android unit tests - run: make run-android-unit-test + run: RENDERER=${{ matrix.renderer }} make run-android-unit-test - name: Build libmaplibre.so for arm-v8 - run: make android-lib-arm-v8 + run: RENDERER=${{ matrix.renderer }} make android-lib-arm-v8 - name: Build API documentation + if: matrix.renderer == 'opengl' run: ./gradlew dokkaGenerate - name: Build Examples documentation + if: matrix.renderer == 'opengl' run: make mkdocs-build - name: Copy developer config with API key for UI tests @@ -167,57 +162,52 @@ jobs: - name: Build Benchmark, copy to platform/android run: | - ./gradlew assembleOpenglRelease assembleOpenglReleaseAndroidTest -PtestBuildType=release - cp MapLibreAndroidTestApp/build/outputs/apk/opengl/release/MapLibreAndroidTestApp-opengl-release.apk . - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/release/MapLibreAndroidTestApp-opengl-release-androidTest.apk . + ./gradlew assemble${{ matrix.renderer }}Release assemble${{ matrix.renderer }}ReleaseAndroidTest -PtestBuildType=release + cp MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release.apk . + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release-androidTest.apk . # https://developer.android.com/guide/practices/page-sizes - name: Check alignment of .apk run: | - unzip -o MapLibreAndroidTestApp/build/outputs/apk/opengl/release/MapLibreAndroidTestApp-opengl-release.apk -d /tmp/my_apk_out + unzip -o MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release.apk -d /tmp/my_apk_out scripts/check-alignment.sh /tmp/my_apk_out - name: Create artifact for benchmark APKs + if: matrix.renderer == 'opengl' uses: actions/upload-artifact@v4 with: if-no-files-found: error name: benchmarkAPKs path: | - platform/android/MapLibreAndroidTestApp-opengl-release.apk - platform/android/MapLibreAndroidTestApp-opengl-release-androidTest.apk + platform/android/MapLibreAndroidTestApp-${{ matrix.renderer }}-release.apk + platform/android/MapLibreAndroidTestApp-${{ matrix.renderer }}-release-androidTest.apk - - if: github.event_name == 'pull_request' + - if: github.event_name == 'pull_request' && matrix.renderer == 'opengl' uses: ./.github/actions/save-pr-number - - name: Build Instrumentation Tests (OpenGL), copy to platform/android + - name: Set renderer env var (OpenGL or Vulkan) + shell: bash run: | - ./gradlew assembleOpenglDebug assembleOpenglDebugAndroidTest -PtestBuildType=debug - cp MapLibreAndroidTestApp/build/outputs/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk InstrumentationTestAppOpenGL.apk - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/opengl/debug/MapLibreAndroidTestApp-opengl-debug-androidTest.apk InstrumentationTestsOpenGL.apk - - - name: Upload android-ui-test-opengl - uses: actions/upload-artifact@v4 - with: - if-no-files-found: error - name: android-ui-test-opengl - path: | - platform/android/InstrumentationTestAppOpenGL.apk - platform/android/InstrumentationTestsOpenGL.apk + case "${{ matrix.renderer }}" in + opengl) echo "renderer=OpenGL" >> "$GITHUB_ENV" ;; + vulkan) echo "renderer=Vulkan" >> "$GITHUB_ENV" ;; + *) echo "::error ::Unknown renderer '${{ matrix.renderer }}'"; exit 1 ;; + esac - - name: Build Instrumentation Tests, copy to platform/android + - name: Build Instrumentation Tests (${{ matrix.renderer }}), copy to platform/android run: | - ./gradlew assembleVulkanDebug assembleVulkanDebugAndroidTest -PtestBuildType=debug - cp MapLibreAndroidTestApp/build/outputs/apk/vulkan/debug/MapLibreAndroidTestApp-vulkan-debug.apk InstrumentationTestAppVulkan.apk - cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/vulkan/debug/MapLibreAndroidTestApp-vulkan-debug-androidTest.apk InstrumentationTestsVulkan.apk + ./gradlew assemble${{ matrix.renderer }}Debug assemble${{ matrix.renderer }}DebugAndroidTest -PtestBuildType=debug + cp MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/debug/MapLibreAndroidTestApp-${{ matrix.renderer }}-debug.apk InstrumentationTestApp${{ env.renderer }}.apk + cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/${{ matrix.renderer }}/debug/MapLibreAndroidTestApp-${{ matrix.renderer }}-debug-androidTest.apk InstrumentationTests${{ env.renderer }}.apk - - name: Upload android-ui-test-vulkan + - name: Upload android-ui-test-${{ matrix.renderer }} uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: android-ui-test-vulkan + name: android-ui-test-${{ matrix.renderer }} path: | - platform/android/InstrumentationTestAppVulkan.apk - platform/android/InstrumentationTestsVulkan.apk + platform/android/InstrumentationTestApp${{ env.renderer }}.apk + platform/android/InstrumentationTests${{ env.renderer }}.apk android-build-cpp-test: runs-on: ubuntu-24.04 diff --git a/platform/android/Makefile b/platform/android/Makefile index 75037686878b..ac4e8fdd7604 100644 --- a/platform/android/Makefile +++ b/platform/android/Makefile @@ -218,9 +218,9 @@ run-android-ui-test-%: run-android-ui-test-arm-v7-% # Run Java Unit tests on the JVM of the development machine executing this .PHONY: run-android-unit-test run-android-unit-test: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testOpenglDebugUnitTest --info + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:test$(RENDERER)DebugUnitTest --info run-android-unit-test-%: - $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:testOpenglDebugUnitTest --info --tests "$*" + $(MLN_ANDROID_GRADLE) -Pmaplibre.abis=none :MapLibreAndroid:test$(RENDERER)DebugUnitTest --info --tests "$*" DEBUG_TAR_FILE_NAME := $(if $(findstring opengl,$(RENDERER)),debug-symbols-opengl-$(MLN_ANDROID_APK_SUFFIX).tar.gz,debug-symbols-$(RENDERER)-$(MLN_ANDROID_APK_SUFFIX).tar.gz) From 58d028b6435f68fe121be80235188fb65bd054d5 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 17 Jul 2025 11:55:55 +0200 Subject: [PATCH 272/339] fix check-job-skipped.ts (#3626) --- .github/scripts/check-job-skipped.ts | 2 +- .github/workflows/ios-ci.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/check-job-skipped.ts b/.github/scripts/check-job-skipped.ts index fe794bf95e2d..af8ce27b5526 100644 --- a/.github/scripts/check-job-skipped.ts +++ b/.github/scripts/check-job-skipped.ts @@ -16,7 +16,7 @@ async function run() { const jobName = process.env.JOB_NAME; if (!jobName) throw new Error("JOB_NAME not set"); - const job = data.jobs.find(({name}) => name === jobName); + const job = data.jobs.find(({name}) => name.startsWith(jobName)); if (!job) throw new Error(`job with name ${jobName} not found in workflow run with id ${run_id}`); core.setOutput('was_skipped', job.conclusion === 'skipped'); diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 9fb1d863b282..8dfd06c739a9 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -365,6 +365,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Write release notifications + if: env.make_release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: node .github/scripts/notify-release-on-prs.ts --tag ios-v${{ env.version }} From ecab4a390e0310a775b7de2b2b1a5a9230fd0773 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:21:07 +0200 Subject: [PATCH 273/339] Update bazel (#3468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index cc6c0090ca4d..7aa743a89fbc 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,15 +1,15 @@ module(name = "maplibre") -bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "bazel_skylib", version = "1.8.1") bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "rules_apple", version = "3.20.1") -bazel_dep(name = "rules_swift", version = "2.7.0") -bazel_dep(name = "rules_xcodeproj", version = "2.11.1") -bazel_dep(name = "aspect_rules_js", version = "2.3.3") -bazel_dep(name = "rules_nodejs", version = "6.3.4") +bazel_dep(name = "rules_apple", version = "3.22.0") +bazel_dep(name = "rules_swift", version = "2.9.0") +bazel_dep(name = "rules_xcodeproj", version = "2.12.1") +bazel_dep(name = "aspect_rules_js", version = "2.4.0") +bazel_dep(name = "rules_nodejs", version = "6.4.0") bazel_dep(name = "libuv", version = "1.48.0") -bazel_dep(name = "apple_support", version = "1.21.1", repo_name = "build_bazel_apple_support") -bazel_dep(name = "rules_cc", version = "0.1.1") +bazel_dep(name = "apple_support", version = "1.22.1", repo_name = "build_bazel_apple_support") +bazel_dep(name = "rules_cc", version = "0.1.3") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) node.toolchain(node_version = "20.14.0") @@ -70,7 +70,7 @@ darwin_config( name = "darwin_config", ) -bazel_dep(name = "rules_rust", version = "0.59.2") +bazel_dep(name = "rules_rust", version = "0.62.0") bazel_dep(name = "cxx.rs", version = "1.0.157") # The registry is not always up to date # See https://registry.bazel.build/modules/cxx.rs From c5928ed9b605dd243b7cc79a7e6be6657ad07048 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 17 Jul 2025 17:47:48 +0200 Subject: [PATCH 274/339] Set cmake_minimum_required to 3.10 in maplibre-native-base (#3630) --- vendor/maplibre-native-base/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/maplibre-native-base/CMakeLists.txt b/vendor/maplibre-native-base/CMakeLists.txt index 9e58377d0f7a..431ac97924a5 100644 --- a/vendor/maplibre-native-base/CMakeLists.txt +++ b/vendor/maplibre-native-base/CMakeLists.txt @@ -2,7 +2,7 @@ if(TARGET maplibre-native-base) return() endif() -cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR) +cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project(MAPBOX_BASE LANGUAGES CXX C) option(MAPBOX_BASE_BUILD_TESTING "Bypass project target check and enforce building tests" OFF) From 40abf2b9054b05a612d9a0cc8b097893576568a2 Mon Sep 17 00:00:00 2001 From: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:23:26 +0200 Subject: [PATCH 275/339] Update glslang to 15.4.0 (tag) (#3634) --- vendor/glslang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/glslang b/vendor/glslang index a92c61f8456f..8a85691a0740 160000 --- a/vendor/glslang +++ b/vendor/glslang @@ -1 +1 @@ -Subproject commit a92c61f8456fa9731c0b000a2c6fc52a740c2be7 +Subproject commit 8a85691a0740d390761a1008b4696f57facd02c4 From d3ea080e0608d0533618522576454b85db2a95b7 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 17 Jul 2025 23:29:48 +0200 Subject: [PATCH 276/339] Revert #2648 (#3631) --- platform/darwin/core/http_file_source.mm | 20 +++++++++----------- test/storage/http_file_source.test.cpp | 14 ++++---------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/platform/darwin/core/http_file_source.mm b/platform/darwin/core/http_file_source.mm index 86d1820af75f..62ced8e7d1f3 100644 --- a/platform/darwin/core/http_file_source.mm +++ b/platform/darwin/core/http_file_source.mm @@ -305,8 +305,6 @@ BOOL isValidMapboxEndpoint(NSURL *url) { Response response; using Error = Response::Error; - std::string stringResourceURL = " - Resource URL: " + resource.url; - if (error) { [MLNNativeNetworkManager.sharedManager errorLog:@"Requesting: %@ failed with error: %@", req.URL, error.debugDescription]; @@ -318,8 +316,7 @@ BOOL isValidMapboxEndpoint(NSURL *url) { switch ([error code]) { case NSURLErrorBadServerResponse: // 5xx errors response.error = std::make_unique( - Error::Reason::Server, std::string{ [[error localizedDescription] UTF8String]} + stringResourceURL); - + Error::Reason::Server, [[error localizedDescription] UTF8String]); break; case NSURLErrorNetworkConnectionLost: @@ -332,12 +329,12 @@ BOOL isValidMapboxEndpoint(NSURL *url) { case NSURLErrorDataNotAllowed: case NSURLErrorTimedOut: response.error = std::make_unique( - Error::Reason::Connection, [[error localizedDescription] UTF8String] + stringResourceURL); + Error::Reason::Connection, [[error localizedDescription] UTF8String]); break; default: response.error = std::make_unique( - Error::Reason::Other, [[error localizedDescription] UTF8String] + stringResourceURL); + Error::Reason::Other, [[error localizedDescription] UTF8String]); break; } } else if ([res isKindOfClass:[NSHTTPURLResponse class]]) { @@ -375,7 +372,7 @@ BOOL isValidMapboxEndpoint(NSURL *url) { response.notModified = true; } else if (responseCode == 404) { response.error = - std::make_unique(Error::Reason::NotFound, "HTTP status code 404" + stringResourceURL); + std::make_unique(Error::Reason::NotFound, "HTTP status code 404"); } else if (responseCode == 429) { // Get the standard header std::optional retryAfter; @@ -391,22 +388,22 @@ BOOL isValidMapboxEndpoint(NSURL *url) { xRateLimitReset = std::string([xReset UTF8String]); } - response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429" + stringResourceURL, http::parseRetryHeaders(retryAfter, xRateLimitReset)); + response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset)); } else if (responseCode >= 500 && responseCode < 600) { response.error = std::make_unique(Error::Reason::Server, std::string{ "HTTP status code " } + - std::to_string(responseCode) + stringResourceURL); + std::to_string(responseCode)); } else { response.error = std::make_unique(Error::Reason::Other, std::string{ "HTTP status code " } + - std::to_string(responseCode) + stringResourceURL); + std::to_string(responseCode)); } } else if ([url isFileURL]) { response.data = std::make_shared((const char *)[data bytes], [data length]); } else { // This should never happen. response.error = std::make_unique(Error::Reason::Other, - "Response class is not NSHTTPURLResponse" + stringResourceURL); + "Response class is not NSHTTPURLResponse"); } shared->notify(response); @@ -433,4 +430,5 @@ BOOL isValidMapboxEndpoint(NSURL *url) { ClientOptions HTTPFileSource::getClientOptions() { return impl->getClientOptions(); } + } diff --git a/test/storage/http_file_source.test.cpp b/test/storage/http_file_source.test.cpp index 652609df8632..e17a9489a31e 100644 --- a/test/storage/http_file_source.test.cpp +++ b/test/storage/http_file_source.test.cpp @@ -62,13 +62,10 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP404)) { util::RunLoop loop; HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); - std::string stringResourceURL = "http://127.0.0.1:3000/doesnotexist"; - std::string resourceURLInterpolation = " - Resource URL: " + stringResourceURL; - - auto req = fs.request({Resource::Unknown, stringResourceURL}, [&](Response res) { + auto req = fs.request({Resource::Unknown, "http://127.0.0.1:3000/doesnotexist"}, [&](Response res) { ASSERT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::NotFound, res.error->reason); - EXPECT_EQ("HTTP status code 404" + resourceURLInterpolation, res.error->message + resourceURLInterpolation); + EXPECT_EQ("HTTP status code 404", res.error->message); EXPECT_FALSE(bool(res.data)); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(res.mustRevalidate); @@ -138,13 +135,10 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP500)) { util::RunLoop loop; HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); - std::string stringResourceURL = "http://127.0.0.1:3000/permanent-error"; - std::string resourceURLInterpolation = " - Resource URL: " + stringResourceURL; - - auto req = fs.request({Resource::Unknown, stringResourceURL}, [&](Response res) { + auto req = fs.request({Resource::Unknown, "http://127.0.0.1:3000/permanent-error"}, [&](Response res) { ASSERT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::Server, res.error->reason); - EXPECT_EQ("HTTP status code 500" + resourceURLInterpolation, res.error->message + resourceURLInterpolation); + EXPECT_EQ("HTTP status code 500", res.error->message); EXPECT_FALSE(bool(res.data)); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(res.mustRevalidate); From b12008aa7b1d4d5df8cea4d928732b1a9b7700d2 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Sun, 20 Jul 2025 08:07:50 -0300 Subject: [PATCH 277/339] Support for MSYS2 builds (#3621) --- .github/workflows/windows-ci.yml | 147 +++++++++++++- CMakeLists.txt | 2 +- docs/mdbook/src/SUMMARY.md | 3 + docs/mdbook/src/platforms/windows/README.md | 7 + .../src/platforms/windows/build-msvc.md | 156 +++++++++++++++ .../src/platforms/windows/build-msys2.md | 160 ++++++++++++++++ .../sample-barebones-mbgl-render-out.png | Bin 0 -> 40163 bytes .../sample-maplibre-style-mbgl-render-out.png | Bin 0 -> 102685 bytes platform/node/CMakeLists.txt | 4 + platform/windows/src/gl_functions.cpp | 2 - platform/windows/src/headless_backend_wgl.cpp | 2 - platform/windows/src/thread.cpp | 6 +- platform/windows/src/thread_local.cpp | 2 - platform/windows/windows.cmake | 180 +++++++++++++----- render-test/runner.cpp | 7 + src/mbgl/util/chrono.cpp | 6 +- src/mbgl/util/io.cpp | 2 +- test/storage/local_file_source.test.cpp | 4 +- test/style/style_parser.test.cpp | 6 +- vendor/benchmark.cmake | 3 +- 20 files changed, 633 insertions(+), 66 deletions(-) create mode 100644 docs/mdbook/src/platforms/windows/README.md create mode 100644 docs/mdbook/src/platforms/windows/build-msvc.md create mode 100644 docs/mdbook/src/platforms/windows/build-msys2.md create mode 100644 docs/mdbook/src/platforms/windows/images/sample-barebones-mbgl-render-out.png create mode 100644 docs/mdbook/src/platforms/windows/images/sample-maplibre-style-mbgl-render-out.png diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index bb9282b6eee5..421a130d5a59 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -105,7 +105,7 @@ jobs: key: vcpkg-${{ env.VCPKG_COMMIT_ID }} - windows-build-and-test: + windows-build-and-test-msvc: needs: windows-get-or-build-dependencies strategy: matrix: @@ -238,14 +238,155 @@ jobs: - name: Run expression test run: build-windows-${{ matrix.renderer }}/expression-test/mbgl-expression-test.exe + windows-build-and-test-msys2: + if: needs.pre-job.outputs.should_skip != 'true' + needs: pre-job + strategy: + matrix: + msystem: [clang64, mingw64, ucrt64] + renderer: [opengl, egl, vulkan] + runs-on: windows-2022 + steps: + - run: | + git config --system core.longpaths true + git config --system core.autocrlf input + + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + update: true + pacboy: >- + toolchain:p + clang:p + cmake:p + angleproject:p + curl-winssl:p + dlfcn:p + glfw:p + icu:p + libjpeg-turbo:p + libpng:p + libwebp:p + libuv:p + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: cpp + + - uses: mozilla-actions/sccache-action@v0.0.9 + + - name: Initialize sccache + run: | + & $env:SCCACHE_PATH --start-server + & $env:SCCACHE_PATH --zero-stats + + - name: Configure MapLibre Native Core + env: + CI: 1 + CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" + CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" + shell: msys2 {0} + run: | + cmake --version + cmake --preset windows-${{ matrix.renderer }} -DCMAKE_POLICY_DEFAULT_CMP0141=NEW -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + + - name: Build MapLibre Native Core + shell: msys2 {0} + run: | + cmake --build build-windows-${{ matrix.renderer }} --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner + + # CodeQL + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:cpp" + + - name: Download Mesa3D + run: | + (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-release-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } + + - name: Extract Mesa3D files for OpenGL + if: matrix.renderer != 'vulkan' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} .\mesa3d.7z x64\libgallium_wgl.dll x64\libGLESv2.dll + + - name: Extract Mesa3D files for Vulkan + if: matrix.renderer == 'vulkan' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll + + # unit tests + + - name: Configure Mesa3D drivers (OpenGL) + if: matrix.renderer != 'vulkan' + run: | + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v DLL /t REG_SZ /d ('{0}\build-windows-${{ matrix.renderer }}\libgallium_wgl.dll' -f $PWD.Path) /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v DriverVersion /t REG_DWORD /d 1 /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v Flags /t REG_DWORD /d 1 /f + reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL' /v Version /t REG_DWORD /d 2 /f + Add-Content -Path $env:GITHUB_ENV -Value 'GALLIUM_DRIVER=llvmpipe' + + - name: Configure Mesa3D drivers (Vulkan) + if: matrix.renderer == 'vulkan' + run: | + reg add 'HKLM\Software\Khronos\Vulkan\Drivers' /f /v '${{ github.workspace }}\build-windows-${{ matrix.renderer }}\lvp_icd.x86_64.json' /t REG_DWORD /d 0 + + - name: Download and configure Vulkan + if: matrix.renderer == 'vulkan' + run: | + # 1.4.313.1 doesn't have runtime components? + # $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows + $version = '1.4.313.0' + Invoke-WebRequest https://sdk.lunarg.com/sdk/download/$version/windows/VulkanRT-X64-$version-Components.zip -OutFile VulkanRT.zip + & 'C:\Program Files\7-Zip\7z.exe' e -obuild-windows-${{ matrix.renderer }} -r .\VulkanRT.zip *x64\vulkan-1.* + + - name: Run C++ tests + continue-on-error: ${{ matrix.renderer == 'vulkan' }} + env: + ANGLE_DEFAULT_PLATFORM: 'gl' + GALLIUM_DRIVER: llvmpipe + LIBGL_ALWAYS_SOFTWARE: true + run: build-windows-${{ matrix.renderer }}/mbgl-test-runner.exe + + # render tests + + - name: Run render test + id: render_test + env: + manifest_file: ${{ matrix.renderer }} + ANGLE_DEFAULT_PLATFORM: 'gl' + GALLIUM_DRIVER: llvmpipe + LIBGL_ALWAYS_SOFTWARE: true + run: build-windows-${{ matrix.renderer }}/mbgl-render-test-runner.exe "--manifestPath=metrics/windows-${env:manifest_file}.json" + + - name: Upload render test result + if: always() && steps.render_test.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + name: render-test-result-${{ matrix.renderer }} + path: | + metrics/windows-${{ matrix.renderer }}.html + + # expression tests + + - name: Run expression test + run: build-windows-${{ matrix.renderer }}/expression-test/mbgl-expression-test.exe + windows-ci-result: name: Windows CI Result if: needs.pre-job.outputs.should_skip != 'true' && always() runs-on: windows-2022 needs: - pre-job - - windows-build-and-test + - windows-build-and-test-msvc + - windows-build-and-test-msys2 steps: - name: Mark result as failed - if: needs.windows-build-and-test.result != 'success' + if: needs.windows-build-and-test-msvc.result != 'success' || needs.windows-build-and-test-msys2.result != 'success' run: exit 1 diff --git a/CMakeLists.txt b/CMakeLists.txt index eafae983ad03..6f24a62dc5d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ if (MLN_WITH_QT AND NOT CMAKE_OSX_DEPLOYMENT_TARGET) set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0) endif() -if(WIN32 AND NOT MLN_WITH_QT AND NOT CMAKE_SYSTEM_NAME STREQUAL Android) +if(WIN32 AND NOT DEFINED ENV{MSYSTEM} AND NOT MLN_WITH_QT AND NOT CMAKE_SYSTEM_NAME STREQUAL Android) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/platform/windows/custom-toolchain.cmake) endif() diff --git a/docs/mdbook/src/SUMMARY.md b/docs/mdbook/src/SUMMARY.md index 2cd413ae8cc2..4aeb0e96a6c5 100644 --- a/docs/mdbook/src/SUMMARY.md +++ b/docs/mdbook/src/SUMMARY.md @@ -16,6 +16,9 @@ - [macOS](./platforms/macos/README.md) - [Linux](./platforms/linux/README.md) - [Using Docker](./platforms/linux/using-docker.md) + - [Windows](./platforms/windows/README.md) + - [Building with Microsoft Visual Studio](./platforms/windows/build-msvc.md) + - [Building with MSYS2](./platforms/windows/build-msys2.md) - [Release Policy](./release-policy.md) diff --git a/docs/mdbook/src/platforms/windows/README.md b/docs/mdbook/src/platforms/windows/README.md new file mode 100644 index 000000000000..f9df15033913 --- /dev/null +++ b/docs/mdbook/src/platforms/windows/README.md @@ -0,0 +1,7 @@ +# Windows + +This is a port to add Windows support on other targets (Node, GLFW, etc). + +The files produced by building mbgl-core target can be reused as libraries in other projects. + +Building with [Microsoft Visual Studio](./build-msvc.md) and [MSYS2](./build-msys2.md) are supported. diff --git a/docs/mdbook/src/platforms/windows/build-msvc.md b/docs/mdbook/src/platforms/windows/build-msvc.md new file mode 100644 index 000000000000..de4cfa58037d --- /dev/null +++ b/docs/mdbook/src/platforms/windows/build-msvc.md @@ -0,0 +1,156 @@ +# Building with Microsoft Visual Studio + +## Prerequisites + +The build was tested with `Microsoft Visual Studio 2022`. Earlier versions are not guaranteed to work, but `Microsoft Visual Studio 2019` might work as well. + +To install the required Visual Studio components, open Visual Studio Installer and check `Desktop Development with C++` option. Make sure `C++ CMake tools for Windows` is selected in the right pane. If `git` is not already installed, select `Git for Windows` option in `Individual Components`. When Visual Studio finishes the install process, everything is ready to start. + +## Downloading sources + +Open `x64 Native Tools Command Prompt for VS 2022` and then clone the repository: + +```cmd +git clone --config core.longpaths=true --depth 1 --recurse-submodules -j8 https://github.com/maplibre/maplibre-native.git +cd maplibre-native +``` + +> [!NOTE] +> The `core.longpaths=true` config is necessary, because without it a lot of `Filename too long` messages will come. If you have this configuration set globally (`git config --system core.longpaths=true`), you can omit the `--config core.longpaths=true` portion of the clone command. + +## Configuring + +Configure the build with the following command, replacing `` with `opengl`, `egl` or `vulkan`, which are the rendering engines you can use. If you don't know which one to choose, just use `opengl`: + +```cmd +cmake --preset windows- +``` + +It will take some time to build and install all components on which Maplibre depends. + +## Building + +Finally, build the project with the following command, again replacing `` with the value you choose in the configure step: + +```cmd +cmake --build build-windows- +``` + +## Building with Microsoft Visual Studio + +Just add the `-G "Microsoft Visual Studio 17 2022"` (or the corresponding Visual Studio version you have) option from the configure command: + +```cmd +cmake --preset windows- -G "Microsoft Windows 2022" +``` + +Once configure is done, open the file `build-windows-\Mapbox GL Native.sln`. Build the target `ALL_BUILD` to build all targets, or pick a specific target. Don't forget to pick a build configuration (`Release`, `RelWithDebInfo`, `MinSizeRel` or `Debug`), otherwise the project will be built with default configuration (`Debug`). + +## Testing + +If all went well and target `mbgl-render` or `ALL_BUILD` was chosen, there should now be a `build-windows-\bin\mbgl-render.exe` binary that you can run to generate map tile images. To test that it is working properly, run the following command. + +```cmd +.\build-windows-\bin\mbgl-render.exe --style https://raw.githubusercontent.com/maplibre/demotiles/gh-pages/style.json --output out.png +``` + +This should produce an `out.png` map tile image with the default MapLibre styling from [the MapLibre demo](https://maplibre.org/maplibre-gl-js/docs/examples/display-a-map/). + +![Sample image of world from mbgl-render command](images/sample-maplibre-style-mbgl-render-out.png) + +### Using your own style/tiles + +You can also use the `mbgl-render` command to render images from your own style or tile set. To do so, you will need a data source and a style JSON file. + +For the purposes of this exercise, you can use the `zurich_switzerland.mbtiles` from [here](https://github.com/acalcutt/tileserver-gl/releases/download/test_data/zurich_switzerland.mbtiles), and the following `style.json` file. + +```json +{ + "version": 8, + "name": "Test style", + "center": [ + 8.54806714892635, + 47.37180823552663 + ], + "sources": { + "test": { + "type": "vector", + "url": "mbtiles:///path/to/zurich_switzerland.mbtiles" + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "hsl(47, 26%, 88%)" + } + }, + { + "id": "water", + "type": "fill", + "source": "test", + "source-layer": "water", + "filter": [ + "==", + "$type", + "Polygon" + ], + "paint": { + "fill-color": "hsl(205, 56%, 73%)" + } + }, + { + "id": "admin_country", + "type": "line", + "source": "test", + "source-layer": "boundary", + "filter": [ + "all", + [ + "<=", + "admin_level", + 2 + ], + [ + "==", + "$type", + "LineString" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsla(0, 8%, 22%, 0.51)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 3, + 0.5 + ], + [ + 22, + 15 + ] + ] + } + } + } + ] +} +``` + +Note that this style is totally inadequate for any real use beyond testing your custom setup. Don't forget to replace the source URL `"mbtiles:///path/to/zurich_switzerland.mbtiles"` with the actual path to your mbtiles file. + +From your `maplibre-native` dir, run the following command. + +```cmd +.\build-windows-\bin\mbgl-render.exe --style path\to\style.json --output out.png +``` + +This should produce an `out.png` image in your current directory with a barebones image of the world. + +![Sample image of world from mbgl-render command](images/sample-barebones-mbgl-render-out.png) diff --git a/docs/mdbook/src/platforms/windows/build-msys2.md b/docs/mdbook/src/platforms/windows/build-msys2.md new file mode 100644 index 000000000000..3a559bd69e32 --- /dev/null +++ b/docs/mdbook/src/platforms/windows/build-msys2.md @@ -0,0 +1,160 @@ +# Building with MSYS2 + +## Prerequisites + +You must have [`MSYS2`](https://www.msys2.org/) installed. Then launch an window, which can be `UCRT64`, `CLANG64`, `CLANGARM64` or `MINGW64`. + +You need to install the required packages: + +```sh +pacman -S --needed \ + git \ + ${MINGW_PACKAGE_PREFIX}-toolchain \ + ${MINGW_PACKAGE_PREFIX}-clang \ + ${MINGW_PACKAGE_PREFIX}-cmake \ + ${MINGW_PACKAGE_PREFIX}-angleproject \ + ${MINGW_PACKAGE_PREFIX}-curl-winssl \ + ${MINGW_PACKAGE_PREFIX}-dlfcn \ + ${MINGW_PACKAGE_PREFIX}-glfw \ + ${MINGW_PACKAGE_PREFIX}-icu \ + ${MINGW_PACKAGE_PREFIX}-libjpeg-turbo \ + ${MINGW_PACKAGE_PREFIX}-libpng \ + ${MINGW_PACKAGE_PREFIX}-libwebp \ + ${MINGW_PACKAGE_PREFIX}-libuv +``` + +Then everything is ready to start. + +## Downloading sources + +Just clone the repository: + +```sh +git clone --depth 1 --recurse-submodules -j8 https://github.com/maplibre/maplibre-native.git +cd maplibre-native +``` + +## Configuring + +Configure the build with the following command, replacing `` with `opengl`, `egl` or `vulkan`, which are the rendering engines you can use. If you don't know which one to choose, just use `opengl`: + +```sh +cmake --preset windows- -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ +``` + +## Building + +Finally, build the project with the following command, again replacing `` with the value you choose in the configure step: + +```sh +cmake --build build-windows- +``` + +## Testing + +If all went well and target `mbgl-render` or `ALL_BUILD` was chosen, there should now be a `build-windows-/bin/mbgl-render.exe` binary that you can run to generate map tile images. To test that it is working properly, run the following command. + +```sh +./build-windows-/bin/mbgl-render.exe --style https://raw.githubusercontent.com/maplibre/demotiles/gh-pages/style.json --output out.png +``` + +This should produce an `out.png` map tile image with the default MapLibre styling from [the MapLibre demo](https://maplibre.org/maplibre-gl-js/docs/examples/display-a-map/). + +![Sample image of world from mbgl-render command](images/sample-maplibre-style-mbgl-render-out.png) + +### Using your own style/tiles + +You can also use the `mbgl-render` command to render images from your own style or tile set. To do so, you will need a data source and a style JSON file. + +For the purposes of this exercise, you can use the `zurich_switzerland.mbtiles` from [here](https://github.com/acalcutt/tileserver-gl/releases/download/test_data/zurich_switzerland.mbtiles), and the following `style.json` file. + +```json +{ + "version": 8, + "name": "Test style", + "center": [ + 8.54806714892635, + 47.37180823552663 + ], + "sources": { + "test": { + "type": "vector", + "url": "mbtiles:///path/to/zurich_switzerland.mbtiles" + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "hsl(47, 26%, 88%)" + } + }, + { + "id": "water", + "type": "fill", + "source": "test", + "source-layer": "water", + "filter": [ + "==", + "$type", + "Polygon" + ], + "paint": { + "fill-color": "hsl(205, 56%, 73%)" + } + }, + { + "id": "admin_country", + "type": "line", + "source": "test", + "source-layer": "boundary", + "filter": [ + "all", + [ + "<=", + "admin_level", + 2 + ], + [ + "==", + "$type", + "LineString" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsla(0, 8%, 22%, 0.51)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 3, + 0.5 + ], + [ + 22, + 15 + ] + ] + } + } + } + ] +} +``` + +Note that this style is totally inadequate for any real use beyond testing your custom setup. Don't forget to replace the source URL `"mbtiles:///path/to/zurich_switzerland.mbtiles"` with the actual path to your mbtiles file. + +From your `maplibre-native/` dir, run the following command. + +```sh +./build-windows-/bin/mbgl-render.exe --style path/to/style.json --output out.png +``` + +This should produce an `out.png` image in your current directory with a barebones image of the world. + +![Sample image of world from mbgl-render command](images/sample-barebones-mbgl-render-out.png) diff --git a/docs/mdbook/src/platforms/windows/images/sample-barebones-mbgl-render-out.png b/docs/mdbook/src/platforms/windows/images/sample-barebones-mbgl-render-out.png new file mode 100644 index 0000000000000000000000000000000000000000..49d9df592269bc3930ed2b629540eba5868594c0 GIT binary patch literal 40163 zcmd2?Ho&kXDGC3)64X^C8PAgX$ zxt~?MqDhvoQoBi?ceyY2xi`jhmNRm4jx#Qft=A1$k;TMqHO25i65=p$m5uORiO^z5 z?`pJpc-A(s#<@UqVHEw;r(G;P)&leZfI&DtbGJkOOyGLsN{L1Pf2ozt$CxU_% zAHX02gwU_>-moNhTT*O@vfAm0)s9>mF4IqJ`;Q;;R(P|%Z$d3h_UoTjem79A;*`Ra zvWIBj&P)Xm{C!>L&Jy}t)0QrOD8S>A$o?KwJpWitD~{QS0ujp@8wz*&{w~k}cP*4` z3L`j8H|Fn0G3m$|`WXf>C<28GfM|wEA8)Gq)uNi}N!WL>*W&S|z+s>5!BzoN>RcQi zVDdF3dgtApX>K#f?zM#=Afu(46(Sq~BK#*Cty#B)FrhdpZ^)l~0&oy}a*DZZ5YXm7 zv8=7Dwih=9ff(nOg|A51BpB?&vzs0-1*}-n3!AS&X|PWkSz@dG+=-jq2LlZ9P&I zu7CG?(i8EtFRKaq$4++!Q=cW6#$ zVt2J?VcP%!VUS=X(pc*#HR1sp!QtDD!XgM;oame*hymfH3)A_?75~ z&o|qujJCc!^eM=`YW)4Q)Dp9RX`_ved0vIphsgUxKQ+8Eh<1+-M5N+?SgG1nowN;A zV;e0PNPNK=CGgr3(4LA85Q3AjK1~>2BKL+x47!3$XYR2b-B)-(AEw7}#MygGJm=Rq z?xMJIg2~0f&u)-)W&-gJx4fjp+|`!{*KC1U+jj1-cNoBr+r8D3WO*Mv#xpYtxfHbb*t z(_pVi5Slt8u?B^6BUS*4y-n@$o zR76Z^^NF?42QvO+L^EeslmXP;U$`*~#XKv%=a7J@vNV(&O7GZhv?gt*wod9*HX4$S z=$J^j0A<ylYA?kN_N33xZMfKq? z+k6K4VT&c;=WJjydXCh-IJ{Wu?dVV^hOJS+`Kxmn3T%Noc?YyTiT6TFrd2)ME-)E` zPS@$Q?%OLpQlXUG7w(0!$hbbj=ofIoj?{OhucVfb*AcFpotlDW(YA*V-~s_7%v6Z0 zHDly5HlIVi+gFz3JR#aLI_Q;&(kcONx}@ z62=xH)is&vo_GnCS8l@Qpv?gqoa14Fr>pI!eO1H!vx|4P75}U^XD_-*Q)~;r)|eCt z)K#m7mDvbvIcgpu;W0UL3nqEKameqASg8iPI&$&+A<}e*^bs%FQ*}3QQd9@5#ml$z z5J1p`7TdfXEd93@zqimRHacG4Ae_%*!_;rlrDD}BX2?HV$_e7P!L`i{<+huPY~>IN zav>Ob^rR7~t)iz{*G_`MNZ5 zc}dm#ONURE--uowzJmO}kJmh2ad12cQR+1NDWI4zb`0H;`z(sL}{?EiK-X!qpQeNlW+7p))VsCo;F0ZiUG z?<4;EODf7j_|!fl{qp{P40dx6IVV)CoA7P64kseWA+anpcBY`mLWTH&|A^nQ?P~A0 z+^ZP?C1cfWy}eikAm$*owmTFOnye;?HR}5>{$Har{-wCI*d!f4x35C9!Wv(!vH>@S zYQ}$SKn(Thmr0ZGSp8M*q~c{{;0RH=pmTS0=O-5FGD~1MDcFm1P;s|7dxuiYbn7S} zj0EP0FZ@bfJ(N&nesaC@t?CGGm2nZWB-doVdKvX?aL%@x7{w+3Olg zudAPn*+Jp-7iM(XL@rmv8ylLFgtTXncp>o}HJ{}SxPNBao$TPC*)fPT(&ocoHKBkF zgZ-6ss5;^hzPbC-KJ=|i4-UCNYw_xf{EU?E$vX24e5nS+3782v(L*A1QT_s7X*}nb zHe$zbx>?h3#7}+V+yJ;t6KEG2yj8!}e-+3|jsK8Viu+bXU zqRWRjI(V_P-?NTMm8`)Pj=Y9Zsjl*m>f$>VYrB70Wvm@LDR)F1`cOj-T%r=`CHQ5J zQYd6T6|}^sIYB}rQvR~jBE6L|wXWTqbi4ySjF`tMB$U~r+0E#bdUrNR#dz)P72lkc z%RH>b;*F>e`~MB`4fCwGd*D+qRN-$?H$30AaFzHk2O=4RpTp43(&t6Wsf4RN6gI;L zgx$DjTXoOZ&V>i{&SOz71#iJTHi12rbbghpe*{j8O|lK-p(~g?s_!=PJjt0r5nezT zAkxwq#c0w2d+R^X_lH=AC777F zba;-Y2M?KPHAB;58CU2;06bKD=hD}SJRw$61AXN%ad2_-=)A(q!nW|6XO2~eMdTt? zsvV$|Xq(BM*^{=~h>;kz6h8802??B!%i)`4sxG6ua;?o_4j4dm$gbakjzrgwwcQXY z@&Dy^z24HY%~c){hemW1F=+JyZbqCjSCGhBoV5keSatlq&fgVoQg8Twu&!0EYFZ3 zL@PH&3_?Wb0+`aUHlE}NA_d%ppPhuiC>X9--8`?hhnrzV>UtQg!V0sQwv=LZb^b~a z<0b)Y(HZ%~x>vW333nFft$bihu_QoYa;XfHY)t6NcLXHiuho=(O2H6G-nqXm(d}wk zWz|_F-xuA+B3zyN=||x_IP)|{FnX*luX*l6l7Fl*F3_4(4(EKnD}vrf$_0=x{mwg% zb2lKRgG78uA`g?mtT>u4hEDKEdlAYj_nGKt2wf^z-oE8e51#6BMQ&=?ClUtE8Y;+? zqY+`m@ugkE#KD&k7nrMKk z%S%C05@k)%AOH9^5v>sN6*Phq!?fk+N^&|6H!h)x1U3-fk}!1uIr#BDx!$cM&Ay^fc(2Ps#X`-Z;E7*;43Fw%ENegU+t{{&=@;7Yt82H}<5`sdpv) zKrT{uL@c~HUY?oq{QewLZ0bxwVFJ+&)AV@^ zHu*$Aroi@TarzhVVvxr=-A$FIEPBzGKNmK7EUP7c5JOOV0Xc#H3f#Z+5 z-mqS+vSoV%M1-|>nD-jdPr3fn_|mHXlGCcUK&x~2@44PR#|Nf#K-eMjyZC#w-y3tQ zcU+D*J9g;w0II(P8`mNPKM%&uFed1hUmB|Ku<|nIJ|XKw4iwlcWBhg}I3zr)<}B=hj5&^+diz(?;1*8WC#%#phDe04+?znHx?_hn}5 z5o&Z>i+X8&3O~l;F9rp-O}azO8%_RC?`JqYOy`ecy)aY|0F>&hu|`G>qX*7hxL30! zir(n)c-jhgXp{SfS^2}AcTOK=7aCQTinSCw;x^lzAcnwTNn-d}+TIJbl-uDRAh~v- z*S};R^+fIlJ=C?P!g4fdgbBXX==DeZQ5M#B|L5T%%p4#U!jwX(BKS~gv>~*CYk!In z<=r-=j<*QQP8OmqB_t|Kna7asoUT$1HPc^>?q<;g-O^tvU_}QNLcQgU(j91$D+oQ@W7rxyv+^?}XaMHls$CLU8$t7- z28)iXOjyHmE?ze^ZuB`!Uv&(!_P@Z$!*OmUqI!8GADl-O(ARhqIgaWzORqa~b9g4b z!Ufd~jg2VRwNoIqF8#1_+$8}sgvY!H0m^I2#=JuJ?Ux`x3s$G~LlX#7p1kY+?8j^d zg(U05@1am@Q7#@gdU|${*(o?tW1qERi0S$9z_Fg_T&FY-z>`ZJvPDR`xX2Tb50hbK z6dohIat@jl}1fYn1>!VwKUaBoYj(&|%%VH0tGxhcQ%Q$J#7oJXQs7aY> z1B{rFr_%dp+kfIyW|JicWgt(Wl$5BFH6Uf4d|+;~KhygA90Y!umW?Ea$TgRb99CXQ zx$=f;h1;nQrTh_zgd9NOKk^aOGG#!gZD0tp6CsLJ3E^)GF#!0-wZtnTjIHdD9|qBY zBe#Y|!)W91b@!UQscN^*k7-~va-w9zr$167^A~~mIiV)@CEX^H zJQml5HfRm4^fO(fM$Et1&KbByY?}dB{E6N|svL!?)ov|Hm>z^b6(Y8{Lk=nDGtici7E4kXicqV<>lf9e6x63_7!;lq6(cbLTdPa$iWrUnu14Q-mU|r0 zR2B4CDU%fvDy00+GU1O?5R#F77zc#^!1bOI#!B^Nx24{!2O0%+_+etNcFETl&7u-K z|M24>PW8Xiy~p{CDAPloKSnLcnDJ#|weRVhK<6JsjCcZw{Kzcv%l+GF1E-Utuwhd7 zspw*{kuO8&6#Lw7YH8xk)1>#VPM;(^w=OQ~&RRG6JUaqEaCfuWJJ@_*fM_wJv=_F< z^NvEt`P;}lg(|>unqTD$iGpwI^bEg*FRst#F?(veR|eN^Ikf$suYf<{sf!1TcMx5* zs;+W_HKHcSH?LYbMudnP?dmqoQ0{3Y;XxSx##h|(eN(6K{9z|qaG`GHO)-4p#-~nA z_XH-qud_Sy`;!6Q#@E?Ly78HdGnX-**lV@NT|YIFm~bVR)T_M!LpXCij2E2ecp)^E zFzLiAchOp6kiDm|D6a_fJC2$K;16}ETm;4mKwTt;g;;@sP=$6>>7DGzdxmk zoocAD?d>iYpl2d$ISm;H`VJ@4&VPrgQ=O5uzqGaCv|#ejxGt_0TIh=qRR;ZqxC%oZ zxlOeB|8-g0-wpV)GQn{H{EWFkBvH}A#IjqLYn97exUm9SQ#rQL(qOUD(LX+O+G>5+ z4sq_F zb@CH;=lJ8AmhSEYN|`<0o?xVSo7J|)Z47n@LNCGw!t_wXpjT3d&e5)^x{wAO{H_79 z?YE+GkQ)j3t{@e%TDo!~6`SoI-)`EhDECQ%l+1Mg703Vs!6A1(%feMJWNimxk9G`* zD{pKWVXy<$IRb=qNLUiO3bF*B`%t;_=tgXapF~1R>~*p5Y`A45Uh+AYZ1Eb{!M=)H zXrV(2v^-Cop{Rg((&Dq-$sPBlUO_Z1owrVD-X_vuf~k_*{b1d=K>s;Ex@W&#ch|uo z3N76a%mQauvtuE`h|NKJ*ivsKIr!mK!9+%iyy|x77RL ztKiKJ8pw7!znzH*+NY^bQ(ayW9wc)H`+YA&v>AqgsAi|L+4CV-*IjPxGr_)JA`TFr zjLe0e8HWvTTrYr4NnyEx^pgX_YPU;b^=?+M@i@p`Pv{2xFc0Q(H4rKQW2tpQpH|!8VPSO(Z{Op_EQe$P zMxi+(tF6>SQe}n&!^?ATU`Tqubm`F!9b0~lC6SmO#81*tBbG)27m7Gbf9hT(1gV@ zI#;?KUPr6Ys4?o|n{vxP`w_3de+ZZUkh1q&E+C_bVJ@guQW-tgXSwNSJKQkz6Ku-m zUALkI+lItw@_*z9w9X+;59X^vxg(q8bs)(pywYA+AwFKr0SXmu>r0jZWWi|~>P_YJ}TL^mLzz+0uvGkx9PTA?}=nAx=><5t@!dfih<^4@@JLIOS)9 zzSc$Jd`9oR6#quiP0|KIr3o*<0TVphfeJ=YpZ@5~Z6`M-&K)DyfyKOaSbruDaQh zMFR|!th+h%`?}3E&Ic)lPQj*ZXZXEKH~IA(r@R7CtFi|HXxL|&#S$~U;c2kDD0*=9 zGNWaYlgypir9>)>bcasjIJ1@J_{x>Tr7Lp^_RrE91V>fG!-O$^0WE*MD0;pVF`^>S z^mkN1H(Rf}yw|2y6D*(#(P$IH0CXDh4~83W{_SI46bJ_Ev@MG4;!qMoId2YlBmfe) z1@XBi+p|#OKZes|UigA7$4s=D3>U@j-!zp)itDyyQ9(5{OcrK< zsAtd~XiV^sa5-BWe1+{6Y3{U7IjRq@iE7A0R6qjoDDyUf$_WTT7qQK`a{H?wZQ$K9 zZX|pE>caE#`*-DLgU`#-&0-WslBYw8_$QS+hLL@C-Z5A~^Yo0U+mcVk6}V@{G%dpK ziEmqU_Xmw7mof`(Lnd&;+E~|qt+s>e}5iq3cdULv<%@}$vl1NN8{m; z@f7OF^_p{$uQeGi?Q`yERb`b5?U8dBVovMT>jX}7+n0Gb`^8D3yruyXFS}5Vqj&ECnB#%f$ zxk{7^pZt*7ww_HU&f70uI8l(o9T#)c;%JwewYs7K&!EMLU*TUb`hd+AlB^^J7`skqS<>IND_Nhom-0 zM~-ZJ2YOBpg|)Xv8+pbRZ=j~Uc6M+~;#&OHK2^ zI2)F`nt??IqUhts2=vbiF;P01ze$xp^7mme{7~3eqpixL9h68x1I69Dq}gN@ONd`+ zl=j=JnKcJ{B^muhtJo>ksi;Hs;Qc1YFV;eD^w4z0C%W@;={QAB@L=~0>Lfd6=64Ky zzWhivkR^x0Bkbo$!b);gry_xCdzz95i~HxSK$A{@3QK1wnGk5a$IS++Dl|eJzi3@7 zUHU**RfmpK$cZ?!zl(7LU>yXvp5Vx#2CfrW!p+5;t1!!zEUq8XNZ7M^KffZCD`Y=s zg+hT0Qk2>$HjwW<(`hi3$TC9x3e!RCIM{+{T#E%WDudcz!rLCZgV!hQ%q%j8UwBbI z;?Te~P!n&@Hu>xGtsBjpZNUI%-||DB)Dz-zvpMVRueQW7_i`?EbI0-jC=Y(le{wXW zVuNEDS9RaOpNidNJMokVTNaMCqu%4c zF~%nM#o|RYjAaOO@SUrBA}E?usTO?Feqf{Dh2U;LZd z*r}0?OKB(2$Ov4{1@Hr3v%2|Bd9{7xKU~y;tF4u#>s3Qdpl!^3nNTUP;qz< z2OT|GcsuEW#3lwR-KEfkxWLVeRM}C>cIfAtzLQQ3FG;lX-DD3uzP9D=vP^W#Wc5u8phO}Tv3NbZ1#84 zY5L1nN;RZVPMXmj{4@Ssr!`HnPsI74LxGep$A>FNTvgEk^i%pN;6lG|9RGGj=n9{m zJ_Eu$QE+@sIC#A0mf}BA0MTIpoR80`LYH0y;6XHOFXpdh1R5JY9MEs(lQJ1B+;}QG zc8$P}0L+&RM$4D1D+kLIf0mBn6YoT+(*Dl_MS>fiB^hr2U5Rex-g#eRp=pRIURC3L<)s0 zhWVqI4?X;~n6f}Q}@`?J4$5-v4#m-B|9aqDM zc~^yZ;Ubp7HBwGnDd;Mw2nt|KR!-bsCXpJa9UAGodt)8shovqewgeA| zp-!%=j>j46i0-{3;gD^WQbFcEl_BONB0D?D}!paj4; zCRyW@v?N&MBlzll%b8k__0|uj%n~t=b~UqzuVz9j8KDqQs;m&_G@JGCVGj#YrQfnn zj>l@1aHhaf?R-Vo{Yd{7XYe&!rJ+9auiBuGRw8Ox78e^{IR_eGHd3|ZPoB95{L-Hb zDqG=Vwp3CaP0q;){+~$dKd`r1+E-k7fy-(v8ZJB3NsOUVHy|2xSC?H;dit+Y!vb?> zmv(=N@@8MaixrL@IjjzP<8MKUX*nyym3_QUVxXYh1Q>GWc8GN=(Q$;8DZRSo=L5f-u9YGw4!X4+`jt|K0*=0 zRZA@SZ*HVEg%6pz%v9J2(Y9X4R_GSkJgpWCZ61C`bAvrXj9BPtI}G#45#~DaO#*5v zVLIOmPRCYOI^jqTQ#jkMqio|homkHAZ=J+OGq?ceLdbfLC)}lnE;6Ioj=RV{`h>L6 zk@VWGkR~%WXWGukjlZ>&u zPmLS$SH_Z3t387+?W*ae)M|Cf?Z|P!h3^6Fp@|ETe4ww)&CnC+O8Osi4VtafWqg$4 z{@7WWn??fz#Sjn1YV72!G{(@9J9c<4`^pjeSREROUun$3q}%tLbq)N+XVTigbPt}~ zR>+5!Y@q7JQ-&iKeo0_V!h?UUZy&%*ZSy z0uk@;l?o;5OvzD`OlWEHPb(oD7gX5Uny0$Y0MJ^&*k_UsTjpVpY6s+>eg~?WO0xD2 z@Ozoup&_8ZPe9s_;~lV;h2s&;p8#~a?O27|P{qZ#CH4RpwZfQY{nn20$wYCSKc%XY zgebGsu>lGTRCbp1?tf0AZxHEjOWm zDNd`AoX8rCw(2lq+SV?X(*b%;E;TmCa4Le&=L(fx^%`GfFyqDOrMt9A(Llfqp%@-z z$PU@cZBg#rBWyT9r#as`b4O}7vvr$bPe)QDY|(YbTzwwvGt8=PlW&eC*mHmQ$HJuH z9KkO!d@qT!z%xyZRh?WHp=JTesR4c191v?3huFo#GpAgV%^{M+l#DdKpc)Jy(p2?b zhYL_49@Z7G-C^OcuiS3+#2?~*wUi%@4CNjkeksSO35`ew%fHc)o7IA^nT^9BZ;Ft$ zM-F2XRAPPhq4(+F>*>15H}fhmnGu0|dLoc1mXUFBybqyjB5n#$ zv3mUJS|H2k6XuJ*BxdR)JtHhZCIY}gBQXSL5u=g@1|a95YQfx(c3QF>N5FwUm-FjY z$Xqw43@u2f=1f*5>CGskM-XZPVa&Ky(#^LbDjdGhCJB1}Vsr&_)hF&rt}HG&I@5?EbcL~6skX~aPQAJP@*EdgR~ z#2(l5EBvU@PWF7ePDRI#rY!trqk2KGQ+y6--GeZk8Dd#7B2-8xC?h+oVn|wXt)%U>GJx(uze*x{w(shjD8pt~Voc6xjG_mI)3Y>A zFk%FkvC+SY0Bw8>VjaR!ml$PlTe2%fHIg*EMgt_d;d9_5)|Bt3XZ zu0e8e;mJ@}2V!})H$y|^`Mb}i;b`%(DZ*Xe*XG7{f(@{A5%LoF4L8q3H+|LAPB1{Z zLJ~O+fRr}@zRY^4Q!?Uyc)4AT`@_8&)lr0^dw7+z#$5W?c@uoTr>f!|Ny{--S~K&9 zZC$$GS{T5IUD89Jo}X=qDik_G9(toZHk!oHJ+x8WUWN7ouX=Yys)HS(A}Zjlc)%VI zQP<>w0`~Up$vHjaI8HxEB8~3@D2_QSqZXjTKmkycWRdK@(T1ic&eWCGn zHx?IMOM{neE5Ng6_VW7P7%=>)&FExI1{L?>wV;#5Gcka>VYF?Ljg_94+fp7=u4E!~ z`JtR4jQ?2h1lxjZSs8sP1v6zIVWGyEP*9EF04NNPON33-CLiMzhN> zef(20iAR>GRXfS8om*)%>qOj8!1XSW$wF{8_w)}a8S5>6_3;)b>FB$;=v;^ z^ETs%0(J3bzBL_fKYeE*f$;%Dzv1~8W@aVK0B@^lRn6hEYxR+rww4}IBZ)zsFh{TX z#b)odJ?RA$v5i5&AGuIF{@+ia!8c>xdRctiuyncKOt8Kg60$RDOPD40<{ogVCbo>O ziJS$ga3OjoZcg3mykrq8fD4ZxN_S0EBEI|)XRw5S~PM7!@0FEze<`P^c}QKhrih1XH_o(Kg?( zAI=QZ(tweN0Y^DLf8Pn>4J;HS#c$zRe`hV+$^Dj-+o45d2cvgPsR%TxtET=*(@U4x zZ;fprs}W;E3Wlxnsq1WcRpUb_Irf0#ExC3b%oSW+zmtEVFXs55SWU$PAJ6|TEYKlEix7$KA zk(oq{;M$3J^KP3T7;}|5c-AH$nCsQBBOlw4if(P;6v6*Pid%HR0Z=MR*tiTimKXX- zxbMu8Yq2Dz?0N<>1*=L+NgqRqW|IXg)LrWE3M5=r{_?3n9$wI`0f&s?Y|G>`{Crk{ zx1v!oGskh&Qslw3 z=SNFa8)pXI6~ny7bGx6o_)6rH@obW-NQkOpDi**HI$=+!wD0~A|M0XbOAqH9`>6?i zMjjp0U=`g=KnCI2$kQgKLaU!WV~Oxp z^2>eIov>9l0r|jK?_YiaFV{~l+PPX}mLo#Sf=|BJ>}Adguo1{0-fEu~uf_L=_N7a- z!nTa4nv>Gyd>p#pRloRtj-Y~)-O7wjXhr|nwv=+l<%DZS&)UEjisX zYDC(}D@y;?|%^&qf zjs)|%@q0800j;Y2drvBj78>qz&_LOpu2V*3A(t3Uj`Vaao2-f$Ou4kV7{_Saq zGLU&J?$0(cKw&y}3HW47eVi~JL!QD;JR;2@XNiQI!dZn^;f}-WS{anXhmW1jeoc5I z=u?C_ks2QtQ=P`M>;<(9aDtJL)?Nw{H@5~^%4R;NGpmy&zxcdI z)rz!Q;riS89U4qxB!XUsd42tUP@GwtK+1t<^J0Q8PcMNYcXAOkv$CNm^nUbtd;*xU~jmII+a zV>(kPkKVVoAHZ9i4e(oQ4dXztGCWAi%!D#kFikTE>#CqMonD~fMslr&poNP>nj)B!V}ssZ!%+_AZ#L zzd$#g4l#HTltM`_(^{x>JZ_1$em(q;D(U?#hYs?jNyIi8E#$h-pYa`^_}g7e6$Fxe zlg*m#%SOOo6+ z98}zRG%SIgXc1@?H-5`~Hd&wqYjJaR+(vbPs%!ZR$(u|kgv0whydA}m zjrZUDUxmX2mGH~xmt6H9<04UmM1rQ--3)Y;s2GcZ&m-m)~!dQdqL`GJ=g+!wLo zoByzl`F#zpbA{pxP*uZF0g{>648{e!T(^53pK==3L4+B8h7LE^`v6pJP>qHLuqz5% zkQ*1aiOu0rslUuyBZuye_Bpwm?A*#x<~gPs3439U34HI~v4uj{=4`4eV-4JCmkk@2 zMIpt1x$QeFVatPUt3hnzf|1IoS=H*~ zvEg&LrP5*lt$uU3u!7nyu!?>sn6>B#pc9Rf6LSqhS0hWq+-I$&B@bKKehfX zFW&Ret}nC~AdnTns{b|N49*O?{rLDg?Hf>rKs{WaFD3x0bbc6YF^ll3Q!_iXW0mRG z(kL?CiEFZnA>%uaK^x`>FR>^KqI~Sq`5BRo8Ddt$fKuIazRsOTf*IvU;bf)ahk(s| zZWzpghuW9lb^CSYD_QZ3MHWT(9SzV=4jzPpujDB4rxt@)bywIIJJ)wZfq4g*P>tXq zzkZSWFJ^s52NaDzQ}Res^^s`0%nSy0^n+WaSvC2X7`2x%R>zu=t{Q{ z0LSmZmr*^OH|V4>f6iK(i(L-5Tx5DSynBJQgi|bAFKwoO>z)GIX3~)hMSV1Z46LyJ zIg`r=9K>5)qD#7deyHu9XG>q#Zgqs-e!6bIBr1T+u1*4m3v(1Gh-i~d3O4_p$<_k; zeL+&vx&!n~=ABT4CLC&Kh8P$KsE8~(r4{Lf=Ya`y3)zw_@9ud}zmzM-Kqg@Z?bbJ? z2B}Cff-PW05rnXWHJLsP|0G{>S|3ck=odqD2=@)udecisC3H*948UC}Wt~$)vgI() z?fx6_d$e_Gh@WEqAUoY1Mc4D%HSvRf%5U)oOLym>aGWNZsUXxCgxS$`q_fE8`m^1u`$+K@_3FmoX#T>fZ zISyDxnKQ%Lsif^DZUo?j+vO5{i+n%%}Rs@i? zvC=Im5eE(n`th;L4^_0~Hfx#J=ykA`nU2n{;i}PBQGb`+Pqp_WaU@*lx%Yu8?@^NI zR=O6r$C2(uu=S45<}_mRYLv(K<#)sUW~u?OLnzxeq87=I1j~AdHs13pH9a zP2*lVyfrcZoY=TvGKU9--RGM=G$^`(8%2U!%MUZ?pPpH>LaL5of#~ttj%+one>q8*&+xn7cB%{FKGBTyPMqHf zoW1`desTU`@DvY8tW}f0>|N2R0b%6$Zg+t_apdrkRlhN-Lw{fofcr>5mv>1NH^=^e z+9|d{&EfNnF9`oJWY{Q6x3)j-U9E&3erjNngo?ZtNGHWJA(3d^gN(hvj7{)qnXlQY z+F~^>4hDLAMXdIf0NSSIT~u4vHtx=EyzP-hwcyF0heAp*&hU!?p8CSR*Qa0>R(G)E z8L1gobu%(qL?|$V*i#)t5<+eNrwpdT=3bL##;i_YpoqGQqV669dJCGx+3 z8Z%ZncwtHjzV3{ah6-W|HjbvcKTx1mFI@&68E?i?h`blq!~hs@ zqb`?P7&LWoi~K$Kjw6$~@^dlNbQfeWo-uWV&alVakW8cN&EgGVLU1AXR?KjpaUVOX zf_g!mi18q&cC+S%nX6AECyu-AQjG>R`d{n%oQ0M$hWrD=;3iw`zV>#;-I9kXMHuZl zhdc&iMy6bS8I_CW5aC29e4Q)1zxyk9{N*>d7*;+F1TtZ;)g2F?owPWTvfr`g)j7&| zPy|jL8n~XZE1I1>?et5mIm|Y%pio53BTZRW=_t*zPVQxUI_@uTDaC=C!y|_FRKrM^ z6BviO#TQSsa9oDPc!6OXcdHmev*dpjMItVZDKppzQ#hF1QMi-(IF?Pf)0kn&>38~m z$IP_e&MJ~8e<{}|gz-{BTmydeME_>nSy-CS>LTdI8j`?md{OCn2ng6&(x_YAOogd?y8@(MWny29Tk4j4R$YFf-(Xz7R17#89K3;@h zDeKj{^ICGqzATEMrDN7}67DqZS!Lz@4c%Fca~Y-MVxygh;@zNI*428aWmr1t*qL!6 zii{9nZ8>yB?<1!3%z8g#U-ke}JM;Z|h0`NegEP_la`p@lR3IyWex-m9v#tg>L2lg| z&3oe0*@Jfph>l!{h=jD-wXJ`S4VHKvKfkkmBUm%iSxbz>Pz01OQng+R<=3^=IF(x) zLzkgexM8^2*M)o3Rs45l_J#L5gbDg%kxX-KYiTu#jg@6AeTx`R@vScj_9{l)FA^PkPf3}Yry}Pmv{rRmf00UdH?TbuUtlpQqmO*rLxK zKGi;kPk(~ljAqJMGw2;*WO;o&XV%6YN!}IoJnd1@Hl}XLqFO@=W z&s>cnD5AO3{z_hWQ(wn?alT3Upn&h2OKg4^apE;pXvZp#EYZZ?>OsqB?R?lL0**Q3 zAon_fs_BU|Q$Ak(1{fHNcB8AVa`X@kp`Og<$E8p##%_W@Mf2Gu7@16K7a3X%R3XKNbX{g`pSU2xXa`uQHX-V?vscuvkC_I=XaxoVck%#(T4CXO%NE!`nq zB3(T~Y!nN_V$_q=eGBbh9)|E&J~8{hNnp@0mGw?wmQ_`3$a99NN}O zJeZWs{g;iojHpAqC5Rzi@XvYX1kQPOVGd4Wd*7ezUrwAv2u(7e&HHntu;WUiTA(M5 z*U7OJqmn^?DhXS#)zo@UpGZ)_HsuH_#EkpdvDyW4|7%mGwIx4I1$Fwgp)1DlbGgTQ zI+j$Z@#98sjpyZ$%N8?X2_4P>W=R0@khO&*TotH<9fPvg9GW4XK4bUzv|FF~$0_l< zJVP6sIWNVZZR0SC)#TLCv|ndWqV9FP-Q-Py_4bqgM!15eK*x1`zIpYHX%urB_t;N zWKTX&QrM{yI3=|nDAJ8+U}p?)7I^V#0Ryi78J?$SGTUjVgA^&%V#`0vXrj(RqX1eI z(7J*cu^*c&X!9mo(Xp{i+`u7CX|VUVu4nj(-387pc!f~#U#BF_ zD9h~7pDw@+!P9J(>q7Y)-L->!;Gb0+!1>;8xik{+TrwhiT@49b8@mnd;< z&3N#+@F1-ROd~cWo}YWbeKoc;E$+K^6xG0&Sr8^#X~R6kAc1e~{)xTlqZE24^PzCU zkmkeNH+1<`-?1nW?vjB8zls#ao^t)dda;mvbuUd^v_bAGj8P$|_2;S4Ege>B39ux` zMEO-gwSDtL+{Qtb>41rmRKod`s$pU<0=MVBYgPU3y70m0*ih24ylAlpvN&b6FuT#O zn;Uf61cXr=p((s0GkGzT+7F+PI3+#QvMh~iLt?~x_7%hUbp)$4QZT1Uug5%(R^4Hw zQ1EPGp~U2sm8Lw)^hmBZ-fm%!S17P4bzlQ|0C-}0Cf#pf9yILh(MIUY4=P_H`ALZJ ziAJU=Zk%M;F=7Zd5QpejD-Fl}LZ958vth#gM}ggfWaObNvDoroR|Ycw`{JK5exn+- zV(yYD9jnts2KFr50X2#m`h@$oT$g+OAk@C2Eii?Pq)EO`*J5lDZv7|zj%m&0E83=Y zKX12vwG2g!R`rqbX2pMW89VOIqsPjP?~T-HohrhHeR;@GSm>mKf(Q>E@^l7}n0$G2 zg;zSFa(#W<6Us*Q$vx~?>a9v;4f-X?hOGy_lVV~V4h3wIRs`MgeBj`I#H8)_0uV&Z z3Y~tcv!9#}OA4OqA4s{5HN~VbY<$nciESxrxdU1}6o*HTz1&HJhPd;*z+#2()(?A6 zE|HD;*1BvfuHZJrs?M~+aeYa7Q#-@`Q)dHw3aM_8BL`H}FaRi;W({KoqhF@%zGd zH*=DI53!#ck4}il5WS*?F61>VOpARs2VMwDN2lS^5h`P8a3Sw)+>tqoJW?Xr+KRgw z{0au_;CkBArms3VwKs!>q;3PRqoaFNNt|dUMjfI(EUQx>xzu^dT>PeusgTp&6s3jL z%ZOVa;l|u(G?cNxzF;T;WIrYs`O@kqIN{&0J@_S(zN=F`Hj#cZ=?56M@dT#_moE^% z-&nrOdI)kU=Kgjt6SONAg``V%{(CzCS{jgXB$PsIATEw=dn@D5s+6c?964oDk+K8H>Yj;c=pJ#g?lG1UK#XUx=JB`=KAmls zM@*9=OVLtmB|aQ2o5$ln4emTNUTL#fVnIV^c1Rk0+gEjnK*rs*G3L+$_jj(;Hl>gK zpOkSUZEedlog4(E;pr{C_hsMF>A&FEPBI5fX{I;i>lEC?jT|hrEgzoz`weHIeK&Bq zYAx2h$Xk{TKt#EYKZan)I#;o@WHY6?WL2+io|=rHpB&8`=Y;9U=l-5&4&Qru^s7Hh zJSVJEeS%q#xGrwi#d=cVhP0PO_>P4!Y#Q7!wSOR~if4d49rm1XW_lzKFlPzfLIX8~ zuLmu|bp7#FqvHy~u76uB{aLjV7M}ZkO`ir!<%|{?luA*Jp2t0g7)`6yjSN3%Se;5o z1#Z3>=&Q*vVkmz)V!tK4YUYfr`7eJ|RmWWK<0Nu`erw@ZL#>i>&Cyq2AFG_Nz}=oS zA3s&Pn_RE7Co3y<(!Fx-i@w)e+97rIX4$ZU!Y6?*<2L6P`Tcg_kEPg{n-$sk#8T< z=cw03w9^7K%~(bZxPlf5GGUi^XD>T)rZ}ez4Iojoruz9mE6&6+KvJ8BiGx5s1!4MH zdpwg9rhvMm2ZGeecvd#$Wf7^S*1icB3K;+lCF@TquC`aLYLm6FArIiV=gy3pQTwmO*1@zU>D>!Ik%YYNQzF6N8hoE) z&Gox|tq7hmXYlByt<0v zUHuCe?<%{z^Kd~Rkfp+!$h$Svnl+_%c?v)sMwfHltOw`48Q!k0U&8ojO&1@upLxx8 zDy4Q(OEXl&m-S6bSPab=gcfeKvm#85)Dwhiaz9==^$+mdqvFk7B*1@s~fjd_}swe1oO}d1=BrEXuyvyrGYH93z z*a-$9l(#Um8lTi2Kz;v|CT_#J#>va|p_?|VL$l?1UjKG74Xzn6D>1>r_hVd&*Iehr z0rN4>;`(TUi$JdD99LI>Oc~K|w5pwQi>IOKQovFrzbp61+|{gP_wm=Vdv~3(S22S- zw^;ne3>63p07C(J%Nd%#QM7JeHhvauk$EJyy&&!iCwDDIg}&96`sJw;i~c%Tip8Jl zQ<}&u2kZAz8vaT!NY%{eNY1d+4D0RlH=A+Y0y>;Jh}h8L_3vQ?!~Q*j^lt>veJHZ^ z!_~ppP;he(FIliZ*W8tC@DEiVG;JIADO|Ru#C9S|BUuBpyGYW&uvEv$! z3|<%~PS%lG2fI!5#QV7Y%@7azzVU;}I-XQowV=)stEJES8trJ-%ElLe*+4k+qL|2I zGKw?DV!`-SfbjNnC_ClSo5Z6*l&x|qz=MThPwL6tF1HWzk@WW9!D*I7B?Jm#-VHS;7$9d$gDv_UX`46 z9*K^xOSeO|lAY%c?^Dn0+uNLAOp~p3u4?FXbuP#Q8Dm#q4?kVNy^x7)zY%4#0QYrBLI zV$qLja--dr`dv{UZS;V0IKG-%+Y?S2s#jBvx_|zRbtR~>0br^4>OuCBnlb<0>>0sL zBO-)Ol8|{68_7*ujZ0I`CnACHz1^iIQe}yk)QfNV@2{_sHrBOhR_}(ngI-RlN7khT zAd%(@rHA$_Nvi1i@MAIbG~b0Dx|&Qx@pwp@Kp{F8o6H~8->ZD*XOuLH59?o0GKv6z zX*2iI#oRSY^_2ulGfwi;$1C-)O@6)FOf?9KfaT( zi;5Z7aDdPC0GNoHc{2NVNBECm58U|7MBi-fef|ZWBzq zEmZM-6P7&~arqEfpV>oKKPA|PvU~vjtp=cI@^o5xK0|=s#>FAEtoQ=KYw|x!Tn58_ z2ze8{+yGzBBarI*5!ubvm6#y3;^~O`OSIcnS2tv(W?HW!znGSfmdula;~>Eg&^lDzf(xP)dYa#hJM zYa=J8nx@gdtLrlkLXfsEj6HC_HVDAs=Gg(DjDixJas-Kyw-H4z(c~ z+2-2?`Sgqa&4yVq>o}c-1IcPDRxiVki8I(25umRqOTfhXbYNoOq00U*TY!|u+UaqL zGFB$!vi$NN@Jk%}==T+~E(Y~=@%&;5-YoXA#$)VHw{#TUM$4~0NKVxEB8vQ6*w)C( z@i~MAjywqi&yxIuelJUmJ8ucUf^=#^eWkrj_Zwy|hi&e9@uQHc^92~80Cb>jR1xC- zqrkv~K^i4KNv^nbrNMFjoj<~KnBo6c>N7^I1rE17Thvgma9HQ2k|n{*%x}r^AzuZR z5Dc;1e=QaC>inErij6BZK}bC(8WxFYW~0>uq)xftK+&2ZxI896b~+T320V|azgrOE zNYt)R{+!<6a5FJPE$V>qD>W6R)#L<+`TpSn&95iWQqTPLY&6)>dX72%FGn$ek-*<} z(?_N*yu_0-Bd)-AF6u3Urhps8x!bqJD@1wUUZLpn1{XO?IFFTNgOt^*J#On`wDw;Q zaRbp5CrCm|<~gZEd+?k1nDLhk^#i4fzcFZG)%E;eo4F5FDFUIsazf^#WYW`B(!WwI z!luYgxy$c+2BqZvV+`b7K%$p^ei1kwMHkBgyo-XsUn+o$RHaZW6p(yDfJ(RLFaf3Q`Dz| z%J`q{cYewbXN3`x<`meH6$vb1B)>QBGOMT(8T8KwzC;oD0Qhx#8T*(2&rqJLib zMmYFpVSOiI!$l5;+XLGg?BABfe`K8}HB5Sy^oH+sELB1R(91H?U=#OnLv9n}e|R35ek#}ZksEJR>IVTxJiIMM*`_NZeF zKITqfT|UUtH+9dX#VH9Kf_ZQ0gq|NmSTgy2qm1lV!$W_3Fz5>6pnpBeYU&_S^~K)1 z^!hsQM`J(#M!i!khW!e^0z)JxI*TqHXQ?cU(f}by8Cj5YcIo|6&1uf**JNnMPHawQi%>wYM(y;3{72HKD>WTC|A-dhn%U2&xcZUBVz_<0QAyKY$6eE%@Ie4t{DqSL znFk@N2iR{O69Jow$RKMu$uhEHxRD^g)ar_%2$c~Qk*1%=^(gLok48I1M_xH#n{+Qk zHDs9qId|PAxedl#KeJ^pIr&|47PYFY=> zNb#Tqs92^vZB!{CU@esM0GW!cTrlcM|OGV4mQ7xh+=Ymq_(Z;PRdO{yL~pLhKy@C%rs|aZw)9WiY+vUPIUbV z(cK{U#iI9G&eBMj0+oNo5>Vnyyn!U-p{;}|U6DFs1=w604gni*A-46qofVh7PV>Qp zp2`A}Gp?=I$1T-+v}{UDG`mUOwx5_ya9mAUW~^dk6odn4WbCFit){q)%Li423wc{R zd=2OrqvXI>mM?4jgS>_R%$0{oXn@a z7@2RM>P026NYRkyh^<7eof(Qz5<@g~s1?y70+Y9hFbA)96pZOKB5*-V;arzYA8K98 z3K-tSKZy|iVz%$Ju?K^f9X{xy|Dw)vZxMox=YN44?{D0q%$;dF)jG~TDgNBFADAfm zSD2OP%x?~wc$W||f0rL3VrWhmcMkdho0w9aa6(i*GtPv}q`1yk;-+zfWTQ)?6=b8R z8}7dq_wN?SF1&0Xj4bx|XMs^BiGK1cQOIoRO55|7Z1<8^VF>_;0ZE|!maFhHCFV^J z&%0%j0u|OH>ugLnf4yq9wzmN7N;X#KcQ>OXGIB=RB-f8uuRd^|G8NrG)6w958~enH9GH&xV-)LJa8B`B1bKe_E49an`(%~;iS-}t9w8Rhy)s{- zN0a(EBoBo6_7Qa81t{<1KXEZI@HnV2D`CC$CYM};ry zJwN6sDl3xpBWT!d0W6qY@e>^+UP1^c&m%Ew-`wlX=Q+;h)!1lUJI}9%YpP#Kk@-5; zsaS#;sdg5N64y{pmm0XDtRnt3D)NfI9bd6{9 zK&njVZ`C&0RJtYXgRy6Stn;mr;-sa{!XXqyKo2o}HS}%YFGlpJ&J`IzzTwiElM~3vFR_c()1|dF zZ*Y2>EH?NA3cQrUAg|-sx2>0vQJvDg;1CjxszmML>w8RZe)&%N2kIy9p(Ui5G zkndqdgr=YC7(gg)pgxo#_>a_j(Ek4)E3t$kXdUR~YLWjMIpr*OScNb6opqW>j6UaaF}2~OI4X8A{tSq<8n|HpF$b9u0kTKI|8xq77W(nFzs( zU@f;%5@?w93lZs@M)y6vW_4e;R0nUhy2p_id1PYXz6f~`L-ox z$kAuQMFVHA>HR%T2z~Z(*dAGy7|3+yCYX`%DQ_CbttlqkP#+}1V0cq+AypC8Ls|TE z{Jd!sNRdPmp&ep`xMER1Em>}i=T7`|x`8?@!vKaq_lHb+OAs&p)PXZI|Ko7S$w#Ni zbFn+&tF?&iVWXd7qkgF5lgkB{FrvyMImVLy9M5`A;GSL*8AOl zxOp$nC91ZQm3^%g=c?74+>>h!S%D&Y)%V=kn(-0G+Yvb}vJ?PIOSX~q<>P=kj`M6v zLX4{5pNX`+rjDQX{$h3>E7{#GeZU`_OYe*JJ!o9LfZB2RtkhkNHc+kH!O zQ4~9+EznGkl0YC#iQQ*^;!2d(@MzXUS|3OHlw$&|fuRHWs{>!7^Mi`y3TWeI$9doD zX*V8>0Q!+n_ity)2rBCU3MrQT#=rMYavPn4zZVB7S$Z=(gJ`*}7k!JKT(5JhZQMV% zA*Woe^cnl)_RTcX%|WFp0bKT<=;Xrd=Pq9o&Y(7H{fWqKNEymcZIKcdJc{2~NUWz6 zYY@D+>~Kg#)d7L)V3l)%AEVRiXl`7+ zUu-B*SVu6DpNF$I2Z(w;5G1krAyk3gta!+Cz-(&`{?0VjV@q1`o`h@II&++o1aA?vLK1p1<3HKKqX zhgTm)c&!{Ge)EtHi2Gdq2^cu!O4L@oIOkaqvE#nNSXnX-_$q+da~Eml@s6Edox5_> zn~;}$Jk<8YTV!JDvy@9ta&zRmKPwAVZpeGyQ~c;9Wbtqt-1lY}Z46l*o|>vr|9#$* z|Mu1EH6{+#e$t-ZM9G_pJGk`~ZUDZl&_8)BG8y}OlW^C9-L3u(u_UtcKp*rVo<12X zr2Xsoe!NLheXx=90A%tctSFp!K>1i#8nG>9xWyi0o_p-bl@2o2;>+)4--iGp!ug1L zgEWW}kl}I?Vx0Q#F9m=PeK=W8Z4^n?^>={ITR7S)&xOow@aEvRZ)UuBf16qw4j(>*(K;F8h+c9|>2(kf_Pr2zm7)lb@d(}Kb{ppy2ixJD}hK?u-NG6n=Njr=+E zng=u=DbQz|M6@0+b>jYsAOV?%^7|jRq}%+9k&Ed!6oEGPb0(x2SGhKnt_N`F^SJRpztNJKhCAanvUVgU zHBu{F#?)U&Ar4=oSVr3GDvaFujzf*I#yUsU0~Ti9Uo8Ox$(N611MJWSB+98kzp%Ar zjYsC{-vN22!*ipVp#o;hBI(vgHx@&^oPKQ#w57eh}uIMi^T9W~wEu!FblmiGY zFC)j9h>=EOCP0rs}4}LU^fyBkP=4;yhQFlTsF=N zT)Qj?9X@m?pkIYQSP$I=!#lQwQvI~(>`c5O$jJX{8okDhmeLFTFy2&`kKQspHWD?H zE(u|9c(n_g;n@4+?XtgwlW!y`iw@8kc1w(=KAxA<+Lj$F(KMXTc|A&c;9p>M`mT@O zbT^f+7?^D_&nCH_FE~Txf3y@DE^h!TEW^8G=y0WeBv64wF^1E=<-~gIqB22z;wM<$ z_|O4lVZjG+TM@W6KiXi5@l?fB>I+DuKo-KU5rAP3Rcj-%d1j17uMPF;iQRaX19K8; z6M{gJ+#9F{imp{!TQuKS`i4zuC%SW;!f`h{mv`6Edi$ZZt!bc#TSYjUfiN)lezLCK zk;$;_`J&^DS}@lifuWPbsXk7J#d=o2oct)et*yuHQ##a5+S#Gm!>ovr7UzcOXoGFB z%OlXQs3)zTgJg&Y%Hjm1+KoocZ?jmO2XJQYPoR?fsfxtYx4weXo#W~CvBtgrQqnkO zo^k77a+2o~G|SGC@e;IC{a^KI!*;EWgS{Soy`41qD|eWmU`m($Qd7I4-=V zB@YqPcdq6^5(LP-UR9sV<1UjwO3-Jae-N#^hYE*3@C|mAje&GJ;bC9Y8>T-DJ6l9f zB6p*Tw!Tdqe&_n>pTCvmjUel&gdXCOLuM&Ll^CI1tgX!$vC2LnJ9ymtNrU`u_j8Gk z9cZ!BOg~NRnRNj5ry9V~!FZ`b`$|!-qQ?kMmMD&kY&%xRo0KaV+Yaa4tRdl46E>Xsfmf<4jV02m`T3@$m#>HR z{*OF$v;vVX1@PU+j=Z%+=Huh&9G|9hd6I7oy>;{3PgJCJ7%s265j$#21<}Ej`gV{6 z5D9=MP~%HLe;k>)KBUrSVOLv5DCrUM;UwTz!z{>Mm+H5>pS*|GQnb zUQ982V}03q9Y+Bi5Wlh^`5gtMz-S+q`!$KD@<`IcH}R`_=PCVk28`; z37Z+6elgWR4toR>9pt`?I78maBN^{>eq;~fvv{xBY+O=J#-c~K_|nmm3%g6{Mv@`J zlnaq2ljXKOnLxyrz@aP2fjz#gWmNZ{^5_&@&d*>L^t!JfubE5JL{`HE-L~!t$=r|C zFv^6l9H%mrtDYow>X5lURvzes*ouw7Df zTe_RA@_a?~`x8s49LO!9CALx{{=*j39U)aFtK+qYw z@1@~c(0YXKxY(GN&L?rCj<33wufWm!(jpHIyRjNF2g?4h?KMZ`56KXdL%_||5>8du z(cSzV%<`tAGx-sJd;+WvHTogUSS8J#{wGJ0zd~GIpWswyT`{CxSGt=S=Gre^J|IbS z{aq|TIX$&C!=dpFX3Cqy_Q&59c=KzK zcE@f65Z%^3El*?F_~+Hcpu1+xtIIi5U|drYz3p-zY-TDM>n8r*<;aStL2YH|_MaI+ z_-F|fg(c!FxXxMT?8y^|2o4{#Gg=Mjq(yG=#f`QW0ly2(NG*K znkO~ozHGq#?_r?U;aXr)p0(UV*}iM4!KAe_tbc+}Lb%W`(UDxd(B1)K$&3$C8FBT! z4P=(=|DZ=-d&xg-trLH74!;a)6$E}1OwpFTm?RJLkb1c&awKNV7~AemQAM^HaTMwG z_q_JUi@dM3AQy1hAxk^ycZ|3<6-Lt z=1Tr#3l&B+3(Xf#g%u9T&fZ8reH3k{H8}}{G~ApVbU59?sx(%e(1|EaoMZrlw%zr! zF%xu)v^^MU!Lds6qXWt+NMREO$nt15DEa7^Vlt0Luy?ze-h#jbM$lP{$-?7y?#LV6 z#<*9*2@aZ(iu80SHxkx^wnhk^$hlMOPpjhDt9+a ztIFv0>?j&P%sO@O|@aHo5C%*y&-q?b703<9`nX=txOOvpIt*t_lSf-55InB_z&wUw}_P zc76B({Gk^`#tLbv0CM0X+jD9d49IhhmZm}m4bTvv2OcJaR;{nLHd^{R;WgjnAxIGs z43(jl7h&^#G*9QXzWuc>0Kh3Fz#BXzT*DX%L7E2D=^ z=_sP`BHOit@A(h5UOnk?af;*tbmanw?zMfmpM4`++sRsiY$rN8+Pa-x_tr(h zMbody`~zYwpr@-NS2F(2?p%zsu04fsL-KBr zwD9E@gawAI*n=MyfzoQzOhgvs;ME-P`D~NgCW*JI_CyF%Q|80(=%@vf^ly3Ay;oAknk6dD(hPQy|emfWp9c z@Ragqp)<$+c0#KdC0dOl-BIG?2llLWxdOsnlCvHD!)9HdLFxT=0`Y@V+~7kgT0UcY zby_#7D8)h5ICM&gYyLbgB#oTGLE6cGtcN#lED?>;;{%1aXG@HX0rm}YH(uv&desok zvhU(3o40g!PeF<-XxJ&UAH@OX^@KL4szrpw1GV%4Oc!Jo0)PE`RxmNC7#vAT#FJ4k zY~`LrSrE4om|CY6Ks(rA1i6|w`)#9Hn$TDXgWG4^{han`Js|Ca!$ zY1%yh|B?)oo+QD0@6hQo=d*2)D6q|M_Io0ZqaZcit!3<6$yLs3LAB|brRE>>0~k=i z(?SY-SYq6BtUhs1l}&3qmi7R_y5C_hmEq53737;!CFT|s09MljHN1pC#~TuCL?T`r z4r!fF=CbZ{zbqX~dX!YV@qY7C|7&-)F=r=mD~o)Spvo&rwDxpeHo~5;3tn?;A}l1_ zzd{{m#axFGFnRx9BTLwQM=UHi3~rxC(}3?lP-5V-c2N61jRYBuRq4)ZoZDW7lz!mp znT9X_bLkvOv6PQW2R$;vhKt6OfTi_BU8xeUX}RA7wcF)*fb6w1Qfdhnqk8hdRy9A* zIPgbZjP9Lc)8S9^LH#`J910MXF#DZvkS7#^FYHNd?2qdXxSAIY{RD2Q%eneSbjPBA zi&n9o^UT3p*LfCr{DG!xHs~o8okf&KW7<#o$lBEWo*pBJskHS?{cy8boCe}_(PmK zLFm?H4<}55`h>^nLVMR_RjHO`SEL(i`K~{cVK`=e=>+2ZQBQeeKcW-Wl$s6kLYlsn z7B)8J=QHaF2$G;)zK{tzMa;e%zT+@=KoiI0{gchM#Yhgw$CEXS1U}FGR#J+gi;gZt zT>hD{T(_~Xl8_z?9bT628o8zK0eL82Ie6|J7)Qq8+<0Htm;m~ z1q=vHoNsvM^7-1bb_J-kd?lmVh+rU(DHr|8`lhwy<{DAvPLB;wLt#4akKD9?UkA0e z+x&RTC?nl}(C0H8>gpJOdX~w?aOjvgk7HmvT1_*Pbs33!E@|uvXm%LMJv#XMhEm*f zIK-tIaT;__o(W&{3DJ|i^U1J&36)tZ7{^i%r`q+ai8RF{JYY|9f-UB>t*m&lZA*)^ zU~V6jNN-NN_%Xgc#qhy3i8s!>k)~)-5qwAdpD*7Ofpq$Kz6Vyt->QcdO;;wv59ocI zA14{W4+PMbOU)E*>_Q4^%-!Iy<+h zNcLYP?tg*MN&xGdSZbz#p*yH)fe%v(GxFsD&8ynKzlkc(LGMH1n{On6GLc1&VW13nHh z31^v;UfmU|pMRtXCRQMV$J;GASLtdo(zNK*{kR*M*gBhNzgwY-+-~&Wm>{_Lh`{>b+B-B}3NRlnOK9XQ3AsM_CPwyn==7Q6V9g(|ZVRy+dZeuslY1^K9$WgeIA@4SyJPyci+;FCO%E^fZAVXis??;{S%$(w0bLJXkuQ z$mo&UvFUWtsi9N?A&p?XrrCcz4OzuoG6Dkn`Dp}R=ZfS z@!DTXVr03VXxg3?b>t;GE1T!%n)-GT?i^rj8qyX1Oi86(v?mg#9AZ9{0>hzxbG3h2 zI*O7!qiyU+&*%rFvikOEkAL9>3zK39&VE#A{l%bqR3U%@?H*W(ilBmYwDylY;ha5f z2|e0_nV!HetHmbvM%461Dk~A`9Zheb_u`dH45*pP8!O>{Zm*eD-yr(p5DBs^Se#sD zubY3Xj!z>;Dy0zV6f-jir(SjdsO0VXITb1IER5O zF_b3CCXEIiOLH#ChB40TvTr=_9BA%jYInBUUDzA>Pedo-xof50aFC3gl2lEf7{t_M*rdUO+Z<`m=X+bD_ z&2#6_LfEX}SM}i-vR?DjcRzm(db3bAA9U8UXkPWVTX?w7i~>pKaiF&%aS>q2$+NzT zNfi_Ay(hub(uwD5L9M%Bn!J|9CWG#tSNh`+A{EhV@qU)^!Wz z_<9|5)rPi#b5fRozBZ1tt5Jj*`&wFRHZOF>N6+a1}GCkwYs z4!33aS3_yxO4LqR02bhNLtPil+c(Uti2i3XPxwjIbvQC;tkwW`y^d?`gjd~_mu8n{ z6WS~Mk(=|&@u@w(wH`?+Jt_cmXtt)(QIL+eCj`h*m7eP+ML?ko(@+MKJozL=%EzKg zN_Zk$PT1AO4HgOA+HS+E4)mCnu8JR~Spu|MV_7PiB}6Z-=%zl3yIl!@k`xb<#7bk=jlJA#-;{bs0_fkh|1=$~Y;b)f_fz1$?nKUN3v#5spKwMm> z{W@@AzT9$pLa3%<=*liCNX)`^)my)w7BJchGFUb2SSWPOY06W(-nTGhBU>d;{a5`w z6ir|3!|_o#yLAKNB=YixI))~_Vc$Ly@l%=m^k{l9_iKNc4Jv|)g%Uis`bB98l>jnY z4;wGtSq2t{z>43|l;7I*#KJ6hoky!p6C}nc!&J93uU`mUzfKl^c;UBydW0K?)TP`l z^1%NDCn%)g<=ex{_Mh%z6Tg`~RKkQPZgW~3j=osps!;)a;M9FCp@vW|C<+olj+vgS zV(Kp7@5_(#;pfw44^-|$fXv63PK&1UOu*(YQ;1g_cLG4w4sIo#y#u#7zF)nPi4 z88O_p!#oFWw}4RVUjyfxl*9B=m0yYbHRplwNO&T^j`~Z(%plPZ1g- zWFrGn!4}XHY8Jc-9x*w(=G5ysrbC?$b>n6Y)e#w-$9DlbRm>LAk&|EWM?WhkByL_pK;b#yZc$ z=$WSb6Wn@(v>}1g3X!_JV4e`LseB0-TG{h;?y_s_DUL=gmM`zV&oqZ> zajV=|@DUsJ@;UOcCjtN{ecv^?a^{2j&UI>n-uwdwx-b|zVZi*N9wa{cZmkX=b0vA| z2pr`gzFs_%&KFvqd?~BQhAh50vh5FAEo3ju!H@vcxBjtnuZjsJgTG-0$ds=bAiu^j zrGiuZy?zNiDPKBE(n@(8V@PkSfP;JBCvDRv8SqD+g>NkGoe#Ydw6M3CO)qXAe7iPWB_0+s7-63a|0A z^qee3kU$=|7yXYECHfeDEWGz)nyXp^F1@R~s=mr@{}fIY{ua>frrl{_B!Vyk6-WKQ z7k8B)i@GM?3NF5&7sHU<19M5Ld;+_*nxd6lE!wBWuz-u6{E8ouxRCXUmya1FGrUCH zCfjE@budxx=DWhgmhQlD$23DjWr3aA_o<du3%+213|o1>n(=-{?CxdBKCoYQPsp{*=0aUnB8Fnr?w|X`?6#C!q~5|IE(wt- zR+=1dBk4culNWoUC9iHho;J>1L*8B?vn(Y#F_RewweHo%D9}uvD?&Hq0ic<}g1eYD z5kvhl|HFqtmM2&vuJg;6xs=?dEzPG1ofkrU<}Rr026Nu6I)?*aWM5hz+gS|!u@4^m z7~3cP_l0Jw*!1=NzH}!yof6dhzs2iyNd+4GIqTv@pVc@+VOP6UQHmI-y^F6S`r2@nSzkVDuxY+;uBVlw#Mu(7 zI!#(5=e_iMd-}NhC-Jb$zoJhe8URp~69#~5a=C<_zH-@~z&R>sp$;db=jlzv=^sPxZl7GfDG0eE~c0w5t8(t0>AU5E$Yu(YCJGV0O<8@0r z|2KTU1?Mmb`TROlslFG4&_OXldTb%QgMG#U6!Mn{Z*S$o1?5JsLVz2QMnt0mG61Xx z_ZTplvGb0O8YcF=@Utnn-l`PU58)??9hX|d`xu+TcuQWg{h!V{7Nw;}%`c1d_z3?o zB7q7Qq3>T7#|KR9TSS*_gdc|s@<+I7-&iWddz+m?Vde=JVvhIfY7zvVZfW0!m#t+( zqJVdMt*0Ei>SACnLE`B*?$*11-FT*H7u}5Na>7%adH2y??U%JT0 zM_sOx1^tS>qs06UXP( zvd-pm+TIMF$}khjnHST`nN0692vr(9!B>TV}xLv7v7_qDTN_=yf%z-Ne71^{XE8Wn|S*K*XCvn5sDSaVWlkn5Uk| ze`#3NI`0Xd_>;&itPp_v(|#2;U*izeOqskK_SopR?2HURRr{*_psk|1I9XgAi~|V$ zqDw+2oZ{%x7-83PC`L{7N>7cO65*y1-~z(1a^QqC^xn+roZ6^0OcMYCtQ*~C)P}gO+znsKqg&p;b6rTXsc?lTUwL^p+HppVjWVCyeIQ0S zJga#ii$JB!zr1xJH-z#TJiHmq1KMK9R-6n6Wl@H8cv&c@XmTBfCi$*>sDE($i`^omxI5P#L*Ywd&P zrn)U1V1Ni!1J3SX-b}ar*|3707 zA?2}#CyF8?OR{BD60&5MwL$fgAvr(h28VK8~qJo@&&(lz&(Cb-4Im+gO`#jv}QUwlp1 zTbeXij%}3l%{XL_)lC6bU-j$zzWEOM3EAnbkTM@=Sz?alp)t1E5sh@4d6L&;`c zb`--!Y+JP#6Hj5yB?J2@AsNpVx})4(T#NHP z{>-+h)FQ}1i@$^KbIP)-2-68JaN+#h-uXf`#Ai#1^igEw4Q>POHkCB=I`b!cgB~%H34EC zKyCcyBtd_5CMl8))VH9Nw2v$iYtl*#B)C zNNAUFV91*z298@w@Y(}%UT|Iz8O7IUkBae?AN|ZCua_#l9t{I?9{?!dA?FsCa>=eoQ~v+9IQEHA zLVz+`q5pa`HFyiH>F4)D03Q1LTWT1%Vy|GJm$NFpU+aB9f$g3tUo8vx6i^|N})O7ZC>j#)LdVVXy3=AiWEW)N5>^<(ox)YinW+V`swuF zhnhEe^@r`%EVtaAsvkUnR$A6Eu^QyTz|SjH{2y=M!^K;qPPjvFn)wn#330B9_Q-LXJK)Lxo)Su18eU8cHkxA+oDGo7kcFfS*oc>(lO& zsQ@fnNxXc2+DKm?&76{MevpT|X*bMxyzq6m5fAgw6K5 zB}Ajw@KZ%&B{(KP)A~)@>Z+ZOiI~^IQ^uY8fLQ)}9??^$ClQaUrZG zIHxEr=L5s&^-l}EHUb=RCO$EtuJ9d>2FBiJpK469!Y@() zJMS3Ro+@Oz1SyPHLLAPU7?tOsMDuocrxoWk9+s%&Xto^n0K-0c+Q-Y67n=6({J;3o zjZ8X_Ig%9rQzs~fMO%V{_LlgG3)5ajWfsTZKAs$8a&_*aC9j*@ zWt~S}r2_rxtd5b~&yv?ruT>8!yqS5O2bTh3mgD4Vdka-rSZ%VC<6%_!UuN> z0E=&{6$yJ0jNKyzEsUjZbbLrmGaI-gn@Qp#h5+#N$XnonM3?lg?I?b&2*=E)qD^`% zTq&YM6)f2N(Yn8UxYf~sxSYog`GS)5LzvO)9nn}Ng%McN{aBu*5DA}`?Qir^o;Rp2 zQd{z9F^?tVw}tF4v|Jydf0*qlKW_4Yi*P#i3DQQF;#jWo0ne-q&D6>^p>t(@QPbCM z%Na#mqmwq9D)T+q!%RGsdc1z}(&PE%TuO8FwjkY@b?9z*TkMobOO&zus{S0y2hY~T zs!W*6kADvaD|smyS{_{O-Mh6<74J6`rzKXiM?-s3*vF$}{4}{>cQoq0d+hjQg-VAD z4F_EpmQx+o6er*J@sF>{Y8WV;OYc+vbsRRZETBk~heDDofvM;bi$b=%LUNB2yraB1 zpYv$tWI4Xzsb?nk?D&U|CKLs5FWT5dBV+Vm3^p>BGDYbKV7F~p_4jLIXnd2GuCi@mtU)x{)-;#hyyY>|v&Shb^z8-F~Uf_we!-bAmWn6#>Qz)aCe>T+=58yFI#r?~B2542eguzA zf*DH_CFOr)q!1TW(^QW4^~F~t0h#wdD2Zw+gZgs3QXxUETUmZ)>z;oXLEdu2`LkXU6YV&OBtqr%c=P_vapuR`4a3#_Zqs?NB;(B+C+$wTk8w%dgjrA zx8c?oyXn!^Uc?*XtZX=k)NYTOjSdbK7s4M(4x~pLc7{X;LolA#du~=1A@4x0%xNx- zl0Yx4OzZB40RFeRIq41C9$LogZ`3OjlzY30smgM6&CK=SOyh-qCVh4Ni>aj??5gnkYdVXUCGd=PGw=pzb^N~Cf ztW2YVJx4$?=Y%YY1M7P$%fVO6VQ8r=j04m6I2G9@qbEw*-472)i_Vw{cFm#=Hg7Z0 z!glXz;Q@@7@hw6b@fcr0J!?C2aJ0VW)4#}LPnAXbzIS$S6czR0omnb&<{~&Q<|SE{ zU5$k`XWHnyA{V2$D-yVw-?_31KDt1AgzCEdmw41LeYte;St42fvfC-&qXzzsoA2ns zL?sgMnj4Qy@_TFZR=DUUwk%#ad4{`mmI>{vyDc3~>h7ln6%Asl!*jz5dGfpF1g1xW zvq?@S!FNQ9-bM9t?#%CPEx<%yw!$@d3_OPQi6j`JXYckdbtiVb$$UF2ms9(^whnD3>Lu*j{f@gJMtKJtD;b?k(&S zwSUvQV9;;(7ZuviH~yuZP!yw|$Mup7n_6|5UaEyClZMrz^U8!i9y)V>5!3>wCQ8gc zj#39O^zh6m`C5zOiu#>|rO&9zD`}@-EM}upc^dVc4|K-L;$2y%UUW4D;|(JXJFqj% zU|&%XDD z$^ekL$Lr|#c-iW~Y;K#Tv;)$dHqcP|gZllktP6;`kVb9$^Wd6dO^f1ur=>MDPM=L^ z^}cQjC)z@Jrl^Vr$YbX4XWGuchx;lk9He#IE-ug7=Xp-+4d_CEldCyR{)?di+YbdR7+-4?8 znpS-3?#s~nB!@D}{xlHor*8gnBLs^#lkx;E*urh+K)5%0N{Dq{g_dMkMyYtj%a~_r~(l-@ojp^>-~}l-(WL z=cTW^r9%M~&EnI$cVTGjN2z=bUhgYO;|}I$5e%CW7kUp|<3*o-T^6tT<7^)_Bm%q+ zN9w}0p^pGB4+#G0+gP@+y>o#@)s%gJ8Qkt&XV5xVCe5(qgE54?*0`~J9PG-d0Q@Gs z^?zQ!9usi3eX&htrS@TT{55zDE&-1Gk;n$Uj7nl~5Y4o8%;KSxQcAX{p0k-m#1#u- z*05P;Kf)yKXLAG5z7nwnMbo5sVGHE41{4Rv;+)%Gni|X-d&dwvbSTg{bL3?EuL@w5 z+s_<|ck~lIM`QI1sZEOlbc#A~rn_R70~ns$)1%_o3{_;&G8)=k3#S6Fj> zb>)_!!TodKq0Gk1XIlQiVYOo3FE)&tmRVP=|TXI$)~(dbUY7Eq`Kd| z>h#C4TMQEt^@Y85$D-*^*(KvB?*FF`w|7WJ-|%N|uK<>e=+DtU|C(up4T#Ww_Vq7Z zs8~bswoY)43ISISHt4&-J=RHpaI%c!;9#544(XeeW@V>eh&3x-@UAHzW>wJCZ6EFmstn9e57$TO%JZiV|S&O2-*w0MrPu+XL${aGm4zDh>&u{lw{A9I0h=M}4|#urSz`66 z4C6*HwCiW9jK#Sa)%y7*_Z@KLKW@I}LGslW)So8Lm+A~mX&EGRslfV$Op=FheQ1{e zb#5kq&JPT3Hj?zQE|XpzKRs%4nNli)&j~I(Jx7rHsN4Ga9!xyn1G>l^($2=`Ih3>l zYkgI`G@T!o*~b{MMphYJ1I^5XwhE9{guE@ylte#v<|1Ft*(HKUneUXeuX2@IpdEhH ztZ919{XE6ij5mT!O@I%Cy9$*g2j@7dRlC){mM>Sc-TxLdkHnVMBG;B>y(#$bSW>PP zu&w~a*uKu0pRr*wkH%T6trW%R=ZmtvLgZ`dE(Rm;I4u}eF*0G+1?>^3PUJ?r1uLDa zB_(ic3(rv^E{?N8bI*TgI!R$Cz59tAe$*m$W0Vr%(X$!m3y(Ad{3Vv&O|X6eqb_a? zuUuIZ^w!?vJD9D-1-YpvK@fHBU$zX=dVLh6Z|SF#9#tvL%t`gA;(RO2W#T!}VjR z#3LJdXh->lD`3s~DL6B)xGxHZqd#phndEX9LWh+dDD=g2MQIgvFz6rc2|%YX6f3@UweXmOxjhGHD0Sc@C-C3>*JvG^b{_ z`?X3F7;{MO0L_Fnq>FR{G0)!8GE^5SEFxio6YsQ-KIrv!0nd_q-}NO+chWm$Jd5u-))ScK9T zJp@s=RJYEwO9pk8^y2`10Svnmi9)v>36ou9r>5$?X%d}y2ZMZ5J(YUShLqe)7r7J{KccZdjtFch?-9=ojd93VQpf6LPtUHCd0*{Dc`@M zXMm!gV_#*W$i4gO|4B@kK@hOWg#s-oEjugv4a_#I;cmUMbSdqErm0!Y3fjok+!hJV wy{qX2mL4Tvdm)9&&Ypd2MdhM)j76|D!Q_pCzx2dqFq-~a#s literal 0 HcmV?d00001 diff --git a/docs/mdbook/src/platforms/windows/images/sample-maplibre-style-mbgl-render-out.png b/docs/mdbook/src/platforms/windows/images/sample-maplibre-style-mbgl-render-out.png new file mode 100644 index 0000000000000000000000000000000000000000..896ec6a110e57acb8ab5f23c7ef57a6f20e19cef GIT binary patch literal 102685 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
g1-nNT4PWtkQCd+2c%$b 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

x7gT~NUCpWWZr8R1Z4-Uqg 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Ν>sAm;^XP4O}XqY9;rMUP!7hI5iaWi2PGtYAN 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 C8dQ4# delta 2591 zcmb8wd013c7{~Fs%pG6^<}!n#vcrIY0s<~5-~xiX;$CSbr7f13dsrG{T2^W@Vpy(| zEn1c|jY?_Cv{|&OZMLYmFNpgNV&8YPho1hbKR&-XbLXCO&w1Z@W^A^DMqBj~V@YU0 znNDXJs?(Xr>vXyZdqRexOqViYi*u|a(sxY2RW4dOmikBSaN6UQifhr{H~m~!lTSx0 zn_R~V!YAro#-dUm_d?eicZsjvF>Fpz)x4rA1zylYg#q61fiH|`0zdd8048V%gc%kD zp(&an7|qcFEfIoHgdrReh(r{k5d$k?5r^g&6mD#C^CQV=xvE;6XfuhcOP1;8BdnW0-))F%gq68B;J7(=Z)Rpa?VYB%Z=d z%)-+sh7Ggv4CY`ip2c&Rhv)GEUc`JXz(Tx)MJRzCi&2Utco}6_idXO|mSH(oU?o;z zH5_;iYw$YWz?*mrYq1V*;~lKWyLb;9P>%QE#0M2cRjvh_L;9#QblP5Ro3>J$rH#_E zwJ=kiX^&}(X~ohc+s2tDwLp#2*XeiZ*Xn2KhgPh!ZCvK%bYv){HL0Pc<1$;%+dg+A zHeoX=@F70J7Hq}G*oN(>gd3mWQ+$Tc@db9^OMHbYe2s7LExyC|_yIey3%l_ne!|cA z1;1hse#7th1Ak&K_F+G&aR3K#2#0Y5M{x|taRMh%gHx!*X`I1XoWprsz(ribWn95k zT*GzLp&mETP_cdP&8*!9FMf1%TN_3wYxJ6D+!)KtM=Ck1b4uDNR)c}N^qz70KgP+o z#!mZeb-q`jvIr7h5_$<$!XV)-;UnQIVU%bh;V0oQ5g=ib&?EvS%n}xfAc>|D&6IMl z!eC`kv20xz&W~myhF~xTp#TFh0R7PqebF1e&=dK{Ll5L42i?&PU673|WTG=VAp;4B z_q-P0dT=^#(vXU_NI^1^&<3p`8~l4>E5>n%g%vS~MkFF22MR+dLeLT|&>YRs6hW|X zev27_&|pFU{NaZtFv1r;@CJRfsL+E>TNF@4^G!712I^6V>$nE~m&{ji8JBPo7f^hj zIES-1gVU(RDb(O3PT)9>;V6#aFb?4$4xk$QvG4Y)yqD|px!foB%RHGc>&SYnTkLs& zJV+iW50(wcMr1>>G1;K(RCX*omlMcIE5|WXEwn#-9($Nm>(E%Niflla*Ok^P&UCcC*MGxd5 zA3f0vy^+|5a!tb&Ova?!WGvUFLO!4FGCKqm_o$t{_LP=8AGu-wL~9@G6_CcvpIt#3&}W)4tSDxqi4+8LiqKn=9QTtxB%p zUsD<b3tcp>e8bnwGicp A&j0`b diff --git a/metrics/integration/data/burmese.geojson b/metrics/integration/data/burmese.geojson new file mode 100644 index 000000000000..7e2c452e656d --- /dev/null +++ b/metrics/integration/data/burmese.geojson @@ -0,0 +1,6414 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73270889049581, + 43.41627085800398 + ] + }, + "properties": { + "name": "လူတိုင်းတွေရဲ့အခြေအနေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76298169713937, + 43.44261374841698 + ] + }, + "properties": { + "name": "အဲဒီလူတွေရဲ့အကြံပေးနေတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73750788686539, + 43.42129081598136 + ] + }, + "properties": { + "name": "ဤဒီလူတိုင်းမှာမဟုတ်ရင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68983653183295, + 43.36893537983959 + ] + }, + "properties": { + "name": "အထက်ပိုပေါင်းနှင့်တို့နိုင်တယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78480371728801, + 43.385713038402734 + ] + }, + "properties": { + "name": "တစ်ခါအနက်တန်းရဲ့ပြတာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82444442057749, + 43.3981364143174 + ] + }, + "properties": { + "name": "လိုအပ်သွားမယ်ကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73178458119855, + 43.42150465372435 + ] + }, + "properties": { + "name": "သင့်နှင့်ဆက်သွယ်နေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81785610131647, + 43.36772142802819 + ] + }, + "properties": { + "name": "အနိုင်ရှင်တို့ကိုတစ်နိုင်ငံတွေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71407211903534, + 43.396000025590936 + ] + }, + "properties": { + "name": "အောက်ရှိအောင်စီနိုင်မယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79407351218833, + 43.41860722639433 + ] + }, + "properties": { + "name": "ကြားနေပြီအနီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67633907003255, + 43.4171921149322 + ] + }, + "properties": { + "name": "သုံးရေသည်နိုင်မယ့်ခန့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77300637827193, + 43.39388127052078 + ] + }, + "properties": { + "name": "အိမ်မှာသမျှစွာဖြစ်သည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81926263607329, + 43.339585481875 + ] + }, + "properties": { + "name": "အပြင်သွားနှင့်ဘဏ်များသား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76701252093699, + 43.35773661014847 + ] + }, + "properties": { + "name": "ပြည်သူတိုင်းများတွေသည်တွေနှင့်ဆွေးနွေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7737515090821, + 43.44366259492489 + ] + }, + "properties": { + "name": "အားမရှိပြီကြောင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73829309937992, + 43.34378736524005 + ] + }, + "properties": { + "name": "ကျွန်မတိုင်းတွေကြီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71836466571312, + 43.33057012451926 + ] + }, + "properties": { + "name": "အရမ်းကြီးပိုင်းတယ်တိုင်းများ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8115615374345, + 43.43176089412675 + ] + }, + "properties": { + "name": "အုပ်ရွက်ကိုကြောင့်သွယ်နေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72375031275442, + 43.427220939712534 + ] + }, + "properties": { + "name": "အကြံပေးနိုင်သည်ကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70314387005055, + 43.389688637563765 + ] + }, + "properties": { + "name": "ဘယ်သူမျှန်ကြစိတ်နှင့်ရာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76039207819576, + 43.36975807892726 + ] + }, + "properties": { + "name": "ရက်စ်တီတိုင်းနိုင်တယ်မမောင်မှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78682420394216, + 43.365202354108135 + ] + }, + "properties": { + "name": "အောက်ထိုင်ပြန်အချင်းအနက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78460575433382, + 43.430490774626286 + ] + }, + "properties": { + "name": "ယခုမြို့ကိုလူ့အဖွဲ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7823602114513, + 43.35546405309943 + ] + }, + "properties": { + "name": "ဤဒီအကြံပေးခဲ့သည်မှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69186049292512, + 43.422688902696564 + ] + }, + "properties": { + "name": "မြန်စိုးတိုင်းကိုသက်သေခဲ့သည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80768244315095, + 43.43381601437478 + ] + }, + "properties": { + "name": "ထိုးနှင့်အချက်အလက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72756567031774, + 43.400333914786785 + ] + }, + "properties": { + "name": "မြောက်နန်းနှင့်နှစ်သက်သား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69534099799966, + 43.422190395818994 + ] + }, + "properties": { + "name": "အမြင့်မှတ်မြင်သည်မှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83581194006001, + 43.41564978584469 + ] + }, + "properties": { + "name": "နှင့်ဆွေးတူလှပင်အဆင့်ဖြင့်သား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74950948614969, + 43.43062747741384 + ] + }, + "properties": { + "name": "ခရီးအပ်သန့်နှင့်ပြင်ဆင်မှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72733267952117, + 43.39116317525604 + ] + }, + "properties": { + "name": "အနိုင်ခိုင်းနှင့်ပလက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72085520401288, + 43.43205067390052 + ] + }, + "properties": { + "name": "အင်္ဂလိပ်မှုသို့သင့်မှတို့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74851416375623, + 43.44382863716304 + ] + }, + "properties": { + "name": "နယူမှူသိမ်းနှင့်ဆက်သွယ်နေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8394813306677, + 43.37578833067203 + ] + }, + "properties": { + "name": "ကယ်စိစစမြတ်အရား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77187743426293, + 43.359984149537226 + ] + }, + "properties": { + "name": "အစီအစဉ်နှင့်ပြန်ရွှေပြန်သည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69004478877105, + 43.32857475596884 + ] + }, + "properties": { + "name": "သုံးသောမြန်မာနှင့်ရေကာတွင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7543304983983, + 43.45029457922705 + ] + }, + "properties": { + "name": "ကျွန်တာသည်အမှတ်တံဆိပ်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74270392666222, + 43.436224623306195 + ] + }, + "properties": { + "name": "ရွှေမျက်များရဲ့အဆိုပါကြီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70207094875059, + 43.39809173301537 + ] + }, + "properties": { + "name": "ကျေးမယ်သမီးတွေရဲ့သမီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75571436014798, + 43.3468089398027 + ] + }, + "properties": { + "name": "ကြံ့ခိုးနှင့်တစ်သက်တံဆိပ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8233978214821, + 43.42514681243842 + ] + }, + "properties": { + "name": "ရေသီးနှင့်အမည်နှင့်လျှပ်စစ်လွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68193517172404, + 43.43279789478497 + ] + }, + "properties": { + "name": "ကြာစွန်ရဲ့ငွေတို့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80028992255848, + 43.33690838162077 + ] + }, + "properties": { + "name": "ပိုပြီအကွေ့တို့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71507317067244, + 43.401143748258455 + ] + }, + "properties": { + "name": "သင့်အကြံဖွယ်ကြပါတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78889469900332, + 43.45182031313233 + ] + }, + "properties": { + "name": "မြန်မာကိုသားနှင့်သူးသည့်သမီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6791223720029, + 43.38861188362641 + ] + }, + "properties": { + "name": "လွန်လွန်ပါတယ်မြတ်ဆက်မှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72988047792478, + 43.33359777731984 + ] + }, + "properties": { + "name": "ကိုယ်နှစ်အနည်းအားအစီရင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76988704019641, + 43.365757148416336 + ] + }, + "properties": { + "name": "ကြိုက်နေရာမှာကန်တကယ်လား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75657912670522, + 43.39062671107417 + ] + }, + "properties": { + "name": "တစ်ခုကိုလာခြင်းကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71694934526477, + 43.376825304235226 + ] + }, + "properties": { + "name": "လွန်ချက်အထိပြုပြင်တယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67458813089615, + 43.36108038884236 + ] + }, + "properties": { + "name": "အရည်အသွေးအောင်းခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73092396663014, + 43.451194179973356 + ] + }, + "properties": { + "name": "ဓခဲမှာပျော့နှင့်တူနေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71805769966886, + 43.441661018342145 + ] + }, + "properties": { + "name": "စွန်ကီးတွေကိုစုတွေကြည့်ရင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81861278781616, + 43.426572973941695 + ] + }, + "properties": { + "name": "လွန်ကြစေရင်တစ်ခုကိုစွမ်းသားကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78874389125303, + 43.383000090716834 + ] + }, + "properties": { + "name": "လူ့အကွာအကဲမြင်တယ်စစ်ဆင်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77038527017976, + 43.357431603981965 + ] + }, + "properties": { + "name": "မကိုခြင်းနှင့်ကိုရိုးရာရန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76028190008401, + 43.396620706760984 + ] + }, + "properties": { + "name": "ကြားသရက်မမှာသားကြီးကိုခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72120167890262, + 43.33581886107876 + ] + }, + "properties": { + "name": "ကျေးဇူးလှုပ်ရုံအထိရှာနှောကြပါတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83215351153285, + 43.42486709690492 + ] + }, + "properties": { + "name": "လွန်လွန်ကြောင့်စွန်းကျင့်သမီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74438919600198, + 43.33050804734877 + ] + }, + "properties": { + "name": "အင်္ဂလိပ်မှုအမှတ်တံဆိပ်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78421479421195, + 43.40712629232671 + ] + }, + "properties": { + "name": "ကျွန်တော့လေ့လာကြတယ်ပြောလာပါမည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7497489802472, + 43.33114312974759 + ] + }, + "properties": { + "name": "မြန်မာအမှတ်တံဆိပ်ကြားမှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66478914990057, + 43.38347958366816 + ] + }, + "properties": { + "name": "အမေးအေးခွင့်ခြင်းမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79279423940079, + 43.444583002746775 + ] + }, + "properties": { + "name": "သင့်သားအစီအစဉ်တွေနှင့်ရေကာလာနေသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76906741636776, + 43.419984311312625 + ] + }, + "properties": { + "name": "ကွဲလွဲကြောင့်ရောက်လိုကြမည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75612128325247, + 43.37612751347973 + ] + }, + "properties": { + "name": "အမြဲဆုံသုံးလိုကြားတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77176654843697, + 43.43095760221496 + ] + }, + "properties": { + "name": "သတင်းမီးအတိုင်းအတာကြားပြတာရှိသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7705171135467, + 43.42031530315453 + ] + }, + "properties": { + "name": "အင်္ဂလိပ်စီမကျည့်နှင့်မောင်းလျာရောက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79700244767992, + 43.370796588876516 + ] + }, + "properties": { + "name": "အဆိုတိုရဲ့လက်သမားရဲ့ပြဿာကာကို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68495501730467, + 43.44587605391778 + ] + }, + "properties": { + "name": "စတင်ရက်ရဲ့မစ်ကုန်မှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66875438862098, + 43.428265013064504 + ] + }, + "properties": { + "name": "ကြီးရဲ့ထိုင်းအခေါင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78255633374283, + 43.344190485138526 + ] + }, + "properties": { + "name": "ရတနာစားအောင်းကို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73950662616426, + 43.39914435521945 + ] + }, + "properties": { + "name": "လှူးစမ်းသမီးကြီးများ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66711705844682, + 43.42765258781692 + ] + }, + "properties": { + "name": "အနောက်စမ်းနှင့်သက်ကြီးများ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67424805301926, + 43.367364311972324 + ] + }, + "properties": { + "name": "အကြာအရာများနှင့်ကြောကျန်များ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73542075892419, + 43.405725847481825 + ] + }, + "properties": { + "name": "ပစ္စည်းတော်ခမ်းသည့်တူရွု့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83006410836333, + 43.35664000828751 + ] + }, + "properties": { + "name": "ချုပ်ပြည့်မှာလွန်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72345388556187, + 43.34752030391647 + ] + }, + "properties": { + "name": "ကျွန်ပျော့တွေအစီစစ်ကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74116502544712, + 43.39729245583676 + ] + }, + "properties": { + "name": "ရှက်ရက်ချက်တယ်ပြစ်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73088213630854, + 43.349605386889884 + ] + }, + "properties": { + "name": "ကောင်းကိုနှစ်စဉ်စွာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67745194820873, + 43.41123711240646 + ] + }, + "properties": { + "name": "ရေရပ်အကြံပြင်သွားရာအကြံပြင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6817792850643, + 43.42344437828406 + ] + }, + "properties": { + "name": "ကျွန်းကိုချိုးအောင်းအောင်းကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67395214801763, + 43.39977158479005 + ] + }, + "properties": { + "name": "စွမ်းစွမ်းဆုံးရေးခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72161818475706, + 43.382293003810005 + ] + }, + "properties": { + "name": "ဘယ်ကြီးကိုသွားမည်မြေသွားရွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72855664275721, + 43.41261360254286 + ] + }, + "properties": { + "name": "သီးပဲစီလက်ရှိရှားမည်အရွယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83086291556356, + 43.36050725709127 + ] + }, + "properties": { + "name": "ဘော်ဘော်ခြားနံပါတ်မှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75354201321716, + 43.4442740937665 + ] + }, + "properties": { + "name": "ကြီးကိုသွားလွန်ပြားရွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7131699827778, + 43.345394151190725 + ] + }, + "properties": { + "name": "အာလီဘားကိုဖြေစက်လိုကြမည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7649695364853, + 43.44088050766551 + ] + }, + "properties": { + "name": "တွေ့နံနံ့အမှတ်စာမမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71225333661914, + 43.35591317841684 + ] + }, + "properties": { + "name": "အရှေ့မဲ့လွှတ်သုံးလိုကြမည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79971900833698, + 43.392362357661604 + ] + }, + "properties": { + "name": "ဖမ်းစရာအမိုက်အနေ့ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70626144043672, + 43.42036951093048 + ] + }, + "properties": { + "name": "သွားမည်နှင့်ရှောက်သုံးခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7040667445608, + 43.433803705173396 + ] + }, + "properties": { + "name": "ကြောကျော်သောချစ်မည်နှင့်ရွှေ့သွားခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.813440070051, + 43.385923123380685 + ] + }, + "properties": { + "name": "သက်လုံရေးအသက်ကြောင့်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7070736167725, + 43.37259236901997 + ] + }, + "properties": { + "name": "အကြောစားပါကြီးများ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76888123702702, + 43.39800691496971 + ] + }, + "properties": { + "name": "အစာအိမ်အစားတွေကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74421053508104, + 43.34325732766496 + ] + }, + "properties": { + "name": "စစ်ချက်တရားရှိခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69038090599406, + 43.366814529767844 + ] + }, + "properties": { + "name": "ဂျက်ခြစ်အရွှေ့တွေကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66650853289048, + 43.34867037886478 + ] + }, + "properties": { + "name": "လှည်းတွေအသိုက်ပြတာအရွယ်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66952516027868, + 43.40685068681997 + ] + }, + "properties": { + "name": "ဖြန့်ဖြန့်စွမ်းရမယ်စောက်ခြင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68151887308431, + 43.3821590323556 + ] + }, + "properties": { + "name": "လွှာစစ်ခြင်းအသီးကြီးအသီးကြီး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71453679914157, + 43.41655508237566 + ] + }, + "properties": { + "name": "သိုးမဲ့ရဲ့အချစ်အချစ်နှင့်အရှြင်အတိုကြမည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7286383345945, + 43.389659720807465 + ] + }, + "properties": { + "name": "ဘားလှယ်အကြံပြုအမွှားအမွှားကြောင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78968425737912, + 43.42832250510841 + ] + }, + "properties": { + "name": "လှပ်စွာရှိသေးတဲ့ဘက်ကိုပြောပြပြောသွားရင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77126855272127, + 43.432091911546834 + ] + }, + "properties": { + "name": "မိန်းသက်ကျန်စစ်ကြမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80150644673267, + 43.384293717872744 + ] + }, + "properties": { + "name": "အိမ်ဂျ်ယတ်သာမုသ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70325368034901, + 43.342142138944126 + ] + }, + "properties": { + "name": "ကြားသွားချက်ယွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74350685450099, + 43.33815688393118 + ] + }, + "properties": { + "name": "နှစ်နှစ်မြေလေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68640694219539, + 43.32988121926636 + ] + }, + "properties": { + "name": "ကျန်စက်လှည့်ထွန်းလှည့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82314765576484, + 43.36757657335591 + ] + }, + "properties": { + "name": "မူးဒရိုကျွေးရေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77855847885985, + 43.44537272495857 + ] + }, + "properties": { + "name": "ကြီးကျွေလှည့်သေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69097776744456, + 43.38523317400271 + ] + }, + "properties": { + "name": "လိုင်းဆယ်ယားတုံး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7421211758674, + 43.3800236955169 + ] + }, + "properties": { + "name": "စိုက်ဖျာလှည့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7755043980751, + 43.36667122483581 + ] + }, + "properties": { + "name": "ကျားငြိမ်သီးကြွယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75295729292066, + 43.44281164137731 + ] + }, + "properties": { + "name": "လက်တိုက်ဖလူပြသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77224286592354, + 43.3253127146371 + ] + }, + "properties": { + "name": "ဘုရားလှည့်ထွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8242325149331, + 43.347561311210455 + ] + }, + "properties": { + "name": "အလှူကြော်လှည့်ဆမ်ပျု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80801165451248, + 43.43367913152873 + ] + }, + "properties": { + "name": "ဂန်းမှုလေးပုံ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77302849618263, + 43.372749462523885 + ] + }, + "properties": { + "name": "ဆယ်ရွတ်ကြမ်းပူလမ်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73703546176603, + 43.328032643768076 + ] + }, + "properties": { + "name": "ကျားထွန်းစကျတော့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67624744048317, + 43.344889116256184 + ] + }, + "properties": { + "name": "ဂျွန်လှည့်ထွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79964252293848, + 43.38656670136357 + ] + }, + "properties": { + "name": "ညန်းလေအားရှိသည်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74049655553154, + 43.344659220383505 + ] + }, + "properties": { + "name": "အိမ်သားဖွဲ့ရှားရန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72304384605104, + 43.35607154684429 + ] + }, + "properties": { + "name": "မိန်းမှကျွန်သက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7526981722367, + 43.39981729891517 + ] + }, + "properties": { + "name": "ပစ်စရိတ်လှည့်ထွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68568625772969, + 43.34763712888965 + ] + }, + "properties": { + "name": "အမြွှဲစျိုးများ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81743986333095, + 43.429533375195334 + ] + }, + "properties": { + "name": "ပြင်ကုလားကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80579718643094, + 43.35988688107485 + ] + }, + "properties": { + "name": "အစ်ကျင်းဒေသ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83223099273255, + 43.43425284429113 + ] + }, + "properties": { + "name": "ရွှေမွှ်ပူရမှ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80006585484625, + 43.35132639892201 + ] + }, + "properties": { + "name": "ရှေမှ်ရှေးသမှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70924590877894, + 43.383011511165705 + ] + }, + "properties": { + "name": "မဟာမြန့်ဖွက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68249560431013, + 43.35743306628053 + ] + }, + "properties": { + "name": "အမြဲမှတော်ယဉ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68774304395902, + 43.33419609182944 + ] + }, + "properties": { + "name": "လှုပ်ကြီးအသံဖြစ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67733078337824, + 43.327826458540464 + ] + }, + "properties": { + "name": "အိန်ဂွပတ်လှည့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68834955622151, + 43.431281245921824 + ] + }, + "properties": { + "name": "မကြာဖျာနည့်အပျကြွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091257333308, + 43.43459785012007 + ] + }, + "properties": { + "name": "အန်ဟာကားအာရှကြယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67144809840102, + 43.397513621281995 + ] + }, + "properties": { + "name": "စာကြမ်းအစ်ပန့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82363606504714, + 43.37710068801484 + ] + }, + "properties": { + "name": "ဒူးနေးလှည့်အရှေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74061761816665, + 43.4212255093278 + ] + }, + "properties": { + "name": "သင်္ကြန်စုမှား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7045488688891, + 43.36750358756782 + ] + }, + "properties": { + "name": "ကြင်နန့်ဖရှား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82580595102172, + 43.42392475722188 + ] + }, + "properties": { + "name": "ချိုန်ပျွှန့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77008645152546, + 43.34480018782685 + ] + }, + "properties": { + "name": "ပီးထွားတိုရှင်က" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71651166319498, + 43.34427801604752 + ] + }, + "properties": { + "name": "စပ်မွှင်ကျံမကမာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83028376706352, + 43.39600333853026 + ] + }, + "properties": { + "name": "လီယုဒ္တကျောမြ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72932534685151, + 43.32911672353392 + ] + }, + "properties": { + "name": "ယောင်မေ့ရှင်က" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68036932940231, + 43.36393499520703 + ] + }, + "properties": { + "name": "အီးမှိကျောန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77298183161474, + 43.44003908109747 + ] + }, + "properties": { + "name": "ကောင်ဖန်စွန်မင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81552785528402, + 43.34735681961522 + ] + }, + "properties": { + "name": "ဗုဓသြင်ကျောချေ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78578499835658, + 43.41906317070564 + ] + }, + "properties": { + "name": "ဟန်လျာသယ်ကွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78354709597988, + 43.368113417254776 + ] + }, + "properties": { + "name": "အခြေဆေးရှင်ပန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82797590542668, + 43.35143064769927 + ] + }, + "properties": { + "name": "ရှာဘေးစွာစ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79055192707074, + 43.43537476712199 + ] + }, + "properties": { + "name": "အပြစ်အစ်ထွန်က" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70654512079273, + 43.41147087462913 + ] + }, + "properties": { + "name": "ရေပြစ်တိုကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68733618863007, + 43.41836228588271 + ] + }, + "properties": { + "name": "ဟူးလှင်ကျော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7154416231333, + 43.33529886942282 + ] + }, + "properties": { + "name": "ဟူကျွန်ကြမ်ပ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73493527274877, + 43.370844496181796 + ] + }, + "properties": { + "name": "အော်စမှိကွဲ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73770378945937, + 43.39088303970504 + ] + }, + "properties": { + "name": "တင်ဒင်ဟူးက" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83211159305392, + 43.32846502905939 + ] + }, + "properties": { + "name": "ဘိုအုန်ဝန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68908894596007, + 43.44014380512324 + ] + }, + "properties": { + "name": "အိုက်မှန်က" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6902922126892, + 43.403538514368456 + ] + }, + "properties": { + "name": "ကျော်ဘေးသောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76141611184084, + 43.36152240176037 + ] + }, + "properties": { + "name": "အဏ်စ်မှိန်လျှ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67547588081197, + 43.34877423379756 + ] + }, + "properties": { + "name": "ရွေဟှိုမျက်ရု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74561868818364, + 43.40177322844116 + ] + }, + "properties": { + "name": "ကွက်အရိပ်ကွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82147468187486, + 43.345501872146336 + ] + }, + "properties": { + "name": "မှန်ကြှကွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72331018618115, + 43.41869149001808 + ] + }, + "properties": { + "name": "ချစ်ကြန်ရှင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81418024432423, + 43.39045046575978 + ] + }, + "properties": { + "name": "စာအိတ်အိမ်တိုပေါ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69068592136318, + 43.3685438560169 + ] + }, + "properties": { + "name": "ဖော့ကွန်ဂေး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83747349864097, + 43.32783583160479 + ] + }, + "properties": { + "name": "မီးတိမ်ကွဲ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66638697581311, + 43.38651479270904 + ] + }, + "properties": { + "name": "လောင်းရွှေစိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73073327718703, + 43.39856744262681 + ] + }, + "properties": { + "name": "နိုင်သွန်စ်ဖုန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74104845728016, + 43.38961856762863 + ] + }, + "properties": { + "name": "ရှင်အဲအင်္ကျိ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7539775992791, + 43.37962584070818 + ] + }, + "properties": { + "name": "ကွတ်ဆားလကွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67308167308965, + 43.440433177549636 + ] + }, + "properties": { + "name": "မိုက်ဖျက်အိုန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68724650885542, + 43.3438023389739 + ] + }, + "properties": { + "name": "ဒုတူသွင်ထွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6690021588247, + 43.3604969931925 + ] + }, + "properties": { + "name": "သင့်ဂရှိပ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77503168804014, + 43.415001819151854 + ] + }, + "properties": { + "name": "လော်ကွကျမ်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79229079700326, + 43.41771721089227 + ] + }, + "properties": { + "name": "ဒါန်းကျွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75545867980964, + 43.404726107598385 + ] + }, + "properties": { + "name": "ဦးချွန်းခွန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68343503303822, + 43.32628692794371 + ] + }, + "properties": { + "name": "လေးကန်းရေကြွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7017168198081, + 43.408124296254805 + ] + }, + "properties": { + "name": "မျှီကမြေစင်ဆန်ဖန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75177113079917, + 43.40327950333013 + ] + }, + "properties": { + "name": "အဲစံဥန်ဆွန်ယော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70633448491662, + 43.33353916165031 + ] + }, + "properties": { + "name": "ဆိုဟွန်ကြောစ်ဝေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80796698838185, + 43.38855809467828 + ] + }, + "properties": { + "name": "ထုဒ္ဓရွတ်လွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71316371386729, + 43.40035203701606 + ] + }, + "properties": { + "name": "ဇက်မယ်မောက်မို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73512074699465, + 43.39091219011503 + ] + }, + "properties": { + "name": "ဘီးဝေကြစ်စင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091237096005, + 43.33089437793854 + ] + }, + "properties": { + "name": "ကျွန်ကော်စပ်ဘော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71888919977027, + 43.37203728663009 + ] + }, + "properties": { + "name": "လောက်ဖီးသူနု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6680803788322, + 43.4500067687054 + ] + }, + "properties": { + "name": "အန်က္တော်ကျော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66925720953805, + 43.372341602453425 + ] + }, + "properties": { + "name": "ကြာရွင်လိုကျော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66882286164855, + 43.423630694619916 + ] + }, + "properties": { + "name": "ပေါင်ကုန်ချူ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77390029854541, + 43.445009580661186 + ] + }, + "properties": { + "name": "မင်္ဂလာကြီးမော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71985438791216, + 43.398099248509034 + ] + }, + "properties": { + "name": "ဗျာစာဂူဘေးဆွမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74294883903804, + 43.4173240632121 + ] + }, + "properties": { + "name": "မီးကျွှန်ထွေး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66689798156858, + 43.34124127734229 + ] + }, + "properties": { + "name": "ရပ်ဇရှကြန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75171381658947, + 43.39159204675984 + ] + }, + "properties": { + "name": "ပြက်ရေရိပ်လွှက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81096888891352, + 43.42308178495851 + ] + }, + "properties": { + "name": "ဂွမ်းဘိုမျက်မိုက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73965294263871, + 43.40406594519991 + ] + }, + "properties": { + "name": "အွန်န္ဒိုးဇှီ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72554678621145, + 43.37774074563721 + ] + }, + "properties": { + "name": "ဇွေကွန်စ်ဘီ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67178856070768, + 43.389572230853304 + ] + }, + "properties": { + "name": "သီဖုမှပ်ဆန်တာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66509793278783, + 43.41061135866706 + ] + }, + "properties": { + "name": "မံဝ္အုတ္အာရှင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73326538252331, + 43.44230808801419 + ] + }, + "properties": { + "name": "ဂေါ်ဖမ်းမိမှင်ကောက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.763294657595, + 43.42569076002226 + ] + }, + "properties": { + "name": "ဒိုမ်စကြွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70805275051043, + 43.33022223454242 + ] + }, + "properties": { + "name": "စပ်တောင်ဘန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80356155228401, + 43.35448684283324 + ] + }, + "properties": { + "name": "ခေါပေမှင်သွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71671550436804, + 43.358590543375485 + ] + }, + "properties": { + "name": "ဘောအစ်နွှာမု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79930692168546, + 43.44009080139547 + ] + }, + "properties": { + "name": "မေတြသောကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79587187411107, + 43.353732548898144 + ] + }, + "properties": { + "name": "ကွုးတော်မြင်ကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79719578990535, + 43.37696041213408 + ] + }, + "properties": { + "name": "ဖိုးဝံကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69965497394605, + 43.36639187084689 + ] + }, + "properties": { + "name": "မိုမျောကုတ်ဆန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7921343910175, + 43.39881694771324 + ] + }, + "properties": { + "name": "နုလူဇယ်န်ထွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72017632396182, + 43.38361317683319 + ] + }, + "properties": { + "name": "ချင်းထက်ဂလ်စမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68359785932444, + 43.34831766076865 + ] + }, + "properties": { + "name": "သေးမှူဘူမျက်မှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81414767105343, + 43.40958963502256 + ] + }, + "properties": { + "name": "ရန်ကုန်ဂျက်မုဒ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80253128177446, + 43.36605742276838 + ] + }, + "properties": { + "name": "လျှပေးရှင်ထွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70089574338908, + 43.44275792279891 + ] + }, + "properties": { + "name": "အက်္လကွန်မြင့်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83317739247832, + 43.442243183384164 + ] + }, + "properties": { + "name": "ဝက်ဒွန်ရွှေထွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67721696102126, + 43.42843016937564 + ] + }, + "properties": { + "name": "ဆွဲဇောရှဲလော့က်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71723432403815, + 43.36649527257002 + ] + }, + "properties": { + "name": "အိပ်ဘော့ကျွန်ကြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69481568423726, + 43.40301142667125 + ] + }, + "properties": { + "name": "ချက်ဖြန်ရယ်ကြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68468959578695, + 43.35720648266311 + ] + }, + "properties": { + "name": "ချေဇြချယ်နွှဲဘေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72149391956373, + 43.361699359813706 + ] + }, + "properties": { + "name": "သျှေအန်းရှြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70660354920619, + 43.38448871648363 + ] + }, + "properties": { + "name": "ရန်စှဲရွှန်စွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76299651747377, + 43.35074913433199 + ] + }, + "properties": { + "name": "ကော်ခေါ်ကြေးပစ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77539316698676, + 43.39435306815789 + ] + }, + "properties": { + "name": "ဆုကျေပဲမိဖျမွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71830531729574, + 43.35119394975593 + ] + }, + "properties": { + "name": "အုတ်မြင်ပျကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81118685367528, + 43.37563814779732 + ] + }, + "properties": { + "name": "လှှတ်မုန်အမိပွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79642660311492, + 43.377657505705734 + ] + }, + "properties": { + "name": "သြေပေတြွန်ယောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7888253988358, + 43.337163828964385 + ] + }, + "properties": { + "name": "မကြီမွှခြေရေယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70485407817159, + 43.42571907384735 + ] + }, + "properties": { + "name": "ထျုမရေတကျွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66969568481909, + 43.35045513475347 + ] + }, + "properties": { + "name": "နန်လှှန်မဲကျြွမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66930716449406, + 43.44367042306718 + ] + }, + "properties": { + "name": "လေမြှန်ဖုန်လေမဲ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69189873670894, + 43.43076512052666 + ] + }, + "properties": { + "name": "ပြုရှှမယ်လျားဝဲ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79353235204508, + 43.37368059280777 + ] + }, + "properties": { + "name": "လေယှေဖု်ဒေးချင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70219104390617, + 43.33231431216638 + ] + }, + "properties": { + "name": "ဆောင်ဖြန်ပြင်ဖူ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76689379197433, + 43.36916089976166 + ] + }, + "properties": { + "name": "အကြုပ်ခြှန်ချုန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82121823517355, + 43.3890494143254 + ] + }, + "properties": { + "name": "ဆွမ်ခြေးရွှန်ဖါဖေွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83471876958811, + 43.40298009860645 + ] + }, + "properties": { + "name": "ဆွဲထင်ကြောကြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79381721196569, + 43.43790173544968 + ] + }, + "properties": { + "name": "ဟန်မော်ဖျမြန်ရု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78649372015207, + 43.36341720491033 + ] + }, + "properties": { + "name": "ဂုဏှသှှင်ဟော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78560735030351, + 43.44361961433385 + ] + }, + "properties": { + "name": "ဂှုငှန်ကျုန်ဟိုယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75079314695358, + 43.33861416363164 + ] + }, + "properties": { + "name": "နော်လှှမာစ်ယှှမြှတှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74953762736641, + 43.40607632034917 + ] + }, + "properties": { + "name": "ကျမ်းရှြမိတှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74238703575702, + 43.35555088566464 + ] + }, + "properties": { + "name": "သွေးသွှန်မိမယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83816796506198, + 43.41942390467601 + ] + }, + "properties": { + "name": "ခြိုသွှန်ခြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81616133746593, + 43.350962266236195 + ] + }, + "properties": { + "name": "ဘီဗှှ်ဖေင်ရှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79219311701308, + 43.387858965559424 + ] + }, + "properties": { + "name": "အြာအန်မှူခွင်အရှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66780267369268, + 43.36965922024568 + ] + }, + "properties": { + "name": "ဂေါ့ဗှှန်ဖျဲခြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76678459362029, + 43.41517258008821 + ] + }, + "properties": { + "name": "လေဂျာဖုန်ကြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80142993141635, + 43.341730907669636 + ] + }, + "properties": { + "name": "အမြေဒူန်မြှန်ဒန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77921260855874, + 43.421873232284376 + ] + }, + "properties": { + "name": "ဂေုဝှှန်ခဲန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83144706066832, + 43.36621272347986 + ] + }, + "properties": { + "name": "အယ်ဗှှန်ကုန်ရွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70722008394114, + 43.35038684779588 + ] + }, + "properties": { + "name": "အိုချ်ပွှန်ဟုံး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79020734973255, + 43.33479279298051 + ] + }, + "properties": { + "name": "ရမှေးအာန်လှန်ထွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67291568124347, + 43.43540548255966 + ] + }, + "properties": { + "name": "ဆွဲကျိုလှှာလ်စွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82768299138934, + 43.36836454991645 + ] + }, + "properties": { + "name": "လှှင်းချိုလှှာထွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75399246803045, + 43.418397519140655 + ] + }, + "properties": { + "name": "သန်လှှုဖန်လှှာမွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74220063622761, + 43.35676855353936 + ] + }, + "properties": { + "name": "ပြုပြောလှှှလှာစွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67156749173591, + 43.32753321179319 + ] + }, + "properties": { + "name": "သာန်လှှာစွမ်လှှာမွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7337656762229, + 43.362393286271406 + ] + }, + "properties": { + "name": "လှှူဖန်လှာလှှာမ်ွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72030044521398, + 43.382476256772236 + ] + }, + "properties": { + "name": "အှုဖြေလှှှလှာအွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7526464325656, + 43.436104808005915 + ] + }, + "properties": { + "name": "သွှှရွန်လှှှလှာဟှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71485882023808, + 43.429619924972954 + ] + }, + "properties": { + "name": "စေ်ဘှာလှှာပျာမွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75909970307748, + 43.330400132266675 + ] + }, + "properties": { + "name": "သီးဘာလှှှလှာမွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81135682893091, + 43.42006743640997 + ] + }, + "properties": { + "name": "ကျူဘာလှှာစုတ်သွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67022303291196, + 43.35877085029656 + ] + }, + "properties": { + "name": "ကျေးဖြူလှှာပှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73190488058117, + 43.36210649884719 + ] + }, + "properties": { + "name": "အြုကျဲလှာလှာခြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79749258159609, + 43.43829648566227 + ] + }, + "properties": { + "name": "ငှှမှာယောအ်စှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81412739294592, + 43.42486673759098 + ] + }, + "properties": { + "name": "ကျေးတင်စှန်ကြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73942862821696, + 43.41857560346666 + ] + }, + "properties": { + "name": "ဖှေကျှာအှှာဖှာန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73194496367705, + 43.36236970705654 + ] + }, + "properties": { + "name": "အုန်မ်းစှှာခြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77277965716348, + 43.42795996100599 + ] + }, + "properties": { + "name": "တေးဖြန်လှာစွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79677774850097, + 43.386918730187254 + ] + }, + "properties": { + "name": "ကြာစ်မ်မှာပွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7755677565865, + 43.41930911043181 + ] + }, + "properties": { + "name": "ဘေးစှှ်လှှာလှာအုံး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83969235862696, + 43.40300089042435 + ] + }, + "properties": { + "name": "ဖျှန်နူအာ်အွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79056823232804, + 43.36644340374012 + ] + }, + "properties": { + "name": "လှှာပုးအာျှာမ်ွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79024794978068, + 43.450759361929514 + ] + }, + "properties": { + "name": "ရှှာဆန်အ်အှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7960531583467, + 43.42912547125532 + ] + }, + "properties": { + "name": "လျှှ်ဟန်ဖီမှာအျှှှာန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71188677769896, + 43.40578991754939 + ] + }, + "properties": { + "name": "အိုပြိှှှာလှာမြွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80973210979664, + 43.405074830026 + ] + }, + "properties": { + "name": "ဘြှာရှှာအှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83094842280389, + 43.383506992650275 + ] + }, + "properties": { + "name": "ယှှာမာမြာစှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68880786616319, + 43.4408736919135 + ] + }, + "properties": { + "name": "လှှှှှာအြောအှှာန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83637982623713, + 43.37932687230065 + ] + }, + "properties": { + "name": "လှှောမှှာမှွှာအှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7120551129583, + 43.38478419358865 + ] + }, + "properties": { + "name": "ရှှှာကာအှှှှာန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79655496709165, + 43.353914671185876 + ] + }, + "properties": { + "name": "လှှှျာအှုံးလှာမ်န်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82183396335495, + 43.34951148058995 + ] + }, + "properties": { + "name": "သာှာရှှာအှိုသှှာမ်ွှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7386077853289, + 43.42153859100138 + ] + }, + "properties": { + "name": "လှှာငှှာအွှှာပျာမွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70073597694773, + 43.3950412068982 + ] + }, + "properties": { + "name": "အှှှွာဖျာလှှာကြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67738562238901, + 43.37299568230138 + ] + }, + "properties": { + "name": "လှှာချှှာကွြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76967766127837, + 43.43523403455177 + ] + }, + "properties": { + "name": "လှှာချှှာအိုန်မှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66711217868942, + 43.34498516856536 + ] + }, + "properties": { + "name": "ကြောင်ကွေးအိန်လှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71263407544393, + 43.44878125927471 + ] + }, + "properties": { + "name": "တူစိယ်လှှာကြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81736193811139, + 43.3268554930083 + ] + }, + "properties": { + "name": "အိမ်ကျောကှှှာချာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72823672941468, + 43.39913772571227 + ] + }, + "properties": { + "name": "အာရှှှင်နှှာပန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80909585278732, + 43.42911070681641 + ] + }, + "properties": { + "name": "ပန်ဘလှှှလှာသွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75079532407926, + 43.42721943663759 + ] + }, + "properties": { + "name": "မယှှလှှာပျာလှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71058457033814, + 43.367755763373076 + ] + }, + "properties": { + "name": "အွှှှာအှှာနှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69298119807172, + 43.42626514840551 + ] + }, + "properties": { + "name": "လှှ်အှှှာရှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83650346598006, + 43.41933636859189 + ] + }, + "properties": { + "name": "အာကျှှာစွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7067569578021, + 43.4410164115811 + ] + }, + "properties": { + "name": "တော်အွှှာမွှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8266463758855, + 43.429931233602844 + ] + }, + "properties": { + "name": "သောင်းဘြှာမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78659303223958, + 43.338321981323276 + ] + }, + "properties": { + "name": "သှှှှှာလှှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80639026067729, + 43.36026255177993 + ] + }, + "properties": { + "name": "ပလှှှာအွှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68785430058597, + 43.391834351083176 + ] + }, + "properties": { + "name": "ဂနှှာလှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77329479710443, + 43.331029684633386 + ] + }, + "properties": { + "name": "ကြှာလှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83944140776111, + 43.36094548943541 + ] + }, + "properties": { + "name": "နှာအွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77328811212737, + 43.39281904629793 + ] + }, + "properties": { + "name": "မှာအွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80847732751408, + 43.37011711911654 + ] + }, + "properties": { + "name": "အိုအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69083308544123, + 43.34616816533698 + ] + }, + "properties": { + "name": "အာစှှာမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71997028929218, + 43.39262356330771 + ] + }, + "properties": { + "name": "အိပှှှာအွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70795456797441, + 43.43662706130826 + ] + }, + "properties": { + "name": "လွှှာကြှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74983541518577, + 43.36433290673387 + ] + }, + "properties": { + "name": "ဖနှာလှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72199664814889, + 43.399196067397874 + ] + }, + "properties": { + "name": "မြှှာလှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76282152809654, + 43.33979211362029 + ] + }, + "properties": { + "name": "ကြှှာအွှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72295717357065, + 43.32965718674516 + ] + }, + "properties": { + "name": "ထရှှာမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76962927584191, + 43.417191219398504 + ] + }, + "properties": { + "name": "အာဆွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79867291448863, + 43.44693460246704 + ] + }, + "properties": { + "name": "အွှှာလှှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80762496150783, + 43.447198828628444 + ] + }, + "properties": { + "name": "သှှာလှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73700170958546, + 43.42215816219742 + ] + }, + "properties": { + "name": "ပွှာလှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79048870955376, + 43.368949995240996 + ] + }, + "properties": { + "name": "အွှာကျှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8255365161358, + 43.39707569876099 + ] + }, + "properties": { + "name": "ရှှှာသိန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67286163429799, + 43.38896639656718 + ] + }, + "properties": { + "name": "အိုမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76401826500387, + 43.37508033645364 + ] + }, + "properties": { + "name": "အာစှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77611649584469, + 43.400255751529066 + ] + }, + "properties": { + "name": "အာကျှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70951490545667, + 43.33112009433672 + ] + }, + "properties": { + "name": "အိုအှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7066983545883, + 43.42345908175173 + ] + }, + "properties": { + "name": "အွှှှာအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82127073113952, + 43.339820786610595 + ] + }, + "properties": { + "name": "တင်ဆှာအျှှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71675786236483, + 43.43096503945724 + ] + }, + "properties": { + "name": "အုက်သရေကန်ရာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78950346431157, + 43.40237228555073 + ] + }, + "properties": { + "name": "လွှာအနှှာမွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75258281784954, + 43.390836247816566 + ] + }, + "properties": { + "name": "သင်္ကေတှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76638218213247, + 43.32741343188597 + ] + }, + "properties": { + "name": "ဆန့်မြှာစတာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72154484965267, + 43.45222086361347 + ] + }, + "properties": { + "name": "လိမ်းဖွှာကိုမွှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76627772335996, + 43.437491216616706 + ] + }, + "properties": { + "name": "မီးလှာနှာဂို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73925198284087, + 43.44218709248913 + ] + }, + "properties": { + "name": "စှုကြှာလှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77499563521542, + 43.418523278482645 + ] + }, + "properties": { + "name": "ဆွှှှာမှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8169860967655, + 43.384473967748534 + ] + }, + "properties": { + "name": "သမှှာအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78032431371867, + 43.446660440194194 + ] + }, + "properties": { + "name": "အံဆှှာအြှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71753936465939, + 43.45285380044917 + ] + }, + "properties": { + "name": "လှှှှာနှာပုံ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69263196333395, + 43.419665985695886 + ] + }, + "properties": { + "name": "နှာနှာအွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70765474537438, + 43.42017682128563 + ] + }, + "properties": { + "name": "ကွှှှာသှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69765841770732, + 43.33820610443803 + ] + }, + "properties": { + "name": "အာလှှာအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82267605236211, + 43.42357169093535 + ] + }, + "properties": { + "name": "သကှှှှာအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73336307802492, + 43.42297002833131 + ] + }, + "properties": { + "name": "လျှှှှာနှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83811908518328, + 43.33925460912034 + ] + }, + "properties": { + "name": "သှှာအှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73171881207145, + 43.354563903522724 + ] + }, + "properties": { + "name": "အာအှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6961362492757, + 43.35411874665983 + ] + }, + "properties": { + "name": "အော်တိုှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68661836305637, + 43.36823198552959 + ] + }, + "properties": { + "name": "စှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83961700277996, + 43.3510427803368 + ] + }, + "properties": { + "name": "ကွှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74947187088583, + 43.39389891860199 + ] + }, + "properties": { + "name": "လှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72910695071641, + 43.36486528376062 + ] + }, + "properties": { + "name": "အှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69754557797296, + 43.39387045930845 + ] + }, + "properties": { + "name": "အာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73710033565021, + 43.384584096889725 + ] + }, + "properties": { + "name": "အာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68689162255396, + 43.36871487059363 + ] + }, + "properties": { + "name": "အာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7994804315831, + 43.33013942649552 + ] + }, + "properties": { + "name": "အာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7988314518434, + 43.39336940273254 + ] + }, + "properties": { + "name": "အှာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71307712205453, + 43.41174462631271 + ] + }, + "properties": { + "name": "အှာလှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72580987651236, + 43.38478891558823 + ] + }, + "properties": { + "name": "လှာလှာအွာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7036186715095, + 43.41690955477799 + ] + }, + "properties": { + "name": "အာသာှာအွာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76149458704094, + 43.367965367570484 + ] + }, + "properties": { + "name": "အွာလှာကွှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8058814547212, + 43.403167911414506 + ] + }, + "properties": { + "name": "အာအှှာလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71361559233537, + 43.376334729032095 + ] + }, + "properties": { + "name": "သှာအှာအှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73154162252649, + 43.38490610787597 + ] + }, + "properties": { + "name": "စှာလှာအှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79186204272446, + 43.376665125080876 + ] + }, + "properties": { + "name": "ကွာအှာအှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6661296359971, + 43.452468442692734 + ] + }, + "properties": { + "name": "အွာလှာအှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7616259928136, + 43.44408598398389 + ] + }, + "properties": { + "name": "သွားတဲ့အိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78766358344183, + 43.37143374956189 + ] + }, + "properties": { + "name": "တွေ့စစ်အိပ်လိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68890499690951, + 43.44979275747692 + ] + }, + "properties": { + "name": "လှောဆွေးသုံး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67281208362147, + 43.3973497257669 + ] + }, + "properties": { + "name": "ခုံသွားအောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71588028401948, + 43.442055130438646 + ] + }, + "properties": { + "name": "ဆီမွတဲ့လှမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71721666322901, + 43.32562249083662 + ] + }, + "properties": { + "name": "ဝံတွေ့လိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67841066689653, + 43.34185192725603 + ] + }, + "properties": { + "name": "ဟန်ဆုံးမယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73531620540507, + 43.36415708253743 + ] + }, + "properties": { + "name": "ကြိုကျယ်လှယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72425220806053, + 43.351560221312894 + ] + }, + "properties": { + "name": "ကျွန်ဆီရှွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68594161715737, + 43.409583613235085 + ] + }, + "properties": { + "name": "ရှှေသိုလှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73655883818446, + 43.33441638119229 + ] + }, + "properties": { + "name": "အဆွတ်မယ့်အို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6752721298426, + 43.32966752267923 + ] + }, + "properties": { + "name": "ကြွတ်ရွက်ချပ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6904923700813, + 43.327341256271836 + ] + }, + "properties": { + "name": "အစ်ကောကှေး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78054278610125, + 43.394614279098086 + ] + }, + "properties": { + "name": "ကွှယုံကလှော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74335729998438, + 43.40451717893259 + ] + }, + "properties": { + "name": "ဆွေပေမယ့်အို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7569937171229, + 43.44689633183004 + ] + }, + "properties": { + "name": "ပြင်ယုံလှဲအို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8360965058364, + 43.40171500153021 + ] + }, + "properties": { + "name": "စလှယုံအို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71513986618811, + 43.43457019529001 + ] + }, + "properties": { + "name": "ခေးကွှနှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7952919780746, + 43.44165282752506 + ] + }, + "properties": { + "name": "ပြင်ရှူကလှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68173948092863, + 43.44800154193802 + ] + }, + "properties": { + "name": "မယ်တော်ယှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81701665551464, + 43.389228319829925 + ] + }, + "properties": { + "name": "မြင်းအုံးကှော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77895341666135, + 43.394861202037575 + ] + }, + "properties": { + "name": "ရြယ်ဖျောကှော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75351540071551, + 43.4219368264491 + ] + }, + "properties": { + "name": "တြိုက်သိုလှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81052088748493, + 43.424322611524985 + ] + }, + "properties": { + "name": "ဟိုပင်လှှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69578376327627, + 43.37844309252077 + ] + }, + "properties": { + "name": "ပွဲကျတ်နှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78368098309056, + 43.388133327996385 + ] + }, + "properties": { + "name": "ချွက်စတ်အို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70213684589817, + 43.400458123228596 + ] + }, + "properties": { + "name": "စွနှယုံရွယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75735508441994, + 43.33521557571769 + ] + }, + "properties": { + "name": "မွတ်မယ့်မို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7165813035499, + 43.449836563440115 + ] + }, + "properties": { + "name": "ဟွှုသမ့်ယှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67118947948529, + 43.32648454903178 + ] + }, + "properties": { + "name": "အိုအိုအို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73583864324974, + 43.40494189377406 + ] + }, + "properties": { + "name": "စိုက်ဆီသော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7592708719767, + 43.37376037403405 + ] + }, + "properties": { + "name": "ရူသွှန်းစယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81937170824858, + 43.42605432516992 + ] + }, + "properties": { + "name": "ဂါးအယီးအိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82074352007112, + 43.36580652869758 + ] + }, + "properties": { + "name": "သြို့ဆုံးအို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7436711727496, + 43.372504265635634 + ] + }, + "properties": { + "name": "ဖရှယှောနှို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67000504535372, + 43.38201541721379 + ] + }, + "properties": { + "name": "စားကျစားနှှ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77440106794256, + 43.37650136295896 + ] + }, + "properties": { + "name": "ရှန်ဖီတ်ရှှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68061636193306, + 43.33728440664312 + ] + }, + "properties": { + "name": "ခွေးဒွေးနှင့်ကြယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66503257911336, + 43.38062935022041 + ] + }, + "properties": { + "name": "ပျဉ်းအုပ်အန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70403178494416, + 43.36877483548238 + ] + }, + "properties": { + "name": "အိနိ္ဒုန့်ရယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75963805364609, + 43.40329643349728 + ] + }, + "properties": { + "name": "ဂျာလှဲသေား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67318084901217, + 43.42404258860719 + ] + }, + "properties": { + "name": "ကိုယ်ပူးသော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7664044443527, + 43.43862549454096 + ] + }, + "properties": { + "name": "စိုင်ယန်မှုကြာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76699292336798, + 43.37550577167776 + ] + }, + "properties": { + "name": "လေးကြီးအို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73291945020628, + 43.3674976351091 + ] + }, + "properties": { + "name": "အိုင်းစားလှင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80291150700305, + 43.3459863032626 + ] + }, + "properties": { + "name": "ထွန်တုန်းဖိုင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67799156621277, + 43.336989953022176 + ] + }, + "properties": { + "name": "ဒေါ်ဆားကျစ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75967314468016, + 43.44864855947221 + ] + }, + "properties": { + "name": "ယယွနှင်းကွတ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77895542262922, + 43.37606635807544 + ] + }, + "properties": { + "name": "အပိုပကောင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74354294751629, + 43.401586326632675 + ] + }, + "properties": { + "name": "မံမောကျရှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71739241962405, + 43.32949392714524 + ] + }, + "properties": { + "name": "လန်ထောကြတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78738846011674, + 43.347806614069704 + ] + }, + "properties": { + "name": "လှပ်ကြပွား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68105058004221, + 43.384474385118985 + ] + }, + "properties": { + "name": "သွားကွကြယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74292700712704, + 43.43924277428903 + ] + }, + "properties": { + "name": "မကွဲနှင်းစာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72330992960815, + 43.44448236676838 + ] + }, + "properties": { + "name": "အနှစ်ကိုကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80374649087389, + 43.423236258780996 + ] + }, + "properties": { + "name": "နှတ်စမှား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7843960910941, + 43.37735348316894 + ] + }, + "properties": { + "name": "ပေါ်စီလယ်အတာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77111562727168, + 43.377397868656345 + ] + }, + "properties": { + "name": "ဆယ်မြေးရင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75822663806775, + 43.403893701294244 + ] + }, + "properties": { + "name": "ရွှန်စားကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76760909818859, + 43.365752206325446 + ] + }, + "properties": { + "name": "ဟင်းကဉ်းကျန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67688920728415, + 43.35171094097246 + ] + }, + "properties": { + "name": "ထွာသဲကောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81636243364756, + 43.37912531315445 + ] + }, + "properties": { + "name": "ရှင်ဆယ်လိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76577508596074, + 43.34670065336113 + ] + }, + "properties": { + "name": "ဆယ်ပဲခွာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6734781883506, + 43.339763982233066 + ] + }, + "properties": { + "name": "ပိုနှူးလှူနှှင့်ကြ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67229678701096, + 43.37951866037416 + ] + }, + "properties": { + "name": "ဒစ်ကြီးမှုကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67370422785643, + 43.33477495020771 + ] + }, + "properties": { + "name": "ငြိမ်သစ်တယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72454219260635, + 43.38020083184419 + ] + }, + "properties": { + "name": "နှှဲကျင်းချင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8127777939444, + 43.33011026808491 + ] + }, + "properties": { + "name": "ကြိုလိုကွဲမှု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82476845378096, + 43.345917052691725 + ] + }, + "properties": { + "name": "သောနှင့်စွမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79458199273176, + 43.37007854115475 + ] + }, + "properties": { + "name": "ကျောင်းအတွက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77530815590762, + 43.3745956095525 + ] + }, + "properties": { + "name": "ကျွန်ပိုးတယ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81943466645043, + 43.38442804867082 + ] + }, + "properties": { + "name": "အံရှင်ကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7111729135977, + 43.41659485703934 + ] + }, + "properties": { + "name": "နှွာ့တွင်းအန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81519536270207, + 43.35551688679179 + ] + }, + "properties": { + "name": "လားခံတိုက်ကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80141816757077, + 43.373296346452975 + ] + }, + "properties": { + "name": "အိန်ဒေါကြီးလှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73913970139529, + 43.36766474919193 + ] + }, + "properties": { + "name": "အိနိတော်နှင့်ရောက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68861229532558, + 43.447177904904464 + ] + }, + "properties": { + "name": "တောကြီးမှာလောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70887924537146, + 43.36989440125427 + ] + }, + "properties": { + "name": "မိုးရွှန်ကြော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72727783404389, + 43.43862238253905 + ] + }, + "properties": { + "name": "လွန်ချက်မိုး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80459063938179, + 43.337120260313164 + ] + }, + "properties": { + "name": "တပြန်ရှင်ကြ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76679035695634, + 43.335932458145194 + ] + }, + "properties": { + "name": "အိမ်လျင်ကျွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6765199485153, + 43.33916485424814 + ] + }, + "properties": { + "name": "အွန်ကျမ်းချက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80245708208167, + 43.40137212585799 + ] + }, + "properties": { + "name": "ဖုန်းကြွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77978667389289, + 43.32653195985271 + ] + }, + "properties": { + "name": "ဟန်းဒြန်မေး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83554141642708, + 43.36208645578587 + ] + }, + "properties": { + "name": "ခြောကြာယှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78226428764992, + 43.45214674512842 + ] + }, + "properties": { + "name": "မင်္ဂါရို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68707804799033, + 43.389474442588785 + ] + }, + "properties": { + "name": "ကွမ်တာဒု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80216082023526, + 43.35618116364861 + ] + }, + "properties": { + "name": "များကြောင်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70300949696957, + 43.338949270378016 + ] + }, + "properties": { + "name": "မယ်စုံဖျက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68015060855032, + 43.40296808063941 + ] + }, + "properties": { + "name": "ပြိသိုက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68989328476619, + 43.39232508258088 + ] + }, + "properties": { + "name": "ကွဲကျွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71598403078042, + 43.38262581866229 + ] + }, + "properties": { + "name": "ဆယ်သို့ယာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71912615539532, + 43.452016174114505 + ] + }, + "properties": { + "name": "တော်တယ်ပုံ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74577920821866, + 43.36541829164119 + ] + }, + "properties": { + "name": "ကျွဲလို့မြ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72712613526619, + 43.39671896203547 + ] + }, + "properties": { + "name": "ရုနှင့်ကြ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70664604422745, + 43.34278992771991 + ] + }, + "properties": { + "name": "အရှန်ရြှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68493815003421, + 43.39354964761166 + ] + }, + "properties": { + "name": "လွှ်သွှားကျွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75455462754235, + 43.36155500394566 + ] + }, + "properties": { + "name": "အဲကွကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77873016450667, + 43.366122899933224 + ] + }, + "properties": { + "name": "ကြမ်းသုန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80791232048796, + 43.33394744370124 + ] + }, + "properties": { + "name": "သန်စ်ဖုန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6997965679875, + 43.40806371864969 + ] + }, + "properties": { + "name": "တွေနှွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66838019631632, + 43.35606605074788 + ] + }, + "properties": { + "name": "ပြုနိုင်စေချော" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7069571753982, + 43.34266177851345 + ] + }, + "properties": { + "name": "တူးနှန့်ဖြု" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71273809195645, + 43.35495186858789 + ] + }, + "properties": { + "name": "ကြီးကျားနှင့်မွဲ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73519729235159, + 43.4163297000404 + ] + }, + "properties": { + "name": "အာဆောမြကျော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71910739744908, + 43.45181104214278 + ] + }, + "properties": { + "name": "အရွန်ပီလောက်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72594206510075, + 43.33440744203501 + ] + }, + "properties": { + "name": "လွှ်ချီနှင့်သွား" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69001132062567, + 43.36003830098169 + ] + }, + "properties": { + "name": "မွှတ်ထားကျွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76804370175068, + 43.37362703079163 + ] + }, + "properties": { + "name": "အိန်ဒေါမိုး" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77043742133355, + 43.325828830544545 + ] + }, + "properties": { + "name": "ကြယ်လျနှင့်လိမ်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66452596219278, + 43.377082454312294 + ] + }, + "properties": { + "name": "အဲတိတူစွာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78052164197288, + 43.39882235229331 + ] + }, + "properties": { + "name": "ငွေချင်းထုံ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74768201610368, + 43.34347333416988 + ] + }, + "properties": { + "name": "သုပ်ရင်လို့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77257029502562, + 43.353659062164375 + ] + }, + "properties": { + "name": "မိတ်ကွာရာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82229997433387, + 43.36602478810474 + ] + }, + "properties": { + "name": "ချတ်တာကြောင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77697418935259, + 43.39302377957722 + ] + }, + "properties": { + "name": "ကုလှာကျောင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82932283412902, + 43.344460090153106 + ] + }, + "properties": { + "name": "လမ်းကွားစှန်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75834764860247, + 43.43886099129135 + ] + }, + "properties": { + "name": "ကျွဲဖေမွန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71397262576284, + 43.43847474002368 + ] + }, + "properties": { + "name": "ပိုနွဲနှန်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78490097957456, + 43.41708495277058 + ] + }, + "properties": { + "name": "ခံလွှားလျှ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82596603943784, + 43.37280499147228 + ] + }, + "properties": { + "name": "အိမ်မိုးကွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80376452461223, + 43.41299359444341 + ] + }, + "properties": { + "name": "မွန်စွာကျော်" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73771479115749, + 43.38964563062126 + ] + }, + "properties": { + "name": "အိမ်ကျွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77914081236031, + 43.36200438697811 + ] + }, + "properties": { + "name": "ဖုန်းစောကြောင်း" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6885010122187, + 43.3536150480067 + ] + }, + "properties": { + "name": "ဖြင့်နာ့ပင်လို" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6809883295955, + 43.4279302964151 + ] + }, + "properties": { + "name": "စမ်အော်ဖင်မှ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66638088219406, + 43.356600228775875 + ] + }, + "properties": { + "name": "အဲကျွန့်မှာ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81508020435649, + 43.44503598067335 + ] + }, + "properties": { + "name": "တက်ခွန့်ကျျ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80562566482058, + 43.441746093418764 + ] + }, + "properties": { + "name": "အဲလေးကြွေ့" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69680728921867, + 43.37119072206014 + ] + }, + "properties": { + "name": "အိပ်နှွေ့" + } + } + ] +} diff --git a/metrics/integration/data/devanagari.geojson b/metrics/integration/data/devanagari.geojson new file mode 100644 index 000000000000..5d4c1875470d --- /dev/null +++ b/metrics/integration/data/devanagari.geojson @@ -0,0 +1,6505 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73270889049581, + 43.41627085800398 + ] + }, + "properties": { + "name": "यदि न जानामि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76298169713937, + 43.44261374841698 + ] + }, + "properties": { + "name": "अहमस्मि मनुष्यः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73750788686539, + 43.42129081598136 + ] + }, + "properties": { + "name": "एतत् मानवाः आगच्छन्ति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68983653183295, + 43.36893537983959 + ] + }, + "properties": { + "name": "पूर्वं महान् राष्ट्रं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78480371728801, + 43.385713038402734 + ] + }, + "properties": { + "name": "भूमौ प्रतिपत्तौ समये" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82444442057749, + 43.3981364143174 + ] + }, + "properties": { + "name": "यदि संग्रहणं सक्नोमि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73178458119855, + 43.42150465372435 + ] + }, + "properties": { + "name": "त्वं तु जीवनं शक्नोषि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81785610131647, + 43.36772142802819 + ] + }, + "properties": { + "name": "किमर्थं तु तव उपरि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71407211903534, + 43.396000025590936 + ] + }, + "properties": { + "name": "नीचे स्वतः वर्षे" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79407351218833, + 43.41860722639433 + ] + }, + "properties": { + "name": "परे पश्चात् कृतिः अस्ति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67633907003255, + 43.4171921149322 + ] + }, + "properties": { + "name": "उपयोगः मार्गः एव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77300637827193, + 43.39388127052078 + ] + }, + "properties": { + "name": "कुटुम्बः क्रिया सिद्धिः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81926263607329, + 43.339585481875 + ] + }, + "properties": { + "name": "बहुधा यात्रा धर्मः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76701252093699, + 43.35773661014847 + ] + }, + "properties": { + "name": "शिक्षा यथास्थिति अब्भविष्यति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7737515090821, + 43.44366259492489 + ] + }, + "properties": { + "name": "कदापि न मुहूर्ते उत्पन्नः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73829309937992, + 43.34378736524005 + ] + }, + "properties": { + "name": "दर्शनं निश्चितं भविष्यति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71836466571312, + 43.33057012451926 + ] + }, + "properties": { + "name": "आगमनं हितं अपि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8115615374345, + 43.43176089412675 + ] + }, + "properties": { + "name": "कुछित् मुख्यं लक्षणं मनः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72375031275442, + 43.427220939712534 + ] + }, + "properties": { + "name": "तस्या आदिः प्रारम्भः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70314387005055, + 43.389688637563765 + ] + }, + "properties": { + "name": "केवलं चिन्तनं योग्यं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76039207819576, + 43.36975807892726 + ] + }, + "properties": { + "name": "दिनस्य योद्धा इच्छति न" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78682420394216, + 43.365202354108135 + ] + }, + "properties": { + "name": "बलं तस्य दीर्घं ग्रहणं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78460575433382, + 43.430490774626286 + ] + }, + "properties": { + "name": "यन्त्रं दश मानवा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7823602114513, + 43.35546405309943 + ] + }, + "properties": { + "name": "इदं यदि कार्यं स्वाभाविकम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69186049292512, + 43.422688902696564 + ] + }, + "properties": { + "name": "ज्ञानं लोके सर्वं त्रयः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80768244315095, + 43.43381601437478 + ] + }, + "properties": { + "name": "पुनर्निरीक्षणं समयं कृत्वा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72756567031774, + 43.400333914786785 + ] + }, + "properties": { + "name": "बाह्यं साधन्ति द्वे अन्तरः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69534099799966, + 43.422190395818994 + ] + }, + "properties": { + "name": "कस्मै प्रश्नं यत्र तुल्यं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83581194006001, + 43.41564978584469 + ] + }, + "properties": { + "name": "एकत्र वस्त्राणि आवश्यकम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74950948614969, + 43.43062747741384 + ] + }, + "properties": { + "name": "मुखम् शिरस्या शासनम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72733267952117, + 43.39116317525604 + ] + }, + "properties": { + "name": "सुन्दरं समागम्य लाभः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72085520401288, + 43.43205067390052 + ] + }, + "properties": { + "name": "किं द्वितीयं प्राप्नोति अथ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74851416375623, + 43.44382863716304 + ] + }, + "properties": { + "name": "नवं अत्मनं निर्मिति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8394813306677, + 43.37578833067203 + ] + }, + "properties": { + "name": "योगक्षेमं मन्ये कथं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77187743426293, + 43.359984149537226 + ] + }, + "properties": { + "name": "सह स्वगति दत्ति अन्तरं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69004478877105, + 43.32857475596884 + ] + }, + "properties": { + "name": "श्रद्धा भाषा वृद्धिः ददाति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7543304983983, + 43.45029457922705 + ] + }, + "properties": { + "name": "लोके स्थितिः द्वारम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74270392666222, + 43.436224623306195 + ] + }, + "properties": { + "name": "सर्वदा स्थितिः समुद्रः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70207094875059, + 43.39809173301537 + ] + }, + "properties": { + "name": "शिक्षया पुत्रं जनयति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75571436014798, + 43.3468089398027 + ] + }, + "properties": { + "name": "उद्धारयति च परं योजकः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8233978214821, + 43.42514681243842 + ] + }, + "properties": { + "name": "विवेकः जलनिरूपणी अपि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68193517172404, + 43.43279789478497 + ] + }, + "properties": { + "name": "स्थानं चर यत्र सब" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80028992255848, + 43.33690838162077 + ] + }, + "properties": { + "name": "किञ्चित् खादन्ति स्त्रियः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71507317067244, + 43.401143748258455 + ] + }, + "properties": { + "name": "सम्बन्धः वायुस्तेऽर्थः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78889469900332, + 43.45182031313233 + ] + }, + "properties": { + "name": "अधिकं बहिः प्रहारयन्ति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6791223720029, + 43.38861188362641 + ] + }, + "properties": { + "name": "चत्वारः देवाः किम् विद्यन्ति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72988047792478, + 43.33359777731984 + ] + }, + "properties": { + "name": "गणनं आनन्दं प्राप्नोति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76988704019641, + 43.365757148416336 + ] + }, + "properties": { + "name": "योगः प्रतिप्राप्य मनो भवति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75657912670522, + 43.39062671107417 + ] + }, + "properties": { + "name": "मात्रं पुनः गणयन्ति कार्याः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71694934526477, + 43.376825304235226 + ] + }, + "properties": { + "name": "कर्म कुर्वन्ति आवश्यकानि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67458813089615, + 43.36108038884236 + ] + }, + "properties": { + "name": "गणना प्रबन्धे समीक्षा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73092396663014, + 43.451194179973356 + ] + }, + "properties": { + "name": "धर्मं जीवनं महत्त्वम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71805769966886, + 43.441661018342145 + ] + }, + "properties": { + "name": "सूचिता कर्मणि आलयः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81861278781616, + 43.426572973941695 + ] + }, + "properties": { + "name": "रक्षा सम्प्राप्तिः संघः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78874389125303, + 43.383000090716834 + ] + }, + "properties": { + "name": "सामग्री शून्ये नियंत्रणम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77038527017976, + 43.357431603981965 + ] + }, + "properties": { + "name": "अश्वः कोटिः सिद्धिः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76028190008401, + 43.396620706760984 + ] + }, + "properties": { + "name": "नेत्रं शास्त्रं अपि श्रणोति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72120167890262, + 43.33581886107876 + ] + }, + "properties": { + "name": "श्वेतं किमपि अगमत्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83215351153285, + 43.42486709690492 + ] + }, + "properties": { + "name": "अवबोधनं कुशलं यथा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74438919600198, + 43.33050804734877 + ] + }, + "properties": { + "name": "यदि अधिकारं चिन्तयामि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78421479421195, + 43.40712629232671 + ] + }, + "properties": { + "name": "पूर्णम् स्थापनं सम्प्रयोगः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7497489802472, + 43.33114312974759 + ] + }, + "properties": { + "name": "स्मरणं दक्षिणे बस्तयामि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66478914990057, + 43.38347958366816 + ] + }, + "properties": { + "name": "श्रेणी प्राप्य ज्ञानं तत्र" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79279423940079, + 43.444583002746775 + ] + }, + "properties": { + "name": "पर्यापतनं मृत्युः याति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76906741636776, + 43.419984311312625 + ] + }, + "properties": { + "name": "नियमः लभ्यते लब्धः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75612128325247, + 43.37612751347973 + ] + }, + "properties": { + "name": "आकांक्षा प्राप्य कार्याणि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77176654843697, + 43.43095760221496 + ] + }, + "properties": { + "name": "सत्यं प्राप्तिः श्रोतव्यम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77393503776875, + 43.373380874335005 + ] + }, + "properties": { + "name": "अद्य क्षणे योग्यं जानाति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71310318142423, + 43.43803340638478 + ] + }, + "properties": { + "name": "प्रतीक्षायां सहाययोगं प्राप्नुयात्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81563594692398, + 43.346211434247635 + ] + }, + "properties": { + "name": "हस्तेन गच्छति पदम् विकल्पः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69670553324158, + 43.4029553787535 + ] + }, + "properties": { + "name": "संग्रहणं अधिकं तर्कं ददाति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68140692646466, + 43.45196741095145 + ] + }, + "properties": { + "name": "योगः धारणं सर्वे जनयन्ति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71393977312255, + 43.352840358239604 + ] + }, + "properties": { + "name": "यानं परियाप्तं युद्धे करोति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77520183044271, + 43.370446718107615 + ] + }, + "properties": { + "name": "ख्याति व्यवस्था उद्यानं निर्मायति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7705171135467, + 43.42031530315453 + ] + }, + "properties": { + "name": "इंग्लैंड के सबसे पास छात्र कर रहे हैं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79700244767992, + 43.370796588876516 + ] + }, + "properties": { + "name": "पुनः योग्यता आवश्यक है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68495501730467, + 43.44587605391778 + ] + }, + "properties": { + "name": "शुरू कैसे करें और क्या न करें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66875438862098, + 43.428265013064504 + ] + }, + "properties": { + "name": "दूर से बुलाने का प्रभाव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78255633374283, + 43.344190485138526 + ] + }, + "properties": { + "name": "लाभकारी अक्षर प्यार से मारें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73950662616426, + 43.39914435521945 + ] + }, + "properties": { + "name": "प्रवृत्ति की योग्यता बढ़ाते सैन्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66711705844682, + 43.42765258781692 + ] + }, + "properties": { + "name": "गहरे व्यापारी मानक समूह" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67424805301926, + 43.367364311972324 + ] + }, + "properties": { + "name": "संग्रहण केवल मूल्य फूलों" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73542075892419, + 43.405725847481825 + ] + }, + "properties": { + "name": "पार्टी नगर स्टोन पाथ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83006410836333, + 43.35664000828751 + ] + }, + "properties": { + "name": "सुझाव दूरी तत्व एशिया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72345388556187, + 43.34752030391647 + ] + }, + "properties": { + "name": "कृपया तकनीक से मिलें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74116502544712, + 43.39729245583676 + ] + }, + "properties": { + "name": "रोग आराम से अध्ययन समाप्त होता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73088213630854, + 43.349605386889884 + ] + }, + "properties": { + "name": "लगता है कार्यशीलता कम हो रही है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67745194820873, + 43.41123711240646 + ] + }, + "properties": { + "name": "पूर्ण समर्थन वाणिज्य आणिव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6817792850643, + 43.42344437828406 + ] + }, + "properties": { + "name": "उपकरण आदर्श अवश्यक है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67395214801763, + 43.39977158479005 + ] + }, + "properties": { + "name": "वृद्धि अनुसंधान स्वागत है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72161818475706, + 43.382293003810005 + ] + }, + "properties": { + "name": "आठ गुण सुरक्षा स्थिति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72855664275721, + 43.41261360254286 + ] + }, + "properties": { + "name": "इतिहास का पहला शिक्षक हल्का" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83086291556356, + 43.36050725709127 + ] + }, + "properties": { + "name": "सुलभ बजट सम्पूर्ण व्यवस्था" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75354201321716, + 43.4442740937665 + ] + }, + "properties": { + "name": "खोज उपकरण व्यापारिक बनाना है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7131699827778, + 43.345394151190725 + ] + }, + "properties": { + "name": "आलीसा पूरी बात करती है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7649695364853, + 43.44088050766551 + ] + }, + "properties": { + "name": "चित्र याददास्त इतिहास" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71225333661914, + 43.35591317841684 + ] + }, + "properties": { + "name": "मुख्य चिकित्सा अवस्था सुधारक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79971900833698, + 43.392362357661604 + ] + }, + "properties": { + "name": "शुल्क संख्या अन्यथा सप्ताह" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70626144043672, + 43.42036951093048 + ] + }, + "properties": { + "name": "तुलना भाषा केवल अध्ययन के लिए" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7040667445608, + 43.433803705173396 + ] + }, + "properties": { + "name": "गिरावट लाइव चयन करें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.813440070051, + 43.385923123380685 + ] + }, + "properties": { + "name": "सैन्य के बिना देश छोड़ दें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7070736167725, + 43.37259236901997 + ] + }, + "properties": { + "name": "प्रभाव उपस्थिति पुरातात्विक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76888123702702, + 43.39800691496971 + ] + }, + "properties": { + "name": "संरचना आधे विश्व खेत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74421053508104, + 43.34325732766496 + ] + }, + "properties": { + "name": "निवेश किसी मामले में वर्णन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69038090599406, + 43.366814529767844 + ] + }, + "properties": { + "name": "परिवर्तन नेता शक्ति विचारणा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66650853289048, + 43.34867037886478 + ] + }, + "properties": { + "name": "विधायिका आत्मा संरक्षित है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66952516027868, + 43.40685068681997 + ] + }, + "properties": { + "name": "विकास बच्चे का परीक्षण जिम्मेदार है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68151887308431, + 43.3821590323556 + ] + }, + "properties": { + "name": "संचालन सितारे की आवश्यकता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71453679914157, + 43.41655508237566 + ] + }, + "properties": { + "name": "प्रयास निर्देश स्थिर हो गया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7286383345945, + 43.389659720807465 + ] + }, + "properties": { + "name": "बार्सलोना उदाहरण समर्थन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78968425737912, + 43.42832250510841 + ] + }, + "properties": { + "name": "प्रभाव जारी रखना व्याख्या करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77126855272127, + 43.432091911546834 + ] + }, + "properties": { + "name": "प्रकृति अंत उत्तर तंत्री" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80150644673267, + 43.384293717872744 + ] + }, + "properties": { + "name": "पीला अद्भुत विचारिक माता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70325368034901, + 43.342142138944126 + ] + }, + "properties": { + "name": "दिल्ली अनुसार लॉट ग्रुप" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74350685450099, + 43.33815688393118 + ] + }, + "properties": { + "name": "आइटम इतिहास की अवश्यकता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68640694219539, + 43.32988121926636 + ] + }, + "properties": { + "name": "नदी किसान जन्म संघर्ष करते हैं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82314765576484, + 43.36757657335591 + ] + }, + "properties": { + "name": "दोहरा सीमा यात्री जीवन लेते हैं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77855847885985, + 43.44537272495857 + ] + }, + "properties": { + "name": "मारना बाप का समर्थन करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69097776744456, + 43.38523317400271 + ] + }, + "properties": { + "name": "गोपनीय निम्न आत्मा उसे कहें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7421211758674, + 43.3800236955169 + ] + }, + "properties": { + "name": "रुको छोटे इच्छा हजार वैल्यू" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7755043980751, + 43.36667122483581 + ] + }, + "properties": { + "name": "फिर लड़के पैसा वेब ब्रेक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75295729292066, + 43.44281164137731 + ] + }, + "properties": { + "name": "गर्मी मदद जान्य।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77224286592354, + 43.3253127146371 + ] + }, + "properties": { + "name": "बैठो इम्पीरियल कर्ण चेहरा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8242325149331, + 43.347561311210455 + ] + }, + "properties": { + "name": "नौकरी गति की है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80801165451248, + 43.43367913152873 + ] + }, + "properties": { + "name": "अभी बाल दर्शक दर है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77302849618263, + 43.372749462523885 + ] + }, + "properties": { + "name": "बहुत एकल गेंद सामान्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73703546176603, + 43.328032643768076 + ] + }, + "properties": { + "name": "डरते हैं गोल टीम बनाने स्कूल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67624744048317, + 43.344889116256184 + ] + }, + "properties": { + "name": "महान दीर्घ गलत स्वीकार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79964252293848, + 43.38656670136357 + ] + }, + "properties": { + "name": "रात्रि ऑडिशन सही जीत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74049655553154, + 43.344659220383505 + ] + }, + "properties": { + "name": "मस्तिष्क सुझाव कौन प्राप्त करता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72304384605104, + 43.35607154684429 + ] + }, + "properties": { + "name": "यदि कौन समीचीन मानक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7526981722367, + 43.39981729891517 + ] + }, + "properties": { + "name": "उच्च ब्लड की तरह शादी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68568625772969, + 43.34763712888965 + ] + }, + "properties": { + "name": "सादगी औषध उपयुक्त रात्रि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81743986333095, + 43.429533375195334 + ] + }, + "properties": { + "name": "राज्य प्रारंभ खुश योग्यता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80579718643094, + 43.35988688107485 + ] + }, + "properties": { + "name": "खाना जोखिम बचाने बयान करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83223099273255, + 43.43425284429113 + ] + }, + "properties": { + "name": "प्रैक्टिस नियोक्ता को समझ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80006585484625, + 43.35132639892201 + ] + }, + "properties": { + "name": "माल क्रम भाग्य खुशियाँ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70924590877894, + 43.383011511165705 + ] + }, + "properties": { + "name": "आवाज जीत मॉडल बढ़ाना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68249560431013, + 43.35743306628053 + ] + }, + "properties": { + "name": "ऋण बादल रुको यात्रा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68774304395902, + 43.33419609182944 + ] + }, + "properties": { + "name": "नगर वृक्ष संदेह शीत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67733078337824, + 43.327826458540464 + ] + }, + "properties": { + "name": "द्वीप छल लौट विस्तार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68834955622151, + 43.431281245921824 + ] + }, + "properties": { + "name": "प्रतियोगिता कक्षा विचारी उत्कृष्ट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091257333308, + 43.43459785012007 + ] + }, + "properties": { + "name": "हन है क्या अभिनय करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67144809840102, + 43.397513621281995 + ] + }, + "properties": { + "name": "संक्षिप्त कार्ड दोष लेना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82363606504714, + 43.37710068801484 + ] + }, + "properties": { + "name": "राज्य शांति वापस पहनना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74061761816665, + 43.4212255093278 + ] + }, + "properties": { + "name": "तुम्हारा समय यत्रा दर्द" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7045488688891, + 43.36750358756782 + ] + }, + "properties": { + "name": "जाँच अंतरात्मा संघ करें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82580595102172, + 43.42392475722188 + ] + }, + "properties": { + "name": "कोण जिम्मा जीवन मिलना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77008645152546, + 43.34480018782685 + ] + }, + "properties": { + "name": "चर्म प्रबादित सीढ़ियाँ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71651166319498, + 43.34427801604752 + ] + }, + "properties": { + "name": "निरीक्षण निम्न सशक्त माता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83028376706352, + 43.39600333853026 + ] + }, + "properties": { + "name": "लियु वाचा अहा उपयुक्त" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72932534685151, + 43.32911672353392 + ] + }, + "properties": { + "name": "दबाव चांदी खरीद राजा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68036932940231, + 43.36393499520703 + ] + }, + "properties": { + "name": "ईरान ध्यान कार्यपालक बिगड़" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77298183161474, + 43.44003908109747 + ] + }, + "properties": { + "name": "संघर्ष अपराधी अनुष्ठान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81552785528402, + 43.34735681961522 + ] + }, + "properties": { + "name": "बुद्ध वर्षा वायु अद्भुत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78578499835658, + 43.41906317070564 + ] + }, + "properties": { + "name": "सुगंधित खेत लोहा नियंत्रण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78354709597988, + 43.368113417254776 + ] + }, + "properties": { + "name": "कर दाएँ भाग पहनना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82797590542668, + 43.35143064769927 + ] + }, + "properties": { + "name": "कला पीठ घास पैर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79055192707074, + 43.43537476712199 + ] + }, + "properties": { + "name": "सार्वजनिक बुराई ब्लॉक साहसी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70654512079273, + 43.41147087462913 + ] + }, + "properties": { + "name": "प्राप्त शराब द्वीप संरक्षित" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68733618863007, + 43.41836228588271 + ] + }, + "properties": { + "name": "आवास शक्तिशाली बंदर शीतल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7154416231333, + 43.33529886942282 + ] + }, + "properties": { + "name": "हृदय धन प्रमाण प्रिंट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73493527274877, + 43.370844496181796 + ] + }, + "properties": { + "name": "सिंहासन मंजिल दृश्य दर्शन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73770378945937, + 43.39088303970504 + ] + }, + "properties": { + "name": "छोटे भाई वस्त्र और भुगतान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83211159305392, + 43.32846502905939 + ] + }, + "properties": { + "name": "बर्गर धीमा यूरो सुनने" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68908894596007, + 43.44014380512324 + ] + }, + "properties": { + "name": "खतरनाक व्यवस्था अंधकार बहन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6902922126892, + 43.403538514368456 + ] + }, + "properties": { + "name": "परिचय बिगड़ आराध्य योग्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76141611184084, + 43.36152240176037 + ] + }, + "properties": { + "name": "क्रम संवाद अवलोकन प्रकाश" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67547588081197, + 43.34877423379756 + ] + }, + "properties": { + "name": "प्रकट शाश्वत रस वन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74561868818364, + 43.40177322844116 + ] + }, + "properties": { + "name": "संरचना क्षेत्र रेल नियंत्रण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82147468187486, + 43.345501872146336 + ] + }, + "properties": { + "name": "नौका मछली विभाजन समुंद्र" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72331018618115, + 43.41869149001808 + ] + }, + "properties": { + "name": "शुभ घटना गठन केनेडी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81418024432423, + 43.39045046575978 + ] + }, + "properties": { + "name": "मापन हार घर भाग्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69068592136318, + 43.3685438560169 + ] + }, + "properties": { + "name": "विघटन ताप किला स्त्री" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83747349864097, + 43.32783583160479 + ] + }, + "properties": { + "name": "प्रतिष्ठा उद्धारण बंदूक अभाव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66638697581311, + 43.38651479270904 + ] + }, + "properties": { + "name": "मल्टीकलर मौजूदा यात्रा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73073327718703, + 43.39856744262681 + ] + }, + "properties": { + "name": "मां के दोस्त मानक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74104845728016, + 43.38961856762863 + ] + }, + "properties": { + "name": "भी गुस्सा डेट छाया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7539775992791, + 43.37962584070818 + ] + }, + "properties": { + "name": "डर बाकी जगह छोड़ना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67308167308965, + 43.440433177549636 + ] + }, + "properties": { + "name": "रहस्य धन्यवाद मिलने" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68724650885542, + 43.3438023389739 + ] + }, + "properties": { + "name": "चिंता सौभाग्य वितरण घंटी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6690021588247, + 43.3604969931925 + ] + }, + "properties": { + "name": "कविता गुफा नृत्य टिकट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77503168804014, + 43.415001819151854 + ] + }, + "properties": { + "name": "नुकसान ध्यान बड़ा जुदा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79229079700326, + 43.41771721089227 + ] + }, + "properties": { + "name": "पोर्ट परीक्षण हूड लिखा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75545867980964, + 43.404726107598385 + ] + }, + "properties": { + "name": "वसंत गांव आकर्षण प्रदान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68343503303822, + 43.32628692794371 + ] + }, + "properties": { + "name": "पूजा बंदर वर्षा उपयोग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7017168198081, + 43.408124296254805 + ] + }, + "properties": { + "name": "सभा पति लौटना भोजन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75177113079917, + 43.40327950333013 + ] + }, + "properties": { + "name": "अतिरिक्त समानता हार देना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70633448491662, + 43.33353916165031 + ] + }, + "properties": { + "name": "प्रेम विवाह सहायक अर्थवाद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80796698838185, + 43.38855809467828 + ] + }, + "properties": { + "name": "निर्देशक विष और उपचार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71316371386729, + 43.40035203701606 + ] + }, + "properties": { + "name": "अद्वितीय सामग्री नष्ट करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73512074699465, + 43.39091219011503 + ] + }, + "properties": { + "name": "लेख गुम शब्द सुरक्षा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091237096005, + 43.33089437793854 + ] + }, + "properties": { + "name": "चयन खोज प्लांट बोर्ड" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71888919977027, + 43.37203728663009 + ] + }, + "properties": { + "name": "लेवी सिगरेट समझ नाराज" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6680803788322, + 43.4500067687054 + ] + }, + "properties": { + "name": "टापू अलेक्जेंडर बेचना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66925720953805, + 43.372341602453425 + ] + }, + "properties": { + "name": "बम लुक्समी आराम गढ़ी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66882286164855, + 43.423630694619916 + ] + }, + "properties": { + "name": "बगीचा माशरफ उधार राजा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77390029854541, + 43.445009580661186 + ] + }, + "properties": { + "name": "निषेध अंधकार बागी गीत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71985438791216, + 43.398099248509034 + ] + }, + "properties": { + "name": "बचना बढ़त बुआई ननंद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74294883903804, + 43.4173240632121 + ] + }, + "properties": { + "name": "बचाने दाँत पट्टी शीर्षक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66689798156858, + 43.34124127734229 + ] + }, + "properties": { + "name": "गोला गाँव बजाना व्यायाम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75171381658947, + 43.39159204675984 + ] + }, + "properties": { + "name": "दबाव दादी लेख मुंह" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81096888891352, + 43.42308178495851 + ] + }, + "properties": { + "name": "गैलरी बदलना आधार गुफा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73965294263871, + 43.40406594519991 + ] + }, + "properties": { + "name": "मोड़ टैंक निर्देशिका कागज़" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72554678621145, + 43.37774074563721 + ] + }, + "properties": { + "name": "सभी प्रशिक्षण आदर्श जगह" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67178856070768, + 43.389572230853304 + ] + }, + "properties": { + "name": "सिल्क फ्लिप बांधने किला" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66509793278783, + 43.41061135866706 + ] + }, + "properties": { + "name": "मौन पकड़ नाटक विशेषज्ञ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73326538252331, + 43.44230808801419 + ] + }, + "properties": { + "name": "हड्डी आगंतुक गिटार गाना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.763294657595, + 43.42569076002226 + ] + }, + "properties": { + "name": "स्टोर भूत अध्ययन इच्छा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70805275051043, + 43.33022223454242 + ] + }, + "properties": { + "name": "साड़ी खतरा जाल पापा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80356155228401, + 43.35448684283324 + ] + }, + "properties": { + "name": "विस्तार कवर खिलाड़ी स्थिर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71671550436804, + 43.358590543375485 + ] + }, + "properties": { + "name": "भूल अरब छुट्टी चेला" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79930692168546, + 43.44009080139547 + ] + }, + "properties": { + "name": "मांग मार्ग जीतना मज़ा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79587187411107, + 43.353732548898144 + ] + }, + "properties": { + "name": "गोला चाकू आगंतुक बर्फबारी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79719578990535, + 43.37696041213408 + ] + }, + "properties": { + "name": "खोखले खेल खिड़की जाग्रत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69965497394605, + 43.36639187084689 + ] + }, + "properties": { + "name": "पत्नी पार खरीद बंदूक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7921343910175, + 43.39881694771324 + ] + }, + "properties": { + "name": "मेहनत आराम बाघ मार्ग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72017632396182, + 43.38361317683319 + ] + }, + "properties": { + "name": "उत्पीड़न स्वच्छ भाई त्वरित" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68359785932444, + 43.34831766076865 + ] + }, + "properties": { + "name": "सेट व्यापार मेस घाट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81414767105343, + 43.40958963502256 + ] + }, + "properties": { + "name": "पुलिंदा रिकॉर्ड अधिकार खेल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80253128177446, + 43.36605742276838 + ] + }, + "properties": { + "name": "मुद्दा उत्तेजना दिलाने छोड़ना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70089574338908, + 43.44275792279891 + ] + }, + "properties": { + "name": "काम कुमारी मिलते स्वाद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83317739247832, + 43.442243183384164 + ] + }, + "properties": { + "name": "धीरे गुफा फिरकने दीपक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67721696102126, + 43.42843016937564 + ] + }, + "properties": { + "name": "सूजी ज्ञान संदर्भ लाल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71723432403815, + 43.36649527257002 + ] + }, + "properties": { + "name": "एजेंसी गोद वनस्पति शुद्ध" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69481568423726, + 43.40301142667125 + ] + }, + "properties": { + "name": "गर्मी सहिष्णु पृष्ठ निर्माण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68468959578695, + 43.35720648266311 + ] + }, + "properties": { + "name": "कट ज़ेंदाब प्रिय वू" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72149391956373, + 43.361699359813706 + ] + }, + "properties": { + "name": "उद्घाटन भरपूर दास रौशनी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70660354920619, + 43.38448871648363 + ] + }, + "properties": { + "name": "रंग बढ़ावा क्रोध नृत्य गोल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76299651747377, + 43.35074913433199 + ] + }, + "properties": { + "name": "पागलता क़दम परिवार बचा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77539316698676, + 43.39435306815789 + ] + }, + "properties": { + "name": "शरद कृषि भट्ट विश्वास" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71830531729574, + 43.35119394975593 + ] + }, + "properties": { + "name": "यूनिवर्सिटी महाजन बेंद नष्ट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81118685367528, + 43.37563814779732 + ] + }, + "properties": { + "name": "बढ़ाने मसाज बंधु मो" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79642660311492, + 43.377657505705734 + ] + }, + "properties": { + "name": "दुख थप्पड़ मालिक हार्डवेयर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7888253988358, + 43.337163828964385 + ] + }, + "properties": { + "name": "मेजबान कीटनाशक पाश रोक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70485407817159, + 43.42571907384735 + ] + }, + "properties": { + "name": "आदेश रंग आयोजन राक्षस" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66969568481909, + 43.35045513475347 + ] + }, + "properties": { + "name": "संघर्ष यातायात विरोध बहन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66930716449406, + 43.44367042306718 + ] + }, + "properties": { + "name": "लहर मुद्रा आवाज़ नीला" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69189873670894, + 43.43076512052666 + ] + }, + "properties": { + "name": "विशिष्ट यजमान टेबल लाल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79353235204508, + 43.37368059280777 + ] + }, + "properties": { + "name": "लेई यात्रा अनुवाद कार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70219104390617, + 43.33231431216638 + ] + }, + "properties": { + "name": "दही दूरी अभिनय संकेत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76689379197433, + 43.36916089976166 + ] + }, + "properties": { + "name": "उत्साह स्पर्श पाठशाला रोना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82121823517355, + 43.3890494143254 + ] + }, + "properties": { + "name": "समझें दीवार हमला दंड" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83471876958811, + 43.40298009860645 + ] + }, + "properties": { + "name": "योद्धा बिल जुगाड़ बाएं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79381721196569, + 43.43790173544968 + ] + }, + "properties": { + "name": "हानिकारक अद्भुत मैन फ़्लो" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78649372015207, + 43.36341720491033 + ] + }, + "properties": { + "name": "आदत हर मुला छोड़ा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78560735030351, + 43.44361961433385 + ] + }, + "properties": { + "name": "सवारी प्रशंसा वर्ण मोटा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75079314695358, + 43.33861416363164 + ] + }, + "properties": { + "name": "समुद्र अवरोध संदेश चेतावनी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74953762736641, + 43.40607632034917 + ] + }, + "properties": { + "name": "प्रकट ईश्वर वायु युद्ध" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74238703575702, + 43.35555088566464 + ] + }, + "properties": { + "name": "चित्र धोना मारा रहस्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83816796506198, + 43.41942390467601 + ] + }, + "properties": { + "name": "दर्पण गायन तंत्रिक स्वर्ग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81616133746593, + 43.350962266236195 + ] + }, + "properties": { + "name": "वह रोग नकल झुकाव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79219311701308, + 43.387858965559424 + ] + }, + "properties": { + "name": "कार्ड उलझन चिड़ी फिराक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66780267369268, + 43.36965922024568 + ] + }, + "properties": { + "name": "सब्जी बंद कार्यों वापसी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76678459362029, + 43.41517258008821 + ] + }, + "properties": { + "name": "आँसू चाय दोस्त प्रसारण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80142993141635, + 43.341730907669636 + ] + }, + "properties": { + "name": "उद्घाटन मोर मौसम जादू" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77921260855874, + 43.421873232284376 + ] + }, + "properties": { + "name": "कुत्ते की बींबीआई चुराना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83144706066832, + 43.36621272347986 + ] + }, + "properties": { + "name": "मोती कीट ठहराने योग्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70722008394114, + 43.35038684779588 + ] + }, + "properties": { + "name": "ऐ ब्रिज झिलमिलाना नफरत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79020734973255, + 43.33479279298051 + ] + }, + "properties": { + "name": "प्रस्तावना शीतल भाई बहुत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67291568124347, + 43.43540548255966 + ] + }, + "properties": { + "name": "अधिक लुभ खाद्य संकुचित" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82768299138934, + 43.36836454991645 + ] + }, + "properties": { + "name": "समूह व्यास सुसंवाद बैग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75399246803045, + 43.418397519140655 + ] + }, + "properties": { + "name": "बूढ़ा जाल वरलाम्ब नृत्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74220063622761, + 43.35676855353936 + ] + }, + "properties": { + "name": "प्रतिबिम्ब विभाजित तैत अलग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67156749173591, + 43.32753321179319 + ] + }, + "properties": { + "name": "तीक्ष्ण भक्त संघर्ष अस्त" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7337656762229, + 43.362393286271406 + ] + }, + "properties": { + "name": "मूल्यांकन असम संवाद सम्पूर्ण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72030044521398, + 43.382476256772236 + ] + }, + "properties": { + "name": "मना रुपिया याद नाक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7526464325656, + 43.436104808005915 + ] + }, + "properties": { + "name": "उल्लास बकरी मौन तौल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71485882023808, + 43.429619924972954 + ] + }, + "properties": { + "name": "गर्भ शून्य अधिवास डिजिट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75909970307748, + 43.330400132266675 + ] + }, + "properties": { + "name": "हेरफेर मानसिकता आपदा बवंडर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81135682893091, + 43.42006743640997 + ] + }, + "properties": { + "name": "टांग दिल जिन्दगी वादा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67022303291196, + 43.35877085029656 + ] + }, + "properties": { + "name": "मन उद्घाटन शक्ति भगवान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73190488058117, + 43.36210649884719 + ] + }, + "properties": { + "name": "क्रम जाम प्रियतम देखो" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79749258159609, + 43.43829648566227 + ] + }, + "properties": { + "name": "वृत्ति स्पर्श असर ढेर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81412739294592, + 43.42486673759098 + ] + }, + "properties": { + "name": "स्पर्श जहाज धीमा वाहन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73942862821696, + 43.41857560346666 + ] + }, + "properties": { + "name": "अवसर जारी उद्घाटन दीवार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73194496367705, + 43.36236970705654 + ] + }, + "properties": { + "name": "राजकुमार घूमने कोयल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77277965716348, + 43.42795996100599 + ] + }, + "properties": { + "name": "उठा अंडा प्रातः आवाज़" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79677774850097, + 43.386918730187254 + ] + }, + "properties": { + "name": "मुर्गा दोगुना कद्दू डिफ़ेंस" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7755677565865, + 43.41930911043181 + ] + }, + "properties": { + "name": "कप दिलाना रोड लॉन्च" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83969235862696, + 43.40300089042435 + ] + }, + "properties": { + "name": "डॉक्टर गुलाम अस्पष्ट कंधे" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79056823232804, + 43.36644340374012 + ] + }, + "properties": { + "name": "संकेत झंडा गण स्थिर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79024794978068, + 43.450759361929514 + ] + }, + "properties": { + "name": "कट्टा लूटना गैर उम्र" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7960531583467, + 43.42912547125532 + ] + }, + "properties": { + "name": "बीम आवाज़ अध्ययन सुताना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71188677769896, + 43.40578991754939 + ] + }, + "properties": { + "name": "आकाश चाचा पत्थर संकेत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80973210979664, + 43.405074830026 + ] + }, + "properties": { + "name": "फिसलना हाथ सूखना लौटना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83094842280389, + 43.383506992650275 + ] + }, + "properties": { + "name": "कुआँ पौरा नमकीन पोंप" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68880786616319, + 43.4408736919135 + ] + }, + "properties": { + "name": "शांति विघ्न उपस्थित विस्तार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83637982623713, + 43.37932687230065 + ] + }, + "properties": { + "name": "मुकाबला हर चौड़ा बोन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7120551129583, + 43.38478419358865 + ] + }, + "properties": { + "name": "शेष खजूर गाली सजा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79655496709165, + 43.353914671185876 + ] + }, + "properties": { + "name": "द्रावण संख्या बॉक्स मनोरम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82183396335495, + 43.34951148058995 + ] + }, + "properties": { + "name": "अम्ल राजा कमर सिर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7386077853289, + 43.42153859100138 + ] + }, + "properties": { + "name": "चिंता तैरता प्रेम मेल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70073597694773, + 43.3950412068982 + ] + }, + "properties": { + "name": "डराना सही बचाने किस्सा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67738562238901, + 43.37299568230138 + ] + }, + "properties": { + "name": "कुंजी पाँच शिखर कल" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76967766127837, + 43.43523403455177 + ] + }, + "properties": { + "name": "लिव बेटी जांच ग्लाइडिंग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66711217868942, + 43.34498516856536 + ] + }, + "properties": { + "name": "कूपन संत अविन्यास" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71263407544393, + 43.44878125927471 + ] + }, + "properties": { + "name": "तेजः सर्वोद्यमिनी आत्मा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81736193811139, + 43.3268554930083 + ] + }, + "properties": { + "name": "वृक्ष पर अंधकार घुसा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72823672941468, + 43.39913772571227 + ] + }, + "properties": { + "name": "तीर ध्वज सिक्थ निःसंस्पर्शः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80909585278732, + 43.42911070681641 + ] + }, + "properties": { + "name": "पैसे में बारिश के बाद खुशी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75079532407926, + 43.42721943663759 + ] + }, + "properties": { + "name": "संचारक सोना बहुत होता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71058457033814, + 43.367755763373076 + ] + }, + "properties": { + "name": "मार्ग पर मौसम बदलता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69298119807172, + 43.42626514840551 + ] + }, + "properties": { + "name": "भूतों में साक्षर रेगिस्टर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83650346598006, + 43.41933636859189 + ] + }, + "properties": { + "name": "किला पहुँचा आसन करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7067569578021, + 43.4410164115811 + ] + }, + "properties": { + "name": "भंडार सुनसान खुला दरवाजा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8266463758855, + 43.429931233602844 + ] + }, + "properties": { + "name": "साफ निशाना बिना गोली" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78659303223958, + 43.338321981323276 + ] + }, + "properties": { + "name": "शत्रु संप्रेरणा दुर्बलता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80639026067729, + 43.36026255177993 + ] + }, + "properties": { + "name": "नकली गर्मागर्म बग़" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68785430058597, + 43.391834351083176 + ] + }, + "properties": { + "name": "काम नकल सनक खजाना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77329479710443, + 43.331029684633386 + ] + }, + "properties": { + "name": "देखने जोकर खगोलशास्त्र" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83944140776111, + 43.36094548943541 + ] + }, + "properties": { + "name": "प्रेम नकल मात्र आवश्यक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77328811212737, + 43.39281904629793 + ] + }, + "properties": { + "name": "संकेत सेवक अनुरागी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80847732751408, + 43.37011711911654 + ] + }, + "properties": { + "name": "निष्क्रियता अधिवादन सुनाना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69083308544123, + 43.34616816533698 + ] + }, + "properties": { + "name": "फूल अविवाद मौजूद नहीं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71997028929218, + 43.39262356330771 + ] + }, + "properties": { + "name": "बादशाह पैसे जमीन पर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70795456797441, + 43.43662706130826 + ] + }, + "properties": { + "name": "ठंड भूत वानी जलती" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74983541518577, + 43.36433290673387 + ] + }, + "properties": { + "name": "सुंदर दस्तावेज़ गिरा दिया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72199664814889, + 43.399196067397874 + ] + }, + "properties": { + "name": "खुशी तोफ़ा लेने जा रहा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76282152809654, + 43.33979211362029 + ] + }, + "properties": { + "name": "बर्बादी उठा किसी भी हलात" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72295717357065, + 43.32965718674516 + ] + }, + "properties": { + "name": "करोड़पति जमीन बाध्य है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76962927584191, + 43.417191219398504 + ] + }, + "properties": { + "name": "जीत तुआने इस बॉक्स" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79867291448863, + 43.44693460246704 + ] + }, + "properties": { + "name": "भव्य तलवार संकेत स्थान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80762496150783, + 43.447198828628444 + ] + }, + "properties": { + "name": "जलवायु बॉक्स मैन कम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73700170958546, + 43.42215816219742 + ] + }, + "properties": { + "name": "दौड़ने स्थिति सीता चोर" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79048870955376, + 43.368949995240996 + ] + }, + "properties": { + "name": "समझ में नहीं आ रहा है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8255365161358, + 43.39707569876099 + ] + }, + "properties": { + "name": "पासवर्ड साझा नहीं हो सकता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67286163429799, + 43.38896639656718 + ] + }, + "properties": { + "name": "यात्रा मुम्बई तरीका सीधी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76401826500387, + 43.37508033645364 + ] + }, + "properties": { + "name": "खगोलशास्त्र खेलता है सिखाने" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77611649584469, + 43.400255751529066 + ] + }, + "properties": { + "name": "जानकारी कर्ज साथ समय" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70951490545667, + 43.33112009433672 + ] + }, + "properties": { + "name": "कैमरा तस्वीर नक्शा स्थान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7066983545883, + 43.42345908175173 + ] + }, + "properties": { + "name": "महसूस किताब साहित्य लिखा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82127073113952, + 43.339820786610595 + ] + }, + "properties": { + "name": "खुदाई साहित्य स्वर्ग निर्देश" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71675786236483, + 43.43096503945724 + ] + }, + "properties": { + "name": "ट्रेन बाइक नकली निर्देश" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78950346431157, + 43.40237228555073 + ] + }, + "properties": { + "name": "रेडियो चैनल समाचार ब्रोडकास्ट" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75258281784954, + 43.390836247816566 + ] + }, + "properties": { + "name": "अपना बच्चा खुशी खेलता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76638218213247, + 43.32741343188597 + ] + }, + "properties": { + "name": "समय क्रिकेट मैच देखता है" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72154484965267, + 43.45222086361347 + ] + }, + "properties": { + "name": "बच्चा अध्यापक शिक्षिका पाठयक्रम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76627772335996, + 43.437491216616706 + ] + }, + "properties": { + "name": "स्थिति जानकारी जनसंख्या बच्चा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73925198284087, + 43.44218709248913 + ] + }, + "properties": { + "name": "पुलिस आपत्कालीन आपदा आपत्कालीन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77499563521542, + 43.418523278482645 + ] + }, + "properties": { + "name": "जीवन स्टाइल जीवन जीवन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8169860967655, + 43.384473967748534 + ] + }, + "properties": { + "name": "मित्रता मित्र साथी जन्मदिन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78032431371867, + 43.446660440194194 + ] + }, + "properties": { + "name": "मान्यता पर्व खरीदारी दिन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71753936465939, + 43.45285380044917 + ] + }, + "properties": { + "name": "रोज़गार नौकरी कार्य नियोक्ता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69263196333395, + 43.419665985695886 + ] + }, + "properties": { + "name": "अपवाद अवधि समय बच्चा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70765474537438, + 43.42017682128563 + ] + }, + "properties": { + "name": "मौके स्थान ब्रेक आवश्यक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69765841770732, + 43.33820610443803 + ] + }, + "properties": { + "name": "सामर्थ्य परीक्षा डॉक्टर आदेश" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82267605236211, + 43.42357169093535 + ] + }, + "properties": { + "name": "सुझाव सुझाव लिखित संकेत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73336307802492, + 43.42297002833131 + ] + }, + "properties": { + "name": "प्रक्रिया संपूर्ण संगठन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83811908518328, + 43.33925460912034 + ] + }, + "properties": { + "name": "संग्रह संगठन कला रूप" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73171881207145, + 43.354563903522724 + ] + }, + "properties": { + "name": "पुराना दस्तावेज़ डिज़ाइन संगठन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6961362492757, + 43.35411874665983 + ] + }, + "properties": { + "name": "निगम काम नगर मुख्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68661836305637, + 43.36823198552959 + ] + }, + "properties": { + "name": "कार्य क्रिया काम आदेश" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83961700277996, + 43.3510427803368 + ] + }, + "properties": { + "name": "समय खेलना अधिकार कानून" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74947187088583, + 43.39389891860199 + ] + }, + "properties": { + "name": "समर्थन समर्थक संगठन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72910695071641, + 43.36486528376062 + ] + }, + "properties": { + "name": "समाज अच्छा अधिक" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69754557797296, + 43.39387045930845 + ] + }, + "properties": { + "name": "भूमि विश्वास क्रम अच्छा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73710033565021, + 43.384584096889725 + ] + }, + "properties": { + "name": "खरीदने किताब खरीदार संगठन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68689162255396, + 43.36871487059363 + ] + }, + "properties": { + "name": "सहायक शाखा समर्थक संगठन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7994804315831, + 43.33013942649552 + ] + }, + "properties": { + "name": "समाचार संगठन प्रेस विज्ञापन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7988314518434, + 43.39336940273254 + ] + }, + "properties": { + "name": "सदस्य संगठन प्रमुख अधिकारी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71307712205453, + 43.41174462631271 + ] + }, + "properties": { + "name": "संस्थान संसाधन विचार करना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72580987651236, + 43.38478891558823 + ] + }, + "properties": { + "name": "मॉडल मौखिक तस्वीर खूबी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7036186715095, + 43.41690955477799 + ] + }, + "properties": { + "name": "व्यक्ति व्यक्तिगत जन्म दिन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76149458704094, + 43.367965367570484 + ] + }, + "properties": { + "name": "सुनाने दिखाने उपहार स्थान" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8058814547212, + 43.403167911414506 + ] + }, + "properties": { + "name": "परिपत्र सिखाने प्राथमिकता खुदाई" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71361559233537, + 43.376334729032095 + ] + }, + "properties": { + "name": "साथी सहायक सहयोगी पाठयक्रम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73154162252649, + 43.38490610787597 + ] + }, + "properties": { + "name": "ज्यों चाहें खुदाई समय" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79186204272446, + 43.376665125080876 + ] + }, + "properties": { + "name": "पूर्वाग्रह यात्रा लड़का जुगाड़" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6661296359971, + 43.452468442692734 + ] + }, + "properties": { + "name": "महत्वपूर्ण प्रवृत्ति साक्षरता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7616259928136, + 43.44408598398389 + ] + }, + "properties": { + "name": "तवायफ़ रिश्ता आमंत्रण लिखित" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78766358344183, + 43.37143374956189 + ] + }, + "properties": { + "name": "बदल बदलने के लिए किताब" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68890499690951, + 43.44979275747692 + ] + }, + "properties": { + "name": "नफ़रत अर्थ निवासी जगह" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67281208362147, + 43.3973497257669 + ] + }, + "properties": { + "name": "विद्यां शीलं दृढ़तमाना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71588028401948, + 43.442055130438646 + ] + }, + "properties": { + "name": "समुद्र की लहरें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71721666322901, + 43.32562249083662 + ] + }, + "properties": { + "name": "सूर्य की किरणें" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67841066689653, + 43.34185192725603 + ] + }, + "properties": { + "name": "प्रेम और सौंदर्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73531620540507, + 43.36415708253743 + ] + }, + "properties": { + "name": "ध्यान और शांति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72425220806053, + 43.351560221312894 + ] + }, + "properties": { + "name": "स्वास्थ्य और खुशी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68594161715737, + 43.409583613235085 + ] + }, + "properties": { + "name": "सृजनात्मकता और आलस्य" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73655883818446, + 43.33441638119229 + ] + }, + "properties": { + "name": "संगीत और संवाद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6752721298426, + 43.32966752267923 + ] + }, + "properties": { + "name": "मनोबल और साहस" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6904923700813, + 43.327341256271836 + ] + }, + "properties": { + "name": "अनुशासन और समर्पण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78054278610125, + 43.394614279098086 + ] + }, + "properties": { + "name": "समृद्धि और सफलता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74335729998438, + 43.40451717893259 + ] + }, + "properties": { + "name": "समाज सेवा और समर्थन" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7569937171229, + 43.44689633183004 + ] + }, + "properties": { + "name": "धर्म और नैतिकता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8360965058364, + 43.40171500153021 + ] + }, + "properties": { + "name": "स्वतंत्रता और समर्पण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71513986618811, + 43.43457019529001 + ] + }, + "properties": { + "name": "कल्पना और विचार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7952919780746, + 43.44165282752506 + ] + }, + "properties": { + "name": "समृद्धि और सुख" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68173948092863, + 43.44800154193802 + ] + }, + "properties": { + "name": "ज्ञान और सद्गुण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81701665551464, + 43.389228319829925 + ] + }, + "properties": { + "name": "स्वयंशक्ति और स्वीकृति" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77895341666135, + 43.394861202037575 + ] + }, + "properties": { + "name": "अभिमान और उत्कृष्टता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75351540071551, + 43.4219368264491 + ] + }, + "properties": { + "name": "साझा और सहयोग" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81052088748493, + 43.424322611524985 + ] + }, + "properties": { + "name": "साहस और सफलता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69578376327627, + 43.37844309252077 + ] + }, + "properties": { + "name": "आत्म-संतोष और परिश्रम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78368098309056, + 43.388133327996385 + ] + }, + "properties": { + "name": "आत्म-विश्वास और साहस" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70213684589817, + 43.400458123228596 + ] + }, + "properties": { + "name": "साहस और संवाद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75735508441994, + 43.33521557571769 + ] + }, + "properties": { + "name": "स्नान और शुद्धता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7165813035499, + 43.449836563440115 + ] + }, + "properties": { + "name": "मनोबल और उत्कृष्टता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67118947948529, + 43.32648454903178 + ] + }, + "properties": { + "name": "समर्पण और प्रेम" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73583864324974, + 43.40494189377406 + ] + }, + "properties": { + "name": "शांति और आनंद" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7592708719767, + 43.37376037403405 + ] + }, + "properties": { + "name": "समृद्धि और सफलता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81937170824858, + 43.42605432516992 + ] + }, + "properties": { + "name": "स्वतंत्रता और समर्पण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82074352007112, + 43.36580652869758 + ] + }, + "properties": { + "name": "समर्थन और साझा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7436711727496, + 43.372504265635634 + ] + }, + "properties": { + "name": "सान्त्वना और प्यार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67000504535372, + 43.38201541721379 + ] + }, + "properties": { + "name": "आत्म-प्रेम और साहस" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77440106794256, + 43.37650136295896 + ] + }, + "properties": { + "name": "संगीत और खुशी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68061636193306, + 43.33728440664312 + ] + }, + "properties": { + "name": "समृद्धि और सफलता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66503257911336, + 43.38062935022041 + ] + }, + "properties": { + "name": "समर्थन और साझा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70403178494416, + 43.36877483548238 + ] + }, + "properties": { + "name": "सान्त्वना और प्यार" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75963805364609, + 43.40329643349728 + ] + }, + "properties": { + "name": "जयालवी शक्तिः यत्रा" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67318084901217, + 43.42404258860719 + ] + }, + "properties": { + "name": "मृगाधारिता ग्रामस्थिता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7664044443527, + 43.43862549454096 + ] + }, + "properties": { + "name": "स्मृतितटामर्जन्ययोः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76699292336798, + 43.37550577167776 + ] + }, + "properties": { + "name": "पङ्कोपस्थानवालः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73291945020628, + 43.3674976351091 + ] + }, + "properties": { + "name": "विविधदत्तसम्भाषण" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80291150700305, + 43.3459863032626 + ] + }, + "properties": { + "name": "अपहरणादिभिः पाणिभिः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67799156621277, + 43.336989953022176 + ] + }, + "properties": { + "name": "जडान्तद्विच्छायिनः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75967314468016, + 43.44864855947221 + ] + }, + "properties": { + "name": "लिप्साबंधनचेलः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77895542262922, + 43.37606635807544 + ] + }, + "properties": { + "name": "आह्वानपरितापत" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74354294751629, + 43.401586326632675 + ] + }, + "properties": { + "name": "कण्ठगतजलेच्छया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71739241962405, + 43.32949392714524 + ] + }, + "properties": { + "name": "व्यवस्थानवायुधाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78738846011674, + 43.347806614069704 + ] + }, + "properties": { + "name": "तनुमातृकृपालुकः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68105058004221, + 43.384474385118985 + ] + }, + "properties": { + "name": "लक्ष्यविच्छिन्नमनाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74292700712704, + 43.43924277428903 + ] + }, + "properties": { + "name": "प्रियजनयात्रयः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72330992960815, + 43.44448236676838 + ] + }, + "properties": { + "name": "रचितवरदण्डपाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80374649087389, + 43.423236258780996 + ] + }, + "properties": { + "name": "यूथःक्षोभयांकितः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7843960910941, + 43.37735348316894 + ] + }, + "properties": { + "name": "पर्यवस्यत्सरोगभृत्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77111562727168, + 43.377397868656345 + ] + }, + "properties": { + "name": "यतिप्राणमृतोरगः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75822663806775, + 43.403893701294244 + ] + }, + "properties": { + "name": "क्षीणसाधूतपण्डितः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76760909818859, + 43.365752206325446 + ] + }, + "properties": { + "name": "हंसच्चित्ताभिप्लुतः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67688920728415, + 43.35171094097246 + ] + }, + "properties": { + "name": "वक्ष्याम्यर्थदर्शनः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81636243364756, + 43.37912531315445 + ] + }, + "properties": { + "name": "मणिप्रस्थानमव्ययः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76577508596074, + 43.34670065336113 + ] + }, + "properties": { + "name": "पुर्यायुषा वदत्यश्वः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6734781883506, + 43.339763982233066 + ] + }, + "properties": { + "name": "चुरुकूटकर्णध्वनिः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67229678701096, + 43.37951866037416 + ] + }, + "properties": { + "name": "अङ्कदर्पणादिशोऽस्मि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67370422785643, + 43.33477495020771 + ] + }, + "properties": { + "name": "रूपाणितादिव्यञ्जनैः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72454219260635, + 43.38020083184419 + ] + }, + "properties": { + "name": "आचार्यस्य प्रियाणि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8127777939444, + 43.33011026808491 + ] + }, + "properties": { + "name": "मुञ्चन्मुक्तवाससः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82476845378096, + 43.345917052691725 + ] + }, + "properties": { + "name": "धान्याद्धूमधुपाः खलः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79458199273176, + 43.37007854115475 + ] + }, + "properties": { + "name": "सर्पदुःखमहाकुली" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77530815590762, + 43.3745956095525 + ] + }, + "properties": { + "name": "अवल्गुष्टप्रमाणभृत्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81943466645043, + 43.38442804867082 + ] + }, + "properties": { + "name": "योगिस्तव सतां गतिः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7111729135977, + 43.41659485703934 + ] + }, + "properties": { + "name": "सिंहस्योत्पादकल्पिता" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81519536270207, + 43.35551688679179 + ] + }, + "properties": { + "name": "आदिकवचनोद्धृतः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80141816757077, + 43.373296346452975 + ] + }, + "properties": { + "name": "भाग्यप्राप्ताः सर्वेऽपि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73913970139529, + 43.36766474919193 + ] + }, + "properties": { + "name": "शूराणाम्बूविशोधकः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68861229532558, + 43.447177904904464 + ] + }, + "properties": { + "name": "चरण्याचरणापहारी" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70887924537146, + 43.36989440125427 + ] + }, + "properties": { + "name": "ज्येष्ठाद्यापकः सौभाग्यः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72727783404389, + 43.43862238253905 + ] + }, + "properties": { + "name": "बण्डकदूषकस्थले" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80459063938179, + 43.337120260313164 + ] + }, + "properties": { + "name": "अज्ञानेनाम्बुजेत्रयात्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76679035695634, + 43.335932458145194 + ] + }, + "properties": { + "name": "क्षिप्तसिन्धुपरिणामयः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6765199485153, + 43.33916485424814 + ] + }, + "properties": { + "name": "होडयन्तीतरचञ्चुपः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80245708208167, + 43.40137212585799 + ] + }, + "properties": { + "name": "उद्वेलत्कर्णविद्रुमैः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77978667389289, + 43.32653195985271 + ] + }, + "properties": { + "name": "रोषदष्ट्युन्मारणोत्सुकः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83554141642708, + 43.36208645578587 + ] + }, + "properties": { + "name": "सन्देहपितृसंस्मरणः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78226428764992, + 43.45214674512842 + ] + }, + "properties": { + "name": "प्रज्ञाविशेषातिनीतः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68707804799033, + 43.389474442588785 + ] + }, + "properties": { + "name": "आपन्नासंशयो दुःखान्तः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80216082023526, + 43.35618116364861 + ] + }, + "properties": { + "name": "मन्येत महतां यया" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70300949696957, + 43.338949270378016 + ] + }, + "properties": { + "name": "मोहयति अपि नीतिम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68015060855032, + 43.40296808063941 + ] + }, + "properties": { + "name": "लक्ष्मीतटस्थिता श्रीः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68989328476619, + 43.39232508258088 + ] + }, + "properties": { + "name": "अलिकरक्तयोः शृङ्गाराः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71598403078042, + 43.38262581866229 + ] + }, + "properties": { + "name": "फितोऽन्तर्गतमार्गाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71912615539532, + 43.452016174114505 + ] + }, + "properties": { + "name": "लक्ष्मणोत्तरयोः पुत्रः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74577920821866, + 43.36541829164119 + ] + }, + "properties": { + "name": "यज्ञशान्तिहेतवे" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72712613526619, + 43.39671896203547 + ] + }, + "properties": { + "name": "हर्षभर्तृस्वपितृकृद्धाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70664604422745, + 43.34278992771991 + ] + }, + "properties": { + "name": "मृगप्रायाः सुते विना" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68493815003421, + 43.39354964761166 + ] + }, + "properties": { + "name": "सुकुमारकलाहंसनिष्ठाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75455462754235, + 43.36155500394566 + ] + }, + "properties": { + "name": "सद्गुणान्विताः प्रमुञ्च" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77873016450667, + 43.366122899933224 + ] + }, + "properties": { + "name": "चातकाः कालकोटिकाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80791232048796, + 43.33394744370124 + ] + }, + "properties": { + "name": "सगोचरबहिरप्लुताः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6997965679875, + 43.40806371864969 + ] + }, + "properties": { + "name": "आकर्षयितुकामोऽयं" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66838019631632, + 43.35606605074788 + ] + }, + "properties": { + "name": "दिनद्वयमुदाहरेत्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7069571753982, + 43.34266177851345 + ] + }, + "properties": { + "name": "सज्जनानां मुदास्तु नः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71273809195645, + 43.35495186858789 + ] + }, + "properties": { + "name": "कल्याणगणगन्धर्वणः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73519729235159, + 43.4163297000404 + ] + }, + "properties": { + "name": "स्निग्धवेणुमृदुद्विगुः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71910739744908, + 43.45181104214278 + ] + }, + "properties": { + "name": "मूढमूर्खकुलब्रह्मण्याः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72594206510075, + 43.33440744203501 + ] + }, + "properties": { + "name": "लाक्षासर्पकिशोरिकाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69001132062567, + 43.36003830098169 + ] + }, + "properties": { + "name": "चापरिकास्पष्टचापलाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76804370175068, + 43.37362703079163 + ] + }, + "properties": { + "name": "ब्राह्मणास्तेषु च नाप्यम्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77043742133355, + 43.325828830544545 + ] + }, + "properties": { + "name": "आज्यद्रव्यसंस्थितः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66452596219278, + 43.377082454312294 + ] + }, + "properties": { + "name": "अक्षिप्तप्रायः स निध्यात्" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78052164197288, + 43.39882235229331 + ] + }, + "properties": { + "name": "श्रुतिप्रमाणनिष्प्रमाः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74768201610368, + 43.34347333416988 + ] + }, + "properties": { + "name": "यदीयः सुतनामयः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77257029502562, + 43.353659062164375 + ] + }, + "properties": { + "name": "सर्वगुणसंपद्यैव" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82229997433387, + 43.36602478810474 + ] + }, + "properties": { + "name": "युष्मादर्शितवैदिकः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77697418935259, + 43.39302377957722 + ] + }, + "properties": { + "name": "मूर्ध्नि चापबाणमाला" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82932283412902, + 43.344460090153106 + ] + }, + "properties": { + "name": "आत्मा ब्रह्म च सर्वतः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75834764860247, + 43.43886099129135 + ] + }, + "properties": { + "name": "असन्मादाविशेषोऽप्यहः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71397262576284, + 43.43847474002368 + ] + }, + "properties": { + "name": "अस्योत्कृष्टगुणोपेतः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78490097957456, + 43.41708495277058 + ] + }, + "properties": { + "name": "कुसुमक्रियासर्वाणि" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82596603943784, + 43.37280499147228 + ] + }, + "properties": { + "name": "मानिनो मनुनो मन्त्राः" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80376452461223, + 43.41299359444341 + ] + }, + "properties": { + "name": "क्रोशतु क्षितिकोणे।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73771479115749, + 43.38964563062126 + ] + }, + "properties": { + "name": "अश्मानं स्पृशतु वारिः।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77914081236031, + 43.36200438697811 + ] + }, + "properties": { + "name": "पङ्क्तिस्पर्शनं ददातु।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6885010122187, + 43.3536150480067 + ] + }, + "properties": { + "name": "संशयात्मनं निगच्छति।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6809883295955, + 43.4279302964151 + ] + }, + "properties": { + "name": "अनावरणात्मकः स्वप्नः।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66638088219406, + 43.356600228775875 + ] + }, + "properties": { + "name": "प्रेमं प्रेषयते क्षिप्रम्।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81508020435649, + 43.44503598067335 + ] + }, + "properties": { + "name": "सर्वं सर्पति सर्वत्र।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80562566482058, + 43.441746093418764 + ] + }, + "properties": { + "name": "वायुं निरीक्ष्य चिन्तयेत्।" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69680728921867, + 43.37119072206014 + ] + }, + "properties": { + "name": "पर्वन्यायात्प्रमद्यते।" + } + } + ] +} diff --git a/metrics/integration/data/khmer.geojson b/metrics/integration/data/khmer.geojson new file mode 100644 index 000000000000..d8c9de4e9e6c --- /dev/null +++ b/metrics/integration/data/khmer.geojson @@ -0,0 +1,11211 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73270889049581, + 43.41627085800398 + ] + }, + "properties": { + "name": "រាត្រីខ្លាចមិនដំឡើង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76298169713937, + 43.44261374841698 + ] + }, + "properties": { + "name": "ក្នុងមនុស្សមានពួកគេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73750788686539, + 43.42129081598136 + ] + }, + "properties": { + "name": "នេះគ្រប់គ្រងបែបបុក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68983653183295, + 43.36893537983959 + ] + }, + "properties": { + "name": "នៅតំបន់ក្រុងនិងរាជរដូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78480371728801, + 43.385713038402734 + ] + }, + "properties": { + "name": "នៅទីនេះដោយនិយាយពេលដែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82444442057749, + 43.3981364143174 + ] + }, + "properties": { + "name": "ត្រូវកើតឡើងសម្រាប់ជួរក្រសួង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73178458119855, + 43.42150465372435 + ] + }, + "properties": { + "name": "ក្នុងរយៈពេលបីនាទី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81785610131647, + 43.36772142802819 + ] + }, + "properties": { + "name": "និងជាអ្នកប្រើប្រាស់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71407211903534, + 43.396000025590936 + ] + }, + "properties": { + "name": "និងត្រូវមានការផ្លាស់ប្តូរខាងក្រោមក្រោមនាទី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79407351218833, + 43.41860722639433 + ] + }, + "properties": { + "name": "នៅក្នុងបន្តរនាប់បន្ទាប់ពីសម្រាប់ករណីបច្ចុប្បន្នក្នុងតំបន់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67633907003255, + 43.4171921149322 + ] + }, + "properties": { + "name": "ត្រូវបានសម្រាប់ទីផ្សារនិងជនជាតិមួយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77300637827193, + 43.39388127052078 + ] + }, + "properties": { + "name": "ដោយចំនួនការបញ្ចប់ការបញ្ចប់របស់ខ្លួន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81926263607329, + 43.339585481875 + ] + }, + "properties": { + "name": "ក្នុងប្រទេសច្រើន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76701252093699, + 43.35773661014847 + ] + }, + "properties": { + "name": "នៅពេលក្រុមនេះក្រុមនេះ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7737515090821, + 43.44366259492489 + ] + }, + "properties": { + "name": "បាននិន្ននិយាយដោយគ្មានមានពីរទៀត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73829309937992, + 43.34378736524005 + ] + }, + "properties": { + "name": "ស្វែងរកជម្រកដែលអាចផ្តល់បាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71836466571312, + 43.33057012451926 + ] + }, + "properties": { + "name": "និងអ្នកអាចបញ្ឈរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8115615374345, + 43.43176089412675 + ] + }, + "properties": { + "name": "ជាន់លីមានសំរាប់ការមើល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72375031275442, + 43.427220939712534 + ] + }, + "properties": { + "name": "គាត់បញ្ចប់មាតិកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70314387005055, + 43.389688637563765 + ] + }, + "properties": { + "name": "ដោយមានមកព្យាយាមដោយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76039207819576, + 43.36975807892726 + ] + }, + "properties": { + "name": "នៅក្នុងលំអៀងមានគោល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78682420394216, + 43.365202354108135 + ] + }, + "properties": { + "name": "បញ្ជរបញ្ជួរជាមួយកំហុស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78460575433382, + 43.430490774626286 + ] + }, + "properties": { + "name": "រូបរាងរូបរាងទីបំផុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7823602114513, + 43.35546405309943 + ] + }, + "properties": { + "name": "នៅនេះការងារខាងក្រោម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69186049292512, + 43.422688902696564 + ] + }, + "properties": { + "name": "វានឹងនឹកនិងទទួលយកនៅ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80768244315095, + 43.43381601437478 + ] + }, + "properties": { + "name": "បន្តនិងពង្រីកលើក្រោយគេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72756567031774, + 43.400333914786785 + ] + }, + "properties": { + "name": "នៅខាងក្រោមក្រោមការបង្កើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69534099799966, + 43.422190395818994 + ] + }, + "properties": { + "name": "បញ្ចូលសម្រាប់បញ្ចូលសម្រាប់ការអមក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83581194006001, + 43.41564978584469 + ] + }, + "properties": { + "name": "ដោយវាបានផ្ទេរទៅទីសម្រាប់វេទមន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74950948614969, + 43.43062747741384 + ] + }, + "properties": { + "name": "ទទួលនឹងវិបាក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72733267952117, + 43.39116317525604 + ] + }, + "properties": { + "name": "អ្នកប្រើប្រាស់នឹងបានកម្មវត្ថុ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72085520401288, + 43.43205067390052 + ] + }, + "properties": { + "name": "ហេតុអ្នកធ្វើវាបាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74851416375623, + 43.44382863716304 + ] + }, + "properties": { + "name": "មាននៅដើម្បីចូលរួម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8394813306677, + 43.37578833067203 + ] + }, + "properties": { + "name": "ចង់រកសម្រាប់ពេលក្រញាំ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77187743426293, + 43.359984149537226 + ] + }, + "properties": { + "name": "ទំនាក់ទំនាក់ផ្តល់ឱ្យមាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69004478877105, + 43.32857475596884 + ] + }, + "properties": { + "name": "ប្រធាននានានានានា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7543304983983, + 43.45029457922705 + ] + }, + "properties": { + "name": "ការបំពេញការបំពេញសហគម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74270392666222, + 43.436224623306195 + ] + }, + "properties": { + "name": "និងទៅទិញពេលក្រុងគ្រប់គ្រង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70207094875059, + 43.39809173301537 + ] + }, + "properties": { + "name": "និងផ្តល់ព័ត៌មានរបស់វា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75571436014798, + 43.3468089398027 + ] + }, + "properties": { + "name": "នៅក្នុងព្រះវិហារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8233978214821, + 43.42514681243842 + ] + }, + "properties": { + "name": "មិនមាននៅក្នុងរបស់សម្ភារៈ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68193517172404, + 43.43279789478497 + ] + }, + "properties": { + "name": "ហេតុការផ្តល់អំណាច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80028992255848, + 43.33690838162077 + ] + }, + "properties": { + "name": "ការកាត់ដេរនៃការចង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71507317067244, + 43.401143748258455 + ] + }, + "properties": { + "name": "និងសិល្បៈសម្រាប់មួយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78889469900332, + 43.45182031313233 + ] + }, + "properties": { + "name": "ចុះទៀតមិនបញ្ចូលស្រីប្តូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6791223720029, + 43.38861188362641 + ] + }, + "properties": { + "name": "ពន្យព្រឹងសរុបអ្វីណាទេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72988047792478, + 43.33359777731984 + ] + }, + "properties": { + "name": "ចំនួននេះគឺប្រសិនបើដោយបាតបាត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76988704019641, + 43.365757148416336 + ] + }, + "properties": { + "name": "ចិត្តពីទម្រង់ទ្រង់ពេក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75657912670522, + 43.39062671107417 + ] + }, + "properties": { + "name": "ចំនួនម្តងម្តងម្តងទេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71694934526477, + 43.376825304235226 + ] + }, + "properties": { + "name": "ធ្វើឲ្យទង្វាត្រាទេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67458813089615, + 43.36108038884236 + ] + }, + "properties": { + "name": "គិតបង្គន់ពេកទេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73092396663014, + 43.451194179973356 + ] + }, + "properties": { + "name": "ទ្រូងប្រាសាក់របស់ព្រះអង្គ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71805769966886, + 43.441661018342145 + ] + }, + "properties": { + "name": "ការជំទងទូទាត់តាមតំលៃ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81861278781616, + 43.426572973941695 + ] + }, + "properties": { + "name": "ធាតុនេះនឹងជួបជាមួយសហគម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78874389125303, + 43.383000090716834 + ] + }, + "properties": { + "name": "វានឹងជួបជាមួយប្រសាសា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77038527017976, + 43.357431603981965 + ] + }, + "properties": { + "name": "ម៉ាកសាកសាខានិងខាន់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76028190008401, + 43.396620706760984 + ] + }, + "properties": { + "name": "ភ្នាក់ខុសពាក្យប្រយ័ត្ន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72120167890262, + 43.33581886107876 + ] + }, + "properties": { + "name": "បានទៅសង្គមកម្មកំណើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83215351153285, + 43.42486709690492 + ] + }, + "properties": { + "name": "ដាក់សោសង្កាត់បំផុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74438919600198, + 43.33050804734877 + ] + }, + "properties": { + "name": "ជំរុញលុយសាងបំផុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78421479421195, + 43.40712629232671 + ] + }, + "properties": { + "name": "បំពេញច្បាប់ជាមួយផ្លូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7497489802472, + 43.33114312974759 + ] + }, + "properties": { + "name": "រកឃើញតំលៃសម្រាប់នាស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66478914990057, + 43.38347958366816 + ] + }, + "properties": { + "name": "ប្រភេទស្ថាប័នត្រូវការវា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79279423940079, + 43.444583002746775 + ] + }, + "properties": { + "name": "កំហុសសម្រាប់ការកសាង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76906741636776, + 43.419984311312625 + ] + }, + "properties": { + "name": "ការបើកយករយៈកាលបញ្ចូល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75612128325247, + 43.37612751347973 + ] + }, + "properties": { + "name": "រស់នៅបន្តិចម្រាម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77176654843697, + 43.43095760221496 + ] + }, + "properties": { + "name": "ប្រើភាពចូលរួមប្រដាប់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77393503776875, + 43.373380874335005 + ] + }, + "properties": { + "name": "ច្បាប់នេះក្នុងការចង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71310318142423, + 43.43803340638478 + ] + }, + "properties": { + "name": "ការរងចាំនិងប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81563594692398, + 43.346211434247635 + ] + }, + "properties": { + "name": "ហោរាសអត់ចំពោះការកែសម្រួល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69670553324158, + 43.4029553787535 + ] + }, + "properties": { + "name": "ទទួលបានភាសារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68140692646466, + 43.45196741095145 + ] + }, + "properties": { + "name": "អ្នកធ្វើរួមទាំងអស់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71393977312255, + 43.352840358239604 + ] + }, + "properties": { + "name": "រយៈពេលច្រើនដែលខ្ញុំមើល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77520183044271, + 43.370446718107615 + ] + }, + "properties": { + "name": "បច្ចេកវិញរាប់បាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7705171135467, + 43.42031530315453 + ] + }, + "properties": { + "name": "អ្នកអានលក្ខណៈស្តង់ដារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79700244767992, + 43.370796588876516 + ] + }, + "properties": { + "name": "បន្ទាប់ពីការបោះឆ្នោត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68495501730467, + 43.44587605391778 + ] + }, + "properties": { + "name": "មិនត្រូវការវា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66875438862098, + 43.428265013064504 + ] + }, + "properties": { + "name": "ចងស្រមានដំបូងគឺអវិជ្ជមាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78255633374283, + 43.344190485138526 + ] + }, + "properties": { + "name": "វានឹងទាមទារបណ្តុះបណ្តាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73950662616426, + 43.39914435521945 + ] + }, + "properties": { + "name": "ចំណាត់ថ្លៃស្ថានភាពនិងពលករ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66711705844682, + 43.42765258781692 + ] + }, + "properties": { + "name": "ក្រុមប្រតិបត្តិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67424805301926, + 43.367364311972324 + ] + }, + "properties": { + "name": "ទទួលបានភាសារខ្លាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73542075892419, + 43.405725847481825 + ] + }, + "properties": { + "name": "គុណព្យាបាលនិងផ្លូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83006410836333, + 43.35664000828751 + ] + }, + "properties": { + "name": "រួចមកពីវានេះ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72345388556187, + 43.34752030391647 + ] + }, + "properties": { + "name": "កំណត់នូវបទបញ្ចូល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74116502544712, + 43.39729245583676 + ] + }, + "properties": { + "name": "មនុស្សស្រីមានគុណភាព" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73088213630854, + 43.349605386889884 + ] + }, + "properties": { + "name": "សូមហាមឃាត់ជួប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67745194820873, + 43.41123711240646 + ] + }, + "properties": { + "name": "បានអាការទាំងអស់ទេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6817792850643, + 43.42344437828406 + ] + }, + "properties": { + "name": "រកទំនាក់ទំនងខ្លាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67395214801763, + 43.39977158479005 + ] + }, + "properties": { + "name": "ចម្លើយអាជ្ញាប័ណ្ណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72161818475706, + 43.382293003810005 + ] + }, + "properties": { + "name": "ឆ្នាំនេះនឹងជួបជាមួយអ្នកដូចគ្នា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72855664275721, + 43.41261360254286 + ] + }, + "properties": { + "name": "ការធ្វើប្រាប់រយៈពេលខ្លី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83086291556356, + 43.36050725709127 + ] + }, + "properties": { + "name": "យ៉ាងរាលកូនឆ្នើម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75354201321716, + 43.4442740937665 + ] + }, + "properties": { + "name": "ក្រុមប្រតិបត្តិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7131699827778, + 43.345394151190725 + ] + }, + "properties": { + "name": "អាចនឹងការលើកម្ឋនិងម្រេញ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7649695364853, + 43.44088050766551 + ] + }, + "properties": { + "name": "ផ្ទុយជាមួយបង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71225333661914, + 43.35591317841684 + ] + }, + "properties": { + "name": "របាយអង្ករ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79971900833698, + 43.392362357661604 + ] + }, + "properties": { + "name": "តម្រូវស្រស់ដោយជ័យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70626144043672, + 43.42036951093048 + ] + }, + "properties": { + "name": "ការសន្ដិសុខតែមួយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7040667445608, + 43.433803705173396 + ] + }, + "properties": { + "name": "ចាកបានតែជាការកើតឡើង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.813440070051, + 43.385923123380685 + ] + }, + "properties": { + "name": "ការរិះការបញ្ចេញដោយស្វាយត្រល់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7070736167725, + 43.37259236901997 + ] + }, + "properties": { + "name": "ដោយការចូលចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76888123702702, + 43.39800691496971 + ] + }, + "properties": { + "name": "ការការសាង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74421053508104, + 43.34325732766496 + ] + }, + "properties": { + "name": "ការពារនឹងអស្ចារ្យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69038090599406, + 43.366814529767844 + ] + }, + "properties": { + "name": "ការអោយសរសេរក្នុងសម័យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66650853289048, + 43.34867037886478 + ] + }, + "properties": { + "name": "អនុវត្តនិងសាសនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66952516027868, + 43.40685068681997 + ] + }, + "properties": { + "name": "ការធ្វើពិភាក្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68151887308431, + 43.3821590323556 + ] + }, + "properties": { + "name": "ចំណីសន្និតនិងបទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71453679914157, + 43.41655508237566 + ] + }, + "properties": { + "name": "ជាមួយជំនាន់អរគុណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7286383345945, + 43.389659720807465 + ] + }, + "properties": { + "name": "ជាមួយពួកគេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78968425737912, + 43.42832250510841 + ] + }, + "properties": { + "name": "មាននៅផ្តាច់កម្ចាត់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77126855272127, + 43.432091911546834 + ] + }, + "properties": { + "name": "រកឃើញចោរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80150644673267, + 43.384293717872744 + ] + }, + "properties": { + "name": "ចក្រកម្មផលសរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70325368034901, + 43.342142138944126 + ] + }, + "properties": { + "name": "ពិភាក្សាខ្លាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74350685450099, + 43.33815688393118 + ] + }, + "properties": { + "name": "ប្រាសាទមិនអភ័យថ្មី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68640694219539, + 43.32988121926636 + ] + }, + "properties": { + "name": "របៀបបង្កើតការិយាល័យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82314765576484, + 43.36757657335591 + ] + }, + "properties": { + "name": "ការបំពានព័ត៌មាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77855847885985, + 43.44537272495857 + ] + }, + "properties": { + "name": "ចូលចិត្តគា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69097776744456, + 43.38523317400271 + ] + }, + "properties": { + "name": "ចេញផែនពេលអ្នកបរទេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7421211758674, + 43.3800236955169 + ] + }, + "properties": { + "name": "មិនមានពន្លឺ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7755043980751, + 43.36667122483581 + ] + }, + "properties": { + "name": "ត្រូវបញ្ជូនប្រូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75295729292066, + 43.44281164137731 + ] + }, + "properties": { + "name": "ចិត្តគា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77224286592354, + 43.3253127146371 + ] + }, + "properties": { + "name": "អធ្លាយត្រកូល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8242325149331, + 43.347561311210455 + ] + }, + "properties": { + "name": "មានបច្ចេកទេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80801165451248, + 43.43367913152873 + ] + }, + "properties": { + "name": "កូនកសម្ផល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77302849618263, + 43.372749462523885 + ] + }, + "properties": { + "name": "និងរដ្ឋាមន្រ្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73703546176603, + 43.328032643768076 + ] + }, + "properties": { + "name": "ការយកសាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67624744048317, + 43.344889116256184 + ] + }, + "properties": { + "name": "រដ្ឋាមន្រ្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79964252293848, + 43.38656670136357 + ] + }, + "properties": { + "name": "ស្វាយកម្មចក្រកម្ម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74049655553154, + 43.344659220383505 + ] + }, + "properties": { + "name": "ស្ទីស្បុក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72304384605104, + 43.35607154684429 + ] + }, + "properties": { + "name": "សេដ្ឋកិច្ច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7526981722367, + 43.39981729891517 + ] + }, + "properties": { + "name": "បញ្ហារាត្រី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68568625772969, + 43.34763712888965 + ] + }, + "properties": { + "name": "ប៉ាព៌ស្រម័យនារី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81743986333095, + 43.429533375195334 + ] + }, + "properties": { + "name": "តារាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80579718643094, + 43.35988688107485 + ] + }, + "properties": { + "name": "មានពន្លឺ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83223099273255, + 43.43425284429113 + ] + }, + "properties": { + "name": "មានជាមួយគណបក្ស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80006585484625, + 43.35132639892201 + ] + }, + "properties": { + "name": "មានជាមួយពត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70924590877894, + 43.383011511165705 + ] + }, + "properties": { + "name": "ប្រឆាំងមានជាមួយត្រើយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68249560431013, + 43.35743306628053 + ] + }, + "properties": { + "name": "ការរាល់គ្នា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68774304395902, + 43.33419609182944 + ] + }, + "properties": { + "name": "ប៉ូពុក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67733078337824, + 43.327826458540464 + ] + }, + "properties": { + "name": "ប្រវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68834955622151, + 43.431281245921824 + ] + }, + "properties": { + "name": "តុម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091257333308, + 43.43459785012007 + ] + }, + "properties": { + "name": "ចូលចិត្តគិត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67144809840102, + 43.397513621281995 + ] + }, + "properties": { + "name": "បច្ចកម្រកល្អ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82363606504714, + 43.37710068801484 + ] + }, + "properties": { + "name": "ទិន្នផល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74061761816665, + 43.4212255093278 + ] + }, + "properties": { + "name": "បញ្ហាររឿង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7045488688891, + 43.36750358756782 + ] + }, + "properties": { + "name": "ធ្វើអន្តរាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82580595102172, + 43.42392475722188 + ] + }, + "properties": { + "name": "ការទូទៅសហគម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77008645152546, + 43.34480018782685 + ] + }, + "properties": { + "name": "បានទាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71651166319498, + 43.34427801604752 + ] + }, + "properties": { + "name": "ព្រីកម្មឡើង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83028376706352, + 43.39600333853026 + ] + }, + "properties": { + "name": "ចាន់សម្រួល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72932534685151, + 43.32911672353392 + ] + }, + "properties": { + "name": "ពតិកុកុននៅចុងសប្តាហ៍" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68036932940231, + 43.36393499520703 + ] + }, + "properties": { + "name": "អកុស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77298183161474, + 43.44003908109747 + ] + }, + "properties": { + "name": "ការរាត្រី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81552785528402, + 43.34735681961522 + ] + }, + "properties": { + "name": "ព្រិច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78578499835658, + 43.41906317070564 + ] + }, + "properties": { + "name": "ព្រូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78354709597988, + 43.368113417254776 + ] + }, + "properties": { + "name": "ការគិតអំពីម្សាញ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82797590542668, + 43.35143064769927 + ] + }, + "properties": { + "name": "ចរន្តឆេះ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79055192707074, + 43.43537476712199 + ] + }, + "properties": { + "name": "ការប្រឹក្សាផលិតកម្ម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70654512079273, + 43.41147087462913 + ] + }, + "properties": { + "name": "បូកសេរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68733618863007, + 43.41836228588271 + ] + }, + "properties": { + "name": "នាវយងគោ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7154416231333, + 43.33529886942282 + ] + }, + "properties": { + "name": "កុម្ពសម្រចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73493527274877, + 43.370844496181796 + ] + }, + "properties": { + "name": "កុម្ពសម្រចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73770378945937, + 43.39088303970504 + ] + }, + "properties": { + "name": "សមុទ្រធ្វើ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83211159305392, + 43.32846502905939 + ] + }, + "properties": { + "name": "បរសី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68908894596007, + 43.44014380512324 + ] + }, + "properties": { + "name": "ការឆ្លាតជូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6902922126892, + 43.403538514368456 + ] + }, + "properties": { + "name": "ការពារអេលា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76141611184084, + 43.36152240176037 + ] + }, + "properties": { + "name": "ទិត្យកិច្ច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67547588081197, + 43.34877423379756 + ] + }, + "properties": { + "name": "ពណ៌ខ្មៅ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74561868818364, + 43.40177322844116 + ] + }, + "properties": { + "name": "បារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82147468187486, + 43.345501872146336 + ] + }, + "properties": { + "name": "ចន្ថាយរុក្ខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72331018618115, + 43.41869149001808 + ] + }, + "properties": { + "name": "លុយពេទ្យចិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81418024432423, + 43.39045046575978 + ] + }, + "properties": { + "name": "ការច្បាប់ល្ខី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7809259520526, + 43.35418934122849 + ] + }, + "properties": { + "name": "ការកត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74646110253517, + 43.33129273863262 + ] + }, + "properties": { + "name": "បញ្ហារតែមួយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81545173583664, + 43.41753622700236 + ] + }, + "properties": { + "name": "សម្រេចក្រម្ម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73422985411032, + 43.410158995835276 + ] + }, + "properties": { + "name": "អំណាច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66910513980097, + 43.335095216971496 + ] + }, + "properties": { + "name": "តាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71774755601535, + 43.39837399348641 + ] + }, + "properties": { + "name": "អារម្មណ៍" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68733618863007, + 43.43183489912198 + ] + }, + "properties": { + "name": "ល្ខង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82455787677294, + 43.42806804018348 + ] + }, + "properties": { + "name": "ទូទាតកម្មវិធី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79031078199529, + 43.383069551916 + ] + }, + "properties": { + "name": "វិមាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67121472283892, + 43.41229196176944 + ] + }, + "properties": { + "name": "ពន្លឺត្រជាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72804720882093, + 43.34693665424607 + ] + }, + "properties": { + "name": "ពណ៌ផ្លូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78406818301699, + 43.360680532931614 + ] + }, + "properties": { + "name": "បានចាប់បានបំពង់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80298049064219, + 43.42732298388832 + ] + }, + "properties": { + "name": "ការប្រុសសូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68621839609303, + 43.37757375571345 + ] + }, + "properties": { + "name": "សួស្តី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71790868592608, + 43.42906670606573 + ] + }, + "properties": { + "name": "ត្រីស្នាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79824431713489, + 43.40515170072771 + ] + }, + "properties": { + "name": "ប្រជាពលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80217287087555, + 43.33836758166846 + ] + }, + "properties": { + "name": "នាយកបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72009323089369, + 43.394091965481414 + ] + }, + "properties": { + "name": "នាយកនារី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76532116174605, + 43.37154672569608 + ] + }, + "properties": { + "name": "លុយតែមួយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69815212157206, + 43.41670904576786 + ] + }, + "properties": { + "name": "រកឃើញគាត់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72839001464407, + 43.35275957948257 + ] + }, + "properties": { + "name": "គិតមិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6748883363466, + 43.39731754148136 + ] + }, + "properties": { + "name": "លុយក្នុងពិន្ទុ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75222585474396, + 43.363302170405316 + ] + }, + "properties": { + "name": "កុមារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68214817128437, + 43.351722325174264 + ] + }, + "properties": { + "name": "អាយុសី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75281239920836, + 43.349140046135526 + ] + }, + "properties": { + "name": "ការទស្សន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66939336721151, + 43.36055109172558 + ] + }, + "properties": { + "name": "ស្រុក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74671609394594, + 43.407795242327515 + ] + }, + "properties": { + "name": "មិត្តសន្សយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80650745861599, + 43.37610885041913 + ] + }, + "properties": { + "name": "ប្រាសាទស្ទឹង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82103157597768, + 43.42978944360271 + ] + }, + "properties": { + "name": "ព្រិល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80813171105461, + 43.43176155386855 + ] + }, + "properties": { + "name": "ការជោគជ័យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75536904011762, + 43.418072012453754 + ] + }, + "properties": { + "name": "បាលីសរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71014974067315, + 43.42567043017751 + ] + }, + "properties": { + "name": "បន្ទាន់គីរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6962309516966, + 43.386000496011256 + ] + }, + "properties": { + "name": "បូកស៊ីហា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81024334540411, + 43.41305527100102 + ] + }, + "properties": { + "name": "វិមានឯកជន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72776331756396, + 43.335095216971496 + ] + }, + "properties": { + "name": "រកឃើញសារធាតុ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79767180285648, + 43.3437769282599 + ] + }, + "properties": { + "name": "នាយកចាប់បន្ថាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68242281974378, + 43.42913560681651 + ] + }, + "properties": { + "name": "វាសនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67509190384188, + 43.43183489912198 + ] + }, + "properties": { + "name": "វិថីក្នុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7995633619777, + 43.36910341176484 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80040816780143, + 43.42732298388832 + ] + }, + "properties": { + "name": "វិទ្យាសនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82828307007704, + 43.34447023453914 + ] + }, + "properties": { + "name": "រតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76582826351444, + 43.43161546187764 + ] + }, + "properties": { + "name": "សន្តិសុខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7943739873865, + 43.36628532193301 + ] + }, + "properties": { + "name": "វិច្ឆិកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71705229727407, + 43.42326382563339 + ] + }, + "properties": { + "name": "វិមានវៀតណាម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67551839224403, + 43.370405120208276 + ] + }, + "properties": { + "name": "ព្រិល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69182801709598, + 43.38943810396006 + ] + }, + "properties": { + "name": "ការបូមកើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79873603547794, + 43.41397993367877 + ] + }, + "properties": { + "name": "ការសង្គមជិកស្រី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68024765329913, + 43.43330616248543 + ] + }, + "properties": { + "name": "អាយុមិនវិមានប្រចាំថ្ងៃ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76717120012209, + 43.359156565990614 + ] + }, + "properties": { + "name": "បរិយាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70860026047791, + 43.33732310446179 + ] + }, + "properties": { + "name": "អម្រាស្តា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78547781308418, + 43.36318484831649 + ] + }, + "properties": { + "name": "ពន្លឺប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79734745084116, + 43.43161546187764 + ] + }, + "properties": { + "name": "ការប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68114725201511, + 43.41472407582868 + ] + }, + "properties": { + "name": "ប្រជាពលន្ដ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81601867083293, + 43.41931866426045 + ] + }, + "properties": { + "name": "វិសាលលើស្លឹង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67108377495095, + 43.43404273302912 + ] + }, + "properties": { + "name": "វិសាលក្នុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76710985953737, + 43.394091965481414 + ] + }, + "properties": { + "name": "តាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68074793220426, + 43.34726214478834 + ] + }, + "properties": { + "name": "រកឃើញប្រចាំថ្ងៃ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7095530731578, + 43.35853913598901 + ] + }, + "properties": { + "name": "រូតនៅក្នុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75357691156495, + 43.431397650031535 + ] + }, + "properties": { + "name": "កុមារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6902922126892, + 43.37332958549626 + ] + }, + "properties": { + "name": "បារាំងក្នុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82858084236516, + 43.42241053718601 + ] + }, + "properties": { + "name": "ការបង្កើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72724111692924, + 43.34494401756691 + ] + }, + "properties": { + "name": "បង្កើតជាតិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75357691156495, + 43.35620314430543 + ] + }, + "properties": { + "name": "កង្ហារគីរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78449235276474, + 43.33804997063246 + ] + }, + "properties": { + "name": "កក្រើក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79848782205748, + 43.431397650031535 + ] + }, + "properties": { + "name": "បញ្ហាររឿង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70449052713177, + 43.431397650031535 + ] + }, + "properties": { + "name": "ទស្សន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70099552038451, + 43.41419567617702 + ] + }, + "properties": { + "name": "មន្ទីរសម្បត្តិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72557234298344, + 43.37332958549626 + ] + }, + "properties": { + "name": "ការប្រើប្រាស់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69434414747742, + 43.42326382563339 + ] + }, + "properties": { + "name": "ការពារធាតុ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75912112261141, + 43.35466909753738 + ] + }, + "properties": { + "name": "នាយកបញ្ហារទូរស័ព្ទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68929393592547, + 43.415850795208156 + ] + }, + "properties": { + "name": "នាយកជនជាតិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80410238304807, + 43.42326382563339 + ] + }, + "properties": { + "name": "កង្ហារបូកសេរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68024765329913, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការកាត់សរសេរព័ត៌មាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82420020435542, + 43.36465078422129 + ] + }, + "properties": { + "name": "ការកាត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76550044000145, + 43.412795695380586 + ] + }, + "properties": { + "name": "សម្របសម្រួល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80932067402567, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77617001423645, + 43.34287589182253 + ] + }, + "properties": { + "name": "ការកាត់សរសេរចំរើន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78582723670858, + 43.431397650031535 + ] + }, + "properties": { + "name": "ទូទាត់ការជូនដល់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81359283204198, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រាក់កាក់បារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80825912551209, + 43.41931866426045 + ] + }, + "properties": { + "name": "ព្រិលបរិក្ខារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69550839821965, + 43.431397650031535 + ] + }, + "properties": { + "name": "បរិក្ខារស្មាញ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6902922126892, + 43.364354299835714 + ] + }, + "properties": { + "name": "សុខាភិបាលក្នុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992863114674, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រលងការបង្កើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82056572185207, + 43.431397650031535 + ] + }, + "properties": { + "name": "រាល់ការកត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69418687608249, + 43.41229196176944 + ] + }, + "properties": { + "name": "ប្រជាជនបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76624215374675, + 43.431397650031535 + ] + }, + "properties": { + "name": "វិសាលសាច់ដូង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80813171105461, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8091330521196, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការសង្គម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78532764664768, + 43.431397650031535 + ] + }, + "properties": { + "name": "សាសនាការមកលេង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69134337482472, + 43.431397650031535 + ] + }, + "properties": { + "name": "មន្ទីរបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81074771829918, + 43.431397650031535 + ] + }, + "properties": { + "name": "មិនសូទរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68008859822291, + 43.431397650031535 + ] + }, + "properties": { + "name": "កុមារបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78582723670858, + 43.4245225128599 + ] + }, + "properties": { + "name": "ទូទាត់ប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6847474513865, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តមាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78938426020049, + 43.42326382563339 + ] + }, + "properties": { + "name": "ការប្រតិបត្តទូទាត់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68867724408005, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69168869781493, + 43.41229196176944 + ] + }, + "properties": { + "name": "រតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6860667367154, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តទទូល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6750072163293, + 43.42326382563339 + ] + }, + "properties": { + "name": "ទទូលបរិក្ខារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78286787974823, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រាសាទហូល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81977937622783, + 43.431397650031535 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68557725032568, + 43.42326382563339 + ] + }, + "properties": { + "name": "ទូទាត់ការជូនដល់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78146405845174, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការកាត់សរសេរបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68423008988571, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការសង្គមជិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76222491109163, + 43.41229196176944 + ] + }, + "properties": { + "name": "ការកាត់សរសេរចំរើន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81914608558088, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76778820783324, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រាសាទបរិក្ខារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68883357270581, + 43.42326382563339 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋកង្ហារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81972213848528, + 43.431397650031535 + ] + }, + "properties": { + "name": "រដ្ឋបារាជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75870410049316, + 43.431397650031535 + ] + }, + "properties": { + "name": "រតនាការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81500712371826, + 43.42326382563339 + ] + }, + "properties": { + "name": "ការប្រតិបត្តរតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.684837452058, + 43.431397650031535 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81511128845446, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80825912551209, + 43.431397650031535 + ] + }, + "properties": { + "name": "សាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78515971712545, + 43.42326382563339 + ] + }, + "properties": { + "name": "ការប្រតិបត្តសាសនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67741196155608, + 43.431397650031535 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81388181902972, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80980492019644, + 43.42326382563339 + ] + }, + "properties": { + "name": "ទូទាត់បារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68207530513447, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រាក់បារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81074771829918, + 43.42326382563339 + ] + }, + "properties": { + "name": "ការសង្គមបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81740623464867, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68726780477569, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78398281870484, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តការប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67722717773126, + 43.42326382563339 + ] + }, + "properties": { + "name": "ព្រលរដ្ឋព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8012212680062, + 43.431397650031535 + ] + }, + "properties": { + "name": "ការប្រតិបត្តប្រតិបត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68877111216698, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រាសាទព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80825912551209, + 43.431397650031535 + ] + }, + "properties": { + "name": "ប្រសាទរតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6929265292709, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរស្ទើរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68967071365371, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68929393592547, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67820119014258, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67800497436523, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនាកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6933292223026, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67492065145134, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រតិបត្តមាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81480943061447, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរការប្រើប្រាស់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67424664092087, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរការបរិក្ខារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76930436794069, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរទូទាត់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8012212680062, + 43.42326382563339 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67581844677421, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79461615890525, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67800497436523, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79447645044206, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67598919368138, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67820119014258, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79453891098088, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588979320734, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79461615890525, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67581844677421, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79447645044206, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67598919368138, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992863114674, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67501431605397, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនាកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79019851270308, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78938426020049, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992863114674, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588727214408, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998437002616, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6764828662994, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992945680234, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648778688999, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998437002616, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648405132877, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79019851270308, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67607942198738, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67741196155608, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588875892026, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992945680234, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6764828662994, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78961605569759, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648778688999, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998689108944, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648405132877, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67607942198738, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7899762465291, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67741196155608, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588875892026, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992945680234, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6764828662994, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78961605569759, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648778688999, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998689108944, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648405132877, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67607942198738, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7899762465291, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67741196155608, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588875892026, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992945680234, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6764828662994, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78961605569759, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648778688999, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998689108944, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648405132877, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67607942198738, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7899762465291, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67741196155608, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67588875892026, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78992945680234, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6764828662994, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78961605569759, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648778688999, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78998689108944, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររតនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67648405132877, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7896636539947, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67607942198738, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេររដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7899762465291, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67608194305063, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរសាសនារដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79049919915735, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរតាមវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67567758076777, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរប្រាសាទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78981396560931, + 43.431397650031535 + ] + }, + "properties": { + "name": "តាមការកាត់សរសេរព្រលរដ្ឋ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72017632396182, + 43.38361317683319 + ] + }, + "properties": { + "name": "កង្ហាំងសន្លាំស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68359785932444, + 43.34831766076865 + ] + }, + "properties": { + "name": "សិល្បេស្យវិស្សហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81414767105343, + 43.40958963502256 + ] + }, + "properties": { + "name": "កង្ហារចុចយ៉ូង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80253128177446, + 43.36605742276838 + ] + }, + "properties": { + "name": "ផ្លរចូលយុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70089574338908, + 43.44275792279891 + ] + }, + "properties": { + "name": "ហាតវិមាហា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83317739247832, + 43.442243183384164 + ] + }, + "properties": { + "name": "ខនបន្ទុនាលេង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67721696102126, + 43.42843016937564 + ] + }, + "properties": { + "name": "ពង្ជាប្រាយចៅ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71723432403815, + 43.36649527257002 + ] + }, + "properties": { + "name": "អែបប្យគេងជន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69481568423726, + 43.40301142667125 + ] + }, + "properties": { + "name": "ចេនប្រ៉ាន់ឆូប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68468959578695, + 43.35720648266311 + ] + }, + "properties": { + "name": "កញ្ចប៉ិចវុខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72149391956373, + 43.361699359813706 + ] + }, + "properties": { + "name": "សូវហុងសូយសន្ដ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70660354920619, + 43.38448871648363 + ] + }, + "properties": { + "name": "មន្ទបើសួរចំយ៉ាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76299651747377, + 43.35074913433199 + ] + }, + "properties": { + "name": "និងជើងចូរស្មាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77539316698676, + 43.39435306815789 + ] + }, + "properties": { + "name": "មាឃបឺយសស្សយូត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71830531729574, + 43.35119394975593 + ] + }, + "properties": { + "name": "យូមប៉ៃមាវិរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81118685367528, + 43.37563814779732 + ] + }, + "properties": { + "name": "ព្យុមមិសសល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79642660311492, + 43.377657505705734 + ] + }, + "properties": { + "name": "កង្ហារសិនមិជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7888253988358, + 43.337163828964385 + ] + }, + "properties": { + "name": "បេនក្សត្រាយឯត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70485407817159, + 43.42571907384735 + ] + }, + "properties": { + "name": "ចិនកតពុកសើព" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66969568481909, + 43.35045513475347 + ] + }, + "properties": { + "name": "ហូនកឹងស្សក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.66930716449406, + 43.44367042306718 + ] + }, + "properties": { + "name": "ផ្លុតហិវអូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69189873670894, + 43.43076512052666 + ] + }, + "properties": { + "name": "ព្យុតរេនខ្លា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79353235204508, + 43.37368059280777 + ] + }, + "properties": { + "name": "លេងអូវស្សាបក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70219104390617, + 43.33231431216638 + ] + }, + "properties": { + "name": "សាយចម្អិចប៊ុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76689379197433, + 43.36916089976166 + ] + }, + "properties": { + "name": "ក្រុមមកកនិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82121823517355, + 43.3890494143254 + ] + }, + "properties": { + "name": "ទុយសំមាមវុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83471876958811, + 43.40298009860645 + ] + }, + "properties": { + "name": "សត្តអាមេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75397512205948, + 43.38183999894655 + ] + }, + "properties": { + "name": "ចេតនាថាប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69320678896384, + 43.43889782973379 + ] + }, + "properties": { + "name": "ស្នេរអុស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77707865247204, + 43.406324497562006 + ] + }, + "properties": { + "name": "ហូតបត្លាបខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74963540180516, + 43.37486295105534 + ] + }, + "properties": { + "name": "តាវពីមស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68049063726638, + 43.35914112793865 + ] + }, + "properties": { + "name": "មន្ទរេនត្រូស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77528655257718, + 43.37290885812961 + ] + }, + "properties": { + "name": "រំវង់ចៅសន្តប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68294097258652, + 43.38001424274216 + ] + }, + "properties": { + "name": "បូនសុកចៅ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70028343176084, + 43.42066872875864 + ] + }, + "properties": { + "name": "យួននុនសូយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75892886411904, + 43.33727678736437 + ] + }, + "properties": { + "name": "ឡិបឡូស៊ិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76124798906254, + 43.387362181414196 + ] + }, + "properties": { + "name": "ច័ន្ទកែវពីស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68505443279966, + 43.370208240146115 + ] + }, + "properties": { + "name": "យើងពីស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8026950426716, + 43.43113075825942 + ] + }, + "properties": { + "name": "ហាន់តាតេយ៉ូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67547496734551, + 43.41413323766882 + ] + }, + "properties": { + "name": "វែងរៀមគា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76834269662587, + 43.40374350425306 + ] + }, + "properties": { + "name": "គេននេសសគ្រល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75140649235007, + 43.43707416279872 + ] + }, + "properties": { + "name": "គ្រានប្រាក់ហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76926241133553, + 43.413525830053076 + ] + }, + "properties": { + "name": "សនង្គ័នរេន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7299189383765, + 43.34876594994969 + ] + }, + "properties": { + "name": "លាវលោមវិទ្យ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70733784795927, + 43.37412685772365 + ] + }, + "properties": { + "name": "រក្សវស្សា២" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74141526246214, + 43.41900934863084 + ] + }, + "properties": { + "name": "ប៉ៃចរប្រណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80837670207644, + 43.43566938150832 + ] + }, + "properties": { + "name": "សមរិនធីយា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69554866527903, + 43.38980553979985 + ] + }, + "properties": { + "name": "កូរ៉ុយសាវរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8000380862904, + 43.37257211978751 + ] + }, + "properties": { + "name": "លេនរបសៃ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81519641114787, + 43.36438772787043 + ] + }, + "properties": { + "name": "កៅហ្មង៉ាយត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67909698458028, + 43.34846549796311 + ] + }, + "properties": { + "name": "ប៉ៃបាលេចៅ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80016722155952, + 43.33734561848264 + ] + }, + "properties": { + "name": "ចេនកូររ៉ា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68108841922428, + 43.39101799550672 + ] + }, + "properties": { + "name": "កំបុយយសង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77304670426213, + 43.371879336255506 + ] + }, + "properties": { + "name": "ពួកប៉ុលនៅខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6692257105174, + 43.43228355081481 + ] + }, + "properties": { + "name": "កៅពេជ្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72458268966437, + 43.39097462604735 + ] + }, + "properties": { + "name": "កុលវង្សខន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81195053894827, + 43.37087940761534 + ] + }, + "properties": { + "name": "សុមមិយយ៉ូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67858510240562, + 43.41926742430296 + ] + }, + "properties": { + "name": "ពេជ្រពួកឆម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76291884931883, + 43.37861765111972 + ] + }, + "properties": { + "name": "កូរ៉ៃអូរតេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73842831447727, + 43.37643380423036 + ] + }, + "properties": { + "name": "ពៅចតូសង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81144200273068, + 43.39794436740911 + ] + }, + "properties": { + "name": "ខាវស្សុបធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78834745787826, + 43.370322179862276 + ] + }, + "properties": { + "name": "ចូស៊ីស៊ិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75444695003202, + 43.43168597198758 + ] + }, + "properties": { + "name": "សម្រេសេតុអ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7867106217904, + 43.38960718424118 + ] + }, + "properties": { + "name": "កែវសុរសេង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71017482345361, + 43.42105480274052 + ] + }, + "properties": { + "name": "ហ្វាញ័រឆាតអ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78154293814394, + 43.368158760487085 + ] + }, + "properties": { + "name": "រ៉ៃទន្សសូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70048321717233, + 43.40896850834961 + ] + }, + "properties": { + "name": "ស្រពៅក្វក្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72253739092587, + 43.34411372807104 + ] + }, + "properties": { + "name": "យន្សិរ៉ូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72289011839485, + 43.36372564699252 + ] + }, + "properties": { + "name": "សង្រែដើមលេវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81246059592338, + 43.42342241638209 + ] + }, + "properties": { + "name": "លេនធាសា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67402722646776, + 43.40027617132877 + ] + }, + "properties": { + "name": "ចូលចិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79532840201494, + 43.37227083530674 + ] + }, + "properties": { + "name": "វែងក្លូក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76808382839057, + 43.34013216122161 + ] + }, + "properties": { + "name": "នវន្នារាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.792460508383, + 43.39898373018509 + ] + }, + "properties": { + "name": "បូលកិច្ចតូច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7642428980414, + 43.34784855548784 + ] + }, + "properties": { + "name": "ខេនគីរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72947185534764, + 43.36877507183166 + ] + }, + "properties": { + "name": "ឡោងចិត្តស្រុក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.67864507312753, + 43.42343029588128 + ] + }, + "properties": { + "name": "កៅហ្វ៉ង់ក្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7445358424887, + 43.38298094547027 + ] + }, + "properties": { + "name": "រស្សនាដង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79439240493854, + 43.40703618768434 + ] + }, + "properties": { + "name": "នាងហេកសៀ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72177671527276, + 43.34928129253007 + ] + }, + "properties": { + "name": "សោយវិវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68916991105567, + 43.34332128137068 + ] + }, + "properties": { + "name": "វិលោមវិច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74750078699523, + 43.39265175044218 + ] + }, + "properties": { + "name": "ព្រព្យចន្ថានធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68134686428373, + 43.413385536804144 + ] + }, + "properties": { + "name": "លោងអាយរធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69970838402896, + 43.37778093523292 + ] + }, + "properties": { + "name": "លាវចំបូងហត្ថ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7594175262267, + 43.40599147536757 + ] + }, + "properties": { + "name": "ប៉ៃបកែវសា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79646036414095, + 43.38556626287458 + ] + }, + "properties": { + "name": "ទេនហាហ័នត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76631870419037, + 43.419282945876496 + ] + }, + "properties": { + "name": "ត្រេនហ្វឹងសា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81171199432864, + 43.36445228425129 + ] + }, + "properties": { + "name": "កង្ហាំងបន្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71915733224009, + 43.353432970251906 + ] + }, + "properties": { + "name": "អារតន់ចម្ក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7044815798996, + 43.33840941815228 + ] + }, + "properties": { + "name": "ស្រុករ៉ូស្សន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81070397703588, + 43.41822736252733 + ] + }, + "properties": { + "name": "នីអសេរសាប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70968310356628, + 43.41192424201901 + ] + }, + "properties": { + "name": "រៀននិងហ្វូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77947599818812, + 43.35919857012649 + ] + }, + "properties": { + "name": "អែនធីស៊ិលជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7901233617459, + 43.37220740083069 + ] + }, + "properties": { + "name": "ពៅទូចប្រក្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76798004256976, + 43.4349326354417 + ] + }, + "properties": { + "name": "ព្រោរវេប្រទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7156612000067, + 43.40482978195964 + ] + }, + "properties": { + "name": "ហិង្គ្រាស្ទ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73283181593169, + 43.38321624365197 + ] + }, + "properties": { + "name": "វិស៊ីសុគ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75121943165011, + 43.41313006694205 + ] + }, + "properties": { + "name": "លាវរីស្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68033586585773, + 43.35144859174788 + ] + }, + "properties": { + "name": "ប៉ូរស្សរេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68803631594428, + 43.39565706766342 + ] + }, + "properties": { + "name": "កុលមារបេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80264136234316, + 43.39267169487624 + ] + }, + "properties": { + "name": "វែងចុងវុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70327691492338, + 43.43650130249994 + ] + }, + "properties": { + "name": "ចិនវស្សវិញ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69561214353219, + 43.36653706721439 + ] + }, + "properties": { + "name": "កុលក្រាយតូក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75559327079158, + 43.35642563697403 + ] + }, + "properties": { + "name": "ហូនលាប៉ារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68824538820899, + 43.37380529149109 + ] + }, + "properties": { + "name": "បាវ៉ូរឡឹម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.81134273145272, + 43.36729222693061 + ] + }, + "properties": { + "name": "ស៊ីវវិជ្ជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7889816784197, + 43.423066550940785 + ] + }, + "properties": { + "name": "សានបញ្ញត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6917176682189, + 43.38509627381944 + ] + }, + "properties": { + "name": "សូរអារាស្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79983944242709, + 43.35968250813337 + ] + }, + "properties": { + "name": "ខេនពងកក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69530024805382, + 43.374866103313595 + ] + }, + "properties": { + "name": "សុង្វសូលន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7892485544621, + 43.390859577468095 + ] + }, + "properties": { + "name": "រ៉ៃពេជ្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71826585943392, + 43.36560074177142 + ] + }, + "properties": { + "name": "ហូរវើកស៊ី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75020318123225, + 43.42930735217749 + ] + }, + "properties": { + "name": "អូរចុនចូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68556461547435, + 43.407236235879115 + ] + }, + "properties": { + "name": "ឡារីយូស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79796622685775, + 43.432139716944774 + ] + }, + "properties": { + "name": "កាតអានុស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77020388034996, + 43.355389614144125 + ] + }, + "properties": { + "name": "ហូនអុីវិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71422922218458, + 43.39572175444749 + ] + }, + "properties": { + "name": "កង្ហារហ្សង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80811910645596, + 43.35512639430812 + ] + }, + "properties": { + "name": "សំរេនវុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7724998274042, + 43.41694694514904 + ] + }, + "properties": { + "name": "វីតសូនិដ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73135837168584, + 43.36884945671792 + ] + }, + "properties": { + "name": "កែវពេជ្រហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69460207477068, + 43.428710993754985 + ] + }, + "properties": { + "name": "តាវឡេនធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76448296356268, + 43.36428673299194 + ] + }, + "properties": { + "name": "ច័ន្ទរៀប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.802561744849, + 43.41617876497942 + ] + }, + "properties": { + "name": "ច័ន្ទវិចហ្សង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68324232885586, + 43.36567805801991 + ] + }, + "properties": { + "name": "មីយ័ត្របាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77924790755995, + 43.41061988737287 + ] + }, + "properties": { + "name": "ចិនឡិចហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71615083518405, + 43.36881313579839 + ] + }, + "properties": { + "name": "វិតសេប្រយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69546898154242, + 43.35655352001465 + ] + }, + "properties": { + "name": "ស៊ីរីស៊ិតវិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70714539402704, + 43.40277489336368 + ] + }, + "properties": { + "name": "យើងម៉ែរសក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73869004597355, + 43.3979317809734 + ] + }, + "properties": { + "name": "ហេងហេងសាប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77341989701013, + 43.42896897249898 + ] + }, + "properties": { + "name": "ព្រំបិកពេជ្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80349157227822, + 43.349848227968004 + ] + }, + "properties": { + "name": "នីរត្រៀបហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69575350735644, + 43.39440581998034 + ] + }, + "properties": { + "name": "រសេតីប៊ុនរេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76673101508475, + 43.40832067238146 + ] + }, + "properties": { + "name": "បិរតសុខជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7033349879268, + 43.36625613087064 + ] + }, + "properties": { + "name": "កាតពេញនស្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69145789006234, + 43.421352287768 + ] + }, + "properties": { + "name": "ពិសីតាណែត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68021012585598, + 43.409843945637516 + ] + }, + "properties": { + "name": "ស្សីមីលឡែប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80067525333857, + 43.40857074570623 + ] + }, + "properties": { + "name": "នាងឡែនមិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75174712820811, + 43.42236484770809 + ] + }, + "properties": { + "name": "សោមសរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71200361798604, + 43.43284818574873 + ] + }, + "properties": { + "name": "ពេជ្រប្រង់ស្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7371577618475, + 43.36076357659499 + ] + }, + "properties": { + "name": "សំរិស្តភូម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78549866252667, + 43.359352490416454 + ] + }, + "properties": { + "name": "សុកិវស្សុន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76976902839022, + 43.43289122403798 + ] + }, + "properties": { + "name": "ហ៊ីស្សាកែវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68644387094035, + 43.41047513412481 + ] + }, + "properties": { + "name": "វិលវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7457522351002, + 43.3495132851859 + ] + }, + "properties": { + "name": "ចិនជ្រហត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80034792031874, + 43.38644279158878 + ] + }, + "properties": { + "name": "កែវជ្រសេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72768092527274, + 43.37136019836178 + ] + }, + "properties": { + "name": "និវន់វីង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7869625270542, + 43.407116320877515 + ] + }, + "properties": { + "name": "កំសសេហេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80612227337062, + 43.374054628104244 + ] + }, + "properties": { + "name": "ច័ន្ទអង្គកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69712989457033, + 43.409006441421774 + ] + }, + "properties": { + "name": "លែកច្របន្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75695292521847, + 43.38067225423718 + ] + }, + "properties": { + "name": "កុលសង្វាត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73579996349146, + 43.40513752522444 + ] + }, + "properties": { + "name": "អូររតេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70153325813037, + 43.36301411583288 + ] + }, + "properties": { + "name": "ឡាវពៅរ៉" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7981814139967, + 43.42757315272791 + ] + }, + "properties": { + "name": "ចិនម៉ែរតូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72315193807966, + 43.36044518781519 + ] + }, + "properties": { + "name": "បូមារតូក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8002407020283, + 43.43430424899325 + ] + }, + "properties": { + "name": "បូលលេសន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77237993667956, + 43.38612795615614 + ] + }, + "properties": { + "name": "ព្រំមានទីស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72917051610692, + 43.38030925337501 + ] + }, + "properties": { + "name": "វ័តប្រវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74255368468678, + 43.36152227031235 + ] + }, + "properties": { + "name": "សោននិយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80992661089192, + 43.35959810961017 + ] + }, + "properties": { + "name": "ខេនស៊ុនធឿ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68565824307961, + 43.39554769936437 + ] + }, + "properties": { + "name": "ចិនសំវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80876178544606, + 43.40594775850924 + ] + }, + "properties": { + "name": "បាលស៊ុយសុធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79171375141541, + 43.37724693366085 + ] + }, + "properties": { + "name": "ហុងហ្វារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80537890775803, + 43.37050760289313 + ] + }, + "properties": { + "name": "ស្នងកិច្ចត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7102499402123, + 43.42814190509163 + ] + }, + "properties": { + "name": "កំពង់ធ្វូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72725252475258, + 43.39709661578507 + ] + }, + "properties": { + "name": "ហសេហ៊ុន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74784723690584, + 43.41521339093256 + ] + }, + "properties": { + "name": "យើងអូរយឹម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7623207554578, + 43.38730733610385 + ] + }, + "properties": { + "name": "ហូរស៊ីវរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79924421917409, + 43.42392650000547 + ] + }, + "properties": { + "name": "សោរុតន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68472724045215, + 43.40314645202054 + ] + }, + "properties": { + "name": "ប៉ៃលេវលាហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80629901189476, + 43.38836101066222 + ] + }, + "properties": { + "name": "ព្រំតិះសារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78240401503763, + 43.418167574383154 + ] + }, + "properties": { + "name": "នីរមិត្តស្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74899049173183, + 43.35978011030452 + ] + }, + "properties": { + "name": "អូស្មើរមី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71837775850701, + 43.413230362903774 + ] + }, + "properties": { + "name": "ខេនពងធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68993608065009, + 43.42850244841114 + ] + }, + "properties": { + "name": "ប៉ៃហ្វិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72430414450692, + 43.368227575105895 + ] + }, + "properties": { + "name": "រីហ្សត្រៀល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80361711214474, + 43.37758054134173 + ] + }, + "properties": { + "name": "មុតសុធ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78448826623327, + 43.40778150275572 + ] + }, + "properties": { + "name": "ឡារីយ៉ានត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7540036054314, + 43.3686606227483 + ] + }, + "properties": { + "name": "សោរហេងវិជ្ជ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70598500047898, + 43.414710780482704 + ] + }, + "properties": { + "name": "កូនទែនត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79266661958326, + 43.36707412081478 + ] + }, + "properties": { + "name": "ព្រំប្រចនា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69940154622332, + 43.42557707213296 + ] + }, + "properties": { + "name": "រូយពៅតូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77653672973968, + 43.43129618944092 + ] + }, + "properties": { + "name": "សុវណ្ណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78128355470253, + 43.40368349119406 + ] + }, + "properties": { + "name": "ខ្មែរអង្ររខេត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79552728274322, + 43.35728961193199 + ] + }, + "properties": { + "name": "លាបសារ៉ាគី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68632057151477, + 43.36876285849297 + ] + }, + "properties": { + "name": "បូវតិភូម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75386459073984, + 43.411346360616706 + ] + }, + "properties": { + "name": "ហារ៉ូម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.798563373684, + 43.364816052051095 + ] + }, + "properties": { + "name": "បាយស្វា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73507855468558, + 43.36957489036729 + ] + }, + "properties": { + "name": "កេដីវុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78205345087847, + 43.36084340880072 + ] + }, + "properties": { + "name": "ហូរវែស្របត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73296558886614, + 43.43487169315494 + ] + }, + "properties": { + "name": "ស៊ីអារីស្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77128976992998, + 43.351308892692724 + ] + }, + "properties": { + "name": "យុទ្ធិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80986872719953, + 43.40654197812139 + ] + }, + "properties": { + "name": "មតិភាពស្វា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79129756684037, + 43.385185635793984 + ] + }, + "properties": { + "name": "រតន្តបូរីអូឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70558775420707, + 43.367297132815394 + ] + }, + "properties": { + "name": "ឡារីហ្គាឡុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70034810054504, + 43.409805515179 + ] + }, + "properties": { + "name": "ត្រីស៊ុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80101296492833, + 43.379263114545654 + ] + }, + "properties": { + "name": "កន្លែកវុល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71378279711336, + 43.41910313137418 + ] + }, + "properties": { + "name": "ខេនពេជ្រវី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72754643015683, + 43.38915471655181 + ] + }, + "properties": { + "name": "អាចក្រគង់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7959957125725, + 43.42447925899338 + ] + }, + "properties": { + "name": "សួរវិបតា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76753653716436, + 43.35954211139444 + ] + }, + "properties": { + "name": "ឡារីហុី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69291900124173, + 43.3901831811295 + ] + }, + "properties": { + "name": "យើងវីអេរយូស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77920020703884, + 43.42424923487828 + ] + }, + "properties": { + "name": "សំរេនគុយកំ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71000510829862, + 43.36589692616826 + ] + }, + "properties": { + "name": "ហារ៉នស្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75379319847841, + 43.42492895081806 + ] + }, + "properties": { + "name": "រូបវិថស្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79377636589809, + 43.40482505000251 + ] + }, + "properties": { + "name": "ប៉ូវលែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78112963277265, + 43.3771838693589 + ] + }, + "properties": { + "name": "អាសារុតិកាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70650695698515, + 43.36124408080208 + ] + }, + "properties": { + "name": "ហ៊ឺស្រីត្រូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8025026710135, + 43.42174142537473 + ] + }, + "properties": { + "name": "វង្សគីន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74247782895925, + 43.38247772553153 + ] + }, + "properties": { + "name": "រតនឹងចន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71183389913674, + 43.39618636540503 + ] + }, + "properties": { + "name": "កោះកុងឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69128427956366, + 43.36415337233407 + ] + }, + "properties": { + "name": "រតនិបតា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75876821242855, + 43.40329545142529 + ] + }, + "properties": { + "name": "ប៊ីស្បូឌ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73729738997703, + 43.38364195019761 + ] + }, + "properties": { + "name": "វ៉ែហ្គាត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77492938562885, + 43.42126078217809 + ] + }, + "properties": { + "name": "សិរីរត្ន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71020910944044, + 43.40884518405177 + ] + }, + "properties": { + "name": "ហស្រុកវី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70036843133695, + 43.42863412861629 + ] + }, + "properties": { + "name": "រ៉ូណូកូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72350665262536, + 43.36725296378518 + ] + }, + "properties": { + "name": "បុណ្យហ្គោល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79352790701522, + 43.37196246914996 + ] + }, + "properties": { + "name": "លេខ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7466768058086, + 43.3671795453761 + ] + }, + "properties": { + "name": "យើងខារាវី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6825112277306, + 43.41843991400906 + ] + }, + "properties": { + "name": "អាស្សានាថ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79947118734772, + 43.39464656189167 + ] + }, + "properties": { + "name": "មេឆិតស៊ុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78847875861212, + 43.3658218011136 + ] + }, + "properties": { + "name": "យើងកុលសី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7037761131427, + 43.43478630622872 + ] + }, + "properties": { + "name": "ហ្សុយវីហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77594281665356, + 43.4301094344088 + ] + }, + "properties": { + "name": "ស៊ូហ្គួត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79096528591872, + 43.37679021418192 + ] + }, + "properties": { + "name": "ហ៊ិនវ៉ាត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68832435668643, + 43.36583529540771 + ] + }, + "properties": { + "name": "បូពៅម៉ិច" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71086934986442, + 43.36506182681032 + ] + }, + "properties": { + "name": "កុម្មង៉ូលី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74194077140565, + 43.42104057616483 + ] + }, + "properties": { + "name": "ពេញច្ឆក់ហ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77912567008902, + 43.40557154620095 + ] + }, + "properties": { + "name": "កង្រិនចេង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7995378375905, + 43.39275879787241 + ] + }, + "properties": { + "name": "អូរតាំងយូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70924736545005, + 43.42356441906613 + ] + }, + "properties": { + "name": "រំលោភ័ណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69524497079355, + 43.37861559756562 + ] + }, + "properties": { + "name": "អូរអរះសិរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75530418559674, + 43.39405110523407 + ] + }, + "properties": { + "name": "វ៉ាតាព្រែក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77187668054727, + 43.37420256315972 + ] + }, + "properties": { + "name": "លីហុងឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78482928129648, + 43.36545123852039 + ] + }, + "properties": { + "name": "ខេនយូរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68686104676305, + 43.37665408185843 + ] + }, + "properties": { + "name": "ខេនអាពិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73847060914883, + 43.373977237929885 + ] + }, + "properties": { + "name": "កាអ៊ីនស្រី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7505368180624, + 43.40887415157716 + ] + }, + "properties": { + "name": "ហារ៉ូម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68939442848985, + 43.432814343020474 + ] + }, + "properties": { + "name": "សេត្តភាពរតនឹង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79212385604672, + 43.39649637642949 + ] + }, + "properties": { + "name": "អេសវ៉ាន់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73118413529554, + 43.36529154411624 + ] + }, + "properties": { + "name": "ប៉ៃពីសូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80192077795683, + 43.39338113096741 + ] + }, + "properties": { + "name": "រ៉ូហ្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76582619925636, + 43.36371036311658 + ] + }, + "properties": { + "name": "ហីល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78360718690517, + 43.40107374814048 + ] + }, + "properties": { + "name": "ស្រុកយុត្តិង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79129804827092, + 43.40167654750814 + ] + }, + "properties": { + "name": "បន្ទូតក្រែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79692882201904, + 43.3917764267396 + ] + }, + "properties": { + "name": "ខេនស៊ូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71921782102965, + 43.37832953407491 + ] + }, + "properties": { + "name": "អាស្សីសោភា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7695253657024, + 43.35572056135147 + ] + }, + "properties": { + "name": "សាលីខ្មែរមង្គល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69910033768676, + 43.41297718826794 + ] + }, + "properties": { + "name": "អរុប្រវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7216708855165, + 43.39449707804397 + ] + }, + "properties": { + "name": "ខ្លាតវីរនី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68454076499819, + 43.4130273384563 + ] + }, + "properties": { + "name": "ហ្ស៊កក្រសា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7978969527686, + 43.37322848049801 + ] + }, + "properties": { + "name": "រ៉េសិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74810820514933, + 43.42295086632861 + ] + }, + "properties": { + "name": "អែសហ្គ្រីស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76971110794056, + 43.40454383648509 + ] + }, + "properties": { + "name": "វ៉េតបុរិស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70666954167086, + 43.36523418565291 + ] + }, + "properties": { + "name": "កេនវីឡាវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76122497303173, + 43.363517663956385 + ] + }, + "properties": { + "name": "ឡារិកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68387814471124, + 43.425496059120774 + ] + }, + "properties": { + "name": "អ៊ុយតូហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79403525959267, + 43.3792153378827 + ] + }, + "properties": { + "name": "គួយនិងអន្តរង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75100548811683, + 43.39047715562807 + ] + }, + "properties": { + "name": "វីវិត្រស្តង់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77016530627953, + 43.42136848576444 + ] + }, + "properties": { + "name": "វត្តវរក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70326467495293, + 43.3667227858745 + ] + }, + "properties": { + "name": "ហ៊ូនឡង់គីស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79451274929997, + 43.3769361667881 + ] + }, + "properties": { + "name": "អន្ដរក្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74414184113465, + 43.4198929856484 + ] + }, + "properties": { + "name": "យុវនិយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68553108003713, + 43.40418626176351 + ] + }, + "properties": { + "name": "សារ៉ាត់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.758451981579, + 43.40661180043037 + ] + }, + "properties": { + "name": "គោរពត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76446093151105, + 43.36946325417055 + ] + }, + "properties": { + "name": "យើងកាមេរូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79287839399207, + 43.40951549303212 + ] + }, + "properties": { + "name": "សួន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70611039457434, + 43.35965668738938 + ] + }, + "properties": { + "name": "មេលលិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69224542796557, + 43.40541796787267 + ] + }, + "properties": { + "name": "កែវយើងកើត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77267958816054, + 43.36835086713538 + ] + }, + "properties": { + "name": "លែងលា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70517398976377, + 43.35589979519304 + ] + }, + "properties": { + "name": "សេវាហ្គូស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77919849856767, + 43.38948863740822 + ] + }, + "properties": { + "name": "លានគុលម៉ែ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74852657615374, + 43.368035102050556 + ] + }, + "properties": { + "name": "ប៉ូរេផា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8018303276579, + 43.41066995715488 + ] + }, + "properties": { + "name": "យុត្តិវិរៈ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79961267574875, + 43.41130588389156 + ] + }, + "properties": { + "name": "សារ៉ារិ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69645337624382, + 43.39265030876178 + ] + }, + "properties": { + "name": "គ្រែនេបូស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7191468321173, + 43.42392667442423 + ] + }, + "properties": { + "name": "សិរីវេស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7342148596022, + 43.43099893728912 + ] + }, + "properties": { + "name": "ការ៉េយហូហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77732507699606, + 43.38623201452739 + ] + }, + "properties": { + "name": "ស៊ីសេរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71082956350851, + 43.38549126408667 + ] + }, + "properties": { + "name": "សារ៉ាហ្ស៊ីឡាវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76411300090013, + 43.40933976089463 + ] + }, + "properties": { + "name": "វ៉ាន់ហ្សេរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78398954824854, + 43.36948219621805 + ] + }, + "properties": { + "name": "យើងយាក្រសារ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79337882430856, + 43.37720895660876 + ] + }, + "properties": { + "name": "ប៉ូយីនេស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68996107325087, + 43.422406928209155 + ] + }, + "properties": { + "name": "សូរស៊ីតស្រាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70017420172982, + 43.38444048551579 + ] + }, + "properties": { + "name": "វីវានេរិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75606679280038, + 43.379661052464786 + ] + }, + "properties": { + "name": "អ៊ុយវិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68936258330994, + 43.367193390836 + ] + }, + "properties": { + "name": "ខេនស៊ូបូរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70249826614611, + 43.41625058592514 + ] + }, + "properties": { + "name": "អេត្រាទេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79345317642661, + 43.35806303868275 + ] + }, + "properties": { + "name": "ស៊ូសុខ្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72130549115896, + 43.37731283243014 + ] + }, + "properties": { + "name": "លែងគោវិរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.697990232106, + 43.388008697758285 + ] + }, + "properties": { + "name": "ហេនសុងមរាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73929976890047, + 43.39428014691984 + ] + }, + "properties": { + "name": "បឹងក្រវា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74992980118946, + 43.40487926922523 + ] + }, + "properties": { + "name": "អាន់សុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77161874634773, + 43.37202905519117 + ] + }, + "properties": { + "name": "សត្វហ្គោល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68035720800789, + 43.42902534404895 + ] + }, + "properties": { + "name": "អឹយរឺអេល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79560857475956, + 43.41835054167006 + ] + }, + "properties": { + "name": "ប៉ៃសូពិឌា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7622740009979, + 43.35938988155741 + ] + }, + "properties": { + "name": "ប៉ុងមាស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70167668369176, + 43.37737942706315 + ] + }, + "properties": { + "name": "ចន្ទបន្ទោបេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79220472805741, + 43.370967394857274 + ] + }, + "properties": { + "name": "កណ្តិកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70605197274455, + 43.3631783702727 + ] + }, + "properties": { + "name": "អឺត្រូអេកា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79809954422117, + 43.38269404697348 + ] + }, + "properties": { + "name": "អង្គរតាស៊ិយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71282301810974, + 43.3614780487825 + ] + }, + "properties": { + "name": "ស៊ែរសឺ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76202911795551, + 43.388963708061074 + ] + }, + "properties": { + "name": "សួរម៉ាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78352949847767, + 43.37486216603791 + ] + }, + "properties": { + "name": "ខន់សុផល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69655125058282, + 43.41948745870682 + ] + }, + "properties": { + "name": "អង្គរគ្រីរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68288471547455, + 43.39133838457149 + ] + }, + "properties": { + "name": "វ៉ាវង្ស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74176331708897, + 43.41449124297849 + ] + }, + "properties": { + "name": "វង្សប៊ុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73131599315592, + 43.386183890005255 + ] + }, + "properties": { + "name": "ប៉ាក់សែត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7495919891455, + 43.36937275115885 + ] + }, + "properties": { + "name": "ម៉ាស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7808899290366, + 43.4123929892598 + ] + }, + "properties": { + "name": "ពិណ្ឌូនេសូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71107010391912, + 43.41569446800239 + ] + }, + "properties": { + "name": "វេលគុណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77381876284411, + 43.36212750958556 + ] + }, + "properties": { + "name": "ស្រះតេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76561808183595, + 43.3646540075727 + ] + }, + "properties": { + "name": "ប៉ិនវ៉ា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70768256261455, + 43.36495763486533 + ] + }, + "properties": { + "name": "សិន្តអង្កេត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68133850986704, + 43.39356919475951 + ] + }, + "properties": { + "name": "អេហ្សរិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77369490365354, + 43.40764849166715 + ] + }, + "properties": { + "name": "ស្សីរលីយ៉ា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77435222665172, + 43.369888209537465 + ] + }, + "properties": { + "name": "សត្វត្រាវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70976250274425, + 43.38613647299357 + ] + }, + "properties": { + "name": "ការ៉េម៉ានីឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7876638541386, + 43.40594467234783 + ] + }, + "properties": { + "name": "កោះប៊ីហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68258233057922, + 43.37570086811039 + ] + }, + "properties": { + "name": "រ៉ាក្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70196442157715, + 43.416438114011385 + ] + }, + "properties": { + "name": "អូរបុបូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79028356254053, + 43.35919434912281 + ] + }, + "properties": { + "name": "អេរ៉ុន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76976040903339, + 43.39444414278666 + ] + }, + "properties": { + "name": "សត្វលីព" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68775117566525, + 43.38805046573462 + ] + }, + "properties": { + "name": "អ៊ូរគីន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71947270981934, + 43.385259329115 + ] + }, + "properties": { + "name": "ហែមវីល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70856323213803, + 43.38959380084982 + ] + }, + "properties": { + "name": "បាតុក្រហ្វាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76863610944202, + 43.40530000212848 + ] + }, + "properties": { + "name": "សេត្តរ៉ាស៊ីហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80178598009663, + 43.399529550042335 + ] + }, + "properties": { + "name": "ស៊ូវាហ្គា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8006662851303, + 43.41749929793606 + ] + }, + "properties": { + "name": "អ៊ូលឿកូស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73957549194652, + 43.37019982630365 + ] + }, + "properties": { + "name": "សត្វអេស្តូន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6984248210866, + 43.40606580284836 + ] + }, + "properties": { + "name": "គ្រែរួន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79983812113207, + 43.41350876184007 + ] + }, + "properties": { + "name": "ចិត្រវិកស្រា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69464213762834, + 43.39817182398011 + ] + }, + "properties": { + "name": "សាលីពោធិ៍សេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79571732955772, + 43.407535830886915 + ] + }, + "properties": { + "name": "ក្រុងស៊ីអេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76500705923088, + 43.36447258843803 + ] + }, + "properties": { + "name": "ស្វាយគុណ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7672139315121, + 43.40138655017894 + ] + }, + "properties": { + "name": "សូឡូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71364130329908, + 43.35910335642548 + ] + }, + "properties": { + "name": "ខ្នង់ទី១" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70195270630525, + 43.38001127582769 + ] + }, + "properties": { + "name": "រៀបយាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77433559540741, + 43.39378223322739 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77458685807653, + 43.39893013269637 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7080805314349, + 43.41368620255716 + ] + }, + "properties": { + "name": "ខេត្តវិលវិចិត្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73879893147553, + 43.39384284912292 + ] + }, + "properties": { + "name": "បាតុស្តុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73262093442003, + 43.36355518973638 + ] + }, + "properties": { + "name": "ប៉ូលុស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78468477879596, + 43.40969316802062 + ] + }, + "properties": { + "name": "វិបប៊ុតសូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76033797703186, + 43.3678046156613 + ] + }, + "properties": { + "name": "វត្តព្រែកអែស៊ី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68881743280399, + 43.390835192693285 + ] + }, + "properties": { + "name": "អ៊ុកសេរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79174185804161, + 43.3665189087098 + ] + }, + "properties": { + "name": "កណ្ដឹសេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77174983504149, + 43.39359249701298 + ] + }, + "properties": { + "name": "វិបប៊ុតនូវែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77925809854949, + 43.37069486630933 + ] + }, + "properties": { + "name": "ការ៉េតវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68204247132076, + 43.36217166130706 + ] + }, + "properties": { + "name": "បាបនេបូស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70584296428965, + 43.39538121441156 + ] + }, + "properties": { + "name": "មេក្រម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69182327604175, + 43.40678015172917 + ] + }, + "properties": { + "name": "អរុណសំរែប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75553625515041, + 43.40859361157483 + ] + }, + "properties": { + "name": "វិររស្តី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70919642524537, + 43.391211256138385 + ] + }, + "properties": { + "name": "ឡាស៊ូលិន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77576815989126, + 43.36552389228779 + ] + }, + "properties": { + "name": "ពិភព" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78615629670428, + 43.40773528095682 + ] + }, + "properties": { + "name": "អូន៉ាធីសុន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71788395128456, + 43.36553552469572 + ] + }, + "properties": { + "name": "ប៊ូស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70952965976127, + 43.41917172282806 + ] + }, + "properties": { + "name": "អែស្សីសុម" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7921292492762, + 43.37371046048132 + ] + }, + "properties": { + "name": "ស៊ីរីស៊ី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75652566518554, + 43.41487051075429 + ] + }, + "properties": { + "name": "មរុស្ស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7988687278879, + 43.37911605304367 + ] + }, + "properties": { + "name": "ហាវីវេរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69912257615303, + 43.40706636699229 + ] + }, + "properties": { + "name": "រ៉ាវីរស៊ាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68342599624758, + 43.39479941828478 + ] + }, + "properties": { + "name": "ពេកវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73578697863388, + 43.417148280478545 + ] + }, + "properties": { + "name": "វ៉ូលុតចេស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76008120076163, + 43.38178722383353 + ] + }, + "properties": { + "name": "វ៉ុងទេសហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78154676401371, + 43.41363822752719 + ] + }, + "properties": { + "name": "សមុទ្រ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80034999602428, + 43.36431769367662 + ] + }, + "properties": { + "name": "អាចារ្យកន្ត្រា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73349867413635, + 43.379944834600556 + ] + }, + "properties": { + "name": "កណ្តាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78514424540608, + 43.38149130647022 + ] + }, + "properties": { + "name": "សេនជីរី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74807564169466, + 43.41227415293569 + ] + }, + "properties": { + "name": "កន្សោហ្គលី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70170716633942, + 43.4094707635549 + ] + }, + "properties": { + "name": "ការ៉ាអែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78769542449997, + 43.37623280484929 + ] + }, + "properties": { + "name": "អរុណស៊ូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70706285096477, + 43.36682892732107 + ] + }, + "properties": { + "name": "រ៉ាម៉ាល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75942788397344, + 43.37967218022653 + ] + }, + "properties": { + "name": "វ៉ុងខ្មែរ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71733865302873, + 43.377563237846035 + ] + }, + "properties": { + "name": "ពិភពបារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77684879187583, + 43.4179329712992 + ] + }, + "properties": { + "name": "អុតបាស៊ី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73912788147227, + 43.38317248975536 + ] + }, + "properties": { + "name": "នៅហេប៉េរិត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77278119432698, + 43.36646227398394 + ] + }, + "properties": { + "name": "រ៉ាស៊ីអែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78835180448068, + 43.392566024673014 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79993110486044, + 43.38633119497187 + ] + }, + "properties": { + "name": "អេស្សូទី៣" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76543681263423, + 43.369156439106254 + ] + }, + "properties": { + "name": "កែវប៉ានុ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6934171437474, + 43.37056838874022 + ] + }, + "properties": { + "name": "សរតនៈ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76843324816242, + 43.37680522783019 + ] + }, + "properties": { + "name": "បង្គុល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77183136334484, + 43.36843964656473 + ] + }, + "properties": { + "name": "ប៉ែស្សីសេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68794344890165, + 43.38602034236717 + ] + }, + "properties": { + "name": "ពេជ្រវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69634802874345, + 43.39822450684263 + ] + }, + "properties": { + "name": "ហាវីវេន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70681404788803, + 43.41741442112659 + ] + }, + "properties": { + "name": "ចិត្រវិកស្រា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69333504117501, + 43.364166156820535 + ] + }, + "properties": { + "name": "វិនភាព" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74272015882546, + 43.39280801509712 + ] + }, + "properties": { + "name": "វិបប៊ុតអែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68405950334085, + 43.37943700289293 + ] + }, + "properties": { + "name": "រួយភួន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74316204203726, + 43.36605188052207 + ] + }, + "properties": { + "name": "បឺជីបេស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79985463340205, + 43.40695304615511 + ] + }, + "properties": { + "name": "វិលវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69075382199833, + 43.41747619281008 + ] + }, + "properties": { + "name": "វុត្តរៈ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69898659823947, + 43.384597979931726 + ] + }, + "properties": { + "name": "ចិត្រសេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70556872631555, + 43.37376824381175 + ] + }, + "properties": { + "name": "ហ្គឹប" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75521644968994, + 43.38642645658674 + ] + }, + "properties": { + "name": "ម៉ៅប៊ុត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70634446498078, + 43.36240919329939 + ] + }, + "properties": { + "name": "ជុនវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79112427699889, + 43.392142308964874 + ] + }, + "properties": { + "name": "អ៊ុតហ្គាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77853923616445, + 43.36597613022587 + ] + }, + "properties": { + "name": "កោះសាស់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79474722346588, + 43.36082579348254 + ] + }, + "properties": { + "name": "ពូកែស្តា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75987920586237, + 43.40569665180225 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7992174999706, + 43.36132906366105 + ] + }, + "properties": { + "name": "បូកី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75073281514816, + 43.38612235242219 + ] + }, + "properties": { + "name": "ក្រឡាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7538700988961, + 43.41120063621675 + ] + }, + "properties": { + "name": "អេស្រូហ្គី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7751188790049, + 43.37111086008067 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74447110682644, + 43.41080847567804 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79623672287157, + 43.41475172792521 + ] + }, + "properties": { + "name": "សារ៉ោ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7730304860619, + 43.41135299100656 + ] + }, + "properties": { + "name": "ខ្នាតវែង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76604818865568, + 43.36607762819298 + ] + }, + "properties": { + "name": "ប៊ឺសស្តា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74411577907113, + 43.37025506632532 + ] + }, + "properties": { + "name": "ឡុងហ្ស៊ី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.7043887552038, + 43.39136682722383 + ] + }, + "properties": { + "name": "ចិត្រម៉ាប់សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79328314893186, + 43.37645161882441 + ] + }, + "properties": { + "name": "ពៅស្សា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78456496715268, + 43.40120502942535 + ] + }, + "properties": { + "name": "សីហា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78646283633912, + 43.39686502760711 + ] + }, + "properties": { + "name": "គេសត្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78300918334304, + 43.41042807334995 + ] + }, + "properties": { + "name": "រ៉ារី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.771590442312, + 43.40436653907381 + ] + }, + "properties": { + "name": "អ៊ិចឡាហ្វ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68860929118662, + 43.370615162726255 + ] + }, + "properties": { + "name": "ចិត្របារាំង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78196426712316, + 43.36358111630419 + ] + }, + "properties": { + "name": "ប៉ាត់ហ្គាដា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70332474873912, + 43.402108196974226 + ] + }, + "properties": { + "name": "ស្សីលលីង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77451389967845, + 43.40595220182817 + ] + }, + "properties": { + "name": "ស្វីល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.80066240984123, + 43.40711113218316 + ] + }, + "properties": { + "name": "កណ្តា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79648294246216, + 43.4011097361985 + ] + }, + "properties": { + "name": "អេស្រូឡារា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74937395274307, + 43.40161056334479 + ] + }, + "properties": { + "name": "ស៊ិងកូរ៉េម៉ាឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70275416558248, + 43.37798019379023 + ] + }, + "properties": { + "name": "វត្តវ៉ូវែស" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.75479744249915, + 43.37652446969624 + ] + }, + "properties": { + "name": "វត្តម៉ាស៊ីន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68854766491788, + 43.37354370213259 + ] + }, + "properties": { + "name": "ខ្នង់ដីណា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79343304314685, + 43.36382752459063 + ] + }, + "properties": { + "name": "បាកបូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68985688133807, + 43.403091284579874 + ] + }, + "properties": { + "name": "វត្តក្រោយច្រើន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74186456577743, + 43.37375106146967 + ] + }, + "properties": { + "name": "ក្រឡានយុវែល" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76999887222497, + 43.36467078237536 + ] + }, + "properties": { + "name": "បូពេកឡាយ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.76956423344286, + 43.38384896763025 + ] + }, + "properties": { + "name": "ត្រឡាក់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79317223430762, + 43.37112605092421 + ] + }, + "properties": { + "name": "សាលស៊ិនស្តាន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69491997066787, + 43.38568200677503 + ] + }, + "properties": { + "name": "បាក់សម្រាប់ក្រឡា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70550661582356, + 43.36859605028895 + ] + }, + "properties": { + "name": "អូស្រេ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74582144329504, + 43.392491347933725 + ] + }, + "properties": { + "name": "ម៉ង់ទី២" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.79983812113207, + 43.41350876184007 + ] + }, + "properties": { + "name": "ចិត្រវិកស្រា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73925198284087, + 43.44218709248913 + ] + }, + "properties": { + "name": "បណ្តើរចាកវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.77499563521542, + 43.418523278482645 + ] + }, + "properties": { + "name": "វគ្គប៉ះរមៀតិយេស៊ូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.8169860967655, + 43.384473967748534 + ] + }, + "properties": { + "name": "នាយនគ្រូកណ្តិក" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.78032431371867, + 43.446660440194194 + ] + }, + "properties": { + "name": "លោកខ្នងចាកវត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.71753936465939, + 43.45285380044917 + ] + }, + "properties": { + "name": "លុះវុនឈិនចុង" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69263196333395, + 43.419665985695886 + ] + }, + "properties": { + "name": "ក្រុមខ្សាចិញ្ញសែរសេន" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.70765474537438, + 43.42017682128563 + ] + }, + "properties": { + "name": "ខណ្ឌអង្គរភ្នែកវ៉ា" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.69765841770732, + 43.33820610443803 + ] + }, + "properties": { + "name": "ឡុងកុំចុះថោ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.82267605236211, + 43.42357169093535 + ] + }, + "properties": { + "name": "សូយចិនកួចសុលី" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73336307802492, + 43.42297002833131 + ] + }, + "properties": { + "name": "គ្រួសជើងស្រង់នូវ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83811908518328, + 43.33925460912034 + ] + }, + "properties": { + "name": "ត្រីក្រុងយេស៊ូ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.73171881207145, + 43.354563903522724 + ] + }, + "properties": { + "name": "ក្តើមសាប៉ូត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6961362492757, + 43.35411874665983 + ] + }, + "properties": { + "name": "សុខទេពចាន់" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.68661836305637, + 43.36823198552959 + ] + }, + "properties": { + "name": "កើតភ្លីសេនចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.83961700277996, + 43.3510427803368 + ] + }, + "properties": { + "name": "បង្គំពូជចាប់រំចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.74947187088583, + 43.39389891860199 + ] + }, + "properties": { + "name": "ស្ពឺថេនឃៀតចិត្ត" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.72910695071641, + 43.36486528376062 + ] + }, + "properties": { + "name": "ព្រុំសុខពេញ" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -70.6975455779724, + 43.38504879931599 + ] + }, + "properties": { + "name": "ព្រឹកនៅហាសីប" + } + } + ] +} diff --git a/metrics/integration/render-tests/text-font/burmese/expected1.png b/metrics/integration/render-tests/text-font/burmese/expected1.png new file mode 100644 index 0000000000000000000000000000000000000000..d006b0b23e941ee0ad0b530c1d98dfb07d1400c3 GIT binary patch literal 102291 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 ktq3QcbAub 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%0DqVc0GdXD^FMLNbTJ>FW2h z3Y&U?e!H`-luZnm2MfP>^#|3*a<8(e&N(puwYJ1Qy35wG?inYPn2nh7Xv>yx#qJ|=~{)O!9Z6B&V2eJM3le9sE&k{x0$$q)T|!`WYo zl%+bgp!}lCI{K`n8WKu$mccesoqqYPz1MSS0-HM;rr0huu4;1n!;oiVd+0Sun_MPA z*75tR8qF$snoqeqjqjEeo+}xl;b`)&ZfOS^mN}iI{$iXUo$FiLPO63Com3`7993|% zt8U;uY?Vmf{UOS>b*%i${OmLvVz?{4WE$6sC4?AZt)W|=3AIP zKou$@Cg|G>8m67V)xt#!QeFd3O~yr(!Qwx}i1fhCK#uBvWTbrgoj*zZFkk|Q#99Gi z-KiQf;VNzCs^wspP}$@ffNU=iO`4&I>uL<02gw3=82l$15` zV^1Kx^KFU~jH?heQGg3^Z-vbhd&RScmeMu=$V* zb=4xiF>Mw+EZ(g1#bUrDWWYF`zH=230zfzbI>FBgg{asn;tdN`u}%l;VHD^_$Y>gt zxof>p6sUzT=o>l(GgZ~eAa1B6u|LATwhKnkg9bqdwba}P+F}I`cViFRe4~7z(BG7c zDu5@EuxGm=BvA5^IJhGO52%w62X7%~r%_B6oq(z0vJM6dAZTke(wTu8L4_@<1i1i) zCWAh$5qhA^u$-vvaOiV069wIfcy=|CVea_FF8PoN!jW`4r#q>(gzT#Fruf}g{bUQ| zBI+q};0)=6-EDRg(v0X`-Lv^e0FG#Z!oo(1?sl&&plGnI)_ewz!mBOWXcDF;Cnu|! z&C>Ycz~lvLF!dsJP$?4ofa|tT(Dy1CUlC1C#&))XI0}s8g!{U(Aoe@%L_-gmE~$Q& z556a8_F$5=XY!Hd4uHCX$OWoi`!xKL7~NV5!4#EEg~?Gk$ffO zu7GnPuJ>Bk(mnKIVm?91Vq?oT=o7XSawh9z!$@H@Ezj8r!zm$z;U(PeKdc{#GS7%b z7UKx&Z}~_g`o|x9Q7ZYTX!g_0F&QpFI(z!oSLBtSoWd{-W%My=V*tm~6GbOm)Tk#8 z;S46xCA=IW1Z48l793-Ca95;E{FZQSvvrmv21o=-mtkCdnrr}J0^#YsewI)Pzf%xl z@81tHAX6e30JNtezzsrt&Q4YFCSK=QFLLoalCh8{M@b?JGz1S0-dh&GO z4{HLeQq)i1{dIh@Y4(8z3j{xo7MKH?M*&o{Se=o8%Lms$#|Apn#|i25k)y%pAu<$# z6S+=xf`;80C`X%S%wPbNzmsMJIKdmwXT>KqP)`PmhH=|C5-;6;N6NAtOTn{iXZQG8 zg7S$it!qp0YG6=0ML?~9Ijs&NJ|hJI!-*9j21GC&Q#9JsPdsZT)8AJ1@W5@x+9aCJ zmMMH~lBbd4KG&iHi{z=QfvIvhAlE#beJv=+MdOQX+=~Q-RT^-gFBrl`Ek)xV&Vne1v4GYm@px~gROjZd6 zhsC01Y+YI~Jw?+|J$?ntJosG1E>H=!th9-=I5EFD&w(Se$?4>ai zzxL(?yQPlpi8alC!InlWit2;f2`v|6_!j&X5_YrnF%K;&<>I1};JS2}2-qhPWeC~^ zbkIg(RLESemE+hvQj85e-6rxQ_maT>lUHeVQnn|-^kdK9!8JX?&;&sLZjl|;vnHXcV;-p zz6>n?o?w;yvC^!AK7QY2({cDYb*cJ7PVvi4{O;87p^Lo2Ua2*bgSZBzq;+ZyIaGPS z)+qSH(LN4cGg(St61ZMuODG8XdUP4?5zvTcYtS2jNLA{LqCa*OFA`RYgihlBNFTUO_tq*P;i+z*X4ZH;Jqg_+Par!z2^;KPfP-Uhyu+tBI8Ke%a zDK8Fp=BIhS|Eat>eUU1Ald{L!R6kYAo?sJ&ok)DHenU3r5<8k((;9+ljUrhCl61xz z)xkI1%_xD}B`0Y@B!4Bcjwv5Pd2q=Uvh+xuYCw>$}J2h30a6oK;a*^|@=W0OMR7<=7)bi*L9XwC_+W z$w=jW3)=_ypEXXaE6eIn3@X|csebh6g1!v?DBfnm)oZb25IU5($aB_Szo7kYfErU4 za4Zz@PN}fCf&g_o4_?Ub>*{sEtYyI{CxN3%laLAP6f?rVtF8j&Kz5x>vD%+)oxnAW zorppduZ#MzGJq57_o;L}iDo?8l?|0c0T!2lz4lt+VLCNG+%!Q&O&ht2vUKP3>;Gxs)8F$N;voflolxm1&|=r z06OS(OtWJ8$fjI733e@+*)lol>{y=p8NHU>MMktcOC|G^e}`k&o1J!2+^%FqpgpU_ z@`$QnEzV;9IK!lk@`w$n$IDCSw`wKJ~X}Q0B#D_nqGpjqcI@? z4p573o0~nEG;BTash@7u5DB8R=m!slEBXQ#REy~~57o3^8~Sbb^B7K?S&)+k^vi`7 zB~FrSG)VT7X0_yOUQ?FRXk~5qg>gsU;N`@V+H+yNHieO$txmp$L60YwY{Yi@Bj%4I zkDYsQpgk1Y>JlfJg_+EKp}-)B;~wiUEqZF~{Z;?-c-9LmFC*X@F&F$v{x6voP7vI* zP$g^>@xX|Eq=Jp}b23*qM|HfT1OsU5CfkX1fh!HuaCuqApfMw-u~vVm@~Vxg7vls7u9e&b=tR=pOo zpnW?Q&H+zaK%KVu=t=NWYYh*GA*T4n8P=sg%ns(gX|;mWFr*sJw>qukyx;7r0v4^G zTe?eeN2nJnjoYg+i!2LdT`UiXI_4Z^5;C{Vh8B719~Koc=GpHxih!3o_NMhBkV?yH zWet)3l@g3k`-uSPUEQ|dgDHCf+(LW;-kK`>2WjJulM_OOTXgilJtD~b^c6Mhj%|Ob zA$t%dSEj~OYnK73gnFC@eN4ZvT<7YB2)S@jQvyk{fou7shp6}tEdnm@5(Ym08>E^J z`D{3}#V@5nYUnCOySmHIZLydR`K9x>Om2<*{4xe7s2-2kj+ihK^3UWaXWi| zbic@e1>M!K*Q<)rqtVL@(RB-qVFZ{G48vSxI!d+S z7a)L9d^IRmLd(uqQ63;s28@0^!Sah+o!eg&J_L+E<36pnZUd>z4&w{|RGSB*t!#M?uYuh)oURS=I6#sS4_G=R5X|rqh=q{sR<7?A7?tOe0}4i7M7_ zfr-r~yLrNpho_rk*Kmj8d9BjZkSQYI%%Zj3R_0)(e%O95fd+7tG^3aCyL}u8S1$!( z^VG$t$BLLa{R?^z@1GZ1dyLm3bf4mr4-Gf^F4j3ffyDnRXiSc zk3L63!4KTgBBP*AUEOQTPnO(a)0t04?fS|!cA#I71+-DR!0`K(nrvJ`gjk*e=bLBja>wyL^XDn5~PR z^_@=)gycn~Pi&z@L%x$RW0JM>aHKa;R#6Pi0?{wYGqcL=ci&MEx#~=p`eLN}+{mAo zRtBWE*)LP4%DW$iF7)4MN0+)^%yH2i^lEORZNCyf4kB2R+asb#9#%(pn)p^nf6v@g ztbFnYGA4dp@;uC#G|a4G?M>Xf5y-S>PSkUvJe-kB!$MW-IphwLA2|M5nu9LYF8t+U zt_`i}f~Q-Xce-~5GNX3mDxJ+kr^5>vW+i_0tzB`UkaY_?M*wXC(@XD;a-_)nzcjIC_@vDJP zC#;l3wL9J;{+0@s=!@^$7xe(350fOo)c#^ed{ge(#n~Y zI~KK!f&FS^a=g@ax(!G=$*>a+{zwV$!zzR0(bAc+kIf?szd)wj`V$~~Mu8#eU~)mh zEu$_EGEl<_3&?9@)RTALdDUFqa0vy>=%d8X>^z1 zcNa3f1>UMmfa}hVgAC{{c1&}`Jz=iO?~xy%))w@wk@uA*v#}1BtBHgcCv8xIgWvg1 z?T&$s_z|0yXb$GK+{8v!+O8JTl{LG6}0K|i}7pfy{w8=rg8~M<8wz3JrPF_ zS8E}FO+GAOzjS9-ZRU<1{cOUsWYLmUeW`>#d|1&We)sDBpg)p%8$=B~*qaq^6q-PiE8 zxLV0q3XGN2tpiJWPwuEA_%c|O)F{!2_S=WmY9{BcVid1q%97F3ssy?g=I9 z7MZGboL6jKolT8G3Nm*hxF|F~W5kp?b(PBe86HfmmgN9-FwgA5Y_cTGe&yEp&E7(H z14@ooJlaj}Hx?VqfrW^siBObeEoYlWxiBDZ@r05vPhYBf6{htB(c;oCV_==h+k?QRM*YFmZ+bs40|2vCM4lyA(9V`LS7GUgfc(-2{cR*b-VvXq5!Lm<$rBS@*)0TR z#9FrFwO{GdQGEh1>zkvFK-%waqLrS-lCxsd?HAuKdpPLurLtyUL&*<{FBWz>Vevj%$V41dcF(cjBkSUWSFzw2V1X2;Ce%FVs;>CIYC6Z7sgfFUVBf zVy7(ajQPJ?ugSx!_O%95KN3JyhStqq!ZAtYXswm_&!e_$!jVu6h4#*+Tb5#kje@GFV%A$@Qr z0J%@izyMAdO|eGG;*MItAM~&0w-l~vKdwJ6(|;;w=%*}c1p+PaFSiIkAZ!Zmg!_`ise0d`D9c%xH2Ft{S}JX?G{;+tO6@RuEdc%H6;fv4@yH7lqL2-xKW6|>YYuOU*X#%G09zHL5*a1`zj za4s{{c>F7N-Q-(92ZyW1oMYFSDd_H@#}bRcEuXg2a(9Q?TWs3fSGfGqoLxVgGm#WF z-VAP@sh23n40R|15kbL3945Xgc%Fq5_;~7p1`L!uJX@j?A2G5z?g~;qn^Im6wK*Gu zG02(FLYC4Mx)pE{)mU9aAUI8U6fl-;aZ{v*E{Tl;8Z+r48|+GP;a7}mVTX;q8>||) zc3^NI^+0j>Z{V4J%>G~FPPiLEpN~cbD*TCnfLY=>sqDe5vWyl29F^=bdoHTy(ffK; zu67ase$YAIt5wcmThRijMe~-P7uBg?Q^cx1H{cY+(af6fz^cU^u~4bnanrLDJW z=ZIpqCRcM$vbUeG;SuvI$5$(upbk^!vjNejphSlhN+w~u;R>R?&}V2=7gYh}So-e{ z>}#;1j54>x5wC@pJ+*+`s3!Km5+mrS*YB$O@M8#<&Qo2Alfm-&!s?Ui^yt``*SQ$h zFPL=uo7!YY%%brN_S5kP$%A^AvgX1^GfYw^NF<&5F3*ZSN!PZp zycgWQ&ru?hQWGQnN^I?4gib5f0KDW|{1 z+h3nZA16i|SD`vEt!csn*kI#kYl0BCXEwlW5l^iMALV`~ZhZJh*6@$aj(S9cq@{1;_h}7gI^i;kJt`!q2;q+DDfq!f zk%qyv-ej!Hj~O7qBbcf)i5D}byoZ*Bij-H`UFF~_P3j4j3|N>23u3Kl>ahx*Q#5+WDVURf+8x#|Vo{ohQt zCjF)oP!1T@;@W$?{&pG$pWAzLG07VQ=-f>tYDd}T+#6Raa74xxrE+{<5d$3NUEC2F z0$qXB4zF%j{4d_Rbg75J{Rh)y)5D}Yz${1Z!(2`s)h5W-36q;GE!>1oDK0+)(kirX zEBaNC1{ZW?u_*~BoZAA`kwZMHl4vrM4r!n%Kxf;ed3|)%-q;~q9(?-E!luexU4z+dF64g>QCWEGw8qr4a44r*fkRy0FLR;qxd9*Ly9#uvk@-FS5KZ?bX= zuWBR`D0+#^q5>!i+w03ma-(@5Z8KOmWAZh5sh%wk@=$;U9Iht|qh5})O9LaK=eg&n8)59{-VPL>T}!gXTjqu&>z`6t{?!BjVb#*49d%qjDpcG(L zrV?qgJc$WhTe8D2us3FU;EL?+&)TK;N8fP%x>dlQ<5IAV<9zrt!N+I42S6+60*_z= z>Ek**1mj8gr>UmW3O&D#fFy%VLlh8oBFc^O1NLV0pAZhPwb11n0=s|4^o>%lQk4ut z03)K@-e43E7Xt&K>GG%gv^c;F08q}Cq>N7VShJ%!04S*LTQ+7dgA9_GQqWJjTlr(D zv~{ZSJ8Sahe2^Y~458opMW`y}0ShV5Z6Mja08t|S4~RNBZ>?vQOK?2*`31LR|Jn7R zD4b=M@fidb+Kc`p)j^N5n}6phIFLP8Kf&w@tf?!@z05N3>_X5)mzmG}72a@GxG7EW zkIRBpRC8$cJbW){;uOs-@)gOQ!t?Z(gmjkS33H_S+4-zaeLN{DIbfts1UoG$|FiNX zW%A+|KjF>iI3+6Z`3S`e-7FQ{k%#Xp2q<_ML}qrAV!4f1)~2KzhAB5Wz?X zt7xXRe8DVD4k1EQZTk1{7sGlO_y#FgNT8)qWZ&FaO$#)mf)5t#(tGQjnz(A>kvs!_ z^HeFjr&GU5W_Q4Xn7x3rBoyep)EzkQdRGH@3#_69LeVBRG3WlsKM6ajpLyK|j7n=#2YVBIn2=>@5(eFKA3@i(LJ^3w<2}Dg@@u9R!8}OL zjoc;vZ~7BL`4pZ~2m&h>RJZm!&3!|k1PwREpvU};SXTTC5_UQ{3xf4-EriH5)%p|5 zt_x#+nzgUw`Z(YuIE+gNXY0crT_-RE{3q>7kQu2x;x%xN?nPL;ZC#@h4A_*>O$~ZY z2T1gtf7wWZH6GMy`$;|yeQ&)S+*$X-QZHcSMPHbK+taPUR*MMI%1;Y~EPBtNf(wmm zoi$MIlWBn6Y9;gO6+1i34LvmKRr*9O#0J%B<$x1vm(l+mGbo&#VELQAHO$&+?yt#Q z)ea9=`}>ZIDelCZz%8%P5T*WAJ#<-#=>mu@34*dZn^3>D{f~|9r~vp4m-_JBXmajJ zq5}}oq}cprgA^hEMDugIf^-v|t$~UvFc5fq!VUtprR8BD!UhcKbgOAEa}5wQG>$ET znL3*eGp~fw7Tk&8(gohiP{>K|K{wEJUo+3IFi3!^EOt?#kr0-NbRH&ZR4gY#J6@^z zr>YzU);{dCn|2+b`oPD!PkUZgnkC7)&v%Y<1H(D8zP+SMGQ+B+`jy0-HNFB|{~2E! z0r3UC$STbcy)@JXR(VB7e9cl{0@6K6&&UX^XRSm`(BINcaJcK=QMn-lxaF$pHqFTn zWBDiSA=fQccxdINpfr$Fm?P9xWt)WFDY;nv87)wdVpBF-stN2)iB43c3XHRoS+#BO zyQ{EQ?yoRWxyq2b$+6YgfbeP(15RRNeoX%BSNFJh&xO3N4seAaUoou}TGy4XD?Xj_ z3JS}O*k*}CXq>bAZ{LUdCa=|La-T%cI%RZF?sR2pzqwy0nQ|HL%VuNwWO7K{+jsIb z&#e8u(%J!pf#52Ze5>4U+7IgH@Cw_YtZI}l2mscv?_h7`T6q8uZ4u>IqWGm>V!48d z#F|b|8?Kcd56d5Nm^TY3WdPMbO*=<^ug{KkrsSMm9R6rvmzWXh(_mtfk)e^%I`LxT zMHVjrho+B=#Ixe_{k(?sA7;fq(KMz~Ys_@{=@lOK@fa-bIdDclT~^SESxNf_rYo0} zZ+nuO43bYFT7AOCpYhaov-0B|?`t}CL2@Sr4f+b1xaZn!dl11t&Vs>|fbCDn#o;BA z#S{p1F?f~8cacY;D_rHK?p>B;J`(_$@YgOYI>;a_gC@iD@3A??>4INh5XCz72(xm8 zL!s)L?=f$tGADG74xIZb;CBpqm{({r1-uLB_x#&2FB6D7{ z3i4RP*ahZe7zjGvtVwoJ9a6>0Z@nH3v)?SH{d6&|{NDt@P`%><-O5PLpG2lK)r~dg zl|u357%NIgyYe7c$_*9jDh9P1%5OL4_r{oh4*4@^uuG0-)~F;62&VNvc1qja(DEb0 z9u*Wrj%(WvDvHhRSAyDo{oPo=h+T91q3;)@?(TX5OFCCwb4>K1=EjE%V$}UXJ!@eS z#ol`NJZ$^DzT3u%-qlx`xZm4g{JacC;_!wfH07ni{oqu`+ti^&ZoGwiZ;X#aTSrwo z4Cz^TwqFehWB?Gc{Y<;p(DJ&w?1;P@xWRUh5VdTVc*9UM9l`b9Rm*IXCE85H$7jsS zp(3%{>3e+OP5RqDp3a0*F;5I!Pov8sLbL&Zl{|^?}jW@QsCkGmicNd_wwwgzmvSpt zrd8oI3xXr^rKP@@R7B{FhrnK-iIh_ZRVV_|vGmA#;Z98t0jC#DF1!F|!&JWQ}CoN#rf=|MI$@5&e^q&+^ z5lnmm0*)Q@{wy~|)JTq&uw{Wyh;|478Z(70J&-(V)=&Vp(LNEnX^+kb^IWhANzuJh zi8doQ{yf=*8(xL}^C;drf#OKC`F-(ADk-kllfs>>rb8D)+d`a^HwLkQDqBUulyR;v zChx*|@JF>D1$|UhWzi|4KvU_omn;)1f?qnpSFci3uJfh|3;P*?w$|b5 z;}YW$LAm16ub;vrI3SrxliUXpFwgLyB$786V=4&+to4(B5Z8Yum?Q9&R%dJmo`_MH zQ$xjmWuw_J2~WeBf_pLqJ)Sr{jw3f5H4bo?JNU~eSbFiDr40MctC~(_lj|w11&v~P z_<0z50wwOIAK(Y@Y(aClHk=)_fYG@8&LD$WF3U1_M&T){p#Y`#LHQYq1iQKy{L=WC zt@QUpT3gW*CjFK?k_q5PlE{jOiw?n``dGHsNP?5G%jh4gS3%uM_9#3N9h==K7VvA)~oI z=k;Ixod|tzS5WB>N>_pU#~&l8^%vbF_1Bk=0xl-)N^%+us^)*LoHx*^Q2#|Ll%E|K zU$ndtiC*!#Z%3sZqy=2Dl*&+85*ag&L;=dl^+AY-oO73Nmy|x6iN6QeeEt(7?sbc< zTWhY_QCp&3NR*d{xq|Huu*~>s=nYAb-23-y=rp?g9NQf~btO@uL&^5OD&J_U98mpi zCIMH!Tc0)(K0}?74UPO#(GOOTb#B=RfqsY+d#CP{buu1sUfX)N z;&FW(A!$f=+RbEswpb+FH3kZzL^fS}x;w{0DagwPK(x)uU7H_{RQUX!HTy+a5lekFsF2zegV@szUYaB9SJ{uCbRXQAQsy#hEoK7b z9z5o0DXMn*U_GiZ|BLsUt@H5z`>;5RC4hfB_aOFFDlm4rZKtE77PW~lAFWs!>-i)| zIcQRBam9zo4GN#pu)ccP^4}VK^XO^detXIhcXJNp`Vw_`zbGw<9{c=p}G1>=?$ zP>x-W1HuS`YY>u54S|QC=5Gw$5=KB^x$5Ccq)Z)q?FE&S+VF_@f?pz4MD8(0d`qHYJpan@U23J^6L51p~TRRJ{FLZegJx|+&KH_=CeIwy3w5P%%t-Oq&)FZRtGdYQ)a z&Nk;Q`@*_En2KvXB+!g6doFzIT`yAYmB$O8_5E`x=`EypSFSqVC0enp5cC+=6qZmU z8~OdO+Br~#0{vfk<|i+Rp3T)4Np{bbf?sqLo&>G>8FNRf6fe{*oX?WA`g`L~Z<|rvCLfNRvUWJJn(#-*whCd0C9?l#)K{drj3AOW zH0!sji?4PD-*^hoUwYrF2B@Mp@{EL%~jW&?>Js7~EbnS$(?(NL8yt6!46Mk{%7SGn5sd4Q7 z)6)Mk`pV#ht{ehKm{vDoxD)b=fR(Rx>g-OKn(XHQ70JgX2PYegYfn=NDM^6T)f1R# zVdNPvo;@Q5P;#N2&xxb~6>2K~1c9wGL>d67h)0xh{V0YVCjJBlNS2?-wr&WcX zI;h}7D=TEmFkjQLVu43BMiZ^jCYk1&>-xK>TTpwk!0JO>+^8ujDT0*2Vd7Rz&?i7* z@hO^083C$40L~_$EEe1ZC2+Di;FFPDn)9suDn#!;d{DlgagqVJ6vE5X`zm-sQFbcN zfU0%`b$g=$E^@sdJ`**G98f&|cE^iM$as_r z{GXwoYq~GQc5dO)&MyIiz?=0HoEKd*4vz?U6qEjba5AkN9$#{SK5+vrJ-asJ?9E8W zsm47Vr5XAJTZ^BV3)CU*m^MiTqa2^6?Je+&Dk{wrOJAc+QA*|JVn`ztUu=+#&&P`U z%;xs#5XqjyW*PUYJ~^@z^9O?R$4oy5DMmwVo2|q|1w$g0(TM*E`U=dUZ-5c1i`L&J zVYFRb{E`$R9FoNG6~Ut51h!txm%11tHQ%Qa?sCF^Ka7^F62*`jz11{(s9OeO*U>`b zmT1c{w^#%PJ+JlL)2-xYu@>OaCLO zX+e$oPbMl2dsfxBZ-mg~VagqaT||g`4&RlFU)RTf*=f;DM0OAizxxP6d)L-Ob*KSOXy%rHb1s=s)GfSzj$a>jOxbtnZKG$r+d@DV zno?h7T-^Bu4Fc~>+(eD!of+DZn7x4XpBwrd|FF%b2o&h%TRDJtz0K|bSoi=$eB zl9f5g=u!*%wvDS++D5}V3$=khUEDLz4}U?s_m*Df%d2PoFTUUL)|otT9P;>R)LBlHLX zI8kI;$sOmmAL=?;_NBoSDvju9^I%>y-6!4HGV^oKo?{rw_@SK7N3fSLfWRJs>gCRD zPL{NV90A#?GB55eD#(+@Ut&5?9fBi=9KNxr;%;kQ!`n9^PQh53S_NX}Ou8;@4uskt zx_CS3HZCfyP)##LPo7B+)#C5PCaGh*F_pH3$X2bVP z#62e&wd&NsTUMh{e{U*c(iYbXoZ;ep4|on~0DaEBbd$i6y6PvhpIgq2{Do$12LkI8 zl_I{av`iH{loLcreO0YG&)}8$x9vM= zdrMLkJBS(f1Z@2CC8~%fM#M^&M>Jul5I4(#-&d2E3xa3CQNREFbs-}MrCp8v<&8Q= z(u$nVTPVw8l_B$0>IEIQKv^O&(l0|3?K4;22g6|gX>^?x^c+9xK?00Y-w$1#-^teB7)$mAK$FeB*H{}4yq4E(i3bRW6@X2;=fytVhaT;}P((IQ z4FG;UZ%WMnpzj#RLT0WtqCGq$H4*udhvs@qNTNT|FGC@N-&`9Nf+Bu0!WaE?D1cPI z`a)V9yC9$D9DX<~%p}H+3P^(9^X6Ihuxv4I$%)5$(*l=rDg4h>nn8rL?+em;l3?*xJ$7oW~Dl2Q?FVwo;2d^W|p% z!j7xH?gS1xG?O}F9C~5^7Y=cIS|FbkLb3C~;>Z|L(b0bsWP_@z$04i-j9hnA-3Cvz&#KcAKMBRIaUlNB!)HKj)ra!D_X3;?nTeLj(#-K`ndR z(ydfEiJNj6I3f8Gjezajt(+!8P;MtwfqvNX+mD#ni2M}PtF>D)in3|^+GpYq4LJKe z{k)chsB=&Z#_28uJ5r3O0pl%NtQ3=R%O@Ya*XNUB+m`uOra(=^(CPQ(?h>fCA_rDhhob zH`ltGe!E#F#T#<8BdV#>j6egJtZh++8)Id+Gwz9j zf7_86XOq4zeK`LuG&K~HPO&LmQu1~K6j)BUTYgyKSWr1hLhg^VTO7ALU6-?c=pQLAFI4JZBG z$~Y=mng8vc*MPg3HY$sfUxji@EV@^oFEOK>EGws%hRQ%dQfO4;8{mUCWch9shH#DW0gFR4Tnc= zrZIBZF2z^i4>DRadC~ILvWJ-Zf=#Ioy$!R%$I6n?J^8Rceblk8YcI#`2xbKm?A{2N zRX>^(odN>agyx1~2^X7vwln&pM24@|9tJ~1=>hEc4T0{>UrJg$ntR7!o*SZ7B$uPQ z=80#V;j!a!zfs$q0XRC$@f`_$(zH3xpNOOJyZZC$AJ60f?5{`wILTopuU!r)4r%W< zD_&0389@N6ytF9-?YIgoVwBHscF>npuZ>>X93|k4KKs%r&AY7Ns;>&L4esXvLa`=Y z*(U4_f=pD#X}Q6ABy^SF0N-v_Ug?+bl>u%vMEStzjGIK+OcuJ%5w3>PbCgTNG(2O@ zp;yq#^OYodhmB8r!{iJ^e}j?NrvK`RK$Ey7-Do~xEjNpH$F)(%pTO>=L&k$>k>{R* zIH0K>m$+xp^D$LZ2&DEs6JQ4r?pDbq?u!!|TKM zWIE^~wu)_PW@s^X>78Nj2o~)ukmeU+j@8zU@V}KQzwT_~TY5>%{b3Tgzx0b{_NbCj zfEY*kcll`E1v{>!fTBewszPy`!47VfCVfzP7KVTQ?&y+3;uk()HR4cmA#HHp0Z=-r zK~?zpM4l%6SgzF83`G4Avp++ZDzoLDz#*{>2h@B)XxDM)(3Msg1cPY=!zN@Q8ssds zUg;r_r`^&s-c14NX|d|X7xMz011c8p_Un=EXIcRu+}6BQHE+U8B##4P`@NtfpENu@ zteE{Px)joN(JgI2a|cDg9yA~(#M5UP)t()w;=D|=LSnL~kDa7vL&hoB z$__(eY~k<9lKv%xf)i>tU?a;T)5yrZf7I_7lsZ@jPUwJ=W1G*c(W=g-JVUbtzu?f( zH^p%o-PO?tC^TLEIJp8NOlfVek+T);VA5Kjnc6rsILcZe_~(sf`^AdwCcBZM<|(7} zrs(I^z7R0^S)+tZoUXI^MZ|^LWwhLo8~q?gZF_?cP44zx3p0>hk1Dx`m$tQ7TWPs) zWw&aG$M`4Oqn#2v%X$@qz5rhKf;d(wq_XI4@wt4hwIFrFKu+<{tFP?Edz7qdEEAj= zxe(3=myBz>j3Kkv8u)1Prq(Rc-%&IwNC#1sZ&rg3qbbK~sQUr4wEONix!Bi|P%G6x zD|k?hM-Q#&<-dNJS6b$fA~FPo9<$GKTtHDrrGb=??ayhe8256xGI%_^;KYVqgVavP z1{X#kU0btv8y3xP2gwgfH`-#hCyVMbUKKapyz6&=Ox$o*S}$g>$$yh`SGIAHJQ**G z_c|Y&p@GN&nlR3+=I+yI{+k(VdaB(*D4?Jd$nE(4r!cJ4c9UYcMT`yV%&)!3$HG}5b_VV&=XQQ>>YSSi7(q9uX#z0)Ig0E1&#_M#yVx|+!uE6ERa&5)-(A*sHm-?S z2h&OQ9Ae7v95ATrE74Vv;a=fE5TapUBF|AT@$o9~H-UILZrJw)8`U_3V$c*0l|OegVq!P<^uz56OhhxnMV#nIqEe70MxXMPPgh*O`q&&Lm^bH z-T(k+)*i$k=P7VPg2GW22Xks-V0+;nDTV;G?-B$kdj9S|7pM;?%af_esAtS9f;BI2 z&=O1)*R%b)R||pwABa28#ed$cvj@2$0Q1|~84eH(-}T-Ji{mc9ClY_A)=h&Z9kf*0E}U2Acm7BB(nk^>}L@uj=6ckwPdC8smRG z|0sR|`+uITC?4b~>h~W(bSf$~6!#(e-=zb69M9ub4*UQA!rlftfLhu0V^DV&ggKl0 z@FhIXpmyr>FDXyldwI`TXwJfxir{9Qw8Q&2 zdt2P*_hbSxj|(I{Z60zKi1wmo~<|F z|4t%EstDTH6|_plrfN2JTS|4PE%qLzsJ)BYttz!?soHz*z4unJ_ukv@_}=&Ld0x-| zPyPAffqQr9b?QCur+t-bi0h_!vgZ{QQ!0sz)%}F!Y z)<@v1Y+obsA>eeFD{xlK#PQfX24koBKLOBX(zOM^8^S>O{E1KfL-F0frAvmhK7Rth zgS$3!)A~MReYIqr1}sk|#_eQfk zmI*hRkBfFUci^QH`o+x-H~|psxZhC-`~?FsXXQr0o^|Wotj_hJPA82gD#3NH-LG$y z0h#Xt3@0B#@f|Op|H|GgM}K~}*li_sU;W{p!TO=J^515Mx_6{;^pBj%({5|=Pe+A` z|6E%-wT}wwf#(V9?*&&tFTIujIo#BDkJGVSp7Ct0V46;g6xL*}z5lcRCJwEmYA}9_ z|0b1=Ke7&e>);ePU16>Z%$=Sq(G2duoaeODWh`#@#?al75RhT@tO|@KQAK)JkHWRgbxcu(n$54dc}^>>KCkt zvK*;AJfK#~nDAy&ngMohl^9)g&L>8{e9v+?zBsSFc417OdX>uWIKR8>zO_tX9B)4| z;n+e^ub_C*>Tw}=S_KSSu4^lT$h%Q_PtQ`HK3X`?xmwhD!EgcGA;)PQ|IAkQEu}yS zyTQh{-Oo!sD$fa*VO>90t@*g0mrBOc5wdV+>(W4H08Zve7QAi>Zdt#%gukgu(ag!0 zgema~wS%9JF>j{O85_~W(NoqoKD4)Qs_jFow$^p7&t_CgD~4xo8tx|?J%InO(bE5; z_F^&O_$NEs*BY1&WVMa6UO&^`@utjjqx5}k(aSHPb~+B+g!MPqSgCj_`?EOiF<{d`uCZPTtS=M%_0@zgT}@cE1k(0Iw_1XNQCGxTofjrL4&Bq0KEfA&ZhA zvqBf*8h5*pG=`G~%9>X#WTWG(C=l8R?YAzWNn9$8(tM#8oCeP^%2&D>H=@I~r8H-* zlL*ksP`Y?A=lRB%Fj@rcnVC~zX0!VHhgC%!@L8gcq6&B#K;jy1#AQ|0B3K@zj;J); z#O^XK`0J8G`n=DroCjmKX57cnh@X7DqJ<|{f;4>mq$~U72++4vfWW8**4-~Eto?D_ z1e$xOmvRDJ$@77F>aK96Fmr|=+mxwZw=KJuZ*t5xs1P3)$ANiC@TYxI5}Ul(?TwB3 zrbnkr7oYRLn1od95IU8(xWYVjSuDHyk=&aG;(VXff2If6y6pk|g0$R$We{!n5uj;0rl#wAHEWa&`tskYF4s=)UG0Ntn*YE)ngi+yT__Fv;KpQaC zw~MPmJScd#kPL8-nfD%t?}NDhPIH>LL?w|JW~6fHt~Jq} zl3wqS`ruANaI9dKHCD((q4Xnm9r}w+L5BV;hlfLxRp_*}RY!YW=bHWytG6ZZ4IB0W zK3W>-1k7A^J9++M7B+>k|FSHU3a@Dng8sbMKn)LXdm8|A73s!KRY;V+r1&D65}W-S zx!T?Af16g0?Awe00)>73qMxcm>rQ&1lT%kg zwI@NmEoQ2jA-d*5DWT6sOaN(o#0HG2b0i_^t2anBC_*n$;jy_YU%2h4GWSKTOjLwp z&ax;=aUsdZp~YU~gih{<$aj{bI{n5lWunM$RV7Y2%cXnMtbFVpIqe-C3UE-imUr~i z({E4J^j{S9;7;RlY&eQXzV6bBwD-4xAG1!PQZY3D7bH0EL_IGuUCP8*s7*QsDc&xP zuIhMA2stKkENh%dGPHX8_?w~$_G(eEz*8g1ZO$350b7{&H+_K>4XQc5O+BtrXV znGPY}86sZi*wb_LB^W~<`4&i|_xSoac!6C2BK%#3ZwE)PXiC&>$#75VEDzD9G3g3nZ3iU?Ym!s%CehNn)5|R?nTE;ewf?F zPb9)#ZV6`E7gq9*^3m zL+40m2uad(VuR&72mQjbEZm}IKG4fIc>bjdCV>|1bUfcI)%oxSQBuP!edyOD**~o+ zdRQJ{pgfwOn^@5Nj&``&ML;~lbH%P+;p|H@Q)7zH$;!99;2}G*dWp|w5VKhc6xoI9 zMU}=T#drG6C0f~&;paG09Sh3BdzznS{S5CphtUW50fatoPf!)FN{(Uu^X?WdYn3)E z*LgVe)~Wz*p%p{0zL_roMlFz;_&$cxr&RQcpWlIKT0fL+3Q;ouMOv<3DnV=>oV~cD z!0McEevtmu&0p+l1b*vlahUxh%!nGPZ5|WjOGex5q(jegi5gXZ@1a=AoD7ceJ3@BM zVIJ%G_Jhtpp2M6Z$AL#ug&~$pEPWg`nA-_17KH6~=f{8&n|~YeT$MaojkCF11oOm~ zYee76$?U!s{)SYmBsQVa4qm@pk||Ui!duqBovGx%{bOvIHnIw7b@*pLn%4XNUsV8= z2@pu0*-4bsJ;VYI;Tq#fPVY6d``-K&!EK_R)!US6$*2^|)(Uy)Vi7Z`AnFs7M(y?! z?#XMq;q=<`v3!YC0MM>E;qfhY%D~c^b2cfiVr$w9oEtB}&3pfruGlT46|YM!$3Bm) zdmWf?BWaVMN@>DDRiuSl4%mO%Y`Ql0x`mX`2UBMzhqQ&ud})?W1g4_o5osuDm54~1 zsLjhoQtBdI_iURgnM4X9~ut5H?0T9uA6C$Uz0Rru!;QLcg(wmx)&kl>-)tJ?yq;>_av;EM9#Z0=>-#oI|`w2!1 zY?kapH0_@9T6O=V2G{*rbBm$waxGd=d39&RyT2Lxhmt;sv%9PFXpf_hDj7^!NAR1A zxR9hfb~_Rg{3C-7?`?YNj2{gsdkmsruPRA7Iyu?%k*F)5DrcL+L7CDU{SD&Q;P&bm z-XLM3)~6x<(4cuH?9Y(t_cuPMhMm->yx_iTUqzxKL!aUYHiv|aWa`_0J}}NlH76N9 z3eFbFUo?K}2HR5L=1Uk-SX32$~F9!UBlGxhy@q9dM0@aGctG( zYfy{I!o8KTC%j;k3GCJOBMd7ogRdA7NCt($GS;_o>n>H7c5TLhqD9c2zM5I2=rVNB z2pJOpi&BjTZ#l;Dcje+FG9AKiUda4GrZCm z?~6RlPl_z0T8?V$_YjP)H^moeRtM^>-$`rlUp@U*Q=I+PUNq7#h8(2OE^k_&;uTYb zbmnrQ0&~BD!GHcGrC{ENd2nTiwj*wf1_>65JY}lQSSMy#CZyudSNb@{B>V*=y(Gw0 z{dt{7bOes=$H24?QYgPWWCVpdGZIG7-XnT&p^i-xuxWVzQzD#9U6W%Fo!$~5cduO5 z02rEXA(o}6yR5`XGQw4aG>$N4`(yWq4?t6QVV;pqn55gC6!ri3zC2s;;Vuv13kCkb z8+UE~5>JnecI3S#eTOV4*fD4{Pnw+{t`dWcNM>8z*M-)3BbHvM`0Kho=xc9yUCQTM z;bOY7l+2S$2bE(eKvS6u;Z5aT5RO1DH7P)&iMAbVexTqzoI}^W7|_su7-s(7ZyQ8a z0656HP919zn9Hlu<%IN{=y*c`aIR4!Pw)1DW$KZ~zDy$zoA9WAyRqZdzfBaqSAQlQ zae&@ZRS8BkOc>@wD`Bgps@esi|0cR2nO)Jxvjdj(6_voMhqC#b9+?X0mC-bW_6xK$ zK7U&%`ANlNc5*cNmQ0g5bhb3DI~a(nSa~Lyns6{i!S}FU<63sGp^iJ5yK`B_--&*I zwy>nmjK7=z$n~@7@LX0Ze*NkzBWkYT$7afU1Og`Lri6E-w?=6dF2ssYo0*zF{(hse zWO6lOk-)=-#v%>86~!WZFS=he7?5(g&JqPNWZWI@y>9`c2p2dX62}vT_7rur_dPue zLx}OS>d_7M9PrWMPkRNRd(nOQC!2-iq&5v>9 zZmxh6QS7OnZuaw(S~u&2qsAH}Q4Gj;5gpq?Cb-}76LZR#S9iEXXe+;O^k|vou(DX} zVd7u7Cywnc*qlSsDhG9EDQG?1g|~(3AU{;YpX{yv(@L5ynf2esezg4Vqy==RMp@Y- z5{sv!qN%fQ^jL#|ENP9wLrM%ur1e(8txuftJmiSyVH+)hR|2D17rEC)m;M{n8-h=20Bv){!H;w%-Wgb$Br7rmy8eHXQ zXV^@7z}f*^*l^bxQZR!Jt5omny{1lG``Rg?o*MU|Rk@nTQ%Ok# z_CDy_-VnW4d5?Y0n==`;vq9?szna1KLR?;FPVbRy_8%-szVay!EB#B&jV9;dO%9AU zJ`*j`>Q8}fD7*a@?~vfO#l8XjYw|AEfOv4+S(l7bP|7^efiJKCMdgBgye$S1?T)w! z=~q39;#i+}1k4WW_$f>OK7$0Wf`ecK#h-m^>4ju3vLt+yc+4!Qt<^F*pmk^R=4q-e zba{`}97Q|Fbd|YtS;?V=A7rDVgO={rTUjmOWtWALy;_go8|J$6MxTeUZD5AYE+O@D zU`Nn^p+3Ex3gE&))IOcCEEHdp&602 zKjNw~Kr@2cQ?XeBmbaGQPMdx3Xe7Q-_;KWQ)Ya>mh*O2uV+k?S%W;(S^w>T`9lu%- z!P5Non3jn0^IaE6hX3-#0#M{ul|F5%1 z-=>tG+UnLf>G8Fct?^p(KI&&=s0`6XSu8D+x2}GP`zT98uua!hp=qT4&Kkur6Q}rL zh6SK+>2h_?>7=P}lyTV?=UB_4Cp%q>>8R@~bP}A7#fj>OT|9-Ry7w-sB47&>{w9!q zY_-RtFTNK__TI3dL&`}!=2$D+G?XvY43ZT3%(H@;Z@S#kI^q^beKdDOs#S~P=61Rm zGl4I*id3H`i;X`%Ks)rAaW9+$(p5aQT$Epti~iHbkn%UAL!xZ$tO#QJuXAd9`jd{H z4BD2uL+>SzY=i6S^_5`=YUlgB_N8GBBYPH{KFHsh667JuXktaf@T|Bv{?$#*i-zxA z2$qv^riELVAqTG`u^45ok?8{>^APv=MPZ8NSt1WG{-k|!6~b|dN+MIRn~c6+R~R$x z`u<^WTDbC^EZrO)WHuuiH0x?9(YzbqJi`H1vGk`Lx!`5kIMprTIf8ld*WTY6M}x|n za06mRNY;yl8F@xt^-8@!I7Bs|G)8pR1$n*lVsYY-emCQPj2gxXgc$!}qQ8`1Q~%nR zwD72vc2ypxr25!bxK!N^^6fEy5V_-8TRu|TNZxy*9h0N%UxB9I6dXPAc-+n;u(n0* z&JZ=$aI9=SI_fl{vFK#9#ct`Ch;xe+L@Rd~bp*y8Dvzr4$;T7cp|Z|LQC;U6!)#~c z`{mMQug$J=YWD7>^sd{k+kQUuT4rx8wijag<}zQZyqF~z`q>bYwN8yp?_+JDCQTyV zx)@o_kONyMCFgJ6~?Se%*Q%Ez(x~*mr=Elc1InkLbrOs>#NQDrw?7x4jn) zgI_#-(RlDW{X>#`t3kBvBWzc>3@D0tJ`G}YkFG?;*!E$>+Sl&Kp7iohb7dw0-=WWhq)wdNO!Eq!HbWkbfQ4fN9L z^i%VLf0Z!QA1vb}UbPl7wkN!_8eY&YUu$q)qVO$c0V$KnV~f5GTT}6p*-z;5WiK{5^kbrj!P@L{p!*7W zR7+XbzSNL#ydGpc2!@?ouctaSDN&E!E!>R>R4Hw?(zayqf0s+h1M>D%cNzZyhgR^= zkkvI}mF=_?)r%kH;eo+_3ahgT?<=F;msRH+;hX7S+(17$hhcR_fnNM<4dM;0F#bw^`?5f41G{E*ZPc;NhV0tC3q@4v3o zGPz(n5dn`$u9$E&9>Kvh&|Ab_D(tqALbCUNTY3cn!FgmX4>q-C(%Kia6!!A(wu!%Q zG9A}toWBZ`5{srR=DF_FV=fqrYChWteCH`MqM|ja!*OtCFw`1d@GnrthMlrGG{md8 z(^(At#t^h?r^UXjvI#*f$g&~kf4O?OmLLaO{mqDk$;QpqHVqbFHF)T!YfI( zd5!lO8vL;5K_msI#1gv(&q?0;IR4-RDa|D zspn~>d!tBx)4)TJ9%uVPD84h9!QHN|t^Hx5CP~*$55fx|QSLrB4-@9Sm^%j<%TH|2 z3KK6ago=E*1xx5TZU19(DU{WJL~*lk{=;qgDMF6rIC|r?U$yC?i)=ofoRwJ%s}2Sk zgNQ@N8|zhyJ`kW-#7ne#1K@1?8i2j`L|aLmgP&jGW5+O;snnwL|A!fV?l^0c6Xz}a z4+Y(9T=+tg`P%)B&O8Z4lj1Z5;P8{9(poKO{2L0moMbmVuu!z!?DZ4sU>2=ofz9ii zRyd(|y=>ax`$LYSwO5BhCEBGSvbi_}_+hY+!Gfd5v13r*6;K^k=|FG!&-7yt4-PO3 zbeQ_8`N$~*gH^z-pCK$R)*w~<#&46S7l3jcEOUk$%1BlThc5=$d20&L^A2(|+Cu@nfZ2U!T_W+_r;zNm> zubY*}2~L7@o#h7(HZe1tw$1q`5CB3@arn}WEl{SV0$L~3gq(O+&j)ZYrrT*`%SpJ$@*tC6 z(C+(7F3XlKTLnO0>Cx17&!sznmo;F0)W&hjXx{WhcW0-kbD#sF(K|n0W`>cyhhpeJ zr2%DM-dC@^6VXZ!iwL<7b}&aGXQ9o%|FZ2zTxd?-jNV+*}_-( zj=9!5HMeF)?`p~hSRn^dAX@Ot?>d^VCYjDJ`EG17^;hTHI*`MHTpe7XVIOkIel#F` zW&(kZ_SsS;glIyJf#FLS_Nj^aR>aIeatsm8Tg8@h-1Sv`h}Fl`dX4G5r~w^`IG6_{ zzC024)LViN+}6AB0)s?=z@Kl_071d|4&W-lMMtA)Km1NZ>xW-`IVZHU-+Ne@z2dbTjEUIQw}LwMQn*WHNta zJv8ajPx3ceZJ%m`N=RQSc#giWJsW2F_^-FB(?G)~aBSPVnRiG_%ntO!Tq9x(QoiQ) z&)3jB;VN%X0xJB{YV0v)5kJ(U8t^A~ow4yFjT`W@+8RCJAA*s&-cSQHvnB`GvZrA*4Kze?`g`z6O#m%7X6yQIC zJsUQv54$)?xdf0`VI5|Y2=DB>%WRO&h2H6;Dlnz#sCttwqMod06?V9EZvirB*y|#B z%!UkS<&B{*B0os1Kc&l52rAoR4p88Fpx{*FA`cAl3yh0GLPnX)NJ}tmJa|WnIDpA> zE{z9qR{YUyjWe5#TJWP*k$xP~u5C`lN`Wpc-oEdZ48MW;+Af@4t#^0B{Y8J7e2`E@ zj}?j4yNnl^E2ndO@g%*$`qXp)l5aMqOVc2#T;{nOG;&lc|GhnYInNB{m%d4_Hh8GM5* z;FQ}Fviz3{dwH8@O*D$Esj?XQA2URi>gFLA&E*cq%iKg>1`keehR#7yQ?UEq{0f)Q z^-XJ!^EsDniOK@d=a{&>2L`a_PyPHhff`Vo-TbrAr^CJ&0+Z7Or~O!56-?OsXWF80 z#I_v0{admFenSkw#ySf&#zBqJGb0KEFsyHgWR!w_G7|K;Z%i_Zu}310Dr5je+O4jk z$5ngQgndsrI!K}h9#X5_r7)M54l;%$k@!AMN!~oe=!`k$goTq|hHy7W3969w{xeQ= zdqF?Mmqpp8aNx2L|K4%?^K%V)pHF!NH^$56IPosCzI?uL>C-zm6k#A2C{I=)oiYtb zI{oZhcu@rL>sDKj6!++X!+`5#E@ z(0!WmdXW1(v$th)(p2~Bk(J{eAkTTA2`=D1`Ycq^$LjP7t}~e@$)2KCGfQke_Plc8 z&2W23V=;!R-&2jojN6UEV4zYxzzwGQ?MsG$Z*27>fhzl02zH2|w_lcG9}ZM$Dvp}w z@_x3AXO27`(+|`8a#Xo)vVDkp5O=8Knh5v&C4i;^`V>VR9wn}-GtuOHr)l$Ev0pVe zx9LXRt=%E2eRcNJ+;^!L@`}&SK-R$7Vfo{2|9ml?7V-_gDfp%8qjK-iC_6L*zXyv#bS#5)za0CXPJo#4~il(WN$H3 z#+1)61sBU_y`26>9#BP75c%czZlL8{@t)k|4=?_&NovP!5Zed(z_GHlSZ+VUQX1I? z(GA{ZLO?MMcY?DGYrbTerR2zYS^Jr`qD(oWW{twtvhlmRE}b-@l#a;yJx!0gUe6IA zAeNHa2^R|wDIs9e__I-RW0y&ez)9aFvfc|RYh*#=L2&Ga zwzSPywtNfjU+plBX@*+{ao2Yh8RZ*l>$^K*6ifzKXp`ko%sg1e^vgogJPR1fTLMW8 zkug~tcA_9DQ+{&~tN0VGMtm(hzz8s{&mtB)mpa!}n^pZ2===r$K7E6yp zgA!3Q`pWGX7N`Jk@+yN{8Zq>}SXsnlZ*yt~ye^7ov^@;JtvnJLO7QeN0kO%7@9N*~U|euN&krcJwG>SXeZ#h*R0C z2$PX1^**J6(!qwZO)dP5xy62qYC7-x-d)_n?$i;N5SEirVvrGo`}nek=ET zOLrRlXUKPZ?;E9ixisBHs6!5*Q@SlF$6D4r0#qZ7jIi6B?N3bX&?haor>P~+o#xWysQ3gO? z<<>dkY#x}Mn;khpeWzSMOsqsTNb70W1WYqx!B-$c2UjuO0Q^*NC=38U6Cu?$;|4U4wIt6PMd06V4S zyWDm4@qH7+M)!SmZU%h)5I$)~N_sybCx7EIh8 z@wpo(L-@L@yEWT8>sH_2(!aJD<6vnv%+==YlzKHe1mDj%9Kyj)5nCvM z>-W~v&ga$Ud{tizn}02t{MY1`K@$0xQ`$|Huq7Xo2=rh!|1=RF8$d5*I9w7y1qw%A zcO7Ins#IdCrMC39hYG)Q*c2$%q=_ZOoclMwuUsqc9{I4@Zs+~oOMqpr?I6UFTBI>j z;8A+LL$hjzXFAyE1AX=&u}aKflzl%9<=``X^d}aezjM`#VUQ$L+2&53W80yD7gkF* zCg#03{waM~-7OSqD(9w*1?ojR04+=UQwrS zwnT^zY9EejA6LE?VYZ1Lm@W7I9<#58`TmkMmbBP`^V8J11V}V7R#hW>S@pP^&58T~ zk23QpWBEp1H9;4}VbEInDi_VC8g?? zmJf%D#paSwQ@(2p=Ti>)-|R64;+>7omdnBqhMH9tg)5_6*fh)5+O*_P3T5*e5GNC< z*Nfc!qvf2wh4iXln`OpF3ZBg?h8Jo-nPQKf`yP0}i2U%evX+=R1Ur#~mL!0MJ|29m=dwx} zCS1ThII+hRtNY_NSeLQ1PQ8e1d~BNEoO_p~vo~J>RcASw-TFY6dHUh?%V+*et^5j} zJWoeOB26-&yc`qG-v$KV4D6q* z42)7eT|YD;Lbvu^B}SFSC6|t=!g2yHu3uNVkj@t9Ccn~I@^CUL(ifA)K2Fg)Cax7* zlr0aS948k^ZhD5g$02Q7Iih0ns}6}%QJL5bjwuI4|H{**$?$4=|DDgsQm$(6doJ1u zk+&4$edPI@5BCy6G}KI~qj`inzRXFL7^E(iYS5FRHTY_17Uwv^J>M=VfIcy!#t<1v z8b2;A8=Qi@sWFbKSEYr0ufo!fUZu?rNLLH~d!;ot5M%g2B1N>I;r9Z)iv(iORl z19EK)iUMwRi^K5cNo<>cVg)G#d5NI%q@8tE02q&QX?}tkS*N2dt=^q8KEVd z=^aA`@@Y%rXM=vSaJ+tsK(dgubkKN0U+&FX7d}%}KrY^?9b28%|GMazGIp0tL|#@+ z+~jUYf#<1XG!4guTwr%^WWoekH*@IsVNua;6-;_&?pzm?-Q9F6PsLse>Bi-f=n;_z0_-=W@8 zRIU9h&}!*?A2(Qyz-Q}(83BfqI@8110jgn#CgdzOyKVo)Wx2T; zTR7Y3z*PB@q36K1*IIVZTsd@nmEnH9TR?y~<3=^@;a#eBH)MJu`BIHsv|gx<59)E- ztGJMq={vH$Im5wL;e$R^|<8}1Xd{h2}rpEH-LvHxpUyt~mu6aYuG>}I~E6X;vT)5UT zug_9*8`I*c?m$sEPbaUPktKXc$lSy`u8g{%&Um-~=uA849`V588U_Q$YP9^4K6|J0 zDc!X!Wuw@iT2PPf{@C7CwT|S3>r9Z5B9ahe_rp>9sm4LfK()2{$2iQ3@fn8Y3ZBo1 zJycLmAU&Q?n}QAXI(_}J7Wwqe&K?;zG$1&(Yva_0!^mWj_8R70BINRm1vFoxg;A#q z%MpXJ{=ld75obJbl?!rw`ZCV2u7a$+LAIE_OJ<8)|3{vR^{+<0h(MHB3t%5-Vj_^Z zB4hdFJ#i5t<$jR7m!-3mBCgEfjT4can7gB<0&<(ta*pCHt}l$)wYyVWP(`{PvaX7+ zN*|6kxA4p>wQD`UKctnpnV?&}qkUNDjtwahUzPV*J}!I&xPA1sumdb2d~~G*n=KIi zU08^xtP~M8Q~=JQrzf80LG%$-gcu<{*3gXEhKaD$VE2$RL0|Eo6cMw?{{-n`d6@D} zsn)v!kjOo0KEb<4O~hY^uHzC6Ez#oRxS;&t#mRgGU!a?Xm!u+m5G> zeHG}q=EjVNw7q;b<2N&))An0jj;XxKEGUpCGncuN6;U&-4Ex05?%nUgG6f|q2@sl< z4agvxwcIF$)s9@|2gp*`%+fK@=NKS>$_wHbyIq-;S*GOeH=`s$+oREV-C| zRFs_W!9B^!Vajs&R||0`Tn8YBKP!4Qt&(Wew?5&2@a)f2IRu zmKG6T20>x-u4X9zH#QCqKt&qz=pre?YoPV|P|9ti#F$y{*XW`Go&u?|UiC6J`eW z6dGWf5tdNjlA%|$l-xk=L>BRiSY6ysk4WLGQ>M~O&y$!3Fzs7qQRQEQ8kySm$l9Qo&-@yrO{hHaJm-@YTJ;+DfF$lK zd2jsZ5gZ{&v;MM=Ptrw@c=7*nX!K*i>846qqS1t9gybEFa^V^N1mgXxy=a?fd z3NupT3#(&n^2D;NSf1~rCDgOMe z!x3mSafFHA1N`TC`w|zDt*-SA(tY-joj1`sSv~<)@x4j3kPOBHrW)^v><*>B83k`8@bn&2iajNTrP2C>y2$4d zpi3ib5zF@0?No9M92NVq9Jq`3}_DbkP6@6w>3l$ ziqKI4CR2sGK^Tz90OJ!%KM?n}#*V8Q1nUom%tV&9-FrBpgEatL=cFG{zMn5h97>h);KMFD&UF=^>pd_s90)7Bdo17fofIoM5uyD7Z%)&q)P66C?*2E=ogc4N z^9p=*BchyCH+uNb4AuTSUp&?jY-PNqCz7<1BJbLX0+bQ>;3&dQ)2Jzm2=sw*2krp= znsPDhrn>ME_cPe>S}H?>g`$J?}J(P@=f|#Dd+*B3C9@ z4YH9FV-S>y(OQH(ljQ~;ys!V=j#{Nx^af_-v|CWmIzy(yhtv5=eB3qb zTAU^FU&yd*`Yk^u8&pPJ6^@>uPX77dS0d^>AbEHbu>`y{VCtN;A1^pa+fi1QWGqtb^->#%@A1>U8>8l4oC-*7XxW>HleKqV{M$=j-|{^}inpOS z+)+uXfWE~^Msuveb%nwYg*BnI1We)K+u#=jZ>kDzAi-<@xZieE;8#i$mCiy#kB(Do z!rdpW*K&wCe#BJ>ol6P5wjr9kOBKCNH}hgJ-QiA|ikso=Z5upI*WKpDn4AbLJ5?s8 zhaS!z9UrodM=Grm@EED#=e3{YPUF4?bGfa`{}xZ!6khbZD}_k*l(sy`(%rUE`JWqa z5fd#OH6iYx(FC|+w7!v^1@rZ=PWJsev@dDA$trdD4r8^iqv+WXj2GKy#0*Kf(cy6{ z=6&OU4{MU_mlv|zy2AFD0yq+1Jm;Qte}Tb=xun?z{t=a@h5r7`R?PzP<%+_DSv z5bN}M7vLpM5wH%kwjWI|S(V8NWtFo6M;wJ#sDz5*C2(!pv#^~FI-&G}EvP?cf8!e- z=cH}Wq<2eCgbuYtObWpBr0T|LL$4gN3k9m={lDXT4H!v3zwIdunAemZO@hQ4GZJIE zG@Vy}8#?+_uqq{`^1Yr4OQJIG2xIOR>m7g47%Gl4`_JE=Z;SA=ntVXaVLk@XGY2vi zq#=n9-F_I&=8w@`Ui5e1dm~$;c}a4m!g{+ z4KI>0kk&F8&i~Ef8!e3R4e)k`1mVxh7iLMEQ0OJI0SlCWkDv#Dtz3I8b1Q+~J{RtZ zRWU61s%h6Puqbk!U_YWJ^Jjuw!9@0QDz_Kbexoe$%kxZamf0dg$wnS9=!ocUxfnpo zphbF6lw@@|zsbnLeC1BT6p`3FLHl*QlaCeW}{C`geYQ?0vIE;!qNo-IZ zenCT$$P^yqB@s^3Dbcxnbz_?KciTL)GwFst*x{gXDDIuK=hu@g!mlk<_(M3Ry(ZnI z;&x*I|8dszJgN~5^4^BAA3ns|F#zkhfE)HJ^M@>e8Wtukx~JnCPKx+jvMO9L$w_bj z8(tX7{jbm&Q3A#dE@}CL$o8`7sHgZQLNP;^E9%EnOOH#(b=euf3QsBt;r-gZ@KQX9 zY>)Vn7&|01JQcAND(jf-)3{eWk^6K}=?|$Op6_#={Hd<9v4#IhCAfMDd$Ou;T3l>R zhwdvHeda5L_hTia*k)guqHNqSyps_D`+c}3^@Pn|Cg~kXw%Xa$pI$&ekjpe>njdiM z<@b_})HuhgdHTf(z*}~()^+hR&-@2-c{!J4(lE5HFnUDe$x^ib3u*x{$e>9@jLo^& ztJ04&;d96a;!HwR)f}cW+P_v!d$o@Yk9a6L3-892y_lk%5JC}PNDC{K~Bg^FauL&HXgJS%&)`GpR3cgB{=`%$8X(hG0zKPb~f;k+r2~vajwD zfh01C1E3Py>TbEy$<2I|E@{AhytEgEk)?v!>{4))wN~4nG1K(i!cdvuCOEZysINYR zxo8G*VIy?Mu_L|4P6i7Yc}`f=Z5;gQrtV~PP89lctFTwRTfcW++aUA*9-wYrtB(2b z#h~{A6jp+Ilt3+1w6aq^SilF9qj>yj!V++iB1IQLDy{K-SxwDKv?-%>;HKI?mpH6yN-rmvuZ}$g*=yQDg7H zPMB|#%Uk7f={)VU{5{P0PwtHLBI@0AtOIOJYR_!Hx<=yhToU7lThsW0pDS#)QB=NX ztdJzqq1a}FA+i|_0Kfxz87d?tD`W>u`S^zYuv5>|Nsc4eOQgQLjpW$2LL2{w1}4a^ z=KL#Kck_C^90~)uXd=2)A@Zy%7OE6FNN{+FZS=C1WxF_t01XS98UB%Vr$}Gj!K4ocW5>?~c~rWmMDQ&aK3m{$?6A#UZ?bKw zWVRr~Z_qAJ*c9B}qwf7A%P8BmhbpaACG73f9z73vAX(*Av9paw87hntZVBO4yA`MM z%tkINz!veK5(On^f=$O*-t_p92mD+w#$Uxc#mK4j{?Dl)M;bN6&E%O7U8Keg{FS&3 z0xt+MK)$w%TkGIm?cSLG7k{z_rBV0K7P&TgXN+5S4R!U7yWWOIozGJoGS-zd!?Ylu zQG1mh8jIYi6m80(#?J2X?iHcnJ_cB*^FXNS+=s8)u$iAA)IF#$IQDr&Z3Ic}ISR9u zX~9F(M*4qvI?J#qzW-tGE(9f}eCh6P5RmSc zmTsQq_rI=Z-tcPKGdnZq%=yH9xA~QctaqOuH(JxK?b-zhBNE^^`_ku4^-)d<@;L{>+G+Jnr>Nyq!B{O{+dbDRU-=_Q(Sn)Dwjx~-LFcE)?ToO>f9_`2E@u(z^JYB9$Cwq`jFbLs*^kFp(A8%SPezAIa=!TY_>!wB9F)lvSqc0|fOsh6md1ii%bM*Pv} zycMpQd#M5Qqw|9;wA!X$3FJh8yVgM~AM!Ea)+u1}T$l#VZZ^Qwx*s%J%f()jv1ZUhnf_v!!kg|vSpbJ!_b2MP029KlRh5mkYRu%wjfwE*AP(}T3^W*0)S<}pcXN)_ zuIXpOXFKq|&C@syvY{Tm%Fe&<5*a@f)W_)7TN?5av1=F;?Jl92=O}Ro1J7V`25!E zpWj;6;x|JF-hdLUBNH}E(L;T0Shk!@%pt7}$#@ z#59dJGZ0-+40Jn~;P6m4(DPJvXV-}!mRaSJMXZTQJ_o0R2w8n`aw$q0aA>A!HOSqQ z;c#b!#4?9O^}h?Wt4046OTP5g>EuPD5kCv-?AiDB0>bc&F=o*}z<)V}f<@9A8MC1o zAVSHw3YFHwT_XE843g^ogROEXamVmmS>MyDAAj0lf-~H%ujGHJUg5>9rV=*@2KuyP z^^f<+46OXrzdHLiktUZa#sk#wTf9OdmRt`>Wu&GBLO2MR-2TWZ%2m&$IEghHKw!Q< z-XAYEy=Szqjs7af(74dF_T$9w{9F5f3UZUklJhr6Xdi}TJHE@M^V!eP_KyCo7KZzR zjOr&*(4BP;?^{crpvAngD~sG@_NhGegr4;!>8`5rF#7hEM>)(&64K(gXp+Q0W~8W$ zdN5Eme3KYOr!A!bf`9cHuE`O^Gz!NpB5R`t5_qm? zYrT+W0Mv@qj#^%&w@$>2hgi$rhM`d%VO}Iy>66sD)7Z{U4K>1vF*@G7hh_RCi<)kg zT=(0}AkQ}bH%5DiF+*}+T6-Do&;}eY()oqd7dRapgLYfzCi{D#d1H-6m~oUDKk8pV zpqz1C5EvEsn^PK5rw^z;KX8;Lw?5;2n(vcuqAyRRPWpZghF3#uq+qG=xHBL;gh8@w zvC$}{ux6}-q-F>n9#<+myg#|OvMaF7zlHky=VU#%h49PICv~OxDSye|=Ha>?0Hmn@ zeYL_?HcZ3_Ajj=Oo)fF2zB_RMe?|XPtK`)!n;KVf$8A^k{9sWyw7k{YyKgTq$)Nl( zYEZ@c^=Ycb#IH}=Gz`28YRFiU)VKqNq~#(h1D?J2Y>@IDJpw~`{`HFtIi-H+E46h{ zLd>*M3K+tEbplkjA39L3qJ0Tr5wjp>glN!U{qFEtpk57ZNEyh|R&@H!+Ev*uF!E6i z!Tsh=ke~0~vfAxo0$=7fRLFOBZl~HEh7PvYeZUHOLhu}v8;f1V7Zkp8M+*vmJ117O zyiOA&==4HxQwIMBj2lSorrqqmT{XAFNbwQN1#R&(xy~*NovJT?y6`t@wF#nuVu30s zvXs8RxuK&nSsX%xl~@ zt@EVSIw;=&Hfx&+>g;KpYzyxA-~i~A0FYQ$culhX)E?!lgmUfp-T30oXAEmB(UEk2 z3SDqcEqQpSJk6rIgcqgcX!qE|>g~8NDhk(sliYYOg5r(R2Xr$LT-LwEZt20gXdS9e z(L6)8C!xhWG`yvcH77rdg>4zd#qITm1N=O2Jf~j#J2?oKh6eP}~=R^zk ziH7STdzZuW%V!#Dg(b|9OlAoMy&^r**Z^@Z@(bqzc)0SH_rO3tWM_5g)t?HllgFM1 z!P(vnfh;{Lm^c^nbcoL}62|&=8jN>Pk~p2Fp;?QW2>m;r>DAw8@gk~WhRgROh?Bb9 zT$jR97fU-K#Oc!UMH*@E$jq?1a(Y+mO%3gJ3`zQ2n$rpP&f8!NCCG2^%_5iUqvN*s z6&_B)B)D!oZ!S&&Iu>p%WLgVwwKt+ za8+YgUdW4vQO3`(0{3_@fD#$3CHj~ow|$*a-92Is@&mW&q10X8mK2(ns&t98l#=9% z^&H&w(d$0vF@J)&tbK_It3bW=LhX%2oX4oiE_bN4d&4o<1t>sBajM%y<9G!h^2SHW zQPiEi$*?&LA?D$iR6dd6q_UrN#L1>!wf-Pv&*3VRtB9@aSXAPwBDX!G0ng5j??zIz+1gLs3stajrs~uHkK><( zS-N`%B)4DO5Bz|Bxy)y7y4X5w&A4fGesX>c)PUR3CX?5{!v;-mB&)#y{Lu=7aS;vq zV~T&1?9;&GXxOpXh30!*@pX7_ySLd5K%4mCdu+p(X88+4$9>bj%a96-!WcfYmVJof zKQ^Fi*F6Tkxwi2V4?4^uebF7+B}E1f+)~*W{5;c1we6adc}G!oDMIiO_6U4)qGIc; zR^nnFO188+*Vy!+x4|SSfFVl52_AsDSG{}bs zc{>omKb=`ktT47XEZSm(+}7Q;UieX6>Vr~@(ou~Ui&ho0`D`-fk~X|MDLpHS^O9Jt z-x@yNk|f{a`*lE98wK(xBz<4$VM$ByTvAzWm(;_Q1!}Tj5DxzV3!%d za4U%T2G+G@k6!nkAw+D8AwBI)e<%+%Juak|MU}mEUcXMy)28a&PJIsFho}IOQNxv> z0VBw_@0?yHWMXvD8Y9-zI-m<8k=g&@C2;$cjM2znZIjR%wKN9Bmv1EFhSj4akM+ki z8x>4F8O`+__SXy&{ge_){5WT3LnIv0)&lw~{$54&rOD8%K?joQo&a>AhW4cT!8A+2@i(#!- zA~Pk%|hgNs`P={M(;n*L{!!p z3TjjR@mXs}a3GgO2MkL}VH|pMXo0_lNvp6owa5m_@d44>W`rcM`SD@E!+R!}vTYSh z6!#VE4!<4=yH_*G$FaRnhHsLFKt~dx+O^jy{fQC0(13p`P4T*Vk$tFZEVc4F@zvN6 z4`;dU;!kPKLlP$?_OS|*i23?|G>-E1)EBvjb*5h+A1nBew61jXJz`f(S*kx#fCD}w ztLIbbo4#2e#E;25-BMscSb}a5VO8E5dZih>UddbiXQz$))&Hf zm?S5Uz^{e*0dv99kW*y%3|6f%)(?u+pbkk)!T_)RVBc=MCU)koJ(xzWvIpU0>%tlW zx=gtVY(SNbc}ay=TF^?dv&`Yt{+RZ6hw|DG#|H5!lYDlzjv@CMne=!!XNlX-4dPvn zA?2-wssvNZslwy;`@)}MD_rH(U=QhaT4;;%(lcSe!~YBb%lX%t^DQ5iMgk}Lu}xoo z3G*09G7+WzOcEaG(S;dUBD41ijC@~=i9qfy)gb{rgW6)-`~>{fROan@by>!R7vm6Q z&Pxm$H#C(-vqZ|rwBL)UK=u+1I6tVEN#brSr_hHzO{GFeS@RH`GyXJCgOZW09XLfExhYoK2~fBO7(kuJ0Q>z(V`}t$v;2 z^QP$q&9t@W_@i0U8&;pKE>8S^JiIyap_8Ec6zlE;XYskak*FX&9r$$R{!Z5Y4QJM- zE!Q*?!!4Iy$a6{$g3J-}q6PerZtBMys-}M6*{kNUd@F>ha*5=_;zIaAB{iYZP9{<@ zU8&cx(Sga@$^=x&w{zF|JzMZ9z}j#(*}@G{Y@2~or8d`SYx_a08dGS^ir)i4k`iw# z5GWyh_$4Z*+HT(GfODdE){sRf^`3O_XP~I!E0~Nh3Nr~~b_a5KomRiY@QaeanY7R^4E8tC(w0_&N~UAHd7OL7OF z)0H$IK_~Hf{}7uh+rpL8c{U*LtO&=6X(~(MNPAxejXswy7=n~iQz34g219?Ea$aBU zL4}hB$i}%bsUiQ}ZyVpb!yS>#j9hEagiYwbf!7NBz-T6_#e~f;c~b%yucrf68uyyj zFn(t$c(%91K*->~(z@ZRERM956m(Lqr;oOJ)N2;S4iwC|+Z>Y(rBw+*4EFmjs;m$< z7*1yf$%@wxf9tt*l+H@|avI#>o#)uCb9O(ARDB~%XVNcd&Lf0PRo^@4<8>Bch%B`l zjjR-%{2317MYlVkILHsmvu?1i&ba)-`<<_bIXNDUY;>qtkn5Auvf+n)Rq_oIOtbh(AKJ4lrl)AMID>(BJBn7Q^K zyLdSq3|+9gyCQ?d)|3wru@TEhYzyivXN0yYz(>894*Fp9 z0O16se^%X~zfak-Dc&RMQ<8VevmHfJ18c1C^})t!OCvKQVWU1&15E)7!TchueEe7v zL%yA+pWiC`@G}pq|M2L{IN>|?xi>Ppj&>^W^kxJL6bA$}`B*}7|9TY|N^$N}&4fJG zh`@)>c)iA?5a+3F7;ZsX>9nA;b1vCIU8Q(P(7MO527n%TC^Tp?CrR4%Dn#Rx<7p6L zM&HUl_d$yjLD>DKh>9NdhMT|T*y+#i|HUPRe*|z=Or+RS3E;Q$lK=f^vzXVCy3B)D z-A=#@v+HLEk9Z9-QZHRNprWJ|YMznf@T#y^vP7Ol{aD zQ8Wl3jp*`0SXw{yBLN{+^C~AafO(DJX}?Yk#+S-K7a4eDW)YA52b2kd8BbV8dj4q( znPg~q;Qnc?yxY3)>Q|?>6dF>0wVsmL0)Bb@#6TyeFv3@ZQljVLQmex3Da{0^p8Nl2 z166|iq`I>mfwN`jK_loHD37e&U}m-$Ckv%IdY`Mus@aEdAkB%4n3KY zn+951i|9iRn{6e$Q~Dp0OPv>K_PXB%ZCZ1P*W6NzDi9v}ys7%j#`Awn=@fkHDP9Bb zej7(HqrJx79x0eR2=0;|7yWT&?p%Gh_pre=UMGs$rqm8e-v2T^^dVQ&jlMkT4Z08}cfp~ReeztkkZ{m^ zy=olZJj+PZ&z9^L<;Yj^|Cv(BOc&p_mzj-@g5gl~_#69{sg?Vs+MKz+aRgHzS=s+@ zq_dxqNQ?kD;KnOk1p=NsUBj9t05HLF35#Yc5dZ%lu|NXYESzO(W>LkwE&Uv@8N9vk zlNcE!H@#Tgoch+EbMnZ;J{-xFsLlR26luM)vy)DQdW;OTY~TdJ!svPS5aj<$5BR1ASuxh-dv6q%_4?eM+zAyTXHIBL4Ha0;VVyhEZNL_Wq5m&W z{?Sev4ggnCps6)ut@u7dAKlqzml?x+vD~l&tbM)zoYjhwaBtxmUs_Q^QH;Z+`%Isg z%I8sGrf$>y&8?_Hn_bBk2lI~@oRaAP^olUrIr|+Laf1@L&Kk}rB9S2{s8|7PER$A#?*C?&__zj(&9IEYHc5Kx~6r5a+^(aOjVnpByy7o>;stq94Ss zTFvwo(!KjcmMdibo3za2z3OHZb9Nfxn;G7`Q9GbzviHmv!io|3Tad8*HPX<~7w8s} z+~rBWq#Qoym>mfJ_g7@~`}eimm~FLyvn$-mAp5_x@N*B}e%1Cyx`9|TyYFbDCuQA) z3R)^oins?FIi8t54b~T_;OSwamR;Gcd-UzQ=zy&*@4-ImeUyK2h#MmS3*4#2z=r-2 zY)vyPFdVnhnYU)nMAC3NU{DpnKfXx5jYLJ@jcaUWTREV0zKYSyL`9SjH^7&w4?VZ? zzM*HM?O=OJfFQi+=oYhm90=NeLUpjAnBXjER3-$FY#aBtXu8jl>_U+x-EyzW z&hJpC9m{hnpYolGCvWz1uevOOGtD#|=Kuwx%?W4M7(N5(x@0hd&q%ND<7%P^IDlUS zSMWG9*&w}c2l%+~aJlfG-9|7=S$!TP_*TKd^2T|aTv;l`Ur&O!UVmD7Lm8+1?X*nb zpI#G*NS9Az$Pv;)@Qsys$}>sx+fh5CWn-X^tfDx^K@^aH4hwk0?lVuEt7}Ug3_W>J zNn0BLh#i!7eKAr+Er@>^I$uGX^7s1IZX{xp9I-&>lu-zz-R=5oTJ?ED@#fVtBRN&P z$?S%@eR!Jh$DXIPtxC`E-mp*revIl#3oz0)e~?di8RePXTsu5UCpAwj*UuJOJF zr?NciW;HSYEru(aHFaT)MhG{5i*7!z_cz>Tr!&XnEsELdwnD-`@+$g81#ks_$E1G5 zpIOijG?hzujg+G*0gPpwtXMIDCq6++$?ZC5_Uy{Ox*C1=Bv*BcWn`CkILMt0hlKG< z2qEdOLxT-azCcl@-FHv|T1_daUP0!uPfWE_50H6WiJ|<|a+Z0_DuVif#|FGK_u1p9 zVFy;phh$WuZX@Xd9Aab7i2cpu%d&Nnlsq<{`#2R}woV2}_yBLPcNk%NH-Q4ZGQtD> zqskZ0DkS1!jm;8kRu z#r|sbq#Buy&5TJtvUhxH_Qe)EXHofH%-YF164$Y^euq9l26nn0RgT&a!0-rjgxs3E zdf@^`L_9rN3N-0>uKf?af4nH94>aWfp;5gbeU_dMR(yi^a1+}Yl-%pC5+E3j-LvS0GG`D zvb3W>c9oCp`Xx)j6#sF;*tZ@1b^yQ-W8L%hG-=$|)iS;_onPK*@w&kw)fG0)cTVa` z5m<{(edMmg^FbecvXRZpB6#@m*Yi7%*0Hi_NmKlC7yr^*%j5I}^o~R$z4Z4z=O2)| zhnni&^FL!$N1G8aA(Akl`kAk3TomH=bACsX|%DTF6Bt!Gm#Jv7t$t%ZH^+f!{N%= ztKBIhKx}u1Meck4dyAfQ(~!7Ic)b6jkjUO;S1a;A3_?9Isafy8wOrJA_a?^F-p_?s z49m{~1U^%0HR+J@4%(A&3phg=@<%g%ru#=)A@eeWry4w@v3>}wS_2#`3q&jbwvqM+>qFns4iB08+Ox}C|@ip;0@BT(9CLR%u4g!G{RaV zB<9fT(QzozGofZO4Ui(B5R97aHryx0Jiok%&nt(3u7f9pb~3cUCElmanvQ3&#!{rv zOeC75d6+N$b}xU)j|aVmka?62V6rxI<#Rac2u>D;6NPZ8YGmF7J`DLPK|^YgI+k+E zXNW+kf;muCa5gvC4y>pf3xMJyOF}$;TA`V2h-vo%l&Jy_TXbyCDLiR#A?x_y(Wc8x zF(jD4jN-Bm7pMl=Q}%tuuyMT+%MsGc-yh(&8RLKl*eBYji!7@B)Hhhc5TKF+B+LPq5bQhb1JmB=1dM z%Fp8}gppGRs_hDiRj&vQ9v!!BWk^!674&y=_?@_kiiVRFvN-|{j>DRNUl#jR^}!H{ z)8U}Yn}(Vh!Xd^TvM#n)M3qt-r}z2-zIhJYpCDW?@FBe2B@6rNxA6#dXWMj^Y>?h! z4fW9wSi)#eeDf!orn-|ne3l7hoN0n8>9QAK|B&wx0_l|Wj^;tH{Ej9%l!iA}jca5y zy=`ZkQW`q%+e>0~Fz&xRhU~CzrfD|wX6lR(9YCb4-7Hf}>g;f9Fzhqr>R|Qibd@zO z{@45UB2lQ#{m|tPjZA;aqomhTvACMhR$}Jhw2=Z439{q*)ATb)<^n^4!k%=%fFBf8 zau>AFUT}6Zhe$gxs76nS*3K$L;bX;QAe0&p0?^D8BQjEU&1fvfvFnMrCr8T_Opm*e z3$_=M`SDHC&N&Bf9AS-4u|UMVMGdH7Fm0s`0vp*j>tsZo9caoBH#AsZ_qH^=Sy5)v z-L(Zl?&_>wGaYKj1M|`Hl1KUXu%sW+{J4=O)sZ~ zprA~;#NkZc*$Pjyq$N9opT3My``n+OPlQk-KRKbar25nVHyB2r@9R zs>}bvO8CajsY^wm-()&OYcG6%1WZWAQ1i7}W;?V<3lEJ*xmbaL5&D~BM>Q@~< zjf~I4)k+r4aPHWA*cPofI`_Sv98o>XR9u)Rxa!|`h#{!&&F5x~3jwb?9aQv{y+(Q< zBbhtK=X=S60#jR1$0{GOgFOStX#qmcvHU4oNWi^xVm%i`=V5||c3Nw0J|##m+|Gdw zwCZ_VOm7@d4$1}uTtEV>5XE}s(;6^+`KH3u>HXbuzsj;Y<5CKSdb8+A=NyjGL$*(2 zI=O@4Db>lSACt=$*a<9cUnzfa9;-CL4&OR)D4jFM4+?o%b%ZD$usf|6V+rO9?VOoc z+85fyq^VG5-Q)uro94XnGKTr7xHCi?=Nl*W>O<^NlmM|EWqHH=pxKndn}(DL>+ldf zaUC_AfxZLb1%FO>XP3l#oTpSp_8gfT;+nfZLSIQ`x?cFXbwnjnM;8WuAt4)vy=r}V zvHF#>;>Lj6yQdfXZ5u7C9z|38X0WQ+r;2yMHu4nJ@8Cw&2{|=II&`XDoim*_Ih_*S~PK%74m2}?|*Q>ZJ0O~7f(?<>)2G`GM8rgfw!~B z=Pn;EkNpaCh}~w<*rQsGLdwE4hFLg$yI`$E>I%%$wQFU&sB+ln*uc~QjFFJRu&81{Vf`gcez zM$s@9(4X&F>5_cY_0q7b1xz)hhTf6U38VC* zj+JGdemu;;))EwwQnP-oQJ)k^cc=eC$Wk*-?$cPA@oM_5x~5xsvbwR$ONhZF`#5Zkj1fZRe?3n^|9ZTqxXQdv%{pj&a^(;$zrDm#3UxejGS)F&5LBd=>VUi=horES{1l9Ns?ZhLAYVjG#w)ft zy>2y1ebbvDqX`o@q77QmFGmw(X@9*9kb)+^Zqs2LKC`PG1-H-A6C+s8NLT$LONC4f za_zUg@PBRp@B}C{2+0x*Z50Lc^?FH#<5`x(PFIX8(Rydu#(#oEi3-$U{4SRc3m||H zk!HC}Ns?97a1a1&vm4~&La+pC4U1#1pez3of%`Fsm2#hg!9`eWo|*glg-D~vGi_MC zM6cqq*Wm@j0m8N))%T}(rEw*@_tWw_^ZXaYWHd`j1V~$|noe$1Z^{{E!`rwwGO>~H zW3OZYI2fgNQsYCDLZjXNA7Q&L#&~js14~ZqlwOX3 zo&Uen)L$-7)Vd7K`{k?mG1ezEKg^Dca9xXJdAgch4WJUMRMo59HYU7@vwknV-|7He zo-Bw0Fox2C${Uu~qoGV){J$))(0D0Fa5rYUqa>7$!`m^b(z!;3Elx>TdhtibJdXZx zXj+Q?DHp65?sjL|Vh+-HzG0p_G0*$GOAy>0(5=E6D#I9(VNZj~Y z*0BFV7U+UK;DpCYN=b|6I!endH7-x~Lzt)OZ{Aob2!8itt!4OszgL#?Yc%enQLy-= z9AX+jYncA+KWi86rBZWx6u&&;?QJaiMddGRM!TfSBS#_=41Q^$5wD1sXiXko6paQ( z1*x(G&wq)Mw7}0L(WQRDT|HsSVoWN9ZUHU82xbdfCwucYNbX-WNbQZ$AMxz7JAbN~ zs%&3}B|W#|z2#pIst$Xeds*|y`u$78{ie??wL2H&>qpzs9x7ylzl)&08e9~YWJiigT_!#6GqnYjJlSgV3g(Q%@Ed6C529rHw*moHl~pk8!`DgNo2 zAu$y)tqDY8AM=FSf%pdv%_x*phSuF8G<~JwNTQYY9gjK`^AO=7s+QU(V)&{W+#Z1M z&H(y8@IA{Vku)Jx36CBRXnWkT&e!3sG?SN4$CN~gz-kp(`}KYB)%POSPXsR}H)@sd z(*Sh(h)e~k#KM8?Cd!`!lA^8{9P$_s^qdV^J1)4eceiH(7d-FF^Jm=eM9h>1uFpr! zkL^*WI5redzR2rdFC^b9LQJN%Lp1Otqh;{uAdK%b8m!n)zv>i)MDOc-3?U1(TBdnx zx)@?@`dV12)_N$K6H%SkJ2h7^xAwq)=QWAr(qal zN*$V6i8yA|;adtt1m|V8if<}sOQi=lk>tMgtS%Aj$S~@P{$N{X?b9F{0(NAR;(4&F z5y40l^IAH#J6h<~H$NKiA^CL7)sZLN*59xSb;M*EH3uH*Ox&B-_)$#tbyg?TRi@2| zrYNYdBsMb_Wq`Zt6($gakOuEIR3B1t8uvAG2tVLFu*RNz0zKl>HX=R0-P;z&+t4;! z>KA5dXH((%xnlaZ+>+#K=6;hqQ=O3Xa7KPzoScX}bUmu-!ql#2V`Ifk`Si(zk)xa* zppOQ|!kTLL)X|@U(WC7(nRhV!{qe3Oq$ol$?lLj1NAER&L4C<>mHt+ZJkB`!4woe+ zR2l)zV~`XDg#0{K(M{mh(}if;UqApR!xx&b0pNo-UVvAu{FIStue}rDaJq$ZCr-=b z_>14%H%~7pu+Jx~#xq|M#9+|1fHY2^g4}=v)W9jfh zc1=sgZ|oJfBZfs#^*f2yGsCX}njQ90qFO#-neC03!&GK{vT8TgO;N9yG|h{@hFg>q z0R^V+shZF#!B>5S@|;u5{k@ZZKA$YzM(T1SGrMyJW%M zsEu8;gyddVXfSUfQuO%{Mr;8&6s*a89WC^!aQfSBkit7I`=;p-^Bc4AvNcK>;`=82 zfLAXcGTj?+Y;geZC*EuUss$ZD?d#Nn4XG`$tMYBLD+_#BJ}In);E|>q>duxbi)lHoN#goM{2nPB$fEC;2KVW*-NJ1WLTM&!xV2 zW&JSWGM*3#Q+0a4yt_E)?K`fD$~5Ppg|+$odDQXsdW?X7{G%5Q^lJZV-wJFiG62{h zh<`d?_`;?Nc==5f>eH0LAC949lvPt7`e7`avu&Xz=I&v1w99j5BNlTD$rz@oM++i` z=}nh{{rltx2Nft`0>8cL7?}5K2lY82?We?GV`Fgy0v&*n0}n-El601Z z1VS~X6!3RsclE~Pdn6$eNoIwC02%EgS-^027h=dK~!>4*l+AM;^SnlX{PaYqPcoTq!{$~vpz(;4XM#cebmV6hfHMJ<{_4d z=EiHi?UX=2;tbq(cZ;XhqT(=Vd(R2^(D(2GykO6hp{hz@1K>InpcBjeiwi#VE;fe8{PD) z<&CJ&WnV&|reDqLQy5*Tu#vP0wfDOBObOX&!u#OP2Gk40I&wS-!N}pMy<}2Gbt8Yz z_FGG~=baelKc>0;aZ33;cF@*;o#fv{hxDll<&9=swk z2WQgydxd>NTk|$2r$n~D)7&(B%~6zzJ#r=4XBj&x^gnjWM3|DXQ#s5~wU``^f4PQAHM*=l*1ZZFh7{EY0-!6QGmeUC9@VDD!b z{2WEynM$qSPP1j`Y57)OT?2FeDUYFdt=9E%H^~+7)_8Hhpf)(bL$U$!{bLfZyI7zW z4{m}JHaSN~rrlHR+5WTow|XH`)5c^bk%u!*x_~g(&G=8ojBVTMAwJBNgKiZWHr&`u z<#}RZvPj|>dH+y;g!j2&UW|NbLB`;5r*M=PYk$ke)fYzX8UDF5yq)-_HvMs*#JWQm{xY%u1%d)R z`i25Ci8k`jXDY!P<3O6GLHR0SU+DZ^DCXM--j#R_4a?N^RFPj^;@97hDs9F1*GQM6 z;3PWTEOS~jh;X{TrbDFXtT4p+wpOiVUo6H}`%sIl8K^exCZ^#1s?1{@8;enZ#$Xh< zhWd7};R1*K?r0mi47Epq=!d>&XI;ZJI9gtc}y?uw+8bTf{g{|z3c~eF#GOiTcGWx z71wqzu#yO5E3MW-o4J%-_bV&SlNd4M%j6$cD1;qJk$Ja56xyqDT3zsZL5)&LmZFGysOsLordEUEa16&be3=1vlWhMgBrgo{1 zjlJfVD9%v`<#~4_MatqvehlfP@r-wl`$_mchQq&-9;W|{zKXlBp%ICd@X@in)-NG^ z!wqD@C0Nl}d6p{TOl|WAe0ALx+(LrAu)UHe3KnML+yRZBdJO!ipW;I>}?ED<-h?9}MbPk5r=yVDL;A^nP0+dX26# zyeR)aWpB;TLuB&JfTga>Rbn7Cq6LXTUur>Ski={J$q!j0>D)!{=ElUdzNDP)V%W?q z-z{H>X&v+wOs+gj3#{U6-pymXEHQXtK#24VGyVinS8j(*# z=|59(o+lSv)Q*5dB;l>o#SFd zm`81HjPHGresBF(W?mfO`A(7Dx|MKb8l_1U<5l19(MpBR&mmte%D$JghO~>|h5agV zPT~hvrw~9QetsN4ierhE8%Z6Aay7THm0 zZ*dvuO(a^;8Q_;DvVAGCax=>OGm1>-u0O5x$GlBa9dV2MFvnra86^M4N)_IITkzi| z%D2jgqZ*2Wp4aC>4NQJt#G6`2h^U*+qoXc7t{P`r7$yt|Y%L~eTi^LnEA@7#m0dYv z0OkVh^xkI;5hKuV9Y^FbChW8RtPBgk{$Kk zxs(zp921t#wI)0RpMdb)bVnW;-tPK69(ugy7<{H`D58^zxDGTWp}#$Y_J0+v^ROzR z$4*Dtv@|9siJR|liEiRr{?~pu#M1z2ck2aIFm`_a?hDnx2@w+zFu9Mi5;d#*q8&X_ zQk-cK&ql^N-4YP!mCI^;3>e~%I7DA^OfTb$XClQqM)zAqzkFZ~LnYAtE^7BWXBW9J z1)3JOhle`a;SJViC;?bmu~rHkOL1j7@9I((juEIOc9CF=BRl|xs3>>KO_2Vdf?Op4 zgkr(F{2wf(LF~^%>v9_^`^!Eo`PH|99lt78y>of9fLHWT6B1|B9Rq z&R;G=?wHgMuQRc|24`xfzj>61_Xiy7the&i4HJ1EXCo)@tTzRFdI+m+>(JU=%)3AN z*#2h%{;rMus6N%yD_EYAPD{a2k$HA(4&CXe(x$;mfb+>l`Bzc&xEU)XSeQxVv7omf z`wYELfh1*|lzX3wicMnD@4gxN-N+c8vOZGKM!Fq~mAG`H+enQEUIm`kw5<^LgmU49vgL)A!PevQ4bOI7NCHjfmkkif4 zR&y$&pQ8im1_jC-w;WLgH)n|KfNF6&O1g%yZ=AVELTG1KPK^craUthm*y>&4}f89FE13@ z;Sr+;m7|9Wa&FhZ(*vz8C%WL?%9U^W)=&dL0e7l;)1dvqb^3mYp_G`ySL(bx)lRAY zvND~+8}CCr?4x|&Cw`dcqXi_OP5KL-##PhxdL-kTf82fcBwF%aB+?6N!-`_a_(i+E zEXYZq@9k&l^I?+8iTgZqUDKVXm-wNxRpcXtVM?BL%L2CQB8P^qm|yb>x^+P+H~(sx zWr9Ciqrb_qn_t&`e0mlMW4>u%r{w%n-U1ttz`Umf3S9mAiaX3#sZJ(|+;CPv`663K z(sTQn??bkr9A*+nHHKqT&8siul1rJt2oA0Y)98^HmIht=Uk#-38!j6)eIFB9zkw_3 zo`R*Kr>)bKyCw3|=`ebg5qAMaDe5h8HC(ct?V_AiQ3l03H7%2oL;>Fdau4d#baBz9 zgDH9AJC%3X&xFF=D$Crp1EF1&;P9UG#~QARhw8ruKU(rm>D$ zc(h+M|B;tzM-jaO_Gh`nv~gi`xDVsFZf$0vRi=2XU;wK38Tb(e52t%zf{&BiV_ypl3kRHvlNZTfajgr9fs9_rc2 z60L&KbYgenw3%6~vb%JcG?Zj&!TJcBpZ{%Le9yagr7s!6Moso!9;;0tyu=DLG?YsF z0vuHffph%Fp!ANIiD2Aq5vEW6H-F$2WyDrJqpbxyMyM0-Z$#gGN9Tr|n#gU%dy)OU zSoivO2J(uZgj|!8JXXby3ZKdjRpBHnf7AIJ=Dh}&T)q9q_A~c(^uxn!qxQ#JLWAp@ zy@prr&K8dj8%bBHc5BvjmJ;A|ksqD%8>~<(ttl(zT9kcFq9JQ3?Z`4Tdhd7^pz)l> zr%p^Z8gm`I!zvP%EZ{QAA#znSmD0KVYSs|Iyh?}p4rF{lc{*jd+?H7# zi~R4;JspNl+D%icPMHt`iA+6aY#Jx5T1PgR2`rgDDh{}y>EQaBhVpR0^?sI7mC?1a!VQ}7>N#$52flyw32#=a zT{}>T{vS_o9Tr9R_=X8-tkhdcsaP}PgPt*HJ0YFfYDI;sP4FMHhgEnt82Q{pIE04 zO2uDe&WnR>IqiGk!JN4d7pp26FHuFHEcM=XkX?v^cqI=f-|^sGY5f8Q&2dLF%h>V5 z_8SQ%486ImbSCBRnq*+7MeaeRwwURk7(-(F#=1KYzb}?-# zz{@O7%5HX^J~ny9ua(vKgf!b$_&Tq3h7Sx^2>};Fb7XH7Css9Y(nO0F^)X%|t@)d& zRFQ!?ys}x5%vfPeYxsbJ*z~`;x^~BLpEO4AQq+Shm^lbUrL(uU-<))d6udVjKsxnY zko1em-?gYY<%$UT5xpsyv+aB}t&?5#IG|#OmcVq`f=oiGx&5FuvC`(kvZj~6BM@w| z{$$A&mT^=OR1@|(zQg?D*aniwTay2edZxj9nGo=#=9=xk{sfMP&usDW2(tN9cD4}# zY0H*K2bik*h1}R1c%gPjvr9qkOM+@_TRDV)O%_OrT8Z_P&zh7{KeG2|X>KTB*oLqB z)m=R2Op^Or3%Tc;zdp5S16MQhwY^I$o4HP6A%U~Q58EP_9(4bR^pwT*OynizO-prW z?;_KDvzv47Z2d9U?*xC&NJqraCMlbLPREN$^vEE05(%Xe*fQsm1@-~Tp@bHl`;4z{ z{1HWHU%(+jQA~vvx}36V092HC(%+K`5Q1NSHD(9BPs2}goYqbMRsar2e^SUFMN~@u`*m(nd#9Q#(`@De(FAaZM*WrpotjL%L&!k zm<^2y`y|zC)R)i3o=r?mXQ|<;<(<7WKj)lydl^m3gU)&(T=yZJ?SRU>;So3bT2zl` zDFh{L>qk+VK5(sto|r%DQ6rwxX z`(@l5g)G3XQ?~>j|1Al0FlSi#J4wdoAu&B!cjFAqpITKzhkGcNlutK5&o9fIK(s?! zDH)%hzD3H8A9fa%GTpJ3SJECVpZ;?Mv8+OvOFbH4liDzq2kHm2-h?Lw(@yik}1xYs)~~n z4T{=*WeE;5Ndkz8c>nWpdtvjJ)UN-cCjzx{)ZfcdG#VcNge`eOi-O})H52-w`ryrK zgP?Fvv=TbGHD6!2by6aWK@7o$T8fu|D}@=)v8A#qCBHx~p0E^IixagM>_UVZxv|gx zqI3j(_B+i=ncbc>pNCw*dE#a)kFdeV?Ksx`W-#zu&Z*=y@irO?+Kjm?(Efd>?7+-b5n+IZLH!|bI}E8rc|Ig{<- z8LD9Bng-P^!O$en=-H!gsajwQWgKzgt^%^1Wfd>x$v1(~H2?C+o`}wV_gnGhmIB`@ zlfCu1OUASgDb0w^}sq*RlKrC{3uXC5xc zfP&U$u>i^I_5CF8C9L90OeAvO8DhTphbA&%tO^psbKf!Bl`PK{?HD z@V1Lm{2(g~z`r(uVQ-nY_j7QeVMRL@oL*`S+MBnhtUQ)c!O>W=u+S#=VUd|H$R%c> zbZ5>N39|!D6}@cl2S+^@a%s1~Qw>3fnu^eEsNDsiBMIdwYlYLhgi5i)5D~9&k4pCX zVy`sC{czB;!RG!Y5JHaJOZc|vSZGo$t8%Jq{5MZzYps>1uRDO%2FAm6Y$m$=i#qb) zg+Fu=Py(MCSY=ZZ_Qns&?7z<-owGb8J)pfx)uUYbjgc1* zUI7aptsuF#eCWo(G-Mz{U;i}WjdWZ^%Bsv=oob&K$B~%D$DG4P<>=Us*?a0z#x$!PUtnvorpVt{3@sl=`0K+(~U5KzTxmLl_jLaHHH@3Cyz3$5tL@NdQ zvb%!CjFvJSl`9iZWS=6(NJnqk-JL(>6T!5s#KpuKGcRQ)#nIWQh{UY~Na^^g*)Feh zSHz>O1PIm*ElwU|{-?tP2&%EeVF_|J<<~7Jyo?~LBPQ0fYrWv*-bwU(!0C!<9year zljI_}?1x@^bNC*Nx|d*IK#DgM@)cmbeY=TW%O(u}JrnS_vue3z)T>~bB!A&{V)pl@`b)UymPmHPe)i6nig72z z`?`x*amy9hH+(^1TJ;Eaj&JKe)@dK#rsoJF z(3A%uwYP$%sEhLdov@~^tZCM}MJFH<00TVLJSY%ueh< zi#!*=sIiC#*DT%f zl*xcROB;jUdCD3hrgfTuN|b{}j6lz~rZ_;Ja@>q}K+~^$-Cn7Cp&=Q=5;GF;O$` z{=n2V$?dyRUcVIE(k}E=e^uDuqQthUBrUA^)P73bH}aVMw+ihbtJ9)Q3mRg6=W|A) zy7bpHb3(6*-q+tJP0?wDZn&#ufd(6PFeCQL*S@x0SL$S-=Q#?WK|xt3u1;eiUQ;db zt4yCKVamR=8dQ&C!kg$K~<+0VMMfGjX3-dGj0Hlf(*~|Jx)T8!r?0Kgf2$}< z5CYrz7u~}9fFstW5zz;%b(TrBbb*)-Qv$na3GF4bH5hzQ$2O&~=7!cQ556hi-&8Y~ zKRr^8#*8hdjRjM0k}BiG&5v*EU{i}@P0Hyub&wrZoJ%Th*&?)2tH2X}xsAg9UDljc z1jBWcnb5R?-n-Z@UYL%Z#Mc%*6tMK~o#2mJ0fkY+d{;)os42R)OA#&b^LX`9c`fd} z&k`sAMg@$ke!f)s!NplZ05#3n`wJN~B(k(F1$w~DHR30Z#@dG(9IdRGMrlBDD?T8k z@>{l?Gyr!YFsR*lUy9!i#Wb_rU$G+6II`=5GdQH##NKuFI#^kEkRyvR+Wr_c;vOQ` zlk#B^V!x`lopgs)Lz^r-ipA)+`NR0(vPH6CAzDY_f72Lhn>o+b5mKhTcqr*M zyr1S=c-WyO93%2Xx>CGmf6a_R&K(Y_8}-&@3bT&!zfKCMCaui^IQPldTNqXR^wSo$ z|CIFYkQwGc(Co?8`NDu?^4Gh*Ht6Okb*# zE!UE<(Nc&Tc!h7U`|&@W)YSBqvnfz=p4t->h^2^QIe${jobFJWxV+VRggRicuX8cX zYNB*|0fJt5?IASKpr8i}IoA$Dfg5`Kt|B*AM*L(PWc>@#1p>byb73cX3dqG@EAld(pIdN>@vmA{Oq%nCBi{kS!^A=c7C10dF zdQ?IqMDd?Kj5vw^Fj+H0{=6Y^VN_nPMt|3)`#;ec8QB0UYK34M_rz7R@a|60u{ck# zob3Od#F^3T^UO7V(<9JdafKZH|6iihV{Z`=Nzl@}37USE`2M@D^m#UZpynyVtrP$M zeXH{6c$9xPE-YQR9C80C*=T6B)C>m!?iqA|{pw==6VpsJzYU^EwI`iX*y_{6s^`~ zo4+&H2vi9_$2G@C+FCW+S8@l z?&UW3;|BL{yG*xp1hUx_)(1K4^LPfPA}R&RA8vw4n@wSKc;5X}1?Unt9a_SkR_E(& zh#M=o&P+OQM;CW~QIOia#gtTv^KUB~-jJPsXJgMOg7$PF@$@RQ-1gvC+ia^#Y2)mw zNW_sGWJ~V1o!{jyBC)pmfDrTQ;P(h=?j)rZ%>2y%1@0yKD1-J32b$cfcA( z92~2B5sYD9nAnN;*d=})0*6}gbP$^AHruq~4ue5XU@7S;2$uq4!XTlokKGTC9YT&~ zAxFp0+n&o350eth2zaf;8!GKC>M%OkGTFUV=R8k>ZDDE9as*%V16q?cdxX(}Fh|yPI`O6Fb;Xwsgjf6+?s9%>s zu8Iph5ct_y)rXw!x4q_^Fs7d#sJ9@R|deoi%X9hmA(M?ie{5LS9Jzez#=$?v}2%oaH#61Pbb-%EWF zb+|3Qh{&t5#SLQYJn4xp%cS3#Hve0G)@mooS`ptr9TF${FV!w!FBM_~`$FNE)*lbi zxE>uqvc3{ZS%&kq9&ZNLmOb5-t+qT9yK5?vC^Qz@?uXj^c6M~LqPY=`i_6aiNm>OL znuc)-ONe=}@=#QESF}ghW4a;x+@Sr23blCizY%9aembLh;$~!aw47?)ATARc(kuWwxhAC_wmx2!Nko6H{}QaN8^MGZ0bqiM zNZf>2d$ZkB0lQzo;H$TptMe@g^lm*u(rkr6ue}Bca2ha=2L7}@A?7I$n|+FZ?oi64--?o;abY7vYBWarJOL`XS@4exBj z8|X!EbP&&a_9oidMnyIPrELm}L@W`)cp(lhcxECDT(6$jI@i-@z07(Kg{9+7N+!DQ zO?_~fa@|~knvF*Av&``-0hKy%_2%p9+{3W7xZ94;UGRAfAxhrnWcK5w@I#KZ?)=gN zr})$DST=?lEeWltQQV&b`GymM7btW&<9nUiH<8(CU>=K<4-W{9&kLs1cB$l9*7kT; z1?IlVvckRGTYXqwb?+P1^_x%ipSRBhM(KGm@E9Kt{lk^|YeF4yU2Qbj;=?`>cc01o zo-W}mODnKRArRacbg`~lsElXP8Hg>a9XxLp$lfeT7ix@cg>Va*u34@>GXH(Ubr|vn-|hs7_;_q+L*O(Q%JNHr$RN-cnNAYvc~R^;q8^UO7X6XqksobC zM#p@5JI5pJwC~qomoKRLj>gPq(NO?qQj}g|tfq?TbwTFSt-e(YcJfI7)cxHh8ZbHi zxHZ&#ktXQu%_y}t+hLt2y)gww$KB8Cuo^~K=SxCDq_e^m;)nI?g4r;=P%>uVS}J$I z?a){~&jdO5AVA6Vl#ubp?Bg5y;tP_x`kwAL3#1mVr-VzJ)UdgF{6MLMMN@OrTwR+7 zzil1J_ItS>(RuC_hp3yhDU35=9~4=IRZSNYg?fS*o6?ls%6U}i{o6L8*n3rDEdWRn zh7#8mahaeSK9U~hptYpJ5k5lktyW51?pTA~{`1{IYpI!^B0Db|1{jndwKNeWYPQB& zX&hELy8hh8Dv^@}k7{+}Qk+Qfr0r?ogSb)`r$)K^tchRcNxrnWWAL2pQB=V9$H%er zQdcT(f>c54tMrZ`#aTQv$1K1TI%8mBetXaSa-3$qC7ZcxN*!fxuIU3d#(0+ax%~L6 zM3jbugNr$&ATp+)72PInLUAJ|BmzI~whl53F)w5P1ZOrDY5Cr#wkv}+cm42b$yvMx zqJ{h}79g$OSoG#h1beq>e?7SA41I&eai5Nd4bOhMuRqXPqHrfhs`Fx03TU zr-vpC#KQLU zOBwUVy7wIV$b~570rZl?>CxP+UNA()aJTxn78Qjc_u~+elKfM`cUv}GO6+u6i_4%x zOJW8(FlUQYYx!xedO1Kp6`H;hKzDa(rxP2(y}3-u zFh<61`0)6}Dwy@s`wY?_Sd`i21p3prN-EXQS^GVZl$WWc%(B-KEp&aV9rP4dH z13tv2Iv&Y8mluX4FhkLu^0S0EKTB5~t09b9n}jrFhinjW(tz862<%(hZ2Mm+mfihGk%q|QJ| zT{mp$T!$PXHpo#E9^d2;%_%i&z{Ad!q^Xy|qAxEko8eIdi!@DKV9iKXmbDB_k`r{?iEiboz8QsJhIRVGRIE@AVrelFX|Hz4~nefsJU45=gO(rsV zQD+tRBe=or1!4c`(o}t02WbkAFsu>RqPQZhMY6-S%_}k;fQf?CpOBV}Ny1fC^HoJp z8D!GrZ@u=f{U?KZ9dYQZklc@Ycu>-GW(!>8OJ#(eDy5hSLP(1jXcY^hoRxZ~lnU&9 z&4y16{2tdwwYq}G+S-Kh4q2NcSS1Qqi4?n%rv!mZis=ALY$Vg=s+Se57h@7_?4n)) zF+;R~KJ-Pm`u*4;i_hxiz4h$jyZ=thZTNP|onL?gyL}X*Fz?G(wzFCgd2;b{2!|}7 zo?UlziTI6bVMONT#z1<^2T*&_8tOVXE#$Lt7uIj{=u%%M)30Q@g4y)BCBDuwLFB6Tf-4)d&~k?6v-9WcIHvTGzHMV z1l}Y~O2}lBV(7u)Ky-H0=ynOL@n8VFDiRe0n9dY#zL35RxQAX*>Vp=iq}31VVePh( zf9x8j974PiylaM_c@p~{F~Zo0@Jbu(Ex>YrC~dWxA(-4OOJl>B*0LDk-1+`XCKXT) ztl+|6A-uD^)CLBE`-2e*;QKg$v!40%^wr(-vt&)E{E|bQyFVf6THm!`mM_`-GlT_6 zHuwvfni_$*e`(c$?U-Wh=q)N zxaE^z?Qh1r;J76N{SeQi+I(FXrd>fiwtf3Gd)GeKXwy6fLuz)~)^?_HbuZfbmCoW) zeEZVnam}XwgJYLPZwP6Z8@bbBx2;B6l+|iBTvsj%TD=)ozTYO!=@Zbak-f+nxf67~ zWFo;DEqpNK!*3#%dQejAVKn3{D0tcP04-?zHj^=+f7yaEK&>%RdbRFdW7RrUlTT$) zOeMi&o&CCVnh+p@VOcuMSl>ds8!7j7*XNu1u|^Q&gW0$+(oQvsya?EqsqI%g6g?2X z3MW2M@RpZnIs^2UTc#t}p-NjHC~5lV($e>x5mZ&7a{I3|&IUv)utR`yQMj2WE8ej0 znE}+S59RuEwV$1zSTpw;DOPWKC+C>G6BDm|9ldi&7D=dlG!%eAdrsZA z4h1fpojWJ2?^noOn4$+f?+%|zX1|=*ndm?Q?{S%!9UeYEq_5uZyy^^-u5<7CSu~K~ zinXLeEhQ;==j&exvc_exHg*qR^3HxgL!gfqZ zCs*0aM=-*+S7RCTs-j1eY1zB4S5*XIKjM%4>YB=baFPf&_bqD4xDh!q8bMIT zJ=5*Xa(#ERlti*R#I)qP|m*$X&}vij~Tio<9X&;&jm*dW?9 zrXV{B6|~rFZ=$;DZ;WtHT}y;#c4*VwveW{axsRaHf;Yf1Ni9ewbiOe5`Gs3P}Vo$fMezu(rrYH=AfoHE%g#eu9$hGb{0`u6M6z3QE~>sMu+jpyXWkEe{Ry;JfSOvO(u24-i(8#y{P zK^n3>OH2w8sKGdoeliP(T~yea0+5`JF2zs46Q5-uuG0b%-pqYh-_^Wq9ArK`dGW8eX>>igmBA^!NZn?H-of|01!bDO>#H^aeN)MJDR`f^I z8;N<#=>ovg`>dylbJuh>ECn(ZLe(yN`KehIy{wdjQLZW2i9c}(EEj$mVsuS?I2G&J zYDJMoq3Cf6;4+h8BPtSpA3~o%l#@w0(XCl07A9$4!6;+us;GEzf5wWh?SZAM4*rm} zdNKEVf<(o99X|zxU>wqsLT4|Bbm^JM#DlG{ufA1Qw|&FMvEe0QVP2OkAuwH~44(=%q)6m$GOJ>E{;}Un6aE!)+RMfViI`F#) zN@7Kxy+x#^>rS?3+HUEQ7Y*2VxpKe7JD^_^9PYhqbT(D7?^emOUhp6qePEBwH@fou zNH0?2M=^&(fQ5;B4XYO79!!SSE*8@2NBf%jsCT@fug5yQPT|lpt5urB-`O4{Tf$=D z2T+rf_`tC@uZMx2fn#9!bcH4BDV77LEob!lOT4 zw~As(b}+cl$Sl<@SiZh(Ir^Bz%QAzs8C9;cluzht*CXULMyIk+$1w2XO2l7Y1VYbe z86JP6fCMz<^5N?JeP%)DE78hOMd}abKc~QOYza?Cu?vNsANL<`wojm}G3GDRzoz!!P~1@@u(zJJ>X*HRXxT>add?_iDDWtzCZqo89y<+5)KU< zr2hDjhC)IceGgbVew4(Z)bZL9kzXZ9j+`Vg$V5~gFNgDMs8L{vl3Jyn;zu?&ECop-=N~H2!(%f_m(uB2+fn=h&{3N{R;-V;#Hi2;W>*@1#=;r8S?8P4XC) zTPgNfsh?S`Hn;_`b&vQ;vT7F4`j0!w^!Pe%PRx9R^h8%2!e5~;74I(m=4olmDh4C* z9kYc+mCM)iIY#&@=K8#&E+J`tU6??fmxV_EMcxbV+oA2)k7FwB5Dtb7w_Hkvq!n~w zBoNcY#30}R+vaVAep;XCS5byyZLa0_p(wkrVDJ`k7S7kMWJ1#@fjs#czH4VW*gkS9 zwUYGa#5!q#9M;+=#_(Ty*utNFqGzEkz5}5vuGEOlocKzIDb=FOgi*}8FHOC)zuMR2 zM)se^n_*c0P6>4U=%O?O?!Kg8+7d8`hOw=3E`}<5CTpV( z%0ddVH5145X7ybN*>(KJ&a`hFk?vWDpSDa7NnM}=_3@209>S5cP>jjl21MO6U23?( zUicK0aK1X;VLHJNE<4!~?}^5yXcDL`GXe9^OBs_%*tw8LkH8DFnn+f}dc-|-RdUpt zwT~BrC*=NxBG;CDzHC3+d`|>0NU6v1r3OUBpy#BN9Wq@K1an}g7-DgGaAd1TS&8&b zu&K?CG@M(;xMmY(p=ihE+pqg-ZyHuG1ZTJ(zEMCBZ8oAg7mSdzR#`TQ@c>~5EOm7O zZp#{v91s==YBUJIjnb1L3flYuM>Skd&bi4EDr|*E&{auZP>K@Y{q-$_jtc|vx7lE* z`dEx>8`~v30Y1{H!2BsYI6o@p9auiY3au^CHfycLUprOVL) zzF%-wt2u5P-eJ0F&}@g=>(|2Dcb>;jfoUnIWZHp1^JA%sauPhw+$O2gl7@(t#1x+C zRp!Oy+3Z{O8MHRDQS00z+i(ubtPN#i56y}9lOw~27>=8Vl$@?BUMY*^Zl17WVYaVU zm{&8va@;YZtqE&2l>38u>F%YubhQ>XXNap*+m`z-@D~V&f`x&S0D5dF+0zUumyQKf zOgxN%TzzTkfmLoxnWkIyt6S|fe)7^jiU+D0TMT_Jbh%jd=4E$KvwFRxC8|@fFLW}Vd7WIL1{CV6UvV#9uoUX8fG%~I|tdJw? ze&v;IjrqkBe2?qR2u>5I?)h18$k>FslI|(1z<8S!Z745ivLSXh+&fwC0&Hy&^@tb4c8gaC=@Yy`eGcxo1vueM{-{(*jM zHta9A2OoXGhr80pmpd2~L{jhr0LUG9Q$E)tSm6zfqOW0Mmjr;mX0$UMpE!X?6l3_` zd8?l;C>T_{17dw+Dxg}0)4l*9*`?=yr7e$e_HS&pewGnZqx6gMGjY`#qRx&d9O z|5Z&2rc%7A+nAx!A9c_GAv!Qo`qZz4_(a5E_dAGjCIerR(+MF0OSxsU7_2;mN&-8- z_GC7!0B$=I#%X-3EC|Bib;`GCzW5;JjNU6eDtbM zL{K2~HPiOv!f6YnqTEgd{DPhi>2HQYz$MO}RA>wlyFNwMkeFU}iBj6cJL#H)GYj%s zjJSoXR=?~9MQ=;B25)XPdN&4{->t|^RQD@O6De_?{Rf*cetRiz>rrbQmrVvv{+P;P z_=RIA@}-^#Irl>{y9JKbl34ml4GXr0m^rAbA+0(5j!Jq<@817T3Aa1CLukCzPBiuU z;qoyd@bD!7B|~tuYULT$ZV0_nOAVorkZc)H_ z0$F@niEEFmDux6IrqhnaJBYYiAq-@cuRuF549=4LvpQmR2~YPiIyjH!--AK876vup zN0TqH+a|Nde)6?Bh_uxIhTL4f#H zJ<@{TKZ;vyPDaC;JmICb_1$fYCyS4ojT~ke_E(KB_FYa|7BKu$D=xnKmOU7c_qT?3QKF6g$ zc}CBXhyw!9I~wlST(#8jebjIt3kqsMNOZ&QZYXQ4s&6cXDi`=?%Ee=89 zUu99&>ZQESUCR%34WM;hMP<~$@nSA-!?l*R!H+7vjmF7eNA0Xs>@l|{%i|{lQqIgQ zJKU-+aJR&pWx{Kgxe$l}_F0?^WrXPGwoD5^?_(wcaJjnJVSIwV+U!#CB`cVBphwE# zVWYrQrOYU%r2Da0QjU$Z#v7m1$gGpl(S?Dr$ z#id_`2O*@x*cTyyVZ%Bupd{!n{X>){Hqg1gf5k?Tr&JfQ5Sa>gHCC7a9YO0&K&y-)2$T)8^@&I2R%)F&Tg76D1b9JQ z6th+608qmLExuwm=eSS>#WS8x0HKV7QTigDI6CIkYE5K1dYCB5*h?jG%*j&ZnIlA8 z&neh**!*KA%@;vbM$;mB?svC;Y^c_j!8`Iv0K!jRhri>wM^hfcF|sJ?#A6!)jwD-2erQm+vJOP zKb~hZ;4pQqjhyjp^v|b!vYW5G2%J92WFvg-*|;VZ|B53Xz~!)b z>NAZT6l^4b-tGv9n!oPu%5cKeALy4Gwt6zKK2nW$Z?BbXdKE*!HxweIQ*x1WO6h?# zocVJOnLBI&6Exo5UL^DZC6HE2xjVSx+n@l8ViAPHYfxuB^H2%RAg-H=>NMA{{D8#& z@M(M0&ELVA{5??8WzP7M!7{|6|1MX|VJhhgmjVirIj9SO*Rc!@VA!Nf0|Kq&3g^WO zWzNm?)E8=YmjpD;@>_OdkD_-94(vcynLKsiH+hEzLmw0f2=6!| z?=VgIQ+ce#hMp7|2OR=PI`1V=8)T$8V^`)_@_qBHZ<5*Z-XNO2#a)LCfxx~_R*71u{oWkQ%%v0J2EsYZu}DVqinxK=^uL`|+5 zOncU93ow&MqZ^(Tq;Ch>N3VA^|M={4V8b*D|GF#o&myl=_A_ay3p;)jqPfgLS2jLC|$f{I8Cw zPQ3c|Uh9P_i*TH(b_;)oh*9e^UzSgI6f*C> z`yAB^o=U4P42p}K>-&NRl#I_4mqnKMRJCkuCCU(7fXJyIUAVZu?a0(TnQTF1e^zWL zm%6G%@+avWXb_@)f$x8Ij&cokX@l$6#ZdsJdaCX!T%~0?*}BH*lHaurifjSFniwl8 z`(=;iA2Z*s#Q;+1g4*_7whE9&Db1Ew5gNb9kQnac7}nZ@OoER3PQ+Vot!!zzf0{r8 zJ^R5rCbQ<(!fmEr(W<>t_FHMd!5DEXkGknR1)Zctq^7 zYj^3S4suZE;p9=3u42_^0KyO=m_>5vb@;C-;cMr!ePrM~awxs0x|Cyowt0s?Nj>gV z7RZWg?P;$WAc61>s6<6hqxE;cl#9w{Ci5hzg^h>2UCEGHz{<7EC^l%Wef9zPpVM;$ zdmjDsI_gLNR}(@jdKRgc@p!_57r5$M(1|4eSex}OO5OPYb`Bi2kPCywE(z3me|-)S zIR;RPWWw>DpYn1IXLHLBe-2RCGkeBbFu@$_e(?--c)!|kIew{k2cna7)mNQUWiN+l znY3)mqO^}0Hw_U2SgbHvrt`WMVu>iiFabzw%LD>H|7=s=q^0g?;(D6ri|kc~7ne5L zo?9vi*#`kYcKtg4%>H-xVPt>O>beWvL)=x#h~{(*U3&7!sBhZQsXrCZm|dn?v7`o8 z{u!`9-VFvqo`KzLb}663p0tKV0S;)*X~Gkd34_T_bS~vz00@_apo-k5Iy%4+J?%NR z57+H;_Bq29CxaeK8bE63+>snAuYe^nhq1O=N+b=$fb7^h2?kFJFPF&)WjsbHHzSM~ zZ+1mQ$h?%^fu2_~hK_AEk~@S|#7D7KU$A?xXXZc0&a-Xd&8bUc`1I;QSsP@KH5DLG zPL{Z;d;aVT+2SYQ%hjd2<=VrM@*TFIe#Q1_Rbzo~k7+2fhCy!!DfplNIjFxemE&bE zp80;Mr=j3%%fTUSJgYqUP_^~^qIw!_P^IdPY7comYK`ov3*jsjYji($$JtO%XFDUe#z_+DZfvSv*afJWMa2 z+?AgE06)$8FVCuwUrhg6Yn*L+yh=*+z&rLn8tC@Ko4*E8Y}*@9OSiM1{gD&f&)8Bq zs_cAd@u=>z4Ol)f_WUg&3hs{-D9U#tjdqA>mMQgKn9LFoi`$i!5p{EwyPxu?MOs0$ zuP!||LyT3|2ms^7;^7bP$pZZZkmQzWHY*gyB%II9D2Uf(b#La7mwRQ|8th6NJ}Rox z8)8r%57w(;r2nV!^PE3)QD2wu`2_S4Zj9FU>B9|c6O%Qo^Mb>;T$DsYQ|zo3W>MH4 zm@FMuZH+QpEf7&j;BwWRBdTEz%5TWOUt65>^V6M}y6-D*#aMFp3+x=`ZQ%#hp_LB4 zS?M*paIBds!;t4no5_}|?5j^1i}0$$dRI0Ki}=LK0sJykq!$JcLtf+tr55B{V6^<- zP8@H?rtEeRjlqexYQnB9vp=vooDms&emvdf54|slnz(fbU1b(v*z-{Z4{8B-lUgGD z)uyFQ;cc+9lPoNnOBEB{yW@ieZPH#5^^T&lZk~s~DFU_;(q1xIfxfI{Q>`#$BEa|P zL<$a8M-q;Y-{NF#6Ipx{;WElxa7KjfA&#ax8a>#OQu-YfU&~+@vPE5=0(L&VC#iB^ z5nF%FQ_kfa_UwzvOimCIsAKHu$Hc^lNMFRTUMiZ|UR=4ZeTAN-e!7tZ{>Fb_5$A8; z7%TfRI;G}VWO2S;MbCJlKxp#?D(p8I8?W8S9nr~@grcehNcPy5SL;|ekHK`AmTc+F zF#j3s&Js4vC;bi|=>OAD4B6^a=AH$`V*a6?FE`{Yx?ndqP^|69G|0N;;mE1YcQSqD za}>esV`8)h4@#5RK40B{!mM}ea~Xt|vVcK%`$fY{mNOmZ<~G%yNO7_`mSg?;7dBOY zMEu?B1>RUUe@yv}b3jr-mXyfG*v6pci*5HGk`)vZ7a^@1`VvRC#OTa`D6P5TKbS;J zqaP{;`;(A<^<{q`&bx}s~P1!0vAz4{6QzbKZ9UDH6tKdA^#LVYyt17wv<(2Rc9y` zC~0hIHUurrIVAv)6mQu+i6RGhcpS4nunsr6Zp32?SSK5K4-SlNf~ww zb_BbuW$j%3!HoJAE>F&FI-+qNfy5An-UlC7gMIt719K1qy6RVw&t7J@`%IWpdP{lP zOa=4QMyM0stFq%N19%j$o@kG42UmdIX}pIVJX|=(v75nzYIFY0M22E5&>?rEDpHB4 zFtc^)JjsFfc4LHLYo**beQ{}r(r(=6w`pZ5+grw#kvz1S%iG=TRTb^YFJyb$h&=YF zr^Z%t8o!#2(dWOiNtK7W`mIX`gpKv}zs51#NIW*Oi8;LHSD=?93qNHN;FzWU#?gno zq!u&btXADp9mI6_i&%DaFN|@vLXnXBMJv~g7o>soil=JgLBg zoUT8;ZF3v{I%hl-nXgv#mAn+5JW8TV+PQsF`>TzI@OW}188=5iRV>8)>h_bJO0^Sz z%$+YA$ggMPFVkDE`P6R~a*EjPNI^6i0kASZumvf6KtQkzw&GnihzcRch z2&^?HcP`fQbCcEA9U)ADdY`#q@~4~@nHmlKD3zfz6?=9~t~^i8xd(%HF*icAVqlKS z5Heo%!%P8Hu;79C*}cKi28k9_M|q~D3P*Wbn0WS{$_ug?4p5)zWv>C@gQEP%?cV>c z9}jGG*{eDy;NA=;YrZOR$}D{g=zpJ0ZLh#!w=n32OtZUB>FlQ@jDjkLRh`7gSae_B`~gJW*%Nf(-+Dyw`!!#ko9LsMGNH z&jY%W4PzhV+`jtHo|EYJuk41I_Un2kTU7Sw{S~F*@KTf!8rRimyo)ZM`}j>C;9g8B z%Nb1p_W%1kuP?@`KY90O|J!>pcKW|xUKouzsJ&~9ix2l?aeBMjU*zR#$c~r0BZndy z4T{_qDjW#pWc8!7LSt6LDkF|la1zg8wg)4bI^c^#<5lJ!&2#1b=&`$I@F*(3H85=A zQj!TN_hY9t%kgN^gGEuhTVn9LgYz?3W3){*KUoI0rMBz0c(xL~$pH~jgMv;c4O2x- z;lxOsQ#-Uoighm~Tx>Dld*Kh9)@?NOhqNwE;(>pv|LmR@$POw90=|>K_Xi2!p<+Fy z)HQF*i0U3=_RTHl;B^9)w)abiq|}3_#V(Bk5=bM5@0elj7YE!uV;iJCfXxAEmQ_~g zT+&(1t*ru&jRr~9CABO`LLxCdL4n{TOsB_`-QWT#`^B_+>Iy^|jWIugPy>bgl31PR zXnN36=5G`WzKk9x=(c^DRsj`-ETDaBIj_Dh%({b;7^E?yNNnn+5Z{v2q3WxB(7wO6 zpX#R+Nf5PhwXrhe5w)eRy>SH{ZWOmFQ)2xkGopo=c%I~-YNnZzcsXoskie?#o5@Bq zD1xd4jMAJIP}CKB?`vHZ?kkv&M`kJ#(~_p<$C%h`jrxM6DxK zW`G+lb!Sw@c?_AMr|(|aeRplBkfjvh&Bds^&y8xqF}WI8hl(*?d%&oE!Bw9HdxhUO zOTEFUI>M0K=E3J|Fl$6)c+>kXm;oq#wrfhcNW})}O*TY1x{2gDb+ivo;CF7G%WZZT z*`o@NT#v$XWiV4Eu}n``K~&GA4OqL(k3}DSY~!ZO$@m#LoXPZ?c-E{IeE@Zwd1tx! zFE$6}>OtzEUvNQh6&Qlw$5>s@Z*>M++P~W*uXzj7t=6~!bI^70e>!;;)O9o~-L&CJ zLi^6KImRY7#_~HpGf5R3U#7*YFieeByDnoFMtKDPi>Ix^gv3F%sTYQe^<{jNT5Fq0 z&(-1#?|s^@nIvJ`;c5@S2%Iy^~0ztvVzr&=i=%c<5t1Z-pFRVp;;dRY5-=s=Ua(o3UV7etUyYp&`$mZ zCcFLH3+d?oNNe7YoxCkcXK1Q49;~F8L0E+^)t^!%%@3jmEP^d+mOj<2xG({jGh`?a ziCz_mb{TRCMF;z;O~gfVBVqVXzpISl6iCXVz)Px;jda%t`s+qqsjuu8gKp7AWA2k9W5 zFprY$7morjFQy`tjW=Hrz}Tr?oovN1IYs-9uYSD#_$53qo{ecSpuS*<;n*oU8CXNi zjlo9(MR}p^zfAv$1?fES;WvUyZ(={0OF8`lbQva6Rzk9U>x#{gY6eC2w<0e8^{q3;TFj_JQ7ncC*QOb(5IQ@0RN;fANy7>sGA>_uDtvp~%sQhWzw z{98SaPK~`DCP_wzSug!FY0$VODYO1`$;1$!bsEfKBXw(A;F-r#N7+GWm-#Jd?y^== zk?~wyGc2A^Zrq3Koec1=!pF;J7wzsw9zK9C&>(wB#Su*nz>tr_iOum2ca-cq&^%GZG6qvV?Z>8$lcTHbXK7oBcbHzKoa@Px5qL~3>UXI z61Rx3nuF;-y1=6R0nsLDrrdL>(edh8oUEUwySo>VDo&OAqsfY#Ln+ZKd{LzN)W-b# zC)<(Ri2$J3Gr=8K&QRiRaF~#N)wy_L(8yb<1X#P4IW}P%6{1{l%`g;j8IuvU$p{c` z%L!JdTitL-CZeTetz)6B!qZe+e;q8Ek}ByclhWwEg22P1n7FaY^XPC3@!H7(u3Sd_h{`xkU2(*7MMn7=hYtS!I1E_)eE*Yz#Y z36K0Q%aL;edM8DTr4Stf)*qetaDHRdU<473ys37%-zKM@*ZFA&>E8!tA`j=UC^GS% zt)ScJ{Z#SX@ku!`x6e$8SKmi^JF6}UgSR-QTE?F@&@!S`t^uI$g!e7F;`8iyg@c?c zZ?n`Y2VRh-Y^jKH%0gz4L_TClbvP$IS!LkCmr_;!4aop>o55LI{85SLJVC6iGX-fa zhDg!x{s1;(iW><5RDIg|q@q^#Lx_euPRAg5XEVJR_XE|n4z}0iIxqX?fT^NOdH%iUm+CFc1m@8G9LWF`SS-ZDrSoFL}Kwd-sQZgX(TsEtY+R<24po- zT#er8ox6WLcSJyOM{e6()D`4tHGKnN_ZObH^ocC4k%5?jbFVp&yF*WI6R5k2ChJ{> zg+|oA#UClBcq>nx>Gwk9qMVu<<$DW753Cqv3AyVfBqTNE*|I-8* z0aBWP4<2au2!ALgV2~p_VZi|Cdn~&pW1C=T?474y%CdajZTz|tYDG?%7>YFd{rbl~ zwWtb}g^~OFo~ng!&9C#vSY$C(1iQOfzgv4Xy8&8$=uGoV=3Q}e=EitCIbeh@yejCg z?OWo}vFBo+F~9k}+K3%dqAadQSEDI3Ak%}6EvxQis-{tAPjRk>vq$oLmH9<%i^VM{t3pD@zmnR>!WqmmFNUL__t+0 zlaB2#c_(_OT1+V;MGN;+A;vOlHO#_fxbK*z?rRs)1E;%P##(G5*W^z|Q)~Vui81!G0N9F5icMuW4BgVGx(t{b9Nn#P_!)ucE#hB%AS=)8(NmX1B|H|A#~R@}Z-X z4D0Bt%}4wI5p=*hOZiVlg4)fruS5l;>8r>HmsK6xR{JS{D)nBcGsfHmq(#Wp6H5FQ z6lYxY3T>q+h=yqRd zp8#OU6uIrLl^E;(l{GNWhYRCeuEK{`{SPyVkZ}Mt%n6^gwWqnGzq^_UP5`(+;AxTOcET>(B_`!3P-^((+9J;#*r6C+_a2!Z z88HIJfaN9Tj43qzx2Np<^Z}4rjVBjr8#1(+KTHrSj@}AnK-G`;f$S=6xdO}ITgvk< zL!%cS&*h4jZ3l!H_u$AdG6X<7M5B8~Y8e#w^<1Wro<@GrJ*kA(7A0p0$+*p9sPXjE zvPp_N3exY#gW)t_D|KxccSd}O&unw(63R^lTU+JeI$vf<xQq;LUB&b^ zzA4Y3cduo)3)5&GWs1eFARF#+2Ri;SlD2F`p3#x(^UnV_&A6( z%dPe|q#kaqZAb9zFg#gkMfq1ut(VvpZ>C4z?X6lK6Z2PH%3fY`CI+@*U~8R78`=d? z&rn;nnp~7e+b;bF@q*u6jWnwH>|YZIuvV88dD>~VsuE8`K(Jk}>#;`a*F|J~l;=A9 z7@-Y3YN#pv9V6ke^1;;_Bob1>1o$Ot;dRb#&sLe) zp9g^hRcfdqlUJv^h1Q z7Mh$NulNp}Vx6U5hzv1fqRVLYf9yy=DuRizoDB(zwHja;9_`~{DFErxiXPDIhIG^d zRfVAexvjd^9KgD9h_gBrnhh;syCNsDHxKC+SsL}&4{`jVAT_FMaA}KVCHZ$m|HLa9 zU;UywoitR9&$t8c)_8y%NQ}w1`a@^P#H-`lt88rDP*i8!En+l}S&?0=4-7jdvzoE3 z#9RK|&Mmgb2U*eIxcZ>Da)79bmRmjzUl0!xX={8*?`Y+Lh%jvSNRrIZ&O%IjkzjxB zBM7vj^AZS*NR3o%yAbrTNKs+N#fKOSXMb4awO$qWDA@HBUK@=6aI7A2!*r5P_?X4RwA&OdEuacH=*GqqAG*?B*Dw_K8S3Xe(fPIX`6adV3cW7TAgSIgTtFs z2&E=^P@RVZq)wgE7x7s9Dkj-V5(=(kwd%`shS`DxUINz$&Y&T6Hbs+-;_~!7RT4CT zEwRhV%`oYyl$Uw%ra+g1ii)eBxog%wUq-=Z1{eUYa*vO`++jx}#_bbiC;#&ePf+inVzEA-6jb@F??YT!)Q?0#a#feu{31cB4}p` z-a-LYmO*v8c>f}ghw3X5a!IDGt>U}|35Kz?AYgF@-ukR?O_p0F^|5ZkVDH@t^~Y$X zsVe*VsVaKTDMSRpUaIKIk_}Vl17Trq;$r%Xl>r9~O{tv;}{-elSK#38M(&}b$tX{YA4CRCJV)8Rythmk4 z+0cmN-z7cds%7#QcZO1dx^_7V$GoL-Vlw5im^wl%i z6!Nm?HopI=4%bi#;oliB7io~O^8L8G_<()nzBbnI*wuvIr>{W8+3)UVPH!JvPE9N4fCxyRTze-sRG zG;5+WPBucyeZe~KP{<};!$sWrx3ezf2~1I+!Qy`WNHx3+s{f?;xgyjDK{sYdpm*op zR`DJlB3#*t*853CoxaxbsoG>) zdViH07|D-nnou|u0aZ3_ zXYCh{31T*qg%ynxqurEDz{X{3vHuO%jgk*K0#}YN?PZ4TRqz?MS_pL>Q-r1E@$1jc z*0n(0`TWP=$>%?}g7iF!AMKxaf2|Zb9+R zX5vI)`o$sq(#)ST{lM4}IMF%blEP0~N^ghgr^g`NQNK06^`f$_vW>Gkja+lr_>ZL6 z&_s$$nc~cUws^otX~SI_B$2N7G(oPncr2;&W$sj!-;;FXXl?^sCYKn+pIuiS|LA4T zf2389I+%Ox+*0f`CtQlowadrbWIWFCA$3WAxlB=Jn61nVxU*A!&oyJkWn|8Uj-vKN zh+bX3_2z42`+w%eU@;k?pWlbg)w#A%va&s^JUY;k) z6}?;a@s#>R0*C9=`jps{X7vCM{7d&<4q$3Qr2#i!7d=~q=4E~(<{8yq z{vP%<4z)Op4X^*13ttS2P{XJ{ys|~w15B)DjLFkS|X(S;`YA4w%-F;q=0 zivLDp5Z9=dl7_(Gau7lzLA)=BUZp0?IXCK{@6sLBxJZ-zbycJLg$Uv(0%g(f zclC_f^7Uj+f@;1Be?8U)2}YC?nM_CLNPnaP;s=)+v3eATG@I7OJErFdK@~hl8$?6GNc*SOn{vEw?K;SP<|chJ~@7IV`a(@$5srT(*FC~ zvP}%wo(+yG0(;~(R6sXr_sCb%P{Eq{DVra?+Y;6iO;~!$A}S0FX&}~?z}~B0y@Jn89D=;ruQC2-slc6A z6*Qw{z$vNY{|0A ze;h$KBWRl~4}y@{zNUZGB(garfVmiDYoU81AB@)X`Pyd9ygRXgU2X-sIC{94KKAl8 zj5nd$7W2WD5a{@-@!P? zL~`u+bQWsbK!+j;!Ia9pMH&hs@Y=HGmbB3OMo`*gq)+*br^ePvxBD74P%Q)2R0$>% zeX`S2fA>aT4}nW+V}4y^!)+i@lB>yqA>WRjeAOW-S!X6OMAN6p)!}N|R%N`%yAUjH zo18$;YW78&GnsPP9i2R-Mm@H2IsK)OtOUboxV9u5S!uLNBrllo?c*<_e%O0;^(N$U zqEGKN8~pOlQ%bYHJfeMl>EFvYzfw?KkwZLuJ%u(g(mx3LohGoXdR3uSPsvQ5NfB2s z9L%p>>qcDltKgWiXHs5uKtHcPsPg5nRo3y|g*vPPObXEGy_Rd=O~W8{eo~jVxUzpt z;z?_YMe67CY`@mpGXYwvZC&vKmMYWicUhEDJAaL-b+tQ?ybwG{Dx^#x1SsRswRf3D z{vPdd)o-J(2;ELWA`W(>me%nKyUDN`s8hjD}U4;Mt5vkVVY0ae;|4{Q;*~RP|}yd8;#47 zGu6A!Ip4)Df6hQB=#ERfQfl#}5%A>933l%h)%&;zrN&n^Fgq`jt_u(Ax0Ek;Ur{1K zxf{;4M};0+Qi^p zIuz{T@G@GX#IF=HwM*6F^~sd*jY@2m)8nVw+fTz4m$(T$TLUh$5~OUp^fH~Y;HKqY zln4~1AjX`@Pr|toY^@%pdi4(}fgFKNN`gfCAIHtVYe+@Wstt{ByzxaZZ1Lf$G8QYc z<4f}07kOWh!fcWBm-gVd2y5!~U(FGP!dO$R`ki-z&e;rdAsYtxNYyiZSW`393c7aY zFhZ6!U4f(qqSfC!F(E!3oXB2A~$|UJ~9YOe_wi<&FFk zNTuaMf}dsIW+#Nb-Ffxu=FI2#$nQT+oWXc%PLH%d;+VhGs@PpnNWAlyJ!|02 zkeezK8s!yHdIQ?$xWw-PNlHHyvwqdP>`vM!W*rw$-&A^w(|%39|7tZkdoZM@SLnt5 z0WmjVHN-C_C ztWAo4Q~ykL$I8w@yR6t4lJWOy1UrE)yOtqzK&aD%TNrqvQ)ad7M#5)2J z;=``e$yMcr`ZK3jEJs>Y^HF#iHTL{9sY^h((YJ`qet6H~dNB~RusNYJs~%tEJwFV$ z4Xc4KhCE(qHl8?K^?#8A*OWd0=b6GIN#{EBzn`v6r-g5=-j(6V&*xUtU}0b4E}Qs3 zNjDRnzLzm(#g@1;wC&X^*J#(XeKr6zY?)Yj;4IQe_P;sq8z$T>Dan!B*=F)4RZHEYUo2w4T2#pGbeJKGhbRjbr2@_J8;pvA zinvGzGsOwz_P^90?kZ^wKcvJDOGRetUvD&Y6X32Or@iTy5g#$aKe_4n+x|526^~nj zNGiq%%vg*3au&kF84>+}8hwg@#2tP`hayRH0e|t6z>Kp)H7>tH1jb3i_`WNfDhTDK zC;*`G2Vd>bfX?O*5@39Slb$&SiTCyW+4ZSQWhbWhBuW)Ix6O_bD91UNzNacfT<9P9 zM0aA~46etUk0E4xh$I{Kfqyk01FwRy=@^EH&avKKp^G}u+z#TyepM?U%cyKtd7e#Kw5y<1-$C;SDCJW~9GK9I`LP&?h)uo%z zNg0s0q6It|hUvE$g{0(AB`4BcXS%wqTK1yh>T_E-4nZed;XJ+8;3ha6_on)h?tnc1 zUlk!{$%JrmG0)6DuZs(Jf2_!4mm{rNIFf2ch&~-L&X~UnHiofaRbh=5>Ek3Ev;#QJ zqGFTi4_UwLgBm(i?}^VDXm5vxmyOmfywwfq`mqh8$b>>IgE9i<$j<42< zqO)GOw!eaGiJl&4S$pTc+k2TMfH4uCvmqeKe zaG&Dm(5!Z>$ikIKQHC&N1rhd3K|1W*?1RpxdT{)a{+dPSW16pOx0)jGJ8M#p$-cnmNH5}+2Z4} z$2t#F*<+;Pqa$~B4Y>aL9ah0Svrp6-4*R-2)2J+S?#<2nXe3A~^zrPu(Zi^q;e{$` z_en4w<_PV@3!=g@W34`Ra3S7K00ENeIKh|>kJVH(nfhDovV1b}{%mpXd^|AA02%?o znTe<$<-U(^v&dj(>;0B4cQ&{12_39i@Oq8z;CW)MINF1Di^y3 zVGGVKbl>~^xQ#W9UCX1YZ^)w2N`Nt#78!cX@RrV;zT5y^awy>D#A7xgT3Q|k4#8j{ zI@+~-IVEdnnf>i8Z5lKWXDAq&;75&R_ZgQww+H03{-OQYvF7TU3}%v)!AQ#DRJ`!IYiJ?y-m8+8?oepqk%-Y&(!>n|uN!p?OG*z$q4 zD(u{Y$7Dp?tlVoO46V!jsgk+Le|<9t8Iki1vtP?=fW_71(F#$qjHe zz58ZGH!nPZ9Vy4o)lcsJdl^IQxub zeT1{1WlA}G3THRWl<>Z8jKozG3+B#9V(|$0rJ((ixxY{-38r*`2xE42g0=BI$z9i@1s|Gl6O zy>2F;B%ItI3;T-ikno!s0XUCSI~pZ&V+JMSKyR-U^*2^^DE?r_#kg=zn%Oso|9y+l z1^-_kkpd@X1pmJ%eN^;Yh~|>%3^QOk!tq0-@4LTm=riw0t3{)BRr_+&mM6EI4+G(e{#~;_Vk39SwmO?Z?#=04qo5UK3hH7~n&ARa8e*(-|IYNk<9Vn;OhGu6$K zi>gDWMcT(}TG|(=x=3?~(v+(v!-UB|c#9tK&ZH#XkpY5Ww8Qsix!GeYQC7h2&gd`V z9(a~rlg^jD(QsP7ITl!>>fxu`->PC)TDl)gR!qXFXKah?6zzOZmOWOf%c>$kjUSVh z1^#qAoR4-Oo@i-a@jkfvhjjO+w&DLqqzbKXMp){mrez~)h1@Fp=R-~QZw!(y@mwHb9KPlmm5 z@xQk0%&(1dbsaulFFHsXm}PjY?=Gx8-mE%2eJ1odA7+mJOB|_=SPXc!_o4t0OQz$F zn-xn*vX$GqwSKOyhx3lzJb%CZ&0v5U)zCAgL%Y+zJP4zcsxRXdnSfJM#=<6?91F{8 zm*-wAF6_x{M3q06p)In$g~LF}XR^^`QQ6TfonSajS?u zUVfxr_1h~5|KxTm8Ay)ueF|$^I?L;XNHh9h*O!e2%$1DhAGe`kk-Uo3gS_LOiW zSoQ5dWZhLJCWt-#-P~zI@QPMO){9=xnRT?Cbhgd^8C^Smwmbd1;<*{Sf>6%tA<6ZW zrs`Ga)7?S+NhtBstVfMSX`SCJy$#!USz6yI?VZ&3S1a%n{u_vYm^wGz0(Soe%P7KP zbDr@oD8*-roUO&p2=m7_p5>FJ0RjY;{huEPlK_oJg%F?y-W_9`Iuk^IH|qBb|A#Z# zlMJ)Ck8+91-ZK69SB0yUE^c|69;GDzDNF#kCM1uphXC?q1uh($LZuq2LwGRWnN|{3 zKwQX;m4OhUC@Wn`&Cur+0BJt<3dlnErr$K8R4%# zoW9wJVEBZ6fiQDh^OS}nzsx3La8S36Bka85DTL@THYb6Iw6(3nQO>q1@-7WEOAs++JO!*%4>>A%W^?0O#Emn+K8gGZ!sa-#Szl9O=?!&*h=JPN2SJ4zz+Xw>nVZ?!!Xgat?z#i zebX>#;d*iYFKWt^B}|B$=e3jRZ;@~xhdd$}xO?saue-oDEk=(u%SIyxZqGRlQo~mf zlZMn=FQYy_dJXg>s~5A<-sTQAl`azqX!;0i>8owOrGrm1mU7bwcjebfr_a&fa+~4=DhU9q>V7FiXOdr8xbktT_?^!BNnfuD z?L;!?{?&fa(|d^&q*Xy^SwRRaM8TRp@gEz|kuI#oNK2xb@=OSjxdIZm0Nwsa6pae9dpn45d zXJ(LTKt+$6DVHmc)_Sl2L{?oe$UJ4zpK;*o<)9Qyggj+d-{ps;g>=~H`?~EkJ%PR` zkXbbf(gWhaG_ADFJDAJEQeq|*SRpZdnq!l3!ojfAZ4@M4d`X7|wCm-T%P*=60P3}I ztL?AmXB-e$;!)c_+MWHJTd^`FGme zCPTiZB2%s2^~V7|K#NPmSZ%IE*j{@>O(OJ}>wdN*-EaXCv5z%^=)P707Dea7?;NWG z?$PBPMWL(uJ!C+&$Sqmwx6*m&uj^nu=}2x9@zS`VhbiOStj6k-#+nD?nyefN~;n^rjsX zRq@%4TB;Ql=_SJeH^r$n`NVqb6iLT=;{NxT5%Zo4?kQ+bQp&00^zzvt?J5;fE@@G| zDE1|)v9T1+;ZrGYZ>3q82V#{PkP9*Geh-&1FQA6I`>*nB1hmith$H=w1HNr~%IMwq zbu6PfIcD4JiK(Lw#7h(_lVk6C%FIUCpa30JG4Vr-LtMVr+sF!2jwUdy*g&%cQkjF) zauAE=4=-%$%|2lc9O`~_0(ZZ!p%)@n?DkTTFfC9Dw>g^nh5sXIB+uvOds=>(EJNR` z>DbK|Te6GZeil=P1r2WMG_zVaNt^^*=p|~iW$tnTrx}~pS3yuZ<2z|R@(b*@d;*LS z<3D9-m!U=1l6OU`Y@`hZT&O)#0K_U0->L{GlR_Uj3{9hw7DbSoi?a^#8G ze9h>{^Br=+z6=6-j+p?Tfd>av25c>i;51-;wFH9fIK7xX83W0OH8822agTnQkV>&k z_NpM8((bD|10~ktP)Xe(HoD@8*;LYtD8&y->^+2?9V3_~Aga>J=lp@$Ob+v41;VE$>vwn*A3{JP`|jhX738w1e3>O$+M={gE+Xm^uze z^7t+$A#hZ6m3$2cimjDdCxda?EI#BS7sT70+R!O_?65j4ed=TotR>e;3`%N+M}}W4 z$t5M{h}hS$ugc4aY+OPsGR|3+WJIrzG01t_7gR;m0Wp;0+fHzjE@7>fkiMFt#sJBj{^3t%9W>v-Dmei9H+^FpNu3`I3fg>MSQ zu&(Tir{(8zyl26{F9P3RJUpi4zf$LY!!@3-&-5IF8EbXQZ>-5n$cJSIS}P&-XaCYI zpJ@1yQMfA{oWwuY|45F>)h22SSR?QAG0(Nm8ajXIrzfYKb@imbbuQq&6P)xx$#n}bla~%O+RYRuk2mrIQ zT`Z#YqQUw!k6K10mt!y3r2s)!-mP-4`FExm>y&~WNhgKK5VaV2c^=jE(94?GZSMWo zV<`YziDVz}0o;F6^8Cn71d&3Y$-nwOy(HdwEbkXsys7k3IC92rV7HrvUE}mp0qlA+ z&LaAH$+397*l(k#=EZT(Oj&yAg2hv1xu`bDkScmoO}H=sWDfX(`*GsStCqUlmobhB zbf}Uw!0AB|vo-q(kR#`yguMi;Wq^+dvhZ_N;&lw6DVdG*Xc52&9oxIc9>^ZBUK4W?b*XHY6li!?y+xUj~`(Tv7o9`#Ga^7yZltA0br;xh_84 z({_&B!Q4qj!ucbK^iheIa>gLpx?L*nH%r_mzjO&4q4%eg(yn`)?3!ScH#3UbSZHMI zqr9=rhAk=-vy>JFXMIz~>S-VWM=~jiUs#|?Mu_5V4BASicqo-94H=W+zU%Vs82r1< zE9IDt9xQggB)I}iZX0+pqy$U+Ul&VZeTPh&Kn7J=B&%OzWMY61^%K2or@)!*dTLu(LfDCE+xmhMn_1mK znf9Q@YzWlU)-qyRbqXy>Locnh@|^4-bU5XEeY?+*Y7Yh_w_yiMvv=&p6`HRWxYQ?= z0*D@pQ~vg8Zvu!s;|BG&bDy;Bhvv{;BpXX#4-&h1r&?5`gybY455-)I=uGpl5w*R> zPgds^PAxmbiJ*XOH=CJ2Xd-!k0_!%eQ`inw8KNmaQgLOA8|F$ZcEjbpnBK(P!%4WT zP4CR!f{g3d>i4_k0iVUD)MEkcnBR0UCIvslkfXl+mC>C0*Z=ev0-M_L9LQSuh~DiQ zbkog_RS}$kj$$?!oAIp$b&QbvBBEJ{e7UZUYr6rEE(^mu=U!4x4U%{3K z=Os@E4<>MpJ|Uf;4+7vrT3Mf$0tkviXZw0jah>;=;1t(Nh#ef?c;h6&bngjq?Qkb5 zqlMvEd|Jk@IAz}Axlqy=6O=Rd3K;pptJ>81xIZF52tbjET%jfcnbbJHf8Vqq=6xZ* zu|h&Q<55PZ+0cj1m$m=4iu@M%!OqpH zglgQO;Kk89_S(Sr3FCdy=4m5eufeIi(ek%b<`9_`uXUaz(Y`>7LJDki^=O{$>jplg zq*%zQ9EcJ%u^z{?jwI6y;TaL;pe*7?2PO#RARGH2JcN`mKv|DGU_T++#9}0XTq=8Z z!McFR3kRdd3>mgPjUEs-m~p5M6KwO=G}Pv_lK@nJf*BktngB3CvXxFNiBUya zvC8xPbkgA?0jjT$nyYCKq5yIaF#twXA{}dNZq+DLB<&^aFvj{2u6b3LXA32p3+|R+ zKYZx|_F*jp%ZcQv1cljSS-_>$!LIPQ_vs^gfMPoNI58wemNjm|6-efF@t4N8c=wNfJKH;7I-wyLTdm_$_j9)0;S zpq{_BIs4|oBUBw98OD(DO*~4c&RBdiQxO$8xbdFnuyeQ3WCc~_T$x>ul?wKY-*+g= zab(NFYRl{SEfP0Fw=HNe8mSUr2sC5bd>T%Uj&MHjn_#b_t6>QN4V0QCinpHCjIbY8 zo=rsS6H<6S&b?TJP-pR5U>`KIPU$0qjF-_zs?OS$-gxoCUhpD~eZv(+SOTCo0#Db| zUi9{AsNtDV><)kn$zK|RajdLqBu9z3=D%5JCIXaJ>O~E$xxPAzSAiL6*u)hJX+Z?_ zy6nq}vZ!vf!NBcq!gy>i*7=M5_Uz;B_q+0(iF+^bY&n2iNWzS8)B{%@v0uN?%Q0 zKmG3=<=3$wHG986;K3B+sYOS51$=~#ak}CAV5s%=;$ao1sGD&~KM)^JhE~ThR+rJU zj3qg$>_?k4Xv2F5aK4c}Y?=F?4}1~k3F+3X6PlACm~!&RA|KW)dhcZItCU>I)c8GS z$_}@-KU%PPT`lWc*5XDOZONn8SYod}%c1)YFw z36DoZQ5R}_fhH>sNo4%zYUi0>tKuD)nZQ8H0@-6eCMj~xk1dzRg)|&{UTdsKu&liW zjx_r;tBuTQ2sxxxH{BIaQfeqf-0Z`6DLGfJ(y`#lppKUzy+80B oMa{S#3{`5~v!QPyA0v97f#1(G1YoUm2LQw+FRda~BVio$e=?v(djJ3c literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-font/burmese/style.json b/metrics/integration/render-tests/text-font/burmese/style.json new file mode 100644 index 000000000000..a47c8386d4df --- /dev/null +++ b/metrics/integration/render-tests/text-font/burmese/style.json @@ -0,0 +1,69 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0003 + } + }, + "center": [ + -70.752954126, + 43.39004898677380 + ], + "zoom": 11, + "sources": { + "geojson": { + "type": "geojson", + "data": "local://data/burmese.geojson" + } + }, + "sprite": "local://sprites/sprite", + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "font-faces": { + "Noto Sans Regular": [ + { + "url": "local://glyphs/Noto%20Sans%20Regular/khmer.ttf", + "unicode-range": [ + "U+1780-17FF" + ] + }, + { + "url": "local://glyphs/Noto%20Sans%20Regular/myanmar.ttf", + "unicode-range": [ + "U+1000-109F", + "U+A9E0-0xA9FF", + "U+AA60-0xAA7F" + ] + }, + { + "url": "local://glyphs/Noto%20Sans%20Regular/devanagari.ttf", + "unicode-range": [ + "U+0900-097F", + "U+A8E0-0xA8FF" + ] + } + ] + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "icon", + "type": "symbol", + "source": "geojson", + "layout": { + "text-field": "{name}", + "text-font": [ + "Noto Sans Regular" + ], + "symbol-placement": "point" + } + } + ] +} diff --git a/metrics/integration/render-tests/text-font/devanagari/expected1.png b/metrics/integration/render-tests/text-font/devanagari/expected1.png new file mode 100644 index 0000000000000000000000000000000000000000..a93bd94f2cd65eb8d903ed6e00191a3ec7d56089 GIT binary patch literal 79761 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

  • ?h3z+>&< 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 literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-font/devanagari/expected2.png b/metrics/integration/render-tests/text-font/devanagari/expected2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed8b1bbd61a3e5af6c56e182f6d0edb5af965f4 GIT binary patch literal 79059 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]?x=Aoj!d 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 literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-font/devanagari/expected3.png b/metrics/integration/render-tests/text-font/devanagari/expected3.png new file mode 100644 index 0000000000000000000000000000000000000000..a75f3fcc32a27a148c4a422af797798b62aad43b GIT binary patch literal 79207 zcmX_nby!sG7wws0fEiF3LQ-I86(ppQmTnQHrIeKJ9uSlcQBrA8q&p;rM(OU5MnJmj zp80&IJjF2I4{Qu2zh$SJwBU z{V&)1uebW;=C6;d<%_*W^M9|cN!*-e{rp#FlN4c7`^ITRhA~!w1CBhUKkJg0qrW-r zl=r`0^B4Ep)SuUb&H3PIKIKkxo3hHfxoEo4|9f?{b9243&YO0oqI*YZ0X>+TVka`? z)cr`_=(L4GZrs4RcOCotT$7PFc@i}C;VOiF=fi2_&2A^N?p&K09CwlEHL)GftmkUN zZ}i}jkr)4d7V9X_?M1nB@HW#cKx43jv}*Rh?DUU#wHKxxaeZEV<0W@|b1{G8mqggR zffvaov2tKG+M*pyxt`GNgr>_k zlQ()cg)hXX$Net01--V+=%08Er_Aw*EQT=2eW3R{ZR62pHU0A8o|6KigS4KqY3Juo zW7Y@JWrmf}H4D)tsufYhIChf1P!bZ#ygjI@Zm_MGvd)jJnzsA7KgrV|zRD9#wOzZG zD%(Zpxg1Nn*;#gTeUY$fd8r^BY43NCLZs7FyH&Fkm31_3)Ko9nSY@Wud9$E{{i@qt z-ETimp2+{Sl`wQ)7$M16O2*CObA6D;ML7S8M&|OB`>gAmuk%;`+@Fg?`Obqw$fB{Y zFNKkKHmtB%^1^cyu^BAo&upWtDBNg+x-}j$0>E>ClW7EOc zoruPhhMmuAp4*kK7Tziw^n=37ZT=%Z_=x-c7=W)j|H@i#pHy(>m zoIh;d9Y_5)XDCtn^MMcKw(sTs{IP3ktLhWkjG)^Kk^jV(_bUed--D=I2*IP5xgiv# z_Eht?)csFog;yT@$GrWb&RbQX?Y9FXQ2rar zMk0HLNVFspop!ZlK{_AF1oUj>7nCX0;!k5Pn~uixDFV?dH@hDsIOe070P&k)iL2*S zCm+NQGxqOw)JXwQDFD9V2t(5>2sWLmI^I@TGaH0w%rXN}zJK$+MZMbpn4lv1Q{~1G z1~AkfPuZ}+s?E0RHj7p$OBEiFDG2F8F|&)*L1iCds8}6>#QQ4u=pK{aJFwtY_$3qI zsNb2re|^&Azk973LSt8Bl7xy4PrF=Zdt+MZ5uzHzaqC-}pH~tp$xO8`NR-}+w8PkG z>P>>7Qg*o`Rnt+Dy{!#Yg*n+Fjn-|#MAm^cH2{osz=Uy!3HaA~0xnG92?r|o@;DVY z*S_V`?j{oeD=QT{Nb2Y4zc&sUmo&D51Gi@!um2Wb|3F@_7uP$rKrwZ!O%iYnoA_R+ zQxRLLhw0gNs`o!C->Xfd9cEyaXyen4_xuF`m4oelz~H{YEpl@Fe}v-;;7NE|o4Vt7 z@-soF1{DZ|WN;^-ZgY?;5Hmv*m~#fK_h3d0c>aP*1KA$vhdi)AGL809v2*p+MQMmQ(lmiMwU z?(Klbxr__)-WP^B2-27+K49)*I&MBNdomV*0xGVsqgK|rMxKdNVDQCv0|uQ_559!j zMksCr{cgj!lFi2LOFQyTcSP3H%Sy;#5N`7eGhz59;(uej0rR*XA1$dV1$=T;+sOAY zhs)P$K)jYH^+S(cGl z(m^)__PJE9mTgu(NG%N)ed9O!LiY1t@G-3K!bx0ydudNNi6FCHK9L2gWX2g`%Wt3iYm{*i!KvCGsJ4a zFkI2}pjVKKX!Uv8`N*OX?_`p~;)Pdfqk=)4`GMeS8+C$_pXX%%Z}wt?SJhzJD{D9* zZ$r&p%&6@GLYK}XUE93JyF^sdN_{!1PQKQBV2F=xI}BLq z@|WH{OM{Ete7Jcuzzl>i)BD*{*^mI6L!S@>oCdx}qbn1OmNjj!sT2eY5CF-{EhyQk z`IjyiRcnNlx##q7M|*n-C#(Y(LX!R%7k+SlX4wI7U;M1zw*U6k?O{KgG6B031w?X! zt7ajP|^0w-c5uPHrFpxRxvp2EL}2I(8?&pgfxcqqfSGA z#p6}^i-m9e!t>rc4R2_Oe$K1tFlHn@w31~_EB4*CSrIMJPNR^>LUee`WD-@BQffEA z#~zpN%b%-sJE^KnLCY8!MabhxnVY@G`vro+on2^sj;#X)A5c4+9!pu4^PQz>UB|r_ z;DncivO;3!*l>&4;YhgbMQ+~DwAq6t4ghkJ>HR7hbz9Wf_e9V}@=EO1FQ|jW@JMX< zz{qqNpfe^~o~k-kw|#B^82hJ^GEed@2}kL?%QJ_dBv;`L_&r2eya2)M%3eMu!V^`2 zd2Y`y{WJ^9r^)1A^E?&nVP$OcmVnvDArkLdu2&F2g;=$U|K#7beC-{N1CfFx!y;AR zOHs%?8s0Yzn6xOb@N%lk_`cMf}5&=1$_1ocD}>Z@zeo0a$n?$5}J;MSYxC-^_s8`1S#Q zw}N4~@ef#fD7b2ElyDEmb+P51zRcvDjjfW_JMEw5)G-e#ow5 zHvzI;y@rv#3&%Fa4U=u567}HGz+OZ~G*I%E`_1|jGb)<)(s7#NX&o8NMD+c9Qdet>zx-5gx zz?)^A*f_cISKMd z{iE$7MIezG;U}dLl!r!jX4n!U7m4nw_I7q<-@F&B&v?ypNDN%8DHje#K#Wx>wK)^L z105umB6xqV-JffDh`9?@1;<8sM!cYv*0dC+881;36XslzO^Aw36vy5f9q2Se>Oolw z!$UNtRvZfWyz9B*)6TO2k*xQi^*aFh5th8ZAW(rzCaV|wp7qEBZZ*|pU`$vpa)JvT zmIq{bl=FTZWT(K;n4FyIyGUq!WW(`PzU5j0X;?wXXVg}LzFlpZza=45=4HgV@aP`W z=L=kgb~_DRhyNEr`ln1e2jaJ`eLF%>V2pxH#zXEF0A29T4s2@3_cGR&DGl*7_b2Xk z&DVt6PPRyMbHZcNUkGcYn_2$hhe&d?Nqpx?_tc=d?7LLw{wWuT+>WbkJ(F8_p-ql{ zF9#=lyr?(2HdIfC%>x@!*lhs7m2>@9-Dg{%PvMfc=f|zkK8FdfysRv8ni@YbPL=gQ zrF?u}Tyziv((x;j1?Z6s%U7EEK)u{iHS4`6dKGe7f>Jl7(Y^&pNSmaOl+XNUye<-q zAx3ZDbMEK=KQg?)T^b4mk!`aNKWobQNVNnHVoCFJ3$+G)lQ3SI?%mwvcoxf;lpt^E zY;olPl=$*H^WuT-m;++@f$=#VRBizv8`<^(q-uFgAXJUjvF_@8nQu72G#-SKZ4NP@ zvnCz6T1vo!N23+viQ<8=IFP0BV;7ZVIPm+EfeIn+8+QDAqf@y{LLu$*m%a0!pvq-1 zklrq1Pk};@{&%6y_5p1-0iFY7d4^Q9v2ISsw&7-(gnHX?(i&s1$BdpT&P+hqh@-B`8zz zB(HTjJd63kl~|6KDXC8}@*wNIjYXZLO|`vhL3Xy%v%C3D{bDC7UPka>>(4`Ph#|NI zHC4GxRc~||upuch#}kC{TS0SlGI9BJkKY{VJWcSLzdY7_u1kGhw>zn3^>$nh$hVR2wtt0xySjq!<#5Ydk+b#K zddSBy-|)mR$IS`%tJ=w<{x!#Ow*O+~;9l=gfJ>az_CI2Yw`zp((Ti<=$ur!|PThYd zk}Qy~5Z8EX&(Jw`F7L`-k_*4RG&y|fA?@sCsw=81pg+ujD!RXe)NIjA8*l2mlU7-2 z9h3{Eyg9;8>I_BH$DjVSCe^dF`LS~9^-PEew@~Yw%Qdxy?7^er{NhHh$zne3&Iq%! z-nzNX56=iKBHO2m3Q4AlWL?gE2E$)zg;}26+XQ)R|NWb9C;dLFyxparsZP%RN6fST zR2g!0PJpPRTi`!NZW<7fr%DBODSDu z^A(aDNFse0t`u(jMD4(<#_#9`n|BnL$tkm&Y|DPJ=J4^yi5AAnDZqmO%kxRZb7^H} zajE9ubpQ4mr8w00sPs&ee_$%iY2f=ant;F**r~Wau!Tdpzji_kix6+8?*#n#1d@5% zQf6ckKLp6VLIJ8>cNXYsz|F3IqAFxV#>#8*bGwSYl!yZlE{XA%RhIv_==>ia{PkLG z>rJO-{WmqKjYjTC&ge1 ziIr^w_}Utbgc(4zkn6?KTXk=TINGCay;I`a zakJ5C)5{sXsM(Q`Agd#j3`?&9(2pm2u0rBgbwX6N3xT9N1&?9pbKW~*Q}#_)tZ+%o zlXL&K^?MzpU!~cU0c3$dlLUp#|DsMe{>RFpy6?1)aHf7V0z(@gPK#_7@cubqJ$9&2uP1v{6in~Jt>A4R%I&ly_IG) zAmHndQx~s=r*ZjiD7X7?qN9;xUdd^O3)Ic+Q<6w(Hs=$yC)-*bbFu)dH%B}`eyj6i z>-=~~*cfLCrzz1^xQ4u@k{-OjhE1~+?qqP3eVw0n=kx3RqJ#5y zfxii4b6~JFpq8d&-YmTKW!QW6OUkq;edhQf8tU0 zcA+x>3J8gDF#JnTp!XC-4tjW%37GbulcF8BJ6(IV5V0)GG5{Jk$Mo$RGK&E?V6unHu-qTX>3KKuRXU22n*D@+;Mt0%} zcT{^MYIYJ6`2TKnLu)`iC7eZa#Ph4a1Q`dBHLT`_i9h<6?!9I(E4=y*8#m5mWj>p* znu;Y5;v_VF*ty^1c_(SjYRnfJS7k5Sg-aOh0Z=C6E>M?i)U0-e@VEu|r>!uU0@l!h zpacC}T|jLjtxaa6z>aU4+k-g8w*B6F%0H5`kPLngFt}Mm{Mq+X-z+0q&xN@2GD3hTx)*{{U#pUGsZgS&lH{x*>pRCFYVw z1(2~MFeu3g2-6xdb<|Zg)|6NIaqS_v{n}w8Cm}v`qSk}*?L5W3j|#US0``IF!uJIj zfnNvB*Fr}DS^!@XagsmYL)yW6vp3?uX&21hE2 z{#e)55${cT8otO(&WcBjen%u;BlAumiPVirk4#wSCG?Zq-LK!?TkaK*!~9NbPA$lO zW8PcD1+$vd^*Cf2BbK`Y@LH;0%?SE-Yd9(Yln;{?dO9y|!|nU8>E^oq$9n^=N6BmB zRm|i>uziN4z{y5XQi*rrXZ3@j_UA~$N#DVNCRm(jO4H2ij&CSy&6UhIkVf)OdJ>`q z6OGJL0bfK5a{GZHb164wSux+-eC?e)2`(Y=P*{+I1^J)zhcl}qd2R;OSe$)&i* zrarqL^FcJb24}y?U`9tRsd*{tiJhs{V`<`8yL+Rb=8lToBm2ZoWkwk4JR@IZtSqqOYL3e)w`@q$a86rT9mbB6iJ zqDnSji^(8=q6K^dB9z(qEVG%04RfDEU$qLY_l*cACRAaynMs_`-?Isy8rYIrO)Y zmhi)&M;rzaKKiD1ck)f;pCSFnEb9awST0?^W#Tg2J#wp%eKtEM*w0%Opg0Dbx>U`!Hl0MT z5Lg}gGX_=Akr&?gfx=SmTixV;vEpQSQEUCkfRpEs{!_mqp~QjgnfV`~{Dp5AKg`m& zvcEV9&%q0qG%(yuu!)#F<2*R*44_imuGb@)($Pi&k9;QBb*JUmL|OEeC?Q z`l1)dwj?<@M8ToIVElH{VF2aSlSit5Wr1g5p`5O&hae@A;0XbcBm5BVGZ$iXvENbt8xkwL zkvtz}!ML-y`PkeyrkeX2%uS)ucxo3GvD{P#8^a5>(;pmR7@3}}N^rlEZ_f*nFk(+bNG%uUV%@%B5bQ)IYcG1_k-$xy zi)fk{VbA(2n@stxFxODO#nRIoFxr3!kCIfL%5tx~a!&484OtP6qwB4vZ~!HsQax7c z`!*{T*i2bspyZ$>NOe&Cu4w${`a1$}PxYRx5u+)JmVPkCYn~TsvT9EP^gq`>*8z!` z(S4Yt%Z&>XxL9Z+b7|M2>%F6*2dhU6ESoci*`8UQQQYM#p_9n=O9|KM^t5g$Vou)iy!cc-7D1|8m*reCCzg-*U zbo)NHLRV1!@^q)Yw1%zyBRo0Z5NKRGaBtfCc9B*K%RK#jqq{qTm0)MylzQB$g9G~? zEQ>0JlydBXFXsKWQZTD>OLy{5)+h~O=#EGQ%6HD8wx47wxxnH9dBrz&D(C{WjzL^9 zQ1Y@A=#u1i>t`@sZj|jJb`G(&<;OByLY(d-ZdMyeNuy#JC#H4e?~}mclb(gk)885d z*^FpV13p^>^AIdi4{?#`5P=Wj&fppKUtu?TAnx_7i}m3cB#!3ME2IfWMFA&Nl7>0r zB8+?#T;F@0r%dSs?$-D)h=Z!7YV1C41sK$BhU#EXqWQ&?G;1zBjE+QZ-Dv~efhyp8 zb>&}4h!Gk4#xHMw2=~c4dPfOup^ClTJF!_q2~6>3M52R$N?LYYseg1tLEZ)7KuuEw z@rI-jjw%HZNr&K$mmJ2$lz{_LG>&w>o-ti?t)ZOR48*CG5>0cpcV1c(2`RD)l`-`* z6^7cC!GOf!Byv>|R+Ydsfu~RL^+*GLz;d=#tyx7$O>ej83%B2&?W!||lH8`vMo)e+ z&Z$kAQPJY7OpNKM1uWfJOOSZaA|G`SfK;WeJxCE1ViN=6R&d-kNt&(wO6yFV$pSEy z!=4{`V!fP+-x20P!~V)4p_gnzDLlZ8W)L5}KgK!0gJ2y7{fe|V|8)xibum(a6r4n7 zml*IX7e$3bBtvvFYZ9R#$osb>(vhPG01Qzm9X$yfv`yC01Dhm1C0&BlfGKD?C8eO0 zsvl`++hyw~4nXog$p|aml+dF<1b-lK_6#u#Cky*0&*wQMkCyn9^r@ddFTIxg>6jE+ z0cTU1Y^OBx%hf<%Co!-T&teP}+)zAvDhGFv`T)xA@QBc{T4DLAp}r?OqEdi?V6v}{ zSfYF6EHjN1dd!h7NFkm&)py2y-j`)JT7Bk5IScnjRu#xJqdq~N&clUIY6Xo+~Fw4{;c ztnp%;NEa=}8fmN+;o}p>mnrG+ICQA5p3UbccNB2?HCK()BK2DX_nMMT#Njtq2pmP* z*UN8>2cf3V4^j%O@Eecz6o8{chaBx{{=DxiWizL{USfshBLG$1g7=60_gQ6kf3hXh z4kuG80dUO|+~?kD>8S|l!o)xSQuxDWRdQ7*5aO~L%SLiQqbv(pk658$OtxVUN)frr zwZ|&uwt<6Hv3Tn>Js+(}4@VX0lkqGwM7VN*ywmG+y8ToaW#0f`JmhNn8JULB8TiPD7uhAC7+mT?vVOr?smEg z)Pd*(uX6m&U1O5%p(2%!CPl#vFFLd7)yx-HA7BSZlu~PLpATU}Xy2TaJ9c zwUhU7@*J=^nWc9ZH)gTx}add@E_{}9}dTAXFBN`FL>iO z-e+p}zENl{5}2^FIss(`)@ZD54-NYLHCf9_Bd5Q)=3(m7jHH-G=pfFY7sXyL9&i-| zX8wN1mgeL1fWM%^>2Pwrb=G~}kbrbDff{$}oj+KmOZED@{^_~egPoIk|C=FolVMfC zN3tK>z$)gD!uM`y2I;r=CR2PgO#A6XA?7C2U^Q|bTOZPl7LHYL!3vC}7)ftd8UDs( zwfghXV$Ni*ij{vY4JUK@QN4`mcX``hd@n@*1d$Txo=%N73Y?FFRs++%d2sm3-fwAnU3W%S z^)I%tOkM|41Ww%JD4}93)T(H`^W@Wexjn-Qp?@ug?z1nVB$n$8Jy$+AtQil^`OJv8 zp7hI@ievW(4?e?p&UiM_KZq=f`UTt-vH2S9G+*`m2fq$Z1QTuxOr$4nxz9LuGWu-J zzbzlrv-!MzwrzA=mJs>sd?+D`4zwA>?{LrWO}DQceVGN8Xd5B|tR#+)X4b^3 zb?z2X6gurrY>WdD`g2w#*S)DH*_Rb;- z4y8Dxw_0li<~)}6=gz!c=dgZ|ZjnVI)5}1X&CS+eQ&G@}w24#n)m7Wjbu@G*HXa-e zBX%^M&1Bc7of3X7H&-X>J}1Am8_VDoSZfnUTElgB)1|VN1;^rz#PyOy*zV7*vToL@ zSo1aSZmVx!1-zD-=xc-IKx;{p_u)jRcona4%w6;@>^VAzT)G@ZUfuKe zb2)d=2h`>+Pw#tZnH4FZ*K&97a!sPCje4ZB!q9iSjiIgb;OZUyja(9FVE0$k%@ycAVIUi0O2m-@ z{_a@AAn*XC`_x$@lAR4;$^N%TpU_eS<9Y*0O@)v7J_^9jUYqzkpyF#ac&EkOizj*% z75i0yGQoD!5q!mjx-lG5A~Eg)>e3wJqc_BPpNlrlQ*2)reFM5=OdGLY6L9}O{mxdhEF>-_m1}_Whj<+|2GuWK>gGh)BpA9q7>{i7>*XK+f&z-( zB|>U;=82DhxAUVYPJs7eyw$gJa&@Df39*abWR$zmJB00ytmrL~Y z4In*FMFE*>i0|AI!yge|!p974ZNwwu{!{Em*Ynrg^J@2;??a3sXr^e-iQE1@~WO2%`Kbd3yeq=7F2$uGaRFH2PNufFiZ`Xr)oY!(h#cEMuRK zPY%CHG{{Wp%QN3h*%TXgjJ|=C+?JwQ3J`!wo=(Xp2-q1^_?6;=rmo`n)50i-18ohL z0UIn|+);Exj9zCAyOGic?ZLEry*n0Yh$X};txM%ZnI=~#c z;NEmGI~dBAs?#%Riid?NEJ2AVQ9oyK*A1VcQ+Q*q;JlA?`PTwmK&FMXs^?mj#8|~= zsls0P#QO529SCtW7ETZNkdvtheEG1+&`?s`1ZisGp_=CM+Y1lfNs&Us1RzG8Fp$W( zMuBcYC)*ru#y9MR6`Bm<1#nZk8VlIH^DhcL6j&K|Rp_)5@is7qK6${N1Pz#wZCLkm z0P~?C7P%Ht7Ma>PT-HbGV^Ac@81be>|JOVx=piT(YyQCrR7<7cE|}3@OsuEByF;yy z{&0MAKHlVaDDQtL-(I&M3OWpu;ZRH=@hRvCl@Pf;T?${&#+TGsh2Y=gHVKxr))IO9 zFL7^XXQ43=3q@v3M-S!jg~->@=?2IW=&N8W7t&YX28Iw@%fi^ z<273JuTyuRPK*jA0((rf4{^pMp;01#zn3*0AYJDTEbd3#ZPs8wW-BvF8bZ7kpqk7v z8Ve{VCZX7T*aPE1<2=bgGJ@alWu55xuVy8Hi9ehVJAb4p*TExkrkFARp{Nx5H7Y8R@HTck zwq?F=1ZH3b4`=BANSlNrYwlC>@<1mqX%8lO~_SW0%IDwH*G){n)G3F?r!wQL^=*T!5*uwf57Uw(-qmrO>|*50Vv_uZ`+~ za-R8XmktKzcvwqL$>$X;zM5otEa78brroCWFh5gm8L$Buk&~=rPtKO(x&Tr>e994{g%^4P zeLfwPm->OvkmrHxl)czXGtd3FG=r|#6UVtahcMkgzZvCIF2=g0#qKy^EOZ6BKLHA| zB)aS^wTQdF;m;pPB^nt`^%(>@f3%r(Q|l&Rzh#(s zOeB7~py{liQ({w8Ykn9&wH9y36a(_kG&V-s6$!90_xd}#i zRQS$w6lp7J*He0bqQ&I~ya0ZjIw!g{p7q+tU-^LUL@wcl((mr#Nj65+^0Z!tmqvy+ z>KwkF8z3hkM)mYKuliqGHqgKgv(Y8lXS|a(f$gtplilbclH^Eynao!(CpThX4DWy@ zLjkSH_ls%D2_&UV*{8^s1kWZ;%NJ=0o-rlz2Bu$GAvK^)SlJ{Gn=0Q(;Z@DLO}~N~ z8}*HPy{ct3zz?HM;H7wq1f1UKx9=fum2!lPMGyl}XzOdf#k+wjxPTVGBCcP;9QYE2Fxk|pE6Ou0`kT;y zRQBgRO+3wb&4_XIRgGezdA+;YsDoK$q%ip#xmleaxuCihu7}Y)g4-Z>$ZcnrLn1-DCr0i^@qu1ah z1qwZQot5^v{(IJjD4(OK0aFnUSV-iV7+mrItbr%?w~MUzeVtpf#2SHdRi&2kjfn*^z5ySjb=A!!|&N=t7?{I&4xV!SX*y7Ekz2(hu`0A zrB`)cB^9~3Jn#?}tH>KM%L zef@SdYVNxhOiU2=+H`+1ZS#F;Bac%8s95lX^M~L|J^xroUc2-`v8yo#FFU80vSVOV z^PS@F$lO#f%+0SgY;%I4hS|F1eG|&iUMJ4{ODO_W_!=#mJq5|C2SLAjtEtkf#ZLW^S{Q(HKdbxnZgMo!# zt(;H{zqGJ{eZx`MX4_fK%Z|0FSRyGP;;ybnaA0=d$jXPS17@G3y>Fdm$ zM3+-`YYFk@m!tp%^k=4PG3fqp*V>jb5b~qCcx#<>yt(T5me2+gF!RANkP}w1^ELeb z3)gn5+KGf<;Tf;%*Me#&xFmfe2uH}{YEcy9GQm8Z9eTv*??U9hbNnwDFs0QsdnqtX zDdO;hNkQp@{*iV z8qo5NFjrr7-hV%nhX72C=LF<8izc1+i~M3T)wUSe=U^ z^!>IBLjIb58i|>?)olH?TXPp=IzMGX&!2OE{?dP%piPTqm*=?^tEQUecyfqGKTI8U z@h)kdcGw>4nWjPgrLB>Qn5XYlUzxFiq8WHw&00c$=XVIvDmc@|&gHUz0Y!k2rrO{3 z*7k8S7(nG*AR;ILiVk(g;cH6 zF`8k#-G5`%Q5DJA))N@Y_@)xHwSg)O4l}Aw{J7FHRS`NMqfMP&n-nefm-vd(*Kp>pn$e96_XR*H_L4gth%+OM{xBW?vx1TeCpqT_Zday<&&Ws8UT=9764s|T zhu^zf(OG9we=W1gy&bMcD-T%i20dnM)uL-DX9esWpa}~dk9}Xp)pz3pAwf31rp;O` zn8%Ot!BY3YCL;yKfom2nv2{3B>kj?JxY%?q$y1;@zuM%Oll(x4qbm+KV@g)8i?h@! z&g$mvKict_uIu+>^^S8KEwOX9(~iA)1|Ph>TCo6p9?-yr*L6iq!ZrUz4qk#K3#Il5}3scQ%Mdii=#zh1Fy`5hge$ zzdO9R{VqQ81@R>;qrYPw*W4#C<=33wrsxnW1fxege^#E3V&S`?bdCd%0}sVYYf3)V z{M)kt*C}Hh_marF3D`rxM8mQCr+E zSQ()j1vnJ2p+M$CUEp+GSFm8X;JF4Vz{lTO;{`1;?41`n)+Ysc#>&}}C-86u5IpOyh|Jt_YJ zyhQ*CD(|aojjS@5vjg8+@c~(&j++^@KIeg@qH-wx;^Y5Xt=xICa?nYi5y*DW#IlSB zCCd|no2$bgS4@V=?n)R7!!sse+JLGUHQRvXnfd!bb;K`?htG;$>+jfa4ve+qamQ|I zeeaOcFOp!#Apd-*r*z+r-ur6iGKyTllayu*&s5Yom(*}3J{)DUe3vOz4+qh0s90(vQRZRudVzyCUc8Cv!~Blx6U#799TH%3*x{*HL( zE`g0(GU4}so_~TVqV9+t4t%5{<9Ql2TJ66yVVz$n2R6zb{H_b~yZU)((eUpD!I7uJ zhn}hfTh8Rn(N5y!8GgC7*_l_lpYVj0+~jF}kB(9{YdJ%MBeC(Aj+KH4v6A!QYirZH zJGg6h<-Gzqe{+6h&Jl7P|Ln^IWf{G*K8s@UX*Jf5tFOTh8P8t|Lr=4H9d22!J@$W_ zI_rMRykABmrpMt$T_zaiofc%(`3;qf2{1wImTn&d7|rs5wbzslBt{N?uwI7 zs{9D@D$Wh-_wtj;KRQn|CDEaem^@uPueI}P-K?=TjO?ml(tfQ;Ef=YG_{04l^`~Ebrj-NBJvF+z2J{aG9XYP_zoO|TKRvu%iWD$}N&e>SJp}uEQchFl)Zub#ia8ZFP(TWJkB)f)az!Ph7)yE@ z7>e4)l^A`$|F((gJZPzt!#Xb+07!3-ivoX9RRNO>1K6U;2_4`Y#)oKlJo=l2{3iu` zp{NeNemGby!!iQ4j;%j0CQj`W zHR?FJ)Vq60x9-Uk1szVatP+0u!^(_!lIuzsDGUcpa0B-NQsZaQ)L?W_=^(oM!n4F}$21<-nU;WNESnyE0)AQF= zBLpRB0xH44z#+EdsP3M6!(H6ILlcBhH44CJwq%;Va`Mf5!VYRT2hX3mDqKpNUYpDj z1Gx{b>s-eTt1HM?(|E0R_lV!~vRJZ(NBb-@wOd$3Oq|Bb(+O`skWz71qBc9Y%-t+* z^4q(jbsc#&$%W$iCRKAFNU9P;nx*r?;cDtlYwq<8MAZ_DLL};6qWX#|~%A-QC zIvi3I;u0TNr&8VJ+LFW)laxBvJ5)8K#IE`f53pLm7rZl7jjB}@n9R<`0gJd#5$HvU zApXKH{2#;L9krbNiCZJF+*Bu#l;(TElo-pbS9btj^*t9)wkw_!Zz(**7@(9fJ~E1M zlq!f$v>EV1UZih8xy^%^4Z{gZyGNyjp2jmIZi#PxZ1xSu|AcFNv0a^p-0k({*<^qS zg4L1i6N#j<_N6{WvZ4!uUO<*h2SW!R@m|nFSZR63u{Y&HkS7^c1DP@ooB_9~ ze2QJ2m7AbSk8sTgenKXd_FdRiAfQ{5U9i_XURZ|^X%J5YOONpDJQyU^|N5*wSguy1 zL;Lraw>bTauMudA@#9qA1`SbvK8OBHXA*tXQ4!eMbngU|sAz1fCe7O$+`-0++XPVN zE!`Vra`GwZ>MH$##eoFa=G|BlG+m(x+~+C7tFa&vKkos_?h=z<3*v%0Ne2Sq>Z<05N_d`J==Fj)seF}?_m>7A9#*e+}|e87jJry zkHg{ws75YWF{*fT%6G%?h5ZD_*u*vzNt=chd?=bc)2;AX-zVqbm)NrUUbJ0C#;u^a zzpVt3qY}nFO99c#KSW$>iqnF27twnYb3Cfj;)IDR%&P>6JGgV6QQ6rHN478ku13yx z;`cd|D&&g~=T+U``Hz```ZEM!y9L1zA{M zTYI(yA0g)46hJ0pYjazkf`iOJU$@Wa__pBCl@d8Y|Av}8+(3_*k<#ipKpZ zfN1A$-Om|mbF?Did6||&I;c_uv*ZEWqa8hCQfhxfhy>FN4M?|ABn2Vd^9*cIw@W+e z*DXusS%n@NS9U5#iK@~H=o4oa$;Yv94^Ell@W+DRLiB}?C(QKMC{9EJR1_)$7F=%# z>27(ve^Hp*11%36xO!E@)8*MF!}oZm;dibDd-Uby;?^3#w%QMv^*FTHolA~a|XEXCX}8EgZ~ zh=v?6!5N3An>)u85mayvqBk5A1`bjTKqcxBO{`g2OHIlK+YF@enXh<7d}9cIo}N;R zAcbxxzwC|Z(`KXmp6YNZ7w0Z!{e3yu@Tq>CTJLW|obj$o*oB3!(8-MRlTO2TB?69v z9udPwjvRjdl=(wB91kjDGd7-rNv!pCW{*vVkP$kabp0t0Z3E8VGxyTgt6-szG>=7L z(N4b1*Zxq+0i+A;ah!+|O&T@G_J$O2+rU~WEh){}mV51~YRyDN-!2ug8lMJ*I61ZG zfh*j#CEWPs`n#BA^O&^mk;0ib^bpH~CJ?t9%PQS1$JS#~kOkd= zfXDg^I8H#|?~mu|+@6lG>u>*qW5NUHx-M^AW0?LbIedFhW5Hu4tXCC&0Lp&GfuX}; zxJAf&uv^XTJ9l$QTS7MS3BhJdJsu_=vtfgqRr~AQ#2@`w!26eJMmFcYhQ#G=Yq;k< zW%AgEZ`AxGhN=8@C?E?vPWPsN`&&d+?^feOjHw0Pf}T1=z>U`4VHCcGN{jUIintFx zMglF>a&Z7$&ZQos1=ckTajyNxyN_fWYmi?OmQYVGy}-6Ox86NTti8T8ks+L+pwZZG zlsz!tqZACe)N;R0Zxrhna8j~b@loNtSB?k}g@KLr?gXui)zFq-RnQZ7CN^y$ps0|@ z6^0og=p0Np`f$bNwkl#EaG*+47p~+d6b^vu{qX~|n%4k$iRv!G+n~tY4hzw!*5p4m z#P>U!`kaWZy#EhZ=N(Vw|NsB%oDLmSjx8g{UWe?Eag0(SB(nF+CXv;#XZ9u|k)1sY z$;vLWLu6+qgz$Tv-ki3SsaJ%KZ_pn!mSx&6Zf$)7i*zUD|s<8P5s|3NK$Hk3ih(en_Q_c7t~J)xN2Gb;?v=v z?BF-+jq&d2T`?Nhd<2X*tb+Xf-3!}HcN98zqkiWoGRjiaMtirIc}HzjikauJ*pxoF zXW2x`G_Uv%V2eQJ%&L`r!-rJAjU!RSRl!kz0U=+Es2Xe9<0MbISB-X0PAx9#nJ4 za>{K*$qk?KCb1JEPz}kzkn=k^ZuMPneb;|pY2>CM`yFr_9)8++@cFACm*vciyY)R2 z-JO&C6eGPKw$fb}u88MwMJ|wWrS0#MU91Z9`8DhDgXWfwvkZY&u<{%|X`@B>U{Zw2 zQU5Ck>2mv*LX6|Q&sZF<%XITLN@x(pwk>9J+FWJb~ByUQ@Zy;iuS_4eT$0 zT}I|&AQ2>L*QCRt4B-s|aXLtWZH;K;gXE>KPwB)k^$9LSMdw*M$#+RjM2?J1q3MSQ z_jk=3S6LxS-N;H8^H?I_D65cBpW0}lbStN6vqxZ^VVFK6*uPeq0m-!!>Bn-hu|$H1Dg9AF{e|?7YxhRw&39WA^bF0|X=U>i5{+O|L9f zp;(gS0KBoq;KK5$vnh$A6Du^9`};N{Vk;c!nCQAI+xqucA88$gKtXbzrTs7&&s|3aB*a@U?=_b4;?`dDt&w7W5{O(Ol5?U_6v3s} zzHUeXAwn&&%NfOW?o5~O@s(7&UFH>3mKbl+5u=7X`sCN;g{u4u9^L7GcIPhV%)ZjD zQLOL{TtoR3f%Ea&o0M0s_!g<7&X*bo2{%5pFK|tlr4dh%`hIg1-d2kV929SK&I>m* zz6A9VrV#w{7Z3YQ(@zUv1NOWeZyn7U=YLUA%=_fe_T8><=zuDaNU7 z@bX~6Q8}E(LF-ms+J84^k6M!%au9?ZQh8uDW|;&zgt>3|+wcJ;guAhJ1}(DI+d`=Z zq^6Pnw79}BB)-7~yMmM44(VFX#At8mQ^U;lr>Y|L^!3@thb`_}xXq2i$$E$XuJix* z#o?uxTVelRy1>FF&jw4qjimm}e2-2^;$UE}{DwnsRX#*=EU5KYf+SP1 zYFX40-lp;(SGj1g$!K52Kjf|b%58dwhpvuVP4OqiCShN)rb2nhB2uLeDq|Sm|Fpc$ zyO~ULe4YS4pWz+2fWkc76Q7SvzlpKnD$NxL@f%a+>MrW4{gQykKv_RwFd%I*^aT^# zpN4817W}Yt5+R&GVPqLA@M+({aDeYcj=^g+H~+GEb!^AOoGua54R?OI_nR+n%r=Z> zJ1RVRD<4u&>_9Q7XL!&_wK|_4*KIMwf0m+r{e4Y?-BS>v3*XWQ_oO8iyukP(+)iwbnBfE z-Q7v6V3fB&Y`WyzgWfk!>ycq?=3LSvBi-`64KnkvJwx*sq8xO#g&yCYwn#dNwvI4O z|3UeGinqGe8Fb zIHXBaL+*EPFYf}|;M>$32bw;?ZU)V!hc8`wx$!U~msh@dexLh)0)EtUT}0wGk)&_# zrjoS1p9f)u-&pkN)1Q5? zuJ;eX70KUJxS!e;%9e?5=dR0k@UXO)0DIi^?nb;T?IMFSw#fShtaAzz zDlpkFzF%bA=3=b)y)dTuu{OrM*=kJmY>mMf?B@-C`mJSzj{(U=efi5Ov%n)cZt|7i z0E_ds-xO1z0B#=nzfrDch)q5cA$U0+dK}R9Chk~s${Cp7lEU`WX;H^^Wwm3gpiE1f zklp+Z@FY(v9NM0Q01_3R0t9X&PLc1~+3D81e_ za4h%dgdd3o)5Fy57mpkQfWNR=@oZcWx!CnjzSTi@il-fB|4MvAS+Zb&&^5_QUQoGq z^-vu=eBg3%F}^>|*-4Gk({Ay0@eg>05#Vw@E+fS_9`o_N1=uh-1n${+nUk-b?wdw1 zFy@X5k{D^pm>c+wcRKtzss|Xag~)o74wm)YyO7NY09xf;bMDt`BfgSYFs{wnCP)hU z1heFe(yfh{-#y7qp&|l%)j{AljU$fCj%h-_Oa6I_2^($LWw)ZPNzOH#S-!dMraJ!R zZ&2ful$uMbowKoRsLz+XoT^^aY)}G}dn>^rgtSnke$pyK6$RilDyQm05#JrvH zi5^iwf;P=O#UZ1yY}qj|=3ZZn{(Hs&!%`X@HjO8xBfl^+rWijKf{)1%Z5!tJlW6Fgm%oofQ21ReYTmJVQ@h5CgP~m-d|WoRc8jZV=K&fW z7Ye;r{`ex=WKIVe$!KXVn7DFS5KOwrP9z`jAq6Jhx(IX&mnkGbHJ#EmM-$RHhIC{f zFm3-5_G9KQOQDjl@0N&eI3=VjfhdfU@8W*H9k-|G5BeZ`Mg z^HO@!iw{}dB3^avZ|DqudiKX2GbT8GGx>1v7Syn}FU37Dd-19jQk5KcHvlaI;B>v6 z9wVOHYHtG}qBYcQ#N#;y{`)v=U3mspK#B3fyy%$<95wP!)Z{|O&fB@^0*FW}6OdV# zU}P8PL-LM<)09wXW?ORe4>$nj`SmA#{GC;JjgomG0fr>t)u zx{68(B6@0Y3Fl@iDoEz+fC!1YE+`y(wk|ooOM9jaC$B8uUOKvTnC!i8xb5|bxdiqj zO<9eB^!tZjHMBG6k;`ty;;)y@{4B~ul+-KmW(6Pq5?w9=n%Rsl)u zq}2+V$j)fN&c9RZ+Y9Edd0YC2naE{-JRY{bj2gEnlDo>*zcGaQz^v5o@2(=>0qgLg zll!uK%Z8_d6ffv~!X1iTaUwNOHS_6%5sdpYj#Cu8_Ky3apjzfui3F<O19mR_156=YH2cwKfFLLWL zMY_2*a65?B9Km^^&e- zvBkE9<;t%d--FgGlLdaYWp~HCDR>ijl?k3-&)#S-4`E8l?-%n^sCgMVglyRVIZnQ^ zA!P|?&NI+dAZfrnRga405oB*;Tr)D8TzpF8IrPLhj|0H(#=lA5<&L0iazQ|Mf2U0s zM?w(6o2Nz;48RrO6 z*_~ofGMR5;qb`-haLm)sKls>9G62~|+)DpdfN9PPz%{6`5&g(5Si2lU_kyzEb(q}7J7jBlO~ zAkiD&Ya2FD(Gk?>{j{BKK@rY$wi9akD`Mf1f=UsGbH`J>F~2B#%&D4dpE<}ye>h>= zCXCs{S7x_^qL0=rH@Kb*C$m}htRD?A-wA+5ldGARXFCMYkz4FVPB6DzTAZ^+`db5I zV$zZqm!Mr`Q5ZUGzzu_>G4eERWU`q+_>B8T+B?rx`~rJv_q^98yq=vzcQf8S`=Ak; zNiaz7qJS+pAliJ#Q;c}?ZxXe!T;wP*(O_gZR!D52SBA1O)Nf<6b-63W{V`wCk@u}8 zxNb>CLyCsP%PI-Ep5!i94ZrrMirQiqlu~hvS}#KR;m#o1LnYh%X#%mH^@d95BxG$i zwHdfa%D{PRispO`r(Ua5KAB$gz64>y(5&%-!9_=QA924ks9-6 zJHri?x{RRxXWtwk!gwO31{~jJaNE=hF>CZ8P>0}^o?2gl`4;m1N z@bDUKJ~syZpLXGgZpFUt6ASijg2?-b@qKtljeldDwpz}}Szfyy4GfJrvdVw#!aQt- zBDDG@*h68ghQAM9&$Vl z&>_kXN36wbppI_plC*h4<_L~B>xx16SRxcOI0Tec zuiyJ`pZli0SORW3o~6JSOF;H_T00TYNB!Vo+%L?F=J6G{BJm?O{@JUSwLjA)SFij} z0;vu$kCCo>==IP;?qfP$98Zf<&=gK${+d7h$+Z&!ON7RG5ahOqE^>G!l`S0skGUvgUiyRkrEu~TOVKTzJ`Q(h(iM4p>7 zV!w#D5e^j9T-pkV|BQb-a~t{spksfJ_dTrjT@dGz=g9}IE~!{_Qc&t)Br9R%SC($5z)Y#*ep-rQ=)J8T#P zZgn+&Hmv^Rxzp3RbKmW=M#0RX2A2x)e+wqO0}U|KqIn>%^SIrEG4l3(01#rm{nlrR zS9!xCKNI97x|6rfU#i~tR#Ovs;Md1jk7;Fv2f4oRYE75dy%9||eJnHUT|0NI(^a@x zwf);>m?H(Xp7HBTzpE*8JGN(Z~_^2+V^W8K4(LjSEE z!a#}iVK(GZDc`^EYlM^RR0fYfzBPf0m9b0xU1}{|^4q`SWfl=0c>7r~Bg{8~OnmKi zLhsY58{HlVK^l36xfW4Jasis@$MUrR0Ta^#K&n(F1RsjV1ADyRbE62gVJB#=>+g2j ztF|Xvj7kF`A0YN%HblPP+^`X`JWs~^oWd7RzKM?PeK_9V-;qhTG6Y$;vX!;;lb6E> zH#dSe-^HAcN4h1bn$VvI@BgLwoXRV7>3_Fc;4vHp(*8Ey3<$J3$vY6V`0k5FZ63an zJzeYYV5YS*1^(O7loM1Ek;B@xUW;N@&Ifw?b9q>*J07|2;Q>f+Gm* zO-sLR68;90Cm_n1^6j{QL=!NT`^7+le?6PeV);sR21x zEvjz9EV9Zez5bRQ<3=#_)Ta^(+5rxoo5x2(&y8B%5<&4hfYecobex3!{aqRMXq5$u zK56Kdb|k8z;K$`6=0WOAx6yB3@XvZP23jX9G(;^wU$N`|Li}>N1n|v&r7f|BJ@`-k z#84p_+B4J)2b+rBMF!KM9YGQUU|1NrwAHGL*{aT3h!ox? zDVH$|g7uNZA;8n@yv!oL)v!pMi&tU$YF(s(pGb$_g1Et`#$$XR09$4|1Ruk3p8r_d z1m0<6z_&z#Z^e5a{U}#W?V@jm%(K zG|O{zU{V`ou+qR=$Z?qKL;$#%?Gf=jRNTN_n8@akc18JSb^Y_Ss?GG z2o@0Fea7S?5muMl#4ioN8^9R>$`7SS#9JjeWCvo&diuo`y8Z2uhz&) zoQnADqY8+}J7jd^;Q!O~*-?K~hIxMKrvA(?{N^?!J>r!)X+P4O3RFmcdA;yZ^~Vu5 z;~o95>6F0!pADGi40iJB%W)fj`!%%Gj^NGH~tQZ7A^y5dLWBi^Ji6pb3D|OJ)F|t{<`j6?DYI)p=_wLMm%0yMUR5F&^2xdzOme~C4!e{6*G*!ZWnT2) zyYS)Zmp>&G)q!jf398?f*akxxR{YKP@SAe@KnvG+BNTkoMo}RkgFHMKvh-@COR9ch zCLVs|kN@!?S?1R|9V-55`g3bh*LBEWx#!;y9dXB(9p#{}V7S0k<@eb)GBLGfj_S4g zfsmJ4NusD@Hh>PUk}sOHZ0H*o-REeP3e!V>Z#?I z9#<2h%T?W^Yd>@|y5Xa${9!KRhS609`ZDU>c1D49rv1-)@&9=yi;newrnTZh0N!H|C3+wEFFxwuk(E#b!%QyIJ1*>WS2-P z`fXG)cwDdZQ^~=8d#QRX%>BvngL|5nf)1nCypP&2EcYDzRu!1i8>lN^?&BlD4>%Ht zWLun?yB>$@t7(#FlZj1gw52-;Y&L8>avH`7YC=Mr2=CJum(> z><99h-I%l*C_2+XN?0N+pB)N%g2L%FXJTL`>Dn?6o+-<}VE5norK^6;A$2~F{W%yp z@wGR`Ks{7Odhp=_zDOm3`$vBcf=frO_Se`T{1mItOYc>es6D8^d0<*?$4HzGaWYAt zLBA{5D)7$HWwaG=s9c7lB=$kWTQNpIEr>5rQXcs`AQ}mX)FH(Wq?TA+qMvTIM7S?$ zk}tRq*BW+0v8WtA9 z(6Uht-5Fa3PNH8x!cQK}>f#V4SL6{b#jYZY;8AEn#2gt= zK=R?X8Dgpz4vI^(Qb9l-dnbIt*fL3rSgwLJGEsESqY+BnXJfe4x>v-@r5G0eM;5RM zNnofy946}DNt1D3we`yqAY9!`(q}yixAE>Ci5pWb4gru(%#tbC%J?@3fhQz722%={ z==q%D4&P{Bd`%_VL_^WsHfmT)gNr2O{tS)FBF`5Uc&>p1T+~p|c-qqZt4Mx2aO6oV zPv>(B84+*$acZdX^Jh0723QYq0QfLs_zx3+Q`b(IfAw`Fm8c;dY6B(hqcO7Iw-s6e z#Dl{RU|k&aMI_}OI?1vj)mOMqQhe1$FgC(CFRRXTz7c6yX*ZhgWq?O1sO*5jfm! z&%eu=7$J0QQVT7Fh+1NvN)aQ%4dKsr_$1kbZUYSo=+p#4!BhK=NOgIY0|vErN{Xfn zLP09k0>i@?$c4ZF`QS(U6VlmGOWc^lC0{U7UKA_HzYM>Ggh$Psb3M1u9zbKwZM7+1 ze-#z7uF37)-Yke@5vyC==L zRLfH!Y7LM!5RnPdeDo@B_sv9TG!>{=Gn`%MF|3sTq8JgD;((hV1{!-KrLyY)Gy!H^ zNVTRB!k-%w<=C`V@ZQlS10AjFlL*+*}Yj$Is*&x$fTG%5g(w_6^Nz_OYzhF|Qm z`S&~o(a)sv6a2t0Eou>8mKGJ$jYlTA*BSVO%|!f9_pPZtyOGhf?`bhdF&iR{`N26- zE#BSqj~s7+-*+9!>Vh7Sp%Eq`#*xoH(0W4x<}wbScH-(V14 z?`_Fb&ZXV=T*bF;wsTG_ajO@<=gD+^xX2`B*Zta-2hr6@%U!H|!9_Ai_Ith#^{rb^ zFEcBd#_?cMJ;IXWZvXV^x2VJrClOlX>$x=ZH;Z&C)J^`y7@o1deR8)Ba#I6%EP>(B zYx(4VPKIPbL<8PsTdj9RFQ>SaMjN*VIT#jK(Q!EBd}f6S`8^@s48-by2~c8{I}#&j?^Z4x^d2fJP;XPT7VYRdy?Gu=NA6{~>ZWmS zwX1Jm4dR)}r$x$SNxb``&i2#CrN8psL2r{WrUS`!;|I=yDNcZ`kZ+Q7joBd9ECj)g zFLIYWjgHRJwirWo4TF_ex<%)cf)~LAj`zLd=!yU#d%w9)C2jV-+&bH{r$CC}6TH1> zYZTg0{y1eKWn*k6Wt)upt8zy71gO+g#0lXe21=G%yB7`?&z)ba&z;hg*V=urwliTg zlyv}!!Tjj3$|KVB6_cAw6E`MI0>e)%Bo|r!mE;{5T+GZX9jd+Rh@{!>!yuyU8y;96 zrNS<6lJDgRkN5ZA3(!!M&+c&wU$^t?q;WFcdZeki95WOo3uE%-NzY096{kNga~;rS zsxF&h7w5oQinu$s9g)awU1l;_-?Cpu-l~ZEZ1!~$d&PnuP^&JsPDbBEchQj81rq9+ zv8K0*lEfX&Jmr%CK8>Wx!u7j0Vuv4vn0K~@6-a&CoHXu=VE3qVbgzfeed)4(OKiL6 zu~JNyn#C;B7dJcaEkE?yDRD)j8vyHa1{ZFB?x{8qAtlskYT&i=o z=gaU$^4!?xFy5S}-9((30(cum->c&{rMVLYlX{u4V@Tz^>we3_tD(40M#br;68yPb z^D)bG9QKRjw!#sQ$$kl?An)jjwzF0lQV1kTU-*JZTiBl)e)tohNiYE}wq}sUU1r8F zKjG=Y%y+9^cF1y_N~d8J#@hg<6tP_i7YY203IHgdk{b5$)zbUd6^W61v=k3=)>8MI z+a8-`FjMJsM*in^B|$w=;{6)u1~wW-{9KlTif7tOI|?|wcoKxFcR<4~SjnXz&4|D; z{f)l4#kF15XY8Qw?{=UT8^a3W58M&-r}!BpLlWQ%$Z#zU1U4H7`92Nea0K)nb*aaA zj+5<0l6u|CEcOR~QPJs;_yIWm%b3nnB4jR3;F}WBvhbjIUVU$|9jA`Ewc4_8q#YRo z$IjC9I%K+25+qIT#Oqxz&);+YUsftc?vJpY@;1wiP16@gzMxFxag&4SxumQoun0U> z5?F=zc9gM+RzEL`BM&ivU{f0az?j1XKuhcnF*!==QE^==8RrPpm` zA;HoVIBQ%{WXC)C6rPv9HcC54#)PuLa#LSO;$-vb~;@ckBg z_XECdz2#l-f#i=SSEv{r0*BVI%}=^lT@KiS8|*#=Nzx!Yfl22sOUQ|~aalHp$6<*n zT6|Gb0Dc3XLnZ6&gx%(xxBcxp`l2-koQvbxtC{s+fm-J#OFZBkgprgr-dB1(P@-XC zeZkQ~aX3!ri1g)KL1f(%!~b1BA*}Q#h6K`dGh7;QswKfWPl0wSa)-nDFTc%; zI`BzsC$~jhB^JSAGW`6?cBvGO&Uvx?!eZFZHu-?Q$PpALcQb6WVy%-2rzHIcGaU^U z4ImNA6?XC19GXj^GZpp-7?!+)uYwX4W_&U=9#Qm?ASW6opbhhO$l)7#XD4C~QGScN z`k~2$3>`i{3UEH$u>o}v!Gkb~c`w+?_o-IAyXKs|iv2=BBTtMv;C=H2F(M%5RaAp*rgM>J00x6 zSoi8Xk;_Vt)8HvUN|Ps+GL(`#I6Dr~-z|>Or-0Z(lmpvDugN8t!NK8EpRut&OD-4h z3l7~}!5?+d8Bq=DJ?aP8iRN;IOgzWbdCkauUTXiaUjQ@;$yt2f%?51~s26N6FhBV~ zKtq|$#l*^Y`=N;O?u(`CBMLVARQRp$K>|iQKoM#zxIK zA!_#np$3@)<%%kn8vh;3%W(wEI;5Z$!woNyhl6Udt@3T-a=KaCYOw{fl%m{!ANhDJ zbBfO&iPk;iJb4O2Xee%4C1{3z2HFaC4*#d-jSwa@e$u+w12{0wzX3L=A=SXvm}4sV z9$clRMukIvMU|e?M9eVXnezfXlpUvQ6fI?^qE8K}f}sgo%p6Khio2TLcq+I?(IYaH zyT8bpKzIjr<8)2|RDhuFBQ(?2hmgbko3dE--cn~-ir1n7KmCc()jt@sj z3LZF0KI(ePP|~M*-U>SoQ`hZ?$E2uBzLvH`7XuPyGoXwzu_`wzk)6qR9t3}xA;V-M zbF!Ol@xoWRh$*>W35SDCxPv8-$6lmfOf~yi$}@wj&FKcF z)jPZoydr5ceD+892-jWq=%Sq5w4_h+m%-GCjMi}bWw&I_O}EW$f-|e5pVY10CtlyJ zR{|Yx*3B2T>{iRykWrinTTOW(?Z#ivY9oA3bsvI%akNuaceek;9QEfMj&@L?cf7jroafxhO+#EUC+_f^$@>siW~lKkCL0;>MExNps*=JRM$#3b z{E8e!)e#U85ix;9yhhxLD;D8?s;I6J%R;Opr$UKRCsSm3B}gqIXRa(_Cw;!3c0P4@ z!((=@W_osIwz<`Az-#K+V4ASC)%G^Oa5a$T+^?BmJ}lo}ydkKx-I%dqYlK-ZKkt#J zuK($A|I_W6v2}%K?jSxA?5Vc)byafqc(W>jd-UK&7Hsb1n~S@c1e)}zt0n`}_Gxz_ z&s-x@xQfdlUUIa|synRY^f6>}Op{?xwl_S!lS&+x!NMj_VU}lFnK8z0!Azk)&B{N> z{IqmSo^i9*^M(|wyNGn(`RKsW>0tVOwqz1wn83Wn{i+9ME!Jks!&y}-ouS8#&pV7e z&ubd%XkrYCKRt>hAa_?0HPe+>p(#<8b}v6YTZp{Qulbs=Gl7xQXmv93(d~0A^|h09-9n%N1LR52r5u1}3U5f-L{cWFs+-pg(_kk^O8 zV{IN$)G3-tm{48l%87+VNzngU_I2eRpbpahdGsz;=jwRr2jYauBAdRa8bs~c`BV;D z;(O+eftGC63{Fcp_%8>Z{4xFk>A-XmJ}IK<%v{I z@d#j%NA0uf&LOebxu<;EC2opW6(KGKa|79txrX@;a$qW|)o%p!4iQ@^FRHP60 zG(GB`=o%H_9eKTeOv(aPWe>C#6!JOr{aO*FRfO8(J&ePshXT&uf>w^*tz|Ht6kd@z zCVz*`go;Q`J6ee8YZqyl`+jwE;rD8sZFgyM0T?_2~Dk-9+ME?iJ~qFH)pyy|t5lY9t?Xi zmBi!e?&)?YA;NTtSEq3eKG@2GnM@a?G7p zsAZd>{n?@LbEY0D0_wD_tQTu0Gn?_F?Q{hwu1Fn+7XfCUkBzF*w+9{_yx$HXgMK*T z(d`xr{aLP09L5^%tTA`>7d-&fo2wE-rhziEcw0kr=^={k*!Hl zb6Aq;HRuRgwN}eS&~Fo~PK$unhF9<~#V@y`W5hlmfTKHo`|jKSxR4*6cqzSpkoBY8 zcZOtd_rbzx0XWWPN37-=QyNjs{xzr)K zsRYD0w*FoCB-Ma5NjQ?g5KKIS4OTg&h|RuHK2V0ZyzV8una2xZmF2pBC=DM`H;6aC z3rP+ANwg5-Uh0Nf;6Ozl?3-)B#2f@d;7)T_g_lZSEuPwO)a(!Q`q7mTY6d|=TJ z=EzwigzsUROvW^VTgSrn1(#<1x;+eAOHdC#Mu)R#6kZ!8XK0Srd|T%@lk#zJNYp;* zja;|$`-u0hG$$$(ozW&T6jFxgtiO>;D{t#7RQfM-(NjO$49|Tc{l=?XfcQnNW2Zna z!)ZXfssCP<##qbYy7%OdQzWE3R#(^sw^SB%sO+S^C0G3?P9dV~>^TaDzF6L;XLSTl z(-G4qCJ8nQ>~z39h(PAIbP`-Qmrdlz@4pwVwF6vv1tS|ncU+(R@Y&X`s zyIu(7HQl-ra4<5|j5XbR&{S}+WJ`3371ADXlg@?4KPSIqn$nVI0~G}3QK{M0JK=&0 z3FMg#`|APunr5>UCZe(a;`d!CazC{1rUfs4t%^0967uy`Y9O!Lm6dNl_hfEho!;OL zLz-@!=7wI=GsvN|`0Gfb5YY&cGss6i9arbfj=P5oVZoQ$|>Kq)mL2uAWwtO7Lylhu@4hm<7)VMpbSITX$ zvLlQ5*r@-=eG`Vd_N89cX|J{6O3W=;IFwi}@oW8AzhHM_X67Aulptoj&9_~E6n9Qy zUgQyrE7yhAt>2M|+Q@bg5P4(@+`(Q868sVajSkTX zG?DLgZcH^^p7ml}(=kqSb{Uu`cSU7hEW#q-hRLM4>>6tA@sG6gFhAr>*o%!jM0Gt7 zq;PordB1nG13PooC%dTX`yOUK>UD{NmaETP-tca+$oTuY9Q0hKwWLEUUXzRBetR6` zMQc~v_wF*RA>^#AwYp=e89jM?k88&-%xis44&su#8Oxk6Cxd^kZlYXX!zA2i{YIc~ zoEwaCN`zcCY$27fF3CK98jFck0=9ua<_Mb=Qv`Y)9Td3Qz|Ru&7hgt$-2x5KR>OE% z)7ks()wycRs=J=qnN*D~T@Gq?;y~cA0>W~b z(P!q(vTkz>-q72@qr?v73LKN+QmF~ZqQ~TX?CDFEH^F@-Rm~mj#yoRu5 zyYDg6BzYq>_5OFQtM11ocAZ@UU8uL%AKZ;CK^<~LHI;J8KVY#;flqPDY{@*}GnHN@ zPJwn_`i~Bs+PBf!o6VR-Zj@HvC%Y|po-$9qcnRKCwUExF2sH@CU8yET=5Xz^un4n5 zh>X{4D=Ut_@2!PeD#AvSV^l1S;9IvH?@bO!L8bg#`oauIq1W9<3tFy|;)u4|K*&=K z_6LkumqI&h2s^}yiud74XWfP9i(vSZc~m%s?b%1aS%yaueOF^1m3&r1F!^ypAS2b%@GCX&j<3G+O>hT7nl;j)&B7+5a`x`|X)TQ_^7zVf>i%*wtCSp>M- zsCCf`O|FnZOa_v7^lruNaWJ@N?@53A%{DO?<8?DYj*U4@Ek@=k9!B zxA2?bd2K;?wUToD$mC9(zI(i-nQJ8+mNU%t=$@MWoRh)l#3l5dA4KE=0JpC`RzPSL zK^Smp9u3W$KD|*w@q-_nb1P4b3c<-KtyL}Pe-Z4(K<-~O$g+?gPb_6`$_lYf@@R`^ z#IRvEXG8u;8VN8Vz60s7cJH3NPbVwYg7(y*y2?LLtZz=$DEr9w9^bpSrDs!S_pwNW zL_(8h#i^Bk`B~aptzlnpjC}p~t9MoSCEvi{9?f$No1Gs02~1ib63 zl6h(di#_ArSn!Hwjr{t_WB*>5q0L*eU={M^o!R%S*mu=G{1{j{S)$`s;!+Jt<%=|{ z0u!4XTO`vKL*%*_$Vq#UWpC(B-%U7e3XxVpr6zm9?hngdD$I0zqfJeUV$wa$SmV83 zK5^T-$c`;mHaz4<^Xyy6tg{TE+tLfiq1B69HKybDKr%WeHBFOdtc)Os%h)_=-)>hh zyraM}UiTEUG?6EF4V#k0&>g2nE%0k<+dx|+akSs&mxS52JF_|2m1|=HD(woNgZ;)M zUednjTtq>H84>AohyB-JNR@nx$K*8t%IF{K5v*g}kA1W3-F0>+og>pLbQ7mApA zO!t#0xAe57%j(UnGE;^4M~uyCY@_eoLg6}on6tqvgmMC17RQs_SOhh9q{spg!fzk8 zYMn0Am-n5pR(`c>?U>@P_+eJE&=8YpRx2>iycw~iKa|4`NkLhpOIz>F)|@)MkJLUQ zakZ+L7mi(;o)E773+2tuOWc}ud^6eg?Y>1}wQk`!l|!%o{JZ|jeQfy2WCd(SgJ!W{}|`jo3+ zx+uuRU_T?cZOf zEEv-@x%D+tWq_u`i#=11t@lCAIx~@$E8lk&=Pe+MYT6mroYyMBavy8*IqH@?en6c3 zbzfRYZdm`Wo8VAc_CxhV@^6@9%Q&IRP05QneHTy_GEf!uO)oDQ{3&sS91QweL&q!_ z58;v^g=cWKU(d$&3p6U1+)xm)?#qUwullwM(8uAVHr2I_5;+K~k7QMJOdR;?c^Q@0 z@q?8JYj!tKzU)ofSk9fYUXB)tIW}CIwSOA-NC121V{=^=-dguZ=k?iDVW;8^ZqEoy zIpf$&woG#ccyTQ8{&Er!%p#`5Ad11oT#FS!Y1wMcBh|6bKhl!L7xb+uFkK_*3}=il>*Z@jaPnD31L;R;h}E|-R^E+C224>ZQXo5;A1 z{!PsZ>=~GY85_u7DQBO{*@vL(^sae)sLg(ujudd{($bR$ba5L@2l`p->R|KvDTO@D zPJH!4xE=1Q;~7k8d7FRA?b2=z1i09rWL#P?bw}eIT&c1h1P#^R{xbSG7Lh&{ibgkX zlsSB+9yfQN)E%*2VGr6kkEpy-9CN~qTax&rA~3FhiF5f%o+ku9=E=Vw9wSN8=92Yh zN1^m7u@x=4p3*zx0`v}Yr7rCmr-ILy-=L1FG>z@fDSZC&!Z1M)D^c45NJn=}%(vS| z_FJ6@tBY?s1zDUv!{;;aO_mIm8g;9CC1)PYE^sa6%#L?fin+=2_*}aUF?@7r1_rH^ zz0ULXS6hRh+Si)09+6~JO#F1Fo@)+Ouc(YH@LUClm5MlgBSy3dCMOll@JR);rD`v| zSIxnszvBB@zUD3X+`*LIaKHTAdsyybnfg!@s!fXUPRP(q2N=d)%nG$=oRDnn16Nw^ z!JC^-E`BN6vZ(rR^BC6}3-o#AM-x);?jOw|NguiJm}c#B0XPI!0x4JtRtS~s2V^ww z!5OEK(=LIR#a5$S>QRdYIa6Obbx+AtABWx2Gw5|!@sB4m?7rz=%PLXMWX9f=j&Uy1 z`!)HDPkbqJKjc0i#_^U(b+Hu^uue!?fs>-+Zi`op4B`=0p(P#Ac5DnIm>TmC=xuCBHZV3uDR+z0fXg-R=9bK|xr(=H0l8JJ%;1XA~8f=el6ajHN^K1Lb)+h_IV%~u;X_mh@=SEn` zLwS>Cc;1rkS7z#t$3#$PY1U@QeNp-Fi$C)Qg%)pB_&nw-Jt4#S4Ub77x0Gj6o5#h+7!yr^VzUAtc(Lvvscz_+GT4>0la zw#smk|Hs-}hDG)MQNJ4)8e|xelny}}r9-+!Lg_{Xqyz*Bg`qnol`c_`ZfWV3R63=* zLEyRP_rIQVuJiu97Gd|k_xi5&SufaIWTZAKiocJo8N;b=*MwtuSlQm>!;r4K_Z1O` zxlf6S1J_#HB!NEQi0#J|Z~h8$L_=uoHRMMj@B&4FcPAVFzb%nYRA>1Wu?o&vBLfr* zQ~at`nHA5vC(v3FN<||_E(!=N)km?;1~j|$Pv7{bt)IKAcZh{FIO18M6^5> z)@GM`X2T8&!#wox1WAQs4TkGWnO8M-#R#hNNHq&^k>`yY@BB$0+kAxdhDmj#Om!C# z|2Fj?F)E285!jf{pdSy!ZZvCk7ad3F%M3=Ch$7MjymO^_CQJoqH&L$sY1{Cj{M*|1U1wHW#lcX$!23J@+Bw8H|6L^>IXWqzw!SPxcgXFe= z$F+nIO?@Gs{#1qvJ;qM)LMvSi{S|22ZK>nH8`EFqfAtxri$TBGTf-C17Ogm3ss~N^ zu33WU0LQKmOr=&@b2*UASa)ht9FG%uB?b($kC%S4BHbc3-P2ei zI)qU7vh}d=`t<&OT@?5F8id(h**j>0!;UQ5w7ZfGFfj1!pDyRaR#iiB4n0 zYjd%E30)*^Xk54TM8Fzx-|#01n~8Qp!I{!H+fVC$FIWS6x3PI}e+V9W9=tvX`f4ya zG4>H_CqKgk1c<`3n?44i{>;y8v55jfM~%b@yee{sJJRm4?&ypf@1En- zb+~nlnKYO`@~!68dW8u2EzJPdE86f|K_73FUwL8;TVmh0iR(j;H!O{Mmqf{ZBVCO{ zXFs(}KX8btOPM2$sM|-1uPFbIT=i-(ipF56UnHU^yUHI|V!`;(gXK`EpDBeqh5{#+ zpL276kw^XaX32h#Ueu3Mi731+fG(!7bji;P06Pd+5(qO5RxK&EtP9%o8H zzt98%u<8@l<{~i{>^IYr^*CcXH+Jq}#(!RM(28%WQC@8S@h&^qR}>8cuKU&5WXk-j z9hHewO--|t?YrwWz}A1Q(LHBSSH6|Z8s*}!^>mEOnO~$^=@@yh={T+?1QTM7- zs!pNHrG)WL|At`3){>wZY;Om5DY^K{DdG&c{H7}1!Y$Iz+aIXSx{$0Ly&k$VYVv(^ z!>|F(sb65)PRls9$ZU=Gqs`3sBr}RLJ3PW&50<$P7oTO;mlav)dU3BW^F3x{8MUEHBg~qi0RgJ);L@KxYB!9LVyy~wYs4>|u2 zyrV1mJKQhsi#kTpbLEl4sR=9|=AkyRc;391w-EwYa{?n$&~`oBslA+-@=W{_yn*s* z#ZDo52rga9g-rGdxI6aKlNLyr2I+w)%PAZK-=7{Y1bg*$8b-V9Vl1c`s4&A|zePP$ z@&2f95C4gV&NG;l3`{2Hux(?G86gB$EUS`l9LE1=i+W;T^nd5BR?}$O59H?fY$JCE zT9q>cb#Gtg*p!wmdKARc&sxSB>7YTW1C2I`aHnbUxI?#MCtOIkZ1l|ODLZ<-JRIs0 zdBFE`fN1k|Bhu|xrT}(}z{2ii!);3@98#g~frB>yJ61aAgz2b?W<5EAtciMpiP6bV z#QyI^i6-Sl<9)u!oX=g|1aK^5eI{7%;gB(;%~uYQaIh!ZJ^?R|m;O-cx5l;dHF0aQ ze<`?Vr4MP&Bqked^$ra_Y~6=02&5^?KC)nbi|STrJbnY(lb^#7jxo)|JX40$s6nqT}4ygnazR}r}L=beITS|dP1<&>v~;tLZ9J=oy)Pd>Aw z51Z%1On-YM;{Wf-p^O#XQv1VPq{+6&0M~b?{w8W?3Y$*yAhP^2%`>XJzt~nuF~at8 zsPuLqm#{6aWYM^DcD!UutPd;#5_z}(xgKYJ54z8;kr;PaDaKt^ zf01K1-<*{6T{|^9G@eXYIyj*Wtq(!UL#ut$Tns9YE_0i{v7$Y@ovFGaauJ zeEUTdV6Q%6vM(ng!0Ya_sE;67lBL)rX??%V99H{s``u?8OzlfF>~{~*IMyE0f(>C} zAqJmX^!*i?6rPt#@^@ z_wsP8nRTrKIs=_a#*P5` z&FZ13I~5cGlz>|r?X33a9Blk_rPtRjvrz<7$2MAG{a$K# z+v!}LyuGLy&dOTEqe0dT>g9?RK%EfL!s!+nxs*GoshWqv3h?OGAPp zWnL~%X0E?xe>`z#?I}|CCzbDd8_11q655ovQo4{5Se)^`^`bpP$1QRoA z6Mzq!0hVX;g4@=`2V_?sI{aY_$G7I1Cut0v$2`&yYko-F%k9ZOB=QxWN3Zv^lD!$(W`TinMS390`J+j0cM z(@~rjFhr6_prGw?8k+8PF+?{_C~E;@y-VB|x_4XTALQeR%&mc#0T}GV2`06-m+hyY zbDdxQ(7;7rRXNs+!OpHgzMy_4I0biV#5s>2jeNqbGjcyrpk}DnkN{Zr-<1m7fIz2- zG;iA@MHBN=$-e_Pu|wsfYN97k=hARFcsd`g&9uEnWghm{p4?ufruiU{Vh0RyKF6)K z!#8W`UJkr8^{>=8VfjGP{IVk<$Es}iy2d3{R$V_pyaVA{lb17FRkS0P;nJ!XU97Y} z-Sr8PHP&9;rPt?~U%EaBg0(s%TPO$UCc+W~G(RywOABt)E)g?Gp&&%A5E!316I6b` z?!Y+ZnRj1~yz+$FG*3l46!kulD(GROK|SF`=cUr1mfPeWH+Wm`Y}|^WZCbNGKiVNK z7IJ%zo_Xh$=x@fha5fGp^^xCyNuYn1{Y2=Mbxe ziX3(7pZUL+w5E`CE+Hop2-LR*C*5vkJtuk>q`sUQiM;py8$m;;>ynWms;N-}iTKWn z(;HZrXnt(EEi7)bzi%`u!}w3H6eZL4Rgt|Wrc|;<^-J~CcgcHTs^S;PKqPr;^2paz zU98JN5HilSWYE5hR`0NQeh8z*phdH!W+^}f8yb|j+MW~Nb&4KwBPBfid|53F?G79{ z{5cg8hN5B%tP-Kq-KMRR-Ys}bfqgK}hT|pjrL^&5c0_U0<>uFdSGawOTIY%a?%th$ zxPEN&9UR)kNx2=Q$DX(ldIk`D`@(uerwmVY7wt7h569e%oh!q_`)T@|h$otKq{Vul z6|J^O) z-72J;kq&)-v}7d>z198^QD&!iXU}u;N0{{P8rqu%DKm{!k^DIXBt1uoJ`>X*cu3XY zhzpHaPA#B3Ih?PA9T0TPgP+Ep=s(l>jKQNk?R$BY`nCDs=Or&b9d66^g7DEd;utjc zC;Aqx632b_t_9F3u|eaU)gHhCT&M1hx5_9)SB9JRH1dkOjhytVB5{(dWND(&vovVB zprMfc9G(?v^Dt;#J>dQ%ye}k^pH{3Wr__6jk09W%l<(oxZHiysuOiHOSL5*3F(qRc zy(G%~2)!4MmaA%GC%Z|o-*eNou$H|B8Iq>+1~%uMesm#J$_ST^MB2Iv#IZkw3Fgdm zKv~p@_?WvwXZ#=apyHp?ri0C5QE)#aCFIYk;_uCEIn}8$Py<73(r8I4Siy}-Fdip5 zJ4DOSd8E5Hyg%LUNF+A#P%$j|S=^x_w4Lmx@!h*C)QU(nsf=$s*-Y+zZJ@-^QP0np zse#kvY?N+8_8=$iwYQYDd~;T(w!ic4)@bO<_eXmR0MTU7mfKkfm-#p7@^b`qaQVI` ze-7VDC@VUniy=hWdD%|#P4?WoMDcLR<+vGS+QN7-LdlR)d>O`DTt$9H>|BF#cf-G$ zzA;QL6T)jPIKOTs@_usw|NU-C^7seZW{sQpg^-WIzh{S(wmr8Wf~o6`?=y0-8&kQi zix6Q(!z$6*9CB%gm9H zA=OiO;;O*M;8^K`;nJ;ni}0cOp|jSpRR${eR|5ab6V&~5PH>08n}ev6{D{^}7`NDI zXiC*fq`GiU%tNvC%--43tH_0itD(9%R(O*$qib)aoLrD`@4x z+i+CW;=_#Gr&ZqPKWP)a;;C}yx510EV_mxVSjpMs$uQPif2#!-l8g;R^F~INmzdzS zijV7k#)hE1)C`)UA%(8t$+=N~39p+$r3^}obea1lb6L%)j`ySuV|$AH-MQUtqlC#= z=v9)H(!-c_#I3h~t*OU}Pzp@#vJDgtzj#}Z>V&8b&Avm~aC*MyPCWTo1@jHXC85khM^~(SZ`zZqno}R>l3}3${ z?gPFVwq>ay-#GfApr`)JA0*v+o(!9?T6r)OD^#~P#)k7Y7IPNoNWA1o@ss^lu^0H6 z)i$8s#M|F3RIU;{Bg?Z}EM7$&F&MuzpLw)3hi?bHm%wDmuF*rK| zVdzSx(5w5HHZlGyjZI2fUff+F#4=J|)p5nPLP0mCnPY1o1v^?!j6b-)IHv#L-;n=> z*k34JVn57|@eW|OVo&UbCr{3tz~7P+a6c3d8y`atxBucDS-udq$7+1CDlIFai*~*6 zmu<;=*h3GoTZ5l7=+jl%?kZ`uPg}&3X{5)$e5YDNirzeW#=rZHZKq795ZP$uVEYKx zJDx)Rd==^M9N(owp|Q~Pc*52x&=eDesJINhP+}891Wyl4@^^s5 zJ_no!CP}4nUbMIVF+w3oH>Pf?Z_}NIMuh&7=2|Lc(ku{Jy?i~QV{7e|zFHe(#mFm) zlQ_?INqRVOJR6IP)Qv)rJ}MO9iGV7d+yuq$qMNFlDeAHd(&?zy8r15eVjUxptFx*K zG*!=W4;_Amv2PBS3}9KzORJsN=_L8sekd<~XCNvQ9$_-qc^;X7IO<>{3 zDtl_G`3A*Dj(2|ga|z4slfJ(GOea(oowYA{=O#ZvV>C!fIK8f}X`V7g%|q-jFJL?k;Ku=7Kbqor6bWFq8#InAo#VDQ3w%rq1PsYUx!5V?zX z*eVyE>R@A8?at_~_%^fNECU4yD|ql}ih`ktKr1-RbOIF`T_G7>>PK=AQZh8*YvqaN zC&$mahCDaAO8IYt;vSRg(vYw*Q=`Y`J@;pLK#t3P=x?b?3O1yeoUW(JlyT39%p@$`?WwK{KJKPqc zi9JfwxgPQ8WQOQgc2X3IKY8cVf(yMfAh&Oy#bfXgv2MJW_@ZA&01|5fJCJZz`ZiI! z4D2ITI(9!{t1{sjJ>)O_lODIq3X~Kmx(}D(VB(E?%o?U)m_Cd>l5Mm_U-&!V^HR_~c*Eg@Tw6YHG@d}Yg7$;Iu|HTC9%ld{G@0qm1tPI3{Ex0ce&kT;{b_eW zITb~@h!o5I$hl~!RJA9ro1U();mi4TwB?-uhE@IGqo7r&;7eI}gTLB6FVrN|F5&$6RzFW!n02_WL_$-8+z?1i>DLoEle(+Mn#L ziWEQ~5A4Hl)rt(loOBU% zg$VyFoGp$)GhwL7k>b^7j7)mM!P1#5W@s?0Nu=mb_lE#oaGOwTW0NUl4xqJoZZdN# z&_jkBe1fxrd@Ym!m9jRO))y53!M-h%C89h*vX=d zW|3By%tz*TKOVz0RYQp54d25~!6gmACIXIC$vd&UFQ0Yu;vw8+k~W92Mm0FXOD2-P+BdVRGG50*A!;!J6ND z7l}i6I2yE7)xMou>$nn$ojA$2YoUn?$^Q8IQ&3 z^Z5JFXgR9{UmyELJEg@2fxeMF2{8SpA32vz9)`?>YOX<*A*o2nLnbIDt>`+rk!Sh@ z82zBid(ZN>)b*#L51D^l22x>(XLQ?;$72k)3A@Y3vM7g1v6LXM41+%O*CqoC+OFOW z_Rt*$lF=Bz0i=rn*WjIFFL|Lh77`u~Y*X@Aj|tTcTQMSDgp+=PVCE^q`w$%rrnd9# zGYLA+yb?0BJ=c%N{5mx4u6mUyr8)g)ff`oR?HGPnRw)i+EKfqelt2}sa#p>hpKi6w zu{^ilBryt`dImfEy4r|B`GLm8krz770sqXD&P2}&Leexa%DPm#U&;1V#qjkcb}Rf? zR}D8C!WPSzvTa@dtC@(Z%gO7X%16^@8NLrV ze)pz2;lKj47lq%6W1XY|uhysNQM(~-H(^O-;P(fMy{xC-u&sVu;ExmGbomtXc+?vK zk#hQB6fRrfrkrp~6tugPYeWn<+bw=x532sJWxTp>YVUkGn!DU3_32+yJb_R3V8W;+ zP=zA;npFEuOriks<=0h4toAXv+-iIP$8y&jz>E^bGk3@u!7TU87$h-C(SSDkmkhO- z3xnoBF~rk#n1#cMB~|gluv#bg*$5Pc zS@xZE0U^b*a7_t~uj|JnoFX5Cn@x7X*|($U<91@;#5_>{hjo$r1BnRD3rYfCr_3~> z88m_pn``2G9$HNPBWs8o(EBNP-0X96l;MSP36#0h9>xS8gK)azfPpv}K1wnl@ook! z;M(U;t&vHqDE<*W>c&)f_C}}{OIFV z%!L#2!)`_u8szOJRns&ofBT^O_Wlrg(a<|U6+9~j#dKML5BhGg?@bmAU00QSu%BA1 z?q@?AhJ%BxyGOm}u3*!>x_x-svg=yn^_0Z+DHsm~Fq?_KUVP2$GUfa?#p={;%I3?Q zPV?pXVO=DBvT7wfC(9T2KXjV(zTla_(1jU#37bD zG0j1U!m-53*JlZPtXW)igd~CcXqFrAcf+x>irG7~e40)s3`D03xTdIU7oXf5M3XHu zH&LCM$TeCW%@}T>02X`2?;342ln>dbZb8$){JQv--q6FH)ruKpU8l{LG;Qg}OXo$W zD4O6Ih#qFXYbRESua$@{-pjZ-{*p9=Dg(pS+F!xZutUuk*k9Arp0!Q?%vnqZf4L;U z_g_YEuhkluCgXOw&nE(;eN!U}pWWay@-cnv2RM~_H@Dy{zWY|o<-F49@-3sZ!uDdo zXWYpB;oz3%835?5B|`2z4_hsB%B@nJIt|mCxJw-|thttC5nenke@G9W>@3iqN01O+ zMY}WiVNUOyJxo=%h_845ePYEsVs^`mvpHl1CiazE>0r2-Cy_%!?eP0#EcEL6(im&r z^^?EX&9_(0S|=!)$K%5~65cM)ensuvfkzMv5?nk`H`>WrX$dFvM6!+pqpN6PKymn1=yji^@sA%uthv zSa#H%;6-Iu+DdXDxxee2^h1?7S!D1?<3W3W#ak0VT{j6Qlfv#;&{ve`GD`-HW-+$NCxM_)-DwNi@M6kP+0#5bcPF!`d9 zBSMb8766Hz6WDV30Aj5iZ2?}WTYKnv79Byd43T)HyYS|G_BNRMckK9pNd55~7&DUj zx_uFy{rWP5@^{ohX=(F0QJ!;`=v*0V90rkCY3Wrp{3TYz8D~%E(Ru`y!+QZmCTWkM z>*HRXrgB4UgK;&ZlSv!Gx74b$*N!OG;feXd*!dD!^KZRL*0@ZZyqqYJZ!de?jGnz$ zRXDj>@F(K3f4g1QrFL)rEkt)|>kNjb{ z2L#LH{?F#)7W=B!KE-)4Jp|K?y{&Eh5VWmUUWtkskd6CCmy2Qq-TTw3KlVV+>RPf? zvn5NYanm4P`3bX>{03ujjv@Gkt94rF*HQ1d@T8@9PJYy4(R2G78TkM$K63l|_{nuh z8+Gn5>pEzJt-C)Y{mPQ^(Txnt40uU!87oY#VyZ{)w_Qe;9dtdpar$;6hS9lpPsdOr zst)j&!@5RXQ!}>Re0H_GK&L%esRg5lid+?YI}~{~e`GeYU;KSFyXT!3mG!6+jbZNt z*}pE~K)spK_pK+40eyjYq@cE0TG+ym`D=%ZqJeHqXN~F05;2}PxBO^u(p?3J!BO@r zF68dOiH4+ueCeQcImv70@0~}V1kpjuaZU_r8-AumUmG*WD}2IdY!=1*YT_qjBS_aA z%IAOIhYgrU%(x`i4MI!r;}tlczeP`@-yd-Fu80X(S43fz6NF;tN!lVYMR0Inaumb3 zx~ymf@bfK zN(uOi($bEm27~Wc&4r#O*B76N-%Xub0o2aJG2S9MRpAy)>xJNZO8a8lW<=~tD*R)g zvvnN15Sa~1p$DcME@_%Y9BLopc&G!RF&y;aXDRTJZno^9r>{TF(SZs*5v;OT8&r-` z&=RE-RKN85n&%-}L6(n3`X-SS#PF+@1w!+{YS7qpP_?muA>aFw+Zt}8aMir}hKvM4 z_A_~sOBFZIvJOr?91tt@@h@5qz*nFYbP249F1YoZAg`Rx@bL1EMYL1^`3U>VD?0Q{ zBD$*;Vup_JEPLv%0#ilsm3Ha7R`Be=d;c{XLFOMgG^*AkST8wG$oLg>EGTCcng(Fm z7_l~-3h}aQAE8j85|a}Y=iA9nVe)?y+lr+Bcv=Hs zXu6=vsgnURN5&-suTI6%Zde=M9`?@Gl!&S+94)ip?PJ)}_e$92xV1rdNK<;ib~E#B zR$?s!HC&wEN)RjDc5)5B; zz*mgVo(@e8F%pKGu*YlD-CGjK&%O{XYc*GeWrLfz1IBK(t70 z(KC0_x<24xzA-tXi`&8ZF^u%A#$(!yh=|dE{-<^C%pAk$94dE!+;-~OU zf`CEF_RDyPB4V53Oqwn1%pV77leU6e*EQWs?lKs1WE&1{84B+GjV~DzFR-&t#VT*JAH&5=Hty8}o$+%Rmn=@NqE(@adTDjk*ToI)1sV==5nEZ56=YdXQO zi?Q2|qFLk_mNwzR#Hm=+^!uZMaLv~~jBp-~H1$PFVxq~q>tg@HA3@3XcGe{5nHE~l zMR+>Ckn3`y6^KKWMyl`OXf6GOl6cP)LJ`J+q#~SqP?C!-Y#0Igce=J`5J zrhnv!JD_i~RSI_HO-Mc72X{9EyD~X?_JB{duT-F!A0ia8n_05u#B|}8M1qth{t`V8 zc}rQ1Wcw;~tjOh|vH1fieMQA5Dtib>G+A`EOIH8BgJoRcFh1@^csg62 zOnQh8%g#XI9-0!T;Xgzu5RkV#EQLeHEhzgu$#GAH(BcG$FXcHboRJQ!=wa zIC35>s|tQB4GN?G<==jE?EL7WslIZj#Mi69ioFunQk!3}RN=Ju&SK*F;;B(Ag!=0C z8j6>GtNI-~CZdi7TFHX5=g?iIU0y}mjmd|M(xESSe0#z^C%g{ja^^pppocP_9P90< zH8H43SBmxc3c#S3$!@YtJ^bZycH0V2Wks2!LV#6Rzw4kH5%MA|;Enx&76-{^{LO9q zR@M6o`@tP00f@~*2;SXvM1`-cQ5JG`@x3w1H*;B-v@kn&SwEnhVB%EdkuTcvdnYdG zj5Yu*22A;^APeABwqG&x?Dofj0@a+%*J%)2mm@0NJ3rzwU0jSdGtHQh%nyO}n^X*a z^VOS38E7Ur6@4fud(5%6$&gVR;zt`c77<75@H0=FTs!q~x_Hx3N81(*&w9h=9V(2K zX92`G*AW53PYV=6KF50^u!RbV)eE}sC&J(#&R9Kgvtm4=wh^6mo73(g`@L85w>Mw+ zbhSx*olM1E`&_VH630bY7X!NWsxW27rN55e5Ev9iq<9A1k=hh#kS&%9Vf4E!YRckP zc!EA8Mv%aTp6RIh=~8PZ`Y49zrS7p)iN7>7)!w*OVJ0pbCHbzTyX67k5Bt(U!fdWW zYO`<>GmOJvouqqT35j`jx)7FQ)-Fu?igcG1M=?A6Xmt21xG+|MT*gD379VLAf+J{O zzBH~Ux3=?rAcVBz4eGf`Zc>=v7aCVWf{Uj-a~(gv_G;{%A5S$5nMyYe=L|$EEQt~H z1>2SG%v*`iJk)(U57H_TFRveTb6)&y*sPVl1B%1Jn<0qPN`-=)#8vJ!^O&@SS=!7b z7Gkn1)19`u$N>d=qOha%1+?iFLuiXdaz=2nb}O_4_~yM78eK{Ke=i(K0vQ4a{cH^l zOCNn<+?7D2_c``4lCYaAe5A@04`qu%{-naF6HY_ll<-bcSkc+0???t0Hmj^Y;{HQHfW!8vY?kc-Hw7J?ZL? zt(_mu-z%iC-R}E&xGB~Py`wIXkEv?|5?N>UQGrXu>;)4wDmLW4p3DVa1R_1;^rGB#D{--LP>+?XMe2VQV@k7W zU~G&7wMP6J@4y(pcnjBZ*$e~1CyhX&!mo|t*nNL{1`OklD}Ol(YjalzS!%W}>-ah* z2#exf2DbE{brMn+a7PAydusj=k!L;(Ue~)a%TxhH2Gl7dg}~UJ?Mt1qj75*NmJB$Q zmnG*kd3)pjc`vutetSYeEfx83D z=B+Va2J)C1t<6=A99*m2NLx>Nu*K^`Sj1b#;>00bM3OD0V_d#cuohu4ZsqX8=S8Gh z&W`CRP2#kD!(5hhs__wJUD9y?;DGM8JDb^qRe@EYN zYGB}W9nKtu%-rFdsfcR&B?sv%${s(F*IbDOcLlcmx#qdT50Rkz_XDBIbyf5+Csv7F ze$uBTTs7);A}QEk7z6PMsI2HK^uNnK*U6mNWXNWCgW^#c z@c{S?m01W>9d;CZ1k-P(5vXz|N5i3Wh)+5ogSA*C#z~BNzKO7BKD6#k!=yWn%DoFh zQt9#l?!`INoGW)mn|QzqgIMvMrGEh3m4BupmzO3+A9upq1wvo3Q00%XL3UzD%jI{8 zuzXYot4L#ucvY(7L8BQ*Ll6fP`^>vg4ZFr;3q=SC5WTcucIJY4to*;Wpvn3WJ|%?dXx&(;`sYZtC3YoH7MFdq_h#E z?}tIMnkM*XRHM-N=!G7fcO6)xGn>n31{iQ_eLjdHit2fkagcfKuA6fW^@7D}J-Jx+ z=6~t1-2-qMCDT~Pi8$Vt9clax_sS%NG zbn!HU+tk}7Sz&lhgb!c@JOrPlt>h>c44v#7xcT1aXtaNOFR#t2lE_R}&6IpW2e=K0 zHqU#}Za%z5xq+u&IX|kGpU}}aq%wxU(ETZb?nx~i)RGfqt?N!Lt2xHEYdT8$O4be1 z(f<@F!1S}NX3D}3z@5+=sv~00!PI#uC5PilEnxMDe^l+dFstcNXoV(F1>33Y{H zTVA1FlD<#TAR=2g!&W4_;!hP~;K|bO@Lc^I7PmFg>-ZJ=)qYIonc+C3N*hk`KX#`jLRv`v(*>Wk9-fLJa8tNSg5)wG2})*tp&z!(l$6YK+E0rvgT#xb2w0hGK4@{R0{TIvI&lw$2N>hjH0YfbR^kd-IyD%L3LF?|!>P62{ z$CO?I*JNTJz`7}Uw(|E$I7WAdH!HjGO;GzQr4Pa`jAe#Aj$UXS_x4qj`52Xg<3h-N zSl)3O;}jEhazhHaq$GD~arPLJmpDM?+KUHvtJgwmPx_x6;{%H5_3lOtd1VVmUf#k-t!U7;D z>-_2O82NSTo$)sB^_t98#x%Pr=$>HP8sx^*4Z1>E3x|F-daxuC)^L^^Nm>19mImhC zCqVe;p!^-)racbSW*xoy@i}6*h)UTbl)B9^q=d;GC^BscIuN3^!~vqz2tg(O0qDrw z(=UHKID6$~MaB66_-}RFX-F^&ZA48Y>V0E?tHeUe;q1|Ps8w|_2CAmzWaY$HUr$5 zmJgai|BYK}V}Ld-q;xAvsjJ%%JJx4rGZadSa&opbfhx-J7 za?zue(P%~3wfhn#^Js(_#*y-SAXFlNpr<7y^*d-~Rc3)Oe!g(}JDTYKhx_)%u-n{~+p@eQR$ z6vAIOBs4D&cx1oVpr#@JHO-oT-p?aAJ4ZpB&w%CJ%TmV@4~&DtvCMn0Y2Uvo6Dk4b z$~n-5q1#m0cfIFxI|n$h>T{?v2lju(-S=wyjCM8oCiIFAuK!qN7?I@cEjK%Dqw-sa z7l7@wV-M`=jX>M4dGAm$yKIPc8E$->{dLIEbM&)kwAajX{vf@S1F&s#tnKLx)i;2V z)vo5W|FNk-c2*56e@SQHljbbgxPo)(5~bjJqT&&KR-~yq z?MtW$L0vRTI&VbDzw9LT2dQgfUm9rhio;IJ32Tnj>UAFQN~}aGMtlI8vkuOI<^vBP zw`fyfpvYXk#l0k`Yw#WpA;_m9(aL0c*A<>zYB-KQ739Qw4`(G~%B~U$AjV+|wMUzb z9p9~|Bk+CM0Ay7PcS5|+dH3DdMCbL2mRnHslsSFd?=LoIiP|s_n=vHx7<0I;1avY) z?kyPF>IJ^2w&X?>F7^xz2nr47%TRvAUPssMDlVMJqYI+5?LtsK95-V{>c5Xi6yb6W zF4ENcJLNfC*ODH4WnDC@@0TULl=f9Qo}$`1cE$I7i8x*+3!1Vqb#Mvv0S!@%`6@MksxaBD;D+S$C%ZCoG3 zi8ky2`ek&yXfL`IJinwmE3>5!2*DN{eXa};NIAdJXHOd4+p!XU-VwD6+&cx=*vJrS zsB?IMx)^`2jqe#Bgz1nFJ#WsQZ(QYcOt~cDy9P}QPNux4um2mmH2&o;VOz5`@u=Ap zY5cd!O{?!{VU9TTdG!=RjhGNRGjDzps?>q{otbG6vJ4kJxxLxD{hJ;2L8{v{#_%h! zZNfdXcHy-=VD7c~3K|KqhAYxfiZnTJWNpSw^C&ZyR?IJ)II?nPS-n@3I6mY= z3Osaj>rL#4G*mKN{*?Q^F3XG@&2&7(Xe;T&E>Huf1q^Dmi{4DWN$0Hoo&9b-D_HHw zZ45{qa7-=6j%hvZ!LQlO|<#rQD?p7Gq@Yuytu3b_ZC*aGHL{6^AVr z2GH^2caUdQv0CEo#-6WI6M)EcxO*jf&x;@Z8(&+ zVll(qP$R0_s=%U{Bu0v|0j&!ln+fgwyKHEn*$X^_+gqUjk`jm@tK(e>o*&msb02O{ za3B>&qbtP`jgJ4xVTmG{dmDh>I?OBDDCMihEEFZlRU+Cx=~?9K(@W%c zZOnW}7{0c~g;q!Kq9}{>(1YG&|Gw8A+ok}e{zUTc>s9|2GhSCsL5tz?p< zy4Q!8sM_CqDkes_a_DEEgL|9$!|^X>qU>;}mevCuH7TU0-uz1w74s-#L#S1l@ zu?cop8~hA2b!vHR2rI^7jKNkRXU{ajx>#{KYS?@GMf6_VEYZp*O$?h7D?)OM!7li4 zSL}0VKfyb2cMFQv9c&R*qssy7uV#295`Cgrs77)nXTm)}&AxRyABG5dL47b~TKaC+ z9|o!KQYIj+>3`9e2P)VMr$}PcJ;r65Xk+5ve%~st=}8L)mtQ_`J3OUGeK+U9{`D2U zeEnug=)c78(#bfHpwm^ZUWTyw71NcK-LxCR zp_Tb$1}oN6)Y3q!jzGKF^rNdF=43ORb}C2J?UbHt3gd*)0b#^ zc8(g!r%=Q*>ECPCKIDn8_1^+X%z*jP3O*x+iJVp5#b`-C17iDiJqvV9;F#tlqoja) zNB}H);l~ylW#CL>usdYKbLz#kSBr7mumk1*s;n@7{w?iqz>` zi_zspwx7)WG&lC&e5x@vtT%n-h~Fu)p31>p#6=GPPX$we zh>Ns*IGR?|vw*M|jq=AaYu1A#yo%#rG}r#vQ%J#7_iv$0#AtExZ-67D4FV!x%1g7H z!eiFjzCZi=6DU(_ns#F{(B{Yd$JN?!KU4k8H*sg1?2FITU~+rSQ!JMTTOVG3gzU#; zB@ywPX75)yka>h3{1C-=Tb@#V$CY$n+T>YfPBI)xg4RVZMTcUt_vC&x`$0lc4UgQ2 z9bfu(6%LkwDVpV=CmCgKC91Jp+O&2PDAQTI_10D6+U#d9|4pvcGD9y35S)f8)gM)E zCMn6;sVYFmCzad16~A}DiOAUl@zPZo)D)@Yln+nMtKPOiX)*^Ac;W3LOG{UVm9gt` zX!|0jG3E~yk-=Xv%nkTUON-4pJ$fkS!l}mh>$aZ2h$r(!RMbM#hDvALnPDAqC~vNf zHYvP#=UUD2v}>`>VTVz@c-8cQF56-hTFS*vVy5L*SKkU>NotRQ+HhGQlq;jGX455SZQnC>0e z!GMJiM_hF4(NM`EyB!wn%-A(~q*KAXiBgQ!&W_joC zTO&V49*#~K#mk5{@P8yMa+$nr26i!hR?h>dT<+@-1P+WFme_E~=v%#YL_A~2vP^AP zpne?p;w_C*0-uGgH5Iy$2({*lh>=n>s!>Ae{M(uhw;)|MOhZ+Rip&UqivxzkCQVQm zQNOjvcgXhU+Ao1$O)XNwKlP9f9tJy-hCE*5dYErW`y|jQZ)jeUJPtIu3(+Xe37c_- z(bnY#VE3phlZ7&`*^XTWQHsFJpNe~d4i z1-fji$9eYbl4M8t0TllcyVLw$^xrrssC`Rsk^`NnsFMdhQwrDB?x|S(2@Thr1`ZNi zS;N8-PY{4}=)7}X+I>{{!G$aEz@}e@C0;M^Z&DN(AtdD%4hT#ar8*j-!(Gcrk!>R5 zxVV?A4bGJ4A~vdCB<@W!w+%vK1Vz{%3`QO-_L}oew6Avs9<*At^F3qwi@!8W(sYwQ zR9yjedk5WbL?$aIQn5UWUC`E^y!54)6_~8Ej*wr}q%lt})Pq(Y8g+IrC4_&S{0`uE zr8XhPk+!!V-*3%DE-SUBA|UNAXNFAicctt+vC$XI++WlRS%j;ra^fJ*V1h|%laGlU zoENc*+uxuOF+evmx}F90fRe0xRdjgzgda`ajQlkgf$m>5vvB1yQ;? zB@_^lmXuZ+>Aq)Q@9*ayxPMe&bLN`4&hwnd$<3GHW!3EI4+?I`#0zh(7gcyYXitC< zSG*1Z-HCpyu)QbW64EI_W04j|q3aAxh>KJCufrv_h3SrCWCl?fk4oMt%aCl6r`Mf{ zesJIOZ0TfC7RlRS2u^zlGuS z-a~az{vktv#_Wimx+yl4w#$bz>$H>wg1TE>vO>uukQ@Y>@6vyZ9|=Vs|Js=n;l&3avJdU6#em|&G@_VoL$aS>;0W`Nn!SKBBXGL;8)D*ZgX^B`WojCnl(v$j9enOYDcBF6}hfn0_;zH8XN3>mci)t zvpf)bGZgYS6jYyH_NJ8zg#+KTYPGaVw!pD(MZkx8Q^RLAr33(8-#BM?F=Qs3h~K9PvL*}-2`}RzP?SzgPT+Vk}uTM za+$lStAKjFJ7(@vnv;Zkl+`gKiolY->&tFGQ;e)CrZ}ii=NqfB#8*&KwR3fGH3R=} zEO;i%p|?ee*iK85sQ;z2V=}&iTmFSDz@U|y#+4)%i;>grz)dh) zt*!fxP8#GZm(2(t-=_LUeP_?}xZ@5o%7?Z7Y7?d+9zs)Zigd8DFomOT-7;IchY z#x~wz8Svl_5m|K_`OyLWyVK2u^E6Ue5iVji)Jh&pAOR)0ORTi@-*5l_wZ{^?zB1pk zIKYDi7Tjz6OqoxsT8hCqd z+u3U~VApRU<47zKOJ@Piw<_lBO&`4G8|rpjFQ|0{82 zGB@rk7MnK%A5HU;unE0U>6^)*t7qEB*bVJG*j+3=(FC?}6qNdayST&5gZJx)*cz+( zUC=URcT{mUS2zjcRR3^C+ysjKFg8{_H0fAtt>ioq8=;!-~mCXEib4UYh zcfsP@k+EIRpgG&T7+>&qGT`ho8(*q$3&xZAD5A&J!{;{+i+=1rORwY#D=GJ6MVNod z3vS!qhi#i<>sq&OBHUk^+>YI!cdj{dsr^!yeD#(2xP1N~^Q8IT#V62tIggdF+)A*X zyOS*&nWj3h%j*c#cVslj|ANVkH1RhJb5SSSZyKfk=Tb&5v0h)*wOy6m>8u(Qci1?< zrnJeI?^uLYe*AN}mWCw~wMfkUebjSilXu%z>iliG)`M-F9rRcie}yWFhA za`c0~b!y7WgDkLnYjiNU@Z0POi(bR-HK+`xMhAwC=(!y2ej&F8I6ehEhDbb96F;brwDb*>T?A)lEmR z&gX@TUGVFj$0}~~N0Vk|tzIQa;8iv==z_cQ&APcO;xC zod2C#R(S5;uu{|guq}17^AUZXKJAZ`YhXF;@jMtXm58g^!VBZ3a{-f4+W}yg_51Ty zE z4q!ph{C|4)PSfuE3@FO^VlCyYD*wYG(FJ$KL z%08~DWyIv|Zv$tSnI}Pad#lKii8|0V&2m(zOr>}Oev*y)?Mv&Rt7zg7`=yfG#3dhL z*$+d4asDgp>e^YL2Ft7qLv3YRwSk{6<{PD8 zAD^?UCf;@DhId4?dGVH_7{Ac814vYgPsGa9E!cJ#Z>c4jtGB?W#(6pd$V^h_Z}_Oc z8yB!;5tY2a1!3b$s^s=Axa+pg{=kDg+jr~)G9fYr`llmD^mf1#EA^Nq1%}lVDo;SS zbKObgv*z3ZHY}--IBd`rRBw~nj`fBfn5YTx^&-*2m!Mys_aw^7;>X(;J-7}VSQn=l zX{u?HN-xLPF^=zQ(;ZTvsN80tGikJw4Yy2wQ+ePEp4wELLSJZ*sPs8d8r_)#HNyk# z@rq$Z;QYC?H6*;jy+&f!4_vz{vma0L0`YmjPvOeM8MuggkQ$`Uwg9e5+vL;nIRBxX z_h-psRbb#+`-fV1MT@Cs8CFHbnwi<4AOOi_N zwZGNkxR|QId%XP!>_kp#d)lK^s{%r(Yy|vl(R$UG&Sffl}(_F zoeW6vi(D^SQC;tiqZu< z5%d4B^D12R+*rCxkajTe40o$}ERD{yOPWlIYHooZdY7}T>u0;?*8ayub^CPddi62m zInvh4F{1q2n=PJu5>~(4nsJg8F=5lYhJ-_q{;3P!)t1s+(^6L0bKcWk3+98gxA98B z{GM6`iNy0Y{5V|TM30{MQG~3C<2x^a3@LC7nmZLWp;!whx}%!lKA(WE9_@Vv+9of# zDD>xG%5Uc-pKjyUZ`}z21t$A^jz_m}iU8HcGrQ#?$`D@rKEr7Dw`I!d+UJA8;pq;V zf4C>KMd#EX^5_{-^v7yA>;@?Rs$4VZerD=pWmZPIxgZupvD}{Kvq)s7kM7`g2#8Al zd*dp#YgMKjdaXMdJo)wXU!)3>rc=4ZW2?&HPh#M+%Z0PqU2yJYGPu|r>md_6DYM-A zNOHf+&Iv_^)sj~OqHMEDfeu~)@@8{9K+OoLXR=^7Bc2SbWa zq7@yR>Zf)sxUvh2Wle~faZ-x7^>?rs67=?T;=9!u=!~(75^u^=BmO*0Mw+5Zd>phl z;%kI~dLVlLz5l=Ox>v7I*0&UEU5VuMkA*iKDC<5Pd%gF|&}13oN5{VUeVMdwv~WJr z+NS#gK49!9D{eL^@f(Aqh9}am*O_6Zi-VmheS)LFEzeiIkiCsM;}*)*@n>dIBOYXu zzm5c*?V-aVHuCjfgD`F@;wg+h67BsjFZX-F%QFANdtn>2)WS=@WzfU3or7e{I&H~t zJ-UYTz4WfMttN$46t;d)>1Kf$aAI&k>(s{ILH*ad@+dzPLj4M{OZQeaM8WAp5fGMm}!(hxYJCIbj`DgT>#W&ompEk}HDFEEd^(bSSi;}(hRrF_uC9vW6pMVVv zWi#=e*q$l9DM^bl$x+Zw0M!*nptYk)*xf!J5db!HMKG)1!rrVzq3&a>@RjAL6w91A zsu9s^6cp9G{Ax)@vfm;C+~*=c7@dY_$+O+L7okJRv8rK9u0dHS-MRXUP-0zYg*|+x z$A+0uuE)>WM=l&Gw5mMUWgc)mI~F659J=mHxxxB|QHMNr?2R0Id;K=&`58$tYdkk+ z7B?B8oXkYoc>2*Rcp*{u--rFqYW7Cp#GXh{n`L{F`YIBL*_LV|&(_yEXAH|NG0|;F z;5Z2}c0FO!Gnv%Vzn+c>LDc>fS=#y*R-5RDM&g>s-v$7_; zO?csv0qc9bhw>l!;TUn(oBp!!{1->6p*j7!G_)%a)bGu|me#dAwmDFq}(h_M6W5Zur52zx@@oMqmWhmY%-j2y;V!spQAcw)H^A_WYi1#n}b zmtZEyNSfj<*un#CsJLa@Iex&E#GPV$PYn|v=Y5wa4MWOF)1-qd2Pf`>D$&B%0aiHx z$}=c@#|H{`wb0gq!Xp~Hg*ZE(Tr!KnUlK@zfK2_XorH3(ff9bDKM{QFqUS=K8_ei) zGDV)e04;rpE0UIATQ+>EN<@@`)wm_J;%1U4$JRynZ+$A&1f5H=KZ%Fj)@+ewFQ7PJ z7}u!YWpVZoGroQ_%l&YBZFc$z3na4tf$$pl<~v$aU+1gR$<8$Qmh<#mIJitj-4)_e z?znbe2ml=1&vEqQ8?KM?OV11& z)2=?}@BB_78V(>=69#%S*vi`b0?BE{HN*R8an~uR$#Nr4o7vuU(;tIvGMHr_v5n#2 zn~e)uV1R^8H2zt@36=ufcA(JUyaIs5p&EE=(SY|Kae*+FYz1OB=TF^$yV$Lfzynne zOB`hz>wP}O$DnsNyrohFuGIP7JmHTel|Ww(C__^h3`Oe1bA~|lNsND*z_MB3d?7yZ zY&mICq|Ropli?k4>VTw?$Ljnlo^{P%Fal-OGo2$DO0OTY)5ZcRJYcDhJPJA~sR#2T zh!wiAH^8StG>IGNo~K#*Vj4>%yUj=$^|4%^Fxia|yswvp&n}^7Vh^@vUDSc<7CWo( zoP(yFJ3}Q=fL3AaI^9pb2~Cz%0Mn|x=<5u+%Tcm+%CO!ln#8!!VbEAVQ*YKa(DD|i z;2XVYrUMu=kMSAvCfMN6aHu8F71cTE z%4_#A_#)L~WlEa>V>1-_yg|$+`zZ&~F6uXjWyp(Yc>sas0SM(NmW3K-z1)76_QhdK zqI7|LV#kgaf|Ar9DZZI%n|<(?4di?VSNJxRDf>8YA4$@j{Hh(-fMZ-aUv{1ogRub~ z&PS|DW~AWv_nS_;xY%Ky?j$yx?lw5f>xsW!ddOPntt1C8IMxPpDs+foP;{32rPBkk zOnzE=GeDG+RnwzQj``ko zH$f$I&gZe%_@0SLSKA$UCztdlEHW4ckQ>hX3IF+F=fPWR!hStT-T7W%&-C(3YimOZ zI@NThF+zfVtilS7iPttevTo_wpV!r(eCmHYlRN3TfbLe(Ysgo6a&}5xtE-DRzwS<_ z^51Ruzcw)CIaLRD5;jFn_ z1%r2y@fTr0BML<^W!z8J#!-%_FiZ$FGW1in77o9NU520xv33*cd`gK|e_1l`@k~`w zL%&pIBxK0KP%Mjr`|mk11iJ9gVC17%l@N134uRR#H$rbG5U&RyfC|07PIvZfG8nZz z+-nhBz7?YP^^4wb(i!Z6WvFd}dN$tdieOlcP*D0u?2Fl%`QzG=p`)|sLnSTD4)0FF z?;me*S0Ndf$uayde?Y@)f8KM*dyZuSu(5Tch8N_YpJd=-!U?4I3XsYkGd*Z=$^&pB zxWJHT`LQDGj=f)l__^Z;-oL*>yJIbpYs&*r+nm^D!%Vvj*q`f_?|+{4$Vr9W$DSO? zFDB{0TgD?YiTk#9ew1<|rCzAsrc@*jWYVFtN>^%Uw34Fu^U8Q@2hYt|#xDo#nB_ckW5GVc)+ z(0m-K`t3V*t+M_Q)_x;tr1q_X_d!Ukc`FzpB>elbxb-!oYsEiG(DP2|RFB31&G}tX zWSYIWaPJ#!<$Mx|EyaoA-zNTl5id_k3uSaX-$=~njNMy{WtRlIF?uRIW5xcFH~5zl zVEl#`q~w=lpW1484}Q%w@{`)JyZM~lqu~Y^D)`ewemYO*AG>Wd!LM&7=UebMpCx+$ zG7m1x5yCnI!oxzE6z+HXs^6+{RtojQWGTqi74B$9w}+bxsNi=n#8T$M?;2{orP4RF zC$|&r`l+Vouo1WOzHrc^Ht9r4DES)zk&jhB5_@%Mn|$ zz^M#Q=n`I@(*pE~ckHIKR1-W|hAKIM=O(N#Z7)@Df+;4KLAf&j**BJ9|?bU4oI~|ef6h9_5pjb&I+7*#4 zOiBg>bkF^6=F*^O6miX`^Kv4_v>r3lJ`0auK70me*^OCWIek|g+W^Q(Ok`<8M*P4R zzJk7*au$AzHqzM2h+=fu=b%e0LDZ84@~;LFWl=v?Z) z3i02xSk5Lne*YG?+`f3}n%wA>FvSswf^kJV_&*DksN&yd-B7X^?XzOTr{$_urN!@o z0|$kwBVAU|DzaQ*hyXVdH^E3#eU$l?DU3JkohllvNneS8)thN#VD>{;@A5&Al4))A zthUkR83d?J8eF+ITDQ}x+c<%9X|-(n#}~)jJR#2wpa56mo@~aGMl{e~_27GV4@Z** zHLysu|$isM$_ z9d5618vy5I`|M*ML^Hh*7?j3oO+1|+cy*|LrD_y_djc;)0%-B()al>!J+FvK529^a zjGmJSKFT9EcMPY@rQpvNAwu3gppy~)rM9J+#EW5tB3ku%t9Wc<3Q!M(evS4h)=W^W zgGiZN3R*ZO+$@CA???=ekyWP<{5eugh6t61*-IJ3Gyn(ynlX%jFC6aH$zPqH0;GL3 zj!Wr&`Nz8#+_Y%i=dwOqd)_nq1D0I`&A4V2&=k<_C#bE?SC+GMQ!^3u+Agxu&JB6ZI||&~Hu%vHe*98SF^n1$J5c z2}jGtEUCav52<2sJ~aJ#!=c6x?w&P0`<^10Vvk>8O4t-bfXzUL#E&>xpgAKvM6i%0 z-aUmnW#AiBWy_>E-8}8vIUH3)Mz7EH^qnj5eQB145r3m?vDa|a`zBM4{8$JE(HE+T zDX>6?hr3XGJO(qNa7=3EIO<(=ZMoiFOyeW{2lh||uB35qzg)aKB($NN6Q~a4(n(BK z?cV2NqE47o05I`?i-Ke0!(2uVSPXYk%)|*-Q7}^6Mm-4zc}tGy4iCeUN!r31i|xM$ zRpgXTEjQFVEvEOU>NnVkjqkW-WnPSVr%BhBRU{MiB92yY&ifDO=~FF+{NUT}n@yRh z#dnNO)ny0+J^2G-Tty8$x5bOv`CjK&`nc(=Av;Ug_C#tZ6GFmhjJ9le(mQb?WQA7+ z7k!$@oHEcH9rCu^Eir#6l;gR224qd^T^s7NCzO#5JjHEm(o+Bg+YuWNOlCXAWrXPW zv_}3Hr&}clTdUb&H5{7t@hWX6 zP1m7go0B3!Q-H{rP*zL2fW4D z;)fO{l75k6=*hk_{`_Ski`jXTo}~I{FM*9or|kIdf0B6DU^jh^a0)I;-<1kU6!~Pz zY|JBV5NE2!-!#}Gry>p)a(}M(-Lx^0i2+bd;%{V3<-zel;l+?XF$yICBWW~iX!JPm zM?lQ)FF!bx7&W4S*j6xD{5L?W5Y+PEJWxLVTs2`ZipGOPUwT4 z?D;2z-#I<;{(DuAK(*dQzZsOEOfUCHZ(bPe%75Q2fyo{Sn;i&8Q9PEcNJ6%O{Y`!+ zSDWCob|+>Ye(WC2Jg)8r4P?!yrMu^)QZ0S!pr)&PzDPIZ-LnMFu=ME&PRGrz#=Eh; z^-8XRxXW*GyqRYMHvHG8aW~$3X*X93H+=mqZ7ZDjxVObX)NIw;Et3Cg3S3ENv5*+E z%WgAckXAw$)z9BlTzq;qQP=9BK7(@b?_y`xrryr=Az1_w3tk2#V|Vj~f+j*-E_+;f zc~W;2|J=Jm&D1*gW9@slvJ$!CG%kOWUYnC`h;;3JOngLNU90bLv>tT5P6XN0U^#8a z=MP->3bgsUt?I~#oyBxX?U~&inRQ!UjHI@{+|QFa&r=*_*CJRhf#zJ7zmam>kGnaI z%ex4~PCftQhrobKt6Q{{^jlQTAgaPh5`-Ji?1eamUJ{w^h2);$*8}>n>%+%4)hG3! zL>ztmhzjx!CaW+#G0gr}?7y+?IbJu^f zuI*m3BwkKggJp5Fovp8jT5qs#;9u%ZR@({a&Gk~fqi9W_j={=^+(%` z6y}pNtmnJ0<{JEB%hT!!uG01zZpVtPrFH)|!`PL%{3^qXbyo9cUd*oV?52KpIs<`W zGe4!PDSZPps`*e_0}VIWaZpBeR`*n6=J+re^aya==Ue#4m%q>mpM5U^Qq`TJzLLuL z?|*+BSm`gqTyHcF8sAA{qiEHGj-CZQEylx6fKKAR#{35ob@lKEAMavGqU}H;s%ZlY z_b8|@y51VPF0P*QFx~~*Q8t!9H@el|s5v!IPv9V*fkT~bB|wZj&BETT1udaHY@}jU zVtV!@aQ9?q;f=L3`G2UGQ*i!$-Hml@`#CNgJ1x|nPPkl6{F8ZZ{!bi45cTh4mFUTu zzqwKTjmi@5Pm0>ki~3!qCp*kSou18r=Sy1?i1N-nR+gAt!^Uh^B@(~1VKWt*dy$-cEUV`=1}VjDL1$YxIf0)1`*_zkYcAJo zgVJN`#l+W>uXit6cX@zJ??1(zq5bXOg zOb#CvSFd9y?_!T`d`PgGcoa{&2YepjtCddiyava8z9tzP3ju5Pu8$_kymA(fq84tj z$M{Qshs5>V8~@Uo2l%kcily^eU2sMl;3{0MLi=fns>fJa*A;}+q__rKnqvEZyjnI* zqC{KwW2|Nax}W(gRyfakOq%dCOz2_PqKX)Ey?m)*%deq--P7o?VT)8u(Vo-A2TZnh zw+%&0#4dOY2K9wbI=9jcyg{BWoS7ZGo8*lJI~q)H4Fp!JOCR0?i}|eHav?RVO{Qaa zs|8~#zOxC~+2_?xWLzvi=7QPQ>@%sqBA9FNFIc5ek#3?1T**3($kM+A4{w{F*Rce65%LZOyiau5-0nd2^}8Zr_)*LB9F5_bbn;tOyn#LeZ~S zPeJ$dH%xk!q>cW+_lfglV66>iA>%GiSyR{l?%h<*wq1i<7jTT~xnE;;QKK%y)5ea0 z?q4nl<1HJWCwXof3zBTQ&&20voqx`nX2I8z=`D5NbQt0p?5JFBxWpc2ukQ=%2O}~> zC^{Y}P$%$R6tgj`V5!vp`G_`3q9P?sY{xeI;xz%8LCkaln2P{~TMyH8kgd zCTO2Vv0o0*s5ZY(1Vv=M0uDPAn6WU~-wWW%C=n-^PBi7lXUM$S0jlk79Vit2uWlMM z<5)6LlsVYAcTCOt(7tUOo7dsmK~#cng2@vDtr>8}x!--_KXk&&-@Mn!HWdO0n8+hA z;$aDh@u5mQC>S4Fr@rU+tDg|^M_v0s@*Li7BYluQZ-LDS@qr`k;*r}U|7_dfD3%Z` zlm&4zj_#`>gbLtYb^5kDAx_$x%QOd_*x_Ut)TDdy^Wy7)q052mV>$|1Km=OK>a-o{ zB(T;1W!}T!Cp{UV?pa~1YLPZK_~Xt;8x+n>Uj8%%gS2J9F7xONRQW?J)MjE3XG@BuvS-(DH$Qhj~t@=NZ zpxA&Crhm6v4mNx-Wjo?uKll^8w|cA55}vS$;2NRQd<{O<%`eyUbcdzpgF&9Nt!Z!2 zapT7X$^I-}_Pgef{MwlqtUcht95}5XT3EO}3ojOT2|UQ4`IHst+o1H}b2%|2?O*Y0 zcssUToh|$9z$$R;iZ7$HV%jWgro}_5m%4|~t$RC%OE!QcovUB&0?~%WE=itXodNnG z@QbN2IRuOO!I@~#foN2=k~0FmtR3_fOKiC6#WLJB2RWI>uNc^Q6_1_Dtd`Xd`1{_I zdH-#wxgd6eYhIn@v0T}%xA@@?(DlSsbTP5Me!ZF}ZOX7QH2>!K9rkMF6dDoznz61NKP)hZ8i>gw{+G9 z=!btgP!Z~gA;OePU7s!!(JiKOV!m=15s^S*FN;FWr1ooIC^fo7p69mr3zEYyyX?TC z1y{St=v8R`B3K^4PrNv=swqy(4~@jr8q4GNGC@p{G{F<#h2N` zktvrk4Q1#KU|r5!1x+lcau20Qck>T|ex(K&{H?0b44g2#7R{VF_Qp5qt(jS9X6fn2 z`mo%jV4sMvi(C}i+|l=V`fp%8%WT<0`fab0`XGy}r-M~r%F;oI>XcHNzrrM#zhmJ~ z+~2*L-%b8LYbGay1}-1VU-Xq-_OZP@2R{+y(7SA6$nU8JejsGlN5i{R`5`=zX!HdU zJrkNda09{1B_D>aRxHo{t~!%V&3GQX_bFLX5Bj5iLZv|gu0iooM(9T7mU!s*G~D)3 z4W3bv&gct_-Q;>W1O>d0YgeofDL$2$#KoKrUoSJF0o%@Epb~yapg9r>9?C(jaQe=U zf_oP7x!|#zWFu?|K_;2J5^y>=kir?#GW*qgCiP(2%6tHKLlC<>$`n&t;F?V2)D zOrKN^2f3OFPLNTAss~ky_~^<0Yd4ddmsa^ej~6S*Y+o0;JL@(3>A>BLHtQ&D&y?&V znQ{&vul|wrbT;3#30#FLKGe>?DzW-yi3zbmc$8%^`S z%X;Ehip;&x?z8nQGcL||FPO%jP+;H+U)SVc)Pd2k>ou3i*Q)BJf~kN2h>u>_kM&CW zo?xwtBEy(;*kUi&MqJ*BWK|Vy8k-v1g5cCA)RP7Ra7};1`z?*UqggOmly%zJO^a|Y z<_dpHAS|E+$g!_Hn3y~lyKD!I+u{ldlWFPzf7|6hH)gr{27TGtASN8tS7qQdrJD%( z$|I{IjmW&OiXNo(BG^I!Z#-c*3c4D}Q+g)_cil^h;}zHR5u*b_YkFxmG_!SNH$2|v zCsooz{Oy1_&}X&!VSmWh8=XqvS{9f^@IeIl?V$j?9hb(q{HDrA;Xo-CL{dRv zH`p7>RIeXrLm-Xg3Wl^N7z@1QhGpY*clcR5%F;kk#70oWN38h@yd#Wg-ga`~k;910 zJOcF^_?Y$&K1g_JhZ4`fAsB~dUD$KHQ>CRjUvCILMO|>N)hEV zNdCv$NVG;Xnli*67W?h@@kCs95`=!Eup2}6F%C_hSYwn*HYc>NiM9FfA^ z^fk+uVS@y}1H7-#dpzoO;0~}ZkLI}Zr!2HI+Vo;@l%^w2s89SIbAt#W1K1-^+!Hz) zbQUgZq3WA9+hK!+F&Kb zxJ6|YF!qNKN_nZMwNFOR-d_*c@(twWM7-0tEttMvofcKw#O2iT2*-3Nh7BG~|#5;GGvad5k47zMrT}ElzCgAEF z0I&{?toWSE7|Xfy0=DdxuQ&a(bFNSR_ga>DAAbX|}QiyW8 z6pGyp+VFDksV>e#1K^uWSA58Cu>m%~8NO`Z(`kIp7UFf6n7D(j8u)ZD~&1?21_5YcO8!dz{bG>cimm-gWUIzVFpIM|*N!@=`+#4YRU`rI#0W zBUjS=mophRr55!*cMNQ|Oo~D}QiUoT1Gt`F4W*XG3><};RO70m9-VrAY8RWm*Fm#a z+`GoS+!=7hm;GSXpn|*^41Ur%<+=7GqoO86TyGl-hDhe=y{dS!-b5;;eA4ql-n&OI zoFTZHkh78t;FW}#OFsLj_T>(d1{l2xfCSW>&84MTKu~{-8MMhQzqnX-hF^dUsQZh) zkWf8I*dhyRAVF9z;2RWxNhsz#5>BFGmk$o>Xd&$eXsZUxO2A#ecbX|4!viMW<*|;o zxji()SlTC=4XioKhnD${-Vm{UemX&{DEY%3kuQ_K)0K7yT; zKm+KPDZM8Nh(oiGGQ$E-PY(@LJjwO0il<#wWC>$@=oBN6mRz4&*b0giG=Xny+Z^?F z8*CTy>^qgf)EmWb0fHGrF%W^9NT+gwPK#S|ylgRvsMN*9=DWC+W8d}=D+WdZl6A-w z3qfFz`yY#eRSoJ3?hF`d3hF@v_55S5;p^ouiGhjbuCxQ^;Y`if%x*@l?u5t!BqCgym$p-Ys^02ViZmp z502At0sVRektKA|{5ypMITh<0ULX?(&G9sC(_UT{!#Hei3 zahG&n41cu&;N-`K2SE1HSxhI?VGfUeK#||ZP3r zlA$z@L?Js?`}s&JYlY(rFa3}W&nPl@RuE=Y4!QR({1F#SRw0z{rt*iEcA7lpmxY-h zq4%+cm7}9XQ(;|(ZGb>GcQAo_0+IXco=DFaL_x_W`%&tjX!;f{WU4F~I zoUQmLc{{NHgi;0qs9^GU@7FOg4qw!`RQ7!WCiG{Cl!5`BQpR zcl|=%(S^SFLiYhhN0#ICA{T%viCJUckBx-IxdwKb-xTfXK8!>DKq`|4{^3;A`Lx{1d@}lshlPG&Q

    #XlGF?tTiP`!Xp7V!4pjuoQO!py0wyv=h|fGJ+DaZ!hC zywoM+h6xQA*PC5^Ay`<%C*-ygZ(-X!)R>->{r zU8hcX-tsO_xww&=LA3kBR#@8w%l&iJtiz(}NlYQ%gnVohcz;S#x2&- z*RliZxHl>o4iy~&9`yi7rMmkL5tuoG-<%dgc#kfv3qEiIVm)tzcq*O9y3K!lLmQ($ z8?X!7E!YP&l?63YzBCqO1f{DT3Y6-8kp8D2$r77O_Zw>*mbNphROap>x@0#RWIKa) zTC$K)4NF_3>I!45NR^(_?F#&pr5gWt3r1RsW>P2P#dwJeZG3t9&05lJLIYR1#2F(J zE!ux0@cH;)UF_4C`mCe8>Oq;UbEZ&OdMuVa{^inJIyIVw0pn8xKJm^wZ?#*=A^1nq|I(4#f^I9G(W8ICGXzu{9l9LJ#?Nn%ofJieg*OZ zK$B2-L&3fr!*<*x+?bdmi@6alib`@@HI1|u(m$RSqYd6C93;;m%prUUDZpqEzt%XVdfpqeC)!kH3$ znPRkA)A-L%V1#!ag#wg=sd z*LUttdoa>}mAb{p4xDoeISpNYz=xM6^`lvp7@`pMUz|3KSR!zNKG-&nQI&(IX#m~i zQY5wFgEv&6LS_K8E0WWU?SR%4h&G+G%^w5Vq^IivCvAf9Y`<@ShF8k~&VVpSBUs06 z&qqO=@|d7v*D~kimG2B!z#r@K@RQe!_A_x!FV?w0I<<6K_keJWD&wQdXC2Vz5r2B^ zyeH8e)8xA!r#R$aH>c74_#nC@y(@sl#rJUnj$O@4HEVBYV?w)>plH%;J=<6?(&-Md z+Oc$j4%~6QR}g4^_(=Z<{;Hc8tGo)w&((m!^W+EvF(qXN8^ry3XOJabYg)|rUKN(V zEr}E`D}gKcDhpCZ{)r~=EMiq|xQC2+M}g0AGvin^0oB1J)G_vlwm?1=y$k7)$$i(t- zSlhPY7iFGhKDZM-_3a|Qi`G-=p>oo4-s{msGQ`|>&nMO^$KQHNaVB2x&IQFQH_9&> zR|wW1!4oD`+n%p2PP;G^QPvp{W#JdHlLYr|udEbXUs04#<8bytS()$Erg98BK}#=^ zy0)^XObZ_^_rwef515Z8NVU(fb~qCKwrhxmNn z^{M1Xvk_D1slw;SP1Kbnp;m3E{d0@Sk}$P$a2(vXr?33s8l3aQM6}JxlQ6PM zk%h7ryt^kz)XvB9@WJAfpEZ83wvbYl92cTNePx0SyZ_RjDSj;*IsYDqjBvjOU#n@1 zS!W`Xld7s25A3Zu9KiCSM<@sHR@_Rd8HgDUh_)5(^Qu%0USxm(2h%mv3X7gs4?J3E z)iI>-n8lr@-D9`biA*StjdM9cjVWDgie}U|exSJojY4;jDjZq7;A(82Hes31;Ye*X z6O|M4VLsn}&ef1AeZUaC`q|hPhY1n1t)z!Oiy&6d@w;*U(y>=`{b_P2>ycc6aIuwyBs)+_B+ z$<|&rBW%+8?Vy4ynPFnN1^3O0UX7N1f-KL&jRJ~B3s+-{r??6e#&z*5>|sWwa!e%1 z0zR#B=K9Kpo-FYQuR=G9f0$ybW_evYR}Nq$+iR&ik}Bz>AR`2Uos!Xv7t`s|l)J+3 z>sDrZtM|8P>a*sW1-aAh4`1cO!UZyVSAt=(iK|)iwlPt8@y8kK>dln-d7M4d*n%Y` zp3oPfHXcz*il0|ys0}~%*zH;%IK3+IU#P1;llJ`m6=0zmOY`Ipmt;nb2V;f-Zop+R zr=*Dq*&=UCG0-dGd$j!Wae^OvRFp?c)pwgSrH5FFUTFzk3%itG{>C8P=q2X9sY&@u zo{V0bXFwtH24w>7seH7rn?X6R!fl293Y6lo0I#(RK}y0kAKbsp6aFUxz6)1Ls&07t zb&8)ACd^UKP7bCim(?*S-6C0dpt|f;gFI z%s{?Yf3*mOJG|q@gASLTYif8S?F2o~t7bL3lnk&(_rD<21#Zpaeil^GJt$Xb(*!7U zMv8mJ(EeiI%_Iq~YKuuDgwW(@+ZtUyd?gp5&64QJ$9jFqlL(qpItku1N4?W)gFoxh z`p|G&VGjYwn^Ip@BICGFvN)AIGd3?T5(fHe|1P?~5-$H(0pbz_A=;=*V6>|cZM z6E^ft4gPTYBwC6k$@j`Y;cBUw553x@nk%cMqDn^eDCQj+^`Yxw&Db{{em-aVzDNM+ zW~0y7Esl?keA&xm`9VqZMucxM3OM^ctX)VQM?NNkqdv^O)NAQ+#dhv~xSdFwj) z*GV5lUio!ezm1yj%CcO?0c7OYWYF>5CG3mO&CwnbnS;)AKwcRjssDWN;y^$JIoq zm0<}32A`gr49a&ldR1cex+%f#iS)hGWl^OE0nn&Ei`v@W5wNzdH?|rWS+IK?!5>jI zyP(UPf3KAER=uv!cMrm3gvW^8ihYIyscxTuk`mzXD8GmAQO$KYCn1enddm0P91k3t z3ZY|1>YRR#rHDEF{U$dD`q=eT;mPx?X#1BlYKm_Zr!vQX1r&r}sM*(i`+EcK^I~3* zjnq!pf8mSi5l0+WC_fw5vYJ2}6Dl26F{8@gD&YE2tl7e%D+xeBq07d7n^X0W(YccM z0;nE~?+XXa2)xIaaSEocTot7n(czA8T1zR@yUywvL<(WwrpvP zU_{PkJ%nz_YQk7rasmMO#I1Hrn%o&NMYU z-MIZ$B)*B&1zbDv>8amakg<^TiFL(FXxG#n{qOL=Uw5IGjge;cPtr@HY>3m+s9@?y z3Ner)GKt`TTC)S+S{^D)NgrtG@dHEF(?OdcSE4yg*$;y}PXUlwz52Xtlws3!-v+Cx zAai{y@4>e&rzj04b=O)R0{I}!w-wz47Gx#KHy7RDz+t7>FR&Zjmi3`&5S9rGz=p4s zJ8r(lv7;995O`rSeS1?4iR2@@CL74j+BP~h+DqLi5d0O62t^L4)w0468YkaMqvWZS zv1I}vqWL`)&omtR1ML0L(;qiI?Quh3_yE|(B{Va#7%2cQ@}aR9Y6g>o#UHEd?IxOy!Vx9?v@f5;+{| z>luf{X9WH7Gi5^F5};C&F)~~aT6w|_Kq;G0E`?{`H_)|D5%0&&faVf+R)xiAFFC%NG)rZ6B&&i4r`*~Ek3GwOb|4lu=w zB#;>dx>tdQH2>B7y~40sbTxSX{WsNQ3jW@FzMf}Fl~LdD!3}}0>*`iTMpTmd=Er2H zIe2$I2Mu?J(UCMAX$d!QJm}%Wf_e&(?+(x{hgO5C3|8goR1!vr^InwFk*v%f+Ks7`&;T#0zt?Sgx4V$O^1UO5@Q01H zBAxn0-d=?WHROm7v$%%lY1vZ9j!H58@4JL@@5)$7-|rVYG0czd9lolC9r@?<83ygl zYP*U_>#s&@6;M(t^FadsAW+fbojZtp<=w4us1+MKtT^tI$f!c&{n>ASJ<|+Q5D_;fC<6f#qI0tS5Sw4M8i1W-n&YDOalU_a zLHAo5D!bpcYq@G>(X^2ww4340$nvY=pTQpAr$Jb(9k%fT{?c^;rCw^i`0LWmRYQ)A zUsS8iwa@&a;5(83#kth0y=iM>rM798pYDTqE@(7>-#J#`Ywn%NlEg_$2LA|roIXr@ z7A*JR?4esgRORD0CwxRe=i*DBDjLcR*`JnGMAKx-Lq%7cckgbMDZ6j_z06+h9Z>}p z+eHR^#~ag;WaskJ4|R$eKd}2=jCdeI7g>A*Zu$E5gvEKUoPKzGPbdv$`0BY|tG?M6 ziE(0WU`Y7z(53ZB+vg^knV8qajNC^>#PuIZRx?pldB;;Sg#Ax{_|)}WSO#Y&kAAoc z_}MZMBu(|4mV{f&u6{I1b}NqQwFa9arNcS|m!Ei@FZL~y8Lo&iQiDsS(+1Xl;skEl z&$^$v+Fqc#NQmX#LFduY*-?pjdWo}RjIZ2IHTIbOy)yOBv`p4pzv8_UHwR@vS!ruBXD1>x@ciz53?GhUa7m%=4STz z(K`2Sr|u{4j2Y^!;J4@ zrEwq%2Hfz-7UwMmS}6{txGJGfm^cpIfEY+!J?2Igu22 zGv-W9OelFFPts$p{-RGtG0b`#+QA#it;$ymeijFyHgb%0i_8AnM~4XWkYog{q1SE- zTN!N!8$&1b1`qjQPZ|)xxx?9CeHhiegeD%Iwy{kLnzgLkNn-+B%#b$hLVAvse|WK4 zQ)wcF=fPvvZUa@(2s^zEZ{@)=S_{x=OBZtnUP?UDP$&#-(q$0i9Ii7~S$V$^E?D$5 zO6Ju=MU!Xx2#pdCXBWj^GO<(NLl$p6IPPbQdl;xHB=Vjr4f0A`k0%%*=IU(n_c1Rd zPn&Wq!wXjDWsfa%9a*DMq9{061*>r#v#2~qitR_F88i02-M+a| zy_~OEp!HW=e|XwU%VsK2NzQtgeHs!cx_P8u!VV**t#Rog8r0;0E&D4`8- z)<@16sE7433ptj#YQv4cL?gZ+K{HZJ`@XPa&IHo#Ps&ii1KCoF__ZP`CWvCyenU;M zz0SHr$y`n`lz3iG_I4$aa@h9B0NXXCCye#C*QcfHj|>+r#)%^C=^bs1s4-{5-mlMH zA5jmhM-S@Zy~28+9@aC+_g2%+{(fUD@032Vn?(3h5{0mrlC@Vtr9mh@yPo078Dk|HZ7i>It4 z`c86sAQsSto#0zp-pK;%s%357$Zz6S%L4~Nd1z5lsZsiJl3EJ~8X#o^9NWFR;A=XD zl(N@NA?itK2v~*Ng4UW`1#hEUV+T^Ddjq7R3kL? zP_*+|uswh`KCWb9IFu7W-G&5*2}3^F%ufz{%HJg#M^r)=KVm)6=Hd`I?B5RV#0{2d zd$UZ7cxDvKHXx`;5~Vo!5KD`6BbPs%Q~uMdonbqpD{GMv*gVHA`WaeK@rXZN#)ogV zjB&b7DEr57>YD3w$Z)ZDWe!zH=GrQmT*dH|H4tLMzx&Wbn0q}6`wjCM9N-1G--2N< znUv|MJpZj$A8rr}xq62S1MRZV)Rf<~(z!t;ut0JS7Ip@%`>$nC)zJ)noUS@`h9wdw zO3QEP1p3?@t%(34h>O)#mB2tcz4IAeL@}pB2_;r zB%NsRrdod7Sa>|1J{=76*u-X(sxw{#UGPEg==`5lz8Y`8dL2?^A!TtRhgSINbA&KE z{BCn!jgap<`)TmjS$qyYUjGTLns5m@yC7~9_&!zx(gYEXv)_2naJeVb1^3%PSCzu+ zM9b41v8<)79}_!>AHzZWwFbxNu1;n1`K+~U*~b<{(?Te3nhCr^t z{q?}0l?#FFUm*XT+TKPY=T)9c0AC zqk-1>XY}t*SI#9+^15c}f1p8LD_=&~dC!I~RE}1I#e$4Uj3E~|H@mzmas)^5=*<;FW&z{;UmD&ZOr55<&84v1Q76#5NxXPh(L85A8 zXl+J#{2rb!O<_54km`U0VkXN?xxdLh5r1O)9yG`m(Ov!6CS|hy@O@lekQZ<1aPCR} zD&d|%UkLr$CD+?-Ug`f zyYqg?@oI$7=z!9<9q4oNgHRESFC1wLnJiB+CF{wn-qyp)J;+g0&U{}nF2AGoR4juSZZOxA0%|&-oVWU9%#c_iF7BZNXE(V7a4*+Rdnm>03QLm z=#-v`2Xp-dy(m&f8Y~RUmG*1K2aPxNi7#q74Pw1A4TJ;)S0?bJ#Y6j|m~-c9;w>&) zGs3&^RoUBI9s1ti7xoCWEpz4AgishQ%4U5ETZ^P9NG*KP@shF2uVK{75Le%D}t$i9(Z;DDB z{wBPmFif++l*oim%W*xi!=0AGSy=kpZI>;628YZ-b?Dchr%(XoOZ*MfBDb9+qT<3Q z^J`wND2OSL>*xPWPcDQQ^L~&aqC(Zii(w`d;ne~R;zCWk9C7!r@xvEx@|>*N)L@B6 zg((0t2aMEPz|fWCRRJdv<&Ekb_YFfbq)BJggVP1vxOGC_^7!9BC)q-3`lb&X%lO** z@#vvOX{Q|+-&=iR9-F0R*Pc6-tSKUe1etd+>#%vfM6(@!ajF*DJuIJVj-+z(z8h}3 zv`1lY%;0NQ#>w%_*m$+mdy>ki{l2x8+YcG8PjkU2=F0^{jqjya#XF(IP`x15Cb)T3 z;$SSpEYzuK4OaF%G_%2wM}Tlk4(E{_JV z51mArIJ@G;Kk#E@e~>YJUJy`^kKdl#{qguyDEremJ?iDH!uiK3Ai{-NJPg3P^Eegw zvj8%jqZ+&r^cQ%UODQKH*!pi&6b^K8%1f^@%C{yK}8O0q9s$!LxsI==_k?ep$`Ms#GJw^a(B4 zxQG}nvQMzU4T>j)>sYxOZN`&bRMiONNDiM{J1mQ#Z0%uqT~Y+nc_1wFmoM3*CB~NJ zR3*~3l8;miOxbI`kj`itI=oN9dw0*8nWh}9-+*UpLNV&2sd6V!)!Pjy>$U*S{pd*X z=tz*g7>MkO?O9?H+I`QoBX+u1C*AjEr*DQ}^<`+Cb?D9Kf1f-x%c!_In(;70mdY=b zfAtW+K_rfK$KvX~kKA}f?>s@NXMs&3La)I$)#)$Hx9+dp1Ls852>;5o!-NkH`IK|A zkF~(=I2`A8x_ReTj_>03ZR56<*>MT>?jS`f{9dnyEx@P6gp4xI@0fT6Xe?UQm_sq| zsp;o;wHpAuW45ePy%HH8%V(as$52@qSaY#jnTcG%H4v|0*4Ut0Ne2o7#8HC$alT9t z_cjdxOA-B=)H@_&=q9redJ}AZ7*0#Ld2X?kveKW(@oZU&I^WC@4z)Ag%M$*^RWZKX zqm-eQ-n2^AL|tHhcF1=Jt`cKJhrrwV4Z{wI)$zdNZyLK=Xdp+r2J_$HehLMIbxI!H zuoX-09q9%2h2X-D+befU5;EN&LaJS}Sh#IhM*4XE>M?&ZxTbIWT%ge}+eU13g$&n% zg|3291)uH$3`;6CeYu)y?_cHLCfa0r$)kGT&jPGK7 zF-}4L?6w*J6BT#@iTF!C>bQ6ZtYR2<9BoPqSlk7VefJzs&e2sweZi1xM;TbvMZVDFaJb zkp7P>(a!TT;maB&a-I?)bs;t8u^R1YZA7`yp*G|N|AI_wEj}ugXOvibwM*i{lPvNk zcfRm9s!+5gJ~FLP^-oA_+Rkms>m<-k?7Qjb;1taV{SX|s4X1d0Z~bTCd!-P^)GwXjEx>7)=*lBS3&UroFMrpaFkfeQNSfFy=QjTG_<-S$ zX!FX7e66M4K+i8?5+#5y47IO~m~>@elH(Q20PB0azUJ@m#03ZN9N!TtbQ)^@0M){& znK`M4y#bmFj0Y(Ivf?~Um$6oudO$`yb-&BmHl^rS^Z1QE$Fj&|{cj*nI{ux?Q`w>& z2#X;9#9`vi4lX(GRjoYE#E$Iwme@PB^ku>lLyU5Q5rs+)-|V)|k>{n)Im10cZQyzW zaF7j3wds3(e;3#wb2jnBiK{XMm1tU%Bu8v&YA#D%XA>G2zqY#if*M|OIKrtoFJ$N9 zwix?)YvmY}Gk==V&X5#*&Um$=b35k-nnr%NjWuwytll_*b6bu9%aRA06VZ_xY*dHP zOgy?gfkW*#*6Fjo=+aa~W?v4*EKWcu(hUssTFSq>lAwbZARK?z80_tHPkg3_+S zJKQ=;Rc+N$yKh!Y^$(+_B`NV69TqNf`6oZLeZ+)U&Di*yewRI|DDmpz!KgcLt7_V3 zOHKUFk0=*&<#aQSabf&H{nW?wj`Lweax^`AtC^zd-)RHxUaNDXU)0QonxSBC_hffs zKPfusgWtXNSj?rBExh`$1naE0Ah|dCJx%dI6L6ZNQ>K_^t>#}rS%g_h!a8g^l_x`* z)o3;D`d@E)0t+OCEpwt7j7QGXttbz9B*KkIv7K-_?$@iOkHgBTe_Wcm&IXTriRVST z^SaVpoc%brJ+h`5rB@mm4SBtHXsL;BKWP~*&l3x*)U!h)YeRr;`#wtbG84V>=CISs zchBjrLBbWM94a~&W*%RDR7k9hab-U9ATya`;_mlJQa`~t64cWk=EuT!qz+w88Aspx z-Q4~r0g;+Q>fXWNDr&UORzO-I^t0oCJh?|f60;g zw1DJdPyJBzjO6bsW0m`3mv@P{OO?_%dh8E5pGKJ((iFl6L&;5D-_R8B5zDjhl;rdC zXMC?IAwjhE)ZL4MU6Ia^QLIH5N=c0Q^zJT-C?xoskx6zNNE;nO%T7bf?Q(n})qFIt z%Bz`Xa}mV&9y>RBe$q0iigkJh8kCwj)J$34N+TKQS>mdzQCA|un@T}iI2cEHU1R+v z?RjL}$6OlVM^#am>Y~)#s7fL4pm)VA|#3}mla=j=en;7XOQ@s^*>MVJ5LO8m?H4FOVF#tRsEpDGbgiv zBrW`LyChv70!Hui0sA*&j_XzvhF}llK)#h{d+NL-^Y~NdK|0ieBm{{+Jf}FZM_`(V z#s%W|MAwvl^%0GpQ$JeZdwv!B4PIQ!%{$fvN^Wtpo$?aKU+1>mPy|%t^VM zqWLpK5Mru^Fh^2St(ohn@XK_Ac7cnJrSr2(9UU~JCFq5M?Zwc2xCX@;gbXh-DdKdv zYkeQyVGYKVF6Ac)$|o~>!|^dlB)I)196@2AW#F5feFH5qMBGdjSaNY1JBP0!ZWS2ZCq4ah%(&gj%u&oX3VLIm7`Xe%P4;vm?Zl~i zk5@tca%59ufzoNzCS|^oE+9N2D5J&kwfBr%<)!p27JJpnZJ?gC=~m{$npL)O;))+h z%-YkS0qxC$y;2kHuKU*j=YY#fJ%Rqpz?V{2u-Hj>yAvulr*;`};p0D=a#G zDu=dLwK%uU^g4XF-M%{{`v%qMGS3G4Vd_6dqK7FvK9A!CGYWJuY{ZP$#R*_(o&1yI z%T~N4awht*!)Vkk_p7kjY#FaLK3+)eTk5x9Hs&PyN!gQuz#=|ep5Xi8-k8W^P<#q5 z3WRgUI5)Bz;>pA^cGAzz28{a#&E_*u*`X>#)RBId#M3~_!1>@klVI^c&e7JP6jx)d z-h)BS$}(t z;bM`Toj%fS7AKrQW(c_OQeEsvw|+Z1Hy}*`j9gOi*OC>Nd5vcoZ=yjd4H7!?Z}~2l zO^ZwW+pBe{98RvyH~43RVq^G_slVlEPv@D>=fzOxYo0IJ>JV0gR&5|)Qfu+uT{Rp( ztkS}haC07Qah9us(a3b#kJdH)_26O;)Is~ly&EgeOoZfqny~a;PH~JUxwqcS@6WP$-pwU19LO2Wh=eMoHT{&ICOYnLeZsaILJT;a zowtFa$50x*?Ku0hcT9)!e?!4SVSUHD6UIM&KOqme0Ew#953Dx}rnt)u?o&HAQZ;DU zo_YNGzW~|?CHMruL#K8#M(iQOU_Ia-v__-R*bSKPnV|*v5qN|h-#lTT!a#&4ZI^l5 z+7r;oby#HX4hZQV|M4H6G;~^hHudCdy?GkBz%u(rz|w?uW+OP`p9dy*+A?iF8zHZJ z?KRh2vt=0=2|#MxvpiTg5e`BadGRxr3)hEy5bhOX4qo`e7oPsNfBUzs&q4qyb|L^E zmCjgdjfJ$PMz|WAfkP(%Ohz77J~a>H&;8ubP0W=asnKXOb_-g&V6=2dqxBM+Nev?) zm4ChP!VAyptVWnJ(FaK@IzT zfTHHrg=c+SL;xrz`7WYBDA(4k{)Z%tW_Q-iIRYTquDSsD@f~kj0uVO=tA;?uy%GRc zi&wt#l~XoDu5T{{K#(IBi#crqusJw%0>BK%WXGpu^SkKN@kMGh8jYR6mB^IN$Nrx8 zyk`oIBT)JI#Q~&2ObEaSKls5(=|~}&?Fc}{stJH7{bdONfnW37#TbkPfGdG;ultGE zf6Zp`=}TWaee&eVY2O;ShXA#n9Ff1?1}&o^d3CyvzoNLU>V;n?eOIYysArJ%dM*gCu{;QW0jk_ohlyPg0E6Z)k~^EqR-jBI6I4=SfF_UW zdQkGBD3F0+Uv<@0lS$2SRL`m`h+6=&l@Hr!G#ZBqN(ja0?Qehkq%GTM)$-j5$fF9S zg{}3{B`>+;lGC63TVfv$TjE61GxxNg=OmT<%fK_bjqoLGngg{gd|ymI8A^vyTE z@r{!e>A?pdoIYcHAq(w0ZtlfFVb?JLOg$d{+Dn<)pC8S`5@3+3OffG-!}otaC_yVG z&`&<2H^2GKTYfJf{FSF{G#ZV=1d}^KXrZ@=-*eABlVy`4v#90lQGogdT(RQ1xIupD zmwssyc-Cuf0PzGAyp%^iPGAKQtj?WHXmcMu@W2C;yyF5&gDIrIK0ecs%HLw>xTBrG$;yI1ug+Kn|Kc0d+lkq^a*W`)7uL4^@ z1WaieaCl40-%^jqtR$I8tVpD0Im^brh^-Aym5+!s{}xXiCBr6(Z*u% zlRx>BQ`zZ&JXDt=RUUy`fYoU%>AXtpngC!tn8~L;^{K5+QGy<7YM|g475sq+D>V$K7Z&8jZ%f00DT(OI|W%NCdz3Yri(7hE@WgTr&co$WlPg z33RUnK%E8(b8V!=!o-Sxkg{;s1b|P15LX;S&;ubasvn~f!4Lc(QXK5VSCR=4I3mZk zx&cg()IdZ*z=Z4o0fpL5HX4maqp@z-D*+(X$u@1LD*@nA;wlh#k>FDMlCNt;0Dy^K z^ru{Xo4i=5Ar*od6acFJev>A!p_ZZqfe|Lk|5OI7-)S@&jYeagFh>ARojNu7_A3FP z*&_goI)UIy+CK$(jsOU@6ky85E{Jd~2|%OKXfztf6>|i@?<(SQh4cMWW@Wi?nScKC zpP%-T5g?O7=g5%&=uW95vzRyvHX_jkpwVbF8jUr=904G(HG1MAXX57;*E(9::Singleton(*env); diff --git a/platform/default/src/mbgl/storage/offline_download.cpp b/platform/default/src/mbgl/storage/offline_download.cpp index f9f4bb01808f..4a48c584c638 100644 --- a/platform/default/src/mbgl/storage/offline_download.cpp +++ b/platform/default/src/mbgl/storage/offline_download.cpp @@ -224,10 +224,12 @@ OfflineRegionStatus OfflineDownload::getStatus() const { } if (!parser.glyphURL.empty()) { + uint32_t ttfCount = 0; + if (parser.fontFaces) ttfCount = static_cast(parser.fontFaces->size()); // custom faces result->requiredResourceCount += parser.fontStacks().size() * (std::visit([](auto& reg) { return reg.includeIdeographs; }, definition) - ? GLYPH_RANGES_PER_FONT_STACK - : NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK); + ? GLYPH_RANGES_PER_FONT_STACK + ttfCount + : NON_IDEOGRAPH_GLYPH_RANGES_PER_FONT_STACK + ttfCount); } if (!parser.sprites.empty()) { @@ -342,8 +344,15 @@ void OfflineDownload::activateDownload() { // Assumes that if a glyph range starts with fixed width/ideographic // characters, the entire range will be fixed width. if (includeIdeographs || !util::i18n::allowsFixedWidthGlyphGeneration(i * GLYPHS_PER_GLYPH_RANGE)) { - queueResource( - Resource::glyphs(parser.glyphURL, fontStack, getGlyphRange(i * GLYPHS_PER_GLYPH_RANGE))); + auto range = getGlyphRange(i * GLYPHS_PER_GLYPH_RANGE); + queueResource(Resource::glyphs( + parser.glyphURL, fontStack, std::pair{range.first, range.second})); + } + if (parser.fontFaces) { + FontFaces& faces = *parser.fontFaces; + for (const auto& face : faces) { + queueResource(Resource::fontFace(face.url)); + } } } } diff --git a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp index a123d2238d82..d1bdaa2077a0 100644 --- a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp +++ b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp @@ -40,8 +40,13 @@ LocalGlyphRasterizer::LocalGlyphRasterizer(const std::optional& fon LocalGlyphRasterizer::~LocalGlyphRasterizer() {} bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) { +#ifdef MLN_TEXT_SHAPING_HARFBUZZ + return impl->isConfigured() && impl->metrics->inFont(glyphID.complex.code) && + util::i18n::allowsFixedWidthGlyphGeneration(glyphID); +#else return impl->isConfigured() && impl->metrics->inFont(glyphID) && util::i18n::allowsFixedWidthGlyphGeneration(glyphID); +#endif } Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { @@ -53,7 +58,11 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { return glyph; } +#ifdef MLN_TEXT_SHAPING_HARFBUZZ + glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID.complex.code); +#else glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID); +#endif glyph.metrics.height = impl->metrics->height(); glyph.metrics.left = 3; glyph.metrics.top = -8; @@ -66,8 +75,13 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { QPainter painter(&image); painter.setFont(impl->font); painter.setRenderHints(QPainter::TextAntialiasing); + // Render at constant baseline, to align with glyphs that are rendered by node-fontnik. +#ifdef MLN_TEXT_SHAPING_HARFBUZZ + painter.drawText(QPointF(0, 20), QString(QChar(glyphID.complex.code))); +#else painter.drawText(QPointF(0, 20), QString(QChar(glyphID))); +#endif auto img = std::make_unique(image.sizeInBytes()); memcpy(img.get(), image.constBits(), image.sizeInBytes()); diff --git a/src/mbgl/gfx/dynamic_texture_atlas.cpp b/src/mbgl/gfx/dynamic_texture_atlas.cpp index 08e440f792d4..343a74067be3 100644 --- a/src/mbgl/gfx/dynamic_texture_atlas.cpp +++ b/src/mbgl/gfx/dynamic_texture_atlas.cpp @@ -61,7 +61,7 @@ GlyphAtlas DynamicTextureAtlas::uploadGlyphs(const GlyphMap& glyphs) { const auto& glyph = glyphEntry.second; if (glyph.has_value() && glyph.value()->bitmap.valid()) { - int32_t uniqueId = static_cast(sqrt(fontStack) / 2 + glyph.value()->id); + int32_t uniqueId = static_cast(sqrt(fontStack) / 2 + glyph.value()->id.hash); const auto size = Size(glyph.value()->bitmap.size.width + 2 * padding, glyph.value()->bitmap.size.height + 2 * padding); const auto& texHandle = glyphAtlas.dynamicTexture->reserveSize(size, uniqueId); diff --git a/src/mbgl/layout/layout.hpp b/src/mbgl/layout/layout.hpp index d0914e69b933..b2e12339bae9 100644 --- a/src/mbgl/layout/layout.hpp +++ b/src/mbgl/layout/layout.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -13,6 +14,7 @@ class BucketParameters; class RenderLayer; class FeatureIndex; class LayerRenderData; +class GlyphManager; class Layout { public: @@ -27,6 +29,10 @@ class Layout { virtual void prepareSymbols(const GlyphMap&, const GlyphPositions&, const ImageMap&, const ImagePositions&) {} + virtual void finalizeSymbols(HBShapeResults&) {} + + virtual bool needFinalizeSymbols() { return false; } + virtual bool hasSymbolInstances() const { return true; } virtual bool hasDependencies() const = 0; @@ -35,6 +41,7 @@ class Layout { class LayoutParameters { public: const BucketParameters& bucketParameters; + std::shared_ptr fontFaces; GlyphDependencies& glyphDependencies; ImageDependencies& imageDependencies; std::set& availableImages; diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 50a80c8b9140..902b952e0713 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,31 @@ inline Immutable createLayout( return layout; } +GlyphIDType getCharGlyphIDType(char16_t ch, + const FontStack& stack, + std::shared_ptr faces, + GlyphIDType lastCharType) { + if (!faces) { + return GlyphIDType::FontPBF; + } + + if (util::i18n::isVariationSelector1(ch)) { + return lastCharType; + } + + for (const auto& name : stack) { + for (auto& face : *faces) { + if (face.name == name) { + for (auto& range : face.ranges) { + if (ch >= range.first && ch <= range.second) return face.type; + } + } + } + } + + return GlyphIDType::FontPBF; +} + } // namespace SymbolLayout::SymbolLayout(const BucketParameters& parameters, @@ -153,19 +179,72 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, FontStack baseFontStack = layout->evaluate(zoom, ft, canonicalID); ft.formattedText = TaggedString(); - for (const auto& section : formatted.sections) { + std::map sectionTable; + + for (std::size_t sectionIndex = 0; sectionIndex < formatted.sections.size(); sectionIndex++) { + const auto& section = formatted.sections[sectionIndex]; + if (!section.image) { - std::string u8string = section.text; - if (textTransform == TextTransformType::Uppercase) { - u8string = platform::uppercase(u8string); - } else if (textTransform == TextTransformType::Lowercase) { - u8string = platform::lowercase(u8string); - } try { - ft.formattedText->addTextSection(applyArabicShaping(util::convertUTF8ToUTF16(u8string)), - section.fontScale ? *section.fontScale : 1.0, - section.fontStack ? *section.fontStack : baseFontStack, - section.textColor); + std::string u8string = section.text; + if (textTransform == TextTransformType::Uppercase) { + u8string = platform::uppercase(u8string); + } else if (textTransform == TextTransformType::Lowercase) { + u8string = platform::lowercase(u8string); + } + + auto u16String = applyArabicShaping(util::convertUTF8ToUTF16(u8string)); + const char16_t* u16Char = u16String.data(); + std::u16string subString; + auto sectionScale = section.fontScale ? *section.fontScale : 1.0; + auto sectionFontStack = section.fontStack ? *section.fontStack : baseFontStack; + + GlyphIDType subStringtype = getCharGlyphIDType( + *u16Char, sectionFontStack, layoutParameters.fontFaces, GlyphIDType::FontPBF); + + while (*u16Char) { + const auto chType = getCharGlyphIDType( + *u16Char, sectionFontStack, layoutParameters.fontFaces, subStringtype); + if (chType != subStringtype) { + if (subString.length()) { + ft.formattedText->addTextSection(subString, + sectionScale, + sectionFontStack, + subStringtype, + false, + section.textColor); + sectionTable[ft.formattedText->getSections().size() - 1] = sectionIndex; + if (subStringtype != GlyphIDType::FontPBF) { + layoutParameters.glyphDependencies + .shapes[section.fontStack ? *section.fontStack : baseFontStack] + [subStringtype] + .insert(subString); + } + } + + subString.clear(); + subStringtype = chType; + } + + subString += *u16Char; + + ++u16Char; + } + + if (subString.length()) { + ft.formattedText->addTextSection(subString, + section.fontScale ? *section.fontScale : 1.0, + section.fontStack ? *section.fontStack : baseFontStack, + subStringtype, + true, + section.textColor); + sectionTable[ft.formattedText->getSections().size() - 1] = sectionIndex; + if (subStringtype != GlyphIDType::FontPBF) { + layoutParameters.glyphDependencies + .shapes[section.fontStack ? *section.fontStack : baseFontStack][subStringtype] + .insert(subString); + } + } } catch (...) { mbgl::Log::Error( mbgl::Event::ParseTile, @@ -186,17 +265,23 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, // Loop through all characters of this text and collect unique codepoints. for (std::size_t j = 0; j < ft.formattedText->length(); j++) { - const auto& section = formatted.sections[ft.formattedText->getSectionIndex(j)]; - if (section.image) continue; - - const auto& sectionFontStack = section.fontStack; + uint8_t sectionIndex = ft.formattedText->getSectionIndex(j); + auto& section = ft.formattedText->getSections()[sectionIndex]; + if (section.imageID) continue; + const auto& sectionFontStack = formatted.sections[sectionTable[sectionIndex]].fontStack; GlyphIDs& dependencies = - layoutParameters.glyphDependencies[sectionFontStack ? *sectionFontStack : baseFontStack]; - char16_t codePoint = ft.formattedText->getCharCodeAt(j); - dependencies.insert(codePoint); - if (canVerticalizeText || (allowVerticalPlacement && ft.formattedText->allowsVerticalWritingMode())) { - if (char16_t verticalChr = util::i18n::verticalizePunctuation(codePoint)) { - dependencies.insert(verticalChr); + layoutParameters.glyphDependencies.glyphs[sectionFontStack ? *sectionFontStack : baseFontStack]; + if (section.type != FontPBF) { + dependencies.insert(GlyphID(0, section.type)); + needFinalizeSymbolsVal = true; + } else { + char16_t codePoint = ft.formattedText->getCharCodeAt(j); + dependencies.insert(codePoint); + if (canVerticalizeText || + (allowVerticalPlacement && ft.formattedText->allowsVerticalWritingMode())) { + if (char16_t verticalChr = util::i18n::verticalizePunctuation(codePoint)) { + dependencies.insert(verticalChr); + } } } } @@ -223,6 +308,74 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, } } +void SymbolLayout::finalizeSymbols(HBShapeResults& results) { + for (auto& feature : features) { + if (feature.geometry.empty()) { + continue; + } + + if (feature.formattedText && feature.formattedText->hasNeedHBShapeText() && + !feature.formattedText->hbShaped()) { + auto shapedString = TaggedString(); + + const auto& sections = feature.formattedText->getSections(); + const auto& styleText = feature.formattedText->getStyledText(); + + std::u16string subString; + auto sectionIndex = styleText.second[0]; + auto strLen = styleText.first.length(); + + auto applySubString = [&]() { + if (subString.length()) { + auto& section = sections[sectionIndex]; + if (GlyphIDType::FontPBF == section.type) { + shapedString.addTextSection(subString, + section.scale, + section.fontStack, + section.type, + section.keySection, + section.textColor); + } else { + auto& fontstackResults = results[section.fontStack]; + auto& typeResults = fontstackResults[section.type]; + auto& result = typeResults[subString]; + + shapedString.addTextSection(result.str, + section.scale, + section.fontStack, + section.type, + result.adjusts, + section.keySection, + section.textColor); + } + } + }; + + for (size_t charIndex = 0; charIndex < strLen; ++charIndex) { + auto& ch = styleText.first[charIndex]; + auto& sec = styleText.second[charIndex]; + + if (sectionIndex != sec) { + applySubString(); + + subString.clear(); + sectionIndex = sec; + } + + subString += ch; + } + + applySubString(); + + shapedString.setHBShaped(true); + feature.formattedText = shapedString; + + } // feature.formattedText + } // for (auto & feature : features .. + + needFinalizeSymbolsVal = false; +} // SymbolLayout::finalizeSymbols + bool SymbolLayout::hasDependencies() const { return !features.empty(); } diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp index 37848d6ef35e..942e0c4ab078 100644 --- a/src/mbgl/layout/symbol_layout.hpp +++ b/src/mbgl/layout/symbol_layout.hpp @@ -33,6 +33,10 @@ class SymbolLayout final : public Layout { ~SymbolLayout() final = default; + bool needFinalizeSymbols() override { return needFinalizeSymbolsVal; } + + void finalizeSymbols(HBShapeResults&) override; + void prepareSymbols(const GlyphMap& glyphMap, const GlyphPositions&, const ImageMap&, @@ -146,6 +150,8 @@ class SymbolLayout final : public Layout { BiDi bidi; // Consider moving this up to geometry tile worker to reduce // reinstantiation costs; use of BiDi/ubiditransform object must // be constrained to one thread + + bool needFinalizeSymbolsVal = false; }; } // namespace mbgl diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index 4fd84cd0262a..ac02e3f8a4e3 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -120,6 +120,7 @@ void Map::Impl::onUpdate() { timePoint, transform.getState(), style->impl->getGlyphURL(), + style->impl->getFontFaces(), style->impl->areSpritesLoaded(), style->impl->getTransitionOptions(), style->impl->getLight()->impl, diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 8f6e3abf0419..18dcda352329 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -201,6 +201,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree( .dynamicTextureAtlas = dynamicTextureAtlas}; glyphManager->setURL(updateParameters->glyphURL); + glyphManager->setFontFaces(updateParameters->fontFaces); // Update light. const bool lightChanged = renderLight.impl != updateParameters->light; @@ -1022,10 +1023,16 @@ void RenderOrchestrator::onGlyphsError(const FontStack& fontStack, std::exception_ptr error) { MLN_TRACE_FUNC(); - Log::Error(Event::Style, - "Failed to load glyph range " + std::to_string(glyphRange.first) + "-" + - std::to_string(glyphRange.second) + " for font stack " + fontStackToString(fontStack) + ": " + - util::toString(error)); + std::stringstream ss; + ss << "Failed to load glyph range "; + if (glyphRange.type == FontPBF) { + ss << glyphRange.first << "-" << glyphRange.second; + } else { + ss << (int)glyphRange.type << "(font file)"; + } + ss << " for font stack " << fontStackToString(fontStack) << ":( " << util::toString(error) << ")"; + auto errorDetail = ss.str(); + Log::Error(Event::Style, errorDetail); observer->onResourceError(error); } diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp index d2b162c29eeb..0e25678ed50c 100644 --- a/src/mbgl/renderer/update_parameters.hpp +++ b/src/mbgl/renderer/update_parameters.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ class UpdateParameters { const TransformState transformState; const std::string glyphURL; + std::shared_ptr fontFaces; const bool spriteLoaded; const style::TransitionOptions transitionOptions; const Immutable light; diff --git a/src/mbgl/storage/resource.cpp b/src/mbgl/storage/resource.cpp index acf785313c17..6c25fb0fac1a 100644 --- a/src/mbgl/storage/resource.cpp +++ b/src/mbgl/storage/resource.cpp @@ -80,6 +80,10 @@ Resource Resource::glyphs(const std::string& urlTemplate, })}; } +Resource Resource::fontFace(const std::string& url) { + return Resource{Resource::Kind::Glyphs, url}; +} + Resource Resource::tile(const std::string& urlTemplate, float pixelRatio, int32_t x, diff --git a/src/mbgl/style/parser.cpp b/src/mbgl/style/parser.cpp index f6ef833a2ce5..cdae2e6008bf 100644 --- a/src/mbgl/style/parser.cpp +++ b/src/mbgl/style/parser.cpp @@ -11,6 +11,7 @@ #include #include +#include #include @@ -116,6 +117,83 @@ StyleParseResult Parser::parse(const std::string& json) { } } +#ifdef MLN_TEXT_SHAPING_HARFBUZZ + // Ignore font-faces if no harfbuzz + if (document.HasMember("font-faces")) { + const JSValue& faces = document["font-faces"]; + if (faces.IsObject()) { + fontFaces = std::make_shared(); + for (auto it = faces.MemberBegin(); it != faces.MemberEnd(); ++it) { + const std::string& faceName = it->name.GetString(); + const JSValue& faceValue = it->value; + + if (faceValue.IsArray()) { + // If the face is an array, we assume it is a list of font file objects. + for (const auto& fontFile : faceValue.GetArray()) { + if (fontFile.IsObject()) { + FontFace fontFace(faceName, "", {{0, 0x10FFFF}}); + + // Parse url + if (fontFile.HasMember("url")) { + const JSValue& url = fontFile["url"]; + if (url.IsString()) fontFace.url = url.GetString(); + } + + // Parse unicode-range + if (fontFile.HasMember("unicode-range")) { + const JSValue& unicodeRange = fontFile["unicode-range"]; + fontFace.ranges.clear(); + if (unicodeRange.IsArray()) { + for (auto& range : unicodeRange.GetArray()) { + if (range.IsString()) { + std::string rangeString = range.GetString(); + if (rangeString.length() > 2) { + rangeString = rangeString.substr(2); + std::string::size_type pos = rangeString.find('-'); + if (pos != std::string::npos) { + std::string start = rangeString.substr(0, pos); + std::string end = rangeString.substr(pos + 1); + if (!start.empty() && !end.empty()) { + auto startInt = util::parse(start, 16); + auto endInt = util::parse(end, 16); + if (startInt && endInt) { + fontFace.ranges.emplace_back(*startInt, *endInt); + } else { + Log::Warning( + Event::ParseStyle, + "Invalid unicode-range in font-face: " + rangeString); + } + } + } + } + } + } + } + } + + // If valid, generate a unique glyph ID type for this font face + // and add it to the font faces list. + if (fontFace.valid()) { + fontFace.type = genNewGlyphIDType( + fontFace.url, FontStack{fontFace.name}, fontFace.ranges); + fontFaces->emplace_back(std::move(fontFace)); + } else { + Log::Warning(Event::ParseStyle, "Invalid font-face definition for: " + faceName); + } + } + } + } else if (faceValue.IsString()) { + FontFace fontFace(faceName, faceValue.GetString(), {{0, 0x10FFFF}}); + fontFace.type = genNewGlyphIDType(fontFace.url, FontStack{fontFace.name}, fontFace.ranges); + fontFaces->emplace_back(std::move(fontFace)); + } else { + Log::Warning(Event::ParseStyle, "font-face must be an object or array"); + } + } + }; + } +#endif + // Call for side effect of logging warnings for invalid values. fontStacks(); diff --git a/src/mbgl/style/parser.hpp b/src/mbgl/style/parser.hpp index 6d5e8794898c..7aef897201bd 100644 --- a/src/mbgl/style/parser.hpp +++ b/src/mbgl/style/parser.hpp @@ -4,6 +4,9 @@ #include #include #include + +#include + #include #include #include @@ -29,6 +32,7 @@ class Parser { std::vector sprites; std::string glyphURL; + std::shared_ptr fontFaces; std::vector> sources; std::vector> layers; diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp index b42deb21c152..2b4bf88b850a 100644 --- a/src/mbgl/style/style_impl.cpp +++ b/src/mbgl/style/style_impl.cpp @@ -134,7 +134,7 @@ void Style::Impl::parse(const std::string& json_) { std::make_exception_ptr(std::runtime_error("Unable to find resource provider for sprite url."))); } glyphURL = parser.glyphURL; - + fontFaces = parser.fontFaces; loaded = true; observer->onStyleLoaded(); } @@ -427,6 +427,10 @@ const std::string& Style::Impl::getGlyphURL() const { return glyphURL; } +std::shared_ptr Style::Impl::getFontFaces() const { + return fontFaces; +} + Immutable>> Style::Impl::getImageImpls() const { return images; } diff --git a/src/mbgl/style/style_impl.hpp b/src/mbgl/style/style_impl.hpp index e9ab3abc5654..8ef03e98ffe7 100644 --- a/src/mbgl/style/style_impl.hpp +++ b/src/mbgl/style/style_impl.hpp @@ -13,6 +13,8 @@ #include #include +#include + #include #include @@ -80,6 +82,7 @@ class Style::Impl : public SpriteLoaderObserver, void removeImage(const std::string&); const std::string& getGlyphURL() const; + std::shared_ptr getFontFaces() const; using ImageImpls = std::vector>; Immutable getImageImpls() const; @@ -104,6 +107,7 @@ class Style::Impl : public SpriteLoaderObserver, std::unique_ptr spriteLoader; std::string glyphURL; + std::shared_ptr fontFaces; Immutable images = makeMutable(); CollectionWithPersistentOrder sources; Collection layers; diff --git a/src/mbgl/text/freetype.cpp b/src/mbgl/text/freetype.cpp new file mode 100644 index 000000000000..d9f70c5d3aac --- /dev/null +++ b/src/mbgl/text/freetype.cpp @@ -0,0 +1,98 @@ +#include "freetype.hpp" + +#include + +#include + +#include +#include FT_FREETYPE_H + +namespace mbgl { + +// +// FreeTypeLibray +// + +#define SDF_FONT_SIZE 24 + +FreeTypeLibrary::FreeTypeLibrary() { + FT_Init_FreeType(&library); +} + +FreeTypeLibrary::~FreeTypeLibrary() { + FT_Done_FreeType(library); +} + +// FreeTypeFace + +FreeTypeFace::FreeTypeFace(const std::string &fontFileName, const FreeTypeLibrary &lib) { + FT_Error error = FT_New_Face(lib.library, fontFileName.c_str(), 0, &face); + valid = (error == 0); + if (!valid) return; + + force_ucs2_charmap(face); + FT_Set_Char_Size(face, 0, SDF_FONT_SIZE * 64, 72, 72); +} + +FreeTypeFace::FreeTypeFace(const char *fontData, size_t fontDataSize, const FreeTypeLibrary &lib) { + memoryFile.resize(fontDataSize); + std::memcpy(memoryFile.data(), fontData, fontDataSize); + FT_Error error = FT_New_Memory_Face(lib.library, memoryFile.data(), (FT_Long)fontDataSize, 0, &face); + valid = (error == 0); + if (!valid) return; + + force_ucs2_charmap(face); + FT_Set_Char_Size(face, 0, SDF_FONT_SIZE * 64, 72, 72); +} + +FreeTypeFace::~FreeTypeFace() { + if (valid) FT_Done_Face(face); +} + +int FreeTypeFace::force_ucs2_charmap(FT_Face ftf) { + for (int i = 0; i < ftf->num_charmaps; i++) { + if (((ftf->charmaps[i]->platform_id == 0) && (ftf->charmaps[i]->encoding_id == 3)) || + ((ftf->charmaps[i]->platform_id == 3) && (ftf->charmaps[i]->encoding_id == 1))) { + return FT_Set_Charmap(ftf, ftf->charmaps[i]); + } + } + return -1; +} + +Glyph FreeTypeFace::rasterizeGlyph(const GlyphID &glyph) { + Glyph fixedMetrics; + + FT_Int32 flags = FT_LOAD_DEFAULT; + + FT_Load_Glyph(face, + (FT_UInt)glyph.complex.code, // the glyph_index in the font file + flags); + + FT_GlyphSlot slot = face->glyph; + FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); + + const FT_Bitmap &ftBitmap = slot->bitmap; + + fixedMetrics.id = glyph; + + Size size(ftBitmap.width + Glyph::borderSize * 2, ftBitmap.rows + Glyph::borderSize * 2); + + fixedMetrics.metrics.width = size.width; + fixedMetrics.metrics.height = size.height; + fixedMetrics.metrics.left = slot->bitmap_left; + fixedMetrics.metrics.top = slot->bitmap_top - SDF_FONT_SIZE - Glyph::borderSize; + fixedMetrics.metrics.advance = (uint32_t)(slot->metrics.horiAdvance / 64); + + // Copy alpha values from RGBA bitmap into the AlphaImage output + fixedMetrics.bitmap = AlphaImage(size); + + for (uint32_t h = 0; h < ftBitmap.rows; ++h) { + std::memcpy(&fixedMetrics.bitmap.data[size.width * (h + Glyph::borderSize) + Glyph::borderSize], + &ftBitmap.buffer[ftBitmap.width * h], + ftBitmap.width); + } + + return fixedMetrics; +} + +} // namespace mbgl diff --git a/src/mbgl/text/freetype.hpp b/src/mbgl/text/freetype.hpp new file mode 100644 index 000000000000..99d2e6aed9c0 --- /dev/null +++ b/src/mbgl/text/freetype.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include + +#include +#include +#include +#include + +struct FT_FaceRec_; +struct FT_LibraryRec_; + +using FT_Face = FT_FaceRec_ *; +using FT_Library = FT_LibraryRec_ *; + +namespace mbgl { + +class FreeTypeLibrary { +public: + friend class FreeTypeFace; + FreeTypeLibrary(); + ~FreeTypeLibrary(); + +private: + FT_Library library = nullptr; +}; + +// call back format: width, height, left, top, advance, bitmap data +using GlyphCallBack = std::function; + +class FreeTypeFace { +public: + explicit FreeTypeFace(const std::string &fontFileName, const FreeTypeLibrary &lib); + explicit FreeTypeFace(const char *fontData, size_t fontDataSize, const FreeTypeLibrary &lib); + ~FreeTypeFace(); + + Glyph rasterizeGlyph(const GlyphID &glyph); + + bool isValid() const { return valid; } + + FT_Face getFace() { return face; } + +private: + FT_Face face; + int force_ucs2_charmap(FT_Face ftf); + std::vector memoryFile; + + bool valid = false; +}; + +} // namespace mbgl diff --git a/src/mbgl/text/glyph.cpp b/src/mbgl/text/glyph.cpp index 8c879cbe4dd4..eb2f52244466 100644 --- a/src/mbgl/text/glyph.cpp +++ b/src/mbgl/text/glyph.cpp @@ -1,14 +1,63 @@ #include +#include namespace mbgl { +GlyphRange::GlyphRange(uint32_t first_, uint32_t second_, GlyphIDType type_) + : first((uint16_t)first_), + second((uint16_t)second_), + type(type_) {} + +bool GlyphRange::operator==(const GlyphRange &other) const { + return first == other.first && second == other.second && type == other.type; +} + +bool GlyphRange::operator<(const GlyphRange &other) const { + if (first < other.first) return true; + if (first > other.first) return false; + + if (second < other.second) return true; + if (second > other.second) return false; + + return type < other.type; +} + +GlyphIDType genNewGlyphIDType() { + static short glyphType = GlyphIDType::FontPBF; + ++glyphType; + if (glyphType == GlyphIDType::FontPBF) ++glyphType; + return static_cast(glyphType); +} + +GlyphIDType genNewGlyphIDType(const std::string &url, + const FontStack &fontStack, + const std::vector> &pairs) { + static std::map>> glyphTypes; + + std::size_t hash = 0; + for (auto &pair : pairs) { + mbgl::util::hash_combine(hash, pair.first); + mbgl::util::hash_combine(hash, pair.second); + } + + auto family = fontStackToString(fontStack); + + auto type = glyphTypes[url][family][hash]; + if (type == GlyphIDType::FontPBF) { + type = genNewGlyphIDType(); + glyphTypes[url][family][hash] = type; + } + + return type; +} + // Note: this only works for the BMP GlyphRange getGlyphRange(GlyphID glyph) { - unsigned start = (glyph / 256) * 256; + unsigned start = (glyph.complex.code / 256) * 256; unsigned end = (start + 255); if (start > 65280) start = 65280; if (end > 65535) end = 65535; - return {start, end}; + return {start, end, glyph.complex.type}; } } // namespace mbgl diff --git a/src/mbgl/text/glyph_manager.cpp b/src/mbgl/text/glyph_manager.cpp index 949df607fc58..5d872963fdd9 100644 --- a/src/mbgl/text/glyph_manager.cpp +++ b/src/mbgl/text/glyph_manager.cpp @@ -7,6 +7,10 @@ #include #include #include +#include +#include + +#include namespace mbgl { @@ -16,11 +20,12 @@ GlyphManager::GlyphManager(std::unique_ptr localGlyphRaste : observer(&nullObserver), localGlyphRasterizer(std::move(localGlyphRasterizer_)) {} -GlyphManager::~GlyphManager() = default; +GlyphManager::~GlyphManager() { + hbShapers.clear(); // clear harfbuzz + freetype face before library; +} void GlyphManager::getGlyphs(GlyphRequestor& requestor, GlyphDependencies glyphDependencies, FileSource& fileSource) { auto dependencies = std::make_shared(std::move(glyphDependencies)); - { std::lock_guard readWriteLock(rwLock); // Figure out which glyph ranges need to be fetched. For each range that @@ -28,7 +33,7 @@ void GlyphManager::getGlyphs(GlyphRequestor& requestor, GlyphDependencies glyphD // shared pointer containing the dependencies. When the shared pointer // becomes unique, we know that all the dependencies for that requestor have // been fetched, and can notify it of completion. - for (const auto& dependency : *dependencies) { + for (const auto& dependency : dependencies->glyphs) { const FontStack& fontStack = dependency.first; Entry& entry = entries[fontStack]; @@ -75,12 +80,26 @@ void GlyphManager::requestRange(GlyphRequest& request, if (request.req) { return; } + Resource res(Resource::Kind::Unknown, ""); + switch (range.type) { + case GlyphIDType::FontPBF: + res = Resource::glyphs(glyphURL, fontStack, std::pair{range.first, range.second}); + break; + default: { + std::string url = getFontFaceURL(range.type); + if (url.size()) { + res = Resource::fontFace(url); + } else { + Log::Error(Event::Style, "Try download a glyph doesn't in current faces"); + } + + } break; + } observer->onGlyphsRequested(fontStack, range); request.req = fileSource.request( - Resource::glyphs(glyphURL, fontStack, range), - [this, fontStack, range](const Response& res) { processResponse(res, fontStack, range); }); + res, [this, fontStack, range](const Response& response) { processResponse(response, fontStack, range); }); } void GlyphManager::processResponse(const Response& res, const FontStack& fontStack, const GlyphRange& range) { @@ -103,7 +122,15 @@ void GlyphManager::processResponse(const Response& res, const FontStack& fontSta std::vector glyphs; try { - glyphs = parseGlyphPBF(range, *res.data); + if (range.type == GlyphIDType::FontPBF) { + glyphs = parseGlyphPBF(range, *res.data); + } else { + if (loadHBShaper(fontStack, range.type, *res.data)) { + Glyph temp; + temp.id = GlyphID(0, range.type); + glyphs.emplace_back(std::move(temp)); + } + } } catch (...) { observer->onGlyphsError(fontStack, range, std::current_exception()); return; @@ -141,7 +168,7 @@ void GlyphManager::setObserver(GlyphManagerObserver* observer_) { void GlyphManager::notify(GlyphRequestor& requestor, const GlyphDependencies& glyphDependencies) { GlyphMap response; - for (const auto& dependency : glyphDependencies) { + for (const auto& dependency : glyphDependencies.glyphs) { const FontStack& fontStack = dependency.first; const GlyphIDs& glyphIDs = dependency.second; @@ -158,7 +185,7 @@ void GlyphManager::notify(GlyphRequestor& requestor, const GlyphDependencies& gl } } - requestor.onGlyphsAvailable(response); + requestor.onGlyphsAvailable(response, glyphDependencies.shapes); } void GlyphManager::removeRequestor(GlyphRequestor& requestor) { @@ -175,4 +202,68 @@ void GlyphManager::evict(const std::set& keep) { util::erase_if(entries, [&](const auto& entry) { return keep.count(entry.first) == 0; }); } +std::shared_ptr GlyphManager::getHBShaper(FontStack fontStack, GlyphIDType type) { + if (hbShapers.find(fontStack) != hbShapers.end()) { + auto& glyphs = hbShapers[fontStack]; + if (glyphs.find(type) != glyphs.end()) { + return glyphs[type]; + } + } + + return nullptr; +} + +bool GlyphManager::loadHBShaper(const FontStack& fontStack, GlyphIDType type, const std::string& data) { + auto shaper = std::make_shared(type, data, ftLibrary); + if (!shaper->valid()) return false; + hbShapers[fontStack][type] = shaper; + return true; +} + +Immutable GlyphManager::getGlyph(const FontStack& fontStack, GlyphID glyphID) { + auto& entry = entries[fontStack]; + if (entry.glyphs.find(glyphID) != entry.glyphs.end()) return entry.glyphs.at(glyphID); + + if (glyphID.complex.type != FontPBF) { + auto shaper = getHBShaper(fontStack, glyphID.complex.type); + if (shaper) { + auto glyph = shaper->rasterizeGlyph(glyphID); + + glyph.bitmap = util::transformRasterToSDF(glyph.bitmap, 8, .25); + entry.glyphs.emplace(glyphID, makeMutable(std::move(glyph))); + return entry.glyphs.at(glyphID); + } + } + + Glyph empty; + + return makeMutable(std::move(empty)); +} + +void GlyphManager::hbShaping(const std::u16string& text, + const FontStack& font, + GlyphIDType type, + std::vector& glyphIDs, + std::vector& adjusts) { + auto shaper = getHBShaper(font, type); + if (shaper) { + shaper->createComplexGlyphIDs(text, glyphIDs, adjusts); + } +} + +std::string GlyphManager::getFontFaceURL(GlyphIDType type) { + std::string url; + + if (fontFaces) { + for (auto& face : *fontFaces) { + if (face.type == type) { + url = face.url; + break; + } + } + } + + return url; +} + } // namespace mbgl diff --git a/src/mbgl/text/glyph_manager.hpp b/src/mbgl/text/glyph_manager.hpp index 23cb15f753ee..57abba74ae5f 100644 --- a/src/mbgl/text/glyph_manager.hpp +++ b/src/mbgl/text/glyph_manager.hpp @@ -11,15 +11,30 @@ #include #include +#include "harfbuzz.hpp" + namespace mbgl { class FileSource; class AsyncRequest; class Response; +struct HBShapeResult { + std::u16string str; + + std::shared_ptr> adjusts; + + HBShapeResult() {} + + HBShapeResult(const std::u16string &str_, std::shared_ptr> adjusts_) + : str(str_), + adjusts(adjusts_) {} +}; +using HBShapeResults = std::map>>; + class GlyphRequestor { public: - virtual void onGlyphsAvailable(GlyphMap) = 0; + virtual void onGlyphsAvailable(GlyphMap, HBShapeRequests) = 0; protected: virtual ~GlyphRequestor() = default; @@ -27,8 +42,8 @@ class GlyphRequestor { class GlyphManager { public: - GlyphManager(const GlyphManager&) = delete; - GlyphManager& operator=(const GlyphManager&) = delete; + GlyphManager(const GlyphManager &) = delete; + GlyphManager &operator=(const GlyphManager &) = delete; explicit GlyphManager( std::unique_ptr = std::make_unique(std::optional())); ~GlyphManager(); @@ -38,24 +53,40 @@ class GlyphManager { // available, GlyphManager will provide them to the requestor immediately. // Otherwise, it makes a request on the FileSource is made for each range // needed, and notifies the observer when all are complete. - void getGlyphs(GlyphRequestor&, GlyphDependencies, FileSource&); - void removeRequestor(GlyphRequestor&); + void getGlyphs(GlyphRequestor &, GlyphDependencies, FileSource &); + void removeRequestor(GlyphRequestor &); - void setURL(const std::string& url) { glyphURL = url; } + void setURL(const std::string &url) { glyphURL = url; } - void setObserver(GlyphManagerObserver*); + void setObserver(GlyphManagerObserver *); // Remove glyphs for all but the supplied font stacks. - void evict(const std::set&); + void evict(const std::set &); + + Immutable getGlyph(const FontStack &, GlyphID); + + void setFontFaces(std::shared_ptr faces) { fontFaces = faces; } + + std::shared_ptr getHBShaper(FontStack, GlyphIDType); + + void hbShaping(const std::u16string &text, + const FontStack &font, + GlyphIDType type, + std::vector &glyphIDs, + std::vector &adjusts); + + std::shared_ptr getFontFaces() { return fontFaces; } + + std::string getFontFaceURL(GlyphIDType type); private: - Glyph generateLocalSDF(const FontStack& fontStack, GlyphID glyphID); + Glyph generateLocalSDF(const FontStack &fontStack, GlyphID glyphID); std::string glyphURL; struct GlyphRequest { bool parsed = false; std::unique_ptr req; - std::unordered_map> requestors; + std::unordered_map> requestors; }; struct Entry { @@ -65,13 +96,19 @@ class GlyphManager { std::unordered_map entries; - void requestRange(GlyphRequest&, const FontStack&, const GlyphRange&, FileSource& fileSource); - void processResponse(const Response&, const FontStack&, const GlyphRange&); - void notify(GlyphRequestor&, const GlyphDependencies&); + void requestRange(GlyphRequest &, const FontStack &, const GlyphRange &, FileSource &fileSource); + void processResponse(const Response &, const FontStack &, const GlyphRange &); + void notify(GlyphRequestor &, const GlyphDependencies &); - GlyphManagerObserver* observer = nullptr; + GlyphManagerObserver *observer = nullptr; + // Shaping objects std::unique_ptr localGlyphRasterizer; + std::shared_ptr fontFaces; + + FreeTypeLibrary ftLibrary; + std::map>> hbShapers; + bool loadHBShaper(const FontStack &fontStack, GlyphIDType type, const std::string &data); std::recursive_mutex rwLock; }; diff --git a/src/mbgl/text/harfbuzz.cpp b/src/mbgl/text/harfbuzz.cpp new file mode 100644 index 000000000000..cb3767c86ae0 --- /dev/null +++ b/src/mbgl/text/harfbuzz.cpp @@ -0,0 +1,52 @@ +#include "harfbuzz.hpp" + +#ifdef MLN_TEXT_SHAPING_HARFBUZZ +#include "harfbuzz_impl.hpp" +#endif + +// TODO: return empty harfbuzz +namespace mbgl { + +#ifndef MLN_TEXT_SHAPING_HARFBUZZ + +class HBShaper::Impl { +public: + Impl(GlyphIDType, const std::string &, const FreeTypeLibrary &) {} + + bool valid() { return false; } + + void createComplexGlyphIDs(const std::u16string &, std::vector &, std::vector &) { + assert(false && "can't shaping text without harfbuzz."); + } + + Glyph rasterizeGlyph(const GlyphID &) { + assert(false && "can't rasterize glyph without harfbuzz + freetype."); + return {}; + } +}; + +#endif + +HBShaper::HBShaper(GlyphIDType type, const std::string &fontFileData, const FreeTypeLibrary &lib) { + impl = std::make_unique(type, fontFileData, lib); +} + +HBShaper::~HBShaper() { + impl.reset(); +} + +void HBShaper::createComplexGlyphIDs(const std::u16string &text, + std::vector &glyphIDs, + std::vector &adjusts) { + return impl->createComplexGlyphIDs(text, glyphIDs, adjusts); +} + +Glyph HBShaper::rasterizeGlyph(const GlyphID &glyph) { + return impl->rasterizeGlyph(glyph); +} + +bool HBShaper::valid() { + return impl->valid(); +} + +} // namespace mbgl diff --git a/src/mbgl/text/harfbuzz.hpp b/src/mbgl/text/harfbuzz.hpp new file mode 100644 index 000000000000..ce28befb39d1 --- /dev/null +++ b/src/mbgl/text/harfbuzz.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include + +#ifdef MLN_TEXT_SHAPING_HARFBUZZ +#include "freetype.hpp" +#endif + +namespace mbgl { + +#ifndef MLN_TEXT_SHAPING_HARFBUZZ +struct FreeTypeLibrary {}; +#endif + +struct HBShapeAdjust { + float x_offset; + float y_offset; + + float advance; // advanceX + + HBShapeAdjust(float x, float y, float a) + : x_offset(x), + y_offset(y), + advance(a) {} +}; + +class HBShaper { +public: + explicit HBShaper(GlyphIDType type, const std::string &fontFileData, const FreeTypeLibrary &lib); + ~HBShaper(); + + void createComplexGlyphIDs(const std::u16string &text, + std::vector &glyphIDs, + std::vector &adjusts); + Glyph rasterizeGlyph(const GlyphID &glyph); + + bool valid(); + +private: + class Impl; + + std::unique_ptr impl; +}; + +} // namespace mbgl diff --git a/src/mbgl/text/harfbuzz_impl.cpp b/src/mbgl/text/harfbuzz_impl.cpp new file mode 100644 index 000000000000..0347febab381 --- /dev/null +++ b/src/mbgl/text/harfbuzz_impl.cpp @@ -0,0 +1,108 @@ +#include "harfbuzz_impl.hpp" + +#include + +namespace mbgl { + +static hb_language_t getDefaultLanguage() { + static hb_language_t language = hb_language_get_default(); + return language; +} + +static hb_script_t getUnicodeScript(hb_codepoint_t u) { + static hb_unicode_funcs_t *unicode_funcs; + + unicode_funcs = hb_unicode_funcs_get_default(); + + /* Make combining marks inherit the script of their bases, regardless of + * their own script. + */ + if (hb_unicode_general_category(unicode_funcs, u) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) + return HB_SCRIPT_INHERITED; + + return hb_unicode_script(unicode_funcs, u); +} + +HBShaper::Impl::Impl(GlyphIDType type_, const std::string &fontFileData, const FreeTypeLibrary &lib) + : type(type_), + face(fontFileData.data(), fontFileData.size(), lib) { + if (!face.isValid()) return; + + font = hb_ft_font_create(face.getFace(), NULL); + buffer = hb_buffer_create(); + + hb_buffer_allocation_successful(buffer); +} + +HBShaper::Impl::~Impl() { + if (!face.isValid()) return; + hb_buffer_destroy(buffer); + hb_font_destroy(font); +} +void HBShaper::Impl::createComplexGlyphIDs(const std::u16string &text, + std::vector &glyphIDs, + std::vector &adjusts) { + if (text.empty()) { + return; + } + + struct TextPart { + std::u16string text; + hb_script_t script; + }; + + std::vector textParts; + textParts.emplace_back(); + auto *lastTextPart = &textParts.back(); + lastTextPart->text = text[0]; + lastTextPart->script = getUnicodeScript(text[0]); + + for (std::size_t i = 1; i < text.size(); ++i) { + auto ch = text[i]; + auto script = getUnicodeScript(text[i]); + + if (lastTextPart->script == script || script == HB_SCRIPT_INHERITED) { + lastTextPart->text += (ch); + } else { + textParts.emplace_back(); + lastTextPart = &textParts.back(); + lastTextPart->text = (ch); + lastTextPart->script = script; + } + } + + for (auto &textPart : textParts) { + // Setup harfbuzz + hb_buffer_reset(buffer); + + hb_buffer_set_direction(buffer, HB_DIRECTION_LTR); + hb_buffer_set_script(buffer, textPart.script); + hb_buffer_set_language(buffer, getDefaultLanguage()); + size_t length = textPart.text.size(); + + hb_buffer_add_utf16(buffer, (const uint16_t *)textPart.text.c_str(), (int)length, 0, (int)length); + + // harfbuzz shaping + hb_shape(font, buffer, NULL, 0); + + // Get Harfbuzz adjustion + uint32_t glyphCount; + hb_glyph_info_t *glyphInfo = hb_buffer_get_glyph_infos(buffer, &glyphCount); + hb_glyph_position_t *glyphPos = hb_buffer_get_glyph_positions(buffer, &glyphCount); + + glyphIDs.reserve(glyphCount); + adjusts.reserve(glyphCount); + + for (uint32_t i = 0; i < glyphCount; ++i) { + glyphIDs.emplace_back(glyphInfo[i].codepoint, type); + + float x_advance = static_cast(glyphPos[i].x_advance / 64.0f); + float x_offset = static_cast(glyphPos[i].x_offset / 64.0f); + float y_offset = static_cast(-glyphPos[i].y_offset / 64.0f); + + adjusts.emplace_back(x_offset, y_offset, x_advance); + } + } +} + +} // namespace mbgl diff --git a/src/mbgl/text/harfbuzz_impl.hpp b/src/mbgl/text/harfbuzz_impl.hpp new file mode 100644 index 000000000000..7bbfbbe1e837 --- /dev/null +++ b/src/mbgl/text/harfbuzz_impl.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "freetype.hpp" +#include "harfbuzz.hpp" +#include + +struct hb_font_t; +struct hb_buffer_t; + +using hb_font_t = hb_font_t; +using hb_buffer_t = hb_buffer_t; + +namespace mbgl { + +class HBShaper::Impl { +public: + explicit Impl(GlyphIDType type_, const std::string &fontFileData, const FreeTypeLibrary &lib); + ~Impl(); + + void createComplexGlyphIDs(const std::u16string &text, + std::vector &glyphIDs, + std::vector &adjusts); + + Glyph rasterizeGlyph(const GlyphID &glyph) { return face.rasterizeGlyph(glyph); } + + bool valid() { return face.isValid(); } + +private: + GlyphIDType type; + FreeTypeFace face; + + hb_font_t *font; + hb_buffer_t *buffer; +}; + +} // namespace mbgl diff --git a/src/mbgl/text/shaping.cpp b/src/mbgl/text/shaping.cpp index 1d6b30e80dee..066795f5b5bd 100644 --- a/src/mbgl/text/shaping.cpp +++ b/src/mbgl/text/shaping.cpp @@ -246,6 +246,9 @@ float determineAverageLineWidth(const TaggedString& logicalInput, for (std::size_t i = 0; i < logicalInput.length(); i++) { const SectionOptions& section = logicalInput.getSection(i); + if (section.type != GlyphIDType::FontPBF) { + continue; + } char16_t codePoint = logicalInput.getCharCodeAt(i); totalWidth += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, layoutTextSize, spacing); } @@ -440,17 +443,27 @@ void shapeLines(Shaping& shaping, for (std::size_t i = 0; i < line.length(); i++) { const std::size_t sectionIndex = line.getSectionIndex(i); const SectionOptions& section = line.sectionAt(sectionIndex); - char16_t codePoint = line.getCharCodeAt(i); + const HBShapeAdjust* adjust = nullptr; + if (section.adjusts) { + assert(section.startIndex >= 0); + if (i >= (std::size_t)section.startIndex && i - section.startIndex < section.adjusts->size()) { + adjust = &((*section.adjusts)[i - section.startIndex]); + } + } + GlyphID codePoint(line.getCharCodeAt(i), section.type); + double baselineOffset = 0.0; Rect rect; GlyphMetrics metrics; float advance = 0.0f; + float xHBOffset = 0.0f; + float yHBOffset = 0.0f; float verticalAdvance = util::ONE_EM; double sectionScale = section.scale; assert(sectionScale); const bool vertical = !( - writingMode == WritingModeType::Horizontal || + writingMode == WritingModeType::Horizontal || codePoint.complex.type != GlyphIDType::FontPBF || // Don't verticalize glyphs that have no upright orientation // if vertical placement is disabled. (!allowVerticalPlacement && !util::i18n::hasUprightVerticalOrientation(codePoint)) || @@ -482,6 +495,17 @@ void shapeLines(Shaping& shaping, metrics = (*glyph->second)->metrics; } advance = static_cast(metrics.advance); + + if (adjust) advance = adjust->advance; + if (adjust) { + xHBOffset = (float)(adjust->x_offset * section.scale); + yHBOffset = (float)(adjust->y_offset * section.scale); + } + if (advance < 0.01f) { + // Advance is 0, this glyph should align to the preview glyph remove spacing + xHBOffset -= spacing; + } + // We don't know the baseline, but since we're laying out // at 24 points, we can calculate how much it will move when // we scale up or down. @@ -522,8 +546,8 @@ void shapeLines(Shaping& shaping, if (!vertical) { positionedGlyphs.emplace_back(codePoint, - x, - y + static_cast(baselineOffset), + x + xHBOffset, + y + static_cast(baselineOffset) + yHBOffset, vertical, section.fontStackHash, static_cast(sectionScale), @@ -531,7 +555,10 @@ void shapeLines(Shaping& shaping, metrics, section.imageID, sectionIndex); - x += advance * static_cast(sectionScale) + spacing; + if (advance > 0.01f) { + // Only thce glyph with advance should increase spacing + x += advance * static_cast(sectionScale) + spacing; + } } else { positionedGlyphs.emplace_back(codePoint, x, @@ -598,21 +625,123 @@ Shaping getShaping(const TaggedString& formattedString, bool allowVerticalPlacement) { assert(layoutTextSize); std::vector reorderedLines; - if (formattedString.sectionCount() == 1) { - auto untaggedLines = bidi.processText( - formattedString.rawText(), - determineLineBreaks(formattedString, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize)); - for (const auto& line : untaggedLines) { - reorderedLines.emplace_back(line, formattedString.sectionAt(0)); - } - } else { - auto processedLines = bidi.processStyledText( - formattedString.getStyledText(), - determineLineBreaks(formattedString, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize)); - for (const auto& line : processedLines) { - reorderedLines.emplace_back(line, formattedString.getSections()); + if (formattedString.rawText().length()) { + if (formattedString.sectionCount() == 1) { + if (formattedString.getSection(0).type != GlyphIDType::FontPBF) { + reorderedLines.emplace_back(formattedString); + } else { + auto untaggedLines = bidi.processText( + formattedString.rawText(), + determineLineBreaks(formattedString, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize)); + for (const auto& line : untaggedLines) { + reorderedLines.emplace_back(line, formattedString.sectionAt(0)); + } + } + } else { + StyledText subString; + GlyphIDType sectionType = GlyphIDType::FontPBF; + auto strLen = formattedString.getStyledText().first.length(); + + std::vector formattedSections = formattedString.getSections(); + if (formattedSections.size() > 0) sectionType = formattedSections[0].type; + + std::vector pendStrings; + + auto processAline = [&](StyledText line) { + reorderedLines.emplace_back(line, formattedSections); + + auto cutLens = (int32_t)line.first.length(); + + for (auto& sec : formattedSections) { + sec.startIndex -= cutLens; + } + }; + + auto applyLineAndPendingStrings = [&](StyledText line) { + if (pendStrings.empty()) { + processAline(line); + } else { + StyledText combine; + for (auto& pendString : pendStrings) { + combine.first.append(pendString.first); + combine.second.insert(combine.second.end(), pendString.second.begin(), pendString.second.end()); + } + pendStrings.clear(); + combine.first.append(line.first); + combine.second.insert(combine.second.end(), line.second.begin(), line.second.end()); + processAline(combine); + } + }; + + auto applySubString = [&]() { + if (subString.first.length()) { + if (GlyphIDType::FontPBF == sectionType) { + auto processedLines = bidi.processStyledText( + subString, + determineLineBreaks({subString, formattedString.getSections()}, + spacing, + maxWidth, + glyphMap, + imagePositions, + layoutTextSize)); + + auto lastChar = u'x'; + if (!subString.first.empty()) lastChar = subString.first[subString.first.length() - 1]; + + if (u'\n' == lastChar) { + for (const auto& line : processedLines) { + applyLineAndPendingStrings(line); + } + } else { + auto lineCount = processedLines.size(); + if (lineCount > 1) { + for (size_t lineIndex = 0; lineIndex < lineCount - 1; ++lineIndex) { + applyLineAndPendingStrings(processedLines[lineIndex]); + } + } + if (lineCount) { + pendStrings.push_back(processedLines[lineCount - 1]); + } + } + + } else { + pendStrings.push_back(subString); + } + } + }; + + for (size_t charIndex = 0; charIndex < strLen; ++charIndex) { + auto& ch = formattedString.getStyledText().first[charIndex]; + auto& sec = formattedString.getStyledText().second[charIndex]; + auto& secType = formattedSections[sec].type; + + if (sectionType != secType) { + applySubString(); + + subString.first.clear(); + subString.second.clear(); + + sectionType = secType; + } + + subString.first += ch; + subString.second.emplace_back(sec); + } + + applySubString(); + + if (!pendStrings.empty()) { + StyledText combine; + for (auto& pendString : pendStrings) { + combine.first.append(pendString.first); + combine.second.insert(combine.second.end(), pendString.second.begin(), pendString.second.end()); + } + pendStrings.clear(); + processAline(combine); + } } } + Shaping shaping(translate[0], translate[1], writingMode); shapeLines(shaping, reorderedLines, diff --git a/src/mbgl/text/tagged_string.cpp b/src/mbgl/text/tagged_string.cpp index e6872923640e..911bd2329f17 100644 --- a/src/mbgl/text/tagged_string.cpp +++ b/src/mbgl/text/tagged_string.cpp @@ -10,18 +10,38 @@ char16_t PUAend = u'\uF8FF'; namespace mbgl { -void TaggedString::addTextSection(const std::u16string& sectionText, +void TaggedString::addTextSection(const std::u16string §ionText, double scale, - const FontStack& fontStack, + const FontStack &fontStack, + GlyphIDType type, + bool keySection, std::optional textColor) { styledText.first += sectionText; - sections.emplace_back(scale, fontStack, std::move(textColor)); + auto startIndex = static_cast(styledText.first.size()); + sections.emplace_back(scale, fontStack, type, startIndex, std::move(textColor)); styledText.second.resize(styledText.first.size(), static_cast(sections.size() - 1)); supportsVerticalWritingMode = std::nullopt; + if (type != GlyphIDType::FontPBF) hasNeedShapeTextVal = true; + sections[sections.size() - 1].keySection = keySection; } -void TaggedString::addImageSection(const std::string& imageID) { - const auto& nextImageSectionCharCode = getNextImageSectionCharCode(); +void TaggedString::addTextSection(const std::u16string §ionText, + double scale, + const FontStack &fontStack, + GlyphIDType type, + std::shared_ptr> &adjusts, + bool keySection, + std::optional textColor) { + sections.emplace_back(scale, fontStack, type, static_cast(styledText.first.size()), std::move(textColor)); + styledText.first += sectionText; + styledText.second.resize(styledText.first.size(), static_cast(sections.size() - 1)); + if (type != GlyphIDType::FontPBF) hasNeedShapeTextVal = true; + if (adjusts) sections[sections.size() - 1].adjusts = adjusts; + sections[sections.size() - 1].keySection = keySection; +} + +void TaggedString::addImageSection(const std::string &imageID) { + const auto &nextImageSectionCharCode = getNextImageSectionCharCode(); if (!nextImageSectionCharCode) { Log::Warning(Event::Style, "Exceeded maximum number of images in a label."); return; @@ -47,12 +67,38 @@ std::optional TaggedString::getNextImageSectionCharCode() { void TaggedString::trim() { std::size_t beginningWhitespace = styledText.first.find_first_not_of(u" \t\n\v\f\r"); + + for (size_t i = 0; (i < beginningWhitespace) && i < styledText.first.length(); ++i) { + auto &sec = getSection(i); + if (sec.type != FontPBF) { + beginningWhitespace = i; + break; + } + } + if (beginningWhitespace == std::u16string::npos) { + for (auto §ion : sections) { + section.startIndex = 0; + } // Entirely whitespace styledText.first.clear(); styledText.second.clear(); } else { - std::size_t trailingWhitespace = styledText.first.find_last_not_of(u" \t\n\v\f\r") + 1; + int trailingWhitespace = static_cast(styledText.first.find_last_not_of(u" \t\n\v\f\r") + 1); + + if (beginningWhitespace) { + for (auto §ion : sections) { + section.startIndex -= beginningWhitespace; + } + } + + for (int i = static_cast(styledText.first.length()) - 1; i >= trailingWhitespace; --i) { + auto &sec = getSection(i); + if (sec.type != FontPBF) { + trailingWhitespace = i + 1; + break; + } + } styledText.first = styledText.first.substr(beginningWhitespace, trailingWhitespace - beginningWhitespace); styledText.second = std::vector(styledText.second.begin() + beginningWhitespace, @@ -70,12 +116,26 @@ double TaggedString::getMaxScale() const { void TaggedString::verticalizePunctuation() { // Relies on verticalization changing characters in place so that style indices don't need updating - styledText.first = util::i18n::verticalizePunctuation(styledText.first); + auto replaced = util::i18n::verticalizePunctuation(styledText.first); + for (size_t i = 0; i < replaced.length(); ++i) { + auto &sec = getSection(i); + if (sec.type != GlyphIDType::FontPBF) replaced[i] = styledText.first[i]; + } + styledText.first = replaced; } bool TaggedString::allowsVerticalWritingMode() { if (!supportsVerticalWritingMode) { - supportsVerticalWritingMode = util::i18n::allowsVerticalWritingMode(rawText()); + bool allows = false; + for (size_t i = 0; i < styledText.first.length(); ++i) { + auto chr = styledText.first[i]; + auto &sec = getSection(i); + if (sec.type == GlyphIDType::FontPBF && util::i18n::hasUprightVerticalOrientation(chr)) { + allows = true; + break; + } + } + supportsVerticalWritingMode = allows; } return *supportsVerticalWritingMode; } diff --git a/src/mbgl/text/tagged_string.hpp b/src/mbgl/text/tagged_string.hpp index a402ae577d05..1c2b7d84a588 100644 --- a/src/mbgl/text/tagged_string.hpp +++ b/src/mbgl/text/tagged_string.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -9,21 +10,48 @@ namespace mbgl { struct SectionOptions { - SectionOptions(double scale_, FontStack fontStack_, std::optional textColor_ = std::nullopt) + SectionOptions(double scale_, + FontStack fontStack_, + GlyphIDType type_, + uint32_t startIndex_, + std::optional textColor_ = std::nullopt) : scale(scale_), - fontStackHash(FontStackHasher()(fontStack_)), - fontStack(std::move(fontStack_)), + fontStack(fontStack_), + fontStackHash(FontStackHasher()(std::move(fontStack_))), + type(type_), + startIndex(startIndex_), + textColor(std::move(textColor_)) {} + + SectionOptions(double scale_, + FontStackHash fontStackHash_, + GlyphIDType type_, + uint32_t startIndex_, + std::optional textColor_ = std::nullopt) + : scale(scale_), + fontStackHash(fontStackHash_), + type(type_), + startIndex(startIndex_), textColor(std::move(textColor_)) {} explicit SectionOptions(std::string imageID_) : scale(1.0), + type(GlyphIDType::FontPBF), imageID(std::move(imageID_)) {} double scale; - FontStackHash fontStackHash; FontStack fontStack; - std::optional textColor; + FontStackHash fontStackHash; + + GlyphIDType type; + + std::shared_ptr> adjusts; + + int32_t startIndex; + bool keySection = true; + std::optional imageID; + + std::optional textColor; }; /** @@ -70,6 +98,16 @@ struct TaggedString { void addTextSection(const std::u16string& text, double scale, const FontStack& fontStack, + GlyphIDType type, + bool keySection = true, + std::optional textColor_ = std::nullopt); + + void addTextSection(const std::u16string& text, + double scale, + const FontStack& fontStack, + GlyphIDType type, + std::shared_ptr>& adjusts, + bool keySection = true, std::optional textColor_ = std::nullopt); void addImageSection(const std::string& imageID); @@ -86,6 +124,12 @@ struct TaggedString { void verticalizePunctuation(); bool allowsVerticalWritingMode(); + bool hbShaped() const { return textHBShaped; } + + void setHBShaped(bool shaped) { textHBShaped = shaped; } + + bool hasNeedHBShapeText() const { return hasNeedShapeTextVal; } + private: std::optional getNextImageSectionCharCode(); @@ -96,6 +140,8 @@ struct TaggedString { // Max number of images within a text is 6400 U+E000–U+F8FF // that covers Basic Multilingual Plane Unicode Private Use Area (PUA). char16_t imageSectionID = 0u; + bool textHBShaped = false; + bool hasNeedShapeTextVal = false; }; } // namespace mbgl diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 1d71c8b99084..0fe0cf2535ed 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -202,7 +202,8 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_, parameters.mode, parameters.pixelRatio, parameters.debugOptions & MapDebugOptions::Collision, - parameters.dynamicTextureAtlas), + parameters.dynamicTextureAtlas, + parameters.glyphManager->getFontFaces()), fileSource(parameters.fileSource), glyphManager(parameters.glyphManager), imageManager(parameters.imageManager), @@ -373,10 +374,48 @@ void GeometryTile::onError(std::exception_ptr err, const uint64_t resultCorrelat observer->onTileError(*this, std::move(err)); } -void GeometryTile::onGlyphsAvailable(GlyphMap glyphs) { +void GeometryTile::onGlyphsAvailable(GlyphMap glyphMap, [[maybe_unused]] HBShapeRequests requests) { MLN_TRACE_FUNC(); - worker.self().invoke(&GeometryTileWorker::onGlyphsAvailable, std::move(glyphs)); + HBShapeResults results; +#ifdef MLN_TEXT_SHAPING_HARFBUZZ + for (auto& fontStackIT : requests) { + auto fontStack = fontStackIT.first; + auto& fontTypes = fontStackIT.second; + for (auto& typesIT : fontTypes) { + auto type = typesIT.first; + auto& strs = typesIT.second; + + for (auto& str : strs) { + std::vector shapedGlyphIDs; + std::shared_ptr> shapedAdjusts = + std::make_shared>(); + glyphManager->hbShaping(str, fontStack, type, shapedGlyphIDs, *shapedAdjusts); + std::u16string shapedstr; + + shapedstr.reserve(shapedGlyphIDs.size()); + for (auto& glyphID : shapedGlyphIDs) { + shapedstr += glyphID.complex.code; + + auto fontStackHash = FontStackHasher()(fontStack); + bool needShape = true; + if (glyphMap.find(fontStackHash) != glyphMap.end()) { + auto& glyphs = glyphMap[fontStackHash]; + if (glyphs.find(glyphID) != glyphs.end()) needShape = false; + } + if (needShape) { + auto glyph = glyphManager->getGlyph(fontStack, glyphID); + glyphMap[fontStackHash].emplace(glyph->id, glyph); + } + } + + results[fontStack][type][str] = HBShapeResult{shapedstr, + shapedAdjusts}; //.emplace(str, shapedstr, shapedAdjusts); + } + } + } +#endif // MLN_TEXT_SHAPING_HARFBUZZ + worker.self().invoke(&GeometryTileWorker::onGlyphsAvailable, std::move(glyphMap), std::move(results)); } void GeometryTile::getGlyphs(GlyphDependencies glyphDependencies) { diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index de49123b40f6..cdb25f41a232 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -45,7 +45,7 @@ class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor { void setLayers(const std::vector>&) override; void setShowCollisionBoxes(bool showCollisionBoxes) override; - void onGlyphsAvailable(GlyphMap) override; + void onGlyphsAvailable(GlyphMap, HBShapeRequests) override; void onImagesAvailable(ImageMap, ImageMap, ImageVersionMap versionMap, uint64_t imageCorrelationID) override; void getGlyphs(GlyphDependencies); diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index 4935bc5f3382..d36a18acc153 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -38,7 +38,8 @@ GeometryTileWorker::GeometryTileWorker(ActorRef self_, const MapMode mode_, const float pixelRatio_, const bool showCollisionBoxes_, - gfx::DynamicTextureAtlasPtr dynamicTextureAtlas_) + gfx::DynamicTextureAtlasPtr dynamicTextureAtlas_, + std::shared_ptr fontFaces_) : self(std::move(self_)), parent(std::move(parent_)), scheduler(scheduler_), @@ -48,7 +49,8 @@ GeometryTileWorker::GeometryTileWorker(ActorRef self_, mode(mode_), pixelRatio(pixelRatio_), showCollisionBoxes(showCollisionBoxes_), - dynamicTextureAtlas(dynamicTextureAtlas_) {} + dynamicTextureAtlas(dynamicTextureAtlas_), + fontFaces(fontFaces_) {} GeometryTileWorker::~GeometryTileWorker() { MLN_TRACE_FUNC(); @@ -297,7 +299,7 @@ void GeometryTileWorker::coalesce() { self.invoke(&GeometryTileWorker::coalesced); } -void GeometryTileWorker::onGlyphsAvailable(GlyphMap newGlyphMap) { +void GeometryTileWorker::onGlyphsAvailable(GlyphMap newGlyphMap, HBShapeResults results) { MLN_TRACE_FUNC(); for (auto& newFontGlyphs : newGlyphMap) { @@ -305,7 +307,7 @@ void GeometryTileWorker::onGlyphsAvailable(GlyphMap newGlyphMap) { Glyphs& newGlyphs = newFontGlyphs.second; Glyphs& glyphs = glyphMap[fontStack]; - for (auto& pendingGlyphDependency : pendingGlyphDependencies) { + for (auto& pendingGlyphDependency : pendingGlyphDependencies.glyphs) { // Linear lookup here to handle reverse of FontStackHash -> FontStack, // since dependencies need the full font stack name to make a request // There should not be many fontstacks to look through @@ -316,12 +318,39 @@ void GeometryTileWorker::onGlyphsAvailable(GlyphMap newGlyphMap) { std::optional>& glyph = newGlyph.second; if (pendingGlyphIDs.erase(glyphID)) { - glyphs.emplace(glyphID, std::move(glyph)); + if (!(glyphID.complex.code == 0 && glyphID.complex.type != GlyphIDType::FontPBF)) { + glyphs.emplace(glyphID, std::move(glyph)); + } } } } } } + + if (!results.empty()) { + pendingGlyphDependencies.shapes.clear(); + + for (auto& newFontGlyphs : newGlyphMap) { + FontStackHash fontStack = newFontGlyphs.first; + Glyphs& newGlyphs = newFontGlyphs.second; + + Glyphs& glyphs = glyphMap[fontStack]; + for (auto& newGlyph : newGlyphs) { + const GlyphID& glyphID = newGlyph.first; + std::optional>& glyph = newGlyph.second; + + if (!(glyphID.complex.code == 0 && glyphID.complex.type != GlyphIDType::FontPBF)) + glyphs.emplace(glyphID, std::move(glyph)); + } + } + + for (auto& layout : layouts) { + if (layout && layout->needFinalizeSymbols()) { + layout->finalizeSymbols(results); + } + } + } + symbolDependenciesChanged(); } @@ -344,15 +373,25 @@ void GeometryTileWorker::onImagesAvailable(ImageMap newIconMap, void GeometryTileWorker::requestNewGlyphs(const GlyphDependencies& glyphDependencies) { MLN_TRACE_FUNC(); - for (auto& fontDependencies : glyphDependencies) { + for (auto& fontDependencies : glyphDependencies.glyphs) { auto fontGlyphs = glyphMap.find(FontStackHasher()(fontDependencies.first)); for (auto glyphID : fontDependencies.second) { if (fontGlyphs == glyphMap.end() || fontGlyphs->second.find(glyphID) == fontGlyphs->second.end()) { - pendingGlyphDependencies[fontDependencies.first].insert(glyphID); + pendingGlyphDependencies.glyphs[fontDependencies.first].insert(glyphID); + } + } + } + for (auto& fontDependencies : glyphDependencies.shapes) { + auto& fontStack = fontDependencies.first; + for (const auto& typeDependencies : fontDependencies.second) { + auto& type = typeDependencies.first; + auto& strs = typeDependencies.second; + for (auto& str : strs) { + pendingGlyphDependencies.shapes[fontStack][type].insert(str); } } } - if (!pendingGlyphDependencies.empty()) { + if (!pendingGlyphDependencies.glyphs.empty()) { parent.invoke(&GeometryTile::getGlyphs, pendingGlyphDependencies); } } @@ -433,7 +472,9 @@ void GeometryTileWorker::parse() { // images/glyphs are available to add the features to the buckets. if (leaderImpl.getTypeInfo()->layout == LayerTypeInfo::Layout::Required) { std::unique_ptr layout = LayerManager::get()->createLayout( - {parameters, glyphDependencies, imageDependencies, availableImages}, std::move(geometryLayer), group); + {parameters, fontFaces, glyphDependencies, imageDependencies, availableImages}, + std::move(geometryLayer), + group); if (layout->hasDependencies()) { layouts.push_back(std::move(layout)); } else { @@ -478,7 +519,7 @@ void GeometryTileWorker::parse() { } bool GeometryTileWorker::hasPendingDependencies() const { - for (auto& glyphDependency : pendingGlyphDependencies) { + for (auto& glyphDependency : pendingGlyphDependencies.glyphs) { if (!glyphDependency.second.empty()) { return true; } diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index eea005dfdb72..362bd6a5ccf4 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,8 @@ class GeometryTileWorker { MapMode, float pixelRatio, bool showCollisionBoxes_, - gfx::DynamicTextureAtlasPtr); + gfx::DynamicTextureAtlasPtr, + std::shared_ptr fontFaces); ~GeometryTileWorker(); void setLayers(std::vector>, @@ -54,7 +56,8 @@ class GeometryTileWorker { void reset(uint64_t correlationID_); void setShowCollisionBoxes(bool showCollisionBoxes_, uint64_t correlationID_); - void onGlyphsAvailable(GlyphMap newGlyphMap); + void onGlyphsAvailable(GlyphMap glyphs, HBShapeResults requests); + void onImagesAvailable(ImageMap newIconMap, ImageMap newPatternMap, ImageVersionMap versionMap, @@ -118,6 +121,8 @@ class GeometryTileWorker { bool firstLoad = true; gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; + + std::shared_ptr fontFaces; }; } // namespace mbgl diff --git a/src/mbgl/util/i18n.cpp b/src/mbgl/util/i18n.cpp index 3ca7dcc71cd1..b2b35ddb9069 100644 --- a/src/mbgl/util/i18n.cpp +++ b/src/mbgl/util/i18n.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -42,21 +43,22 @@ DEFINE_IS_IN_UNICODE_BLOCK(ArabicSupplement, 0x0750, 0x077F) // DEFINE_IS_IN_UNICODE_BLOCK(Syriac Supplement, 0x0860, 0x086F) DEFINE_IS_IN_UNICODE_BLOCK(ArabicExtendedA, 0x08A0, 0x08FF) // DEFINE_IS_IN_UNICODE_BLOCK(Devanagari, 0x0900, 0x097F) -// DEFINE_IS_IN_UNICODE_BLOCK(Bengali, 0x0980, 0x09FF) -// DEFINE_IS_IN_UNICODE_BLOCK(Gurmukhi, 0x0A00, 0x0A7F) -// DEFINE_IS_IN_UNICODE_BLOCK(Gujarati, 0x0A80, 0x0AFF) -// DEFINE_IS_IN_UNICODE_BLOCK(Oriya, 0x0B00, 0x0B7F) -// DEFINE_IS_IN_UNICODE_BLOCK(Tamil, 0x0B80, 0x0BFF) -// DEFINE_IS_IN_UNICODE_BLOCK(Telugu, 0x0C00, 0x0C7F) -// DEFINE_IS_IN_UNICODE_BLOCK(Kannada, 0x0C80, 0x0CFF) -// DEFINE_IS_IN_UNICODE_BLOCK(Malayalam, 0x0D00, 0x0D7F) -// DEFINE_IS_IN_UNICODE_BLOCK(Sinhala, 0x0D80, 0x0DFF) -// DEFINE_IS_IN_UNICODE_BLOCK(Thai, 0x0E00, 0x0E7F) -// DEFINE_IS_IN_UNICODE_BLOCK(Lao, 0x0E80, 0x0EFF) -// DEFINE_IS_IN_UNICODE_BLOCK(Tibetan, 0x0F00, 0x0FFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Bengali, 0x0980, 0x09FF) +// DEFINE_IS_IN_UNICODE_BLOCK(Gurmukhi, 0x0A00, 0x0A7F) +// DEFINE_IS_IN_UNICODE_BLOCK(Gujarati, 0x0A80, 0x0AFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Oriya, 0x0B00, 0x0B7F) +// DEFINE_IS_IN_UNICODE_BLOCK(Tamil, 0x0B80, 0x0BFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Telugu, 0x0C00, 0x0C7F) +// DEFINE_IS_IN_UNICODE_BLOCK(Kannada, 0x0C80, 0x0CFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Malayalam, 0x0D00, 0x0D7F) +// DEFINE_IS_IN_UNICODE_BLOCK(Sinhala, 0x0D80, 0x0DFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Thai, 0x0E00, 0x0E7F) +// DEFINE_IS_IN_UNICODE_BLOCK(Lao, 0x0E80, 0x0EFF) +// DEFINE_IS_IN_UNICODE_BLOCK(Tibetan, 0x0F00, 0x0FFF) // DEFINE_IS_IN_UNICODE_BLOCK(Myanmar, 0x1000, 0x109F) -// DEFINE_IS_IN_UNICODE_BLOCK(Georgian, 0x10A0, 0x10FF) +// DEFINE_IS_IN_UNICODE_BLOCK(Georgian, 0x10A0, 0x10FF) DEFINE_IS_IN_UNICODE_BLOCK(HangulJamo, 0x1100, 0x11FF) + // DEFINE_IS_IN_UNICODE_BLOCK(Ethiopic, 0x1200, 0x137F) // DEFINE_IS_IN_UNICODE_BLOCK(EthiopicSupplement, 0x1380, 0x139F) // DEFINE_IS_IN_UNICODE_BLOCK(Cherokee, 0x13A0, 0x13FF) @@ -625,6 +627,11 @@ bool isWhitespace(char16_t chr) { return chr == u' ' || chr == u'\t' || chr == u'\n' || chr == u'\v' || chr == u'\f' || chr == u'\r'; } +bool isVariationSelector1(char16_t chr) { + return chr == 0xFE00; +} + } // namespace i18n } // namespace util + } // namespace mbgl diff --git a/src/mbgl/util/i18n.hpp b/src/mbgl/util/i18n.hpp index 9a33ad02852c..6d53aa3710d8 100644 --- a/src/mbgl/util/i18n.hpp +++ b/src/mbgl/util/i18n.hpp @@ -79,6 +79,8 @@ bool isCharInComplexShapingScript(char16_t chr); bool isWhitespace(char16_t chr); +bool isVariationSelector1(char16_t chr); + } // namespace i18n } // namespace util } // namespace mbgl diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 6481c8fd5aaa..342f4fb94e8c 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -1612,6 +1612,82 @@ TEST(Map, ObserveShaderRegistration) { EXPECT_EQ(observedRegistry, false); } +TEST(Map, ResourceError) { + MapTest<> test; + test.fileSource->glyphsResponse = [&](const Resource&) { + Response response; + response.error = std::make_unique(Response::Error::Reason::Server, "Font file Server failed"); + return response; + }; + + test.map.getStyle().loadJSON( + R"( +{ + "version": 8, + "zoom": 0, + "center": [-14.41400, 39.09187], + "sources": { + "mapbox": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "name": "ជនជាប់សង្ស័យ" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -14.4195556640625, + 39.091699613104595 + ], + [ + 102.3046875, + 39.36827914916014 + ] + ] + } + } + ] + } + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "fonts": "local://glyphs/{fontstack}/{language}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "lines-symbol", + "type": "symbol", + "source": "mapbox", + "layout": { + "text-field": "{name}", + "symbol-placement": "point", + "symbol-spacing": 150, + "text-allow-overlap": true, + "text-font": [ "abc" ], + "text-size": 24 + } + } + ] +})"); + try { + test.frontend.render(test.map); + } catch (...) { + auto error = std::current_exception(); // captur + EXPECT_EQ(mbgl::util::toString(error), "Font file Server failed"); + } +} + TEST(Map, StencilOverflow) { MapTest<> test; diff --git a/test/text/glyph_manager.test.cpp b/test/text/glyph_manager.test.cpp index 944de0970142..77daff69a9dc 100644 --- a/test/text/glyph_manager.test.cpp +++ b/test/text/glyph_manager.test.cpp @@ -135,7 +135,7 @@ class StubGlyphManagerObserver : public GlyphManagerObserver { class StubGlyphRequestor : public GlyphRequestor { public: - void onGlyphsAvailable(GlyphMap glyphs) override { + void onGlyphsAvailable(GlyphMap glyphs, HBShapeRequests) override { if (glyphsAvailable) glyphsAvailable(std::move(glyphs)); } @@ -181,7 +181,7 @@ TEST(GlyphManager, LoadingSuccess) { test.observer.glyphsLoaded = [&](const FontStack& fontStack, const GlyphRange& range) { ASSERT_EQ(fontStack, FontStack{{"Test Stack"}}); - ASSERT_EQ(range, GlyphRange(0, 255)); + ASSERT_EQ(range, GlyphRange(0, 255, GlyphIDType::FontPBF)); }; test.requestor.glyphsAvailable = [&](GlyphMap glyphs) { @@ -196,7 +196,7 @@ TEST(GlyphManager, LoadingSuccess) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'a', u'å', u' '}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'a', u'å', u' '}}}, {}}); } TEST(GlyphManager, LoadingFail) { @@ -211,7 +211,7 @@ TEST(GlyphManager, LoadingFail) { test.observer.glyphsError = [&](const FontStack& fontStack, const GlyphRange& glyphRange, std::exception_ptr error) { EXPECT_EQ(fontStack, FontStack({"Test Stack"})); - EXPECT_EQ(glyphRange, GlyphRange(0, 255)); + EXPECT_EQ(glyphRange, GlyphRange(0, 255, GlyphIDType::FontPBF)); EXPECT_TRUE(error != nullptr); EXPECT_EQ(util::toString(error), "Failed by the test case"); @@ -224,7 +224,7 @@ TEST(GlyphManager, LoadingFail) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'a', u'å'}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'a', u'å'}}}, {}}); } TEST(GlyphManager, LoadingCorrupted) { @@ -239,7 +239,7 @@ TEST(GlyphManager, LoadingCorrupted) { test.observer.glyphsError = [&](const FontStack& fontStack, const GlyphRange& glyphRange, std::exception_ptr error) { EXPECT_EQ(fontStack, FontStack({"Test Stack"})); - EXPECT_EQ(glyphRange, GlyphRange(0, 255)); + EXPECT_EQ(glyphRange, GlyphRange(0, 255, GlyphIDType::FontPBF)); EXPECT_TRUE(error != nullptr); EXPECT_EQ(util::toString(error), "unknown pbf field type exception"); @@ -252,7 +252,7 @@ TEST(GlyphManager, LoadingCorrupted) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'a', u'å'}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'a', u'å'}}}, {}}); } TEST(GlyphManager, LoadingCancel) { @@ -267,7 +267,7 @@ TEST(GlyphManager, LoadingCancel) { FAIL() << "Should never be called"; }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'a', u'å'}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'a', u'å'}}}, {}}); } TEST(GlyphManager, LoadLocalCJKGlyph) { @@ -293,7 +293,7 @@ TEST(GlyphManager, LoadLocalCJKGlyph) { ASSERT_EQ(testPositions.count(u'中'), 1u); Immutable glyph = *testPositions.at(u'中'); - EXPECT_EQ(glyph->id, u'中'); + EXPECT_EQ(glyph->id.complex.code, u'中'); EXPECT_EQ(glyph->metrics.width, 24ul); EXPECT_EQ(glyph->metrics.height, 24ul); EXPECT_EQ(glyph->metrics.left, 0); @@ -309,7 +309,7 @@ TEST(GlyphManager, LoadLocalCJKGlyph) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'中'}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'中'}}}, {}}); } TEST(GlyphManager, LoadLocalCJKGlyphAfterLoadingRangeFromURL) { @@ -336,16 +336,15 @@ TEST(GlyphManager, LoadLocalCJKGlyphAfterLoadingRangeFromURL) { // instead of using the glyph recieved from the range // for the ideagraphic mark test.glyphManager.getGlyphs(test.requestor, - GlyphDependencies{ - {{{"Test Stack"}}, {u'テ'}} // 0x30c6 - }, + GlyphDependencies{{{{{"Test Stack"}}, {u'テ'}}}, // 0x30c6 + {}}, test.fileSource); } else { ASSERT_EQ(testPositions.size(), 1u); ASSERT_EQ(testPositions.count(u'テ'), 1u); Immutable glyph = *testPositions.at(u'テ'); - EXPECT_EQ(glyph->id, u'テ'); + EXPECT_EQ(glyph->id.complex.code, u'テ'); EXPECT_EQ(glyph->metrics.width, 24ul); EXPECT_EQ(glyph->metrics.height, 24ul); EXPECT_EQ(glyph->metrics.left, 0); @@ -358,9 +357,8 @@ TEST(GlyphManager, LoadLocalCJKGlyphAfterLoadingRangeFromURL) { }; test.run("test/fixtures/resources/glyphs-12244-12543.pbf", - GlyphDependencies{ - {{{"Test Stack"}}, {u'々'}} // 0x3005 - }); + GlyphDependencies{{{{{"Test Stack"}}, {u'々'}}}, // 0x3005 + {}}); } TEST(GlyphManager, LoadingInvalid) { @@ -380,7 +378,7 @@ TEST(GlyphManager, LoadingInvalid) { test.observer.glyphsLoaded = [&](const FontStack& fontStack, const GlyphRange& range) { ASSERT_EQ(fontStack, FontStack{{"Test Stack"}}); - ASSERT_EQ(range, GlyphRange(0, 255)); + ASSERT_EQ(range, GlyphRange(0, 255, GlyphIDType::FontPBF)); }; test.requestor.glyphsAvailable = [&](GlyphMap glyphs) { @@ -393,7 +391,7 @@ TEST(GlyphManager, LoadingInvalid) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'A', u'E'}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'A', u'E'}}}, {}}); } TEST(GlyphManager, ImmediateFileSource) { @@ -436,5 +434,5 @@ TEST(GlyphManager, ImmediateFileSource) { test.end(); }; - test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{"Test Stack"}}, {u'a', u'å', u' '}}}); + test.run("test/fixtures/resources/glyphs.pbf", GlyphDependencies{{{{{"Test Stack"}}, {u'a', u'å', u' '}}}, {}}); } diff --git a/test/text/glyph_pbf.test.cpp b/test/text/glyph_pbf.test.cpp index cb28e7e2eb11..af8c48502f5b 100644 --- a/test/text/glyph_pbf.test.cpp +++ b/test/text/glyph_pbf.test.cpp @@ -7,11 +7,12 @@ using namespace mbgl; TEST(GlyphPBF, Parsing) { // The fake glyphs contain a number of invalid glyphs, which should be skipped by the parser. - auto sdfs = parseGlyphPBF(GlyphRange{0, 255}, util::read_file("test/fixtures/resources/fake_glyphs-0-255.pbf")); + auto sdfs = parseGlyphPBF(GlyphRange{0, 255, GlyphIDType::FontPBF}, + util::read_file("test/fixtures/resources/fake_glyphs-0-255.pbf")); EXPECT_TRUE(sdfs.size() == 1); auto& sdf = sdfs[0]; - EXPECT_EQ(69u, sdf.id); + EXPECT_EQ(69u, sdf.id.complex.code); AlphaImage expected({7, 7}); expected.fill('x'); EXPECT_EQ(expected, sdf.bitmap); diff --git a/test/text/shaping.test.cpp b/test/text/shaping.test.cpp index 0535cef50acf..4ebf3dcbe186 100644 --- a/test/text/shaping.test.cpp +++ b/test/text/shaping.test.cpp @@ -24,7 +24,7 @@ TEST(Shaping, ZWSP) { BiDi bidi; auto immutableGlyph = Immutable(makeMutable(std::move(glyph))); const std::vector fontStack{{"font-stack"}}; - const SectionOptions sectionOptions(1.0f, fontStack); + const SectionOptions sectionOptions(1.0f, fontStack, GlyphIDType::FontPBF, 0); const float layoutTextSize = 16.0f; const float layoutTextSizeAtBucketZoomLevel = 16.0f; GlyphMap glyphs = {{FontStackHasher()(fontStack), {{u'中', std::move(immutableGlyph)}}}}; diff --git a/test/text/tagged_string.test.cpp b/test/text/tagged_string.test.cpp index 1f23e0ffb174..6143a39b4f31 100644 --- a/test/text/tagged_string.test.cpp +++ b/test/text/tagged_string.test.cpp @@ -6,22 +6,22 @@ using namespace mbgl; TEST(TaggedString, Trim) { - TaggedString basic(u" \t\ntrim that and not this \n\t", SectionOptions(1.0f, {})); + TaggedString basic(u" \t\ntrim that and not this \n\t", SectionOptions(1.0f, {}, GlyphIDType::FontPBF, 0)); basic.trim(); EXPECT_EQ(basic.rawText(), u"trim that and not this"); TaggedString twoSections; - twoSections.addTextSection(u" \t\ntrim that", 1.5f, {}); - twoSections.addTextSection(u" and not this \n\t", 0.5f, {}); + twoSections.addTextSection(u" \t\ntrim that", 1.5f, {}, GlyphIDType::FontPBF, false, {}); + twoSections.addTextSection(u" and not this \n\t", 0.5f, {}, GlyphIDType::FontPBF, false, {}); twoSections.trim(); EXPECT_EQ(twoSections.rawText(), u"trim that and not this"); - TaggedString empty(u"\n\t\v \r \t\n", SectionOptions(1.0f, {})); + TaggedString empty(u"\n\t\v \r \t\n", SectionOptions(1.0f, {}, GlyphIDType::FontPBF, 0)); empty.trim(); EXPECT_EQ(empty.rawText(), u""); - TaggedString noTrim(u"no trim!", SectionOptions(1.0f, {})); + TaggedString noTrim(u"no trim!", SectionOptions(1.0f, {}, GlyphIDType::FontPBF, 0)); noTrim.trim(); EXPECT_EQ(noTrim.rawText(), u"no trim!"); } diff --git a/test/util/merge_lines.test.cpp b/test/util/merge_lines.test.cpp index 8782946ec033..79578b153f8f 100644 --- a/test/util/merge_lines.test.cpp +++ b/test/util/merge_lines.test.cpp @@ -29,7 +29,7 @@ class SymbolFeatureStub : public SymbolFeature { : SymbolFeature(std::make_unique( std::move(id_), type_, std::move(geometry_), std::move(properties_))) { if (text_) { - formattedText = TaggedString(*text_, SectionOptions(1.0, {})); + formattedText = TaggedString(*text_, SectionOptions(1.0, {}, GlyphIDType::FontPBF, 0)); } icon = std::move(icon_); index = index_; diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 9c79f2c1c63b..d42586573187 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -236,6 +236,447 @@ cc_library( visibility = ["//visibility:public"], ) +cc_library( + name = "freetype", + srcs = [ + "freetype/builds/unix/ftsystem.c", + "freetype/src/autofit/autofit.c", + "freetype/src/base/ftbase.c", + "freetype/src/base/ftbbox.c", + "freetype/src/base/ftbdf.c", + "freetype/src/base/ftbitmap.c", + "freetype/src/base/ftcid.c", + "freetype/src/base/ftdebug.c", + "freetype/src/base/ftfstype.c", + "freetype/src/base/ftgasp.c", + "freetype/src/base/ftglyph.c", + "freetype/src/base/ftgxval.c", + "freetype/src/base/ftinit.c", + "freetype/src/base/ftmm.c", + "freetype/src/base/ftotval.c", + "freetype/src/base/ftpatent.c", + "freetype/src/base/ftpfr.c", + "freetype/src/base/ftstroke.c", + "freetype/src/base/ftsynth.c", + "freetype/src/base/fttype1.c", + "freetype/src/base/ftwinfnt.c", + "freetype/src/bdf/bdf.c", + "freetype/src/bzip2/ftbzip2.c", + "freetype/src/cache/ftcache.c", + "freetype/src/cff/cff.c", + "freetype/src/cid/type1cid.c", + "freetype/src/gxvalid/gxvalid.c", + "freetype/src/gzip/ftgzip.c", + "freetype/src/lzw/ftlzw.c", + "freetype/src/otvalid/otvalid.c", + "freetype/src/pcf/pcf.c", + "freetype/src/pfr/pfr.c", + "freetype/src/psaux/psaux.c", + "freetype/src/pshinter/pshinter.c", + "freetype/src/psnames/psnames.c", + "freetype/src/raster/raster.c", + "freetype/src/sdf/sdf.c", + "freetype/src/sfnt/sfnt.c", + "freetype/src/smooth/smooth.c", + "freetype/src/svg/svg.c", + "freetype/src/truetype/truetype.c", + "freetype/src/type1/type1.c", + "freetype/src/type42/type42.c", + "freetype/src/winfonts/winfnt.c", + ], + hdrs = glob([ + "freetype/include/**/*.h", + "freetype/src/**/*.h", + "freetype/src/**/*.c", + "freetype/include/ft2build.h", + ]), + copts = [ + "-Wno-covered-switch-default", + "-DFT_CONFIG_OPTION_SYSTEM_ZLIB", + "-DFT_CONFIG_CONFIG_H=", + # "-DFT_CONFIG_OPTION_USE_PNG", + "-DFT2_BUILD_LIBRARY", + "-DFT_CONFIG_MODULES_H=", + "-DHAVE_UNISTD_H=1", + "-DHAVE_FCNTL_H=1", + "-DHAVE_STDINT_H=1", + "-DFT_DISABLE_BROTLI=ON", + "-DFT_DISABLE_PNG=ON", + "-Ifreetype/include", + ], + includes = [ + "freetype/include", + "freetype/include/freetype/config", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +HARFBUZZ_HDRS = [ + "harfbuzz/src/hb-aat-layout.h", + "harfbuzz/src/hb-blob.h", + "harfbuzz/src/hb-buffer.h", + "harfbuzz/src/hb-common.h", + "harfbuzz/src/hb-deprecated.h", + "harfbuzz/src/hb-face.h", + "harfbuzz/src/hb-font.h", + "harfbuzz/src/hb-map.h", + "harfbuzz/src/hb-ot-font.h", + "harfbuzz/src/hb-ot-layout.h", + "harfbuzz/src/hb-ot-math.h", + "harfbuzz/src/hb-ot-metrics.h", + "harfbuzz/src/hb-ot-shape.h", + "harfbuzz/src/hb-ot-var.h", + "harfbuzz/src/hb-ot.h", + "harfbuzz/src/hb-set.h", + "harfbuzz/src/hb-shape-plan.h", + "harfbuzz/src/hb-shape.h", + "harfbuzz/src/hb-style.h", + "harfbuzz/src/hb-subset.h", + "harfbuzz/src/hb-unicode.h", + "harfbuzz/src/hb-version.h", + "harfbuzz/src/hb.h", + "harfbuzz/src/hb-ft.h", + "harfbuzz/src/OT/Color/CBDT/CBDT.hh", + "harfbuzz/src/OT/Color/COLR/COLR.hh", + "harfbuzz/src/OT/Color/COLR/colrv1-closure.hh", + "harfbuzz/src/OT/Color/CPAL/CPAL.hh", + "harfbuzz/src/OT/Color/sbix/sbix.hh", + "harfbuzz/src/OT/Color/svg/svg.hh", + "harfbuzz/src/OT/Layout/Common/Coverage.hh", + "harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh", + "harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh", + "harfbuzz/src/OT/Layout/Common/RangeRecord.hh", + "harfbuzz/src/OT/Layout/GDEF/GDEF.hh", + "harfbuzz/src/OT/Layout/GPOS/Anchor.hh", + "harfbuzz/src/OT/Layout/GPOS/AnchorFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/AnchorFormat2.hh", + "harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh", + "harfbuzz/src/OT/Layout/GPOS/AnchorMatrix.hh", + "harfbuzz/src/OT/Layout/GPOS/ChainContextPos.hh", + "harfbuzz/src/OT/Layout/GPOS/Common.hh", + "harfbuzz/src/OT/Layout/GPOS/ContextPos.hh", + "harfbuzz/src/OT/Layout/GPOS/CursivePos.hh", + "harfbuzz/src/OT/Layout/GPOS/CursivePosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/ExtensionPos.hh", + "harfbuzz/src/OT/Layout/GPOS/GPOS.hh", + "harfbuzz/src/OT/Layout/GPOS/LigatureArray.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkArray.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkBasePos.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkBasePosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkLigPos.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkLigPosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkMarkPos.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh", + "harfbuzz/src/OT/Layout/GPOS/PairPos.hh", + "harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh", + "harfbuzz/src/OT/Layout/GPOS/PairSet.hh", + "harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh", + "harfbuzz/src/OT/Layout/GPOS/PosLookup.hh", + "harfbuzz/src/OT/Layout/GPOS/PosLookupSubTable.hh", + "harfbuzz/src/OT/Layout/GPOS/SinglePos.hh", + "harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh", + "harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh", + "harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh", + "harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh", + "harfbuzz/src/OT/Layout/GSUB/AlternateSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/AlternateSubstFormat1.hh", + "harfbuzz/src/OT/Layout/GSUB/ChainContextSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/Common.hh", + "harfbuzz/src/OT/Layout/GSUB/ContextSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/ExtensionSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/GSUB.hh", + "harfbuzz/src/OT/Layout/GSUB/Ligature.hh", + "harfbuzz/src/OT/Layout/GSUB/LigatureSet.hh", + "harfbuzz/src/OT/Layout/GSUB/LigatureSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/LigatureSubstFormat1.hh", + "harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh", + "harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh", + "harfbuzz/src/OT/Layout/GSUB/Sequence.hh", + "harfbuzz/src/OT/Layout/GSUB/SingleSubst.hh", + "harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh", + "harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh", + "harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh", + "harfbuzz/src/OT/Layout/GSUB/SubstLookupSubTable.hh", + "harfbuzz/src/OT/Layout/types.hh", + "harfbuzz/src/OT/glyf/CompositeGlyph.hh", + "harfbuzz/src/OT/glyf/Glyph.hh", + "harfbuzz/src/OT/glyf/GlyphHeader.hh", + "harfbuzz/src/OT/glyf/SimpleGlyph.hh", + "harfbuzz/src/OT/glyf/SubsetGlyph.hh", + "harfbuzz/src/OT/glyf/VarCompositeGlyph.hh", + "harfbuzz/src/OT/glyf/composite-iter.hh", + "harfbuzz/src/OT/glyf/coord-setter.hh", + "harfbuzz/src/OT/glyf/glyf-helpers.hh", + "harfbuzz/src/OT/glyf/glyf.hh", + "harfbuzz/src/OT/glyf/loca.hh", + "harfbuzz/src/OT/glyf/path-builder.hh", + "harfbuzz/src/OT/name/name.hh", + "harfbuzz/src/graph/classdef-graph.hh", + "harfbuzz/src/graph/coverage-graph.hh", + "harfbuzz/src/graph/graph.hh", + "harfbuzz/src/graph/gsubgpos-context.cc", + "harfbuzz/src/graph/gsubgpos-context.hh", + "harfbuzz/src/graph/gsubgpos-graph.hh", + "harfbuzz/src/graph/markbasepos-graph.hh", + "harfbuzz/src/graph/pairpos-graph.hh", + "harfbuzz/src/graph/serialize.hh", + "harfbuzz/src/graph/split-helpers.hh", + "harfbuzz/src/hb-aat-layout-ankr-table.hh", + "harfbuzz/src/hb-aat-layout-bsln-table.hh", + "harfbuzz/src/hb-aat-layout-common.hh", + "harfbuzz/src/hb-aat-layout-feat-table.hh", + "harfbuzz/src/hb-aat-layout-just-table.hh", + "harfbuzz/src/hb-aat-layout-kerx-table.hh", + "harfbuzz/src/hb-aat-layout-morx-table.hh", + "harfbuzz/src/hb-aat-layout-opbd-table.hh", + "harfbuzz/src/hb-aat-layout-trak-table.hh", + "harfbuzz/src/hb-aat-layout.cc", + "harfbuzz/src/hb-aat-layout.hh", + "harfbuzz/src/hb-aat-ltag-table.hh", + "harfbuzz/src/hb-aat-map.cc", + "harfbuzz/src/hb-aat-map.hh", + "harfbuzz/src/hb-aat.h", + "harfbuzz/src/hb-algs.hh", + "harfbuzz/src/hb-array.hh", + "harfbuzz/src/hb-atomic.hh", + "harfbuzz/src/hb-bimap.hh", + "harfbuzz/src/hb-bit-page.hh", + "harfbuzz/src/hb-bit-set-invertible.hh", + "harfbuzz/src/hb-bit-set.hh", + "harfbuzz/src/hb-blob.cc", + "harfbuzz/src/hb-blob.hh", + "harfbuzz/src/hb-buffer-deserialize-json.hh", + "harfbuzz/src/hb-buffer-deserialize-text-glyphs.hh", + "harfbuzz/src/hb-buffer-deserialize-text-unicode.hh", + "harfbuzz/src/hb-buffer-serialize.cc", + "harfbuzz/src/hb-buffer-verify.cc", + "harfbuzz/src/hb-buffer.cc", + "harfbuzz/src/hb-buffer.hh", + "harfbuzz/src/hb-cache.hh", + "harfbuzz/src/hb-cff-interp-common.hh", + "harfbuzz/src/hb-cff-interp-cs-common.hh", + "harfbuzz/src/hb-cff-interp-dict-common.hh", + "harfbuzz/src/hb-cff1-interp-cs.hh", + "harfbuzz/src/hb-cff2-interp-cs.hh", + "harfbuzz/src/hb-common.cc", + "harfbuzz/src/hb-config.hh", + "harfbuzz/src/hb-cplusplus.hh", + "harfbuzz/src/hb-debug.hh", + "harfbuzz/src/hb-dispatch.hh", + "harfbuzz/src/hb-draw.cc", + "harfbuzz/src/hb-draw.h", + "harfbuzz/src/hb-draw.hh", + "harfbuzz/src/hb-face-builder.cc", + "harfbuzz/src/hb-face.cc", + "harfbuzz/src/hb-face.hh", + "harfbuzz/src/hb-font.cc", + "harfbuzz/src/hb-ft.cc", + "harfbuzz/src/hb-font.hh", + "harfbuzz/src/hb-iter.hh", + "harfbuzz/src/hb-kern.hh", + "harfbuzz/src/hb-limits.hh", + "harfbuzz/src/hb-machinery.hh", + "harfbuzz/src/hb-map.cc", + "harfbuzz/src/hb-map.hh", + "harfbuzz/src/hb-meta.hh", + "harfbuzz/src/hb-ms-feature-ranges.hh", + "harfbuzz/src/hb-multimap.hh", + "harfbuzz/src/hb-mutex.hh", + "harfbuzz/src/hb-null.hh", + "harfbuzz/src/hb-number-parser.hh", + "harfbuzz/src/hb-number.cc", + "harfbuzz/src/hb-number.hh", + "harfbuzz/src/hb-object.hh", + "harfbuzz/src/hb-open-file.hh", + "harfbuzz/src/hb-open-type.hh", + "harfbuzz/src/hb-ot-cff-common.hh", + "harfbuzz/src/hb-ot-cff1-std-str.hh", + "harfbuzz/src/hb-ot-cff1-table.cc", + "harfbuzz/src/hb-ot-cff1-table.hh", + "harfbuzz/src/hb-ot-cff2-table.cc", + "harfbuzz/src/hb-ot-cff2-table.hh", + "harfbuzz/src/hb-ot-cmap-table.hh", + "harfbuzz/src/hb-ot-color.cc", + "harfbuzz/src/hb-ot-color.h", + "harfbuzz/src/hb-ot-deprecated.h", + "harfbuzz/src/hb-ot-face-table-list.hh", + "harfbuzz/src/hb-ot-face.cc", + "harfbuzz/src/hb-ot-face.hh", + "harfbuzz/src/hb-ot-font.cc", + "harfbuzz/src/hb-ot-gasp-table.hh", + "harfbuzz/src/hb-ot-glyf-table.hh", + "harfbuzz/src/hb-ot-hdmx-table.hh", + "harfbuzz/src/hb-ot-head-table.hh", + "harfbuzz/src/hb-ot-hhea-table.hh", + "harfbuzz/src/hb-ot-hmtx-table.hh", + "harfbuzz/src/hb-ot-kern-table.hh", + "harfbuzz/src/hb-ot-layout-base-table.hh", + "harfbuzz/src/hb-ot-layout-common.hh", + "harfbuzz/src/hb-ot-layout-gdef-table.hh", + "harfbuzz/src/hb-ot-layout-gpos-table.hh", + "harfbuzz/src/hb-ot-layout-gsub-table.hh", + "harfbuzz/src/hb-ot-layout-gsubgpos.hh", + "harfbuzz/src/hb-ot-layout-jstf-table.hh", + "harfbuzz/src/hb-ot-layout.cc", + "harfbuzz/src/hb-ot-layout.hh", + "harfbuzz/src/hb-ot-map.cc", + "harfbuzz/src/hb-ot-map.hh", + "harfbuzz/src/hb-ot-math-table.hh", + "harfbuzz/src/hb-ot-math.cc", + "harfbuzz/src/hb-ot-maxp-table.hh", + "harfbuzz/src/hb-ot-meta-table.hh", + "harfbuzz/src/hb-ot-meta.cc", + "harfbuzz/src/hb-ot-meta.h", + "harfbuzz/src/hb-ot-metrics.cc", + "harfbuzz/src/hb-ot-metrics.hh", + "harfbuzz/src/hb-ot-name-language-static.hh", + "harfbuzz/src/hb-ot-name-language.hh", + "harfbuzz/src/hb-ot-name-table.hh", + "harfbuzz/src/hb-ot-name.cc", + "harfbuzz/src/hb-ot-name.h", + "harfbuzz/src/hb-ot-os2-table.hh", + "harfbuzz/src/hb-ot-os2-unicode-ranges.hh", + "harfbuzz/src/hb-ot-post-macroman.hh", + "harfbuzz/src/hb-ot-post-table-v2subset.hh", + "harfbuzz/src/hb-ot-post-table.hh", + "harfbuzz/src/hb-ot-shape-fallback.cc", + "harfbuzz/src/hb-ot-shape-fallback.hh", + "harfbuzz/src/hb-ot-shape-normalize.cc", + "harfbuzz/src/hb-ot-shape-normalize.hh", + "harfbuzz/src/hb-ot-shape.cc", + "harfbuzz/src/hb-ot-shape.hh", + "harfbuzz/src/hb-ot-shaper-arabic-fallback.hh", + "harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh", + "harfbuzz/src/hb-ot-shaper-arabic-pua.hh", + "harfbuzz/src/hb-ot-shaper-arabic-table.hh", + "harfbuzz/src/hb-ot-shaper-arabic.cc", + "harfbuzz/src/hb-ot-shaper-arabic.hh", + "harfbuzz/src/hb-ot-shaper-default.cc", + "harfbuzz/src/hb-ot-shaper-hangul.cc", + "harfbuzz/src/hb-ot-shaper-hebrew.cc", + "harfbuzz/src/hb-ot-shaper-indic-machine.hh", + "harfbuzz/src/hb-ot-shaper-indic-table.cc", + "harfbuzz/src/hb-ot-shaper-indic.cc", + "harfbuzz/src/hb-ot-shaper-indic.hh", + "harfbuzz/src/hb-ot-shaper-khmer-machine.hh", + "harfbuzz/src/hb-ot-shaper-khmer.cc", + "harfbuzz/src/hb-ot-shaper-myanmar-machine.hh", + "harfbuzz/src/hb-ot-shaper-myanmar.cc", + "harfbuzz/src/hb-ot-shaper-syllabic.cc", + "harfbuzz/src/hb-ot-shaper-syllabic.hh", + "harfbuzz/src/hb-ot-shaper-thai.cc", + "harfbuzz/src/hb-ot-shaper-use-machine.hh", + "harfbuzz/src/hb-ot-shaper-use-table.hh", + "harfbuzz/src/hb-ot-shaper-use.cc", + "harfbuzz/src/hb-ot-shaper-vowel-constraints.cc", + "harfbuzz/src/hb-ot-shaper-vowel-constraints.hh", + "harfbuzz/src/hb-ot-shaper.hh", + "harfbuzz/src/hb-ot-stat-table.hh", + "harfbuzz/src/hb-ot-tag-table.hh", + "harfbuzz/src/hb-ot-tag.cc", + "harfbuzz/src/hb-ot-var-avar-table.hh", + "harfbuzz/src/hb-ot-var-common.hh", + "harfbuzz/src/hb-ot-var-cvar-table.hh", + "harfbuzz/src/hb-ot-var-fvar-table.hh", + "harfbuzz/src/hb-ot-var-gvar-table.hh", + "harfbuzz/src/hb-ot-var-hvar-table.hh", + "harfbuzz/src/hb-ot-var-mvar-table.hh", + "harfbuzz/src/hb-ot-var.cc", + "harfbuzz/src/hb-ot-vorg-table.hh", + "harfbuzz/src/hb-outline.cc", + "harfbuzz/src/hb-outline.hh", + "harfbuzz/src/hb-paint-extents.cc", + "harfbuzz/src/hb-paint-extents.hh", + "harfbuzz/src/hb-paint.cc", + "harfbuzz/src/hb-paint.h", + "harfbuzz/src/hb-paint.hh", + "harfbuzz/src/hb-pool.hh", + "harfbuzz/src/hb-priority-queue.hh", + "harfbuzz/src/hb-repacker.hh", + "harfbuzz/src/hb-sanitize.hh", + "harfbuzz/src/hb-serialize.hh", + "harfbuzz/src/hb-set-digest.hh", + "harfbuzz/src/hb-set.cc", + "harfbuzz/src/hb-set.hh", + "harfbuzz/src/hb-shape-plan.cc", + "harfbuzz/src/hb-shape-plan.hh", + "harfbuzz/src/hb-shape.cc", + "harfbuzz/src/hb-shaper-impl.hh", + "harfbuzz/src/hb-shaper-list.hh", + "harfbuzz/src/hb-shaper.cc", + "harfbuzz/src/hb-shaper.hh", + "harfbuzz/src/hb-static.cc", + "harfbuzz/src/hb-string-array.hh", + "harfbuzz/src/hb-subset-accelerator.hh", + "harfbuzz/src/hb-subset-cff-common.cc", + "harfbuzz/src/hb-subset-cff-common.hh", + "harfbuzz/src/hb-subset-cff1.cc", + "harfbuzz/src/hb-subset-cff2.cc", + "harfbuzz/src/hb-subset-input.cc", + "harfbuzz/src/hb-subset-input.hh", + "harfbuzz/src/hb-subset-instancer-solver.cc", + "harfbuzz/src/hb-subset-instancer-solver.hh", + "harfbuzz/src/hb-subset-plan-member-list.hh", + "harfbuzz/src/hb-subset-plan.cc", + "harfbuzz/src/hb-subset-plan.hh", + "harfbuzz/src/hb-subset-repacker.cc", + "harfbuzz/src/hb-subset-repacker.h", + "harfbuzz/src/hb-subset.cc", + "harfbuzz/src/hb-subset.hh", + "harfbuzz/src/hb-ucd-table.hh", + "harfbuzz/src/hb-ucd.cc", + "harfbuzz/src/hb-unicode-emoji-table.hh", + "harfbuzz/src/hb-unicode.cc", + "harfbuzz/src/hb-unicode.hh", + "harfbuzz/src/hb-utf.hh", + "harfbuzz/src/hb-vector.hh", + "harfbuzz/src/hb.hh", + "harfbuzz/src/hb-ft-colr.hh", + "harfbuzz/src/hb-coretext.cc", + "harfbuzz/src/hb-directwrite.cc", + "harfbuzz/src/hb-fallback-shape.cc", + "harfbuzz/src/hb-gdi.cc", + "harfbuzz/src/hb-glib.cc", + "harfbuzz/src/hb-graphite2.cc", + "harfbuzz/src/hb-style.cc", + "harfbuzz/src/hb-uniscribe.cc", + "harfbuzz/src/hb-wasm-api.cc", + "harfbuzz/src/hb-wasm-shape.cc", +] + +HARFBUZZ_SRCS = [ + "harfbuzz/src/harfbuzz.cc", +] + +cc_library( + name = "harfbuzz", + srcs = HARFBUZZ_SRCS, + hdrs = HARFBUZZ_HDRS + glob([ + "freetype/include/*", + "freetype/include/freetype/*", + "freetype/include/freetype/config/*", + ]), + defines = [ + "HAVE_OT", + "HAVE_FREETYPE", + # "HAVE_CONFIG_OVERRIDE_H", + # "HB_NO_FALLBACK_SHAPE", + # "HB_NO_WIN1256", + "HB_TINY", + ], + includes = [ + "freetype/include", + "harfbuzz/src", + ], + visibility = ["//visibility:public"], +) + cc_library( name = "sqlite", srcs = ["sqlite/src/sqlite3.c"], diff --git a/vendor/freetype b/vendor/freetype new file mode 160000 index 000000000000..42608f77f207 --- /dev/null +++ b/vendor/freetype @@ -0,0 +1 @@ +Subproject commit 42608f77f20749dd6ddc9e0536788eaad70ea4b5 diff --git a/vendor/freetype.cmake b/vendor/freetype.cmake new file mode 100644 index 000000000000..a459a3d57e46 --- /dev/null +++ b/vendor/freetype.cmake @@ -0,0 +1,24 @@ +if(TARGET freetype) + return() +endif() +if (MLN_TEXT_SHAPING_HARFBUZZ) + set(FT_DISABLE_BROTLI ON CACHE BOOL "freetype option") + set(FT_REQUIRE_BROTLI OFF CACHE BOOL "freetype option") + set(FT_DISABLE_ZLIB ON CACHE BOOL "freetype option") + set(FT_REQUIRE_ZLIB OFF CACHE BOOL "freetype option") + add_subdirectory(vendor/freetype) + + set_target_properties( + freetype + PROPERTIES + INTERFACE_MAPLIBRE_NAME "freetype" + INTERFACE_MAPLIBRE_URL "https://github.com/freetype/freetype" + INTERFACE_MAPLIBRE_AUTHOR "David Turner, Robert Wilhelm, Werner Lemberg and FreeType contributors" + INTERFACE_MAPLIBRE_LICENSE ${PROJECT_SOURCE_DIR}/vendor/freetype/docs/FTL.TXT + ) + + target_include_directories( + mbgl-core SYSTEM + PUBLIC vendor/freetype/include + ) +endif() diff --git a/vendor/harfbuzz b/vendor/harfbuzz new file mode 160000 index 000000000000..c1eb66d4159f --- /dev/null +++ b/vendor/harfbuzz @@ -0,0 +1 @@ +Subproject commit c1eb66d4159fec311334aee5c0a59384491d3989 diff --git a/vendor/harfbuzz.cmake b/vendor/harfbuzz.cmake new file mode 100644 index 000000000000..7869feb06fbf --- /dev/null +++ b/vendor/harfbuzz.cmake @@ -0,0 +1,22 @@ +if(TARGET harfbuzz) + return() +endif() +if (MLN_TEXT_SHAPING_HARFBUZZ) + add_subdirectory(vendor/harfbuzz) + + target_compile_definitions(harfbuzz PRIVATE -DHAVE_FREETYPE) + + set_target_properties( + harfbuzz + PROPERTIES + INTERFACE_MAPLIBRE_NAME "harfbuzz" + INTERFACE_MAPLIBRE_URL "https://github.com/harfbuzz/harfbuzz" + INTERFACE_MAPLIBRE_AUTHOR ${PROJECT_SOURCE_DIR}/vendor/harfbuzz/AUTHORS + INTERFACE_MAPLIBRE_LICENSE ${PROJECT_SOURCE_DIR}/vendor/harfbuzz/COPYING + ) + + target_include_directories( + mbgl-core SYSTEM + PUBLIC vendor/harfbuzz/src + ) +endif() From 84938597cf41c46277d79ee9fb70112bc245c99e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 29 Jul 2025 22:33:53 +0200 Subject: [PATCH 299/339] Release MapLibre iOS 6.18.0 (#3682) --- platform/ios/CHANGELOG.md | 8 +++++++- platform/ios/VERSION | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 78aaa5a4f1c8..c1fdee043cab 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -2,7 +2,13 @@ MapLibre welcomes participation and contributions from everyone. Please read [`MapLibre iOS Developer Guide`](https://maplibre.org/maplibre-native/docs/book/ios/index.html) to get started. -## main +## 6.18.0 + +- add the ability to have ios camera animation durations dynamic during navigation ([#3568](https://github.com/maplibre/maplibre-native/pull/3568)). +- Fix dashed line issue when style change ([#3675](https://github.com/maplibre/maplibre-native/pull/3675)). +- Add rendering info reports to `ActionJournal` ([#3545](https://github.com/maplibre/maplibre-native/pull/3545)). +- Add HarfBuzz Text Shaping and Font Fallback Support ([#3611](https://github.com/maplibre/maplibre-native/pull/3611)). + This implements the [`font-faces` property of the MapLibre Style Spec](https://maplibre.org/maplibre-style-spec/font-faces/). ## 6.17.1 diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 369689dd813e..1b386a547006 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.17.1 +6.18.0 From a6d7314538e9f5ae372785be7f63eb147938881e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 30 Jul 2025 00:43:21 +0200 Subject: [PATCH 300/339] Release MapLibre Android 11.13.0 (#3683) --- platform/android/CHANGELOG.md | 9 ++++++++- platform/android/VERSION | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index bb5462d70858..87188fff0c02 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -2,7 +2,14 @@ ## main -## 11.12.2 +## 11.13.0 + +### ✨ Features and improvements + +- Add HarfBuzz Text Shaping and Font Fallback Support ([#3611](https://github.com/maplibre/maplibre-native/pull/3611)). + This implements the [`font-faces` property of the MapLibre Style Spec](https://maplibre.org/maplibre-style-spec/font-faces/). + +## 11.12.1 ### ✨ Features and improvements diff --git a/platform/android/VERSION b/platform/android/VERSION index cafd89b61841..a03dc570038e 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.12.2 +11.13.0 From 14176b96d4fe060ccf78b642c053bb870140e3bd Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Wed, 30 Jul 2025 13:07:37 -0400 Subject: [PATCH 301/339] Release Node v6.2.0-pre.0 (#3689) --- platform/node/CHANGELOG.md | 6 ++++-- platform/node/package-lock.json | 4 ++-- platform/node/package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/platform/node/CHANGELOG.md b/platform/node/CHANGELOG.md index fecf47c42652..94f322383f28 100644 --- a/platform/node/CHANGELOG.md +++ b/platform/node/CHANGELOG.md @@ -1,7 +1,9 @@ ## main -## 6.1.1-pre.0 -* Fix freezing in macos/metal after ~32 renders ([#2948](https://github.com/maplibre/maplibre-native/pull/2948)) +## 6.2.0-pre.0 +* Fix freezing in macos/metal after ~32 renders ([Issue](https://github.com/maplibre/maplibre-native/issues/2928), [PR](https://github.com/maplibre/maplibre-native/pull/3673)). +* Add HarfBuzz Text Shaping and Font Fallback Support ([#3611](https://github.com/maplibre/maplibre-native/pull/3611)). + This implements the [`font-faces` property of the MapLibre Style Spec](https://maplibre.org/maplibre-style-spec/font-faces/). ## 6.1.0 * Add `textFitWidth` and `textFitHeight` properties to sprites ([#2780](https://github.com/maplibre/maplibre-native/pull/2780)). diff --git a/platform/node/package-lock.json b/platform/node/package-lock.json index 0a2928e8c009..0b05bb5ffb6f 100644 --- a/platform/node/package-lock.json +++ b/platform/node/package-lock.json @@ -1,12 +1,12 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.1-pre.0", + "version": "6.2.0-pre.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.1-pre.0", + "version": "6.2.0-pre.0", "hasInstallScript": true, "license": "BSD-2-Clause", "dependencies": { diff --git a/platform/node/package.json b/platform/node/package.json index 0dae8ba83113..14528306bfd4 100644 --- a/platform/node/package.json +++ b/platform/node/package.json @@ -1,6 +1,6 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.1-pre.0", + "version": "6.2.0-pre.0", "description": "Renders map tiles with MapLibre Native", "keywords": [ "maplibre", From 4af690dcb31a447269dda83bfcef7a7fb3fc2052 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Jul 2025 22:44:27 +0200 Subject: [PATCH 302/339] Update bazel (major) (#3557) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 7aa743a89fbc..166e4c50a984 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,9 +2,9 @@ module(name = "maplibre") bazel_dep(name = "bazel_skylib", version = "1.8.1") bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "rules_apple", version = "3.22.0") -bazel_dep(name = "rules_swift", version = "2.9.0") -bazel_dep(name = "rules_xcodeproj", version = "2.12.1") +bazel_dep(name = "rules_apple", version = "4.1.1") +bazel_dep(name = "rules_swift", version = "3.1.1") +bazel_dep(name = "rules_xcodeproj", version = "3.1.2") bazel_dep(name = "aspect_rules_js", version = "2.4.0") bazel_dep(name = "rules_nodejs", version = "6.4.0") bazel_dep(name = "libuv", version = "1.48.0") From c0193bf0df96fb2f41dfb0b8ccf7591c3a9992e3 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 31 Jul 2025 14:04:01 +0300 Subject: [PATCH 303/339] Add rendering stats tracker example (#3680) --- .../activity/events/ObserverActivity.kt | 41 +++- .../activity/events/RenderStatsTracker.kt | 214 ++++++++++++++++++ .../docs/observability/observe-map-events.md | 6 + 3 files changed, 251 insertions(+), 10 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/RenderStatsTracker.kt diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt index 214493e1bd0f..720c05cc339c 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt @@ -1,28 +1,20 @@ package org.maplibre.android.testapp.activity.events -import android.app.ActivityManager -import android.os.Build import android.os.Bundle import android.view.View -import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity -import org.maplibre.android.MapLibre import org.maplibre.android.maps.MapView import org.maplibre.android.maps.Style import org.maplibre.android.tile.TileOperation import org.maplibre.android.testapp.R import org.maplibre.android.testapp.styles.TestStyles -import timber.log.Timber import java.util.* import kotlin.time.TimeMark import kotlin.time.TimeSource -import kotlin.time.TimeSource.Monotonic import org.maplibre.android.log.Logger -import org.maplibre.android.log.Logger.INFO import org.maplibre.android.maps.RenderingStats import org.maplibre.android.maps.MapLibreMap - // # --8<-- [start:ObserverActivity] /** * Test activity showcasing logging observer actions from the core @@ -39,6 +31,7 @@ class ObserverActivity : AppCompatActivity(), // # --8<-- [end:ObserverActivity] private lateinit var mapView: MapView + private val renderStatsTracker = RenderStatsTracker() companion object { const val TAG = "ObserverActivity" @@ -61,6 +54,33 @@ class ObserverActivity : AppCompatActivity(), mapView.addOnDidFinishRenderingFrameListener(this) // # --8<-- [end:addListeners] + // # --8<-- [start:renderStatsTracker] + renderStatsTracker.setReportFields(listOf( + "encodingTime", + "renderingTime", + "numDrawCalls", + "numActiveTextures", + "numBuffers", + "memTextures", + "memBuffers" + )) + + renderStatsTracker.setReportListener { _, _, avg -> + Logger.i(TAG, "RenderStatsReport - avg - ${avg.nonZeroValuesString()}") + } + + renderStatsTracker.setThresholds(hashMapOf( + "numDrawCalls" to 1000, + "totalBuffers" to 1000L + )) + + renderStatsTracker.setThresholdExceededListener { exceededValues, _ -> + Logger.i(TAG, "Exceeded render values $exceededValues") + } + + renderStatsTracker.startReports(10L) + // # --8<-- [end:renderStatsTracker] + mapView.getMapAsync { it.setStyle( Style.Builder().fromUri(TestStyles.DEMOTILES) @@ -78,7 +98,7 @@ class ObserverActivity : AppCompatActivity(), } // # --8<-- [start:printActionJournal] - fun printActionJournal(map: MapLibreMap) { + private fun printActionJournal(map: MapLibreMap) { // configure using `MapLibreMapOptions.actionJournal*` methods Logger.i(TAG,"ActionJournal files: \n${map.actionJournalLogFiles.joinToString("\n")}") @@ -136,7 +156,7 @@ class ObserverActivity : AppCompatActivity(), } override fun onDidFinishRenderingFrame(fully: Boolean, stats: RenderingStats) { - + renderStatsTracker.addFrame(stats) } // # --8<-- [end:mapEvents] @@ -168,6 +188,7 @@ class ObserverActivity : AppCompatActivity(), override fun onDestroy() { super.onDestroy() mapView.onDestroy() + renderStatsTracker.stopReports() } override fun onSaveInstanceState(outState: Bundle) { diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/RenderStatsTracker.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/RenderStatsTracker.kt new file mode 100644 index 000000000000..260962f8cdbc --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/RenderStatsTracker.kt @@ -0,0 +1,214 @@ +package org.maplibre.android.testapp.activity.events + +import org.maplibre.android.maps.MapView +import org.maplibre.android.maps.RenderingStats +import java.lang.reflect.Field +import java.util.Timer +import kotlin.concurrent.fixedRateTimer + +/** + * Example class that tracks rendering statistics values (based on `RenderingStats` fields) and offers: + * - periodic reports with min/max/average values + * - threshold exceeded triggers + * @see RenderingStats + */ +class RenderStatsTracker { + private var min = RenderingStats() + private var max = RenderingStats() + private var total = RenderingStats() + private var frameCount = 0 + + private var reportTimer: Timer? = null + private var reportFields = RenderingStats::class.java.fields + private var reportListener: ((RenderingStats, RenderingStats, RenderingStats) -> Unit)? = null + + private var thresholds = HashMap() + private var thresholdExceededListener: ((HashMap,RenderingStats) -> Unit)? = null + + /** + * Set fields to be tracked and updated every frame. An empty list will track all fields. + * The report listener will provide `RenderingStats` objects with the tracked values. + */ + @Synchronized fun setReportFields(values: List?) { + if (values == null) { + reportFields = RenderingStats::class.java.fields + return + } + + reportFields = values.map { RenderingStats::class.java.getField(it) }.toTypedArray() + } + + /** + * Callback that provides min/max/average values for the configured interval (`start(interval)`) + */ + @Synchronized fun setReportListener(listener: ((RenderingStats, RenderingStats, RenderingStats) -> Unit)?) { + if (reportFields.isEmpty()) { + setReportFields(null) + } + + reportListener = listener + } + + /** + * Set the thresholds to be checked + */ + @Synchronized fun setThresholds(values: HashMap) { + thresholds.clear() + val fields = RenderingStats::class.java.fields + + // cache index instead of name + values.map { value -> + val index = fields.indexOfFirst { it.name == value.key } + if (index != -1) { + thresholds[index] = value.value + } + } + } + + /** + * Callback that provides the exceeded threshold values in the last frame. + */ + @Synchronized fun setThresholdExceededListener(listener: ((HashMap,RenderingStats) -> Unit)?) { + thresholdExceededListener = listener + } + + /** + * Start periodic reports every `interval` seconds + */ + @Synchronized fun startReports(interval: Long) { + reset() + + reportTimer = fixedRateTimer( + name = "RenderStatsReportTimer", + initialDelay = interval * 1000L, + period = interval * 1000L + ) { + reportListener?.invoke(min, max, getAvg()) + reset() + } + } + + /** + * Stop periodic reports. Must be called before the object is destroyed + */ + @Synchronized fun stopReports() { + reportTimer?.cancel() + reportTimer = null + } + + /** + * Add the last frame data to the report. + * @see MapView.OnDidFinishRenderingFrameWithStatsListener(fully: Boolean, stats: RenderingStats) + */ + @Synchronized fun addFrame(frameStats: RenderingStats) { + updateReportValues(frameStats) + checkThresholds(frameStats) + } + + private fun updateReportValues(frameStats: RenderingStats) { + if (reportListener == null || reportTimer == null) { + return + } + + ++frameCount; + + reportFields.map { field: Field -> + when (val frameValue = field.get(frameStats)) { + is Int -> { + if (field.getInt(min) > frameValue) { + field.setInt(min, frameValue) + } + + if (field.getInt(max) < frameValue) { + field.setInt(max, frameValue) + } + + field.setInt(total, frameValue + field.getInt(total)) + } + + is Long -> { + if (field.getLong(min) > frameValue) { + field.setLong(min, frameValue) + } + + if (field.getLong(max) < frameValue) { + field.setLong(max, frameValue) + } + + field.setLong(total, frameValue + field.getLong(total)) + } + + is Double -> { + if (field.getDouble(min) > frameValue) { + field.setDouble(min, frameValue) + } + + if (field.getDouble(max) < frameValue) { + field.setDouble(max, frameValue) + } + + field.setDouble(total, frameValue + field.getDouble(total)) + } + + else -> {} + } + } + } + + private fun checkThresholds(frameStats: RenderingStats) { + if (thresholdExceededListener == null && thresholds.isEmpty()) { + return + } + + val fields = RenderingStats::class.java.fields + val exceededValues = HashMap() + + thresholds.map { + when (val frameValue = fields[it.key].get(frameStats)) { + is Int -> if (frameValue > it.value as Int) exceededValues[fields[it.key].name] = frameValue + is Long -> if (frameValue > it.value as Long) exceededValues[fields[it.key].name] = frameValue + is Double -> if (frameValue > it.value as Double) exceededValues[fields[it.key].name] = frameValue + else -> {} + } + } + + if (exceededValues.isNotEmpty()) { + thresholdExceededListener?.invoke(exceededValues, frameStats) + } + } + + private fun getAvg(): RenderingStats { + val avg = RenderingStats() + + if (frameCount == 0) { + return avg; + } + + reportFields.map { field: Field -> + when (val value = field.get(total)) { + is Int -> field.setInt(avg, value / frameCount) + is Long -> field.setLong(avg, value / frameCount) + is Double -> field.setDouble(avg, value / frameCount) + else -> {} + } + } + + return avg + } + + private fun reset() { + reportFields.map { field: Field -> field.set(min, Int.MAX_VALUE) } + reportFields.map { field: Field -> field.set(max, -Int.MAX_VALUE) } + reportFields.map { field: Field -> field.set(total, 0) } + + frameCount = 0 + } +} + +fun RenderingStats.nonZeroValuesString(): String { + return this::class.java.fields + .filter { (it.get(this) as? Number)?.toDouble() != 0.0 } + .joinToString(", ") { field -> + "(${field.name}=${field.get(this)})" + } +} diff --git a/platform/android/docs/observability/observe-map-events.md b/platform/android/docs/observability/observe-map-events.md index 4c27f6bf313c..1a1b151374fa 100644 --- a/platform/android/docs/observability/observe-map-events.md +++ b/platform/android/docs/observability/observe-map-events.md @@ -19,3 +19,9 @@ In this case we implement them by implementing the interfaces below in the activ ```kotlin --8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:ObserverActivity" ``` + +`ObserverActivity.onDidFinishRenderingFrame` uses `RenderStatsTracker` as an example for tracking rendering statistics over time. This offers periodic reports of minimum, maximum, average values and callbacks when predefined thresholds are exceeded. + +```kotlin +--8<-- "MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/events/ObserverActivity.kt:renderStatsTracker" +``` From 7d46c00529a9675ebcb2bec6acd26fc97ce06ad9 Mon Sep 17 00:00:00 2001 From: Ramya Ragupathy Date: Fri, 1 Aug 2025 16:16:19 +0530 Subject: [PATCH 304/339] Sponsor tier update (#3695) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fc77c0b33635..1edfa207a6d5 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,8 @@ Gold: Logo Meta +Logo Microsoft + Silver: Logo MIERUNE @@ -253,8 +255,6 @@ Silver: Logo Radar -Logo Microsoft - Logo mappedin Logo mapme From ca5f79c12d89005f3f2a582f50adc21512264498 Mon Sep 17 00:00:00 2001 From: Scott Hoyt Date: Fri, 1 Aug 2025 04:50:09 -0700 Subject: [PATCH 305/339] Fix for raster dem encoding override in style.json (#3570) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- CMakeLists.txt | 10 +- bazel/core.bzl | 10 +- .../style/conversion/raster_dem_options.hpp | 17 +++ .../mbgl/style/sources/raster_dem_source.hpp | 17 ++- include/mbgl/style/sources/raster_source.hpp | 28 +---- include/mbgl/style/sources/tile_source.hpp | 47 ++++++++ include/mbgl/style/sources/vector_source.hpp | 22 +--- src/mbgl/renderer/render_source.cpp | 6 +- .../sources/render_raster_dem_source.cpp | 6 +- .../sources/render_raster_dem_source.hpp | 6 +- .../renderer/sources/render_raster_source.cpp | 6 +- .../renderer/sources/render_raster_source.hpp | 6 +- .../renderer/sources/render_tile_source.hpp | 2 +- .../renderer/sources/render_vector_source.cpp | 4 +- .../renderer/sources/render_vector_source.hpp | 4 +- .../style/conversion/raster_dem_options.cpp | 34 ++++++ src/mbgl/style/conversion/source.cpp | 10 +- src/mbgl/style/conversion/tileset.cpp | 14 +-- src/mbgl/style/sources/raster_dem_source.cpp | 18 ++- src/mbgl/style/sources/raster_source.cpp | 78 +------------ src/mbgl/style/sources/tile_source.cpp | 104 ++++++++++++++++++ ...r_source_impl.cpp => tile_source_impl.cpp} | 10 +- ...r_source_impl.hpp => tile_source_impl.hpp} | 4 +- src/mbgl/style/sources/vector_source.cpp | 79 ++----------- src/mbgl/style/sources/vector_source_impl.cpp | 21 ---- src/mbgl/style/sources/vector_source_impl.hpp | 20 ---- test/CMakeLists.txt | 1 + .../conversion/raster_dem_options.test.cpp | 48 ++++++++ 28 files changed, 347 insertions(+), 285 deletions(-) create mode 100644 include/mbgl/style/conversion/raster_dem_options.hpp create mode 100644 include/mbgl/style/sources/tile_source.hpp create mode 100644 src/mbgl/style/conversion/raster_dem_options.cpp create mode 100644 src/mbgl/style/sources/tile_source.cpp rename src/mbgl/style/sources/{raster_source_impl.cpp => tile_source_impl.cpp} (51%) rename src/mbgl/style/sources/{raster_source_impl.hpp => tile_source_impl.hpp} (81%) delete mode 100644 src/mbgl/style/sources/vector_source_impl.cpp delete mode 100644 src/mbgl/style/sources/vector_source_impl.hpp create mode 100644 test/style/conversion/raster_dem_options.test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d8890d5bb8bf..8f208a501ba4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,6 +311,7 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/light.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/position.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/property_value.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/raster_dem_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/rotation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/tileset.hpp @@ -378,6 +379,7 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/geojson_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/image_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_dem_source.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/tile_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/vector_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sprite.hpp @@ -690,6 +692,7 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/light.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/position.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/property_value.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/raster_dem_options.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/rotation.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/stringify.hpp @@ -815,12 +818,11 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/image_source_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/image_source_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_dem_source.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/tile_source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/tile_source_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/tile_source_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/style.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/style_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/style_impl.hpp diff --git a/bazel/core.bzl b/bazel/core.bzl index 4ecc9a59b435..31a59b6429ed 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -345,6 +345,7 @@ MLN_CORE_SOURCE = [ "src/mbgl/style/conversion/light.cpp", "src/mbgl/style/conversion/position.cpp", "src/mbgl/style/conversion/property_value.cpp", + "src/mbgl/style/conversion/raster_dem_options.cpp", "src/mbgl/style/conversion/rotation.cpp", "src/mbgl/style/conversion/source.cpp", "src/mbgl/style/conversion/stringify.hpp", @@ -450,12 +451,11 @@ MLN_CORE_SOURCE = [ "src/mbgl/style/sources/image_source_impl.cpp", "src/mbgl/style/sources/image_source_impl.hpp", "src/mbgl/style/sources/raster_dem_source.cpp", + "src/mbgl/style/sources/tile_source.cpp", "src/mbgl/style/sources/raster_source.cpp", - "src/mbgl/style/sources/raster_source_impl.cpp", - "src/mbgl/style/sources/raster_source_impl.hpp", + "src/mbgl/style/sources/tile_source_impl.cpp", + "src/mbgl/style/sources/tile_source_impl.hpp", "src/mbgl/style/sources/vector_source.cpp", - "src/mbgl/style/sources/vector_source_impl.cpp", - "src/mbgl/style/sources/vector_source_impl.hpp", "src/mbgl/style/style.cpp", "src/mbgl/style/style_impl.cpp", "src/mbgl/style/style_impl.hpp", @@ -696,6 +696,7 @@ MLN_CORE_HEADERS = [ "include/mbgl/style/conversion/light.hpp", "include/mbgl/style/conversion/position.hpp", "include/mbgl/style/conversion/property_value.hpp", + "include/mbgl/style/conversion/raster_dem_options.hpp", "include/mbgl/style/conversion/rotation.hpp", "include/mbgl/style/conversion/source.hpp", "include/mbgl/style/conversion/tileset.hpp", @@ -755,6 +756,7 @@ MLN_CORE_HEADERS = [ "include/mbgl/style/sources/geojson_source.hpp", "include/mbgl/style/sources/image_source.hpp", "include/mbgl/style/sources/raster_dem_source.hpp", + "include/mbgl/style/sources/tile_source.hpp", "include/mbgl/style/sources/raster_source.hpp", "include/mbgl/style/sources/vector_source.hpp", "include/mbgl/style/sprite.hpp", diff --git a/include/mbgl/style/conversion/raster_dem_options.hpp b/include/mbgl/style/conversion/raster_dem_options.hpp new file mode 100644 index 000000000000..5962dbba0d1f --- /dev/null +++ b/include/mbgl/style/conversion/raster_dem_options.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + std::optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/include/mbgl/style/sources/raster_dem_source.hpp b/include/mbgl/style/sources/raster_dem_source.hpp index 42e27cd078e0..a7738d7f1a26 100644 --- a/include/mbgl/style/sources/raster_dem_source.hpp +++ b/include/mbgl/style/sources/raster_dem_source.hpp @@ -6,14 +6,25 @@ namespace mbgl { -class AsyncRequest; - namespace style { +struct RasterDEMOptions { + std::optional encoding = std::nullopt; +}; + class RasterDEMSource : public RasterSource { public: - RasterDEMSource(std::string id, variant urlOrTileset, uint16_t tileSize); + RasterDEMSource(std::string id, + variant urlOrTileset, + uint16_t tileSize, + std::optional options = std::nullopt); bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; + +protected: + void setTilesetOverrides(Tileset& tileset) override; + +private: + std::optional options; }; template <> diff --git a/include/mbgl/style/sources/raster_source.hpp b/include/mbgl/style/sources/raster_source.hpp index 58002c28437e..97e2911e42fc 100644 --- a/include/mbgl/style/sources/raster_source.hpp +++ b/include/mbgl/style/sources/raster_source.hpp @@ -1,45 +1,21 @@ #pragma once -#include +#include #include #include namespace mbgl { -class AsyncRequest; - namespace style { -class RasterSource : public Source { +class RasterSource : public TileSource { public: RasterSource(std::string id, variant urlOrTileset, uint16_t tileSize, SourceType sourceType = SourceType::Raster); - ~RasterSource() override; - - const variant& getURLOrTileset() const; - std::optional getURL() const; - - uint16_t getTileSize() const; - - class Impl; - const Impl& impl() const; - - void loadDescription(FileSource&) final; bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; - - mapbox::base::WeakPtr makeWeakPtr() final { return weakFactory.makeWeakPtr(); } - -protected: - Mutable createMutable() const noexcept final; - -private: - const variant urlOrTileset; - std::unique_ptr req; - mapbox::base::WeakPtrFactory weakFactory{this}; - // Do not add members here, see `WeakPtrFactory` }; template <> diff --git a/include/mbgl/style/sources/tile_source.hpp b/include/mbgl/style/sources/tile_source.hpp new file mode 100644 index 000000000000..bbeb8de72655 --- /dev/null +++ b/include/mbgl/style/sources/tile_source.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +class AsyncRequest; + +namespace style { + +class TileSource : public Source { +public: + TileSource(std::string id, variant urlOrTileset, uint16_t tileSize, SourceType sourceType); + ~TileSource() override; + + const variant& getURLOrTileset() const; + std::optional getURL() const; + + uint16_t getTileSize() const; + + class Impl; + const Impl& impl() const; + + void loadDescription(FileSource&) final; + + mapbox::base::WeakPtr makeWeakPtr() final { return weakFactory.makeWeakPtr(); } + +protected: + Mutable createMutable() const noexcept final; + virtual void setTilesetOverrides(Tileset& tileset); + +private: + const variant urlOrTileset; + std::unique_ptr req; + mapbox::base::WeakPtrFactory weakFactory{this}; + // Do not add members here, see `WeakPtrFactory` +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::Raster; +} + +} // namespace style +} // namespace mbgl diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp index 88ef1602abb7..6e5672c98e9b 100644 --- a/include/mbgl/style/sources/vector_source.hpp +++ b/include/mbgl/style/sources/vector_source.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -10,21 +10,14 @@ class AsyncRequest; namespace style { -class VectorSource final : public Source { +class VectorSource final : public TileSource { public: VectorSource(std::string id, variant urlOrTileset, std::optional maxZoom = std::nullopt, std::optional minZoom = std::nullopt); - ~VectorSource() final; - const variant& getURLOrTileset() const; - std::optional getURL() const; - - class Impl; - const Impl& impl() const; - - void loadDescription(FileSource&) final; + void setTilesetOverrides(Tileset& tileset) override; /// @brief Gets the tile urls for this vector source. /// @return List of tile urls. @@ -36,18 +29,9 @@ class VectorSource final : public Source { bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; - mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } - -protected: - Mutable createMutable() const noexcept final; - private: - const variant urlOrTileset; - std::unique_ptr req; std::optional maxZoom; std::optional minZoom; - mapbox::base::WeakPtrFactory weakFactory{this}; - // Do not add members here, see `WeakPtrFactory` }; template <> diff --git a/src/mbgl/renderer/render_source.cpp b/src/mbgl/renderer/render_source.cpp index 46eddb69cef6..2188caf4143c 100644 --- a/src/mbgl/renderer/render_source.cpp +++ b/src/mbgl/renderer/render_source.cpp @@ -24,13 +24,13 @@ std::unique_ptr RenderSource::create(const Immutable const TaggedScheduler& threadPool_) { switch (impl->type) { case SourceType::Vector: - return std::make_unique(staticImmutableCast(impl), + return std::make_unique(staticImmutableCast(impl), std::move(threadPool_)); case SourceType::Raster: - return std::make_unique(staticImmutableCast(impl), + return std::make_unique(staticImmutableCast(impl), std::move(threadPool_)); case SourceType::RasterDEM: - return std::make_unique(staticImmutableCast(impl), + return std::make_unique(staticImmutableCast(impl), std::move(threadPool_)); case SourceType::GeoJSON: return std::make_unique(staticImmutableCast(impl), diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index ef95adbd3c4c..753dc6a208a1 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -10,12 +10,12 @@ namespace mbgl { using namespace style; -RenderRasterDEMSource::RenderRasterDEMSource(Immutable impl_, +RenderRasterDEMSource::RenderRasterDEMSource(Immutable impl_, const TaggedScheduler& threadPool_) : RenderTileSetSource(std::move(impl_), threadPool_) {} -const style::RasterSource::Impl& RenderRasterDEMSource::impl() const { - return static_cast(*baseImpl); +const style::TileSource::Impl& RenderRasterDEMSource::impl() const { + return static_cast(*baseImpl); } const std::optional& RenderRasterDEMSource::getTileset() const { diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.hpp b/src/mbgl/renderer/sources/render_raster_dem_source.hpp index 8531c6be86c7..6cacb6d475d9 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.hpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.hpp @@ -1,13 +1,13 @@ #pragma once #include -#include +#include namespace mbgl { class RenderRasterDEMSource final : public RenderTileSetSource { public: - explicit RenderRasterDEMSource(Immutable, const TaggedScheduler&); + explicit RenderRasterDEMSource(Immutable, const TaggedScheduler&); std::unordered_map> queryRenderedFeatures( const ScreenLineString& geometry, @@ -27,7 +27,7 @@ class RenderRasterDEMSource final : public RenderTileSetSource { const TileParameters&) override; const std::optional& getTileset() const override; - const style::RasterSource::Impl& impl() const; + const style::TileSource::Impl& impl() const; void onTileChanged(Tile&) override; }; diff --git a/src/mbgl/renderer/sources/render_raster_source.cpp b/src/mbgl/renderer/sources/render_raster_source.cpp index 0f32e51a4d84..072f709fb0c7 100644 --- a/src/mbgl/renderer/sources/render_raster_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_source.cpp @@ -8,11 +8,11 @@ namespace mbgl { using namespace style; -RenderRasterSource::RenderRasterSource(Immutable impl_, const TaggedScheduler& threadPool_) +RenderRasterSource::RenderRasterSource(Immutable impl_, const TaggedScheduler& threadPool_) : RenderTileSetSource(std::move(impl_), threadPool_) {} -inline const style::RasterSource::Impl& RenderRasterSource::impl() const { - return static_cast(*baseImpl); +inline const style::TileSource::Impl& RenderRasterSource::impl() const { + return static_cast(*baseImpl); } const std::optional& RenderRasterSource::getTileset() const { diff --git a/src/mbgl/renderer/sources/render_raster_source.hpp b/src/mbgl/renderer/sources/render_raster_source.hpp index d650e974eee2..09f0d7a8b489 100644 --- a/src/mbgl/renderer/sources/render_raster_source.hpp +++ b/src/mbgl/renderer/sources/render_raster_source.hpp @@ -1,13 +1,13 @@ #pragma once #include -#include +#include namespace mbgl { class RenderRasterSource final : public RenderTileSetSource { public: - explicit RenderRasterSource(Immutable, const TaggedScheduler&); + explicit RenderRasterSource(Immutable, const TaggedScheduler&); private: void prepare(const SourcePrepareParameters&) final; @@ -29,7 +29,7 @@ class RenderRasterSource final : public RenderTileSetSource { const TileParameters&) override; const std::optional& getTileset() const override; - const style::RasterSource::Impl& impl() const; + const style::TileSource::Impl& impl() const; }; } // namespace mbgl diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp index 3b09f275854c..619d4d5c50db 100644 --- a/src/mbgl/renderer/sources/render_tile_source.hpp +++ b/src/mbgl/renderer/sources/render_tile_source.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/mbgl/renderer/sources/render_vector_source.cpp b/src/mbgl/renderer/sources/render_vector_source.cpp index 2ccaf549257a..383de133a7f0 100644 --- a/src/mbgl/renderer/sources/render_vector_source.cpp +++ b/src/mbgl/renderer/sources/render_vector_source.cpp @@ -8,11 +8,11 @@ namespace mbgl { using namespace style; -RenderVectorSource::RenderVectorSource(Immutable impl_, const TaggedScheduler& threadPool_) +RenderVectorSource::RenderVectorSource(Immutable impl_, const TaggedScheduler& threadPool_) : RenderTileSetSource(std::move(impl_), threadPool_) {} const std::optional& RenderVectorSource::getTileset() const { - return static_cast(*baseImpl).tileset; + return static_cast(*baseImpl).tileset; } void RenderVectorSource::updateInternal(const Tileset& tileset, diff --git a/src/mbgl/renderer/sources/render_vector_source.hpp b/src/mbgl/renderer/sources/render_vector_source.hpp index fff332c4529a..aa3d7c1228d5 100644 --- a/src/mbgl/renderer/sources/render_vector_source.hpp +++ b/src/mbgl/renderer/sources/render_vector_source.hpp @@ -2,13 +2,13 @@ #include #include -#include +#include namespace mbgl { class RenderVectorSource final : public RenderTileSetSource { public: - explicit RenderVectorSource(Immutable, const TaggedScheduler&); + explicit RenderVectorSource(Immutable, const TaggedScheduler&); private: void updateInternal(const Tileset&, diff --git a/src/mbgl/style/conversion/raster_dem_options.cpp b/src/mbgl/style/conversion/raster_dem_options.cpp new file mode 100644 index 000000000000..29f50dffce9c --- /dev/null +++ b/src/mbgl/style/conversion/raster_dem_options.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace conversion { + +std::optional Converter::operator()(const Convertible& value, Error& error) const { + RasterDEMOptions options; + + auto encodingValue = objectMember(value, "encoding"); + if (encodingValue) { + std::optional encoding = toString(*encodingValue); + if (encoding && *encoding == "terrarium") { + options.encoding = {Tileset::DEMEncoding::Terrarium}; + } else if (encoding && *encoding == "mapbox") { + options.encoding = {Tileset::DEMEncoding::Mapbox}; + } else { + error.message = + "invalid raster-dem encoding type - valid types are 'mapbox' " + "and 'terrarium'"; + return std::nullopt; + } + } + + return {std::move(options)}; +} + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/style/conversion/source.cpp b/src/mbgl/style/conversion/source.cpp index 75c22c849287..0ef4cbbf2c88 100644 --- a/src/mbgl/style/conversion/source.cpp +++ b/src/mbgl/style/conversion/source.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -76,7 +77,14 @@ static std::optional> convertRasterDEMSource(const std:: tileSize = static_cast(*size); } - return {std::make_unique(id, std::move(*urlOrTileset), tileSize)}; + /* + TODO: Refactor TileJSON parsing responsibilities. Currently `Tileset` handles full TileJSON parsing with optional + parameters. Since style.json can contain TileJSON parameter overrides or non-TileJSON spec parameters, a + separate mechanism is needed. Ideally these two pathways share parsing logic. + */ + std::optional options = convert(value, error); + + return {std::make_unique(id, std::move(*urlOrTileset), tileSize, options)}; } static std::optional> convertVectorSource(const std::string& id, diff --git a/src/mbgl/style/conversion/tileset.cpp b/src/mbgl/style/conversion/tileset.cpp index 417842f0f4a9..c18a83339493 100644 --- a/src/mbgl/style/conversion/tileset.cpp +++ b/src/mbgl/style/conversion/tileset.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -38,15 +39,10 @@ std::optional Converter::operator()(const Convertible& value, } } - auto encodingValue = objectMember(value, "encoding"); - if (encodingValue) { - std::optional encoding = toString(*encodingValue); - if (encoding && *encoding == "terrarium") { - result.encoding = Tileset::DEMEncoding::Terrarium; - } else if (encoding && *encoding != "mapbox") { - error.message = - "invalid raster-dem encoding type - valid types are 'mapbox' " - "and 'terrarium' "; + auto rasterDEMOptions = convert(value, error); + if (rasterDEMOptions) { + if (std::optional encoding = rasterDEMOptions.value().encoding) { + result.encoding = encoding.value(); } } diff --git a/src/mbgl/style/sources/raster_dem_source.cpp b/src/mbgl/style/sources/raster_dem_source.cpp index 98a83ee87070..805984a7e6d9 100644 --- a/src/mbgl/style/sources/raster_dem_source.cpp +++ b/src/mbgl/style/sources/raster_dem_source.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -11,12 +11,24 @@ namespace mbgl { namespace style { -RasterDEMSource::RasterDEMSource(std::string id, variant urlOrTileset_, uint16_t tileSize) - : RasterSource(std::move(id), std::move(urlOrTileset_), tileSize, SourceType::RasterDEM) {} +RasterDEMSource::RasterDEMSource(std::string id, + variant urlOrTileset_, + uint16_t tileSize, + std::optional options_) + : RasterSource(std::move(id), std::move(urlOrTileset_), tileSize, SourceType::RasterDEM), + options(std::move(options_)) {} bool RasterDEMSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const { return mbgl::underlying_type(Tile::Kind::RasterDEM) == mbgl::underlying_type(info->tileKind); } +void RasterDEMSource::setTilesetOverrides(Tileset& tileset) { + if (options) { + if (std::optional encoding = options.value().encoding) { + tileset.encoding = encoding.value(); + } + } +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/sources/raster_source.cpp b/src/mbgl/style/sources/raster_source.cpp index e0b58480e0a8..260fc30e1096 100644 --- a/src/mbgl/style/sources/raster_source.cpp +++ b/src/mbgl/style/sources/raster_source.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -17,85 +17,11 @@ RasterSource::RasterSource(std::string id, variant urlOrTileset_, uint16_t tileSize, SourceType sourceType) - : Source(makeMutable(sourceType, std::move(id), tileSize)), - urlOrTileset(std::move(urlOrTileset_)) {} - -RasterSource::~RasterSource() = default; - -const RasterSource::Impl& RasterSource::impl() const { - return static_cast(*baseImpl); -} - -const variant& RasterSource::getURLOrTileset() const { - return urlOrTileset; -} - -std::optional RasterSource::getURL() const { - if (urlOrTileset.is()) { - return {}; - } - - return urlOrTileset.get(); -} - -uint16_t RasterSource::getTileSize() const { - return impl().getTileSize(); -} - -void RasterSource::loadDescription(FileSource& fileSource) { - if (urlOrTileset.is()) { - baseImpl = makeMutable(impl(), urlOrTileset.get()); - loaded = true; - observer->onSourceLoaded(*this); - return; - } - - if (req) { - return; - } - - const auto& rawURL = urlOrTileset.get(); - const auto& url = util::mapbox::canonicalizeSourceURL(fileSource.getResourceOptions().tileServerOptions(), rawURL); - - req = fileSource.request(Resource::source(url), [this, url, &fileSource](const Response& res) { - if (res.error) { - observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(res.error->message))); - } else if (res.notModified) { - return; - } else if (res.noContent) { - observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); - } else { - conversion::Error error; - std::optional tileset = conversion::convertJSON(*res.data, error); - if (!tileset) { - observer->onSourceError(*this, std::make_exception_ptr(util::StyleParseException(error.message))); - return; - } - const auto& tileServerOptions = fileSource.getResourceOptions().tileServerOptions(); - if (tileServerOptions.uriSchemeAlias() == "mapbox") { - util::mapbox::canonicalizeTileset(tileServerOptions, *tileset, url, getType(), getTileSize()); - } - bool changed = impl().tileset != *tileset; - - baseImpl = makeMutable(impl(), *tileset); - loaded = true; - - observer->onSourceLoaded(*this); - - if (changed) { - observer->onSourceChanged(*this); - } - } - }); -} + : TileSource(id, urlOrTileset_, tileSize, sourceType) {} bool RasterSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const { return mbgl::underlying_type(Tile::Kind::Raster) == mbgl::underlying_type(info->tileKind); } -Mutable RasterSource::createMutable() const noexcept { - return staticMutableCast(makeMutable(impl())); -} - } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/sources/tile_source.cpp b/src/mbgl/style/sources/tile_source.cpp new file mode 100644 index 000000000000..5eb187220e1e --- /dev/null +++ b/src/mbgl/style/sources/tile_source.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { + +TileSource::TileSource(std::string id, + variant urlOrTileset_, + uint16_t tileSize, + SourceType sourceType) + : Source(makeMutable(sourceType, std::move(id), tileSize)), + urlOrTileset(std::move(urlOrTileset_)) {} + +TileSource::~TileSource() = default; + +const TileSource::Impl& TileSource::impl() const { + return static_cast(*baseImpl); +} + +const variant& TileSource::getURLOrTileset() const { + return urlOrTileset; +} + +std::optional TileSource::getURL() const { + if (urlOrTileset.is()) { + return {}; + } + + return urlOrTileset.get(); +} + +uint16_t TileSource::getTileSize() const { + return impl().getTileSize(); +} + +void TileSource::loadDescription(FileSource& fileSource) { + if (urlOrTileset.is()) { + baseImpl = makeMutable(impl(), urlOrTileset.get()); + loaded = true; + observer->onSourceLoaded(*this); + return; + } + + if (req) { + return; + } + + const auto& rawURL = urlOrTileset.get(); + const auto& url = util::mapbox::canonicalizeSourceURL(fileSource.getResourceOptions().tileServerOptions(), rawURL); + + req = fileSource.request(Resource::source(url), [this, url, &fileSource](const Response& res) { + if (res.error) { + observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(res.error->message))); + } else if (res.notModified) { + return; + } else if (res.noContent) { + observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); + } else { + conversion::Error error; + std::optional tileset = conversion::convertJSON(*res.data, error); + if (!tileset) { + observer->onSourceError(*this, std::make_exception_ptr(util::StyleParseException(error.message))); + return; + } + const auto& tileServerOptions = fileSource.getResourceOptions().tileServerOptions(); + if (tileServerOptions.uriSchemeAlias() == "mapbox") { + util::mapbox::canonicalizeTileset(tileServerOptions, *tileset, url, getType(), getTileSize()); + } + + this->setTilesetOverrides(*tileset); + + bool changed = impl().tileset != *tileset; + + baseImpl = makeMutable(impl(), *tileset); + loaded = true; + + observer->onSourceLoaded(*this); + + if (changed) { + observer->onSourceChanged(*this); + } + } + }); +} + +void TileSource::setTilesetOverrides(Tileset&) { + // Default empty implementation, subclasses can override +} + +Mutable TileSource::createMutable() const noexcept { + return staticMutableCast(makeMutable(impl())); +} + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/style/sources/raster_source_impl.cpp b/src/mbgl/style/sources/tile_source_impl.cpp similarity index 51% rename from src/mbgl/style/sources/raster_source_impl.cpp rename to src/mbgl/style/sources/tile_source_impl.cpp index 6836507925fc..f92c72ba2502 100644 --- a/src/mbgl/style/sources/raster_source_impl.cpp +++ b/src/mbgl/style/sources/tile_source_impl.cpp @@ -1,22 +1,22 @@ -#include +#include namespace mbgl { namespace style { -RasterSource::Impl::Impl(SourceType sourceType, std::string id_, uint16_t tileSize_) +TileSource::Impl::Impl(SourceType sourceType, std::string id_, uint16_t tileSize_ = util::tileSize_I) : Source::Impl(sourceType, std::move(id_)), tileSize(tileSize_) {} -RasterSource::Impl::Impl(const Impl& other, Tileset tileset_) +TileSource::Impl::Impl(const Impl& other, Tileset tileset_) : Source::Impl(other), tileset(std::move(tileset_)), tileSize(other.tileSize) {} -uint16_t RasterSource::Impl::getTileSize() const { +uint16_t TileSource::Impl::getTileSize() const { return tileSize; } -std::optional RasterSource::Impl::getAttribution() const { +std::optional TileSource::Impl::getAttribution() const { if (!tileset) { return {}; } diff --git a/src/mbgl/style/sources/raster_source_impl.hpp b/src/mbgl/style/sources/tile_source_impl.hpp similarity index 81% rename from src/mbgl/style/sources/raster_source_impl.hpp rename to src/mbgl/style/sources/tile_source_impl.hpp index 23443bf27212..277592980b0b 100644 --- a/src/mbgl/style/sources/raster_source_impl.hpp +++ b/src/mbgl/style/sources/tile_source_impl.hpp @@ -1,12 +1,12 @@ #pragma once -#include +#include #include namespace mbgl { namespace style { -class RasterSource::Impl : public Source::Impl { +class TileSource::Impl : public Source::Impl { public: Impl(SourceType sourceType, std::string id, uint16_t tileSize); Impl(const Impl&, Tileset); diff --git a/src/mbgl/style/sources/vector_source.cpp b/src/mbgl/style/sources/vector_source.cpp index 47630bf3e9f4..bd61f5ed2126 100644 --- a/src/mbgl/style/sources/vector_source.cpp +++ b/src/mbgl/style/sources/vector_source.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -18,78 +18,17 @@ VectorSource::VectorSource(std::string id, variant urlOrTileset_, std::optional maxZoom_, std::optional minZoom_) - : Source(makeMutable(std::move(id))), - urlOrTileset(std::move(urlOrTileset_)), + : TileSource(id, urlOrTileset_, util::tileSize_I, SourceType::Vector), maxZoom(std::move(maxZoom_)), minZoom(std::move(minZoom_)) {} -VectorSource::~VectorSource() = default; - -const VectorSource::Impl& VectorSource::impl() const { - return static_cast(*baseImpl); -} - -const variant& VectorSource::getURLOrTileset() const { - return urlOrTileset; -} - -std::optional VectorSource::getURL() const { - if (urlOrTileset.is()) { - return {}; - } - - return urlOrTileset.get(); -} - -void VectorSource::loadDescription(FileSource& fileSource) { - if (urlOrTileset.is()) { - baseImpl = makeMutable(impl(), urlOrTileset.get()); - loaded = true; - observer->onSourceLoaded(*this); - return; +void VectorSource::setTilesetOverrides(Tileset& tileset) { + if (maxZoom) { + tileset.zoomRange.max = static_cast(*maxZoom); } - - if (req) { - return; + if (minZoom) { + tileset.zoomRange.min = static_cast(*minZoom); } - - const auto& rawURL = urlOrTileset.get(); - const auto& url = util::mapbox::canonicalizeSourceURL(fileSource.getResourceOptions().tileServerOptions(), rawURL); - - req = fileSource.request(Resource::source(url), [this, url, &fileSource](const Response& res) { - if (res.error) { - observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(res.error->message))); - } else if (res.notModified) { - return; - } else if (res.noContent) { - observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); - } else { - conversion::Error error; - auto tileset = conversion::convertJSON(*res.data, error); - if (!tileset) { - observer->onSourceError(*this, std::make_exception_ptr(util::StyleParseException(error.message))); - return; - } - if (maxZoom) { - tileset->zoomRange.max = static_cast(*maxZoom); - } - if (minZoom) { - tileset->zoomRange.min = static_cast(*minZoom); - } - const TileServerOptions& tileServerOptions = fileSource.getResourceOptions().tileServerOptions(); - util::mapbox::canonicalizeTileset(tileServerOptions, *tileset, url, getType(), util::tileSize_I); - bool changed = impl().tileset != *tileset; - - baseImpl = makeMutable(impl(), *tileset); - loaded = true; - - observer->onSourceLoaded(*this); - - if (changed) { - observer->onSourceChanged(*this); - } - } - }); } const std::vector VectorSource::getTiles() const { @@ -115,9 +54,5 @@ bool VectorSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) con return mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(info->tileKind); } -Mutable VectorSource::createMutable() const noexcept { - return staticMutableCast(makeMutable(impl())); -} - } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/sources/vector_source_impl.cpp b/src/mbgl/style/sources/vector_source_impl.cpp deleted file mode 100644 index 3f202d0e14ac..000000000000 --- a/src/mbgl/style/sources/vector_source_impl.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -namespace mbgl { -namespace style { - -VectorSource::Impl::Impl(std::string id_) - : Source::Impl(SourceType::Vector, std::move(id_)) {} - -VectorSource::Impl::Impl(const Impl& other, Tileset tileset_) - : Source::Impl(other), - tileset(std::move(tileset_)) {} - -std::optional VectorSource::Impl::getAttribution() const { - if (!tileset) { - return {}; - } - return tileset->attribution; -} - -} // namespace style -} // namespace mbgl diff --git a/src/mbgl/style/sources/vector_source_impl.hpp b/src/mbgl/style/sources/vector_source_impl.hpp deleted file mode 100644 index 4d7b9d259770..000000000000 --- a/src/mbgl/style/sources/vector_source_impl.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include -#include - -namespace mbgl { -namespace style { - -class VectorSource::Impl : public Source::Impl { -public: - Impl(std::string id); - Impl(const Impl&, Tileset); - - std::optional getAttribution() const final; - - const std::optional tileset; -}; - -} // namespace style -} // namespace mbgl diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 162caf3a7868..1fa8fffcbef0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -51,6 +51,7 @@ add_library( ${PROJECT_SOURCE_DIR}/test/style/conversion/light.test.cpp ${PROJECT_SOURCE_DIR}/test/style/conversion/padding.test.cpp ${PROJECT_SOURCE_DIR}/test/style/conversion/property_value.test.cpp + ${PROJECT_SOURCE_DIR}/test/style/conversion/raster_dem_options.test.cpp ${PROJECT_SOURCE_DIR}/test/style/conversion/stringify.test.cpp ${PROJECT_SOURCE_DIR}/test/style/conversion/tileset.test.cpp ${PROJECT_SOURCE_DIR}/test/style/expression/dependency.test.cpp diff --git a/test/style/conversion/raster_dem_options.test.cpp b/test/style/conversion/raster_dem_options.test.cpp new file mode 100644 index 000000000000..416bd3f27485 --- /dev/null +++ b/test/style/conversion/raster_dem_options.test.cpp @@ -0,0 +1,48 @@ +#include + +#include +#include +#include + +#include + +using namespace mbgl; +using namespace mbgl::style; +using namespace mbgl::style::conversion; + +TEST(RasterDEMOptions, Basic) { + Error error; + std::optional converted = convertJSON("{}", error); + ASSERT_TRUE((bool)converted); +} + +TEST(RasterDEMOptions, ErrorHandling) { + Error error; + std::optional converted = convertJSON( + R"JSON({ + "encoding": "this isn't a valid encoding" + })JSON", + error); + ASSERT_FALSE(converted); + ASSERT_EQ(error.message, "invalid raster-dem encoding type - valid types are 'mapbox' and 'terrarium'"); +} + +TEST(RasterDEMOptions, TerrariumEncodingParsed) { + Error error; + std::optional converted = convertJSON( + R"JSON({ + "encoding": "terrarium" + })JSON", + error); + ASSERT_EQ(converted.value().encoding, Tileset::DEMEncoding::Terrarium); +} + +TEST(RasterDEMOptions, MapboxEncodingParsed) { + Error error; + std::optional converted = convertJSON( + R"JSON({ + "encoding": "mapbox" + })JSON", + error); + ASSERT_EQ(converted.value().encoding, Tileset::DEMEncoding::Mapbox); +} From 33e56f13e3328fbfecf8d4e2e8f93039ec44390b Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 2 Aug 2025 01:05:01 +0200 Subject: [PATCH 306/339] Add static libraries to Linux amalgamation (#3699) --- .../linux/cmake/find_static_library.cmake | 33 +++++++++++++++++++ platform/linux/linux.cmake | 18 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 platform/linux/cmake/find_static_library.cmake diff --git a/platform/linux/cmake/find_static_library.cmake b/platform/linux/cmake/find_static_library.cmake new file mode 100644 index 000000000000..d3fd482a6edb --- /dev/null +++ b/platform/linux/cmake/find_static_library.cmake @@ -0,0 +1,33 @@ +function(find_static_library result_var) + # Usage: find_static_library(VAR_NAME NAMES name1 [name2 ...]) + set(options) + set(one_value_args) + set(multi_value_args NAMES) + cmake_parse_arguments(FSL "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + if(NOT FSL_NAMES) + message(FATAL_ERROR "find_static_library: NAMES argument required") + endif() + + # Clear any previous cached result for this variable + unset(${result_var} CACHE) + + # Temporarily force CMake to look only for .a + set(_old_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + + # Invoke find_library using the caller's var name + find_library(${result_var} NAMES ${FSL_NAMES}) + + # Restore original suffix list + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes}) + + # Check result + if(NOT ${result_var}) + message(FATAL_ERROR + "find_static_library: could not find any of [${FSL_NAMES}] as a .a") + endif() + + message(STATUS + "find_static_library: Found static [${FSL_NAMES}] -> ${${result_var}}") +endfunction() diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index cdeccac815f5..fde921dc794f 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -184,6 +184,16 @@ target_link_libraries( # Bundle system provided libraries if(MLN_CORE_INCLUDE_DEPS AND NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") message(STATUS "Found armerge: ${ARMERGE}") + include(${CMAKE_CURRENT_LIST_DIR}/cmake/find_static_library.cmake) + find_static_library(PNG_STATIC_LIB NAMES png) + find_static_library(ZLIB_STATIC_LIB NAMES z) + find_static_library(JPEG_STATIC_LIB NAMES jpeg) + find_static_library(WEBP_STATIC_LIB NAMES webp) + find_static_library(CURL_STATIC_LIB NAMES curl) + find_static_library(UV_STATIC_LIB NAMES uv) + find_static_library(OPENSSL_STATIC_LIB NAMES ssl) + find_static_library(SQLITE_STATIC_LIB NAMES sqlite3) + add_custom_command( TARGET mbgl-core POST_BUILD @@ -192,6 +202,14 @@ if(MLN_CORE_INCLUDE_DEPS AND NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQU ${ICUUC_LIBRARY_DIRS}/libicuuc.a ${ICUUC_LIBRARY_DIRS}/libicudata.a ${ICUI18N_LIBRARY_DIRS}/libicui18n.a + ${PNG_STATIC_LIB} + ${ZLIB_STATIC_LIB} + ${JPEG_STATIC_LIB} + ${WEBP_STATIC_LIB} + ${CURL_STATIC_LIB} + ${UV_STATIC_LIB} + ${OPENSSL_STATIC_LIB} + ${SQLITE_STATIC_LIB} ) endif() From a64e8cb7f24a71e35eb9ac6a3af24bdc9d7a5917 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 16:52:10 +0200 Subject: [PATCH 307/339] [pre-commit.ci] pre-commit autoupdate (#3702) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- .../Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e7cc7f307a89..5086e346906e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,7 +19,7 @@ repos: exclude: '(platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$)|(platform/windows/vendor/.*)' - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.7 + rev: v20.1.8 hooks: - id: clang-format files: '.*\.(hpp|cpp|h)' @@ -37,7 +37,7 @@ repos: additional_dependencies: [ shellcheck-py ] - repo: https://github.com/nicklockwood/SwiftFormat - rev: "0.56.4" + rev: "0.57.2" hooks: - id: swiftformat args: [ --swiftversion, "5.8" ] diff --git a/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift b/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift index d35a61539e42..001b8a8c7c05 100644 --- a/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift +++ b/platform/ios/Integration_Tests/Snapshotter Tests/MLNMapSnapshotterSwiftTests.swift @@ -14,7 +14,7 @@ class MLNMapSnapshotterSwiftTests: MLNMapViewIntegrationTest { return options } - override public func setUp() { + override func setUp() { super.setUp() MLNSettings.use(MLNWellKnownTileServer.mapTiler) } From 16be52ed55e79ee453b0f2fc734eef2038a405da Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 7 Aug 2025 05:58:31 +0200 Subject: [PATCH 308/339] Do not run notify-release-on-prs.ts for forks (#3705) --- .github/workflows/android-release.yml | 1 + .github/workflows/ios-ci.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index 617ca0c63d1a..bd3936bd0ae5 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -160,6 +160,7 @@ jobs: working-directory: . - name: Write release notifications + if: github.repository_owner == 'maplibre' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: node .github/scripts/notify-release-on-prs.ts --tag ${{ needs.android-create-release.outputs.version_tag }} diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 53ac9c57b6af..05e88e25572f 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -30,6 +30,7 @@ permissions: id-token: write # needed for AWS contents: write # allow making a release actions: write # for triggering ios-release-cocoapods.yml + issues: write # for notify-release-on-prs.ts jobs: pre_job: @@ -366,7 +367,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Write release notifications - if: env.make_release + if: env.make_release && github.repository_owner == 'maplibre' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: node .github/scripts/notify-release-on-prs.ts --tag ios-v${{ env.version }} From 76d317ebc313cbc14001a5238c34af48a6bb409c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 9 Aug 2025 21:12:46 +0200 Subject: [PATCH 309/339] Improve Core Builds for Linux (#3706) --- .github/workflows/core-release.yml | 4 +- .github/workflows/linux-ci.yml | 68 +++++++++---------- CMakePresets.json | 16 ----- metrics/BUILD.bazel | 2 +- ...{linux-drawable.json => linux-opengl.json} | 0 .../linux/cmake/find_static_library.cmake | 31 ++++----- platform/linux/linux.cmake | 35 +++++----- render-test/BUILD.bazel | 2 +- 8 files changed, 70 insertions(+), 88 deletions(-) rename metrics/{linux-drawable.json => linux-opengl.json} (100%) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index b89ea9667496..ef471de8aa76 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -78,8 +78,8 @@ jobs: - name: Build mbgl-core for Linux run: | - cmake --preset linux-${{ matrix.renderer }}-core -DCMAKE_CXX_COMPILER_LAUNCHER="" - cmake --build --preset linux-${{ matrix.renderer }}-core + cmake --preset linux-${{ matrix.renderer }} -DCMAKE_CXX_COMPILER_LAUNCHER="" + cmake --build build-linux-${{ matrix.renderer }} --target mbgl-core - name: Rename artifact run: | diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 11b30c08104b..fd344cabfd12 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -24,6 +24,9 @@ permissions: contents: read # needed for CodeQL security-events: write # needed for CodeQL +env: + EGL_PLATFORM: surfaceless + jobs: pre_job: runs-on: ubuntu-22.04 @@ -53,7 +56,13 @@ jobs: strategy: fail-fast: true matrix: - renderer: [vulkan, drawable, drawable-rust] + variant: + - renderer: vulkan + rust: false + - renderer: opengl + rust: false + - renderer: opengl + rust: true runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -75,17 +84,8 @@ jobs: - name: Install dependencies run: .github/scripts/install-linux-deps - - if: matrix.renderer == 'drawable-rust' - run: | - echo "renderer_flag_cmake=DMLN_WITH_OPENGL=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" - cargo install cxxbridge-cmd --version 1.0.157 --locked - - - if: matrix.renderer == 'drawable' - run: | - echo "-DMLN_WITH_OPENGL=ON" >> "$GITHUB_ENV" - - - if: matrix.renderer == 'vulkan' - run: echo renderer_flag_cmake="-DMLN_WITH_VULKAN=ON -DMLN_WITH_OPENGL=OFF" >> "$GITHUB_ENV" + - if: matrix.variant.rust + run: cargo install cxxbridge-cmd --version 1.0.157 --locked - name: Install sccache run: | @@ -103,7 +103,7 @@ jobs: role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} role-session-name: ${{ github.run_id }} - - name: Build MapLibre Native Core + - name: Build MapLibre Native env: CI: 1 run: | @@ -118,12 +118,12 @@ jobs: export SCCACHE_S3_NO_CREDENTIALS=1 fi - cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=ON \ + cmake --preset linux-${{ matrix.variant.renderer }} \ + -DMLN_WITH_CLANG_TIDY=ON \ -DCMAKE_C_COMPILER_LAUNCHER=sccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ - -DMLN_WITH_COVERAGE=ON \ - ${{ env.renderer_flag_cmake }} - cmake --build build --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner + -DMLN_WITH_COVERAGE=ON + cmake --build build-linux-${{ matrix.variant.renderer }} --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner # mbgl-render (used for size test) & mbgl-benchmark-runner @@ -131,26 +131,26 @@ jobs: run: sccache --show-stats - name: Upload mbgl-render as artifact - if: matrix.renderer == 'drawable' && github.event_name == 'pull_request' + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: mbgl-render path: | - build/bin/mbgl-render + build-linux-${{ matrix.variant.renderer }}/bin/mbgl-render - name: Upload mbgl-benchmark-runner as artifact - if: matrix.renderer == 'drawable' && github.event_name == 'pull_request' + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: mbgl-benchmark-runner path: | - build/mbgl-benchmark-runner + build-linux-${{ matrix.variant.renderer }}/mbgl-benchmark-runner - name: Upload mbgl-render & mbgl-benchmark-runner to S3 - if: matrix.renderer == 'drawable' && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME run: | - aws s3 cp build/bin/mbgl-render s3://maplibre-native/mbgl-render-main - aws s3 cp build/mbgl-benchmark-runner s3://maplibre-native/mbgl-benchmark-runner-main + aws s3 cp build-linux-${{ matrix.variant.renderer }}/bin/mbgl-render s3://maplibre-native/mbgl-render-main + aws s3 cp build-linux-${{ matrix.variant.renderer }}/mbgl-benchmark-runner s3://maplibre-native/mbgl-benchmark-runner-main # CodeQL @@ -161,39 +161,39 @@ jobs: # unit tests - - run: chmod +x build/mbgl-test-runner + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/mbgl-test-runner - name: Run C++ tests - continue-on-error: ${{ matrix.renderer == 'vulkan' }} - run: xvfb-run -a build/mbgl-test-runner + continue-on-error: ${{ matrix.variant.renderer == 'vulkan' }} + run: xvfb-run -a build-linux-${{ matrix.variant.renderer }}/mbgl-test-runner # render tests - - run: chmod +x build/mbgl-render-test-runner + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/mbgl-render-test-runner - name: Run render test id: render_test run: | - renderer="${{ matrix.renderer }}" + renderer="${{ matrix.variant.renderer }}" if [[ "$renderer" == *-rust ]]; then renderer=${renderer%-rust} fi - xvfb-run -a build/mbgl-render-test-runner --manifestPath=metrics/linux-"$renderer".json + xvfb-run -a build-linux-${{ matrix.variant.renderer }}/mbgl-render-test-runner --manifestPath=metrics/linux-"$renderer".json - name: Upload render test result if: always() && steps.render_test.outcome == 'failure' uses: actions/upload-artifact@v4 with: - name: render-test-result-${{ matrix.renderer }} + name: render-test-result-${{ matrix.variant.renderer }} path: | - metrics/linux-${{ matrix.renderer }}.html + metrics/linux-${{ matrix.variant.renderer }}.html # expression tests - - run: chmod +x build/expression-test/mbgl-expression-test + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/expression-test/mbgl-expression-test - name: Run expression test - run: build/expression-test/mbgl-expression-test + run: build-linux-${{ matrix.variant.renderer }}/expression-test/mbgl-expression-test - if: github.event_name == 'pull_request' uses: ./.github/actions/save-pr-number diff --git a/CMakePresets.json b/CMakePresets.json index ac422dcc5bc6..b60e0de1d044 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -106,14 +106,6 @@ "MLN_WITH_OPENGL": "ON" } }, - { - "name": "linux-opengl-core", - "inherits": "linux-opengl", - "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "OFF" - } - }, { "name": "linux-vulkan", "binaryDir": "${sourceDir}/build-linux-vulkan", @@ -124,14 +116,6 @@ "MLN_WITH_X11": "ON" } }, - { - "name": "linux-vulkan-core", - "inherits": "linux-vulkan", - "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "OFF" - } - }, { "name": "windows", "hidden": true, diff --git a/metrics/BUILD.bazel b/metrics/BUILD.bazel index 658d6c1cdbe8..bc960b23f30c 100644 --- a/metrics/BUILD.bazel +++ b/metrics/BUILD.bazel @@ -22,7 +22,7 @@ filegroup( "ios-render-test-runner-style.json", # iOS only "linux-gcc8-release-metrics.json", "linux-gcc8-release-style.json", - "linux-drawable.json", + "linux-opengl.json", ], visibility = [ "//platform/ios/test/common:__pkg__", diff --git a/metrics/linux-drawable.json b/metrics/linux-opengl.json similarity index 100% rename from metrics/linux-drawable.json rename to metrics/linux-opengl.json diff --git a/platform/linux/cmake/find_static_library.cmake b/platform/linux/cmake/find_static_library.cmake index d3fd482a6edb..e80a518fedab 100644 --- a/platform/linux/cmake/find_static_library.cmake +++ b/platform/linux/cmake/find_static_library.cmake @@ -1,5 +1,5 @@ -function(find_static_library result_var) - # Usage: find_static_library(VAR_NAME NAMES name1 [name2 ...]) +function(find_static_library result_list_var) + # Usage: find_static_library(LIST_VAR NAMES name1 [name2 ...]) set(options) set(one_value_args) set(multi_value_args NAMES) @@ -9,25 +9,24 @@ function(find_static_library result_var) message(FATAL_ERROR "find_static_library: NAMES argument required") endif() - # Clear any previous cached result for this variable - unset(${result_var} CACHE) - - # Temporarily force CMake to look only for .a + # Temporarily restrict to static libs set(_old_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - # Invoke find_library using the caller's var name - find_library(${result_var} NAMES ${FSL_NAMES}) + foreach(lib_name IN LISTS FSL_NAMES) + unset(_found_lib CACHE) + find_library(_found_lib NAMES ${lib_name}) + if(_found_lib) + message(STATUS "find_static_library: Found static [${lib_name}] -> ${_found_lib}") + # Append to result list and return early + set(${result_list_var} "${${result_list_var}};${_found_lib}" PARENT_SCOPE) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes}) + return() + endif() + endforeach() # Restore original suffix list set(CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes}) - # Check result - if(NOT ${result_var}) - message(FATAL_ERROR - "find_static_library: could not find any of [${FSL_NAMES}] as a .a") - endif() - - message(STATUS - "find_static_library: Found static [${FSL_NAMES}] -> ${${result_var}}") + message(FATAL_ERROR "find_static_library: could not find any of the specified static libraries: ${FSL_NAMES}") endfunction() diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index fde921dc794f..5abc3f619b2a 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -175,41 +175,40 @@ target_link_libraries( ${WEBP_LIBRARIES} $<$>:${ICUUC_LIBRARIES}> $<$>:${ICUI18N_LIBRARIES}> - $<$:$,$,mbgl-vendor-icu>> + $<$:mbgl-vendor-icu> PNG::PNG mbgl-vendor-nunicode mbgl-vendor-sqlite ) # Bundle system provided libraries -if(MLN_CORE_INCLUDE_DEPS AND NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") +if(NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") message(STATUS "Found armerge: ${ARMERGE}") include(${CMAKE_CURRENT_LIST_DIR}/cmake/find_static_library.cmake) - find_static_library(PNG_STATIC_LIB NAMES png) - find_static_library(ZLIB_STATIC_LIB NAMES z) - find_static_library(JPEG_STATIC_LIB NAMES jpeg) - find_static_library(WEBP_STATIC_LIB NAMES webp) - find_static_library(CURL_STATIC_LIB NAMES curl) - find_static_library(UV_STATIC_LIB NAMES uv) - find_static_library(OPENSSL_STATIC_LIB NAMES ssl) - find_static_library(SQLITE_STATIC_LIB NAMES sqlite3) + set(STATIC_LIBS "") + + find_static_library(STATIC_LIBS NAMES png) + find_static_library(STATIC_LIBS NAMES z) + find_static_library(STATIC_LIBS NAMES jpeg) + find_static_library(STATIC_LIBS NAMES webp) + find_static_library(STATIC_LIBS NAMES curl) + find_static_library(STATIC_LIBS NAMES uv uv_a) + find_static_library(STATIC_LIBS NAMES ssl) + find_static_library(STATIC_LIBS NAMES crypto) add_custom_command( TARGET mbgl-core POST_BUILD COMMAND armerge --keep-symbols '.*' --output libmbgl-core-amalgam.a $ + $ + $ + $ + $ ${ICUUC_LIBRARY_DIRS}/libicuuc.a ${ICUUC_LIBRARY_DIRS}/libicudata.a ${ICUI18N_LIBRARY_DIRS}/libicui18n.a - ${PNG_STATIC_LIB} - ${ZLIB_STATIC_LIB} - ${JPEG_STATIC_LIB} - ${WEBP_STATIC_LIB} - ${CURL_STATIC_LIB} - ${UV_STATIC_LIB} - ${OPENSSL_STATIC_LIB} - ${SQLITE_STATIC_LIB} + ${STATIC_LIBS} ) endif() diff --git a/render-test/BUILD.bazel b/render-test/BUILD.bazel index d1ead91e0d23..790ab1b8ced4 100644 --- a/render-test/BUILD.bazel +++ b/render-test/BUILD.bazel @@ -45,7 +45,7 @@ cc_test( timeout = "long", args = [ "--manifestPath", - "metrics/linux-drawable.json", + "metrics/linux-opengl.json", ], data = [ "//metrics:render-test-files", From fe158c7e9b0b3f748f88d34ad384a7bcbc2cf903 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 9 Aug 2025 23:40:40 +0200 Subject: [PATCH 310/339] Make additional headers public for core build (#3710) --- .github/workflows/core-release.yml | 5 +- CMakeLists.txt | 58 ++--- LICENSES.core.md | 206 ++++++++++++++++++ bazel/core.bzl | 8 +- {src => include}/mbgl/gfx/command_encoder.hpp | 2 +- {src => include}/mbgl/gfx/debug_group.hpp | 0 6 files changed, 244 insertions(+), 35 deletions(-) rename {src => include}/mbgl/gfx/command_encoder.hpp (97%) rename {src => include}/mbgl/gfx/debug_group.hpp (100%) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index ef471de8aa76..8d313e6b1fda 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -21,7 +21,10 @@ jobs: include \ vendor/maplibre-native-base/include \ vendor/maplibre-native-base/deps/variant/include \ - vendor/maplibre-native-base/deps/geometry.hpp/include + vendor/maplibre-native-base/deps/geometry.hpp/include \ + vendor/maplibre-native-base/deps/geojson.hpp/include \ + vendor/metal-cpp \ + vendor/maplibre-native-base/extras/expected-lite/include - name: Create Release run: | gh release create core-${{ github.sha }} \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f208a501ba4..6525df59428d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,8 +227,8 @@ list(APPEND SRC_FILES ) list(APPEND INCLUDE_FILES - ${PROJECT_SOURCE_DIR}/include/mbgl/actor/actor.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/actor/actor_ref.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/actor/actor.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/actor/aspiring_actor.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/actor/established_actor.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/actor/mailbox.hpp @@ -236,22 +236,22 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/actor/scheduler.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/annotation/annotation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend_scope.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/command_encoder.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/debug_group.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/fill_generator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/gfx_types.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/polyline_generator.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/fill_generator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/renderable.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/renderer_backend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/rendering_stats.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader_registry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader_group.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader_registry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/types.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_layer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_layer_render_parameters.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/background_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/circle_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/fill_extrusion_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/fill_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/heatmap_layer_factory.hpp @@ -259,17 +259,16 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/layer_manager.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/line_layer_factory.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/location_indicator_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/location_indicator_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/raster_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/symbol_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/bound_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/camera.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/change.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/map/map.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/map_observer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/map_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/map_projection.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/map/map.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/mode.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/map/projection_mode.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/math/angles.hpp @@ -280,23 +279,24 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/platform/settings.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/platform/thread.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/query.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_frontend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_observer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer_state.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_source.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/renderer/renderer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/program_parameters.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/shader_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/database_file_source.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source_manager.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/storage/file_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/network_status.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/offline.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/online_file_source.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/storage/resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/resource_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/resource_transform.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/storage/resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/storage/response.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/color_ramp_property_value.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion_impl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/color_ramp_property_value.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/constant.hpp @@ -304,8 +304,8 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/custom_geometry_source_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/filter.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/function.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/geojson.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/geojson_options.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/geojson.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/get_json_type.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/light.hpp @@ -316,7 +316,6 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/tileset.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/transition_options.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion_impl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/assertion.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/at.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/boolean_operator.hpp @@ -324,12 +323,12 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/check_subtype.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/coalesce.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/coercion.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/collator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/collator_expression.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/collator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/comparison.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/compound_expression.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/dsl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/distance.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/dsl.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/error.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/expression.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/find_zoom_curve.hpp @@ -337,8 +336,8 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/format_section_override.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/formatted.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/get_covering_stops.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/image.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/image_expression.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/image.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/in.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/index_of.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/interpolate.hpp @@ -358,15 +357,18 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/within.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/filter.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/image.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layer_properties.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/background_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/circle_layer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_layer_render_parameters.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/fill_extrusion_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/fill_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/heatmap_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/hillshade_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/line_layer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/location_indicator_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/raster_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/symbol_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/light.hpp @@ -379,23 +381,23 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/geojson_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/image_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_dem_source.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/tile_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_source.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/tile_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/vector_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sprite.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/style/style.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/style_property.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/style.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/transition_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/types.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/undefined.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/variable_anchor_offset_collection.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/text/glyph.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/text/glyph_range.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/text/glyph.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_id.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_operation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_necessity.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/util/action_journal.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/tile/tile_operation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/action_journal_options.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/action_journal.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/async_request.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/async_task.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/char_array_buffer.hpp @@ -436,10 +438,10 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/util/run_loop.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/scoped.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/size.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/util/string.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/string_indexer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/util/tile_server_options.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/string.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/thread.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/tile_server_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/tileset.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/timer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/tiny_unordered_map.hpp @@ -450,8 +452,8 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/util/variant.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/vectors.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/work_request.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/util/work_task.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/work_task_impl.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/work_task.hpp ) list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/actor/mailbox.cpp @@ -485,9 +487,7 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/attribute.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/attribute.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/color_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/command_encoder.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/cull_face_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/debug_group.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/depth_mode.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/draw_mode.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/draw_scope.hpp diff --git a/LICENSES.core.md b/LICENSES.core.md index 3d876461c48b..5d014b24cc74 100644 --- a/LICENSES.core.md +++ b/LICENSES.core.md @@ -633,3 +633,209 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` --- + +### [metal-cpp](https://developer.apple.com/metal/cpp/) by Apple + +``` + 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 © 2024 Apple Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` diff --git a/bazel/core.bzl b/bazel/core.bzl index 31a59b6429ed..6dae94b4514f 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -141,9 +141,7 @@ MLN_CORE_SOURCE = [ "src/mbgl/gfx/attribute.cpp", "src/mbgl/gfx/attribute.hpp", "src/mbgl/gfx/color_mode.hpp", - "src/mbgl/gfx/command_encoder.hpp", "src/mbgl/gfx/cull_face_mode.hpp", - "src/mbgl/gfx/debug_group.hpp", "src/mbgl/gfx/depth_mode.hpp", "src/mbgl/gfx/draw_mode.hpp", "src/mbgl/gfx/draw_scope.hpp", @@ -611,6 +609,8 @@ MLN_CORE_SOURCE = [ }) MLN_CORE_HEADERS = [ + "include/mbgl/gfx/command_encoder.hpp", + "include/mbgl/gfx/debug_group.hpp", "include/mbgl/gfx/context.hpp", "include/mbgl/gfx/context_observer.hpp", "include/mbgl/actor/actor.hpp", @@ -840,8 +840,6 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/command_encoder.hpp", "src/mbgl/gl/context.cpp", "src/mbgl/gl/context.hpp", - "src/mbgl/gl/fence.cpp", - "src/mbgl/gl/fence.hpp", "src/mbgl/gl/debugging_extension.cpp", "src/mbgl/gl/debugging_extension.hpp", "src/mbgl/gl/defines.hpp", @@ -849,6 +847,8 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/enum.cpp", "src/mbgl/gl/enum.hpp", "src/mbgl/gl/extension.hpp", + "src/mbgl/gl/fence.cpp", + "src/mbgl/gl/fence.hpp", "src/mbgl/gl/framebuffer.hpp", "src/mbgl/gl/index_buffer_resource.cpp", "src/mbgl/gl/index_buffer_resource.hpp", diff --git a/src/mbgl/gfx/command_encoder.hpp b/include/mbgl/gfx/command_encoder.hpp similarity index 97% rename from src/mbgl/gfx/command_encoder.hpp rename to include/mbgl/gfx/command_encoder.hpp index e6018907b45d..817e67f42a0c 100644 --- a/src/mbgl/gfx/command_encoder.hpp +++ b/include/mbgl/gfx/command_encoder.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include namespace mbgl { namespace gfx { diff --git a/src/mbgl/gfx/debug_group.hpp b/include/mbgl/gfx/debug_group.hpp similarity index 100% rename from src/mbgl/gfx/debug_group.hpp rename to include/mbgl/gfx/debug_group.hpp From 213d1c61870d4b9fe207cb02eae3023099fa2219 Mon Sep 17 00:00:00 2001 From: Scott Hoyt Date: Tue, 12 Aug 2025 02:45:18 -0700 Subject: [PATCH 311/339] Update PMTiles documentation with caching and offline limitations (#3714) --- platform/android/docs/data/PMTiles.md | 2 ++ platform/ios/MapLibre.docc/PMTiles.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/platform/android/docs/data/PMTiles.md b/platform/android/docs/data/PMTiles.md index d18927bd6db6..d490319a2a92 100644 --- a/platform/android/docs/data/PMTiles.md +++ b/platform/android/docs/data/PMTiles.md @@ -2,6 +2,8 @@ Starting MapLibre Android 11.7.0, using [PMTiles](https://docs.protomaps.com/pmtiles/) as a data source is supported. You can prefix your vector tile source with `pmtiles://` to load a PMTiles file. The rest of the URL continue with be `https://` to load a remote PMTiles file, `asset://` to load an asset or `file://` to load a local PMTiles file. +> Note: PMTiles sources currently do not support caching or offline pack downloads. + Oliver Wipfli has made a style available that combines a [Protomaps]() basemap togehter with Foursquare's POI dataset. It is available in the [wipfli/foursquare-os-places-pmtiles](https://github.com/wipfli/foursquare-os-places-pmtiles) repository on GitHub. The style to use is ``` diff --git a/platform/ios/MapLibre.docc/PMTiles.md b/platform/ios/MapLibre.docc/PMTiles.md index edf1c55c8613..fbaa4aa4a0ce 100644 --- a/platform/ios/MapLibre.docc/PMTiles.md +++ b/platform/ios/MapLibre.docc/PMTiles.md @@ -4,6 +4,8 @@ Working with PMTiles Starting MapLibre iOS 6.10.0, using [PMTiles](https://docs.protomaps.com/pmtiles/) as a data source is supported. You can prefix your vector tile source with `pmtiles://` to load a PMTiles file. The rest of the URL continue with be `https://` to load a remote PMTiles file, `asset://` to load an asset or `file://` to load a local PMTiles file. +> Note: PMTiles sources currently do not support caching or offline pack downloads. + Oliver Wipfli has made a style available that combines a [Protomaps]() basemap togehter with Foursquare's POI dataset. It is available in the [wipfli/foursquare-os-places-pmtiles](https://github.com/wipfli/foursquare-os-places-pmtiles) repository on GitHub. The style to use is ``` From 8908056d5f5d607bc58dd0b443725a159a4d7efd Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 14 Aug 2025 16:49:02 +0300 Subject: [PATCH 312/339] Add Sentry to `MapLibreAndroidTestApp` (#3716) Co-authored-by: Bart Louwers Co-authored-by: Bart Louwers --- .github/actions/setup-android-ci/action.yml | 87 +++++++++++++++++++ .github/workflows/android-ci.yml | 76 +--------------- .github/workflows/android-testapp-release.yml | 61 +++++++++++++ .../MapLibreAndroidTestApp/build.gradle.kts | 15 +++- .../src/main/AndroidManifest.xml | 62 +++++++++++++ platform/android/buildSrc/build.gradle.kts | 1 + .../src/main/kotlin/SentryConfigPlugin.kt | 62 +++++++++++++ 7 files changed, 288 insertions(+), 76 deletions(-) create mode 100644 .github/actions/setup-android-ci/action.yml create mode 100644 .github/workflows/android-testapp-release.yml create mode 100644 platform/android/buildSrc/src/main/kotlin/SentryConfigPlugin.kt diff --git a/.github/actions/setup-android-ci/action.yml b/.github/actions/setup-android-ci/action.yml new file mode 100644 index 000000000000..5973709991e8 --- /dev/null +++ b/.github/actions/setup-android-ci/action.yml @@ -0,0 +1,87 @@ +name: setup-android-ci +description: "Sets up Android CI environment" +runs: + using: "composite" + steps: + - name: Free Disk Space (Ubuntu) + if: startsWith(runner.name, 'GitHub Actions') + uses: jlumbroso/free-disk-space@main + with: + tool-cache: true + android: false + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: false + + - name: Validate VERSION + run: .github/scripts/validate-version.sh platform/android/VERSION + working-directory: . + shell: bash + + - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties + shell: bash + + - uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: "17" + + - name: Get CMake and Ninja + uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.24.1 + ninjaVersion: latest + + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - name: npm install + run: npm install --ignore-scripts + working-directory: . + shell: bash + + - name: run platform/android/scripts/generate-style-code.mjs + run: node platform/android/scripts/generate-style-code.mjs + working-directory: . + shell: bash + + - run: | + python3 -m venv venv + source venv/bin/activate + pip3 install pre-commit + shell: bash + + - run: | + source venv/bin/activate + pre-commit run clang-format --all-files + continue-on-error: true # this can mean files are modified, which is not an error + shell: bash + + - run: | + source venv/bin/activate + pre-commit run clang-format --all-files + rm -rf venv + shell: bash + + - uses: infotroph/tree-is-clean@v1 + with: + check_untracked: true + + - uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ github.job }} + append-timestamp: false + max-size: 5G + + - name: restore-gradle-cache + uses: actions/cache@v4 + env: + cache-name: gradle-v1 + with: + path: ~/.gradle + key: ${{ env.cache-name }}-${{ hashFiles('platform/android/buildSrc/src/main/kotlin/maplibre.dependencies.gradle.kts') }}-${{ hashFiles('platform/android/build.gradle.kts') }}-${{ hashFiles('platform/android/local.properties') }}-${{ hashFiles('platform/android/gradle/wrapper/gradle-wrapper.properties') }} + restore-keys: | + - ${{ env.cache-name }} diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index c158711d4d78..bd3abc732c4c 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -51,86 +51,12 @@ jobs: IS_LOCAL_DEVELOPMENT: false MLN_ANDROID_STL: c++_static steps: - - name: Free Disk Space (Ubuntu) - if: startsWith(runner.name, 'GitHub Actions') - uses: jlumbroso/free-disk-space@main - with: - tool-cache: true - android: false - dotnet: true - haskell: true - large-packages: true - docker-images: true - swap-storage: false - - uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - - name: Validate VERSION - run: .github/scripts/validate-version.sh platform/android/VERSION - working-directory: . - - - run: echo "cmake.dir=$(dirname "$(dirname "$(command -v cmake)")")" >> local.properties - - - uses: actions/setup-java@v4 - with: - distribution: "temurin" - java-version: "17" - - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - - uses: actions/setup-node@v4 - with: - node-version-file: ".nvmrc" - - - name: npm install - run: npm install --ignore-scripts - working-directory: . - - - name: run platform/android/scripts/generate-style-code.mjs - run: node platform/android/scripts/generate-style-code.mjs - working-directory: . - - - run: | - python3 -m venv venv - source venv/bin/activate - pip3 install pre-commit - - - run: | - source venv/bin/activate - pre-commit run clang-format --all-files - continue-on-error: true # this can mean files are modified, which is not an error - - - run: | - source venv/bin/activate - pre-commit run clang-format --all-files - rm -rf venv - - - uses: infotroph/tree-is-clean@v1 - with: - check_untracked: true - - - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }} - append-timestamp: false - max-size: 5G - - - name: restore-gradle-cache - uses: actions/cache@v4 - env: - cache-name: gradle-v1 - with: - path: ~/.gradle - key: ${{ env.cache-name }}-${{ hashFiles('platform/android/buildSrc/src/main/kotlin/maplibre.dependencies.gradle.kts') }}-${{ hashFiles('platform/android/build.gradle.kts') }}-${{ hashFiles('platform/android/local.properties') }}-${{ hashFiles('platform/android/gradle/wrapper/gradle-wrapper.properties') }} - restore-keys: | - - ${{ env.cache-name }} + - uses: ./.github/actions/setup-android-ci - name: Check code style if: matrix.renderer == 'opengl' diff --git a/.github/workflows/android-testapp-release.yml b/.github/workflows/android-testapp-release.yml new file mode 100644 index 000000000000..2e089e23450d --- /dev/null +++ b/.github/workflows/android-testapp-release.yml @@ -0,0 +1,61 @@ +name: android-testapp-release + +permissions: + contents: write + +on: + workflow_dispatch: + +jobs: + create-android-testapp-release: + runs-on: ubuntu-latest + steps: + - name: Create Release + run: | + gh release create android-testapp-${{ github.sha }} \ + --draft=false \ + --prerelease=false \ + --latest=false \ + --title android-testapp-${{ github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + android-build-testapp: + needs: [create-android-testapp-release] + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + renderer: [opengl, vulkan] + defaults: + run: + working-directory: platform/android + env: + BUILDTYPE: Debug + IS_LOCAL_DEVELOPMENT: false + MLN_ANDROID_STL: c++_static + SENTRY_ORG: maplibre + SENTRY_PROJECT: maplibre-android + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN_ANDROID }} + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ./.github/actions/setup-android-ci + + - run: ./gradlew assemble${{ matrix.renderer }}Release + + - name: Install sentry-cli + run: curl -sL https://sentry.io/get-cli/ | sh + + - name: Upload debug symbols to sentry + run: sentry-cli debug-files upload MapLibreAndroidTestApp + + - name: Upload Linux artifact + run: | + gh release upload android-testapp-${{ github.sha }} MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release.apk + env: + GH_TOKEN: ${{ github.token }} diff --git a/platform/android/MapLibreAndroidTestApp/build.gradle.kts b/platform/android/MapLibreAndroidTestApp/build.gradle.kts index a3e8e1996077..dbfde37d1358 100644 --- a/platform/android/MapLibreAndroidTestApp/build.gradle.kts +++ b/platform/android/MapLibreAndroidTestApp/build.gradle.kts @@ -9,7 +9,6 @@ plugins { id("maplibre.gradle-lint") } - fun obtainTestBuildType(): String { return if (project.hasProperty("testBuildType")) { project.properties["testBuildType"] as String @@ -31,6 +30,7 @@ android { versionName = "6.0.1" testInstrumentationRunner = "org.maplibre.android.InstrumentationRunner" multiDexEnabled = true + manifestPlaceholders["SENTRY_DSN"] = "" } nativeBuild(listOf("example-custom-layer")) @@ -47,6 +47,14 @@ android { isMinifyEnabled = false isShrinkResources = false proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + + packaging { + jniLibs { + keepDebugSymbols += "**/*.so" + } + } + buildConfigField("String", "SENTRY_DSN", "\"" + (System.getenv("SENTRY_DSN") ?: "") + "\"") + manifestPlaceholders["SENTRY_DSN"] = System.getenv("SENTRY_DSN") ?: "" } getByName("release") { isMinifyEnabled = true @@ -54,6 +62,9 @@ android { proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") testProguardFiles("test-proguard-rules.pro") signingConfig = signingConfigs.getByName("debug") + + buildConfigField("String", "SENTRY_DSN", "\"" + (System.getenv("SENTRY_DSN") ?: "") + "\"") + manifestPlaceholders["SENTRY_DSN"] = System.getenv("SENTRY_DSN") ?: "" } } @@ -119,3 +130,5 @@ dependencies { androidTestImplementation(libs.androidxTestCoreKtx) androidTestImplementation(libs.kotlinxCoroutinesTest) } + +apply() diff --git a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml index 348e3557e2a0..eeab0b226b56 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml @@ -1283,6 +1283,68 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/android/buildSrc/build.gradle.kts b/platform/android/buildSrc/build.gradle.kts index c2b851aba3b9..4cdaa02049cb 100644 --- a/platform/android/buildSrc/build.gradle.kts +++ b/platform/android/buildSrc/build.gradle.kts @@ -14,4 +14,5 @@ dependencies { implementation("com.android.tools.build:gradle:8.6.0") implementation("com.android.application:com.android.application.gradle.plugin:8.6.0") implementation("commons-collections:commons-collections:3.2.2") + implementation("io.sentry:sentry-android-gradle-plugin:5.9.0") } diff --git a/platform/android/buildSrc/src/main/kotlin/SentryConfigPlugin.kt b/platform/android/buildSrc/src/main/kotlin/SentryConfigPlugin.kt new file mode 100644 index 000000000000..2659a18283a2 --- /dev/null +++ b/platform/android/buildSrc/src/main/kotlin/SentryConfigPlugin.kt @@ -0,0 +1,62 @@ +import org.gradle.api.Plugin +import org.gradle.api.Project + +class SentryConditionalPlugin : Plugin { + override fun apply(project: Project) { + val sentryProject = System.getenv("SENTRY_PROJECT") + + if (sentryProject.isNullOrBlank()) { + println("SENTRY_PROJECT environment variable not set. Skipping Sentry plugin application.") + return + } + + // Apply the Sentry plugin via plugin id + val sentryPluginId = "io.sentry.android.gradle" + try { + project.pluginManager.apply(sentryPluginId) + } catch (t: Throwable) { + project.logger.warn("Could not apply Sentry plugin ($sentryPluginId): ${t.message}") + return + } + + // Configure Sentry extension using reflection to avoid compile-time dependency + val sentryExt = project.extensions.findByName("sentry") + if (sentryExt == null) { + project.logger.warn("Sentry extension not found after applying the plugin. Skipping configuration.") + return + } + + fun setProperty(ext: Any, propertyGetterName: String, value: Any?) { + try { + val getter = ext.javaClass.methods.firstOrNull { it.name == propertyGetterName && it.parameterCount == 0 } + ?: return + val propObj = getter.invoke(ext) ?: return + val setMethod = propObj.javaClass.methods.firstOrNull { it.name == "set" && it.parameterCount == 1 } + ?: return + setMethod.invoke(propObj, value) + } catch (_: Throwable) { + // Ignore if property isn't present on current plugin version + } + } + + val propertiesToSet = mapOf( + "getDebug" to true, + "getOrg" to System.getenv("SENTRY_ORG"), + "getProjectName" to System.getenv("SENTRY_PROJECT"), + "getAuthToken" to System.getenv("SENTRY_AUTH_TOKEN"), + "getIncludeProguardMapping" to true, + "getAutoUploadProguardMapping" to true, + "getDexguardEnabled" to false, + "getUploadNativeSymbols" to true, + "getAutoUploadNativeSymbols" to false, + "getIncludeNativeSources" to true, + "getIncludeSourceContext" to true, + "getIncludeDependenciesReport" to true, + "getTelemetry" to false + ) + + propertiesToSet.forEach { (getterName, value) -> + setProperty(sentryExt, getterName, value) + } + } +} From 8f76a2c20478138d26be3adb2223e87d7fb5b946 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 14 Aug 2025 20:08:25 +0200 Subject: [PATCH 313/339] fix android-testapp-release workflow (#3719) --- .github/workflows/android-testapp-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/android-testapp-release.yml b/.github/workflows/android-testapp-release.yml index 2e089e23450d..f0cd61189982 100644 --- a/.github/workflows/android-testapp-release.yml +++ b/.github/workflows/android-testapp-release.yml @@ -10,6 +10,8 @@ jobs: create-android-testapp-release: runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 + - name: Create Release run: | gh release create android-testapp-${{ github.sha }} \ From f2ed4f54236ce1f416f6c135a88beeb611e7fc7c Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Thu, 14 Aug 2025 16:55:18 -0400 Subject: [PATCH 314/339] Release Node v6.2.0 (#3718) --- platform/node/CHANGELOG.md | 2 +- platform/node/package-lock.json | 4 ++-- platform/node/package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/node/CHANGELOG.md b/platform/node/CHANGELOG.md index 94f322383f28..f5d64c4716fb 100644 --- a/platform/node/CHANGELOG.md +++ b/platform/node/CHANGELOG.md @@ -1,6 +1,6 @@ ## main -## 6.2.0-pre.0 +## 6.2.0 * Fix freezing in macos/metal after ~32 renders ([Issue](https://github.com/maplibre/maplibre-native/issues/2928), [PR](https://github.com/maplibre/maplibre-native/pull/3673)). * Add HarfBuzz Text Shaping and Font Fallback Support ([#3611](https://github.com/maplibre/maplibre-native/pull/3611)). This implements the [`font-faces` property of the MapLibre Style Spec](https://maplibre.org/maplibre-style-spec/font-faces/). diff --git a/platform/node/package-lock.json b/platform/node/package-lock.json index 0b05bb5ffb6f..9b69efc35a36 100644 --- a/platform/node/package-lock.json +++ b/platform/node/package-lock.json @@ -1,12 +1,12 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.2.0-pre.0", + "version": "6.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@maplibre/maplibre-gl-native", - "version": "6.2.0-pre.0", + "version": "6.2.0", "hasInstallScript": true, "license": "BSD-2-Clause", "dependencies": { diff --git a/platform/node/package.json b/platform/node/package.json index 14528306bfd4..2ff8e32f0b45 100644 --- a/platform/node/package.json +++ b/platform/node/package.json @@ -1,6 +1,6 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.2.0-pre.0", + "version": "6.2.0", "description": "Renders map tiles with MapLibre Native", "keywords": [ "maplibre", From 3e33b812e05f0611e9626fcedc2aac862f6ca94b Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Thu, 14 Aug 2025 22:59:55 +0200 Subject: [PATCH 315/339] [qt] Fix the build without harfbuzz (#3720) --- platform/qt/src/mbgl/local_glyph_rasterizer.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp index d1bdaa2077a0..bbae70a720d4 100644 --- a/platform/qt/src/mbgl/local_glyph_rasterizer.cpp +++ b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp @@ -40,13 +40,8 @@ LocalGlyphRasterizer::LocalGlyphRasterizer(const std::optional& fon LocalGlyphRasterizer::~LocalGlyphRasterizer() {} bool LocalGlyphRasterizer::canRasterizeGlyph(const FontStack&, GlyphID glyphID) { -#ifdef MLN_TEXT_SHAPING_HARFBUZZ return impl->isConfigured() && impl->metrics->inFont(glyphID.complex.code) && util::i18n::allowsFixedWidthGlyphGeneration(glyphID); -#else - return impl->isConfigured() && impl->metrics->inFont(glyphID) && - util::i18n::allowsFixedWidthGlyphGeneration(glyphID); -#endif } Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { @@ -58,11 +53,7 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { return glyph; } -#ifdef MLN_TEXT_SHAPING_HARFBUZZ glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID.complex.code); -#else - glyph.metrics.width = impl->metrics->horizontalAdvance(glyphID); -#endif glyph.metrics.height = impl->metrics->height(); glyph.metrics.left = 3; glyph.metrics.top = -8; @@ -77,11 +68,7 @@ Glyph LocalGlyphRasterizer::rasterizeGlyph(const FontStack&, GlyphID glyphID) { painter.setRenderHints(QPainter::TextAntialiasing); // Render at constant baseline, to align with glyphs that are rendered by node-fontnik. -#ifdef MLN_TEXT_SHAPING_HARFBUZZ painter.drawText(QPointF(0, 20), QString(QChar(glyphID.complex.code))); -#else - painter.drawText(QPointF(0, 20), QString(QChar(glyphID))); -#endif auto img = std::make_unique(image.sizeInBytes()); memcpy(img.get(), image.constBits(), image.sizeInBytes()); From ef3954eb43b124ee4bcbdc9349d22037a05ecacd Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Thu, 14 Aug 2025 23:01:17 +0200 Subject: [PATCH 316/339] [cmake] Declare renderer backend as public (#3717) --- CMakeLists.txt | 6 +++--- benchmark/CMakeLists.txt | 4 ---- bin/CMakeLists.txt | 4 ---- .../MapLibreAndroid/src/cpp/CMakeLists.txt | 8 -------- platform/darwin/darwin.cmake | 7 ------- platform/glfw/CMakeLists.txt | 13 ------------- platform/ios/ios.cmake | 4 ---- render-test/CMakeLists.txt | 4 ---- test/CMakeLists.txt | 15 --------------- 9 files changed, 3 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6525df59428d..350f1816cdcf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -991,8 +991,8 @@ if(MLN_WITH_OPENGL) message(STATUS "Configuring GL-Native with OpenGL renderer backend") target_compile_definitions( mbgl-core - PRIVATE MLN_RENDER_BACKEND_OPENGL=1 PUBLIC + MLN_RENDER_BACKEND_OPENGL=1 "MLN_USE_UNORDERED_DENSE=$" ) list(APPEND @@ -1136,8 +1136,8 @@ if(MLN_WITH_METAL) message(STATUS "Configuring Metal renderer backend") target_compile_definitions( mbgl-core - PRIVATE MLN_RENDER_BACKEND_METAL=1 PUBLIC + MLN_RENDER_BACKEND_METAL=1 "MLN_USE_UNORDERED_DENSE=$" ) list(APPEND @@ -1235,7 +1235,7 @@ if(MLN_WITH_VULKAN) target_compile_definitions( mbgl-core - PRIVATE + PUBLIC MLN_RENDER_BACKEND_VULKAN=1 ) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 818ab90e00c1..c848e6864f47 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -61,7 +61,3 @@ target_link_libraries( ) set_property(TARGET mbgl-benchmark PROPERTY FOLDER MapLibre) - -if(MLN_WITH_OPENGL) - target_compile_definitions(mbgl-benchmark PRIVATE "MLN_RENDER_BACKEND_OPENGL=1") -endif() diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 7dca72a53be8..351d9e55b7ec 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -56,7 +56,3 @@ install(TARGETS mbgl-offline mbgl-render RUNTIME DESTINATION bin) # ${PROJECT_SOURCE_DIR} ) # # add_test(NAME mbgl-render-tool-test COMMAND mbgl-render WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} ) - -if(MLN_WITH_OPENGL) - target_compile_definitions(mbgl-render PRIVATE "MLN_RENDER_BACKEND_OPENGL=1") -endif() diff --git a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt index c156aa756a73..8a1d934ba232 100644 --- a/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt +++ b/platform/android/MapLibreAndroid/src/cpp/CMakeLists.txt @@ -205,10 +205,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/android_gl_renderer_backend.cpp ${PROJECT_SOURCE_DIR}/android_gl_renderer_backend.hpp ) - target_compile_definitions( - maplibre - PRIVATE MLN_RENDER_BACKEND_OPENGL=1 - ) endif() if(MLN_WITH_VULKAN) @@ -217,10 +213,6 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/android_vulkan_renderer_backend.cpp ${PROJECT_SOURCE_DIR}/android_vulkan_renderer_backend.hpp ) - target_compile_definitions( - maplibre - PRIVATE MLN_RENDER_BACKEND_VULKAN=1 - ) endif() target_include_directories( diff --git a/platform/darwin/darwin.cmake b/platform/darwin/darwin.cmake index 4217aa752bd5..7f25019ebd7a 100644 --- a/platform/darwin/darwin.cmake +++ b/platform/darwin/darwin.cmake @@ -172,13 +172,6 @@ target_link_libraries( PRIVATE mbgl-compiler-options mbgl-core ) -if(MLN_WITH_METAL) - target_compile_definitions( - custom-layer-examples - PRIVATE MLN_RENDER_BACKEND_METAL=1 - ) -endif() - target_include_directories( custom-layer-examples PUBLIC diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index 5515704efd2f..aea224a0dcb0 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -37,10 +37,6 @@ if(MLN_WITH_OPENGL) mbgl-glfw PRIVATE ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_gl_backend.cpp ) - target_compile_definitions( - mbgl-glfw - PRIVATE MLN_RENDER_BACKEND_OPENGL=1 - ) endif() if(MLN_WITH_EGL) @@ -55,11 +51,6 @@ if(MLN_WITH_VULKAN) mbgl-glfw PRIVATE ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_vulkan_backend.cpp ) - - target_compile_definitions( - mbgl-glfw - PRIVATE MLN_RENDER_BACKEND_VULKAN=1 - ) endif() if(MLN_WITH_METAL) @@ -71,10 +62,6 @@ if(MLN_WITH_METAL) ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_metal_backend.h ${PROJECT_SOURCE_DIR}/platform/glfw/metal_backend.h ) - target_compile_definitions( - mbgl-glfw - PRIVATE MLN_RENDER_BACKEND_METAL=1 - ) target_link_libraries( mbgl-glfw PRIVATE diff --git a/platform/ios/ios.cmake b/platform/ios/ios.cmake index dddced2479ae..78ea7f6a6071 100644 --- a/platform/ios/ios.cmake +++ b/platform/ios/ios.cmake @@ -90,10 +90,6 @@ set_target_properties(ios-sdk-static PROPERTIES if(MLN_WITH_METAL) message(STATUS "Configuring Metal renderer backend") - target_compile_definitions( - ios-sdk-static - PRIVATE MLN_RENDER_BACKEND_METAL=1 - ) endif() target_include_directories( diff --git a/render-test/CMakeLists.txt b/render-test/CMakeLists.txt index 3296a21c1891..545ecb4ef734 100644 --- a/render-test/CMakeLists.txt +++ b/render-test/CMakeLists.txt @@ -65,7 +65,3 @@ target_link_libraries( ) set_property(TARGET mbgl-render-test PROPERTY FOLDER MapLibre) - -if(MLN_WITH_OPENGL) - target_compile_definitions(mbgl-render-test PRIVATE "MLN_RENDER_BACKEND_OPENGL=1") -endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1fa8fffcbef0..2b21d7f23a09 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -148,10 +148,6 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/test/renderer/backend_scope.test.cpp ${PROJECT_SOURCE_DIR}/test/util/offscreen_texture.test.cpp ) - target_compile_definitions( - mbgl-test - PRIVATE MLN_RENDER_BACKEND_OPENGL=1 - ) endif() @@ -164,17 +160,6 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/test/renderer/backend_scope.test.cpp ${PROJECT_SOURCE_DIR}/test/util/offscreen_texture.test.cpp ) - target_compile_definitions( - mbgl-test - PRIVATE MLN_RENDER_BACKEND_VULKAN=1 - ) -endif() - -if(MLN_WITH_METAL) - target_compile_definitions( - mbgl-test - PRIVATE MLN_RENDER_BACKEND_METAL=1 - ) endif() if(CMAKE_SYSTEM_NAME STREQUAL Android) From 153a980acf745f98464a63ea3fcc04f95f0aca15 Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Fri, 15 Aug 2025 22:36:54 +0200 Subject: [PATCH 317/339] [qt] Move utils to the standalone repo and update the setup (#3724) --- .github/actions/qt6-build/Dockerfile | 5 -- .github/actions/qt6-build/action.yml | 6 --- .github/actions/qt6-build/entrypoint.sh | 19 ------- .github/workflows/qt-ci.yml | 32 ++++------- platform/qt/qt.cmake | 33 ++++++++---- platform/qt/src/utils/renderer_backend.cpp | 56 ------------------- platform/qt/src/utils/renderer_backend.hpp | 38 ------------- platform/qt/src/utils/renderer_observer.hpp | 50 ----------------- platform/qt/src/utils/scheduler.cpp | 60 --------------------- platform/qt/src/utils/scheduler.hpp | 45 ---------------- 10 files changed, 34 insertions(+), 310 deletions(-) delete mode 100644 .github/actions/qt6-build/Dockerfile delete mode 100644 .github/actions/qt6-build/action.yml delete mode 100755 .github/actions/qt6-build/entrypoint.sh delete mode 100644 platform/qt/src/utils/renderer_backend.cpp delete mode 100644 platform/qt/src/utils/renderer_backend.hpp delete mode 100644 platform/qt/src/utils/renderer_observer.hpp delete mode 100644 platform/qt/src/utils/scheduler.cpp delete mode 100644 platform/qt/src/utils/scheduler.hpp diff --git a/.github/actions/qt6-build/Dockerfile b/.github/actions/qt6-build/Dockerfile deleted file mode 100644 index 63e721316a0e..000000000000 --- a/.github/actions/qt6-build/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ghcr.io/maplibre/linux-builder:centos8-gcc11 - -# Copy and set the entry point -COPY entrypoint.sh /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] diff --git a/.github/actions/qt6-build/action.yml b/.github/actions/qt6-build/action.yml deleted file mode 100644 index 3c6874fa1ad2..000000000000 --- a/.github/actions/qt6-build/action.yml +++ /dev/null @@ -1,6 +0,0 @@ -# action.yml -name: 'Qt6 Linux Builder' -description: 'Helper action to build in a specific Docker container' -runs: - using: 'docker' - image: 'Dockerfile' diff --git a/.github/actions/qt6-build/entrypoint.sh b/.github/actions/qt6-build/entrypoint.sh deleted file mode 100755 index 702bcc3f8f7f..000000000000 --- a/.github/actions/qt6-build/entrypoint.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -l - -source /opt/rh/gcc-toolset-11/enable - -set -e -set -x - -export CCACHE_DIR="$GITHUB_WORKSPACE/.ccache" -export PATH="$QT_ROOT_DIR/bin:$PATH" - -mkdir build && cd build -qt-cmake ../source/ \ - -G Ninja \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DMLN_WITH_QT=ON \ - -DMLN_QT_IGNORE_ICU=OFF -ninja diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index cded63c78d55..5466ab285a97 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -59,22 +59,16 @@ jobs: strategy: matrix: include: - - name: Linux_GCC11 - os: ubuntu-24.04 - build_type: RelWithDebInfo - qt_version: 6.8.1 - qt_target: desktop - compiler: "" - name: Linux_GCC14 os: ubuntu-24.04 build_type: RelWithDebInfo - qt_version: 6.8.1 + qt_version: 6.9.1 qt_target: desktop compiler: "gcc-14" - name: macOS os: macos-14 build_type: RelWithDebInfo - qt_version: 6.8.1 + qt_version: 6.9.1 qt_target: desktop deployment_target: 12.0 deployment_arch: "x86_64;arm64" @@ -82,7 +76,7 @@ jobs: - name: macOS_LLVM os: macos-14 build_type: RelWithDebInfo - qt_version: 6.8.1 + qt_version: 6.9.1 qt_target: desktop deployment_target: 12.0 deployment_arch: "arm64" @@ -91,7 +85,7 @@ jobs: os: windows-2022 build_type: "RelWithDebInfo" compiler_type: x64 - qt_version: 6.8.1 + qt_version: 6.9.1 qt_target: desktop qt_arch: win64_msvc2022_64 qt_tools: "" @@ -112,7 +106,7 @@ jobs: submodules: true - name: Install test dependencies - if: runner.os == 'Linux' && matrix.compiler != '' + if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install \ @@ -130,13 +124,13 @@ jobs: - name: Install compiler (Linux) id: install_compiler - if: runner.os == 'Linux' && matrix.compiler != '' + if: runner.os == 'Linux' uses: rlalik/setup-cpp-compiler@master with: compiler: ${{ matrix.compiler }} - name: Setup compiler (Linux) - if: runner.os == 'Linux' && matrix.compiler != '' + if: runner.os == 'Linux' env: CC: ${{ steps.install_compiler.outputs.cc }} CXX: ${{ steps.install_compiler.outputs.cxx }} @@ -209,11 +203,7 @@ jobs: ninja - name: Build maplibre-native (Linux, Qt6) - if: runner.os == 'Linux' && matrix.compiler == '' - uses: ./source/.github/actions/qt6-build - - - name: Build maplibre-native (Linux, Qt6, custom compiler) - if: runner.os == 'Linux' && matrix.compiler != '' + if: runner.os == 'Linux' run: | mkdir build && cd build qt-cmake ../source/ \ @@ -224,8 +214,8 @@ jobs: -DMLN_WITH_QT=ON ninja - - name: Build maplibre-native (Linux, Qt6, custom compiler, internal libraries) - if: runner.os == 'Linux' && matrix.compiler != '' + - name: Build maplibre-native (Linux, Qt6, internal libraries) + if: runner.os == 'Linux' run: | mkdir build-internal && cd build-internal qt-cmake ../source/ \ @@ -239,7 +229,7 @@ jobs: ninja - name: Run tests (Linux) - if: runner.os == 'Linux' && matrix.compiler != '' + if: runner.os == 'Linux' uses: coactions/setup-xvfb@v1 with: run: ctest --output-on-failure diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index c6ae2394b986..1c06dd6ca351 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -17,7 +17,10 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") unset(CMAKE_FIND_ROOT_PATH) endif() - find_package(ICU COMPONENTS uc REQUIRED) + # Use PkgConfig to find ICU + find_package(PkgConfig REQUIRED) + pkg_check_modules(ICU_UC REQUIRED icu-uc) + pkg_check_modules(ICU_I18N REQUIRED icu-i18n) if(MLN_QT_IGNORE_ICU) set(CMAKE_PREFIX_PATH ${_CMAKE_PREFIX_PATH_ORIG}) @@ -59,16 +62,28 @@ if (MSVC) endforeach() endif() +# Qt Vulkan renderer backend: only when MLN_WITH_VULKAN and qvulkaninstance.h present +if(MLN_WITH_VULKAN) + find_path(QT_VULKAN_HEADER qvulkaninstance.h + PATHS ${Qt${QT_VERSION_MAJOR}Gui_INCLUDE_DIRS} + NO_DEFAULT_PATH) + + if(NOT QT_VULKAN_HEADER) + message(FATAL_ERROR "Qt build has no Vulkan headers; can not build Qt Vulkan backend") + endif() +endif() + target_sources( mbgl-core PRIVATE ${PROJECT_SOURCE_DIR}/platform/$,default/src/mbgl/text/bidi.cpp,qt/src/mbgl/bidi.cpp> ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_backend.hpp ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_frontend.hpp - ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gl/headless_backend.hpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gl/headless_backend.cpp + $<$:${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gl/headless_backend.cpp> + $<$:${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/mtl/headless_backend.cpp> + $<$:${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/vulkan/headless_backend.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/i18n/collator.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/platform/time.cpp @@ -92,7 +107,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/async_task.cpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/async_task_impl.hpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/gl_functions.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/headless_backend_qt.cpp + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/headless_backend_qt.cpp> ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_file_source.cpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_file_source.hpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_request.cpp @@ -109,11 +124,6 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/timer.cpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/timer_impl.hpp ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/utf.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_backend.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_backend.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_observer.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/scheduler.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/scheduler.hpp ) target_compile_definitions( @@ -140,6 +150,7 @@ target_link_libraries( $ $ $ + $<$:$> $<$,$>>:z> $,$,Qt${QT_VERSION_MAJOR}::Sql> PRIVATE @@ -153,7 +164,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") if (MLN_QT_WITH_INTERNAL_ICU) target_link_libraries(mbgl-core PUBLIC $) else() - target_link_libraries(mbgl-core PUBLIC ICU::uc) + target_link_libraries(mbgl-core PUBLIC ${ICU_UC_LIBRARIES} ${ICU_I18N_LIBRARIES}) + target_include_directories(mbgl-core PRIVATE ${ICU_UC_INCLUDE_DIRS} ${ICU_I18N_INCLUDE_DIRS}) endif() endif() @@ -164,6 +176,7 @@ if(MLN_QT_HAS_PARENT) mbgl-vendor-parsedate mbgl-vendor-nunicode mbgl-vendor-csscolorparser + $<$:$> $<$:$> $<$,$>:$> PARENT_SCOPE diff --git a/platform/qt/src/utils/renderer_backend.cpp b/platform/qt/src/utils/renderer_backend.cpp deleted file mode 100644 index bc601cde67c3..000000000000 --- a/platform/qt/src/utils/renderer_backend.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "renderer_backend.hpp" - -#include -#include - -#include - -#include - -namespace QMapLibre { - -class RenderableResource final : public mbgl::gl::RenderableResource { -public: - explicit RenderableResource(RendererBackend &backend_) - : backend(backend_) {} - - void bind() override { - assert(mbgl::gfx::BackendScope::exists()); - backend.restoreFramebufferBinding(); - backend.setViewport(0, 0, backend.getSize()); - } - -private: - RendererBackend &backend; -}; - -RendererBackend::RendererBackend(const mbgl::gfx::ContextMode mode) - : mbgl::gl::RendererBackend(mode), - mbgl::gfx::Renderable({0, 0}, std::make_unique(*this)) {} - -RendererBackend::~RendererBackend() = default; - -void RendererBackend::updateAssumedState() { - assumeFramebufferBinding(ImplicitFramebufferBinding); - assumeViewport(0, 0, size); -} - -void RendererBackend::restoreFramebufferBinding() { - setFramebufferBinding(m_fbo); -} - -void RendererBackend::updateFramebuffer(quint32 fbo, const mbgl::Size &newSize) { - m_fbo = fbo; - size = newSize; -} - -/*! - Initializes an OpenGL extension function such as Vertex Array Objects (VAOs), - required by MapLibre Native engine. -*/ -mbgl::gl::ProcAddress RendererBackend::getExtensionFunctionPointer(const char *name) { - QOpenGLContext *thisContext = QOpenGLContext::currentContext(); - return thisContext->getProcAddress(name); -} - -} // namespace QMapLibre diff --git a/platform/qt/src/utils/renderer_backend.hpp b/platform/qt/src/utils/renderer_backend.hpp deleted file mode 100644 index 5077d5459c1c..000000000000 --- a/platform/qt/src/utils/renderer_backend.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include -#include - -#include - -namespace QMapLibre { - -class RendererBackend final : public mbgl::gl::RendererBackend, public mbgl::gfx::Renderable { -public: - explicit RendererBackend(mbgl::gfx::ContextMode mode); - ~RendererBackend() override; - - void updateFramebuffer(quint32 fbo, const mbgl::Size &newSize); - void restoreFramebufferBinding(); - - // mbgl::gfx::RendererBackend implementation -public: - mbgl::gfx::Renderable &getDefaultRenderable() override { return *this; } - -protected: - // No-op, implicit mode. - void activate() override {} - void deactivate() override {} - - // mbgl::gl::RendererBackend implementation -protected: - mbgl::gl::ProcAddress getExtensionFunctionPointer(const char *name) override; - void updateAssumedState() override; - -private: - quint32 m_fbo{}; - - Q_DISABLE_COPY(RendererBackend) -}; - -} // namespace QMapLibre diff --git a/platform/qt/src/utils/renderer_observer.hpp b/platform/qt/src/utils/renderer_observer.hpp deleted file mode 100644 index 161198cdc23d..000000000000 --- a/platform/qt/src/utils/renderer_observer.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include - -namespace QMapLibre { - -// Forwards RendererObserver signals to the given -// Delegate RendererObserver on the given RunLoop -class RendererObserver final : public mbgl::RendererObserver { -public: - RendererObserver(mbgl::util::RunLoop &mapRunLoop, mbgl::RendererObserver &delegate_) - : mailbox(std::make_shared(mapRunLoop)), - delegate(delegate_, mailbox) {} - - ~RendererObserver() final { mailbox->close(); } - - void onInvalidate() final { delegate.invoke(&mbgl::RendererObserver::onInvalidate); } - - void onResourceError(std::exception_ptr err) final { - delegate.invoke(&mbgl::RendererObserver::onResourceError, err); - } - - void onWillStartRenderingMap() final { delegate.invoke(&mbgl::RendererObserver::onWillStartRenderingMap); } - - void onWillStartRenderingFrame() final { delegate.invoke(&mbgl::RendererObserver::onWillStartRenderingFrame); } - - void onDidFinishRenderingFrame(RenderMode mode, - bool repaintNeeded, - bool placementChanged, - double frameEncodingTime, - double frameRenderingTime) final { - void (mbgl::RendererObserver::*f)( - RenderMode, bool, bool, double, double) = &mbgl::RendererObserver::onDidFinishRenderingFrame; - delegate.invoke(f, mode, repaintNeeded, placementChanged, frameEncodingTime, frameRenderingTime); - } - - void onDidFinishRenderingMap() final { delegate.invoke(&mbgl::RendererObserver::onDidFinishRenderingMap); } - -private: - std::shared_ptr mailbox{}; - mbgl::ActorRef delegate; -}; - -} // namespace QMapLibre diff --git a/platform/qt/src/utils/scheduler.cpp b/platform/qt/src/utils/scheduler.cpp deleted file mode 100644 index 7ab5364c5629..000000000000 --- a/platform/qt/src/utils/scheduler.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "scheduler.hpp" - -#include -#include - -#include - -namespace QMapLibre { - -Scheduler::Scheduler() = default; - -Scheduler::~Scheduler() { - MBGL_VERIFY_THREAD(tid); -} - -void Scheduler::schedule(std::function&& function) { - const std::lock_guard lock(m_taskQueueMutex); - m_taskQueue.push(std::move(function)); - - // Need to force the main thread to wake - // up this thread and process the events. - emit needsProcessing(); -} - -void Scheduler::processEvents() { - std::queue> taskQueue; - { - const std::unique_lock lock(m_taskQueueMutex); - std::swap(taskQueue, m_taskQueue); - pendingItems += taskQueue.size(); - } - - while (!taskQueue.empty()) { - auto& function = taskQueue.front(); - if (function) { - function(); - } - taskQueue.pop(); - pendingItems--; - } - - cvEmpty.notify_all(); -} - -void Scheduler::waitForEmpty([[maybe_unused]] const mbgl::util::SimpleIdentity tag) { - MBGL_VERIFY_THREAD(tid); - - std::unique_lock lock(m_taskQueueMutex); - const auto isDone = [&] { - return m_taskQueue.empty() && pendingItems == 0; - }; - - while (!isDone()) { - cvEmpty.wait(lock); - } - - assert(m_taskQueue.size() + pendingItems == 0); -} - -} // namespace QMapLibre diff --git a/platform/qt/src/utils/scheduler.hpp b/platform/qt/src/utils/scheduler.hpp deleted file mode 100644 index 99b26b7b757e..000000000000 --- a/platform/qt/src/utils/scheduler.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include -#include - -#include - -#include -#include -#include -#include - -namespace QMapLibre { - -class Scheduler : public QObject, public mbgl::Scheduler { - Q_OBJECT - -public: - Scheduler(); - ~Scheduler() override; - - // mbgl::Scheduler implementation. - void schedule(std::function&& function) final; - - void waitForEmpty(const mbgl::util::SimpleIdentity tag = mbgl::util::SimpleIdentity::Empty) override; - - mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } - - void processEvents(); - -signals: - void needsProcessing(); - -private: - MBGL_STORE_THREAD(tid); - - std::mutex m_taskQueueMutex; - std::condition_variable cvEmpty; - std::atomic pendingItems; - std::queue> m_taskQueue; - mapbox::base::WeakPtrFactory weakFactory{this}; - // Do not add members here, see `WeakPtrFactory` -}; - -} // namespace QMapLibre From b0907131772c0e55200bccec6f0a026cd24aa816 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 18 Aug 2025 13:41:40 +0300 Subject: [PATCH 318/339] Android long running activity (#3512) --- .gitignore | 1 + .../MapLibreAndroidTestApp/build.gradle.kts | 5 + .../MapLibreAndroidTestApp/proguard-rules.pro | 3 + .../src/main/AndroidManifest.xml | 26 + .../main/assets/routes/route_BER_15453.json | 7018 +++++++++++++++++ .../main/assets/routes/route_BER_3507.json | 2380 ++++++ .../main/assets/routes/route_DC_40743.json | 5011 ++++++++++++ .../src/main/assets/routes/route_DC_4453.json | 2438 ++++++ .../main/assets/routes/route_SF_20753.json | 4318 ++++++++++ .../src/main/assets/routes/route_SF_2122.json | 1220 +++ .../activity/benchmark/BenchmarkActivity.kt | 43 +- .../activity/stability/LongRunningActivity.kt | 84 + .../activity/stability/NavigationMap.kt | 373 + .../testapp/activity/stability/UserMap.kt | 283 + .../android/testapp/utils/CoroutineUtils.kt | 47 + .../res/layout/activity_long_running_maps.xml | 23 + .../src/main/res/values/descriptions.xml | 1 + .../src/main/res/values/titles.xml | 1 + platform/android/gradle/libs.versions.toml | 1 + platform/android/settings.gradle.kts | 1 + 20 files changed, 23236 insertions(+), 41 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_BER_15453.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_BER_3507.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_40743.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_4453.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_20753.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_2122.json create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/NavigationMap.kt create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/UserMap.kt create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/CoroutineUtils.kt create mode 100644 platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml diff --git a/.gitignore b/.gitignore index 0b01fc0474b7..c6960e46e2e3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ /cmake-build-debug /platform/android/build /platform/android/MapLibreAndroid/src/main/assets/sdk_versions/com.mapbox.mapboxsdk +/platform/android/MapLibreAndroid/android-binaries-*.zip *.code-workspace local.properties diff --git a/platform/android/MapLibreAndroidTestApp/build.gradle.kts b/platform/android/MapLibreAndroidTestApp/build.gradle.kts index dbfde37d1358..3dd5c6723502 100644 --- a/platform/android/MapLibreAndroidTestApp/build.gradle.kts +++ b/platform/android/MapLibreAndroidTestApp/build.gradle.kts @@ -103,6 +103,11 @@ kotlin { dependencies { implementation(project(":MapLibreAndroid")) + + implementation(libs.maplibreNavigation) { + exclude(group = "org.maplibre.gl", module = "android-sdk") + } + implementation(libs.maplibreJavaTurf) implementation(libs.supportRecyclerView) diff --git a/platform/android/MapLibreAndroidTestApp/proguard-rules.pro b/platform/android/MapLibreAndroidTestApp/proguard-rules.pro index 99ce15590edd..8062ce8f3c1f 100644 --- a/platform/android/MapLibreAndroidTestApp/proguard-rules.pro +++ b/platform/android/MapLibreAndroidTestApp/proguard-rules.pro @@ -10,9 +10,12 @@ # GMS -dontnote com.google.android.gms.** +-dontwarn com.google.android.gms.** +-keep class com.google.android.gms.** { *; } -keep class org.maplibre.android.testapp.model.customlayer.ExampleCustomLayer { *; } + # okhttp -dontwarn org.bouncycastle.jsse.BCSSLSocket -dontwarn org.bouncycastle.jsse.BCSSLParameters diff --git a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml index eeab0b226b56..9cd89082e490 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + Drive north on Bismarckstraße.", + "announcement" : "Drive north on Bismarckstraße.", + "distanceAlongGeometry" : 447.7 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn right to take the A 103 ramp.", + "announcement" : "In 200 meters, Turn right to take the A 103 ramp.", + "distanceAlongGeometry" : 221.8 + }, { + "ssmlAnnouncement" : "Turn right to take the A 103 ramp toward Tiergarten, Tempelhof.", + "announcement" : "Turn right to take the A 103 ramp toward Tiergarten, Tempelhof.", + "distanceAlongGeometry" : 63.5 + } ], + "intersections" : [ { + "entry" : [ true ], + "bearings" : [ 355 ], + "duration" : 8.295, + "admin_index" : 0, + "out" : 0, + "weight" : 9.332, + "geometry_index" : 0, + "location" : [ 13.339116, 52.46314 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 175, 355 ], + "duration" : 0.491, + "turn_weight" : 2.2, + "admin_index" : 0, + "out" : 1, + "weight" : 2.752, + "geometry_index" : 1, + "location" : [ 13.339054, 52.463594 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 84, 175, 263, 355 ], + "duration" : 0.989, + "turn_weight" : 8.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 9.905, + "geometry_index" : 2, + "location" : [ 13.33905, 52.463621 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 84, 175, 265, 355 ], + "duration" : 0.989, + "turn_weight" : 8.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 9.905, + "geometry_index" : 3, + "location" : [ 13.339042, 52.463672 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 83, 175, 262, 357 ], + "duration" : 0.172, + "turn_weight" : 8.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "weight" : 8.984, + "geometry_index" : 4, + "location" : [ 13.339034, 52.463727 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 177, 355 ], + "duration" : 3.109, + "turn_weight" : 2.2, + "admin_index" : 0, + "out" : 1, + "weight" : 5.698, + "geometry_index" : 5, + "location" : [ 13.339033, 52.463737 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 175, 355 ], + "duration" : 9.164, + "turn_weight" : 2.2, + "admin_index" : 0, + "out" : 1, + "weight" : 12.509, + "geometry_index" : 6, + "location" : [ 13.33901, 52.463908 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 175, 353 ], + "duration" : 0.327, + "turn_weight" : 2.2, + "admin_index" : 0, + "out" : 1, + "weight" : 2.568, + "geometry_index" : 9, + "location" : [ 13.338941, 52.464409 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 77, 173, 258, 356 ], + "duration" : 1.645, + "turn_weight" : 8.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "weight" : 10.641, + "geometry_index" : 10, + "location" : [ 13.338938, 52.464425 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 83, 176, 262, 356 ], + "duration" : 1.48, + "turn_weight" : 18.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 19.857, + "geometry_index" : 11, + "location" : [ 13.338927, 52.464518 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 84, 176, 265, 356 ], + "duration" : 0.661, + "turn_weight" : 8.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 9.536, + "geometry_index" : 12, + "location" : [ 13.338917, 52.464599 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 176, 356 ], + "duration" : 5.764, + "turn_weight" : 2.2, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 1, + "weight" : 6.434, + "geometry_index" : 13, + "location" : [ 13.338913, 52.464631 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 176, 356 ], + "duration" : 1.473, + "turn_weight" : 2.2, + "admin_index" : 0, + "out" : 1, + "weight" : 3.857, + "geometry_index" : 14, + "location" : [ 13.338887, 52.46484 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 176, 263, 356 ], + "duration" : 4.261, + "turn_weight" : 2.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.986, + "geometry_index" : 15, + "location" : [ 13.338877, 52.464924 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 84, 176, 266, 356 ], + "duration" : 0.498, + "turn_weight" : 8.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 9.352, + "geometry_index" : 17, + "location" : [ 13.33885, 52.465154 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 86, 176, 266, 354 ], + "duration" : 3.622, + "turn_weight" : 8.8, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 3, + "weight" : 12.85, + "geometry_index" : 18, + "location" : [ 13.338847, 52.465178 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 144, 174, 259, 355 ], + "duration" : 2.981, + "turn_weight" : 8.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 12.146, + "geometry_index" : 19, + "location" : [ 13.338813, 52.465373 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 137, 175, 356 ], + "duration" : 7.52, + "turn_weight" : 3.3, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 11.752, + "geometry_index" : 20, + "location" : [ 13.338787, 52.465539 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 176, 355 ], + "duration" : 5.478, + "turn_weight" : 1.1, + "admin_index" : 0, + "out" : 1, + "weight" : 7.263, + "geometry_index" : 22, + "location" : [ 13.338732, 52.465969 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 9, 175, 332 ], + "duration" : 1.895, + "turn_weight" : 4.95, + "turn_duration" : 0.017, + "admin_index" : 0, + "out" : 0, + "weight" : 7.063, + "geometry_index" : 24, + "location" : [ 13.338691, 52.466279 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 189, 341 ], + "duration" : 5.791, + "turn_weight" : 1.875, + "admin_index" : 0, + "out" : 1, + "weight" : 8.535, + "geometry_index" : 26, + "location" : [ 13.338718, 52.466379 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 61, 147, 229, 314 ], + "duration" : 4.74, + "turn_weight" : 5.0, + "turn_duration" : 0.045, + "admin_index" : 0, + "out" : 3, + "weight" : 10.283, + "geometry_index" : 32, + "location" : [ 13.338487, 52.466673 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 39, 134, 220, 315 ], + "duration" : 0.633, + "turn_weight" : 4.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 5.104, + "geometry_index" : 35, + "location" : [ 13.338173, 52.46686 ] + }, { + "bearings" : [ 38, 135, 220, 316 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "turn_weight" : 4.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 36, + "location" : [ 13.338134, 52.466884 ] + } ], + "maneuver" : { + "instruction" : "Drive north on Bismarckstraße.", + "type" : "depart", + "bearing_after" : 355, + "bearing_before" : 0, + "location" : [ 13.339116, 52.46314 ] + }, + "name" : "Bismarckstraße", + "duration" : 74.021, + "distance" : 447.693, + "driving_side" : "right", + "weight" : 210.001, + "mode" : "driving", + "geometry" : "gabacBw}cmXk[zBu@FeBNmBNS@uIl@gOfA}In@cCP_@DyDTaDR_AFaLr@gDRyJl@qAFo@DeKbAkIr@}@F}WdBqQlAYBcAiAcCRmBd@sAf@sAr@}AnAaB~AuBzC}BtEiEpIm@jAo@lAiDpG" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 800 meters.", + "announcement" : "Continue for 800 meters.", + "distanceAlongGeometry" : 748.0 + }, { + "ssmlAnnouncement" : "In 500 meters, Take exit 2.", + "announcement" : "In 500 meters, Take exit 2.", + "distanceAlongGeometry" : 537.0 + }, { + "ssmlAnnouncement" : "Take exit 2 onto A 100 toward Tempelhof. Then Keep right to take A 100.", + "announcement" : "Take exit 2 onto A 100 toward Tempelhof. Then Keep right to take A 100.", + "distanceAlongGeometry" : 197.2 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 35, 136, 215, 315 ], + "duration" : 2.221, + "turn_weight" : 18.75, + "turn_duration" : 1.113, + "admin_index" : 0, + "out" : 0, + "weight" : 19.996, + "geometry_index" : 37, + "location" : [ 13.337997, 52.466969 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 137, 215, 315 ], + "duration" : 0.521, + "turn_weight" : 4.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.979, + "geometry_index" : 38, + "location" : [ 13.338061, 52.467025 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 134, 215, 314 ], + "duration" : 17.322, + "turn_weight" : 4.4, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 23.879, + "geometry_index" : 39, + "location" : [ 13.33809, 52.46705 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 217 ], + "duration" : 5.486, + "admin_index" : 0, + "out" : 0, + "weight" : 6.309, + "geometry_index" : 42, + "location" : [ 13.338979, 52.467781 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 38, 217 ], + "duration" : 24.171, + "admin_index" : 0, + "out" : 0, + "weight" : 27.797, + "geometry_index" : 43, + "location" : [ 13.339262, 52.468012 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 37, 191, 217 ], + "duration" : 5.465, + "turn_weight" : 44.375, + "turn_duration" : 0.04, + "admin_index" : 0, + "out" : 0, + "weight" : 50.614, + "geometry_index" : 46, + "location" : [ 13.340359, 52.469065 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 37, 217 ], + "duration" : 11.561, + "admin_index" : 0, + "out" : 0, + "weight" : 13.295, + "geometry_index" : 48, + "location" : [ 13.341314, 52.469834 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 46, 223 ], + "duration" : 1.927, + "admin_index" : 0, + "out" : 0, + "weight" : 2.216, + "geometry_index" : 53, + "location" : [ 13.343406, 52.47144 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 54, 228 ], + "duration" : 1.623, + "admin_index" : 0, + "out" : 0, + "weight" : 1.866, + "geometry_index" : 56, + "location" : [ 13.343813, 52.47167 ] + }, { + "bearings" : [ 57, 234 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 58, + "location" : [ 13.344193, 52.471838 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "A 100: Tempelhof, Wilmersdorf", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "2", + "type" : "exit-number" + }, { + "text" : "A 100: Tempelhof, Wilmersdorf", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 758.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "A 100: Tempelhof, Wilmersdorf", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "2", + "type" : "exit-number" + }, { + "text" : "A 100: Tempelhof, Wilmersdorf", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "A 103: Tiergarten, Tempelhof, Wilmersdorf", + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right to take the A 103 ramp toward Tiergarten/Tempelhof/Wilmersdorf.", + "type" : "turn", + "bearing_after" : 35, + "bearing_before" : 316, + "location" : [ 13.337997, 52.466969 ] + }, + "name" : "", + "duration" : 73.744, + "distance" : 758.0, + "driving_side" : "right", + "weight" : 154.915, + "mode" : "driving", + "ref" : "A 103", + "geometry" : "qpiacBywamXoB_Cq@y@a@g@iPwSiZq`@mMuPwVq]wa@oe@iFNY_@gn@uy@{a@kj@ya@yj@yLoQcGuJwGkLyC{FgEeJiBkEaDgJmDoK}DwMeFcSsDkPScA" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Keep right to take A 100 toward Tempelhof.", + "announcement" : "Keep right to take A 100 toward Tempelhof.", + "distanceAlongGeometry" : 135.7 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 65, 91, 242 ], + "duration" : 3.979, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.052, + "admin_index" : 0, + "out" : 1, + "weight" : 4.516, + "geometry_index" : 62, + "location" : [ 13.345063, 52.472148 ] + }, { + "bearings" : [ 74, 253 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 64, + "location" : [ 13.345744, 52.472207 ] + } ], + "exits" : "2", + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "A 100: Tempelhof", + "components" : [ { + "text" : "A 100: Tempelhof", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "A 100", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 163.0 + } ], + "destinations" : "A 100: Tempelhof, Wilmersdorf", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take exit 2 onto A 100 toward Tempelhof.", + "type" : "off ramp", + "bearing_after" : 91, + "bearing_before" : 62, + "location" : [ 13.345063, 52.472148 ] + }, + "name" : "", + "duration" : 12.259, + "distance" : 163.0, + "driving_side" : "right", + "weight" : 14.038, + "mode" : "driving", + "geometry" : "gtsacBmqomXd@cO{CmYuGyp@iGaq@IcA" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 2.5 kilometers.", + "announcement" : "Continue for 2.5 kilometers.", + "distanceAlongGeometry" : 2423.0 + }, { + "ssmlAnnouncement" : "In 700 meters, Take exit 20.", + "announcement" : "In 700 meters, Take exit 20.", + "distanceAlongGeometry" : 660.5 + }, { + "ssmlAnnouncement" : "Take exit 20 onto B 96 toward Tempelhofer Damm.", + "announcement" : "Take exit 20 onto B 96 toward Tempelhofer Damm.", + "distanceAlongGeometry" : 188.8 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 72, 98, 255 ], + "duration" : 1.671, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.035, + "admin_index" : 0, + "out" : 1, + "weight" : 1.882, + "geometry_index" : 67, + "location" : [ 13.347376, 52.472484 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 85, 278 ], + "duration" : 1.08, + "admin_index" : 0, + "out" : 0, + "weight" : 1.242, + "geometry_index" : 69, + "location" : [ 13.347662, 52.472458 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 87, 265 ], + "duration" : 6.696, + "admin_index" : 0, + "out" : 0, + "weight" : 7.7, + "geometry_index" : 70, + "location" : [ 13.347886, 52.47247 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 85, 267 ], + "duration" : 2.448, + "admin_index" : 0, + "out" : 0, + "weight" : 2.815, + "geometry_index" : 72, + "location" : [ 13.349259, 52.472511 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 82, 264 ], + "duration" : 10.8, + "admin_index" : 0, + "out" : 0, + "weight" : 12.42, + "geometry_index" : 74, + "location" : [ 13.349751, 52.472538 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 72, 254 ], + "duration" : 8.568, + "admin_index" : 0, + "out" : 0, + "weight" : 9.853, + "geometry_index" : 80, + "location" : [ 13.351911, 52.472822 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 67, 239, 252 ], + "duration" : 5.997, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 6.869, + "geometry_index" : 84, + "location" : [ 13.353562, 52.473181 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 73, 256 ], + "duration" : 2.016, + "admin_index" : 0, + "out" : 0, + "weight" : 2.318, + "geometry_index" : 86, + "location" : [ 13.35458, 52.47338 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 86, 252, 277 ], + "duration" : 7.3, + "turn_weight" : 1.875, + "turn_duration" : 0.018, + "admin_index" : 0, + "out" : 0, + "weight" : 10.067, + "geometry_index" : 88, + "location" : [ 13.354975, 52.473457 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 62, 253 ], + "duration" : 2.016, + "admin_index" : 0, + "out" : 0, + "weight" : 2.268, + "geometry_index" : 91, + "location" : [ 13.356258, 52.473589 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 76, 242, 258 ], + "duration" : 9.652, + "turn_weight" : 24.8, + "turn_duration" : 0.018, + "admin_index" : 0, + "out" : 0, + "weight" : 35.638, + "geometry_index" : 92, + "location" : [ 13.356616, 52.473707 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 83, 258 ], + "duration" : 15.363, + "admin_index" : 0, + "out" : 0, + "weight" : 17.284, + "geometry_index" : 96, + "location" : [ 13.359308, 52.474167 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 126, 298 ], + "duration" : 4.513, + "admin_index" : 0, + "out" : 0, + "weight" : 5.077, + "geometry_index" : 106, + "location" : [ 13.363591, 52.473625 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 127, 306 ], + "duration" : 5.223, + "admin_index" : 0, + "out" : 0, + "weight" : 5.745, + "geometry_index" : 107, + "location" : [ 13.364655, 52.47316 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 127, 307 ], + "duration" : 3.653, + "admin_index" : 0, + "out" : 0, + "weight" : 4.018, + "geometry_index" : 108, + "location" : [ 13.365872, 52.4726 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 126, 152, 307 ], + "duration" : 38.879, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 41.773, + "geometry_index" : 109, + "location" : [ 13.366684, 52.472225 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 95, 253, 277 ], + "duration" : 7.752, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 8.309, + "geometry_index" : 124, + "location" : [ 13.376716, 52.47003 ] + }, { + "bearings" : [ 92, 275 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 125, + "location" : [ 13.378859, 52.469909 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "B 96: Tempelhofer Damm", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "20", + "type" : "exit-number" + }, { + "text" : "B 96: Tempelhofer Damm", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 2433.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "B 96: Tempelhofer Damm", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "20", + "type" : "exit-number" + }, { + "text" : "B 96: Tempelhofer Damm", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "straight", "slight right" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : false, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "A 100: Tempelhof", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right to take A 100 toward Tempelhof.", + "type" : "fork", + "bearing_after" : 98, + "bearing_before" : 75, + "location" : [ 13.347376, 52.472484 ] + }, + "name" : "", + "duration" : 141.567, + "distance" : 2433.0, + "driving_side" : "right", + "weight" : 183.815, + "mode" : "driving", + "ref" : "A 100", + "geometry" : "gitacB_btmXdA}GQ}GW_Mi@qj@g@gi@WqO]eMYuJq@wOy@yPyA{TaCa[uEye@qDi[{Jsp@eAgIyA_NiEsWcE_f@wAoOaAeGc@eZaAgYaDwYkFkUgB}T{Q_cBkCyZgAoQ_@mK_Aeb@Jo`@rAw^|Ag\\nCkX|Dc[vDmV|EiWxFiW`\\oaA~a@akAlVwq@tUqr@~Vgt@xIyZhCaMxDkQjEaX`B{LzBuT|Y}kCxFsl@zDci@dEku@xC}v@jBum@f@sNpF}dCjB}hC" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left toward Zentrum, Kreuzberg.", + "announcement" : "Turn left toward Zentrum, Kreuzberg.", + "distanceAlongGeometry" : 99.9 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 92, 116, 272 ], + "duration" : 17.94, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.032, + "admin_index" : 0, + "out" : 1, + "weight" : 18.803, + "geometry_index" : 126, + "location" : [ 13.381066, 52.469855 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 97, 277 ], + "duration" : 7.303, + "admin_index" : 0, + "out" : 0, + "weight" : 7.668, + "geometry_index" : 131, + "location" : [ 13.38387, 52.469583 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 94, 113, 276 ], + "duration" : 2.698, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 2.811, + "geometry_index" : 134, + "location" : [ 13.384913, 52.469513 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 0, 93, 182, 273 ], + "duration" : 1.035, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.08, + "geometry_index" : 136, + "location" : [ 13.385345, 52.469497 ] + }, { + "bearings" : [ 1, 93, 180, 273 ], + "entry" : [ false, true, true, false ], + "in" : 3, + "turn_weight" : 19.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 137, + "location" : [ 13.385493, 52.469493 ] + } ], + "exits" : "20", + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + } ] + }, + "secondary" : { + "text" : "Zentrum, Kreuzberg", + "components" : [ { + "text" : "Zentrum, Kreuzberg", + "type" : "text" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Tempelhofer Damm", + "components" : [ { + "text" : "Tempelhofer Damm", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 96", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 319.0 + } ], + "destinations" : "B 96: Tempelhofer Damm", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take exit 20 onto B 96 toward Tempelhofer Damm.", + "type" : "off ramp", + "bearing_after" : 116, + "bearing_before" : 92, + "location" : [ 13.381066, 52.469855 ] + }, + "name" : "", + "duration" : 30.526, + "distance" : 319.0, + "driving_side" : "right", + "weight" : 51.582, + "mode" : "driving", + "geometry" : "}doacBs{uoXvDiRx@eZn@uTjAq_@pDoiAdAo]|@q]FcCZyUBeCFgHLyL" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue on B 96 for 3 kilometers.", + "announcement" : "Continue on B 96 for 3 kilometers.", + "distanceAlongGeometry" : 2975.0 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn right onto Blücherstraße.", + "announcement" : "In 200 meters, Turn right onto Blücherstraße.", + "distanceAlongGeometry" : 237.9 + }, { + "ssmlAnnouncement" : "Turn right onto Blücherstraße.", + "announcement" : "Turn right onto Blücherstraße.", + "distanceAlongGeometry" : 57.5 + } ], + "intersections" : [ { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 1, 92, 182, 273 ], + "duration" : 8.945, + "turn_weight" : 12.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + } ], + "turn_duration" : 5.622, + "admin_index" : 0, + "out" : 0, + "weight" : 15.489, + "geometry_index" : 138, + "location" : [ 13.385714, 52.469486 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 1, 181 ], + "duration" : 4.015, + "admin_index" : 0, + "out" : 0, + "weight" : 4.216, + "geometry_index" : 140, + "location" : [ 13.385721, 52.469698 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 1, 181 ], + "duration" : 3.385, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 1.454, + "geometry_index" : 141, + "location" : [ 13.385731, 52.469963 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 1, 93, 181, 275 ], + "duration" : 3.342, + "turn_weight" : 8.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 11.889, + "geometry_index" : 142, + "location" : [ 13.385734, 52.470055 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 1, 181, 284 ], + "duration" : 2.373, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.472, + "geometry_index" : 144, + "location" : [ 13.385742, 52.470271 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 1, 181 ], + "duration" : 5.262, + "admin_index" : 0, + "out" : 0, + "weight" : 5.525, + "geometry_index" : 146, + "location" : [ 13.385747, 52.470423 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 0, 181 ], + "duration" : 1.108, + "admin_index" : 0, + "out" : 0, + "weight" : 1.163, + "geometry_index" : 147, + "location" : [ 13.385756, 52.470768 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 1, 101, 180 ], + "duration" : 0.977, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.018, + "geometry_index" : 148, + "location" : [ 13.385757, 52.470841 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 181, 272 ], + "duration" : 5.004, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.234, + "geometry_index" : 150, + "location" : [ 13.385759, 52.470904 ] + }, { + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 0, 181 ], + "duration" : 3.738, + "admin_index" : 0, + "out" : 0, + "weight" : 3.925, + "geometry_index" : 152, + "location" : [ 13.385765, 52.471232 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 181, 270 ], + "duration" : 0.575, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 0.582, + "geometry_index" : 154, + "location" : [ 13.385769, 52.471477 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 80, 180, 270 ], + "duration" : 0.699, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.727, + "geometry_index" : 155, + "location" : [ 13.385769, 52.471512 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 1, 92, 180, 270 ], + "duration" : 0.561, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.582, + "geometry_index" : 156, + "location" : [ 13.385769, 52.471561 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 99, 181, 270 ], + "duration" : 0.575, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 0.582, + "geometry_index" : 157, + "location" : [ 13.38577, 52.4716 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 180, 270 ], + "duration" : 5.545, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.815, + "geometry_index" : 158, + "location" : [ 13.38577, 52.471635 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 0, 89, 180, 270 ], + "duration" : 0.838, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.872, + "geometry_index" : 161, + "location" : [ 13.385773, 52.471993 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 180, 270 ], + "duration" : 23.546, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 24.715, + "geometry_index" : 162, + "location" : [ 13.385773, 52.47205 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 1, 89, 181, 265 ], + "duration" : 18.711, + "turn_weight" : 8.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 28.027, + "geometry_index" : 165, + "location" : [ 13.385807, 52.473575 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 181, 272 ], + "duration" : 0.988, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.018, + "geometry_index" : 168, + "location" : [ 13.385836, 52.474787 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 1, 181, 270 ], + "duration" : 19.127, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 20.063, + "geometry_index" : 169, + "location" : [ 13.385838, 52.474854 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 1, 92, 181 ], + "duration" : 0.988, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.018, + "geometry_index" : 172, + "location" : [ 13.385867, 52.476095 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 1, 181 ], + "duration" : 0.692, + "admin_index" : 0, + "out" : 0, + "weight" : 0.727, + "geometry_index" : 173, + "location" : [ 13.385869, 52.476158 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 181, 272 ], + "duration" : 0.298, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 0.291, + "geometry_index" : 174, + "location" : [ 13.38587, 52.476204 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 1, 94, 180 ], + "duration" : 0.838, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.872, + "geometry_index" : 175, + "location" : [ 13.38587, 52.476221 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 1, 181, 270 ], + "duration" : 28.542, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 29.949, + "geometry_index" : 176, + "location" : [ 13.385871, 52.476272 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 108, 181, 289 ], + "duration" : 1.128, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 1.163, + "geometry_index" : 179, + "location" : [ 13.385917, 52.47812 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 1, 92, 180, 270 ], + "duration" : 1.115, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.163, + "geometry_index" : 180, + "location" : [ 13.385918, 52.478194 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 80, 181, 259 ], + "duration" : 26.742, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 28.059, + "geometry_index" : 181, + "location" : [ 13.38592, 52.47827 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 181, 270 ], + "duration" : 0.85, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.872, + "geometry_index" : 185, + "location" : [ 13.38596, 52.480004 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 1, 181, 270 ], + "duration" : 2.235, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.326, + "geometry_index" : 186, + "location" : [ 13.385962, 52.480054 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 1, 181, 270 ], + "duration" : 0.85, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.872, + "geometry_index" : 187, + "location" : [ 13.385966, 52.480202 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 181, 270 ], + "duration" : 17.604, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 18.464, + "geometry_index" : 188, + "location" : [ 13.385967, 52.480253 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 83, 181, 262 ], + "duration" : 3.065, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.198, + "geometry_index" : 191, + "location" : [ 13.385997, 52.481398 ] + }, { + "entry" : [ true, true, true, false, true ], + "in" : 3, + "bearings" : [ 1, 46, 110, 181, 291 ], + "duration" : 1.958, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.035, + "geometry_index" : 192, + "location" : [ 13.386001, 52.481599 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 181, 270 ], + "duration" : 20.788, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 21.808, + "geometry_index" : 193, + "location" : [ 13.386004, 52.481721 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 1, 138, 181 ], + "duration" : 1.127, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.163, + "geometry_index" : 198, + "location" : [ 13.386037, 52.483066 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 181, 272 ], + "duration" : 1.681, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.745, + "geometry_index" : 200, + "location" : [ 13.386039, 52.483139 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 181, 270 ], + "duration" : 2.788, + "turn_weight" : 2.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.708, + "geometry_index" : 201, + "location" : [ 13.386041, 52.483246 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 0, 92, 181, 260 ], + "duration" : 0.436, + "turn_weight" : 2.8, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 3.236, + "geometry_index" : 202, + "location" : [ 13.386046, 52.483422 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 180, 270 ], + "duration" : 0.977, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.018, + "geometry_index" : 203, + "location" : [ 13.386046, 52.483448 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 90, 181, 270, 359 ], + "duration" : 9.715, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 3, + "weight" : 10.177, + "geometry_index" : 204, + "location" : [ 13.386048, 52.483515 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 90, 179, 267, 359 ], + "duration" : 1.53, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 1.599, + "geometry_index" : 207, + "location" : [ 13.386029, 52.484148 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 179, 269, 360 ], + "duration" : 2.223, + "turn_weight" : 0.7, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.026, + "geometry_index" : 208, + "location" : [ 13.386026, 52.484248 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 0, 180 ], + "duration" : 5.677, + "admin_index" : 0, + "out" : 0, + "weight" : 5.961, + "geometry_index" : 209, + "location" : [ 13.386024, 52.484389 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 2, 90, 180, 270 ], + "duration" : 1.946, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.035, + "geometry_index" : 211, + "location" : [ 13.386024, 52.484753 ] + }, { + "entry" : [ true, true, false, false, false ], + "in" : 3, + "bearings" : [ 2, 97, 132, 182, 275 ], + "duration" : 2.096, + "turn_weight" : 5.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 7.781, + "geometry_index" : 212, + "location" : [ 13.386031, 52.48488 ] + }, { + "entry" : [ true, false, false, false, true ], + "in" : 3, + "bearings" : [ 0, 68, 94, 182, 270 ], + "duration" : 1.821, + "turn_weight" : 5.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 7.49, + "geometry_index" : 213, + "location" : [ 13.386038, 52.485016 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 2, 90, 180, 270 ], + "duration" : 12.054, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 12.648, + "geometry_index" : 215, + "location" : [ 13.386038, 52.485129 ] + }, { + "entry" : [ false, false, false, true, true ], + "in" : 2, + "bearings" : [ 45, 92, 177, 272, 356 ], + "duration" : 1.265, + "turn_weight" : 8.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 4, + "weight" : 9.708, + "geometry_index" : 217, + "location" : [ 13.386011, 52.485906 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 176, 270 ], + "duration" : 10.256, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 10.758, + "geometry_index" : 218, + "location" : [ 13.386002, 52.485988 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 1, 139, 181 ], + "duration" : 9.435, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 9.886, + "geometry_index" : 219, + "location" : [ 13.38602, 52.48665 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 2, 92, 181, 272 ], + "duration" : 1.542, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.599, + "geometry_index" : 221, + "location" : [ 13.38604, 52.48726 ] + }, { + "entry" : [ true, false, false, false, true ], + "in" : 3, + "bearings" : [ 2, 39, 93, 182, 270 ], + "duration" : 34.773, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 36.492, + "geometry_index" : 222, + "location" : [ 13.386045, 52.487358 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 8, 189 ], + "duration" : 4.708, + "admin_index" : 0, + "out" : 0, + "weight" : 5.061, + "geometry_index" : 231, + "location" : [ 13.386397, 52.489599 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 14, 190 ], + "duration" : 2.831, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 0.893, + "geometry_index" : 233, + "location" : [ 13.386477, 52.489902 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 13, 92, 194, 272 ], + "duration" : 1.819, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.935, + "geometry_index" : 234, + "location" : [ 13.386496, 52.48995 ] + }, { + "entry" : [ true, true, false, false, true ], + "in" : 3, + "bearings" : [ 14, 92, 160, 193, 270 ], + "duration" : 1.669, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.786, + "geometry_index" : 235, + "location" : [ 13.38654, 52.490062 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 13, 89, 194, 269 ], + "duration" : 0.296, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.298, + "geometry_index" : 236, + "location" : [ 13.386581, 52.490165 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 11, 193 ], + "duration" : 17.862, + "admin_index" : 0, + "out" : 0, + "weight" : 19.201, + "geometry_index" : 237, + "location" : [ 13.386588, 52.490183 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 13, 77, 194, 284 ], + "duration" : 0.573, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.595, + "geometry_index" : 239, + "location" : [ 13.387009, 52.491315 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 14, 103, 193 ], + "duration" : 14.269, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 15.331, + "geometry_index" : 240, + "location" : [ 13.387023, 52.491351 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 19, 197 ], + "duration" : 4.569, + "admin_index" : 0, + "out" : 0, + "weight" : 4.912, + "geometry_index" : 243, + "location" : [ 13.387428, 52.492243 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 23, 201, 290 ], + "duration" : 1.669, + "turn_weight" : 2.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 4.186, + "geometry_index" : 247, + "location" : [ 13.387592, 52.492519 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 20, 61, 203 ], + "duration" : 2.576, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.022, + "admin_index" : 0, + "out" : 0, + "weight" : 0.595, + "geometry_index" : 249, + "location" : [ 13.387661, 52.492619 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 21, 113, 200, 293 ], + "duration" : 0.838, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.893, + "geometry_index" : 250, + "location" : [ 13.387683, 52.492655 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 21, 110, 201, 289 ], + "duration" : 0.976, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.042, + "geometry_index" : 251, + "location" : [ 13.387712, 52.492702 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 21, 108, 201, 289 ], + "duration" : 2.776, + "turn_weight" : 6.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 9.377, + "geometry_index" : 252, + "location" : [ 13.387746, 52.492757 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 21, 201 ], + "duration" : 3.108, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 1.191, + "geometry_index" : 253, + "location" : [ 13.38785, 52.492926 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 25, 108, 201, 289 ], + "duration" : 1.117, + "turn_weight" : 6.4, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 7.591, + "geometry_index" : 254, + "location" : [ 13.387894, 52.492997 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 25, 108, 205, 289 ], + "duration" : 0.85, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.893, + "geometry_index" : 255, + "location" : [ 13.387942, 52.49306 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 24, 108, 205, 289 ], + "duration" : 0.436, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 0.447, + "geometry_index" : 256, + "location" : [ 13.387979, 52.493108 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 19, 204 ], + "duration" : 1.108, + "admin_index" : 0, + "out" : 0, + "weight" : 1.191, + "geometry_index" : 257, + "location" : [ 13.387996, 52.493131 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 19, 199 ], + "duration" : 1.108, + "admin_index" : 0, + "out" : 0, + "weight" : 1.191, + "geometry_index" : 258, + "location" : [ 13.388033, 52.493196 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 20, 199, 289 ], + "duration" : 2.777, + "turn_weight" : 2.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.377, + "geometry_index" : 260, + "location" : [ 13.388071, 52.493263 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 20, 113, 200 ], + "duration" : 0.561, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.595, + "geometry_index" : 262, + "location" : [ 13.388168, 52.493428 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 21, 111, 200 ], + "duration" : 1.807, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.935, + "geometry_index" : 263, + "location" : [ 13.388191, 52.493466 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 21, 113, 201 ], + "duration" : 3.192, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.423, + "geometry_index" : 264, + "location" : [ 13.38826, 52.493578 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 22, 113, 201 ], + "duration" : 4.716, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 5.061, + "geometry_index" : 265, + "location" : [ 13.388381, 52.493775 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 22, 202 ], + "duration" : 2.215, + "admin_index" : 0, + "out" : 0, + "weight" : 2.382, + "geometry_index" : 266, + "location" : [ 13.388572, 52.494056 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 27, 118, 202 ], + "duration" : 1.672, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 1.786, + "geometry_index" : 268, + "location" : [ 13.38866, 52.494186 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 27, 207 ], + "duration" : 10.385, + "admin_index" : 0, + "out" : 0, + "weight" : 11.163, + "geometry_index" : 269, + "location" : [ 13.388741, 52.494282 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 30, 117, 207 ], + "duration" : 6.655, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 7.145, + "geometry_index" : 270, + "location" : [ 13.389247, 52.494881 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 16, 201 ], + "duration" : 2.769, + "admin_index" : 0, + "out" : 0, + "weight" : 2.977, + "geometry_index" : 277, + "location" : [ 13.389555, 52.495271 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 6, 196 ], + "duration" : 3.462, + "admin_index" : 0, + "out" : 0, + "weight" : 3.721, + "geometry_index" : 280, + "location" : [ 13.389636, 52.495442 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 185, 267, 357 ], + "duration" : 1.551, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 2, + "weight" : 1.637, + "geometry_index" : 284, + "location" : [ 13.38967, 52.495667 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 177, 352 ], + "duration" : 2.692, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 1, + "weight" : 0.744, + "geometry_index" : 286, + "location" : [ 13.389662, 52.495767 ] + }, { + "bearings" : [ 108, 172, 287, 352 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 287, + "location" : [ 13.389651, 52.495812 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Blücherstraße", + "components" : [ { + "text" : "Blücherstraße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 2985.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Blücherstraße", + "components" : [ { + "text" : "Blücherstraße", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "Zentrum, Kreuzberg", + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left toward Zentrum/Kreuzberg.", + "type" : "turn", + "bearing_after" : 1, + "bearing_before" : 93, + "location" : [ 13.385714, 52.469486 ] + }, + "name" : "Tempelhofer Damm", + "duration" : 429.902, + "distance" : 2985.0, + "driving_side" : "right", + "weight" : 508.856, + "mode" : "driving", + "ref" : "B 96", + "geometry" : "{mnacBc~~oXyCEmGGqOSwDEmDEaGIgFGgAAqTQqCAy@AcAAm@?aRKcLEeAAeA?aB?mAAeA?a@?_PCiCAqB?_@?axA_AgDCuCCgeAu@Y?eCC}CCseAu@_A?}BC{AAa@?eBAoDE{jBsAcAAsCAwCCg@A_KGo}AeAS?cBCgHGeBAS?qcAy@kAAqKGsFEm@AaTOeGEmn@e@}DCw@AyAAuEC_JIs@?eCC{ZVwHH}@BgEDyGBuR?aB?}FMoGMmD@s@AqR[_\\pAcDPkh@c@}`@a@eCEcEIqM[{Nk@wNy@iLw@wMeA}MsAoTeC_OqBkLsBgFo@uJoB_Be@_FwAmEqAc@MuVmFan@{QgA[cXmIiP_GiL{EsGyCkEyBSOs@c@_Ak@gC}AgAk@}Ay@mBcAqIoEmCwA}B_B_BiAm@a@aCiAi@W{As@qAm@wFsCkAm@_FiCiKqFqP}Jy@g@iEgC_EaDmd@s^EGeD_DwF{E}AeAaAg@gB_A_Bu@}DmAkAo@kAc@cDa@uBSu@CqBIoBHwADyATuFx@" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Zossener Straße", + "components" : [ { + "text" : "Zossener Straße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 380.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 400 meters.", + "announcement" : "Continue for 400 meters.", + "distanceAlongGeometry" : 370.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn left onto Zossener Straße.", + "announcement" : "In 300 meters, Turn left onto Zossener Straße.", + "distanceAlongGeometry" : 252.5 + }, { + "ssmlAnnouncement" : "Turn left onto Zossener Straße.", + "announcement" : "Turn left onto Zossener Straße.", + "distanceAlongGeometry" : 72.0 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 104, 172, 284, 352 ], + "duration" : 5.841, + "turn_weight" : 8.2, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 4.733, + "admin_index" : 0, + "out" : 0, + "weight" : 9.391, + "geometry_index" : 288, + "location" : [ 13.389622, 52.495935 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 104, 170, 284, 351 ], + "duration" : 0.699, + "turn_weight" : 3.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.944, + "geometry_index" : 289, + "location" : [ 13.389732, 52.495918 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 102, 170, 284, 351 ], + "duration" : 0.438, + "turn_weight" : 3.2, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 3.646, + "geometry_index" : 290, + "location" : [ 13.389809, 52.495906 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 98, 282 ], + "duration" : 6.369, + "turn_weight" : 0.8, + "admin_index" : 0, + "out" : 0, + "weight" : 7.647, + "geometry_index" : 291, + "location" : [ 13.389847, 52.495901 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 1, 88, 182, 271 ], + "duration" : 1.542, + "turn_weight" : 3.2, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 4.837, + "geometry_index" : 296, + "location" : [ 13.390519, 52.495868 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 84, 268, 353 ], + "duration" : 37.13, + "turn_weight" : 0.8, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 40.691, + "geometry_index" : 297, + "location" : [ 13.390688, 52.495871 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 6, 96, 271 ], + "duration" : 2.364, + "turn_weight" : 0.8, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 1, + "weight" : 3.33, + "geometry_index" : 313, + "location" : [ 13.394597, 52.496177 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 4, 97, 182, 276 ], + "duration" : 1.392, + "turn_weight" : 3.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.688, + "geometry_index" : 315, + "location" : [ 13.394844, 52.496161 ] + }, { + "bearings" : [ 7, 102, 187, 277 ], + "entry" : [ false, true, true, false ], + "in" : 3, + "turn_weight" : 9.6, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 316, + "location" : [ 13.394995, 52.496149 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Blücherstraße.", + "type" : "turn", + "bearing_after" : 104, + "bearing_before" : 352, + "location" : [ 13.389622, 52.495935 ] + }, + "name" : "Blücherstraße", + "duration" : 57.446, + "distance" : 380.0, + "driving_side" : "right", + "weight" : 89.562, + "mode" : "driving", + "geometry" : "}bbccBkrfpX`@{EVyCHkA\\qIXuIFuH@eH?{@EqIQuHYcIe@{LoHmyAa@gHk@_La@iK]oI[{KUkISkKQ_OEkJ?gB@mBFmDTsJHyBVmHh@mI" + }, { + "bannerInstructions" : [ { + "secondary" : { + "text" : "Prenzlauer Berg, Alexanderplatz", + "components" : [ { + "text" : "Prenzlauer Berg, Alexanderplatz", + "type" : "text" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Leipziger Straße", + "components" : [ { + "text" : "Leipziger Straße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1815.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Leipziger Straße", + "components" : [ { + "text" : "Leipziger Straße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "Prenzlauer Berg, Alexanderplatz", + "components" : [ { + "text" : "Prenzlauer Berg, Alexanderplatz", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 2 kilometers.", + "announcement" : "Continue for 2 kilometers.", + "distanceAlongGeometry" : 1805.0 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn right toward Prenzlauer Berg.", + "announcement" : "In 200 meters, Turn right toward Prenzlauer Berg.", + "distanceAlongGeometry" : 232.4 + }, { + "ssmlAnnouncement" : "Turn right toward Prenzlauer Berg, Alexanderplatz.", + "announcement" : "Turn right toward Prenzlauer Berg, Alexanderplatz.", + "distanceAlongGeometry" : 54.6 + } ], + "intersections" : [ { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 5, 106, 187, 282 ], + "duration" : 7.548, + "turn_weight" : 13.0, + "turn_duration" : 6.024, + "admin_index" : 0, + "out" : 0, + "weight" : 14.637, + "geometry_index" : 317, + "location" : [ 13.395162, 52.496128 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 5, 106, 185, 282 ], + "duration" : 1.946, + "turn_weight" : 9.6, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 11.684, + "geometry_index" : 318, + "location" : [ 13.395176, 52.496227 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 7, 185 ], + "duration" : 8.178, + "turn_weight" : 3.2, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 11.982, + "geometry_index" : 319, + "location" : [ 13.395193, 52.496351 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 13, 190 ], + "duration" : 1.116, + "turn_weight" : 3.2, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 4.391, + "geometry_index" : 324, + "location" : [ 13.395318, 52.496874 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 15, 193 ], + "duration" : 7.208, + "turn_weight" : 3.2, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 10.94, + "geometry_index" : 325, + "location" : [ 13.395344, 52.496943 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 198 ], + "duration" : 5.419, + "turn_weight" : 0.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.605, + "geometry_index" : 329, + "location" : [ 13.395564, 52.497391 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 198 ], + "duration" : 2.969, + "turn_weight" : 5.8, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 6.842, + "geometry_index" : 331, + "location" : [ 13.395744, 52.497724 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 16, 198 ], + "duration" : 1.963, + "turn_weight" : 3.2, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 5.284, + "geometry_index" : 332, + "location" : [ 13.395774, 52.49778 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 15, 61, 196, 242 ], + "duration" : 1.265, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 10.94, + "geometry_index" : 333, + "location" : [ 13.395833, 52.497906 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 11, 195 ], + "duration" : 1.246, + "turn_weight" : 5.8, + "admin_index" : 0, + "out" : 0, + "weight" : 7.14, + "geometry_index" : 334, + "location" : [ 13.395865, 52.497981 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 6, 191 ], + "duration" : 3.323, + "turn_weight" : 0.8, + "admin_index" : 0, + "out" : 0, + "weight" : 4.372, + "geometry_index" : 336, + "location" : [ 13.395891, 52.498064 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 4, 185 ], + "duration" : 2.969, + "turn_weight" : 0.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 1.842, + "geometry_index" : 338, + "location" : [ 13.395926, 52.498277 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 84, 184, 262, 356 ], + "duration" : 1.694, + "turn_weight" : 14.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.033, + "admin_index" : 0, + "out" : 3, + "weight" : 16.386, + "geometry_index" : 339, + "location" : [ 13.395933, 52.498342 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 176, 353 ], + "duration" : 8.053, + "turn_weight" : 3.2, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 1, + "weight" : 11.833, + "geometry_index" : 340, + "location" : [ 13.395921, 52.498447 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 70, 164, 266, 342 ], + "duration" : 1.127, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 3, + "weight" : 10.791, + "geometry_index" : 346, + "location" : [ 13.395757, 52.498957 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 69, 162, 234, 343 ], + "duration" : 1.116, + "turn_weight" : 9.6, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "weight" : 10.791, + "geometry_index" : 347, + "location" : [ 13.395719, 52.499027 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 163, 340 ], + "duration" : 5.005, + "turn_weight" : 3.2, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "weight" : 8.558, + "geometry_index" : 348, + "location" : [ 13.395687, 52.499092 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 160, 340 ], + "duration" : 10.946, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 12.982, + "geometry_index" : 349, + "location" : [ 13.395509, 52.499397 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 160, 340 ], + "duration" : 3.469, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.758, + "geometry_index" : 352, + "location" : [ 13.395111, 52.500065 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 160, 340 ], + "duration" : 1.938, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 1, + "weight" : 3.082, + "geometry_index" : 353, + "location" : [ 13.39498, 52.500279 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 160, 339 ], + "duration" : 3.204, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 7.303, + "geometry_index" : 354, + "location" : [ 13.394909, 52.500396 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 159, 341 ], + "duration" : 0.285, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 1.255, + "geometry_index" : 357, + "location" : [ 13.39479, 52.500586 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 161, 340 ], + "duration" : 0.7, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.712, + "geometry_index" : 358, + "location" : [ 13.394779, 52.500606 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 160, 342 ], + "duration" : 5.677, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 1, + "weight" : 7.195, + "geometry_index" : 359, + "location" : [ 13.394752, 52.500651 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 165, 350 ], + "duration" : 2.692, + "turn_weight" : 0.95, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 1, + "weight" : 1.712, + "geometry_index" : 362, + "location" : [ 13.394579, 52.501001 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 170, 349 ], + "duration" : 1.127, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 5.018, + "geometry_index" : 363, + "location" : [ 13.394566, 52.501045 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 169, 350 ], + "duration" : 1.254, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 5.171, + "geometry_index" : 364, + "location" : [ 13.394543, 52.501116 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 170, 351 ], + "duration" : 0.561, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.409, + "geometry_index" : 365, + "location" : [ 13.394519, 52.501195 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 171, 354 ], + "duration" : 3.877, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 1, + "weight" : 5.215, + "geometry_index" : 366, + "location" : [ 13.39451, 52.501231 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 1, 176 ], + "duration" : 10.662, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 12.678, + "geometry_index" : 368, + "location" : [ 13.394473, 52.501482 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 16, 193 ], + "duration" : 0.562, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.559, + "geometry_index" : 376, + "location" : [ 13.394607, 52.502167 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 17, 196 ], + "duration" : 2.415, + "turn_weight" : 0.95, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 1.407, + "geometry_index" : 377, + "location" : [ 13.394624, 52.502204 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 197 ], + "duration" : 0.561, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.559, + "geometry_index" : 378, + "location" : [ 13.394636, 52.502228 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 198 ], + "duration" : 0.573, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.409, + "geometry_index" : 379, + "location" : [ 13.394656, 52.502265 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 20, 198 ], + "duration" : 6.1, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.651, + "geometry_index" : 380, + "location" : [ 13.394675, 52.502301 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 30, 205 ], + "duration" : 2.917, + "turn_weight" : 3.8, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 6.998, + "geometry_index" : 383, + "location" : [ 13.394925, 52.502664 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 30, 210 ], + "duration" : 5.407, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 6.89, + "geometry_index" : 385, + "location" : [ 13.395076, 52.502825 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 30, 210 ], + "duration" : 0.838, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.864, + "geometry_index" : 387, + "location" : [ 13.395364, 52.503129 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 210 ], + "duration" : 7.088, + "turn_weight" : 3.8, + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 0, + "weight" : 11.568, + "geometry_index" : 388, + "location" : [ 13.395407, 52.503174 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 205 ], + "duration" : 14.282, + "turn_weight" : 3.8, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 19.488, + "geometry_index" : 389, + "location" : [ 13.395732, 52.503592 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 3.607, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.91, + "geometry_index" : 392, + "location" : [ 13.396352, 52.504434 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 205 ], + "duration" : 2.236, + "turn_weight" : 0.95, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 3.387, + "geometry_index" : 393, + "location" : [ 13.396509, 52.504643 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 2.5, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.692, + "geometry_index" : 394, + "location" : [ 13.396607, 52.504775 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 23, 205 ], + "duration" : 5.007, + "turn_weight" : 0.95, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 6.433, + "geometry_index" : 395, + "location" : [ 13.396718, 52.504923 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 25, 195, 221 ], + "duration" : 0.843, + "turn_weight" : 0.95, + "turn_duration" : 0.013, + "admin_index" : 0, + "out" : 0, + "weight" : 1.864, + "geometry_index" : 397, + "location" : [ 13.396888, 52.505227 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 205 ], + "duration" : 1.404, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.323, + "geometry_index" : 398, + "location" : [ 13.396924, 52.505273 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 26, 205 ], + "duration" : 1.404, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.323, + "geometry_index" : 399, + "location" : [ 13.396987, 52.505355 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 206 ], + "duration" : 4.311, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 8.521, + "geometry_index" : 400, + "location" : [ 13.39705, 52.505433 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 205 ], + "duration" : 3.898, + "turn_weight" : 0.95, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 5.215, + "geometry_index" : 401, + "location" : [ 13.397242, 52.505689 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 3.884, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.215, + "geometry_index" : 402, + "location" : [ 13.397413, 52.505919 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 27, 205 ], + "duration" : 1.392, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.473, + "geometry_index" : 403, + "location" : [ 13.397583, 52.506146 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 27, 207 ], + "duration" : 2.222, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.387, + "geometry_index" : 404, + "location" : [ 13.397653, 52.506229 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 207 ], + "duration" : 6.369, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 7.956, + "geometry_index" : 405, + "location" : [ 13.397759, 52.506354 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 4.015, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 5.367, + "geometry_index" : 407, + "location" : [ 13.398037, 52.50673 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 1.807, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.78, + "geometry_index" : 410, + "location" : [ 13.39821, 52.506967 ] + }, { + "entry" : [ true, true, false, false, true ], + "in" : 3, + "bearings" : [ 24, 110, 144, 205, 289 ], + "duration" : 1.128, + "turn_weight" : 16.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 17.618, + "geometry_index" : 411, + "location" : [ 13.398292, 52.507074 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 0.7, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.562, + "geometry_index" : 412, + "location" : [ 13.398341, 52.507142 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 205 ], + "duration" : 2.79, + "turn_weight" : 3.8, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 6.846, + "geometry_index" : 415, + "location" : [ 13.398371, 52.507181 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 23, 204 ], + "duration" : 2.927, + "turn_weight" : 0.95, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.148, + "geometry_index" : 418, + "location" : [ 13.39849, 52.507341 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 203 ], + "duration" : 0.554, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 1.559, + "geometry_index" : 419, + "location" : [ 13.398609, 52.507513 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 18, 198 ], + "duration" : 2.234, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.237, + "geometry_index" : 420, + "location" : [ 13.398628, 52.507549 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 198 ], + "duration" : 2.077, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 3.235, + "geometry_index" : 422, + "location" : [ 13.398702, 52.507684 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 205 ], + "duration" : 0.436, + "turn_weight" : 0.95, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 1.407, + "geometry_index" : 423, + "location" : [ 13.398792, 52.507803 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 0.976, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.016, + "geometry_index" : 424, + "location" : [ 13.398808, 52.507825 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 27, 204 ], + "duration" : 3.6, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 4.91, + "geometry_index" : 425, + "location" : [ 13.39885, 52.507883 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 20, 207 ], + "duration" : 0.307, + "turn_weight" : 3.8, + "turn_duration" : 0.03, + "admin_index" : 0, + "out" : 0, + "weight" : 4.105, + "geometry_index" : 426, + "location" : [ 13.399025, 52.50809 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 23, 200 ], + "duration" : 1.116, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.168, + "geometry_index" : 427, + "location" : [ 13.399035, 52.508107 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 203 ], + "duration" : 1.392, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.473, + "geometry_index" : 428, + "location" : [ 13.399081, 52.508174 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 21, 204 ], + "duration" : 3.068, + "turn_weight" : 3.8, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 7.151, + "geometry_index" : 429, + "location" : [ 13.399139, 52.508254 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 201 ], + "duration" : 0.839, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.864, + "geometry_index" : 430, + "location" : [ 13.39926, 52.508442 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 2.631, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 3.844, + "geometry_index" : 431, + "location" : [ 13.399296, 52.508491 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 3.33, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.605, + "geometry_index" : 432, + "location" : [ 13.39941, 52.508645 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 0.976, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.016, + "geometry_index" : 433, + "location" : [ 13.399554, 52.50884 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 3, + "bearings" : [ 6, 38, 113, 204 ], + "duration" : 1.956, + "turn_weight" : 11.4, + "turn_duration" : 0.018, + "admin_index" : 0, + "out" : 1, + "weight" : 13.532, + "geometry_index" : 434, + "location" : [ 13.399593, 52.508894 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 23, 218 ], + "duration" : 0.554, + "turn_weight" : 1.425, + "admin_index" : 0, + "out" : 0, + "weight" : 2.034, + "geometry_index" : 435, + "location" : [ 13.399717, 52.508992 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 23, 203 ], + "duration" : 1.115, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.018, + "geometry_index" : 436, + "location" : [ 13.399738, 52.509022 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 203 ], + "duration" : 1.392, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.473, + "geometry_index" : 437, + "location" : [ 13.399785, 52.509091 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 0.561, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.409, + "geometry_index" : 438, + "location" : [ 13.399844, 52.50917 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 4.154, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 5.519, + "geometry_index" : 439, + "location" : [ 13.399867, 52.509201 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 25, 204 ], + "duration" : 1.531, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.475, + "geometry_index" : 440, + "location" : [ 13.400048, 52.509444 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 33, 205 ], + "duration" : 1.395, + "turn_weight" : 3.8, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 5.323, + "geometry_index" : 441, + "location" : [ 13.400114, 52.509532 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 213 ], + "duration" : 5.409, + "turn_weight" : 3.8, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 9.74, + "geometry_index" : 442, + "location" : [ 13.400194, 52.509608 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 216 ], + "duration" : 1.116, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 5.018, + "geometry_index" : 443, + "location" : [ 13.400537, 52.509895 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 216 ], + "duration" : 1.254, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.321, + "geometry_index" : 444, + "location" : [ 13.400605, 52.509951 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 217 ], + "duration" : 6.515, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 10.958, + "geometry_index" : 445, + "location" : [ 13.400687, 52.510017 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 215 ], + "duration" : 1.417, + "turn_weight" : 4.4, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 5.985, + "geometry_index" : 447, + "location" : [ 13.401094, 52.51036 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 32, 216 ], + "duration" : 1.118, + "turn_weight" : 4.4, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 5.605, + "geometry_index" : 448, + "location" : [ 13.40117, 52.510424 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 31, 212 ], + "duration" : 1.821, + "turn_weight" : 3.8, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 5.78, + "geometry_index" : 449, + "location" : [ 13.401227, 52.510479 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 10, 211 ], + "duration" : 6.923, + "turn_weight" : 1.425, + "admin_index" : 0, + "out" : 0, + "weight" : 9.04, + "geometry_index" : 450, + "location" : [ 13.401323, 52.510576 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 174, 354 ], + "duration" : 2.803, + "turn_weight" : 1.1, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 1, + "weight" : 1.98, + "geometry_index" : 456, + "location" : [ 13.401338, 52.511016 ] + }, { + "bearings" : [ 174, 353 ], + "entry" : [ false, true ], + "in" : 0, + "turn_weight" : 4.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 457, + "location" : [ 13.40133, 52.511062 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Zossener Straße.", + "type" : "turn", + "bearing_after" : 5, + "bearing_before" : 102, + "location" : [ 13.395162, 52.496128 ] + }, + "name" : "Zossener Straße", + "duration" : 268.976, + "distance" : 1815.0, + "driving_side" : "right", + "weight" : 554.116, + "mode" : "driving", + "geometry" : "_obccBslqpXeE[wFa@cGo@uDe@gHgAaB]qE}@iCs@oA_@mDcAgDsAyM_GyI{D_IkDoB{@{FuBuC_A_AUeB]uBYsHk@aCMqEVk@Dc@DgJjAwFpAkA\\_G~BkCjAaC~@aRbJsUlLyO~HiAl@kLdGiFlCaCjA}CfB{Ax@g@TyAt@gAh@kJbEgGjBwAXmCl@}Cn@gAP_Ef@uH`@_DB_BAoGWcD_@{Ca@iE{@}DaAaCu@iAa@o@WiAg@gAe@eCgAgEaCgKiH}CkCcDaDcFwE{JgJyAuAcYiSKGoEyCwl@u`@aLyHgGcEgH}EiImFuGeB{AgAcD}B{C}B_O_KkMuIeMsIeDkCyFsEwHkFwL_IqA{@_IiFgAs@uEcDgCaB}@m@KICCgAs@aFkDUMwImFgAe@mDsA_B_AmFsDk@_@sBsA}K}Ia@SeC{A_DsBwJqFaBgAsHcFeK_HkBmAcEwF{@i@iC}A}CuB}@m@eNiJoDcCwC_D}PmToBgCcCcDqHyJ{JsL_CwCmBqBaE_E}@i@gA_@m@Ok@KkFEcLlA{ANmH|@" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue on B 1 for 900 meters.", + "announcement" : "Continue on B 1 for 900 meters.", + "distanceAlongGeometry" : 901.0 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn right onto Gustav-Böß-Straße.", + "announcement" : "In 200 meters, Turn right onto Gustav-Böß-Straße.", + "distanceAlongGeometry" : 209.8 + }, { + "ssmlAnnouncement" : "Turn right onto Gustav-Böß-Straße, B 1.", + "announcement" : "Turn right onto Gustav-Böß-Straße, B 1.", + "distanceAlongGeometry" : 65.6 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true, false ], + "in" : 1, + "bearings" : [ 66, 173, 252, 320, 336 ], + "duration" : 2.031, + "turn_weight" : 13.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.831, + "admin_index" : 0, + "out" : 0, + "weight" : 15.15, + "geometry_index" : 458, + "location" : [ 13.401299, 52.511213 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 63, 153, 246, 334 ], + "duration" : 4.308, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 4.821, + "geometry_index" : 459, + "location" : [ 13.401395, 52.511239 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 56, 146, 242 ], + "duration" : 5.0, + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 0, + "weight" : 5.593, + "geometry_index" : 462, + "location" : [ 13.40172, 52.511341 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 52, 235 ], + "duration" : 8.914, + "admin_index" : 0, + "out" : 0, + "weight" : 10.029, + "geometry_index" : 464, + "location" : [ 13.402067, 52.511486 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 43, 225, 308 ], + "duration" : 3.448, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.857, + "geometry_index" : 469, + "location" : [ 13.402632, 52.511796 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 42, 223 ], + "duration" : 11.657, + "admin_index" : 0, + "out" : 0, + "weight" : 13.114, + "geometry_index" : 470, + "location" : [ 13.40283, 52.511926 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 42, 224 ], + "duration" : 4.8, + "admin_index" : 0, + "out" : 0, + "weight" : 5.4, + "geometry_index" : 472, + "location" : [ 13.403509, 52.512375 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 42, 144, 222 ], + "duration" : 16.293, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 18.321, + "geometry_index" : 473, + "location" : [ 13.403781, 52.51256 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 42, 144, 221 ], + "duration" : 4.807, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.4, + "geometry_index" : 475, + "location" : [ 13.40471, 52.5132 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 41, 222 ], + "duration" : 3.429, + "admin_index" : 0, + "out" : 0, + "weight" : 3.857, + "geometry_index" : 476, + "location" : [ 13.404988, 52.513389 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 41, 221 ], + "duration" : 1.543, + "admin_index" : 0, + "out" : 0, + "weight" : 1.736, + "geometry_index" : 478, + "location" : [ 13.405179, 52.513525 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 41, 221 ], + "duration" : 7.543, + "admin_index" : 0, + "out" : 0, + "weight" : 8.486, + "geometry_index" : 479, + "location" : [ 13.405266, 52.513585 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 41, 141, 219, 321 ], + "duration" : 2.407, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.7, + "geometry_index" : 482, + "location" : [ 13.405687, 52.51389 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 40, 141, 221, 325 ], + "duration" : 4.135, + "turn_weight" : 4.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 9.029, + "geometry_index" : 483, + "location" : [ 13.405825, 52.513988 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 11, 122, 220, 301 ], + "duration" : 7.365, + "turn_duration" : 0.165, + "admin_index" : 0, + "out" : 0, + "weight" : 8.1, + "geometry_index" : 484, + "location" : [ 13.406055, 52.514152 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 36, 191, 215 ], + "duration" : 3.125, + "turn_duration" : 0.04, + "admin_index" : 0, + "out" : 0, + "weight" : 3.471, + "geometry_index" : 485, + "location" : [ 13.406169, 52.514521 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 216 ], + "duration" : 2.743, + "admin_index" : 0, + "out" : 0, + "weight" : 3.086, + "geometry_index" : 486, + "location" : [ 13.406321, 52.514649 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 34, 217 ], + "duration" : 17.143, + "admin_index" : 0, + "out" : 0, + "weight" : 19.286, + "geometry_index" : 487, + "location" : [ 13.406467, 52.514765 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 33, 214 ], + "duration" : 1.029, + "admin_index" : 0, + "out" : 0, + "weight" : 1.157, + "geometry_index" : 489, + "location" : [ 13.407285, 52.515509 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 35, 70, 213 ], + "duration" : 6.939, + "turn_weight" : 4.95, + "turn_duration" : 0.082, + "admin_index" : 0, + "out" : 1, + "weight" : 12.664, + "geometry_index" : 490, + "location" : [ 13.407335, 52.515556 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 34, 82, 250 ], + "duration" : 16.416, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.301, + "admin_index" : 0, + "out" : 0, + "weight" : 18.129, + "geometry_index" : 491, + "location" : [ 13.407885, 52.515675 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 33, 121, 215, 307 ], + "duration" : 16.137, + "turn_weight" : 8.8, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 26.526, + "geometry_index" : 493, + "location" : [ 13.408673, 52.516373 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : false + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 157, 326 ], + "duration" : 3.738, + "admin_index" : 0, + "out" : 1, + "weight" : 4.112, + "geometry_index" : 505, + "location" : [ 13.408868, 52.517146 ] + }, { + "bearings" : [ 49, 147, 229, 328 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 508, + "location" : [ 13.408648, 52.517349 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Gustav-Böß-Straße", + "components" : [ { + "text" : "Gustav-Böß-Straße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 911.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Gustav-Böß-Straße", + "components" : [ { + "text" : "Gustav-Böß-Straße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : false, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "Prenzlauer Berg, Alexanderplatz", + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right toward Prenzlauer Berg/Alexanderplatz.", + "type" : "turn", + "bearing_after" : 66, + "bearing_before" : 353, + "location" : [ 13.401299, 52.511213 ] + }, + "name" : "Leipziger Straße", + "duration" : 156.479, + "distance" : 911.0, + "driving_side" : "right", + "weight" : 205.699, + "mode" : "driving", + "ref" : "B 1", + "geometry" : "y}_dcBel}pXs@_EiA_GaA_E_AiEqDaMoBsFiAgDy@wBuAmD{CgGuFsKcGkKkRw[uGuLqJ_PiGoKu^ql@yJkPmEaHaA{AwBmDeHaL_GqI{@uAcEsGgIkMaVcF_GoHgFcHgb@we@gJkK}AcBmFka@ac@ug@qFqGoEcFuCqC_FuDeBy@uAo@uAWgB?gBFgCn@sBp@oC`BuAzAeAnAiFzFeBjBmDtD" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "fork", + "modifier" : "slight left", + "text" : "Grunerstraße", + "components" : [ { + "text" : "Grunerstraße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 348.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "In 300 meters, Keep left to take Grunerstraße.", + "announcement" : "In 300 meters, Keep left to take Grunerstraße.", + "distanceAlongGeometry" : 252.3 + }, { + "ssmlAnnouncement" : "Keep left to take Grunerstraße, B 1.", + "announcement" : "Keep left to take Grunerstraße, B 1.", + "distanceAlongGeometry" : 72.1 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 53, 148, 235, 317 ], + "duration" : 2.466, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : false + } ], + "turn_duration" : 1.636, + "admin_index" : 0, + "out" : 0, + "weight" : 4.714, + "geometry_index" : 509, + "location" : [ 13.408557, 52.517436 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 51, 134, 233, 318 ], + "duration" : 0.992, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 1.066, + "geometry_index" : 510, + "location" : [ 13.408624, 52.517467 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 50, 141, 231, 321 ], + "duration" : 12.884, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 14.165, + "geometry_index" : 511, + "location" : [ 13.408707, 52.517508 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 51, 139, 230, 321 ], + "duration" : 1.808, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.98, + "geometry_index" : 514, + "location" : [ 13.40976, 52.51804 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 51, 231, 321 ], + "duration" : 1.253, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.371, + "geometry_index" : 515, + "location" : [ 13.409906, 52.518112 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 51, 141, 231, 322 ], + "duration" : 10.253, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 11.271, + "geometry_index" : 516, + "location" : [ 13.410009, 52.518163 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 50, 82, 231 ], + "duration" : 3.884, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.265, + "geometry_index" : 517, + "location" : [ 13.410858, 52.518575 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 52, 144, 230, 322 ], + "duration" : 0.839, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 0.914, + "geometry_index" : 518, + "location" : [ 13.411173, 52.518737 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 52, 146, 232, 322 ], + "duration" : 10.945, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 12.032, + "geometry_index" : 519, + "location" : [ 13.411246, 52.518772 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 52, 232 ], + "duration" : 2.077, + "admin_index" : 0, + "out" : 0, + "weight" : 2.285, + "geometry_index" : 521, + "location" : [ 13.412166, 52.519213 ] + }, { + "bearings" : [ 67, 138, 232 ], + "entry" : [ true, true, false ], + "in" : 2, + "turn_duration" : 0.02, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 522, + "location" : [ 13.412344, 52.519297 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Gustav-Böß-Straße/B 1. Continue on B 1.", + "type" : "turn", + "bearing_after" : 53, + "bearing_before" : 328, + "location" : [ 13.408557, 52.517436 ] + }, + "name" : "Gustav-Böß-Straße", + "duration" : 49.914, + "distance" : 348.0, + "driving_side" : "right", + "weight" : 56.803, + "mode" : "driving", + "ref" : "B 1", + "geometry" : "wbldcByqkqX}@eCqAeD{Seh@iIqSaAaCoCcHeBmEwXat@cIuReAqCoLa[aMm\\gDcJyBaN" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Herbert-Baum-Straße", + "components" : [ { + "text" : "Herbert-Baum-Straße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 4498.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 4 kilometers.", + "announcement" : "Continue for 4 kilometers.", + "distanceAlongGeometry" : 4488.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn right onto Herbert-Baum-Straße.", + "announcement" : "In 300 meters, Turn right onto Herbert-Baum-Straße.", + "distanceAlongGeometry" : 251.7 + }, { + "ssmlAnnouncement" : "Turn right onto Herbert-Baum-Straße.", + "announcement" : "Turn right onto Herbert-Baum-Straße.", + "distanceAlongGeometry" : 72.0 + } ], + "intersections" : [ { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 59, 79, 224, 247 ], + "duration" : 5.292, + "turn_duration" : 0.03, + "admin_index" : 0, + "out" : 0, + "weight" : 5.788, + "geometry_index" : 523, + "location" : [ 13.412585, 52.519358 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 53, 238 ], + "duration" : 6.646, + "turn_weight" : 5.0, + "admin_index" : 0, + "out" : 0, + "weight" : 12.311, + "geometry_index" : 525, + "location" : [ 13.41306, 52.519534 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 52, 233 ], + "duration" : 2.492, + "admin_index" : 0, + "out" : 0, + "weight" : 2.742, + "geometry_index" : 526, + "location" : [ 13.413629, 52.519791 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 54, 232 ], + "duration" : 10.246, + "admin_index" : 0, + "out" : 0, + "weight" : 11.271, + "geometry_index" : 527, + "location" : [ 13.413843, 52.519891 ] + }, { + "entry" : [ true, false ], + "classes" : [ "tunnel" ], + "in" : 1, + "bearings" : [ 43, 226 ], + "duration" : 41.4, + "admin_index" : 0, + "out" : 0, + "weight" : 45.54, + "geometry_index" : 529, + "location" : [ 13.414665, 52.520323 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 33, 212 ], + "duration" : 25.339, + "admin_index" : 0, + "out" : 0, + "weight" : 27.872, + "geometry_index" : 532, + "location" : [ 13.417072, 52.52257 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 35, 208, 221 ], + "duration" : 1.551, + "turn_weight" : 7.85, + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 0, + "weight" : 9.525, + "geometry_index" : 537, + "location" : [ 13.418667, 52.523889 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 39, 122, 215 ], + "duration" : 3.194, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 3.503, + "geometry_index" : 538, + "location" : [ 13.418758, 52.523969 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 40, 219 ], + "duration" : 1.246, + "admin_index" : 0, + "out" : 0, + "weight" : 1.371, + "geometry_index" : 539, + "location" : [ 13.418975, 52.524131 ] + }, { + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 38, 220 ], + "duration" : 4.431, + "admin_index" : 0, + "out" : 0, + "weight" : 4.874, + "geometry_index" : 540, + "location" : [ 13.419063, 52.524195 ] + }, { + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 32, 218 ], + "duration" : 8.723, + "admin_index" : 0, + "out" : 0, + "weight" : 9.595, + "geometry_index" : 541, + "location" : [ 13.419357, 52.524425 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 34, 124, 213, 304 ], + "duration" : 1.669, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.828, + "geometry_index" : 544, + "location" : [ 13.41986, 52.524904 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 37, 124, 214, 308 ], + "duration" : 4.301, + "turn_weight" : 11.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 16.122, + "geometry_index" : 545, + "location" : [ 13.419959, 52.524993 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 38, 124, 217, 304 ], + "duration" : 1.946, + "turn_weight" : 11.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 13.532, + "geometry_index" : 550, + "location" : [ 13.420239, 52.525218 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 115, 218, 296 ], + "duration" : 7.496, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 8.225, + "geometry_index" : 551, + "location" : [ 13.42037, 52.52532 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 216 ], + "duration" : 4.846, + "admin_index" : 0, + "out" : 0, + "weight" : 5.331, + "geometry_index" : 553, + "location" : [ 13.420838, 52.525713 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 216 ], + "duration" : 10.108, + "admin_index" : 0, + "out" : 0, + "weight" : 11.118, + "geometry_index" : 554, + "location" : [ 13.421145, 52.525969 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 134, 216 ], + "duration" : 2.362, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.589, + "geometry_index" : 555, + "location" : [ 13.421787, 52.526498 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 37, 128, 216, 306 ], + "duration" : 8.039, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 8.834, + "geometry_index" : 556, + "location" : [ 13.421937, 52.526623 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 217 ], + "duration" : 5.954, + "admin_index" : 0, + "out" : 0, + "weight" : 6.549, + "geometry_index" : 557, + "location" : [ 13.422456, 52.527039 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 40, 217 ], + "duration" : 5.123, + "admin_index" : 0, + "out" : 0, + "weight" : 5.635, + "geometry_index" : 558, + "location" : [ 13.422844, 52.527351 ] + }, { + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 40, 220 ], + "duration" : 7.2, + "admin_index" : 0, + "out" : 0, + "weight" : 7.92, + "geometry_index" : 559, + "location" : [ 13.423194, 52.527609 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 34, 220 ], + "duration" : 2.554, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 0.609, + "geometry_index" : 560, + "location" : [ 13.423686, 52.52797 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 34, 115, 214, 296 ], + "duration" : 2.499, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.741, + "geometry_index" : 561, + "location" : [ 13.423721, 52.528002 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 38, 113, 214, 293 ], + "duration" : 1.809, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 5.78, + "geometry_index" : 562, + "location" : [ 13.423868, 52.528136 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 36, 108, 218, 289 ], + "duration" : 2.788, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.846, + "geometry_index" : 563, + "location" : [ 13.423989, 52.528229 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 120, 216, 300 ], + "duration" : 0.838, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.914, + "geometry_index" : 565, + "location" : [ 13.42416, 52.528371 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 36, 215 ], + "duration" : 8.862, + "admin_index" : 0, + "out" : 0, + "weight" : 9.748, + "geometry_index" : 566, + "location" : [ 13.424211, 52.528415 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 125, 216, 306 ], + "duration" : 2.222, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 567, + "location" : [ 13.424767, 52.528878 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.607, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.96, + "geometry_index" : 568, + "location" : [ 13.424905, 52.528996 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 215 ], + "duration" : 0.839, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 0.914, + "geometry_index" : 569, + "location" : [ 13.425129, 52.529189 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 6.653, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.311, + "geometry_index" : 570, + "location" : [ 13.425181, 52.529233 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 2.776, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.046, + "geometry_index" : 571, + "location" : [ 13.425595, 52.529588 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 127, 215, 307 ], + "duration" : 1.531, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.675, + "geometry_index" : 572, + "location" : [ 13.425764, 52.529733 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 0.7, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 0.761, + "geometry_index" : 573, + "location" : [ 13.425863, 52.529817 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 4.3, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 4.721, + "geometry_index" : 574, + "location" : [ 13.425902, 52.52985 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 1.254, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.371, + "geometry_index" : 575, + "location" : [ 13.426167, 52.530075 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 34, 125, 216 ], + "duration" : 0.435, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.457, + "geometry_index" : 576, + "location" : [ 13.426249, 52.530144 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 214 ], + "duration" : 1.67, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.828, + "geometry_index" : 577, + "location" : [ 13.426278, 52.53017 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 3.193, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 3.503, + "geometry_index" : 578, + "location" : [ 13.426378, 52.530254 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 2.223, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 579, + "location" : [ 13.426573, 52.53042 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 216 ], + "duration" : 2.223, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 580, + "location" : [ 13.426711, 52.530537 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 127, 216 ], + "duration" : 1.393, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.523, + "geometry_index" : 581, + "location" : [ 13.426853, 52.530658 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 2.915, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.198, + "geometry_index" : 582, + "location" : [ 13.426942, 52.530733 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 124, 215 ], + "duration" : 3.33, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.655, + "geometry_index" : 583, + "location" : [ 13.42712, 52.53089 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 1.385, + "admin_index" : 0, + "out" : 0, + "weight" : 1.523, + "geometry_index" : 584, + "location" : [ 13.427318, 52.531064 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 124, 215 ], + "duration" : 1.945, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.132, + "geometry_index" : 585, + "location" : [ 13.427403, 52.531138 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 34, 125, 215 ], + "duration" : 1.265, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.371, + "geometry_index" : 586, + "location" : [ 13.427524, 52.531244 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 122, 214, 303 ], + "duration" : 2.223, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 588, + "location" : [ 13.427596, 52.531309 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 215 ], + "duration" : 0.423, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 0.457, + "geometry_index" : 589, + "location" : [ 13.427732, 52.531429 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 124, 216 ], + "duration" : 5.823, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 6.397, + "geometry_index" : 590, + "location" : [ 13.427762, 52.531454 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 2.222, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 591, + "location" : [ 13.428128, 52.531759 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 1.661, + "admin_index" : 0, + "out" : 0, + "weight" : 1.828, + "geometry_index" : 592, + "location" : [ 13.428263, 52.531875 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 124, 215 ], + "duration" : 0.976, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.066, + "geometry_index" : 593, + "location" : [ 13.428366, 52.531964 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 3.6, + "admin_index" : 0, + "out" : 0, + "weight" : 3.96, + "geometry_index" : 594, + "location" : [ 13.428429, 52.532019 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 128, 215, 307 ], + "duration" : 2.751, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 3.017, + "geometry_index" : 595, + "location" : [ 13.428654, 52.532212 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 3.053, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.351, + "geometry_index" : 596, + "location" : [ 13.428789, 52.532327 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 0.857, + "admin_index" : 0, + "out" : 0, + "weight" : 0.964, + "geometry_index" : 597, + "location" : [ 13.428974, 52.532486 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 124, 215 ], + "duration" : 3.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.337, + "geometry_index" : 598, + "location" : [ 13.429018, 52.532524 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.33, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.655, + "geometry_index" : 599, + "location" : [ 13.429216, 52.532693 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 2.857, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 0.964, + "geometry_index" : 600, + "location" : [ 13.429421, 52.532869 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 125, 215, 306 ], + "duration" : 1.894, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 2.121, + "geometry_index" : 601, + "location" : [ 13.42946, 52.532903 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 35, 127, 216, 308 ], + "duration" : 2.064, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.314, + "geometry_index" : 602, + "location" : [ 13.429559, 52.532986 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 128, 215, 308 ], + "duration" : 0.865, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 0.964, + "geometry_index" : 603, + "location" : [ 13.429658, 52.533073 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 216 ], + "duration" : 4.286, + "admin_index" : 0, + "out" : 0, + "weight" : 4.822, + "geometry_index" : 604, + "location" : [ 13.429705, 52.533113 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 4.293, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.822, + "geometry_index" : 605, + "location" : [ 13.429913, 52.533294 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 4.293, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.822, + "geometry_index" : 606, + "location" : [ 13.430125, 52.533476 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.093, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.471, + "geometry_index" : 607, + "location" : [ 13.430334, 52.533656 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.436, + "geometry_index" : 608, + "location" : [ 13.430488, 52.533789 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.264, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.664, + "geometry_index" : 609, + "location" : [ 13.430684, 52.533957 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 3.093, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.471, + "geometry_index" : 610, + "location" : [ 13.430847, 52.534098 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 124, 215, 306 ], + "duration" : 4.464, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.014, + "geometry_index" : 612, + "location" : [ 13.431003, 52.534232 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 1.714, + "admin_index" : 0, + "out" : 0, + "weight" : 1.928, + "geometry_index" : 613, + "location" : [ 13.431222, 52.53442 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 128, 215 ], + "duration" : 1.721, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.928, + "geometry_index" : 614, + "location" : [ 13.431306, 52.534493 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 10.8, + "admin_index" : 0, + "out" : 0, + "weight" : 11.88, + "geometry_index" : 615, + "location" : [ 13.43139, 52.534565 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 127, 215 ], + "duration" : 4.161, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.569, + "geometry_index" : 616, + "location" : [ 13.431926, 52.535025 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 1.8, + "admin_index" : 0, + "out" : 0, + "weight" : 1.98, + "geometry_index" : 617, + "location" : [ 13.432183, 52.535245 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 33, 128, 215 ], + "duration" : 0.992, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 1.066, + "geometry_index" : 618, + "location" : [ 13.432295, 52.535341 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 39, 124, 213, 304 ], + "duration" : 0.564, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 0.609, + "geometry_index" : 619, + "location" : [ 13.432352, 52.535395 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 39, 219 ], + "duration" : 0.692, + "admin_index" : 0, + "out" : 0, + "weight" : 0.761, + "geometry_index" : 620, + "location" : [ 13.432394, 52.535426 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 34, 219 ], + "duration" : 7.892, + "admin_index" : 0, + "out" : 0, + "weight" : 8.682, + "geometry_index" : 621, + "location" : [ 13.432442, 52.535462 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 33, 214 ], + "duration" : 0.415, + "admin_index" : 0, + "out" : 0, + "weight" : 0.457, + "geometry_index" : 623, + "location" : [ 13.432909, 52.535887 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 34, 121, 213, 303 ], + "duration" : 2.361, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.589, + "geometry_index" : 624, + "location" : [ 13.432929, 52.535906 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 38, 128, 214, 303 ], + "duration" : 3.471, + "turn_weight" : 11.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 15.208, + "geometry_index" : 625, + "location" : [ 13.433067, 52.536031 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 35, 125, 218, 303 ], + "duration" : 1.684, + "turn_weight" : 11.4, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 13.228, + "geometry_index" : 632, + "location" : [ 13.433298, 52.536208 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 125, 215, 306 ], + "duration" : 10.807, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 11.88, + "geometry_index" : 633, + "location" : [ 13.433397, 52.536295 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 34, 128, 215 ], + "duration" : 1.404, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.523, + "geometry_index" : 634, + "location" : [ 13.434052, 52.536867 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 125, 214, 306 ], + "duration" : 9.978, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 10.966, + "geometry_index" : 635, + "location" : [ 13.434139, 52.536945 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 34, 128, 216 ], + "duration" : 1.265, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.371, + "geometry_index" : 636, + "location" : [ 13.434768, 52.537469 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 125, 214, 258 ], + "duration" : 12.193, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 13.403, + "geometry_index" : 637, + "location" : [ 13.434841, 52.537535 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 12.884, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 14.165, + "geometry_index" : 638, + "location" : [ 13.4356, 52.538177 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 215 ], + "duration" : 16.484, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 18.125, + "geometry_index" : 639, + "location" : [ 13.436378, 52.53886 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 38, 125, 215, 277 ], + "duration" : 4.578, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 5.026, + "geometry_index" : 640, + "location" : [ 13.437372, 52.539737 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 37, 218 ], + "duration" : 1.523, + "admin_index" : 0, + "out" : 0, + "weight" : 1.675, + "geometry_index" : 642, + "location" : [ 13.437669, 52.539969 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 38, 127, 217 ], + "duration" : 1.115, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.219, + "geometry_index" : 643, + "location" : [ 13.43777, 52.54005 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 122, 218, 304 ], + "duration" : 17.05, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 18.734, + "geometry_index" : 644, + "location" : [ 13.437847, 52.540109 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 34, 124, 215, 306 ], + "duration" : 2.096, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.285, + "geometry_index" : 647, + "location" : [ 13.438907, 52.54101 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 30, 121, 214, 300 ], + "duration" : 1.824, + "turn_weight" : 3.8, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 5.78, + "geometry_index" : 648, + "location" : [ 13.439035, 52.541125 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 35, 122, 210, 304 ], + "duration" : 1.81, + "turn_weight" : 3.8, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 5.78, + "geometry_index" : 649, + "location" : [ 13.439135, 52.541229 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 125, 215, 306 ], + "duration" : 11.5, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 12.642, + "geometry_index" : 650, + "location" : [ 13.439247, 52.541327 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 130, 216 ], + "duration" : 1.531, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.675, + "geometry_index" : 651, + "location" : [ 13.439958, 52.541933 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 35, 127, 216 ], + "duration" : 4.161, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.569, + "geometry_index" : 652, + "location" : [ 13.440051, 52.542012 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 36, 125, 215 ], + "duration" : 9.423, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 10.357, + "geometry_index" : 653, + "location" : [ 13.440304, 52.542234 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 3.884, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.168, + "geometry_index" : 654, + "location" : [ 13.440893, 52.542731 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 35, 215 ], + "duration" : 5.538, + "admin_index" : 0, + "out" : 0, + "weight" : 5.954, + "geometry_index" : 656, + "location" : [ 13.441131, 52.542935 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 35, 124, 215, 306 ], + "duration" : 1.668, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.786, + "geometry_index" : 658, + "location" : [ 13.441469, 52.54323 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 38, 128, 215, 303 ], + "duration" : 1.393, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.489, + "geometry_index" : 659, + "location" : [ 13.441571, 52.54332 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 36, 125, 218, 306 ], + "duration" : 6.111, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.549, + "geometry_index" : 660, + "location" : [ 13.441663, 52.543392 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 35, 125, 216 ], + "duration" : 16.345, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 17.564, + "geometry_index" : 661, + "location" : [ 13.442048, 52.543715 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 45, 137, 222, 311 ], + "duration" : 9.978, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 10.717, + "geometry_index" : 664, + "location" : [ 13.44309, 52.544564 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 52, 229 ], + "duration" : 3.323, + "admin_index" : 0, + "out" : 0, + "weight" : 3.572, + "geometry_index" : 667, + "location" : [ 13.443861, 52.545007 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 52, 134, 232 ], + "duration" : 2.915, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.126, + "geometry_index" : 668, + "location" : [ 13.444136, 52.545136 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 50, 121, 232, 300 ], + "duration" : 1.958, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.084, + "geometry_index" : 670, + "location" : [ 13.444379, 52.545252 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 56, 125, 230, 303 ], + "duration" : 4.719, + "turn_weight" : 9.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.011, + "admin_index" : 0, + "out" : 0, + "weight" : 14.661, + "geometry_index" : 672, + "location" : [ 13.444537, 52.545333 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 53, 121, 236, 303 ], + "duration" : 1.963, + "turn_weight" : 6.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 8.484, + "geometry_index" : 673, + "location" : [ 13.444949, 52.545505 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 53, 122, 233, 304 ], + "duration" : 3.065, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.275, + "geometry_index" : 675, + "location" : [ 13.44512, 52.545583 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 53, 190, 233 ], + "duration" : 24.527, + "turn_weight" : 1.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 27.946, + "geometry_index" : 676, + "location" : [ 13.445383, 52.545705 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 53, 233 ], + "duration" : 4.569, + "admin_index" : 0, + "out" : 0, + "weight" : 4.912, + "geometry_index" : 677, + "location" : [ 13.447479, 52.546658 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 54, 144, 233, 324 ], + "duration" : 2.234, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.382, + "geometry_index" : 679, + "location" : [ 13.447864, 52.546833 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 56, 134, 234, 329 ], + "duration" : 1.669, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.786, + "geometry_index" : 680, + "location" : [ 13.448054, 52.546918 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 53, 153, 236, 332 ], + "duration" : 14.286, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 15.331, + "geometry_index" : 681, + "location" : [ 13.448201, 52.546978 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 53, 144, 234, 322 ], + "duration" : 1.265, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.34, + "geometry_index" : 683, + "location" : [ 13.449425, 52.54753 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 54, 144, 233, 324 ], + "duration" : 4.173, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.465, + "geometry_index" : 684, + "location" : [ 13.449536, 52.54758 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 53, 142, 234 ], + "duration" : 0.435, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.447, + "geometry_index" : 685, + "location" : [ 13.449893, 52.54774 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 54, 144, 233 ], + "duration" : 5.696, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.103, + "geometry_index" : 686, + "location" : [ 13.449934, 52.547759 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 54, 142, 234 ], + "duration" : 3.619, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.87, + "geometry_index" : 687, + "location" : [ 13.450424, 52.547978 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 60, 146, 234, 325 ], + "duration" : 3.196, + "turn_duration" : 0.011, + "admin_index" : 0, + "out" : 0, + "weight" : 3.423, + "geometry_index" : 690, + "location" : [ 13.45073, 52.548113 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 67, 241, 325 ], + "duration" : 2.919, + "turn_weight" : 0.8, + "turn_duration" : 0.011, + "admin_index" : 0, + "out" : 0, + "weight" : 3.926, + "geometry_index" : 693, + "location" : [ 13.451022, 52.548214 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 70, 159, 247, 341 ], + "duration" : 12.886, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 13.843, + "geometry_index" : 695, + "location" : [ 13.451305, 52.548288 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 68, 159, 250, 339 ], + "duration" : 1.407, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 1.489, + "geometry_index" : 696, + "location" : [ 13.452601, 52.548572 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 65, 160, 248 ], + "duration" : 8.33, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 8.931, + "geometry_index" : 697, + "location" : [ 13.452744, 52.548607 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 250 ], + "duration" : 2.096, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.233, + "geometry_index" : 699, + "location" : [ 13.453576, 52.548805 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 250 ], + "duration" : 1.958, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 2.084, + "geometry_index" : 700, + "location" : [ 13.453787, 52.548851 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 250 ], + "duration" : 1.404, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.489, + "geometry_index" : 701, + "location" : [ 13.453983, 52.548894 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 72, 160, 250 ], + "duration" : 1.254, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.34, + "geometry_index" : 702, + "location" : [ 13.454124, 52.548925 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 75, 252 ], + "duration" : 4.015, + "admin_index" : 0, + "out" : 0, + "weight" : 4.317, + "geometry_index" : 704, + "location" : [ 13.454252, 52.548951 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 70, 165, 253, 336 ], + "duration" : 0.853, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 0.893, + "geometry_index" : 706, + "location" : [ 13.454661, 52.549023 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 65, 250 ], + "duration" : 2.215, + "admin_index" : 0, + "out" : 0, + "weight" : 2.382, + "geometry_index" : 707, + "location" : [ 13.454747, 52.549042 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 67, 160, 245 ], + "duration" : 1.67, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.786, + "geometry_index" : 710, + "location" : [ 13.454956, 52.5491 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 247 ], + "duration" : 3.748, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 4.019, + "geometry_index" : 712, + "location" : [ 13.455125, 52.549143 ] + }, { + "bearings" : [ 70, 250 ], + "entry" : [ true, false ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 713, + "location" : [ 13.455504, 52.549226 ] + } ], + "maneuver" : { + "modifier" : "slight left", + "instruction" : "Keep left to take Grunerstraße/B 1.", + "type" : "fork", + "bearing_after" : 59, + "bearing_before" : 67, + "location" : [ 13.412585, 52.519358 ] + }, + "name" : "Grunerstraße", + "duration" : 639.211, + "distance" : 4498.0, + "driving_side" : "right", + "weight" : 786.072, + "mode" : "driving", + "ref" : "B 1", + "geometry" : "{zodcBqmsqX{EyQcC{IaOqb@gEkLwHyTgPq\\uIiOsJeLcuB}wBoF_G_L{Mmj@}q@qAwA}NcV_DuDcIqL_CoDkMkQ}Zg\\]a@a@c@qDeEaAqAkA{AIMmBgC{DkFkEeGe@o@kVwZ_OeRa`@cg@yFkH_Ym_@oRgWcO{TqUw]_AeAkGeHyDqFeAsAuEaGwAeB}[wa@kFsGaK_MwAgBeU{XaHqIgDeEaAmAaMqOiCcDs@y@gDgEkIeKiFsGqF{GuCqDyHcJ{IkKsCiDsEqFeAmA{@aAoFoGq@{@aR{UgFmGqDmEmB}BaKaMeFmG}HqJkAwAqIkK_JyKcAmAeDeEmDeEoA}AiJ_LkJgLgJaLiGsHoIgKyGeIuEwFu@_AwJuLqCgDoCgDw[o`@wLaO_E_FkBqB}@sAgA_BwXi[Y[e@g@yFsGa@k@}@qA{@kAo@}@s@cA{@mAe@s@mDeEwb@}g@{CmDw_@if@cCqCcg@mn@ui@so@yu@c}@kIcLcCmDaDiEuByCuXc^q[u_@aAmAeF_GoEgEcE_F{d@mk@}CyD{LyNa^yc@oBeCgHuIkOyQaAiAsDkEoCwDeSaWw]ub@qMoPwF}JaFuJ_MoVsE_LaGePsDmJs@wBoByEq@aBwIwXcAsCwAaEsFmOqz@_bCmHwSo@iBiD{JwBeH_\\g_AoDgKcB}E_IiUe@qAuLs]eDmJ}@wCi@}AuAaF{@sDw@qDcAwFoA}HwP_pAeA}GqCaOyF}b@{AeLuAgK}@yGYuBYiCk@yHcBwNe@kDa@iCi@sCg@cCo@kDe@eDeDuVsAyJ" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "text" : "You have arrived at your destination.", + "components" : [ { + "text" : "You have arrived at your destination.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 396.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 400 meters.", + "announcement" : "Continue for 400 meters.", + "distanceAlongGeometry" : 386.0 + }, { + "ssmlAnnouncement" : "In 200 meters, You will arrive at your destination.", + "announcement" : "In 200 meters, You will arrive at your destination.", + "distanceAlongGeometry" : 154.6 + }, { + "ssmlAnnouncement" : "You have arrived at your destination.", + "announcement" : "You have arrived at your destination.", + "distanceAlongGeometry" : 44.3 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 72, 160, 250 ], + "duration" : 3.805, + "turn_weight" : 5.0, + "turn_duration" : 2.005, + "admin_index" : 0, + "out" : 1, + "weight" : 6.935, + "geometry_index" : 714, + "location" : [ 13.455693, 52.549268 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 70, 161, 251, 340 ], + "duration" : 5.644, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 15.647, + "geometry_index" : 715, + "location" : [ 13.455732, 52.549203 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 160, 251, 340 ], + "duration" : 0.919, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.367, + "geometry_index" : 717, + "location" : [ 13.455853, 52.548994 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 161, 340 ], + "duration" : 7.894, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 10.866, + "geometry_index" : 718, + "location" : [ 13.455873, 52.54896 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 160, 251, 341 ], + "duration" : 0.919, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.367, + "geometry_index" : 719, + "location" : [ 13.456047, 52.548661 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 340 ], + "duration" : 6.544, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 9.414, + "geometry_index" : 720, + "location" : [ 13.456065, 52.548631 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 69, 161, 249, 341 ], + "duration" : 1.819, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 11.535, + "geometry_index" : 722, + "location" : [ 13.456207, 52.548387 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 70, 163, 251, 341 ], + "duration" : 1.583, + "turn_weight" : 9.6, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 11.293, + "geometry_index" : 723, + "location" : [ 13.456244, 52.548322 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 69, 160, 249, 343 ], + "duration" : 4.749, + "turn_weight" : 9.6, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 1, + "weight" : 14.679, + "geometry_index" : 724, + "location" : [ 13.456273, 52.548263 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 69, 160, 341 ], + "duration" : 2.944, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 5.544, + "geometry_index" : 726, + "location" : [ 13.456375, 52.548089 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 160, 251, 340 ], + "duration" : 3.844, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 6.512, + "geometry_index" : 727, + "location" : [ 13.456438, 52.547982 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 340 ], + "duration" : 3.169, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 5.786, + "geometry_index" : 728, + "location" : [ 13.456522, 52.547839 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 161, 251, 340 ], + "duration" : 1.594, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.093, + "geometry_index" : 729, + "location" : [ 13.456592, 52.54772 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 69, 161, 341 ], + "duration" : 3.619, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 6.27, + "geometry_index" : 730, + "location" : [ 13.456624, 52.547664 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 72, 161, 251, 341 ], + "duration" : 1.594, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 11.293, + "geometry_index" : 731, + "location" : [ 13.456701, 52.547528 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 70, 159, 252, 341 ], + "duration" : 1.371, + "turn_weight" : 9.6, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "weight" : 11.051, + "geometry_index" : 732, + "location" : [ 13.456736, 52.547467 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 72, 160, 251, 339 ], + "duration" : 1.357, + "turn_weight" : 9.6, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 11.051, + "geometry_index" : 733, + "location" : [ 13.456767, 52.547417 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 160, 340 ], + "duration" : 4.95, + "turn_weight" : 2.4, + "admin_index" : 0, + "out" : 0, + "weight" : 7.721, + "geometry_index" : 734, + "location" : [ 13.456799, 52.547363 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 340 ], + "duration" : 1.594, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 4.093, + "geometry_index" : 735, + "location" : [ 13.456909, 52.547176 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 161, 251, 340 ], + "duration" : 1.144, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.609, + "geometry_index" : 736, + "location" : [ 13.456946, 52.547114 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 161, 341 ], + "duration" : 0.694, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 3.126, + "geometry_index" : 737, + "location" : [ 13.456968, 52.547076 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 160, 341 ], + "duration" : 0.919, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 3.367, + "geometry_index" : 738, + "location" : [ 13.456983, 52.547049 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 161, 251, 340 ], + "duration" : 2.269, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.819, + "geometry_index" : 739, + "location" : [ 13.457003, 52.547015 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 69, 161, 341 ], + "duration" : 0.919, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 3.367, + "geometry_index" : 740, + "location" : [ 13.457051, 52.54693 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 161, 251, 341 ], + "duration" : 1.819, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.335, + "geometry_index" : 741, + "location" : [ 13.45707, 52.546897 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 70, 161, 341 ], + "duration" : 4.294, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 6.996, + "geometry_index" : 742, + "location" : [ 13.45711, 52.546827 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 159, 341 ], + "duration" : 0.45, + "turn_weight" : 2.4, + "admin_index" : 0, + "out" : 0, + "weight" : 2.884, + "geometry_index" : 743, + "location" : [ 13.457203, 52.546663 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 69, 161, 249, 339 ], + "duration" : 1.582, + "turn_weight" : 9.6, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 11.293, + "geometry_index" : 744, + "location" : [ 13.457212, 52.546649 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 70, 160, 251, 341 ], + "duration" : 1.369, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 11.051, + "geometry_index" : 745, + "location" : [ 13.457246, 52.546588 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 70, 160, 249, 340 ], + "duration" : 14.869, + "turn_weight" : 9.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 25.564, + "geometry_index" : 746, + "location" : [ 13.457276, 52.546538 ] + }, { + "bearings" : [ 160, 241, 340 ], + "entry" : [ true, true, false ], + "in" : 2, + "turn_weight" : 2.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 749, + "location" : [ 13.457606, 52.545977 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Herbert-Baum-Straße.", + "type" : "turn", + "bearing_after" : 160, + "bearing_before" : 70, + "location" : [ 13.455693, 52.549268 ] + }, + "name" : "Herbert-Baum-Straße", + "duration" : 91.613, + "distance" : 396.0, + "driving_side" : "right", + "weight" : 244.783, + "mode" : "driving", + "geometry" : "ghjfcBysgtX`CmAjAi@tIgEbAg@tQ{Iz@c@vMsGNG`CiAtBy@h@YpHqDtE}B|GgDlFkCnB_AnGyCxBeAbB}@jB_AtJ{EzBiAjAk@t@]bAg@hD_B`Ae@jCoAfIyDZQxBcAbB{@bI}DzMyG`I{D~Ay@" + }, { + "intersections" : [ { + "bearings" : [ 340 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 0, + "geometry_index" : 750, + "location" : [ 13.457635, 52.545929 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "instruction" : "You have arrived at your destination.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 160, + "location" : [ 13.457635, 52.545929 ] + }, + "name" : "Herbert-Baum-Straße", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "qwcfcBemktX??" + } ], + "distance" : 15453.683, + "summary" : "B 96, Grunerstraße" + } ], + "geometry" : "gabacBw}cmXk[zBu@FeBNmBNS@uIl@gOfA}In@cCP_@DyDTaDR_AFaLr@gDRyJl@qAFo@DeKbAkIr@}@F}WdBqQlAYBcAiAcCRmBd@sAf@sAr@}AnAaB~AuBzC}BtEiEpIm@jAo@lAiDpGoB_Cq@y@a@g@iPwSiZq`@mMuPwVq]wa@oe@iFNY_@gn@uy@{a@kj@ya@yj@yLoQcGuJwGkLyC{FgEeJiBkEaDgJmDoK}DwMeFcSsDkPScAd@cO{CmYuGyp@iGaq@IcAdA}GQ}GW_Mi@qj@g@gi@WqO]eMYuJq@wOy@yPyA{TaCa[uEye@qDi[{Jsp@eAgIyA_NiEsWcE_f@wAoOaAeGc@eZaAgYaDwYkFkUgB}T{Q_cBkCyZgAoQ_@mK_Aeb@Jo`@rAw^|Ag\\nCkX|Dc[vDmV|EiWxFiW`\\oaA~a@akAlVwq@tUqr@~Vgt@xIyZhCaMxDkQjEaX`B{LzBuT|Y}kCxFsl@zDci@dEku@xC}v@jBum@f@sNpF}dCjB}hCvDiRx@eZn@uTjAq_@pDoiAdAo]|@q]FcCZyUBeCFgHLyLyCEmGGqOSwDEmDEaGIgFGgAAqTQqCAy@AcAAm@?aRKcLEeAAeA?aB?mAAeA?a@?_PCiCAqB?_@?axA_AgDCuCCgeAu@Y?eCC}CCseAu@_A?}BC{AAa@?eBAoDE{jBsAcAAsCAwCCg@A_KGo}AeAS?cBCgHGeBAS?qcAy@kAAqKGsFEm@AaTOeGEmn@e@}DCw@AyAAuEC_JIs@?eCC{ZVwHH}@BgEDyGBuR?aB?}FMoGMmD@s@AqR[_\\pAcDPkh@c@}`@a@eCEcEIqM[{Nk@wNy@iLw@wMeA}MsAoTeC_OqBkLsBgFo@uJoB_Be@_FwAmEqAc@MuVmFan@{QgA[cXmIiP_GiL{EsGyCkEyBSOs@c@_Ak@gC}AgAk@}Ay@mBcAqIoEmCwA}B_B_BiAm@a@aCiAi@W{As@qAm@wFsCkAm@_FiCiKqFqP}Jy@g@iEgC_EaDmd@s^EGeD_DwF{E}AeAaAg@gB_A_Bu@}DmAkAo@kAc@cDa@uBSu@CqBIoBHwADyATuFx@`@{EVyCHkA\\qIXuIFuH@eH?{@EqIQuHYcIe@{LoHmyAa@gHk@_La@iK]oI[{KUkISkKQ_OEkJ?gB@mBFmDTsJHyBVmHh@mIeE[wFa@cGo@uDe@gHgAaB]qE}@iCs@oA_@mDcAgDsAyM_GyI{D_IkDoB{@{FuBuC_A_AUeB]uBYsHk@aCMqEVk@Dc@DgJjAwFpAkA\\_G~BkCjAaC~@aRbJsUlLyO~HiAl@kLdGiFlCaCjA}CfB{Ax@g@TyAt@gAh@kJbEgGjBwAXmCl@}Cn@gAP_Ef@uH`@_DB_BAoGWcD_@{Ca@iE{@}DaAaCu@iAa@o@WiAg@gAe@eCgAgEaCgKiH}CkCcDaDcFwE{JgJyAuAcYiSKGoEyCwl@u`@aLyHgGcEgH}EiImFuGeB{AgAcD}B{C}B_O_KkMuIeMsIeDkCyFsEwHkFwL_IqA{@_IiFgAs@uEcDgCaB}@m@KICCgAs@aFkDUMwImFgAe@mDsA_B_AmFsDk@_@sBsA}K}Ia@SeC{A_DsBwJqFaBgAsHcFeK_HkBmAcEwF{@i@iC}A}CuB}@m@eNiJoDcCwC_D}PmToBgCcCcDqHyJ{JsL_CwCmBqBaE_E}@i@gA_@m@Ok@KkFEcLlA{ANmH|@s@_EiA_GaA_E_AiEqDaMoBsFiAgDy@wBuAmD{CgGuFsKcGkKkRw[uGuLqJ_PiGoKu^ql@yJkPmEaHaA{AwBmDeHaL_GqI{@uAcEsGgIkMaVcF_GoHgFcHgb@we@gJkK}AcBmFka@ac@ug@qFqGoEcFuCqC_FuDeBy@uAo@uAWgB?gBFgCn@sBp@oC`BuAzAeAnAiFzFeBjBmDtD}@eCqAeD{Seh@iIqSaAaCoCcHeBmEwXat@cIuReAqCoLa[aMm\\gDcJyBaN{EyQcC{IaOqb@gEkLwHyTgPq\\uIiOsJeLcuB}wBoF_G_L{Mmj@}q@qAwA}NcV_DuDcIqL_CoDkMkQ}Zg\\]a@a@c@qDeEaAqAkA{AIMmBgC{DkFkEeGe@o@kVwZ_OeRa`@cg@yFkH_Ym_@oRgWcO{TqUw]_AeAkGeHyDqFeAsAuEaGwAeB}[wa@kFsGaK_MwAgBeU{XaHqIgDeEaAmAaMqOiCcDs@y@gDgEkIeKiFsGqF{GuCqDyHcJ{IkKsCiDsEqFeAmA{@aAoFoGq@{@aR{UgFmGqDmEmB}BaKaMeFmG}HqJkAwAqIkK_JyKcAmAeDeEmDeEoA}AiJ_LkJgLgJaLiGsHoIgKyGeIuEwFu@_AwJuLqCgDoCgDw[o`@wLaO_E_FkBqB}@sAgA_BwXi[Y[e@g@yFsGa@k@}@qA{@kAo@}@s@cA{@mAe@s@mDeEwb@}g@{CmDw_@if@cCqCcg@mn@ui@so@yu@c}@kIcLcCmDaDiEuByCuXc^q[u_@aAmAeF_GoEgEcE_F{d@mk@}CyD{LyNa^yc@oBeCgHuIkOyQaAiAsDkEoCwDeSaWw]ub@qMoPwF}JaFuJ_MoVsE_LaGePsDmJs@wBoByEq@aBwIwXcAsCwAaEsFmOqz@_bCmHwSo@iBiD{JwBeH_\\g_AoDgKcB}E_IiUe@qAuLs]eDmJ}@wCi@}AuAaF{@sDw@qDcAwFoA}HwP_pAeA}GqCaOyF}b@{AeLuAgK}@yGYuBYiCk@yHcBwNe@kDa@iCi@sCg@cCo@kDe@eDeDuVsAyJ`CmAjAi@tIgEbAg@tQ{Iz@c@vMsGNG`CiAtBy@h@YpHqDtE}B|GgDlFkCnB_AnGyCxBeAbB}@jB_AtJ{EzBiAjAk@t@]bAg@hD_B`Ae@jCoAfIyDZQxBcAbB{@bI}DzMyG`I{D~Ay@" + } ], + "waypoints" : [ { + "distance" : 1.084, + "name" : "Bismarckstraße", + "location" : [ 13.339116, 52.46314 ] + }, { + "distance" : 1.05, + "name" : "Herbert-Baum-Straße", + "location" : [ 13.457635, 52.545929 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_BER_3507.json b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_BER_3507.json new file mode 100644 index 000000000000..5cf4d0b6d31c --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_BER_3507.json @@ -0,0 +1,2380 @@ +{ + "routes" : [ { + "voiceLocale" : "en", + "weight_name" : "auto", + "weight" : 1053.727, + "duration" : 569.334, + "distance" : 3507.272, + "legs" : [ { + "via_waypoints" : [ ], + "admins" : [ { + "iso_3166_1_alpha3" : "DEU", + "iso_3166_1" : "DE" + } ], + "weight" : 1053.727, + "duration" : 569.334, + "steps" : [ { + "bannerInstructions" : [ { + "primary" : { + "type" : "end of road", + "modifier" : "right", + "text" : "Karl-Liebknecht-Straße", + "components" : [ { + "text" : "Karl-Liebknecht-Straße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 2; B 5", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 119.656 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Drive northeast on Panoramastraße.", + "announcement" : "Drive northeast on Panoramastraße.", + "distanceAlongGeometry" : 119.7 + }, { + "ssmlAnnouncement" : "In 100 meters, Turn right onto Karl-Liebknecht-Straße.", + "announcement" : "In 100 meters, Turn right onto Karl-Liebknecht-Straße.", + "distanceAlongGeometry" : 107.6 + }, { + "ssmlAnnouncement" : "Turn right onto Karl-Liebknecht-Straße, B 2.", + "announcement" : "Turn right onto Karl-Liebknecht-Straße, B 2.", + "distanceAlongGeometry" : 41.1 + } ], + "intersections" : [ { + "classes" : [ "restricted" ], + "entry" : [ true ], + "bearings" : [ 39 ], + "duration" : 17.753, + "admin_index" : 0, + "out" : 0, + "weight" : 19.528, + "geometry_index" : 0, + "location" : [ 13.409961, 52.521487 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 38, 137, 219, 315 ], + "duration" : 2.721, + "turn_weight" : 16.4, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 19.37, + "geometry_index" : 1, + "location" : [ 13.410189, 52.521661 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 2, + "bearings" : [ 30, 135, 218, 315 ], + "duration" : 15.736, + "turn_weight" : 14.25, + "turn_duration" : 4.486, + "admin_index" : 0, + "out" : 3, + "weight" : 26.625, + "geometry_index" : 5, + "location" : [ 13.4103, 52.521748 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 136, 228, 319 ], + "duration" : 4.958, + "turn_weight" : 2.85, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 8.295, + "geometry_index" : 7, + "location" : [ 13.409782, 52.522068 ] + }, { + "bearings" : [ 70, 143, 253, 331 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "turn_weight" : 11.4, + "turn_duration" : 0.011, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 9, + "location" : [ 13.409579, 52.522225 ] + } ], + "maneuver" : { + "instruction" : "Drive northeast on Panoramastraße.", + "type" : "depart", + "bearing_after" : 39, + "bearing_before" : 0, + "location" : [ 13.409961, 52.521487 ] + }, + "name" : "Panoramastraße", + "duration" : 43.653, + "distance" : 119.656, + "driving_side" : "right", + "weight" : 87.94, + "mode" : "driving", + "geometry" : "}_tdcBqinqX{IgMe@m@_@i@m@y@y@kA}Pj\\aA~AsF`JeAr@gDtC" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "straight", "right" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Alexanderstraße", + "components" : [ { + "text" : "Alexanderstraße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 2; B 5", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 253.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "In 200 meters, Turn right onto Alexanderstraße.", + "announcement" : "In 200 meters, Turn right onto Alexanderstraße.", + "distanceAlongGeometry" : 236.1 + }, { + "ssmlAnnouncement" : "Turn right onto Alexanderstraße, B 2.", + "announcement" : "Turn right onto Alexanderstraße, B 2.", + "distanceAlongGeometry" : 70.0 + } ], + "intersections" : [ { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 53, 151, 229 ], + "duration" : 4.992, + "turn_weight" : 16.4, + "turn_duration" : 1.392, + "admin_index" : 0, + "out" : 0, + "weight" : 20.36, + "geometry_index" : 10, + "location" : [ 13.409504, 52.522309 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 50, 233 ], + "duration" : 2.077, + "admin_index" : 0, + "out" : 0, + "weight" : 2.285, + "geometry_index" : 11, + "location" : [ 13.409814, 52.522449 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 48, 146, 230, 327 ], + "duration" : 2.788, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 3.046, + "geometry_index" : 13, + "location" : [ 13.409981, 52.522533 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 38, 169, 228 ], + "duration" : 2.115, + "turn_duration" : 0.038, + "admin_index" : 0, + "out" : 0, + "weight" : 2.285, + "geometry_index" : 15, + "location" : [ 13.410198, 52.52265 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 44, 218 ], + "duration" : 8.723, + "admin_index" : 0, + "out" : 0, + "weight" : 9.595, + "geometry_index" : 17, + "location" : [ 13.410338, 52.522758 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 43, 224 ], + "duration" : 1.029, + "admin_index" : 0, + "out" : 0, + "weight" : 1.157, + "geometry_index" : 18, + "location" : [ 13.41098, 52.523164 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 48, 132, 223, 313 ], + "duration" : 4.982, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 5.593, + "geometry_index" : 19, + "location" : [ 13.411036, 52.523201 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 45, 230 ], + "duration" : 2.914, + "admin_index" : 0, + "out" : 0, + "weight" : 3.206, + "geometry_index" : 21, + "location" : [ 13.411357, 52.52337 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 44, 225 ], + "duration" : 5.677, + "admin_index" : 0, + "out" : 0, + "weight" : 6.245, + "geometry_index" : 22, + "location" : [ 13.411535, 52.52348 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 39, 99, 224, 282 ], + "duration" : 2.241, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 0, + "weight" : 2.437, + "geometry_index" : 24, + "location" : [ 13.411954, 52.523747 ] + }, { + "bearings" : [ 40, 219, 322 ], + "entry" : [ true, false, false ], + "in" : 1, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 25, + "location" : [ 13.412106, 52.52386 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Karl-Liebknecht-Straße/B 2/B 5.", + "type" : "end of road", + "bearing_after" : 53, + "bearing_before" : 331, + "location" : [ 13.409504, 52.522309 ] + }, + "name" : "Karl-Liebknecht-Straße", + "duration" : 38.251, + "distance" : 253.0, + "driving_side" : "right", + "weight" : 56.97, + "mode" : "driving", + "ref" : "B 2; B 5", + "geometry" : "isudcB_mmqXwGkRaC}Fe@oAiE{J_@u@Ym@}DiFkXcg@iAoBcD_HmDaJ{EcJsMyUaAkBaFoHaAyA" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Alexanderstraße", + "components" : [ { + "text" : "Alexanderstraße", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "B 1", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 351.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "In 300 meters, Turn right onto Alexanderstraße.", + "announcement" : "In 300 meters, Turn right onto Alexanderstraße.", + "distanceAlongGeometry" : 252.3 + }, { + "ssmlAnnouncement" : "Turn right onto Alexanderstraße, B 1.", + "announcement" : "Turn right onto Alexanderstraße, B 1.", + "distanceAlongGeometry" : 72.2 + } ], + "intersections" : [ { + "entry" : [ true, true, false, false, false ], + "in" : 2, + "bearings" : [ 37, 105, 220, 270, 311 ], + "duration" : 2.341, + "turn_weight" : 5.7, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.541, + "admin_index" : 0, + "out" : 1, + "weight" : 7.68, + "geometry_index" : 26, + "location" : [ 13.412151, 52.523893 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 37, 128, 217, 285 ], + "duration" : 4.188, + "turn_duration" : 0.035, + "admin_index" : 0, + "out" : 1, + "weight" : 4.569, + "geometry_index" : 27, + "location" : [ 13.412333, 52.523864 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 127, 215, 308 ], + "duration" : 5.004, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.483, + "geometry_index" : 29, + "location" : [ 13.412682, 52.5237 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 127, 218, 307 ], + "duration" : 4.992, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 5.483, + "geometry_index" : 30, + "location" : [ 13.413107, 52.523506 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 127, 307, 348 ], + "duration" : 1.807, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.98, + "geometry_index" : 31, + "location" : [ 13.413528, 52.52331 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 38, 128, 217, 307 ], + "duration" : 1.807, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.98, + "geometry_index" : 33, + "location" : [ 13.413678, 52.52324 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 90, 127, 308 ], + "duration" : 1.681, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 1.828, + "geometry_index" : 34, + "location" : [ 13.41383, 52.523169 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 128, 220, 307 ], + "duration" : 6.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 6.702, + "geometry_index" : 35, + "location" : [ 13.413966, 52.523106 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 127, 308 ], + "duration" : 3.738, + "admin_index" : 0, + "out" : 0, + "weight" : 4.112, + "geometry_index" : 36, + "location" : [ 13.414481, 52.522865 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 128, 307 ], + "duration" : 3.462, + "admin_index" : 0, + "out" : 0, + "weight" : 3.808, + "geometry_index" : 37, + "location" : [ 13.414797, 52.522721 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 129, 308 ], + "duration" : 1.662, + "admin_index" : 0, + "out" : 0, + "weight" : 1.828, + "geometry_index" : 40, + "location" : [ 13.415088, 52.522584 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 37, 129, 217, 309 ], + "duration" : 0.423, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 0.457, + "geometry_index" : 43, + "location" : [ 13.415226, 52.522516 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 127, 309 ], + "duration" : 0.138, + "admin_index" : 0, + "out" : 0, + "weight" : 0.152, + "geometry_index" : 44, + "location" : [ 13.415258, 52.5225 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 37, 127, 218, 307 ], + "duration" : 1.53, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.675, + "geometry_index" : 45, + "location" : [ 13.415271, 52.522494 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 127, 307 ], + "duration" : 4.846, + "admin_index" : 0, + "out" : 0, + "weight" : 5.331, + "geometry_index" : 46, + "location" : [ 13.415398, 52.522436 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 128, 307 ], + "duration" : 3.738, + "admin_index" : 0, + "out" : 0, + "weight" : 4.112, + "geometry_index" : 47, + "location" : [ 13.415814, 52.522245 ] + }, { + "bearings" : [ 34, 129, 214, 308 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 49, + "location" : [ 13.416124, 52.5221 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Alexanderstraße/B 2/B 5.", + "type" : "turn", + "bearing_after" : 105, + "bearing_before" : 40, + "location" : [ 13.412151, 52.523893 ] + }, + "name" : "Alexanderstraße", + "duration" : 49.266, + "distance" : 351.0, + "driving_side" : "right", + "weight" : 59.16, + "mode" : "driving", + "ref" : "B 2; B 5", + "geometry" : "ivxdcBmrrqXx@kJXw@lHaSbKqYfKiYxA_Ep@kBlCoH|BoG`Ne_@~GwRvCeIpAiDf@uAx@uBl@{A^aA^_AJYrB}F|J_YpFeOn@eBrA{Dz@gB" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "continue", + "modifier" : "left", + "text" : "Alexanderstraße", + "components" : [ { + "text" : "Alexanderstraße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 154.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left to stay on Alexanderstraße.", + "announcement" : "Turn left to stay on Alexanderstraße.", + "distanceAlongGeometry" : 57.6 + } ], + "intersections" : [ { + "entry" : [ false, true, true, false ], + "in" : 3, + "bearings" : [ 32, 130, 213, 309 ], + "duration" : 3.989, + "turn_weight" : 5.7, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 1.636, + "admin_index" : 0, + "out" : 2, + "weight" : 8.289, + "geometry_index" : 51, + "location" : [ 13.41627, 52.522028 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 33, 122, 214, 304 ], + "duration" : 0.285, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 0.305, + "geometry_index" : 52, + "location" : [ 13.416138, 52.521902 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 34, 214 ], + "duration" : 2.077, + "admin_index" : 0, + "out" : 1, + "weight" : 2.285, + "geometry_index" : 53, + "location" : [ 13.416118, 52.521884 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 34, 124, 214 ], + "duration" : 6.515, + "turn_weight" : 2.85, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 10.008, + "geometry_index" : 54, + "location" : [ 13.415996, 52.521772 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 33, 213 ], + "duration" : 5.538, + "admin_index" : 0, + "out" : 1, + "weight" : 6.092, + "geometry_index" : 56, + "location" : [ 13.415613, 52.521419 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 33, 213 ], + "duration" : 2.692, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 1, + "weight" : 0.762, + "geometry_index" : 57, + "location" : [ 13.415289, 52.52112 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 33, 145, 213, 325 ], + "duration" : 0.838, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 0.914, + "geometry_index" : 58, + "location" : [ 13.415249, 52.521083 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 33, 146, 213 ], + "duration" : 1.254, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.371, + "geometry_index" : 59, + "location" : [ 13.415203, 52.52104 ] + }, { + "bearings" : [ 33, 144, 213 ], + "entry" : [ false, false, true ], + "in" : 0, + "turn_weight" : 1.9, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 60, + "location" : [ 13.415133, 52.520975 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Alexanderstraße/B 1.", + "type" : "turn", + "bearing_after" : 213, + "bearing_before" : 129, + "location" : [ 13.41627, 52.522028 ] + }, + "name" : "Alexanderstraße", + "duration" : 24.996, + "distance" : 154.0, + "driving_side" : "right", + "weight" : 33.905, + "mode" : "driving", + "ref" : "B 1", + "geometry" : "waudcB{szqXzFfGb@f@~ErFvCfDhPtQtQfShAnAtAzA`CjC~DnE" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Annenstraße", + "components" : [ { + "text" : "Annenstraße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1539.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 1.5 kilometers.", + "announcement" : "Continue for 1.5 kilometers.", + "distanceAlongGeometry" : 1529.0 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn left onto Annenstraße.", + "announcement" : "In 200 meters, Turn left onto Annenstraße.", + "distanceAlongGeometry" : 233.2 + }, { + "ssmlAnnouncement" : "Turn left onto Annenstraße.", + "announcement" : "Turn left onto Annenstraße.", + "distanceAlongGeometry" : 70.3 + } ], + "intersections" : [ { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 33, 144, 214 ], + "duration" : 5.978, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.378, + "admin_index" : 0, + "out" : 1, + "weight" : 3.96, + "geometry_index" : 61, + "location" : [ 13.415029, 52.520879 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 31, 144, 211, 324 ], + "duration" : 1.668, + "turn_weight" : 15.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 17.028, + "geometry_index" : 62, + "location" : [ 13.415258, 52.520688 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 30, 144, 208, 324 ], + "duration" : 0.561, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.409, + "geometry_index" : 63, + "location" : [ 13.415361, 52.520601 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 144, 324 ], + "duration" : 9.138, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 11.002, + "geometry_index" : 64, + "location" : [ 13.415395, 52.520573 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 145, 319 ], + "duration" : 2.631, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 3.844, + "geometry_index" : 66, + "location" : [ 13.41598, 52.520104 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 145, 325 ], + "duration" : 4.846, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 6.281, + "geometry_index" : 67, + "location" : [ 13.416143, 52.519964 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 145, 325 ], + "duration" : 1.662, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 2.778, + "geometry_index" : 68, + "location" : [ 13.416443, 52.519706 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 52, 146, 325 ], + "duration" : 1.946, + "turn_weight" : 0.95, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 3.082, + "geometry_index" : 69, + "location" : [ 13.416546, 52.519617 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 56, 151, 326 ], + "duration" : 1.948, + "turn_weight" : 0.95, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 1, + "weight" : 3.082, + "geometry_index" : 71, + "location" : [ 13.416657, 52.519515 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 58, 151, 237, 331 ], + "duration" : 4.715, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 8.978, + "geometry_index" : 73, + "location" : [ 13.416757, 52.519405 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 56, 151, 331 ], + "duration" : 11.499, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 13.592, + "geometry_index" : 75, + "location" : [ 13.416998, 52.519139 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 69, 157, 258, 336 ], + "duration" : 1.116, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 5.018, + "geometry_index" : 79, + "location" : [ 13.417541, 52.518468 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 159, 244, 337 ], + "duration" : 4.578, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 5.976, + "geometry_index" : 81, + "location" : [ 13.417588, 52.518401 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 61, 163, 239, 340 ], + "duration" : 1.946, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 5.932, + "geometry_index" : 83, + "location" : [ 13.417755, 52.518124 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 58, 166, 239, 343 ], + "duration" : 1.669, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 5.628, + "geometry_index" : 84, + "location" : [ 13.417813, 52.518005 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 61, 167, 241, 346 ], + "duration" : 10.531, + "turn_weight" : 3.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 15.375, + "geometry_index" : 85, + "location" : [ 13.417854, 52.517902 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 171, 258, 349 ], + "duration" : 1.115, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.168, + "geometry_index" : 89, + "location" : [ 13.418084, 52.517238 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 176, 351 ], + "duration" : 8.446, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 0, + "weight" : 10.241, + "geometry_index" : 90, + "location" : [ 13.418103, 52.517165 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 1, 90, 181, 270 ], + "duration" : 1.807, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.78, + "geometry_index" : 95, + "location" : [ 13.418122, 52.516614 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 1, 92, 182, 266 ], + "duration" : 1.669, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.628, + "geometry_index" : 96, + "location" : [ 13.41812, 52.516497 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 2, 92, 182 ], + "duration" : 9.146, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 11.002, + "geometry_index" : 97, + "location" : [ 13.418113, 52.516391 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 2, 184 ], + "duration" : 2.554, + "turn_weight" : 0.95, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 1, + "weight" : 1.559, + "geometry_index" : 98, + "location" : [ 13.418075, 52.515799 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 110, 186, 291 ], + "duration" : 1.946, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 5.932, + "geometry_index" : 100, + "location" : [ 13.41807, 52.51576 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 6, 118, 191, 294 ], + "duration" : 2.64, + "turn_weight" : 11.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 2, + "weight" : 14.294, + "geometry_index" : 101, + "location" : [ 13.418048, 52.515634 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 11, 110, 190, 289 ], + "duration" : 1.681, + "turn_weight" : 11.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 13.228, + "geometry_index" : 102, + "location" : [ 13.417996, 52.515468 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 10, 106, 191, 284 ], + "duration" : 0.423, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.257, + "geometry_index" : 103, + "location" : [ 13.417966, 52.515359 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 11, 189 ], + "duration" : 9.692, + "turn_weight" : 0.95, + "admin_index" : 0, + "out" : 1, + "weight" : 11.612, + "geometry_index" : 104, + "location" : [ 13.417958, 52.515335 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 6, 186, 322 ], + "duration" : 0.476, + "turn_weight" : 1.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.628, + "geometry_index" : 107, + "location" : [ 13.417828, 52.514713 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 6, 96, 187 ], + "duration" : 1.573, + "turn_weight" : 1.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.861, + "geometry_index" : 108, + "location" : [ 13.417823, 52.514685 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 7, 188 ], + "duration" : 11.426, + "turn_weight" : 6.1, + "admin_index" : 0, + "out" : 1, + "weight" : 18.669, + "geometry_index" : 109, + "location" : [ 13.417805, 52.514598 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 7, 182 ], + "duration" : 1.8, + "turn_weight" : 5.95, + "admin_index" : 0, + "out" : 1, + "weight" : 7.93, + "geometry_index" : 112, + "location" : [ 13.41766, 52.513944 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 2, 99, 182, 280 ], + "duration" : 0.838, + "turn_weight" : 3.8, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.714, + "geometry_index" : 113, + "location" : [ 13.417652, 52.513823 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 2, 99, 175 ], + "duration" : 3.628, + "turn_weight" : 0.95, + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 2, + "weight" : 4.91, + "geometry_index" : 114, + "location" : [ 13.417649, 52.513767 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 13, 192, 355 ], + "duration" : 17.466, + "turn_weight" : 1.425, + "turn_duration" : 0.02, + "admin_index" : 0, + "out" : 1, + "weight" : 20.616, + "geometry_index" : 115, + "location" : [ 13.417684, 52.51353 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 17, 92, 195, 275 ], + "duration" : 1.404, + "turn_weight" : 3.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 5.323, + "geometry_index" : 121, + "location" : [ 13.417183, 52.512441 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 15, 94, 197 ], + "duration" : 8.177, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 9.936, + "geometry_index" : 122, + "location" : [ 13.417143, 52.512352 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 17, 197, 289 ], + "duration" : 9.284, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 11.155, + "geometry_index" : 123, + "location" : [ 13.416886, 52.511842 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 17, 108, 198, 289 ], + "duration" : 6.162, + "turn_weight" : 3.8, + "turn_duration" : 2.008, + "admin_index" : 0, + "out" : 2, + "weight" : 8.369, + "geometry_index" : 124, + "location" : [ 13.416593, 52.511266 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 18, 113, 203, 291 ], + "duration" : 2.087, + "turn_weight" : 16.4, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 2, + "weight" : 18.685, + "geometry_index" : 125, + "location" : [ 13.416455, 52.511006 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 23, 115, 204, 294 ], + "duration" : 7.269, + "turn_weight" : 3.8, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 9.588, + "geometry_index" : 127, + "location" : [ 13.416371, 52.510886 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 25, 205, 297 ], + "duration" : 3.746, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 5.062, + "geometry_index" : 130, + "location" : [ 13.416142, 52.510579 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 25, 114, 206 ], + "duration" : 12.192, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 14.353, + "geometry_index" : 131, + "location" : [ 13.415974, 52.510361 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 25, 114, 206 ], + "duration" : 1.416, + "turn_weight" : 1.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.685, + "geometry_index" : 133, + "location" : [ 13.415419, 52.509649 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 26, 120, 205 ], + "duration" : 5.016, + "turn_weight" : 1.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.735, + "geometry_index" : 134, + "location" : [ 13.415363, 52.509578 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 26, 115, 205 ], + "duration" : 16.755, + "turn_weight" : 1.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 19.523, + "geometry_index" : 137, + "location" : [ 13.415163, 52.509321 ] + }, { + "bearings" : [ 25, 113, 205 ], + "entry" : [ false, true, true ], + "in" : 0, + "turn_weight" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 138, + "location" : [ 13.414485, 52.508448 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left to stay on Alexanderstraße.", + "type" : "continue", + "bearing_after" : 144, + "bearing_before" : 213, + "location" : [ 13.415029, 52.520879 ] + }, + "name" : "Alexanderstraße", + "duration" : 226.028, + "distance" : 1539.0, + "driving_side" : "right", + "weight" : 383.887, + "mode" : "driving", + "geometry" : "}yrdcBifxqX|JiMlDmEv@cA`TyWfGwJvGeIbOwQpDmE~BiCjAsAr@y@fDmCbFkEnHuGjJmInHyFdKiHzGkEzBwAHEpNqHv@[lFsBlEqAvNeE~EeAbIkBrGsApCe@jHk@pHAlAAhC?vGHhFBrEL~c@jA\\Bn@DzFj@jIfBxEz@n@N`E~@bWnCtGr@v@HlDb@`d@jGlALj@FpFNnBDxMeAxEdAbHxBrPpF|TfJhFvBfDvApDnAz^`O~b@hQfOrGrC`BzAdAlDxBdDxBpGtErLnIjE`Dbe@r\\lCnBpClB`D~BlE`Dpu@ji@|QpMxA`AxEhD" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Leuschnerdamm", + "components" : [ { + "text" : "Leuschnerdamm", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 429.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 400 meters.", + "announcement" : "Continue for 400 meters.", + "distanceAlongGeometry" : 419.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn right onto Leuschnerdamm.", + "announcement" : "In 300 meters, Turn right onto Leuschnerdamm.", + "distanceAlongGeometry" : 252.0 + }, { + "ssmlAnnouncement" : "Turn right onto Leuschnerdamm. Then Turn left onto Bethaniendamm.", + "announcement" : "Turn right onto Leuschnerdamm. Then Turn left onto Bethaniendamm.", + "distanceAlongGeometry" : 72.1 + } ], + "intersections" : [ { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 25, 133, 206, 313 ], + "duration" : 5.125, + "turn_weight" : 19.25, + "turn_duration" : 3.048, + "admin_index" : 0, + "out" : 1, + "weight" : 21.535, + "geometry_index" : 141, + "location" : [ 13.414134, 52.507991 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 32, 130, 313 ], + "duration" : 6.668, + "turn_weight" : 1.9, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 1, + "weight" : 9.211, + "geometry_index" : 142, + "location" : [ 13.414293, 52.507902 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 131, 310 ], + "duration" : 7.615, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 0, + "weight" : 10.277, + "geometry_index" : 144, + "location" : [ 13.414832, 52.507626 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 120, 215, 303 ], + "duration" : 0.992, + "turn_weight" : 1.9, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 2.966, + "geometry_index" : 146, + "location" : [ 13.415477, 52.50733 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 27, 121, 300 ], + "duration" : 3.607, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 5.86, + "geometry_index" : 147, + "location" : [ 13.415572, 52.507296 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 27, 117, 301 ], + "duration" : 1.824, + "turn_weight" : 6.9, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 1, + "weight" : 8.88, + "geometry_index" : 148, + "location" : [ 13.415899, 52.507178 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 117, 207, 297 ], + "duration" : 1.668, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.728, + "geometry_index" : 149, + "location" : [ 13.41607, 52.507124 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 25, 117, 297 ], + "duration" : 2.222, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.337, + "geometry_index" : 150, + "location" : [ 13.416225, 52.507075 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 118, 208, 297 ], + "duration" : 0.284, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.205, + "geometry_index" : 151, + "location" : [ 13.416439, 52.507008 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 117, 298 ], + "duration" : 3.6, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 0, + "weight" : 5.86, + "geometry_index" : 152, + "location" : [ 13.416461, 52.507001 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 117, 213, 297 ], + "duration" : 4.438, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 6.774, + "geometry_index" : 153, + "location" : [ 13.416808, 52.506892 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 118, 297 ], + "duration" : 1.523, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 0, + "weight" : 3.575, + "geometry_index" : 154, + "location" : [ 13.417229, 52.50676 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 116, 207, 298 ], + "duration" : 3.345, + "turn_weight" : 1.9, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 5.555, + "geometry_index" : 155, + "location" : [ 13.41737, 52.506715 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 105, 201, 296 ], + "duration" : 1.285, + "turn_weight" : 1.9, + "turn_duration" : 0.038, + "admin_index" : 0, + "out" : 0, + "weight" : 3.271, + "geometry_index" : 158, + "location" : [ 13.417686, 52.50662 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 24, 105, 179, 285 ], + "duration" : 1.808, + "turn_weight" : 12.6, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 14.58, + "geometry_index" : 159, + "location" : [ 13.41781, 52.5066 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 23, 114, 203, 285 ], + "duration" : 14.829, + "turn_weight" : 7.6, + "turn_duration" : 0.014, + "admin_index" : 0, + "out" : 1, + "weight" : 23.897, + "geometry_index" : 160, + "location" : [ 13.41799, 52.506571 ] + }, { + "bearings" : [ 24, 120, 206, 294 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_weight" : 7.6, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 161, + "location" : [ 13.419427, 52.506174 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Annenstraße.", + "type" : "turn", + "bearing_after" : 133, + "bearing_before" : 205, + "location" : [ 13.414134, 52.507991 ] + }, + "name" : "Annenstraße", + "duration" : 62.645, + "distance" : 429.0, + "driving_side" : "right", + "weight" : 142.09, + "mode" : "driving", + "geometry" : "mtyccBknvqXpD}Hj@mAzNg^|H_RpGiTbA}DjFmSjBuI`BuHdCkLLk@xEuTfGiYxAyGz@gEtAwGj@wCf@wFx@gJxWyxAnBcI" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Bethaniendamm", + "components" : [ { + "text" : "Bethaniendamm", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 44.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto Bethaniendamm.", + "announcement" : "Turn left onto Bethaniendamm.", + "distanceAlongGeometry" : 44.0 + } ], + "intersections" : [ { + "entry" : [ true, false, true, false ], + "in" : 3, + "bearings" : [ 28, 113, 203, 300 ], + "duration" : 2.301, + "turn_weight" : 10.7, + "turn_duration" : 1.47, + "admin_index" : 0, + "out" : 2, + "weight" : 11.614, + "geometry_index" : 162, + "location" : [ 13.419589, 52.506118 ] + }, { + "bearings" : [ 23, 202, 296 ], + "entry" : [ false, true, false ], + "in" : 0, + "turn_weight" : 1.9, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 164, + "location" : [ 13.419552, 52.506066 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Leuschnerdamm.", + "type" : "turn", + "bearing_after" : 203, + "bearing_before" : 120, + "location" : [ 13.419589, 52.506118 ] + }, + "name" : "Leuschnerdamm", + "duration" : 7.583, + "distance" : 44.0, + "driving_side" : "right", + "weight" : 19.302, + "mode" : "driving", + "geometry" : "k_vccBicarX|@j@h@\\dPrJtA?" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Adalbertstraße", + "components" : [ { + "text" : "Adalbertstraße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 192.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn right onto Adalbertstraße.", + "announcement" : "Turn right onto Adalbertstraße.", + "distanceAlongGeometry" : 71.7 + } ], + "intersections" : [ { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 17, 114, 204 ], + "duration" : 5.455, + "turn_weight" : 14.5, + "turn_duration" : 4.486, + "admin_index" : 0, + "out" : 1, + "weight" : 15.566, + "geometry_index" : 166, + "location" : [ 13.419366, 52.505748 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 23, 113, 294 ], + "duration" : 3.342, + "turn_weight" : 1.9, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 5.555, + "geometry_index" : 167, + "location" : [ 13.419456, 52.505724 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 115, 204, 293 ], + "duration" : 1.531, + "turn_weight" : 1.9, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 3.575, + "geometry_index" : 168, + "location" : [ 13.419785, 52.505641 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 115, 204, 295 ], + "duration" : 4.865, + "turn_weight" : 1.9, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 7.231, + "geometry_index" : 169, + "location" : [ 13.419933, 52.505599 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 115, 204, 295 ], + "duration" : 2.235, + "turn_weight" : 1.9, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.337, + "geometry_index" : 170, + "location" : [ 13.420401, 52.505468 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 115, 206, 295 ], + "duration" : 6.25, + "turn_weight" : 1.9, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 8.754, + "geometry_index" : 171, + "location" : [ 13.420622, 52.505406 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 110, 295 ], + "duration" : 3.738, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 0, + "weight" : 6.012, + "geometry_index" : 172, + "location" : [ 13.421225, 52.505235 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 18, 101, 290 ], + "duration" : 2.805, + "turn_weight" : 1.9, + "turn_duration" : 0.036, + "admin_index" : 0, + "out" : 1, + "weight" : 4.946, + "geometry_index" : 174, + "location" : [ 13.421602, 52.50515 ] + }, { + "bearings" : [ 25, 97, 201, 281 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_weight" : 7.6, + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 175, + "location" : [ 13.421887, 52.505117 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Bethaniendamm.", + "type" : "turn", + "bearing_after" : 114, + "bearing_before" : 197, + "location" : [ 13.419366, 52.505748 ] + }, + "name" : "Bethaniendamm", + "duration" : 31.216, + "distance" : 192.0, + "driving_side" : "right", + "weight" : 64.643, + "mode" : "driving", + "geometry" : "ghuccBku`rXn@sDdDqSrAgHdGg\\zByLtIud@`@gCfCiR`AyPNgE" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Waldemarstraße", + "components" : [ { + "text" : "Waldemarstraße", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 227.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto Waldemarstraße.", + "announcement" : "Turn left onto Waldemarstraße.", + "distanceAlongGeometry" : 71.9 + } ], + "intersections" : [ { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 24, 99, 204, 277 ], + "duration" : 5.095, + "turn_weight" : 10.7, + "turn_duration" : 4.126, + "admin_index" : 0, + "out" : 2, + "weight" : 11.766, + "geometry_index" : 176, + "location" : [ 13.421987, 52.505109 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 24, 99, 203, 277 ], + "duration" : 3.481, + "turn_weight" : 7.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 11.408, + "geometry_index" : 178, + "location" : [ 13.421943, 52.505049 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 23, 113, 204 ], + "duration" : 4.438, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.774, + "geometry_index" : 179, + "location" : [ 13.421799, 52.504843 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 24, 114, 204, 294 ], + "duration" : 2.084, + "turn_weight" : 7.6, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 9.885, + "geometry_index" : 180, + "location" : [ 13.421605, 52.504577 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 203, 293 ], + "duration" : 4.173, + "turn_weight" : 1.9, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 6.469, + "geometry_index" : 181, + "location" : [ 13.421517, 52.504458 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 23, 203, 294 ], + "duration" : 1.115, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 3.118, + "geometry_index" : 182, + "location" : [ 13.421344, 52.504214 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 23, 203 ], + "duration" : 1.523, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 1, + "weight" : 3.575, + "geometry_index" : 183, + "location" : [ 13.421299, 52.50415 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 23, 113, 203 ], + "duration" : 1.253, + "turn_weight" : 1.9, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.271, + "geometry_index" : 184, + "location" : [ 13.421234, 52.504058 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 23, 203 ], + "duration" : 5.538, + "turn_weight" : 1.9, + "admin_index" : 0, + "out" : 1, + "weight" : 7.992, + "geometry_index" : 185, + "location" : [ 13.421184, 52.503988 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 23, 113, 200, 294 ], + "duration" : 5.976, + "turn_weight" : 7.6, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 2, + "weight" : 14.149, + "geometry_index" : 186, + "location" : [ 13.420948, 52.503655 ] + }, { + "bearings" : [ 24, 113, 203, 291 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_weight" : 7.6, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 189, + "location" : [ 13.420714, 52.503301 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Adalbertstraße.", + "type" : "turn", + "bearing_after" : 204, + "bearing_before" : 97, + "location" : [ 13.421987, 52.505109 ] + }, + "name" : "Adalbertstraße", + "duration" : 35.665, + "distance" : 227.0, + "driving_side" : "right", + "weight" : 87.074, + "mode" : "driving", + "geometry" : "i`tccBeyerXvA`A^TzK~GrObKlFnDfNxI~BxAvD`CjCbBxSvMnEfBjJjGfC~AxBrA" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "modifier" : "right", + "text" : "Your destination is on the right.", + "components" : [ { + "text" : "Your destination is on the right.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 198.614 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "In 200 meters, Your destination will be on the right.", + "announcement" : "In 200 meters, Your destination will be on the right.", + "distanceAlongGeometry" : 155.3 + }, { + "ssmlAnnouncement" : "Your destination is on the right.", + "announcement" : "Your destination is on the right.", + "distanceAlongGeometry" : 44.4 + } ], + "intersections" : [ { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 23, 114, 203, 294 ], + "duration" : 7.3, + "turn_weight" : 24.0, + "turn_duration" : 5.275, + "admin_index" : 0, + "out" : 1, + "weight" : 26.227, + "geometry_index" : 190, + "location" : [ 13.420672, 52.50324 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 24, 114, 201, 294 ], + "duration" : 6.082, + "turn_weight" : 11.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 18.083, + "geometry_index" : 191, + "location" : [ 13.420799, 52.503205 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 23, 115, 294 ], + "duration" : 1.132, + "turn_weight" : 2.85, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.088, + "geometry_index" : 195, + "location" : [ 13.421166, 52.503104 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 115, 295 ], + "duration" : 7.425, + "turn_weight" : 2.85, + "admin_index" : 0, + "out" : 0, + "weight" : 11.018, + "geometry_index" : 196, + "location" : [ 13.421226, 52.503087 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 24, 115, 204, 295 ], + "duration" : 9.919, + "turn_weight" : 11.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 22.29, + "geometry_index" : 197, + "location" : [ 13.421663, 52.502965 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 114, 206, 295 ], + "duration" : 0.921, + "turn_weight" : 2.85, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 3.84, + "geometry_index" : 198, + "location" : [ 13.422258, 52.502798 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 24, 114, 294 ], + "duration" : 12.157, + "turn_weight" : 2.85, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 16.215, + "geometry_index" : 199, + "location" : [ 13.422305, 52.502785 ] + }, { + "bearings" : [ 24, 115, 206, 294 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_weight" : 11.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 200, + "location" : [ 13.423039, 52.502587 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Waldemarstraße.", + "type" : "turn", + "bearing_after" : 114, + "bearing_before" : 203, + "location" : [ 13.420672, 52.50324 ] + }, + "name" : "Waldemarstraße", + "duration" : 50.032, + "distance" : 198.614, + "driving_side" : "right", + "weight" : 118.757, + "mode" : "driving", + "geometry" : "okpccB_gcrXdA}FTqAt@aE|AsI^uB`@wBrFiZlIed@X}AjK{l@jD}Q" + }, { + "intersections" : [ { + "bearings" : [ 295 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 0, + "geometry_index" : 201, + "location" : [ 13.423342, 52.502501 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Your destination is on the right.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 115, + "location" : [ 13.423342, 52.502501 ] + }, + "name" : "Waldemarstraße", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "i}nccB{mhrX??" + } ], + "distance" : 3507.272, + "summary" : "Alexanderstraße, Annenstraße" + } ], + "geometry" : "}_tdcBqinqX{IgMe@m@_@i@m@y@y@kA}Pj\\aA~AsF`JeAr@gDtCwGkRaC}Fe@oAiE{J_@u@Ym@}DiFkXcg@iAoBcD_HmDaJ{EcJsMyUaAkBaFoHaAyAx@kJXw@lHaSbKqYfKiYxA_Ep@kBlCoH|BoG`Ne_@~GwRvCeIpAiDf@uAx@uBl@{A^aA^_AJYrB}F|J_YpFeOn@eBrA{Dz@gBzFfGb@f@~ErFvCfDhPtQtQfShAnAtAzA`CjC~DnE|JiMlDmEv@cA`TyWfGwJvGeIbOwQpDmE~BiCjAsAr@y@fDmCbFkEnHuGjJmInHyFdKiHzGkEzBwAHEpNqHv@[lFsBlEqAvNeE~EeAbIkBrGsApCe@jHk@pHAlAAhC?vGHhFBrEL~c@jA\\Bn@DzFj@jIfBxEz@n@N`E~@bWnCtGr@v@HlDb@`d@jGlALj@FpFNnBDxMeAxEdAbHxBrPpF|TfJhFvBfDvApDnAz^`O~b@hQfOrGrC`BzAdAlDxBdDxBpGtErLnIjE`Dbe@r\\lCnBpClB`D~BlE`Dpu@ji@|QpMxA`AxEhDpD}Hj@mAzNg^|H_RpGiTbA}DjFmSjBuI`BuHdCkLLk@xEuTfGiYxAyGz@gEtAwGj@wCf@wFx@gJxWyxAnBcI|@j@h@\\dPrJtA?n@sDdDqSrAgHdGg\\zByLtIud@`@gCfCiR`AyPNgEvA`A^TzK~GrObKlFnDfNxI~BxAvD`CjCbBxSvMnEfBjJjGfC~AxBrAdA}FTqAt@aE|AsI^uB`@wBrFiZlIed@X}AjK{l@jD}Q" + } ], + "waypoints" : [ { + "distance" : 8.632, + "name" : "Panoramastraße", + "location" : [ 13.409961, 52.521487 ] + }, { + "distance" : 5.072, + "name" : "Waldemarstraße", + "location" : [ 13.423342, 52.502501 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_40743.json b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_40743.json new file mode 100644 index 000000000000..5e39c1ff2313 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_40743.json @@ -0,0 +1,5011 @@ +{ + "routes" : [ { + "voiceLocale" : "en", + "weight_name" : "auto", + "weight" : 3345.205, + "duration" : 2161.307, + "distance" : 40743.492, + "legs" : [ { + "via_waypoints" : [ ], + "admins" : [ { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + }, { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + }, { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + } ], + "weight" : 3345.205, + "duration" : 2161.307, + "steps" : [ { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Route 29", + "components" : [ { + "text" : "Route 29", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 29; VA 237", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 161.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Drive southwest on Hollywood Road. Then, in 200 meters, Turn right onto Route 29.", + "announcement" : "Drive southwest on Hollywood Road. Then, in 200 meters, Turn right onto Route 29.", + "distanceAlongGeometry" : 161.0 + }, { + "ssmlAnnouncement" : "Turn right onto Route 29, U.S. 29.", + "announcement" : "Turn right onto Route 29, U.S. 29.", + "distanceAlongGeometry" : 40.2 + } ], + "intersections" : [ { + "entry" : [ true ], + "bearings" : [ 206 ], + "duration" : 14.618, + "admin_index" : 0, + "out" : 0, + "weight" : 16.811, + "geometry_index" : 0, + "location" : [ -77.206788, 38.876664 ] + }, { + "bearings" : [ 22, 195, 296 ], + "entry" : [ false, true, true ], + "in" : 0, + "turn_weight" : 2.5, + "turn_duration" : 0.03, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 3, + "location" : [ -77.207428, 38.875566 ] + } ], + "maneuver" : { + "instruction" : "Drive southwest on Hollywood Road.", + "type" : "depart", + "bearing_after" : 206, + "bearing_before" : 0, + "location" : [ -77.206788, 38.876664 ] + }, + "name" : "Hollywood Road", + "duration" : 17.594, + "distance" : 161.0, + "driving_side" : "right", + "weight" : 22.698, + "mode" : "driving", + "geometry" : "o~yciAfoigrCvWfNn\\dPjMpFvDrAfEn@lAE" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Fairview Park Drive", + "components" : [ { + "text" : "Fairview Park Drive", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "SR 6928", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 660.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Fairview Park Drive", + "components" : [ { + "text" : "Fairview Park Drive", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "SR 6928", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 700 meters.", + "announcement" : "Continue for 700 meters.", + "distanceAlongGeometry" : 650.0 + }, { + "ssmlAnnouncement" : "In 400 meters, Turn left onto Fairview Park Drive.", + "announcement" : "In 400 meters, Turn left onto Fairview Park Drive.", + "distanceAlongGeometry" : 378.7 + }, { + "ssmlAnnouncement" : "Turn left onto Fairview Park Drive, State Route 69 28.", + "announcement" : "Turn left onto Fairview Park Drive, State Route 69 28.", + "distanceAlongGeometry" : 108.2 + } ], + "intersections" : [ { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 10, 84, 177, 265 ], + "duration" : 6.351, + "turn_weight" : 17.5, + "turn_duration" : 2.935, + "admin_index" : 0, + "out" : 3, + "weight" : 21.428, + "geometry_index" : 6, + "location" : [ -77.207491, 38.875335 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 85, 265, 353 ], + "duration" : 6.746, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 7.749, + "geometry_index" : 7, + "location" : [ -77.207915, 38.875305 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 23, 85, 203, 265 ], + "duration" : 4.254, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 4.883, + "geometry_index" : 9, + "location" : [ -77.208749, 38.875247 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 85, 265, 355 ], + "duration" : 2.777, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 3.185, + "geometry_index" : 11, + "location" : [ -77.209275, 38.875209 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 85, 265, 358 ], + "duration" : 1.577, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.805, + "geometry_index" : 12, + "location" : [ -77.209618, 38.875185 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 85, 173, 265, 358 ], + "duration" : 7.484, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.598, + "geometry_index" : 13, + "location" : [ -77.209814, 38.875171 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 6, 85, 175, 266 ], + "duration" : 5.362, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "weight" : 6.157, + "geometry_index" : 15, + "location" : [ -77.210749, 38.875105 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 1, 86, 270 ], + "duration" : 3.517, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 2, + "weight" : 4.034, + "geometry_index" : 17, + "location" : [ -77.211412, 38.875068 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 8, 92, 276 ], + "duration" : 4.163, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 2, + "weight" : 4.777, + "geometry_index" : 20, + "location" : [ -77.211847, 38.875074 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 13, 99, 193, 280 ], + "duration" : 13.3, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 15.286, + "geometry_index" : 22, + "location" : [ -77.212358, 38.875126 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 100, 281 ], + "duration" : 3.415, + "admin_index" : 0, + "out" : 1, + "weight" : 3.928, + "geometry_index" : 24, + "location" : [ -77.213994, 38.875356 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 100, 279 ], + "duration" : 4.154, + "admin_index" : 0, + "out" : 1, + "weight" : 4.777, + "geometry_index" : 26, + "location" : [ -77.21441, 38.875415 ] + }, { + "bearings" : [ 8, 100, 191, 280 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 28, + "location" : [ -77.21492, 38.875481 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Route 29/US 29/VA 237.", + "type" : "turn", + "bearing_after" : 265, + "bearing_before" : 190, + "location" : [ -77.207491, 38.875335 ] + }, + "name" : "Route 29", + "duration" : 63.936, + "distance" : 660.0, + "driving_side" : "right", + "weight" : 87.562, + "mode" : "driving", + "ref" : "US 29; VA 237", + "geometry" : "mkwciAd{jgrCz@nY~@t[r@lVHhC`Ap[n@lTZfKzAfg@f@dQr@p[TzKFvCI|PInCc@lMcAnPeK`vAeAdNaBdTSxCcBjW_@nF[rE" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "on ramp", + "modifier" : "slight right", + "text" : "I 495 North, US 50 West, I 495 South", + "components" : [ { + "text" : "I 495 North, US 50 West, I 495 South", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1094.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 1 kilometer.", + "announcement" : "Continue for 1 kilometer.", + "distanceAlongGeometry" : 1084.0 + }, { + "ssmlAnnouncement" : "In 400 meters, Take the Interstate 4 95 North ramp.", + "announcement" : "In 400 meters, Take the Interstate 4 95 North ramp.", + "distanceAlongGeometry" : 356.8 + }, { + "ssmlAnnouncement" : "Take the Interstate 4 95 North ramp. Then Keep right to take Interstate 4 95 North.", + "announcement" : "Take the Interstate 4 95 North ramp. Then Keep right to take Interstate 4 95 North.", + "distanceAlongGeometry" : 90.0 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true, true ], + "in" : 1, + "bearings" : [ 8, 100, 169, 212, 280 ], + "duration" : 5.454, + "turn_weight" : 25.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 4.254, + "admin_index" : 0, + "out" : 3, + "weight" : 26.38, + "geometry_index" : 29, + "location" : [ -77.215026, 38.875495 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 32, 100, 191, 277 ], + "duration" : 2.643, + "turn_weight" : 20.0, + "turn_duration" : 2.09, + "admin_index" : 0, + "out" : 2, + "weight" : 20.637, + "geometry_index" : 30, + "location" : [ -77.215105, 38.875398 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 11, 103, 192, 269 ], + "duration" : 5.268, + "turn_weight" : 5.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 11.051, + "geometry_index" : 31, + "location" : [ -77.215117, 38.87535 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 6, 12, 191 ], + "duration" : 8.605, + "turn_weight" : 3.75, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 13.622, + "geometry_index" : 32, + "location" : [ -77.215248, 38.87485 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 14, 108, 200, 289 ], + "duration" : 10.995, + "turn_weight" : 5.0, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 2, + "weight" : 17.632, + "geometry_index" : 35, + "location" : [ -77.215468, 38.874034 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 45, 139, 226, 321 ], + "duration" : 7.669, + "turn_weight" : 5.0, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 13.811, + "geometry_index" : 42, + "location" : [ -77.216188, 38.873144 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 45, 223 ], + "duration" : 5.077, + "turn_weight" : 1.25, + "admin_index" : 0, + "out" : 1, + "weight" : 7.088, + "geometry_index" : 46, + "location" : [ -77.216869, 38.872626 ] + }, { + "entry" : [ false, true, true, true, false ], + "in" : 0, + "bearings" : [ 38, 115, 210, 286, 341 ], + "duration" : 11.848, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.033, + "admin_index" : 0, + "out" : 2, + "weight" : 18.588, + "geometry_index" : 50, + "location" : [ -77.217285, 38.872249 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 0, 181 ], + "duration" : 4.985, + "turn_weight" : 1.25, + "admin_index" : 0, + "out" : 1, + "weight" : 6.982, + "geometry_index" : 57, + "location" : [ -77.217643, 38.871151 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 1, 89, 180, 267 ], + "duration" : 11.558, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 18.269, + "geometry_index" : 58, + "location" : [ -77.21765, 38.870662 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 154, 341 ], + "duration" : 4.246, + "turn_weight" : 1.4, + "admin_index" : 0, + "out" : 0, + "weight" : 6.283, + "geometry_index" : 65, + "location" : [ -77.217483, 38.869555 ] + }, { + "entry" : [ false, true, true, true, false ], + "in" : 4, + "bearings" : [ 39, 68, 141, 229, 327 ], + "duration" : 9.074, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 2, + "weight" : 15.403, + "geometry_index" : 69, + "location" : [ -77.217225, 38.869198 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 113, 200, 298 ], + "duration" : 4.088, + "turn_weight" : 1.25, + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 0, + "weight" : 5.921, + "geometry_index" : 75, + "location" : [ -77.216357, 38.868649 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 113, 293 ], + "duration" : 5.446, + "turn_weight" : 1.25, + "admin_index" : 0, + "out" : 0, + "weight" : 7.513, + "geometry_index" : 76, + "location" : [ -77.215888, 38.868492 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 17, 113, 197, 293 ], + "duration" : 0.653, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 5.743, + "geometry_index" : 77, + "location" : [ -77.215263, 38.868282 ] + }, { + "bearings" : [ 25, 114, 208, 293 ], + "entry" : [ true, true, true, false ], + "in" : 3, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 78, + "location" : [ -77.215188, 38.868257 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Fairview Park Drive/SR 6928.", + "type" : "turn", + "bearing_after" : 191, + "bearing_before" : 280, + "location" : [ -77.215026, 38.875495 ] + }, + "name" : "Fairview Park Drive", + "duration" : 109.495, + "distance" : 1094.0, + "driving_side" : "right", + "weight" : 211.282, + "mode" : "driving", + "ref" : "SR 6928", + "geometry" : "muwciAbrygrC`E|C~AVf^dG`PlChRnCrMxCtFhBlGrC`GfDhFrDdFpEhHnHrFbIvLpQfH|JlG|I\\b@xD`FfCdDhDpDdGdGfExC~G`ErFtBlJzBbJrArId@pKBp]LpVCfJI~F[zEq@lE{@jF{AtDyAp@YlE}BrFqDtEyDpFsF`FiGjDqFjDaIlCwHnC}IxHi\\bLaf@p@uCnBqIjBqGpCmGxDsG|F}GzDcEjF{D" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Keep right to take Interstate 4 95 North toward Interstate 66.", + "announcement" : "Keep right to take Interstate 4 95 North toward Interstate 66.", + "distanceAlongGeometry" : 84.0 + } ], + "intersections" : [ { + "bearings" : [ 146, 165, 326 ], + "entry" : [ true, true, false ], + "in" : 2, + "turn_weight" : 5.625, + "turn_duration" : 0.023, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 85, + "location" : [ -77.214274, 38.867642 ] + } ], + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + }, + "secondary" : { + "text" : "I 495 North, I 66", + "components" : [ { + "text" : "I 495 North, I 66", + "type" : "text" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "Capital Beltway", + "components" : [ { + "text" : "Capital Beltway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 495", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 84.0 + } ], + "destinations" : "I 495 North, US 50 West, I 495 South", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take the I 495 North ramp.", + "type" : "on ramp", + "bearing_after" : 165, + "bearing_before" : 146, + "location" : [ -77.214274, 38.867642 ] + }, + "name" : "", + "duration" : 8.196, + "distance" : 84.0, + "driving_side" : "right", + "weight" : 14.82, + "mode" : "driving", + "geometry" : "sjhciAbcxgrCbP{DjIiBtC]zGWbDA" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 18 kilometers.", + "announcement" : "Continue for 18 kilometers.", + "distanceAlongGeometry" : 18472.0 + }, { + "ssmlAnnouncement" : "In 900 meters, Keep right to stay on Interstate 4 95.", + "announcement" : "In 900 meters, Keep right to stay on Interstate 4 95.", + "distanceAlongGeometry" : 933.2 + }, { + "ssmlAnnouncement" : "Keep right to stay on Interstate 4 95, Capital Beltway toward Bethesda, Baltimore.", + "announcement" : "Keep right to stay on Interstate 4 95, Capital Beltway toward Bethesda, Baltimore.", + "distanceAlongGeometry" : 266.7 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 182, 202, 358 ], + "duration" : 12.876, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.032, + "admin_index" : 0, + "out" : 1, + "weight" : 14.449, + "geometry_index" : 90, + "location" : [ -77.214099, 38.866903 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 105, 111, 289 ], + "duration" : 7.987, + "turn_weight" : 1.1, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 10.076, + "geometry_index" : 102, + "location" : [ -77.215356, 38.866568 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 108, 288 ], + "duration" : 21.812, + "admin_index" : 0, + "out" : 1, + "weight" : 24.538, + "geometry_index" : 104, + "location" : [ -77.216248, 38.866799 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 108, 115, 295 ], + "duration" : 17.777, + "turn_weight" : 2.5, + "turn_duration" : 0.012, + "admin_index" : 0, + "out" : 2, + "weight" : 22.93, + "geometry_index" : 107, + "location" : [ -77.218512, 38.867369 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 180, 359 ], + "duration" : 45.318, + "admin_index" : 0, + "out" : 1, + "weight" : 52.115, + "geometry_index" : 118, + "location" : [ -77.219565, 38.869007 ] + }, { + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 167, 173, 350 ], + "duration" : 21.957, + "turn_weight" : 30.0, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 55.241, + "geometry_index" : 126, + "location" : [ -77.21997, 38.874758 ] + }, { + "entry" : [ false, true, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 170, 350, 358 ], + "duration" : 13.324, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 15.314, + "geometry_index" : 131, + "location" : [ -77.22112, 38.87977 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 7, 186 ], + "duration" : 0.735, + "admin_index" : 0, + "out" : 0, + "weight" : 0.846, + "geometry_index" : 141, + "location" : [ -77.221278, 38.882848 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 9, 25, 187 ], + "duration" : 4.227, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.747, + "geometry_index" : 142, + "location" : [ -77.22125, 38.883017 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 15, 194 ], + "duration" : 21.639, + "admin_index" : 0, + "out" : 0, + "weight" : 24.344, + "geometry_index" : 145, + "location" : [ -77.221022, 38.883976 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 25, 193, 205 ], + "duration" : 3.542, + "turn_weight" : 3.3, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 7.263, + "geometry_index" : 156, + "location" : [ -77.218526, 38.888596 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 25, 205 ], + "duration" : 63.91, + "admin_index" : 0, + "out" : 0, + "weight" : 71.898, + "geometry_index" : 157, + "location" : [ -77.218081, 38.889341 ] + }, { + "entry" : [ false, true, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 166, 345, 349 ], + "duration" : 55.684, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 64.014, + "geometry_index" : 193, + "location" : [ -77.21597, 38.903541 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 9, 184, 188 ], + "duration" : 11.903, + "turn_weight" : 2.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 16.764, + "geometry_index" : 213, + "location" : [ -77.217206, 38.91633 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 10, 18, 189 ], + "duration" : 10.846, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 12.735, + "geometry_index" : 215, + "location" : [ -77.216673, 38.919061 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 16, 195 ], + "duration" : 0.194, + "admin_index" : 0, + "out" : 0, + "weight" : 0.227, + "geometry_index" : 220, + "location" : [ -77.215968, 38.92151 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 17, 169, 196 ], + "duration" : 2.756, + "turn_weight" : 1.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.629, + "geometry_index" : 221, + "location" : [ -77.215952, 38.921554 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 18, 197 ], + "duration" : 3.406, + "admin_index" : 0, + "out" : 0, + "weight" : 4.003, + "geometry_index" : 223, + "location" : [ -77.215708, 38.922165 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 21, 31, 199 ], + "duration" : 9.027, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 10.598, + "geometry_index" : 225, + "location" : [ -77.215383, 38.922917 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 24, 183, 206 ], + "duration" : 0.176, + "turn_weight" : 1.4, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 1.582, + "geometry_index" : 230, + "location" : [ -77.214328, 38.924843 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 23, 26, 204 ], + "duration" : 12.82, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 14.735, + "geometry_index" : 231, + "location" : [ -77.214307, 38.924879 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 28, 207 ], + "duration" : 5.226, + "admin_index" : 0, + "out" : 0, + "weight" : 6.01, + "geometry_index" : 238, + "location" : [ -77.212662, 38.927565 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 32, 211 ], + "duration" : 3.368, + "admin_index" : 0, + "out" : 0, + "weight" : 3.873, + "geometry_index" : 240, + "location" : [ -77.2119, 38.928618 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 25, 208 ], + "duration" : 2.245, + "admin_index" : 0, + "out" : 0, + "weight" : 2.582, + "geometry_index" : 244, + "location" : [ -77.211405, 38.929298 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 25, 207 ], + "duration" : 5.303, + "admin_index" : 0, + "out" : 0, + "weight" : 5.966, + "geometry_index" : 246, + "location" : [ -77.211109, 38.929768 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 20, 199 ], + "duration" : 3.523, + "admin_index" : 0, + "out" : 0, + "weight" : 3.963, + "geometry_index" : 252, + "location" : [ -77.21055, 38.930915 ] + }, { + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 20, 200 ], + "duration" : 0.813, + "admin_index" : 0, + "out" : 0, + "weight" : 0.914, + "geometry_index" : 253, + "location" : [ -77.210187, 38.931678 ] + }, { + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 29, 200 ], + "duration" : 3.6, + "admin_index" : 0, + "out" : 0, + "weight" : 4.05, + "geometry_index" : 254, + "location" : [ -77.210103, 38.931853 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 22, 184, 208 ], + "duration" : 0.336, + "turn_weight" : 3.3, + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 0, + "weight" : 3.648, + "geometry_index" : 257, + "location" : [ -77.209596, 38.932592 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 25, 202 ], + "duration" : 1.742, + "admin_index" : 0, + "out" : 0, + "weight" : 1.96, + "geometry_index" : 258, + "location" : [ -77.209561, 38.93266 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 22, 205 ], + "duration" : 19.781, + "admin_index" : 0, + "out" : 0, + "weight" : 21.759, + "geometry_index" : 259, + "location" : [ -77.209343, 38.933029 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 23, 201, 203 ], + "duration" : 20.782, + "turn_weight" : 2.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 24.214, + "geometry_index" : 265, + "location" : [ -77.207058, 38.937264 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 24, 203, 206 ], + "duration" : 16.132, + "turn_weight" : 2.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 19.031, + "geometry_index" : 268, + "location" : [ -77.204613, 38.941864 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 24, 204 ], + "duration" : 3.938, + "admin_index" : 0, + "out" : 0, + "weight" : 4.036, + "geometry_index" : 272, + "location" : [ -77.202595, 38.945396 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 28, 207 ], + "duration" : 1.95, + "admin_index" : 0, + "out" : 0, + "weight" : 1.999, + "geometry_index" : 276, + "location" : [ -77.202095, 38.946253 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 31, 209 ], + "duration" : 18.45, + "admin_index" : 0, + "out" : 0, + "weight" : 18.45, + "geometry_index" : 279, + "location" : [ -77.201811, 38.946659 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 47, 224 ], + "duration" : 1.725, + "admin_index" : 0, + "out" : 0, + "weight" : 1.725, + "geometry_index" : 294, + "location" : [ -77.198224, 38.950066 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 44, 227 ], + "duration" : 4.912, + "admin_index" : 0, + "out" : 0, + "weight" : 4.912, + "geometry_index" : 295, + "location" : [ -77.197832, 38.950346 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 42, 56, 224 ], + "duration" : 31.483, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 30.676, + "geometry_index" : 298, + "location" : [ -77.196782, 38.951189 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 20, 186, 200 ], + "duration" : 19.413, + "turn_weight" : 0.55, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 19.471, + "geometry_index" : 317, + "location" : [ -77.192191, 38.957701 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 60, 241 ], + "duration" : 6.926, + "admin_index" : 0, + "out" : 0, + "weight" : 6.753, + "geometry_index" : 338, + "location" : [ -77.187977, 38.961375 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 55, 63, 242 ], + "duration" : 4.145, + "turn_duration" : 0.03, + "admin_index" : 0, + "out" : 0, + "weight" : 4.011, + "geometry_index" : 340, + "location" : [ -77.185936, 38.962262 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 61, 235 ], + "duration" : 11.246, + "admin_index" : 0, + "out" : 0, + "weight" : 10.965, + "geometry_index" : 341, + "location" : [ -77.184797, 38.962883 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 43, 139, 226 ], + "duration" : 7.119, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 6.92, + "geometry_index" : 348, + "location" : [ -77.18162, 38.96447 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 24, 206, 208 ], + "duration" : 5.201, + "turn_weight" : 1.65, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 6.698, + "geometry_index" : 354, + "location" : [ -77.180257, 38.965993 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 9, 192 ], + "duration" : 15.106, + "admin_index" : 0, + "out" : 0, + "weight" : 14.728, + "geometry_index" : 359, + "location" : [ -77.17973, 38.967285 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 7, 13, 188 ], + "duration" : 3.585, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 0, + "weight" : 3.476, + "geometry_index" : 362, + "location" : [ -77.179059, 38.971093 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 8, 187 ], + "duration" : 3.918, + "admin_index" : 1, + "out" : 0, + "weight" : 3.82, + "geometry_index" : 363, + "location" : [ -77.178917, 38.971994 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 8, 188 ], + "duration" : 5.329, + "admin_index" : 1, + "out" : 0, + "weight" : 5.196, + "geometry_index" : 364, + "location" : [ -77.178742, 38.972978 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 8, 188 ], + "duration" : 4.518, + "admin_index" : 1, + "out" : 0, + "weight" : 4.405, + "geometry_index" : 365, + "location" : [ -77.17851, 38.974325 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 8, 184, 188 ], + "duration" : 1.854, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 0, + "weight" : 1.789, + "geometry_index" : 366, + "location" : [ -77.178302, 38.975467 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 12, 188 ], + "duration" : 54.812, + "admin_index" : 1, + "out" : 0, + "weight" : 54.812, + "geometry_index" : 367, + "location" : [ -77.178218, 38.975933 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 83, 264, 353 ], + "duration" : 11.908, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 0, + "weight" : 12.185, + "geometry_index" : 397, + "location" : [ -77.164298, 38.983062 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 64, 248 ], + "duration" : 1.612, + "admin_index" : 1, + "out" : 0, + "weight" : 1.653, + "geometry_index" : 403, + "location" : [ -77.160735, 38.983642 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 59, 243 ], + "duration" : 1.35, + "admin_index" : 1, + "out" : 0, + "weight" : 1.384, + "geometry_index" : 405, + "location" : [ -77.160295, 38.983812 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 56, 239 ], + "duration" : 2.963, + "admin_index" : 1, + "out" : 0, + "weight" : 3.037, + "geometry_index" : 406, + "location" : [ -77.159941, 38.983977 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 47, 55, 233 ], + "duration" : 4.045, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.033, + "admin_index" : 1, + "out" : 0, + "weight" : 4.113, + "geometry_index" : 409, + "location" : [ -77.159197, 38.984387 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 37, 222 ], + "duration" : 17.625, + "admin_index" : 1, + "out" : 0, + "weight" : 18.066, + "geometry_index" : 412, + "location" : [ -77.158329, 38.985066 ] + }, { + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 162, 177, 352 ], + "duration" : 25.639, + "turn_weight" : 1.95, + "turn_duration" : 0.026, + "admin_index" : 1, + "out" : 2, + "weight" : 28.203, + "geometry_index" : 424, + "location" : [ -77.156749, 38.988994 ] + }, { + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 166, 172, 354 ], + "duration" : 38.145, + "turn_weight" : 0.65, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 38.787, + "geometry_index" : 427, + "location" : [ -77.1579, 38.995065 ] + }, { + "bearings" : [ 28, 209 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 1, + "out" : 0, + "geometry_index" : 444, + "location" : [ -77.15481, 39.003651 ] + } ], + "bannerInstructions" : [ { + "secondary" : { + "text" : "I 495: Bethesda, Baltimore", + "components" : [ { + "text" : "I 495: Bethesda, Baltimore", + "type" : "text" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "Capital Beltway", + "components" : [ { + "text" : "Capital Beltway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 495", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 18481.996 + } ], + "destinations" : "I 495 North, I 66", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right to take I 495 North toward I 66.", + "type" : "fork", + "bearing_after" : 202, + "bearing_before" : 178, + "location" : [ -77.214099, 38.866903 ] + }, + "name" : "Capital Beltway", + "duration" : 749.093, + "distance" : 18481.996, + "driving_side" : "right", + "weight" : 858.696, + "mode" : "driving", + "ref" : "I 495", + "geometry" : "m|fciAdxwgrCzD|@tDhC|C`DbBfCt@nB~@vDf@nEVrGCvI[zIm@nG}@nGiHtb@cD`SkFx[uK|s@qNvz@iEtPaGfRcEpIgF|EiFbC{FvAgIhAgJf@gKVqQBcF@}~@^{gAnCm\\tBsp@v@g}@Ki]vAiYzCuWbFe`BtTqe@tGct@~JinAdRal@hIaWfD_Y`CqMf@}Ll@yK\\sONsP@c`@BcXmAoGi@qIw@{[qDcQuC}K_CgQiEuXwI{OaGqP{HeYyMaPkHqR_JmT{JqUkKkI}De|Asv@qm@yZ{mAom@udAoh@ci@wWmf@aUmZsLe^mMk^oK{\\qIcYeGyRqDmN_CyLaBcLoAwJw@_Jo@iOy@mMg@iUo@oMQmKG{SIoKXoIXmPt@iO`AeJp@kP`BmJlAcKvAgY~EiVbFqRlEmf@rLebAjVyZfHcLfCed@zKqm@jNge@jK{r@hLmh@rH{r@|Hm]jDcd@jD}b@rCu^~AocAjDma@`@qWFy[Nca@i@uk@iAm{@uBw`@qBmc@gDe^uDgsAsOmuAuOgp@uJaXuEkV_Fq_@uIyU_GwA_@aQcFcScGwGmBge@{OaXcKiWoKg]iOeTwKqRgKgAi@mRgKwWwM{TgLsNeHw`@aSyX}NsYkPqe@gYgZkTaIgGgGeEkJwFyKwGiLaGaOmIkJwE_IkD_T{HyOkF}EeBqDkAun@uU}IgDwQeLiKkGcNcIgCeAaVsLmPcHw[eMc^_OekAyh@yNwGk~A}s@gu@e\\y_CcbAmgBow@i{@w`@sQkIweAeh@afAyg@gJoEkZyMiFwCsFeDeIaFmFeDwFoDaHwE}FuE_M_JwOiMqGgFwMsLeTeSyIaJwIcJwI_KuOcRaKaNg_@wg@kIiM_P}SoPoWyVo\\eTsYuFoHeb@ug@iP_T_PkToGoHuJcK_HqHqOkNyQ_NuPyMmKwGcP}Io]wSoWsL{UeJ_VgJuU_Is^}IwUaGwn@_UqK_EeNkF}OeGcKaFoJeF{NcKgJkHwIeHgIkHiFwEoIyIyMsR}HeLkIuMuG}KmFgMaIcS{FuPmGiQ{GsQ{GoSeWet@g^kiAye@efAia@yoAoKoZqImUsNw\\gLuSyIwMcAsAiL_OmKaLmLoLiN{KeMqJoYeQwPcIoMwEmLeDoNkDqRoDqPwByv@uHscDo[iw@{Go|@}IesAoMkfA_Lc\\gD}RiDoRsEa[wJsXcLeWmMqXuPuZmUoUyTkTmVmRaW_R}YiQ_\\cOg[eO}]iMo\\iM}]cLc^aLs`@gJu^kJea@yHga@uGi_@_G{`@kFyb@{CyYeDy^yCob@oBu_@eB}a@eHchB}EgkA}Ac\\qBuYuDg\\aFm\\aI}^kDiMgDeLiIcUm@eB{K_WiJiR{NyTyJqNwM{O}VcVkQ_NeQ_LeRaKiR{HgQeGySgFsSsDoRoBuSaAaYIqSf@srAjMq{AvQgjExe@yb@vCw[xAc\\JuYSqb@kBqY{Ba[cEyZ_Fab@yJqZeJaXsJoRqIwR_Js\\uQuXkQezAkdAyWmPig@mZqb@aU}m@qXwwAwi@" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 13 kilometers.", + "announcement" : "Continue for 13 kilometers.", + "distanceAlongGeometry" : 13103.0 + }, { + "ssmlAnnouncement" : "In 900 meters, Take exit 30B.", + "announcement" : "In 900 meters, Take exit 30B.", + "distanceAlongGeometry" : 894.4 + }, { + "ssmlAnnouncement" : "Take exit 30B onto U.S. 29 South toward Colesville Road, Silver Spring.", + "announcement" : "Take exit 30B onto U.S. 29 South toward Colesville Road, Silver Spring.", + "distanceAlongGeometry" : 255.6 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 20, 24, 201 ], + "duration" : 2.633, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 1, + "weight" : 2.691, + "geometry_index" : 448, + "location" : [ -77.152925, 39.007036 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 26, 204 ], + "duration" : 93.487, + "admin_index" : 1, + "out" : 0, + "weight" : 100.499, + "geometry_index" : 449, + "location" : [ -77.152589, 39.007612 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 71, 253, 342 ], + "duration" : 15.322, + "turn_duration" : 0.022, + "admin_index" : 1, + "out" : 0, + "weight" : 17.213, + "geometry_index" : 483, + "location" : [ -77.127726, 39.013941 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 73, 252 ], + "duration" : 1.878, + "admin_index" : 1, + "out" : 0, + "weight" : 2.16, + "geometry_index" : 486, + "location" : [ -77.123455, 39.015093 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 76, 82, 255 ], + "duration" : 12.333, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 14.175, + "geometry_index" : 488, + "location" : [ -77.122923, 39.015213 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 86, 266 ], + "duration" : 1.565, + "admin_index" : 1, + "out" : 0, + "weight" : 1.8, + "geometry_index" : 494, + "location" : [ -77.119326, 39.015608 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 86, 266 ], + "duration" : 12.248, + "admin_index" : 1, + "out" : 0, + "weight" : 14.085, + "geometry_index" : 495, + "location" : [ -77.11886, 39.015635 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 85, 260, 266 ], + "duration" : 3.816, + "turn_weight" : 1.25, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 0, + "weight" : 5.615, + "geometry_index" : 496, + "location" : [ -77.115252, 39.015827 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 86, 265, 356 ], + "duration" : 5.525, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 6.345, + "geometry_index" : 497, + "location" : [ -77.11414, 39.0159 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 75, 259 ], + "duration" : 11.074, + "admin_index" : 1, + "out" : 0, + "weight" : 12.735, + "geometry_index" : 501, + "location" : [ -77.112524, 39.016057 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 41, 44, 226 ], + "duration" : 25.424, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.028, + "admin_index" : 1, + "out" : 0, + "weight" : 28.57, + "geometry_index" : 511, + "location" : [ -77.109706, 39.017281 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 126, 303, 308 ], + "duration" : 14.017, + "turn_weight" : 3.3, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 0, + "weight" : 19.06, + "geometry_index" : 531, + "location" : [ -77.103197, 39.017794 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 109, 289, 296 ], + "duration" : 11.289, + "turn_weight" : 1.1, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 0, + "weight" : 13.778, + "geometry_index" : 537, + "location" : [ -77.099502, 39.016385 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 125, 293, 300 ], + "duration" : 25.601, + "turn_weight" : 1.1, + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 0, + "weight" : 29.89, + "geometry_index" : 543, + "location" : [ -77.096412, 39.015429 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 113, 294 ], + "duration" : 1.252, + "admin_index" : 1, + "out" : 0, + "weight" : 1.409, + "geometry_index" : 560, + "location" : [ -77.091439, 39.011215 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 115, 293 ], + "duration" : 27.626, + "admin_index" : 1, + "out" : 0, + "weight" : 31.079, + "geometry_index" : 561, + "location" : [ -77.091104, 39.011102 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 39, 125, 305 ], + "duration" : 1.545, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 1, + "weight" : 1.717, + "geometry_index" : 578, + "location" : [ -77.085442, 39.006726 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 125, 305 ], + "duration" : 6.652, + "admin_index" : 1, + "out" : 0, + "weight" : 7.317, + "geometry_index" : 579, + "location" : [ -77.085073, 39.006522 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 121, 303 ], + "duration" : 4.838, + "admin_index" : 1, + "out" : 0, + "weight" : 5.321, + "geometry_index" : 582, + "location" : [ -77.083461, 39.005651 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 101, 117, 288 ], + "duration" : 12.145, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.033, + "admin_index" : 1, + "out" : 0, + "weight" : 13.324, + "geometry_index" : 586, + "location" : [ -77.08212, 39.00516 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 81, 262 ], + "duration" : 2.588, + "admin_index" : 1, + "out" : 0, + "weight" : 2.846, + "geometry_index" : 592, + "location" : [ -77.078417, 39.005329 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 82, 255, 261 ], + "duration" : 9.833, + "turn_weight" : 0.95, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 0, + "weight" : 11.512, + "geometry_index" : 593, + "location" : [ -77.07763, 39.005428 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 81, 262 ], + "duration" : 1.5, + "admin_index" : 1, + "out" : 0, + "weight" : 1.613, + "geometry_index" : 594, + "location" : [ -77.074633, 39.005773 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 82, 255, 261 ], + "duration" : 16.995, + "turn_weight" : 0.8, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 0, + "weight" : 19.062, + "geometry_index" : 595, + "location" : [ -77.074179, 39.005829 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 66, 250 ], + "duration" : 25.8, + "admin_index" : 1, + "out" : 0, + "weight" : 28.38, + "geometry_index" : 600, + "location" : [ -77.069029, 39.00653 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 30, 215 ], + "duration" : 4.012, + "admin_index" : 1, + "out" : 0, + "weight" : 4.414, + "geometry_index" : 616, + "location" : [ -77.063959, 39.011191 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 28, 209 ], + "duration" : 42.222, + "admin_index" : 1, + "out" : 0, + "weight" : 47.5, + "geometry_index" : 618, + "location" : [ -77.063355, 39.012026 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 92, 272 ], + "duration" : 20.426, + "admin_index" : 1, + "out" : 0, + "weight" : 22.979, + "geometry_index" : 641, + "location" : [ -77.052148, 39.013584 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 92, 113, 272 ], + "duration" : 13.116, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 14.747, + "geometry_index" : 642, + "location" : [ -77.046122, 39.013406 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 92, 260, 272 ], + "duration" : 2.355, + "turn_weight" : 1.25, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 3.95, + "geometry_index" : 643, + "location" : [ -77.042245, 39.013322 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 92, 117, 272 ], + "duration" : 10.063, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 11.565, + "geometry_index" : 644, + "location" : [ -77.041557, 39.0133 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 89, 265, 270 ], + "duration" : 20.445, + "turn_weight" : 1.25, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 0, + "weight" : 24.74, + "geometry_index" : 647, + "location" : [ -77.038586, 39.013264 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 52, 234 ], + "duration" : 0.939, + "admin_index" : 1, + "out" : 0, + "weight" : 1.08, + "geometry_index" : 658, + "location" : [ -77.032909, 39.014418 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 52, 232 ], + "duration" : 5.126, + "admin_index" : 1, + "out" : 0, + "weight" : 5.895, + "geometry_index" : 659, + "location" : [ -77.032695, 39.014549 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 53, 232 ], + "duration" : 1.33, + "admin_index" : 1, + "out" : 0, + "weight" : 1.53, + "geometry_index" : 660, + "location" : [ -77.031493, 39.015273 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 56, 233 ], + "duration" : 26.061, + "admin_index" : 1, + "out" : 0, + "weight" : 29.97, + "geometry_index" : 661, + "location" : [ -77.031177, 39.015455 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 100, 280 ], + "duration" : 6.183, + "admin_index" : 1, + "out" : 0, + "weight" : 7.11, + "geometry_index" : 678, + "location" : [ -77.023847, 39.016718 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 103, 283 ], + "duration" : 1.8, + "admin_index" : 1, + "out" : 0, + "weight" : 2.025, + "geometry_index" : 681, + "location" : [ -77.022059, 39.016417 ] + }, { + "bearings" : [ 103, 283 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 1, + "out" : 0, + "geometry_index" : 682, + "location" : [ -77.021538, 39.016325 ] + } ], + "bannerInstructions" : [ { + "secondary" : { + "text" : "US 29 South: Colesville Road, Silver Spring", + "components" : [ { + "text" : "US 29 South: Colesville Road, Silver Spring", + "type" : "text" + } ] + }, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Colesville Road", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "30B", + "type" : "exit-number" + }, { + "text" : "Colesville Road", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 29", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 13113.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Colesville Road", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "30B", + "type" : "exit-number" + }, { + "text" : "Colesville Road", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 29", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "US 29 South: Colesville Road, Silver Spring", + "components" : [ { + "text" : "US 29 South: Colesville Road, Silver Spring", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "straight", "slight right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "I 495: Bethesda, Baltimore", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right to stay on I 495/Capital Beltway toward Bethesda/Baltimore.", + "type" : "fork", + "bearing_after" : 24, + "bearing_before" : 21, + "location" : [ -77.152925, 39.007036 ] + }, + "name" : "Capital Beltway", + "duration" : 505.801, + "distance" : 13113.0, + "driving_side" : "right", + "weight" : 575.026, + "mode" : "driving", + "ref" : "I 495", + "geometry" : "wrxkiAxh`drC_c@_Ti^mRg_@{SabBkbAq^mTur@cd@cQyLiKkJgJyJcJeMyGwLuFeMgFsNuDuNcDePsB_PoAmO}@aRQeUbGiqRHed@?_e@IoUQyV]sWm@eX{@}YaAuZiCui@gDem@wEyp@eG}p@sHeq@{H}n@}Ikm@uHed@mu@oeE{Fg^eAoGiDwWaDeYwCs\\oCoa@uBqb@qAo\\cCmdAu@c\\_Ko`FqCodAqAui@kAaXgBgVs@_IeAuJcDwTyDwR_FsRkF{QiGoQ{HoRmGoM{IsOoJiNmb@wf@oGuIqHyL}G}MkF{MwEqO}DgQqCePeBsPmAgQe@_QOqTd@uQdAcP|B{SpDcTpD}O|FuR`KyVzVan@dQ}^jLaYpN{a@rIk[dIo`@bSekAtMsu@pK{n@nFwXbFgT|FeT|HmUdKsUnIiOxKsPpKoMtKoLpNiM`OyJzS{Lfn@u\\nPkKtNsL~MwNfKeOdKoSdJqW`GaT~Io_@`F}S|Im]nHwUbGeOnFyLtIqOzJoMfJ{JxMaLnPkLro@m`@rOyKrMwKlNmOpKsNbJyOjL{U|e@qeAvKaVje@mdAfLgXxAaEdGiP~F_RhGsUdE{WrAgP~@kWXaXW{XeAkXaLopBeEep@qTizDoBk[}YegFsDsh@}B}SiDgT_A{DuCwL_GiR}KcUmJaOgMiO{MiLwPoLso@kb@sNeKyMaLyNuO_RmU{`@ih@wRwU_QyQ{T{RcMmIae@iZcg@_[gN_LqHsGaJmJ_J}L}FaK_GeL{H_SwDsMoD_PeCmNaB{NcAmNe@iRCkUp@cZnAe[tQkaD|Cmp@fBkf@pAcl@`A{q@x@sx@bJswJfDiqFj@_j@j@iu@Tss@DwmAu@ehBc@i^_Am]cBwVwBsTuDmVwF_WwGwUmIiUuKkVcNsYeGkLgl@cjAkJwRiKkVkIyUoKw\\gJq_@gGyWkFeZyEg\\yCiWiCcZeBcXoA}[u@mZUc[Vu_@v@q]dAoXlAqQ`AiN~Dwb@vIu{@vDq_@|MgtA" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 2.5 kilometers.", + "announcement" : "Continue for 2.5 kilometers.", + "distanceAlongGeometry" : 2685.0 + }, { + "ssmlAnnouncement" : "In 400 meters, Turn left onto U.S. 29.", + "announcement" : "In 400 meters, Turn left onto U.S. 29.", + "distanceAlongGeometry" : 376.2 + }, { + "ssmlAnnouncement" : "Turn left onto U.S. 29, Georgia Avenue.", + "announcement" : "Turn left onto U.S. 29, Georgia Avenue.", + "distanceAlongGeometry" : 96.8 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 103, 108, 283 ], + "duration" : 28.81, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 1, + "weight" : 32.4, + "geometry_index" : 683, + "location" : [ -77.020174, 39.016086 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 80, 167, 259, 341 ], + "duration" : 8.734, + "turn_duration" : 0.011, + "admin_index" : 1, + "out" : 1, + "weight" : 9.813, + "geometry_index" : 695, + "location" : [ -77.016976, 39.014478 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 177, 348, 356 ], + "duration" : 2.794, + "turn_weight" : 22.6, + "turn_duration" : 0.013, + "admin_index" : 1, + "out" : 0, + "weight" : 25.729, + "geometry_index" : 697, + "location" : [ -77.016816, 39.013929 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 177, 357 ], + "duration" : 3.027, + "admin_index" : 1, + "out" : 0, + "weight" : 3.406, + "geometry_index" : 698, + "location" : [ -77.016797, 39.013626 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 84, 184, 253, 359 ], + "duration" : 10.928, + "turn_duration" : 2.01, + "admin_index" : 1, + "out" : 1, + "weight" : 10.033, + "geometry_index" : 700, + "location" : [ -77.016784, 39.013294 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 12, 106, 194, 279 ], + "duration" : 4.507, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 5.062, + "geometry_index" : 702, + "location" : [ -77.016952, 39.012324 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 14, 99, 195 ], + "duration" : 11.462, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 2, + "weight" : 12.886, + "geometry_index" : 703, + "location" : [ -77.01711, 39.011842 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 14, 107, 194, 260 ], + "duration" : 17.271, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 19.853, + "geometry_index" : 705, + "location" : [ -77.017515, 39.010624 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 43, 130, 223, 308 ], + "duration" : 1.412, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 2, + "weight" : 1.599, + "geometry_index" : 709, + "location" : [ -77.018376, 39.008877 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 43, 115, 231 ], + "duration" : 10.766, + "turn_duration" : 2.011, + "admin_index" : 1, + "out" : 2, + "weight" : 10.068, + "geometry_index" : 710, + "location" : [ -77.018509, 39.008767 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 49, 230 ], + "duration" : 1.473, + "admin_index" : 1, + "out" : 1, + "weight" : 1.694, + "geometry_index" : 713, + "location" : [ -77.019452, 39.008143 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 50, 230, 331 ], + "duration" : 0.348, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 1, + "weight" : 0.376, + "geometry_index" : 714, + "location" : [ -77.019612, 39.008039 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 50, 231, 266 ], + "duration" : 2.625, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 3.011, + "geometry_index" : 715, + "location" : [ -77.019651, 39.008014 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 51, 144, 224, 322 ], + "duration" : 1.667, + "turn_duration" : 0.03, + "admin_index" : 1, + "out" : 2, + "weight" : 1.882, + "geometry_index" : 716, + "location" : [ -77.019942, 39.00783 ] + }, { + "entry" : [ false, true, true, true, true, true ], + "in" : 0, + "bearings" : [ 44, 75, 132, 230, 304, 358 ], + "duration" : 3.319, + "turn_duration" : 2.01, + "admin_index" : 1, + "out" : 3, + "weight" : 1.505, + "geometry_index" : 717, + "location" : [ -77.0201, 39.007701 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 50, 130, 231, 311 ], + "duration" : 1.152, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 1.317, + "geometry_index" : 718, + "location" : [ -77.020237, 39.007611 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 51, 230 ], + "duration" : 1.391, + "admin_index" : 1, + "out" : 1, + "weight" : 1.599, + "geometry_index" : 719, + "location" : [ -77.020367, 39.007529 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 50, 228 ], + "duration" : 4.827, + "admin_index" : 1, + "out" : 1, + "weight" : 5.672, + "geometry_index" : 720, + "location" : [ -77.020521, 39.007429 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 48, 223, 320 ], + "duration" : 4.201, + "turn_duration" : 0.028, + "admin_index" : 1, + "out" : 1, + "weight" : 4.799, + "geometry_index" : 721, + "location" : [ -77.02103, 39.007072 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 43, 132, 223 ], + "duration" : 0.43, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 2, + "weight" : 0.47, + "geometry_index" : 722, + "location" : [ -77.02143, 39.006734 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 43, 220, 342 ], + "duration" : 5.506, + "turn_duration" : 0.024, + "admin_index" : 1, + "out" : 1, + "weight" : 6.304, + "geometry_index" : 723, + "location" : [ -77.021467, 39.006703 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 40, 217, 304 ], + "duration" : 9.921, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 1, + "weight" : 11.632, + "geometry_index" : 724, + "location" : [ -77.021964, 39.006244 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 32, 120, 211, 303 ], + "duration" : 1.246, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 2, + "weight" : 1.442, + "geometry_index" : 728, + "location" : [ -77.022776, 39.00536 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 31, 118, 211, 306 ], + "duration" : 3.398, + "turn_duration" : 2.007, + "admin_index" : 1, + "out" : 2, + "weight" : 1.634, + "geometry_index" : 729, + "location" : [ -77.022868, 39.005243 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 31, 125, 211, 306 ], + "duration" : 3.852, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 4.518, + "geometry_index" : 730, + "location" : [ -77.022971, 39.005109 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 31, 117, 211 ], + "duration" : 3.116, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 3.653, + "geometry_index" : 731, + "location" : [ -77.023249, 39.004748 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 31, 205, 291 ], + "duration" : 4.199, + "turn_duration" : 0.026, + "admin_index" : 1, + "out" : 1, + "weight" : 4.903, + "geometry_index" : 732, + "location" : [ -77.023473, 39.004457 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 25, 115, 204 ], + "duration" : 2.637, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 2, + "weight" : 3.076, + "geometry_index" : 733, + "location" : [ -77.023718, 39.004043 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 204, 296 ], + "duration" : 3.361, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 3.942, + "geometry_index" : 734, + "location" : [ -77.023869, 39.003784 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 204, 291 ], + "duration" : 5.734, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 6.729, + "geometry_index" : 735, + "location" : [ -77.024066, 39.003446 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 114, 204 ], + "duration" : 2.625, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 3.076, + "geometry_index" : 736, + "location" : [ -77.024398, 39.002876 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 204, 294 ], + "duration" : 0.58, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 0.673, + "geometry_index" : 737, + "location" : [ -77.024547, 39.002614 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 113, 204 ], + "duration" : 4.098, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 4.807, + "geometry_index" : 738, + "location" : [ -77.024582, 39.002554 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 24, 203, 298 ], + "duration" : 3.455, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 1, + "weight" : 4.038, + "geometry_index" : 739, + "location" : [ -77.024816, 39.002144 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 23, 201, 270 ], + "duration" : 8.53, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 1, + "weight" : 9.998, + "geometry_index" : 740, + "location" : [ -77.025002, 39.001796 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 21, 196, 287 ], + "duration" : 7.226, + "turn_duration" : 0.026, + "admin_index" : 1, + "out" : 1, + "weight" : 8.46, + "geometry_index" : 741, + "location" : [ -77.025426, 39.000919 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 16, 108, 195, 291 ], + "duration" : 0.907, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 1.057, + "geometry_index" : 742, + "location" : [ -77.025706, 39.000158 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 15, 108, 197, 296 ], + "duration" : 6.144, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 2, + "weight" : 7.21, + "geometry_index" : 743, + "location" : [ -77.025739, 39.000064 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 16, 113, 196 ], + "duration" : 3.444, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 4.038, + "geometry_index" : 745, + "location" : [ -77.025986, 38.999416 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 16, 99, 197, 287 ], + "duration" : 0.417, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 2, + "weight" : 0.481, + "geometry_index" : 746, + "location" : [ -77.026122, 38.999051 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 17, 101, 198, 289 ], + "duration" : 2.908, + "turn_weight" : 5.6, + "turn_duration" : 2.008, + "admin_index" : 1, + "out" : 2, + "weight" : 6.657, + "geometry_index" : 747, + "location" : [ -77.02614, 38.999004 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 18, 92, 197, 291 ], + "duration" : 0.428, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 2, + "weight" : 0.481, + "geometry_index" : 748, + "location" : [ -77.026177, 38.998914 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 17, 108, 203, 291 ], + "duration" : 6.392, + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 2, + "weight" : 7.499, + "geometry_index" : 749, + "location" : [ -77.026195, 38.998869 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 28, 209, 300 ], + "duration" : 4.998, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 5.864, + "geometry_index" : 751, + "location" : [ -77.026598, 38.998238 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 29, 113, 203, 296 ], + "duration" : 1.176, + "turn_duration" : 0.03, + "admin_index" : 1, + "out" : 2, + "weight" : 1.346, + "geometry_index" : 752, + "location" : [ -77.026936, 38.997756 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 23, 124, 211, 301 ], + "duration" : 2.83, + "turn_duration" : 2.012, + "admin_index" : 1, + "out" : 2, + "weight" : 0.961, + "geometry_index" : 753, + "location" : [ -77.026998, 38.997643 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 31, 125, 209, 306 ], + "duration" : 5.586, + "turn_duration" : 0.022, + "admin_index" : 1, + "out" : 2, + "weight" : 6.537, + "geometry_index" : 754, + "location" : [ -77.027058, 38.997564 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 29, 117, 207 ], + "duration" : 7.877, + "turn_duration" : 0.022, + "admin_index" : 1, + "out" : 2, + "weight" : 9.229, + "geometry_index" : 755, + "location" : [ -77.027441, 38.997031 ] + }, { + "entry" : [ false, false, true ], + "in" : 0, + "bearings" : [ 27, 142, 212 ], + "duration" : 0.992, + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 2, + "weight" : 1.154, + "geometry_index" : 756, + "location" : [ -77.027939, 38.996263 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 32, 124, 220, 308 ], + "duration" : 1.075, + "turn_duration" : 0.012, + "admin_index" : 1, + "out" : 2, + "weight" : 1.25, + "geometry_index" : 757, + "location" : [ -77.028011, 38.996174 ] + }, { + "bearings" : [ 40, 139, 208, 246, 320 ], + "entry" : [ false, false, false, true, true ], + "in" : 0, + "turn_weight" : 16.8, + "turn_duration" : 2.042, + "admin_index" : 1, + "out" : 3, + "geometry_index" : 758, + "location" : [ -77.028105, 38.996086 ] + } ], + "exits" : "30B", + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Georgia Avenue", + "components" : [ { + "text" : "Georgia Avenue", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 29", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 2695.0 + } ], + "destinations" : "US 29 South: Colesville Road, Silver Spring", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take exit 30B onto US 29 South toward Colesville Road/Silver Spring.", + "type" : "off ramp", + "bearing_after" : 108, + "bearing_before" : 103, + "location" : [ -77.020174, 39.016086 ] + }, + "name" : "Colesville Road", + "duration" : 239.4, + "distance" : 2695.0, + "driving_side" : "right", + "weight" : 304.454, + "mode" : "driving", + "ref" : "US 29", + "geometry" : "khjliAz_}{qCbNm{@tBcNtC_NhEiPrDsLzFaQdHiOxGmLdGuItHoHjGuC|KuDp@Uv_@iH|Qe@hJWlHAna@fBbYfFb]zHvf@pLjc@vJlBXvhAxXdUhNxHzJzEhGbK`R|Tn_@|CjFnE~Hp@lAnJdQ`GzHrDpGbDbGfErHhUx^bT~W|@hAt[`^jW|VbU`SbFnDr@f@hFvDjGlEpUjPdQ~LzXhNdOlHbThKrb@vSjOhHvBdArXrMvTrJxu@nYpn@nPzD`ApYdI|LfDxUnG|Ab@rDhAxAb@fKnEdZtQb]bT`FzB|CvBh`@|V~n@b^pDnCnDzDlCpK" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Longfellow Street Northwest", + "components" : [ { + "text" : "Longfellow Street Northwest", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 4357.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 4 kilometers.", + "announcement" : "Continue for 4 kilometers.", + "distanceAlongGeometry" : 4347.0 + }, { + "ssmlAnnouncement" : "In 400 meters, Turn left onto Longfellow Street Northwest.", + "announcement" : "In 400 meters, Turn left onto Longfellow Street Northwest.", + "distanceAlongGeometry" : 379.8 + }, { + "ssmlAnnouncement" : "Turn left onto Longfellow Street Northwest. Then Turn left.", + "announcement" : "Turn left onto Longfellow Street Northwest. Then Turn left.", + "distanceAlongGeometry" : 113.6 + } ], + "intersections" : [ { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 66, 141, 229, 322 ], + "duration" : 9.668, + "turn_weight" : 14.0, + "turn_duration" : 8.686, + "admin_index" : 1, + "out" : 1, + "weight" : 15.154, + "geometry_index" : 759, + "location" : [ -77.028306, 38.996015 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 30, 138, 237, 321 ], + "duration" : 2.677, + "turn_weight" : 11.2, + "turn_duration" : 2.022, + "admin_index" : 1, + "out" : 1, + "weight" : 11.969, + "geometry_index" : 760, + "location" : [ -77.028216, 38.99593 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 41, 138, 222, 318 ], + "duration" : 8.598, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 10.094, + "geometry_index" : 761, + "location" : [ -77.028151, 38.995874 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 61, 146, 239, 319 ], + "duration" : 5.247, + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 1, + "weight" : 6.153, + "geometry_index" : 765, + "location" : [ -77.027339, 38.995175 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 163, 275, 337 ], + "duration" : 0.42, + "turn_duration" : 0.011, + "admin_index" : 1, + "out" : 1, + "weight" : 0.481, + "geometry_index" : 770, + "location" : [ -77.026987, 38.994669 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 86, 165, 266, 343 ], + "duration" : 0.498, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 0.577, + "geometry_index" : 771, + "location" : [ -77.026972, 38.99463 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 3, + "bearings" : [ 86, 163, 267, 345 ], + "duration" : 3.002, + "turn_duration" : 2.021, + "admin_index" : 1, + "out" : 1, + "weight" : 1.154, + "geometry_index" : 772, + "location" : [ -77.026954, 38.994578 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 92, 165, 272, 343 ], + "duration" : 2.989, + "turn_duration" : 2.007, + "admin_index" : 1, + "out" : 1, + "weight" : 1.154, + "geometry_index" : 773, + "location" : [ -77.026915, 38.994476 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 90, 170, 267, 345 ], + "duration" : 7.782, + "turn_duration" : 0.01, + "admin_index" : 1, + "out" : 1, + "weight" : 9.133, + "geometry_index" : 774, + "location" : [ -77.026879, 38.994374 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 93, 178, 275, 356 ], + "duration" : 1.235, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 1.442, + "geometry_index" : 777, + "location" : [ -77.026764, 38.993528 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 92, 179, 358 ], + "duration" : 2.989, + "turn_duration" : 2.007, + "admin_index" : 1, + "out" : 1, + "weight" : 1.154, + "geometry_index" : 778, + "location" : [ -77.026758, 38.993396 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 79, 178, 258, 359 ], + "duration" : 1.493, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 1, + "weight" : 1.73, + "geometry_index" : 779, + "location" : [ -77.026755, 38.993289 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 178, 358 ], + "duration" : 1.473, + "admin_index" : 1, + "out" : 0, + "weight" : 1.73, + "geometry_index" : 780, + "location" : [ -77.026747, 38.993125 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 177, 358 ], + "duration" : 2.674, + "turn_duration" : 2.019, + "admin_index" : 1, + "out" : 1, + "weight" : 0.769, + "geometry_index" : 781, + "location" : [ -77.02674, 38.992962 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 178, 273, 357 ], + "duration" : 2.228, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 1, + "weight" : 2.596, + "geometry_index" : 782, + "location" : [ -77.026736, 38.992893 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 178, 270, 358 ], + "duration" : 1.574, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 0, + "weight" : 1.827, + "geometry_index" : 783, + "location" : [ -77.026726, 38.992653 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 89, 179, 270, 358 ], + "duration" : 3.853, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 4.518, + "geometry_index" : 784, + "location" : [ -77.026718, 38.992479 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 180, 359 ], + "duration" : 0.736, + "admin_index" : 1, + "out" : 0, + "weight" : 0.865, + "geometry_index" : 785, + "location" : [ -77.026705, 38.992058 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 181, 270 ], + "duration" : 3.117, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 1, + "weight" : 3.653, + "geometry_index" : 786, + "location" : [ -77.026705, 38.991977 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 1, 183 ], + "duration" : 0.655, + "admin_index" : 1, + "out" : 1, + "weight" : 0.769, + "geometry_index" : 788, + "location" : [ -77.026711, 38.991639 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 3, 68, 180, 263 ], + "duration" : 2.677, + "turn_duration" : 2.022, + "admin_index" : 1, + "out" : 2, + "weight" : 0.769, + "geometry_index" : 789, + "location" : [ -77.026715, 38.99157 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 82, 180, 260 ], + "duration" : 0.907, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 1.058, + "geometry_index" : 790, + "location" : [ -77.026715, 38.991498 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 267 ], + "duration" : 2.134, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 2.5, + "geometry_index" : 791, + "location" : [ -77.026714, 38.9914 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 269 ], + "duration" : 2.952, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 3.461, + "geometry_index" : 793, + "location" : [ -77.026716, 38.991164 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 90, 180 ], + "duration" : 2.625, + "turn_weight" : 4.2, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 7.276, + "geometry_index" : 794, + "location" : [ -77.026719, 38.99084 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 270 ], + "duration" : 1.889, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 2.211, + "geometry_index" : 795, + "location" : [ -77.02672, 38.990555 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 84, 180, 263 ], + "duration" : 0.498, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 2, + "weight" : 0.577, + "geometry_index" : 796, + "location" : [ -77.026719, 38.990346 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 93, 182 ], + "duration" : 14.608, + "turn_duration" : 2.008, + "admin_index" : 1, + "out" : 2, + "weight" : 14.805, + "geometry_index" : 797, + "location" : [ -77.026719, 38.990288 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 287 ], + "duration" : 9.334, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 10.959, + "geometry_index" : 799, + "location" : [ -77.026738, 38.988902 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 220 ], + "duration" : 1.562, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 1.827, + "geometry_index" : 800, + "location" : [ -77.026749, 38.987873 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 135, 181, 313 ], + "duration" : 1.481, + "turn_duration" : 0.008, + "admin_index" : 1, + "out" : 2, + "weight" : 1.73, + "geometry_index" : 801, + "location" : [ -77.026748, 38.987705 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 1, 148, 180, 327 ], + "duration" : 3.656, + "turn_weight" : 11.2, + "turn_duration" : 2.019, + "admin_index" : 1, + "out" : 2, + "weight" : 13.123, + "geometry_index" : 802, + "location" : [ -77.026753, 38.987541 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 94, 179, 263 ], + "duration" : 3.165, + "turn_duration" : 2.019, + "admin_index" : 1, + "out" : 2, + "weight" : 1.346, + "geometry_index" : 803, + "location" : [ -77.026751, 38.987359 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 94, 178, 272, 359 ], + "duration" : 1.248, + "turn_duration" : 0.021, + "admin_index" : 1, + "out" : 1, + "weight" : 1.442, + "geometry_index" : 804, + "location" : [ -77.026748, 38.987236 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 272, 358 ], + "duration" : 0.662, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 0.769, + "geometry_index" : 805, + "location" : [ -77.026743, 38.987102 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 179, 252, 359 ], + "duration" : 1.807, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 2.115, + "geometry_index" : 806, + "location" : [ -77.026742, 38.987031 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 180, 269, 359 ], + "duration" : 2.626, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 3.076, + "geometry_index" : 807, + "location" : [ -77.026736, 38.986836 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 84, 179, 270 ], + "duration" : 3.046, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 2, + "weight" : 3.557, + "geometry_index" : 808, + "location" : [ -77.026733, 38.986547 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 269, 359 ], + "duration" : 4.18, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 0, + "weight" : 4.903, + "geometry_index" : 809, + "location" : [ -77.026728, 38.986212 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 179, 359 ], + "duration" : 8.352, + "turn_duration" : 0.007, + "admin_index" : 1, + "out" : 1, + "weight" : 9.806, + "geometry_index" : 810, + "location" : [ -77.026722, 38.985757 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 120, 161, 291, 356 ], + "duration" : 1.288, + "turn_duration" : 0.061, + "admin_index" : 1, + "out" : 1, + "weight" : 1.442, + "geometry_index" : 812, + "location" : [ -77.026692, 38.984843 ] + }, { + "entry" : [ true, true, true, true, false ], + "in" : 4, + "bearings" : [ 8, 115, 177, 293, 341 ], + "duration" : 2.92, + "turn_weight" : 5.6, + "turn_duration" : 2.02, + "admin_index" : 1, + "out" : 2, + "weight" : 6.657, + "geometry_index" : 813, + "location" : [ -77.026637, 38.984718 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 108, 177, 291, 357 ], + "duration" : 1.562, + "turn_duration" : 0.019, + "admin_index" : 1, + "out" : 1, + "weight" : 1.813, + "geometry_index" : 814, + "location" : [ -77.02663, 38.984619 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 177, 322, 357 ], + "duration" : 1.648, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 0, + "weight" : 1.914, + "geometry_index" : 816, + "location" : [ -77.026619, 38.984454 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 178, 197, 357 ], + "duration" : 2.419, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 0, + "weight" : 2.82, + "geometry_index" : 817, + "location" : [ -77.026608, 38.984282 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 177, 358 ], + "duration" : 1.133, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 1.309, + "geometry_index" : 818, + "location" : [ -77.026599, 38.984027 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 86, 182, 265, 357 ], + "duration" : 0.781, + "turn_duration" : 0.009, + "admin_index" : 2, + "out" : 1, + "weight" : 0.906, + "geometry_index" : 819, + "location" : [ -77.026592, 38.983911 ] + }, { + "entry" : [ false, true, true, false, true ], + "in" : 0, + "bearings" : [ 2, 89, 177, 256, 286 ], + "duration" : 3.138, + "turn_weight" : 5.6, + "turn_duration" : 2.024, + "admin_index" : 2, + "out" : 2, + "weight" : 6.909, + "geometry_index" : 820, + "location" : [ -77.026596, 38.983829 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 68, 178, 251, 357 ], + "duration" : 3.876, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 4.532, + "geometry_index" : 821, + "location" : [ -77.026588, 38.98371 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 179, 358 ], + "duration" : 1.807, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.115, + "geometry_index" : 822, + "location" : [ -77.026572, 38.983307 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 267, 359 ], + "duration" : 3.178, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 3.726, + "geometry_index" : 823, + "location" : [ -77.026569, 38.983123 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 179, 270, 359 ], + "duration" : 0.436, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.504, + "geometry_index" : 824, + "location" : [ -77.026558, 38.982793 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 90, 179, 359 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.806, + "geometry_index" : 825, + "location" : [ -77.026557, 38.982746 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 179, 270, 359 ], + "duration" : 3.35, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 3.928, + "geometry_index" : 826, + "location" : [ -77.026555, 38.98267 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 270, 359 ], + "duration" : 2.578, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 3.021, + "geometry_index" : 827, + "location" : [ -77.026547, 38.982316 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 263, 359 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 0.806, + "geometry_index" : 828, + "location" : [ -77.02654, 38.98205 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 179, 244, 359 ], + "duration" : 1.293, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 1.511, + "geometry_index" : 829, + "location" : [ -77.026539, 38.981981 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 92, 178, 359 ], + "duration" : 0.878, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 1.007, + "geometry_index" : 830, + "location" : [ -77.026536, 38.981845 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 269, 358 ], + "duration" : 2.15, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 2.518, + "geometry_index" : 831, + "location" : [ -77.026533, 38.981756 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 86, 179, 265, 359 ], + "duration" : 0.521, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.604, + "geometry_index" : 832, + "location" : [ -77.026528, 38.981535 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 267, 359 ], + "duration" : 0.35, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 0.403, + "geometry_index" : 833, + "location" : [ -77.026527, 38.981483 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 90, 178, 359 ], + "duration" : 0.535, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 0.604, + "geometry_index" : 834, + "location" : [ -77.026526, 38.981443 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 90, 178, 269, 358 ], + "duration" : 1.648, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 1.914, + "geometry_index" : 835, + "location" : [ -77.026524, 38.981391 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 87, 179, 358 ], + "duration" : 1.636, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 1.914, + "geometry_index" : 837, + "location" : [ -77.026518, 38.981218 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 87, 178, 359 ], + "duration" : 2.078, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 2.417, + "geometry_index" : 838, + "location" : [ -77.026516, 38.981048 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 178, 358 ], + "duration" : 0.962, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 1.108, + "geometry_index" : 839, + "location" : [ -77.026507, 38.980832 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 83, 179, 358 ], + "duration" : 2.15, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.518, + "geometry_index" : 840, + "location" : [ -77.026502, 38.980729 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 92, 178, 359 ], + "duration" : 1.049, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 1.208, + "geometry_index" : 841, + "location" : [ -77.026495, 38.980502 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 178, 267, 358 ], + "duration" : 4.391, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 0, + "weight" : 5.136, + "geometry_index" : 842, + "location" : [ -77.026491, 38.980391 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 179, 358 ], + "duration" : 0.865, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 1.007, + "geometry_index" : 843, + "location" : [ -77.026472, 38.979932 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 89, 178, 359 ], + "duration" : 3.621, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 4.23, + "geometry_index" : 844, + "location" : [ -77.026469, 38.979838 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 90, 178, 270, 358 ], + "duration" : 0.705, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 0.806, + "geometry_index" : 845, + "location" : [ -77.026454, 38.979465 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 90, 179, 270, 358 ], + "duration" : 2.607, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.705, + "geometry_index" : 846, + "location" : [ -77.026451, 38.979394 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 179, 270, 359 ], + "duration" : 4.036, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 4.734, + "geometry_index" : 847, + "location" : [ -77.02645, 38.979333 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 179, 269, 359 ], + "duration" : 5.75, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "weight" : 6.748, + "geometry_index" : 848, + "location" : [ -77.02644, 38.978908 ] + }, { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 90, 181, 283, 359 ], + "duration" : 0.437, + "turn_duration" : 0.008, + "admin_index" : 2, + "out" : 1, + "weight" : 0.504, + "geometry_index" : 849, + "location" : [ -77.026426, 38.978303 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 1, 90, 180, 270 ], + "duration" : 2.419, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 2, + "weight" : 2.82, + "geometry_index" : 850, + "location" : [ -77.026427, 38.978257 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 185, 269 ], + "duration" : 0.952, + "turn_duration" : 0.009, + "admin_index" : 2, + "out" : 1, + "weight" : 1.108, + "geometry_index" : 852, + "location" : [ -77.026427, 38.978003 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 5, 108, 184, 289 ], + "duration" : 5.078, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 5.942, + "geometry_index" : 853, + "location" : [ -77.026437, 38.977905 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 101, 184, 282 ], + "duration" : 0.864, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 1.007, + "geometry_index" : 854, + "location" : [ -77.02649, 38.977374 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 185, 270 ], + "duration" : 16.15, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 2, + "weight" : 16.618, + "geometry_index" : 855, + "location" : [ -77.026498, 38.977284 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 5, 90, 185, 270 ], + "duration" : 7.935, + "turn_duration" : 2.021, + "admin_index" : 2, + "out" : 2, + "weight" : 6.949, + "geometry_index" : 857, + "location" : [ -77.026655, 38.975811 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 94, 185 ], + "duration" : 4.735, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 5.539, + "geometry_index" : 858, + "location" : [ -77.02672, 38.975191 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 94, 185 ], + "duration" : 9.106, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 10.676, + "geometry_index" : 859, + "location" : [ -77.026771, 38.974701 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 5, 185, 272 ], + "duration" : 1.306, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 1, + "weight" : 1.511, + "geometry_index" : 860, + "location" : [ -77.02687, 38.973754 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 5, 90, 185, 272 ], + "duration" : 5.792, + "turn_duration" : 2.021, + "admin_index" : 2, + "out" : 2, + "weight" : 4.431, + "geometry_index" : 861, + "location" : [ -77.026884, 38.973617 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 90, 185 ], + "duration" : 1.821, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 2.115, + "geometry_index" : 863, + "location" : [ -77.026928, 38.973219 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 5, 186 ], + "duration" : 2.829, + "admin_index" : 2, + "out" : 1, + "weight" : 3.394, + "geometry_index" : 864, + "location" : [ -77.026951, 38.973029 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 6, 92, 185 ], + "duration" : 3.792, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 4.526, + "geometry_index" : 865, + "location" : [ -77.026988, 38.972737 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 89, 184 ], + "duration" : 2.449, + "turn_duration" : 2.021, + "admin_index" : 2, + "out" : 2, + "weight" : 0.514, + "geometry_index" : 866, + "location" : [ -77.027034, 38.972345 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 260 ], + "duration" : 5.95, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 1, + "weight" : 4.731, + "geometry_index" : 867, + "location" : [ -77.027038, 38.972303 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 94, 184 ], + "duration" : 3.95, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 4.731, + "geometry_index" : 868, + "location" : [ -77.027076, 38.971889 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 90, 185 ], + "duration" : 14.764, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 17.691, + "geometry_index" : 870, + "location" : [ -77.027118, 38.971473 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 184, 270 ], + "duration" : 3.978, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 2, + "weight" : 2.366, + "geometry_index" : 873, + "location" : [ -77.027266, 38.96993 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 275 ], + "duration" : 4.807, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 5.76, + "geometry_index" : 874, + "location" : [ -77.027284, 38.969724 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 184 ], + "duration" : 0.607, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.72, + "geometry_index" : 875, + "location" : [ -77.027327, 38.96922 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 273 ], + "duration" : 1.721, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.057, + "geometry_index" : 876, + "location" : [ -77.027333, 38.969155 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 270 ], + "duration" : 1.121, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 1.337, + "geometry_index" : 877, + "location" : [ -77.027348, 38.968979 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 273 ], + "duration" : 1.721, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.057, + "geometry_index" : 878, + "location" : [ -77.027358, 38.968859 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 183, 275 ], + "duration" : 0.533, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 0.617, + "geometry_index" : 879, + "location" : [ -77.027374, 38.968682 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 90, 184 ], + "duration" : 0.95, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 1.131, + "geometry_index" : 880, + "location" : [ -77.027378, 38.96863 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 183, 270 ], + "duration" : 2.591, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 3.086, + "geometry_index" : 881, + "location" : [ -77.027386, 38.96853 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 272 ], + "duration" : 0.436, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.514, + "geometry_index" : 883, + "location" : [ -77.027408, 38.96826 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 92, 184 ], + "duration" : 2.235, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 2.674, + "geometry_index" : 884, + "location" : [ -77.027412, 38.968217 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 4, 184, 275 ], + "duration" : 0.778, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.926, + "geometry_index" : 885, + "location" : [ -77.027434, 38.967989 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 265 ], + "duration" : 1.978, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.366, + "geometry_index" : 886, + "location" : [ -77.027442, 38.967907 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 58, 184, 235 ], + "duration" : 1.55, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 1.851, + "geometry_index" : 887, + "location" : [ -77.027462, 38.967697 ] + }, { + "entry" : [ false, false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 38, 77, 183, 235 ], + "duration" : 3.391, + "turn_weight" : 6.2, + "turn_duration" : 2.019, + "admin_index" : 2, + "out" : 3, + "weight" : 7.846, + "geometry_index" : 888, + "location" : [ -77.027477, 38.967535 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 3, 52, 185, 234 ], + "duration" : 1.036, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 1.234, + "geometry_index" : 889, + "location" : [ -77.027488, 38.967393 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 5, 90, 184 ], + "duration" : 5.421, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 2, + "weight" : 6.48, + "geometry_index" : 890, + "location" : [ -77.027501, 38.967288 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 94, 184 ], + "duration" : 0.607, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.72, + "geometry_index" : 891, + "location" : [ -77.027551, 38.966727 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 97, 184 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.823, + "geometry_index" : 892, + "location" : [ -77.027557, 38.966662 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 273 ], + "duration" : 0.35, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.411, + "geometry_index" : 893, + "location" : [ -77.027563, 38.966591 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 93, 184 ], + "duration" : 2.493, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 2.983, + "geometry_index" : 894, + "location" : [ -77.027566, 38.966554 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 184, 273 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.823, + "geometry_index" : 895, + "location" : [ -77.02759, 38.966292 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 92, 184, 270 ], + "duration" : 0.778, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.926, + "geometry_index" : 896, + "location" : [ -77.027596, 38.966221 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 184, 270 ], + "duration" : 2.693, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.823, + "geometry_index" : 897, + "location" : [ -77.027603, 38.96614 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 90, 184, 270 ], + "duration" : 10.635, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 12.754, + "geometry_index" : 898, + "location" : [ -77.027609, 38.966066 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 184, 270 ], + "duration" : 11.35, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 2, + "weight" : 11.211, + "geometry_index" : 901, + "location" : [ -77.02771, 38.964954 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 94, 184 ], + "duration" : 1.893, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 2.31, + "geometry_index" : 903, + "location" : [ -77.027788, 38.963972 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 184, 270 ], + "duration" : 5.35, + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 2, + "weight" : 4.095, + "geometry_index" : 904, + "location" : [ -77.027804, 38.963774 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 183 ], + "duration" : 3.362, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 2, + "weight" : 4.095, + "geometry_index" : 905, + "location" : [ -77.027832, 38.963424 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 3, 184 ], + "duration" : 3.6, + "admin_index" : 2, + "out" : 1, + "weight" : 4.41, + "geometry_index" : 906, + "location" : [ -77.027859, 38.963077 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 4, 90, 183, 270 ], + "duration" : 3.99, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.019, + "admin_index" : 2, + "out" : 2, + "weight" : 2.415, + "geometry_index" : 907, + "location" : [ -77.027889, 38.962702 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 184, 270 ], + "duration" : 1.722, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.1, + "geometry_index" : 908, + "location" : [ -77.027905, 38.962496 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 4, 184, 270 ], + "duration" : 5.75, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 7.035, + "geometry_index" : 909, + "location" : [ -77.02792, 38.962316 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 4, 184 ], + "duration" : 3.0, + "admin_index" : 2, + "out" : 1, + "weight" : 3.675, + "geometry_index" : 910, + "location" : [ -77.027971, 38.961713 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 4, 97, 184, 277 ], + "duration" : 1.293, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 1.575, + "geometry_index" : 912, + "location" : [ -77.027998, 38.9614 ] + }, { + "entry" : [ false, true, false, true ], + "in" : 0, + "bearings" : [ 4, 184, 265, 298 ], + "duration" : 4.407, + "turn_weight" : 3.5, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.007, + "admin_index" : 2, + "out" : 1, + "weight" : 6.44, + "geometry_index" : 913, + "location" : [ -77.02801, 38.961262 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 115, 183 ], + "duration" : 5.619, + "turn_weight" : 3.5, + "turn_duration" : 2.019, + "admin_index" : 2, + "out" : 2, + "weight" : 7.91, + "geometry_index" : 914, + "location" : [ -77.028031, 38.961014 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 92, 183 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.84, + "geometry_index" : 915, + "location" : [ -77.02806, 38.960638 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 3, 183 ], + "duration" : 3.514, + "admin_index" : 2, + "out" : 1, + "weight" : 4.305, + "geometry_index" : 916, + "location" : [ -77.028065, 38.960567 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 183, 270 ], + "duration" : 3.178, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 3.885, + "geometry_index" : 917, + "location" : [ -77.028093, 38.960204 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 184, 270 ], + "duration" : 1.036, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 1.26, + "geometry_index" : 918, + "location" : [ -77.028118, 38.959873 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 183, 269 ], + "duration" : 0.791, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 0.945, + "geometry_index" : 919, + "location" : [ -77.028127, 38.959765 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 184, 267 ], + "duration" : 1.722, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 2.1, + "geometry_index" : 920, + "location" : [ -77.028133, 38.959681 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 183, 265 ], + "duration" : 3.619, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 1, + "weight" : 4.41, + "geometry_index" : 921, + "location" : [ -77.028147, 38.959504 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 3, 184, 269 ], + "duration" : 0.693, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 1, + "weight" : 0.84, + "geometry_index" : 922, + "location" : [ -77.028176, 38.959123 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 4, 92, 183 ], + "duration" : 5.933, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 2, + "weight" : 7.245, + "geometry_index" : 923, + "location" : [ -77.028182, 38.959048 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 3, 84, 183, 265 ], + "duration" : 0.778, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "weight" : 0.945, + "geometry_index" : 924, + "location" : [ -77.028229, 38.95843 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 3, 89, 182, 270 ], + "duration" : 2.533, + "turn_duration" : 2.019, + "admin_index" : 2, + "out" : 2, + "weight" : 0.63, + "geometry_index" : 925, + "location" : [ -77.028235, 38.958351 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 2, 89, 180, 267 ], + "duration" : 3.619, + "turn_duration" : 0.019, + "admin_index" : 2, + "out" : 2, + "weight" : 4.41, + "geometry_index" : 926, + "location" : [ -77.028238, 38.958295 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 178, 267, 359 ], + "duration" : 5.421, + "turn_duration" : 0.021, + "admin_index" : 2, + "out" : 0, + "weight" : 6.615, + "geometry_index" : 931, + "location" : [ -77.028235, 38.95792 ] + }, { + "bearings" : [ 87, 174, 267, 354 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_duration" : 0.008, + "admin_index" : 2, + "out" : 1, + "geometry_index" : 935, + "location" : [ -77.028185, 38.957355 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto US 29/Georgia Avenue.", + "type" : "turn", + "bearing_after" : 138, + "bearing_before" : 246, + "location" : [ -77.028306, 38.996015 ] + }, + "name" : "Georgia Avenue", + "duration" : 430.722, + "distance" : 4357.0, + "driving_side" : "right", + "weight" : 503.168, + "mode" : "driving", + "ref" : "US 29", + "geometry" : "}ackiAb|l|qChDsDnBaCz[{`@|E_GjFmGNMrDaDzGgFhIuErDwAd@GlA]fBc@jEmAjEgAzJsAzKeAb[kAfGKtEEfIOdIMhCG~MSzIOhYY`D?hMHxE@hCFnC?bEAxGB|D?fSDxP@`LArB?b[^ny@Dh_ATnIAfIHjJCtFEjGIlCAdKK`QE|SIl[Khu@WxAc@xFmBdEMnCIxDKvIU|NQfFMbDFlFOdX_@nJErSU|AAvCCbUOrOMhCAnGEpDExLIfBAnAAfBCxDE~CErICnLQlEIdMM|EGt[e@zDEhV]lCExBApYSxd@[zA@vFDbGEbERd`@hBrDNzz@nEd_@hBve@`Cr]dBdz@dEpGZpVpAh@DzJl@fQhAnWzArAFzXjAxBHdUhA|[`BbZrAjg@pBzKb@n^tA`CJ~I\\nFR`J^fBFfENbL^vBJtAFfMj@bDNbLf@bI\\zGTpEX`b@bB`CJlCJhADjOn@lCJ`DLrCJpd@fB`ZpAzCNpCJxw@nCjK^zTv@tTt@lVz@zK^fJ\\td@dBxCJvMh@rGVnNh@nVx@lCHtUv@tSp@vEPfDJ`JZxVx@tCJre@|A|CJnBDP?~HB~CA|CC|AC`FI~HU|CMhLu@tCS" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Turn left.", + "components" : [ { + "text" : "Turn left.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 48.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left.", + "announcement" : "Turn left.", + "distanceAlongGeometry" : 40.0 + } ], + "intersections" : [ { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 88, 175, 270, 354 ], + "duration" : 7.166, + "turn_weight" : 40.0, + "turn_duration" : 4.625, + "admin_index" : 2, + "out" : 0, + "weight" : 43.113, + "geometry_index" : 936, + "location" : [ -77.028175, 38.95728 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 89, 177, 268, 358 ], + "duration" : 3.82, + "turn_weight" : 21.0, + "turn_duration" : 0.008, + "admin_index" : 2, + "out" : 0, + "weight" : 25.669, + "geometry_index" : 937, + "location" : [ -77.028037, 38.957283 ] + }, { + "bearings" : [ 88, 217, 269 ], + "entry" : [ true, false, false ], + "in" : 2, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 0, + "geometry_index" : 938, + "location" : [ -77.027828, 38.957287 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Longfellow Street Northwest.", + "type" : "turn", + "bearing_after" : 88, + "bearing_before" : 174, + "location" : [ -77.028175, 38.95728 ] + }, + "name" : "Longfellow Street Northwest", + "duration" : 14.804, + "distance" : 48.0, + "driving_side" : "right", + "weight" : 80.452, + "mode" : "driving", + "geometry" : "_mwhiA|sl|qCEsGGaLKgL" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "text" : "You have arrived at your destination.", + "components" : [ { + "text" : "You have arrived at your destination.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 49.473 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "You have arrived at your destination.", + "announcement" : "You have arrived at your destination.", + "distanceAlongGeometry" : 40.0 + } ], + "intersections" : [ { + "entry" : [ true, false, true ], + "classes" : [ "restricted" ], + "in" : 1, + "bearings" : [ 87, 268, 357 ], + "duration" : 8.155, + "turn_weight" : 640.0, + "turn_duration" : 5.275, + "admin_index" : 2, + "out" : 2, + "weight" : 643.528, + "geometry_index" : 939, + "location" : [ -77.027616, 38.957293 ] + }, { + "entry" : [ false, false, false, true ], + "classes" : [ "restricted" ], + "in" : 1, + "bearings" : [ 89, 177, 269, 357 ], + "duration" : 5.767, + "turn_weight" : 21.0, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 3, + "weight" : 28.056, + "geometry_index" : 940, + "location" : [ -77.027621, 38.957366 ] + }, { + "bearings" : [ 177, 267, 358 ], + "entry" : [ false, true, true ], + "classes" : [ "restricted" ], + "in" : 0, + "turn_weight" : 5.25, + "turn_duration" : 0.007, + "admin_index" : 2, + "out" : 2, + "geometry_index" : 941, + "location" : [ -77.027631, 38.957511 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left.", + "type" : "turn", + "bearing_after" : 357, + "bearing_before" : 88, + "location" : [ -77.027616, 38.957293 ] + }, + "name" : "", + "duration" : 22.267, + "distance" : 49.473, + "driving_side" : "right", + "weight" : 687.046, + "mode" : "driving", + "geometry" : "ymwhiA~pk|qCqCHaHR{KP@bA" + }, { + "intersections" : [ { + "bearings" : [ 164 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 2, + "geometry_index" : 943, + "location" : [ -77.027674, 38.957716 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "instruction" : "You have arrived at your destination.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 344, + "location" : [ -77.027674, 38.957716 ] + }, + "name" : "", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "ghxhiArtk|qC??" + } ], + "distance" : 40743.492, + "summary" : "I 495, US 29" + } ], + "geometry" : "o~yciAfoigrCvWfNn\\dPjMpFvDrAfEn@lAEz@nY~@t[r@lVHhC`Ap[n@lTZfKzAfg@f@dQr@p[TzKFvCI|PInCc@lMcAnPeK`vAeAdNaBdTSxCcBjW_@nF[rE`E|C~AVf^dG`PlChRnCrMxCtFhBlGrC`GfDhFrDdFpEhHnHrFbIvLpQfH|JlG|I\\b@xD`FfCdDhDpDdGdGfExC~G`ErFtBlJzBbJrArId@pKBp]LpVCfJI~F[zEq@lE{@jF{AtDyAp@YlE}BrFqDtEyDpFsF`FiGjDqFjDaIlCwHnC}IxHi\\bLaf@p@uCnBqIjBqGpCmGxDsG|F}GzDcEjF{DbP{DjIiBtC]zGWbDAzD|@tDhC|C`DbBfCt@nB~@vDf@nEVrGCvI[zIm@nG}@nGiHtb@cD`SkFx[uK|s@qNvz@iEtPaGfRcEpIgF|EiFbC{FvAgIhAgJf@gKVqQBcF@}~@^{gAnCm\\tBsp@v@g}@Ki]vAiYzCuWbFe`BtTqe@tGct@~JinAdRal@hIaWfD_Y`CqMf@}Ll@yK\\sONsP@c`@BcXmAoGi@qIw@{[qDcQuC}K_CgQiEuXwI{OaGqP{HeYyMaPkHqR_JmT{JqUkKkI}De|Asv@qm@yZ{mAom@udAoh@ci@wWmf@aUmZsLe^mMk^oK{\\qIcYeGyRqDmN_CyLaBcLoAwJw@_Jo@iOy@mMg@iUo@oMQmKG{SIoKXoIXmPt@iO`AeJp@kP`BmJlAcKvAgY~EiVbFqRlEmf@rLebAjVyZfHcLfCed@zKqm@jNge@jK{r@hLmh@rH{r@|Hm]jDcd@jD}b@rCu^~AocAjDma@`@qWFy[Nca@i@uk@iAm{@uBw`@qBmc@gDe^uDgsAsOmuAuOgp@uJaXuEkV_Fq_@uIyU_GwA_@aQcFcScGwGmBge@{OaXcKiWoKg]iOeTwKqRgKgAi@mRgKwWwM{TgLsNeHw`@aSyX}NsYkPqe@gYgZkTaIgGgGeEkJwFyKwGiLaGaOmIkJwE_IkD_T{HyOkF}EeBqDkAun@uU}IgDwQeLiKkGcNcIgCeAaVsLmPcHw[eMc^_OekAyh@yNwGk~A}s@gu@e\\y_CcbAmgBow@i{@w`@sQkIweAeh@afAyg@gJoEkZyMiFwCsFeDeIaFmFeDwFoDaHwE}FuE_M_JwOiMqGgFwMsLeTeSyIaJwIcJwI_KuOcRaKaNg_@wg@kIiM_P}SoPoWyVo\\eTsYuFoHeb@ug@iP_T_PkToGoHuJcK_HqHqOkNyQ_NuPyMmKwGcP}Io]wSoWsL{UeJ_VgJuU_Is^}IwUaGwn@_UqK_EeNkF}OeGcKaFoJeF{NcKgJkHwIeHgIkHiFwEoIyIyMsR}HeLkIuMuG}KmFgMaIcS{FuPmGiQ{GsQ{GoSeWet@g^kiAye@efAia@yoAoKoZqImUsNw\\gLuSyIwMcAsAiL_OmKaLmLoLiN{KeMqJoYeQwPcIoMwEmLeDoNkDqRoDqPwByv@uHscDo[iw@{Go|@}IesAoMkfA_Lc\\gD}RiDoRsEa[wJsXcLeWmMqXuPuZmUoUyTkTmVmRaW_R}YiQ_\\cOg[eO}]iMo\\iM}]cLc^aLs`@gJu^kJea@yHga@uGi_@_G{`@kFyb@{CyYeDy^yCob@oBu_@eB}a@eHchB}EgkA}Ac\\qBuYuDg\\aFm\\aI}^kDiMgDeLiIcUm@eB{K_WiJiR{NyTyJqNwM{O}VcVkQ_NeQ_LeRaKiR{HgQeGySgFsSsDoRoBuSaAaYIqSf@srAjMq{AvQgjExe@yb@vCw[xAc\\JuYSqb@kBqY{Ba[cEyZ_Fab@yJqZeJaXsJoRqIwR_Js\\uQuXkQezAkdAyWmPig@mZqb@aU}m@qXwwAwi@_c@_Ti^mRg_@{SabBkbAq^mTur@cd@cQyLiKkJgJyJcJeMyGwLuFeMgFsNuDuNcDePsB_PoAmO}@aRQeUbGiqRHed@?_e@IoUQyV]sWm@eX{@}YaAuZiCui@gDem@wEyp@eG}p@sHeq@{H}n@}Ikm@uHed@mu@oeE{Fg^eAoGiDwWaDeYwCs\\oCoa@uBqb@qAo\\cCmdAu@c\\_Ko`FqCodAqAui@kAaXgBgVs@_IeAuJcDwTyDwR_FsRkF{QiGoQ{HoRmGoM{IsOoJiNmb@wf@oGuIqHyL}G}MkF{MwEqO}DgQqCePeBsPmAgQe@_QOqTd@uQdAcP|B{SpDcTpD}O|FuR`KyVzVan@dQ}^jLaYpN{a@rIk[dIo`@bSekAtMsu@pK{n@nFwXbFgT|FeT|HmUdKsUnIiOxKsPpKoMtKoLpNiM`OyJzS{Lfn@u\\nPkKtNsL~MwNfKeOdKoSdJqW`GaT~Io_@`F}S|Im]nHwUbGeOnFyLtIqOzJoMfJ{JxMaLnPkLro@m`@rOyKrMwKlNmOpKsNbJyOjL{U|e@qeAvKaVje@mdAfLgXxAaEdGiP~F_RhGsUdE{WrAgP~@kWXaXW{XeAkXaLopBeEep@qTizDoBk[}YegFsDsh@}B}SiDgT_A{DuCwL_GiR}KcUmJaOgMiO{MiLwPoLso@kb@sNeKyMaLyNuO_RmU{`@ih@wRwU_QyQ{T{RcMmIae@iZcg@_[gN_LqHsGaJmJ_J}L}FaK_GeL{H_SwDsMoD_PeCmNaB{NcAmNe@iRCkUp@cZnAe[tQkaD|Cmp@fBkf@pAcl@`A{q@x@sx@bJswJfDiqFj@_j@j@iu@Tss@DwmAu@ehBc@i^_Am]cBwVwBsTuDmVwF_WwGwUmIiUuKkVcNsYeGkLgl@cjAkJwRiKkVkIyUoKw\\gJq_@gGyWkFeZyEg\\yCiWiCcZeBcXoA}[u@mZUc[Vu_@v@q]dAoXlAqQ`AiN~Dwb@vIu{@vDq_@|MgtAbNm{@tBcNtC_NhEiPrDsLzFaQdHiOxGmLdGuItHoHjGuC|KuDp@Uv_@iH|Qe@hJWlHAna@fBbYfFb]zHvf@pLjc@vJlBXvhAxXdUhNxHzJzEhGbK`R|Tn_@|CjFnE~Hp@lAnJdQ`GzHrDpGbDbGfErHhUx^bT~W|@hAt[`^jW|VbU`SbFnDr@f@hFvDjGlEpUjPdQ~LzXhNdOlHbThKrb@vSjOhHvBdArXrMvTrJxu@nYpn@nPzD`ApYdI|LfDxUnG|Ab@rDhAxAb@fKnEdZtQb]bT`FzB|CvBh`@|V~n@b^pDnCnDzDlCpKhDsDnBaCz[{`@|E_GjFmGNMrDaDzGgFhIuErDwAd@GlA]fBc@jEmAjEgAzJsAzKeAb[kAfGKtEEfIOdIMhCG~MSzIOhYY`D?hMHxE@hCFnC?bEAxGB|D?fSDxP@`LArB?b[^ny@Dh_ATnIAfIHjJCtFEjGIlCAdKK`QE|SIl[Khu@WxAc@xFmBdEMnCIxDKvIU|NQfFMbDFlFOdX_@nJErSU|AAvCCbUOrOMhCAnGEpDExLIfBAnAAfBCxDE~CErICnLQlEIdMM|EGt[e@zDEhV]lCExBApYSxd@[zA@vFDbGEbERd`@hBrDNzz@nEd_@hBve@`Cr]dBdz@dEpGZpVpAh@DzJl@fQhAnWzArAFzXjAxBHdUhA|[`BbZrAjg@pBzKb@n^tA`CJ~I\\nFR`J^fBFfENbL^vBJtAFfMj@bDNbLf@bI\\zGTpEX`b@bB`CJlCJhADjOn@lCJ`DLrCJpd@fB`ZpAzCNpCJxw@nCjK^zTv@tTt@lVz@zK^fJ\\td@dBxCJvMh@rGVnNh@nVx@lCHtUv@tSp@vEPfDJ`JZxVx@tCJre@|A|CJnBDP?~HB~CA|CC|AC`FI~HU|CMhLu@tCSEsGGaLKgLqCHaHR{KP@bA" + } ], + "waypoints" : [ { + "distance" : 1.763, + "name" : "Hollywood Road", + "location" : [ -77.206788, 38.876664 ] + }, { + "distance" : 0.301, + "name" : "", + "location" : [ -77.027674, 38.957716 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_4453.json b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_4453.json new file mode 100644 index 000000000000..321aae70af10 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_DC_4453.json @@ -0,0 +1,2438 @@ +{ + "routes" : [ { + "voiceLocale" : "en", + "weight_name" : "auto", + "weight" : 1179.039, + "duration" : 582.04, + "distance" : 4453.001, + "legs" : [ { + "via_waypoints" : [ ], + "admins" : [ { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + } ], + "weight" : 1179.039, + "duration" : 582.04, + "steps" : [ { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "4th Street Northeast", + "components" : [ { + "text" : "4th Street Northeast", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 9.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Drive east on L Street Northeast. Then Turn right onto 4th Street Northeast.", + "announcement" : "Drive east on L Street Northeast. Then Turn right onto 4th Street Northeast.", + "distanceAlongGeometry" : 9.0 + }, { + "ssmlAnnouncement" : "Turn right onto 4th Street Northeast.", + "announcement" : "Turn right onto 4th Street Northeast.", + "distanceAlongGeometry" : 2.3 + } ], + "intersections" : [ { + "bearings" : [ 90 ], + "entry" : [ true ], + "admin_index" : 0, + "out" : 0, + "geometry_index" : 0, + "location" : [ -77.000668, 38.903727 ] + } ], + "maneuver" : { + "instruction" : "Drive east on L Street Northeast.", + "type" : "depart", + "bearing_after" : 90, + "bearing_before" : 0, + "location" : [ -77.000668, 38.903727 ] + }, + "name" : "L Street Northeast", + "duration" : 1.906, + "distance" : 9.0, + "driving_side" : "right", + "weight" : 2.335, + "mode" : "driving", + "geometry" : "}yneiAv|vzqC?iE" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "K Street Northeast", + "components" : [ { + "text" : "K Street Northeast", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 135.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn right onto K Street Northeast.", + "announcement" : "Turn right onto K Street Northeast.", + "distanceAlongGeometry" : 58.2 + } ], + "intersections" : [ { + "entry" : [ false, true, true, false ], + "in" : 3, + "bearings" : [ 0, 90, 181, 270 ], + "duration" : 3.343, + "turn_weight" : 19.0, + "turn_duration" : 2.315, + "admin_index" : 0, + "out" : 2, + "weight" : 20.26, + "geometry_index" : 1, + "location" : [ -77.000567, 38.903727 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 1, 92, 180, 270 ], + "duration" : 12.876, + "turn_weight" : 14.0, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 29.75, + "geometry_index" : 2, + "location" : [ -77.000568, 38.90367 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 89, 180 ], + "duration" : 7.55, + "turn_weight" : 3.5, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 12.74, + "geometry_index" : 3, + "location" : [ -77.000572, 38.902996 ] + }, { + "bearings" : [ 0, 92, 179, 270 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_weight" : 14.0, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 4, + "location" : [ -77.000571, 38.902604 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto 4th Street Northeast.", + "type" : "turn", + "bearing_after" : 181, + "bearing_before" : 90, + "location" : [ -77.000567, 38.903727 ] + }, + "name" : "4th Street Northeast", + "duration" : 25.503, + "distance" : 135.0, + "driving_side" : "right", + "weight" : 78.85, + "mode" : "driving", + "geometry" : "}yneiAlvvzqCpB@bi@FnWAnBA`A?" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "North Capitol Street Northeast", + "components" : [ { + "text" : "North Capitol Street Northeast", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 731.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 700 meters.", + "announcement" : "Continue for 700 meters.", + "distanceAlongGeometry" : 721.0 + }, { + "ssmlAnnouncement" : "In 200 meters, Turn right onto North Capitol Street Northeast.", + "announcement" : "In 200 meters, Turn right onto North Capitol Street Northeast.", + "distanceAlongGeometry" : 242.6 + }, { + "ssmlAnnouncement" : "Turn right onto North Capitol Street Northeast.", + "announcement" : "Turn right onto North Capitol Street Northeast.", + "distanceAlongGeometry" : 69.3 + } ], + "intersections" : [ { + "entry" : [ true, true, true, false ], + "in" : 3, + "bearings" : [ 90, 180, 270, 359 ], + "duration" : 5.36, + "turn_weight" : 19.0, + "turn_duration" : 4.208, + "admin_index" : 0, + "out" : 2, + "weight" : 20.411, + "geometry_index" : 6, + "location" : [ -77.00057, 38.902515 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 3, 90, 183, 270 ], + "duration" : 4.903, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 12.998, + "geometry_index" : 7, + "location" : [ -77.000661, 38.902515 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 270 ], + "duration" : 3.175, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.631, + "geometry_index" : 8, + "location" : [ -77.001057, 38.902513 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 180, 270 ], + "duration" : 3.031, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.454, + "geometry_index" : 9, + "location" : [ -77.001308, 38.902514 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 270 ], + "duration" : 4.903, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 7.748, + "geometry_index" : 10, + "location" : [ -77.001547, 38.902514 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 179, 271, 359 ], + "duration" : 1.159, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.411, + "geometry_index" : 11, + "location" : [ -77.001944, 38.902513 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 0, 91, 180, 270 ], + "duration" : 1.461, + "turn_weight" : 7.0, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 3, + "weight" : 8.764, + "geometry_index" : 12, + "location" : [ -77.002037, 38.902514 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 179, 270, 359 ], + "duration" : 16.567, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 27.286, + "geometry_index" : 13, + "location" : [ -77.00215, 38.902514 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 182, 270, 359 ], + "duration" : 1.015, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.235, + "geometry_index" : 14, + "location" : [ -77.003474, 38.902515 ] + }, { + "entry" : [ false, true, true, true, true ], + "in" : 0, + "bearings" : [ 90, 179, 270, 315, 359 ], + "duration" : 2.871, + "turn_weight" : 14.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 15.058, + "geometry_index" : 15, + "location" : [ -77.003558, 38.902515 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 180, 270 ], + "duration" : 0.583, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 7.706, + "geometry_index" : 17, + "location" : [ -77.00363, 38.902515 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 270 ], + "duration" : 18.72, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 1, + "weight" : 24.682, + "geometry_index" : 18, + "location" : [ -77.003678, 38.902515 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 270 ], + "duration" : 6.336, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 1, + "weight" : 9.512, + "geometry_index" : 21, + "location" : [ -77.005176, 38.902517 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 82, 90, 101, 270 ], + "duration" : 1.015, + "turn_weight" : 21.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 22.235, + "geometry_index" : 22, + "location" : [ -77.005685, 38.902517 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 182, 270 ], + "duration" : 0.871, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 8.058, + "geometry_index" : 23, + "location" : [ -77.005768, 38.902517 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 1, 90, 182, 270 ], + "duration" : 0.583, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 7.706, + "geometry_index" : 24, + "location" : [ -77.005839, 38.902517 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 0, 90, 182, 269 ], + "duration" : 3.603, + "turn_weight" : 14.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 3, + "weight" : 15.94, + "geometry_index" : 25, + "location" : [ -77.005887, 38.902517 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 1, 89, 182, 270 ], + "duration" : 4.183, + "turn_weight" : 7.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 12.116, + "geometry_index" : 26, + "location" : [ -77.006019, 38.902516 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 270 ], + "duration" : 5.472, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 1, + "weight" : 8.453, + "geometry_index" : 27, + "location" : [ -77.006358, 38.902516 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 179, 270 ], + "duration" : 2.311, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.572, + "geometry_index" : 28, + "location" : [ -77.006796, 38.902516 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 270 ], + "duration" : 3.175, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.631, + "geometry_index" : 29, + "location" : [ -77.006976, 38.902516 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 180, 270 ], + "duration" : 4.471, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 7.218, + "geometry_index" : 30, + "location" : [ -77.007229, 38.902516 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 180, 270 ], + "duration" : 3.607, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.16, + "geometry_index" : 31, + "location" : [ -77.00759, 38.902516 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 270, 359 ], + "duration" : 1.735, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 3.867, + "geometry_index" : 32, + "location" : [ -77.007884, 38.902515 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 270 ], + "duration" : 0.727, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.632, + "geometry_index" : 33, + "location" : [ -77.008018, 38.902515 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 179, 270 ], + "duration" : 3.895, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.513, + "geometry_index" : 34, + "location" : [ -77.008076, 38.902515 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 270 ], + "duration" : 1.735, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.867, + "geometry_index" : 35, + "location" : [ -77.008385, 38.902515 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 270 ], + "duration" : 4.752, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 1, + "weight" : 7.571, + "geometry_index" : 36, + "location" : [ -77.00852, 38.902515 ] + }, { + "bearings" : [ 90, 177, 270, 358 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 37, + "location" : [ -77.008898, 38.902515 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto K Street Northeast.", + "type" : "turn", + "bearing_after" : 270, + "bearing_before" : 179, + "location" : [ -77.00057, 38.902515 ] + }, + "name" : "K Street Northeast", + "duration" : 113.665, + "distance" : 731.0, + "driving_side" : "right", + "weight" : 293.198, + "mode" : "driving", + "geometry" : "enleiArvvzqC?tDBvWAtN?|M@xWAxD?`FAvqA?fD?jB?b@?~A?~A?XCxxA?x^?dD?lC?~A@fG?dT?jZ?fJ?xN?pU@jQ?jG?rB?hR?lG?rV?nF" + }, { + "bannerInstructions" : [ { + "secondary" : { + "text" : "New York Avenue", + "components" : [ { + "text" : "New York Avenue", + "type" : "text" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "North Capitol Street Northeast", + "components" : [ { + "text" : "North Capitol Street Northeast", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 307.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "In 300 meters, Keep right to stay on North Capitol Street Northeast.", + "announcement" : "In 300 meters, Keep right to stay on North Capitol Street Northeast.", + "distanceAlongGeometry" : 281.3 + }, { + "ssmlAnnouncement" : "Keep right to stay on North Capitol Street Northeast toward New York Avenue.", + "announcement" : "Keep right to stay on North Capitol Street Northeast toward New York Avenue.", + "distanceAlongGeometry" : 80.3 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 0, 90, 180, 270 ], + "duration" : 5.098, + "turn_weight" : 19.0, + "turn_duration" : 4.105, + "admin_index" : 0, + "out" : 0, + "weight" : 20.217, + "geometry_index" : 38, + "location" : [ -77.009018, 38.902515 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 89, 180, 270 ], + "duration" : 0.628, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.76, + "geometry_index" : 39, + "location" : [ -77.009018, 38.902586 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 180, 269 ], + "duration" : 10.186, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 12.47, + "geometry_index" : 40, + "location" : [ -77.009018, 38.902634 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 0, 180 ], + "duration" : 4.097, + "admin_index" : 0, + "out" : 0, + "weight" : 5.018, + "geometry_index" : 41, + "location" : [ -77.009016, 38.903367 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 90, 180, 270 ], + "duration" : 1.001, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.217, + "geometry_index" : 42, + "location" : [ -77.009016, 38.903662 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 0, 89, 181, 277 ], + "duration" : 1.138, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 1.369, + "geometry_index" : 43, + "location" : [ -77.009015, 38.903733 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 180, 270 ], + "duration" : 11.055, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 13.534, + "geometry_index" : 44, + "location" : [ -77.009015, 38.903816 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 1, 92, 180, 272 ], + "duration" : 1.001, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.217, + "geometry_index" : 45, + "location" : [ -77.009014, 38.904618 ] + }, { + "entry" : [ true, true, false, true ], + "in" : 2, + "bearings" : [ 0, 90, 181, 270 ], + "duration" : 5.979, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 7.299, + "geometry_index" : 46, + "location" : [ -77.009013, 38.904686 ] + }, { + "bearings" : [ 0, 180, 270 ], + "entry" : [ true, false, true ], + "in" : 1, + "turn_weight" : 5.25, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 47, + "location" : [ -77.009013, 38.905113 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto North Capitol Street Northeast.", + "type" : "turn", + "bearing_after" : 0, + "bearing_before" : 270, + "location" : [ -77.009018, 38.902515 ] + }, + "name" : "North Capitol Street Northeast", + "duration" : 42.299, + "distance" : 307.0, + "driving_side" : "right", + "weight" : 70.935, + "mode" : "driving", + "geometry" : "enleiArfg{qCmC?_B?yl@CmQ?mCAeD?cq@AgCAuY?qHA" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto U.S. 50, U.S. 1 Alternate.", + "announcement" : "Turn left onto U.S. 50, U.S. 1 Alternate.", + "distanceAlongGeometry" : 64.3 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 1, 16, 180 ], + "duration" : 4.24, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 5.17, + "geometry_index" : 48, + "location" : [ -77.009012, 38.905266 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 5, 92, 185, 272 ], + "duration" : 1.125, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 1.369, + "geometry_index" : 50, + "location" : [ -77.008931, 38.905563 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 185, 270 ], + "duration" : 3.39, + "turn_weight" : 14.0, + "turn_duration" : 2.024, + "admin_index" : 0, + "out" : 0, + "weight" : 15.673, + "geometry_index" : 51, + "location" : [ -77.008921, 38.905646 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 92, 180, 273 ], + "duration" : 9.69, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 11.861, + "geometry_index" : 52, + "location" : [ -77.008921, 38.905744 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 0, 90, 180 ], + "duration" : 6.214, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.603, + "geometry_index" : 53, + "location" : [ -77.008921, 38.906444 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 180, 360 ], + "duration" : 4.097, + "admin_index" : 0, + "out" : 1, + "weight" : 5.018, + "geometry_index" : 54, + "location" : [ -77.008921, 38.906889 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 0, 106, 180, 286 ], + "duration" : 0.628, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.76, + "geometry_index" : 55, + "location" : [ -77.008922, 38.907185 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 0, 90, 180, 275 ], + "duration" : 1.497, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.825, + "geometry_index" : 56, + "location" : [ -77.008922, 38.90723 ] + }, { + "bearings" : [ 1, 68, 180, 246 ], + "entry" : [ true, true, false, false ], + "in" : 2, + "turn_weight" : 28.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 57, + "location" : [ -77.008922, 38.907341 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "New York Avenue Northwest", + "components" : [ { + "text" : "New York Avenue Northwest", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 50; US 1 Alternate", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 244.0 + } ], + "destinations" : "New York Avenue", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right to stay on North Capitol Street Northeast toward New York Avenue.", + "type" : "fork", + "bearing_after" : 16, + "bearing_before" : 0, + "location" : [ -77.009012, 38.905266 ] + }, + "name" : "North Capitol Street Northeast", + "duration" : 34.376, + "distance" : 244.0, + "driving_side" : "right", + "weight" : 79.105, + "mode" : "driving", + "geometry" : "czqeiAffg{qCoEsBaKm@eDScE?wj@?yZ?oQ@yA?}E?yEC" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "6th Street Northwest", + "components" : [ { + "text" : "6th Street Northwest", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 1; US 50; I 395 Alt", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1044.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue on U.S. 50, New York Avenue Northwest for 1 kilometer.", + "announcement" : "Continue on U.S. 50, New York Avenue Northwest for 1 kilometer.", + "distanceAlongGeometry" : 1034.0 + }, { + "ssmlAnnouncement" : "In 400 meters, Turn left onto U.S. 1.", + "announcement" : "In 400 meters, Turn left onto U.S. 1.", + "distanceAlongGeometry" : 358.3 + }, { + "ssmlAnnouncement" : "Turn left onto U.S. 1, U.S. 50.", + "announcement" : "Turn left onto U.S. 1, U.S. 50.", + "distanceAlongGeometry" : 91.4 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 1, 66, 181, 246 ], + "duration" : 11.359, + "turn_weight" : 57.5, + "turn_duration" : 9.13, + "admin_index" : 0, + "out" : 3, + "weight" : 60.23, + "geometry_index" : 58, + "location" : [ -77.00892, 38.90745 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 0, 66, 182, 250 ], + "duration" : 2.61, + "turn_weight" : 14.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.01, + "admin_index" : 0, + "out" : 3, + "weight" : 14.735, + "geometry_index" : 59, + "location" : [ -77.009191, 38.907358 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 70, 175, 248, 351 ], + "duration" : 1.906, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 2.31, + "geometry_index" : 60, + "location" : [ -77.009268, 38.907336 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 68, 247, 270 ], + "duration" : 5.249, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "weight" : 6.405, + "geometry_index" : 62, + "location" : [ -77.009509, 38.907262 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 23, 67, 246 ], + "duration" : 5.506, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 6.72, + "geometry_index" : 63, + "location" : [ -77.01015, 38.907046 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 66, 246, 334 ], + "duration" : 10.121, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 12.39, + "geometry_index" : 64, + "location" : [ -77.01082, 38.906811 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 66, 172, 244, 351 ], + "duration" : 0.878, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 1.05, + "geometry_index" : 65, + "location" : [ -77.012061, 38.906378 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 64, 180, 248, 359 ], + "duration" : 3.038, + "turn_duration" : 2.01, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 66, + "location" : [ -77.012164, 38.906339 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 68, 173, 245, 353 ], + "duration" : 11.079, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 2, + "weight" : 13.545, + "geometry_index" : 67, + "location" : [ -77.012295, 38.906297 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 0, 65, 247 ], + "duration" : 3.779, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.62, + "geometry_index" : 68, + "location" : [ -77.01365, 38.905814 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 67, 247, 270 ], + "duration" : 2.935, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "weight" : 3.57, + "geometry_index" : 69, + "location" : [ -77.014119, 38.905662 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 67, 247 ], + "duration" : 1.371, + "admin_index" : 0, + "out" : 1, + "weight" : 1.68, + "geometry_index" : 70, + "location" : [ -77.014479, 38.905542 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 67, 159, 247, 339 ], + "duration" : 0.621, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 0.735, + "geometry_index" : 71, + "location" : [ -77.014651, 38.905485 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 67, 151, 247, 334 ], + "duration" : 0.706, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 0.84, + "geometry_index" : 72, + "location" : [ -77.014725, 38.905461 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 67, 160, 247, 341 ], + "duration" : 2.964, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 2, + "weight" : 8.155, + "geometry_index" : 73, + "location" : [ -77.014808, 38.905433 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 67, 153, 247, 336 ], + "duration" : 0.449, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 0.525, + "geometry_index" : 74, + "location" : [ -77.014922, 38.905396 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 67, 160, 247, 341 ], + "duration" : 1.992, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 2.415, + "geometry_index" : 75, + "location" : [ -77.014974, 38.905379 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 67, 246 ], + "duration" : 1.286, + "admin_index" : 0, + "out" : 1, + "weight" : 1.575, + "geometry_index" : 76, + "location" : [ -77.015217, 38.9053 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 66, 246 ], + "duration" : 6.6, + "admin_index" : 0, + "out" : 1, + "weight" : 8.085, + "geometry_index" : 77, + "location" : [ -77.01537, 38.905247 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 0, 65, 182, 248 ], + "duration" : 3.037, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left", "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 2.008, + "admin_index" : 0, + "out" : 3, + "weight" : 1.26, + "geometry_index" : 80, + "location" : [ -77.016182, 38.904961 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 68, 177, 241, 356 ], + "duration" : 3.888, + "turn_duration" : 0.03, + "admin_index" : 0, + "out" : 2, + "weight" : 4.725, + "geometry_index" : 81, + "location" : [ -77.01631, 38.90492 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 62, 246 ], + "duration" : 4.971, + "admin_index" : 0, + "out" : 1, + "weight" : 6.09, + "geometry_index" : 84, + "location" : [ -77.016772, 38.904727 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 66, 246, 336 ], + "duration" : 3.864, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 4.725, + "geometry_index" : 85, + "location" : [ -77.017386, 38.90451 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 66, 245 ], + "duration" : 2.657, + "admin_index" : 0, + "out" : 1, + "weight" : 3.255, + "geometry_index" : 86, + "location" : [ -77.017859, 38.904343 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 65, 237, 267 ], + "duration" : 2.347, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.033, + "admin_index" : 0, + "out" : 1, + "weight" : 2.835, + "geometry_index" : 87, + "location" : [ -77.018188, 38.904226 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 53, 76, 247 ], + "duration" : 3.017, + "turn_duration" : 0.017, + "admin_index" : 0, + "out" : 2, + "weight" : 3.675, + "geometry_index" : 89, + "location" : [ -77.018436, 38.904086 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 67, 176, 245, 355 ], + "duration" : 0.965, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 2, + "weight" : 1.155, + "geometry_index" : 91, + "location" : [ -77.018813, 38.903964 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 0, 65, 179, 246 ], + "duration" : 3.036, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 3, + "weight" : 1.26, + "geometry_index" : 92, + "location" : [ -77.018931, 38.903921 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 4, 66, 184, 247 ], + "duration" : 2.236, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 2.73, + "geometry_index" : 93, + "location" : [ -77.019062, 38.903876 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 67, 246, 351 ], + "duration" : 2.249, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 1, + "weight" : 2.73, + "geometry_index" : 95, + "location" : [ -77.01934, 38.903783 ] + }, { + "entry" : [ false, true, false, true ], + "in" : 0, + "bearings" : [ 66, 160, 224, 268 ], + "duration" : 1.228, + "turn_weight" : 7.875, + "turn_duration" : 0.028, + "admin_index" : 0, + "out" : 3, + "weight" : 9.345, + "geometry_index" : 96, + "location" : [ -77.019612, 38.90369 ] + }, { + "bearings" : [ 88, 177, 246, 358 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_duration" : 0.104, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 97, + "location" : [ -77.01977, 38.903685 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto US 50/US 1 Alternate/New York Avenue Northwest. Continue on US 50/New York Avenue Northwest.", + "type" : "turn", + "bearing_after" : 250, + "bearing_before" : 1, + "location" : [ -77.00892, 38.90745 ] + }, + "name" : "New York Avenue Northwest", + "duration" : 109.164, + "distance" : 1044.0, + "driving_side" : "right", + "weight" : 195.995, + "mode" : "driving", + "ref" : "US 50; US 1 Alternate", + "geometry" : "sbveiAn`g{qCvD|Oj@xC^fBrBxJnL`g@tMzh@`ZplAlAlErAdGd]tsAnHh\\nFnUpBvIn@rCv@dDhAbF`@fB|CdNhBpHjBrHrJb`@zA~FpA~F`DxJrCbJjA|DpLje@lIp\\hFpSpCzJdCrBpEdS`@jBtAjFxAdGv@zC`CnKxD~OHzH|AhG" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "end of road", + "modifier" : "right", + "text" : "Constitution Avenue Northwest", + "components" : [ { + "text" : "Constitution Avenue Northwest", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 1; US 50", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1288.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue on U.S. 1, U.S. 50 for 1.5 kilometers.", + "announcement" : "Continue on U.S. 1, U.S. 50 for 1.5 kilometers.", + "distanceAlongGeometry" : 1278.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn right onto U.S. 1.", + "announcement" : "In 300 meters, Turn right onto U.S. 1.", + "distanceAlongGeometry" : 290.2 + }, { + "ssmlAnnouncement" : "Turn right onto U.S. 1, U.S. 50.", + "announcement" : "Turn right onto U.S. 1, U.S. 50.", + "distanceAlongGeometry" : 74.1 + } ], + "intersections" : [ { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 66, 180, 246, 359 ], + "duration" : 5.248, + "turn_weight" : 26.25, + "turn_duration" : 4.134, + "admin_index" : 0, + "out" : 1, + "weight" : 27.615, + "geometry_index" : 98, + "location" : [ -77.019903, 38.903638 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 0, 68, 179, 246 ], + "duration" : 2.791, + "turn_weight" : 14.0, + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 2, + "weight" : 14.945, + "geometry_index" : 99, + "location" : [ -77.019904, 38.903521 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 69, 180, 251, 359 ], + "duration" : 1.722, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 2.1, + "geometry_index" : 100, + "location" : [ -77.019903, 38.90344 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 270 ], + "duration" : 5.835, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 7.14, + "geometry_index" : 101, + "location" : [ -77.019902, 38.903262 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 90, 181, 270 ], + "duration" : 0.608, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 0.735, + "geometry_index" : 103, + "location" : [ -77.019906, 38.902655 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 1, 90, 180, 270 ], + "duration" : 0.705, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 0.84, + "geometry_index" : 104, + "location" : [ -77.019907, 38.902589 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 90, 180, 277 ], + "duration" : 2.521, + "turn_weight" : 7.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 7.63, + "geometry_index" : 105, + "location" : [ -77.019907, 38.902521 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 90, 181, 270 ], + "duration" : 0.436, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 0.525, + "geometry_index" : 106, + "location" : [ -77.019907, 38.90247 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 1, 92, 180, 270 ], + "duration" : 7.733, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 9.45, + "geometry_index" : 107, + "location" : [ -77.019908, 38.902424 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 110, 180, 289 ], + "duration" : 1.378, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.68, + "geometry_index" : 109, + "location" : [ -77.019905, 38.901619 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 114, 180, 294 ], + "duration" : 3.293, + "turn_weight" : 14.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 15.575, + "geometry_index" : 110, + "location" : [ -77.019906, 38.901472 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 130, 180, 308 ], + "duration" : 1.978, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.415, + "geometry_index" : 111, + "location" : [ -77.019906, 38.901335 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 279 ], + "duration" : 1.55, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.89, + "geometry_index" : 112, + "location" : [ -77.019907, 38.901127 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 89, 180, 269 ], + "duration" : 0.864, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.05, + "geometry_index" : 113, + "location" : [ -77.019907, 38.900967 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 92, 180, 270 ], + "duration" : 2.95, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.155, + "geometry_index" : 114, + "location" : [ -77.019908, 38.900876 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 89, 180, 269 ], + "duration" : 5.15, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.3, + "geometry_index" : 115, + "location" : [ -77.019908, 38.90078 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 0, 180 ], + "duration" : 0.771, + "admin_index" : 0, + "out" : 1, + "weight" : 0.945, + "geometry_index" : 116, + "location" : [ -77.01991, 38.90024 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 92, 180 ], + "duration" : 2.321, + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.835, + "geometry_index" : 117, + "location" : [ -77.01991, 38.900161 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 89, 180, 269 ], + "duration" : 1.035, + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 118, + "location" : [ -77.019911, 38.899922 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 89, 180, 270 ], + "duration" : 3.121, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.365, + "geometry_index" : 119, + "location" : [ -77.019911, 38.899818 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 93, 180, 272 ], + "duration" : 9.693, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 11.865, + "geometry_index" : 120, + "location" : [ -77.01991, 38.899702 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 270 ], + "duration" : 2.407, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 2.94, + "geometry_index" : 121, + "location" : [ -77.019908, 38.898683 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 180, 270 ], + "duration" : 1.121, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.365, + "geometry_index" : 122, + "location" : [ -77.019908, 38.898434 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 90, 180 ], + "duration" : 3.035, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 123, + "location" : [ -77.019908, 38.898319 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 92, 180, 270 ], + "duration" : 7.207, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.82, + "geometry_index" : 124, + "location" : [ -77.019908, 38.898211 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 92, 180, 270 ], + "duration" : 1.035, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 125, + "location" : [ -77.019906, 38.897454 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 89, 180, 270 ], + "duration" : 3.035, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 126, + "location" : [ -77.019907, 38.897347 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 92, 180, 270 ], + "duration" : 9.435, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 11.55, + "geometry_index" : 127, + "location" : [ -77.019908, 38.897243 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 97, 180, 277 ], + "duration" : 1.121, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.365, + "geometry_index" : 128, + "location" : [ -77.019905, 38.896253 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 0, 90, 180, 273 ], + "duration" : 2.95, + "turn_weight" : 7.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.155, + "geometry_index" : 129, + "location" : [ -77.019905, 38.896132 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 92, 180, 270 ], + "duration" : 11.064, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 13.545, + "geometry_index" : 130, + "location" : [ -77.019904, 38.896031 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 92, 181, 270 ], + "duration" : 0.694, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 0.84, + "geometry_index" : 131, + "location" : [ -77.019913, 38.894873 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 1, 89, 180, 270 ], + "duration" : 2.791, + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 2, + "weight" : 0.945, + "geometry_index" : 132, + "location" : [ -77.019914, 38.894802 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 86, 180, 267 ], + "duration" : 1.635, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.995, + "geometry_index" : 133, + "location" : [ -77.019914, 38.894718 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 63, 180, 241 ], + "duration" : 1.121, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.365, + "geometry_index" : 134, + "location" : [ -77.019915, 38.894546 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 0, 68, 180, 246 ], + "duration" : 3.293, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.575, + "geometry_index" : 135, + "location" : [ -77.019916, 38.894426 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 70, 180, 252 ], + "duration" : 5.835, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 7.14, + "geometry_index" : 136, + "location" : [ -77.019917, 38.894293 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 77, 181, 258 ], + "duration" : 0.779, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 0.945, + "geometry_index" : 137, + "location" : [ -77.01992, 38.893681 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 1, 90, 179 ], + "duration" : 3.049, + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 2, + "weight" : 1.26, + "geometry_index" : 138, + "location" : [ -77.019921, 38.893604 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 100, 180, 282, 359 ], + "duration" : 4.893, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 5.985, + "geometry_index" : 139, + "location" : [ -77.019918, 38.893498 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 110, 180, 291 ], + "duration" : 1.378, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.68, + "geometry_index" : 140, + "location" : [ -77.019914, 38.892987 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 0, 108, 179, 290 ], + "duration" : 2.791, + "turn_weight" : 14.0, + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 2, + "weight" : 14.945, + "geometry_index" : 141, + "location" : [ -77.019914, 38.892844 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 110, 179, 289, 359 ], + "duration" : 2.864, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 1, + "weight" : 1.05, + "geometry_index" : 142, + "location" : [ -77.019913, 38.892762 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 108, 180, 290, 359 ], + "duration" : 3.036, + "turn_weight" : 14.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 1, + "weight" : 15.26, + "geometry_index" : 144, + "location" : [ -77.019912, 38.892676 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 108, 180, 289 ], + "duration" : 3.093, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.78, + "geometry_index" : 145, + "location" : [ -77.019911, 38.892568 ] + }, { + "bearings" : [ 0, 92, 179, 272 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 146, + "location" : [ -77.019908, 38.892244 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto US 1/US 50/I 395 Alt/6th Street Northwest. Continue on US 1/US 50/6th Street Northwest.", + "type" : "turn", + "bearing_after" : 179, + "bearing_before" : 246, + "location" : [ -77.019903, 38.903638 ] + }, + "name" : "6th Street Northwest", + "duration" : 142.931, + "distance" : 1288.0, + "driving_side" : "right", + "weight" : 238.49, + "mode" : "driving", + "ref" : "US 1; US 50; I 395 Alt", + "geometry" : "ktneiA|n|{qChF@`DAbJA|a@F~A?bC@fC?dB?zA@rH?tg@EdH@pG?~K@~H?tD@~D?v`@B|C?|M@nE?fFAt~@CpN?dF?vE?hn@CtE@nE@z|@EpF?hEAjgAPlC@fD?vI@nF@hG@fe@DxC@rEE|^G|G?bDAb@?fCAvEAfSEhIC" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "7th Street Northwest", + "components" : [ { + "text" : "7th Street Northwest", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 175.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto 7th Street Northwest.", + "announcement" : "Turn left onto 7th Street Northwest.", + "distanceAlongGeometry" : 116.5 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 90, 270, 359 ], + "duration" : 7.123, + "turn_weight" : 7.0, + "turn_duration" : 4.208, + "admin_index" : 0, + "out" : 1, + "weight" : 10.57, + "geometry_index" : 147, + "location" : [ -77.019906, 38.892079 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 180, 270 ], + "duration" : 5.407, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.615, + "geometry_index" : 148, + "location" : [ -77.020299, 38.89208 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 270 ], + "duration" : 5.4, + "admin_index" : 0, + "out" : 1, + "weight" : 6.48, + "geometry_index" : 149, + "location" : [ -77.021022, 38.892081 ] + }, { + "bearings" : [ 90, 175, 270, 353 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 150, + "location" : [ -77.021745, 38.892081 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto US 1/US 50/Constitution Avenue Northwest.", + "type" : "end of road", + "bearing_after" : 270, + "bearing_before" : 179, + "location" : [ -77.019906, 38.892079 ] + }, + "name" : "Constitution Avenue Northwest", + "duration" : 19.222, + "distance" : 175.0, + "driving_side" : "right", + "weight" : 25.208, + "mode" : "driving", + "ref" : "US 1; US 50", + "geometry" : "}axdiAbo|{qCApWAdl@?dl@ArI" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Madison Drive Northwest", + "components" : [ { + "text" : "Madison Drive Northwest", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 171.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn right onto Madison Drive Northwest.", + "announcement" : "Turn right onto Madison Drive Northwest.", + "distanceAlongGeometry" : 80.4 + } ], + "intersections" : [ { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 0, 90, 178, 270 ], + "duration" : 9.839, + "turn_weight" : 43.75, + "turn_duration" : 7.729, + "admin_index" : 0, + "out" : 2, + "weight" : 46.282, + "geometry_index" : 151, + "location" : [ -77.021915, 38.892082 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 92, 181, 270, 358 ], + "duration" : 5.471, + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 1, + "weight" : 6.554, + "geometry_index" : 152, + "location" : [ -77.021909, 38.891926 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 1, 90, 180 ], + "duration" : 6.723, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 8.044, + "geometry_index" : 153, + "location" : [ -77.021916, 38.891528 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 0, 90, 180 ], + "duration" : 5.593, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.703, + "geometry_index" : 154, + "location" : [ -77.021915, 38.891046 ] + }, { + "bearings" : [ 0, 92, 180, 270 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 155, + "location" : [ -77.021914, 38.890644 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto 7th Street Northwest.", + "type" : "turn", + "bearing_after" : 178, + "bearing_before" : 270, + "location" : [ -77.021915, 38.892082 ] + }, + "name" : "7th Street Northwest", + "duration" : 28.998, + "distance" : 171.0, + "driving_side" : "right", + "weight" : 69.223, + "mode" : "driving", + "geometry" : "cbxdiAtl`|qCvHKzWLb]AbXAfE@" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "text" : "You have arrived at your destination.", + "components" : [ { + "text" : "You have arrived at your destination.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 349.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 300 meters.", + "announcement" : "Continue for 300 meters.", + "distanceAlongGeometry" : 339.0 + }, { + "ssmlAnnouncement" : "In 200 meters, You will arrive at your destination.", + "announcement" : "In 200 meters, You will arrive at your destination.", + "distanceAlongGeometry" : 204.1 + }, { + "ssmlAnnouncement" : "You have arrived at your destination.", + "announcement" : "You have arrived at your destination.", + "distanceAlongGeometry" : 58.3 + } ], + "intersections" : [ { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 0, 89, 180, 270 ], + "duration" : 6.334, + "turn_weight" : 14.3, + "turn_duration" : 4.105, + "admin_index" : 0, + "out" : 3, + "weight" : 16.974, + "geometry_index" : 156, + "location" : [ -77.021915, 38.890544 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 180, 269, 359 ], + "duration" : 13.048, + "turn_weight" : 12.4, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 28.034, + "geometry_index" : 157, + "location" : [ -77.02207, 38.890544 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 1, 89, 182, 269 ], + "duration" : 12.521, + "turn_weight" : 12.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 27.417, + "geometry_index" : 158, + "location" : [ -77.02295, 38.89053 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 89, 270, 359 ], + "duration" : 4.293, + "turn_weight" : 3.1, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 8.243, + "geometry_index" : 159, + "location" : [ -77.023796, 38.890519 ] + }, { + "bearings" : [ 1, 90, 179, 273 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "turn_weight" : 12.4, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 161, + "location" : [ -77.024086, 38.89052 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Madison Drive Northwest.", + "type" : "turn", + "bearing_after" : 270, + "bearing_before" : 180, + "location" : [ -77.021915, 38.890544 ] + }, + "name" : "Madison Drive Northwest", + "duration" : 63.976, + "distance" : 349.0, + "driving_side" : "right", + "weight" : 125.7, + "mode" : "driving", + "geometry" : "_budiAtl`|qC?tHZ~u@Tzs@BrMEnB[`Rp@|`B" + }, { + "intersections" : [ { + "bearings" : [ 89 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 0, + "geometry_index" : 163, + "location" : [ -77.025958, 38.890509 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "instruction" : "You have arrived at your destination.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 269, + "location" : [ -77.025958, 38.890509 ] + }, + "name" : "Madison Drive Northwest", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "y_udiAjih|qC??" + } ], + "distance" : 4453.001, + "summary" : "US 50, US 1" + } ], + "geometry" : "}yneiAv|vzqC?iEpB@bi@FnWAnBA`A??tDBvWAtN?|M@xWAxD?`FAvqA?fD?jB?b@?~A?~A?XCxxA?x^?dD?lC?~A@fG?dT?jZ?fJ?xN?pU@jQ?jG?rB?hR?lG?rV?nFmC?_B?yl@CmQ?mCAeD?cq@AgCAuY?qHAoEsBaKm@eDScE?wj@?yZ?oQ@yA?}E?yECvD|Oj@xC^fBrBxJnL`g@tMzh@`ZplAlAlErAdGd]tsAnHh\\nFnUpBvIn@rCv@dDhAbF`@fB|CdNhBpHjBrHrJb`@zA~FpA~F`DxJrCbJjA|DpLje@lIp\\hFpSpCzJdCrBpEdS`@jBtAjFxAdGv@zC`CnKxD~OHzH|AhGhF@`DAbJA|a@F~A?bC@fC?dB?zA@rH?tg@EdH@pG?~K@~H?tD@~D?v`@B|C?|M@nE?fFAt~@CpN?dF?vE?hn@CtE@nE@z|@EpF?hEAjgAPlC@fD?vI@nF@hG@fe@DxC@rEE|^G|G?bDAb@?fCAvEAfSEhICApWAdl@?dl@ArIvHKzWLb]AbXAfE@?tHZ~u@Tzs@BrMEnB[`Rp@|`B" + } ], + "waypoints" : [ { + "distance" : 3.533, + "name" : "L Street Northeast", + "location" : [ -77.000668, 38.903727 ] + }, { + "distance" : 0.403, + "name" : "Madison Drive Northwest", + "location" : [ -77.025958, 38.890509 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_20753.json b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_20753.json new file mode 100644 index 000000000000..dc8ca4e9f409 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_20753.json @@ -0,0 +1,4318 @@ +{ + "routes" : [ { + "voiceLocale" : "en", + "weight_name" : "auto", + "weight" : 1754.394, + "duration" : 1181.215, + "distance" : 20753.215, + "legs" : [ { + "via_waypoints" : [ ], + "admins" : [ { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + } ], + "weight" : 1754.394, + "duration" : 1181.215, + "steps" : [ { + "bannerInstructions" : [ { + "primary" : { + "type" : "end of road", + "modifier" : "right", + "text" : "Sloat Boulevard", + "components" : [ { + "text" : "Sloat Boulevard", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 97.216 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Drive south on 46th Avenue. Then Turn right onto Sloat Boulevard.", + "announcement" : "Drive south on 46th Avenue. Then Turn right onto Sloat Boulevard.", + "distanceAlongGeometry" : 97.2 + }, { + "ssmlAnnouncement" : "Turn right onto Sloat Boulevard.", + "announcement" : "Turn right onto Sloat Boulevard.", + "distanceAlongGeometry" : 24.3 + } ], + "intersections" : [ { + "entry" : [ true ], + "bearings" : [ 177 ], + "duration" : 3.443, + "admin_index" : 0, + "out" : 0, + "weight" : 3.443, + "geometry_index" : 0, + "location" : [ -122.504263, 37.736431 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 86, 177, 267, 357 ], + "duration" : 2.019, + "turn_weight" : 7.2, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 9.2, + "geometry_index" : 2, + "location" : [ -122.504253, 37.736276 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 3, + "bearings" : [ 89, 177, 267, 357 ], + "duration" : 1.819, + "turn_weight" : 7.2, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 9.0, + "geometry_index" : 3, + "location" : [ -122.504246, 37.736184 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 86, 177, 266, 357 ], + "duration" : 6.019, + "turn_weight" : 7.2, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 13.2, + "geometry_index" : 4, + "location" : [ -122.50424, 37.736101 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 86, 177, 357 ], + "duration" : 4.219, + "turn_weight" : 1.8, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 6.0, + "geometry_index" : 6, + "location" : [ -122.504222, 37.735835 ] + }, { + "bearings" : [ 89, 177, 270, 357 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_weight" : 7.2, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 8, + "location" : [ -122.504209, 37.735649 ] + } ], + "maneuver" : { + "instruction" : "Drive south on 46th Avenue.", + "type" : "depart", + "bearing_after" : 177, + "bearing_before" : 0, + "location" : [ -122.504263, 37.736431 ] + }, + "name" : "46th Avenue", + "duration" : 19.539, + "distance" : 97.216, + "driving_side" : "right", + "weight" : 50.043, + "mode" : "driving", + "geometry" : "}}f~fAlcathFdGQn@AvDMdDKd@AlNa@`IWp@AlDK" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left", "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "Great Highway Extension", + "components" : [ { + "text" : "Great Highway Extension", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 231.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto Great Highway Extension.", + "announcement" : "Turn left onto Great Highway Extension.", + "distanceAlongGeometry" : 121.7 + } ], + "intersections" : [ { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 90, 270, 357 ], + "duration" : 9.195, + "turn_weight" : 11.0, + "turn_duration" : 2.315, + "admin_index" : 0, + "out" : 1, + "weight" : 17.88, + "geometry_index" : 9, + "location" : [ -122.504203, 37.735562 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 177, 270, 358 ], + "duration" : 0.647, + "turn_weight" : 2.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.04, + "geometry_index" : 11, + "location" : [ -122.505185, 37.735561 ] + }, { + "entry" : [ false, true, true, true ], + "in" : 0, + "bearings" : [ 90, 176, 270, 358 ], + "duration" : 2.727, + "turn_weight" : 4.8, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.52, + "geometry_index" : 12, + "location" : [ -122.505277, 37.735561 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 177, 270, 358 ], + "duration" : 2.807, + "turn_weight" : 2.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 5.13, + "geometry_index" : 13, + "location" : [ -122.505375, 37.735561 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 90, 275 ], + "duration" : 2.014, + "turn_weight" : 0.55, + "admin_index" : 0, + "out" : 1, + "weight" : 2.513, + "geometry_index" : 16, + "location" : [ -122.505773, 37.735561 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 90, 270, 355 ], + "duration" : 2.265, + "turn_weight" : 0.55, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 2.751, + "geometry_index" : 18, + "location" : [ -122.506148, 37.735577 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 90, 179, 272, 359 ], + "duration" : 0.74, + "turn_weight" : 2.2, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 2.914, + "geometry_index" : 19, + "location" : [ -122.506566, 37.735577 ] + }, { + "bearings" : [ 6, 92, 187, 272 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "turn_weight" : 6.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 20, + "location" : [ -122.506705, 37.73558 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Sloat Boulevard.", + "type" : "end of road", + "bearing_after" : 270, + "bearing_before" : 177, + "location" : [ -122.504203, 37.735562 ] + }, + "name" : "Sloat Boulevard", + "duration" : 23.072, + "distance" : 231.0, + "driving_side" : "right", + "weight" : 47.003, + "mode" : "driving", + "geometry" : "sge~fAt_athF?vW@rc@?vD?bE?jK?tH?xAa@rF@xN?bYEtGGxF" + }, { + "bannerInstructions" : [ { + "secondary" : { + "text" : "Skyline Boulevard", + "components" : [ { + "text" : "Skyline Boulevard", + "type" : "text" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Skyline Boulevard", + "components" : [ { + "text" : "Skyline Boulevard", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "CA 35", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1230.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Skyline Boulevard", + "components" : [ { + "text" : "Skyline Boulevard", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "CA 35", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "Skyline Boulevard", + "components" : [ { + "text" : "Skyline Boulevard", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "right", + "active" : true, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 1 kilometer.", + "announcement" : "Continue for 1 kilometer.", + "distanceAlongGeometry" : 1220.0 + }, { + "ssmlAnnouncement" : "In 600 meters, Turn right toward Skyline Boulevard.", + "announcement" : "In 600 meters, Turn right toward Skyline Boulevard.", + "distanceAlongGeometry" : 573.6 + }, { + "ssmlAnnouncement" : "Turn right toward Skyline Boulevard.", + "announcement" : "Turn right toward Skyline Boulevard.", + "distanceAlongGeometry" : 163.9 + } ], + "intersections" : [ { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 92, 180, 272, 359 ], + "duration" : 9.025, + "turn_weight" : 7.75, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 7.622, + "admin_index" : 0, + "out" : 1, + "weight" : 9.118, + "geometry_index" : 21, + "location" : [ -122.50683, 37.735584 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 0, 89, 180, 265 ], + "duration" : 2.495, + "turn_weight" : 7.2, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 7.676, + "geometry_index" : 22, + "location" : [ -122.506829, 37.735373 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 0, 89, 181, 270 ], + "duration" : 11.479, + "turn_weight" : 2.2, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 13.384, + "geometry_index" : 23, + "location" : [ -122.506829, 37.735305 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 8, 188 ], + "duration" : 8.298, + "turn_weight" : 0.55, + "admin_index" : 0, + "out" : 1, + "weight" : 8.641, + "geometry_index" : 32, + "location" : [ -122.507121, 37.733633 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 172, 356 ], + "duration" : 2.624, + "turn_weight" : 0.55, + "admin_index" : 0, + "out" : 0, + "weight" : 3.108, + "geometry_index" : 42, + "location" : [ -122.507206, 37.732418 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 168, 349 ], + "duration" : 44.176, + "turn_weight" : 0.55, + "admin_index" : 0, + "out" : 0, + "weight" : 42.517, + "geometry_index" : 45, + "location" : [ -122.507127, 37.73204 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 126, 308 ], + "duration" : 4.088, + "turn_weight" : 0.5, + "admin_index" : 0, + "out" : 0, + "weight" : 4.384, + "geometry_index" : 84, + "location" : [ -122.504745, 37.72601 ] + }, { + "bearings" : [ 126, 306 ], + "entry" : [ true, false ], + "in" : 1, + "turn_weight" : 0.5, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 86, + "location" : [ -122.504125, 37.725656 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Great Highway Extension.", + "type" : "turn", + "bearing_after" : 180, + "bearing_before" : 272, + "location" : [ -122.50683, 37.735584 ] + }, + "name" : "Great Highway Extension", + "duration" : 84.687, + "distance" : 1230.0, + "driving_side" : "right", + "weight" : 91.705, + "mode" : "driving", + "geometry" : "_ie~fAzcfthFdLAfC?|EDxEBfFZhFn@rD\\tEj@dCb@`[pEr^pD~Fr@pFb@hFd@tEd@fFZfFR`GFzFEbGQxFYzFe@|Fw@xF_A~ZoFrLmBhJyAjIkAfFk@~Ec@|Gi@`Fi@vEm@lF{@dF_AtFmAnFkA`F}@pFw@zEg@hFa@rQoAfs@aFpL_AjGo@zF_AbGmAdFqA~FkBlG_ChEiBlAk@xFuC|FkDlFqDhF}DtE_ErEmEhEsEfEqFjE{GvD}GfGkL|CsGdPc]tLwV" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 3 kilometers.", + "announcement" : "Continue for 3 kilometers.", + "distanceAlongGeometry" : 3174.0 + }, { + "ssmlAnnouncement" : "In 700 meters, Turn left onto John Daly Boulevard.", + "announcement" : "In 700 meters, Turn left onto John Daly Boulevard.", + "distanceAlongGeometry" : 718.4 + }, { + "ssmlAnnouncement" : "Turn left onto John Daly Boulevard.", + "announcement" : "Turn left onto John Daly Boulevard.", + "distanceAlongGeometry" : 205.2 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 122, 130, 306 ], + "duration" : 10.721, + "turn_weight" : 0.5, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid_indication" : "right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 1, + "weight" : 10.677, + "geometry_index" : 87, + "location" : [ -122.503745, 37.725437 ] + }, { + "entry" : [ true, false, false ], + "in" : 1, + "bearings" : [ 173, 343, 356 ], + "duration" : 25.65, + "turn_weight" : 6.1, + "turn_duration" : 0.013, + "admin_index" : 0, + "out" : 0, + "weight" : 30.456, + "geometry_index" : 100, + "location" : [ -122.503095, 37.724522 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 169, 345 ], + "duration" : 3.892, + "admin_index" : 0, + "out" : 0, + "weight" : 3.697, + "geometry_index" : 130, + "location" : [ -122.500464, 37.720332 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 178, 357 ], + "duration" : 4.968, + "turn_duration" : 2.0, + "admin_index" : 0, + "out" : 0, + "weight" : 2.819, + "geometry_index" : 134, + "location" : [ -122.500363, 37.719621 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 99, 177, 279, 358 ], + "duration" : 0.603, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 0.555, + "geometry_index" : 135, + "location" : [ -122.500335, 37.719073 ] + }, { + "entry" : [ false, true, true, true, false ], + "in" : 4, + "bearings" : [ 70, 115, 178, 277, 357 ], + "duration" : 4.889, + "turn_weight" : 2.0, + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 2, + "weight" : 4.727, + "geometry_index" : 136, + "location" : [ -122.500329, 37.718968 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 176, 357 ], + "duration" : 17.514, + "admin_index" : 0, + "out" : 0, + "weight" : 16.638, + "geometry_index" : 138, + "location" : [ -122.500298, 37.718436 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 162, 338 ], + "duration" : 7.686, + "admin_index" : 0, + "out" : 0, + "weight" : 7.302, + "geometry_index" : 154, + "location" : [ -122.498666, 37.715517 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 177, 191, 357 ], + "duration" : 1.089, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.017, + "geometry_index" : 163, + "location" : [ -122.498403, 37.714123 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 177, 357 ], + "duration" : 1.265, + "admin_index" : 0, + "out" : 0, + "weight" : 1.202, + "geometry_index" : 164, + "location" : [ -122.49839, 37.713927 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 177, 357 ], + "duration" : 3.6, + "admin_index" : 0, + "out" : 0, + "weight" : 3.42, + "geometry_index" : 165, + "location" : [ -122.498375, 37.713697 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 177, 349, 357 ], + "duration" : 13.787, + "turn_weight" : 0.5, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 13.579, + "geometry_index" : 166, + "location" : [ -122.498332, 37.71303 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 180, 358 ], + "duration" : 3.211, + "admin_index" : 0, + "out" : 0, + "weight" : 3.05, + "geometry_index" : 172, + "location" : [ -122.498192, 37.710489 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 1, 92, 181 ], + "duration" : 10.321, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 9.798, + "geometry_index" : 175, + "location" : [ -122.498195, 37.709899 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 6, 186 ], + "duration" : 2.578, + "admin_index" : 0, + "out" : 1, + "weight" : 2.449, + "geometry_index" : 184, + "location" : [ -122.49834, 37.708001 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 6, 186 ], + "duration" : 27.827, + "admin_index" : 0, + "out" : 1, + "weight" : 26.436, + "geometry_index" : 185, + "location" : [ -122.4984, 37.707529 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 158, 168, 340 ], + "duration" : 2.795, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 2.634, + "geometry_index" : 208, + "location" : [ -122.497078, 37.702569 ] + }, { + "entry" : [ true, false, true, true, false ], + "in" : 4, + "bearings" : [ 32, 103, 158, 244, 338 ], + "duration" : 2.196, + "turn_weight" : 6.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.08, + "geometry_index" : 209, + "location" : [ -122.496832, 37.702094 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 158, 322, 338 ], + "duration" : 12.753, + "turn_weight" : 0.5, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 12.609, + "geometry_index" : 210, + "location" : [ -122.496641, 37.701715 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 159, 338 ], + "duration" : 2.384, + "admin_index" : 0, + "out" : 0, + "weight" : 2.324, + "geometry_index" : 219, + "location" : [ -122.495517, 37.699536 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 162, 168, 342 ], + "duration" : 3.558, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 3.463, + "geometry_index" : 224, + "location" : [ -122.495331, 37.699124 ] + }, { + "bearings" : [ 73, 166, 253, 345 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 229, + "location" : [ -122.495097, 37.698492 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "John Daly Boulevard", + "components" : [ { + "text" : "John Daly Boulevard", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 3184.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "John Daly Boulevard", + "components" : [ { + "text" : "John Daly Boulevard", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "Skyline Boulevard", + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right toward Skyline Boulevard.", + "type" : "turn", + "bearing_after" : 173, + "bearing_before" : 126, + "location" : [ -122.503745, 37.725437 ] + }, + "name" : "Skyline Boulevard", + "duration" : 163.831, + "distance" : 3184.0, + "driving_side" : "right", + "weight" : 167.452, + "mode" : "driving", + "ref" : "CA 35", + "geometry" : "ynq}fA`c`thFlIqNxAcCjAaBzA_BfBuAjBgAnBw@vBm@bCY~BOrDa@dDs@zDwAfF_@hFi@|Eq@hFgAdHcB~FeB~FmBxFqBlF}BpFmCzFyCdGuDlFuDzEsD|EaEtl@uh@zF_FbFcEtEuD`FsDnEcDlFoDfFcD|EyCjFyCbFgCjFyBbFkBrF_BpGyApF_A|Fw@lFa@nTo@fa@w@pEKpWg@tGU`HYtGa@rGq@pGgAdG_BbH_CvFyBvFkCtF_DdFmDd_A{o@|EcDxEwCbFkCnF_CfFqBfFeBbFuAhFiArF_AdGy@jGk@lI_@tK[bQe@fKYjM]th@uAzIU~o@}ArRe@bi@kAhKSzW]nKCnK?zJHhLJdJN~JRzKXjKVlK`@rJ^hKj@nSpAn\\vBpRlAlHb@hHZdGRjGDtFBpGG`HQ|Ga@vGs@pHkAnGsAtFyAjKiDza@eO`}@q[hGoB~F}AvFoAh[wF`FiApF}A`IuCt\\kNtV}J|kAwf@`GgCrF_CbGeCjFyBtF}BrF{BvF_C~CmAxAm@tBy@|By@bC{@dJuCjGoBbGaB|F}A|FyAbFiAxDy@" + }, { + "bannerInstructions" : [ { + "secondary" : { + "text" : "I 280 North: Downtown SF, Bay Bridge", + "components" : [ { + "text" : "I 280 North: Downtown SF, Bay Bridge", + "type" : "text" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "John F Foran Freeway", + "components" : [ { + "text" : "John F Foran Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 280 North", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 2266.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "John F Foran Freeway", + "components" : [ { + "text" : "John F Foran Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 280 North", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "I 280 North: Downtown SF, Bay Bridge", + "components" : [ { + "text" : "I 280 North: Downtown SF, Bay Bridge", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left", "slight left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "slight left", "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "right" ], + "type" : "lane" + } ] + } + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 2.5 kilometers.", + "announcement" : "Continue for 2.5 kilometers.", + "distanceAlongGeometry" : 2256.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn left to take the Interstate 2 80 North ramp.", + "announcement" : "In 300 meters, Turn left to take the Interstate 2 80 North ramp.", + "distanceAlongGeometry" : 321.5 + }, { + "ssmlAnnouncement" : "Turn left to take the Interstate 2 80 North ramp toward Downtown SF, Bay Bridge.", + "announcement" : "Turn left to take the Interstate 2 80 North ramp toward Downtown SF, Bay Bridge.", + "distanceAlongGeometry" : 88.7 + } ], + "intersections" : [ { + "entry" : [ true, true, false, true, false ], + "in" : 4, + "bearings" : [ 73, 168, 229, 269, 346 ], + "duration" : 8.653, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 7.729, + "admin_index" : 0, + "out" : 0, + "weight" : 5.901, + "geometry_index" : 230, + "location" : [ -122.495068, 37.698399 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 70, 169, 253, 345 ], + "duration" : 6.498, + "turn_weight" : 6.6, + "turn_duration" : 2.022, + "admin_index" : 0, + "out" : 0, + "weight" : 10.964, + "geometry_index" : 231, + "location" : [ -122.494861, 37.69845 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 71, 250, 258 ], + "duration" : 5.565, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.407, + "geometry_index" : 232, + "location" : [ -122.493878, 37.698738 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 3, + "bearings" : [ 68, 128, 239, 251 ], + "duration" : 9.542, + "turn_weight" : 1.8, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 11.32, + "geometry_index" : 233, + "location" : [ -122.49266, 37.699078 ] + }, { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 61, 77, 248 ], + "duration" : 7.133, + "turn_weight" : 1.8, + "turn_duration" : 0.013, + "admin_index" : 0, + "out" : 1, + "weight" : 8.92, + "geometry_index" : 234, + "location" : [ -122.491409, 37.699474 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 251 ], + "duration" : 2.56, + "admin_index" : 0, + "out" : 0, + "weight" : 2.56, + "geometry_index" : 237, + "location" : [ -122.490445, 37.699713 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 70, 160, 250, 341 ], + "duration" : 0.579, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.574, + "geometry_index" : 238, + "location" : [ -122.490105, 37.699811 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 69, 158, 250, 336 ], + "duration" : 2.741, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 0, + "weight" : 0.738, + "geometry_index" : 239, + "location" : [ -122.490034, 37.699832 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 69, 160, 249, 341 ], + "duration" : 2.487, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 0, + "weight" : 0.492, + "geometry_index" : 240, + "location" : [ -122.489939, 37.699861 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 69, 160, 249, 341 ], + "duration" : 28.887, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 29.602, + "geometry_index" : 241, + "location" : [ -122.489877, 37.69988 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 68, 191, 251, 341 ], + "duration" : 3.702, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 3.864, + "geometry_index" : 248, + "location" : [ -122.486021, 37.70099 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 248 ], + "duration" : 1.28, + "admin_index" : 0, + "out" : 0, + "weight" : 1.376, + "geometry_index" : 251, + "location" : [ -122.485537, 37.701145 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 250 ], + "duration" : 2.56, + "admin_index" : 0, + "out" : 0, + "weight" : 2.752, + "geometry_index" : 252, + "location" : [ -122.485371, 37.701193 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 71, 153, 250, 334 ], + "duration" : 0.179, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 0.172, + "geometry_index" : 254, + "location" : [ -122.48503, 37.701292 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 69, 251 ], + "duration" : 0.72, + "admin_index" : 0, + "out" : 0, + "weight" : 0.774, + "geometry_index" : 255, + "location" : [ -122.485012, 37.701297 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 71, 158, 249, 334 ], + "duration" : 2.967, + "turn_weight" : 6.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.432, + "geometry_index" : 256, + "location" : [ -122.484911, 37.701327 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 70, 155, 251, 332 ], + "duration" : 3.059, + "turn_weight" : 3.2, + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 0, + "weight" : 4.318, + "geometry_index" : 257, + "location" : [ -122.484777, 37.701364 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 71, 151, 250, 329 ], + "duration" : 1.379, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 1.462, + "geometry_index" : 258, + "location" : [ -122.484642, 37.701402 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 69, 251 ], + "duration" : 7.12, + "admin_index" : 0, + "out" : 0, + "weight" : 7.654, + "geometry_index" : 260, + "location" : [ -122.484459, 37.701452 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 70, 160, 253, 339 ], + "duration" : 2.662, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.022, + "admin_index" : 0, + "out" : 0, + "weight" : 0.688, + "geometry_index" : 263, + "location" : [ -122.483504, 37.701723 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 69, 160, 250, 341 ], + "duration" : 5.781, + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 0, + "weight" : 4.042, + "geometry_index" : 264, + "location" : [ -122.483424, 37.701746 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 249 ], + "duration" : 1.52, + "admin_index" : 0, + "out" : 0, + "weight" : 1.672, + "geometry_index" : 265, + "location" : [ -122.482922, 37.701896 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 69, 250 ], + "duration" : 2.72, + "admin_index" : 0, + "out" : 0, + "weight" : 2.992, + "geometry_index" : 266, + "location" : [ -122.48272, 37.701955 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 70, 135, 249, 329 ], + "duration" : 0.967, + "lanes" : [ { + "indications" : [ "uturn", "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 1.056, + "geometry_index" : 268, + "location" : [ -122.482356, 37.702063 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 69, 159, 250, 335 ], + "duration" : 2.821, + "turn_weight" : 3.8, + "lanes" : [ { + "indications" : [ "uturn", "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 0, + "weight" : 4.68, + "geometry_index" : 269, + "location" : [ -122.482233, 37.702099 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 70, 160, 249, 303 ], + "duration" : 2.727, + "turn_weight" : 3.8, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 0, + "weight" : 4.592, + "geometry_index" : 270, + "location" : [ -122.482122, 37.702132 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 70, 146, 250, 327 ], + "duration" : 5.219, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 5.72, + "geometry_index" : 271, + "location" : [ -122.482023, 37.702161 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 250 ], + "duration" : 2.24, + "admin_index" : 0, + "out" : 0, + "weight" : 2.464, + "geometry_index" : 274, + "location" : [ -122.481326, 37.702366 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 70, 107, 250 ], + "duration" : 38.259, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "weight" : 42.064, + "geometry_index" : 275, + "location" : [ -122.481024, 37.702451 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 70, 250 ], + "duration" : 2.16, + "admin_index" : 0, + "out" : 0, + "weight" : 2.43, + "geometry_index" : 277, + "location" : [ -122.475944, 37.70395 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 69, 163, 250, 344 ], + "duration" : 1.281, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 1.417, + "geometry_index" : 278, + "location" : [ -122.475686, 37.704023 ] + }, { + "entry" : [ true, false, true, false, true ], + "in" : 3, + "bearings" : [ 67, 120, 200, 249, 341 ], + "duration" : 10.749, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 0, + "weight" : 9.821, + "geometry_index" : 279, + "location" : [ -122.475537, 37.704069 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 77, 256 ], + "duration" : 5.13, + "admin_index" : 0, + "out" : 0, + "weight" : 5.899, + "geometry_index" : 286, + "location" : [ -122.474493, 37.704339 ] + }, { + "entry" : [ false, true, true, false ], + "in" : 3, + "bearings" : [ 37, 78, 162, 258 ], + "duration" : 5.439, + "turn_weight" : 15.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 1, + "weight" : 18.933, + "geometry_index" : 289, + "location" : [ -122.473861, 37.704452 ] + }, { + "entry" : [ true, false, false ], + "in" : 2, + "bearings" : [ 73, 220, 257 ], + "duration" : 5.896, + "turn_weight" : 3.75, + "turn_duration" : 2.026, + "admin_index" : 0, + "out" : 0, + "weight" : 8.201, + "geometry_index" : 291, + "location" : [ -122.473445, 37.704524 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 73, 253 ], + "duration" : 2.7, + "admin_index" : 0, + "out" : 0, + "weight" : 3.105, + "geometry_index" : 292, + "location" : [ -122.472976, 37.704634 ] + }, { + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 73, 253 ], + "duration" : 2.97, + "admin_index" : 0, + "out" : 0, + "weight" : 3.416, + "geometry_index" : 293, + "location" : [ -122.472648, 37.704711 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "right" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 74, 253 ], + "duration" : 10.89, + "admin_index" : 0, + "out" : 0, + "weight" : 12.523, + "geometry_index" : 295, + "location" : [ -122.472289, 37.704797 ] + }, { + "bearings" : [ 0, 84, 182, 265 ], + "entry" : [ false, true, true, false ], + "in" : 3, + "turn_weight" : 15.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left", "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.019, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 312, + "location" : [ -122.470939, 37.704978 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto John Daly Boulevard.", + "type" : "turn", + "bearing_after" : 70, + "bearing_before" : 166, + "location" : [ -122.495068, 37.698399 ] + }, + "name" : "John Daly Boulevard", + "duration" : 213.113, + "distance" : 2266.0, + "driving_side" : "right", + "weight" : 258.55, + "mode" : "driving", + "geometry" : "}t|{fAvdoshFeB}K_Qm|@gTckAwWemAqAeMmAiI}Hwb@cEgTi@mCy@}De@{BuG}[cFqVyc@k}BuBeLwE_YwB}LqA_Hk@yCaE_QgAmF_BkI{DeSIc@Ic@{@iEiAkGkAmGIe@yAgIeDoPqHq_@eAsHm@_DkHk^uBsKaA}EuCyNgAuFaA}Ey@eEoG{[oAoGy@eEiD{Q_yA_pHuBoKqCcO{AiHeCiKsAyHoAuHqA_IgAmHm@uEi@iFs@qGsAuMyAgOmBkSa@sD{Ei\\yCoSaBwKiAuHgAyH_@sC]wC[_DW{CWkCUwCUgDSiDO}CMiCK_DIiCGyBGiCMkEEqA[qI" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 7 kilometers.", + "announcement" : "Continue for 7 kilometers.", + "distanceAlongGeometry" : 6724.0 + }, { + "ssmlAnnouncement" : "In 900 meters, Keep left to take exit 54B.", + "announcement" : "In 900 meters, Keep left to take exit 54B.", + "distanceAlongGeometry" : 932.0 + }, { + "ssmlAnnouncement" : "Keep left to take exit 54B onto U.S. 1 o1 North toward Civic Center, Bay Bridge.", + "announcement" : "Keep left to take exit 54B onto U.S. 1 o1 North toward Civic Center, Bay Bridge.", + "distanceAlongGeometry" : 265.5 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 87, 179, 264, 360 ], + "duration" : 8.381, + "turn_weight" : 17.5, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left", "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 6.761, + "admin_index" : 0, + "out" : 3, + "weight" : 19.363, + "geometry_index" : 313, + "location" : [ -122.47077, 37.704992 ] + }, { + "entry" : [ true, false, false, true, true ], + "in" : 2, + "bearings" : [ 25, 89, 180, 267, 355 ], + "duration" : 12.932, + "turn_weight" : 26.25, + "turn_duration" : 2.037, + "admin_index" : 0, + "out" : 0, + "weight" : 38.779, + "geometry_index" : 314, + "location" : [ -122.470771, 37.705154 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 21, 200 ], + "duration" : 31.091, + "admin_index" : 0, + "out" : 0, + "weight" : 35.755, + "geometry_index" : 322, + "location" : [ -122.47027, 37.706108 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 38, 217 ], + "duration" : 18.873, + "admin_index" : 0, + "out" : 0, + "weight" : 21.704, + "geometry_index" : 343, + "location" : [ -122.468492, 37.708236 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 54, 223, 234 ], + "duration" : 20.527, + "turn_weight" : 42.8, + "turn_duration" : 0.014, + "admin_index" : 0, + "out" : 0, + "weight" : 66.389, + "geometry_index" : 355, + "location" : [ -122.467206, 37.709406 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 89, 269 ], + "duration" : 4.237, + "admin_index" : 0, + "out" : 0, + "weight" : 4.873, + "geometry_index" : 381, + "location" : [ -122.461271, 37.710403 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 89, 269 ], + "duration" : 9.975, + "admin_index" : 0, + "out" : 0, + "weight" : 11.471, + "geometry_index" : 382, + "location" : [ -122.459988, 37.710412 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 77, 260 ], + "duration" : 6.188, + "admin_index" : 0, + "out" : 0, + "weight" : 7.116, + "geometry_index" : 391, + "location" : [ -122.456974, 37.710529 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 60, 243 ], + "duration" : 9.525, + "admin_index" : 0, + "out" : 0, + "weight" : 11.192, + "geometry_index" : 403, + "location" : [ -122.455223, 37.711037 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 43, 218, 223 ], + "duration" : 4.395, + "turn_weight" : 1.4, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 6.555, + "geometry_index" : 417, + "location" : [ -122.453042, 37.71251 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 43, 223 ], + "duration" : 27.263, + "admin_index" : 0, + "out" : 0, + "weight" : 32.033, + "geometry_index" : 418, + "location" : [ -122.452137, 37.71328 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 5, 13, 185 ], + "duration" : 31.245, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 0, + "weight" : 37.485, + "geometry_index" : 451, + "location" : [ -122.448306, 37.718824 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 33, 203, 211 ], + "duration" : 22.807, + "turn_weight" : 1.55, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 28.91, + "geometry_index" : 489, + "location" : [ -122.446048, 37.725992 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 63, 242 ], + "duration" : 5.963, + "admin_index" : 0, + "out" : 0, + "weight" : 7.155, + "geometry_index" : 528, + "location" : [ -122.440834, 37.72945 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 66, 86, 246 ], + "duration" : 24.907, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 29.88, + "geometry_index" : 540, + "location" : [ -122.439204, 37.730067 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 79, 239, 257 ], + "duration" : 2.032, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 2.43, + "geometry_index" : 573, + "location" : [ -122.432102, 37.732057 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 84, 262 ], + "duration" : 1.8, + "admin_index" : 0, + "out" : 0, + "weight" : 2.16, + "geometry_index" : 577, + "location" : [ -122.431492, 37.732138 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 89, 267 ], + "duration" : 22.875, + "admin_index" : 0, + "out" : 0, + "weight" : 27.45, + "geometry_index" : 581, + "location" : [ -122.430944, 37.732172 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 88, 269 ], + "duration" : 1.5, + "admin_index" : 0, + "out" : 0, + "weight" : 1.8, + "geometry_index" : 614, + "location" : [ -122.424124, 37.731353 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 86, 99, 266 ], + "duration" : 28.319, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 33.975, + "geometry_index" : 617, + "location" : [ -122.423671, 37.731371 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 73, 251, 256 ], + "duration" : 2.085, + "turn_weight" : 1.75, + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 0, + "weight" : 4.277, + "geometry_index" : 661, + "location" : [ -122.415164, 37.732041 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 68, 251 ], + "duration" : 1.35, + "admin_index" : 0, + "out" : 0, + "weight" : 1.654, + "geometry_index" : 663, + "location" : [ -122.41457, 37.732195 ] + }, { + "bearings" : [ 65, 82, 246 ], + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 666, + "location" : [ -122.414189, 37.732323 ] + } ], + "bannerInstructions" : [ { + "secondary" : { + "text" : "US 101 North: Civic Center, Bay Bridge", + "components" : [ { + "text" : "US 101 North: Civic Center, Bay Bridge", + "type" : "text" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight left", + "text" : "James Lick Freeway", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "54B", + "type" : "exit-number" + }, { + "text" : "James Lick Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 101 North", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 6734.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "fork", + "modifier" : "slight left", + "text" : "James Lick Freeway", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "54B", + "type" : "exit-number" + }, { + "text" : "James Lick Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "US 101 North", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "US 101 North: Civic Center, Bay Bridge", + "components" : [ { + "text" : "US 101 North: Civic Center, Bay Bridge", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "slight left", + "active" : true, + "text" : "", + "directions" : [ "slight left" ], + "type" : "lane" + }, { + "active_direction" : "slight left", + "active" : true, + "text" : "", + "directions" : [ "slight left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "I 280 North: Downtown SF, Bay Bridge", + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left to take the I 280 North ramp toward Downtown SF/Bay Bridge.", + "type" : "turn", + "bearing_after" : 25, + "bearing_before" : 84, + "location" : [ -122.47077, 37.704992 ] + }, + "name" : "John F Foran Freeway", + "duration" : 301.739, + "distance" : 6734.0, + "driving_side" : "right", + "weight" : 436.632, + "mode" : "driving", + "ref" : "I 280 North", + "geometry" : "_qi|fAbv_rhFcI@qGeDaBw@qBy@uCmAgQuHeCgA_E_BiJeDiDmA_Bo@yAm@{Aq@eCmAeCsAkC{AgCaBaCaBcCiBiCsBgCsBoC{BmFmEoGmFkGmFyGcGyGkGoHiHqQeQwIkIwHqHiHcHsCuC}BaCuBwBaBgBeBmB}BqCoCiDsCyDwD{EwO}R{CiGsCkGqCsGgCuGcC{G_CgHwBcHkBaHkBoHaBoH}AsHwAwHmAwHkA}H_A{Hy@cIu@gIi@yHe@mI]aIWqIQcIGkIAaICeIc@uaCQeoA[coBEeIKmIQuHYuIa@eIg@eIk@wHYcDs@{Hw@mGcAsHgAqHqAcIsAiH}AyHgB}HaByG}BgIqB{GaAyC}@kCcCcHeCuGqCwGsCmGsCaGaDkGcD_GmD_GkDqFuDmFoDaF_EgFy\\eb@co@qw@s\\_b@a]ib@yn@iw@}DyEcEwEkEuEmEiEgE}DwEaEaF{D}EoD_FgDyEyCmF}CiFqCoFkCoFaCmFuB{FsBuFiB{FcByFyAaGqA}FiAqF}@gGy@_Go@eGg@cG_@cG_@}F]yGc@{V{AmbDwR_G_@iG_@aGe@eGi@yFm@cGo@oGy@wFy@eGaAwF_AqGkAoFgAsFoAmGwA{FyA}F_BoF{AgGkBqFeBwFoBmFqByFwByF{BaFwB{FiCiFcCkFgCiFmCsFyCiFwCeFyCgF_DeF_DcFaD}EcDaFkDeFsD_FuDmEkD{E{DsE{DyEgEqEcEmEkEmEmEkEoEaEmEgEwEeE}E_E}E_EcFeEmFmD{EyDwFoDsFkDsFkD}FcD}FcDgGwC_G_DsGmCeGsCyGqC}GcCoGgC{GgC{GcCcH}ByGaC_HcCgH}B_H_CgHuBsG}BgHiMsa@{AiFuBeHwBsHqBeHmB}GqBgHsBuHiBaHqBoHoBoH_AwDu@{C{AyFkBuHgBiHgBqHeBmHcBiHcB{H}AeHaBuH}AmH_BsH_B{HyAaH_B{H{AuH{AoHyAyHwAqHwA{HsAkHwAyHsAsHqA}HiBiK_BcJsA_I_c@mhCqA}HoAcIgAwHcAeIw@yHUgCq@sHo@wIg@aIWuFGwA[}IQeIMkIEoIAeIDiILgIRsIVeI\\gIf@eIj@eIr@_Iv@aI~@gI~@wHjS{bB`AcI~@cIt@qHt@_Ir@oIl@mIh@}Hf@cI`@iI\\cIXeIXgJNmHN{HHuIDkI@_I?aICoIGmIMeIMuFMgEIqEWgI]cI_@cIc@cIg@iIm@cIo@iIo@}Hs@gIo@eIs@aIiEig@o@cIm@}Hi@gIg@oIa@oI[cIS_ISiIKeIGgICkI?kIDeIB{IBaIFu]Ryr@B}J@eHGsIKwHQgIYyH]}Hg@gIk@uHm@sHy@}H{@yH}@kHgAsHkFoZiBmI_BuGu@uCo@gCmBaHuB_HuB_H{B_H}BwGyB}G" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 4 kilometers.", + "announcement" : "Continue for 4 kilometers.", + "distanceAlongGeometry" : 4087.0 + }, { + "ssmlAnnouncement" : "In 900 meters, Keep right to take exit 4 33B.", + "announcement" : "In 900 meters, Keep right to take exit 4 33B.", + "distanceAlongGeometry" : 932.8 + }, { + "ssmlAnnouncement" : "Keep right to take exit 4 33B onto Interstate 80 East, James Lick Freeway toward Bay Bridge, Oakland.", + "announcement" : "Keep right to take exit 4 33B onto Interstate 80 East, James Lick Freeway toward Bay Bridge, Oakland.", + "distanceAlongGeometry" : 266.5 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 59, 63, 241 ], + "duration" : 10.221, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid_indication" : "slight left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left" ], + "valid_indication" : "slight left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 12.495, + "geometry_index" : 673, + "location" : [ -122.413261, 37.732706 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 62, 241 ], + "duration" : 29.446, + "admin_index" : 0, + "out" : 0, + "weight" : 36.072, + "geometry_index" : 681, + "location" : [ -122.411253, 37.733613 ] + }, { + "entry" : [ false, false, false, true ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 69, 169, 253, 349 ], + "duration" : 3.745, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 4.58, + "geometry_index" : 710, + "location" : [ -122.407588, 37.737927 ] + }, { + "entry" : [ false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 169, 351 ], + "duration" : 4.246, + "admin_index" : 0, + "out" : 1, + "weight" : 5.202, + "geometry_index" : 711, + "location" : [ -122.407768, 37.73864 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 3, 178 ], + "duration" : 1.846, + "admin_index" : 0, + "out" : 0, + "weight" : 2.262, + "geometry_index" : 717, + "location" : [ -122.407874, 37.739458 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 6, 184 ], + "duration" : 5.677, + "admin_index" : 0, + "out" : 0, + "weight" : 6.954, + "geometry_index" : 720, + "location" : [ -122.407847, 37.739817 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 16, 186, 196 ], + "duration" : 18.65, + "turn_weight" : 33.0, + "turn_duration" : 0.013, + "admin_index" : 0, + "out" : 0, + "weight" : 55.831, + "geometry_index" : 724, + "location" : [ -122.407699, 37.740917 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 19, 28, 200 ], + "duration" : 13.933, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 17.043, + "geometry_index" : 754, + "location" : [ -122.405094, 37.744858 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 14, 194 ], + "duration" : 7.425, + "admin_index" : 0, + "out" : 0, + "weight" : 9.096, + "geometry_index" : 764, + "location" : [ -122.404044, 37.748088 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 14, 194 ], + "duration" : 15.0, + "admin_index" : 0, + "out" : 0, + "weight" : 18.375, + "geometry_index" : 765, + "location" : [ -122.403496, 37.749811 ] + }, { + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 169, 176, 356 ], + "duration" : 3.869, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.482, + "geometry_index" : 784, + "location" : [ -122.402861, 37.753345 ] + }, { + "entry" : [ false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 176, 356 ], + "duration" : 37.162, + "admin_index" : 0, + "out" : 1, + "weight" : 45.524, + "geometry_index" : 785, + "location" : [ -122.402949, 37.754267 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 25, 51, 207 ], + "duration" : 5.646, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 6.891, + "geometry_index" : 839, + "location" : [ -122.405602, 37.762238 ] + }, { + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 10, 193 ], + "duration" : 3.75, + "admin_index" : 0, + "out" : 0, + "weight" : 4.594, + "geometry_index" : 849, + "location" : [ -122.405024, 37.763501 ] + }, { + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "bearings" : [ 4, 185 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 856, + "location" : [ -122.404889, 37.764392 ] + } ], + "exits" : "54B", + "bannerInstructions" : [ { + "secondary" : { + "text" : "I 80 East: Bay Bridge, Oakland", + "components" : [ { + "text" : "I 80 East: Bay Bridge, Oakland", + "type" : "text" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "James Lick Freeway", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "433B", + "type" : "exit-number" + }, { + "text" : "James Lick Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 80 East", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 4097.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "James Lick Freeway", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "433B", + "type" : "exit-number" + }, { + "text" : "James Lick Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 80 East", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "I 80 East: Bay Bridge, Oakland", + "components" : [ { + "text" : "I 80 East: Bay Bridge, Oakland", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "slight left" ], + "type" : "lane" + }, { + "active_direction" : "straight", + "active" : true, + "text" : "", + "directions" : [ "slight left", "straight" ], + "type" : "lane" + }, { + "active_direction" : "straight", + "active" : true, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "straight", + "active" : true, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "US 101 North: Civic Center, Bay Bridge", + "maneuver" : { + "modifier" : "slight left", + "instruction" : "Keep left to take exit 54B onto US 101 North toward Civic Center/Bay Bridge.", + "type" : "fork", + "bearing_after" : 59, + "bearing_before" : 61, + "location" : [ -122.413261, 37.732706 ] + }, + "name" : "James Lick Freeway", + "duration" : 164.705, + "distance" : 4097.0, + "driving_side" : "right", + "weight" : 236.405, + "mode" : "driving", + "ref" : "US 101 North", + "geometry" : "cu_~fAxkonhF{^icA}ByGyByGsBmGsBqG}BeHoB_GkAkDqg@__B_ImUkEiKyEmJ{DgGgEyFsEwFeEcFyEcFuFgF}EcEyFoEgFmDoFgDoFwCcFkCiGeCcKuCcHoAqG_AgH{@qF]wFOmGIqGFqFPwG^oGr@yPlCqk@fJeGt@_Hv@gGj@oG^uGRoGDqFKoGUkESc@CqGa@mGa@sq@_F{FyAsF_B_GgBmFiBwFuBsF}BkFaCiFgCoFyC}EsCqFkDyEcDaFwDwEqDuEoDeF_Eq`@i[aF{DsEsD{EsDaFuDgFmDiFiD}EyCoFwCsFsCqFeCoF}B{FyBaGwBsFkB{FcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FQyGM{FGqGAcGDeGNwOh@sx@nDuxApG_G\\kGd@_Gl@yG|@wF`AaGrAyF~AsFjBsF|BmFjCqF~CeFfDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DnF_EdF}DtEcEhEsEdE}EzD}EhDgFxCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBsFaCqb@mUuGeDoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGeAaG{@qAOwD_@eGi@gGc@sG]gMu@gG_@_Yc@kL@kLK" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 1.5 kilometers.", + "announcement" : "Continue for 1.5 kilometers.", + "distanceAlongGeometry" : 1589.0 + }, { + "ssmlAnnouncement" : "In 900 meters, Take exit 2.", + "announcement" : "In 900 meters, Take exit 2.", + "distanceAlongGeometry" : 932.4 + }, { + "ssmlAnnouncement" : "Take exit 2 toward Fourth Street.", + "announcement" : "Take exit 2 toward Fourth Street.", + "distanceAlongGeometry" : 266.5 + } ], + "intersections" : [ { + "entry" : [ false, true, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 181, 336, 359 ], + "duration" : 12.847, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 2, + "weight" : 15.711, + "geometry_index" : 860, + "location" : [ -122.40485, 37.765368 ] + }, { + "entry" : [ false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 176, 356 ], + "duration" : 10.8, + "admin_index" : 0, + "out" : 1, + "weight" : 13.23, + "geometry_index" : 871, + "location" : [ -122.405099, 37.768434 ] + }, { + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 154, 172, 329 ], + "duration" : 3.549, + "turn_weight" : 5.25, + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 2, + "weight" : 9.568, + "geometry_index" : 879, + "location" : [ -122.405725, 37.77095 ] + }, { + "entry" : [ false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "bearings" : [ 154, 340 ], + "duration" : 6.0, + "admin_index" : 0, + "out" : 1, + "weight" : 7.35, + "geometry_index" : 881, + "location" : [ -122.406259, 37.771684 ] + }, { + "entry" : [ true, true, false ], + "classes" : [ "motorway" ], + "in" : 2, + "bearings" : [ 4, 25, 179 ], + "duration" : 15.947, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 19.523, + "geometry_index" : 888, + "location" : [ -122.406576, 37.773092 ] + }, { + "entry" : [ true, false, false ], + "classes" : [ "motorway" ], + "in" : 1, + "bearings" : [ 50, 225, 229 ], + "duration" : 2.26, + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 0, + "weight" : 2.756, + "geometry_index" : 905, + "location" : [ -122.404336, 37.776381 ] + }, { + "bearings" : [ 57, 235 ], + "entry" : [ true, false ], + "classes" : [ "motorway" ], + "in" : 1, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 908, + "location" : [ -122.403797, 37.776706 ] + } ], + "exits" : "433B", + "bannerInstructions" : [ { + "secondary" : { + "text" : "Fourth Street", + "components" : [ { + "text" : "Fourth Street", + "type" : "text" + } ] + }, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Bryant Street", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "2", + "type" : "exit-number" + }, { + "text" : "Bryant Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 1599.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Bryant Street", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "2", + "type" : "exit-number" + }, { + "text" : "Bryant Street", + "type" : "text" + } ] + }, + "secondary" : { + "text" : "Fourth Street", + "components" : [ { + "text" : "Fourth Street", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "I 80 East: Bay Bridge, Oakland", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right to take exit 433B onto I 80 East/James Lick Freeway toward Bay Bridge/Oakland.", + "type" : "fork", + "bearing_after" : 359, + "bearing_before" : 1, + "location" : [ -122.40485, 37.765368 ] + }, + "name" : "James Lick Freeway", + "duration" : 60.029, + "distance" : 1599.0, + "driving_side" : "right", + "weight" : 78.704, + "mode" : "driving", + "ref" : "I 80 East", + "geometry" : "on_`gAb~~mhFeSNuFJuIJsDHiIZuQv@sHZwH\\uH^uH\\unArFsiA`FgJl@kM|AwLnCiJrC_IbDqJ~EkIlEmc@xZmHpDkHnC_HzBaHnBaI`BeL~AgRn@aQJcK[qIcAuKcBsJcCoJ{CaLkEaKoEeKeFeKeGuKmH_MaJcMkKyLsLcK}K}HaJyIgLaI{KgH{LkF}KuB{EyeAogC" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 600 meters.", + "announcement" : "Continue for 600 meters.", + "distanceAlongGeometry" : 638.0 + }, { + "ssmlAnnouncement" : "In 300 meters, Turn left onto 3rd Street.", + "announcement" : "In 300 meters, Turn left onto 3rd Street.", + "distanceAlongGeometry" : 318.4 + }, { + "ssmlAnnouncement" : "Turn left onto 3rd Street.", + "announcement" : "Turn left onto 3rd Street.", + "distanceAlongGeometry" : 108.1 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 56, 62, 237 ], + "duration" : 23.01, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 1, + "weight" : 27.6, + "geometry_index" : 909, + "location" : [ -122.401613, 37.777839 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 49, 229 ], + "duration" : 7.067, + "admin_index" : 0, + "out" : 0, + "weight" : 8.48, + "geometry_index" : 914, + "location" : [ -122.399541, 37.779082 ] + }, { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 58, 236 ], + "duration" : 1.2, + "admin_index" : 0, + "out" : 0, + "weight" : 1.44, + "geometry_index" : 917, + "location" : [ -122.399063, 37.779372 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 68, 238 ], + "duration" : 3.6, + "admin_index" : 0, + "out" : 0, + "weight" : 4.32, + "geometry_index" : 918, + "location" : [ -122.398978, 37.779414 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 79, 250 ], + "duration" : 3.6, + "admin_index" : 0, + "out" : 0, + "weight" : 4.23, + "geometry_index" : 920, + "location" : [ -122.398697, 37.779499 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 84, 173, 260, 353 ], + "duration" : 2.409, + "turn_weight" : 5.6, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.009, + "admin_index" : 0, + "out" : 0, + "weight" : 8.42, + "geometry_index" : 922, + "location" : [ -122.398396, 37.779543 ] + }, { + "entry" : [ true, true, false, false, false ], + "in" : 3, + "bearings" : [ 66, 138, 200, 264, 318 ], + "duration" : 3.554, + "turn_weight" : 44.2, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.077, + "admin_index" : 0, + "out" : 0, + "weight" : 45.935, + "geometry_index" : 924, + "location" : [ -122.398188, 37.77956 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 49, 137, 246, 314 ], + "duration" : 2.343, + "turn_weight" : 16.8, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 2.066, + "admin_index" : 0, + "out" : 0, + "weight" : 17.125, + "geometry_index" : 927, + "location" : [ -122.398024, 37.779618 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 45, 137, 229, 315 ], + "duration" : 2.978, + "turn_weight" : 5.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.024, + "admin_index" : 0, + "out" : 0, + "weight" : 9.071, + "geometry_index" : 928, + "location" : [ -122.397995, 37.779638 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 45, 225, 308 ], + "duration" : 7.576, + "turn_weight" : 1.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 10.294, + "geometry_index" : 929, + "location" : [ -122.397735, 37.779845 ] + }, { + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 45, 225 ], + "duration" : 2.4, + "turn_weight" : 1.4, + "admin_index" : 0, + "out" : 0, + "weight" : 4.16, + "geometry_index" : 930, + "location" : [ -122.397073, 37.780367 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 45, 135, 225 ], + "duration" : 5.453, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.513, + "geometry_index" : 931, + "location" : [ -122.396864, 37.780531 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 45, 137, 225 ], + "duration" : 5.084, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 7.089, + "geometry_index" : 932, + "location" : [ -122.396391, 37.780906 ] + }, { + "bearings" : [ 45, 135, 225, 315 ], + "entry" : [ true, false, false, false ], + "in" : 2, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 933, + "location" : [ -122.395945, 37.781257 ] + } ], + "exits" : "2", + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "3rd Street", + "components" : [ { + "text" : "3rd Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 648.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "3rd Street", + "components" : [ { + "text" : "3rd Street", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "Fourth Street", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take exit 2 toward Fourth Street.", + "type" : "off ramp", + "bearing_after" : 62, + "bearing_before" : 57, + "location" : [ -122.401613, 37.777839 ] + }, + "name" : "Bryant Street", + "duration" : 71.295, + "distance" : 648.0, + "driving_side" : "right", + "weight" : 161.845, + "mode" : "driving", + "geometry" : "}yw`gAxsxmhFsJ{ZaEmK{E{JaJ{Oai@m{@oGmK}EaKuAkDsAiDcBoGeAaHy@kH]mHSeGMyC]_Cc@qAq@uBg@y@}KgOs_@kh@gIaLmVq\\}T{ZiCkD" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "text" : "You have arrived at your destination.", + "components" : [ { + "text" : "You have arrived at your destination.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 667.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 700 meters.", + "announcement" : "Continue for 700 meters.", + "distanceAlongGeometry" : 657.0 + }, { + "ssmlAnnouncement" : "In 300 meters, You will arrive at your destination.", + "announcement" : "In 300 meters, You will arrive at your destination.", + "distanceAlongGeometry" : 313.2 + }, { + "ssmlAnnouncement" : "You have arrived at your destination.", + "announcement" : "You have arrived at your destination.", + "distanceAlongGeometry" : 89.2 + } ], + "intersections" : [ { + "entry" : [ true, false, false, true ], + "in" : 2, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 13.672, + "turn_weight" : 23.75, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 7.395, + "admin_index" : 0, + "out" : 3, + "weight" : 30.969, + "geometry_index" : 934, + "location" : [ -122.395859, 37.781326 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 4.161, + "turn_weight" : 5.0, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 9.777, + "geometry_index" : 937, + "location" : [ -122.396403, 37.78176 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 46, 135, 315 ], + "duration" : 0.469, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.781, + "geometry_index" : 938, + "location" : [ -122.396762, 37.782047 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 46, 135, 315 ], + "duration" : 0.376, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 1.675, + "geometry_index" : 939, + "location" : [ -122.396799, 37.782076 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 45, 135, 225, 316 ], + "duration" : 0.469, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 5.531, + "geometry_index" : 940, + "location" : [ -122.396832, 37.782102 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 46, 136, 224, 315 ], + "duration" : 2.574, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.021, + "admin_index" : 0, + "out" : 3, + "weight" : 5.637, + "geometry_index" : 941, + "location" : [ -122.396872, 37.782135 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 135, 315 ], + "duration" : 2.031, + "turn_weight" : 1.25, + "admin_index" : 0, + "out" : 1, + "weight" : 3.585, + "geometry_index" : 942, + "location" : [ -122.396919, 37.782172 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 135, 224, 317 ], + "duration" : 1.3, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 2.736, + "geometry_index" : 943, + "location" : [ -122.397092, 37.782311 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 137, 227, 314 ], + "duration" : 1.315, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.022, + "admin_index" : 0, + "out" : 2, + "weight" : 2.736, + "geometry_index" : 944, + "location" : [ -122.397204, 37.782405 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 46, 134, 227, 315 ], + "duration" : 0.93, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 6.062, + "geometry_index" : 945, + "location" : [ -122.397319, 37.782493 ] + }, { + "entry" : [ true, false, true, true ], + "in" : 1, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 3.207, + "turn_weight" : 15.0, + "lanes" : [ { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 3, + "weight" : 16.38, + "geometry_index" : 946, + "location" : [ -122.3974, 37.782556 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 46, 135, 225, 316 ], + "duration" : 0.838, + "turn_weight" : 5.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 5.955, + "geometry_index" : 947, + "location" : [ -122.397507, 37.78264 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 44, 136, 315 ], + "duration" : 3.251, + "turn_weight" : 1.25, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 4.965, + "geometry_index" : 948, + "location" : [ -122.397581, 37.7827 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 49, 135, 316 ], + "duration" : 1.299, + "turn_weight" : 1.4, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.918, + "geometry_index" : 949, + "location" : [ -122.397863, 37.782925 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 45, 136, 315 ], + "duration" : 2.236, + "turn_weight" : 1.4, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 2, + "weight" : 4.003, + "geometry_index" : 950, + "location" : [ -122.397973, 37.783014 ] + }, { + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 135, 315 ], + "duration" : 3.877, + "turn_weight" : 1.4, + "admin_index" : 0, + "out" : 1, + "weight" : 5.955, + "geometry_index" : 951, + "location" : [ -122.39817, 37.78317 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 135, 225, 315 ], + "duration" : 4.068, + "turn_weight" : 1.4, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 6.172, + "geometry_index" : 952, + "location" : [ -122.398505, 37.783437 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 44, 135, 224, 317 ], + "duration" : 1.208, + "turn_weight" : 5.6, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 3, + "weight" : 7.01, + "geometry_index" : 953, + "location" : [ -122.398861, 37.783719 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 49, 137, 229, 314 ], + "duration" : 2.392, + "turn_weight" : 16.8, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.022, + "admin_index" : 0, + "out" : 3, + "weight" : 17.234, + "geometry_index" : 954, + "location" : [ -122.398961, 37.783804 ] + }, { + "entry" : [ true, false, false, true ], + "in" : 1, + "bearings" : [ 38, 134, 213, 315 ], + "duration" : 5.238, + "turn_weight" : 16.8, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 3, + "weight" : 20.596, + "geometry_index" : 955, + "location" : [ -122.398994, 37.783829 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 135, 222, 315 ], + "duration" : 2.407, + "turn_weight" : 1.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.22, + "geometry_index" : 957, + "location" : [ -122.399277, 37.784055 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 44, 135, 315 ], + "duration" : 1.853, + "turn_weight" : 1.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 3.569, + "geometry_index" : 959, + "location" : [ -122.399483, 37.784219 ] + }, { + "entry" : [ true, false, true ], + "in" : 1, + "bearings" : [ 44, 135, 315 ], + "duration" : 2.407, + "turn_weight" : 1.4, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 4.22, + "geometry_index" : 960, + "location" : [ -122.399646, 37.78435 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 135, 314 ], + "duration" : 0.092, + "turn_weight" : 1.4, + "admin_index" : 0, + "out" : 1, + "weight" : 1.508, + "geometry_index" : 962, + "location" : [ -122.399852, 37.784514 ] + }, { + "entry" : [ false, false, true ], + "in" : 1, + "bearings" : [ 46, 134, 315 ], + "duration" : 6.007, + "turn_weight" : 1.4, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 8.45, + "geometry_index" : 963, + "location" : [ -122.399864, 37.784523 ] + }, { + "entry" : [ false, false, false, true ], + "in" : 1, + "bearings" : [ 42, 135, 225, 315 ], + "duration" : 1.115, + "turn_weight" : 6.2, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "weight" : 7.529, + "geometry_index" : 964, + "location" : [ -122.400382, 37.784938 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 1, + "bearings" : [ 45, 135, 229, 315 ], + "duration" : 3.299, + "turn_weight" : 18.6, + "lanes" : [ { + "indications" : [ "left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "left", "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 3, + "weight" : 20.151, + "geometry_index" : 965, + "location" : [ -122.400478, 37.785015 ] + }, { + "bearings" : [ 45, 135, 225, 315 ], + "entry" : [ false, false, false, true ], + "in" : 1, + "turn_weight" : 6.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 3, + "geometry_index" : 966, + "location" : [ -122.400594, 37.785107 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto 3rd Street.", + "type" : "turn", + "bearing_after" : 315, + "bearing_before" : 45, + "location" : [ -122.395859, 37.781326 ] + }, + "name" : "3rd Street", + "duration" : 79.205, + "distance" : 667.0, + "driving_side" : "right", + "weight" : 226.055, + "mode" : "driving", + "geometry" : "{s~`gAdlmmhFyC`EeN|QcF~G}PlUy@hAs@`AaAnAiA|AuGxI{D~EoDdF}B`DgDtEwBrCaMrPqDzEwHhKuO|SsPfUiDfEq@`AcAtA_K~M}CfEiDrEeGdIaDjEeDnEQV}Xj_@yC~DwDfFm]le@" + }, { + "intersections" : [ { + "bearings" : [ 135 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 0, + "geometry_index" : 967, + "location" : [ -122.401209, 37.785594 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "instruction" : "You have arrived at your destination.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 315, + "location" : [ -122.401209, 37.785594 ] + }, + "name" : "3rd Street", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "s~fagApzwmhF??" + } ], + "distance" : 20753.215, + "summary" : "I 280 North, US 101 North" + } ], + "geometry" : "}}f~fAlcathFdGQn@AvDMdDKd@AlNa@`IWp@AlDK?vW@rc@?vD?bE?jK?tH?xAa@rF@xN?bYEtGGxFdLAfC?|EDxEBfFZhFn@rD\\tEj@dCb@`[pEr^pD~Fr@pFb@hFd@tEd@fFZfFR`GFzFEbGQxFYzFe@|Fw@xF_A~ZoFrLmBhJyAjIkAfFk@~Ec@|Gi@`Fi@vEm@lF{@dF_AtFmAnFkA`F}@pFw@zEg@hFa@rQoAfs@aFpL_AjGo@zF_AbGmAdFqA~FkBlG_ChEiBlAk@xFuC|FkDlFqDhF}DtE_ErEmEhEsEfEqFjE{GvD}GfGkL|CsGdPc]tLwVlIqNxAcCjAaBzA_BfBuAjBgAnBw@vBm@bCY~BOrDa@dDs@zDwAfF_@hFi@|Eq@hFgAdHcB~FeB~FmBxFqBlF}BpFmCzFyCdGuDlFuDzEsD|EaEtl@uh@zF_FbFcEtEuD`FsDnEcDlFoDfFcD|EyCjFyCbFgCjFyBbFkBrF_BpGyApF_A|Fw@lFa@nTo@fa@w@pEKpWg@tGU`HYtGa@rGq@pGgAdG_BbH_CvFyBvFkCtF_DdFmDd_A{o@|EcDxEwCbFkCnF_CfFqBfFeBbFuAhFiArF_AdGy@jGk@lI_@tK[bQe@fKYjM]th@uAzIU~o@}ArRe@bi@kAhKSzW]nKCnK?zJHhLJdJN~JRzKXjKVlK`@rJ^hKj@nSpAn\\vBpRlAlHb@hHZdGRjGDtFBpGG`HQ|Ga@vGs@pHkAnGsAtFyAjKiDza@eO`}@q[hGoB~F}AvFoAh[wF`FiApF}A`IuCt\\kNtV}J|kAwf@`GgCrF_CbGeCjFyBtF}BrF{BvF_C~CmAxAm@tBy@|By@bC{@dJuCjGoBbGaB|F}A|FyAbFiAxDy@eB}K_Qm|@gTckAwWemAqAeMmAiI}Hwb@cEgTi@mCy@}De@{BuG}[cFqVyc@k}BuBeLwE_YwB}LqA_Hk@yCaE_QgAmF_BkI{DeSIc@Ic@{@iEiAkGkAmGIe@yAgIeDoPqHq_@eAsHm@_DkHk^uBsKaA}EuCyNgAuFaA}Ey@eEoG{[oAoGy@eEiD{Q_yA_pHuBoKqCcO{AiHeCiKsAyHoAuHqA_IgAmHm@uEi@iFs@qGsAuMyAgOmBkSa@sD{Ei\\yCoSaBwKiAuHgAyH_@sC]wC[_DW{CWkCUwCUgDSiDO}CMiCK_DIiCGyBGiCMkEEqA[qIcI@qGeDaBw@qBy@uCmAgQuHeCgA_E_BiJeDiDmA_Bo@yAm@{Aq@eCmAeCsAkC{AgCaBaCaBcCiBiCsBgCsBoC{BmFmEoGmFkGmFyGcGyGkGoHiHqQeQwIkIwHqHiHcHsCuC}BaCuBwBaBgBeBmB}BqCoCiDsCyDwD{EwO}R{CiGsCkGqCsGgCuGcC{G_CgHwBcHkBaHkBoHaBoH}AsHwAwHmAwHkA}H_A{Hy@cIu@gIi@yHe@mI]aIWqIQcIGkIAaICeIc@uaCQeoA[coBEeIKmIQuHYuIa@eIg@eIk@wHYcDs@{Hw@mGcAsHgAqHqAcIsAiH}AyHgB}HaByG}BgIqB{GaAyC}@kCcCcHeCuGqCwGsCmGsCaGaDkGcD_GmD_GkDqFuDmFoDaF_EgFy\\eb@co@qw@s\\_b@a]ib@yn@iw@}DyEcEwEkEuEmEiEgE}DwEaEaF{D}EoD_FgDyEyCmF}CiFqCoFkCoFaCmFuB{FsBuFiB{FcByFyAaGqA}FiAqF}@gGy@_Go@eGg@cG_@cG_@}F]yGc@{V{AmbDwR_G_@iG_@aGe@eGi@yFm@cGo@oGy@wFy@eGaAwF_AqGkAoFgAsFoAmGwA{FyA}F_BoF{AgGkBqFeBwFoBmFqByFwByF{BaFwB{FiCiFcCkFgCiFmCsFyCiFwCeFyCgF_DeF_DcFaD}EcDaFkDeFsD_FuDmEkD{E{DsE{DyEgEqEcEmEkEmEmEkEoEaEmEgEwEeE}E_E}E_EcFeEmFmD{EyDwFoDsFkDsFkD}FcD}FcDgGwC_G_DsGmCeGsCyGqC}GcCoGgC{GgC{GcCcH}ByGaC_HcCgH}B_H_CgHuBsG}BgHiMsa@{AiFuBeHwBsHqBeHmB}GqBgHsBuHiBaHqBoHoBoH_AwDu@{C{AyFkBuHgBiHgBqHeBmHcBiHcB{H}AeHaBuH}AmH_BsH_B{HyAaH_B{H{AuH{AoHyAyHwAqHwA{HsAkHwAyHsAsHqA}HiBiK_BcJsA_I_c@mhCqA}HoAcIgAwHcAeIw@yHUgCq@sHo@wIg@aIWuFGwA[}IQeIMkIEoIAeIDiILgIRsIVeI\\gIf@eIj@eIr@_Iv@aI~@gI~@wHjS{bB`AcI~@cIt@qHt@_Ir@oIl@mIh@}Hf@cI`@iI\\cIXeIXgJNmHN{HHuIDkI@_I?aICoIGmIMeIMuFMgEIqEWgI]cI_@cIc@cIg@iIm@cIo@iIo@}Hs@gIo@eIs@aIiEig@o@cIm@}Hi@gIg@oIa@oI[cIS_ISiIKeIGgICkI?kIDeIB{IBaIFu]Ryr@B}J@eHGsIKwHQgIYyH]}Hg@gIk@uHm@sHy@}H{@yH}@kHgAsHkFoZiBmI_BuGu@uCo@gCmBaHuB_HuB_H{B_H}BwGyB}G{^icA}ByGyByGsBmGsBqG}BeHoB_GkAkDqg@__B_ImUkEiKyEmJ{DgGgEyFsEwFeEcFyEcFuFgF}EcEyFoEgFmDoFgDoFwCcFkCiGeCcKuCcHoAqG_AgH{@qF]wFOmGIqGFqFPwG^oGr@yPlCqk@fJeGt@_Hv@gGj@oG^uGRoGDqFKoGUkESc@CqGa@mGa@sq@_F{FyAsF_B_GgBmFiBwFuBsF}BkFaCiFgCoFyC}EsCqFkDyEcDaFwDwEqDuEoDeF_Eq`@i[aF{DsEsD{EsDaFuDgFmDiFiD}EyCoFwCsFsCqFeCoF}B{FyBaGwBsFkB{FcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FQyGM{FGqGAcGDeGNwOh@sx@nDuxApG_G\\kGd@_Gl@yG|@wF`AaGrAyF~AsFjBsF|BmFjCqF~CeFfDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DnF_EdF}DtEcEhEsEdE}EzD}EhDgFxCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBsFaCqb@mUuGeDoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGeAaG{@qAOwD_@eGi@gGc@sG]gMu@gG_@_Yc@kL@kLKeSNuFJuIJsDHiIZuQv@sHZwH\\uH^uH\\unArFsiA`FgJl@kM|AwLnCiJrC_IbDqJ~EkIlEmc@xZmHpDkHnC_HzBaHnBaI`BeL~AgRn@aQJcK[qIcAuKcBsJcCoJ{CaLkEaKoEeKeFeKeGuKmH_MaJcMkKyLsLcK}K}HaJyIgLaI{KgH{LkF}KuB{EyeAogCsJ{ZaEmK{E{JaJ{Oai@m{@oGmK}EaKuAkDsAiDcBoGeAaHy@kH]mHSeGMyC]_Cc@qAq@uBg@y@}KgOs_@kh@gIaLmVq\\}T{ZiCkDyC`EeN|QcF~G}PlUy@hAs@`AaAnAiA|AuGxI{D~EoDdF}B`DgDtEwBrCaMrPqDzEwHhKuO|SsPfUiDfEq@`AcAtA_K~M}CfEiDrEeGdIaDjEeDnEQV}Xj_@yC~DwDfFm]le@" + } ], + "waypoints" : [ { + "distance" : 2.37, + "name" : "46th Avenue", + "location" : [ -122.504263, 37.736431 ] + }, { + "distance" : 0.685, + "name" : "3rd Street", + "location" : [ -122.401209, 37.785594 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_2122.json b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_2122.json new file mode 100644 index 000000000000..98d4ba2ef7b7 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/assets/routes/route_SF_2122.json @@ -0,0 +1,1220 @@ +{ + "routes" : [ { + "voiceLocale" : "en", + "weight_name" : "auto", + "weight" : 650.409, + "duration" : 245.354, + "distance" : 2122.105, + "legs" : [ { + "via_waypoints" : [ ], + "admins" : [ { + "iso_3166_1_alpha3" : "USA", + "iso_3166_1" : "US" + } ], + "weight" : 650.409, + "duration" : 245.354, + "steps" : [ { + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "right", + "text" : "Mabini Street", + "components" : [ { + "text" : "Mabini Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 132.105 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Drive northeast on Folsom Street. Then, in 100 meters, Turn right onto Mabini Street.", + "announcement" : "Drive northeast on Folsom Street. Then, in 100 meters, Turn right onto Mabini Street.", + "distanceAlongGeometry" : 132.1 + }, { + "ssmlAnnouncement" : "Turn right onto Mabini Street.", + "announcement" : "Turn right onto Mabini Street.", + "distanceAlongGeometry" : 33.0 + } ], + "intersections" : [ { + "entry" : [ true ], + "bearings" : [ 46 ], + "duration" : 2.04, + "admin_index" : 0, + "out" : 0, + "weight" : 2.5, + "geometry_index" : 0, + "location" : [ -122.401477, 37.781832 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 45, 134, 226, 317 ], + "duration" : 1.036, + "turn_weight" : 7.0, + "turn_duration" : 0.021, + "admin_index" : 0, + "out" : 0, + "weight" : 8.244, + "geometry_index" : 1, + "location" : [ -122.401294, 37.781974 ] + }, { + "entry" : [ true, true, false, false ], + "in" : 2, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 3.115, + "turn_weight" : 21.0, + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 0, + "weight" : 22.329, + "geometry_index" : 2, + "location" : [ -122.401203, 37.782046 ] + }, { + "entry" : [ true, false, false, false ], + "in" : 2, + "bearings" : [ 45, 141, 225, 325 ], + "duration" : 7.392, + "turn_weight" : 6.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 15.062, + "geometry_index" : 3, + "location" : [ -122.40111, 37.78212 ] + }, { + "bearings" : [ 46, 141, 225, 321 ], + "entry" : [ true, false, false, false ], + "in" : 2, + "turn_weight" : 6.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 5, + "location" : [ -122.400469, 37.782633 ] + } ], + "maneuver" : { + "instruction" : "Drive northeast on Folsom Street.", + "type" : "depart", + "bearing_after" : 46, + "bearing_before" : 0, + "location" : [ -122.401477, 37.781832 ] + }, + "name" : "Folsom Street", + "duration" : 14.236, + "distance" : 132.105, + "driving_side" : "right", + "weight" : 55.11, + "mode" : "driving", + "geometry" : "os_agAhkxmhF{GmJoCuDsCyDuFsHkWm]uAqB" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "end of road", + "modifier" : "left", + "text" : "Bonifacio Street", + "components" : [ { + "text" : "Bonifacio Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 72.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto Bonifacio Street. Then Turn right onto Lapu Lapu Street.", + "announcement" : "Turn left onto Bonifacio Street. Then Turn right onto Lapu Lapu Street.", + "distanceAlongGeometry" : 49.9 + } ], + "intersections" : [ { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 46, 135, 226 ], + "duration" : 6.708, + "turn_weight" : 8.1, + "turn_duration" : 3.908, + "admin_index" : 0, + "out" : 1, + "weight" : 11.46, + "geometry_index" : 6, + "location" : [ -122.400412, 37.782676 ] + }, { + "entry" : [ false, true, false, false ], + "in" : 3, + "bearings" : [ 49, 135, 228, 315 ], + "duration" : 9.407, + "turn_weight" : 18.6, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 29.88, + "geometry_index" : 7, + "location" : [ -122.4003, 37.782586 ] + }, { + "bearings" : [ 135, 224, 315 ], + "entry" : [ true, true, false ], + "in" : 2, + "turn_weight" : 4.65, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 8, + "location" : [ -122.399924, 37.782286 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Mabini Street.", + "type" : "turn", + "bearing_after" : 135, + "bearing_before" : 46, + "location" : [ -122.400412, 37.782676 ] + }, + "name" : "Mabini Street", + "duration" : 18.322, + "distance" : 72.0, + "driving_side" : "right", + "weight" : 48.63, + "mode" : "driving", + "geometry" : "ghaagAvhvmhFrD_FvQoV`@i@nBkC" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "new name", + "modifier" : "right", + "text" : "Lapu Lapu Street", + "components" : [ { + "text" : "Lapu Lapu Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 60.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn right onto Lapu Lapu Street.", + "announcement" : "Turn right onto Lapu Lapu Street.", + "distanceAlongGeometry" : 40.0 + } ], + "intersections" : [ { + "bearings" : [ 45, 225, 315 ], + "entry" : [ true, true, false ], + "in" : 2, + "turn_weight" : 28.25, + "turn_duration" : 5.395, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 10, + "location" : [ -122.399833, 37.782213 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto Bonifacio Street.", + "type" : "end of road", + "bearing_after" : 45, + "bearing_before" : 135, + "location" : [ -122.399833, 37.782213 ] + }, + "name" : "Bonifacio Street", + "duration" : 17.395, + "distance" : 60.0, + "driving_side" : "right", + "weight" : 42.35, + "mode" : "driving", + "geometry" : "ik`agApdumhFuV}\\" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "end of road", + "modifier" : "right", + "text" : "Harrison Street", + "components" : [ { + "text" : "Harrison Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 124.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn right onto Harrison Street.", + "announcement" : "Turn right onto Harrison Street.", + "distanceAlongGeometry" : 49.9 + } ], + "intersections" : [ { + "entry" : [ true, false ], + "in" : 1, + "bearings" : [ 136, 225 ], + "duration" : 11.0, + "turn_weight" : 13.4, + "admin_index" : 0, + "out" : 0, + "weight" : 26.325, + "geometry_index" : 11, + "location" : [ -122.399354, 37.782592 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 46, 136, 316 ], + "duration" : 0.208, + "turn_weight" : 4.2, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "weight" : 4.435, + "geometry_index" : 12, + "location" : [ -122.398917, 37.782239 ] + }, { + "entry" : [ true, true, false ], + "in" : 2, + "bearings" : [ 135, 224, 316 ], + "duration" : 11.207, + "turn_weight" : 4.2, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 0, + "weight" : 17.36, + "geometry_index" : 13, + "location" : [ -122.398906, 37.78223 ] + }, { + "bearings" : [ 45, 136, 227, 315 ], + "entry" : [ false, true, false, false ], + "in" : 3, + "turn_weight" : 16.8, + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 14, + "location" : [ -122.398464, 37.781875 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Lapu Lapu Street.", + "type" : "new name", + "bearing_after" : 136, + "bearing_before" : 45, + "location" : [ -122.399354, 37.782592 ] + }, + "name" : "Lapu Lapu Street", + "duration" : 24.823, + "distance" : 124.0, + "driving_side" : "right", + "weight" : 67.74, + "mode" : "driving", + "geometry" : "_caagArftmhF`UiZPUdUsZ`DeE" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left", "slight left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "slight left", "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + }, + "secondary" : { + "text" : "I 80 West, US 101 South: San Jose", + "components" : [ { + "text" : "I 80 West, US 101 South: San Jose", + "type" : "text" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "James Lick Freeway", + "components" : [ { + "text" : "James Lick Freeway", + "type" : "text" + }, { + "text" : "/", + "type" : "delimiter" + }, { + "text" : "I 80 West", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 158.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left to take the Interstate 80 West ramp toward San Jose.", + "announcement" : "Turn left to take the Interstate 80 West ramp toward San Jose.", + "distanceAlongGeometry" : 103.2 + } ], + "intersections" : [ { + "entry" : [ false, true, false ], + "in" : 2, + "bearings" : [ 45, 225, 316 ], + "duration" : 8.567, + "turn_weight" : 19.0, + "turn_duration" : 2.105, + "admin_index" : 0, + "out" : 1, + "weight" : 26.592, + "geometry_index" : 15, + "location" : [ -122.398365, 37.781794 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 45, 225 ], + "duration" : 1.754, + "turn_weight" : 1.4, + "admin_index" : 0, + "out" : 1, + "weight" : 3.461, + "geometry_index" : 16, + "location" : [ -122.398924, 37.781348 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 225, 314 ], + "duration" : 5.268, + "turn_weight" : 1.55, + "lanes" : [ { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left", "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 7.864, + "geometry_index" : 17, + "location" : [ -122.399076, 37.781226 ] + }, { + "bearings" : [ 45, 135, 225, 315 ], + "entry" : [ false, false, true, false ], + "in" : 0, + "turn_weight" : 6.2, + "lanes" : [ { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left", "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 18, + "location" : [ -122.39954, 37.780865 ] + } ], + "maneuver" : { + "modifier" : "right", + "instruction" : "Turn right onto Harrison Street.", + "type" : "end of road", + "bearing_after" : 225, + "bearing_before" : 136, + "location" : [ -122.398365, 37.781794 ] + }, + "name" : "Harrison Street", + "duration" : 16.704, + "distance" : 158.0, + "driving_side" : "right", + "weight" : 45.446, + "mode" : "driving", + "geometry" : "cq_agAxhrmhFzZ|a@rFnHpU~[rC|D" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Continue for 800 meters.", + "announcement" : "Continue for 800 meters.", + "distanceAlongGeometry" : 802.0 + }, { + "ssmlAnnouncement" : "In 600 meters, Take exit 1C.", + "announcement" : "In 600 meters, Take exit 1C.", + "distanceAlongGeometry" : 578.7 + }, { + "ssmlAnnouncement" : "Take exit 1C toward Civic Center.", + "announcement" : "Take exit 1C toward Civic Center.", + "distanceAlongGeometry" : 266.5 + } ], + "intersections" : [ { + "entry" : [ false, true, true, true, true, false ], + "in" : 0, + "bearings" : [ 45, 115, 146, 179, 225, 315 ], + "duration" : 11.482, + "turn_weight" : 32.55, + "lanes" : [ { + "indications" : [ "left", "slight left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "slight left", "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.582, + "admin_index" : 0, + "out" : 3, + "weight" : 43.23, + "geometry_index" : 19, + "location" : [ -122.399635, 37.780791 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 29, 214 ], + "duration" : 12.533, + "admin_index" : 0, + "out" : 1, + "weight" : 15.04, + "geometry_index" : 26, + "location" : [ -122.39987, 37.780029 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 41, 224 ], + "duration" : 25.2, + "admin_index" : 0, + "out" : 1, + "weight" : 30.87, + "geometry_index" : 31, + "location" : [ -122.400526, 37.779359 ] + }, { + "bearings" : [ 40, 45, 226 ], + "entry" : [ false, false, true ], + "classes" : [ "motorway" ], + "in" : 0, + "turn_weight" : 54.0, + "turn_duration" : 0.012, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 35, + "location" : [ -122.401955, 37.778094 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Civic Center, Ninth Street", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "1C", + "type" : "exit-number" + }, { + "text" : "Civic Center, Ninth Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 812.0 + }, { + "distanceAlongGeometry" : 400.0, + "primary" : { + "type" : "off ramp", + "modifier" : "slight right", + "text" : "Civic Center, Ninth Street", + "components" : [ { + "text" : "Exit", + "type" : "exit" + }, { + "text" : "1C", + "type" : "exit-number" + }, { + "text" : "Civic Center, Ninth Street", + "type" : "text" + } ] + }, + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : false, + "text" : "", + "directions" : [ "straight", "slight right" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + } + } ], + "destinations" : "I 80 West, US 101 South: San Jose", + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left to take the I 80 West ramp toward San Jose.", + "type" : "turn", + "bearing_after" : 179, + "bearing_before" : 225, + "location" : [ -122.399635, 37.780791 ] + }, + "name" : "James Lick Freeway", + "duration" : 65.727, + "distance" : 812.0, + "driving_side" : "right", + "weight" : 163.353, + "mode" : "driving", + "ref" : "I 80 West", + "geometry" : "mr}`gAdxtmhF`GQ~CPfFZtE~@zExAxEvB|EfDzFpEpF~EpGfG~GlHzGvHfWl\\`EzExHnJ|e@nh@zJvN~JxOdJhOnIbOdInO~k@hmA|Rp`@lRj[`O`S" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Keep right toward Civic Center. Then Bear left onto Harrison Street.", + "announcement" : "Keep right toward Civic Center. Then Bear left onto Harrison Street.", + "distanceAlongGeometry" : 92.0 + } ], + "intersections" : [ { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 217, 231 ], + "duration" : 22.01, + "lanes" : [ { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight", "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.01, + "admin_index" : 0, + "out" : 2, + "weight" : 26.95, + "geometry_index" : 44, + "location" : [ -122.405824, 37.775595 ] + }, { + "bearings" : [ 39, 225 ], + "entry" : [ false, true ], + "in" : 0, + "admin_index" : 0, + "out" : 1, + "geometry_index" : 54, + "location" : [ -122.407312, 37.774022 ] + } ], + "exits" : "1C", + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active" : false, + "text" : "", + "directions" : [ "slight left" ], + "type" : "lane" + }, { + "active_direction" : "slight right", + "active" : true, + "text" : "", + "directions" : [ "slight right" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "fork", + "modifier" : "slight right", + "text" : "Civic Center, 9th Street", + "components" : [ { + "text" : "Civic Center, 9th Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 244.0 + } ], + "destinations" : "Civic Center, Ninth Street", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Take exit 1C toward Civic Center.", + "type" : "off ramp", + "bearing_after" : 231, + "bearing_before" : 225, + "location" : [ -122.405824, 37.775595 ] + }, + "name" : "", + "duration" : 25.21, + "distance" : 244.0, + "driving_side" : "right", + "weight" : 30.87, + "mode" : "driving", + "geometry" : "ums`gA~z`nhF|KfSrCnCdI|HnHtGbIpGtIfGfXtQlDlC`DrCnC`DzC|DnC~D" + }, { + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Bear left onto Harrison Street.", + "announcement" : "Bear left onto Harrison Street.", + "distanceAlongGeometry" : 59.7 + } ], + "intersections" : [ { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 229, 243 ], + "duration" : 3.125, + "lanes" : [ { + "indications" : [ "slight left" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "slight right" ], + "valid_indication" : "slight right", + "valid" : true, + "active" : true + } ], + "turn_duration" : 0.025, + "admin_index" : 0, + "out" : 2, + "weight" : 3.797, + "geometry_index" : 56, + "location" : [ -122.407503, 37.773872 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 73, 264 ], + "duration" : 5.467, + "admin_index" : 0, + "out" : 1, + "weight" : 6.697, + "geometry_index" : 59, + "location" : [ -122.407829, 37.773768 ] + }, { + "entry" : [ false, false, true, false ], + "in" : 0, + "bearings" : [ 84, 144, 259, 322 ], + "duration" : 2.026, + "turn_weight" : 7.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 0.026, + "admin_index" : 0, + "out" : 2, + "weight" : 9.45, + "geometry_index" : 60, + "location" : [ -122.408292, 37.77373 ] + }, { + "bearings" : [ 79, 135, 261, 315 ], + "entry" : [ false, true, true, false ], + "in" : 0, + "turn_weight" : 49.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 61, + "location" : [ -122.408464, 37.773704 ] + } ], + "bannerInstructions" : [ { + "primary" : { + "type" : "turn", + "modifier" : "slight left", + "text" : "Harrison Street", + "components" : [ { + "text" : "Harrison Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 102.0 + } ], + "destinations" : "Civic Center, 9th Street", + "maneuver" : { + "modifier" : "slight right", + "instruction" : "Keep right toward Civic Center.", + "type" : "fork", + "bearing_after" : 243, + "bearing_before" : 225, + "location" : [ -122.407503, 37.773872 ] + }, + "name" : "", + "duration" : 14.625, + "distance" : 102.0, + "driving_side" : "right", + "weight" : 71.394, + "mode" : "driving", + "geometry" : "_bp`gA|cdnhFjBtEz@bEf@pFjA|[r@vIf@nI" + }, { + "bannerInstructions" : [ { + "sub" : { + "text" : "", + "components" : [ { + "active_direction" : "left", + "active" : false, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active_direction" : "left", + "active" : true, + "text" : "", + "directions" : [ "left" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + }, { + "active" : false, + "text" : "", + "directions" : [ "straight" ], + "type" : "lane" + } ] + }, + "primary" : { + "type" : "turn", + "modifier" : "left", + "text" : "10th Street", + "components" : [ { + "text" : "10th Street", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 331.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "Turn left onto 10th Street. Then You will arrive at your destination.", + "announcement" : "Turn left onto 10th Street. Then You will arrive at your destination.", + "distanceAlongGeometry" : 100.8 + } ], + "intersections" : [ { + "entry" : [ false, false, false, true, false ], + "in" : 1, + "bearings" : [ 45, 81, 137, 226, 315 ], + "duration" : 1.182, + "turn_weight" : 12.0, + "turn_duration" : 0.259, + "admin_index" : 0, + "out" : 3, + "weight" : 13.131, + "geometry_index" : 62, + "location" : [ -122.408632, 37.773684 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 46, 135, 225 ], + "duration" : 2.142, + "turn_weight" : 1.75, + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 2, + "weight" : 4.351, + "geometry_index" : 63, + "location" : [ -122.408717, 37.773618 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 135, 225 ], + "duration" : 0.284, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "weight" : 2.089, + "geometry_index" : 64, + "location" : [ -122.4089, 37.773473 ] + }, { + "entry" : [ false, true ], + "in" : 0, + "bearings" : [ 45, 225 ], + "duration" : 5.262, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 1, + "weight" : 8.195, + "geometry_index" : 65, + "location" : [ -122.408923, 37.773455 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 137, 226 ], + "duration" : 1.393, + "turn_weight" : 1.75, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.008, + "admin_index" : 0, + "out" : 2, + "weight" : 3.446, + "geometry_index" : 66, + "location" : [ -122.409378, 37.773093 ] + }, { + "entry" : [ false, true, false ], + "in" : 0, + "bearings" : [ 46, 225, 318 ], + "duration" : 2.235, + "turn_weight" : 1.75, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.019, + "admin_index" : 0, + "out" : 1, + "weight" : 4.464, + "geometry_index" : 67, + "location" : [ -122.409503, 37.772996 ] + }, { + "entry" : [ false, true, true ], + "in" : 0, + "bearings" : [ 45, 225, 315 ], + "duration" : 4.53, + "turn_weight" : 1.75, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 1, + "weight" : 7.291, + "geometry_index" : 68, + "location" : [ -122.409693, 37.772846 ] + }, { + "entry" : [ false, false, true, true ], + "in" : 0, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 8.93, + "turn_weight" : 21.0, + "lanes" : [ { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "straight", "right" ], + "valid_indication" : "straight", + "valid" : true, + "active" : false + }, { + "indications" : [ "right" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 2.007, + "admin_index" : 0, + "out" : 2, + "weight" : 29.481, + "geometry_index" : 69, + "location" : [ -122.410083, 37.772538 ] + }, { + "bearings" : [ 45, 137, 225 ], + "entry" : [ false, true, true ], + "in" : 0, + "turn_weight" : 1.75, + "turn_duration" : 0.007, + "admin_index" : 0, + "out" : 2, + "geometry_index" : 71, + "location" : [ -122.410688, 37.77206 ] + } ], + "maneuver" : { + "modifier" : "slight left", + "instruction" : "Bear left onto Harrison Street.", + "type" : "turn", + "bearing_after" : 226, + "bearing_before" : 261, + "location" : [ -122.408632, 37.773684 ] + }, + "name" : "Harrison Street", + "duration" : 32.887, + "distance" : 331.0, + "driving_side" : "right", + "weight" : 82.679, + "mode" : "driving", + "geometry" : "gvo`gAnjfnhFbChD`HlJb@l@rUl[`ExFjHzJfRjWhLxOpO~SvXr_@xBxC" + }, { + "bannerInstructions" : [ { + "primary" : { + "type" : "arrive", + "text" : "You have arrived at your destination.", + "components" : [ { + "text" : "You have arrived at your destination.", + "type" : "text" + } ] + }, + "distanceAlongGeometry" : 87.0 + } ], + "voiceInstructions" : [ { + "ssmlAnnouncement" : "You have arrived at your destination.", + "announcement" : "You have arrived at your destination.", + "distanceAlongGeometry" : 65.0 + } ], + "intersections" : [ { + "entry" : [ false, true, true, false ], + "in" : 0, + "bearings" : [ 45, 135, 225, 315 ], + "duration" : 11.826, + "turn_weight" : 31.25, + "lanes" : [ { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : false + }, { + "indications" : [ "left" ], + "valid_indication" : "left", + "valid" : true, + "active" : true + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + }, { + "indications" : [ "straight" ], + "valid" : false, + "active" : false + } ], + "turn_duration" : 7.395, + "admin_index" : 0, + "out" : 1, + "weight" : 36.678, + "geometry_index" : 73, + "location" : [ -122.411287, 37.771587 ] + }, { + "bearings" : [ 135, 315 ], + "entry" : [ true, false ], + "in" : 1, + "turn_weight" : 1.75, + "admin_index" : 0, + "out" : 0, + "geometry_index" : 75, + "location" : [ -122.410905, 37.771281 ] + } ], + "maneuver" : { + "modifier" : "left", + "instruction" : "Turn left onto 10th Street.", + "type" : "turn", + "bearing_after" : 135, + "bearing_before" : 225, + "location" : [ -122.411287, 37.771587 ] + }, + "name" : "10th Street", + "duration" : 15.426, + "distance" : 87.0, + "driving_side" : "right", + "weight" : 42.838, + "mode" : "driving", + "geometry" : "esk`gAlpknhFfCgDzMsQjNqR" + }, { + "intersections" : [ { + "bearings" : [ 315 ], + "entry" : [ true ], + "in" : 0, + "admin_index" : 0, + "geometry_index" : 76, + "location" : [ -122.410592, 37.771035 ] + } ], + "voiceInstructions" : [ ], + "bannerInstructions" : [ ], + "maneuver" : { + "instruction" : "You have arrived at your destination.", + "type" : "arrive", + "bearing_after" : 0, + "bearing_before" : 135, + "location" : [ -122.410592, 37.771035 ] + }, + "name" : "10th Street", + "duration" : 0.0, + "distance" : 0.0, + "driving_side" : "right", + "weight" : 0.0, + "mode" : "driving", + "geometry" : "upj`gA~djnhF??" + } ], + "distance" : 2122.105, + "summary" : "Harrison Street, I 80 West" + } ], + "geometry" : "os_agAhkxmhF{GmJoCuDsCyDuFsHkWm]uAqBrD_FvQoV`@i@nBkCuV}\\`UiZPUdUsZ`DeEzZ|a@rFnHpU~[rC|D`GQ~CPfFZtE~@zExAxEvB|EfDzFpEpF~EpGfG~GlHzGvHfWl\\`EzExHnJ|e@nh@zJvN~JxOdJhOnIbOdInO~k@hmA|Rp`@lRj[`O`S|KfSrCnCdI|HnHtGbIpGtIfGfXtQlDlC`DrCnC`DzC|DnC~DjBtEz@bEf@pFjA|[r@vIf@nIbChD`HlJb@l@rUl[`ExFjHzJfRjWhLxOpO~SvXr_@xBxCfCgDzMsQjNqR" + } ], + "waypoints" : [ { + "distance" : 4.402, + "name" : "Folsom Street", + "location" : [ -122.401477, 37.781832 ] + }, { + "distance" : 4.188, + "name" : "10th Street", + "location" : [ -122.410592, 37.771035 ] + } ], + "code" : "Ok" +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt index c7f4f1ca202a..5d67e448d92f 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/benchmark/BenchmarkActivity.kt @@ -35,54 +35,15 @@ import org.maplibre.android.testapp.utils.BenchmarkResult import org.maplibre.android.testapp.utils.BenchmarkRun import org.maplibre.android.testapp.utils.BenchmarkRunResult import org.maplibre.android.testapp.utils.FrameTimeStore +import org.maplibre.android.testapp.utils.animateCameraSuspend import org.maplibre.android.testapp.utils.jsonPayload +import org.maplibre.android.testapp.utils.setStyleSuspend import java.io.File import java.util.ArrayList import kotlin.collections.flatMap import kotlin.collections.toTypedArray import kotlin.coroutines.resume -suspend fun MapLibreMap.animateCameraSuspend( - cameraUpdate: CameraUpdate, - durationMs: Int -): Unit = suspendCancellableCoroutine { continuation -> - animateCamera(cameraUpdate, durationMs, object : CancelableCallback { - var resumed = false - - override fun onCancel() { - continuation.cancel() - } - - override fun onFinish() { - if (!resumed) { - resumed = true - continuation.resume(Unit) - } - } - }) -} - -suspend fun MapView.setStyleSuspend(styleUrl: String): Unit = - suspendCancellableCoroutine { continuation -> - var listener: MapView.OnDidFinishLoadingStyleListener? = null - - var resumed = false - listener = MapView.OnDidFinishLoadingStyleListener { - if (!resumed) { - resumed = true - listener?.let { removeOnDidFinishLoadingStyleListener(it) } - continuation.resume(Unit) - } - } - addOnDidFinishLoadingStyleListener(listener) - getMapAsync { map -> map.setStyle(styleUrl) } - - continuation.invokeOnCancellation { - removeOnDidFinishLoadingStyleListener(listener) - } - - } - /** * Benchmark using a [android.view.TextureView] */ diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt new file mode 100644 index 000000000000..e51829565682 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt @@ -0,0 +1,84 @@ +package org.maplibre.android.testapp.activity.stability + +import android.annotation.SuppressLint +import android.app.ActivityManager +import android.app.ActivityOptions +import android.content.Context +import android.content.Intent +import android.hardware.display.DisplayManager +import android.os.Build +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import org.maplibre.android.testapp.R +import java.util.logging.Logger + +class LongRunningActivity : AppCompatActivity() { + + // config + companion object { + private val LOG = Logger.getLogger(LongRunningActivity::class.java.name) + + // activity lifetime (seconds) + private const val DURATION = 10 * 60 * 60 + // start one activity/view per display if available + private const val USE_SECONDARY_DISPLAY = true + + @SuppressLint("NewApi") + fun printStats(context: Context) { + val activityManager = context.getSystemService(ACTIVITY_SERVICE) as ActivityManager + val sysMemInfo = ActivityManager.MemoryInfo() + activityManager.getMemoryInfo(sysMemInfo) + + LOG.info("System: \n" + + "\tavailable memory - ${sysMemInfo.availMem / 1048576} MB\n" + + "\ttotal memory - ${sysMemInfo.totalMem / 1048576} MB\n" + + "\tlow memory threshold - ${sysMemInfo.threshold / 1048576} MB\n" + + "\tlow memory - ${sysMemInfo.lowMemory}\n" + ) + + val appMemInfo = activityManager.getProcessMemoryInfo(intArrayOf(android.os.Process.myPid())).first() + + LOG.info("Application memory: \n" + + appMemInfo.memoryStats.map { "\t${it.key} - ${it.value} KB" }.joinToString("\n") + ) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_long_running_maps) + + if (USE_SECONDARY_DISPLAY && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val displayManager = getSystemService(DISPLAY_SERVICE) as DisplayManager + val displays = displayManager.displays + + if (displays.size > 1) { + // remove navigation map from layout + supportFragmentManager + .beginTransaction() + .remove(supportFragmentManager.findFragmentById(R.id.navigation_map)!!) + .commit() + + // and move it to it's own activity + val activityOptions = ActivityOptions.makeBasic() + activityOptions.launchDisplayId = displays[1].displayId + + startActivity(Intent(this, NavigationMapActivity::class.java), activityOptions.toBundle()) + } + } + + LOG.info("Activity running for $DURATION seconds") + + val context = this + + lifecycleScope.launch { + delay(DURATION * 1000L) + + printStats(context) + finish() + } + } +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/NavigationMap.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/NavigationMap.kt new file mode 100644 index 000000000000..6dc6568bbe54 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/NavigationMap.kt @@ -0,0 +1,373 @@ +package org.maplibre.android.testapp.activity.stability + +import android.annotation.SuppressLint +import android.location.Location +import android.os.Bundle +import android.os.PersistableBundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import com.google.gson.Gson +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.maplibre.android.geometry.LatLng +import org.maplibre.android.location.LocationComponentActivationOptions +import org.maplibre.android.location.OnLocationCameraTransitionListener +import org.maplibre.android.location.modes.CameraMode +import org.maplibre.android.location.modes.RenderMode +import org.maplibre.android.maps.MapLibreMap +import org.maplibre.android.maps.MapView +import org.maplibre.android.maps.SupportMapFragment +import org.maplibre.android.testapp.activity.stability.LongRunningActivity.Companion.printStats +import org.maplibre.android.testapp.styles.TestStyles +import org.maplibre.android.testapp.utils.GeoParseUtil +import org.maplibre.android.testapp.utils.setStyleSuspend +import org.maplibre.geojson.Point +import org.maplibre.navigation.android.navigation.v5.location.replay.ReplayRouteLocationEngine +import org.maplibre.navigation.android.navigation.v5.milestone.BannerInstructionMilestone +import org.maplibre.navigation.android.navigation.v5.milestone.Milestone +import org.maplibre.navigation.android.navigation.v5.milestone.MilestoneEventListener +import org.maplibre.navigation.android.navigation.v5.models.DirectionsResponse +import org.maplibre.navigation.android.navigation.v5.models.DirectionsRoute +import org.maplibre.navigation.android.navigation.v5.models.RouteOptions +import org.maplibre.navigation.android.navigation.v5.navigation.MapLibreNavigation +import org.maplibre.navigation.android.navigation.v5.navigation.MapLibreNavigationOptions +import org.maplibre.navigation.android.navigation.v5.navigation.NavigationMapRoute +import org.maplibre.navigation.android.navigation.v5.routeprogress.ProgressChangeListener +import org.maplibre.navigation.android.navigation.v5.routeprogress.RouteProgress +import java.util.Locale +import java.util.logging.Logger +import kotlin.random.Random + +class NavigationMap : SupportMapFragment(), ProgressChangeListener, MilestoneEventListener { + private lateinit var map: MapLibreMap + private lateinit var mapView: MapView + + private lateinit var navigation: MapLibreNavigation + private lateinit var navigationMapRoute: NavigationMapRoute + private val replayRouteLocationEngine = ReplayRouteLocationEngine() + private var routeUpdateTimer = 0.0 + + // config + companion object { + private val LOG = Logger.getLogger(NavigationMap::class.java.name) + private const val RANDOM_SEED = 42 + private val RANDOM = Random(RANDOM_SEED) + + private val STYLES = arrayListOf( + TestStyles.AMERICANA, + TestStyles.OPENFREEMAP_LIBERTY, + TestStyles.OPENFREEMAP_BRIGHT, + TestStyles.AWS_OPEN_DATA_STANDARD_LIGHT, + TestStyles.PROTOMAPS_LIGHT, + TestStyles.PROTOMAPS_DARK, + TestStyles.PROTOMAPS_GRAYSCALE, + TestStyles.PROTOMAPS_WHITE, + TestStyles.PROTOMAPS_BLACK, + ) + + enum class RouteProvider { + Local, + OSRM, + Valhalla, + } + + private val ROUTE_PROVIDER = RouteProvider.Local + private const val ROUTE_UPDATE_INTERVAL = 10.0 + + // used by remote providers + private val ROUTES = arrayOf( + Pair(LatLng(52.521487, 13.409961), LatLng(52.502501, 13.423342)), // BER short + Pair(LatLng(52.46314, 13.339116), LatLng(52.545929, 13.457635)), // BER long + Pair(LatLng(38.903727, -77.000668), LatLng(38.890509, -77.025958)), // DC short + Pair(LatLng(38.876664, -77.206788), LatLng(38.957716, -77.027674)), // DC long + Pair(LatLng(37.781832, -122.401477), LatLng(37.771035, -122.410592)), // SF short + Pair(LatLng(37.736431, -122.504263), LatLng(37.785594, -122.401209)), // SF long + ) + + private fun random(min: Double, max: Double): Double = min + RANDOM.nextDouble() * (max - min) + private fun random(min: Int, max: Int): Int = RANDOM.nextInt(min, max) + + private fun randomZoom(): Double = random(13.0, 18.0) + private fun randomTilt(): Double = random(30.0, 60.0) + private fun randomSpeed(): Int = random(30, 130) // in km/h + private fun randomWaitTime(): Long = random(5000, 10000).toLong() + } + + override fun onMapReady(maplibreMap: MapLibreMap) { + super.onMapReady(maplibreMap) + + this.map = maplibreMap + this.mapView = view as MapView + + LOG.info("NavigationMap seed $RANDOM_SEED") + run() + } + + private fun run() { + lifecycleScope.launch { + mapView.setStyleSuspend(STYLES.random(RANDOM)) + enableLocation() + + navigation = MapLibreNavigation(requireContext(), MapLibreNavigationOptions + .builder() + .snapToRoute(true) + .build() + ).apply { + snapEngine + addProgressChangeListener(this@NavigationMap) + addMilestoneEventListener(this@NavigationMap) + } + + navigationMapRoute = NavigationMapRoute(navigation, mapView, map) + navigation.locationEngine = replayRouteLocationEngine + + startNewRoute() + } + } + + private fun startNewRoute() { + lifecycleScope.launch { + delay(randomWaitTime()) + + printStats(requireContext()) + + navigation.stopNavigation() + navigationMapRoute.removeRoute() + + mapView.setStyleSuspend(STYLES.random(RANDOM)) + + val route = getRoute() ?: return@launch + + // display route + navigationMapRoute = NavigationMapRoute(navigation, mapView, map) + navigationMapRoute.addRoute(route) + + // force tile load at starting position + val startingPoint = route.routeOptions()?.coordinates()?.firstOrNull() + if (startingPoint != null) { + map.locationComponent.forceLocationUpdate( + Location("StartingLocation").apply { + latitude = startingPoint.latitude() + longitude = startingPoint.longitude() + } + ) + } + + delay(randomWaitTime()) + + replayRouteLocationEngine.assign(route) + routeUpdateTimer = route.duration() + navigation.startNavigation(route) + } + } + + @SuppressLint("MissingPermission") + private fun enableLocation() { + map.locationComponent.activateLocationComponent( + LocationComponentActivationOptions + .builder(requireContext(), map.style!!) + .useDefaultLocationEngine(false) + .build() + ) + + map.locationComponent.isLocationComponentEnabled = true + map.locationComponent.renderMode = RenderMode.GPS + map.locationComponent.setCameraMode( + CameraMode.TRACKING_GPS, + object : + OnLocationCameraTransitionListener { + override fun onLocationCameraTransitionFinished(cameraMode: Int) { + map.locationComponent.zoomWhileTracking(randomZoom()) + map.locationComponent.tiltWhileTracking(randomTilt()) + } + + override fun onLocationCameraTransitionCanceled(cameraMode: Int) {} + } + ) + } + + private fun getRoute(): DirectionsRoute? { + var location: LatLng? = null + var destination: LatLng? = null + + val routeString: String? = when (ROUTE_PROVIDER) { + RouteProvider.Local -> { + val context = requireContext() + val routeFile = context.assets.list("routes/")!!.random(RANDOM) + LOG.info("Navigation - local route: $routeFile") + + val routeStr = GeoParseUtil.loadStringFromAssets(context, "routes/$routeFile") + + // quick parse to get the waypoints before starting the route + val json = Json.parseToJsonElement(routeStr).jsonObject + + val waypoints = json["waypoints"]?.jsonArray + val startWaypoint = waypoints?.first()?.jsonObject?.get("location")?.jsonArray + val endWaypoint = waypoints?.last()?.jsonObject?.get("location")?.jsonArray + + if (startWaypoint != null) { + location = LatLng( + Json.decodeFromJsonElement(startWaypoint.last()), + Json.decodeFromJsonElement(startWaypoint.first()), + ) + } + + if (endWaypoint != null) { + destination = LatLng( + Json.decodeFromJsonElement(endWaypoint.last()), + Json.decodeFromJsonElement(endWaypoint.first()), + ) + } + + routeStr + } + + RouteProvider.OSRM -> { + val routePoints = ROUTES.random(RANDOM) + location = routePoints.first + destination = routePoints.second + + val get = "${location.longitude},${location.latitude};" + + "${destination.longitude},${destination.latitude}" + + "?steps=true" + + val request = Request + .Builder() + .header("User-Agent", "MapLibre Android") + .url("https://router.project-osrm.org/route/v1/driving/$get") + .get() + .build() + + LOG.info("Navigation - OSRM route request " + + "(${location.longitude},${location.latitude}) -> " + + "(${destination.longitude},${destination.latitude})" + ) + + val response = OkHttpClient().newCall(request).execute() + response.body?.string() + } + + RouteProvider.Valhalla -> { + val routePoints = ROUTES.random(RANDOM) + location = routePoints.first + destination = routePoints.second + + val requestBody = Gson().toJson( + mapOf( + "format" to "osrm", + "costing" to "auto", + "banner_instructions" to true, + "voice_instructions" to true, + "language" to Locale.getDefault().language, + "directions_options" to mapOf( + "units" to "kilometers" + ), + "costing_options" to mapOf( + "auto" to mapOf( + "top_speed" to 130 + ) + ), + "locations" to listOf( + mapOf( + "lon" to location.longitude, + "lat" to location.latitude, + "type" to "break" + ), + mapOf( + "lon" to destination.longitude, + "lat" to destination.latitude, + "type" to "break" + ) + ) + ) + ).toRequestBody("application/json; charset=utf-8".toMediaType()) + + val request = Request + .Builder() + .header("User-Agent", "MapLibre Android") + .url("https://valhalla1.openstreetmap.de/route") + .post(requestBody) + .build() + + LOG.info("Navigation - Valhalla route request " + + "(${location.longitude},${location.latitude}) -> " + + "(${destination.longitude},${destination.latitude})" + ) + + val response = OkHttpClient().newCall(request).execute() + response.body?.string() + } + } + + if (routeString == null) { + LOG.warning("Failed to get route data") + return null + } + + val directionsResponse = DirectionsResponse.fromJson(routeString) + val route = directionsResponse.routes().first() + + val routeOptions = RouteOptions + .builder() + .baseUrl("https://maplibre.org") + .profile("maplibre") + .user("maplibre") + .accessToken("maplibre") + .voiceInstructions(true) + .bannerInstructions(true) + .language(Locale.getDefault().language) + .coordinates(mutableListOf( + location?.let { Point.fromLngLat(it.longitude, location.latitude) }, + destination?.let { Point.fromLngLat(it.longitude, destination.latitude) }, + )) + .requestUuid("0000-0000-0000-0000") + .build() + + return route.toBuilder().routeOptions(routeOptions).build() + } + + override fun onProgressChange(location: Location, progress: RouteProgress) { + map.locationComponent.forceLocationUpdate(location) + + if (routeUpdateTimer - progress.durationRemaining() > ROUTE_UPDATE_INTERVAL) { + map.locationComponent.zoomWhileTracking(randomZoom()) + map.locationComponent.tiltWhileTracking(randomTilt()) + + replayRouteLocationEngine.updateSpeed(randomSpeed()) + + routeUpdateTimer = progress.durationRemaining() + + LOG.info("Navigation - remaining duration ${progress.durationRemaining()}") + } + } + + override fun onMilestoneEvent(routeProgress: RouteProgress, instruction: String, milestone: Milestone) { + if (milestone !is BannerInstructionMilestone) { + return + } + + if (milestone.bannerInstructions.primary().type() == "arrive") { + startNewRoute() + } + } +} + +class NavigationMapActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + supportFragmentManager + .beginTransaction() + .replace(android.R.id.content, NavigationMap()) + .commit() + } +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/UserMap.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/UserMap.kt new file mode 100644 index 000000000000..ed7ef83273ab --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/UserMap.kt @@ -0,0 +1,283 @@ +package org.maplibre.android.testapp.activity.stability + +import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.toBitmap +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch +import org.maplibre.android.annotations.IconFactory +import org.maplibre.android.annotations.MarkerOptions +import org.maplibre.android.annotations.PolygonOptions +import org.maplibre.android.annotations.PolylineOptions +import org.maplibre.android.camera.CameraPosition +import org.maplibre.android.camera.CameraUpdateFactory +import org.maplibre.android.geometry.LatLng +import org.maplibre.android.geometry.LatLngBounds +import org.maplibre.android.maps.MapLibreMap +import org.maplibre.android.maps.MapView +import org.maplibre.android.maps.SupportMapFragment +import org.maplibre.android.testapp.styles.TestStyles +import org.maplibre.android.testapp.utils.animateCameraSuspend +import org.maplibre.android.testapp.utils.setStyleSuspend +import java.lang.reflect.Field +import java.util.logging.Logger +import kotlin.math.min +import kotlin.random.Random + +class UserMap : SupportMapFragment() { + private lateinit var map: MapLibreMap + private lateinit var mapView: MapView + private lateinit var bitmapDrawables: List + + companion object { + private val LOG = Logger.getLogger(UserMap::class.java.name) + private const val RANDOM_SEED = 42 + private val RANDOM = Random(RANDOM_SEED) + + private val STYLES = arrayListOf( + TestStyles.DEMOTILES, + TestStyles.AMERICANA, + TestStyles.OPENFREEMAP_LIBERTY, + TestStyles.OPENFREEMAP_BRIGHT, + TestStyles.AWS_OPEN_DATA_STANDARD_LIGHT, + TestStyles.PROTOMAPS_LIGHT, + TestStyles.PROTOMAPS_DARK, + TestStyles.PROTOMAPS_GRAYSCALE, + TestStyles.PROTOMAPS_WHITE, + TestStyles.PROTOMAPS_BLACK, + ) + + private val PLACES = arrayListOf( + LatLng(37.7749, -122.4194), // SF + LatLng(38.9072, -77.0369), // DC + LatLng(52.3702, 4.8952), // AMS + LatLng(60.1699, 24.9384), // HEL + LatLng(-13.1639, -74.2236), // AYA + LatLng(52.5200, 13.4050), // BER + LatLng(12.9716, 77.5946), // BAN + LatLng(31.2304, 121.4737), // SHA + ) + + // controls the list of icons available + // false -> use `ICONS` list + // true -> use all bitmap drawables in `org.maplibre.android.R.drawable.*` + private const val USE_ALL_DRAWABLES = false + private val ICONS = arrayListOf( + org.maplibre.android.R.drawable.maplibre_info_icon_default, + org.maplibre.android.R.drawable.maplibre_user_icon, + org.maplibre.android.R.drawable.maplibre_marker_icon_default, + org.maplibre.android.R.drawable.maplibre_compass_icon, + org.maplibre.android.R.drawable.maplibre_user_puck_icon, + ) + + private fun random(min: Double, max: Double): Double = min + RANDOM.nextDouble() * (max - min) + private fun random(min: Int, max: Int): Int = RANDOM.nextInt(min, max) + + private fun weightedRandom(values: List>): T { + val cumulativeWeights = values.scan(0.0) { acc, value -> acc + value.second } + var index = + cumulativeWeights.binarySearch(random(0.00001, cumulativeWeights.last())) + + if (index < 0) + index = -index - 1 + + return values[index - 1].first + } + + private fun randomSlowDuration(): Int = random(3000, 5000) + private fun randomFastDuration(): Int = random(500, 1000) + + private fun randomPlacePoints(): Int = random(10, 20) + private fun randomPlaceActions(): Int = random(10, 20) + + private fun randomLatLng(bounds: LatLngBounds): LatLng = + LatLng( + random(bounds.latitudeSouth, bounds.latitudeNorth), + random(bounds.longitudeWest, bounds.longitudeEast) + ) + + private fun randomLatLng(map: MapLibreMap): LatLng = + randomLatLng(map.projection.visibleRegion.latLngBounds) + + private fun randomZoom(): Double = random(14.0, 20.0) + private fun randomTilt(): Double = random(0.0, 60.0) + private fun randomBearing(): Double = random(0.0, 360.0) + + private fun randomAnnotationRemove(): Int = random(4, 8) + private fun randomAnnotationAdd(): Int = random(2, 4) + + private fun randomPolyPoints(bounds: LatLngBounds): List { + val boundMultiplier = 0.25 + val lat = random(bounds.latitudeSouth, bounds.latitudeNorth) + val lng = random(bounds.longitudeWest, bounds.longitudeEast) + val latRange = bounds.latitudeSpan * boundMultiplier / 2.0 + val lngRange = bounds.longitudeSpan * boundMultiplier / 2.0 + + return List(random(3, 15)) { + LatLng( + lat + random(-latRange, latRange), + lng + random(-lngRange, lngRange) + ) + } + } + + private fun randomLineWidth(): Float = random(1.0, 4.0).toFloat() + + private fun randomColor(): Int = + Color.argb( + RANDOM.nextInt(127, 256), + RANDOM.nextInt(256), + RANDOM.nextInt(256), + RANDOM.nextInt(256) + ) + } + + override fun onMapReady(maplibreMap: MapLibreMap) { + super.onMapReady(maplibreMap) + + this.map = maplibreMap + this.mapView = view as MapView + + LOG.info("UserMap seed $RANDOM_SEED") + run() + } + + private fun run() { + if (USE_ALL_DRAWABLES) { + bitmapDrawables = + org.maplibre.android.R.drawable::class.java.fields.map { field: Field -> + ResourcesCompat.getDrawable( + this.resources, + field.getInt(null), + requireActivity().theme + ) + }.filterIsInstance() + } else { + bitmapDrawables = ICONS.map { id -> + ResourcesCompat.getDrawable( + this.resources, + id, + requireActivity().theme + )!! + } + } + + lifecycleScope.launch { + // since the random generator was not reset each run will have different values + while (true) { + runStyleActions() + } + } + } + + private suspend fun runStyleActions() { + for (style in STYLES.shuffled(RANDOM)) { + mapView.setStyleSuspend(style) + runCameraActions() + } + } + + private suspend fun runCameraActions() { + // camera actions with different weights + // position updates are more frequent + val actions = listOf( + Pair({ CameraUpdateFactory.newLatLng(randomLatLng(map)) }, 2.0), + Pair({ CameraUpdateFactory.zoomTo(randomZoom()) }, 1.0), + Pair({ CameraUpdateFactory.tiltTo(randomTilt()) }, 1.0), + Pair({ CameraUpdateFactory.bearingTo(randomBearing()) }, 1.0), + ) + + for (placeCenter in PLACES.shuffled(RANDOM)) { + // update all values to simulate a long jump + // (generated by the app, searching for a city/street, etc) + val cameraPosition = CameraPosition + .Builder() + .target(placeCenter) + .zoom(randomZoom()) + .tilt(randomTilt()) + .bearing(randomBearing()) + .build() + + map.animateCameraSuspend( + CameraUpdateFactory.newCameraPosition(cameraPosition), + randomSlowDuration() + ) + + repeat(randomPlacePoints()) { + // perform a series of fast camera actions + repeat(randomPlaceActions()) { + // update each value individually to simulate user interaction + map.animateCameraSuspend(weightedRandom(actions)(), randomFastDuration()) + } + + runAnnotationActions() + } + + map.removeAnnotations() + } + } + + private fun runAnnotationActions() { + // remove some annotations + repeat(min(map.annotations.size, randomAnnotationRemove())) { + map.removeAnnotation(map.annotations.random(RANDOM)) + } + + // add some annotations + val bounds = map.projection.visibleRegion.latLngBounds + + // markers + repeat(randomAnnotationAdd()) { + // get a random drawable + map.addMarker( + MarkerOptions() + .position(randomLatLng(bounds)) + .icon( + IconFactory.getInstance(requireContext()).fromBitmap( + bitmapDrawables + .random(RANDOM) + .mutate() + .apply { setTint(randomColor()) } + .toBitmap(), + ) + ) + ) + } + + // polylines + repeat(randomAnnotationAdd()) { + map.addPolyline( + PolylineOptions() + .color(randomColor()) + .width(randomLineWidth()) + .addAll(randomPolyPoints(bounds)), + ) + } + + // polygons + repeat(randomAnnotationAdd()) { + map.addPolygon( + PolygonOptions() + .fillColor(randomColor()) + .strokeColor(randomColor()) + .addAll(randomPolyPoints(bounds)), + ) + } + } +} + +class UserMapActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + supportFragmentManager + .beginTransaction() + .replace(android.R.id.content, UserMap()) + .commit() + } +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/CoroutineUtils.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/CoroutineUtils.kt new file mode 100644 index 000000000000..db02eb9861d6 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/utils/CoroutineUtils.kt @@ -0,0 +1,47 @@ +package org.maplibre.android.testapp.utils + +import kotlinx.coroutines.suspendCancellableCoroutine +import org.maplibre.android.camera.CameraUpdate +import org.maplibre.android.maps.MapLibreMap +import org.maplibre.android.maps.MapLibreMap.CancelableCallback +import org.maplibre.android.maps.MapView +import kotlin.coroutines.resume + +suspend fun MapView.setStyleSuspend(styleUrl: String): Unit = + suspendCancellableCoroutine { continuation -> + var listener: MapView.OnDidFinishLoadingStyleListener? = null + + var resumed = false + listener = MapView.OnDidFinishLoadingStyleListener { + if (!resumed) { + resumed = true + listener?.let { removeOnDidFinishLoadingStyleListener(it) } + continuation.resume(Unit) + } + } + addOnDidFinishLoadingStyleListener(listener) + getMapAsync { map -> map.setStyle(styleUrl) } + + continuation.invokeOnCancellation { + removeOnDidFinishLoadingStyleListener(listener) + } + + } + +suspend fun MapLibreMap.animateCameraSuspend(cameraUpdate: CameraUpdate, durationMs: Int): Unit = + suspendCancellableCoroutine { continuation -> + animateCamera(cameraUpdate, durationMs, object : CancelableCallback { + var resumed = false + + override fun onCancel() { + continuation.cancel() + } + + override fun onFinish() { + if (!resumed) { + resumed = true + continuation.resume(Unit) + } + } + }) + } diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml new file mode 100644 index 000000000000..19083eb64105 --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml index cbeab37c0171..20de4e2097c9 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/descriptions.xml @@ -6,6 +6,7 @@ Showcase MapFragment Showcase SupportMapFragment Showcase using a Map Fragment with a fragment backstack + Showcase a long running scenario Activity with multiple maps on screen Add marker to map on long press Use JSON API to add markers diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml index 66121464a7fc..9649a9852ff5 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/values/titles.xml @@ -4,6 +4,7 @@ Map Fragment Backstack Map Fragment Multiple Maps on Screen + Long running Maps Add Markers In Bulk Animated SymbolLayer Dynamic Marker diff --git a/platform/android/gradle/libs.versions.toml b/platform/android/gradle/libs.versions.toml index 9f1b79c5c9c4..8f611f99e9cc 100644 --- a/platform/android/gradle/libs.versions.toml +++ b/platform/android/gradle/libs.versions.toml @@ -36,6 +36,7 @@ kotlinxCoroutinesAndroid = { module = "org.jetbrains.kotlinx:kotlinx-coroutines- maplibreJavaGeoJSON = { group = "org.maplibre.gl", name = "android-sdk-geojson", version.ref = "mapLibreServices" } maplibreGestures = { group = "org.maplibre.gl", name = "maplibre-android-gestures", version = "0.0.4" } maplibreJavaTurf = { group = "org.maplibre.gl", name = "android-sdk-turf", version.ref = "mapLibreServices" } +maplibreNavigation = { group = "com.github.maplibre.maplibre-navigation-android", name = "libandroid-navigation", version = "4.0.0" } junit = { group = "junit", name = "junit", version.ref = "junit" } mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } diff --git a/platform/android/settings.gradle.kts b/platform/android/settings.gradle.kts index 4c6c239bc844..0b8c6795894c 100644 --- a/platform/android/settings.gradle.kts +++ b/platform/android/settings.gradle.kts @@ -16,6 +16,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { url = uri("https://jitpack.io") } } } From 898c237dcb3cbff3b2cd5391c3ab3356ba1944bb Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 18 Aug 2025 23:22:46 +0200 Subject: [PATCH 319/339] Use free runners Node.js CI (#3715) --- .github/workflows/node-ci.yml | 7 ++++--- .github/workflows/node-release.yml | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 4337867b5fd6..c3d285899453 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -76,11 +76,11 @@ jobs: include: - runs-on: ubuntu-22.04 arch: x86_64 - - runs-on: MapLibre_Native_Ubuntu_22_04_ARM_8_core + - runs-on: ubuntu-22.04-arm arch: arm64 - runs-on: macos-14 arch: arm64 - - runs-on: macos-14-large + - runs-on: macos-13 arch: x86_64 - runs-on: windows-2022 arch: x86_64 @@ -157,7 +157,8 @@ jobs: "PATH=$env:PATH" | Out-File -FilePath $env:GITHUB_ENV -Append - name: Setup cmake - if: ${{contains(runner.name, 'GitHub Actions')}} + # linux arm not supported https://github.com/jwlawson/actions-setup-cmake/issues/79 + if: ${{contains(runner.name, 'GitHub Actions') && matrix.runs-on != 'ubuntu-22.04-arm' }} uses: jwlawson/actions-setup-cmake@v2 with: cmake-version: '3.31' diff --git a/.github/workflows/node-release.yml b/.github/workflows/node-release.yml index 249475538e79..5829a375dda2 100644 --- a/.github/workflows/node-release.yml +++ b/.github/workflows/node-release.yml @@ -46,11 +46,11 @@ jobs: include: - runs-on: ubuntu-22.04 arch: x86_64 - - runs-on: MapLibre_Native_Ubuntu_22_04_ARM_8_core + - runs-on: ubuntu-22.04-arm arch: arm64 - runs-on: macos-14 arch: arm64 - - runs-on: macos-14-large + - runs-on: macos-13 arch: x86_64 - runs-on: windows-2022 arch: x86_64 From 98d80825e926f7d7f49ae69671c5983bbaac584e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 19 Aug 2025 16:31:25 +0200 Subject: [PATCH 320/339] Use macos-14 instead of macos-latest (#3735) --- .github/workflows/ios-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 05e88e25572f..4d8701cf0c7b 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -375,7 +375,7 @@ jobs: ios-build-cmake: needs: pre_job - runs-on: macos-latest + runs-on: macos-14 if: needs.pre_job.outputs.should_skip != 'true' steps: - uses: actions/checkout@v4 From 0bcc48f57900b23ea71b6bf185ee645e8057840d Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 19 Aug 2025 16:33:23 +0200 Subject: [PATCH 321/339] Remove pin to old CMake version (#3736) --- .github/actions/setup-android-ci/action.yml | 6 ------ .github/workflows/android-ci.yml | 12 ------------ .github/workflows/android-release.yml | 6 ------ .github/workflows/linux-ci.yml | 6 ------ .github/workflows/pr-bloaty-ios.yml | 6 ------ .github/workflows/pr-linux-tests.yml | 6 ------ 6 files changed, 42 deletions(-) diff --git a/.github/actions/setup-android-ci/action.yml b/.github/actions/setup-android-ci/action.yml index 5973709991e8..dca728243bf2 100644 --- a/.github/actions/setup-android-ci/action.yml +++ b/.github/actions/setup-android-ci/action.yml @@ -28,12 +28,6 @@ runs: distribution: "temurin" java-version: "17" - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index bd3abc732c4c..0707f754c71f 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -169,12 +169,6 @@ jobs: distribution: "temurin" java-version: "17" - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ github.job }} @@ -237,12 +231,6 @@ jobs: append-timestamp: false max-size: 5G - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - uses: actions/setup-java@v4 with: distribution: "temurin" diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml index bd3936bd0ae5..e5554d511e68 100644 --- a/.github/workflows/android-release.yml +++ b/.github/workflows/android-release.yml @@ -92,12 +92,6 @@ jobs: distribution: "temurin" java-version: "17" - - name: Get CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - name: npm install run: npm install --ignore-scripts diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index fd344cabfd12..f8cb8c297aa8 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -75,12 +75,6 @@ jobs: with: languages: cpp - - name: Get latest CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - name: Install dependencies run: .github/scripts/install-linux-deps diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index b691c29304e2..cccfd4a60f05 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -46,12 +46,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Get latest CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - name: Cache Bloaty id: cache-bloaty uses: actions/cache@v4 diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index e5c53b98bd8a..178024db6d9e 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -65,12 +65,6 @@ jobs: run: wget -O mbgl-render-legacy "${download_url}/mbgl-render-${legacy_maplibre_sha}" continue-on-error: true - - name: Get latest CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: 3.24.1 - ninjaVersion: latest - - name: Cache Bloaty id: cache-bloaty uses: actions/cache@v4 From 8de8b8c5c09ce9a383b18ddd69bc5ace4df45b40 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 19 Aug 2025 18:36:47 +0300 Subject: [PATCH 322/339] Set `LongRunningActivity` duration (#3731) --- .../android/testapp/activity/SequentialActivityTest.kt | 3 +++ .../android/testapp/activity/stability/LongRunningActivity.kt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt index 6e1b4d6f965f..84c6a99a6c14 100644 --- a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt @@ -21,6 +21,9 @@ class SequentialActivityTest(private val activity: Class) { FeatureOverviewActivity::class.java, org.maplibre.android.testapp.activity.benchmark.BenchmarkActivity::class.java, org.maplibre.android.testapp.activity.telemetry.PerformanceMeasurementActivity::class.java, + org.maplibre.android.testapp.activity.stability.LongRunningActivity::class.java, + org.maplibre.android.testapp.activity.stability.UserMapActivity::class.java, + org.maplibre.android.testapp.activity.stability.NavigationMapActivity::class.java, // need style updates org.maplibre.android.testapp.activity.turf.MapSnapshotterWithinExpression::class.java, diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt index e51829565682..44a880b322ab 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/stability/LongRunningActivity.kt @@ -22,7 +22,7 @@ class LongRunningActivity : AppCompatActivity() { private val LOG = Logger.getLogger(LongRunningActivity::class.java.name) // activity lifetime (seconds) - private const val DURATION = 10 * 60 * 60 + private const val DURATION = 72 * 60 * 60 // start one activity/view per display if available private const val USE_SECONDARY_DISPLAY = true From e8c3c23e30c20556da822d3d3e6c746217ca4d86 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 19 Aug 2025 21:57:02 +0300 Subject: [PATCH 323/339] `keepScreenOn` for long running test (#3740) --- .../src/main/res/layout/activity_long_running_maps.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml index 19083eb64105..cd2a30b0ef86 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_long_running_maps.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:keepScreenOn="true" tools:ignore="NestedWeights"> Date: Wed, 20 Aug 2025 21:28:01 +0200 Subject: [PATCH 324/339] Use `ctcache` to cache `clang-tidy` results (#3741) --- .github/workflows/linux-ci.yml | 22 ++++++++++++++++++++++ CMakeLists.txt | 13 +------------ cmake/clang-tidy.cmake | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 cmake/clang-tidy.cmake diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index f8cb8c297aa8..a1b13723a680 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -89,6 +89,14 @@ jobs: sudo chmod +x /usr/bin/sccache rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl + - name: Install ctcache + run: | + # pending open PR https://github.com/matus-chochlik/ctcache/pull/94 + git clone https://github.com/louwers/ctcache.git + cd ctcache + cd .. + mv ctcache /usr/local/bin + - name: Configure AWS Credentials if: vars.OIDC_AWS_ROLE_TO_ASSUME uses: aws-actions/configure-aws-credentials@v4 @@ -112,8 +120,22 @@ jobs: export SCCACHE_S3_NO_CREDENTIALS=1 fi + # ctcache configuration + export CTCACHE_HOST=34.229.50.221 + export CTCACHE_PORT=5000 + export CTCACHE_PROTO=http + + if [ -n "${{ secrets.CTCACHE_AUTH_KEY }}" ]; then + echo "setting CTCACHE_AUTH_KEY" + export CTCACHE_AUTH_KEY=${{ secrets.CTCACHE_AUTH_KEY }} + else + # do not write to cache if CTCACHE_AUTH_KEY not set + export CTCACHE_HOST_READ_ONLY=1 + fi + cmake --preset linux-${{ matrix.variant.renderer }} \ -DMLN_WITH_CLANG_TIDY=ON \ + -DCLANG_TIDY_COMMAND=/usr/local/bin/ctcache/clang-tidy \ -DCMAKE_C_COMPILER_LAUNCHER=sccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ -DMLN_WITH_COVERAGE=ON diff --git a/CMakeLists.txt b/CMakeLists.txt index 350f1816cdcf..501f4898054b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,18 +28,7 @@ if (MLN_DRAWABLE_RENDERER) message(FATAL "Do not pass MLN_DRAWABLE_RENDERER, the drawable renderer is now the default") endif() -if (MLN_WITH_CLANG_TIDY) - find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) - if(NOT CLANG_TIDY_COMMAND) - message(FATAL_ERROR "ENABLE_CLANG_TIDY is ON but clang-tidy is not found!") - else() - message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}") - endif() - # TODO: there are options which are only available on GCC(e.g. -Werror=maybe-uninitialized), - # that's why we need to disable this `unknown-warning-option` here. - # We could check if current compiler supports particular flag before enabling it. - set(CLANG_TIDY_COMMAND "${CLANG_TIDY_COMMAND};--extra-arg=-Wno-unknown-warning-option;--extra-arg=-Wno-pragmas") -endif() +include(cmake/clang-tidy.cmake) if (MLN_WITH_QT AND NOT CMAKE_OSX_DEPLOYMENT_TARGET) set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0) diff --git a/cmake/clang-tidy.cmake b/cmake/clang-tidy.cmake new file mode 100644 index 000000000000..6b4768921bd3 --- /dev/null +++ b/cmake/clang-tidy.cmake @@ -0,0 +1,17 @@ +if (MLN_WITH_CLANG_TIDY OR MLN_CLANG_TIDY_COMMAND) + if(MLN_CLANG_TIDY_COMMAND) + set(CLANG_TIDY_COMMAND MLN_CLANG_TIDY_COMMAND) + message(STATUS "Using clang-tidy at ${CLANG_TIDY_COMMAND}") + else() + find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) + if(NOT CLANG_TIDY_COMMAND) + message(FATAL_ERROR "ENABLE_CLANG_TIDY is ON but clang-tidy is not found!") + else() + message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}") + endif() + endif() + # TODO: there are options which are only available on GCC(e.g. -Werror=maybe-uninitialized), + # that's why we need to disable this `unknown-warning-option` here. + # We could check if current compiler supports particular flag before enabling it. + set(CLANG_TIDY_COMMAND "${CLANG_TIDY_COMMAND};--extra-arg=-Wno-unknown-warning-option;--extra-arg=-Wno-pragmas") +endif() From 12a303aa3cfb585e1a69eebd9276ee42c83b34ba Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 21 Aug 2025 21:48:14 +0200 Subject: [PATCH 325/339] Use sccache with S3 backend for Android CI (#3743) --- .github/actions/install-sccache/action.yml | 13 ++ .github/actions/setup-android-ci/action.yml | 44 +----- .github/workflows/android-ci.yml | 144 ++++++++++++------ .github/workflows/linux-ci.yml | 8 +- .../main/kotlin/org/maplibre/CcachePlugin.kt | 4 +- platform/android/settings.gradle.kts | 6 + 6 files changed, 123 insertions(+), 96 deletions(-) create mode 100644 .github/actions/install-sccache/action.yml diff --git a/.github/actions/install-sccache/action.yml b/.github/actions/install-sccache/action.yml new file mode 100644 index 000000000000..0d025a49ad6b --- /dev/null +++ b/.github/actions/install-sccache/action.yml @@ -0,0 +1,13 @@ +name: install-sccache +description: "Install sccache" +runs: + using: "composite" + steps: + - name: Install sccache + run: | + curl -LO https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz + tar -xzf sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz + sudo mv sccache-v0.10.0-x86_64-unknown-linux-musl/sccache /usr/bin/sccache + sudo chmod +x /usr/bin/sccache + rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl* + shell: bash diff --git a/.github/actions/setup-android-ci/action.yml b/.github/actions/setup-android-ci/action.yml index dca728243bf2..a3375852721b 100644 --- a/.github/actions/setup-android-ci/action.yml +++ b/.github/actions/setup-android-ci/action.yml @@ -28,48 +28,6 @@ runs: distribution: "temurin" java-version: "17" - - uses: actions/setup-node@v4 - with: - node-version-file: ".nvmrc" - - - name: npm install - run: npm install --ignore-scripts - working-directory: . - shell: bash - - - name: run platform/android/scripts/generate-style-code.mjs - run: node platform/android/scripts/generate-style-code.mjs - working-directory: . - shell: bash - - - run: | - python3 -m venv venv - source venv/bin/activate - pip3 install pre-commit - shell: bash - - - run: | - source venv/bin/activate - pre-commit run clang-format --all-files - continue-on-error: true # this can mean files are modified, which is not an error - shell: bash - - - run: | - source venv/bin/activate - pre-commit run clang-format --all-files - rm -rf venv - shell: bash - - - uses: infotroph/tree-is-clean@v1 - with: - check_untracked: true - - - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }} - append-timestamp: false - max-size: 5G - - name: restore-gradle-cache uses: actions/cache@v4 env: @@ -79,3 +37,5 @@ runs: key: ${{ env.cache-name }}-${{ hashFiles('platform/android/buildSrc/src/main/kotlin/maplibre.dependencies.gradle.kts') }}-${{ hashFiles('platform/android/build.gradle.kts') }}-${{ hashFiles('platform/android/local.properties') }}-${{ hashFiles('platform/android/gradle/wrapper/gradle-wrapper.properties') }} restore-keys: | - ${{ env.cache-name }} + + - uses: ./.github/actions/install-sccache diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 0707f754c71f..710cdc1aeeb8 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -1,5 +1,8 @@ name: android-ci +permissions: + id-token: write # needed for AWS + on: push: branches: @@ -58,6 +61,60 @@ jobs: - uses: ./.github/actions/setup-android-ci + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - name: npm install + run: npm install --ignore-scripts + working-directory: . + shell: bash + + - name: run platform/android/scripts/generate-style-code.mjs + run: node platform/android/scripts/generate-style-code.mjs + working-directory: . + shell: bash + + - run: | + python3 -m venv venv + source venv/bin/activate + pip3 install pre-commit + shell: bash + + - run: | + source venv/bin/activate + pre-commit run clang-format --all-files + continue-on-error: true # this can mean files are modified, which is not an error + shell: bash + + - run: | + source venv/bin/activate + pre-commit run clang-format --all-files + rm -rf venv + shell: bash + + - uses: infotroph/tree-is-clean@v1 + with: + check_untracked: true + + - name: Configure AWS Credentials + if: vars.OIDC_AWS_ROLE_TO_ASSUME + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: us-west-2 + role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} + role-session-name: ${{ github.run_id }} + + - name: Configure sccache + run: | + echo SCCACHE_BUCKET=maplibre-native-sccache >> "$GITHUB_ENV" + echo SCCACHE_REGION=eu-central-1 >> "$GITHUB_ENV" + + if [ -z "${AWS_SECRET_ACCESS_KEY}" ]; then + echo "AWS_SECRET_ACCESS_KEY not set; not uploading sccache cache to S3" + echo SCCACHE_S3_NO_CREDENTIALS=1 >> "$GITHUB_ENV" + fi + - name: Check code style if: matrix.renderer == 'opengl' run: make android-check @@ -88,7 +145,7 @@ jobs: - name: Build Benchmark, copy to platform/android run: | - ./gradlew assemble${{ matrix.renderer }}Release assemble${{ matrix.renderer }}ReleaseAndroidTest -PtestBuildType=release + ./gradlew assemble${{ matrix.renderer }}Release assemble${{ matrix.renderer }}ReleaseAndroidTest -PtestBuildType=release -Pmaplibre.abis=arm64-v8a cp MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release.apk . cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/${{ matrix.renderer }}/release/MapLibreAndroidTestApp-${{ matrix.renderer }}-release-androidTest.apk . @@ -122,7 +179,7 @@ jobs: - name: Build Instrumentation Tests (${{ matrix.renderer }}), copy to platform/android run: | - ./gradlew assemble${{ matrix.renderer }}Debug assemble${{ matrix.renderer }}DebugAndroidTest -PtestBuildType=debug + ./gradlew assemble${{ matrix.renderer }}Debug assemble${{ matrix.renderer }}DebugAndroidTest -PtestBuildType=debug -Pmaplibre.abis=arm64-v8a cp MapLibreAndroidTestApp/build/outputs/apk/${{ matrix.renderer }}/debug/MapLibreAndroidTestApp-${{ matrix.renderer }}-debug.apk InstrumentationTestApp${{ env.renderer }}.apk cp MapLibreAndroidTestApp/build/outputs/apk/androidTest/${{ matrix.renderer }}/debug/MapLibreAndroidTestApp-${{ matrix.renderer }}-debug-androidTest.apk InstrumentationTests${{ env.renderer }}.apk @@ -135,6 +192,9 @@ jobs: platform/android/InstrumentationTestApp${{ env.renderer }}.apk platform/android/InstrumentationTests${{ env.renderer }}.apk + - name: Show sccache stats + run: sccache --show-stats + android-build-cpp-test: runs-on: ubuntu-24.04 @@ -147,41 +207,38 @@ jobs: working-directory: test/android steps: - - name: Free Disk Space (Ubuntu) - if: startsWith(runner.name, 'GitHub Actions') - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: true - docker-images: true - swap-storage: false - - uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - - uses: actions/setup-java@v4 - with: - distribution: "temurin" - java-version: "17" - - - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }} - append-timestamp: false - max-size: 5G + - uses: ./.github/actions/setup-android-ci - name: Create data.zip in assets directory run: zip -r test/android/app/src/main/assets/data.zip -@ < test/android/app/src/main/assets/to_zip.txt working-directory: . + - name: Configure AWS Credentials + if: vars.OIDC_AWS_ROLE_TO_ASSUME + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: us-west-2 + role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} + role-session-name: ${{ github.run_id }} + + - name: Configure sccache + run: | + echo SCCACHE_BUCKET=maplibre-native-sccache >> "$GITHUB_ENV" + echo SCCACHE_REGION=eu-central-1 >> "$GITHUB_ENV" + + if [ -z "${AWS_SECRET_ACCESS_KEY}" ]; then + echo "AWS_SECRET_ACCESS_KEY not set; not uploading sccache cache to S3" + echo SCCACHE_S3_NO_CREDENTIALS=1 >> "$GITHUB_ENV" + fi + - name: Build C++ Unit Tests App run: | - ./gradlew assembleDebug assembleAndroidTest + ./gradlew assembleDebug assembleAndroidTest -Pmaplibre.abis=arm64-v8a cp app/build/outputs/apk/debug/app-debug.apk . cp app/build/outputs/apk/androidTest/release/app-release-androidTest.apk . @@ -208,33 +265,30 @@ jobs: if: needs.pre_job.outputs.should_skip != 'true' steps: - - name: Free Disk Space (Ubuntu) - if: startsWith(runner.name, 'GitHub Actions') - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: true - docker-images: true - swap-storage: false - - uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: ${{ github.job }} - append-timestamp: false - max-size: 5G + - uses: ./.github/actions/setup-android-ci - - uses: actions/setup-java@v4 + - name: Configure AWS Credentials + if: vars.OIDC_AWS_ROLE_TO_ASSUME + uses: aws-actions/configure-aws-credentials@v4 with: - distribution: "temurin" - java-version: "17" + aws-region: us-west-2 + role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} + role-session-name: ${{ github.run_id }} + + - name: Configure sccache + run: | + echo SCCACHE_BUCKET=maplibre-native-sccache >> "$GITHUB_ENV" + echo SCCACHE_REGION=eu-central-1 >> "$GITHUB_ENV" + + if [ -z "${AWS_SECRET_ACCESS_KEY}" ]; then + echo "AWS_SECRET_ACCESS_KEY not set; not uploading sccache cache to S3" + echo SCCACHE_S3_NO_CREDENTIALS=1 >> "$GITHUB_ENV" + fi - name: Build and Upload Render Test APKs (${{ matrix.flavor }}) uses: ./.github/actions/android-build-and-upload-render-test diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index a1b13723a680..3b7a79409fab 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -81,13 +81,7 @@ jobs: - if: matrix.variant.rust run: cargo install cxxbridge-cmd --version 1.0.157 --locked - - name: Install sccache - run: | - curl -LO https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz - tar -xzf sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz - sudo mv sccache-v0.10.0-x86_64-unknown-linux-musl/sccache /usr/bin/sccache - sudo chmod +x /usr/bin/sccache - rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl + - uses: ./.github/actions/install-sccache - name: Install ctcache run: | diff --git a/platform/android/MapLibrePlugin/src/main/kotlin/org/maplibre/CcachePlugin.kt b/platform/android/MapLibrePlugin/src/main/kotlin/org/maplibre/CcachePlugin.kt index d42edbe95461..486d71acf88e 100644 --- a/platform/android/MapLibrePlugin/src/main/kotlin/org/maplibre/CcachePlugin.kt +++ b/platform/android/MapLibrePlugin/src/main/kotlin/org/maplibre/CcachePlugin.kt @@ -43,8 +43,8 @@ fun findCacheToolPath(): String? { } } - // Try to find ccache first, then fallback to sccache - return findCommandPath(ccacheCommand) ?: findCommandPath(sccacheCommand) + // Try to find sccache first, then fallback to ccache + return findCommandPath(sccacheCommand) ?: findCommandPath(ccacheCommand) } class CcachePlugin : Plugin { diff --git a/platform/android/settings.gradle.kts b/platform/android/settings.gradle.kts index 0b8c6795894c..8c5b2212b9fd 100644 --- a/platform/android/settings.gradle.kts +++ b/platform/android/settings.gradle.kts @@ -39,3 +39,9 @@ includeBuild(cppTestProjectDir) { } includeBuild("./MapLibrePlugin") + +buildCache { + local { + isEnabled = true + } +} From 3cef33215c6c6191e27e12a02d2975ee8204d894 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 25 Aug 2025 22:24:06 +0300 Subject: [PATCH 326/339] Fix Android backend cleanup (#3681) --- .../src/cpp/android_gl_renderer_backend.cpp | 8 +++++++- .../android/MapLibreAndroid/src/cpp/map_renderer.cpp | 5 +++++ .../renderer/surfaceview/MapLibreGLSurfaceView.java | 11 ++++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp index 49aadd27e56c..8bed72649c2b 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_gl_renderer_backend.cpp @@ -37,7 +37,13 @@ AndroidGLRendererBackend::AndroidGLRendererBackend() : gl::RendererBackend(gfx::ContextMode::Unique), mbgl::gfx::Renderable({64, 64}, std::make_unique(*this)) {} -AndroidGLRendererBackend::~AndroidGLRendererBackend() = default; +AndroidGLRendererBackend::~AndroidGLRendererBackend() { +#ifndef NDEBUG + if (context && static_cast(*context).getCleanupOnDestruction()) { + assert(eglGetCurrentContext() != EGL_NO_CONTEXT); + } +#endif +} gl::ProcAddress AndroidGLRendererBackend::getExtensionFunctionPointer(const char* name) { assert(gfx::BackendScope::exists()); diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index e17874ba1cae..8a2cfbd3122d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -196,6 +196,11 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) { void MapRenderer::resetRenderer() { renderer.reset(); +#if MLN_RENDER_BACKEND_OPENGL + // GL requires the context managed by the java surface for cleanup + // Vulkan resources can be released on any thread (finalizer in this case) + backend.reset(); +#endif swapBehaviorFlush = false; } diff --git a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java index e446e1351e33..301e3197e78d 100644 --- a/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java +++ b/platform/android/MapLibreAndroid/src/opengl/java/org/maplibre/android/maps/renderer/surfaceview/MapLibreGLSurfaceView.java @@ -272,9 +272,7 @@ void destroySurface() { private void destroySurfaceImp() { if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) { - mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_CONTEXT); + mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, mEglContext); MapLibreGLSurfaceView view = mGLSurfaceViewWeakRef.get(); if (view != null) { view.eglWindowSurfaceFactory.destroySurface(mEgl, mEglDisplay, mEglSurface); @@ -284,6 +282,13 @@ private void destroySurfaceImp() { } public void finish() { + if (mEglDisplay != null) { + mEgl.eglMakeCurrent(mEglDisplay, + EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_CONTEXT); + } + if (mEglContext != null) { MapLibreGLSurfaceView view = mGLSurfaceViewWeakRef.get(); if (view != null) { From 7838327ed7978c8a6460adf3a8f458f893b1d26a Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 25 Aug 2025 22:27:48 +0200 Subject: [PATCH 327/339] use separate install-sccache script (#3755) --- .github/actions/install-sccache/action.yml | 7 +------ .github/actions/install-sccache/install-sccache | 7 +++++++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100755 .github/actions/install-sccache/install-sccache diff --git a/.github/actions/install-sccache/action.yml b/.github/actions/install-sccache/action.yml index 0d025a49ad6b..273f4d12fc03 100644 --- a/.github/actions/install-sccache/action.yml +++ b/.github/actions/install-sccache/action.yml @@ -4,10 +4,5 @@ runs: using: "composite" steps: - name: Install sccache - run: | - curl -LO https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz - tar -xzf sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz - sudo mv sccache-v0.10.0-x86_64-unknown-linux-musl/sccache /usr/bin/sccache - sudo chmod +x /usr/bin/sccache - rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl* + run: ${{ github.action_path }}/install-sccache shell: bash diff --git a/.github/actions/install-sccache/install-sccache b/.github/actions/install-sccache/install-sccache new file mode 100755 index 000000000000..7d9d31091238 --- /dev/null +++ b/.github/actions/install-sccache/install-sccache @@ -0,0 +1,7 @@ +#!/bin/bash + +curl -LO https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz +tar -xzf sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz +sudo mv sccache-v0.10.0-x86_64-unknown-linux-musl/sccache /usr/bin/sccache +sudo chmod +x /usr/bin/sccache +rm -rf sccache-v0.10.0-x86_64-unknown-linux-musl* From 8bb12ed501689cd7997c8eb5adcbf4b92c4ddde8 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 26 Aug 2025 00:27:13 +0200 Subject: [PATCH 328/339] format Bazel files with buildifier (#3756) --- BUILD.bazel | 4 ++-- MODULE.bazel | 4 +++- platform/BUILD.bazel | 4 ++-- platform/darwin/BUILD.bazel | 2 +- platform/darwin/bazel/files.bzl | 6 ++---- platform/ios/BUILD.bazel | 2 +- platform/ios/bazel/files.bzl | 2 +- platform/linux/BUILD.bazel | 3 ++- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index dff4ee2a0cb1..5b39985d186d 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -4,8 +4,6 @@ load("@npm//:defs.bzl", "npm_link_all_packages") load("@rules_cc//cc:defs.bzl", "cc_library") load( "//bazel:core.bzl", - "MLN_LAYER_PLUGIN_HEADERS", - "MLN_LAYER_PLUGIN_SOURCE", "MLN_CORE_HEADERS", "MLN_CORE_SOURCE", "MLN_DRAWABLES_GL_HEADERS", @@ -18,6 +16,8 @@ load( "MLN_GENERATED_SHADER_HEADERS", "MLN_GENERATED_SHADER_SOURCE", "MLN_GENERATED_STYLE_SOURCE", + "MLN_LAYER_PLUGIN_HEADERS", + "MLN_LAYER_PLUGIN_SOURCE", "MLN_OPENGL_HEADERS", "MLN_OPENGL_SOURCE", "MLN_PRIVATE_GENERATED_STYLE_HEADERS", diff --git a/MODULE.bazel b/MODULE.bazel index 166e4c50a984..0bc9f0e93ebf 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,6 +10,7 @@ bazel_dep(name = "rules_nodejs", version = "6.4.0") bazel_dep(name = "libuv", version = "1.48.0") bazel_dep(name = "apple_support", version = "1.22.1", repo_name = "build_bazel_apple_support") bazel_dep(name = "rules_cc", version = "0.1.3") +bazel_dep(name = "rules_shell", version = "0.6.0") node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) node.toolchain(node_version = "20.14.0") @@ -72,12 +73,13 @@ darwin_config( bazel_dep(name = "rules_rust", version = "0.62.0") bazel_dep(name = "cxx.rs", version = "1.0.157") + # The registry is not always up to date # See https://registry.bazel.build/modules/cxx.rs git_override( module_name = "cxx.rs", - tag = "1.0.157", remote = "https://github.com/dtolnay/cxx.git", + tag = "1.0.157", ) rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") diff --git a/platform/BUILD.bazel b/platform/BUILD.bazel index 6cc1f1dbed36..1118b89f5e04 100644 --- a/platform/BUILD.bazel +++ b/platform/BUILD.bazel @@ -267,12 +267,12 @@ objc_library( objc_library( name = "iosapp", srcs = [ + "//platform/darwin:app/CustomStyleLayerExample.h", + "//platform/darwin:app/CustomStyleLayerExample.m", "//platform/darwin:app/PluginLayerExample.h", "//platform/darwin:app/PluginLayerExample.mm", "//platform/darwin:app/PluginLayerExampleMetalRendering.h", "//platform/darwin:app/PluginLayerExampleMetalRendering.mm", - "//platform/darwin:app/CustomStyleLayerExample.h", - "//platform/darwin:app/CustomStyleLayerExample.m", "//platform/ios:ios_app_srcs", ], defines = ["GLES_SILENCE_DEPRECATION"], diff --git a/platform/darwin/BUILD.bazel b/platform/darwin/BUILD.bazel index dcc0a8bcbac4..3dc5e8e01d28 100644 --- a/platform/darwin/BUILD.bazel +++ b/platform/darwin/BUILD.bazel @@ -172,9 +172,9 @@ swift_library( testonly = True, srcs = glob(["test/*.swift"]), data = [ + "app/PluginLayerTestStyle.json", "test/amsterdam.geojson", "test/one-liner.json", - "app/PluginLayerTestStyle.json", ], visibility = [ "//platform/ios/test:__pkg__", diff --git a/platform/darwin/bazel/files.bzl b/platform/darwin/bazel/files.bzl index 560189cd69c0..2866f4a25996 100644 --- a/platform/darwin/bazel/files.bzl +++ b/platform/darwin/bazel/files.bzl @@ -165,8 +165,7 @@ MLN_DARWIN_PRIVATE_HEADERS = [ "src/MLNVectorTileSource_Private.h", "src/NSExpression+MLNPrivateAdditions.h", "src/NSPredicate+MLNPrivateAdditions.h", - "src/MLNPluginStyleLayer_Private.h" - + "src/MLNPluginStyleLayer_Private.h", ] MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ @@ -222,8 +221,7 @@ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [ "src/NSPredicate+MLNAdditions.mm", "src/NSValue+MLNStyleAttributeAdditions.mm", "src/MLNPluginLayer.mm", - "src/MLNPluginStyleLayer.mm" - + "src/MLNPluginStyleLayer.mm", ] MLN_DARWIN_PUBLIC_OBJCPP_CUSTOM_DRAWABLE_SOURCE = [ "src/MLNCustomDrawableStyleLayer_Private.h", diff --git a/platform/ios/BUILD.bazel b/platform/ios/BUILD.bazel index fa83c9af8f59..e4726db2fa2f 100644 --- a/platform/ios/BUILD.bazel +++ b/platform/ios/BUILD.bazel @@ -4,7 +4,7 @@ load("@rules_apple//apple:apple.bzl", "apple_static_xcframework", "apple_xcframe load("@rules_apple//apple:ios.bzl", "ios_application", "ios_framework") load("@rules_apple//apple:resources.bzl", "apple_resource_bundle") load("@rules_apple//apple:versioning.bzl", "apple_bundle_version") - +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load( "@rules_xcodeproj//xcodeproj:defs.bzl", "top_level_target", diff --git a/platform/ios/bazel/files.bzl b/platform/ios/bazel/files.bzl index bf9d220cdfce..4667a1da83ed 100644 --- a/platform/ios/bazel/files.bzl +++ b/platform/ios/bazel/files.bzl @@ -11,7 +11,7 @@ MLN_IOS_SDK_HEADERS = [ "src/MLNUserLocation.h", "src/MLNUserLocationAnnotationView.h", "src/MLNUserLocationAnnotationViewStyle.h", - "src/MLNScaleBar.h" + "src/MLNScaleBar.h", ] MLN_IOS_PUBLIC_HEADERS = [ diff --git a/platform/linux/BUILD.bazel b/platform/linux/BUILD.bazel index 0205f7f69759..dc8a78d9a92f 100644 --- a/platform/linux/BUILD.bazel +++ b/platform/linux/BUILD.bazel @@ -1,4 +1,5 @@ load("@rules_cc//cc:defs.bzl", "cc_library") +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") ICU_FLAGS = [ @@ -48,7 +49,7 @@ genrule( $$(pkg-config --variable=libdir icu-uc)/libicuuc.a \ $$(pkg-config --variable=libdir icu-uc)/libicudata.a \ $$(pkg-config --variable=libdir icu-i18n)/libicui18n.a - )""" + )""", ) sh_binary( From ec8a7a49fbb704349eca0bbf9204852c00444732 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 26 Aug 2025 06:53:03 +0200 Subject: [PATCH 329/339] Add Compose Multiplatform section to README (#3751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Gwóźdź <114614618+michalgwo@users.noreply.github.com> --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1edfa207a6d5..065cca1f6598 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,10 @@ There is an [npm package](https://www.npmjs.com/package/@maplibre/maplibre-gl-na Please check out the [`maplibre/maplibre-native-qt` repository](https://github.com/maplibre/maplibre-native-qt) to learn how to intergrate MapLibre Native with a Qt project. +## Compose Multiplatform + +[MapLibre Compose](https://github.com/maplibre/maplibre-compose) wraps MapLibre Native for various platforms that [Compose Multiplatform](https://www.jetbrains.com/compose-multiplatform/) supports. As of August 2025, iOS and Android are supported, with web and desktop partially supported. + ## Other Platforms MapLibre Native can also be built on [Linux](platform/linux/README.md), [Windows](platform/windows/README.md) and [macOS](platform/macos/README.md). From 77c251bd1d380fea7601ce18dd053f07b930ea14 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 26 Aug 2025 14:50:43 +0200 Subject: [PATCH 330/339] Fix UB in TaggedString constructor (#3748) --- src/mbgl/text/tagged_string.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mbgl/text/tagged_string.hpp b/src/mbgl/text/tagged_string.hpp index 1c2b7d84a588..215f424bc6a5 100644 --- a/src/mbgl/text/tagged_string.hpp +++ b/src/mbgl/text/tagged_string.hpp @@ -72,8 +72,9 @@ struct SectionOptions { struct TaggedString { TaggedString() = default; - TaggedString(std::u16string text_, SectionOptions options) - : styledText(std::move(text_), std::vector(text_.size(), 0)) { + TaggedString(std::u16string text_, SectionOptions options) { + auto size = text_.size(); + styledText = {std::move(text_), std::vector(size, 0)}; sections.push_back(std::move(options)); } From 28e73cade31e8615a15ec92d11abdd94716b1cac Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 26 Aug 2025 19:31:25 +0200 Subject: [PATCH 331/339] Add weak pointer management to RasterSource and derived classes (#3726) --- include/mbgl/style/sources/raster_dem_source.hpp | 1 + include/mbgl/style/sources/raster_source.hpp | 10 ++++++++++ include/mbgl/style/sources/tile_source.hpp | 4 ---- include/mbgl/style/sources/vector_source.hpp | 3 +++ src/mbgl/style/sources/raster_dem_source.cpp | 5 +++++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/include/mbgl/style/sources/raster_dem_source.hpp b/include/mbgl/style/sources/raster_dem_source.hpp index a7738d7f1a26..7f1e01fd70b4 100644 --- a/include/mbgl/style/sources/raster_dem_source.hpp +++ b/include/mbgl/style/sources/raster_dem_source.hpp @@ -18,6 +18,7 @@ class RasterDEMSource : public RasterSource { variant urlOrTileset, uint16_t tileSize, std::optional options = std::nullopt); + ~RasterDEMSource() override; bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; protected: diff --git a/include/mbgl/style/sources/raster_source.hpp b/include/mbgl/style/sources/raster_source.hpp index 97e2911e42fc..15538e7cefbd 100644 --- a/include/mbgl/style/sources/raster_source.hpp +++ b/include/mbgl/style/sources/raster_source.hpp @@ -16,6 +16,16 @@ class RasterSource : public TileSource { SourceType sourceType = SourceType::Raster); bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; + + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } + +protected: + // Allows derived classes (e.g. RasterDEMSource) to invalidate weak pointers + // early in their destructor before their own members are torn down. + void invalidateWeakPtrsEarly() { weakFactory.invalidateWeakPtrs(); } + +private: + mapbox::base::WeakPtrFactory weakFactory{this}; // Must remain last }; template <> diff --git a/include/mbgl/style/sources/tile_source.hpp b/include/mbgl/style/sources/tile_source.hpp index bbeb8de72655..3516ee7ef5ae 100644 --- a/include/mbgl/style/sources/tile_source.hpp +++ b/include/mbgl/style/sources/tile_source.hpp @@ -25,8 +25,6 @@ class TileSource : public Source { void loadDescription(FileSource&) final; - mapbox::base::WeakPtr makeWeakPtr() final { return weakFactory.makeWeakPtr(); } - protected: Mutable createMutable() const noexcept final; virtual void setTilesetOverrides(Tileset& tileset); @@ -34,8 +32,6 @@ class TileSource : public Source { private: const variant urlOrTileset; std::unique_ptr req; - mapbox::base::WeakPtrFactory weakFactory{this}; - // Do not add members here, see `WeakPtrFactory` }; template <> diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp index 6e5672c98e9b..4448291fdbb4 100644 --- a/include/mbgl/style/sources/vector_source.hpp +++ b/include/mbgl/style/sources/vector_source.hpp @@ -29,9 +29,12 @@ class VectorSource final : public TileSource { bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override; + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } + private: std::optional maxZoom; std::optional minZoom; + mapbox::base::WeakPtrFactory weakFactory{this}; // Must remain last }; template <> diff --git a/src/mbgl/style/sources/raster_dem_source.cpp b/src/mbgl/style/sources/raster_dem_source.cpp index 805984a7e6d9..68745a048efe 100644 --- a/src/mbgl/style/sources/raster_dem_source.cpp +++ b/src/mbgl/style/sources/raster_dem_source.cpp @@ -18,6 +18,11 @@ RasterDEMSource::RasterDEMSource(std::string id, : RasterSource(std::move(id), std::move(urlOrTileset_), tileSize, SourceType::RasterDEM), options(std::move(options_)) {} +RasterDEMSource::~RasterDEMSource() { + // Invalidate weak pointers before RasterDEMSource members are destroyed + invalidateWeakPtrsEarly(); +} + bool RasterDEMSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const { return mbgl::underlying_type(Tile::Kind::RasterDEM) == mbgl::underlying_type(info->tileKind); } From 8a85c802be58177d4d07c54d62347abf1128cfd0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 27 Aug 2025 17:02:52 +0200 Subject: [PATCH 332/339] Release MapLibre iOS 6.18.1 (#3762) --- platform/ios/CHANGELOG.md | 6 ++++++ platform/ios/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index c1fdee043cab..382622cb53e1 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -2,6 +2,12 @@ MapLibre welcomes participation and contributions from everyone. Please read [`MapLibre iOS Developer Guide`](https://maplibre.org/maplibre-native/docs/book/ios/index.html) to get started. +## 6.18.1 + +- Fix for raster dem encoding override in style.json ([#3570](https://github.com/maplibre/maplibre-native/pull/3570)). +- Fix UB in TaggedString constructor ([#3748](https://github.com/maplibre/maplibre-native/pull/3748)). +- Add weak pointer management to RasterSource and derived classes ([#3726](https://github.com/maplibre/maplibre-native/pull/3726)). + ## 6.18.0 - add the ability to have ios camera animation durations dynamic during navigation ([#3568](https://github.com/maplibre/maplibre-native/pull/3568)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index 1b386a547006..2016ec3904eb 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.18.0 +6.18.1 From afd95b576674278f8a00ebc784f5f104f330ef7f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 27 Aug 2025 17:29:08 +0200 Subject: [PATCH 333/339] Release MapLibre Android 11.13.1 (#3761) --- platform/android/CHANGELOG.md | 11 ++++++++++- platform/android/VERSION | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 87188fff0c02..11d08f7a5ac5 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog MapLibre Native for Android -## main +## 11.13.1 + +### ✨ Features and improvements + +- Fix for raster dem encoding override in style.json ([#3570](https://github.com/maplibre/maplibre-native/pull/3570)). + +### 🐞 Bug fixes + +- Fix Android backend cleanup ([#3681](https://github.com/maplibre/maplibre-native/pull/3681)). +- Add weak pointer management to RasterSource and derived classes ([#3726](https://github.com/maplibre/maplibre-native/pull/3726)). ## 11.13.0 diff --git a/platform/android/VERSION b/platform/android/VERSION index a03dc570038e..5f7d6d2d20be 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.13.0 +11.13.1 From 426e519665a7a0a7b28f7e3598a824bdaf51d410 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 27 Aug 2025 23:18:41 +0300 Subject: [PATCH 334/339] Add Sentry build tags (#3765) --- .../MapLibreAndroidTestApp/build.gradle.kts | 6 +++++- .../src/main/AndroidManifest.xml | 5 +++++ .../src/main/kotlin/SentryConfigPlugin.kt | 20 +++++++++++++++++++ platform/android/src/example_custom_layer.cpp | 14 ++++++++----- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/platform/android/MapLibreAndroidTestApp/build.gradle.kts b/platform/android/MapLibreAndroidTestApp/build.gradle.kts index 3dd5c6723502..bbe1ac04d58b 100644 --- a/platform/android/MapLibreAndroidTestApp/build.gradle.kts +++ b/platform/android/MapLibreAndroidTestApp/build.gradle.kts @@ -27,10 +27,12 @@ android { minSdk = 21 targetSdk = 33 versionCode = 14 - versionName = "6.0.1" testInstrumentationRunner = "org.maplibre.android.InstrumentationRunner" multiDexEnabled = true + versionName = file("../VERSION").readText().trim() + manifestPlaceholders["SENTRY_DSN"] = "" + manifestPlaceholders["SENTRY_ENV"] = "" } nativeBuild(listOf("example-custom-layer")) @@ -53,9 +55,11 @@ android { keepDebugSymbols += "**/*.so" } } + buildConfigField("String", "SENTRY_DSN", "\"" + (System.getenv("SENTRY_DSN") ?: "") + "\"") manifestPlaceholders["SENTRY_DSN"] = System.getenv("SENTRY_DSN") ?: "" } + getByName("release") { isMinifyEnabled = true isShrinkResources = true diff --git a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml index 9cd89082e490..0a27a1cc3476 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/AndroidManifest.xml @@ -1317,6 +1317,11 @@ android:value="${SENTRY_DSN}" /> + + { } } + val androidExtension = project.extensions.getByType(AppExtension::class.java) + val propertiesToSet = mapOf( "getDebug" to true, "getOrg" to System.getenv("SENTRY_ORG"), "getProjectName" to System.getenv("SENTRY_PROJECT"), "getAuthToken" to System.getenv("SENTRY_AUTH_TOKEN"), + "getRelease" to androidExtension.defaultConfig.versionName, "getIncludeProguardMapping" to true, "getAutoUploadProguardMapping" to true, "getDexguardEnabled" to false, @@ -58,5 +63,20 @@ class SentryConditionalPlugin : Plugin { propertiesToSet.forEach { (getterName, value) -> setProperty(sentryExt, getterName, value) } + + project.afterEvaluate { + val commitHash = ByteArrayOutputStream() + + project.exec { + commandLine("git", "rev-parse", "HEAD") + standardOutput = commitHash + workingDir = project.rootDir + isIgnoreExitValue = true + } + + androidExtension.applicationVariants.forEach { variant -> + variant.mergedFlavor.manifestPlaceholders["SENTRY_ENV"] = "${variant.name}-$commitHash" + } + } } } diff --git a/platform/android/src/example_custom_layer.cpp b/platform/android/src/example_custom_layer.cpp index 4ac03330873f..7e1b3b198b62 100644 --- a/platform/android/src/example_custom_layer.cpp +++ b/platform/android/src/example_custom_layer.cpp @@ -106,11 +106,15 @@ void checkCompileStatus(GLuint shader) { GLint maxLength = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); - // The maxLength includes the NULL character - std::vector errorLog(maxLength); - glGetShaderInfoLog(shader, maxLength, &maxLength, errorLog.data()); - __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, errorLog.data()); - throw Error(std::string(errorLog.begin(), errorLog.end())); + if (maxLength > 0) { + // The maxLength includes the NULL character + std::vector errorLog(maxLength + 1); + glGetShaderInfoLog(shader, maxLength, &maxLength, errorLog.data()); + __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, errorLog.data()); + throw Error(std::string(errorLog.begin(), errorLog.end())); + } else { + throw Error("checkCompileStatus failed to get error string"); + } } } From 2a2bce8d4dda4f31098ccb6acc6ccfafb2f86eda Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Thu, 28 Aug 2025 17:42:34 +0300 Subject: [PATCH 335/339] Tweak layer depth distribution (#3738) --- src/mbgl/renderer/paint_parameters.hpp | 2 +- src/mbgl/shaders/vulkan/shader_program.cpp | 9 +-- .../line/expected.png | Bin 0 -> 41453 bytes test/map/map.test.cpp | 52 ++++++++++++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/map/layer_depth_distribution/line/expected.png diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 4f4be3b2c3c1..9a0c94c671c0 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -130,7 +130,7 @@ class PaintParameters { #if MLN_RENDER_BACKEND_OPENGL static constexpr float depthEpsilon = 1.0f / (1 << 16); #else - static constexpr float depthEpsilon = 1.0f / (1 << 12); + static constexpr float depthEpsilon = 1.0f / (1 << 11); #endif static constexpr int maxStencilValue = 255; diff --git a/src/mbgl/shaders/vulkan/shader_program.cpp b/src/mbgl/shaders/vulkan/shader_program.cpp index 15207646fea7..04d99d6e53a5 100644 --- a/src/mbgl/shaders/vulkan/shader_program.cpp +++ b/src/mbgl/shaders/vulkan/shader_program.cpp @@ -49,7 +49,7 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, defineStr += "#define USE_SURFACE_TRANSFORM"; } - observer.onPreCompileShader(shaderID, gfx::Backend::Type::Metal, defineStr); + observer.onPreCompileShader(shaderID, gfx::Backend::Type::Vulkan, defineStr); constexpr auto targetClientVersion = glslang::EShTargetVulkan_1_0; constexpr auto targetLanguageVersion = glslang::EShTargetSpv_1_0; @@ -61,8 +61,9 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, glslang::TShader glslShader(language); const auto preamble = defineStr + "\n" + prelude; - const char* shaderData = data.data(); - const int shaderDataSize = static_cast(data.size()); + const std::string shaderStr = std::string("#version ") + std::to_string(defaultVersion) + "\n" + data.data(); + const char* shaderData = shaderStr.data(); + const int shaderDataSize = static_cast(shaderStr.size()); glslShader.setPreamble(preamble.c_str()); glslShader.setStringsWithLengths(&shaderData, &shaderDataSize, 1); @@ -115,7 +116,7 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, backend.setDebugName(vertexShader.get(), shaderName + ".vert"); backend.setDebugName(fragmentShader.get(), shaderName + ".frag"); - observer.onPostCompileShader(shaderID, gfx::Backend::Type::Metal, defineStr); + observer.onPostCompileShader(shaderID, gfx::Backend::Type::Vulkan, defineStr); } ShaderProgram::~ShaderProgram() noexcept { diff --git a/test/fixtures/map/layer_depth_distribution/line/expected.png b/test/fixtures/map/layer_depth_distribution/line/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b599bb565172f6be33e21147e559b98823ec8e01 GIT binary patch literal 41453 zcmeF2RaYEeu=WQZbZ{Nq3Bldn-QC?a!5Q3w1_&)T5-Y@Xp zoV&C7qW4Aj+P$lP_3WzZ>NpKGc}z4?GynjAsi+{M1pvUk4dDPlOxlKaTU#*Nxj1*v4Y_-EEVJ zdU7`;_|(}v+4%oP|Eo4QA7Xz^qJ)hcU-Fud-h=O38-jx~GukVhp

    ~J&Y!^$Abh< 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 literal 0 HcmV?d00001 diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 342f4fb94e8c..a44273b13e09 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1968,3 +1969,54 @@ TEST(BackgroundLayer, StyleUpdateZoomDependency) { 0.0006, 0.1); } + +TEST(Map, LineLayerDepthDistribution) { + MapTest<> test; + + test.map.getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + + test.map.jumpTo(CameraOptions().withZoom(0.0).withPitch(45.0)); + + auto backgroundLayer = std::make_unique("Background"); + backgroundLayer->setBackgroundColor(Color(1.0f, 1.0f, 0.0f, 1.0f)); + test.map.getStyle().addLayer(std::move(backgroundLayer)); + + constexpr uint32_t layerCount = 1 << 11; + const std::vector colors = {Color::red(), Color::green(), Color::blue()}; + const auto& bounds = test.map.latLngBoundsForCamera(test.map.getCameraOptions()); + + const auto getSource = [&](uint32_t index) { + FeatureCollection features; + + mapbox::geojson::line_string geo; + + double y = (bounds.north() - bounds.south()) * 0.95 / layerCount * (index + 1) / 2.0; + double x = (bounds.east() - bounds.west()) * 0.95 / layerCount * (index + 1) / 2.0; + + geo.emplace_back(-x, y); + geo.emplace_back(x, y); + geo.emplace_back(x, -y); + geo.emplace_back(-x, -y); + geo.emplace_back(-x, y); + + features.emplace_back(geo); + + auto source = std::make_unique("GeoJSONSource_" + std::to_string(index)); + source->setGeoJSON(features); + + return source; + }; + + for (uint32_t i = 0; i < layerCount; ++i) { + // add one source per layer + test.map.getStyle().addSource(getSource(i)); + + auto layer = std::make_unique("LineLayer" + std::to_string(i), "GeoJSONSource_" + std::to_string(i)); + layer->setLineColor(colors[i % colors.size()]); + + test.map.getStyle().addLayer(std::move(layer)); + } + + test::checkImage( + "test/fixtures/map/layer_depth_distribution/line", test.frontend.render(test.map).image, 0.0006, 0.1); +} From 4e47c6c0258f064996b7040502b52cbdf89b44ce Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 28 Aug 2025 23:23:35 +0200 Subject: [PATCH 336/339] Tweak Linux amalgamation (#3767) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/scripts/install-linux-deps | 3 ++- platform/linux/linux.cmake | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/scripts/install-linux-deps b/.github/scripts/install-linux-deps index 08b6af638f40..070f40531895 100755 --- a/.github/scripts/install-linux-deps +++ b/.github/scripts/install-linux-deps @@ -10,5 +10,6 @@ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ libwebp-dev \ libopengl0 \ mesa-vulkan-drivers \ - llvm + llvm \ + glslang-dev cargo install armerge@2.2.0 diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 5abc3f619b2a..397e07935ed5 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -191,25 +191,38 @@ if(NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") find_static_library(STATIC_LIBS NAMES z) find_static_library(STATIC_LIBS NAMES jpeg) find_static_library(STATIC_LIBS NAMES webp) - find_static_library(STATIC_LIBS NAMES curl) find_static_library(STATIC_LIBS NAMES uv uv_a) find_static_library(STATIC_LIBS NAMES ssl) find_static_library(STATIC_LIBS NAMES crypto) + find_static_library(STATIC_LIBS NAMES bz2 bzip2) + + if(MLN_WITH_VULKAN) + find_static_library(STATIC_LIBS NAMES glslang) + find_static_library(STATIC_LIBS NAMES glslang-default-resource-limits) + find_static_library(STATIC_LIBS NAMES SPIRV) + find_static_library(STATIC_LIBS NAMES SPIRV-Tools) + find_static_library(STATIC_LIBS NAMES SPIRV-Tools-opt) + find_static_library(STATIC_LIBS NAMES MachineIndependent) + find_static_library(STATIC_LIBS NAMES GenericCodeGen) + endif() add_custom_command( TARGET mbgl-core POST_BUILD - COMMAND armerge --keep-symbols '.*' --output libmbgl-core-amalgam.a + COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a $ $ $ $ + $ $ + $ ${ICUUC_LIBRARY_DIRS}/libicuuc.a ${ICUUC_LIBRARY_DIRS}/libicudata.a ${ICUI18N_LIBRARY_DIRS}/libicui18n.a ${STATIC_LIBS} ) + endif() add_subdirectory(${PROJECT_SOURCE_DIR}/bin) From 46e284218649d1976ded0bbfe9915b8de0152a0a Mon Sep 17 00:00:00 2001 From: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Date: Sat, 30 Aug 2025 21:37:06 +0200 Subject: [PATCH 337/339] set MLN_WITH_OPENGL=OFF by default, like Metal/Vulkan (#3772) --- .github/workflows/node-ci.yml | 6 ++++-- .github/workflows/node-release.yml | 6 ++++-- .github/workflows/qt-ci.yml | 12 ++++++++---- CMakeLists.txt | 3 ++- benchmark/android/app/build.gradle | 1 + platform/android/MapLibreAndroid/build.gradle.kts | 5 +++++ render-test/android/app/build.gradle.kts | 5 +++++ src/mbgl/renderer/paint_parameters.cpp | 4 ++-- src/mbgl/shaders/gl/legacy/program.hpp | 2 +- test/android/app/build.gradle.kts | 3 ++- 10 files changed, 34 insertions(+), 13 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index c3d285899453..7c116279e2eb 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -208,7 +208,8 @@ jobs: -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER=gcc-12 \ - -DMLN_WITH_NODE=ON + -DMLN_WITH_NODE=ON \ + -DMLN_WITH_OPENGL=ON - name: Get vcpkg commit id if: runner.os == 'Windows' @@ -235,7 +236,8 @@ jobs: -G Ninja ` -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} ` -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ` - -DMLN_WITH_NODE=ON + -DMLN_WITH_NODE=ON ` + -DMLN_WITH_OPENGL=ON - name: Build maplibre-native (MacOS/Linux) if: runner.os == 'MacOS' || runner.os == 'Linux' diff --git a/.github/workflows/node-release.yml b/.github/workflows/node-release.yml index 5829a375dda2..7d52fd5df77c 100644 --- a/.github/workflows/node-release.yml +++ b/.github/workflows/node-release.yml @@ -177,7 +177,8 @@ jobs: -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER=gcc-12 \ - -DMLN_WITH_NODE=ON + -DMLN_WITH_NODE=ON \ + -DMLN_WITH_OPENGL=ON - name: "Create directory '${{ github.workspace }}/platform/windows/vendor/vcpkg/bincache' (Windows)" if: runner.os == 'Windows' @@ -205,7 +206,8 @@ jobs: -G Ninja ` -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} ` -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ` - -DMLN_WITH_NODE=ON + -DMLN_WITH_NODE=ON \ + -DMLN_WITH_OPENGL=ON - name: Build maplibre-native (MacOS/Linux) if: runner.os == 'MacOS' || runner.os == 'Linux' diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index 5466ab285a97..6c70f3d491a0 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -199,7 +199,8 @@ jobs: -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ -DCMAKE_OSX_DEPLOYMENT_TARGET="${DEPLOYMENT_TARGET}" \ -DCMAKE_OSX_ARCHITECTURES="${DEPLOYMENT_ARCH}" \ - -DMLN_WITH_QT=ON + -DMLN_WITH_QT=ON \ + -DMLN_WITH_OPENGL=ON ninja - name: Build maplibre-native (Linux, Qt6) @@ -211,7 +212,8 @@ jobs: -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DMLN_WITH_QT=ON + -DMLN_WITH_QT=ON \ + -DMLN_WITH_OPENGL=ON ninja - name: Build maplibre-native (Linux, Qt6, internal libraries) @@ -225,7 +227,8 @@ jobs: -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ -DMLN_WITH_QT=ON \ -DMLN_QT_WITH_INTERNAL_ICU=ON \ - -DMLN_QT_WITH_INTERNAL_SQLITE=ON + -DMLN_QT_WITH_INTERNAL_SQLITE=ON \ + -DMLN_WITH_OPENGL=ON ninja - name: Run tests (Linux) @@ -247,5 +250,6 @@ jobs: -DCMAKE_CONFIGURATION_TYPES="${BUILD_TYPE}" \ -DCMAKE_C_COMPILER_LAUNCHER="ccache.exe" \ -DCMAKE_CXX_COMPILER_LAUNCHER="ccache.exe" \ - -DMLN_WITH_QT=ON + -DMLN_WITH_QT=ON \ + -DMLN_WITH_OPENGL=ON ninja.exe diff --git a/CMakeLists.txt b/CMakeLists.txt index 501f4898054b..0fb7b4dcb7fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,10 @@ option(MLN_WITH_NODE "Build MapLibre Native Node.js bindings" OFF) option(MLN_WITH_GLFW "Set up targets for GLFW platform" ON) option(MLN_WITH_SANITIZER "Use [address|thread|undefined] here" OFF) option(MLN_WITH_RTTI "Compile with runtime type information" OFF) -option(MLN_WITH_OPENGL "Build with OpenGL renderer" ON) +option(MLN_WITH_OPENGL "Build with OpenGL renderer" OFF) option(MLN_WITH_EGL "Build with EGL renderer" OFF) option(MLN_WITH_VULKAN "Build with Vulkan renderer" OFF) +option(MLN_WITH_METAL "Build with Metal renderer" OFF) option(MLN_WITH_PMTILES "Build with PMTiles support" ON) option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) diff --git a/benchmark/android/app/build.gradle b/benchmark/android/app/build.gradle index f89a4cb16ba8..4b0c4dfa058e 100644 --- a/benchmark/android/app/build.gradle +++ b/benchmark/android/app/build.gradle @@ -25,6 +25,7 @@ android { cmake { arguments '-DANDROID_CCACHE=ccache' arguments '-DANDROID_STL=c++_static' + arguments '-DMLN_WITH_OPENGL=ON' targets 'mbgl-benchmark-runner' } } diff --git a/platform/android/MapLibreAndroid/build.gradle.kts b/platform/android/MapLibreAndroid/build.gradle.kts index acd5a37ddf72..07dcd0b9c865 100644 --- a/platform/android/MapLibreAndroid/build.gradle.kts +++ b/platform/android/MapLibreAndroid/build.gradle.kts @@ -76,6 +76,11 @@ android { productFlavors { create("opengl") { dimension = "renderer" + externalNativeBuild { + cmake { + arguments("-DMLN_WITH_OPENGL=ON", "-DMLN_WITH_VULKAN=OFF") + } + } } create("vulkan") { dimension = "renderer" diff --git a/render-test/android/app/build.gradle.kts b/render-test/android/app/build.gradle.kts index 6f9298b0aa9d..67d3435bac24 100644 --- a/render-test/android/app/build.gradle.kts +++ b/render-test/android/app/build.gradle.kts @@ -60,6 +60,11 @@ android { productFlavors { create("opengl") { dimension = "renderer" + externalNativeBuild { + cmake { + arguments("-DMLN_WITH_OPENGL=ON") + } + } } create("vulkan") { dimension = "renderer" diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index 1b80741d339c..4f29d2932e5a 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -156,7 +156,7 @@ void PaintParameters::clearStencil() { vulkanRenderPass.clearStencil(); context.renderingStats().stencilClears++; -#else // !MLN_RENDER_BACKEND_METAL +#elif MLN_RENDER_BACKEND_OPENGL context.clearStencilBuffer(0b00000000); #endif } @@ -247,7 +247,7 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) { vulkanContext.renderingStats().stencilUpdates++; } -#else // MLN_RENDER_BACKEND_OPENGL +#elif MLN_RENDER_BACKEND_OPENGL auto program = staticData.shaders->getLegacyGroup().get(); if (!program) { diff --git a/src/mbgl/shaders/gl/legacy/program.hpp b/src/mbgl/shaders/gl/legacy/program.hpp index eba7a62c4849..9d285499efda 100644 --- a/src/mbgl/shaders/gl/legacy/program.hpp +++ b/src/mbgl/shaders/gl/legacy/program.hpp @@ -55,7 +55,7 @@ class Program : public gfx::Shader { case gfx::Backend::Type::Vulkan: { break; } -#else // MLN_RENDER_BACKEND_OPENGL +#elif MLN_RENDER_BACKEND_OPENGL case gfx::Backend::Type::OpenGL: { programBase = std::make_unique>(programParameters.withDefaultSource( {gfx::Backend::Type::OpenGL, diff --git a/test/android/app/build.gradle.kts b/test/android/app/build.gradle.kts index a34da1abe926..bd37f9f99ec1 100644 --- a/test/android/app/build.gradle.kts +++ b/test/android/app/build.gradle.kts @@ -33,7 +33,8 @@ android { externalNativeBuild { cmake { arguments += listOf( - "-DANDROID_STL=c++_static" + "-DANDROID_STL=c++_static", + "-DMLN_WITH_OPENGL=ON" ) targets += "mbgl-test-runner" } From e2be90afb4fd8237a96b98b5c1c996f2b2fb7327 Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Fri, 5 Sep 2025 20:52:43 -0700 Subject: [PATCH 338/339] fix some missing public headers referenced by other public headers --- CMakeLists.txt | 14 +++++++------- {src => include}/mbgl/gfx/color_mode.hpp | 0 {src => include}/mbgl/gfx/depth_mode.hpp | 0 {src => include}/mbgl/gfx/draw_mode.hpp | 0 {src => include}/mbgl/gfx/draw_scope.hpp | 0 {src => include}/mbgl/gfx/renderbuffer.hpp | 0 {src => include}/mbgl/gfx/stencil_mode.hpp | 0 {src => include}/mbgl/gfx/vertex_buffer.hpp | 0 8 files changed, 7 insertions(+), 7 deletions(-) rename {src => include}/mbgl/gfx/color_mode.hpp (100%) rename {src => include}/mbgl/gfx/depth_mode.hpp (100%) rename {src => include}/mbgl/gfx/draw_mode.hpp (100%) rename {src => include}/mbgl/gfx/draw_scope.hpp (100%) rename {src => include}/mbgl/gfx/renderbuffer.hpp (100%) rename {src => include}/mbgl/gfx/stencil_mode.hpp (100%) rename {src => include}/mbgl/gfx/vertex_buffer.hpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fb7b4dcb7fc..f2bd567b788c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,18 +227,25 @@ list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/annotation/annotation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend_scope.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/color_mode.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/command_encoder.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/debug_group.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/depth_mode.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/draw_mode.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/draw_scope.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/fill_generator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/gfx_types.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/polyline_generator.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/renderable.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/renderbuffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/renderer_backend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/rendering_stats.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader_group.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader_registry.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/shader.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/stencil_mode.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/types.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/vertex_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/background_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/circle_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_layer_factory.hpp @@ -476,26 +483,19 @@ list(APPEND SRC_FILES ${PROJECT_SOURCE_DIR}/src/mbgl/geometry/line_atlas.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/attribute.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/attribute.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/color_mode.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/cull_face_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/depth_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/draw_mode.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/draw_scope.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/index_buffer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/index_vector.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/offscreen_texture.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/polyline_generator.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/fill_generator.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/render_pass.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/renderbuffer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/renderer_backend.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/rendering_stats.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/shader_group.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/shader_registry.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/stencil_mode.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/uniform.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/upload_pass.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_buffer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/vertex_vector.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/background_layer_factory.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/circle_layer_factory.cpp diff --git a/src/mbgl/gfx/color_mode.hpp b/include/mbgl/gfx/color_mode.hpp similarity index 100% rename from src/mbgl/gfx/color_mode.hpp rename to include/mbgl/gfx/color_mode.hpp diff --git a/src/mbgl/gfx/depth_mode.hpp b/include/mbgl/gfx/depth_mode.hpp similarity index 100% rename from src/mbgl/gfx/depth_mode.hpp rename to include/mbgl/gfx/depth_mode.hpp diff --git a/src/mbgl/gfx/draw_mode.hpp b/include/mbgl/gfx/draw_mode.hpp similarity index 100% rename from src/mbgl/gfx/draw_mode.hpp rename to include/mbgl/gfx/draw_mode.hpp diff --git a/src/mbgl/gfx/draw_scope.hpp b/include/mbgl/gfx/draw_scope.hpp similarity index 100% rename from src/mbgl/gfx/draw_scope.hpp rename to include/mbgl/gfx/draw_scope.hpp diff --git a/src/mbgl/gfx/renderbuffer.hpp b/include/mbgl/gfx/renderbuffer.hpp similarity index 100% rename from src/mbgl/gfx/renderbuffer.hpp rename to include/mbgl/gfx/renderbuffer.hpp diff --git a/src/mbgl/gfx/stencil_mode.hpp b/include/mbgl/gfx/stencil_mode.hpp similarity index 100% rename from src/mbgl/gfx/stencil_mode.hpp rename to include/mbgl/gfx/stencil_mode.hpp diff --git a/src/mbgl/gfx/vertex_buffer.hpp b/include/mbgl/gfx/vertex_buffer.hpp similarity index 100% rename from src/mbgl/gfx/vertex_buffer.hpp rename to include/mbgl/gfx/vertex_buffer.hpp From 3b01596f0d29064aa6ac2c450d7482e39678c1c4 Mon Sep 17 00:00:00 2001 From: James Rich Date: Wed, 15 Apr 2026 15:47:26 -0500 Subject: [PATCH 339/339] feat(linux): vendor static deps for portable shared libraries Add MLN_LINUX_STATIC_DEPS CMake option that builds zlib, libpng, libjpeg-turbo, libwebp, libuv, and bzip2 from source with -fPIC, then amalgamates them into the mbgl-core static archive. This eliminates runtime dependencies on specific system library versions (ICU, libpng, zlib, etc.) that cause UnsatisfiedLinkError crashes when the shared library is loaded on a different distro or version than it was built on. System curl, X11, OpenGL, libc, and libstdc++ remain dynamic (stable ABI, universally available). Fixes: https://github.com/maplibre/maplibre-compose/issues/627 Changes: - Add vendored_deps.cmake with FetchContent/ExternalProject builds for zlib 1.3.1, libpng 1.6.44, libjpeg-turbo 3.1.0, libwebp 1.5.0, libuv 1.50.0, and bzip2 1.0.8 - Add vendored amalgamation path in linux.cmake (symbols hidden via -Wl,--exclude-libs,ALL to prevent collisions) - Gate freetype PNG/BZip2 system linking behind MLN_LINUX_STATIC_DEPS - Force builtin ICU when vendoring (MLN_USE_BUILTIN_ICU=TRUE) - Require armerge when MLN_LINUX_STATIC_DEPS is enabled - Add INTERFACE_MAPLIBRE_* license metadata for all vendored deps Also fixes (in the non-vendored path): - Use ${ARMERGE} variable instead of bare 'armerge' command - Fix ICU check: ICUUC_FOUND without ${} expansion - Fix typo: 'requestd' -> 'requested' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- CHANGELOG.md | 1 + CMakeLists.txt | 1 + platform/linux/cmake/vendored_deps.cmake | 209 +++++++++++++++++++++ platform/linux/linux.cmake | 225 ++++++++++++++++------- vendor/freetype.cmake | 16 ++ 5 files changed, 384 insertions(+), 68 deletions(-) create mode 100644 platform/linux/cmake/vendored_deps.cmake diff --git a/CHANGELOG.md b/CHANGELOG.md index 26a8f6168dbd..b3acc8a05a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### ✨ Technical Improvements - *...Add new stuff here...* +- [linux] Add `MLN_LINUX_STATIC_DEPS` CMake option to vendor zlib, libpng, libjpeg-turbo, libwebp, libuv, and bzip2 as static libraries for portable shared library builds. - Bump [maplibre-native-base](https://github.com/maplibre/maplibre-native-base) from 2.0.0 to 2.1.1 ([#397](https://github.com/maplibre/maplibre-native/pull/397), [#406](https://github.com/maplibre/maplibre-native/pull/406)) - Bump [wagyu](https://github.com/mapbox/wagyu) from 0.4.3 to 0.5.0 [#398](https://github.com/maplibre/maplibre-native/pull/398) - Bump [eternal](https://github.com/mapbox/eternal.git) from 1.0.0 to 1.0.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index f2bd567b788c..a44b9a3cb844 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) option(MLN_USE_RUST "Use components in Rust" OFF) +option(MLN_LINUX_STATIC_DEPS "Vendor image/compression/event-loop deps for portable Linux shared libraries" OFF) option(MLN_TEXT_SHAPING_HARFBUZZ "Use haffbuzz to shape complex text" ON) option(MLN_CORE_INCLUDE_DEPS "Include depdendencies in static build of core" OFF) option(MLN_CREATE_AUTORELEASEPOOL "Create autoreleasepool in render loop" OFF) diff --git a/platform/linux/cmake/vendored_deps.cmake b/platform/linux/cmake/vendored_deps.cmake new file mode 100644 index 000000000000..6c66d30842d9 --- /dev/null +++ b/platform/linux/cmake/vendored_deps.cmake @@ -0,0 +1,209 @@ +# Vendored static dependencies for portable Linux shared library builds. +# +# When MLN_LINUX_STATIC_DEPS is ON, this file downloads and builds +# system-level dependencies from source with -fPIC so they can be linked +# into the final shared library without text relocation errors. +# +# This reduces runtime dependencies on system library versions (ICU, +# libpng, zlib, etc.), improving portability across Linux distros. +# System curl is still linked dynamically (stable ABI, complex dep tree). + +include(FetchContent) + +# All vendored deps inherit CMAKE_POSITION_INDEPENDENT_CODE=ON from the +# root CMakeLists.txt, ensuring every object is compiled with -fPIC. + +# ── zlib (required by libpng and others) ───────────────────────────────────── + +FetchContent_Declare( + vendored_zlib + URL https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz + URL_HASH SHA256=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23 +) +set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(vendored_zlib) + +# Make zlib findable by libpng's find_package(ZLIB) +set(ZLIB_FOUND TRUE CACHE BOOL "" FORCE) +set(ZLIB_INCLUDE_DIR "${vendored_zlib_SOURCE_DIR};${vendored_zlib_BINARY_DIR}" CACHE PATH "" FORCE) +set(ZLIB_LIBRARY zlibstatic CACHE STRING "" FORCE) +set(ZLIB_LIBRARIES zlibstatic CACHE STRING "" FORCE) +set(ZLIB_ROOT "${vendored_zlib_SOURCE_DIR};${vendored_zlib_BINARY_DIR}" CACHE PATH "" FORCE) +add_library(ZLIB::ZLIB ALIAS zlibstatic) + +# ── libpng ─────────────────────────────────────────────────────────────────── + +FetchContent_Declare( + vendored_png + URL https://github.com/pnggroup/libpng/archive/refs/tags/v1.6.44.tar.gz + URL_HASH SHA256=0ef5b633d0c65f780c4fced27ff832998e71478c13b45dfb6e94f23a82f64f7c +) +set(PNG_SHARED OFF CACHE BOOL "" FORCE) +set(PNG_STATIC ON CACHE BOOL "" FORCE) +set(PNG_TESTS OFF CACHE BOOL "" FORCE) +set(PNG_TOOLS OFF CACHE BOOL "" FORCE) +set(SKIP_INSTALL_EXPORT TRUE CACHE BOOL "" FORCE) +set(SKIP_INSTALL_CONFIG_FILE TRUE CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(vendored_png) +unset(SKIP_INSTALL_EXPORT CACHE) +unset(SKIP_INSTALL_CONFIG_FILE CACHE) + +# ── libjpeg-turbo (ExternalProject — can't use add_subdirectory) ────────────── + +include(ExternalProject) +ExternalProject_Add( + vendored_jpeg_ext + URL https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.0/libjpeg-turbo-3.1.0.tar.gz + URL_HASH SHA256=9564c72b1dfd1d6fe6274c5f95a8d989b59854575d4bbee44ade7bc17aa9bc93 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX= + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DENABLE_SHARED=OFF + -DENABLE_STATIC=ON + -DWITH_TURBOJPEG=OFF + BUILD_BYPRODUCTS /lib/libjpeg.a +) +ExternalProject_Get_Property(vendored_jpeg_ext INSTALL_DIR) +set(VENDORED_JPEG_INSTALL_DIR "${INSTALL_DIR}") + +# Pre-create the include directory so CMake doesn't complain at configure time +file(MAKE_DIRECTORY "${INSTALL_DIR}/include") + +# Create an imported target for the built libjpeg +add_library(vendored_jpeg_imported STATIC IMPORTED GLOBAL) +set_target_properties(vendored_jpeg_imported PROPERTIES + IMPORTED_LOCATION "${INSTALL_DIR}/lib/libjpeg.a" +) +add_dependencies(vendored_jpeg_imported vendored_jpeg_ext) + +# ── libwebp ────────────────────────────────────────────────────────────────── + +FetchContent_Declare( + vendored_webp + URL https://github.com/webmproject/libwebp/archive/refs/tags/v1.5.0.tar.gz + URL_HASH SHA256=668c9aba45565e24c27e17f7aaf7060a399f7f31dba6c97a044e1feacb930f37 +) +set(WEBP_BUILD_ANIM_UTILS OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_CWEBP OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_DWEBP OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_GIF2WEBP OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_IMG2WEBP OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_VWEBP OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_WEBPINFO OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_WEBPMUX OFF CACHE BOOL "" FORCE) +set(WEBP_BUILD_EXTRAS OFF CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(vendored_webp) + +# ── libuv ──────────────────────────────────────────────────────────────────── + +FetchContent_Declare( + vendored_uv + URL https://github.com/libuv/libuv/archive/refs/tags/v1.50.0.tar.gz + URL_HASH SHA256=b1ec56444ee3f1e10c8bd3eed16ba47016ed0b94fe42137435aaf2e0bd574579 +) +set(LIBUV_BUILD_SHARED OFF CACHE BOOL "" FORCE) +set(LIBUV_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(LIBUV_BUILD_BENCH OFF CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(vendored_uv) + +# ── bzip2 ──────────────────────────────────────────────────────────────────── + +FetchContent_Declare( + vendored_bz2 + URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz + URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +) +# bzip2 doesn't ship a CMakeLists.txt, so we use FetchContent_Populate +# (not MakeAvailable) to download + extract without calling add_subdirectory. +FetchContent_GetProperties(vendored_bz2) +if(NOT vendored_bz2_POPULATED) + FetchContent_Populate(vendored_bz2) +endif() + +# Build bzip2 manually from its source files +add_library(vendored_bzip2 STATIC + ${vendored_bz2_SOURCE_DIR}/blocksort.c + ${vendored_bz2_SOURCE_DIR}/huffman.c + ${vendored_bz2_SOURCE_DIR}/crctable.c + ${vendored_bz2_SOURCE_DIR}/randtable.c + ${vendored_bz2_SOURCE_DIR}/compress.c + ${vendored_bz2_SOURCE_DIR}/decompress.c + ${vendored_bz2_SOURCE_DIR}/bzlib.c +) +target_include_directories(vendored_bzip2 PUBLIC ${vendored_bz2_SOURCE_DIR}) +target_compile_definitions(vendored_bzip2 PRIVATE _GNU_SOURCE) + +# NOTE: OpenSSL is NOT vendored or linked explicitly. System curl links +# against its own TLS backend (OpenSSL/GnuTLS/NSS) dynamically. We don't +# assume which backend curl uses. + +# ── License metadata ───────────────────────────────────────────────────────── +# Required by scripts/license.cmake for notice generation. + +set_target_properties(zlibstatic PROPERTIES + INTERFACE_MAPLIBRE_NAME "zlib" + INTERFACE_MAPLIBRE_URL "https://github.com/madler/zlib" + INTERFACE_MAPLIBRE_AUTHOR "Jean-loup Gailly and Mark Adler" + INTERFACE_MAPLIBRE_LICENSE "${vendored_zlib_SOURCE_DIR}/LICENSE" +) + +set_target_properties(png_static PROPERTIES + INTERFACE_MAPLIBRE_NAME "libpng" + INTERFACE_MAPLIBRE_URL "https://github.com/pnggroup/libpng" + INTERFACE_MAPLIBRE_AUTHOR "Contributing Authors and Group 42, Inc." + INTERFACE_MAPLIBRE_LICENSE "${vendored_png_SOURCE_DIR}/LICENSE" +) + +set_target_properties(vendored_jpeg_imported PROPERTIES + INTERFACE_MAPLIBRE_NAME "libjpeg-turbo" + INTERFACE_MAPLIBRE_URL "https://github.com/libjpeg-turbo/libjpeg-turbo" + INTERFACE_MAPLIBRE_AUTHOR "libjpeg-turbo contributors" + INTERFACE_MAPLIBRE_LICENSE "${VENDORED_JPEG_INSTALL_DIR}/src/vendored_jpeg_ext/LICENSE.md" +) + +set_target_properties(webp PROPERTIES + INTERFACE_MAPLIBRE_NAME "libwebp" + INTERFACE_MAPLIBRE_URL "https://github.com/webmproject/libwebp" + INTERFACE_MAPLIBRE_AUTHOR "Google LLC" + INTERFACE_MAPLIBRE_LICENSE "${vendored_webp_SOURCE_DIR}/COPYING" +) + +set_target_properties(uv_a PROPERTIES + INTERFACE_MAPLIBRE_NAME "libuv" + INTERFACE_MAPLIBRE_URL "https://github.com/libuv/libuv" + INTERFACE_MAPLIBRE_AUTHOR "libuv project contributors" + INTERFACE_MAPLIBRE_LICENSE "${vendored_uv_SOURCE_DIR}/LICENSE" +) + +set_target_properties(vendored_bzip2 PROPERTIES + INTERFACE_MAPLIBRE_NAME "bzip2" + INTERFACE_MAPLIBRE_URL "https://sourceware.org/bzip2/" + INTERFACE_MAPLIBRE_AUTHOR "Julian Seward" + INTERFACE_MAPLIBRE_LICENSE "${vendored_bz2_SOURCE_DIR}/LICENSE" +) + +# ── Export variables for linux.cmake to consume ────────────────────────────── +# These are regular variables (not cache) since this file is include()'d +# from linux.cmake and shares its scope. + +set(VENDORED_PNG_TARGET png_static) +set(VENDORED_ZLIB_TARGET zlibstatic) +set(VENDORED_JPEG_TARGET vendored_jpeg_imported) +set(VENDORED_WEBP_TARGET webp) +set(VENDORED_UV_TARGET uv_a) +set(VENDORED_BZ2_TARGET vendored_bzip2) + +set(VENDORED_JPEG_INCLUDE_DIR "${VENDORED_JPEG_INSTALL_DIR}/include") +set(VENDORED_UV_INCLUDE_DIR "${vendored_uv_SOURCE_DIR}/include") +set(VENDORED_WEBP_INCLUDE_DIR "${vendored_webp_SOURCE_DIR}/src") + +# Export vendored targets so maplibre-native's export() calls don't fail +export(TARGETS + zlibstatic png_static webp sharpyuv uv_a vendored_bzip2 + APPEND FILE MapboxCoreTargets.cmake +) + +message(STATUS "Vendored static dependencies configured (all built with -fPIC)") diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 397e07935ed5..0990908e9aaf 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -1,20 +1,41 @@ option(MLN_WITH_X11 "Build with X11 Support" ON) option(MLN_WITH_WAYLAND "Build with Wayland Support" OFF) +if(MLN_LINUX_STATIC_DEPS) + message(STATUS "Using vendored static dependencies (MLN_LINUX_STATIC_DEPS=ON)") + include(${CMAKE_CURRENT_LIST_DIR}/cmake/vendored_deps.cmake) + + # Force builtin ICU when vendoring all deps + set(MLN_USE_BUILTIN_ICU TRUE) +endif() + find_package(CURL REQUIRED) -find_package(JPEG REQUIRED) -find_package(PNG REQUIRED) find_package(PkgConfig REQUIRED) if (MLN_WITH_X11) find_package(X11 REQUIRED) endif () find_package(Threads REQUIRED) -pkg_search_module(WEBP libwebp REQUIRED) -pkg_search_module(LIBUV libuv REQUIRED) -pkg_search_module(ICUUC icu-uc) -pkg_search_module(ICUI18N icu-i18n) -find_program(ARMERGE NAMES armerge) +if(NOT MLN_LINUX_STATIC_DEPS) + find_package(JPEG REQUIRED) + find_package(PNG REQUIRED) + pkg_search_module(WEBP libwebp REQUIRED) + pkg_search_module(LIBUV libuv REQUIRED) + pkg_search_module(ICUUC icu-uc) + pkg_search_module(ICUI18N icu-i18n) +endif() + +find_program(ARMERGE NAMES armerge + HINTS "$ENV{HOME}/.cargo/bin" + DOC "Path to armerge tool for static library amalgamation" +) + +if(MLN_LINUX_STATIC_DEPS AND "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") + message(FATAL_ERROR + "MLN_LINUX_STATIC_DEPS requires armerge for static library amalgamation.\n" + "Install with: cargo install armerge" + ) +endif() if(MLN_WITH_WAYLAND) # See https://github.com/maplibre/maplibre-native/pull/2022 @@ -141,17 +162,32 @@ target_include_directories( PUBLIC ${PROJECT_SOURCE_DIR}/platform/default/include PRIVATE ${CURL_INCLUDE_DIRS} - ${JPEG_INCLUDE_DIRS} - ${LIBUV_INCLUDE_DIRS} ${X11_INCLUDE_DIRS} - ${WEBP_INCLUDE_DIRS} ) +if(MLN_LINUX_STATIC_DEPS) + target_include_directories( + mbgl-core + PRIVATE + ${VENDORED_JPEG_INCLUDE_DIR} + ${VENDORED_UV_INCLUDE_DIR} + ${VENDORED_WEBP_INCLUDE_DIR} + ) +else() + target_include_directories( + mbgl-core + PRIVATE + ${JPEG_INCLUDE_DIRS} + ${LIBUV_INCLUDE_DIRS} + ${WEBP_INCLUDE_DIRS} + ) +endif() + include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) -if(NOT ${ICUUC_FOUND} OR "${ICUUC_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) - message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requestd, using builtin.") +if(NOT ICUUC_FOUND OR "${ICUUC_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) + message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requested, using builtin.") set(MLN_USE_BUILTIN_ICU TRUE) include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) @@ -164,65 +200,118 @@ if(NOT ${ICUUC_FOUND} OR "${ICUUC_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN ) endif() -target_link_libraries( - mbgl-core - PRIVATE - ${CURL_LIBRARIES} - ${JPEG_LIBRARIES} - ${LIBUV_LIBRARIES} - ${X11_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} - ${WEBP_LIBRARIES} - $<$>:${ICUUC_LIBRARIES}> - $<$>:${ICUI18N_LIBRARIES}> - $<$:mbgl-vendor-icu> - PNG::PNG - mbgl-vendor-nunicode - mbgl-vendor-sqlite -) +if(MLN_LINUX_STATIC_DEPS) + # Link against vendored static libraries (all built with -fPIC) + target_link_libraries( + mbgl-core + PRIVATE + ${CURL_LIBRARIES} + ${VENDORED_JPEG_TARGET} + ${VENDORED_UV_TARGET} + ${X11_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} + ${VENDORED_WEBP_TARGET} + mbgl-vendor-icu + ${VENDORED_PNG_TARGET} + ${VENDORED_ZLIB_TARGET} + ${VENDORED_BZ2_TARGET} + mbgl-vendor-nunicode + mbgl-vendor-sqlite + ) +else() + target_link_libraries( + mbgl-core + PRIVATE + ${CURL_LIBRARIES} + ${JPEG_LIBRARIES} + ${LIBUV_LIBRARIES} + ${X11_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} + ${WEBP_LIBRARIES} + $<$>:${ICUUC_LIBRARIES}> + $<$>:${ICUI18N_LIBRARIES}> + $<$:mbgl-vendor-icu> + PNG::PNG + mbgl-vendor-nunicode + mbgl-vendor-sqlite + ) +endif() -# Bundle system provided libraries -if(NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") +# Bundle libraries into amalgamated static archive +if(NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") message(STATUS "Found armerge: ${ARMERGE}") - include(${CMAKE_CURRENT_LIST_DIR}/cmake/find_static_library.cmake) - set(STATIC_LIBS "") - - find_static_library(STATIC_LIBS NAMES png) - find_static_library(STATIC_LIBS NAMES z) - find_static_library(STATIC_LIBS NAMES jpeg) - find_static_library(STATIC_LIBS NAMES webp) - find_static_library(STATIC_LIBS NAMES uv uv_a) - find_static_library(STATIC_LIBS NAMES ssl) - find_static_library(STATIC_LIBS NAMES crypto) - find_static_library(STATIC_LIBS NAMES bz2 bzip2) - - if(MLN_WITH_VULKAN) - find_static_library(STATIC_LIBS NAMES glslang) - find_static_library(STATIC_LIBS NAMES glslang-default-resource-limits) - find_static_library(STATIC_LIBS NAMES SPIRV) - find_static_library(STATIC_LIBS NAMES SPIRV-Tools) - find_static_library(STATIC_LIBS NAMES SPIRV-Tools-opt) - find_static_library(STATIC_LIBS NAMES MachineIndependent) - find_static_library(STATIC_LIBS NAMES GenericCodeGen) - endif() - - add_custom_command( - TARGET mbgl-core - POST_BUILD - COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a - $ - $ - $ - $ - $ - $ - $ - ${ICUUC_LIBRARY_DIRS}/libicuuc.a - ${ICUUC_LIBRARY_DIRS}/libicudata.a - ${ICUI18N_LIBRARY_DIRS}/libicui18n.a - ${STATIC_LIBS} - ) + if(MLN_LINUX_STATIC_DEPS) + # Vendored path: all deps are built with -fPIC, safe to amalgamate + add_custom_command( + TARGET mbgl-core + POST_BUILD + # No --keep-symbols: all vendored symbols stay global inside the + # amalgamated .a so the final .so linker resolves them internally + # rather than falling back to system shared libs. + COMMAND ${ARMERGE} --output libmbgl-core-amalgam.a + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + # Replace the original mbgl-core.a with the amalgamated archive + # so downstream targets (maplibre-jni) link against the full bundle + COMMAND ${CMAKE_COMMAND} -E copy libmbgl-core-amalgam.a $ + ) + # Hide vendored symbols from the final .so to avoid collisions with + # other native libraries in the same process that may use the same deps + target_link_options(mbgl-core PUBLIC -Wl,--exclude-libs,ALL) + elseif(NOT MLN_USE_BUILTIN_ICU) + # System path: use system static libraries (may lack -fPIC) + include(${CMAKE_CURRENT_LIST_DIR}/cmake/find_static_library.cmake) + set(STATIC_LIBS "") + + find_static_library(STATIC_LIBS NAMES png) + find_static_library(STATIC_LIBS NAMES z) + find_static_library(STATIC_LIBS NAMES jpeg) + find_static_library(STATIC_LIBS NAMES webp) + find_static_library(STATIC_LIBS NAMES uv uv_a) + find_static_library(STATIC_LIBS NAMES ssl) + find_static_library(STATIC_LIBS NAMES crypto) + find_static_library(STATIC_LIBS NAMES bz2 bzip2) + + if(MLN_WITH_VULKAN) + find_static_library(STATIC_LIBS NAMES glslang) + find_static_library(STATIC_LIBS NAMES glslang-default-resource-limits) + find_static_library(STATIC_LIBS NAMES SPIRV) + find_static_library(STATIC_LIBS NAMES SPIRV-Tools) + find_static_library(STATIC_LIBS NAMES SPIRV-Tools-opt) + find_static_library(STATIC_LIBS NAMES MachineIndependent) + find_static_library(STATIC_LIBS NAMES GenericCodeGen) + endif() + + add_custom_command( + TARGET mbgl-core + POST_BUILD + COMMAND ${ARMERGE} --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a + $ + $ + $ + $ + $ + $ + $ + ${ICUUC_LIBRARY_DIRS}/libicuuc.a + ${ICUUC_LIBRARY_DIRS}/libicudata.a + ${ICUI18N_LIBRARY_DIRS}/libicui18n.a + ${STATIC_LIBS} + ) + endif() endif() add_subdirectory(${PROJECT_SOURCE_DIR}/bin) diff --git a/vendor/freetype.cmake b/vendor/freetype.cmake index a459a3d57e46..c3af453dd92e 100644 --- a/vendor/freetype.cmake +++ b/vendor/freetype.cmake @@ -6,6 +6,22 @@ if (MLN_TEXT_SHAPING_HARFBUZZ) set(FT_REQUIRE_BROTLI OFF CACHE BOOL "freetype option") set(FT_DISABLE_ZLIB ON CACHE BOOL "freetype option") set(FT_REQUIRE_ZLIB OFF CACHE BOOL "freetype option") + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND MLN_LINUX_STATIC_DEPS) + # When vendoring deps on Linux, disable PNG and BZip2 to prevent + # freetype from finding system shared libs that would leak into the + # final shared library. Current MapLibre glyph rasterization does not + # depend on FreeType's PNG color-glyph or BZip2-compressed font support. + set(FT_DISABLE_PNG ON CACHE BOOL "freetype option") + set(FT_REQUIRE_PNG OFF CACHE BOOL "freetype option") + set(FT_DISABLE_BZIP2 ON CACHE BOOL "freetype option") + set(FT_REQUIRE_BZIP2 OFF CACHE BOOL "freetype option") + else() + # Ensure these aren't stuck from a previous MLN_LINUX_STATIC_DEPS=ON configure + unset(FT_DISABLE_PNG CACHE) + unset(FT_REQUIRE_PNG CACHE) + unset(FT_DISABLE_BZIP2 CACHE) + unset(FT_REQUIRE_BZIP2 CACHE) + endif() add_subdirectory(vendor/freetype) set_target_properties(

    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 KPpv}52KztAOUw)a literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-font/devanagari/style.json b/metrics/integration/render-tests/text-font/devanagari/style.json new file mode 100644 index 000000000000..c383ba616e81 --- /dev/null +++ b/metrics/integration/render-tests/text-font/devanagari/style.json @@ -0,0 +1,69 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0003 + } + }, + "center": [ + -70.752954126, + 43.39004898677380 + ], + "zoom": 11, + "sources": { + "geojson": { + "type": "geojson", + "data": "local://data/devanagari.geojson" + } + }, + "sprite": "local://sprites/sprite", + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "font-faces": { + "Noto Sans Regular": [ + { + "url": "local://glyphs/Noto%20Sans%20Regular/khmer.ttf", + "unicode-range": [ + "U+1780-17FF" + ] + }, + { + "url": "local://glyphs/Noto%20Sans%20Regular/myanmar.ttf", + "unicode-range": [ + "U+1000-109F", + "U+A9E0-0xA9FF", + "U+AA60-0xAA7F" + ] + }, + { + "url": "local://glyphs/Noto%20Sans%20Regular/devanagari.ttf", + "unicode-range": [ + "U+0900-097F", + "U+A8E0-0xA8FF" + ] + } + ] + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "icon", + "type": "symbol", + "source": "geojson", + "layout": { + "text-field": "{name}", + "text-font": [ + "Noto Sans Regular" + ], + "symbol-placement": "point" + } + } + ] +} diff --git a/metrics/integration/render-tests/text-font/khmer/expected1.png b/metrics/integration/render-tests/text-font/khmer/expected1.png new file mode 100644 index 0000000000000000000000000000000000000000..8cfae12d9fff03ca4934d298cd489c04b7c038c4 GIT binary patch literal 89426 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 z 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 P2>fnn8)#K(*hl;i9n;B0 literal 0 HcmV?d00001 diff --git a/metrics/integration/render-tests/text-font/khmer/expected2.png b/metrics/integration/render-tests/text-font/khmer/expected2.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0fc60ccb219ad94b56e7242b2ee841ce2864f5 GIT binary patch literal 88052 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%0D`<;5kynrz(cu6Ac`AMop*&X0-FoWJjtmw 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%0AL>yy%NReep-_W@zUB%HHj;U& z#LwWPW#jo^%1NbR@0Y*=l?|~acNJ$Do<*1`C{SCzRdO+hoAh#ieQUfU6kO5v4#|A+ z&^y5pgjIpru3JG1QM{&`@#IhWHEfBTl;-`KS4|A&`I;HzraRc-#$`Vb8p-8qB4Z#H zo&Ig%H4Ftsk1;SUG6b1lb-Q}ljV@r}Dg#~FY$w}pX1`J*>tY}7Ff?SD3VnXGeH5`*NZ~ucx2T<)txHcf2RJ;G75t9LjCpTj9>gH zL58lqCRqJZUSXb~&9R9dKlB#Jdu7#9WEPeFvR8owz7F|2d5*lU5PY0a{FCG>qnmcrUeK<$oftVEq*#R?Uzu27QK!sbDGn)f0 zD~DdG#K!@F(BYqjt$RGgATkhoQdWehf=~Q2)D*Wa0e4y(`O0b#Ywr|`{s z2+$qp>Ja17LJk3?2-d~ZQ_=tJSqi2Z`oEkiDvSF#sk)ziHYjpu;5DeaJ+><(Z4rz!W?&S6tPyGgY_q*zz=2ahX3-XzkzOBo8BET1ke=iNsqY@ z#Lw>K;GNQD_S-<)FXRT9UBLVUR6Tq{vZ!st39eOIGF7IBIasC3NO$Z|dc3BjjK!xs zuKfyTi?!}=z9hn(f)z}|I;qj7*_%}E0;DTv9@+bZSL)Az^b`MT<6>eEfu&2)6Om8j6E1BGxFAzf;=G}6Xq=TGvsyxH zmM?IIsUm4dlixr4{*8m-h8cpE;K3B+GMp%|docuVkAD7?DixM|D6_2g2 zVUdv|!(hom&y;f~K7_MCqlf=49@RPU-A+o)!~>9&l9-g~bmC~o^sC3%Kdt+`368nD zvSDZ5vAOSA6bFrt&naw$hdPX=Y~*Vq`z!RX8gZ^gfRe;tN7n|L~J0o0!RF0po+K7G-Bzz_p zVrX?kI5sCmiB!KyEkNbtt98Ac)<9%{DBki4sjwm@U$Q5}@z;l3gnfxo-79N*LfQ*X zMkWJ|w=6^B$rj8Ed-0E!5}l-Z#w^CED8~5QWk9)vM}CH#&GmrT8;$Jjm)wW;zjz~0 z(LYi~#n(cm{t zf0{_de9R2lowJbxqq(Egb@5qj;#qb7y;z9Nq3ZV!eB}FUziviaSSx469k!W<^9C-J`1)hi6KkiPdLQk2qMIq(DB%K<@-8Uu*WasfRW3!hoN{4+_j*~bYzY_b z4f8rejDYR^%ds<89}7$jd;|FCP<|3lcUAevR+2u!nigG2~>?dO;ipn47KCZ06Oqm_} z6=cicHYu~aZ1MN(b)Hz`xg$+v%A8xhzW3wJZfff~bct{Za$4fZJe?{svNjvnao34< zB(;*O3-y->-RN$0Y3K;8UDda{l-rbT!o6SU3zcSjFT#mA%^V&F-@W-G?vUzZv_zR&lU5R6tlNF+MDi*?~cy(2CMy|LbN z;K#>>jD4ard#U0*tIm-8_hp)gV&FgUahUwu_g;W{9}+7o3nJk$ul(xVulHM(wY6q4 z#}wj%IdBy-E^AXM2jR2~uDsB|uvIE5V0Hjz=O2-Q4*B`d-w<+qqt01Whwy1X6Ux2< zL#yp$`}J1=76+^V=K6s-4o-7n5g^FG8GC+_Y#D4!{|54&?x**f|zp1KdS%R+Yag#bB$nm8= z@{a8H?(8d-l8D_s8bYv{je1z&tJdm*s8nFu?mxbREj9MEBg!dh#_C!4rzbQef07LH)?CpXcW>E7D~JFf?W?@u#HfsYSl=7xod zfPGfE%@v?KFBdSKxaSN>!a?q7xN(o>?9aKKqjiw99CTO1 zAM-+X?C{-5EfckPb*v_JkOGbl%~`Ozgy`jBjJ2fM7nHz}#KNpLp5r(5TnW>TzVtR} z_PXw#`#q^Uc9vMz6VgfpDcjZ9B__Oxau^xv`F^!E(OHM;lqWalzrFphfU6wZHqZSA z(3WFavRZf8n0F;~*3Pee7LPNx?q`bH#ox4l7pI2;M0WB#)O0v|_Jk{9x<5k){AND_ zH2!SD0`E=9t_fK&dGn_H7+LuQdmwdv?VU@Rlu?lQ&cfVT&E5V!Fuf7b*j;76^N_dM zy1&|ZP~DZzlYMM@hZ`49OHVztV*wrw9_#JyOk5q#9>3x8wN|Zd5{|Vd8pw{^yMvt{$ysdMbbJ&;9q$ z^NgPjKIy#5y4%V+D^dF|VS$d;zMZk}yHRb2$F=t0PUIg$%EjSMfGDq?!0&%JH@_}8 zMvH&vF1AV-tKYb=>*O)oezNNv;PWg?@~k4Zxx4KZ-79e10;5K{aE1GNijBHuc6)6d zCm#6j;+F2R_eJT#3cg3Odmrw94e8gtjj^}vP*v#&FTr*dv#eIX4=`NrhCiRTQa3U@ z7Jo@ChJ$RM61{scgLfZL1xmayy6fql$?J_Zy88=nNy!IP!IhTe)zWv`)1NgyfY?4( z8l;oVATnel>77+$=0hfm&FyV78!Gj8@w8X;{d9nA>)a;C!NS*;lOGNb9dY^hI{?RQ zaLMR8(eyGg0s0$*+=$0`4XDvP66lpi`0%J>d+@S-7v(%|KSKe1x5twvm%sJ)F8m)H z%Ay(O$$28FH!Y8MRzJmbu;@Kpb6`kwuSX<-w$LC^?&QL8=6U*AnN1=3?C*zkTaD@6 zU(?K^^<$Cth~?t)pM|U-m;>ZEnS(HkUjB($WoA$$jP-{J?sXwD#A12f> zT4fJk`4TiZa9Qk?sU-TY90I@Sb~3y1-YY6=@&4G^#BG!GJCIA6J@J+>}$z))@*xx5Rl;}&BLmqjk;ZXwyG3Q=lPj{-J2ix=1l?)nO zM+6G(0xs=g+WikacYx8>D9VsP*!_J=7OC z0LG@a^IxB&E*IiXIp0n?8;5`nTJ^v{(!J%eXXZoS=h!M0PyfP+KXFq@mM518?`E+lNyP#QedPhw3XL=s&UbcA)DSGlH)Rz zAq$6*g$_RWo1dr|`|x$k@+EJ#Sh3whDN-KCRt-IOFg$OYW~@)&U_p1?>jKP;_c1%H zQzwfUJNCE^sfVRpi&n*2q2vw}Li5CcUvqjH`DLgk?6cG`W+F(~*+d^#!6RfR!kM@1 zVTCKL3kw@a#$yL$3Y2$=gRz4lu7Y&bO}-?}B=@A!jxIc=uj$11^nmlBK5tSoACHq{ zsH)cBt5^tX+x1<~@k_HI;k76wvY?hpED4Vu(M6Za#R2m<$nsJD(=6_P%m!k&dl5HDgB@Vv8(`&FQnDOPCW?Ep$(uIDq=rNM z@J0j4Q&I`UWNGrSs>A}1snXt^#m^QG-ROs-s;y}O=w?u2%l3BJNDrD@7Oke# z@E(u#e48>$ta_%Cu|i-}X`Er|LXrY~kugUXgF-K%WvXmm55JTVyd;wMcB6?80q8|k zY?b1)l>3ToktwH|NbBmoC@*kP3&?Nt4m9YW!n#cdntV z483?~n}83`RPwndS~DNk&HjTcJp52kTc5Cvw--O z2H0_4T9Q0}waIL^Lw{Ua#-ueGQ3Qbu*BW93S{WG=kqoq%(K=}6LW_giQzv3Urx6U{ z@bUL%t`owsVzRv@rUG-wOB?YWgRy(CpBIoaE?xj8uMJFDVGOSIEsV$g4OCN%Jd`Q5 zm;(*^W^)kaG9l*=?RWan^dcm;__%vSv3_w%M4{53Y~*Sfz4xLwMVtVs|a)ZuCm+--?%6VztAT% ze1OonF5#fPjUk|=uS*6J1>M?Z7z4FX&?qf1Tzzg9Ed_?$Z+ZBu$b83Hl!r)}GDjk1 z0RBh0?Wg_W9%$%;pM7rZ)6JJzamT$1rYLz7orR&s@KWF)Qb#LbL=&6O4<+V|SF{c| zc*}hJ7OoxFa3gH#HFk&S^LA1>O`RPY$qUr&JW7q~%|T+Buhp;2bGv_ytqu9&I%x{3 zzEd0MuA_eOdX70TO}P>RmltnED>TQ-pU8%PI1CO=rmHcHLvu|(D_)8cDCJ!frQ}u0 z|KT-O-n9kWgYX8M`|6c50gKd62#Ae$GH;tK`E?qoVT2&%e%8iB2RGJ6;Ywcze9jQd zRv7u^fCdB2+r=cATu$_0^@Zbt%0!zBp1vZ4Zjca+t0!(tX|7G?y}`MSfPX|iVS8Ca zv`)Q2ZAWbV)phNqX_7S8aJ%?%yV&>EHPeX?zI6(nF^;^Rz9@Pe@r?_;4g5RfJNnkf z4I?8A^L)RW+X-s?Oq;zMX)JRY&tywXM`++NB;wPb6i#JKUy2iT>_CiAYlKS$&&bIF zN?ZXf#bfXun0&3Y^M$?f^<&Axz~Y6MvnQO>rl2)Ms_LpPSa4zjrjCTT%sT*!qnS)s z{p=$~_pvV6Y~}n-Fafq679P%_nKd36At>0`EPkT_7)4>Vuq3QO0^3ahWv5w*ak8Qd z1#uFpLB@@>lcZ&3ZQYi3A}15q)%R!>v4SH$d#fX$j7o9aX| zrAIFmX5h*RsBfpr|0FW0)B#WBFj2l5_+=>BZf2MuW4pLEN>?WfY5lL;rP@0;db zhjbVc*tanpN7b74MA_6yP<&jktql(+E zzT3N~!j|=+(QcM{(7-S~8(vhV-`R{d43>b2m#=`(1?t|aJb4nP=1t4X^@rE-ac%sC zgl|=mSUE94l%8bCaBl3#x0t!|LmTTcwzAJZ!wwhZGLH?s)TuH8xkAQWDfwF*;=zu} zuT_~s`ppm#N5*f)L~yshxz{@bPbi+|3N{SB;;>f#SRQQ7)yy`pT`^VI7rDnm$*1Ii zO)RvDtro0GCkg>u9~xqy@!0uIers$0+XA$}x{TIiR9k_m_W2zVp$dWJR{^B|y0iNf zkMqRM56Lv;^$MT7n(G`J{fi9n8H9(x4=VnS$0{@0&Q7=W|+ z4$tu|UO*9}CVAFjMi?k+{SsiPJ=>)vE1_B`dx{c2pD%DeimZ;$_zj-A$en!fhT^AG+-VN@uMD5gCx*6Cx}ex ze4Z36B~0{>>Tj56c{>oSy9LGyFex>k58>{yig-Po}#xbzQ9KVk{*}%92XeThv=f6N~wv(MC--6>zp9Ko^ zY!GU6PR&x}G#dk*TF-%d>$5Zo(>)zFNJ#ow*a?=*)?G32mtqLK@`h-dQ`5-NGT1>c zXjh~2eSeV+D0VTHJz;9iLxXnC!5>6ra@hn$zM?B{7Nr=3rX?dz}lk8eB^9uYk<5~yU z?9KYZ?fu!_)9%`;V!DflIHFxT!U$>H?%WB6x8|eO0#uB)B+mBVK5gU?jwy2};FA?b zQ$=ubafN+I(#0h~b9h`Hk3%@hPxUEUi-|4XHewdm985v7cXD*&pC#Y2=DJvQHjtSj zZgZCD)zbHS;Gcm{iAS?T$@!(k{R3zw1O{rCm;?&7`#TMlR9N}3_kpV(jp$gIu1Vl+ z49F8zoR+D*p_a1wfEKo~T!n)mOn-YDpyoKAmogAKkig|XLsfU5Mg8-$V<1RsVP_*{ zPUrPrA7LVpYnQw{Hse(BDdF^_gX`)%5NR(hmG4;_eS1qX7!NAfzjCtwP~U1P!wEX$ z)mXoff`TMpysP3RZzug;6Xt8}VquFukqSH$9z7k6m=Iy>d&4Y0$1S3#Ru zNa%z8&xVMh8e1u<_ihG-=P~x@6&5Gqntt+6_C__$spO9XsBY@i+xfSDaz9fGUX_}JWktLTb|1gTujPIJ{>YgpJZ!;4KP&6MM9qGS}}PpPEl!-Sh(D=@FIcSYTk2Tyu8!-xhie&RC} z?b$C?QLBfG1BPQFQ4`FC0P~ev!|Ia{lTwfwvCe zwzm`QT@ga39^-;ISnHaAY=0tP1BCY>s5J1KJ`Qwz$rin%6H1iixl>I(?iyJ52e??o z;n*HIGh*{jwORBaS}}<-L+$x}iK3bkSp|FP#F17~Nt;2^un`nC;xPFZ=%*~^4eM6f zvMRn~I^L>+(9*u}+)SBl5?fW|dBaO@@<;jA6rPc7-&7rC)rS2`c8%}6!Kb}f3|h3s zl=egUY;R$ zq&P9C1tZUig=Hislyki|ODoI{3d%uot_6@S17^hj;)d!T+0Ft{V4#`l2M`Pg7$|W< zrsHPoiUI|$z4r>B!oG+wIU}SxM5;D;|L8hASRn}pDvdS_o(4+dE+ms(C7uQG?rdHI zVR@VOD+ikOUyPdu#L2(7|P26DDQ|0W}vnKDp?SX2&zHC^rjl-khf=t~S- zMC!W?D9RlYi0T$2TtAbI(SKFX2{>@RlELBw9Q_f;$Aq~2mcdn@2BmNW8`ziG>61U= zB9F%(H0l8Tx#GxgmtC6iLSKebUxF;#T^K9)`zKz(SrW=k29b_G<6&)6T2+k&$+Wati3nX6ZanVH9 zC8AJbaOq%QEs}0w2u>-2@^1&29AH=~AY73G%9-Oyqloz+6zP6JTT~BP@NA#n6t|hn zQ-|A3?7-zuBr9)akIw7suO2J?eEH+-*q}MyKfhtpTIP&+ToWByW!j>0tnMxy1|lU; z8H^Q@b`6vD6;#heP$ABM*lT!L#SAMVS@g~bOQdJLb*0Xn@F4rxu>wBsK(oO&WmY6@ z?vL7Vy?6F4VyCSY3_Q|2*N0TO#MoaESmS7Q+pqgcak6 z23ch%g>~uwusu)_dN37SD1?b1fp7oD+H`MVk*A)Xu7%M z`CHkivpiQneFBZECo2mu;?A9hfu7_ff{@NP-Oj3b62N(1%YN{NrkU4&%ao;pHc4|9 z-UDV6HOa%rZ|w93+J$6-0)Ba6Jorr^7+=#^-qw^2JePTzK1;BXJ@Vg=cDKN?3&twR z0>3u>Vb<1BBxP9f2sro1*AD{hp8NUP{q;2G%wUYiMI8?&LZ&~!(`wlN^~gf<uuEed*f_<>d~^F(+vP?O9An<{33F6D$f94GANF0;0g^A z2}M4=X@9CJAF|hczF6QCm_^3w$8u957d>RsY!fy(JL_y>d_W;%`RR0 zg9ksx)qUu{b6_rgbD4F2*_U1>1X(HjxBs84U$F#4{l(3AwQ!}XCG}4N4#@*th%Wpq z@!`aw%4_#h!v&?ihFWzGGtaND70Y}dCU^brYyeKrn9akOGOI%b3Zh43UF~she$(=5 zVCimmDN{>)p^@&of=<+LP+%&Z9?pSwAc}VExOC>I9RLHnk|NxVP*95tfCuf*kOCw` z^zv*v{Hx`rRxY$u{JNhde$zVJP@qCx|49IH!+NO&Hd7mlj@hrbp57ll)sXotr8On9 zp>4pGrU=R1^OiJ@JwMG4xXNc`V3R+G2lZC*bBfvk*9gbQ53)ytkBcyNHy;RvTV+6i zWDM0HvhI9xk8>v;c{UA=Sk9@q%v#G(kzCG``r4Is@hK}gl*vP>HZ`WN^FBoKB4n)n z@oomlAJBQl3Hei-8>XuJHpsTF{1&JMh#q_|A)0IFyLD$4A~+WxJl!hDDB$*VOu}9= zUD(Cq9a>jO)e^5L7TW2-=nkbp(ukX2IMyNE$V>+9y4r!oigv;4hZpLfoC9beAxqZLify9uBP2Oq$_!T}rS&T15&*8gH< zELQADaVppO4Zj#_>AHDI)Zm3}X|3t)gy{lNoK(?|Ew4TFbvK!thX7L2L>LG@yw`HQ z$2XLd;TheN-Rwd$?)j+w8XYi7x4t(2vr14PrngctuWH`Gm3Syl5DhjJHtZ!RpSL+s-2d z<@Tnh;F4usY3Gz81tN$KT3uxCWDXXD&QTkQQgDlyEsBQwL=aq`)3=zwwUmL3mApWA!0bpCv7*@7%p}UWJV$3?Ux}o3~Z| zJkVM4-YKzZ{uAAux009Ul*<2C^6I-}D&+D3h^EA5aB~OTi5?EEw&kR;5?7mBK#Ibw zU(PwcmcmDmJ*lr(Gm|nWFP`|PVK8w$yReD-jFnB3jStN+HCiBW`A7=)mvsI{UI9h0 zx4`h=s)YspTL40{Oc2%Mf9lCeRSY-MuhzBPRCD$odykif*?#_zSlPPXZ@n)bq}G9b zcD)uqK%$Siz`i{=f7)qYx{sU1;CobmM$*HC7vA*)9Bd6HIa7i}8H0!ct1x)igI~Z- zx93lI*Sq|HA&3sfG*hvN_Ef>#-gp+{t7kq=2YTWbP=87AFriph-eGVV; zDkne)K#~yTA~j)rT%h5%ed6K2;i3Mw6a9V)7xHpo>EXOR$3FL_+x8RGO;o<$+rM-A zg|d`hzI0tOV23eqa~tpiIYbHzmdXQ5#J4ZrlK|bhFT2@0$xgNH8F)@cEwCg4#Dm^? zlvtJ?>I!bUNhclx&ZIv!2ygV%OGsmI1lAlJp`peQY(Q8Lp4>%k+sP~ z>Dv|+2lVzo>->KA#TrX8VQr^%{dpy{o8L@2Lub>Q7P?CiaM1x|t!__6qcfPZ1us`) z-kI={_lE9|ZblP|K>5jtNwzaFTm_WoO%X1w=nL|@8_7l#;TWqx6Bowv5+!;Y=W_wY zH!rjG19N8TQZZieynZHtd3x?`!qS>c%S&_Fe04_^tp*8l%sJtcd6Q3tL-uO#sl*kq zpIka7(9`$yU`+opC4wm}%9?)uY&|^$bEw!zn!{KQWb2RCCgq9k|ECZ%n{{iifL?V+ zZD;;DZ#NZdXXxRvt}gSX-z)*S(8h)EN2J;eZ8)&PWS5IuU#1hW*#+=2sQ#O9lnIQH znMzNc%O(3ozL)iWDODLrLjk7z)24&=zA%!|+_$9kxW%=_B$*RbbzRNJ1Rol!1L%B}z^qC!FVB7tESaW+ug>Wv?a@Q5f zEetDR&;vr)(L|ZQn}cMJ^(^7CjLPBYY>x+U6fo(3GnFWPKF6Io-Sa&MHUhcg2IW6& zS-6N>4#J+Q;&KQ4Qv@YjV8~);9xw7>zplm(vi}Ag3b{?uSdUQ;Xe2;1nB(1`R&B9Y zU`hyuecnE&SvsUi5VRd=K^aNnxCaM)IQMBi_t8GcIv(ZEy1&_QzAT`5%8P@jQJ&h# zuTg_BtAJ#rBNv!7KhG0`%Vl`sI|ybFSe`Hhh5;Y$l6__6K$#OMZ0xgJV`GU1QiR)`oYXB$yUbwO)TbLT?3{6N~6LTpx zE%*@#^OM(-OAk##!AHs-l-y3Y$DfsBKbHCj{z?MD#u$(atcGopo08L83#(3|Zw1g2 z;U+vb{{FK0k5jc2v7N-bKJi!8R6S1of~1OEL0nHI$x8lo``EyYgY_4^kG4{Z1>RE)N%`j=b=$T=LI^Fo`$w0XVrxe(VPG>Z z!PYN~QvxqQ#e)#e67l#O;AK-PjQ|anAb$Kr;RX{yazNUpHUBGr)$bk5WdyHy#&G@zZz}cy!gPbud7;)gYR{8VV zj??H9nGd43q9-D(wEy&1t-ZpTv9x8&#(j%u9+qgVpHb^^n&?Jh4OkF^9>ggao}4W* zRUHn}uOej9C1L`Ovm&n5lR`g?HhV*&jXaSg3XJvphe)vcfV6pXMBR|Z zN%Ym|UEd@hC798ri$uT=jRH;HW8q<_Zpr|rT%)c(86D=8JL?Yt)js&)g{q`LE7kf3uus%ds< zO1L6*T4Ib&*{>sf;wKurvn4dus=-x;8V{d;mEZnlDIglmg@lD^)r5mC=*)lL4ArnR zB0cnNi+0G+vOOzi-!6Encj=~kEPB}xf|Qxa13|J!a*qOCuGPB%93D*rxy7?UBe*s! z@OrP&`Kp);v_VnrXIMwhoc8$BgyRbk=-B2r;<;tF3o#cI(Ro)1LCSLMFNO33usNR| z_RvWd9nC)vwEO%Q@_nI`=zH`j$hF2}xRJh&5{;IFXOFD6a*bgPD_&d{?zvBs1|z&j z1eszDYY`H~uT2t1K+Jm_U*b|Yg7tap4e$PF-2I6{85lI^fOiN+5i~FG-=P3-p!;dX z+}GD%(-L2I8lncDlU-CSR{im2A$+vcLWOJ8VlM=l^m*5IYa>p^u{x9RLz7Eck!xi? zc?hc)x)S?Sz6~M$7T@J@kj2~L!PDpZGO3_q5E&f{OEK4+Bk+Qk6yOisUA7lL{saDh8(@T!iWu5J{vXcoWH41-7@cxS^H~2)DiqRx;bzwVLj>U zZlJ!1?T0G51REG`jTE&T@clP1cFoLH6l|v85G}xDy@y5T`xeL2Mst?C|~Hq2qe7%?z1G&y40h%Zf=}v|F0NQcR$0|phqHLxPX#7 zNXC5So$8$^nsRVTVcKf>%GG6#zT`NkGyfTQk_(*Z-buSpU=TiP*IRq;$RK8Tp>0RXSoZR>=0U< z2A~f327v$l23tykDfJN@-aTVUeJU{g9mGlt&&!u@qm7|IeQKo+*q>KyAbJ|Rg$Oik z`**hpgQ16h0?TmpDzeBwb+q}G)yctz)muC+0EosLQcElNXCn`QsI;3PF|#s1$3}eW zE%{4VIMNJE1$>J4%Hpx<{&M}qs`uOhi3vtZT4lii*re2JEqMhWKR?2r73gljA^b2bB)Gg$QtDZgnuiXoCS z9AD=R;$-T+L-MBMRfhr6=;mFpj6TFZ;vE!dbjYDt_#KFvb$ zlKS{>g1jw+>{3*x>j2DYsPtAZaesTy#;Q#)duQoI5Q}07#vL4 z&)5EX-gehLAn?~ z3`tm9(la7C6$UoRF1zmn9f`=mJ7S@n9KO-j)jA<$N^dJv!v(^T3hE>}@%{kbcR)hh zC!_qhZt$L@EgVh;`$Q7{xnwq1D|3{&SxnVFJc)#cERO0WN3Vih&HLVyCiONZCL9-0i5!sR7j%|JYDXN9QG8dtR3`r4zDL zLvI}O-RVKlA)uy0)7(qam2&7+h>Y71mTAMI`X~KojaEQ^+RkAf_AQdD{u$OqMxjE3 zGLIXd+lVToSOYxwTloh_sFZU4BnpZNruEH|`aZ)UMKsRed!mx;8l<@Y@?C?q3Qsg{ zuw@Wh``6{q4TOVJ65aH+tW#3cPga8{lC=}5v0b=R~0l{#tH5eDiIq$^J^>;6ODx!L(omP};%D%@%4!v?JO&(1|ui5P9 ztGUq4skbj*SKNvmhN1PJs5B-fZBi1!lw8X)MijuHZk77+rdg{UIFBA9XhI{CGaLqr zGtbeLIkn?^$(SSZ(dGk^OjQYVoi2qiDHG|;^s$`u*Lkeal3r)BFRZb}Z9TwAWw-Oh z#FDddJGDO0-bhK@W7!ucvYvL2p@;um5rc>@H?KLE-)+7aw?;PI6%MI!&E$ol-{RdX0fd$`_YNii$>T1&?Ul6G1i9(YyLKYfnpzvt=u zH3%c@Oq$IAc8MCRjPK)Fe~Bwb_ua6EVLRnj^pwS`!I@B6dW(@FnW5mP$e6yF3exTz zyNN)a;0U@5GL}T!F{MDSA33AQK@9q3XRjtK><#m~l1NEB<2X+keqGyke?fFXy$#3LkL=@B3oWpLo`wnZdpmtG! zYUd-dYC2iBiwc~;QB^YzqX0AS5Zn83H*H=smEX~9&vW9Ht$B{P{sB?J&_>^hqDo(T zN2tB|2wRUZmu)o@IAndrmrQA0FY;M5$GW)_`n3T?O-HT{cJh&dfXd^tu;}3i0QZb4 zTp!oR|8DkuhUhNh_F_R?b0%VG#+Map4MemqGVxFdK=>EqP-Kw);`;9+2u_@thST<` z#*IS`s;4%~w?REe2x1!ak&{(l2jdyRnC|`Y$Yg%rl%*c-G@yr4qy4;d&z(A~#{ej# zQ`$Y^Q}5iFK=ZVa7Ta}wiYC2Pk@_t5D6GRB5K;lr{I)%qsAS55lVOG-l^>%(lixP- zRSC0m5NR%dZAuN>ShDS+Zv&*Mx@LAm0ymZ{BL*eM$voVSKb)&RC(f1RZW*^OUJ0SvrXGxR@VME1lD}a);1V9mImQID*n?Z0&u3{46HBgr5OSO}!ZPw|F30Hzz0I~HyG@W-mmH+?$uX7wZhsv>zGLN0T zw>V^FXC5QjvqZKR8ukYpk`ThQOJI-~T>s;4)y&liU zI@CerF737nLU6~1yZE~?x+;29rgPm8N^mPh~HKUFmy@!N`E88BirIsDGXpU-+y~_ zthNjP&5`r*#G13U``iKeip82Y;21*sTAH)X=}&cFzH*uqSEmyAZNqZX*U&$JjV+_HIwK+zV*^$0zkvT4gTTSi z9^O1`J?dF(N3~sAW{qU)Ngt1ug8aEl;m%KbgU!bqo-1HtbL~u5#_IAX=^+KM&1%l> zqzb;Z5hnZiVVFAyFaVy;HTisBbHGIh2a`C!(6oRq6=*#l1ieHQmAtjR^ZD8vYtwks zTa64n41EmcnjX)zVYK9uvHaDCZ(b!ly=I1n=*=k3S;nZm2pFz;Tb290_l!p$_-MTK zW_De;_u_*^o^}4O^&P}U0l9I(%R4iwZ>1%5<;m_A_uUXRiw9EibaQYvNPpw{-jUn! zhq(Tuf#qq2JDX~ZKG`P)j^nN+yNRUF!FWiZ`xOWv$h%SGvdRL8V+2;(S}DOaW6>RA zS4tK+N+9G8>^*KP71-Wj6CwRvpzQofXw>lUeWl-1u2tD$oQe^dImBNkW#vp#fWx~~ zFQ-t&TZ1wzH17B5UVoW#-C-PuxLpaU4Vi7)$KINn`sO4y*F9Oy=`idPWS7Vh=Gu`< znJczd>iZ`ZfcH`@S8YmNE2IRbNFkM0U%;UV9Z?7M!vT~_Nf=m%A!q|MN>L`12RwEW z7abfo`yI1Lyo1P5xJd?QDhSK%i|VASh@##uA^l0|F)Y*Z=hoCq-`kV?ki1CQ2U?LSfDn!q zSh(&@3awKJ7T!=r-Vg}^`l0d75d&YAV8$$x(2vk?tEG=Wp6BWhC@wxF_*xjgUyWe4 zM82A9%Q%DPTzG*YPLHj7rRTo1W1BbneB#eG=wo_U=EFQ$l`IszAtqX@_33IDHWMz3 ze>GSDVqCXEdh}Dh8#_3><62_i;BAJo9&AOzEh$TwMdfg1PLH$+E*uKruBB^%t-d{D zeH!6xrBqEOafdP->YrEd9N=`Y;MA3-_%_jXdUa36 z1B-dat#`nTH%^@Hn$(zg$9h;3W!L4<4tqm0x%Ne@N}hMrhqq=Wj*6Y7UXrOHzUJEku#-tFdk0>^x%a?-kkm`&CB3`vc*q(4Tv|@w;gA~hkTF)Urv{%dj z|3~Hgqj^rJ{+qQ;TaUQ-()wrvecrdP_DZ1?==$zOi40~Nd~vuoU2sH(t;|IK+3-t| zTDdh%{Jiu{e((!F6gU61-@_D#ZXzo0Wc$1?%>M-&$%^-x*_|`D^X6G}N=)z*4fvcH z4%<}f(KM3yGtPSa*Zo=JjgC%EFm6~JH-DUs@_~4`2qE=Eg#Ub~;t%cnPm%t2pTPg9 z!!;&}w9A+?;h){_zL3%0Ar_;wYJINmnm(p0glB<8yRUY)2dQ-G7hlaHEH8BFM1x!Y zIj(B^l|)lcRVX=tTLjrfX35!#YbXwB484UNk342ljbFM7-a;#v@tX`4g+ZFcsv`w?vq)Til@}yKa%l5A0 zU>oj$&Vu*g+20?0SGPb9I~UYwI7G^$Og*VWF}#oQa`4$Z71B{>MfFfW01@tqHe`rq zPVcZ8HD1Z|=4~8w47;LO1TkInL-vO0>SsCkKtII;eZ*ac{K)05M*~AVJf(I00haY@ z+yj16$QOPZ#c}y=k&DFoMfZtBSnM;lvg2z7S?sk=e}pC0+J}1qauUz8)g!J>bqC+h(#3W0SYAy1o9_-qOWGJ+8x( zZ5ylT9vZQBy`4W%Uv4(swjlX$Snf(fQ2dhF%qr%W<_b0~{EeFE5TR=wda=f&OvWzc z)KLTfh0+iz$+)5Y?wwkZJ(Yf&T0Czm2zz1q@FtrH6_zZ|vmZr+SLxV^X6rj(Tw*PH zN>}Al_##=FE5sq!;Em3s!avdy3raXu_9xo%Z+0kKZqnz6Wg#PCSGO|Vnw=^C91Fv= zF3g_rvKmRE2xf<$JW~2lAeYHG_jg;VmGLwx;}ONuinx{imnWITT({Ygl!Nos4(4K9 zVtzORwPDn!>DK)$H1)wWZaDQM^aKM~^E+-yE4dpp&Q|}vOckP}`WGZoEGk8OErjAU zcYgWL1+wBR^Fgf#ty|f!^GjRX?^@8ig-8B@S>uI}U$lCRoJ2pqBOe{ML4ELA|rsG_7R^td4o#!Y?Jg|=CmnEw$!8!DWk83ezzTb7Coz6 zwq7(zD>knj4>wN0e9?Kx?~D7zUv`O0NE_qgp&P&HFD{>MAb(dqDx;^zMr7jJV}(Ny zAm@E-1O`8rY>o1#p#63at&1Sy``3e3KqFs>(wvdd;JVS<`(J1c{wjk0e-R#t`_*C1 z4f8|?*VAzf)q!M1YS9p}(q}JurD!2CLrt%2F$ZM=eMnCT%0lt80}pvxpFPdkyI}-W zIcx3dOAcW4pPiuLm+|zOl;;z4=AWGpqV}xQrGIw|a`S^r#JWRR%20tsH^`(I^J)*?kHfei7l@-gYb z7V~K6Dd?b(v26*%)dLT~A^=oJzBK4w62l2oLz3ERq~e|;JZ_fTRX)CIXCcNFAx;^u ztzp|bvC><^d^xr2u z8=l@Y{ilEubOVa^tYo2c#}pYK(!+F+Y`E9#GO8J*3cqWkwWbZ0jP8o{%_9D|H9EZc}n>a8~^E-{Ss~`65^;vkb>0+t|eW? zWR>uG^Pj9yMP5I2>!g_v!33(b^D64Zf{OoTbtNtYxXb`09ZicOtyf#}#}HlENpxWvPctRcVZGp_rbS+oHmqT+1B^Z%M}taDB0Cj*5hoq@M?>_NVCQN%x#P_LjU`lzz-E}Mc|A0w%_itvR_=CIoEtfP^9WpEbC zA9l_p8O5EC1f#qW&a2zCq~G3ewfP^rv6iko>T6o@XwKyOYl8zv(80-qknleJ>))0d)xEVR@`) zWMPMR`pH1<*1K&5`pfSm%IvurmLC)LI=rXrjsbcM8dZABl?+i4&YbLCB&__k!Aj)w zsAr<3N(XWr7P%-BG^9vXA|LEKJ=)0UiQ?xpTt!DDb#aiG-=mec>JwUF_)IY7tunoV za8qI2kuFDyDzrO(j6GJkTjZ6g*H0V{k+d@AzsOe5fTy?H# z*_R-bSXTp+TqoFub3})^X|u+Zi~NS;*IgOp|2xjZ^7KCl6$e+PG;b~ZM7UA7u!By} z2$s}|AGZ99e7P)H|HhXwr+x9|Vc)b*>C7P?6P*kDGu@V)uX1~D`}NjQL_*jUbev)GG5DyZi>K&woZ4$>-ci@mo_G1foP$tw z-%O!9)H<}#s_uubZCvTUlH-(&VPwFg~H6z}u8#veG9*Hf_&T&DB`|n>tm%t@$Yw_N&%MlwxsR+oBxi^u5)@gx|HrF z3zzzfl3YY$yF#%kzz1mU?9cLpm4QJQ2>_m0UJ(y_f5rfQAi%(u`c;Sp0${#veGdT) zCWPl-IWv8Fpae8h!TKqbdtFYOn>m7P+B4J^pDKRgmjry&9{EpCGR8k%4?nVtq%!Zm z&uyE(uZ>0hcT4SGqjBh}Jmp)&#bm0mUUc=BN#=_om8V zXfDXh_IUJVTU|Ubh8JQ-KV*hjwF(JT#%KTq5lz=Op*y4rDxtCJv49Z+&oDcYh+1L%O-`Yje26l6B&~lOI*x z6vJJv|K4JNA&`Q6*I;}o+1Uu6BZh$rcH&ro{0qcwCFxE-90+o=E^TK4=o;X^4E`x^ z=g!FvYJV*8jC@^>C&(1zMRkZ*i&aad z5pi4e3Zn3Zn55KfIA#TA>K@n@MLi<%FYU2dYWRT)=>q7#3j1+lUv~2*yk>Z`rl#v; zDL4u$75I`8gV>Q>V!-`y5`J~`b>DRFVGwhD@Yd~@uf0f+*GSa{*$J1cz9=)9)DG4| zr=R(W2LDKqz*Ho^N)WZ>JsZ#Rg_RTNFZh#SHeiV5O~#6@J7sqmh{!LXcv0?nWzQz+ z{N=t00McRV?CNOq)2|vkPhPTgsk`eFn%Y}M|<(no7%opAP!Exb^y=SMvn+$DLQWP5sgI4+61NSxc zc8_`Wb0?|Eqw?=V z203@x*dyJA)g$CwZGQ5POM8gfBTipsBEUn0Mx!y-5?#*CL~$}f66-7 z!Cdl~u5=3Al7vnB^Kd#o%q+K})dc$<$N*OcO^d-IkE}~5Zc@~s$D>%I+Gm(6RJ=CY z>wB^$c{d91Q0tjFo-x_Z3sc6HgZkCGm-g5}s}KsVITh{YE>QQ{ggShjD$(0h+KipL z1NKQ|T}zeh676Zm_vlEwK*cL1%<7#2mQ#}!)F;_UKM9$*Yp;FCv%p~vYnjkjYy!sk zt>3Mx7IP=Lcp%rfy&mytgyD$B#vD*&AsrThJc4v@IL%34cs#grxh)nCrA=o}n9UtF zto~xTo+c{#i3-)4tF2e?Ct`}R^76fdg0m^9*pg!I&d4UCWuJm2c12P*x!?Iw-8xkX zWez<=20%XSWuq9l8{ak0kD{74`v}kVs*x{BkeO^cBqMRIu^)4b1h3>JlGFe;&*G!4 z*ua1acWND@vJP3Yp0;a432Oa%2zUKglf_@1qB^`C3n^ljg|qj&t2ynW$ z@woke)Q-DSCQuBgX{OgO`)LBC`_(&+D<}Y#X9h4laCh?}gEM(v{~gc?!qR1lg}(mE z*0riF=QQq`;xw1T3_|gsq5M$8^Lg|Blq>CKs0!kz`%XTuisxgIG+$WUFX7z&eWSff zFlG_c3$njU$$-Ws9*Fvj>RbMb?_q7%SmMQ#o0�(vH;zbL4FAAsb&xEP+p#=XX$w zF!`7^n91njo~gQ@hzaO2Su8p8D2L-O%47#GOhefuC@R%TZy3b&f310I4(d)~#&O^z z{CF0;iI*cGbMH+KBTRE>;@Tfzs-8l-GR+@HL(o;pr{lrO9?VPD6p(nGfm2=1;wL;P zjE1$D>>W7p-O*w#bQ&~annNNwRVe{laaHqJ^l7?tBaqnMR5Eu*eTADc1xrTIrIZ~ysR8(5yf^9t5Lxx{*eus4OBSA9F=cxfR*JTK!=4}AIAa~(~7 zx#M11f1nI7+~tfUx7VmpVq&M>wCjS!TK;I-##MYYx}fX4m@Sgnka(PUXr^ zn&nzyw{yzcZI0%QYRi1kgLeh?B z_BIGKx?auc8l+M^p2quDUzktBLCmc>m+lOGE$&Ob;b>(vrCvi_NO-?=Mo=8|7C7haapKfw2

  • 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 z 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 o5<~h#buS=Jm8{ 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 literal 0 HcmV?d00001 diff --git a/platform/node/CMakeLists.txt b/platform/node/CMakeLists.txt index 3774b3678f98..311bfc96a41e 100644 --- a/platform/node/CMakeLists.txt +++ b/platform/node/CMakeLists.txt @@ -1,6 +1,10 @@ set(NODE_MODULE_MINIMUM_ABI 83) # Minimum supported Node.js version: 14 set(NODE_MODULE_CACHE_DIR ${CMAKE_BINARY_DIR}/headers) +if(DEFINED ENV{MSYSTEM}) + message(FATAL "MSYS2 is not supported, Node.js in Windows only has binary compatibility with Microsoft Visual C++.") +endif() + include(${CMAKE_CURRENT_LIST_DIR}/cmake/module.cmake) add_node_module( diff --git a/platform/windows/src/gl_functions.cpp b/platform/windows/src/gl_functions.cpp index 230e53530fed..f98e6ab89598 100644 --- a/platform/windows/src/gl_functions.cpp +++ b/platform/windows/src/gl_functions.cpp @@ -1,5 +1,3 @@ -#pragma once - #include #ifndef GL_GLEXT_PROTOTYPES diff --git a/platform/windows/src/headless_backend_wgl.cpp b/platform/windows/src/headless_backend_wgl.cpp index e2562c19fd07..49db161162dc 100644 --- a/platform/windows/src/headless_backend_wgl.cpp +++ b/platform/windows/src/headless_backend_wgl.cpp @@ -1,5 +1,3 @@ -#pragma once - #include #include diff --git a/platform/windows/src/thread.cpp b/platform/windows/src/thread.cpp index 9c1b597c7010..19e7f28a01cb 100644 --- a/platform/windows/src/thread.cpp +++ b/platform/windows/src/thread.cpp @@ -1,5 +1,3 @@ -#pragma once - #include #include #include @@ -11,6 +9,7 @@ DWORD selfThreadKey; DummyClassThread dummyClassThread; +#ifdef _MSC_VER // https://learn.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code?view=vs-2022 void SetThreadName(DWORD dwThreadID, const char* threadName) { THREADNAME_INFO info; @@ -27,6 +26,7 @@ void SetThreadName(DWORD dwThreadID, const char* threadName) { } #pragma warning(pop) } +#endif THREAD_INFO* GetCurrentThreadInfo() { THREAD_INFO* info = (THREAD_INFO*)TlsGetValue(selfThreadKey); @@ -57,6 +57,7 @@ std::string getCurrentThreadName() { } void setCurrentThreadName(const std::string& name) { +#ifdef _MSC_VER THREAD_INFO* info = GetCurrentThreadInfo(); if (info && info->name) { @@ -66,6 +67,7 @@ void setCurrentThreadName(const std::string& name) { } SetThreadName(-1, name.c_str()); +#endif } void makeThreadLowPriority() { diff --git a/platform/windows/src/thread_local.cpp b/platform/windows/src/thread_local.cpp index 66c9f1efb6db..ae5fa65cc914 100644 --- a/platform/windows/src/thread_local.cpp +++ b/platform/windows/src/thread_local.cpp @@ -1,5 +1,3 @@ -#pragma once - #include #include #include diff --git a/platform/windows/windows.cmake b/platform/windows/windows.cmake index d44ebb73b8b8..24ebae32a7b0 100644 --- a/platform/windows/windows.cmake +++ b/platform/windows/windows.cmake @@ -1,35 +1,55 @@ -if(MLN_WITH_EGL) - set(_RENDERER EGL) -elseif(MLN_WITH_VULKAN) - set(_RENDERER Vulkan) -else() - set(_RENDERER OpenGL) -endif() +if(MSVC) + if(MLN_WITH_EGL) + set(_RENDERER EGL) + elseif(MLN_WITH_VULKAN) + set(_RENDERER Vulkan) + else() + set(_RENDERER OpenGL) + endif() -if(NOT MLN_USE_BUILTIN_ICU) - set(WITH_ICU -With-ICU) -endif() + if(NOT MLN_USE_BUILTIN_ICU) + set(WITH_ICU -With-ICU) + endif() -execute_process(COMMAND powershell -ExecutionPolicy Bypass -File ${CMAKE_CURRENT_LIST_DIR}/Get-VendorPackages.ps1 -Triplet ${VCPKG_TARGET_TRIPLET} -Renderer ${_RENDERER} ${WITH_ICU}) -unset(_RENDERER) + execute_process(COMMAND powershell -ExecutionPolicy Bypass -File ${CMAKE_CURRENT_LIST_DIR}/Get-VendorPackages.ps1 -Triplet ${VCPKG_TARGET_TRIPLET} -Renderer ${_RENDERER} ${WITH_ICU}) + unset(_RENDERER) -add_compile_definitions(NOMINMAX GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE) + add_compile_definitions(NOMINMAX GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE) -target_compile_options( - mbgl-compiler-options - INTERFACE - $<$:/MP> -) + target_compile_options( + mbgl-compiler-options + INTERFACE + /MP + ) + + find_package(CURL REQUIRED) + find_package(dlfcn-win32 REQUIRED) + find_package(ICU OPTIONAL_COMPONENTS i18n uc) + find_package(JPEG REQUIRED) + find_package(libuv REQUIRED) + find_package(PNG REQUIRED) + find_package(WebP REQUIRED) + find_path(DLFCN_INCLUDE_DIRS dlfcn.h) + find_path(LIBUV_INCLUDE_DIRS uv.h) +elseif(DEFINED ENV{MSYSTEM}) + set(MSYS 1) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_EXE_LINKER_FLAGS "-static") -find_package(CURL REQUIRED) -find_package(dlfcn-win32 REQUIRED) -find_package(ICU OPTIONAL_COMPONENTS i18n uc) -find_package(JPEG REQUIRED) -find_package(libuv REQUIRED) -find_package(PNG REQUIRED) -find_package(WebP REQUIRED) -find_path(DLFCN_INCLUDE_DIRS dlfcn.h) -find_path(LIBUV_INCLUDE_DIRS uv.h) + add_compile_definitions(WIN32 GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE) + + find_package(ICU OPTIONAL_COMPONENTS i18n uc data) + find_package(JPEG REQUIRED) + find_package(PNG REQUIRED) + find_package(PkgConfig REQUIRED) + + pkg_search_module(WEBP libwebp REQUIRED) + pkg_search_module(LIBUV libuv REQUIRED) + pkg_search_module(CURL libcurl REQUIRED) +else() + message(FATAL_ERROR "Unsupported build system: " ${CMAKE_SYSTEM_NAME}) +endif() target_sources( mbgl-core @@ -91,7 +111,25 @@ if(MLN_WITH_OPENGL) endif() if(MLN_WITH_EGL) - find_package(unofficial-angle CONFIG REQUIRED) + if(MSVC) + find_package(unofficial-angle CONFIG REQUIRED) + + target_link_libraries( + mbgl-core + PRIVATE + unofficial::angle::libEGL + unofficial::angle::libGLESv2 + ) + elseif(MSYS) + pkg_search_module(EGL angleproject REQUIRED) + + target_link_libraries( + mbgl-core + PRIVATE + ${EGL_LIBRARIES} + ) + endif() + target_sources( mbgl-core PRIVATE @@ -103,13 +141,12 @@ if(MLN_WITH_EGL) PRIVATE KHRONOS_STATIC ) - target_link_libraries( - mbgl-core - PRIVATE - unofficial::angle::libEGL - unofficial::angle::libGLESv2 - ) elseif(MLN_WITH_VULKAN) + target_include_directories( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/vendor/Vulkan-Headers/include + ) target_sources( mbgl-core PRIVATE @@ -184,16 +221,34 @@ if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU PRIVATE ${PROJECT_SOURCE_DIR}/vendor/icu/include ) +elseif(MSYS) + target_compile_definitions( + mbgl-core + PRIVATE + U_STATIC_IMPLEMENTATION + ) +endif() + +if(MSVC) + target_link_libraries( + mbgl-core + PRIVATE + ${CURL_LIBRARIES} + dlfcn-win32::dl + ) +elseif(MSYS) + target_link_libraries( + mbgl-core + PRIVATE + ${CURL_STATIC_LIBRARIES} + ) endif() target_link_libraries( mbgl-core PRIVATE - ${CURL_LIBRARIES} ${JPEG_LIBRARIES} - ${LIBUV_LIBRARIES} ${WEBP_LIBRARIES} - dlfcn-win32::dl $<$>:ICU::i18n> $<$>:ICU::uc> $<$>:ICU::data> @@ -210,6 +265,18 @@ if(MLN_WITH_GLFW) endif() if(MLN_WITH_NODE) add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node) +elseif(MSVC) + target_link_libraries( + mbgl-core + PRIVATE + $,libuv::uv_a,libuv::uv> + ) +elseif(MSYS) + target_link_libraries( + mbgl-core + PRIVATE + ${LIBUV_LIBRARIES} + ) endif() add_executable( @@ -243,9 +310,16 @@ target_link_libraries( PRIVATE mbgl-compiler-options $ - $,libuv::uv_a,libuv::uv> ) +if(MSVC) + target_link_libraries( + mbgl-test-runner + PRIVATE + $,libuv::uv_a,libuv::uv> + ) +endif() + add_executable( mbgl-benchmark-runner ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/benchmark/main.cpp @@ -256,9 +330,16 @@ target_link_libraries( PRIVATE mbgl-compiler-options $ - $,libuv::uv_a,libuv::uv> ) +if(MSVC) + target_link_libraries( + mbgl-benchmark-runner + PRIVATE + $,libuv::uv_a,libuv::uv> + ) +endif() + add_executable( mbgl-render-test-runner ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/render-test/main.cpp @@ -269,14 +350,23 @@ target_link_libraries( PRIVATE mbgl-compiler-options mbgl-render-test - $,libuv::uv_a,libuv::uv> ) -target_link_libraries( - mbgl-expression-test - PRIVATE - $,libuv::uv_a,libuv::uv> -) +if(MSVC) + target_link_libraries( + mbgl-render-test-runner + PRIVATE + $,libuv::uv_a,libuv::uv> + ) +endif() + +if(MSVC) + target_link_libraries( + mbgl-expression-test + PRIVATE + $,libuv::uv_a,libuv::uv> + ) +endif() # Disable benchmarks in CI as they run in VM environment if(NOT DEFINED ENV{CI}) diff --git a/render-test/runner.cpp b/render-test/runner.cpp index ddf00b023c84..9b1bb36b322b 100644 --- a/render-test/runner.cpp +++ b/render-test/runner.cpp @@ -828,8 +828,15 @@ void TestRunner::run(TestMetadata& metadata) { #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif static std::wstring_convert, char16_t> cv; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif #if defined(__clang__) #pragma clang diagnostic pop #endif diff --git a/src/mbgl/util/chrono.cpp b/src/mbgl/util/chrono.cpp index ad42852af316..a4b8e60dfec7 100644 --- a/src/mbgl/util/chrono.cpp +++ b/src/mbgl/util/chrono.cpp @@ -45,7 +45,8 @@ std::string iso8601(Timestamp timestamp) { std::tm info; _gmtime(&time, &info); char buffer[30]; - std::strftime(buffer, sizeof(buffer), "%F %T", &info); + // %F and %T are not supported in MinGW (https://sourceforge.net/p/mingw-w64/bugs/793/) + std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &info); return buffer; } @@ -59,7 +60,8 @@ std::string iso8601(std::chrono::time_point #include -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(WIN32) #define MBGL_FOPEN_MODE_WBE "wbe" #else #define MBGL_FOPEN_MODE_WBE "wb" diff --git a/test/storage/local_file_source.test.cpp b/test/storage/local_file_source.test.cpp index e0e6c211b4b0..bd26efaa01cd 100644 --- a/test/storage/local_file_source.test.cpp +++ b/test/storage/local_file_source.test.cpp @@ -179,8 +179,8 @@ TEST(LocalFileSource, URLLimit) { std::unique_ptr req = fs.request({Resource::Unknown, toAbsoluteURL(url)}, [&](Response res) { req.reset(); ASSERT_NE(nullptr, res.error); -#if defined(_MSC_VER) && !defined(__clang__) - // Microsoft Visual Studio defines PATH_MAX as 260, less than the +#if defined(WIN32) + // MSYS2 and Microsoft Visual Studio defines PATH_MAX as 260, less than the // limit to trigger an error with reason "Other" EXPECT_EQ(Response::Error::Reason::NotFound, res.error->reason); #else diff --git a/test/style/style_parser.test.cpp b/test/style/style_parser.test.cpp index 4acfce448218..c7d7b91bd38f 100644 --- a/test/style/style_parser.test.cpp +++ b/test/style/style_parser.test.cpp @@ -14,8 +14,8 @@ #include #include -#if defined(WIN32) && !defined(__clang__) -#include +#if defined(WIN32) +#include #ifdef GetObject #undef GetObject #endif @@ -100,7 +100,7 @@ static void populateNames(std::vector& names) { } }; -#if defined(WIN32) && !defined(__clang__) +#if defined(WIN32) style_directory += "/*"; WIN32_FIND_DATAA ffd; HANDLE hFind = FindFirstFileA(style_directory.c_str(), &ffd); diff --git a/vendor/benchmark.cmake b/vendor/benchmark.cmake index 427254d65d21..b54ceda5b63e 100644 --- a/vendor/benchmark.cmake +++ b/vendor/benchmark.cmake @@ -38,7 +38,8 @@ if(WIN32) target_link_libraries( mbgl-vendor-benchmark - PRIVATE shlwapi + PRIVATE + $,shlwapi,-lShlwapi> ) endif() From 67c156f114b6edbc5a576d2fb4887f40675b3415 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Sun, 20 Jul 2025 18:53:04 -0300 Subject: [PATCH 278/339] Update Windows documentation to point to the MDBook guide (#3635) --- docs/mdbook/src/platforms/windows/README.md | 6 +- platform/windows/README.md | 173 +------------------- 2 files changed, 5 insertions(+), 174 deletions(-) diff --git a/docs/mdbook/src/platforms/windows/README.md b/docs/mdbook/src/platforms/windows/README.md index f9df15033913..3e56326b06f4 100644 --- a/docs/mdbook/src/platforms/windows/README.md +++ b/docs/mdbook/src/platforms/windows/README.md @@ -1,7 +1,9 @@ # Windows -This is a port to add Windows support on other targets (Node, GLFW, etc). +This guide explains how to build MapLibre Native in Windows. -The files produced by building mbgl-core target can be reused as libraries in other projects. +The files produced by building `mbgl-core` target can be reused as libraries in other projects. + +Some targets are executables (test runners and GLFW) and Node targets are shared libraries to be used in NodeJS applications. Building with [Microsoft Visual Studio](./build-msvc.md) and [MSYS2](./build-msys2.md) are supported. diff --git a/platform/windows/README.md b/platform/windows/README.md index f299ad0141e1..6e759e34a971 100644 --- a/platform/windows/README.md +++ b/platform/windows/README.md @@ -1,174 +1,3 @@ # Windows -This is a port to add Windows support on other targets (Node, GLFW, etc). - -The files produced by building mbgl-core target can be reused as libraries in other projects. - -## Prerequisites - -The Windows port, for while, relies on `Microsoft Visual Studio` to build MapLibre Native, either using `Ninja` or `Microsoft Visual Studio`. The build was tested with `Microsoft Visual Studio 2022 Community Edition`. Other 2022 editions might work as well. Earlier versions are not guaranteed to work, but `Microsoft Visual Studio 2019` might work. - -To install the required Visual Studio components, open Visual Studio Installer and check `Desktop Development with C++` option. Make sure `C++ CMake tools for Windows` is selected in the right pane. If `git` is not already installed, select `Git for Windows` option in `Individual Components`. When Visual Studio finishes the install process, everything is ready to start. - -## Downloading sources - -Open `x64 Native Tools Command Prompt for VS 2022` and then clone the repository: - -```cmd -git clone --config core.longpaths=true --recurse-submodules -j8 https://github.com/maplibre/maplibre-native.git -cd maplibre-native -``` - -> [!NOTE] -> The `core.longpaths=true` config is necessary, because without it a lot of `Filename too long` messages will come. If you have this configuration set globally (`git config --system core.longpaths=true`), you can omit the `--config core.longpaths=true` portion of the clone command. - -## Configuring - -Configure the build with the following command: - -```cmd -cmake . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -``` - -It will take some time to build and install all components on which Maplibre depends. - -## Alternative configure commands - -To configure build with EGL support (ANGLE libraries will be build), use the following command: - -```cmd -cmake . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DMLN_WITH_EGL=ON -``` - -## Building - -Finally, build the project with the following command: - -```cmd -cmake --build build -``` - -## Building with Microsoft Visual Studio - -Just omit the `-G Ninja` option from the configure command: - -```cmd -cmake . -B build -``` - -The same can be done with alternative configure commands: - -```cmd -cmake . -B build -DMLN_WITH_EGL=ON -``` - -Once configure is done, open the file `build\Mapbox GL Native.sln`. Build the target `ALL_BUILD` to build all targets, or pick a specific target. Don't forget to pick a build configuration (`Release`, `RelWithDebInfo`, `MinSizeRel` or `Debug`), otherwise the project will be built with default configuration (`Debug`). - -## Testing - -If all went well and target `mbgl-render` or `ALL_BUILD` was chosen, there should now be a `maplibre-native\build\bin\mbgl-render.exe` binary that you can run to generate map tile images. To test that it is working properly, run the following command. - -```cmd -.\build\bin\mbgl-render.exe --style https://raw.githubusercontent.com/maplibre/demotiles/gh-pages/style.json --output out.png -``` - -This should produce an `out.png` map tile image with the default MapLibre styling from [the MapLibre demo](https://maplibre.org/). - -![Sample image of world from mbgl-render command](/misc/sample-maplibre-style-mbgl-render-out.png) - -### Using your own style/tiles - -You can also use the `mbgl-render` command to render images from your own style or tile set. To do so, you will need a data source and a style JSON file. - -For the purposes of this exercise, you can use the `zurich_switzerland.mbtiles` from [here](https://github.com/acalcutt/tileserver-gl/releases/download/test_data/zurich_switzerland.mbtiles), and the following `style.json` file. - -```json -{ - "version": 8, - "name": "Test style", - "center": [ - 8.54806714892635, - 47.37180823552663 - ], - "sources": { - "test": { - "type": "vector", - "url": "mbtiles:///path/to/zurich_switzerland.mbtiles" - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "hsl(47, 26%, 88%)" - } - }, - { - "id": "water", - "type": "fill", - "source": "test", - "source-layer": "water", - "filter": [ - "==", - "$type", - "Polygon" - ], - "paint": { - "fill-color": "hsl(205, 56%, 73%)" - } - }, - { - "id": "admin_country", - "type": "line", - "source": "test", - "source-layer": "boundary", - "filter": [ - "all", - [ - "<=", - "admin_level", - 2 - ], - [ - "==", - "$type", - "LineString" - ] - ], - "layout": { - "line-cap": "round", - "line-join": "round" - }, - "paint": { - "line-color": "hsla(0, 8%, 22%, 0.51)", - "line-width": { - "base": 1.3, - "stops": [ - [ - 3, - 0.5 - ], - [ - 22, - 15 - ] - ] - } - } - } - ] -} -``` - -Note that this style is totally inadequate for any real use beyond testing your custom setup. Don't forget to replace the source URL `"mbtiles:///path/to/zurich_switzerland.mbtiles"` with the actual path to your mbtiles file. - -From your `maplibre-native/` dir, run the following command. - -```cmd -.\build\bin\mbgl-render --style path\to\style.json --output out.png -``` - -This should produce an `out.png` image in your current directory with a barebones image of the world. - -![Sample image of world from mbgl-render command](/misc/sample-barebones-mbgl-render-out.png) +Refer to the guide in the [MapLibre Native Developer Documentation](https://maplibre.org/maplibre-native/docs/book/platforms/windows/index.html) to get started with developing MapLibre Native on Windows. From 5230853062d7352d66d2c6815f1ebb80bb123a1f Mon Sep 17 00:00:00 2001 From: mwilsnd <53413200+mwilsnd@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:41:54 -0400 Subject: [PATCH 279/339] Add combined static linux targets (#3624) --- .github/scripts/install-linux-deps | 1 + .github/workflows/core-release.yml | 8 ++++++-- BUILD.bazel | 3 +++ CMakePresets.json | 4 ++-- platform/default/BUILD.bazel | 1 + platform/linux/BUILD.bazel | 22 ++++++++++++++++++++-- platform/linux/linux.cmake | 25 ++++++++++++++++++++----- vendor/BUILD.bazel | 9 +++++++++ vendor/sqlite.cmake | 2 +- 9 files changed, 63 insertions(+), 12 deletions(-) diff --git a/.github/scripts/install-linux-deps b/.github/scripts/install-linux-deps index 298c5c9249a7..6e58059114d8 100755 --- a/.github/scripts/install-linux-deps +++ b/.github/scripts/install-linux-deps @@ -10,3 +10,4 @@ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ libwebp-dev \ libopengl0 \ mesa-vulkan-drivers +cargo install armerge@2.2.0 diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index b5c60e265017..63f36f826363 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -82,10 +82,14 @@ jobs: cmake --build --preset linux-${{ matrix.renderer }}-core - name: Rename artifact - run: cp build-linux-${{ matrix.renderer }}/libmbgl-core.a libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + run: | + cp build-linux-${{ matrix.renderer }}/libmbgl-core.a libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + cp build-linux-${{ matrix.renderer }}/libmbgl-core-amalgam.a libmaplibre-native-core-amalgam-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a - name: Upload Linux artifact - run: gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + run: | + gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + gh release upload core-${{ github.sha }} libmaplibre-native-core-amalgam-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a env: GH_TOKEN: ${{ github.token }} diff --git a/BUILD.bazel b/BUILD.bazel index ab6d783cf37e..135f3789f0d1 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -138,6 +138,9 @@ cc_library( "@platforms//os:osx": [ "//vendor:icu", ], + "@platforms//os:linux": [ + "//vendor:sqlite", + ], "//conditions:default": [], }) + select({ ":metal_renderer": [ diff --git a/CMakePresets.json b/CMakePresets.json index 768fcdf0101d..13d9c70edbed 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -109,7 +109,7 @@ "inherits": "linux-opengl", "cacheVariables": { "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "ON" + "MLN_USE_BUILTIN_ICU": "OFF" } }, { @@ -127,7 +127,7 @@ "inherits": "linux-vulkan", "cacheVariables": { "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "ON" + "MLN_USE_BUILTIN_ICU": "OFF" } }, { diff --git a/platform/default/BUILD.bazel b/platform/default/BUILD.bazel index 6a5c82d8d674..e22c12db9526 100644 --- a/platform/default/BUILD.bazel +++ b/platform/default/BUILD.bazel @@ -145,6 +145,7 @@ cc_library( ], "@platforms//os:linux": [ "default-collator", + "//vendor:sqlite", ], "@platforms//os:osx": [ ":default-collator", diff --git a/platform/linux/BUILD.bazel b/platform/linux/BUILD.bazel index d34b503cb55b..0205f7f69759 100644 --- a/platform/linux/BUILD.bazel +++ b/platform/linux/BUILD.bazel @@ -16,9 +16,7 @@ cc_library( copts = CPP_FLAGS + MAPLIBRE_FLAGS, linkopts = [ "-lGL", - "-lglfw", "-lX11", - "-lsqlite3", "-luv", "-lz", "-lcurl", @@ -33,6 +31,26 @@ cc_library( ], ) +cc_static_library( + name = "maplibre-linux-static", + visibility = ["//visibility:public"], + deps = [ + ":impl", + ], +) + +genrule( + name = "maplibre-linux-amalgam", + srcs = [":maplibre-linux-static"], + outs = ["libmaplibre-linux-amalgam.a"], + cmd_bash = """( + armerge --keep-symbols "^.+" --output $(OUTS) $(BINDIR)/platform/linux/libmaplibre-linux-static.a \ + $$(pkg-config --variable=libdir icu-uc)/libicuuc.a \ + $$(pkg-config --variable=libdir icu-uc)/libicudata.a \ + $$(pkg-config --variable=libdir icu-i18n)/libicui18n.a + )""" +) + sh_binary( name = "startxwrapper", srcs = ["xorg/startxwrapper"], diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 0c54b5d3362c..49eaae01b460 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -2,8 +2,6 @@ option(MLN_WITH_X11 "Build with X11 Support" ON) option(MLN_WITH_WAYLAND "Build with Wayland Support" OFF) find_package(CURL REQUIRED) -find_package(ICU OPTIONAL_COMPONENTS i18n) -find_package(ICU OPTIONAL_COMPONENTS uc) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) find_package(PkgConfig REQUIRED) @@ -14,6 +12,9 @@ find_package(Threads REQUIRED) pkg_search_module(WEBP libwebp REQUIRED) pkg_search_module(LIBUV libuv REQUIRED) +pkg_search_module(ICUUC icu-uc) +pkg_search_module(ICUI18N icu-i18n) +find_program(ARMERGE NAMES armerge) if(MLN_WITH_WAYLAND) # See https://github.com/maplibre/maplibre-native/pull/2022 @@ -142,7 +143,7 @@ target_include_directories( include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) -if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) +if(NOT ${ICUUC_FOUND} OR "${ICUUC_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requestd, using builtin.") set(MLN_USE_BUILTIN_ICU TRUE) @@ -165,14 +166,28 @@ target_link_libraries( ${X11_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${WEBP_LIBRARIES} - $<$>:ICU::i18n> - $<$>:ICU::uc> + $<$>:${ICUUC_LIBRARIES}> + $<$>:${ICUI18N_LIBRARIES}> $<$:$,$,mbgl-vendor-icu>> PNG::PNG mbgl-vendor-nunicode mbgl-vendor-sqlite ) +# Bundle system provided libraries +if(MLN_CORE_INCLUDE_DEPS AND NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") + message(STATUS "Found armerge: ${ARMERGE}") + add_custom_command( + TARGET mbgl-core + POST_BUILD + COMMAND armerge --keep-symbols '.*' --output libmbgl-core-amalgam.a + $ + ${ICUUC_LIBRARY_DIRS}/libicuuc.a + ${ICUUC_LIBRARY_DIRS}/libicudata.a + ${ICUI18N_LIBRARY_DIRS}/libicui18n.a + ) +endif() + add_subdirectory(${PROJECT_SOURCE_DIR}/bin) add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) if(MLN_WITH_GLFW) diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 73e83019f5c7..9c79f2c1c63b 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -235,3 +235,12 @@ cc_library( strip_include_prefix = "unordered_dense/include/ankerl", visibility = ["//visibility:public"], ) + +cc_library( + name = "sqlite", + srcs = ["sqlite/src/sqlite3.c"], + hdrs = ["sqlite/include/sqlite3.h"], + include_prefix = "", + strip_include_prefix = "sqlite/include", + visibility = ["//visibility:public"], +) diff --git a/vendor/sqlite.cmake b/vendor/sqlite.cmake index f0efcf2a4816..be3083c90382 100644 --- a/vendor/sqlite.cmake +++ b/vendor/sqlite.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-sqlite) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-sqlite OBJECT) else() add_library(mbgl-vendor-sqlite STATIC) From 12e0922fc4cadcd88808830e697cfb1d5206c8c9 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 21 Jul 2025 17:46:15 +0200 Subject: [PATCH 280/339] Make sure llvm-objcopy is installed for core-release (#3638) --- .github/scripts/install-linux-deps | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/install-linux-deps b/.github/scripts/install-linux-deps index 6e58059114d8..08b6af638f40 100755 --- a/.github/scripts/install-linux-deps +++ b/.github/scripts/install-linux-deps @@ -9,5 +9,6 @@ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ libglfw3-dev \ libwebp-dev \ libopengl0 \ - mesa-vulkan-drivers + mesa-vulkan-drivers \ + llvm cargo install armerge@2.2.0 From 14af2146ac15b5a4c7fbc5955ebf33ee63d639d0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 22 Jul 2025 18:13:35 +0200 Subject: [PATCH 281/339] fix syntax --execution-configuration aws-device-farm-run.sh (#3639) --- scripts/aws-device-farm/aws-device-farm-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws-device-farm/aws-device-farm-run.sh b/scripts/aws-device-farm/aws-device-farm-run.sh index d4220ce9b786..ed33cc9c9dc9 100755 --- a/scripts/aws-device-farm/aws-device-farm-run.sh +++ b/scripts/aws-device-farm/aws-device-farm-run.sh @@ -85,7 +85,7 @@ arn="$(aws devicefarm schedule-run \ --app-arn "$app_arn" \ --device-pool-arn "$AWS_DEVICE_FARM_DEVICE_POOL_ARN" \ --test type=$testType,testPackageArn=$test_package_arn${testFilter:+,filter=$testFilter}${testSpecArn:+,testSpecArn=$testSpecArn} \ - --execution-configuration videoCapture=false \ + --execution-configuration '{"videoCapture": false}' \ --output text --query run.arn)" echo ARN: $arn >&2 From b7f129cc00b408ecba7fcdd2f357d8bddc0f7532 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Wed, 23 Jul 2025 09:32:13 -0300 Subject: [PATCH 282/339] Fix Windows core-relase action (#3646) --- .github/workflows/core-release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index 63f36f826363..b89ea9667496 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -106,6 +106,9 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + + - uses: ilammy/msvc-dev-cmd@v1 + - name: Build mbgl-core for Windows run: | cmake --preset windows-${{ matrix.renderer }}-core -DCMAKE_CXX_COMPILER_LAUNCHER="" From a015b6bf120a259973eec75a11b37fddfc91d779 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 23 Jul 2025 18:46:00 +0300 Subject: [PATCH 283/339] Run `MapLibreAndroidTestApp` activities as instrumentation tests (#3594) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../mbgl/shaders/vulkan/shader_program.hpp | 4 +- include/mbgl/vulkan/context.hpp | 5 +- include/mbgl/vulkan/renderable_resource.hpp | 6 +- include/mbgl/vulkan/renderer_backend.hpp | 7 +- .../cpp/android_vulkan_renderer_backend.cpp | 3 +- .../activity/SequentialActivityTest.kt | 96 +++++++++++++++ .../activity/render/RenderTestActivity.kt | 6 +- .../activity/style/GridSourceActivity.kt | 3 +- platform/glfw/glfw_vulkan_backend.cpp | 9 +- src/mbgl/shaders/vulkan/shader_program.cpp | 24 ++-- src/mbgl/vulkan/buffer_resource.cpp | 5 + src/mbgl/vulkan/context.cpp | 87 +++++++------ src/mbgl/vulkan/descriptor_set.cpp | 31 +++-- src/mbgl/vulkan/drawable.cpp | 18 ++- src/mbgl/vulkan/offscreen_texture.cpp | 6 +- src/mbgl/vulkan/pipeline.cpp | 16 +-- src/mbgl/vulkan/render_pass.cpp | 8 +- src/mbgl/vulkan/renderable_resource.cpp | 77 ++++++------ src/mbgl/vulkan/renderer_backend.cpp | 115 +++++++++--------- src/mbgl/vulkan/texture2d.cpp | 69 ++++++++--- 20 files changed, 395 insertions(+), 200 deletions(-) create mode 100644 platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt diff --git a/include/mbgl/shaders/vulkan/shader_program.hpp b/include/mbgl/shaders/vulkan/shader_program.hpp index e4afb9f30838..e07d52ce82e1 100644 --- a/include/mbgl/shaders/vulkan/shader_program.hpp +++ b/include/mbgl/shaders/vulkan/shader_program.hpp @@ -45,6 +45,7 @@ struct TextureInfo { namespace vulkan { class RenderableResource; class RendererBackend; +class Context; class ShaderProgram; using UniqueShaderProgram = std::unique_ptr; @@ -78,10 +79,11 @@ class ShaderProgram final : public gfx::ShaderProgramBase { protected: std::string shaderName; RendererBackend& backend; + Context& context; vk::UniqueShaderModule vertexShader; vk::UniqueShaderModule fragmentShader; - std::unordered_map pipelines; + std::shared_ptr> pipelines; VertexAttributeArray vertexAttributes; VertexAttributeArray instanceAttributes; diff --git a/include/mbgl/vulkan/context.hpp b/include/mbgl/vulkan/context.hpp index 8a3d060919c4..bc230f877c9c 100644 --- a/include/mbgl/vulkan/context.hpp +++ b/include/mbgl/vulkan/context.hpp @@ -151,15 +151,12 @@ class Context final : public gfx::Context { private: struct FrameResources { vk::UniqueCommandBuffer commandBuffer; - - vk::UniqueSemaphore acquireSurfaceSemaphore; vk::UniqueFence flightFrameFence; std::vector> deletionQueue; - FrameResources(vk::UniqueCommandBuffer& cb, vk::UniqueSemaphore&& surf, vk::UniqueFence&& flight) + FrameResources(vk::UniqueCommandBuffer& cb, vk::UniqueFence&& flight) : commandBuffer(std::move(cb)), - acquireSurfaceSemaphore(std::move(surf)), flightFrameFence(std::move(flight)) {} void runDeletionQueue(Context&); diff --git a/include/mbgl/vulkan/renderable_resource.hpp b/include/mbgl/vulkan/renderable_resource.hpp index 35a2337c0ad7..b9411ff648cf 100644 --- a/include/mbgl/vulkan/renderable_resource.hpp +++ b/include/mbgl/vulkan/renderable_resource.hpp @@ -58,7 +58,8 @@ class SurfaceRenderableResource : public RenderableResource { uint32_t getAcquiredImageIndex() const { return acquiredImageIndex; }; void setAcquiredImageIndex(uint32_t index) { acquiredImageIndex = index; }; const vk::Image getAcquiredImage() const; - const vk::Semaphore& getAcquiredSemaphore() const; + const vk::Semaphore& getAcquireSemaphore() const; + const vk::Semaphore& getPresentSemaphore() const; bool hasSurfaceTransformSupport() const; bool didSurfaceTransformUpdate() const; @@ -87,7 +88,8 @@ class SurfaceRenderableResource : public RenderableResource { std::vector swapchainImages; std::vector swapchainImageViews; std::vector swapchainFramebuffers; - std::vector swapchainSemaphores; + std::vector acquireSemaphores; + std::vector presentSemaphores; vk::Format colorFormat{vk::Format::eUndefined}; UniqueImageAllocation depthAllocation; diff --git a/include/mbgl/vulkan/renderer_backend.hpp b/include/mbgl/vulkan/renderer_backend.hpp index ab6aca0ced1b..b3283088d1d7 100644 --- a/include/mbgl/vulkan/renderer_backend.hpp +++ b/include/mbgl/vulkan/renderer_backend.hpp @@ -4,6 +4,7 @@ #include #define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 +#define VULKAN_HPP_NO_DEFAULT_DISPATCHER #ifdef _WIN32 #define VK_USE_PLATFORM_WIN32_KHR @@ -39,6 +40,7 @@ class RendererBackend : public gfx::RendererBackend { void initShaders(gfx::ShaderRegistry&, const ProgramParameters& programParameters) override; void init(); + const vk::DispatchLoaderDynamic& getDispatcher() const { return dispatcher; } const vk::UniqueInstance& getInstance() const { return instance; } const vk::PhysicalDevice& getPhysicalDevice() const { return physicalDevice; } const vk::UniqueDevice& getDevice() const { return device; } @@ -60,7 +62,8 @@ class RendererBackend : public gfx::RendererBackend { device->setDebugUtilsObjectNameEXT(vk::DebugUtilsObjectNameInfoEXT() .setObjectType(object.objectType) .setObjectHandle(handle) - .setPObjectName(name.c_str())); + .setPObjectName(name.c_str()), + dispatcher); #endif } @@ -94,6 +97,8 @@ class RendererBackend : public gfx::RendererBackend { protected: vk::DynamicLoader dynamicLoader; + vk::DispatchLoaderDynamic dispatcher; + vk::UniqueInstance instance; vk::UniqueDebugUtilsMessengerEXT debugUtilsCallback; vk::UniqueDebugReportCallbackEXT debugReportCallback; diff --git a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp index 043bc5c4f912..3101843baa5e 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_vulkan_renderer_backend.cpp @@ -24,7 +24,8 @@ class AndroidVulkanRenderableResource final : public mbgl::vulkan::SurfaceRender void createPlatformSurface() override { auto& backendImpl = static_cast(backend); const vk::AndroidSurfaceCreateInfoKHR createInfo({}, backendImpl.getWindow()); - surface = backendImpl.getInstance()->createAndroidSurfaceKHRUnique(createInfo); + surface = backendImpl.getInstance()->createAndroidSurfaceKHRUnique( + createInfo, nullptr, backendImpl.getDispatcher()); const int apiLevel = android_get_device_api_level(); if (apiLevel < __ANDROID_API_Q__) { diff --git a/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt new file mode 100644 index 000000000000..6e1b4d6f965f --- /dev/null +++ b/platform/android/MapLibreAndroidTestApp/src/androidTest/java/org/maplibre/android/testapp/activity/SequentialActivityTest.kt @@ -0,0 +1,96 @@ +package org.maplibre.android.testapp.activity + +import android.app.Activity +import android.content.pm.PackageManager +import androidx.test.core.app.ActivityScenario +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized + +@RunWith(Parameterized::class) +class SequentialActivityTest(private val activity: Class) { + + companion object { + // app currently has 100+ activities + private const val USE_ALL_ACTIVITIES = true + private const val ACTIVITY_DURATION = 5000L + + // ignores for both activity lists + private val ignoredActivities = listOf( + FeatureOverviewActivity::class.java, + org.maplibre.android.testapp.activity.benchmark.BenchmarkActivity::class.java, + org.maplibre.android.testapp.activity.telemetry.PerformanceMeasurementActivity::class.java, + + // need style updates + org.maplibre.android.testapp.activity.turf.MapSnapshotterWithinExpression::class.java, + org.maplibre.android.testapp.activity.turf.WithinExpressionActivity::class.java, + org.maplibre.android.testapp.activity.style.HeatmapLayerActivity::class.java, + ) + + // activity list used when USE_ALL_ACTIVITIES is disabled + private val activityList = listOf( + org.maplibre.android.testapp.activity.annotation.BulkMarkerActivity::class.java, + org.maplibre.android.testapp.activity.camera.CameraAnimatorActivity::class.java, + org.maplibre.android.testapp.activity.customlayer.CustomLayerActivity::class.java, + org.maplibre.android.testapp.activity.events.ObserverActivity::class.java, + org.maplibre.android.testapp.activity.feature.QuerySourceFeaturesActivity::class.java, + org.maplibre.android.testapp.activity.fragment.MapFragmentActivity::class.java, + org.maplibre.android.testapp.activity.imagegenerator.SnapshotActivity::class.java, + org.maplibre.android.testapp.activity.infowindow.InfoWindowActivity::class.java, + org.maplibre.android.testapp.activity.location.LocationComponentActivationActivity::class.java, + org.maplibre.android.testapp.activity.maplayout.DebugModeActivity::class.java, + org.maplibre.android.testapp.activity.offline.OfflineActivity::class.java, + org.maplibre.android.testapp.activity.options.MapOptionsXmlActivity::class.java, + org.maplibre.android.testapp.activity.render.RenderTestActivity::class.java, + org.maplibre.android.testapp.activity.snapshot.MapSnapshotterActivity::class.java, + org.maplibre.android.testapp.activity.sources.VectorTileActivity::class.java, + org.maplibre.android.testapp.activity.storage.UrlTransformActivity::class.java, + org.maplibre.android.testapp.activity.style.AnimatedImageSourceActivity::class.java, + org.maplibre.android.testapp.activity.turf.WithinExpressionActivity::class.java, + ) + + private fun getAllActivities() : List { + val context = InstrumentationRegistry.getInstrumentation().targetContext + + val packageInfo = context.packageManager.getPackageInfo( + context.packageName, + PackageManager.GET_ACTIVITIES + ) + + val activities = packageInfo.activities + .filter { info -> + info.name.startsWith("org.maplibre.android.testapp.activity") + } + .mapNotNull { info -> + try { + Class.forName(info.name) + } catch (_: ClassNotFoundException) { } + } + + return activities + } + + @JvmStatic + @Parameterized.Parameters(name = "{index}: Activity {0}") + fun activities() : List { + return if (USE_ALL_ACTIVITIES) { + getAllActivities().filter { it !in ignoredActivities } + } else { + activityList.filter { it !in ignoredActivities } + } + } + } + + @Test + fun launchActivity() { + val instrumentation = InstrumentationRegistry.getInstrumentation() + + val scenario = ActivityScenario.launch(activity) + instrumentation.waitForIdleSync() + + Thread.sleep(ACTIVITY_DURATION) + + scenario.close() + } +} diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/render/RenderTestActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/render/RenderTestActivity.kt index 959dd48a3807..23e3088f2c79 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/render/RenderTestActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/render/RenderTestActivity.kt @@ -32,7 +32,7 @@ class RenderTestActivity : AppCompatActivity() { private val renderResultMap: MutableMap = HashMap() private var renderTestDefinitions: List? = null private var onRenderTestCompletionListener: OnRenderTestCompletionListener? = null - private lateinit var mapSnapshotter: MapSnapshotter + private var mapSnapshotter: MapSnapshotter? = null private var imageView: ImageView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -46,7 +46,7 @@ class RenderTestActivity : AppCompatActivity() { override fun onStop() { super.onStop() - mapSnapshotter.cancel() + mapSnapshotter?.cancel() } // @@ -119,7 +119,7 @@ class RenderTestActivity : AppCompatActivity() { private fun render(renderTestDefinition: RenderTestDefinition, testSize: Int) { Timber.d("Render test %s,%s", renderTestDefinition.name, renderTestDefinition.category) mapSnapshotter = RenderTestSnapshotter(this, renderTestDefinition.toOptions()) - mapSnapshotter.start( + mapSnapshotter?.start( object : MapSnapshotter.SnapshotReadyCallback { override fun onSnapshotReady(snapshot: MapSnapshot) { imageView!!.setImageBitmap(snapshot.bitmap) diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GridSourceActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GridSourceActivity.kt index 39cb401ed15f..715366a81c99 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GridSourceActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/style/GridSourceActivity.kt @@ -16,6 +16,7 @@ import org.maplibre.android.style.layers.* import org.maplibre.android.style.sources.CustomGeometrySource import org.maplibre.android.style.sources.GeometryTileProvider import org.maplibre.android.testapp.R +import org.maplibre.android.testapp.styles.TestStyles import java.util.* import kotlin.math.ceil import kotlin.math.floor @@ -102,7 +103,7 @@ class GridSourceActivity : AppCompatActivity(), OnMapReadyCallback { ) map.setStyle( Style.Builder() - .fromUri(Style.getPredefinedStyles()[0].url) + .fromUri(TestStyles.DEMOTILES) .withLayer(layer!!) .withSource(source!!) ) diff --git a/platform/glfw/glfw_vulkan_backend.cpp b/platform/glfw/glfw_vulkan_backend.cpp index 482ca467b030..25e736c4c756 100644 --- a/platform/glfw/glfw_vulkan_backend.cpp +++ b/platform/glfw/glfw_vulkan_backend.cpp @@ -20,16 +20,17 @@ class GLFWVulkanRenderableResource final : public mbgl::vulkan::SurfaceRenderabl std::vector getDeviceExtensions() override { return {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; } void createPlatformSurface() override { - auto& glfwBackend = static_cast(backend); + auto& backendImpl = static_cast(backend); VkSurfaceKHR surface_; VkResult result = glfwCreateWindowSurface( - glfwBackend.getInstance().get(), glfwBackend.getWindow(), nullptr, &surface_); + backendImpl.getInstance().get(), backendImpl.getWindow(), nullptr, &surface_); if (result != VK_SUCCESS) throw std::runtime_error("Failed to create glfw window surface"); - surface = vk::UniqueSurfaceKHR( - surface_, vk::ObjectDestroy(glfwBackend.getInstance().get())); + surface = vk::UniqueSurfaceKHR(surface_, + vk::ObjectDestroy( + backendImpl.getInstance().get(), nullptr, backendImpl.getDispatcher())); } void bind() override {} diff --git a/src/mbgl/shaders/vulkan/shader_program.cpp b/src/mbgl/shaders/vulkan/shader_program.cpp index b4d000bbab5e..15207646fea7 100644 --- a/src/mbgl/shaders/vulkan/shader_program.cpp +++ b/src/mbgl/shaders/vulkan/shader_program.cpp @@ -35,7 +35,10 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, gfx::ContextObserver& observer) : ShaderProgramBase(), shaderName(name), - backend(backend_) { + backend(backend_), + context(static_cast(backend.getContext())) { + pipelines = std::make_shared>(); + std::string defineStr = programParameters.getDefinesString() + "\n\n"; for (const auto& define : additionalDefines) { defineStr += "#define " + define.first + " " + define.second + "\n"; @@ -102,11 +105,12 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, if (vertexSpirv.empty() || fragmentSpirv.empty()) return; const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); vertexShader = device->createShaderModuleUnique( - vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), vertexSpirv)); + vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), vertexSpirv), nullptr, dispatcher); fragmentShader = device->createShaderModuleUnique( - vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), fragmentSpirv)); + vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), fragmentSpirv), nullptr, dispatcher); backend.setDebugName(vertexShader.get(), shaderName + ".vert"); backend.setDebugName(fragmentShader.get(), shaderName + ".frag"); @@ -114,10 +118,16 @@ ShaderProgram::ShaderProgram(shaders::BuiltIn shaderID, observer.onPostCompileShader(shaderID, gfx::Backend::Type::Metal, defineStr); } -ShaderProgram::~ShaderProgram() noexcept = default; +ShaderProgram::~ShaderProgram() noexcept { + if (pipelines->empty()) { + return; + } + + context.enqueueDeletion([pipelines = std::move(pipelines)](auto&) mutable { pipelines.reset(); }); +} const vk::UniquePipeline& ShaderProgram::getPipeline(const PipelineInfo& pipelineInfo) { - auto& pipeline = pipelines[pipelineInfo.hash()]; + auto& pipeline = pipelines->operator[](pipelineInfo.hash()); if (pipeline) return pipeline; const auto vertexInputState = vk::PipelineVertexInputStateCreateInfo() @@ -194,7 +204,7 @@ const vk::UniquePipeline& ShaderProgram::getPipeline(const PipelineInfo& pipelin const vk::PipelineDynamicStateCreateInfo dynamicState({}, dynamicValues); const auto& device = backend.getDevice(); - auto& context = static_cast(backend.getContext()); + const auto& dispatcher = backend.getDispatcher(); const auto& pipelineLayout = pipelineInfo.usePushConstants ? context.getPushConstantPipelineLayout() : context.getGeneralPipelineLayout(); @@ -222,7 +232,7 @@ const vk::UniquePipeline& ShaderProgram::getPipeline(const PipelineInfo& pipelin .setLayout(pipelineLayout.get()) .setRenderPass(pipelineInfo.renderPass); - pipeline = std::move(device->createGraphicsPipelineUnique(nullptr, pipelineCreateInfo).value); + pipeline = std::move(device->createGraphicsPipelineUnique(nullptr, pipelineCreateInfo, nullptr, dispatcher).value); backend.setDebugName(pipeline.get(), shaderName + "_pipeline"); return pipeline; diff --git a/src/mbgl/vulkan/buffer_resource.cpp b/src/mbgl/vulkan/buffer_resource.cpp index 4e3c3266591a..2f6c1a282100 100644 --- a/src/mbgl/vulkan/buffer_resource.cpp +++ b/src/mbgl/vulkan/buffer_resource.cpp @@ -171,6 +171,11 @@ void BufferResource::update(const void* newData, std::size_t updateSize, std::si } uint8_t* data = static_cast(bufferAllocation->mappedBuffer) + getVulkanBufferOffset() + offset; + + if (memcmp(data, newData, updateSize) == 0) { + return; + } + std::memcpy(data, newData, updateSize); auto& stats = context.renderingStats(); diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 5084262761c8..df44808f87bf 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -77,6 +77,7 @@ Context::~Context() noexcept { void Context::initFrameResources() { const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); const auto frameCount = backend.getMaxFrames(); descriptorPoolMap.emplace(DescriptorSetType::Global, @@ -99,19 +100,18 @@ void Context::initFrameResources() { const vk::CommandBufferAllocateInfo allocateInfo( backend.getCommandPool().get(), vk::CommandBufferLevel::ePrimary, frameCount); - auto commandBuffers = backend.getDevice()->allocateCommandBuffersUnique(allocateInfo); + auto commandBuffers = device->allocateCommandBuffersUnique(allocateInfo, dispatcher); frameResources.reserve(frameCount); for (uint32_t index = 0; index < frameCount; ++index) { - frameResources.emplace_back(commandBuffers[index], - device->createSemaphoreUnique({}), - device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled))); + frameResources.emplace_back( + commandBuffers[index], + device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled), nullptr, dispatcher)); const auto& frame = frameResources.back(); backend.setDebugName(frame.commandBuffer.get(), "FrameCommandBuffer_" + std::to_string(index)); - backend.setDebugName(frame.acquireSurfaceSemaphore.get(), "AcquireSurfaceSemaphore_" + std::to_string(index)); backend.setDebugName(frame.flightFrameFence.get(), "FrameFence_" + std::to_string(index)); } @@ -134,7 +134,7 @@ void Context::initFrameResources() { } void Context::destroyResources() { - backend.getDevice()->waitIdle(); + backend.getDevice()->waitIdle(backend.getDispatcher()); for (auto& frame : frameResources) { frame.runDeletionQueue(*this); @@ -172,22 +172,23 @@ void Context::submitOneTimeCommand(const std::functionallocateCommandBuffersUnique(allocateInfo); + const auto& dispatcher = backend.getDispatcher(); + const auto& commandBuffers = device->allocateCommandBuffersUnique(allocateInfo, dispatcher); auto& commandBuffer = commandBuffers.front(); backend.setDebugName(commandBuffer.get(), "OneTimeSubmitCommandBuffer"); - commandBuffer->begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); + commandBuffer->begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit), dispatcher); function(commandBuffer); - commandBuffer->end(); + commandBuffer->end(dispatcher); const auto submitInfo = vk::SubmitInfo().setCommandBuffers(commandBuffer.get()); - const auto& fence = device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlags())); - backend.getGraphicsQueue().submit(submitInfo, fence.get()); + const auto& fence = device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlags()), nullptr, dispatcher); + backend.getGraphicsQueue().submit(submitInfo, fence.get(), dispatcher); constexpr uint64_t timeout = std::numeric_limits::max(); - const vk::Result waitFenceResult = device->waitForFences(1, &fence.get(), VK_TRUE, timeout); + const vk::Result waitFenceResult = device->waitForFences(1, &fence.get(), VK_TRUE, timeout, dispatcher); if (waitFenceResult != vk::Result::eSuccess) { mbgl::Log::Error(mbgl::Event::Render, "OneTimeCommand - Wait fence failed"); } @@ -209,18 +210,24 @@ void Context::requestSurfaceUpdate(bool useDelay) { void Context::waitFrame() const { MLN_TRACE_FUNC(); const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); auto& frame = frameResources[frameResourceIndex]; constexpr uint64_t timeout = std::numeric_limits::max(); - const vk::Result waitFenceResult = device->waitForFences(1, &frame.flightFrameFence.get(), VK_TRUE, timeout); + const vk::Result waitFenceResult = device->waitForFences( + 1, &frame.flightFrameFence.get(), VK_TRUE, timeout, dispatcher); if (waitFenceResult != vk::Result::eSuccess) { mbgl::Log::Error(mbgl::Event::Render, "Wait fence failed"); } } + void Context::beginFrame() { MLN_TRACE_FUNC(); + frameResourceIndex = (frameResourceIndex + 1) % frameResources.size(); + const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); auto& renderableResource = backend.getDefaultRenderable().getResource(); const auto& platformSurface = renderableResource.getPlatformSurface(); @@ -273,7 +280,11 @@ void Context::beginFrame() { MLN_TRACE_ZONE(acquireNextImageKHR); try { const vk::ResultValue acquireImageResult = device->acquireNextImageKHR( - renderableResource.getSwapchain().get(), timeout, frame.acquireSurfaceSemaphore.get(), nullptr); + renderableResource.getSwapchain().get(), + timeout, + renderableResource.getAcquireSemaphore(), + nullptr, + dispatcher); if (acquireImageResult.result == vk::Result::eSuccess) { renderableResource.setAcquiredImageIndex(acquireImageResult.value); @@ -292,20 +303,19 @@ void Context::beginFrame() { renderableResource.setAcquiredImageIndex(frameResourceIndex); } - frame.commandBuffer->reset(vk::CommandBufferResetFlagBits::eReleaseResources); - frame.commandBuffer->begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); + frame.commandBuffer->reset(vk::CommandBufferResetFlagBits::eReleaseResources, dispatcher); + frame.commandBuffer->begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit), dispatcher); backend.getThreadPool().runRenderJobs(); } -void Context::endFrame() { - frameResourceIndex = (frameResourceIndex + 1) % frameResources.size(); -} +void Context::endFrame() {} void Context::submitFrame() { MLN_TRACE_FUNC(); + const auto& dispatcher = backend.getDispatcher(); const auto& frame = frameResources[frameResourceIndex]; - frame.commandBuffer->end(); + frame.commandBuffer->end(dispatcher); const auto& device = backend.getDevice(); const auto& graphicsQueue = backend.getGraphicsQueue(); @@ -317,29 +327,29 @@ void Context::submitFrame() { auto submitInfo = vk::SubmitInfo().setCommandBuffers(frame.commandBuffer.get()); if (platformSurface) { - submitInfo.setSignalSemaphores(renderableResource.getAcquiredSemaphore()) - .setWaitSemaphores(frame.acquireSurfaceSemaphore.get()) + submitInfo.setSignalSemaphores(renderableResource.getPresentSemaphore()) + .setWaitSemaphores(renderableResource.getAcquireSemaphore()) .setWaitDstStageMask(waitStageMask); } - const vk::Result resetFenceResult = device->resetFences(1, &frame.flightFrameFence.get()); + const vk::Result resetFenceResult = device->resetFences(1, &frame.flightFrameFence.get(), dispatcher); if (resetFenceResult != vk::Result::eSuccess) { mbgl::Log::Error(mbgl::Event::Render, "Reset fence failed"); } - graphicsQueue.submit(submitInfo, frame.flightFrameFence.get()); + graphicsQueue.submit(submitInfo, frame.flightFrameFence.get(), dispatcher); // present rendered frame if (platformSurface) { const auto acquiredImage = renderableResource.getAcquiredImageIndex(); const auto presentInfo = vk::PresentInfoKHR() .setSwapchains(renderableResource.getSwapchain().get()) - .setWaitSemaphores(renderableResource.getAcquiredSemaphore()) + .setWaitSemaphores(renderableResource.getPresentSemaphore()) .setImageIndices(acquiredImage); try { const auto& presentQueue = backend.getPresentQueue(); - const vk::Result presentResult = presentQueue.presentKHR(presentInfo); + const vk::Result presentResult = presentQueue.presentKHR(presentInfo, dispatcher); if (presentResult == vk::Result::eSuboptimalKHR) { requestSurfaceUpdate(); } @@ -538,6 +548,7 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, .setFormat(PipelineInfo::vulkanFormat(ShaderClass::attributes[0].dataType))); } + const auto& dispatcher = backend.getDispatcher(); auto& shaderImpl = static_cast(*clipping.shader); auto& renderPassImpl = static_cast(renderPass); auto& commandBuffer = renderPassImpl.getEncoder().getCommandBuffer(); @@ -546,21 +557,21 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, const auto& pipeline = shaderImpl.getPipeline(clipping.pipelineInfo); - commandBuffer->bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.get()); + commandBuffer->bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.get(), dispatcher); clipping.pipelineInfo.setDynamicValues(backend, commandBuffer); const std::array vertexBuffers = {clipping.vertexBuffer->getVulkanBuffer()}; const std::array offset = {0}; - commandBuffer->bindVertexBuffers(0, vertexBuffers, offset); - commandBuffer->bindIndexBuffer(clipping.indexBuffer->getVulkanBuffer(), 0, vk::IndexType::eUint16); + commandBuffer->bindVertexBuffers(0, vertexBuffers, offset, dispatcher); + commandBuffer->bindIndexBuffer(clipping.indexBuffer->getVulkanBuffer(), 0, vk::IndexType::eUint16, dispatcher); auto& renderableResource = renderPassImpl.getDescriptor().renderable.getResource(); const float rad = renderableResource.getRotation(); const mat4 rotationMat = {cos(rad), -sin(rad), 0, 0, sin(rad), cos(rad), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; for (const auto& tileInfo : tileUBOs) { - commandBuffer->setStencilReference(vk::StencilFaceFlagBits::eFrontAndBack, tileInfo.stencil_ref); + commandBuffer->setStencilReference(vk::StencilFaceFlagBits::eFrontAndBack, tileInfo.stencil_ref, dispatcher); mat4 matrix; matrix::multiply(matrix, rotationMat, tileInfo.matrix); @@ -571,8 +582,9 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, vk::ShaderStageFlags() | vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0, sizeof(matrixf), - &matrixf); - commandBuffer->drawIndexed(clipping.indexCount, 1, 0, 0, 0); + &matrixf, + dispatcher); + commandBuffer->drawIndexed(clipping.indexCount, 1, 0, 0, 0, dispatcher); } stats.numDrawCalls++; @@ -633,7 +645,8 @@ void Context::buildUniformDescriptorSetLayout(vk::UniqueDescriptorSetLayout& lay } const auto descriptorSetLayoutCreateInfo = vk::DescriptorSetLayoutCreateInfo().setBindings(bindings); - layout = backend.getDevice()->createDescriptorSetLayoutUnique(descriptorSetLayoutCreateInfo); + layout = backend.getDevice()->createDescriptorSetLayoutUnique( + descriptorSetLayoutCreateInfo, nullptr, backend.getDispatcher()); backend.setDebugName(layout.get(), name); } @@ -650,7 +663,7 @@ void Context::buildImageDescriptorSetLayout() { const auto descriptorSetLayoutCreateInfo = vk::DescriptorSetLayoutCreateInfo().setBindings(bindings); drawableImageDescriptorSetLayout = backend.getDevice()->createDescriptorSetLayoutUnique( - descriptorSetLayoutCreateInfo); + descriptorSetLayoutCreateInfo, nullptr, backend.getDispatcher()); backend.setDebugName(drawableImageDescriptorSetLayout.get(), "ImageDescriptorSetLayout"); } @@ -694,7 +707,9 @@ const vk::UniquePipelineLayout& Context::getGeneralPipelineLayout() { }; generalPipelineLayout = backend.getDevice()->createPipelineLayoutUnique( - vk::PipelineLayoutCreateInfo().setPushConstantRanges(pushConstant).setSetLayouts(layouts)); + vk::PipelineLayoutCreateInfo().setPushConstantRanges(pushConstant).setSetLayouts(layouts), + nullptr, + backend.getDispatcher()); backend.setDebugName(generalPipelineLayout.get(), "PipelineLayout_general"); @@ -708,7 +723,7 @@ const vk::UniquePipelineLayout& Context::getPushConstantPipelineLayout() { const auto pushConstant = vk::PushConstantRange().setSize(sizeof(matf4)).setStageFlags(stages); pushConstantPipelineLayout = backend.getDevice()->createPipelineLayoutUnique( - vk::PipelineLayoutCreateInfo().setPushConstantRanges(pushConstant)); + vk::PipelineLayoutCreateInfo().setPushConstantRanges(pushConstant), nullptr, backend.getDispatcher()); backend.setDebugName(pushConstantPipelineLayout.get(), "PipelineLayout_pushConstants"); diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index ae30ba05ee03..1cfcbe727116 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -33,7 +33,8 @@ DescriptorSet::~DescriptorSet() { } void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { - const auto& device = context.getBackend().getDevice(); + const auto& backend = context.getBackend(); + const auto& device = backend.getDevice(); const uint32_t maxSets = static_cast(growablePool.maxSets * std::pow(growablePool.growFactor, growablePool.pools.size())); @@ -60,7 +61,8 @@ void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(poolFlags).setPoolSizes(sizes).setMaxSets(maxSets); - growablePool.pools.emplace_back(device->createDescriptorPoolUnique(descriptorPoolInfo), maxSets); + growablePool.pools.emplace_back( + device->createDescriptorPoolUnique(descriptorPoolInfo, nullptr, backend.getDispatcher()), maxSets); growablePool.currentPoolIndex = static_cast(growablePool.pools.size() - 1); }; @@ -71,10 +73,11 @@ void DescriptorSet::allocate() { return; } - const auto& device = context.getBackend().getDevice(); + const auto& backend = context.getBackend(); + const auto& device = backend.getDevice(); const auto& descriptorSetLayout = context.getDescriptorSetLayout(type); auto& growablePool = context.getDescriptorPool(type); - const std::vector layouts(context.getBackend().getMaxFrames(), descriptorSetLayout); + const std::vector layouts(backend.getMaxFrames(), descriptorSetLayout); if (growablePool.currentPoolIndex == -1 || (growablePool.current().unusedSets.empty() && growablePool.current().remainingSets < layouts.size())) { @@ -112,9 +115,9 @@ void DescriptorSet::allocate() { } else #endif { - descriptorSets = device->allocateDescriptorSets(vk::DescriptorSetAllocateInfo() - .setDescriptorPool(growablePool.current().pool.get()) - .setSetLayouts(layouts)); + descriptorSets = device->allocateDescriptorSets( + vk::DescriptorSetAllocateInfo().setDescriptorPool(growablePool.current().pool.get()).setSetLayouts(layouts), + backend.getDispatcher()); growablePool.current().remainingSets -= descriptorSets.size(); } @@ -127,6 +130,7 @@ void DescriptorSet::markDirty() { void DescriptorSet::bind(CommandEncoder& encoder) { MLN_TRACE_FUNC(); + const auto& backend = encoder.getContext().getBackend(); auto& commandBuffer = encoder.getCommandBuffer(); const uint8_t index = context.getCurrentFrameResourceIndex(); @@ -135,7 +139,8 @@ void DescriptorSet::bind(CommandEncoder& encoder) { context.getGeneralPipelineLayout().get(), static_cast(type), descriptorSets[index], - nullptr); + nullptr, + backend.getDispatcher()); } UniformDescriptorSet::UniformDescriptorSet(Context& context_, DescriptorSetType type_) @@ -154,7 +159,8 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, return; } - const auto& device = context.getBackend().getDevice(); + const auto& backend = context.getBackend(); + const auto& device = backend.getDevice(); for (size_t index = 0; index < descriptorStorageCount + descriptorUniformCount; ++index) { vk::DescriptorBufferInfo descriptorBufferInfo; @@ -180,7 +186,7 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, .setDstBinding(static_cast(index)) .setDstSet(descriptorSets[frameIndex]); - device->updateDescriptorSets(writeDescriptorSet, nullptr); + device->updateDescriptorSets(writeDescriptorSet, nullptr, backend.getDispatcher()); } dirty[frameIndex] = false; @@ -205,7 +211,8 @@ void ImageDescriptorSet::update(const std::array(id)) .setDstSet(descriptorSets[frameIndex]); - device->updateDescriptorSets(writeDescriptorSet, nullptr); + device->updateDescriptorSets(writeDescriptorSet, nullptr, backend.getDispatcher()); } dirty[frameIndex] = false; diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index 2fedddc32bfd..a063b1a34005 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -244,6 +244,7 @@ void Drawable::draw(PaintParameters& parameters) const { } auto& context = static_cast(parameters.context); + auto& dispatcher = context.getBackend().getDispatcher(); auto& renderPass_ = static_cast(*parameters.renderPass); auto& encoder = renderPass_.getEncoder(); auto& commandBuffer = encoder.getCommandBuffer(); @@ -258,7 +259,8 @@ void Drawable::draw(PaintParameters& parameters) const { vk::ShaderStageFlags() | vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0, sizeof(uboIndex), - &uboIndex); + &uboIndex, + dispatcher); if (enableDepth) { if (impl->depthFor3D.has_value()) { @@ -299,19 +301,21 @@ void Drawable::draw(PaintParameters& parameters) const { impl->pipelineInfo.setDynamicValues(context.getBackend(), commandBuffer); const auto& pipeline = shaderImpl.getPipeline(impl->pipelineInfo); - commandBuffer->bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.get()); + commandBuffer->bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.get(), dispatcher); if (segment.indexLength) { commandBuffer->drawIndexed(static_cast(segment.indexLength), static_cast(instances), static_cast(segment.indexOffset), static_cast(segment.vertexOffset), - 0); + 0, + dispatcher); } else { commandBuffer->draw(static_cast(segment.vertexLength), static_cast(instances), static_cast(segment.vertexOffset), - 0); + 0, + dispatcher); } context.renderingStats().numDrawCalls++; @@ -411,14 +415,16 @@ bool Drawable::bindAttributes(CommandEncoder& encoder) const noexcept { if (impl->vulkanVertexBuffers.empty()) return false; + const auto& dispatcher = encoder.getContext().getBackend().getDispatcher(); const auto& commandBuffer = encoder.getCommandBuffer(); - commandBuffer->bindVertexBuffers(0, impl->vulkanVertexBuffers, impl->vulkanVertexOffsets); + commandBuffer->bindVertexBuffers(0, impl->vulkanVertexBuffers, impl->vulkanVertexOffsets, dispatcher); if (impl->indexes) { if (const auto* indexBuffer = static_cast(impl->indexes->getBuffer())) { const auto& indexBufferResource = indexBuffer->buffer->getResource().get(); - commandBuffer->bindIndexBuffer(indexBufferResource.getVulkanBuffer(), 0, vk::IndexType::eUint16); + commandBuffer->bindIndexBuffer( + indexBufferResource.getVulkanBuffer(), 0, vk::IndexType::eUint16, dispatcher); } } diff --git a/src/mbgl/vulkan/offscreen_texture.cpp b/src/mbgl/vulkan/offscreen_texture.cpp index 0e8797af37d2..24462d0c993c 100644 --- a/src/mbgl/vulkan/offscreen_texture.cpp +++ b/src/mbgl/vulkan/offscreen_texture.cpp @@ -101,7 +101,8 @@ class OffscreenTextureResource final : public RenderableResource { .setSubpasses(subpass) .setDependencies(subpassDependency); - renderPass = backend.getDevice()->createRenderPassUnique(renderPassCreateInfo); + renderPass = backend.getDevice()->createRenderPassUnique( + renderPassCreateInfo, nullptr, backend.getDispatcher()); const auto framebufferCreateInfo = vk::FramebufferCreateInfo() .setRenderPass(renderPass.get()) @@ -111,7 +112,8 @@ class OffscreenTextureResource final : public RenderableResource { .setHeight(extent.height) .setLayers(1); - framebuffer = backend.getDevice()->createFramebufferUnique(framebufferCreateInfo); + framebuffer = backend.getDevice()->createFramebufferUnique( + framebufferCreateInfo, nullptr, backend.getDispatcher()); } private: diff --git a/src/mbgl/vulkan/pipeline.cpp b/src/mbgl/vulkan/pipeline.cpp index db1d2645a354..400a871faf56 100644 --- a/src/mbgl/vulkan/pipeline.cpp +++ b/src/mbgl/vulkan/pipeline.cpp @@ -408,26 +408,28 @@ std::size_t PipelineInfo::hash() const { } void PipelineInfo::setDynamicValues(const RendererBackend& backend, const vk::UniqueCommandBuffer& buffer) const { + const auto& dispatcher = backend.getDispatcher(); if (dynamicValues.blendConstants.has_value()) { - buffer->setBlendConstants(dynamicValues.blendConstants.value().data()); + buffer->setBlendConstants(dynamicValues.blendConstants.value().data(), dispatcher); } if (stencilTest) { - buffer->setStencilWriteMask(vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilWriteMask); - buffer->setStencilCompareMask(vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilCompareMask); - buffer->setStencilReference(vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilRef); + buffer->setStencilWriteMask(vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilWriteMask, dispatcher); + buffer->setStencilCompareMask( + vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilCompareMask, dispatcher); + buffer->setStencilReference(vk::StencilFaceFlagBits::eFrontAndBack, dynamicValues.stencilRef, dispatcher); } if (backend.getDeviceFeatures().wideLines && wideLines) { - buffer->setLineWidth(dynamicValues.lineWidth); + buffer->setLineWidth(dynamicValues.lineWidth, dispatcher); } #if USE_DYNAMIC_VIEWPORT const vk::Viewport viewport(0.0f, 0.0f, viewExtent.width, viewExtent.height, 0.0f, 1.0f); const vk::Rect2D scissorRect({}, {viewExtent.width, viewExtent.height}); - buffer->setViewport(0, viewport); - buffer->setScissor(0, scissorRect); + buffer->setViewport(0, viewport, dispatcher); + buffer->setScissor(0, scissorRect, dispatcher); #endif } diff --git a/src/mbgl/vulkan/render_pass.cpp b/src/mbgl/vulkan/render_pass.cpp index f82588465fd9..7b1aa9f27355 100644 --- a/src/mbgl/vulkan/render_pass.cpp +++ b/src/mbgl/vulkan/render_pass.cpp @@ -30,7 +30,8 @@ RenderPass::RenderPass(CommandEncoder& commandEncoder_, const char* name, const pushDebugGroup(name); - commandEncoder.getCommandBuffer()->beginRenderPass(renderPassBeginInfo, vk::SubpassContents::eInline); + commandEncoder.getCommandBuffer()->beginRenderPass( + renderPassBeginInfo, vk::SubpassContents::eInline, commandEncoder.getContext().getBackend().getDispatcher()); commandEncoder.context.performCleanup(); } @@ -42,7 +43,7 @@ RenderPass::~RenderPass() { } void RenderPass::endEncoding() { - commandEncoder.getCommandBuffer()->endRenderPass(); + commandEncoder.getCommandBuffer()->endRenderPass(commandEncoder.getContext().getBackend().getDispatcher()); } void RenderPass::clearStencil(uint32_t value) const { @@ -56,7 +57,8 @@ void RenderPass::clearStencil(uint32_t value) const { const auto rect = vk::ClearRect().setBaseArrayLayer(0).setLayerCount(1).setRect( {{0, 0}, {extent.width, extent.height}}); - commandEncoder.getCommandBuffer()->clearAttachments(attach, rect); + commandEncoder.getCommandBuffer()->clearAttachments( + attach, rect, commandEncoder.getContext().getBackend().getDispatcher()); } void RenderPass::pushDebugGroup(const char* name) { diff --git a/src/mbgl/vulkan/renderable_resource.cpp b/src/mbgl/vulkan/renderable_resource.cpp index f9bc99120286..025771e6fadf 100644 --- a/src/mbgl/vulkan/renderable_resource.cpp +++ b/src/mbgl/vulkan/renderable_resource.cpp @@ -6,18 +6,9 @@ namespace mbgl { namespace vulkan { -static bool hasMemoryType(const vk::PhysicalDevice& physicalDevice, const vk::MemoryPropertyFlagBits& type) { - const auto& memoryProps = physicalDevice.getMemoryProperties(); - for (uint32_t i = 0; i < memoryProps.memoryTypeCount; ++i) { - if (memoryProps.memoryTypes[i].propertyFlags & type) { - return true; - } - } - - return false; -} - SurfaceRenderableResource::~SurfaceRenderableResource() { + backend.getDevice()->waitIdle(backend.getDispatcher()); + // specific order swapchainFramebuffers.clear(); renderPass.reset(); @@ -74,8 +65,9 @@ void SurfaceRenderableResource::initColor(uint32_t w, uint32_t h) { void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { const auto& physicalDevice = backend.getPhysicalDevice(); const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); - const std::vector& formats = physicalDevice.getSurfaceFormatsKHR(surface.get()); + const std::vector& formats = physicalDevice.getSurfaceFormatsKHR(surface.get(), dispatcher); const auto& formatIt = std::find_if(formats.begin(), formats.end(), [](const vk::SurfaceFormatKHR& format) { return (format.format == vk::Format::eB8G8R8A8Unorm || format.format == vk::Format::eR8G8B8A8Unorm) && format.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear; @@ -85,7 +77,8 @@ void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { // only vk::PresentModeKHR::eFifo (vsync on) is guaranteed if (presentMode != vk::PresentModeKHR::eFifo) { - const std::vector& presentModes = physicalDevice.getSurfacePresentModesKHR(surface.get()); + const auto& presentModes = physicalDevice.getSurfacePresentModesKHR(surface.get(), dispatcher); + if (std::find(presentModes.begin(), presentModes.end(), presentMode) == presentModes.end()) { mbgl::Log::Error( mbgl::Event::Render, @@ -96,7 +89,7 @@ void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { } // pick surface size - capabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.get()); + capabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.get(), dispatcher); if (capabilities.currentExtent.width != std::numeric_limits::max()) { extent = capabilities.currentExtent; @@ -154,22 +147,28 @@ void SurfaceRenderableResource::initSwapchain(uint32_t w, uint32_t h) { // update this when recreating swapchainCreateInfo.setOldSwapchain(swapchain.get()); - swapchain = device->createSwapchainKHRUnique(swapchainCreateInfo); - swapchainImages = device->getSwapchainImagesKHR(swapchain.get()); + swapchain = device->createSwapchainKHRUnique(swapchainCreateInfo, nullptr, dispatcher); + swapchainImages = device->getSwapchainImagesKHR(swapchain.get(), dispatcher); colorFormat = swapchainCreateInfo.imageFormat; extent = swapchainCreateInfo.imageExtent; - swapchainSemaphores.reserve(swapchainImages.size()); + acquireSemaphores.reserve(swapchainImages.size()); + presentSemaphores.reserve(swapchainImages.size()); for (uint32_t index = 0; index < swapchainImages.size(); ++index) { - swapchainSemaphores.emplace_back(device->createSemaphoreUnique({})); - backend.setDebugName(swapchainSemaphores.back().get(), "SurfaceSemaphore_" + std::to_string(index)); + acquireSemaphores.emplace_back(device->createSemaphoreUnique({}, nullptr, dispatcher)); + presentSemaphores.emplace_back(device->createSemaphoreUnique({}, nullptr, dispatcher)); + + const auto indexStr = std::to_string(index); + backend.setDebugName(acquireSemaphores.back().get(), "PresentSemaphore_" + indexStr); + backend.setDebugName(presentSemaphores.back().get(), "AcquireSemaphore_" + indexStr); } } void SurfaceRenderableResource::initDepthStencil() { const auto& physicalDevice = backend.getPhysicalDevice(); const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); // check for depth format support const std::vector formats = { @@ -179,7 +178,7 @@ void SurfaceRenderableResource::initDepthStencil() { }; const auto& formatIt = std::find_if(formats.begin(), formats.end(), [&](const auto& format) { - const auto& formatProps = physicalDevice.getFormatProperties(format); + const auto& formatProps = physicalDevice.getFormatProperties(format, dispatcher); return formatProps.optimalTilingFeatures & vk::FormatFeatureFlagBits::eDepthStencilAttachment; }); @@ -190,10 +189,6 @@ void SurfaceRenderableResource::initDepthStencil() { depthFormat = *formatIt; - const bool hasLazyMemory = hasMemoryType(physicalDevice, vk::MemoryPropertyFlagBits::eLazilyAllocated); - const auto memoryUsage = hasLazyMemory ? VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED - : VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - const auto imageUsage = vk::ImageUsageFlags() | vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment; @@ -210,9 +205,16 @@ void SurfaceRenderableResource::initDepthStencil() { .setInitialLayout(vk::ImageLayout::eUndefined); VmaAllocationCreateInfo allocCreateInfo = {}; - allocCreateInfo.usage = memoryUsage; + allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED; allocCreateInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT; + uint32_t lazyMemoryIndex = 0; + uint32_t memoryTypeBits = std::numeric_limits::max(); + if (vmaFindMemoryTypeIndex(backend.getAllocator(), memoryTypeBits, &allocCreateInfo, &lazyMemoryIndex) != + VK_SUCCESS) { + allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + } + depthAllocation = std::make_unique(backend.getAllocator()); if (!depthAllocation->create(allocCreateInfo, imageCreateInfo)) { mbgl::Log::Error(mbgl::Event::Render, "Vulkan depth texture allocation failed"); @@ -228,7 +230,7 @@ void SurfaceRenderableResource::initDepthStencil() { .setSubresourceRange(vk::ImageSubresourceRange( vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, 0, 1, 0, 1)); - depthAllocation->imageView = device->createImageViewUnique(imageViewCreateInfo); + depthAllocation->imageView = device->createImageViewUnique(imageViewCreateInfo, nullptr, dispatcher); backend.setDebugName(depthAllocation->image, "SwapchainDepthImage"); backend.setDebugName(depthAllocation->imageView.get(), "SwapchainDepthImageView"); @@ -247,8 +249,13 @@ const vk::Image SurfaceRenderableResource::getAcquiredImage() const { return colorAllocations[acquiredImageIndex]->image; } -const vk::Semaphore& SurfaceRenderableResource::getAcquiredSemaphore() const { - return swapchainSemaphores[acquiredImageIndex].get(); +const vk::Semaphore& SurfaceRenderableResource::getAcquireSemaphore() const { + const auto& context = static_cast(backend.getContext()); + return acquireSemaphores[context.getCurrentFrameResourceIndex()].get(); +} + +const vk::Semaphore& SurfaceRenderableResource::getPresentSemaphore() const { + return presentSemaphores[acquiredImageIndex].get(); } bool SurfaceRenderableResource::hasSurfaceTransformSupport() const { @@ -261,7 +268,7 @@ bool SurfaceRenderableResource::hasSurfaceTransformSupport() const { bool SurfaceRenderableResource::didSurfaceTransformUpdate() const { const auto& physicalDevice = backend.getPhysicalDevice(); - const auto& updatedCapabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.get()); + const auto& updatedCapabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.get(), backend.getDispatcher()); return capabilities.currentTransform != updatedCapabilities.currentTransform; } @@ -294,6 +301,7 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { } const auto& device = backend.getDevice(); + const auto& dispatcher = backend.getDispatcher(); // create swapchain image views swapchainImageViews.reserve(swapchainImages.size()); @@ -306,7 +314,7 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { for (const auto& image : swapchainImages) { imageViewCreateInfo.setImage(image); - swapchainImageViews.push_back(device->createImageViewUnique(imageViewCreateInfo)); + swapchainImageViews.push_back(device->createImageViewUnique(imageViewCreateInfo, nullptr, dispatcher)); const size_t index = swapchainImageViews.size() - 1; backend.setDebugName(image, "SwapchainImage_" + std::to_string(index)); @@ -372,7 +380,7 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { const auto renderPassCreateInfo = vk::RenderPassCreateInfo().setAttachments(attachments).setSubpasses(subpass).setDependencies(dependencies); - renderPass = device->createRenderPassUnique(renderPassCreateInfo); + renderPass = device->createRenderPassUnique(renderPassCreateInfo, nullptr, dispatcher); // create swapchain framebuffers swapchainFramebuffers.reserve(swapchainImageViews.size()); @@ -388,20 +396,21 @@ void SurfaceRenderableResource::init(uint32_t w, uint32_t h) { const std::array imageViews = {imageView.get(), depthAllocation->imageView.get()}; framebufferCreateInfo.setAttachments(imageViews); - swapchainFramebuffers.push_back(device->createFramebufferUnique(framebufferCreateInfo)); + swapchainFramebuffers.push_back(device->createFramebufferUnique(framebufferCreateInfo, nullptr, dispatcher)); } } void SurfaceRenderableResource::recreateSwapchain() { if (!surface) return; - backend.getDevice()->waitIdle(); + backend.getDevice()->waitIdle(backend.getDispatcher()); swapchainFramebuffers.clear(); renderPass.reset(); swapchainImageViews.clear(); swapchainImages.clear(); - swapchainSemaphores.clear(); + acquireSemaphores.clear(); + presentSemaphores.clear(); init(extent.width, extent.height); } diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index a1c7d3ba7567..ff9a28d06f68 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -34,8 +34,6 @@ #include #endif -VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE - #ifdef ENABLE_VMA_DEBUG #define VMA_DEBUG_MARGIN 16 @@ -138,7 +136,7 @@ std::vector RendererBackend::getDeviceExtensions() { std::vector RendererBackend::getDebugExtensions() { std::vector extensions; - const auto& availableExtensions = vk::enumerateInstanceExtensionProperties(); + const auto& availableExtensions = vk::enumerateInstanceExtensionProperties(nullptr, dispatcher); debugUtilsEnabled = checkAvailability( availableExtensions, {VK_EXT_DEBUG_UTILS_EXTENSION_NAME}, [](const vk::ExtensionProperties& value) { @@ -169,14 +167,14 @@ void RendererBackend::beginDebugLabel([[maybe_unused]] const vk::CommandBuffer& [[maybe_unused]] const std::array& color) const { #ifdef ENABLE_VULKAN_VALIDATION if (!debugUtilsEnabled) return; - buffer.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT().setPLabelName(name).setColor(color)); + buffer.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT().setPLabelName(name).setColor(color), dispatcher); #endif } void RendererBackend::endDebugLabel([[maybe_unused]] const vk::CommandBuffer& buffer) const { #ifdef ENABLE_VULKAN_VALIDATION if (!debugUtilsEnabled) return; - buffer.endDebugUtilsLabelEXT(); + buffer.endDebugUtilsLabelEXT(dispatcher); #endif } @@ -184,7 +182,7 @@ void RendererBackend::insertDebugLabel([[maybe_unused]] const vk::CommandBuffer& [[maybe_unused]] const char* name) const { #ifdef ENABLE_VULKAN_VALIDATION if (!debugUtilsEnabled) return; - buffer.insertDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT().setPLabelName(name)); + buffer.insertDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT().setPLabelName(name), dispatcher); #endif } @@ -337,7 +335,7 @@ void RendererBackend::initDebug() { vk::DebugUtilsMessengerCreateInfoEXT().setMessageSeverity(severity).setMessageType(type).setPfnUserCallback( vkDebugUtilsCallback); - debugUtilsCallback = instance->createDebugUtilsMessengerEXTUnique(createInfo); + debugUtilsCallback = instance->createDebugUtilsMessengerEXTUnique(createInfo, nullptr, dispatcher); if (!debugUtilsCallback) { mbgl::Log::Error(mbgl::Event::Render, "Failed to register Vulkan debug utils callback"); @@ -352,7 +350,7 @@ void RendererBackend::initDebug() { const auto createInfo = vk::DebugReportCallbackCreateInfoEXT().setFlags(flags).setPfnCallback( vkDebugReportCallback); - debugReportCallback = instance->createDebugReportCallbackEXTUnique(createInfo); + debugReportCallback = instance->createDebugReportCallbackEXTUnique(createInfo, nullptr, dispatcher); if (!debugReportCallback) { mbgl::Log::Error(mbgl::Event::Render, "Failed to register Vulkan debug report callback"); @@ -372,8 +370,12 @@ void RendererBackend::init() { } void RendererBackend::initInstance() { + // VULKAN_HPP_DEFAULT_DISPATCHER is global and can lead to race conditions in multi-map environments + static std::mutex vkDefaultDispatchLoaderMutex; + std::lock_guard lock(vkDefaultDispatchLoaderMutex); + // initialize minimal set of function pointers - VULKAN_HPP_DEFAULT_DISPATCHER.init(dynamicLoader); + dispatcher.init(dynamicLoader); // Vulkan 1.1 on Android is supported on 71% of devices (compared to 1.3 with 6%) as of April 23 2024 // https://vulkan.gpuinfo.org/ @@ -388,7 +390,7 @@ void RendererBackend::initInstance() { const auto& layers = getLayers(); - bool layersAvailable = checkAvailability(vk::enumerateInstanceLayerProperties(), + bool layersAvailable = checkAvailability(vk::enumerateInstanceLayerProperties(dispatcher), layers, [](const vk::LayerProperties& value) { return value.layerName.data(); }); @@ -401,9 +403,9 @@ void RendererBackend::initInstance() { auto extensions = getInstanceExtensions(); bool extensionsAvailable = checkAvailability( - vk::enumerateInstanceExtensionProperties(), extensions, [](const vk::ExtensionProperties& value) { - return value.extensionName.data(); - }); + vk::enumerateInstanceExtensionProperties(nullptr, dispatcher), + extensions, + [](const vk::ExtensionProperties& value) { return value.extensionName.data(); }); #ifdef ENABLE_VULKAN_VALIDATION const auto& debugExtensions = getDebugExtensions(); @@ -427,10 +429,10 @@ void RendererBackend::initInstance() { mbgl::Log::Error(mbgl::Event::Render, "Vulkan extensions not found"); } - instance = vk::createInstanceUnique(createInfo); + instance = vk::createInstanceUnique(createInfo, nullptr, dispatcher); // initialize function pointers for instance - VULKAN_HPP_DEFAULT_DISPATCHER.init(instance.get()); + dispatcher.init(instance.get()); #ifdef ENABLE_VULKAN_VALIDATION // enable validation layer callback @@ -445,32 +447,31 @@ void RendererBackend::initSurface() { void RendererBackend::initAllocator() { VmaVulkanFunctions functions = {}; - functions.vkGetInstanceProcAddr = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr; - functions.vkGetDeviceProcAddr = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetDeviceProcAddr; - - functions.vkGetPhysicalDeviceProperties = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetPhysicalDeviceProperties; - functions.vkGetPhysicalDeviceMemoryProperties = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetPhysicalDeviceMemoryProperties; - functions.vkAllocateMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkAllocateMemory; - functions.vkFreeMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkFreeMemory; - functions.vkMapMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkMapMemory; - functions.vkUnmapMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkUnmapMemory; - functions.vkFlushMappedMemoryRanges = VULKAN_HPP_DEFAULT_DISPATCHER.vkFlushMappedMemoryRanges; - functions.vkInvalidateMappedMemoryRanges = VULKAN_HPP_DEFAULT_DISPATCHER.vkInvalidateMappedMemoryRanges; - functions.vkBindBufferMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkBindBufferMemory; - functions.vkBindImageMemory = VULKAN_HPP_DEFAULT_DISPATCHER.vkBindImageMemory; - functions.vkGetBufferMemoryRequirements = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetBufferMemoryRequirements; - functions.vkGetImageMemoryRequirements = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetImageMemoryRequirements; - functions.vkCreateBuffer = VULKAN_HPP_DEFAULT_DISPATCHER.vkCreateBuffer; - functions.vkDestroyBuffer = VULKAN_HPP_DEFAULT_DISPATCHER.vkDestroyBuffer; - functions.vkCreateImage = VULKAN_HPP_DEFAULT_DISPATCHER.vkCreateImage; - functions.vkDestroyImage = VULKAN_HPP_DEFAULT_DISPATCHER.vkDestroyImage; - functions.vkCmdCopyBuffer = VULKAN_HPP_DEFAULT_DISPATCHER.vkCmdCopyBuffer; - functions.vkGetBufferMemoryRequirements2KHR = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetBufferMemoryRequirements2KHR; - functions.vkGetImageMemoryRequirements2KHR = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetImageMemoryRequirements2KHR; - functions.vkBindBufferMemory2KHR = VULKAN_HPP_DEFAULT_DISPATCHER.vkBindBufferMemory2KHR; - functions.vkBindImageMemory2KHR = VULKAN_HPP_DEFAULT_DISPATCHER.vkBindImageMemory2KHR; - functions.vkGetPhysicalDeviceMemoryProperties2KHR = - VULKAN_HPP_DEFAULT_DISPATCHER.vkGetPhysicalDeviceMemoryProperties2KHR; + functions.vkGetInstanceProcAddr = dispatcher.vkGetInstanceProcAddr; + functions.vkGetDeviceProcAddr = dispatcher.vkGetDeviceProcAddr; + + functions.vkGetPhysicalDeviceProperties = dispatcher.vkGetPhysicalDeviceProperties; + functions.vkGetPhysicalDeviceMemoryProperties = dispatcher.vkGetPhysicalDeviceMemoryProperties; + functions.vkAllocateMemory = dispatcher.vkAllocateMemory; + functions.vkFreeMemory = dispatcher.vkFreeMemory; + functions.vkMapMemory = dispatcher.vkMapMemory; + functions.vkUnmapMemory = dispatcher.vkUnmapMemory; + functions.vkFlushMappedMemoryRanges = dispatcher.vkFlushMappedMemoryRanges; + functions.vkInvalidateMappedMemoryRanges = dispatcher.vkInvalidateMappedMemoryRanges; + functions.vkBindBufferMemory = dispatcher.vkBindBufferMemory; + functions.vkBindImageMemory = dispatcher.vkBindImageMemory; + functions.vkGetBufferMemoryRequirements = dispatcher.vkGetBufferMemoryRequirements; + functions.vkGetImageMemoryRequirements = dispatcher.vkGetImageMemoryRequirements; + functions.vkCreateBuffer = dispatcher.vkCreateBuffer; + functions.vkDestroyBuffer = dispatcher.vkDestroyBuffer; + functions.vkCreateImage = dispatcher.vkCreateImage; + functions.vkDestroyImage = dispatcher.vkDestroyImage; + functions.vkCmdCopyBuffer = dispatcher.vkCmdCopyBuffer; + functions.vkGetBufferMemoryRequirements2KHR = dispatcher.vkGetBufferMemoryRequirements2KHR; + functions.vkGetImageMemoryRequirements2KHR = dispatcher.vkGetImageMemoryRequirements2KHR; + functions.vkBindBufferMemory2KHR = dispatcher.vkBindBufferMemory2KHR; + functions.vkBindImageMemory2KHR = dispatcher.vkBindImageMemory2KHR; + functions.vkGetPhysicalDeviceMemoryProperties2KHR = dispatcher.vkGetPhysicalDeviceMemoryProperties2KHR; VmaAllocatorCreateInfo allocatorCreateInfo = {}; @@ -493,16 +494,16 @@ void RendererBackend::initDevice() { const auto& isPhysicalDeviceCompatible = [&](const vk::PhysicalDevice& candidate) -> bool { bool extensionsAvailable = checkAvailability( - candidate.enumerateDeviceExtensionProperties(), extensions, [](const vk::ExtensionProperties& value) { - return value.extensionName.data(); - }); + candidate.enumerateDeviceExtensionProperties(nullptr, dispatcher), + extensions, + [](const vk::ExtensionProperties& value) { return value.extensionName.data(); }); if (!extensionsAvailable) return false; graphicsQueueIndex = -1; presentQueueIndex = -1; - const auto& queues = candidate.getQueueFamilyProperties(); + const auto& queues = candidate.getQueueFamilyProperties(dispatcher); // Use to test on specific GPU type (if multiple) // if (candidate.getProperties().deviceType != vk::PhysicalDeviceType::eIntegratedGpu) return false; @@ -513,7 +514,7 @@ void RendererBackend::initDevice() { if (queue.queueCount == 0) continue; if (queue.queueFlags & vk::QueueFlagBits::eGraphics) graphicsQueueIndex = i; - if (surface && candidate.getSurfaceSupportKHR(i, surface)) presentQueueIndex = i; + if (surface && candidate.getSurfaceSupportKHR(i, surface, dispatcher)) presentQueueIndex = i; if (graphicsQueueIndex != -1 && (!surface || presentQueueIndex != -1)) break; } @@ -521,15 +522,15 @@ void RendererBackend::initDevice() { if (graphicsQueueIndex == -1 || (surface && presentQueueIndex == -1)) return false; if (surface) { - if (candidate.getSurfaceFormatsKHR(surface).empty()) return false; - if (candidate.getSurfacePresentModesKHR(surface).empty()) return false; + if (candidate.getSurfaceFormatsKHR(surface, dispatcher).empty()) return false; + if (candidate.getSurfacePresentModesKHR(surface, dispatcher).empty()) return false; } return true; }; const auto& pickPhysicalDevice = [&]() { - const auto& physicalDevices = instance->enumeratePhysicalDevices(); + const auto& physicalDevices = instance->enumeratePhysicalDevices(dispatcher); if (physicalDevices.empty()) throw std::runtime_error("No Vulkan compatible GPU found"); for (const auto& candidate : physicalDevices) { @@ -541,7 +542,7 @@ void RendererBackend::initDevice() { if (!physicalDevice) throw std::runtime_error("No suitable GPU found"); - physicalDeviceProperties = physicalDevice.getProperties(); + physicalDeviceProperties = physicalDevice.getProperties(dispatcher); }; pickPhysicalDevice(); @@ -555,7 +556,7 @@ void RendererBackend::initDevice() { if (surface && graphicsQueueIndex != presentQueueIndex) queueCreateInfos.emplace_back(vk::DeviceQueueCreateFlags(), presentQueueIndex, 1, &queuePriority); - [[maybe_unused]] const auto& supportedDeviceFeatures = physicalDevice.getFeatures(); + [[maybe_unused]] const auto& supportedDeviceFeatures = physicalDevice.getFeatures(dispatcher); physicalDeviceFeatures = vk::PhysicalDeviceFeatures(); // TODO @@ -588,13 +589,13 @@ void RendererBackend::initDevice() { // this is not needed for newer implementations createInfo.setPEnabledLayerNames(layers); - device = physicalDevice.createDeviceUnique(createInfo); + device = physicalDevice.createDeviceUnique(createInfo, nullptr, dispatcher); // optional function pointer specialization for device - VULKAN_HPP_DEFAULT_DISPATCHER.init(device.get()); + dispatcher.init(device.get()); - graphicsQueue = device->getQueue(graphicsQueueIndex, 0); - if (presentQueueIndex != -1) presentQueue = device->getQueue(presentQueueIndex, 0); + graphicsQueue = device->getQueue(graphicsQueueIndex, 0, dispatcher); + if (presentQueueIndex != -1) presentQueue = device->getQueue(presentQueueIndex, 0, dispatcher); } void RendererBackend::initSwapchain() { @@ -618,11 +619,11 @@ void RendererBackend::initSwapchain() { void RendererBackend::initCommandPool() { const vk::CommandPoolCreateInfo createInfo(vk::CommandPoolCreateFlagBits::eResetCommandBuffer, graphicsQueueIndex); - commandPool = device->createCommandPoolUnique(createInfo); + commandPool = device->createCommandPoolUnique(createInfo, nullptr, dispatcher); } void RendererBackend::destroyResources() { - if (device) device->waitIdle(); + if (device) device->waitIdle(dispatcher); context.reset(); commandPool.reset(); diff --git a/src/mbgl/vulkan/texture2d.cpp b/src/mbgl/vulkan/texture2d.cpp index 235848d7737b..09b272adbea3 100644 --- a/src/mbgl/vulkan/texture2d.cpp +++ b/src/mbgl/vulkan/texture2d.cpp @@ -159,7 +159,8 @@ void Texture2D::uploadSubRegion(const void* pixelData, if (!imageAllocation) return; - const auto& allocator = context.getBackend().getAllocator(); + const auto& backend = context.getBackend(); + const auto& allocator = backend.getAllocator(); const auto bufferInfo = vk::BufferCreateInfo() .setSize(static_cast(size_.width) * size_.height * getPixelStride()) @@ -192,7 +193,8 @@ void Texture2D::uploadSubRegion(const void* pixelData, .setImageOffset(vk::Offset3D(xOffset, yOffset)) .setImageExtent(vk::Extent3D(size_.width, size_.height, 1)); - buffer->copyBufferToImage(bufferAllocation->buffer, imageAllocation->image, imageLayout, region); + buffer->copyBufferToImage( + bufferAllocation->buffer, imageAllocation->image, imageLayout, region, backend.getDispatcher()); if (samplerState.mipmapped && textureUsage == Texture2DUsage::ShaderInput) { generateMips(buffer); @@ -346,7 +348,8 @@ void Texture2D::createTexture() { .setSubresourceRange( {vk::ImageAspectFlagBits::eColor, 0, imageCreateInfo.mipLevels, 0, 1}); - imageAllocation->imageView = backend.getDevice()->createImageViewUnique(imageViewCreateInfo); + imageAllocation->imageView = backend.getDevice()->createImageViewUnique( + imageViewCreateInfo, nullptr, backend.getDispatcher()); } // if the image is used as an attachment @@ -368,6 +371,8 @@ void Texture2D::createTexture() { void Texture2D::createSampler() { destroySampler(); + const auto& backend = context.getBackend(); + const auto filter = vulkanFilter(samplerState.filter); const auto addressModeU = vulkanAddressMode(samplerState.wrapU); const auto addressModeV = vulkanAddressMode(samplerState.wrapV); @@ -385,11 +390,11 @@ void Texture2D::createSampler() { samplerCreateInfo.setMipmapMode(vk::SamplerMipmapMode::eLinear); } - if (samplerState.maxAnisotropy != 1 && context.getBackend().getDeviceFeatures().samplerAnisotropy) { + if (samplerState.maxAnisotropy != 1 && backend.getDeviceFeatures().samplerAnisotropy) { samplerCreateInfo.setAnisotropyEnable(true).setMaxAnisotropy(samplerState.maxAnisotropy); } - sampler = context.getBackend().getDevice()->createSampler(samplerCreateInfo); + sampler = backend.getDevice()->createSampler(samplerCreateInfo, nullptr, backend.getDispatcher()); samplerStateDirty = false; lastModified = util::MonotonicTimer::now(); @@ -409,7 +414,7 @@ void Texture2D::destroyTexture() { void Texture2D::destroySampler() { if (sampler) { context.enqueueDeletion([sampler_ = std::move(sampler)](auto& context_) mutable { - context_.getBackend().getDevice()->destroySampler(sampler_); + context_.getBackend().getDevice()->destroySampler(sampler_, nullptr, context_.getBackend().getDispatcher()); }); sampler = nullptr; @@ -427,8 +432,13 @@ void Texture2D::transitionToTransferLayout(const vk::UniqueCommandBuffer& buffer .setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) .setSubresourceRange({vk::ImageAspectFlagBits::eColor, 0, getMipLevels(), 0, 1}); - buffer->pipelineBarrier( - vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, barrier); + buffer->pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, + vk::PipelineStageFlagBits::eTransfer, + {}, + nullptr, + nullptr, + barrier, + context.getBackend().getDispatcher()); imageLayout = barrier.newLayout; } @@ -449,7 +459,8 @@ void Texture2D::transitionToShaderReadLayout(const vk::UniqueCommandBuffer& buff {}, nullptr, nullptr, - barrier); + barrier, + context.getBackend().getDispatcher()); imageLayout = barrier.newLayout; } @@ -465,8 +476,13 @@ void Texture2D::transitionToGeneralLayout(const vk::UniqueCommandBuffer& buffer) .setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) .setSubresourceRange({vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}); - buffer->pipelineBarrier( - vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, barrier); + buffer->pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eTransfer, + {}, + nullptr, + nullptr, + barrier, + context.getBackend().getDispatcher()); imageLayout = barrier.newLayout; } @@ -491,8 +507,12 @@ void Texture2D::copyImage(vk::Image image) { .setExtent({size.width, size.height, 1}); transitionToTransferLayout(commandBuffer); - commandBuffer->copyImage( - image, vk::ImageLayout::eTransferSrcOptimal, imageAllocation->image, imageLayout, copyInfo); + commandBuffer->copyImage(image, + vk::ImageLayout::eTransferSrcOptimal, + imageAllocation->image, + imageLayout, + copyInfo, + context.getBackend().getDispatcher()); transitionToGeneralLayout(commandBuffer); }); } @@ -505,7 +525,8 @@ std::shared_ptr Texture2D::readImage() { // check for offset/padding const auto& device = context.getBackend().getDevice(); const auto& layout = device->getImageSubresourceLayout(imageAllocation->image, - vk::ImageSubresource(vk::ImageAspectFlagBits::eColor, 0, 0)); + vk::ImageSubresource(vk::ImageAspectFlagBits::eColor, 0, 0), + context.getBackend().getDispatcher()); imageData->resize(size); const auto& imageSize = getDataSize(); @@ -544,6 +565,8 @@ void Texture2D::generateMips(const vk::UniqueCommandBuffer& buffer) { return; } + const auto& dispatcher = context.getBackend().getDispatcher(); + int32_t mipWidth = size.width; int32_t mipHeight = size.height; @@ -562,8 +585,13 @@ void Texture2D::generateMips(const vk::UniqueCommandBuffer& buffer) { .setSrcAccessMask(vk::AccessFlagBits::eTransferWrite) .setDstAccessMask(vk::AccessFlagBits::eTransferRead); - buffer->pipelineBarrier( - vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, barrier); + buffer->pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eTransfer, + {}, + nullptr, + nullptr, + barrier, + dispatcher); const auto blit = vk::ImageBlit() .setSrcOffsets({vk::Offset3D{0, 0, 0}, {mipWidth, mipHeight, 1}}) @@ -576,7 +604,8 @@ void Texture2D::generateMips(const vk::UniqueCommandBuffer& buffer) { imageAllocation->image, barrier.oldLayout, blit, - vk::Filter::eLinear); + vk::Filter::eLinear, + dispatcher); barrier.setOldLayout(vk::ImageLayout::eTransferSrcOptimal) .setNewLayout(vk::ImageLayout::eShaderReadOnlyOptimal) @@ -588,7 +617,8 @@ void Texture2D::generateMips(const vk::UniqueCommandBuffer& buffer) { {}, nullptr, nullptr, - barrier); + barrier, + dispatcher); mipWidth = std::max(1, mipWidth / 2); mipHeight = std::max(1, mipHeight / 2); @@ -607,7 +637,8 @@ void Texture2D::generateMips(const vk::UniqueCommandBuffer& buffer) { {}, nullptr, nullptr, - barrier); + barrier, + dispatcher); imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; } From 8428756cbecf1bf0ff6bbe432336b258e61b4e56 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 23 Jul 2025 23:03:24 +0200 Subject: [PATCH 284/339] Temporarily disable iOS UI Test (#3643) --- .github/workflows/ios-ci.yml | 41 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 8dfd06c739a9..2b22ac736374 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -100,26 +100,27 @@ jobs: #- name: Running iOS UI tests (Thread Sanitizer) # run: bazel test //platform/ios/iosapp-UITests:uitest --test_output=errors --//:renderer=metal --features=tsan - - name: Running iOS UI tests (Address+UB Sanitizer) - run: | - retry_count=0 - max_retries=5 - while [ $retry_count -le $max_retries ]; do - bazel test //platform/ios/iosapp-UITests:uitest \ - --test_output=errors \ - --//:renderer=metal \ - --features=include_clang_rt \ - --copt=-fsanitize=undefined \ - --linkopt=-fsanitize=undefined \ - --copt=-fsanitize-recover=null \ - --linkopt=-fsanitize-recover=null && break - retry_count=$((retry_count+1)) - if [ $retry_count -eq $max_retries ]; then - echo "::error::Failed to run iOS UI tests after $max_retries attempts" - exit 1 - fi - echo "Attempt $retry_count failed. Retrying..." - done + # https://github.com/maplibre/maplibre-native/issues/3642 + # - name: Running iOS UI tests (Address+UB Sanitizer) + # run: | + # retry_count=0 + # max_retries=5 + # while [ $retry_count -le $max_retries ]; do + # bazel test //platform/ios/iosapp-UITests:uitest \ + # --test_output=errors \ + # --//:renderer=metal \ + # --features=include_clang_rt \ + # --copt=-fsanitize=undefined \ + # --linkopt=-fsanitize=undefined \ + # --copt=-fsanitize-recover=null \ + # --linkopt=-fsanitize-recover=null && break + # retry_count=$((retry_count+1)) + # if [ $retry_count -eq $max_retries ]; then + # echo "::error::Failed to run iOS UI tests after $max_retries attempts" + # exit 1 + # fi + # echo "Attempt $retry_count failed. Retrying..." + # done # render test From f332198c86f5cf57dec29d3b30e795b81f6de296 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 24 Jul 2025 01:25:45 +0200 Subject: [PATCH 285/339] Mark AWS Device Farm run as failed if it was SKIPPED (#3651) --- .../aws-device-farm/aws-device-farm-run.sh | 99 ++++++++++++------- 1 file changed, 63 insertions(+), 36 deletions(-) diff --git a/scripts/aws-device-farm/aws-device-farm-run.sh b/scripts/aws-device-farm/aws-device-farm-run.sh index ed33cc9c9dc9..da03d5940aa2 100755 --- a/scripts/aws-device-farm/aws-device-farm-run.sh +++ b/scripts/aws-device-farm/aws-device-farm-run.sh @@ -53,6 +53,7 @@ test_package_url="$(jq -r '.upload.url' <<< "$response")" curl -T "$appFile" "$app_url" curl -T "$testFile" "$test_package_url" +# Wait for uploads to succeed max_checks=10 sleep_time=5 @@ -64,9 +65,6 @@ while ((max_checks--)); do status_app="$(check_status "$app_arn")" status_test_package="$(check_status "$test_package_arn")" - status_app="$status_app" - status_test_package="$status_test_package" - if [[ "$status_app" == "SUCCEEDED" && "$status_test_package" == "SUCCEEDED" ]]; then echo "Uploads succeeded" >&2 break @@ -78,40 +76,69 @@ while ((max_checks--)); do sleep $sleep_time done -# Schedule test run -arn="$(aws devicefarm schedule-run \ - --project-arn "$AWS_DEVICE_FARM_PROJECT_ARN" \ - --name "MapLibre Native $name" \ - --app-arn "$app_arn" \ - --device-pool-arn "$AWS_DEVICE_FARM_DEVICE_POOL_ARN" \ - --test type=$testType,testPackageArn=$test_package_arn${testFilter:+,filter=$testFilter}${testSpecArn:+,testSpecArn=$testSpecArn} \ - --execution-configuration '{"videoCapture": false}' \ - --output text --query run.arn)" - -echo ARN: $arn >&2 - -if [ -z "$arn" ]; then - echo "Error: Failed to schedule Device Farm run or got empty ARN" >&2 - exit 1 -fi - +# Retry logic: reschedule when result is SKIPPED up to 3 times +max_retries=3 +for attempt in $(seq 1 $max_retries); do + echo "Scheduling Device Farm run (attempt $attempt)" >&2 + arn=$(aws devicefarm schedule-run \ + --project-arn "$AWS_DEVICE_FARM_PROJECT_ARN" \ + --name "MapLibre Native $name" \ + --app-arn "$app_arn" \ + --device-pool-arn "$AWS_DEVICE_FARM_DEVICE_POOL_ARN" \ + --test type=$testType,testPackageArn=$test_package_arn${testFilter:+,filter=$testFilter}${testSpecArn:+,testSpecArn=$testSpecArn} \ + --execution-configuration '{"videoCapture": false}' \ + --output text --query run.arn) + + echo "ARN: $arn" >&2 + + if [[ -z "$arn" ]]; then + echo "Error: Failed to schedule Device Farm run or got empty ARN" >&2 + exit 1 + fi -echo "$arn" + if [[ "$wait_for_completion" != "true" ]]; then + echo "Not waiting for run to complete" >&2 + exit 0 + fi -if [[ "$wait_for_completion" != "true" ]]; then - echo "Not waiting for run to complete" >&2 - exit 0 -fi + # Wait for run result + while true; do + sleep 30 + result=$(aws devicefarm get-run --arn "$arn" --output text --query "run.result") + case $result in + FAILED|ERRORED|STOPPED) + echo "$arn" + echo "Run $result" >&2 + exit 1 + ;; + SKIPPED) + echo "Run skipped on attempt $attempt" >&2 + if [[ $attempt -lt $max_retries ]]; then + echo "Retrying..." >&2 + break # break wait loop and retry + else + echo "$arn" + echo "Max retries ($max_retries) reached. Exiting." >&2 + exit 1 + fi + ;; + PASSED) + echo "$arn" + echo "Run $result" >&2 + exit 0 + ;; + PENDING) + continue + ;; + *) + echo "Unexpected run result $result" >&2 + exit 1 + ;; + esac + done -# wait until result is not PENDING -# https://awscli.amazonaws.com/v2/documentation/api/latest/reference/devicefarm/get-run.html#output -while true; do - sleep 30 - result="$(aws devicefarm get-run --arn "$arn" --output text --query "run.result")" - case $result in - FAILED|ERRORED|STOPPED) echo "Run $result" >&2 && exit 1 ;; - SKIPPED|PASSED) echo "Run $result" >&2 && exit 0 ;; - PENDING) continue ;; - *) echo "Unexpected run result $result" >&2 && exit 1 ;; - esac done + +# If for-loop exits without passing or failing, exit with error +echo "Retries exhausted without a definitive result." >&2 +exit 1 From 173ecdb103a0166ae3b9a3cd0c320f2d5234b9e3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 24 Jul 2025 11:48:39 +0200 Subject: [PATCH 286/339] Replace archived action with actions/create-github-app-token@v2 (#3652) --- .github/workflows/android-device-test.yml | 14 +++++++------- .github/workflows/ios-ci.yml | 6 +++--- .github/workflows/ios-device-test.yml | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index f22e96626e72..cbb578608bec 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -100,12 +100,12 @@ jobs: id: get-pr-number - name: Generate token + uses: actions/create-github-app-token@v2 id: generate_token - uses: tibdex/github-app-token@v2 with: - revoke: false # revoking will fail for long running workflows, because the token will already have expired - app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} - private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} + skip-token-revoke: true # revoking will fail for long running workflows, because the token will already have expired + app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} + private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} - name: Check if comment on PR contains '!benchmark android' if: matrix.test.name == 'Android Benchmark' && steps.get-pr-number.outputs.pr-number @@ -203,11 +203,11 @@ jobs: - name: Generate another token (previous one could have expired) if: always() + uses: actions/create-github-app-token@v2 id: generate_token_2 - uses: tibdex/github-app-token@v2 with: - app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} - private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} + app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} + private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} - uses: LouisBrunner/checks-action@v2.0.0 if: always() diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml index 2b22ac736374..53ac9c57b6af 100644 --- a/.github/workflows/ios-ci.yml +++ b/.github/workflows/ios-ci.yml @@ -333,11 +333,11 @@ jobs: # needed to trigger workflow for Swift Package Index release - name: Generate token if: env.make_release + uses: actions/create-github-app-token@v2 id: generate_token - uses: tibdex/github-app-token@v2 with: - app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} - private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} + app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} + private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} - name: Release (Swift Package Index) if: env.make_release diff --git a/.github/workflows/ios-device-test.yml b/.github/workflows/ios-device-test.yml index f4dcdb93d688..93890f13a686 100644 --- a/.github/workflows/ios-device-test.yml +++ b/.github/workflows/ios-device-test.yml @@ -24,11 +24,11 @@ jobs: - uses: actions/checkout@v4 - name: Generate token + uses: actions/create-github-app-token@v2 id: generate_token - uses: tibdex/github-app-token@v2 with: - app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} - private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} + app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} + private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} - uses: LouisBrunner/checks-action@v2.0.0 id: create_check @@ -72,10 +72,18 @@ jobs: ./scripts/aws-device-farm/aws-device-farm-run.sh + - name: Generate another token (previous one could have expired) + if: always() + uses: actions/create-github-app-token@v2 + id: generate_token_2 + with: + app-id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }} + private-key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }} + - uses: LouisBrunner/checks-action@v2.0.0 if: always() with: - token: ${{ steps.generate_token.outputs.token }} + token: ${{ steps.generate_token_2.outputs.token }} check_id: ${{ steps.create_check.outputs.check_id }} conclusion: ${{ job.status }} sha: ${{ github.event.workflow_run.sha }} From 4c0ec62dc297c684fc4977fe4348f418efd939e5 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 24 Jul 2025 12:20:26 +0200 Subject: [PATCH 287/339] Use `check-job-skipped.ts` in other workflows (#3653) --- .github/scripts/check-job-skipped.ts | 1 + .github/workflows/pr-bloaty-ios.yml | 18 ++++++++++++------ .github/workflows/pr-linux-tests.yml | 18 ++++++++++++------ .github/workflows/upload-coverage.yml | 18 ++++++++++++------ 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/.github/scripts/check-job-skipped.ts b/.github/scripts/check-job-skipped.ts index af8ce27b5526..a8a0633bf13f 100644 --- a/.github/scripts/check-job-skipped.ts +++ b/.github/scripts/check-job-skipped.ts @@ -20,6 +20,7 @@ async function run() { if (!job) throw new Error(`job with name ${jobName} not found in workflow run with id ${run_id}`); core.setOutput('was_skipped', job.conclusion === 'skipped'); + core.setOutput('was_skipped_or_cancelled', job.conclusion === 'skipped' || job.conclusion === 'cancelled'); } try { diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index 66dc7009eb04..3bc038090ef2 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -17,13 +17,19 @@ jobs: if: github.event.workflow_run.event == 'pull_request' runs-on: ubuntu-latest outputs: - should_skip: ${{ steps.check_skip.outputs.should_skip }} + should_skip: ${{ steps.parent_workflow.outputs.was_skipped_or_cancelled }} steps: - - id: check_skip - run: | - conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "ios-build").conclusion') - should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") - echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + with: + sparse-checkout: .github + + - name: Get parent workflow result + id: parent_workflow + run: node .github/scripts/check-job-skipped.ts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TEST_RUN_ID: ${{ github.event.workflow_run.id }} + JOB_NAME: ios-build pr-bloaty-ios: needs: pre_job diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index 0aa076d47b1c..f6ac362e8edc 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -20,13 +20,19 @@ jobs: if: github.event.workflow_run.event == 'pull_request' runs-on: ubuntu-latest outputs: - should_skip: ${{ steps.check_skip.outputs.should_skip }} + should_skip: ${{ steps.parent_workflow.outputs.was_skipped_or_cancelled }} steps: - - id: check_skip - run: | - conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-build-and-test").conclusion') - should_skip=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false") - echo "should_skip=$should_skip" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + with: + sparse-checkout: .github + + - name: Get parent workflow result + id: parent_workflow + run: node .github/scripts/check-job-skipped.ts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TEST_RUN_ID: ${{ github.event.workflow_run.id }} + JOB_NAME: linux-build-and-test pr-bloaty: needs: pre_job diff --git a/.github/workflows/upload-coverage.yml b/.github/workflows/upload-coverage.yml index 6bc94ea439f4..7f6e7c831f6b 100644 --- a/.github/workflows/upload-coverage.yml +++ b/.github/workflows/upload-coverage.yml @@ -10,13 +10,19 @@ jobs: pre_job: runs-on: ubuntu-latest outputs: - should_run: ${{ steps.check_skip.outputs.should_run }} + should_run: ${{ !steps.parent_workflow.outputs.was_skipped_or_cancelled }} steps: - - id: check_skip - run: | - conclusion=$(curl --retry 12 --retry-all-errors ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "linux-coverage").conclusion') - should_run=$([[ "$conclusion" = "success" ]] && echo "true" || echo "false") - echo "should_run=$should_run" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + with: + sparse-checkout: .github + + - name: Get parent workflow result + id: parent_workflow + run: node .github/scripts/check-job-skipped.ts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TEST_RUN_ID: ${{ github.event.workflow_run.id }} + JOB_NAME: linux-coverage upload-coverage: needs: pre_job From eaba10a468e08487586b6b3d8216c9a639c6857f Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Thu, 24 Jul 2025 15:16:50 +0200 Subject: [PATCH 288/339] Install Node.js version from .nvmrc in jobs (#3654) --- .github/workflows/pr-bloaty-ios.yml | 10 +++++++++- .github/workflows/pr-linux-tests.yml | 10 +++++++++- .github/workflows/upload-coverage.yml | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-bloaty-ios.yml b/.github/workflows/pr-bloaty-ios.yml index 3bc038090ef2..b691c29304e2 100644 --- a/.github/workflows/pr-bloaty-ios.yml +++ b/.github/workflows/pr-bloaty-ios.yml @@ -21,7 +21,15 @@ jobs: steps: - uses: actions/checkout@v4 with: - sparse-checkout: .github + sparse-checkout: | + .github + .nvmrc + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - run: npm install - name: Get parent workflow result id: parent_workflow diff --git a/.github/workflows/pr-linux-tests.yml b/.github/workflows/pr-linux-tests.yml index f6ac362e8edc..e5c53b98bd8a 100644 --- a/.github/workflows/pr-linux-tests.yml +++ b/.github/workflows/pr-linux-tests.yml @@ -24,7 +24,15 @@ jobs: steps: - uses: actions/checkout@v4 with: - sparse-checkout: .github + sparse-checkout: | + .github + .nvmrc + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - run: npm install - name: Get parent workflow result id: parent_workflow diff --git a/.github/workflows/upload-coverage.yml b/.github/workflows/upload-coverage.yml index 7f6e7c831f6b..21a3b9ba15a2 100644 --- a/.github/workflows/upload-coverage.yml +++ b/.github/workflows/upload-coverage.yml @@ -14,7 +14,15 @@ jobs: steps: - uses: actions/checkout@v4 with: - sparse-checkout: .github + sparse-checkout: | + .github + .nvmrc + + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - run: npm install - name: Get parent workflow result id: parent_workflow From db29e6235f19d9186aba06042bfcd9f84382dcaa Mon Sep 17 00:00:00 2001 From: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Date: Fri, 25 Jul 2025 14:59:28 +0200 Subject: [PATCH 289/339] texture2d - getVulkanImage and support for Texture2DUsage::Attachment (#3632) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Adrian Cojocaru Co-authored-by: Bart Louwers --- include/mbgl/vulkan/texture2d.hpp | 1 + src/mbgl/vulkan/offscreen_texture.cpp | 8 +- src/mbgl/vulkan/texture2d.cpp | 109 ++++++++++++++++++++++---- 3 files changed, 100 insertions(+), 18 deletions(-) diff --git a/include/mbgl/vulkan/texture2d.hpp b/include/mbgl/vulkan/texture2d.hpp index 92c7a516ae80..4f2b1a992989 100644 --- a/include/mbgl/vulkan/texture2d.hpp +++ b/include/mbgl/vulkan/texture2d.hpp @@ -80,6 +80,7 @@ class Texture2D : public gfx::Texture2D { const vk::ImageLayout& getVulkanImageLayout() const { return imageLayout; } const vk::UniqueImageView& getVulkanImageView() const { return imageAllocation->imageView; } + const vk::Image& getVulkanImage() const { return imageAllocation->image; } const vk::Sampler& getVulkanSampler(); void copyImage(vk::Image image); diff --git a/src/mbgl/vulkan/offscreen_texture.cpp b/src/mbgl/vulkan/offscreen_texture.cpp index 24462d0c993c..de0f405fd00b 100644 --- a/src/mbgl/vulkan/offscreen_texture.cpp +++ b/src/mbgl/vulkan/offscreen_texture.cpp @@ -46,8 +46,12 @@ class OffscreenTextureResource final : public RenderableResource { const vk::UniqueFramebuffer& getFramebuffer() const override { return framebuffer; }; PremultipliedImage readStillImage() { - assert(false); - return {}; + if (!colorTexture) { + return {}; + } + + const auto& image = static_cast(*colorTexture).readImage(); + return image ? image->clone() : PremultipliedImage(); } gfx::Texture2DPtr& getTexture() { diff --git a/src/mbgl/vulkan/texture2d.cpp b/src/mbgl/vulkan/texture2d.cpp index 09b272adbea3..7a6f9d798f15 100644 --- a/src/mbgl/vulkan/texture2d.cpp +++ b/src/mbgl/vulkan/texture2d.cpp @@ -288,7 +288,7 @@ void Texture2D::createTexture() { case Texture2DUsage::Attachment: imageUsage = vk::ImageUsageFlags() | vk::ImageUsageFlagBits::eColorAttachment | - vk::ImageUsageFlagBits::eSampled; + vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferSrc; imageTiling = vk::ImageTiling::eOptimal; break; @@ -524,30 +524,107 @@ std::shared_ptr Texture2D::readImage() { // check for offset/padding const auto& device = context.getBackend().getDevice(); - const auto& layout = device->getImageSubresourceLayout(imageAllocation->image, - vk::ImageSubresource(vk::ImageAspectFlagBits::eColor, 0, 0), - context.getBackend().getDispatcher()); + const auto& dispatcher = context.getBackend().getDispatcher(); imageData->resize(size); const auto& imageSize = getDataSize(); - void* mappedData_ = nullptr; - vmaMapMemory(context.getBackend().getAllocator(), imageAllocation->allocation, &mappedData_); + // Check if this is an attachment texture that needs staging buffer + if (textureUsage == Texture2DUsage::Attachment) { + // For optimal tiling, we need to copy to a staging buffer first + const auto& allocator = context.getBackend().getAllocator(); + + // Create staging buffer + const auto bufferInfo = vk::BufferCreateInfo() + .setSize(imageSize) + .setUsage(vk::BufferUsageFlagBits::eTransferDst) + .setSharingMode(vk::SharingMode::eExclusive); + + VmaAllocationCreateInfo allocationInfo = {}; + allocationInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_HOST; + allocationInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + allocationInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | + VMA_ALLOCATION_CREATE_MAPPED_BIT; + + SharedBufferAllocation bufferAllocation = std::make_shared(allocator); + if (!bufferAllocation->create(allocationInfo, bufferInfo)) { + mbgl::Log::Error(mbgl::Event::Render, "Vulkan readImage staging buffer allocation failed"); + return nullptr; + } + + // Copy image to staging buffer + context.submitOneTimeCommand([&](const vk::UniqueCommandBuffer& commandBuffer) { + // Transition image layout for reading + const auto barrier = vk::ImageMemoryBarrier() + .setImage(imageAllocation->image) + .setOldLayout(imageLayout) + .setNewLayout(vk::ImageLayout::eTransferSrcOptimal) + .setSrcAccessMask(vk::AccessFlagBits::eColorAttachmentWrite) + .setDstAccessMask(vk::AccessFlagBits::eTransferRead) + .setSrcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) + .setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED) + .setSubresourceRange({vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}); + + commandBuffer->pipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, + vk::PipelineStageFlagBits::eTransfer, + {}, + nullptr, + nullptr, + barrier, + dispatcher); + + imageLayout = barrier.newLayout; + + // Copy image to buffer + const auto region = vk::BufferImageCopy() + .setBufferOffset(0) + .setBufferRowLength(0) + .setBufferImageHeight(0) + .setImageSubresource( + vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1)) + .setImageOffset({0, 0, 0}) + .setImageExtent({size.width, size.height, 1}); + + commandBuffer->copyImageToBuffer(imageAllocation->image, + vk::ImageLayout::eTransferSrcOptimal, + bufferAllocation->buffer, + region, + dispatcher); + }); + + // Map staging buffer and copy to image data + vmaMapMemory(allocator, bufferAllocation->allocation, &bufferAllocation->mappedBuffer); + memcpy(imageData->data.get(), bufferAllocation->mappedBuffer, imageSize); + vmaUnmapMemory(allocator, bufferAllocation->allocation); - uint8_t* mappedData = reinterpret_cast(mappedData_) + layout.offset; + return imageData; + } else if (textureUsage == Texture2DUsage::Read) { + // For linear tiling (Read usage), use direct memory mapping + const auto& layout = device->getImageSubresourceLayout( + imageAllocation->image, vk::ImageSubresource(vk::ImageAspectFlagBits::eColor, 0, 0), dispatcher); - if (imageSize == layout.arrayPitch) { - memcpy(imageData->data.get(), mappedData, imageSize); - } else { - auto rowSize = static_cast(size.width * getPixelStride()); - for (uint32_t i = 0; i < size.height; ++i) { - memcpy(imageData->data.get() + rowSize * i, mappedData + layout.rowPitch * i, rowSize); + void* mappedData_ = nullptr; + vmaMapMemory(context.getBackend().getAllocator(), imageAllocation->allocation, &mappedData_); + + uint8_t* mappedData = reinterpret_cast(mappedData_) + layout.offset; + + if (imageSize == layout.arrayPitch) { + memcpy(imageData->data.get(), mappedData, imageSize); + } else { + auto rowSize = static_cast(size.width * getPixelStride()); + for (uint32_t i = 0; i < size.height; ++i) { + memcpy(imageData->data.get() + rowSize * i, mappedData + layout.rowPitch * i, rowSize); + } } - } - vmaUnmapMemory(context.getBackend().getAllocator(), imageAllocation->allocation); + vmaUnmapMemory(context.getBackend().getAllocator(), imageAllocation->allocation); - return imageData; + return imageData; + } else { + // not readable + assert(false); + return imageData; + } } uint32_t Texture2D::getMipLevels() const { From aeaadc06b4e0614f4f243db4dce210c22dde9f9c Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Fri, 25 Jul 2025 21:06:32 +0300 Subject: [PATCH 290/339] Fix OpenGL symbols leaking to other backend builds (#3660) --- platform/linux/linux.cmake | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 49eaae01b460..cdeccac815f5 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -33,7 +33,6 @@ target_sources( PRIVATE ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp - ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gl/headless_backend.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/i18n/collator.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/i18n/number_format.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -71,9 +70,17 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/thread_local.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/timer.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/utf.cpp - ${PROJECT_SOURCE_DIR}/platform/linux/src/gl_functions.cpp ) +if(MLN_WITH_OPENGL) + target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gl/headless_backend.cpp + ${PROJECT_SOURCE_DIR}/platform/linux/src/gl_functions.cpp + ) +endif() + if(MLN_WITH_EGL) find_package(OpenGL REQUIRED EGL) target_sources( From 588562ef0dcfdce942bb7e86200b2d7078de3676 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Sat, 26 Jul 2025 01:46:44 +0300 Subject: [PATCH 291/339] Add Vulkan device sharing example (#3649) Co-authored-by: Birk Skyum <74932975+birkskyum@users.noreply.github.com> --- include/mbgl/vulkan/renderer_backend.hpp | 19 +-- platform/glfw/glfw_vulkan_backend.cpp | 140 +++++++++++++++++++++++ platform/glfw/glfw_vulkan_backend.hpp | 9 ++ src/mbgl/vulkan/renderer_backend.cpp | 46 +++----- 4 files changed, 178 insertions(+), 36 deletions(-) diff --git a/include/mbgl/vulkan/renderer_backend.hpp b/include/mbgl/vulkan/renderer_backend.hpp index b3283088d1d7..f1c643eaf8a3 100644 --- a/include/mbgl/vulkan/renderer_backend.hpp +++ b/include/mbgl/vulkan/renderer_backend.hpp @@ -84,16 +84,16 @@ class RendererBackend : public gfx::RendererBackend { virtual std::vector getDeviceExtensions(); std::vector getDebugExtensions(); - void initInstance(); - void initDebug(); - void initSurface(); - void initDevice(); - void initAllocator(); - void initSwapchain(); - void initCommandPool(); - void initFrameCapture(); + virtual void initInstance(); + virtual void initDebug(); + virtual void initSurface(); + virtual void initDevice(); + virtual void initAllocator(); + virtual void initSwapchain(); + virtual void initCommandPool(); + virtual void initFrameCapture(); - void destroyResources(); + virtual void destroyResources(); protected: vk::DynamicLoader dynamicLoader; @@ -120,6 +120,7 @@ class RendererBackend : public gfx::RendererBackend { VmaAllocator allocator; bool debugUtilsEnabled{false}; + bool usingSharedContext{false}; }; } // namespace vulkan diff --git a/platform/glfw/glfw_vulkan_backend.cpp b/platform/glfw/glfw_vulkan_backend.cpp index 25e736c4c756..ce87933c1e30 100644 --- a/platform/glfw/glfw_vulkan_backend.cpp +++ b/platform/glfw/glfw_vulkan_backend.cpp @@ -11,6 +11,113 @@ #define GLFW_INCLUDE_VULKAN #include +#ifdef USE_SHARED_VK_CONTEXT + +// An example of an external vkInstance/vkDevice provider. +// It uses the first available device and queue +class VkContext { +public: + VkContext() = default; + ~VkContext() { + device.reset(); + instance.reset(); + } + + static VkContext& shared() { + static std::unique_ptr context; + if (!context) { + context = std::make_unique(); + } + + return *context; + } + + vk::Instance getInstance() { + if (instance) { + return instance.get(); + } + + dispatcher.init(dynamicLoader); + +#ifdef __APPLE__ + vk::InstanceCreateFlags instanceFlags = vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; +#else + vk::InstanceCreateFlags instanceFlags = {}; +#endif + + const std::vector layers = {"VK_LAYER_KHRONOS_validation"}; + std::vector extensions = { + VK_EXT_DEBUG_UTILS_EXTENSION_NAME, +#ifdef __APPLE__ + "VK_KHR_portability_enumeration", +#endif + }; + + uint32_t glfwExtensionCount = 0; + const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); + std::copy(glfwExtensions, glfwExtensions + glfwExtensionCount, std::back_inserter(extensions)); + + vk::ApplicationInfo appInfo("maplibre-native", 1, "maplibre-native", 1, VK_API_VERSION_1_0); + const auto createInfo = vk::InstanceCreateInfo(instanceFlags) + .setPApplicationInfo(&appInfo) + .setPEnabledExtensionNames(extensions) + .setPEnabledLayerNames(layers); + + instance = vk::createInstanceUnique(createInfo, nullptr, dispatcher); + dispatcher.init(instance.get()); + + return instance.get(); + } + + vk::PhysicalDevice getPhysicalDevice() { + if (!physicalDevice) { + physicalDevice = instance->enumeratePhysicalDevices(dispatcher)[0]; + } + + return physicalDevice; + } + + vk::Device getDevice() { + if (device) { + return device.get(); + } + + const std::vector layers = {"VK_LAYER_KHRONOS_validation"}; + const std::vector extensions = { + VK_KHR_SWAPCHAIN_EXTENSION_NAME, +#ifdef __APPLE__ + "VK_KHR_portability_subset", +#endif + }; + + float queuePriority = 1.0f; + vk::DeviceQueueCreateInfo queueCreateInfo(vk::DeviceQueueCreateFlags(), getQueueIndex(), 1, &queuePriority); + + auto createInfo = vk::DeviceCreateInfo() + .setQueueCreateInfos(queueCreateInfo) + .setPEnabledExtensionNames(extensions) + .setPEnabledLayerNames(layers); + + device = physicalDevice.createDeviceUnique(createInfo, nullptr, dispatcher); + dispatcher.init(device.get()); + + return device.get(); + } + + uint32_t getQueueIndex() { return graphicsQueueIndex; } + +private: + vk::DynamicLoader dynamicLoader; + vk::DispatchLoaderDynamic dispatcher; + + vk::UniqueInstance instance; + vk::PhysicalDevice physicalDevice; + vk::UniqueDevice device; + uint32_t graphicsQueueIndex = 0; +}; + +#endif + class GLFWVulkanRenderableResource final : public mbgl::vulkan::SurfaceRenderableResource { public: explicit GLFWVulkanRenderableResource(GLFWVulkanBackend& backend_, bool capFrameRate) @@ -75,6 +182,39 @@ std::vector GLFWVulkanBackend::getInstanceExtensions() { return extensions; } +#ifdef USE_SHARED_VK_CONTEXT + +void GLFWVulkanBackend::initInstance() { + // tell the backend to keep the objects alive + usingSharedContext = true; + + // this method is required to set `instance` to a valid vkInstance + instance = vk::UniqueInstance(VkContext::shared().getInstance(), + vk::ObjectDestroy(nullptr, dispatcher)); + + // debug builds also require: + // - enabling either `VK_EXT_debug_utils` (and updating `debugUtilsEnabled`) or `VK_EXT_debug_report` extension + // - or passing the values returned by `getDebugExtensions()` as enabled extensions during instance creation + debugUtilsEnabled = true; +} + +void GLFWVulkanBackend::initDevice() { + // this method is required to populate: + // `physicalDevice` + // `device` + // `graphicsQueueIndex`/`presentQueueIndex` + // `physicalDeviceFeatures` - enabled features (optional) + + physicalDevice = VkContext::shared().getPhysicalDevice(); + device = vk::UniqueDevice(VkContext::shared().getDevice(), + vk::ObjectDestroy(nullptr, dispatcher)); + + graphicsQueueIndex = presentQueueIndex = VkContext::shared().getQueueIndex(); + physicalDeviceFeatures = vk::PhysicalDeviceFeatures(); +} + +#endif + namespace mbgl { namespace gfx { diff --git a/platform/glfw/glfw_vulkan_backend.hpp b/platform/glfw/glfw_vulkan_backend.hpp index 6eab1dfea0a8..36ef1c05a6a0 100644 --- a/platform/glfw/glfw_vulkan_backend.hpp +++ b/platform/glfw/glfw_vulkan_backend.hpp @@ -5,6 +5,10 @@ #include #include +// Example of using an application side VkInstance/VkDevice +// that's shared with MapLibre's renderer backend +// #define USE_SHARED_VK_CONTEXT + struct GLFWwindow; class GLFWVulkanBackend final : public GLFWBackend, @@ -29,6 +33,11 @@ class GLFWVulkanBackend final : public GLFWBackend, protected: std::vector getInstanceExtensions() override; +#ifdef USE_SHARED_VK_CONTEXT + void initInstance() override; + void initDevice() override; +#endif + void activate() override {} void deactivate() override {} diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index ff9a28d06f68..a17444273157 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -360,23 +360,31 @@ void RendererBackend::initDebug() { } void RendererBackend::init() { + // initialize minimal set of function pointers + dispatcher.init(dynamicLoader); + initFrameCapture(); initInstance(); + + // initialize function pointers for instance + dispatcher.init(instance.get()); + + initDebug(); initSurface(); initDevice(); + + // optional function pointer specialization for device + dispatcher.init(device.get()); + physicalDeviceProperties = physicalDevice.getProperties(dispatcher); + if (graphicsQueueIndex != -1) graphicsQueue = device->getQueue(graphicsQueueIndex, 0, dispatcher); + if (presentQueueIndex != -1) presentQueue = device->getQueue(presentQueueIndex, 0, dispatcher); + initAllocator(); initSwapchain(); initCommandPool(); } void RendererBackend::initInstance() { - // VULKAN_HPP_DEFAULT_DISPATCHER is global and can lead to race conditions in multi-map environments - static std::mutex vkDefaultDispatchLoaderMutex; - std::lock_guard lock(vkDefaultDispatchLoaderMutex); - - // initialize minimal set of function pointers - dispatcher.init(dynamicLoader); - // Vulkan 1.1 on Android is supported on 71% of devices (compared to 1.3 with 6%) as of April 23 2024 // https://vulkan.gpuinfo.org/ #ifdef __APPLE__ @@ -430,14 +438,6 @@ void RendererBackend::initInstance() { } instance = vk::createInstanceUnique(createInfo, nullptr, dispatcher); - - // initialize function pointers for instance - dispatcher.init(instance.get()); - -#ifdef ENABLE_VULKAN_VALIDATION - // enable validation layer callback - initDebug(); -#endif } void RendererBackend::initSurface() { @@ -541,8 +541,6 @@ void RendererBackend::initDevice() { } if (!physicalDevice) throw std::runtime_error("No suitable GPU found"); - - physicalDeviceProperties = physicalDevice.getProperties(dispatcher); }; pickPhysicalDevice(); @@ -582,20 +580,13 @@ void RendererBackend::initDevice() { auto createInfo = vk::DeviceCreateInfo() .setQueueCreateInfos(queueCreateInfos) - .setEnabledExtensionCount(static_cast(extensions.size())) - .setPpEnabledExtensionNames(extensions.data()) + .setPEnabledExtensionNames(extensions) .setPEnabledFeatures(&physicalDeviceFeatures); // this is not needed for newer implementations createInfo.setPEnabledLayerNames(layers); device = physicalDevice.createDeviceUnique(createInfo, nullptr, dispatcher); - - // optional function pointer specialization for device - dispatcher.init(device.get()); - - graphicsQueue = device->getQueue(graphicsQueueIndex, 0, dispatcher); - if (presentQueueIndex != -1) presentQueue = device->getQueue(presentQueueIndex, 0, dispatcher); } void RendererBackend::initSwapchain() { @@ -630,12 +621,13 @@ void RendererBackend::destroyResources() { vmaDestroyAllocator(allocator); - device.reset(); + usingSharedContext ? void(device.release()) : device.reset(); // destroy this last so we have cleanup validation debugUtilsCallback.reset(); debugReportCallback.reset(); - instance.reset(); + + usingSharedContext ? void(instance.release()) : instance.reset(); } /// @brief Register a list of types with a shader registry instance From 8e7c52b9b997f021566ced5ef4f76e342cb37ff0 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Mon, 28 Jul 2025 23:24:21 +0200 Subject: [PATCH 292/339] Add MLN_CREATE_AUTORELEASEPOOL flag to create autoreleasepool in render loop (#3655) --- CMakeLists.txt | 20 +++++++++++++++++++- src/mbgl/renderer/renderer_impl.cpp | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f24a62dc5d4..5e042ba95d94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) option(MLN_USE_RUST "Use components in Rust" OFF) option(MLN_CORE_INCLUDE_DEPS "Include depdendencies in static build of core" OFF) +option(MLN_CREATE_AUTORELEASEPOOL "Create autoreleasepool in render loop" OFF) if (MLN_LEGACY_RENDERER) message(FATAL "The legacy renderer is no longer supported") @@ -26,7 +27,6 @@ if (MLN_DRAWABLE_RENDERER) message(FATAL "Do not pass MLN_DRAWABLE_RENDERER, the drawable renderer is now the default") endif() - if (MLN_WITH_CLANG_TIDY) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) if(NOT CLANG_TIDY_COMMAND) @@ -1505,6 +1505,24 @@ set_target_properties( INTERFACE_MAPLIBRE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE.md ) +if(MLN_WITH_METAL AND MLN_CREATE_AUTORELEASEPOOL) + # When using the Metal backend, if there is is no AutoreleasePool, it will result + # in memory leaks when autoreleased objects are created. + + # Platforms such as iOS and GLFW use ARC with @autoreleasepool blocks, for these platforms + # creating an AutoreleasePool is not neccesary (and in fact will not work). + # When using MapLibre Native with Metal on other platforms such as Node.js, you can pass + # this variable to ensure an AutoReleasePool is created in the render loop. + # See also: + # https://developer.apple.com/documentation/foundation/nsautoreleasepool + # https://github.com/maplibre/maplibre-native/issues/2928 + # vendor/metal-cpp/README.md 'AutoreleasePools and Objects' + target_compile_definitions( + mbgl-core + PRIVATE MLN_CREATE_AUTORELEASEPOOL=1 + ) +endif() + set_property(TARGET mbgl-core PROPERTY FOLDER MapLibre) add_library( diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 50dc45910e99..e2078900921c 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -93,6 +93,10 @@ void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr< assert(updateParameters); #if MLN_RENDER_BACKEND_METAL +#if MLN_CREATE_AUTORELEASEPOOL + NS::SharedPtr pool = NS::TransferPtr(NS::AutoreleasePool::alloc()->init()); +#endif + if constexpr (EnableMetalCapture) { const auto& mtlBackend = static_cast(backend); From 8d73cd8c5242108adc58fe867bcbfd84a27a775e Mon Sep 17 00:00:00 2001 From: Alex Cristici Date: Tue, 29 Jul 2025 14:21:21 +0300 Subject: [PATCH 293/339] Fix dashed line issue when style change (#3675) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/mbgl/gl/drawable_gl.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mbgl/gl/drawable_gl.cpp b/src/mbgl/gl/drawable_gl.cpp index c335cebd1873..f2f9e2cfe060 100644 --- a/src/mbgl/gl/drawable_gl.cpp +++ b/src/mbgl/gl/drawable_gl.cpp @@ -74,10 +74,8 @@ void DrawableGL::draw(PaintParameters& parameters) const { // Unbind the VAO so that future buffer commands outside Drawable do not change the current VAO state context.bindVertexArray = value::BindVertexArray::Default; -#ifndef NDEBUG unbindTextures(); impl->uniformBuffers.unbind(); -#endif } void DrawableGL::setIndexData(gfx::IndexVectorBasePtr indexes, std::vector segments) { From 44d9d0676610c7802c47bc786ad49c65570277c2 Mon Sep 17 00:00:00 2001 From: Stefan Karschti Date: Tue, 29 Jul 2025 14:29:04 +0300 Subject: [PATCH 294/339] Fix issues reported by ASAN (#3671) --- CMakeLists.txt | 4 ++++ test/storage/main_resource_loader.test.cpp | 2 +- test/util/thread.test.cpp | 23 +++++++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e042ba95d94..0d71234e3052 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,10 @@ add_library( set(UBSAN_BLACKLIST ${PROJECT_SOURCE_DIR}/scripts/ubsan.blacklist) +if (MLN_WITH_SANITIZER) + message(STATUS "MLN_WITH_SANITIZER is enabled, using \"${MLN_WITH_SANITIZER}\" sanitizer") +endif() + target_compile_options( mbgl-compiler-options INTERFACE diff --git a/test/storage/main_resource_loader.test.cpp b/test/storage/main_resource_loader.test.cpp index 383320f879fc..dc7257109a78 100644 --- a/test/storage/main_resource_loader.test.cpp +++ b/test/storage/main_resource_loader.test.cpp @@ -69,7 +69,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(VolatileStoragePolicy)) { // Volatile resources are not stored in cache, // so we always get new data from the server ("Response N+1"). - req = fs.request(resource, [&](Response res2) { + req = fs.request(resource, [&, firstData](Response res2) { req.reset(); EXPECT_EQ(nullptr, res2.error); ASSERT_TRUE(res2.data); diff --git a/test/util/thread.test.cpp b/test/util/thread.test.cpp index 795ca8d92c76..fd5cee7ee3d9 100644 --- a/test/util/thread.test.cpp +++ b/test/util/thread.test.cpp @@ -366,18 +366,21 @@ TEST(Thread, PoolWaitAdd) { auto seq = Scheduler::GetSequenced(); // add new tasks every few milliseconds - std::atomic addActive{true}; - std::atomic added{0}; - std::atomic executed{0}; - seq->schedule([&] { - while (addActive) { - pool->schedule([&] { executed++; }); - added++; + struct State { + std::atomic addActive{true}; + std::atomic added{0}; + std::atomic executed{0}; + }; + auto state = std::make_shared(); + seq->schedule([pool, state] { + while (state->addActive) { + pool->schedule([state] { state->executed++; }); + state->added++; } }); // Wait be sure some are added - while (added < 1) { + while (state->added < 1) { std::this_thread::sleep_for(Milliseconds(10)); } @@ -387,8 +390,10 @@ TEST(Thread, PoolWaitAdd) { pool->waitForEmpty(); - addActive = false; + state->addActive = false; pool->waitForEmpty(); + + ASSERT_GE(state->added.load(), 1); } TEST(Thread, PoolWaitException) { From 2077df9a2c5a9cbaf6ca90cae8eedc9940e5525e Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Tue, 29 Jul 2025 09:25:06 -0400 Subject: [PATCH 295/339] enable MLN_CREATE_AUTORELEASEPOOL, disable MLN_DARWIN_USE_LIBUV in 'macos-node' presets (#3673) --- CMakePresets.json | 4 +++- platform/node/CHANGELOG.md | 3 +++ platform/node/package-lock.json | 40 ++++++++++++++++----------------- platform/node/package.json | 2 +- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 13d9c70edbed..ac422dcc5bc6 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -65,7 +65,9 @@ "binaryDir": "${sourceDir}/build", "cacheVariables": { "MLN_WITH_NODE": "ON", - "MLN_WITH_WERROR": "OFF" + "MLN_WITH_WERROR": "OFF", + "MLN_CREATE_AUTORELEASEPOOL": "ON", + "MLN_DARWIN_USE_LIBUV": "OFF" } }, { diff --git a/platform/node/CHANGELOG.md b/platform/node/CHANGELOG.md index b009dd593f05..fecf47c42652 100644 --- a/platform/node/CHANGELOG.md +++ b/platform/node/CHANGELOG.md @@ -1,5 +1,8 @@ ## main +## 6.1.1-pre.0 +* Fix freezing in macos/metal after ~32 renders ([#2948](https://github.com/maplibre/maplibre-native/pull/2948)) + ## 6.1.0 * Add `textFitWidth` and `textFitHeight` properties to sprites ([#2780](https://github.com/maplibre/maplibre-native/pull/2780)). More information can be found in the [MapLibre Style Spec](https://maplibre.org/maplibre-style-spec/sprite/#text-fit-properties). diff --git a/platform/node/package-lock.json b/platform/node/package-lock.json index 4e30a6ab46f1..0a2928e8c009 100644 --- a/platform/node/package-lock.json +++ b/platform/node/package-lock.json @@ -1,12 +1,12 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.0", + "version": "6.1.1-pre.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.0", + "version": "6.1.1-pre.0", "hasInstallScript": true, "license": "BSD-2-Clause", "dependencies": { @@ -2720,9 +2720,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": { "balanced-match": "^1.0.0" } @@ -3105,9 +3105,9 @@ } }, "node_modules/dotignore/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -3658,9 +3658,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -4200,9 +4200,9 @@ } }, "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -4413,9 +4413,9 @@ } }, "node_modules/mapbox-gl-styles/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -4659,9 +4659,9 @@ } }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" diff --git a/platform/node/package.json b/platform/node/package.json index 5d3598ccf293..0dae8ba83113 100644 --- a/platform/node/package.json +++ b/platform/node/package.json @@ -1,6 +1,6 @@ { "name": "@maplibre/maplibre-gl-native", - "version": "6.1.0", + "version": "6.1.1-pre.0", "description": "Renders map tiles with MapLibre Native", "keywords": [ "maplibre", From 8011fa51bea6a9ce4cbaf9e112e8938c54280de4 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 29 Jul 2025 19:46:46 +0300 Subject: [PATCH 296/339] Add rendering info reports to `ActionJournal` (#3545) --- include/mbgl/gfx/rendering_stats.hpp | 5 +- include/mbgl/util/action_journal_options.hpp | 19 +++++ .../src/cpp/native_map_options.cpp | 4 +- .../android/maps/MapLibreMapOptions.java | 32 +++++++ .../android/maps/NativeMapOptions.java | 7 ++ .../maplibre/android/maps/RenderingStats.java | 4 +- .../src/main/res/values/attrs.xml | 1 + .../main/res/layout/activity_map_events.xml | 3 +- platform/darwin/src/MLNActionJournalOptions.h | 5 ++ .../darwin/src/MLNActionJournalOptions.mm | 8 ++ platform/darwin/src/MLNRenderingStats.h | 4 +- .../app-swift/Sources/ObserverExample.swift | 1 + src/mbgl/util/action_journal_impl.cpp | 58 ++++++++++++- src/mbgl/util/action_journal_impl.hpp | 18 ++++ test/util/action_journal.test.cpp | 85 +++++++++++++++++++ 15 files changed, 244 insertions(+), 10 deletions(-) diff --git a/include/mbgl/gfx/rendering_stats.hpp b/include/mbgl/gfx/rendering_stats.hpp index 8ee33894e2e1..29e4ed314f82 100644 --- a/include/mbgl/gfx/rendering_stats.hpp +++ b/include/mbgl/gfx/rendering_stats.hpp @@ -15,12 +15,11 @@ class SymbolLayer; namespace gfx { struct RenderingStats { - RenderingStats() = default; bool isZero() const; - /// Frame CPU encoding time (milliseconds) + /// Frame CPU encoding time (seconds) double encodingTime = 0.0; - /// Frame CPU rendering time (milliseconds) + /// Frame CPU rendering time (seconds) double renderingTime = 0.0; /// Number of frames rendered diff --git a/include/mbgl/util/action_journal_options.hpp b/include/mbgl/util/action_journal_options.hpp index c666e9de8ef8..e404ab1741ab 100644 --- a/include/mbgl/util/action_journal_options.hpp +++ b/include/mbgl/util/action_journal_options.hpp @@ -87,6 +87,23 @@ class ActionJournalOptions { */ uint32_t logFileCount() const { return logFileCount_; } + /** + * @brief Set the number of seconds to wait between rendering stats reports. + * + * @param interval time interval in seconds. + * @return ActionJournalOptions for chaining options together. + */ + ActionJournalOptions& withRenderingStatsReportInterval(const uint32_t interval) { + renderingStatsReportInterval_ = interval; + return *this; + } + + /** + * @brief Gets the previously set (or default) time interval. + * @return Returns report time interval in seconds + */ + uint32_t renderingStatsReportInterval() const { return renderingStatsReportInterval_; } + protected: bool enable_ = false; // path of the log @@ -95,6 +112,8 @@ class ActionJournalOptions { uint32_t logFileSize_ = 1024 * 1024; // number of log files (each of `logFileSize` size) uint32_t logFileCount_ = 5; + // the wait time (seconds) between rendering reports + uint32_t renderingStatsReportInterval_ = 60; }; } // namespace util diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp index 42ce9d2b14c4..45182fcfeb22 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_options.cpp @@ -19,12 +19,14 @@ util::ActionJournalOptions NativeMapOptions::getActionJournalOptions(jni::JNIEnv auto pathField = javaClass.GetField(env, "actionJournalPath"); auto logFileSizeField = javaClass.GetField(env, "actionJournalLogFileSize"); auto logFileCountField = javaClass.GetField(env, "actionJournalLogFileCount"); + auto renderingReportIntervalField = javaClass.GetField(env, "actionJournalRenderingReportInterval"); return util::ActionJournalOptions() .enable(obj.Get(env, enabledField)) .withPath(jni::Make(env, obj.Get(env, pathField))) .withLogFileSize(obj.Get(env, logFileSizeField)) - .withLogFileCount(obj.Get(env, logFileCountField)); + .withLogFileCount(obj.Get(env, logFileCountField)) + .withRenderingStatsReportInterval(obj.Get(env, renderingReportIntervalField)); } float NativeMapOptions::pixelRatio(jni::JNIEnv &env, const jni::Object &obj) { diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java index 231f2e91569e..c54bd5c50d2c 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/MapLibreMapOptions.java @@ -98,6 +98,7 @@ public class MapLibreMapOptions implements Parcelable { private String actionJournalPath = ""; private long actionJournalLogFileSize = 1024 * 1024; private long actionJournalLogFileCount = 5; + private int actionJournalRenderingReportInterval = 60; /** * Creates a new MapLibreMapOptions object. @@ -161,6 +162,7 @@ private MapLibreMapOptions(Parcel in) { actionJournalPath = in.readString(); actionJournalLogFileSize = in.readLong(); actionJournalLogFileCount = in.readLong(); + actionJournalRenderingReportInterval = in.readInt(); } /** @@ -327,6 +329,9 @@ static MapLibreMapOptions createFromAttributes(@NonNull MapLibreMapOptions mapli maplibreMapOptions.actionJournalLogFileCount( typedArray.getInteger(R.styleable.maplibre_MapView_maplibre_actionJournalLogFileCount, 5) ); + maplibreMapOptions.actionJournalRenderingReportInterval( + typedArray.getInteger(R.styleable.maplibre_MapView_maplibre_actionJournalRenderingReportInterval, 60) + ); } finally { typedArray.recycle(); } @@ -811,6 +816,18 @@ public MapLibreMapOptions actionJournalLogFileCount(long actionJournalLogFileCou return this; } + /** + * Set the number of seconds to wait between rendering stats reports. + * + * @param actionJournalRenderingReportInterval time interval in seconds + * @return This + */ + @NonNull + public MapLibreMapOptions actionJournalRenderingReportInterval(int actionJournalRenderingReportInterval) { + this.actionJournalRenderingReportInterval = actionJournalRenderingReportInterval; + return this; + } + /** * Enable local ideograph font family, defaults to true. * @@ -940,6 +957,15 @@ public long getActionJournalLogFileCount() { return actionJournalLogFileCount; } + /** + * Get the current configured action journal rendering stats report time interval. + * + * @return time interval in seconds + */ + public int getActionJournalRenderingReportInterval() { + return actionJournalRenderingReportInterval; + } + /** * Set the flag to render the map surface on top of another surface. * @@ -1329,6 +1355,7 @@ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(actionJournalPath); dest.writeLong(actionJournalLogFileSize); dest.writeLong(actionJournalLogFileCount); + dest.writeInt(actionJournalRenderingReportInterval); } @Override @@ -1465,6 +1492,10 @@ public boolean equals(@Nullable Object o) { return false; } + if (actionJournalRenderingReportInterval != options.actionJournalRenderingReportInterval) { + return false; + } + return false; } @@ -1516,6 +1547,7 @@ public int hashCode() { result = 31 * result + (actionJournalPath != null ? actionJournalPath.hashCode() : 0); result = 31 * result + (int) actionJournalLogFileSize; result = 31 * result + (int) actionJournalLogFileCount; + result = 31 * result + (int) actionJournalRenderingReportInterval; return result; } } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java index 788a9d2d7147..30c45a94f6f7 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/NativeMapOptions.java @@ -9,6 +9,7 @@ public class NativeMapOptions { private final String actionJournalPath; private final long actionJournalLogFileSize; private final long actionJournalLogFileCount; + private final int actionJournalRenderingReportInterval; public NativeMapOptions(MapLibreMapOptions options) { pixelRatio = options.getPixelRatio(); @@ -18,6 +19,7 @@ public NativeMapOptions(MapLibreMapOptions options) { actionJournalPath = options.getActionJournalPath(); actionJournalLogFileSize = options.getActionJournalLogFileSize(); actionJournalLogFileCount = options.getActionJournalLogFileCount(); + actionJournalRenderingReportInterval = options.getActionJournalRenderingReportInterval(); } public NativeMapOptions(float pixelRatio, boolean crossSourceCollisions) { @@ -28,6 +30,7 @@ public NativeMapOptions(float pixelRatio, boolean crossSourceCollisions) { actionJournalPath = ""; actionJournalLogFileSize = 0; actionJournalLogFileCount = 0; + actionJournalRenderingReportInterval = 0; } public float pixelRatio() { @@ -53,4 +56,8 @@ public long actionJournalLogFileSize() { public long actionJournalLogFileCount() { return actionJournalLogFileCount; } + + public int actionJournalRenderingReportInterval() { + return actionJournalRenderingReportInterval; + } } diff --git a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java index 4e250db53f8e..a831913fabf2 100644 --- a/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java +++ b/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/maps/RenderingStats.java @@ -1,9 +1,9 @@ package org.maplibre.android.maps; public class RenderingStats { - /// Frame CPU encoding time (milliseconds) + /// Frame CPU encoding time (seconds) public double encodingTime = 0.0; - /// Frame CPU rendering time (milliseconds) + /// Frame CPU rendering time (seconds) public double renderingTime = 0.0; /// Number of frames rendered diff --git a/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml b/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml index 658184e4d227..eb367bd917f8 100644 --- a/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml +++ b/platform/android/MapLibreAndroid/src/main/res/values/attrs.xml @@ -16,6 +16,7 @@ + diff --git a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml index 5a0cdfd4e927..e3fc32ef4e8f 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml +++ b/platform/android/MapLibreAndroidTestApp/src/main/res/layout/activity_map_events.xml @@ -14,7 +14,8 @@ android:layout_height="match_parent" app:maplibre_actionJournalEnabled="true" app:maplibre_actionJournalLogFileSize="1024" - app:maplibre_actionJournalLogFileCount="2"/> + app:maplibre_actionJournalLogFileCount="2" + app:maplibre_actionJournalRenderingReportInterval="10"/> logFileCount(); } +- (void)setRenderingStatsReportInterval:(NSInteger)value { + _actionJournalOptionsInternal->withRenderingStatsReportInterval(static_cast(value)); +} + +- (NSInteger)renderingStatsReportInterval { + return _actionJournalOptionsInternal->renderingStatsReportInterval(); +} + @end diff --git a/platform/darwin/src/MLNRenderingStats.h b/platform/darwin/src/MLNRenderingStats.h index 0c5e208fd135..82832e971953 100644 --- a/platform/darwin/src/MLNRenderingStats.h +++ b/platform/darwin/src/MLNRenderingStats.h @@ -6,9 +6,9 @@ NS_ASSUME_NONNULL_BEGIN MLN_EXPORT @interface MLNRenderingStats : NSObject -/// Frame CPU encoding time (milliseconds) +/// Frame CPU encoding time (seconds) @property (readonly) double encodingTime; -/// Frame CPU rendering time (milliseconds) +/// Frame CPU rendering time (seconds) @property (readonly) double renderingTime; /// Number of frames rendered diff --git a/platform/ios/app-swift/Sources/ObserverExample.swift b/platform/ios/app-swift/Sources/ObserverExample.swift index 7fcea92aea08..0d66f31d564e 100644 --- a/platform/ios/app-swift/Sources/ObserverExample.swift +++ b/platform/ios/app-swift/Sources/ObserverExample.swift @@ -12,6 +12,7 @@ class ObserverExampleView: UIViewController, MLNMapViewDelegate { // #-example-code(actionJournalOptions) let options = MLNMapOptions() options.actionJournalOptions.enabled = true + options.actionJournalOptions.renderingStatsReportInterval = 10 options.styleURL = AMERICANA_STYLE mapView = MLNMapView(frame: view.bounds, options: options) // #-end-example-code diff --git a/src/mbgl/util/action_journal_impl.cpp b/src/mbgl/util/action_journal_impl.cpp index a0adebc17442..207db0b17ec0 100644 --- a/src/mbgl/util/action_journal_impl.cpp +++ b/src/mbgl/util/action_journal_impl.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -137,11 +138,14 @@ class ActionJournalEvent { ActionJournal::Impl::Impl(const Map& map_, const ActionJournalOptions& options_) : map(map_), options(options_), - scheduler(Scheduler::GetSequenced()) { + scheduler(Scheduler::GetSequenced()), + renderingInfoReportTime(options.renderingStatsReportInterval()) { assert(!options.path().empty()); assert(options.logFileSize() > 0); assert(options.logFileCount() > 1); + previousFrameTime = util::MonotonicTimer::now().count(); + options.withPath((mbgl::filesystem::canonical(options.path()) / ACTION_JOURNAL_DIRECTORY_NAME).generic_string()); if (!openFile(detectFiles(), false)) { @@ -266,6 +270,58 @@ void ActionJournal::Impl::onDidFailLoadingMap(MapLoadError error, const std::str }); } +void ActionJournal::Impl::onDidFinishRenderingFrame(const RenderFrameStatus& frame) { + // update report time + double currentFrameTime = util::MonotonicTimer::now().count(); + double elapsedTime = currentFrameTime - previousFrameTime; + previousFrameTime = currentFrameTime; + + // update rendering stats + if (renderingStats.encodingMin > frame.renderingStats.encodingTime) { + renderingStats.encodingMin = frame.renderingStats.encodingTime; + } + + if (renderingStats.encodingMax < frame.renderingStats.encodingTime) { + renderingStats.encodingMax = frame.renderingStats.encodingTime; + } + + if (renderingStats.renderingMin > frame.renderingStats.renderingTime) { + renderingStats.renderingMin = frame.renderingStats.renderingTime; + } + + if (renderingStats.renderingMax < frame.renderingStats.renderingTime) { + renderingStats.renderingMax = frame.renderingStats.renderingTime; + } + + renderingStats.encodingTotal += frame.renderingStats.encodingTime; + renderingStats.renderingTotal += frame.renderingStats.renderingTime; + ++renderingStats.frameCount; + + renderingInfoReportTime -= elapsedTime; + if (renderingInfoReportTime > 1e-9) { + return; + } + + renderingInfoReportTime = options.renderingStatsReportInterval(); + + // skip if the full interval had an idle map + if (renderingStats.frameCount == 0) { + return; + } + + scheduler->schedule([=, this, env = MapEnvironmentSnapshot(*this), stats = std::move(renderingStats)]() { + log(ActionJournalEvent("renderingStats", env) + .addEvent("encodingMin", stats.encodingMin) + .addEvent("encodingMax", stats.encodingMax) + .addEvent("encodingAvg", stats.encodingTotal / stats.frameCount) + .addEvent("renderingMin", stats.renderingMin) + .addEvent("renderingMax", stats.renderingMax) + .addEvent("renderingAvg", stats.renderingTotal / stats.frameCount)); + }); + + renderingStats = {}; +} + void ActionJournal::Impl::onWillStartRenderingMap() { scheduler->schedule( [=, this, env = MapEnvironmentSnapshot(*this)]() { log(ActionJournalEvent("onWillStartRenderingMap", env)); }); diff --git a/src/mbgl/util/action_journal_impl.hpp b/src/mbgl/util/action_journal_impl.hpp index ce07bc3a1be4..152c95028a04 100644 --- a/src/mbgl/util/action_journal_impl.hpp +++ b/src/mbgl/util/action_journal_impl.hpp @@ -37,6 +37,7 @@ class ActionJournal::Impl : public MapObserver { void onWillStartLoadingMap() override; void onDidFinishLoadingMap() override; void onDidFailLoadingMap(MapLoadError, const std::string&) override; + void onDidFinishRenderingFrame(const RenderFrameStatus&) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(RenderMode) override; void onDidFinishLoadingStyle() override; @@ -95,10 +96,27 @@ class ActionJournal::Impl : public MapObserver { const std::shared_ptr scheduler; + // log file std::mutex fileMutex; std::fstream currentFile; uint32_t currentFileIndex{0}; size_t currentFileSize{0}; + + // rendering info reporting + double previousFrameTime; + double renderingInfoReportTime; + + struct { + double encodingMin{std::numeric_limits::max()}; + double encodingMax{-std::numeric_limits::max()}; + double encodingTotal{0.0}; + + double renderingMin{std::numeric_limits::max()}; + double renderingMax{-std::numeric_limits::max()}; + double renderingTotal{0.0}; + + uint32_t frameCount{0}; + } renderingStats; }; } // namespace util diff --git a/test/util/action_journal.test.cpp b/test/util/action_journal.test.cpp index d97a8206a3ea..57609a956bbd 100644 --- a/test/util/action_journal.test.cpp +++ b/test/util/action_journal.test.cpp @@ -428,3 +428,88 @@ TEST(ActionJournal, ValidateEvents) { false, gfx::RenderingStats()); } + +TEST(ActionJournal, RenderingStats) { + ActionJournalTest test(ActionJournalOptions() + .enable() + .withPath(".") + .withLogFileCount(2) + .withLogFileSize(1024 * 1024 * 5) + .withRenderingStatsReportInterval(2), + MapMode::Continuous); + + test.map->getStyle().loadJSON(util::read_file("test/fixtures/api/empty.json")); + test.map->getActionJournal()->impl->flush(); + test.map->getActionJournal()->impl->clearLog(); + + const auto onDidFinishRenderingFrame = + static_cast( + &RendererObserver::onDidFinishRenderingFrame); + + const std::vector testStats = { + {.encodingTime = 0.00273499998729676, .renderingTime = 0.0000957687443587929}, + {.encodingTime = 0.010939366680880388, .renderingTime = 0.0001340633297028641}, + {.encodingTime = 0.023845999967306852, .renderingTime = 0.00011808499693870545}, + {.encodingTime = 0.018161798150416603, .renderingTime = 0.00011148519331106433}, + }; + + const auto encodingMin = std::ranges::min_element( + testStats, [](const auto& a, const auto& b) { return a.encodingTime < b.encodingTime; }); + const auto encodingMax = std::ranges::min_element( + testStats, [](const auto& a, const auto& b) { return a.encodingTime > b.encodingTime; }); + const auto renderingMin = std::ranges::min_element( + testStats, [](const auto& a, const auto& b) { return a.renderingTime < b.renderingTime; }); + const auto renderingMax = std::ranges::min_element( + testStats, [](const auto& a, const auto& b) { return a.renderingTime > b.renderingTime; }); + + const auto encodingAvg = std::accumulate(testStats.begin(), + testStats.end(), + 0.0, + [](const auto& a, const auto& b) { return a + b.encodingTime; }) / + testStats.size(); + + const auto renderingAvg = std::accumulate(testStats.begin(), + testStats.end(), + 0.0, + [](const auto& a, const auto& b) { return a + b.renderingTime; }) / + testStats.size(); + + const auto validateDouble = [](const mbgl::JSValue& json, const auto name, const double value) { + EXPECT_TRUE(json.HasMember(name)); + EXPECT_TRUE(json[name].IsDouble()); + EXPECT_DOUBLE_EQ(json[name].GetDouble(), value); + }; + + const auto validateStats = [&](const mbgl::JSValue& json) { + ; + validateDouble(json, "encodingMin", encodingMin->encodingTime); + validateDouble(json, "encodingMax", encodingMax->encodingTime); + validateDouble(json, "encodingAvg", encodingAvg); + validateDouble(json, "renderingMin", renderingMin->renderingTime); + validateDouble(json, "renderingMax", renderingMax->renderingTime); + validateDouble(json, "renderingAvg", renderingAvg); + }; + + // accumulate frames in the journal + for (const auto& frameStats : testStats) { + std::this_thread::sleep_for( + std::chrono::milliseconds(test.options.renderingStatsReportInterval() * 1000 / 2 / testStats.size())); + test.map->getImpl().onDidFinishRenderingFrame(RendererObserver::RenderMode::Partial, false, false, frameStats); + + test.map->getActionJournal()->impl->flush(); + const auto& log = test.map->getActionJournal()->getLog(); + EXPECT_EQ(log.size(), 0); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(test.options.renderingStatsReportInterval() * 1000 / 2)); + + // trigger the journal event using a frame with average times to keep the state unchanged + validateEvent(test, + "renderingStats", + validateStats, + onDidFinishRenderingFrame, + RendererObserver::RenderMode::Partial, + false, + false, + gfx::RenderingStats{.encodingTime = encodingAvg, .renderingTime = renderingAvg}); +} From 60264349c1eebddd3e9d58828f4c88650102e1f3 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 29 Jul 2025 21:07:13 +0200 Subject: [PATCH 297/339] Release MapLibre Android 11.12.2 (#3678) --- platform/android/CHANGELOG.md | 12 ++++++++++++ platform/android/VERSION | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index d14954d28446..bb5462d70858 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog MapLibre Native for Android +## main + +## 11.12.2 + +### ✨ Features and improvements + +- texture2d - getVulkanImage and support for Texture2DUsage::Attachment ([#3632](https://github.com/maplibre/maplibre-native/pull/3632)). + +### 🐞 Bug fixes + +- Fix dashed line issue when style change ([#3675](https://github.com/maplibre/maplibre-native/pull/3675)). + ## 11.12.1 ### 🐞 Bug fixes diff --git a/platform/android/VERSION b/platform/android/VERSION index 4feb4470926b..cafd89b61841 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -11.12.1 +11.12.2 From 09d395d0dbd3515cc9d533f4fd071403bd886acc Mon Sep 17 00:00:00 2001 From: Stefan Karschti Date: Tue, 29 Jul 2025 23:00:27 +0300 Subject: [PATCH 298/339] Add HarfBuzz Text Shaping and Font Fallback Support (#3611) Co-authored-by: alan wei chen --- .gitmodules | 6 + BUILD.bazel | 44 + CMakeLists.txt | 32 + bazel/core.bzl | 9 + include/mbgl/storage/resource.hpp | 1 + include/mbgl/text/glyph.hpp | 84 +- include/mbgl/text/glyph_range.hpp | 24 +- include/mbgl/util/convert.hpp | 51 + .../text-font/burmese/metrics.json | 35 + .../text-font/devanagari/metrics.json | 35 + .../render-tests/text-font/khmer/metrics.json | 35 + metrics/cache-style.db | Bin 19214336 -> 20480000 bytes metrics/integration/data/burmese.geojson | 6414 +++++++++ metrics/integration/data/devanagari.geojson | 6505 +++++++++ metrics/integration/data/khmer.geojson | 11211 ++++++++++++++++ .../text-font/burmese/expected1.png | Bin 0 -> 102291 bytes .../text-font/burmese/expected2.png | Bin 0 -> 99916 bytes .../render-tests/text-font/burmese/style.json | 69 + .../text-font/devanagari/expected1.png | Bin 0 -> 79761 bytes .../text-font/devanagari/expected2.png | Bin 0 -> 79059 bytes .../text-font/devanagari/expected3.png | Bin 0 -> 79207 bytes .../text-font/devanagari/style.json | 69 + .../text-font/khmer/expected1.png | Bin 0 -> 89426 bytes .../text-font/khmer/expected2.png | Bin 0 -> 88052 bytes .../render-tests/text-font/khmer/style.json | 69 + .../text-font/burmese/metrics.json | 35 + .../text-font/devanagari/metrics.json | 35 + .../render-tests/text-font/khmer/metrics.json | 35 + .../text-font/burmese/metrics.json | 35 + .../text-font/devanagari/metrics.json | 35 + .../render-tests/text-font/khmer/metrics.json | 35 + .../text-font/burmese/metrics.json | 35 + .../text-font/devanagari/metrics.json | 35 + .../render-tests/text-font/khmer/metrics.json | 35 + .../text-font/burmese/metrics.json | 35 + .../text-font/devanagari/metrics.json | 35 + .../render-tests/text-font/khmer/metrics.json | 35 + platform/BUILD.bazel | 1 + .../src/cpp/text/local_glyph_rasterizer.cpp | 2 +- .../src/mbgl/storage/offline_download.cpp | 17 +- .../qt/src/mbgl/local_glyph_rasterizer.cpp | 14 + src/mbgl/gfx/dynamic_texture_atlas.cpp | 2 +- src/mbgl/layout/layout.hpp | 7 + src/mbgl/layout/symbol_layout.cpp | 195 +- src/mbgl/layout/symbol_layout.hpp | 6 + src/mbgl/map/map_impl.cpp | 1 + src/mbgl/renderer/render_orchestrator.cpp | 15 +- src/mbgl/renderer/update_parameters.hpp | 2 + src/mbgl/storage/resource.cpp | 4 + src/mbgl/style/parser.cpp | 78 + src/mbgl/style/parser.hpp | 4 + src/mbgl/style/style_impl.cpp | 6 +- src/mbgl/style/style_impl.hpp | 4 + src/mbgl/text/freetype.cpp | 98 + src/mbgl/text/freetype.hpp | 51 + src/mbgl/text/glyph.cpp | 53 +- src/mbgl/text/glyph_manager.cpp | 107 +- src/mbgl/text/glyph_manager.hpp | 65 +- src/mbgl/text/harfbuzz.cpp | 52 + src/mbgl/text/harfbuzz.hpp | 45 + src/mbgl/text/harfbuzz_impl.cpp | 108 + src/mbgl/text/harfbuzz_impl.hpp | 36 + src/mbgl/text/shaping.cpp | 165 +- src/mbgl/text/tagged_string.cpp | 76 +- src/mbgl/text/tagged_string.hpp | 56 +- src/mbgl/tile/geometry_tile.cpp | 45 +- src/mbgl/tile/geometry_tile.hpp | 2 +- src/mbgl/tile/geometry_tile_worker.cpp | 61 +- src/mbgl/tile/geometry_tile_worker.hpp | 9 +- src/mbgl/util/i18n.cpp | 33 +- src/mbgl/util/i18n.hpp | 2 + test/map/map.test.cpp | 76 + test/text/glyph_manager.test.cpp | 38 +- test/text/glyph_pbf.test.cpp | 5 +- test/text/shaping.test.cpp | 2 +- test/text/tagged_string.test.cpp | 10 +- test/util/merge_lines.test.cpp | 2 +- vendor/BUILD.bazel | 441 + vendor/freetype | 1 + vendor/freetype.cmake | 24 + vendor/harfbuzz | 1 + vendor/harfbuzz.cmake | 22 + 82 files changed, 27006 insertions(+), 151 deletions(-) create mode 100644 metrics/android-render-test-runner/render-tests/text-font/burmese/metrics.json create mode 100644 metrics/android-render-test-runner/render-tests/text-font/devanagari/metrics.json create mode 100644 metrics/android-render-test-runner/render-tests/text-font/khmer/metrics.json create mode 100644 metrics/integration/data/burmese.geojson create mode 100644 metrics/integration/data/devanagari.geojson create mode 100644 metrics/integration/data/khmer.geojson create mode 100644 metrics/integration/render-tests/text-font/burmese/expected1.png create mode 100644 metrics/integration/render-tests/text-font/burmese/expected2.png create mode 100644 metrics/integration/render-tests/text-font/burmese/style.json create mode 100644 metrics/integration/render-tests/text-font/devanagari/expected1.png create mode 100644 metrics/integration/render-tests/text-font/devanagari/expected2.png create mode 100644 metrics/integration/render-tests/text-font/devanagari/expected3.png create mode 100644 metrics/integration/render-tests/text-font/devanagari/style.json create mode 100644 metrics/integration/render-tests/text-font/khmer/expected1.png create mode 100644 metrics/integration/render-tests/text-font/khmer/expected2.png create mode 100644 metrics/integration/render-tests/text-font/khmer/style.json create mode 100644 metrics/ios-render-test-runner/render-tests/text-font/burmese/metrics.json create mode 100644 metrics/ios-render-test-runner/render-tests/text-font/devanagari/metrics.json create mode 100644 metrics/ios-render-test-runner/render-tests/text-font/khmer/metrics.json create mode 100644 metrics/linux-clang8-release/render-tests/text-font/burmese/metrics.json create mode 100644 metrics/linux-clang8-release/render-tests/text-font/devanagari/metrics.json create mode 100644 metrics/linux-clang8-release/render-tests/text-font/khmer/metrics.json create mode 100644 metrics/linux-gcc8-release/render-tests/text-font/burmese/metrics.json create mode 100644 metrics/linux-gcc8-release/render-tests/text-font/devanagari/metrics.json create mode 100644 metrics/linux-gcc8-release/render-tests/text-font/khmer/metrics.json create mode 100644 metrics/macos-xcode11-release/render-tests/text-font/burmese/metrics.json create mode 100644 metrics/macos-xcode11-release/render-tests/text-font/devanagari/metrics.json create mode 100644 metrics/macos-xcode11-release/render-tests/text-font/khmer/metrics.json create mode 100644 src/mbgl/text/freetype.cpp create mode 100644 src/mbgl/text/freetype.hpp create mode 100644 src/mbgl/text/harfbuzz.cpp create mode 100644 src/mbgl/text/harfbuzz.hpp create mode 100644 src/mbgl/text/harfbuzz_impl.cpp create mode 100644 src/mbgl/text/harfbuzz_impl.hpp create mode 160000 vendor/freetype create mode 100644 vendor/freetype.cmake create mode 160000 vendor/harfbuzz create mode 100644 vendor/harfbuzz.cmake diff --git a/.gitmodules b/.gitmodules index 7877024b0967..999ddb7c6e81 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,6 +37,12 @@ [submodule "platform/windows/vendor/vcpkg"] path = platform/windows/vendor/vcpkg url = https://github.com/microsoft/vcpkg.git +[submodule "vendor/harfbuzzFreetype/freetype"] + path = vendor/freetype + url=https://github.com/freetype/freetype.git +[submodule "vendor/harfbuzzFreetype/harfbuzz"] + path = vendor/harfbuzz + url=https://github.com/harfbuzz/harfbuzz [submodule "vendor/boost"] path = vendor/boost url = https://github.com/maplibre/maplibre-gl-native-boost.git diff --git a/BUILD.bazel b/BUILD.bazel index 135f3789f0d1..dff4ee2a0cb1 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -22,6 +22,7 @@ load( "MLN_OPENGL_SOURCE", "MLN_PRIVATE_GENERATED_STYLE_HEADERS", "MLN_PUBLIC_GENERATED_STYLE_HEADERS", + "MLN_SHAPING_HARFBUZZ_SRCS", ) load("//bazel:flags.bzl", "CPP_FLAGS", "MAPLIBRE_FLAGS") @@ -85,6 +86,9 @@ cc_library( ":drawable_renderer": MLN_OPENGL_SOURCE + MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_GL_SOURCE, ":metal_renderer": MLN_DRAWABLES_SOURCE + MLN_DRAWABLES_MTL_SOURCE, "//conditions:default": [], + }) + select({ + "//:harfbuzz_text_shaping": MLN_SHAPING_HARFBUZZ_SRCS, + "//conditions:default": [], }), hdrs = MLN_LAYER_PLUGIN_HEADERS + MLN_CORE_HEADERS + select({ ":drawable_renderer": MLN_OPENGL_HEADERS + MLN_DRAWABLES_HEADERS + MLN_DRAWABLES_GL_HEADERS, @@ -102,6 +106,9 @@ cc_library( }) + select({ "@platforms//os:ios": ["GLES_SILENCE_DEPRECATION=1"], "//conditions:default": [], + }) + select({ + "//:harfbuzz_text_shaping": ["MLN_TEXT_SHAPING_HARFBUZZ=1"], + "//conditions:default": [], }), includes = [ "include", @@ -111,6 +118,12 @@ cc_library( "vendor/metal-cpp", ], "//conditions:default": [], + }) + select({ + "//:harfbuzz_text_shaping": [ + "vendor/freetype/include", + "vendor/harfbuzz/src", + ], + "//conditions:default": [], }), local_defines = [ r"MLN_VERSION_REV=\"standalone\"", @@ -147,6 +160,12 @@ cc_library( "//vendor:metal-cpp", ], "//conditions:default": [], + }) + select({ + ":harfbuzz_text_shaping": [ + "//vendor:freetype", + "//vendor:harfbuzz", + ], + "//conditions:default": [], }) + select({ ":rust": [ "//rustutils:rustutilslib", @@ -182,6 +201,31 @@ config_setting( }, ) +# Selects the shaping implementation to utilize in the core + +string_flag( + name = "shaping", + build_setting_default = "harfbuzz", + values = [ + "legacy", + "harfbuzz", + ], +) + +config_setting( + name = "harfbuzz_text_shaping", + flag_values = { + ":shaping": "harfbuzz", + }, +) + +config_setting( + name = "legacy_text_shaping", + flag_values = { + ":shaping": "legacy", + }, +) + bool_flag( name = "use_rust", build_setting_default = False, diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d71234e3052..d8890d5bb8bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) option(MLN_USE_TRACY "Enable Tracy instrumentation" OFF) option(MLN_USE_RUST "Use components in Rust" OFF) +option(MLN_TEXT_SHAPING_HARFBUZZ "Use haffbuzz to shape complex text" ON) option(MLN_CORE_INCLUDE_DEPS "Include depdendencies in static build of core" OFF) option(MLN_CREATE_AUTORELEASEPOOL "Create autoreleasepool in render loop" OFF) @@ -1333,6 +1334,35 @@ list(APPEND ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp ) +# Harfbuzz text shaping +set(SHAPE_TARGETS, "") +list(APPEND + SRC_FILES + # Base text shaping files, which are always included. They don't depend on HarfBuzz if MLN_TEXT_SHAPING_HARFBUZZ is OFF. + ${PROJECT_SOURCE_DIR}/src/mbgl/text/harfbuzz.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/text/harfbuzz.hpp +) +if (MLN_TEXT_SHAPING_HARFBUZZ) + message(STATUS "Configuring with HarfBuzz text shaping") + list(APPEND + SRC_FILES + ${PROJECT_SOURCE_DIR}/src/mbgl/text/harfbuzz_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/text/harfbuzz_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/text/freetype.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/text/freetype.hpp + ) + target_compile_definitions( + mbgl-core + PRIVATE MLN_TEXT_SHAPING_HARFBUZZ=1 + ) + include(${PROJECT_SOURCE_DIR}/vendor/freetype.cmake) + include(${PROJECT_SOURCE_DIR}/vendor/harfbuzz.cmake) + set(SHAPE_TARGETS + freetype + harfbuzz + ) +endif() + target_sources( mbgl-core PRIVATE ${INCLUDE_FILES} @@ -1436,6 +1466,7 @@ target_link_libraries( mbgl-vendor-wagyu $<$:mbgl-vendor-metal-cpp> $,mbgl-rustutils,mbgl-vendor-csscolorparser> + ${SHAPE_TARGETS} # from harfbuzz.cmake PUBLIC MapLibreNative::Base MapLibreNative::Base::Extras::expected-lite @@ -1476,6 +1507,7 @@ set(EXPORT_TARGETS mbgl-vendor-wagyu mbgl-vendor-metal-cpp unordered_dense + ${SHAPE_TARGETS} # from harfbuzz.cmake ) if(MLN_USE_RUST) diff --git a/bazel/core.bzl b/bazel/core.bzl index b27bbd8d925b..4ecc9a59b435 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -489,6 +489,8 @@ MLN_CORE_SOURCE = [ "src/mbgl/text/shaping.hpp", "src/mbgl/text/tagged_string.cpp", "src/mbgl/text/tagged_string.hpp", + "src/mbgl/text/harfbuzz.cpp", + "src/mbgl/text/harfbuzz.hpp", "src/mbgl/tile/custom_geometry_tile.cpp", "src/mbgl/tile/custom_geometry_tile.hpp", "src/mbgl/tile/geojson_tile.cpp", @@ -1096,3 +1098,10 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/style/layers/mtl/custom_layer_render_parameters.hpp", "include/mbgl/shaders/mtl/widevector.hpp", ] + +MLN_SHAPING_HARFBUZZ_SRCS = [ + "src/mbgl/text/freetype.hpp", + "src/mbgl/text/freetype.cpp", + "src/mbgl/text/harfbuzz_impl.hpp", + "src/mbgl/text/harfbuzz_impl.cpp", +] diff --git a/include/mbgl/storage/resource.hpp b/include/mbgl/storage/resource.hpp index 26fda2752ba0..47591a9a56fa 100644 --- a/include/mbgl/storage/resource.hpp +++ b/include/mbgl/storage/resource.hpp @@ -82,6 +82,7 @@ class Resource { static Resource glyphs(const std::string& urlTemplate, const FontStack& fontStack, const std::pair& glyphRange); + static Resource fontFace(const std::string& url); static Resource spriteImage(const std::string& base, float pixelRatio); static Resource spriteJSON(const std::string& base, float pixelRatio); static Resource image(const std::string& url); diff --git a/include/mbgl/text/glyph.hpp b/include/mbgl/text/glyph.hpp index c967363b340a..f5a67be55fbe 100644 --- a/include/mbgl/text/glyph.hpp +++ b/include/mbgl/text/glyph.hpp @@ -18,7 +18,40 @@ namespace mbgl { -using GlyphID = char16_t; +union GlyphID { + char32_t hash; + struct { + char16_t code; + GlyphIDType type; + } complex; + + GlyphID(int codepoint) { + complex.type = FontPBF; + complex.code = codepoint; + } + GlyphID(uint32_t codepoint) { + complex.type = FontPBF; + complex.code = codepoint; + } + GlyphID(char16_t codepoint) { + complex.type = FontPBF; + complex.code = codepoint; + } + + GlyphID(char16_t index, GlyphIDType t) { + complex.type = t; + complex.code = index; + } + + operator char16_t() { return complex.code; } + operator char32_t() { return hash; } + bool operator<(const GlyphID &other) const { return hash < other.hash; } + bool operator>(const GlyphID &other) const { return hash > other.hash; } + + bool operator<(const uint16_t &other) const { return hash < other; } + bool operator>(const uint16_t &other) const { return hash > other; } +}; + using GlyphIDs = std::set; // Note: this only works for the BMP @@ -32,7 +65,7 @@ struct GlyphMetrics { uint32_t advance = 0; }; -inline bool operator==(const GlyphMetrics& lhs, const GlyphMetrics& rhs) { +inline bool operator==(const GlyphMetrics &lhs, const GlyphMetrics &rhs) { return lhs.width == rhs.width && lhs.height == rhs.height && lhs.left == rhs.left && lhs.top == rhs.top && lhs.advance == rhs.advance; } @@ -114,7 +147,7 @@ class Shaping { float right = 0; WritingModeType writingMode; explicit operator bool() const { - return std::ranges::any_of(positionedLines, [](const auto& line) { return !line.positionedGlyphs.empty(); }); + return std::ranges::any_of(positionedLines, [](const auto &line) { return !line.positionedGlyphs.empty(); }); } // The y offset *should* be part of the font metadata. static constexpr int32_t yOffset = -17; @@ -128,7 +161,50 @@ enum class WritingModeType : uint8_t { Vertical = 1 << 1, }; -using GlyphDependencies = std::map; +// style defined faces +struct FontFace { + using Range = std::pair; + GlyphIDType type; // an unique glyph id + std::string name; // font face name + std::string url; // font file url + std::vector ranges; // unicode ranges + + FontFace() = default; + FontFace(const std::string &name_, const std::string &url_, const std::vector &ranges_) + : type(FontPBF), + name(name_), + url(url_), + ranges(ranges_) {} + + FontFace(const std::string &name_, const std::string &url_, std::vector &&ranges_) + : type(FontPBF), + name(name_), + url(url_), + ranges(std::move(ranges_)) {} + + auto valid() const -> bool { return !name.empty() && !url.empty() && !ranges.empty(); } +}; + +using FontFaces = std::vector; + +struct HBShapeRequest { + std::u16string str; + FontStack fontStack; + GlyphIDType type; + + HBShapeRequest(const std::u16string &str_, const FontStack &fontStack_, GlyphIDType type_) + : str(str_), + fontStack(fontStack_), + type(type_) {} +}; + +using HBShapeRequests = std::map>>; + +struct GlyphDependencies { + std::map glyphs; + HBShapeRequests shapes; +}; + using GlyphRangeDependencies = std::map>; struct GlyphPosition { diff --git a/include/mbgl/text/glyph_range.hpp b/include/mbgl/text/glyph_range.hpp index 14c704d0e17a..461496a854be 100644 --- a/include/mbgl/text/glyph_range.hpp +++ b/include/mbgl/text/glyph_range.hpp @@ -4,10 +4,30 @@ #include #include #include +#include namespace mbgl { -using GlyphRange = std::pair; +enum GlyphIDType : uint16_t { + FontPBF = 0x00, +}; + +GlyphIDType genNewGlyphIDType(const std::string &url, + const FontStack &fontStack, + const std::vector> &pairs); + +class GlyphRange { +public: + uint16_t first = 0; + uint16_t second = 0; + + GlyphIDType type = GlyphIDType::FontPBF; + + GlyphRange(uint32_t first_, uint32_t second_, GlyphIDType type_ = FontPBF); + + bool operator==(const GlyphRange &other) const; + bool operator<(const GlyphRange &other) const; +}; constexpr uint32_t GLYPHS_PER_GLYPH_RANGE = 256; constexpr uint32_t GLYPH_RANGES_PER_FONT_STACK = 256; @@ -20,7 +40,7 @@ namespace std { template <> struct hash { - std::size_t operator()(const mbgl::GlyphRange& range) const { return mbgl::util::hash(range.first, range.second); } + std::size_t operator()(const mbgl::GlyphRange &range) const { return mbgl::util::hash(range.first, range.second); } }; } // namespace std diff --git a/include/mbgl/util/convert.hpp b/include/mbgl/util/convert.hpp index fce64f952eef..89b67d9c4f96 100644 --- a/include/mbgl/util/convert.hpp +++ b/include/mbgl/util/convert.hpp @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include namespace mbgl { namespace util { @@ -36,5 +39,53 @@ inline constexpr auto to_array(std::tuple&& tuple) { std::forward>(tuple)); } +/// Convert string to integral types +template +std::enable_if_t, std::optional> parse(std::string_view str, int base = 10) noexcept { + static_assert(std::is_same_v || std::is_same_v || std::is_same_v || + std::is_same_v, + "Unsupported integral type in mbgl::util::parse."); + char* end = nullptr; + errno = 0; + + if constexpr (std::is_same_v) { + long val = std::strtol(str.data(), &end, base); + if (errno == 0 && end == str.data() + str.size()) return static_cast(val); + } else if constexpr (std::is_same_v) { + unsigned long val = std::strtoul(str.data(), &end, base); + if (errno == 0 && end == str.data() + str.size()) return static_cast(val); + } else if constexpr (std::is_same_v) { + long long val = std::strtoll(str.data(), &end, base); + if (errno == 0 && end == str.data() + str.size()) return static_cast(val); + } else if constexpr (std::is_same_v) { + unsigned long long val = std::strtoull(str.data(), &end, base); + if (errno == 0 && end == str.data() + str.size()) return static_cast(val); + } + + return std::nullopt; +} + +/// Convert string to floating point types +template +std::enable_if_t, std::optional> parse(std::string_view str) noexcept { + static_assert(std::is_same_v || std::is_same_v || std::is_same_v, + "Unsupported floating point type in mbgl::util::parse."); + char* end = nullptr; + errno = 0; + + if constexpr (std::is_same_v) { + float val = std::strtof(str.data(), &end); + if (errno == 0 && end == str.data() + str.size()) return val; + } else if constexpr (std::is_same_v) { + double val = std::strtod(str.data(), &end); + if (errno == 0 && end == str.data() + str.size()) return val; + } else if constexpr (std::is_same_v) { + long double val = std::strtold(str.data(), &end); + if (errno == 0 && end == str.data() + str.size()) return val; + } + + return std::nullopt; +} + } // namespace util } // namespace mbgl diff --git a/metrics/android-render-test-runner/render-tests/text-font/burmese/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/burmese/metrics.json new file mode 100644 index 000000000000..e86a0abb09f8 --- /dev/null +++ b/metrics/android-render-test-runner/render-tests/text-font/burmese/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 596680 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 364011, + 364011 + ], + [ + 90850, + 90850 + ], + [ + 1211104, + 1211104 + ] + ] + ] +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/devanagari/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/devanagari/metrics.json new file mode 100644 index 000000000000..e5e8e0b142ff --- /dev/null +++ b/metrics/android-render-test-runner/render-tests/text-font/devanagari/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 5, + 690397 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 675950, + 675950 + ], + [ + 97714, + 97714 + ], + [ + 1302624, + 1302624 + ] + ] + ] +} diff --git a/metrics/android-render-test-runner/render-tests/text-font/khmer/metrics.json b/metrics/android-render-test-runner/render-tests/text-font/khmer/metrics.json new file mode 100644 index 000000000000..fa9ce87585cc --- /dev/null +++ b/metrics/android-render-test-runner/render-tests/text-font/khmer/metrics.json @@ -0,0 +1,35 @@ +{ + "network": [ + [ + "probeNetwork - default - end", + 4, + 636079 + ], + [ + "probeNetwork - default - start", + 0, + 0 + ] + ], + "gfx": [ + [ + "probeGFX - default - end", + 1, + 13, + 9, + 1, + [ + 488883, + 488883 + ], + [ + 106570, + 106570 + ], + [ + 1420704, + 1420704 + ] + ] + ] +} diff --git a/metrics/cache-style.db b/metrics/cache-style.db index 2368b94aa20ef0e49965e724e0dc49699702d325..78ad6c13c7bf4b93f79edeee27e1bf3879689b22 100644 GIT binary patch delta 1394928 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